Merge TUI and GUI binaries, using a new name

The appropriate interface will be chosen automatically.
This commit is contained in:
Přemysl Eric Janouch 2023-06-11 16:18:21 +02:00
parent 7bcbc04b04
commit 238e7a2bb9
Signed by: p
GPG Key ID: A0420B94F92B9493
15 changed files with 209 additions and 180 deletions

12
.gitignore vendored
View File

@ -3,9 +3,9 @@
# Qt Creator files
/CMakeLists.txt.user*
/sdtui.cflags
/sdtui.cxxflags
/sdtui.config
/sdtui.files
/sdtui.creator*
/sdtui.includes
/tdv.cflags
/tdv.cxxflags
/tdv.config
/tdv.files
/tdv.creator*
/tdv.includes

View File

@ -1,13 +1,15 @@
cmake_minimum_required (VERSION 3.0)
project (sdtui VERSION 0.1.0 LANGUAGES C)
project (tdv VERSION 0.1.0 LANGUAGES C)
# Moar warnings
# Adjust warnings
if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUCC)
set (ignores "-Wno-missing-field-initializers -Wno-cast-function-type")
set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -std=gnu99 ${ignores}")
set (CMAKE_C_FLAGS_DEBUG "${CMAKE_C_FLAGS_DEBUG} -Wall -Wextra")
endif ()
add_definitions (-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_38)
# For custom modules
set (CMAKE_MODULE_PATH ${PROJECT_SOURCE_DIR}/cmake)
@ -108,6 +110,7 @@ if (WITH_GUI)
message (FATAL_ERROR "GTK+ not found")
endif ()
include_directories (${gtk_INCLUDE_DIRS})
link_directories (${gtk_LIBRARY_DIRS})
endif ()
@ -198,25 +201,7 @@ configure_file (${PROJECT_SOURCE_DIR}/config.h.in
${PROJECT_BINARY_DIR}/config.h)
include_directories (${PROJECT_SOURCE_DIR} ${PROJECT_BINARY_DIR})
# Primary target source files
set (project_sources
src/${PROJECT_NAME}.c)
set (project_headers
${project_common_headers})
# Build the main executable and link it
add_definitions (-DGLIB_VERSION_MIN_REQUIRED=GLIB_VERSION_2_38)
if (NOT WIN32)
add_executable (${PROJECT_NAME}
${project_sources} ${project_headers} ${project_common_sources})
target_link_libraries (${PROJECT_NAME} ${project_common_libraries}
${Ncursesw_LIBRARIES} termo-static)
if (WITH_X11)
target_link_libraries (${PROJECT_NAME} ${xcb_LIBRARIES})
endif ()
endif (NOT WIN32)
# The same for the alternative GTK+ UI
# Icon generation utilities
if (NOT ${CMAKE_VERSION} VERSION_LESS 3.18.0)
set (find_program_REQUIRE REQUIRED)
endif ()
@ -224,7 +209,7 @@ endif ()
function (icon_to_png svg size output_dir output)
set (_dimensions ${size}x${size})
set (_png_path ${output_dir}/hicolor/${_dimensions}/apps)
set (_png ${_png_path}/sdgui.png)
set (_png ${_png_path}/${PROJECT_NAME}.png)
set (${output} ${_png} PARENT_SCOPE)
find_program (rsvg_convert_EXECUTABLE rsvg-convert ${find_program_REQUIRE})
@ -244,8 +229,17 @@ function (icon_for_win32 pngs ico)
COMMENT "Generating Windows program icon" VERBATIM)
endfunction ()
# Build the main executable and link it
set (project_libraries
${project_common_libraries})
set (project_sources
${project_common_sources}
src/${PROJECT_NAME}.c)
set (project_headers
${project_common_headers})
if (WITH_GUI)
set (icon_svg ${PROJECT_SOURCE_DIR}/sdgui.svg)
set (icon_svg ${PROJECT_SOURCE_DIR}/${PROJECT_NAME}.svg)
set (icon_base ${PROJECT_BINARY_DIR}/icons)
# The largest size is mainly for an appropriately sized Windows icon
@ -254,31 +248,42 @@ if (WITH_GUI)
icon_to_png (${icon_svg} ${icon_size} ${icon_base} icon_png)
list (APPEND icon_png_list ${icon_png})
endforeach ()
add_custom_target (sdgui-icons ALL DEPENDS ${icon_png_list})
add_custom_target (icons ALL DEPENDS ${icon_png_list})
endif ()
set (sdgui_sources
src/sdgui.c
src/stardict-view.c
${project_common_sources})
if (WIN32)
set (icon_ico ${PROJECT_BINARY_DIR}/sdgui.ico)
if (WIN32)
set (icon_ico ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.ico)
icon_for_win32 ("${icon_png_list}" ${icon_ico})
set (resource_file ${PROJECT_BINARY_DIR}/sdgui.rc)
list (APPEND sdgui_sources ${resource_file})
set (resource_file ${PROJECT_BINARY_DIR}/${PROJECT_NAME}.rc)
list (APPEND project_sources ${resource_file})
add_custom_command (OUTPUT ${resource_file}
COMMAND ${CMAKE_COMMAND} -E echo "1 ICON \"sdgui.ico\""
COMMAND ${CMAKE_COMMAND} -E echo "1 ICON \"${PROJECT_NAME}.ico\""
> ${resource_file} VERBATIM)
set_property (SOURCE ${resource_file}
APPEND PROPERTY OBJECT_DEPENDS ${icon_ico})
endif ()
add_executable (sdgui WIN32 ${sdgui_sources})
target_include_directories (sdgui PUBLIC ${gtk_INCLUDE_DIRS})
target_link_libraries (sdgui ${project_common_libraries} ${gtk_LIBRARIES})
else ()
list (APPEND project_libraries ${Ncursesw_LIBRARIES} termo-static)
list (APPEND project_sources
src/${PROJECT_NAME}-tui.c)
endif ()
if (WITH_X11)
list (APPEND project_libraries ${xcb_LIBRARIES})
endif ()
if (WITH_GUI)
list (APPEND project_libraries ${gtk_LIBRARIES})
list (APPEND project_sources
src/${PROJECT_NAME}-gui.c
src/stardict-view.c)
add_executable (${PROJECT_NAME} WIN32 ${project_sources} ${project_headers})
else ()
add_executable (${PROJECT_NAME} ${project_sources} ${project_headers})
endif ()
target_link_libraries (${PROJECT_NAME} ${project_libraries})
# Tools
set (tools tabfile add-pronunciation query-tool transform)
foreach (tool ${tools})
@ -311,14 +316,13 @@ if (NOT WIN32)
install (FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR})
if (WITH_GUI)
install (TARGETS sdgui DESTINATION ${CMAKE_INSTALL_BINDIR})
install (FILES sdgui.svg
install (FILES ${PROJECT_NAME}.svg
DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps)
install (DIRECTORY ${PROJECT_BINARY_DIR}/icons
DESTINATION ${CMAKE_INSTALL_DATADIR})
install (FILES sdgui.desktop
install (FILES ${PROJECT_NAME}.desktop
DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
install (FILES sdgui.xml
install (FILES ${PROJECT_NAME}.xml
DESTINATION ${CMAKE_INSTALL_DATADIR}/mime/packages)
endif ()
@ -329,7 +333,7 @@ if (NOT WIN32)
endforeach ()
elseif (WITH_GUI)
# This rather crude filter has been mostly copied over from logdiag
install (TARGETS sdgui DESTINATION .)
install (TARGETS ${PROJECT_NAME} DESTINATION .)
install (DIRECTORY
${win32_deps_prefix}/bin/
DESTINATION .
@ -377,7 +381,7 @@ if (BUILD_TESTING)
find_program (xmlwf_EXECUTABLE xmlwf)
find_program (xmllint_EXECUTABLE xmllint)
foreach (xml sdgui.xml)
foreach (xml ${PROJECT_NAME}.xml)
if (xmlwf_EXECUTABLE)
add_test (test-xmlwf-${xml} ${xmlwf_EXECUTABLE}
${PROJECT_SOURCE_DIR}/${xml})
@ -397,7 +401,7 @@ if (BUILD_TESTING)
endif ()
# CPack
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "StarDict TUI and GUI")
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Translation dictionary viewer")
set (CPACK_PACKAGE_VENDOR "Premysl Eric Janouch")
set (CPACK_PACKAGE_CONTACT "Přemysl Eric Janouch <p@janouch.name>")
set (CPACK_RESOURCE_FILE_LICENSE "${PROJECT_SOURCE_DIR}/LICENSE")
@ -413,17 +417,17 @@ set (CPACK_SOURCE_PACKAGE_FILE_NAME "${PROJECT_NAME}-${PROJECT_VERSION}")
set (CPACK_NSIS_ENABLE_UNINSTALL_BEFORE_INSTALL ON)
set (CPACK_PACKAGE_INSTALL_REGISTRY_KEY "${PROJECT_NAME}")
set (CPACK_NSIS_INSTALLED_ICON_NAME sdgui.exe)
set (CPACK_PACKAGE_EXECUTABLES sdgui sdgui)
set (CPACK_NSIS_INSTALLED_ICON_NAME ${PROJECT_NAME}.exe)
set (CPACK_PACKAGE_EXECUTABLES ${PROJECT_NAME} ${PROJECT_NAME})
set (CPACK_NSIS_EXECUTABLES_DIRECTORY .)
set (CPACK_NSIS_EXTRA_INSTALL_COMMANDS [[
WriteRegStr HKCR '.ifo' '' 'sdgui.Dictionary'
WriteRegStr HKCR 'sdgui.Dictionary' '' 'StarDict Dictionary'
WriteRegStr HKCR 'sdgui.Dictionary\\shell\\open\\command' '' '\"$INSTDIR\\sdgui.exe\" \"%1\"'
WriteRegStr HKCR '.ifo' '' 'tdv.Dictionary'
WriteRegStr HKCR 'tdv.Dictionary' '' 'StarDict Dictionary'
WriteRegStr HKCR 'tdv.Dictionary\\shell\\open\\command' '' '\"$INSTDIR\\tdv.exe\" \"%1\"'
System::Call 'shell32::SHChangeNotify(i,i,i,i) (0x08000000, 0x1000, 0, 0)'
]])
set (CPACK_NSIS_EXTRA_UNINSTALL_COMMANDS [[
DeleteRegKey HKCR 'sdgui.Dictionary'
DeleteRegKey HKCR 'tdv.Dictionary'
System::Call 'shell32::SHChangeNotify(i,i,i,i) (0x08000000, 0x1000, 0, 0)'
]])

View File

@ -1,4 +1,4 @@
Copyright (c) 2013 - 2022, Přemysl Eric Janouch <p@janouch.name>
Copyright (c) 2013 - 2023, Přemysl Eric Janouch <p@janouch.name>
Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted.

View File

@ -1,20 +1,19 @@
StarDict Terminal and Graphical UI
==================================
Translation dictionary viewer
=============================
'sdtui' aims to provide an easy way of viewing translation as well as other
kinds of dictionaries in your terminal, and is inspired by the dictionary
component of PC Translator. I wasn't successful in finding any free software
of this kind, GUI or not, and thus decided to write my own.
'tdv' aims to provide an easy way of viewing translation as well as other kinds
of StarDict dictionaries, and is inspired by the dictionary component
of PC Translator. I was unsuccessful in finding any free software of this kind,
and thus decided to write my own.
The project is covered by a permissive license, unlike vast majority of other
similar projects, and can serve as a base for implementing other dictionary
software.
image::sdtui.png[align="center"]
image::tdv.png[align="center"]
As a recent addition, there is now an alternative GTK+ 3 based frontend as well,
called 'sdgui'. It shares its dictionary list with 'sdtui', but styling will
follow your theme, and may be customized from 'gtk.css'.
As a recent addition, the program also offers a GTK+ 3 based user interface,
whose styling will follow your theme, and may be customized from 'gtk.css'.
Packages
--------
@ -23,7 +22,7 @@ a package with the latest development version from Archlinux's AUR.
Documentation
-------------
See the link:docs/sdtui.1.adoc[man page] for information about usage.
See the link:docs/tdv.1.adoc[man page] for information about usage.
The rest of this README will concern itself with externalities.
Building and Running
@ -51,16 +50,16 @@ To install the application, you can do either the usual:
Or you can try telling CMake to make a package for you. For Debian it is:
$ cpack -G DEB
# dpkg -i sdtui-*.deb
# dpkg -i tdv-*.deb
Having the program installed, simply run it with a StarDict '.ifo' file as
an argument. It is, however, preferable to
link:docs/sdtui.1.adoc#_configuration[configure it] to load your dictionaries
link:docs/tdv.1.adoc#_configuration[configure it] to load your dictionaries
automatically.
Windows
~~~~~~~
With the help of Mingw-w64 and WINE, 'sdgui' will successfully cross-compile
With the help of Mingw-w64 and WINE, 'tdv' will successfully cross-compile
for Windows. It isn't particularly usable on that system, if only because
selection watching is a very X11/Wayland-specific feature. Beware that build
dependencies take up almost a gigabyte of disk space.
@ -91,7 +90,7 @@ https://mega.co.nz/#!axtD0QRK!sbtBgizksyfkPqKvKEgr8GQ11rsWhtqyRgUUV0B7pwg[CZ <--
Further Development
-------------------
While I've been successfully using 'sdtui' for many years now, some issues
While I've been successfully using 'tdv' for many years now, some issues
should be addressed before including the software in regular Linux and/or
BSD distributions:

View File

@ -8,6 +8,7 @@
#define GETTEXT_DIRNAME "${CMAKE_INSTALL_PREFIX}/share/locale"
#cmakedefine WITH_X11
#cmakedefine WITH_GUI
#cmakedefine HAVE_RESIZETERM
#endif // ! CONFIG_H

View File

@ -1,21 +1,21 @@
sdtui(1)
========
tdv(1)
======
:doctype: manpage
:manmanual: sdtui Manual
:mansource: sdtui {release-version}
:manmanual: tdv Manual
:mansource: tdv {release-version}
Name
----
sdtui - StarDict terminal UI
tdv - Translation dictionary viewer
Synopsis
--------
*sdtui* [_OPTION_]... [_DICTIONARY_.ifo]...
*tdv* [_OPTION_]... [_DICTIONARY_.ifo]...
Description
-----------
*sdtui* is a StarDict dictionary viewer, custom-tailored for translation
dictionaries, with a simple curses-based terminal UI.
*tdv* is a StarDict dictionary viewer, custom-tailored for translation
dictionaries, with a simple curses-based terminal UI, and a GTK+ graphical UI.
Without any command line arguments, the program expects to find a list of
dictionaries to load on start-up in its configuration file. The _.ifo_ files
@ -32,7 +32,7 @@ Options
Configuration
-------------
You can start your _sdtui.conf_ file with the following snippet:
You can start your _tdv.conf_ file with the following snippet:
[Settings]
center-search = true # Ensure visibility of preceding entries?
@ -75,16 +75,16 @@ Extensions
----------
Because the StarDict file format is a bit of a clusterfuck with regard to
collation of dictionary entries, this software introduces an additional,
optional "collation" field into the _.ifo_ file. When *sdtui* discovers this
optional "collation" field into the _.ifo_ file. When *tdv* discovers this
field while reading a dictionary, it automatically reorders the index according
to that locale (e.g., "cs_CZ"). This operation may take a little while,
in the order of seconds.
Files
-----
*sdtui* follows the XDG Base Directory Specification.
*tdv* follows the XDG Base Directory Specification.
_~/.config/sdtui/sdtui.conf_::
_~/.config/tdv/tdv.conf_::
The configuration file.
Reporting bugs

View File

@ -6,7 +6,7 @@
* finalised with an empty line. Newlines are escaped with `\n',
* backslashes with `\\'.
*
* So far only the `m', `g`, and `x` fields are supported, as in sdtui.
* So far only the `m', `g`, and `x` fields are supported, as in tdv.
*
* Copyright (c) 2013 - 2021, Přemysl Eric Janouch <p@janouch.name>
*

View File

@ -19,7 +19,6 @@
#include <gtk/gtk.h>
#include <glib/gi18n.h>
#include <locale.h>
#include <stdlib.h>
#include "config.h"
@ -27,9 +26,6 @@
#include "utils.h"
#include "stardict-view.h"
#undef PROJECT_NAME
#define PROJECT_NAME "sdgui"
static struct
{
GtkWidget *window; ///< Top-level window
@ -452,42 +448,18 @@ die_with_dialog (const gchar *message)
}
int
main (int argc, char *argv[])
gui_main (char *argv[])
{
if (!setlocale (LC_ALL, ""))
g_printerr ("%s: %s\n", _("Warning"), _("failed to set the locale"));
bindtextdomain (GETTEXT_PACKAGE, GETTEXT_DIRNAME);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
gchar **filenames = NULL;
GOptionEntry option_entries[] =
{
{G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_FILENAME_ARRAY, &filenames,
NULL, N_("[FILE]...")},
{},
};
GError *error = NULL;
gtk_init_with_args (&argc, &argv, N_("- StarDict GTK+ UI"),
option_entries, GETTEXT_PACKAGE, &error);
if (error)
{
g_warning ("%s", error->message);
g_error_free (error);
return 1;
}
// Just like with GtkApplication, argv has been parsed by the option group.
gtk_init (NULL, NULL);
gtk_window_set_default_icon_name (PROJECT_NAME);
GError *error = NULL;
GPtrArray *new_dictionaries =
g_ptr_array_new_with_free_func ((GDestroyNotify) dictionary_destroy);
if (filenames)
{
load_from_filenames (new_dictionaries, filenames);
g_strfreev (filenames);
}
if (argv[0])
load_from_filenames (new_dictionaries, argv);
else if (!load_from_config (new_dictionaries, &error) && error)
die_with_dialog (error->message);

View File

@ -18,16 +18,15 @@
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
#include <stdarg.h>
#include <limits.h>
#include <string.h>
#include <glib.h>
#include <glib-unix.h>
#include <glib/gi18n.h>
#include <gio/gio.h>
#include <pango/pango.h>
#include <glib/gi18n.h>
#include <unistd.h>
#include <poll.h>
@ -2438,53 +2437,10 @@ log_handler (const gchar *domain, GLogLevelFlags level,
}
int
main (int argc, char *argv[])
tui_main (char *argv[])
{
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
if (glib_check_version (2, 36, 0))
g_type_init ();
G_GNUC_END_IGNORE_DEPRECATIONS
gboolean show_version = FALSE;
GOptionEntry entries[] =
{
{ "version", 0, G_OPTION_FLAG_IN_MAIN,
G_OPTION_ARG_NONE, &show_version,
N_("Output version information and exit"), NULL },
{ NULL }
};
if (!setlocale (LC_ALL, ""))
g_printerr ("%s: %s\n", _("Warning"), _("failed to set the locale"));
bindtextdomain (GETTEXT_PACKAGE, GETTEXT_DIRNAME);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
GError *error = NULL;
GOptionContext *ctx = g_option_context_new
(N_("[dictionary.ifo...] - StarDict terminal UI"));
GOptionGroup *group = g_option_group_new ("", "", "", NULL, NULL);
g_option_group_add_entries (group, entries);
g_option_group_set_translation_domain (group, GETTEXT_PACKAGE);
g_option_context_add_group (ctx, group);
g_option_context_set_translation_domain (ctx, GETTEXT_PACKAGE);
if (!g_option_context_parse (ctx, &argc, &argv, &error))
{
g_printerr ("%s: %s: %s\n", _("Error"), _("option parsing failed"),
error->message);
exit (EXIT_FAILURE);
}
g_option_context_free (ctx);
if (show_version)
{
g_print (PROJECT_NAME " " PROJECT_VERSION "\n");
exit (EXIT_SUCCESS);
}
Application app;
app_init (&app, argv + 1);
app_init (&app, argv);
app_init_terminal (&app);
app_redraw (&app);
@ -2528,4 +2484,3 @@ G_GNUC_END_IGNORE_DEPRECATIONS
return 0;
}

98
src/tdv.c Normal file
View File

@ -0,0 +1,98 @@
/*
* Translation dictionary viewer
*
* Copyright (c) 2023, Přemysl Eric Janouch <p@janouch.name>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*/
#include "config.h"
#include <glib.h>
#include <glib/gi18n.h>
#ifdef WITH_GUI
#include <gtk/gtk.h>
#endif
#include <locale.h>
#ifndef G_OS_WIN32
#include <unistd.h>
#endif
int tui_main (char *[]);
int gui_main (char *[]);
int
main (int argc, char *argv[])
{
if (!setlocale (LC_ALL, ""))
g_printerr ("%s: %s\n", _("Warning"), _("failed to set the locale"));
bindtextdomain (GETTEXT_PACKAGE, GETTEXT_DIRNAME);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
gboolean show_version = FALSE;
#ifdef WITH_GUI
# ifndef G_OS_WIN32
gboolean gui = FALSE;
# endif
#endif
GOptionEntry entries[] =
{
{ "version", 0, G_OPTION_FLAG_IN_MAIN,
G_OPTION_ARG_NONE, &show_version,
N_("Output version information and exit"), NULL },
#ifdef WITH_GUI
# ifndef G_OS_WIN32
{ "gui", 0, G_OPTION_FLAG_IN_MAIN,
G_OPTION_ARG_NONE, &gui,
N_("Launch the GUI even when run from a terminal"), NULL },
# endif
#endif
{ },
};
GOptionContext *ctx = g_option_context_new
(N_("[dictionary.ifo...] - Translation dictionary viewer"));
g_option_context_add_main_entries (ctx, entries, GETTEXT_PACKAGE);
#ifdef WITH_GUI
g_option_context_add_group (ctx, gtk_get_option_group (FALSE));
#endif
g_option_context_set_translation_domain (ctx, GETTEXT_PACKAGE);
GError *error = NULL;
if (!g_option_context_parse (ctx, &argc, &argv, &error))
{
g_printerr ("%s: %s: %s\n", _("Error"), _("option parsing failed"),
error->message);
exit (EXIT_FAILURE);
}
g_option_context_free (ctx);
if (show_version)
{
g_print (PROJECT_NAME " " PROJECT_VERSION "\n");
exit (EXIT_SUCCESS);
}
#ifdef WITH_GUI
# ifndef G_OS_WIN32
if (gui || !isatty (STDIN_FILENO))
# endif
return gui_main (argv + 1);
#endif
#ifndef G_OS_WIN32
return tui_main (argv + 1);
#endif
}

View File

@ -1,9 +1,9 @@
[Desktop Entry]
Type=Application
Name=sdgui
GenericName=StarDict GUI
Icon=sdgui
Exec=sdgui %F
Name=tdv
GenericName=Translation dictionary viewer
Icon=tdv
Exec=tdv %F
StartupNotify=true
MimeType=application/x-stardict-ifo;
Categories=Office;Dictionary;GTK;

View File

Before

Width:  |  Height:  |  Size: 40 KiB

After

Width:  |  Height:  |  Size: 40 KiB

View File

Before

Width:  |  Height:  |  Size: 1.9 KiB

After

Width:  |  Height:  |  Size: 1.9 KiB

View File