3
Copyright (c) 2005-2006 uim Project http://uim.freedesktop.org/
7
Redistribution and use in source and binary forms, with or without
8
modification, are permitted provided that the following conditions
11
1. Redistributions of source code must retain the above copyright
12
notice, this list of conditions and the following disclaimer.
13
2. Redistributions in binary form must reproduce the above copyright
14
notice, this list of conditions and the following disclaimer in the
15
documentation and/or other materials provided with the distribution.
16
3. Neither the name of authors nor the names of its contributors
17
may be used to endorse or promote products derived from this software
18
without specific prior written permission.
20
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' AND
21
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
24
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
37
#include <gdk/gdkkeysyms.h>
44
#include "uim/uim-custom.h"
45
#include "uim/gettext.h"
46
#include "pref-gtk-custom-widgets.h"
47
#include "../gtk/key-util-gtk.h"
49
#define DEFAULT_WINDOW_WIDTH_MAX 800
50
#define DEFAULT_WINDOW_HEIGHT_MAX 600
51
#define USE_CHANGES_SENSITIVE_OK_BUTTON 0
53
static GtkWidget *pref_window = NULL;
54
static GtkWidget *pref_tree_view = NULL;
55
static GtkWidget *pref_hbox = NULL;
56
static GtkWidget *current_group_widget = NULL;
58
gboolean uim_pref_gtk_value_changed = FALSE;
59
static GtkWidget *pref_apply_button = NULL;
60
static GtkWidget *pref_ok_button = NULL;
69
void uim_pref_gtk_mark_value_changed(void);
70
void uim_pref_gtk_unmark_value_changed(void);
72
static gboolean pref_tree_selection_changed(GtkTreeSelection *selection,
74
static GtkWidget *create_pref_treeview(void);
75
static GtkWidget *create_group_widget(const char *group_name);
76
static void create_sub_group_widgets(GtkWidget *parent_widget,
77
const char *parent_group);
80
uim_pref_gtk_mark_value_changed(void)
82
uim_pref_gtk_value_changed = TRUE;
83
gtk_widget_set_sensitive(pref_apply_button, TRUE);
84
#if USE_CHANGES_SENSITIVE_OK_BUTTON
85
gtk_widget_set_sensitive(pref_ok_button, TRUE);
90
uim_pref_gtk_unmark_value_changed(void)
92
uim_pref_gtk_value_changed = FALSE;
93
gtk_widget_set_sensitive(pref_apply_button, FALSE);
94
#if USE_CHANGES_SENSITIVE_OK_BUTTON
95
gtk_widget_set_sensitive(pref_ok_button, FALSE);
100
* 2005-02-10 Takuro Ashie <ashie@homa.ne.jp>
101
* This feature is disabled according to [Anthy-dev 1795].
105
save_confirm_dialog_response_cb(GtkDialog *dialog, gint arg, gpointer user_data)
109
case GTK_RESPONSE_YES:
111
uim_custom_broadcast();
112
uim_pref_gtk_value_changed = FALSE;
114
case GTK_RESPONSE_NO:
115
uim_pref_gtk_value_changed = FALSE;
124
pref_tree_selection_changed(GtkTreeSelection *selection,
131
GtkWidget *group_widget;
134
* 2005-02-10 Takuro Ashie <ashie@homa.ne.jp>
135
* This feature is disabled according to [Anthy-dev 1795].
138
/* Preference save check should be here. */
139
if (uim_pref_gtk_value_changed) {
141
dialog = gtk_message_dialog_new(NULL,
143
GTK_MESSAGE_QUESTION,
145
_("Some value(s) have been changed.\n"
147
gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(pref_window));
148
gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT);
149
g_signal_connect(G_OBJECT(dialog), "response",
150
G_CALLBACK(save_confirm_dialog_response_cb), NULL);
151
gtk_dialog_run(GTK_DIALOG(dialog));
152
gtk_widget_destroy(dialog);
156
if (gtk_tree_selection_get_selected(selection, &model, &iter) == FALSE)
159
store = GTK_TREE_STORE(model);
160
gtk_tree_model_get(model, &iter,
161
GROUP_COLUMN, &group_name,
162
GROUP_WIDGET, &group_widget,
165
if (group_name == NULL)
168
/* hide current selected group's widget */
169
if (current_group_widget)
170
gtk_widget_hide(current_group_widget);
172
/* whether group_widget is already packed or not */
173
if (!gtk_widget_get_parent(group_widget))
174
gtk_box_pack_start (GTK_BOX (pref_hbox), group_widget, TRUE, TRUE, 0);
176
/* show selected group's widget */
177
gtk_widget_show_all(group_widget);
179
current_group_widget = group_widget;
187
quit_confirm_dialog_response_cb(GtkDialog *dialog, gint arg, gpointer user_data)
189
gboolean *quit = user_data;
193
case GTK_RESPONSE_YES:
194
case GTK_RESPONSE_OK:
197
case GTK_RESPONSE_CANCEL:
198
case GTK_RESPONSE_NO:
209
if (uim_pref_gtk_value_changed) {
211
gboolean quit = FALSE;
213
dialog = gtk_message_dialog_new(NULL,
215
GTK_MESSAGE_QUESTION,
217
_("Some value(s) have been changed.\n"
218
"Do you really quit this program?"));
219
gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(pref_window));
220
gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT);
221
g_signal_connect(G_OBJECT(dialog), "response",
222
G_CALLBACK(quit_confirm_dialog_response_cb), &quit);
223
gtk_dialog_run(GTK_DIALOG(dialog));
224
gtk_widget_destroy(dialog);
234
delete_event_cb(GtkWidget *widget, gpointer data)
241
create_pref_treeview(void)
243
GtkTreeStore *tree_store;
244
GtkCellRenderer *renderer;
245
GtkTreeViewColumn *column;
247
char **primary_groups, **grp;
248
GtkTreeSelection *selection;
249
GtkTreePath *first_path;
250
tree_store = gtk_tree_store_new (NUM_COLUMNS,
254
pref_tree_view = gtk_tree_view_new();
256
renderer = gtk_cell_renderer_text_new();
257
column = gtk_tree_view_column_new_with_attributes(_("Group"),
259
"text", GROUP_COLUMN,
261
gtk_tree_view_column_set_sort_column_id(column, 0);
262
gtk_tree_view_append_column(GTK_TREE_VIEW(pref_tree_view), column);
264
primary_groups = uim_custom_primary_groups();
265
for (grp = primary_groups; *grp; grp++) {
266
struct uim_custom_group *group = uim_custom_group_get(*grp);
267
gtk_tree_store_append (tree_store, &iter, NULL/* parent iter */);
268
gtk_tree_store_set (tree_store, &iter,
269
GROUP_COLUMN, group->label,
270
GROUP_WIDGET, create_group_widget(*grp),
272
uim_custom_group_free(group);
274
uim_custom_symbol_list_free( primary_groups );
276
gtk_tree_view_set_model (GTK_TREE_VIEW(pref_tree_view),
277
GTK_TREE_MODEL(tree_store));
278
g_object_unref (tree_store);
279
gtk_tree_view_set_rules_hint (GTK_TREE_VIEW(pref_tree_view), TRUE);
280
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (pref_tree_view));
281
gtk_tree_selection_set_mode (selection, GTK_SELECTION_SINGLE);
282
g_signal_connect (G_OBJECT(selection), "changed",
283
G_CALLBACK(pref_tree_selection_changed), NULL);
285
first_path = gtk_tree_path_new_from_indices (0, -1);
287
gtk_tree_view_set_cursor(GTK_TREE_VIEW(pref_tree_view),
288
first_path, NULL, FALSE);
290
return pref_tree_view;
294
ok_button_clicked(GtkButton *button, gpointer user_data)
296
/*const char *group_name = user_data;*/
298
if (uim_pref_gtk_value_changed) {
300
uim_custom_broadcast_reload_request();
301
uim_pref_gtk_unmark_value_changed();
308
apply_button_clicked(GtkButton *button, gpointer user_data)
310
/*const char *group_name = user_data;*/
312
if (uim_pref_gtk_value_changed) {
314
uim_custom_broadcast_reload_request();
315
uim_pref_gtk_unmark_value_changed();
320
set_to_default_cb(GtkWidget *widget, gpointer data)
322
uim_pref_gtk_set_default_value(widget);
324
if (GTK_IS_CONTAINER(widget))
325
gtk_container_foreach(GTK_CONTAINER(widget),
326
(GtkCallback) (set_to_default_cb), NULL);
327
uim_pref_gtk_mark_value_changed();
331
defaults_button_clicked(GtkButton *button, gpointer user_data)
333
gtk_container_foreach(GTK_CONTAINER(current_group_widget),
334
(GtkCallback) (set_to_default_cb), NULL);
338
create_setting_button_box(const char *group_name)
340
GtkWidget *setting_button_box;
342
GtkTooltips *tooltip;
344
setting_button_box = gtk_hbutton_box_new();
345
gtk_button_box_set_layout(GTK_BUTTON_BOX(setting_button_box), GTK_BUTTONBOX_END);
346
gtk_box_set_spacing(GTK_BOX(setting_button_box), 8);
348
/* Defaults button */
349
button = gtk_button_new_with_mnemonic(_("_Defaults"));
350
g_signal_connect(G_OBJECT(button), "clicked",
351
G_CALLBACK(defaults_button_clicked), (gpointer) group_name);
352
gtk_box_pack_start(GTK_BOX(setting_button_box), button, TRUE, TRUE, 8);
353
tooltip = gtk_tooltips_new();
354
gtk_tooltips_set_tip(tooltip, button, _("Revert all changes to default"), NULL);
358
pref_apply_button = gtk_button_new_from_stock(GTK_STOCK_APPLY);
359
g_signal_connect(G_OBJECT(pref_apply_button), "clicked",
360
G_CALLBACK(apply_button_clicked), (gpointer) group_name);
361
gtk_widget_set_sensitive(pref_apply_button, FALSE);
362
gtk_box_pack_start(GTK_BOX(setting_button_box), pref_apply_button, TRUE, TRUE, 8);
363
tooltip = gtk_tooltips_new();
364
gtk_tooltips_set_tip(tooltip, pref_apply_button, _("Apply all changes"), NULL);
367
button = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
368
g_signal_connect(G_OBJECT(button), "clicked",
369
G_CALLBACK(quit_confirm), NULL);
370
gtk_box_pack_start(GTK_BOX(setting_button_box), button, TRUE, TRUE, 8);
371
tooltip = gtk_tooltips_new();
372
gtk_tooltips_set_tip(tooltip, button, _("Quit this application without applying changes"), NULL);
375
pref_ok_button = gtk_button_new_from_stock(GTK_STOCK_OK);
376
g_signal_connect(G_OBJECT(pref_ok_button), "clicked",
377
G_CALLBACK(ok_button_clicked), (gpointer) group_name);
378
gtk_box_pack_start(GTK_BOX(setting_button_box), pref_ok_button, TRUE, TRUE, 8);
379
#if USE_CHANGES_SENSITIVE_OK_BUTTON
380
gtk_widget_set_sensitive(pref_ok_button, FALSE);
382
tooltip = gtk_tooltips_new();
383
gtk_tooltips_set_tip(tooltip, pref_ok_button, _("Quit this application with applying changes"), NULL);
385
return setting_button_box;
389
create_group_widget(const char *group_name)
392
GtkWidget *group_label;
393
struct uim_custom_group *group;
395
vbox = gtk_vbox_new(FALSE, 8);
397
gtk_container_set_border_width(GTK_CONTAINER(vbox), 4);
399
group = uim_custom_group_get(group_name);
404
group_label = gtk_label_new("");
405
label_text = g_markup_printf_escaped("<span size=\"xx-large\">%s</span>",
407
gtk_label_set_markup(GTK_LABEL(group_label), label_text);
410
gtk_box_pack_start (GTK_BOX(vbox), group_label, FALSE, TRUE, 8);
412
create_sub_group_widgets(vbox, group_name);
414
uim_custom_group_free(group);
419
static void create_sub_group_widgets(GtkWidget *parent_widget, const char *parent_group)
421
char **sgrp_syms = uim_custom_group_subgroups(parent_group);
424
for (sgrp_sym = sgrp_syms; *sgrp_sym; sgrp_sym++)
426
struct uim_custom_group *sgrp = uim_custom_group_get(*sgrp_sym);
427
char **custom_syms, **custom_sym;
435
/* XXX quick hack to use AND expression of groups */
436
sgrp_str = g_string_new("");
437
g_string_printf(sgrp_str, "%s '%s", parent_group, *sgrp_sym);
438
custom_syms = uim_custom_collect_by_group(sgrp_str->str);
439
g_string_free(sgrp_str, TRUE);
444
uim_custom_symbol_list_free(custom_syms);
448
vbox = gtk_vbox_new(FALSE, 8);
449
if (strcmp(*sgrp_sym, "main")) {
450
frame = gtk_frame_new(sgrp->label);
451
gtk_frame_set_label_align(GTK_FRAME(frame), 0.02, 0.5);
452
gtk_box_pack_start(GTK_BOX(parent_widget), frame, FALSE, FALSE, 0);
454
gtk_container_add(GTK_CONTAINER(frame), vbox);
458
* Removing frame for 'main' subgroup. If you feel it
459
* strange, Replace it as you favor. -- YamaKen 2005-02-06
461
gtk_box_pack_start(GTK_BOX(parent_widget), vbox, FALSE, FALSE, 0);
464
gtk_container_set_border_width(GTK_CONTAINER(vbox), 6);
466
for (custom_sym = custom_syms; *custom_sym; custom_sym++) {
467
uim_pref_gtk_add_custom(vbox, *custom_sym);
469
uim_custom_symbol_list_free(custom_syms);
471
uim_custom_group_free(sgrp);
474
uim_custom_symbol_list_free(sgrp_syms);
478
create_pref_window(void)
481
GtkWidget *scrolled_win; /* treeview container */
485
pref_window = window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
487
icon = gdk_pixbuf_new_from_file(UIM_PIXMAPSDIR"/uim-icon.png", NULL);
488
gtk_window_set_icon(GTK_WINDOW(pref_window), icon);
490
g_signal_connect(G_OBJECT (window), "delete_event",
491
G_CALLBACK (delete_event_cb), NULL);
494
pref_hbox = gtk_hbox_new(FALSE, 8);
496
scrolled_win = gtk_scrolled_window_new(NULL, NULL);
497
gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_win),
498
GTK_SHADOW_ETCHED_IN);
499
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled_win),
501
GTK_POLICY_AUTOMATIC);
502
gtk_box_pack_start(GTK_BOX(pref_hbox), scrolled_win, FALSE, TRUE, 0);
504
gtk_container_add(GTK_CONTAINER(scrolled_win), create_pref_treeview());
506
vbox = gtk_vbox_new(FALSE, 8);
507
gtk_container_set_border_width(GTK_CONTAINER(vbox), 8);
508
gtk_box_pack_start(GTK_BOX(vbox), pref_hbox, TRUE, TRUE, 0);
509
gtk_box_pack_start(GTK_BOX(vbox), create_setting_button_box("dummy-group-name"), FALSE, TRUE, 0);
510
gtk_container_add(GTK_CONTAINER(window), vbox);
516
scr = gtk_window_get_screen(GTK_WINDOW(window));
517
w = CLAMP(gdk_screen_get_width(scr) * 0.95, 0, DEFAULT_WINDOW_WIDTH_MAX);
518
h = CLAMP(gdk_screen_get_height(scr) * 0.95, 0, DEFAULT_WINDOW_HEIGHT_MAX);
519
gtk_window_set_default_size(GTK_WINDOW(window), w, h);
520
gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_CENTER_ALWAYS);
527
check_dot_uim_file(void)
529
GString *dot_uim = g_string_new(g_get_home_dir());
531
const gchar *message =
532
N_("The user customize file \"~/.uim\" is found.\n"
533
"This file will override all conflicted settings set by\n"
534
"this tool (stored in ~/.uim.d/customs/*.scm).\n"
535
"Please check the file if you find your settings aren't applied.");
537
g_string_append(dot_uim, "/.uim");
539
if (!g_file_test(dot_uim->str, G_FILE_TEST_EXISTS)) {
540
g_string_free(dot_uim, TRUE);
543
g_string_free(dot_uim, TRUE);
545
dialog = gtk_message_dialog_new(NULL,
551
gtk_window_set_transient_for(GTK_WINDOW(dialog), GTK_WINDOW(pref_window));
552
gtk_window_set_position(GTK_WINDOW(dialog), GTK_WIN_POS_CENTER_ON_PARENT);
556
* 2005-02-07 Takuro Ashie <ashie@homa.ne.jp>
557
* FIXME! We shoud add a check box like
558
* "Show this message every time on start up.".
561
gtk_dialog_run(GTK_DIALOG(dialog));
562
gtk_widget_destroy(GTK_WIDGET(dialog));
568
main (int argc, char *argv[])
570
setlocale(LC_ALL, "");
571
bindtextdomain(PACKAGE, LOCALEDIR);
573
bind_textdomain_codeset(PACKAGE, "UTF-8");
577
gtk_init(&argc, &argv);
579
if (uim_init() < 0) {
580
fprintf(stderr, "uim_init() failed.\n");
584
if (uim_custom_enable()) {
587
im_uim_init_modifier_keys();
589
gtk_idle_add((GtkFunction) check_dot_uim_file, NULL);
591
pref = create_pref_window();
593
gtk_widget_show_all(pref);
597
fprintf(stderr, "uim_custom_enable() failed.\n");