1
/* Copyright (C) 2005-2011 Edward Der-Hua Liu, Hsin-Chu, Taiwan
3
* This library is free software; you can redistribute it and/or
4
* modify it under the terms of the GNU Lesser General Public
5
* License as published by the Free Software Foundation; either
6
* version 2.1 of the License, or (at your option) any later version.
8
* This library is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
* Lesser General Public License for more details.
13
* You should have received a copy of the GNU Lesser General Public
14
* License along with this library; if not, write to the Free Software
15
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19
#include "hime-conf.h"
26
{"Control-Space", Control_Space},
27
{"Shift-Space", Shift_Space},
28
{"Alt-Space", Alt_Space},
29
{"Windows-Space", Windows_Space},
33
extern char *default_input_method_str;
35
static GtkWidget *gtablist_window = NULL;
36
static GtkWidget *vbox;
37
static GtkWidget *hbox;
39
static GtkWidget *treeview;
40
static GtkWidget *button, *button2, *check_button_phonetic_speak, *opt_speaker_opts, *check_button_hime_bell_off;
41
static GtkWidget *opt_im_toggle_keys, *check_button_hime_remote_client,
42
*check_button_hime_shift_space_eng_full,
43
*check_button_hime_init_im_enabled,
44
*check_button_hime_eng_phrase_enabled,
45
*check_button_hime_win_sym_click_close,
46
*check_button_hime_punc_auto_send;
48
static GtkWidget *check_button_hime_single_state;
49
extern gboolean button_order;
51
char *pho_speaker[16];
61
gboolean default_inmd;
82
static GArray *articles = NULL;
83
int hime_switch_keys_lookup(int key);
87
static int qcmp_key(const void *aa, const void *bb)
89
Item *a=(Item *)aa, *b=(Item *)bb;
91
return hime_switch_keys_lookup(a->key[0]) - hime_switch_keys_lookup(b->key[0]);
95
extern char *TableDir;
96
void get_icon_path(char *iconame, char fname[]);
103
g_return_if_fail (articles != NULL);
105
load_gtab_list(FALSE);
108
for (i=0; i < inmdN; i++) {
109
INMD *pinmd = &inmd[i];
110
char *name = pinmd->cname;
115
char *file = pinmd->filename;
116
char *icon = pinmd->icon;
118
key[0] = pinmd->key_ch;
121
foo.name = g_strdup(name);
123
get_icon_path(icon, icon_path);
125
foo.icon = gdk_pixbuf_new_from_file(icon_path, &err);
126
foo.key = g_strdup(key);
127
foo.file = g_strdup(file);
128
// dbg("%d] %d\n",i,pinmd->in_cycle);
129
foo.default_inmd = default_input_method == i;
130
foo.use = !pinmd->disabled;
131
foo.cycle = pinmd->in_cycle && foo.use;
132
foo.editable = FALSE;
134
g_array_append_vals (articles, &foo, 1);
137
// g_array_sort (articles,qcmp_key);
140
static GtkTreeModel *
148
articles = g_array_sized_new (FALSE, FALSE, sizeof (Item), 1);
152
/* create list store */
153
model = gtk_list_store_new (NUM_COLUMNS,G_TYPE_STRING, GDK_TYPE_PIXBUF,
155
G_TYPE_STRING, G_TYPE_BOOLEAN, G_TYPE_BOOLEAN,
157
G_TYPE_BOOLEAN, G_TYPE_POINTER);
160
for (i = 0; i < articles->len; i++) {
161
gtk_list_store_append (model, &iter);
163
gtk_list_store_set (model, &iter,
165
g_array_index (articles, Item, i).name,
167
g_array_index (articles, Item, i).icon,
169
g_array_index (articles, Item, i).key,
171
g_array_index (articles, Item, i).file,
173
g_array_index (articles, Item, i).cycle,
175
g_array_index (articles, Item, i).default_inmd,
177
g_array_index (articles, Item, i).use,
179
g_array_index (articles, Item, i).editable,
181
g_array_index (articles, Item, i).pinmd,
185
return GTK_TREE_MODEL (model);
189
extern char gtab_list[];
191
static void save_gtab_list()
194
get_hime_user_fname(gtab_list, ttt);
198
if ((fp=fopen(ttt, "w"))==NULL)
199
p_err("cannot write to %s\n", ttt);
202
for (i=0; i < inmdN; i++) {
203
INMD *pinmd = &inmd[i];
204
char *name = pinmd->cname;
208
char *file = pinmd->filename;
209
char *icon = pinmd->icon;
210
char *disabled = pinmd->disabled?"!":"";
212
fprintf(fp, "%s%s %c %s %s\n", disabled,name, pinmd->key_ch, file, icon);
219
static void cb_ok (GtkWidget *button, gpointer data)
221
GtkTreeModel *model = GTK_TREE_MODEL (data);
224
if (!gtk_tree_model_get_iter_first(model, &iter))
229
gtk_tree_model_get(model,&iter, COLUMN_KEY, &tkey, -1);
230
gboolean cycle, default_inmd, use;
231
gtk_tree_model_get (model, &iter, COLUMN_CYCLE, &cycle, -1);
232
gtk_tree_model_get (model, &iter, COLUMN_DEFAULT_INMD, &default_inmd, -1);
233
gtk_tree_model_get (model, &iter, COLUMN_USE, &use, -1);
235
gtk_tree_model_get (model, &iter, COLUMN_PINMD, &pinmd, -1);
236
pinmd->in_cycle = cycle;
237
pinmd->disabled = !use;
238
} while (gtk_tree_model_iter_next(model, &iter));
240
dbg("default_input_method_str %s\n",default_input_method_str);
241
save_hime_conf_str(DEFAULT_INPUT_METHOD, default_input_method_str);
244
idx = gtk_combo_box_get_active (GTK_COMBO_BOX (opt_im_toggle_keys));
245
save_hime_conf_int(HIME_IM_TOGGLE_KEYS, imkeys[idx].keynum);
247
free(hime_str_im_cycle);
252
for(i=0;i<inmdN;i++) {
253
if (inmd[i].in_cycle) {
254
dbg("in %d %c\n", i, inmd[i].key_ch);
255
tt[ttN++]=inmd[i].key_ch;
259
hime_str_im_cycle = strdup(tt);
260
save_hime_conf_str(HIME_STR_IM_CYCLE, hime_str_im_cycle);
261
dbg("hime_str_im_cycle ttN:%d '%s' '%s'\n", ttN, hime_str_im_cycle, tt);
263
save_hime_conf_int(HIME_REMOTE_CLIENT,
264
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button_hime_remote_client)));
265
save_hime_conf_int(HIME_SHIFT_SPACE_ENG_FULL,
266
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button_hime_shift_space_eng_full)));
268
save_hime_conf_int(HIME_INIT_IM_ENABLED,
269
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button_hime_init_im_enabled)));
271
save_hime_conf_int(HIME_ENG_PHRASE_ENABLED,
272
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button_hime_eng_phrase_enabled)));
274
save_hime_conf_int(HIME_WIN_SYM_CLICK_CLOSE,
275
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button_hime_win_sym_click_close)));
277
save_hime_conf_int(HIME_BELL_OFF,
278
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button_hime_bell_off)));
280
save_hime_conf_int(HIME_PUNC_AUTO_SEND,
281
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button_hime_punc_auto_send)));
282
save_hime_conf_int(HIME_SINGLE_STATE,
283
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button_hime_single_state)));
284
if (opt_speaker_opts) {
285
idx = gtk_combo_box_get_active (GTK_COMBO_BOX (opt_speaker_opts));
286
save_hime_conf_str(PHONETIC_SPEAK_SEL, pho_speaker[idx]);
291
save_hime_conf_int(PHONETIC_SPEAK,
292
gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check_button_phonetic_speak)));
294
gtk_widget_destroy(gtablist_window); gtablist_window = NULL;
296
/* caleb- does found where "reload" is used.
297
* caleb- think the send_hime_message() here does nothing.
299
send_hime_message(GDK_DISPLAY(), "reload");
302
static void cb_cancel (GtkWidget *widget, gpointer data)
304
gtk_widget_destroy(gtablist_window); gtablist_window = NULL;
307
int hime_switch_keys_lookup(int key);
309
static gboolean toggled (GtkCellRendererToggle *cell, gchar *path_string, gpointer data)
311
GtkTreeModel *model = GTK_TREE_MODEL (data);
313
GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
318
gtk_tree_model_get_iter (model, &iter, path);
319
gtk_tree_model_get (model, &iter, COLUMN_CYCLE, &cycle, -1);
322
gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_CYCLE, cycle, -1);
325
gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_USE, TRUE, -1);
328
gtk_tree_path_free (path);
334
static void clear_col_default_inmd(GtkTreeModel *model)
338
if (!gtk_tree_model_get_iter_first(model, &iter))
343
gtk_tree_model_get(model,&iter, COLUMN_KEY, &tkey, -1);
344
gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_DEFAULT_INMD, 0, -1);
346
} while (gtk_tree_model_iter_next(model, &iter));
350
static gboolean toggled_default_inmd(GtkCellRendererToggle *cell, gchar *path_string, gpointer data)
352
GtkTreeModel *model = GTK_TREE_MODEL (data);
353
clear_col_default_inmd(model);
355
GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
357
// dbg("toggled_default_inmd\n");
358
gtk_tree_model_get_iter (model, &iter, path);
360
gtk_tree_model_get (model, &iter, COLUMN_KEY, &key, -1);
362
gtk_tree_model_get (model, &iter, COLUMN_FILE, &file, -1);
364
sprintf(tt, "%s %s", key, file);
365
free(default_input_method_str);
366
default_input_method_str = strdup(tt);
367
dbg("default_input_method_str %s\n", default_input_method_str);
368
// default_input_method = hime_switch_keys_lookup(key[0]);
370
gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_DEFAULT_INMD, TRUE, -1);
371
gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_USE, TRUE, -1);
373
gtk_tree_path_free (path);
378
static gboolean toggled_use(GtkCellRendererToggle *cell, gchar *path_string, gpointer data)
380
GtkTreeModel *model = GTK_TREE_MODEL (data);
383
GtkTreePath *path = gtk_tree_path_new_from_string (path_string);
385
// dbg("toggled_default_inmd\n");
386
gtk_tree_model_get_iter (model, &iter, path);
387
gboolean cycle, default_inmd, use;
388
gtk_tree_model_get (model, &iter, COLUMN_CYCLE, &cycle, -1);
389
gtk_tree_model_get (model, &iter, COLUMN_DEFAULT_INMD, &default_inmd, -1);
390
gtk_tree_model_get (model, &iter, COLUMN_USE, &use, -1);
392
gboolean must_on = default_inmd;
393
dbg("toggle %d %d %d\n", cycle, default_inmd, use);
395
if (must_on && !use) {
399
gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_USE, use, -1);
401
gtk_list_store_set (GTK_LIST_STORE (model), &iter, COLUMN_CYCLE, FALSE, -1);
403
gtk_tree_path_free (path);
410
add_columns (GtkTreeView *treeview)
412
GtkCellRenderer *renderer;
413
GtkTreeModel *model = gtk_tree_view_get_model (treeview);
417
renderer = gtk_cell_renderer_text_new ();
418
g_object_set_data (G_OBJECT (renderer), "column", (gint *)COLUMN_NAME);
419
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
420
-1, _("名稱"), renderer,
422
"editable", COLUMN_EDITABLE,
425
renderer = gtk_cell_renderer_pixbuf_new();
426
g_object_set_data (G_OBJECT (renderer), "column", (gint *)COLUMN_ICON);
427
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
429
"pixbuf", COLUMN_ICON,
430
// "editable", COLUMN_EDITABLE,
433
renderer = gtk_cell_renderer_text_new ();
434
g_object_set_data (G_OBJECT (renderer), "column", (gint *)COLUMN_KEY);
436
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
437
-1, _("Ctrl-Alt-鍵"), renderer,
439
"editable", COLUMN_EDITABLE,
443
renderer = gtk_cell_renderer_toggle_new ();
444
g_signal_connect (G_OBJECT (renderer), "toggled",
445
G_CALLBACK (toggled), model);
447
g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
449
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),-1,
450
_("在 Ctrl-Shift 中循環"),
451
renderer, "active", COLUMN_CYCLE,
454
// default_inmd column
455
renderer = gtk_cell_renderer_toggle_new ();
456
gtk_cell_renderer_toggle_set_radio(GTK_CELL_RENDERER_TOGGLE(renderer), TRUE);
457
g_signal_connect (G_OBJECT (renderer), "toggled",
458
G_CALLBACK (toggled_default_inmd), model);
460
g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
462
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
466
"active", COLUMN_DEFAULT_INMD,
470
renderer = gtk_cell_renderer_toggle_new ();
471
g_signal_connect (G_OBJECT (renderer), "toggled",
472
G_CALLBACK (toggled_use), model);
474
g_object_set (G_OBJECT (renderer), "xalign", 0.0, NULL);
476
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
479
"active", COLUMN_USE,
482
renderer = gtk_cell_renderer_text_new ();
483
g_object_set_data (G_OBJECT (renderer), "column", (gint *)COLUMN_FILE);
485
gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (treeview),
486
-1, _("檔案名稱"), renderer,
488
"editable", COLUMN_EDITABLE,
493
static void callback_win_delete()
495
gtk_widget_destroy(gtablist_window); gtablist_window = NULL;
498
void set_selection_by_key(int key)
503
GtkTreeSelection *selection=gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview));
504
GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(treeview));
506
gboolean found=FALSE;
508
if (!gtk_tree_model_get_iter_first(model, &iter))
514
gtk_tree_model_get(model,&iter, COLUMN_KEY, &tkey,-1);
516
if (atoi(tkey) == key) {
520
} while (gtk_tree_model_iter_next(model, &iter));
523
gtk_tree_selection_select_iter(selection,&iter);
526
static GtkWidget *create_im_toggle_keys()
529
GtkWidget *hbox = gtk_hbox_new (FALSE, 1);
530
GtkWidget *label = gtk_label_new(_("輸入視窗(開啟/關閉)切換"));
531
gtk_box_pack_start (GTK_BOX (hbox), label, FALSE, FALSE, 0);
533
opt_im_toggle_keys = gtk_combo_box_new_text ();
534
gtk_box_pack_start (GTK_BOX (hbox), opt_im_toggle_keys, FALSE, FALSE, 0);
536
int i, current_idx=0;
538
for(i=0; imkeys[i].keystr; i++) {
539
if (imkeys[i].keynum == hime_im_toggle_keys)
541
gtk_combo_box_append_text (GTK_COMBO_BOX_TEXT (opt_im_toggle_keys), imkeys[i].keystr);
544
gtk_combo_box_set_active (GTK_COMBO_BOX (opt_im_toggle_keys), current_idx);
549
int get_current_speaker_idx();
551
static GtkWidget *create_speaker_opts()
553
GtkWidget *hbox = gtk_hbox_new (FALSE, 1);
555
opt_speaker_opts = gtk_combo_box_new_text ();
556
gtk_box_pack_start (GTK_BOX (hbox), opt_speaker_opts, FALSE, FALSE, 0);
559
int current_idx = get_current_speaker_idx();
561
for(i=0; i<pho_speakerN; i++) {
562
if (imkeys[i].keynum == hime_im_toggle_keys)
564
gtk_combo_box_append_text (GTK_COMBO_BOX_TEXT (opt_speaker_opts), pho_speaker[i]);
567
gtk_combo_box_set_active (GTK_COMBO_BOX (opt_speaker_opts), current_idx);
574
void create_gtablist_window (void)
576
if (gtablist_window) {
577
gtk_window_present(GTK_WINDOW(gtablist_window));
581
/* create gtab_list_window, etc */
582
gtablist_window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
583
gtk_window_set_position(GTK_WINDOW(gtablist_window), GTK_WIN_POS_MOUSE);
585
gtk_window_set_has_resize_grip(GTK_WINDOW(gtablist_window), FALSE);
586
gtk_window_set_title (GTK_WINDOW (gtablist_window), _("輸入法選擇"));
587
gtk_container_set_border_width (GTK_CONTAINER (gtablist_window), 1);
589
g_signal_connect (G_OBJECT (gtablist_window), "destroy",
590
G_CALLBACK (gtk_widget_destroyed), >ablist_window);
592
g_signal_connect (G_OBJECT (gtablist_window), "delete_event",
593
G_CALLBACK (callback_win_delete), NULL);
595
vbox = gtk_vbox_new (FALSE, 0);
596
gtk_orientable_set_orientation(GTK_ORIENTABLE(vbox), GTK_ORIENTATION_VERTICAL);
597
gtk_container_add (GTK_CONTAINER (gtablist_window), vbox);
599
sw = gtk_scrolled_window_new (NULL, NULL);
600
gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
601
GTK_SHADOW_ETCHED_IN);
602
gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
603
GTK_POLICY_AUTOMATIC,
604
GTK_POLICY_AUTOMATIC);
605
gtk_box_pack_start (GTK_BOX (vbox), sw, TRUE, TRUE, 0);
608
GtkTreeModel *model = create_model ();
610
/* create tree view */
611
treeview = gtk_tree_view_new_with_model (model);
612
gtk_widget_set_hexpand (treeview, TRUE);
613
gtk_widget_set_vexpand (treeview, TRUE);
614
g_object_unref (G_OBJECT (model));
615
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
617
GtkTreeSelection *tree_selection =
618
gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview));
619
gtk_tree_selection_set_mode (tree_selection, GTK_SELECTION_SINGLE);
621
add_columns (GTK_TREE_VIEW (treeview));
623
gtk_container_add (GTK_CONTAINER (sw), treeview);
625
gtk_box_pack_start (GTK_BOX (vbox), create_im_toggle_keys(), FALSE, FALSE, 0);
627
GtkWidget *hbox_hime_remote_client = gtk_hbox_new (FALSE, 10);
628
gtk_box_pack_start (GTK_BOX (vbox), hbox_hime_remote_client, FALSE, FALSE, 0);
629
check_button_hime_remote_client = gtk_check_button_new_with_label (_("支援遠端用戶端程式 (port 9999-)"));
630
gtk_box_pack_start (GTK_BOX (hbox_hime_remote_client),check_button_hime_remote_client, FALSE, FALSE, 0);
631
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button_hime_remote_client),
635
GtkWidget *hbox_hime_init_im_enabled = gtk_hbox_new (FALSE, 10);
636
gtk_box_pack_start (GTK_BOX (vbox), hbox_hime_init_im_enabled, FALSE, FALSE, 0);
637
check_button_hime_init_im_enabled = gtk_check_button_new_with_label (_("直接進入中文輸入狀態 (限非XIM)"));
638
gtk_box_pack_start (GTK_BOX (hbox_hime_init_im_enabled),check_button_hime_init_im_enabled, FALSE, FALSE, 0);
639
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button_hime_init_im_enabled),
640
hime_init_im_enabled);
642
GtkWidget *hbox_hime_shift_space_eng_full = gtk_hbox_new (FALSE, 10);
643
gtk_box_pack_start (GTK_BOX (vbox), hbox_hime_shift_space_eng_full, FALSE, FALSE, 0);
644
check_button_hime_shift_space_eng_full = gtk_check_button_new_with_label (_("按下 shift-space 進入全形英文模式"));
645
gtk_box_pack_start (GTK_BOX (hbox_hime_shift_space_eng_full),check_button_hime_shift_space_eng_full, FALSE, FALSE, 0);
646
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button_hime_shift_space_eng_full),
647
hime_shift_space_eng_full);
649
GtkWidget *hbox_hime_single_state = gtk_hbox_new (FALSE, 10);
650
gtk_box_pack_start (GTK_BOX (vbox), hbox_hime_single_state, FALSE, FALSE, 0);
651
check_button_hime_single_state = gtk_check_button_new_with_label (_("所有程式共用相同的輸入法狀態"));
652
gtk_box_pack_start (GTK_BOX (hbox_hime_single_state),check_button_hime_single_state, FALSE, FALSE, 0);
653
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button_hime_single_state),
656
GtkWidget *hbox_hime_eng_phrase_enabled = gtk_hbox_new (FALSE, 10);
657
gtk_box_pack_start (GTK_BOX (vbox), hbox_hime_eng_phrase_enabled, FALSE, FALSE, 0);
658
check_button_hime_eng_phrase_enabled = gtk_check_button_new_with_label (_("英數狀態下可使用 alt-shift 片語"));
659
gtk_box_pack_start (GTK_BOX (hbox_hime_eng_phrase_enabled),check_button_hime_eng_phrase_enabled, FALSE, FALSE, 0);
660
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button_hime_eng_phrase_enabled),
661
hime_eng_phrase_enabled);
663
GtkWidget *hbox_phonetic_speak = gtk_hbox_new(FALSE, 10);
664
gtk_box_pack_start (GTK_BOX (vbox), hbox_phonetic_speak , FALSE, FALSE, 0);
665
check_button_phonetic_speak = gtk_check_button_new_with_label (_("輸入的同時念出發音"));
666
gtk_box_pack_start (GTK_BOX (hbox_phonetic_speak), check_button_phonetic_speak, FALSE, FALSE, 0);
667
gtk_toggle_button_set_active(
668
GTK_TOGGLE_BUTTON(check_button_phonetic_speak), phonetic_speak);
671
GtkWidget *hbox_hime_win_sym_click_close = gtk_hbox_new (FALSE, 10);
672
gtk_box_pack_start (GTK_BOX (vbox), hbox_hime_win_sym_click_close, FALSE, FALSE, 0);
673
check_button_hime_win_sym_click_close = gtk_check_button_new_with_label (_("符號視窗點選後自動關閉"));
674
gtk_box_pack_start (GTK_BOX (hbox_hime_win_sym_click_close),check_button_hime_win_sym_click_close, FALSE, FALSE, 0);
675
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button_hime_win_sym_click_close),
676
hime_win_sym_click_close);
678
GtkWidget *hbox_hime_bell_off = gtk_hbox_new (FALSE, 10);
679
gtk_box_pack_start (GTK_BOX (vbox), hbox_hime_bell_off, FALSE, FALSE, 0);
680
check_button_hime_bell_off = gtk_check_button_new_with_label (_("關閉嗶聲"));
681
gtk_box_pack_start (GTK_BOX (hbox_hime_bell_off),check_button_hime_bell_off, FALSE, FALSE, 0);
682
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button_hime_bell_off),
685
GtkWidget *hbox_hime_punc_auto_send = gtk_hbox_new (FALSE, 10);
686
gtk_box_pack_start (GTK_BOX (vbox), hbox_hime_punc_auto_send, FALSE, FALSE, 0);
687
check_button_hime_punc_auto_send = gtk_check_button_new_with_label (_("結尾標點符號自動送出編輯區內容"));
688
gtk_box_pack_start (GTK_BOX (hbox_hime_punc_auto_send),check_button_hime_punc_auto_send, FALSE, FALSE, 0);
689
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check_button_hime_punc_auto_send),
690
hime_punc_auto_send);
693
if ((dir=opendir(HIME_OGG_DIR"/ㄧ"))) {
697
while ((dire=readdir(dir))) {
698
char *name = dire->d_name;
702
pho_speaker[pho_speakerN++]=strdup(name);
706
dbg("pho_speakerN:%d\n", pho_speakerN);
711
GtkWidget *labelspeaker = gtk_label_new(_("發音選擇"));
712
gtk_box_pack_start (GTK_BOX (hbox_phonetic_speak), labelspeaker, FALSE, FALSE, 0);
713
gtk_container_add (GTK_CONTAINER (hbox_phonetic_speak), create_speaker_opts());
716
hbox = gtk_hbox_new (TRUE, 4);
717
gtk_grid_set_column_homogeneous(GTK_GRID(hbox), TRUE);
718
gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
720
button = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
721
g_signal_connect (G_OBJECT (button), "clicked",
722
G_CALLBACK (cb_cancel), treeview);
724
gtk_box_pack_end (GTK_BOX (hbox), button, TRUE, TRUE, 0);
726
gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
728
button2 = gtk_button_new_from_stock (GTK_STOCK_OK);
729
g_signal_connect (G_OBJECT (button2), "clicked",
730
G_CALLBACK (cb_ok), model);
731
#if !GTK_CHECK_VERSION(2,91,2)
733
gtk_box_pack_end (GTK_BOX (hbox), button2, TRUE, TRUE, 0);
735
gtk_box_pack_start (GTK_BOX (hbox), button2, TRUE, TRUE, 0);
738
gtk_grid_attach_next_to (GTK_BOX (hbox), button2, button, GTK_POS_LEFT, 1, 1);
740
gtk_grid_attach_next_to (GTK_BOX (hbox), button2, button, GTK_POS_RIGHT, 1, 1);
742
gtk_window_set_default_size (GTK_WINDOW (gtablist_window), 620, 450);
744
g_signal_connect (G_OBJECT (gtablist_window), "delete_event",
745
G_CALLBACK (gtk_main_quit), NULL);
747
gtk_widget_show_all (gtablist_window);
749
set_selection_by_key(default_input_method);
752
g_signal_connect (G_OBJECT(tree_selection), "changed",
753
G_CALLBACK (callback_row_selected), NULL);