1 #include "gcin.h"
2 #include "gtab.h"
3 #include "config.h"
4 #if UNIX
5 #include <signal.h>
6 #endif
7 #if GCIN_i18n_message
8 #include <libintl.h>
9 #endif
10 #include "lang.h"
11
12 extern gboolean is_chs;
13
14 #if UNIX
15 char utf8_edit[]=GCIN_SCRIPT_DIR"/utf8-edit";
16 #endif
17
18 static GtkWidget *check_button_root_style_use,
19 *check_button_gcin_pop_up_win,
20 *check_button_gcin_inner_frame,
21 #if TRAY_ENABLED
22 *check_button_gcin_status_tray,
23 *check_button_gcin_win32_icon,
24 *check_button_gcin_tray_hf_win_kbm,
25 #endif
26 *check_button_gcin_win_color_use,
27 *check_button_gcin_on_the_spot_key;
28
29
30 static GtkWidget *gcin_kbm_window = NULL, *gcin_appearance_conf_window;
31 static GtkClipboard *pclipboard;
32 static GtkWidget *opt_gcin_edit_display;
33 GtkWidget *main_window;
34 static GdkColor gcin_win_gcolor_fg, gcin_win_gcolor_bg, gcin_sel_key_gcolor;
35 gboolean button_order;
36
close_application(GtkWidget * widget,GdkEvent * event,gpointer data)37 static gboolean close_application( GtkWidget *widget,
38 GdkEvent *event,
39 gpointer data )
40 {
41 exit(0);
42 }
43
44
45 void create_kbm_window();
46
cb_kbm()47 static void cb_kbm()
48 {
49 create_kbm_window();
50 }
51
cb_tslearn()52 static void cb_tslearn()
53 {
54 #if UNIX
55 system("tslearn &");
56 #else
57 win32exec("tslearn.exe");
58 #endif
59 exit(0);
60 }
61
62
cb_ret(GtkWidget * widget,gpointer user_data)63 static void cb_ret(GtkWidget *widget, gpointer user_data)
64 {
65 gtk_widget_destroy((GtkWidget*)user_data);
66 }
67
68 #include <string.h>
69
create_result_win(int res,char * cmd)70 static void create_result_win(int res, char *cmd)
71 {
72 char tt[512];
73
74 if (res) {
75 sprintf(tt, "%s code:%d '%s'\n%s", _(_L("結果失敗")), res, strerror(res), cmd);
76 }
77 else
78 strcpy(tt, _(_L("結果成功")));
79
80 main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
81 gtk_window_set_position(GTK_WINDOW(main_window), GTK_WIN_POS_MOUSE);
82 gtk_window_set_has_resize_grip(GTK_WINDOW(main_window), FALSE);
83
84 GtkWidget *button = gtk_button_new_with_label(tt);
85 gtk_container_add (GTK_CONTAINER (main_window), button);
86 g_signal_connect (G_OBJECT (button), "clicked",
87 G_CALLBACK (cb_ret), main_window);
88
89 gtk_widget_show_all(main_window);
90 }
91
92
cb_ts_export()93 static void cb_ts_export()
94 {
95 GtkWidget *file_selector;
96 if (button_order)
97 file_selector = gtk_file_chooser_dialog_new(_(_L("請輸入要匯出的檔案名稱")),
98 GTK_WINDOW(main_window),
99 GTK_FILE_CHOOSER_ACTION_SAVE,
100 #if GTK_CHECK_VERSION(3,10,0)
101 _("_Open")
102 #else
103 GTK_STOCK_OPEN
104 #endif
105 , GTK_RESPONSE_ACCEPT,
106 #if GTK_CHECK_VERSION(3,10,0)
107 _("_Cancel")
108 #else
109 GTK_STOCK_CANCEL
110 #endif
111 , GTK_RESPONSE_CANCEL,
112 NULL);
113 else
114 file_selector = gtk_file_chooser_dialog_new(_(_L("請輸入要匯出的檔案名稱")),
115 GTK_WINDOW(main_window),
116 GTK_FILE_CHOOSER_ACTION_SAVE,
117 #if GTK_CHECK_VERSION(3,10,0)
118 _("_Cancel")
119 #else
120 GTK_STOCK_CANCEL
121 #endif
122 , GTK_RESPONSE_CANCEL,
123 #if GTK_CHECK_VERSION(3,10,0)
124 _("_Open")
125 #else
126 GTK_STOCK_OPEN
127 #endif
128 , GTK_RESPONSE_ACCEPT,
129 NULL);
130 if (gtk_dialog_run (GTK_DIALOG (file_selector)) == GTK_RESPONSE_ACCEPT) {
131 gchar *selected_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (file_selector));
132 char gcin_dir[512];
133 get_gcin_dir(gcin_dir);
134 char cmd[512];
135 char fname[256];
136 char *filename=inmd[default_input_method].filename;
137
138 if (inmd[default_input_method].method_type==method_type_TSIN)
139 get_gcin_user_fname(tsin32_f, fname);
140 else
141 if (filename) {
142 char tt[256];
143 strcat(strcpy(tt, filename), ".append.gtab.tsin-db");
144 if (!get_gcin_user_fname(tt, fname)) {
145 strcat(strcpy(tt, filename), ".tsin-db");
146 if (!get_gcin_user_fname(tt, fname))
147 p_err("cannot find %s", fname);
148 }
149 }
150 #if UNIX
151 snprintf(cmd, sizeof(cmd), GCIN_BIN_DIR"/tsd2a32 %s -o \"%s\"", fname, selected_filename);
152 dbg("exec %s\n", cmd);
153 int res = system(cmd);
154 res = 0; // some problem in system(), the exit code is not reliable
155 create_result_win(res, cmd);
156 #else
157 char para[256];
158 sprintf_s(para, sizeof(para), "\"%s\" -o \"%s\"", fname, selected_filename);
159 win32exec_para("tsd2a32.exe", para);
160 #endif
161 }
162 gtk_widget_destroy (file_selector);
163 }
164
ts_import(const gchar * selected_filename)165 static void ts_import(const gchar *selected_filename)
166 {
167 char cmd[256];
168 #if UNIX
169 if (inmd[default_input_method].method_type==method_type_TSIN) {
170 snprintf(cmd, sizeof(cmd),
171 "cd %s/.gcin && "GCIN_BIN_DIR"/tsd2a32 %s > tmpfile && cat \"%s\" >> tmpfile && "GCIN_BIN_DIR"/tsa2d32 tmpfile %s",
172 getenv("HOME"), tsin32_f, selected_filename, tsin32_f);
173 int res = system(cmd);
174 res = 0;
175 create_result_win(res, cmd);
176 } else {
177 char tt[512];
178 sprintf(tt, GCIN_SCRIPT_DIR"/tsin-gtab-import %s '%s'", inmd[default_input_method].filename,
179 selected_filename);
180 system(tt);
181 }
182 #else
183 if (inmd[default_input_method].method_type==method_type_TSIN)
184 win32exec_script_va("ts-import.bat", (char *)selected_filename, tsin32_f, NULL);
185 else {
186 win32exec_script_va("ts-gtab-import.bat", inmd[default_input_method].filename, selected_filename, NULL);
187 }
188 #endif
189 }
190
191 #if !GTK_CHECK_VERSION(2,4,0)
cb_file_ts_import(GtkWidget * widget,gpointer user_data)192 static void cb_file_ts_import(GtkWidget *widget, gpointer user_data)
193 {
194 GtkWidget *file_selector = (GtkWidget *)user_data;
195 const gchar *selected_filename;
196
197 selected_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (file_selector));
198 // g_print ("Selected filename: %s\n", selected_filename);
199
200 ts_import(selected_filename);
201 }
202 #endif
203
cb_ts_import()204 static void cb_ts_import()
205 {
206 /* Create the selector */
207
208 #if GTK_CHECK_VERSION(2,4,0)
209 GtkWidget *file_selector;
210 if (button_order)
211 file_selector = gtk_file_chooser_dialog_new(_(_L("請輸入要匯入的檔案名稱")),
212 GTK_WINDOW(main_window),
213 GTK_FILE_CHOOSER_ACTION_OPEN,
214 #if GTK_CHECK_VERSION(3,10,0)
215 _("_Open")
216 #else
217 GTK_STOCK_OPEN
218 #endif
219 , GTK_RESPONSE_ACCEPT,
220 #if GTK_CHECK_VERSION(3,10,0)
221 _("_Cancel")
222 #else
223 GTK_STOCK_CANCEL
224 #endif
225 , GTK_RESPONSE_CANCEL,
226 NULL);
227 else
228 file_selector = gtk_file_chooser_dialog_new(_(_L("請輸入要匯入的檔案名稱")),
229 GTK_WINDOW(main_window),
230 GTK_FILE_CHOOSER_ACTION_OPEN,
231 #if GTK_CHECK_VERSION(3,10,0)
232 _("_Cancel")
233 #else
234 GTK_STOCK_CANCEL
235 #endif
236 , GTK_RESPONSE_CANCEL,
237 #if GTK_CHECK_VERSION(3,10,0)
238 _("_Open")
239 #else
240 GTK_STOCK_OPEN
241 #endif
242 , GTK_RESPONSE_ACCEPT,
243 NULL);
244 if (gtk_dialog_run (GTK_DIALOG (file_selector)) == GTK_RESPONSE_ACCEPT) {
245 gchar *selected_filename = gtk_file_chooser_get_filename (GTK_FILE_CHOOSER (file_selector));
246
247 ts_import(selected_filename);
248 }
249 gtk_widget_destroy (file_selector);
250 #else
251 GtkWidget *file_selector = gtk_file_selection_new (_("請輸入要匯入的檔案名稱"));
252
253 g_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (file_selector)->ok_button),
254 "clicked",
255 G_CALLBACK (cb_file_ts_import),
256 (gpointer) file_selector);
257
258 g_signal_connect_swapped (GTK_OBJECT (GTK_FILE_SELECTION (file_selector)->ok_button),
259 "clicked",
260 G_CALLBACK (gtk_widget_destroy),
261 (gpointer) file_selector);
262
263 g_signal_connect_swapped (GTK_OBJECT (GTK_FILE_SELECTION (file_selector)->cancel_button),
264 "clicked",
265 G_CALLBACK (gtk_widget_destroy),
266 (gpointer) file_selector);
267
268 gtk_widget_show(file_selector);
269 #endif
270 }
271
cb_ts_edit()272 static void cb_ts_edit()
273 {
274 #if UNIX
275 system(GCIN_BIN_DIR"/ts-edit");
276 #else
277 win32exec("ts-edit.exe");
278 #endif
279 }
280
cb_ts_edit_en()281 static void cb_ts_edit_en()
282 {
283 #if UNIX
284 system(GCIN_BIN_DIR"/ts-edit-en");
285 #else
286 win32exec("ts-edit-en.exe");
287 #endif
288 }
289
290
cb_ts_import_sys()291 static void cb_ts_import_sys()
292 {
293 #if UNIX
294 char tt[512];
295 sprintf(tt, "cd ~/.gcin && "GCIN_BIN_DIR"/tsd2a32 %s > tmpfile && "GCIN_BIN_DIR"/tsd2a32 %s/%s >> tmpfile && "GCIN_BIN_DIR"/tsa2d32 tmpfile",
296 tsin32_f, GCIN_TABLE_DIR, tsin32_f);
297 dbg("exec %s\n", tt);
298 system(tt);
299 #else
300 win32exec_script("ts-import-sys.bat", tsin32_f);
301 #endif
302 }
303
cb_ts_contribute()304 static void cb_ts_contribute()
305 {
306 #if UNIX
307 system(GCIN_BIN_DIR"/ts-contribute &");
308 #else
309 win32exec("ts-contribute.exe");
310 #endif
311 }
312
cb_ts_contribute_en()313 static void cb_ts_contribute_en()
314 {
315 #if UNIX
316 system(GCIN_BIN_DIR"/ts-contribute-en &");
317 #else
318 win32exec("ts-contribute-en.exe");
319 #endif
320 }
321
cb_alt_shift()322 static void cb_alt_shift()
323 {
324 #if UNIX
325 char tt[512];
326 sprintf(tt, "( cd ~/.gcin && %s phrase.table ) &", utf8_edit);
327 system(tt);
328 #else
329 char fname[512];
330 get_gcin_user_fname("phrase.table", fname);
331 win32exec_script("utf8-edit.bat", fname);
332 #endif
333 }
334
335
cb_symbol_table()336 static void cb_symbol_table()
337 {
338 char tt[512];
339 #if UNIX
340 sprintf(tt, "( cd ~/.gcin && %s symbol-table ) &", utf8_edit);
341 system(tt);
342 #else
343 char fname[512];
344 get_gcin_user_fname("symbol-table", fname);
345 win32exec_script("utf8-edit.bat", fname);
346 #endif
347 }
348
349
350 int html_browser(char *fname);
351
cb_help()352 static void cb_help()
353 {
354 #if UNIX
355 html_browser(DOC_DIR"/README.html");
356 #else
357 char fname[512];
358 strcpy(fname, gcin_program_files_path);
359 strcat(fname, "\\README.html");
360 html_browser(fname);
361 #endif
362 }
363
364 void create_appearance_conf_window();
365
cb_appearance_conf()366 static void cb_appearance_conf()
367 {
368 create_appearance_conf_window();
369 }
370
371 void create_gtab_conf_window();
372
cb_gtab_conf()373 static void cb_gtab_conf()
374 {
375 create_gtab_conf_window();
376 }
377
378
cb_gb_output_toggle()379 static void cb_gb_output_toggle()
380 {
381 send_gcin_message(
382 #if UNIX
383 GDK_DISPLAY(),
384 #endif
385 GB_OUTPUT_TOGGLE);
386 exit(0);
387 }
388
cb_gb_translate_toggle()389 static void cb_gb_translate_toggle()
390 {
391 #if WIN32
392 win32exec("sim2trad.exe");
393 #else
394 system(GCIN_BIN_DIR"/sim2trad &");
395 #endif
396 exit(0);
397 }
398
399
cb_juying_learn()400 static void cb_juying_learn()
401 {
402 #if WIN32
403 win32exec("juyin-learn.exe");
404 #else
405 system(GCIN_BIN_DIR"/juyin-learn &");
406 #endif
407 exit(0);
408 }
409
410 #if 0
411 int gcin_pid;
412 static void cb_gcin_exit()
413 {
414 #if UNIX
415 kill(gcin_pid, 9);
416 #else
417 TerminateProcess(
418 #endif
419 }
420 #endif
421
422 void create_gtablist_window();
cb_default_input_method()423 static void cb_default_input_method()
424 {
425 create_gtablist_window();
426 }
427
428 void create_about_window();
429 void set_window_gcin_icon(GtkWidget *window);
430
timeout_minimize_main_window(gpointer data)431 static gboolean timeout_minimize_main_window(gpointer data)
432 {
433 gtk_window_resize(GTK_WINDOW(main_window), 32, 32);
434 return FALSE;
435 }
436
437 static void
expander_callback(GObject * object,GParamSpec * param_spec,gpointer user_data)438 expander_callback (GObject *object,
439 GParamSpec *param_spec,
440 gpointer user_data)
441 {
442 GtkExpander *expander;
443 expander = GTK_EXPANDER (object);
444
445 if (gtk_expander_get_expanded (expander)) {
446 } else {
447 // cannot do this here
448 // gtk_window_resize(GTK_WINDOW(main_window), 32, 32);
449 g_timeout_add(200, timeout_minimize_main_window, NULL);
450 }
451 }
452
453 #include "pho.h"
454 #include "tsin.h"
455 #include "gst.h"
456 #include "im-client/gcin-im-client-attr.h"
457 #include "win1.h"
458 #include "gcin-module.h"
459 #include "gcin-module-cb.h"
460 GCIN_module_callback_functions *init_GCIN_module_callback_functions(char *sofile);
461
create_main_win()462 static void create_main_win()
463 {
464 main_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
465 gtk_window_set_position(GTK_WINDOW(main_window), GTK_WIN_POS_CENTER);
466
467 gtk_window_set_has_resize_grip(GTK_WINDOW(main_window), FALSE);
468
469 g_signal_connect (G_OBJECT (main_window), "delete_event",
470 G_CALLBACK (close_application),
471 NULL);
472
473 set_window_gcin_icon(main_window);
474
475 GtkWidget *vbox = gtk_vbox_new (FALSE, 0);
476 gtk_container_add (GTK_CONTAINER (main_window), vbox);
477
478 GtkWidget *button_kbm = gtk_button_new_with_label(_(_L("gcin 注音/詞音/拼音 設定")));
479 gtk_box_pack_start (GTK_BOX (vbox), button_kbm, TRUE, TRUE, 0);
480 g_signal_connect (G_OBJECT (button_kbm), "clicked",
481 G_CALLBACK (cb_kbm), NULL);
482
483 GtkWidget *button_appearance_conf = gtk_button_new_with_label(_(_L("外觀設定")));
484 gtk_box_pack_start (GTK_BOX (vbox), button_appearance_conf, TRUE, TRUE, 0);
485 g_signal_connect (G_OBJECT (button_appearance_conf), "clicked",
486 G_CALLBACK (cb_appearance_conf), NULL);
487
488 GtkWidget *button_gtab_conf = gtk_button_new_with_label(_(_L("倉頡/行列/嘸蝦米/大易設定")));
489 gtk_box_pack_start (GTK_BOX (vbox), button_gtab_conf, TRUE, TRUE, 0);
490 g_signal_connect (G_OBJECT (button_gtab_conf), "clicked",
491 G_CALLBACK (cb_gtab_conf), NULL);
492
493 int i;
494 for (i=0; i < inmdN; i++) {
495 INMD *pinmd = &inmd[i];
496 if (pinmd->method_type != method_type_MODULE || pinmd->disabled)
497 continue;
498
499 GCIN_module_callback_functions *f = init_GCIN_module_callback_functions(pinmd->filename);
500 if (!f)
501 continue;
502
503 if (!f->module_setup_window_create) {
504 free(f);
505 continue;
506 }
507
508 char tt[128];
509 strcpy(tt, pinmd->cname);
510 strcat(tt, _(_L("設定")));
511 GtkWidget *button_chewing_input_method = gtk_button_new_with_label(tt);
512 gtk_box_pack_start (GTK_BOX (vbox), button_chewing_input_method, TRUE, TRUE, 0);
513 g_signal_connect (G_OBJECT (button_chewing_input_method), "clicked",
514 G_CALLBACK (f->module_setup_window_create), NULL);
515 }
516
517 GtkWidget *button_default_input_method = gtk_button_new_with_label(_(_L("內定輸入法 & 開啟/關閉")));
518 gtk_box_pack_start (GTK_BOX (vbox), button_default_input_method, TRUE, TRUE, 0);
519 g_signal_connect (G_OBJECT (button_default_input_method), "clicked",
520 G_CALLBACK (cb_default_input_method), NULL);
521
522
523 GtkWidget *button_alt_shift = gtk_button_new_with_label(_(_L("alt-shift 片語編輯")));
524 gtk_box_pack_start (GTK_BOX (vbox), button_alt_shift, TRUE, TRUE, 0);
525 g_signal_connect (G_OBJECT (button_alt_shift), "clicked",
526 G_CALLBACK (cb_alt_shift), NULL);
527
528 GtkWidget *button_symbol_table = gtk_button_new_with_label(_(_L("符號表編輯")));
529 gtk_box_pack_start (GTK_BOX (vbox), button_symbol_table, TRUE, TRUE, 0);
530 g_signal_connect (G_OBJECT (button_symbol_table), "clicked",
531 G_CALLBACK (cb_symbol_table), NULL);
532
533 #if TRAY_ENABLED
534 if (!gcin_status_tray)
535 {
536 #endif
537 GtkWidget *button_gb_output_toggle = gtk_button_new_with_label(_(_L("簡體字輸出切換")));
538 gtk_box_pack_start (GTK_BOX (vbox), button_gb_output_toggle, TRUE, TRUE, 0);
539 g_signal_connect (G_OBJECT (button_gb_output_toggle), "clicked",
540 G_CALLBACK (cb_gb_output_toggle), NULL);
541 #if TRAY_ENABLED
542 }
543 #endif
544
545 GtkWidget *button_gb_translate_toggle = gtk_button_new_with_label(_(_L("剪貼區 簡體字->正體字")));
546 gtk_box_pack_start (GTK_BOX (vbox), button_gb_translate_toggle, TRUE, TRUE, 0);
547 g_signal_connect (G_OBJECT (button_gb_translate_toggle), "clicked",
548 G_CALLBACK (cb_gb_translate_toggle), NULL);
549
550 GtkWidget *button_juying_learn_toggle = gtk_button_new_with_label(_(_L("剪貼區 注音查詢")));
551 gtk_box_pack_start (GTK_BOX (vbox), button_juying_learn_toggle, TRUE, TRUE, 0);
552 g_signal_connect (G_OBJECT (button_juying_learn_toggle), "clicked",
553 G_CALLBACK (cb_juying_learn), NULL);
554
555 GtkWidget *expander_ts = gtk_expander_new (_(_L("詞庫選項")));
556 gtk_box_pack_start (GTK_BOX (vbox), expander_ts, FALSE, FALSE, 0);
557 g_signal_connect (expander_ts, "notify::expanded",
558 G_CALLBACK (expander_callback), NULL);
559
560 GtkWidget *vbox_ts = gtk_vbox_new (FALSE, 0);
561 gtk_container_add (GTK_CONTAINER (expander_ts), vbox_ts);
562
563
564 GtkWidget *button_ts_export = gtk_button_new_with_label(_(_L("詞庫匯出")));
565 gtk_widget_set_hexpand (button_ts_export, TRUE);
566 gtk_box_pack_start (GTK_BOX (vbox_ts), button_ts_export, FALSE, FALSE, 0);
567 g_signal_connect (G_OBJECT (button_ts_export), "clicked",
568 G_CALLBACK (cb_ts_export), NULL);
569
570 GtkWidget *button_ts_import = gtk_button_new_with_label(_(_L("詞庫匯入")));
571 gtk_widget_set_hexpand (button_ts_import, TRUE);
572 gtk_box_pack_start (GTK_BOX (vbox_ts), button_ts_import, FALSE, FALSE, 0);
573 g_signal_connect (G_OBJECT (button_ts_import), "clicked",
574 G_CALLBACK (cb_ts_import), NULL);
575
576 GtkWidget *button_ts_edit = gtk_button_new_with_label(_(_L("詞庫編輯")));
577 gtk_widget_set_hexpand (button_ts_edit, TRUE);
578 gtk_box_pack_start (GTK_BOX (vbox_ts), button_ts_edit, TRUE, TRUE, 0);
579 g_signal_connect (G_OBJECT (button_ts_edit), "clicked",
580 G_CALLBACK (cb_ts_edit), NULL);
581
582 GtkWidget *button_ts_edit_en = gtk_button_new_with_label(_(_L("英數詞庫編輯")));
583 gtk_widget_set_hexpand (button_ts_edit_en, TRUE);
584 gtk_box_pack_start (GTK_BOX (vbox_ts), button_ts_edit_en, TRUE, TRUE, 0);
585 g_signal_connect (G_OBJECT (button_ts_edit_en), "clicked",
586 G_CALLBACK (cb_ts_edit_en), NULL);
587
588
589 if (inmd[default_input_method].method_type == method_type_TSIN) {
590 GtkWidget *button_tslearn = gtk_button_new_with_label(_(_L("讓詞音從文章學習詞")));
591 gtk_box_pack_start (GTK_BOX (vbox_ts), button_tslearn, TRUE, TRUE, 0);
592 g_signal_connect (G_OBJECT (button_tslearn), "clicked",
593 G_CALLBACK (cb_tslearn), NULL);
594
595 GtkWidget *button_ts_import_sys = gtk_button_new_with_label(_(_L("匯入系統的詞庫")));
596 gtk_box_pack_start (GTK_BOX (vbox_ts), button_ts_import_sys, TRUE, TRUE, 0);
597 g_signal_connect (G_OBJECT (button_ts_import_sys), "clicked",
598 G_CALLBACK (cb_ts_import_sys), NULL);
599
600 GtkWidget *button_ts_contribute = gtk_button_new_with_label(_(_L("貢獻選擇的詞音詞庫")));
601 gtk_box_pack_start (GTK_BOX (vbox_ts), button_ts_contribute, TRUE, TRUE, 0);
602 g_signal_connect (G_OBJECT (button_ts_contribute), "clicked",
603 G_CALLBACK (cb_ts_contribute), NULL);
604 }
605
606
607 GtkWidget *button_ts_contribute_en = gtk_button_new_with_label(_(_L("貢獻選擇的英數詞庫")));
608 gtk_box_pack_start (GTK_BOX (vbox_ts), button_ts_contribute_en, TRUE, TRUE, 0);
609 g_signal_connect (G_OBJECT (button_ts_contribute_en), "clicked",
610 G_CALLBACK (cb_ts_contribute_en), NULL);
611
612 GtkWidget *button_about = gtk_button_new_with_label(_(_L("關於 gcin")));
613 gtk_box_pack_start (GTK_BOX (vbox), button_about, TRUE, TRUE, 0);
614 g_signal_connect (G_OBJECT (button_about), "clicked",
615 G_CALLBACK (create_about_window), NULL);
616
617
618 GtkWidget *button_help =
619 #if GTK_CHECK_VERSION(3,10,0)
620 gtk_button_new_with_label("問題");
621 #else
622 gtk_button_new_from_stock (GTK_STOCK_HELP);
623 #endif
624 gtk_box_pack_start (GTK_BOX (vbox), button_help, TRUE, TRUE, 0);
625 g_signal_connect (G_OBJECT (button_help), "clicked",
626 G_CALLBACK (cb_help), NULL);
627
628
629 GtkWidget *button_quit =
630 #if GTK_CHECK_VERSION(3,10,0)
631 gtk_button_new_with_label("離開");
632 #else
633 gtk_button_new_from_stock (GTK_STOCK_QUIT);
634 #endif
635 gtk_box_pack_start (GTK_BOX (vbox), button_quit, TRUE, TRUE, 0);
636 g_signal_connect (G_OBJECT (button_quit), "clicked",
637 G_CALLBACK (close_application), NULL);
638
639 gtk_widget_show_all(main_window);
640 }
641
642
643 void init_TableDir(), exec_setup_scripts();
644 #if WIN32
645 void init_gcin_program_files();
646 #pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
647 #endif
648
649
main(int argc,char ** argv)650 int main(int argc, char **argv)
651 {
652 // char *messages=getenv("LC_MESSAGES");
653 #if 0
654 char *ctype=getenv("LC_CTYPE");
655 if (!(ctype && strstr(ctype, "zh_CN")))
656 putenv("LANGUAGE=zh_TW.UTF-8");
657 #endif
658
659 set_is_chs();
660
661
662 #if UNIX
663 setenv("GCIN_BIN_DIR", GCIN_BIN_DIR, TRUE);
664 setenv("UTF8_EDIT", utf8_edit, TRUE);
665 #endif
666
667 exec_setup_scripts();
668
669 init_TableDir();
670
671 load_setttings();
672
673 load_gtab_list(FALSE);
674
675 gtk_init(&argc, &argv);
676
677 #if GCIN_i18n_message
678 bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8");
679 textdomain(GETTEXT_PACKAGE);
680 #endif
681
682 g_object_get(gtk_settings_get_default(), "gtk-alternative-button-order", &button_order, NULL);
683
684 create_main_win();
685
686 // once you invoke gcin-setup, the left-right buton tips is disabled
687 save_gcin_conf_int(LEFT_RIGHT_BUTTON_TIPS, 0);
688
689 pclipboard = gtk_clipboard_get(GDK_SELECTION_PRIMARY);
690
691 gtk_main();
692
693 return 0;
694 }
695