📄 gvxinit.c
字号:
/* Copyright (C) 2001, Ghostgum Software Pty Ltd. All rights reserved.
This file is part of GSview.
This program is distributed with NO WARRANTY OF ANY KIND. No author
or distributor accepts any responsibility for the consequences of using it,
or for whether it serves any particular purpose or works at all, unless he
or she says so in writing. Refer to the GSview Free Public Licence
(the "Licence") for full details.
Every copy of GSview must include a copy of the Licence, normally in a
plain ASCII text file named LICENCE. The Licence grants you the right
to copy, modify and redistribute GSview, but only under certain conditions
described in the Licence. Among other things, the Licence requires that
the copyright notice and this notice be preserved on all copies.
*/
/* gvxinit.cpp */
#include "gvx.h"
#include "gvxlang.h"
#include <dlfcn.h>
GtkWidget *find_menu_widget(int id);
void edit_menu_show(GtkWidget *w, gpointer data);
void remove_main_menu(GtkWidget *window);
void add_main_menu(GtkWidget *window);
void button_enter(GtkButton *button, gpointer user_data);
void button_leave(GtkButton *button, gpointer user_data);
void button_settips(void);
GtkWidget *bitmap_button(GtkWidget *bar, const char **xpm, int id);
void make_buttonbar(void);
gint button_bar_configure_event(GtkWidget *widget, GdkEventExpose *event);
int parse_args(GSVIEW_ARGS *args);
void language_select(GtkWidget *w, gpointer data);
int get_language(void);
int check_locale(const char *lang);
void set_usermedia(void);
GtkItemFactory *item_factory;
GtkAccelGroup *accel_group;
GtkWidget *edit_menu;
guint edit_menu_tag;
/* We load each of these DLLs and if they contain a version
* string that matches the GSview EXE, we consider them to
* be a valid language DLL. We store the details about each
* in the following structure.
* The id is allocated automatically.
* We refer to each language in the INI file using the twocc code,
* which matches the two letter Internet country code.
* Each language DLL provides a string with the name of the language
* in it's own language and also in English. The latter is used
* on systems without that language installed.
* The required ANSI codepage is in codepage. If any code page is
* acceptable (e.g. English) then this may be 0.
*/
typedef struct lang_s {
int id;
char twocc[3];
/* char dllname[MAXSTR]; */
char name[MAXSTR]; /* language name in it's language and codepage */
char ename[MAXSTR]; /* language name in English */
/* int codepage; */
} lang_t;
/* The list of language DLLs available */
const int nlang = 11;
lang_t lang[11] = {
{IDM_LANGEN, "en", "English", "English"},
{IDM_LANGCT, "ct", "Catalan", "Catalan"},
{IDM_LANGDE, "de", "Deutsch", "German"},
{IDM_LANGFR, "fr", "Fran鏰is", "French"},
{IDM_LANGGR, "gr", "Ellenika", "Greek"},
{IDM_LANGIT, "it", "Italian", "Italian"},
{IDM_LANGES, "es", "Espa駉l", "Spanish"},
{IDM_LANGNL, "nl", "Nederlands", "Dutch"},
{IDM_LANGRU, "ru", "Russian", "Russian"},
{IDM_LANGSE, "se", "Svenska", "Swedish"},
{IDM_LANGSK, "sk", "Slovak", "Slovak"}
};
int language_id(const char *str)
{
int i;
for (i=0; i<nlang; i++) {
if (strcmp(str, lang[i].twocc) == 0)
return lang[i].id;
}
return 0;
}
const char * language_twocc(int id)
{
int i;
for (i=0; i<nlang; i++) {
if (id == lang[i].id)
return lang[i].twocc;
}
return "en";
}
/* get text of menu item */
/* returns count of characters copied to str */
int
get_menu_string(int menuid, int itemid, char *str, int len)
{
int i, j;
char *s;
MENU_ENTRY *menu_item;
int menu_len;
if (len==0)
return 0;
if (menubar == NULL)
return 0;
str[0] = '\0';
/* Usermedia menus need special code because they change */
for (j=0; j<sizeof(usermedia)/sizeof(USERMEDIA); j++) {
if (itemid == usermedia[j].id) {
strncpy(str, usermedia[j].name,
min(len, sizeof(usermedia[j].name)));
return strlen(str);
}
}
switch (option.language) {
case IDM_LANGCT:
menu_item = menu_ct;
menu_len = menu_ct_len;
break;
case IDM_LANGDE:
menu_item = menu_de;
menu_len = menu_de_len;
break;
case IDM_LANGFR:
menu_item = menu_fr;
menu_len = menu_fr_len;
break;
case IDM_LANGGR:
menu_item = menu_gr;
menu_len = menu_gr_len;
break;
case IDM_LANGES:
menu_item = menu_es;
menu_len = menu_es_len;
break;
case IDM_LANGIT:
menu_item = menu_it;
menu_len = menu_it_len;
break;
case IDM_LANGNL:
menu_item = menu_nl;
menu_len = menu_nl_len;
break;
case IDM_LANGRU:
menu_item = menu_ru;
menu_len = menu_ru_len;
break;
case IDM_LANGSE:
menu_item = menu_se;
menu_len = menu_se_len;
break;
case IDM_LANGSK:
menu_item = menu_sk;
menu_len = menu_sk_len;
break;
case IDM_LANGEN:
default:
menu_item = menu_en;
menu_len = menu_en_len;
}
/* search through menu_item until we find the id */
for (i=0; i<menu_len; i++) {
if (menu_item[i].callback_action == (unsigned int)itemid)
break;
}
if (i == menu_len)
return 0;
/* find last slash */
s = strrchr(menu_item[i].path, '/');
if (s == NULL)
return 0;
/* copy, omitting underscores */
s++;
for (j=0; (j<len-1) && *s; s++) {
if (*s != '_')
str[j++] = *s;
}
str[j] = '\0';
return strlen(str);
}
GtkWidget *find_menu_widget(int id)
{
int i;
char buf[MAXSTR];
const char *s;
char *d;
MENU_ENTRY *menu_item;
int menu_len;
if (menubar == NULL)
return NULL;
/* search through menu_items until we find the id */
switch (option.language) {
case IDM_LANGCT:
menu_item = menu_ct;
menu_len = menu_ct_len;
break;
case IDM_LANGDE:
menu_item = menu_de;
menu_len = menu_de_len;
break;
case IDM_LANGFR:
menu_item = menu_fr;
menu_len = menu_fr_len;
break;
case IDM_LANGGR:
menu_item = menu_gr;
menu_len = menu_gr_len;
break;
case IDM_LANGES:
menu_item = menu_es;
menu_len = menu_es_len;
break;
case IDM_LANGIT:
menu_item = menu_it;
menu_len = menu_it_len;
break;
case IDM_LANGNL:
menu_item = menu_nl;
menu_len = menu_nl_len;
break;
case IDM_LANGRU:
menu_item = menu_ru;
menu_len = menu_ru_len;
break;
case IDM_LANGSE:
menu_item = menu_se;
menu_len = menu_se_len;
break;
case IDM_LANGSK:
menu_item = menu_sk;
menu_len = menu_sk_len;
break;
case IDM_LANGEN:
default:
menu_item = menu_en;
menu_len = menu_en_len;
}
for (i=0; i<menu_len; i++) {
if (menu_item[i].callback_action == (unsigned int)id)
break;
}
if (i == menu_len)
return NULL;
/* copy the menu path, removing underscores */
d = buf;
for (s=menu_item[i].path; *s; s++)
if (*s != '_')
*d++ = *s;
*d = '\0';
/* find it */
return gtk_item_factory_get_widget(item_factory, buf);
}
void
enable_menu_item(int menuid, int itemid, BOOL enabled)
{
GtkWidget *w;
if (menubar == NULL)
return;
if ((w = find_menu_widget(itemid)) != NULL)
gtk_widget_set_sensitive(w, enabled);
}
extern int disable_gsview_wcmd;
/* change menu item checkmark */
void
check_menu_item(int menuid, int itemid, BOOL checked)
{
GtkWidget *w;
if (menubar == NULL)
return;
if ((w = find_menu_widget(itemid)) != NULL) {
/* changing the menu check state causes check_menu_item
* to be called recursively. Disable signal handler
* using disable_gsview_wcmd to avoid this.
* We can't use gtk_signal_handler_block_by_data()
* because the signal handler is being called with
* object = NULL.
*/
disable_gsview_wcmd = 1;
gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w), checked);
disable_gsview_wcmd = 0;
}
else
gs_addmessf("check_menu_item: failed to find menu widget %d\n", itemid);
}
/* enable/disable menu items just before they are displayed */
void edit_menu_show(GtkWidget *w, gpointer data)
{
BOOL addeps;
BOOL extracteps;
BOOL idle = (gsdll.state != GS_BUSY);
/*
enable_menu_item(IDM_EDITMENU, IDM_COPYCLIP, image.open);
enable_menu_item(IDM_EDITMENU, IDM_CONVERT, FALSE);
*/
enable_menu_item(IDM_EDITMENU, IDM_PASTETO, image.open);
addeps = (psfile.dsc != (CDSC *)NULL) && psfile.dsc->epsf && idle;
enable_menu_item(IDM_EDITMENU, IDM_ADDEPSMENU, addeps);
enable_menu_item(IDM_ADDEPSMENU, IDM_MAKEEPSU, addeps);
addeps = addeps && image.open;
enable_menu_item(IDM_ADDEPSMENU, IDM_MAKEEPSI, addeps);
enable_menu_item(IDM_ADDEPSMENU, IDM_MAKEEPST4, addeps);
enable_menu_item(IDM_ADDEPSMENU, IDM_MAKEEPST6U, addeps);
enable_menu_item(IDM_ADDEPSMENU, IDM_MAKEEPST6P, addeps);
enable_menu_item(IDM_ADDEPSMENU, IDM_MAKEEPSW, addeps);
extracteps = ((psfile.preview == IDS_EPST) || (psfile.preview == IDS_EPSW))
&& idle;
enable_menu_item(IDM_EDITMENU, IDM_EXTRACTPS, extracteps);
enable_menu_item(IDM_EDITMENU, IDM_EXTRACTPRE, extracteps);
enable_menu_item(IDM_EDITMENU, IDM_TEXTEXTRACT, idle);
enable_menu_item(IDM_EDITMENU, IDM_TEXTFIND, idle);
enable_menu_item(IDM_EDITMENU, IDM_TEXTFINDNEXT, idle);
}
void remove_main_menu(GtkWidget *window)
{
if (menubar == NULL)
return;
if (edit_menu)
gtk_signal_disconnect(GTK_OBJECT(edit_menu), edit_menu_tag);
edit_menu_tag = 0;
edit_menu = NULL;
last_file_widget[0] = NULL;
last_file_widget[1] = NULL;
last_file_widget[2] = NULL;
last_file_widget[3] = NULL;
/* gtk_container_remove(GTK_CONTAINER(main_vbox), menubar); */
gtk_widget_destroy(menubar);
menubar = NULL;
if (item_factory != NULL)
gtk_object_destroy(GTK_OBJECT(item_factory));
item_factory = NULL;
if (accel_group != NULL)
gtk_accel_group_unref(accel_group);
accel_group = NULL;
}
void add_main_menu(GtkWidget *window)
{
MENU_ENTRY *menu_item;
int menu_len;
switch (option.language) {
case IDM_LANGCT:
menu_item = menu_ct;
menu_len = menu_ct_len;
break;
case IDM_LANGDE:
menu_item = menu_de;
menu_len = menu_de_len;
break;
case IDM_LANGFR:
menu_item = menu_fr;
menu_len = menu_fr_len;
break;
case IDM_LANGGR:
menu_item = menu_gr;
menu_len = menu_gr_len;
break;
case IDM_LANGES:
menu_item = menu_es;
menu_len = menu_es_len;
break;
case IDM_LANGIT:
menu_item = menu_it;
menu_len = menu_it_len;
break;
case IDM_LANGNL:
menu_item = menu_nl;
menu_len = menu_nl_len;
break;
case IDM_LANGRU:
menu_item = menu_ru;
menu_len = menu_ru_len;
break;
case IDM_LANGSE:
menu_item = menu_se;
menu_len = menu_se_len;
break;
case IDM_LANGSK:
menu_item = menu_sk;
menu_len = menu_sk_len;
break;
case IDM_LANGEN:
default:
menu_item = menu_en;
menu_len = menu_en_len;
}
accel_group = gtk_accel_group_new();
/* This function initializes the item factory.
Param 1: The type of menu - can be GTK_TYPE_MENU_BAR, GTK_TYPE_MENU,
or GTK_TYPE_OPTION_MENU.
Param 2: The path of the menu.
Param 3: A pointer to a gtk_accel_group. The item factory sets up
the accelerator table while generating menus.
*/
item_factory = gtk_item_factory_new(GTK_TYPE_MENU_BAR, "<main>",
accel_group);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -