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