1 /*
2 * Copyright (c) 2008-2010 Lu, Chao-Ming (Tetralet). All rights reserved.
3 *
4 * This file is part of LilyTerm.
5 *
6 * LilyTerm is free software: you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation, either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * LilyTerm is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with LilyTerm. If not, see <http://www.gnu.org/licenses/>.
18 */
19
20 #include <locale.h>
21
22 #include "dialog.h"
23 #define TEMPSTR 6
24
25 extern GtkWidget *menu_active_window;
26 extern struct ModKey modkeys[MOD];
27 extern struct Page_Color page_color[PAGE_COLOR];
28 extern GList* window_list;
29 extern gchar *profile_dir;
30 extern gchar *key_groups[KEY_GROUP];
31 extern struct KeyValue system_keys[KEYS];
32 extern gchar *init_LC_CTYPE;
33 extern struct Color color[COLOR];
34 extern struct Color_Theme system_color_theme[THEME];
35
36 gint dialog_activated = 0;
37 gboolean force_to_quit = FALSE;
38 gboolean using_kill = FALSE;
39
40 GdkColor entry_not_find_bg_color = {0, 0xffff, 0xbcbc, 0xbcbc};
41
42 // EDIT_LABEL,
43 // FIND_STRING,
44 // ADD_NEW_LOCALES,
45 // CHANGE_THE_FOREGROUND_COLOR,
46 // CHANGE_THE_ANSI_COLORS,
47 // CHANGE_THE_BACKGROUND_COLOR,
48 // CHANGE_THE_CURSOR_COLOR,
49 // ADJUST_THE_BRIGHTNESS_OF_ANSI_COLORS_USED_IN_TERMINAL,
50 // ADJUST_THE_BRIGHTNESS_OF_ANSI_COLORS_WHEN_INACTIVE,
51 // CHANGE_BACKGROUND_SATURATION,
52 // CHANGE_THE_OPACITY_OF_WINDOW,
53 // CHANGE_THE_OPACITY_OF_WINDOW_WHEN_INACTIVE,
54 // CHANGE_THE_TEXT_COLOR_OF_WINDOW_TITLE,
55 // CHANGE_THE_TEXT_COLOR_OF_CMDLINE,
56 // CHANGE_THE_TEXT_COLOR_OF_CURRENT_DIR,
57 // CHANGE_THE_TEXT_COLOR_OF_CUSTOM_PAGE_NAME,
58 // CHANGE_THE_TEXT_COLOR_OF_ROOT_PRIVILEGES_CMDLINE,
59 // CHANGE_THE_TEXT_COLOR_OF_NORMAL_TEXT,
60 // CONFIRM_TO_EXECUTE_COMMAND,
61 // CONFIRM_TO_CLOSE_MULTI_PAGES,
62 // CONFIRM_TO_CLOSE_RUNNING_APPLICATION,
63 // CONFIRM_TO_CLOSE_A_TAB_WITH_CHILD_PROCESS,
64 // CONFIRM_TO_CLOSE_A_WINDOW_WITH_CHILD_PROCESS,
65 // CONFIRM_TO_EXIT_WITH_CHILD_PROCESS,
66 // CONFIRM_TO_PASTE_TEXTS_TO_VTE_TERMINAL,
67 // VIEW_THE_CLIPBOARD,
68 // PASTE_TEXTS_TO_EVERY_VTE_TERMINAL,
69 // PASTE_GRABBED_KEY_TO_EVERY_VTE_TERMINAL,
70 // SET_KEY_BINDING,
71 // USAGE_MESSAGE
72
dialog(GtkWidget * widget,gsize style)73 GtkResponseType dialog(GtkWidget *widget, gsize style)
74 {
75 #ifdef DETAIL
76 g_debug("! Launch dialog() with style = %ld", (long)style);
77 #endif
78 dialog_activated++;
79 // g_debug("Set dialog_activated = %d", dialog_activated);
80
81 struct Dialog *dialog_data = g_new0(struct Dialog, 1);
82 #ifdef SAFEMODE
83 if (menu_active_window)
84 #endif
85 g_object_set_data(G_OBJECT(menu_active_window), "Dialog", dialog_data);
86 dialog_data->type = style;
87 GtkResponseType dialog_response = GTK_RESPONSE_NONE;
88
89 #ifdef SAFEMODE
90 if (dialog_data==NULL) goto FINISH;
91 #endif
92 gchar *temp_str[TEMPSTR] = {NULL};
93
94 struct Window *win_data = NULL;
95 // A critical error message for current_vte = NULL.
96
97 #ifdef FATAL
98 // menu_active_window==NULL: it should NOT happen!
99 if (menu_active_window==NULL)
100 {
101 gchar *err_msg = g_strdup_printf("dialog(%ld): menu_active_window = NULL\n\n"
102 "Please report bug to %s, Thanks!",
103 (glong)style, BUGREPORT);
104 #ifdef SAFEMODE
105 if (err_msg)
106 #endif
107 error_dialog(NULL, _("The following error occurred:"),
108 "The following error occurred:",
109 GTK_STOCK_DIALOG_ERROR, err_msg, NULL);
110 g_free(err_msg);
111 goto FINISH;
112 }
113 else
114 #endif
115 win_data = (struct Window *)g_object_get_data(G_OBJECT(menu_active_window), "Win_Data");
116
117 #ifdef SAFEMODE
118 if (win_data==NULL) goto FINISH;
119 #endif
120
121 gboolean enable_key_binding = win_data->enable_key_binding;
122
123 // g_debug("dialog(): win_data->runtime_LC_MESSAGES = %s", win_data->runtime_LC_MESSAGES);
124 setlocale(LC_MESSAGES, win_data->runtime_LC_MESSAGES);
125
126 struct Page *page_data = NULL;
127 if (win_data->current_vte!=NULL)
128 {
129 page_data = (struct Page *)g_object_get_data(G_OBJECT(win_data->current_vte), "Page_Data");
130 #ifdef SAFEMODE
131 if (page_data==NULL) goto FINISH;
132 #endif
133 // g_debug("Get win_data = %p, page_data = %p, current_vte = %p when creating dialog!",
134 // win_data, page_data, win_data->current_vte);
135
136 // For changing the text color of tab
137 dialog_data->total_page = gtk_notebook_get_n_pages(GTK_NOTEBOOK(
138 page_data->notebook));
139 dialog_data->current_page_no = gtk_notebook_get_current_page(GTK_NOTEBOOK(
140 page_data->notebook));
141 }
142
143 gboolean tabs_bar_is_shown = TRUE;
144 gint create_entry_hbox = 0;
145 gint i;
146
147 // g_debug("Running dialog() with mod %d", style);
148
149 /*
150 /--------------main_hbox--------------\
151 |/icon_vbox\/------state_vbox-----\/-\|
152 || ||/----title_hbox-----\||r||
153 || ||| |||i||
154 || ||\-------------------/||g||
155 || ||/----entry_hbox-----\||h||
156 || ||| |||t||
157 || ||| ||| ||
158 || ||\-------------------/||v||
159 || ||/-state_bottom_hbox-\||b||
160 || ||| ||o||
161 || ||\-------------------/||x||
162 |\---------/\---------------------/\-/|
163 | /------------\ /------------\ |
164 | | OK | | CANCEL | |
165 | \------------/ \------------/ |
166 \-------------------------------------/
167 */
168
169 switch (style)
170 {
171 case EDIT_LABEL: // 1
172 create_dialog(_("Rename this tab"),
173 "Rename this tab",
174 DIALOG_OK_CANCEL,
175 page_data->window,
176 FALSE,
177 FALSE,
178 10,
179 GTK_RESPONSE_OK,
180 GTK_STOCK_DIALOG_INFO,
181 NULL,
182 FALSE,
183 0,
184 TRUE,
185 BOX_HORIZONTAL,
186 25,
187 dialog_data);
188
189 gchar *default_page_name;
190 if (page_data->custom_page_name == NULL)
191 default_page_name = page_data->page_name;
192 else
193 default_page_name = page_data->custom_page_name;
194 dialog_data->operate[0] = create_entry_widget (dialog_data->box,
195 _("Please input the Label Name of this tab:"),
196 _("Label Name:"),
197 default_page_name,
198 TRUE);
199 break;
200 case FIND_STRING:
201 {
202 #ifdef ENABLE_FIND_STRING
203 create_dialog(_("Find string"),
204 "Find string",
205 DIALOG_OK,
206 page_data->window,
207 FALSE,
208 FALSE,
209 10,
210 GTK_RESPONSE_OK,
211 GTK_STOCK_FIND,
212 NULL,
213 FALSE,
214 0,
215 TRUE,
216 BOX_VERTICALITY,
217 5,
218 dialog_data);
219 GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
220 GtkWidget *label = gtk_label_new(_("Find: "));
221 gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
222 dialog_data->operate[0] = gtk_entry_new ();
223 g_signal_connect(G_OBJECT(dialog_data->operate[0]), "changed",
224 G_CALLBACK(refresh_regex_settings), win_data);
225
226 // GtkRcStyle *rcstyle = gtk_widget_get_modifier_style(dialog_data->operate[0]);
227 GtkStyle *rcstyle = gtk_widget_get_style (dialog_data->operate[0]);
228 win_data->find_entry_bg_color = rcstyle->base[GTK_STATE_NORMAL];
229 win_data->find_entry_current_bg_color = win_data->find_entry_bg_color;
230 // print_color("win_data->find_entry_bg_color", win_data->find_entry_bg_color);
231
232 // gtk_entry_set_icon_from_stock (GTK_ENTRY (dialog_data->operate[0]),
233 // GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_CLEAR);
234
235 gtk_box_pack_start (GTK_BOX(hbox), dialog_data->operate[0], TRUE, TRUE, 0);
236
237 label = create_button_with_image(_("Find previous string"),
238 GTK_STOCK_GO_UP,
239 TRUE,
240 (GSourceFunc)find_str,
241 GINT_TO_POINTER(FIND_PREV));
242 gtk_box_pack_end (GTK_BOX(hbox), label, FALSE, FALSE, 0);
243 label = create_button_with_image(_("Find next string"),
244 GTK_STOCK_GO_DOWN,
245 TRUE,
246 (GSourceFunc)find_str,
247 GINT_TO_POINTER(FIND_NEXT));
248 gtk_box_pack_end (GTK_BOX(hbox), label, FALSE, FALSE, 0);
249 gtk_box_pack_start (GTK_BOX(dialog_data->box), hbox, FALSE, FALSE, 0);
250
251 hbox = gtk_hbox_new (FALSE, 15);
252 gtk_box_pack_start (GTK_BOX(dialog_data->box), hbox, FALSE, FALSE, 0);
253
254 dialog_data->operate[1] = gtk_check_button_new_with_label(_("Case sensitive"));
255 // GTK_TOGGLE_BUTTON(dialog_data->operate[1])->active = win_data->find_case_sensitive;
256 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(dialog_data->operate[1]),
257 win_data->find_case_sensitive);
258 gtk_box_pack_start (GTK_BOX(hbox), dialog_data->operate[1], FALSE, FALSE, 0);
259 g_signal_connect(G_OBJECT(dialog_data->operate[1]), "toggled",
260 G_CALLBACK(refresh_regex_settings), win_data);
261
262 dialog_data->operate[2] = gtk_check_button_new_with_label(_("Use Perl compatible regular expressions"));
263 // GTK_TOGGLE_BUTTON(dialog_data->operate[2])->active = win_data->find_use_perl_regular_expressions;
264 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(dialog_data->operate[2]),
265 win_data->find_use_perl_regular_expressions);
266 gtk_box_pack_start (GTK_BOX(hbox), dialog_data->operate[2], FALSE, FALSE, 0);
267 g_signal_connect(G_OBJECT(dialog_data->operate[2]), "toggled",
268 G_CALLBACK(refresh_regex_settings), win_data);
269 set_widget_can_not_get_focus(dialog_data->operate[1]);
270 set_widget_can_not_get_focus(dialog_data->operate[2]);
271 hbox = gtk_hbox_new (FALSE, 5);
272 dialog_data->operate[3] = gtk_label_new(NULL);
273 gtk_widget_set_no_show_all (dialog_data->operate[3], TRUE);
274 gtk_box_pack_end (GTK_BOX(hbox), dialog_data->operate[3], FALSE, FALSE, 0);
275 gtk_box_pack_start (GTK_BOX(dialog_data->box), hbox, FALSE, FALSE, 0);
276
277 // refresh_regex(win_data, dialog_data);
278
279 // Dirty Hack
280 gchar *clipboard_str = NULL;
281 if (vte_terminal_get_has_selection(VTE_TERMINAL(win_data->current_vte)))
282 {
283 extern GtkClipboard *selection_primary;
284 clipboard_str = gtk_clipboard_wait_for_text (selection_primary);
285 if (clipboard_str && (clipboard_str[0]!='\0'))
286 gtk_entry_set_text(GTK_ENTRY(dialog_data->operate[0]),
287 strtok(clipboard_str, "\n\r"));
288 }
289 if (((clipboard_str==NULL) || (clipboard_str[0]=='\0')) &&
290 (win_data->find_string && (win_data->find_string[0]!='\0')))
291 gtk_entry_set_text(GTK_ENTRY(dialog_data->operate[0]), win_data->find_string);
292 g_free(clipboard_str);
293 #else
294 upgrade_dialog(ENABLE_FIND_STRING_VER);
295 #endif
296 break;
297 }
298 case PASTE_TEXTS_TO_EVERY_VTE_TERMINAL:
299 {
300 create_dialog(_("Paste texts to every Vte Terminal"),
301 "Paste texts to every Vte Terminal",
302 DIALOG_NONE,
303 page_data->window,
304 FALSE,
305 FALSE,
306 10,
307 GTK_RESPONSE_OK,
308 GTK_STOCK_DIALOG_INFO,
309 NULL,
310 FALSE,
311 0,
312 TRUE,
313 BOX_VERTICALITY,
314 10,
315 dialog_data);
316
317 dialog_data->operate[0] = create_entry_widget (dialog_data->box,
318 _("Please input the texts that will be paste to the Vte Terminals:"),
319 _("Text:"),
320 NULL,
321 FALSE);
322 g_signal_connect(G_OBJECT(dialog_data->operate[0]), "activate",
323 G_CALLBACK(paste_text_to_vte_terminal), dialog_data);
324
325 // Check Button: Append a <NewLine> to the end of the text
326 GtkWidget *hbox = gtk_hbox_new (FALSE, 5);
327 gtk_box_pack_start (GTK_BOX(dialog_data->box), hbox, FALSE, FALSE, 0);
328 dialog_data->operate[1] = gtk_check_button_new_with_label(_("Append a <NewLine> to the end of the text."));
329 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(dialog_data->operate[1]), TRUE);
330 gtk_box_pack_end (GTK_BOX(hbox), dialog_data->operate[1], FALSE, FALSE, 0);
331
332 // <Paste> and <Esc> Button
333 GtkWidget *paste_button = gtk_button_new_from_stock (GTK_STOCK_PASTE);
334 if (gtk_alternative_dialog_button_order(NULL))
335 {
336 gtk_box_pack_end (GTK_BOX(gtk_dialog_get_action_area(GTK_DIALOG(dialog_data->window))),
337 paste_button, FALSE, FALSE, 0);
338 gtk_dialog_add_button (GTK_DIALOG(dialog_data->window), GTK_STOCK_QUIT, GTK_RESPONSE_CANCEL);
339 }
340 else
341 {
342 gtk_dialog_add_button (GTK_DIALOG(dialog_data->window), GTK_STOCK_QUIT, GTK_RESPONSE_CANCEL);
343 gtk_box_pack_end (GTK_BOX(gtk_dialog_get_action_area(GTK_DIALOG(dialog_data->window))),
344 paste_button, FALSE, FALSE, 0);
345 }
346 g_signal_connect(G_OBJECT(paste_button), "clicked",
347 G_CALLBACK(paste_text_to_vte_terminal), dialog_data);
348
349 // <Grab keys> Button
350 add_secondary_button(dialog_data->window, _("Grab keys"), GTK_RESPONSE_OK, GTK_STOCK_REFRESH);
351 break;
352 }
353 case PASTE_GRABBED_KEY_TO_EVERY_VTE_TERMINAL:
354 {
355 win_data->enable_key_binding = FALSE;
356 temp_str[0] = g_markup_escape_text (_("Paste the grabbed key to the Vte Terminals.\n"
357 "It will be useful if you want to paste combined keys, like <Ctrl><C>."),
358 -1);
359 create_dialog(_("Paste texts to every Vte Terminal"),
360 "Paste texts to every Vte Terminal",
361 DIALOG_QUIT,
362 page_data->window,
363 FALSE,
364 FALSE,
365 10,
366 GTK_RESPONSE_CANCEL,
367 GTK_STOCK_DIALOG_INFO,
368 temp_str[0],
369 FALSE,
370 0,
371 TRUE,
372 BOX_VERTICALITY,
373 10,
374 dialog_data);
375 // The Key Value frame
376 dialog_data->operate[0] = gtk_label_new(NULL);
377 // set_markup_key_value(TRUE, "blue", "", dialog_data->operate[0]);
378 gtk_label_set_selectable(GTK_LABEL(dialog_data->operate[0]), TRUE);
379 create_frame_widget(dialog_data, _("Key Value:"), NULL, dialog_data->operate[0], 0);
380
381 g_signal_connect(G_OBJECT(dialog_data->window), "key-press-event",
382 G_CALLBACK(grab_key_press), dialog_data);
383
384 // <Switch> Button
385 add_secondary_button(dialog_data->window, _("Entry"), GTK_RESPONSE_OK, GTK_STOCK_REFRESH);
386 break;
387 }
388 case ADD_NEW_LOCALES:
389 {
390 create_dialog(_("Add new locales and set the default locale"),
391 "Add new locales and set the default locale",
392 DIALOG_OK_CANCEL,
393 page_data->window,
394 FALSE,
395 FALSE,
396 10,
397 GTK_RESPONSE_OK,
398 GTK_STOCK_DIALOG_INFO,
399 NULL,
400 FALSE,
401 0,
402 TRUE,
403 BOX_VERTICALITY,
404 25,
405 dialog_data);
406 // TRANSLATE NOTE: You may replace the following locales with the locale name of your country.
407 // TRANSLATE NOTE: For example, replace "zh_TW" with "ru_RU", replace "zh_TW.Big5" with "ru_RU.KOI8-R",
408 // TRANSLATE NOTE: or replace "zh_TW.UTF-8" with "ru_RU.UTF-8".
409 gchar *contents = _("The default locale used when initing a Vte Terminal.\n"
410 "You may use \"zh_TW\", \"zh_TW.Big5\", or \"zh_TW.UTF-8\" here.");
411 dialog_data->operate[0] = create_entry_widget (dialog_data->box,
412 contents,
413 _("Default locale:"),
414 win_data->default_locale,
415 TRUE);
416
417 // TRANSLATE NOTE: You may replace the following locales with the locale name of your country.
418 // TRANSLATE NOTE: For example, replace "zh_TW" with "ja_JP", replace "zh_TW.Big5" with "ja_JP.EUC-JP",
419 // TRANSLATE NOTE: and replace "zh_TW.UTF-8" with "ja_JP.UTF-8".
420 contents = _("The locales list on right click menu, separate with <space>.\n"
421 "You may use \"zh_TW\", \"zh_TW.Big5\", or \"zh_TW.UTF-8\" here.\n"
422 "You may want to use \"UTF-8\" here if you have no locale data installed.");
423 dialog_data->operate[1] = create_entry_widget (dialog_data->box,
424 contents,
425 _("Locales list:"),
426 win_data->locales_list,
427 TRUE);
428 break;
429 }
430 case CHANGE_BACKGROUND_SATURATION: // 2
431 {
432 create_dialog(_("Change the saturation of background"),
433 "Change the saturation of background",
434 DIALOG_OK_CANCEL,
435 page_data->window,
436 FALSE,
437 TRUE,
438 10,
439 GTK_RESPONSE_OK,
440 GTK_STOCK_DIALOG_INFO,
441 _("Change the Saturation of background:"),
442 FALSE,
443 0,
444 TRUE,
445 BOX_VERTICALITY,
446 0,
447 dialog_data);
448
449 create_scale_widget(dialog_data, 0, 1, 0.001,
450 win_data->background_saturation,
451 (GSourceFunc)set_background_saturation,
452 win_data->current_vte);
453
454 dialog_data->original_transparent_background = win_data->transparent_background;
455 if (! compare_strings (win_data->background_image, NULL_DEVICE, TRUE))
456 win_data->transparent_background = TRUE;
457 set_background_saturation(NULL, 0, win_data->background_saturation,
458 win_data->current_vte);
459
460 break;
461 }
462 #ifdef ENABLE_GDKCOLOR_TO_STRING
463 case CHANGE_THE_FOREGROUND_COLOR: // 9
464 {
465 create_dialog(_("Change the foreground color in terminal"),
466 "Change the foreground color in terminal",
467 DIALOG_OK_CANCEL,
468 page_data->window,
469 FALSE,
470 FALSE,
471 15,
472 GTK_RESPONSE_OK,
473 NULL,
474 NULL,
475 FALSE,
476 0,
477 FALSE,
478 BOX_HORIZONTAL,
479 0,
480 dialog_data);
481 gint color_index = get_color_index(win_data->invert_color, COLOR-1);
482 if (win_data->use_custom_theme)
483 dialog_data->original_color = win_data->custom_color_theme[win_data->color_theme_index].color[color_index];
484 else
485 dialog_data->original_color = system_color_theme[win_data->color_theme_index].color[color_index];
486 create_color_selection_widget(dialog_data, (GSourceFunc)adjust_vte_color, win_data->current_vte);
487 break;
488 }
489 case CHANGE_THE_BACKGROUND_COLOR: // 10
490 create_dialog(_("Change the background color in terminal"),
491 "Change the background color in terminal",
492 DIALOG_OK_CANCEL,
493 page_data->window,
494 FALSE,
495 FALSE,
496 15,
497 GTK_RESPONSE_OK,
498 NULL,
499 NULL,
500 FALSE,
501 0,
502 FALSE,
503 BOX_HORIZONTAL,
504 0,
505 dialog_data);
506 gint color_index = get_color_index(win_data->invert_color, 0);
507 if (win_data->use_custom_theme)
508 dialog_data->original_color = win_data->custom_color_theme[win_data->color_theme_index].color[color_index];
509 else
510 dialog_data->original_color = system_color_theme[win_data->color_theme_index].color[color_index];
511 create_color_selection_widget(dialog_data, (GSourceFunc)adjust_vte_color, win_data->current_vte);
512 break;
513 case CHANGE_THE_CURSOR_COLOR: // 9
514 create_dialog(_("Change the cursor color in terminal"),
515 "Change the cursor color in terminal",
516 DIALOG_OK_CANCEL,
517 page_data->window,
518 FALSE,
519 FALSE,
520 15,
521 GTK_RESPONSE_OK,
522 NULL,
523 NULL,
524 FALSE,
525 0,
526 FALSE,
527 BOX_HORIZONTAL,
528 0,
529 dialog_data);
530 dialog_data->original_color = win_data->cursor_color;
531 create_color_selection_widget(dialog_data, (GSourceFunc)adjust_vte_color, win_data->current_vte);
532 break;
533 case CHANGE_THE_ANSI_COLORS: // 9
534 {
535 // ---- Create the Dialog ----
536 gchar *tmp_topic[2];
537 tmp_topic[0] = g_strdup_printf(_("Change the ansi color [%s] in terminal"), color[COLOR-1].translation);
538 tmp_topic[1] = g_strdup_printf("Change the ansi color [%s] in terminal", color[COLOR-1].translation);
539 create_dialog(tmp_topic[0],
540 tmp_topic[1],
541 DIALOG_OK_CANCEL,
542 page_data->window,
543 FALSE,
544 FALSE,
545 15,
546 GTK_RESPONSE_OK,
547 NULL,
548 NULL,
549 FALSE,
550 0,
551 FALSE,
552 BOX_VERTICALITY,
553 0,
554 dialog_data);
555
556 // ---- Create the Color Selection ----
557 gint color_index = get_color_index(win_data->invert_color, COLOR-1);
558 if (win_data->use_custom_theme)
559 dialog_data->original_color = win_data->custom_color_theme[win_data->color_theme_index].color[color_index];
560 else
561 dialog_data->original_color = system_color_theme[win_data->color_theme_index].color[color_index];
562 create_color_selection_widget(dialog_data, (GSourceFunc)adjust_vte_color, win_data->current_vte);
563
564 // ---- Create the Range Scale ----
565 GtkWidget *label = gtk_label_new(_("The brightness of ANSI colors:"));
566 GtkWidget *box = gtk_hbox_new (FALSE, 0);
567
568 GtkWidget *vbox = gtk_vbox_new (FALSE, 0);
569 gtk_box_pack_start (GTK_BOX(dialog_data->box), vbox, FALSE, FALSE, 10);
570
571 gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 0);
572 gtk_box_pack_start (GTK_BOX(vbox), box, FALSE, FALSE, 0);
573
574 dialog_data->operate[1] = gtk_hscale_new_with_range(-1, 1, 0.001);
575 gtk_range_set_value(GTK_RANGE(dialog_data->operate[1]), win_data->color_brightness);
576 gtk_box_pack_start (GTK_BOX(vbox), dialog_data->operate[1], FALSE, FALSE, 0);
577 g_signal_connect_after(dialog_data->operate[1], "change-value", G_CALLBACK(set_ansi_color), win_data->current_vte);
578 dialog_data->original_color_brightness = win_data->color_brightness;
579 dialog_data->original_color_brightness_inactive = win_data->color_brightness_inactive;
580
581 label = gtk_label_new(_("ANSI Colors:"));
582 box = gtk_hbox_new (FALSE, 0);
583 gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 0);
584
585 // ---- Create the [Invert Color] check button ----
586 GtkWidget *check_button = gtk_check_button_new_with_label(_("Invert color"));
587 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(check_button), win_data->invert_color);
588 gtk_box_pack_end (GTK_BOX(box), check_button, FALSE, FALSE, 0);
589 gtk_box_pack_start (GTK_BOX(dialog_data->box), box, FALSE, FALSE, 0);
590 g_signal_connect(G_OBJECT(check_button), "toggled",
591 G_CALLBACK(dialog_invert_color_theme), win_data);
592 dialog_data->original_invert_color = win_data->invert_color;
593 dialog_data->original_have_custom_color = win_data->have_custom_color;
594 dialog_data->original_use_custom_theme = win_data->use_custom_theme;
595
596 // ---- Create the ANSI color buttons ----
597 dialog_data->ansi_table = gtk_table_new (2, COLOR/2, TRUE);
598
599 gint i;
600 for (i=COLOR-1; i>=0; i--)
601 {
602 dialog_data->color_button[i] = gtk_button_new();
603 gtk_table_attach_defaults(GTK_TABLE(dialog_data->ansi_table), dialog_data->color_button[i],
604 (COLOR-1-i)%(COLOR/2), (COLOR-1-i)%(COLOR/2)+1,
605 (COLOR-1-i)/(COLOR/2), (COLOR-1-i)/(COLOR/2)+1);
606 g_signal_connect(G_OBJECT(dialog_data->color_button[i]), "clicked", G_CALLBACK(update_ansi_color_info), GINT_TO_POINTER (i));
607 }
608 init_dialog_ansi_colors_from_win_data(win_data, dialog_data);
609 create_theme_color_data(dialog_data->ansi_colors, dialog_data->ansi_colors_orig,
610 win_data->color_brightness, win_data->invert_color, FALSE, FALSE);
611
612 update_color_buttons(win_data, dialog_data);
613 gtk_box_pack_start (GTK_BOX(dialog_data->box), dialog_data->ansi_table, FALSE, FALSE, 0);
614 gtk_window_set_focus(GTK_WINDOW(dialog_data->window), dialog_data->color_button[COLOR-1]);
615 // win_data->temp_index will point to the color index in color_orig
616 win_data->temp_index = get_color_index(win_data->invert_color, COLOR-1);
617
618 g_free(tmp_topic[0]);
619 g_free(tmp_topic[1]);
620 break;
621 }
622 case CHANGE_THE_TEXT_COLOR_OF_WINDOW_TITLE: // 11
623 case CHANGE_THE_TEXT_COLOR_OF_CMDLINE: // 12
624 case CHANGE_THE_TEXT_COLOR_OF_CURRENT_DIR: // 13
625 case CHANGE_THE_TEXT_COLOR_OF_CUSTOM_PAGE_NAME: // 14
626 case CHANGE_THE_TEXT_COLOR_OF_ROOT_PRIVILEGES_CMDLINE: // 15
627 case CHANGE_THE_TEXT_COLOR_OF_NORMAL_TEXT: // 16
628 {
629 Switch_Type show_tabs_bar = win_data->show_tabs_bar;
630 tabs_bar_is_shown = gtk_notebook_get_show_tabs GTK_NOTEBOOK(win_data->notebook);
631 if (tabs_bar_is_shown)
632 win_data->show_tabs_bar = FORCE_ON;
633 else
634 win_data->show_tabs_bar = FORCE_OFF;
635
636 init_locale_restrict_data(win_data->runtime_LC_MESSAGES);
637 gint page_color_type = style - CHANGE_THE_TEXT_COLOR_OF_WINDOW_TITLE;
638 temp_str[0] = g_strdup_printf(_("Change the %s color on tab"),
639 page_color[page_color_type].comment);
640 temp_str[1] = g_strdup_printf("Change the %s color on tab",
641 page_color[page_color_type].comment);
642 create_dialog(temp_str[0],
643 temp_str[1],
644 DIALOG_OK_CANCEL,
645 page_data->window,
646 FALSE,
647 FALSE,
648 15,
649 GTK_RESPONSE_OK,
650 NULL,
651 NULL,
652 FALSE,
653 0,
654 FALSE,
655 BOX_HORIZONTAL,
656 0,
657 dialog_data);
658 // save the dialog data first
659
660 dialog_data->original_page_color = win_data->user_page_color[page_color_type];
661 // g_debug("dialog_data->original_page_color = %s", dialog_data->original_page_color);
662 #ifdef SAFEMODE
663 if (dialog_data->original_page_color)
664 #endif
665 dirty_gdk_color_parse(win_data->user_page_color[page_color_type], &(dialog_data->original_color));
666
667 // vte = the 1st page of current notebook.
668 struct Page *page_data = get_page_data_from_nth_page(win_data, 0);
669 #ifdef SAFEMODE
670 if (page_data)
671 {
672 #endif
673 create_color_selection_widget(dialog_data, (GSourceFunc)adjust_vte_color, page_data->vte);
674 // store the is_bold data of 1st page...
675 dialog_data->tab_1_is_bold = page_data->is_bold;
676 // win_data->lost_focus = FALSE;
677 #ifdef SAFEMODE
678 }
679 #endif
680 // only bold the 1st page
681 gboolean is_bold = TRUE;
682 // the color for using in 1st page, can NOT be free()!
683 gchar *current_color = NULL;
684 // the text for using in 1st page, can NOT be free()!
685 gchar *display_text = NULL;
686
687 // add new pages to PAGE_COLOR+1.
688 // g_debug("dialog_data->total_page = %d, current_page = %d",
689 // dialog_data->total_page, gtk_notebook_get_current_page(GTK_NOTEBOOK(win_data->notebook)));
690 // The new pages will added next to 1st page!
691 for (i=dialog_data->total_page; i<=PAGE_COLOR; i++)
692 add_page(win_data,
693 page_data,
694 NULL,
695 NULL,
696 NULL,
697 NULL,
698 NULL,
699 NULL,
700 NULL,
701 FALSE);
702 // we need to set the current page to 1st page after adding page.
703 gtk_notebook_set_current_page(GTK_NOTEBOOK(win_data->notebook), 0);
704
705 for (i=0; i<=PAGE_COLOR; i++)
706 {
707 // ste the page name and color for demo.
708 struct Page *tmp_page = get_page_data_from_nth_page(win_data, i);
709 #ifdef SAFEMODE
710 if (tmp_page)
711 {
712 #endif
713 dialog_data->original_update_method[i] = tmp_page->page_update_method;
714 // g_debug ("??? Save: (%d) tmp_page->page_update_method = %d",
715 // i+1, tmp_page->page_update_method);
716 if (i)
717 {
718 display_text = _(page_color[i-1].comment);
719 current_color = win_data->user_page_color[i-1];
720 }
721 else
722 {
723 display_text = _("Bold Demo Text");
724 current_color = dialog_data->original_page_color;
725 }
726
727 // get the demo_vte and demo_text.
728 // the change of color will be shown immediately in 1st page and the page here.
729 if ((i+CHANGE_THE_TEXT_COLOR_OF_WINDOW_TITLE-1)==style)
730 {
731 dialog_data->demo_vte = tmp_page->vte;
732 dialog_data->demo_text = display_text;
733 }
734 // g_debug("!!! updating %d page name!", i+1);
735 update_page_name(tmp_page->window,
736 tmp_page->vte,
737 NULL,
738 tmp_page->label_text,
739 i+1,
740 display_text,
741 current_color,
742 FALSE,
743 is_bold,
744 FALSE,
745 NULL,
746 tmp_page->custom_window_title,
747 FALSE);
748 // only 1st page is bold.
749 is_bold = FALSE;
750 #ifdef SAFEMODE
751 }
752 #endif
753 }
754 // g_debug("Got tabs_bar_is_shown = %d", tabs_bar_is_shown);
755 if (! tabs_bar_is_shown)
756 hide_and_show_tabs_bar(win_data, ON);
757 win_data->show_tabs_bar = show_tabs_bar;
758 break;
759 }
760 #else
761 case CHANGE_THE_FOREGROUND_COLOR:
762 case CHANGE_THE_BACKGROUND_COLOR:
763 case CHANGE_THE_ANSI_COLORS:
764 case CHANGE_THE_CURSOR_COLOR:
765 case CHANGE_THE_TEXT_COLOR_OF_WINDOW_TITLE: // 11
766 case CHANGE_THE_TEXT_COLOR_OF_CMDLINE: // 12
767 case CHANGE_THE_TEXT_COLOR_OF_CURRENT_DIR: // 13
768 case CHANGE_THE_TEXT_COLOR_OF_CUSTOM_PAGE_NAME: // 14
769 case CHANGE_THE_TEXT_COLOR_OF_ROOT_PRIVILEGES_CMDLINE: // 15
770 case CHANGE_THE_TEXT_COLOR_OF_NORMAL_TEXT: // 16
771 upgrade_dialog(ENABLE_GDKCOLOR_TO_STRING_VER);
772 goto FINISH;
773 break;
774 #endif
775 case CONFIRM_TO_CLOSE_MULTI_PAGES: // 3
776 if (g_list_length(window_list) > 1) create_entry_hbox = BOX_VERTICALITY;
777 create_dialog(_("Confirm to close multi tabs"),
778 "Confirm to close multi tabs",
779 DIALOG_OK_CANCEL,
780 page_data->window,
781 FALSE,
782 FALSE,
783 10,
784 GTK_RESPONSE_OK,
785 GTK_STOCK_DIALOG_QUESTION,
786 _("You are about to close multi tabs. Continue anyway?"),
787 FALSE,
788 0,
789 TRUE,
790 create_entry_hbox,
791 5,
792 dialog_data);
793 create_SIGKILL_and_EXIT_widget(dialog_data, FALSE, create_entry_hbox, _("those tabs"));
794
795 break;
796 case SET_KEY_BINDING: // 4
797 {
798 init_locale_restrict_data(win_data->runtime_LC_MESSAGES);
799 temp_str[0] = g_markup_escape_text(_("You may press <Ctrl + Alt + Shift + Win> + <any key> here\n"
800 "to get the key value used for the key binding."), -1);
801 create_dialog(_("Get the key value for function key"),
802 "Get the key value for function key",
803 DIALOG_OK_CANCEL,
804 page_data->window,
805 FALSE,
806 FALSE,
807 10,
808 GTK_RESPONSE_OK,
809 NULL,
810 temp_str[0],
811 FALSE,
812 0,
813 FALSE,
814 BOX_VERTICALITY,
815 5,
816 dialog_data);
817
818 dialog_data->current_key_index = -1;
819 // Copy the key values
820 for (i=0; i<KEYS; i++)
821 dialog_data->user_key_value[i] = g_strdup(win_data->user_keys[i].value);
822 // The Key Group frame
823 GtkTreeStore *store = gtk_tree_store_new (2, G_TYPE_STRING, G_TYPE_STRING);
824 GtkTreeIter key_group_tree_iter[KEY_GROUP], tmp_tree_iter;
825 gint key_index[KEYS]= {0};
826 for (i=0; i<KEY_GROUP; i++)
827 {
828 if (i==KEY_GROUP_NONE) continue;
829 gtk_tree_store_append (store, &(key_group_tree_iter[i]), NULL);
830 gtk_tree_store_set (store, &(key_group_tree_iter[i]), 0, key_groups[i], -1);
831 }
832 for (i=0; i<KEYS; i++)
833 {
834 if (system_keys[i].group==KEY_GROUP_NONE) continue;
835 gtk_tree_store_append (store, &tmp_tree_iter, &(key_group_tree_iter[system_keys[i].group]));
836 gtk_tree_store_set (store, &tmp_tree_iter,
837 0, system_keys[i].topic,
838 1, win_data->user_keys[i].value,
839 -1);
840 dialog_data->KeyTree[system_keys[i].group][key_index[system_keys[i].group]] = i;
841 // g_debug("Set KeyTree[%d][%d] = %d", system_keys[i].group,
842 // key_index[system_keys[i].group],
843 // i);
844 key_index[system_keys[i].group]++;
845 }
846
847 GtkTreeModel *model= GTK_TREE_MODEL(store);
848 dialog_data->treeview = gtk_tree_view_new_with_model (model);
849 gtk_tree_view_set_enable_search(GTK_TREE_VIEW (dialog_data->treeview), FALSE);
850
851 g_object_unref (model);
852 GtkCellRenderer *renderer = gtk_cell_renderer_text_new();
853 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (dialog_data->treeview), -1,
854 _("Function Key Name"), renderer,
855 "text", 0, NULL);
856
857 gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (dialog_data->treeview), -1,
858 _("Key Bindings"), renderer,
859 "text", 1, NULL);
860
861 GtkTreeSelection *tree_selection = gtk_tree_view_get_selection(GTK_TREE_VIEW (dialog_data->treeview));
862 g_signal_connect(G_OBJECT(tree_selection), "changed", G_CALLBACK(update_key_info), dialog_data);
863
864 // Add the combo box to frame
865 GtkWidget *hbox = gtk_hbox_new (FALSE, 0);
866 GtkWidget *label = gtk_label_new(_("Key Group: "));
867 gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
868 dialog_data->operate[0] = gtk_label_new(NULL);
869 set_markup_key_value(TRUE, NULL, "", dialog_data->operate[0]);
870 gtk_box_pack_start (GTK_BOX(hbox), dialog_data->operate[0], FALSE, FALSE, 0);
871
872 //// GtkWidget *vbox = create_frame_widget(dialog_data, NULL, hbox, combo, 0);
873 GtkWidget *vbox = create_frame_widget(dialog_data, NULL, hbox, dialog_data->treeview, 0);
874 hbox = gtk_hbox_new (FALSE, 0);
875 label = gtk_label_new(_("Note: "));
876 gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
877 dialog_data->operate[1] = gtk_label_new(NULL);
878 set_markup_key_value(TRUE, "dark green", "", dialog_data->operate[1]);
879 gtk_box_pack_start (GTK_BOX(hbox), dialog_data->operate[1], FALSE, FALSE, 0);
880 gtk_box_pack_end (GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
881
882 // The Key Value frame
883 dialog_data->operate[2] = gtk_label_new(NULL);
884 set_markup_key_value(TRUE, "blue", "", dialog_data->operate[2]);
885 gtk_label_set_selectable(GTK_LABEL(dialog_data->operate[2]), TRUE);
886 create_frame_widget(dialog_data, _("Key Value:"), NULL, dialog_data->operate[2], 0);
887
888 g_signal_connect(G_OBJECT(dialog_data->window), "key-press-event",
889 G_CALLBACK(deal_dialog_key_press), dialog_data);
890
891 dialog_data->operate[3] = create_button_with_image("", GTK_STOCK_CLOSE, FALSE,
892 (GSourceFunc)clear_key_group, dialog_data);
893 gtk_box_pack_end (GTK_BOX(dialog_data->box), dialog_data->operate[3], TRUE, TRUE, 0);
894 gtk_widget_set_no_show_all (dialog_data->operate[3], TRUE);
895
896 label = create_button_with_image(_("Disable all the function keys."),
897 GTK_STOCK_CLOSE, FALSE, (GSourceFunc)clear_key_group_all, dialog_data);
898 gtk_box_pack_end (GTK_BOX(dialog_data->box), label, TRUE, TRUE, 0);
899
900 // Trying to get correct size of dialog_data->treeview, then put it into a gtk_scrolled_window
901 gtk_widget_show_all (dialog_data->window);
902
903 GtkRequisition requisition;
904 gtk_widget_get_child_requisition (dialog_data->treeview, &requisition);
905
906 GtkWidget *scrolled_window = gtk_scrolled_window_new (NULL, NULL);
907 gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (scrolled_window),
908 GTK_SHADOW_ETCHED_IN);
909 gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scrolled_window),
910 GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
911 g_object_ref(dialog_data->treeview);
912 gtk_container_remove (GTK_CONTAINER(vbox), dialog_data->treeview);
913 gtk_box_pack_start (GTK_BOX(vbox), scrolled_window, FALSE, FALSE, 0);
914 gtk_container_add (GTK_CONTAINER (scrolled_window), dialog_data->treeview);
915 gtk_widget_set_size_request(scrolled_window,
916 requisition.width, requisition.height);
917 g_object_unref(dialog_data->treeview);
918
919 break;
920 }
921 case USAGE_MESSAGE: // 5
922 {
923 gchar *str[18] = {NULL};
924 gchar *temp_str;
925
926 // Create dialog
927 str[0] = g_strdup_printf(_("Usage for %s %s"),PACKAGE, VERSION);
928 str[1] = g_strdup_printf("Usage for %s %s",PACKAGE, VERSION);
929 create_dialog(str[0],
930 str[1],
931 DIALOG_OK,
932 page_data->window,
933 FALSE,
934 FALSE,
935 0,
936 GTK_RESPONSE_OK,
937 NULL,
938 NULL,
939 TRUE,
940 0,
941 FALSE,
942 BOX_VERTICALITY,
943 0,
944 dialog_data);
945 // Notebook
946 GtkWidget *notebook = gtk_notebook_new();
947 gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area(GTK_DIALOG(dialog_data->window))), notebook);
948 gtk_container_set_border_width (GTK_CONTAINER (notebook), 5);
949
950 // Usage
951 str[2] = get_help_message_usage(win_data->profile, TRUE);
952 temp_str =_("Don't forget to save your settings after making any change!");
953 str[3] = convert_text_to_html (&temp_str, FALSE, "darkred", "tt", "b", NULL);
954 str[4] = g_strdup_printf("%s\n\n%s", str[2], str[3]);
955 dialog_data->operate[0] = add_text_to_notebook(notebook, _("Usage"), GTK_STOCK_HELP, str[4]);
956
957 // Shortcut Keys
958 str[5] = get_help_message_key_binding(TRUE);
959 dialog_data->operate[1] = add_text_to_notebook(notebook, _("Key binding"), GTK_STOCK_PREFERENCES, str[5]);
960
961 // License
962 // TRANSLATE NOTE: The following license declaration is just a notice, not full license text.
963 // TRANSLATE NOTE: The full GPLv3 license text is included in LilyTerm source code.
964 // TRANSLATE NOTE: Of corse, Translating the GPLv3 license text won't be a good idea,
965 // TRANSLATE NOTE: But it seems be safe to translate the following license declaration.
966 // TRANSLATE NOTE: Please just skip and leave it alone if you don't wanna translate it.
967 str[6] = g_strdup_printf(_("Copyright (c) %s-%s %s. All rights reserved.\n\n"
968 "%s is free software: you can redistribute it and/or modify\n"
969 "it under the terms of the GNU General Public License as published by\n"
970 "the Free Software Foundation, either version 3 of the License, or\n"
971 "(at your option) any later version.\n\n"
972 "%s is distributed in the hope that it will be useful,\n"
973 "but WITHOUT ANY WARRANTY; without even the implied warranty of\n"
974 "MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n"
975 "GNU General Public License for more details.\n\n"
976 "You should have received a copy of the GNU General Public License\n"
977 "along with %s. If not, see <http://www.gnu.org/licenses/>."),
978 "2008", YEAR, AUTHOR, PACKAGE, PACKAGE, PACKAGE);
979 str[7] = convert_text_to_html(&str[6], FALSE, NULL, "tt", NULL);
980 dialog_data->operate[2] = add_text_to_notebook(notebook, _("License"), GTK_STOCK_DIALOG_AUTHENTICATION, str[7]);
981
982 // Translators
983 temp_str = "Adrian Buyssens: Flemish/Dutch translation.\n"
984 "Bogusz Kowalski: Polish translation.\n"
985 "GoGoNKT: Simplified Chinese translation.\n"
986 "Marco Paolome: Italian translation.\n"
987 "Mario Blättermann: German translation.\n"
988 "Niels Martignène: Franch translation.\n"
989 "P.L. Francisco: Spanish translation.\n"
990 "Rafael Ferreira: Portuguese translation.\n"
991 "Samed Beyribey: Turkish translation.\n"
992 "Slavko: Slovak translation.\n"
993 "Vladimir Smolyar: Russian and Ukrainian translations.";
994 str[8] = convert_text_to_html(&temp_str, FALSE, NULL, "tt", NULL);
995 dialog_data->operate[3] = add_text_to_notebook(notebook, _("Translators"), GTK_STOCK_CONVERT, str[8]);
996
997 // About
998 // TRANSLATE NOTE: Please be care of the spacing when translating the following site informatoins.
999 // TRANSLATE NOTE: Please check it in [Right Click Menu] -> [Usage] -> [About] page after translating.
1000 str[9] = g_strdup_printf (_("HomePage: %s"), MAINSITE);
1001 str[10] = g_strdup_printf (_("Github: %s"), GITHUBURL);
1002 str[11] = g_strdup_printf (_("Blog: %s"), BLOG);
1003 str[12] = g_strdup_printf (_("Wiki: %s"), WIKI);
1004 str[13] = g_strdup_printf (_("Issues: %s"), ISSUES);
1005 str[14] = g_strdup_printf (_("IRC: %s"), IRC);
1006 str[15] = g_strdup_printf (_("Thank you for using %s!"), PACKAGE);
1007 str[16] = g_strdup_printf ("%s <%s>\n\n%s\n%s\n"
1008 "%s\n%s\n\n%s",
1009 AUTHOR, BUGREPORT, str[9] ,str[10], str[13],
1010 str[14], str[15]);
1011 str[17] = convert_text_to_html(&str[16], FALSE, NULL, "tt", NULL);
1012 dialog_data->operate[4] = add_text_to_notebook(notebook, _("About"), GTK_STOCK_ABOUT, str[17]);
1013
1014 show_usage_text(notebook, NULL, 0, dialog_data);
1015 g_signal_connect(G_OBJECT(notebook), "switch-page", G_CALLBACK(show_usage_text), dialog_data);
1016
1017 for (i=0; i<18; i++) g_free(str[i]);
1018
1019 break;
1020 }
1021 case CONFIRM_TO_CLOSE_RUNNING_APPLICATION: // 7
1022 {
1023 // get the command line of running foreground program
1024 pid_t tpgid = get_tpgid(page_data->pid);
1025 temp_str[0] = get_cmdline(tpgid);
1026 temp_str[1] = g_strdup_printf("(%d) %s", tpgid, temp_str[0]);
1027 temp_str[2] = g_markup_escape_text(temp_str[1], -1);
1028 temp_str[3] = g_strdup_printf(_("There is still a running foreground program on #%d tab:"),
1029 page_data->page_no+1);
1030 temp_str[4] = g_strdup_printf(_("Terminate it by using `kill -9 %d' is recommend "
1031 "if it is non-response."), page_data->pid);
1032 temp_str[5] = g_strconcat(temp_str[3],
1033 "\n\n\t<b><span foreground=\"blue\">",
1034 temp_str[2],
1035 "</span></b>\n\n",
1036 _("Continue anyway?"),
1037 "\n\n<span foreground=\"darkred\">",
1038 _("Tip:"),
1039 " ",
1040 temp_str[4],
1041 "</span>",
1042 NULL);
1043
1044 if ((g_list_length(window_list) > 1) || (dialog_data->total_page>1))
1045 create_entry_hbox = BOX_VERTICALITY;
1046
1047 create_dialog(_("Confirm to close running foreground program"),
1048 "Confirm to close running foreground program",
1049 DIALOG_OK_CANCEL,
1050 page_data->window,
1051 FALSE,
1052 FALSE,
1053 10,
1054 GTK_RESPONSE_OK,
1055 GTK_STOCK_DIALOG_QUESTION,
1056 temp_str[5],
1057 TRUE,
1058 70,
1059 TRUE,
1060 create_entry_hbox,
1061 5,
1062 dialog_data);
1063
1064 create_SIGKILL_and_EXIT_widget(dialog_data, FALSE, create_entry_hbox, _("this tab"));
1065 break;
1066 }
1067 case CHANGE_THE_OPACITY_OF_WINDOW: // 8
1068 case CHANGE_THE_OPACITY_OF_WINDOW_WHEN_INACTIVE:
1069 {
1070 #ifdef ENABLE_RGBA
1071 gchar *translated_title = _("Change the opacity of window");
1072 gchar *title = "Change the opacity of window";
1073 gchar *text = _("Change the opacity of window:");
1074 gdouble window_opacity = win_data->window_opacity;
1075
1076 if (style==CHANGE_THE_OPACITY_OF_WINDOW)
1077 {
1078 dialog_data->original_transparent_window = win_data->transparent_window;
1079 win_data->transparent_window = TRUE;
1080 }
1081 else
1082 {
1083 translated_title = _("Change the opacity of window when inactive");
1084 title = "Change the opacity of window when inactive";
1085 text = _("Change the opacity of window when inactive:");
1086 window_opacity = win_data->window_opacity_inactive;
1087 dialog_data->original_transparent_window = win_data->transparent_window_inactive;
1088 win_data->transparent_window_inactive = TRUE;
1089 dialog_data->original_dim_window = win_data->dim_window;
1090 win_data->dim_window = TRUE;
1091 }
1092
1093 create_dialog(translated_title,
1094 title,
1095 DIALOG_OK_CANCEL,
1096 page_data->window,
1097 FALSE,
1098 TRUE,
1099 10,
1100 GTK_RESPONSE_OK,
1101 GTK_STOCK_DIALOG_INFO,
1102 text,
1103 FALSE,
1104 0,
1105 TRUE,
1106 BOX_VERTICALITY,
1107 0,
1108 dialog_data);
1109 create_scale_widget(dialog_data, 0, 1, 0.001,
1110 window_opacity,
1111 (GSourceFunc)set_window_opacity,
1112 win_data);
1113 dialog_data->original_window_opacity = window_opacity;
1114 // g_debug("window_opacity = %1.3f", window_opacity);
1115 set_window_opacity(NULL, 0, window_opacity, win_data);
1116 #else
1117 upgrade_dialog(ENABLE_RGBA_VER);
1118 goto FINISH;
1119 #endif
1120 break;
1121 }
1122 case ADJUST_THE_BRIGHTNESS_OF_ANSI_COLORS_USED_IN_TERMINAL: // 19
1123 case ADJUST_THE_BRIGHTNESS_OF_ANSI_COLORS_WHEN_INACTIVE: // 26
1124 {
1125 gchar *title[2] = {NULL};
1126 gdouble value = win_data->color_brightness;
1127 dialog_data->original_color_brightness = win_data->color_brightness;
1128 dialog_data->original_color_brightness_inactive = win_data->color_brightness_inactive;
1129 dialog_data->original_dim_text = win_data->dim_text;
1130
1131 if (style == ADJUST_THE_BRIGHTNESS_OF_ANSI_COLORS_USED_IN_TERMINAL)
1132 {
1133 title[0] = _("Adjust the brightness of ANSI colors used in terminal");
1134 title[1] = "Adjust the brightness of ANSI colors used in terminal";
1135 }
1136 else
1137 {
1138 title[0] = _("Adjust the brightness of ANSI colors when inactive");
1139 title[1] = "Adjust the brightness of ANSI colors when inactive";
1140 value = win_data->color_brightness_inactive;
1141 if (win_data->use_custom_theme)
1142 set_new_ansi_color(win_data->current_vte, dialog_data->ansi_colors,
1143 win_data->custom_color_theme[win_data->color_theme_index].color,
1144 value, win_data->invert_color, FALSE, win_data->cursor_color, TRUE);
1145 else
1146 set_new_ansi_color(win_data->current_vte, dialog_data->ansi_colors,
1147 system_color_theme[win_data->color_theme_index].color,
1148 value, win_data->invert_color, FALSE, win_data->cursor_color, TRUE);
1149 }
1150 create_dialog(title[0],
1151 title[1],
1152 DIALOG_OK_CANCEL,
1153 page_data->window,
1154 FALSE,
1155 TRUE,
1156 10,
1157 GTK_RESPONSE_OK,
1158 GTK_STOCK_DIALOG_INFO,
1159 title[0],
1160 FALSE,
1161 0,
1162 TRUE,
1163 BOX_VERTICALITY,
1164 0,
1165 dialog_data);
1166 // g_debug("value = %0.3f, win_data->color_brightness = %0.3f, win_data->color_brightness_inactive = %0.3f",
1167 // value, win_data->color_brightness, win_data->color_brightness_inactive);
1168 create_scale_widget(dialog_data, -1, 1, 0.001,
1169 value,
1170 (GSourceFunc)set_ansi_color,
1171 win_data->current_vte);
1172 init_dialog_ansi_colors_from_win_data(win_data, dialog_data);
1173 break;
1174 }
1175 case CONFIRM_TO_EXECUTE_COMMAND: // 22
1176 // g_debug("error_data.string = %s", error_data.string);
1177 // g_debug("error_data.encoding = %s", error_data.encoding);
1178 temp_str[0] = g_markup_escape_text(win_data->temp_data, -1);
1179 temp_str[1] = g_strconcat(PACKAGE,
1180 _(" is trying to execute the following command:"),
1181 "\n\n\t<b><span foreground=\"",
1182 "blue",
1183 "\">",
1184 temp_str[0],
1185 "</span></b>\n\n",
1186 _("Continue anyway?"),
1187 NULL);
1188
1189 create_dialog(_("Confirm to execute -e/-x/--execute command"),
1190 "Confirm to execute -e/-x/--execute command",
1191 DIALOG_OK_CANCEL,
1192 menu_active_window,
1193 TRUE,
1194 FALSE,
1195 10,
1196 GTK_RESPONSE_CANCEL,
1197 GTK_STOCK_DIALOG_WARNING,
1198 temp_str[1],
1199 FALSE,
1200 70,
1201 TRUE,
1202 BOX_NONE,
1203 0,
1204 dialog_data);
1205 break;
1206 case CONFIRM_TO_CLOSE_A_TAB_WITH_CHILD_PROCESS: // 23
1207 // get the command line of running foreground program
1208 temp_str[0] = g_strdup_printf(_("The following programs are still running under #%d tab:"),
1209 page_data->page_no+1);
1210 temp_str[1] = g_markup_escape_text(_("Using <Ctrl><D> or 'exit' to close tabs is recommended"),
1211 -1);
1212 temp_str[2] = g_markup_escape_text(win_data->temp_data, -1);
1213 temp_str[3] = g_strconcat(temp_str[0],
1214 "\n\n<b><span foreground=\"blue\">",
1215 temp_str[2],
1216 "</span></b>\n",
1217 _("Continue anyway?"),
1218 "\n\n<span foreground=\"darkred\">",
1219 _("Tip:"),
1220 " ",
1221 temp_str[1],
1222 "</span>",
1223 NULL);
1224
1225 create_dialog(_("Confirm to close a tab with child process"),
1226 "Confirm to close a tab with child process",
1227 DIALOG_OK_CANCEL,
1228 page_data->window,
1229 FALSE,
1230 FALSE,
1231 10,
1232 GTK_RESPONSE_CANCEL,
1233 GTK_STOCK_DIALOG_QUESTION,
1234 temp_str[3],
1235 TRUE,
1236 70,
1237 TRUE,
1238 BOX_VERTICALITY,
1239 5,
1240 dialog_data);
1241
1242 create_entry_hbox = ((g_list_length(window_list) > 1) || (dialog_data->total_page>1));
1243 create_SIGKILL_and_EXIT_widget(dialog_data, TRUE, create_entry_hbox, _("this tab"));
1244
1245 break;
1246 case CONFIRM_TO_CLOSE_A_WINDOW_WITH_CHILD_PROCESS: // 24
1247 temp_str[0] = g_markup_escape_text(win_data->temp_data, -1);
1248 temp_str[1] = g_strconcat(_("The following programs are still running under this window:"),
1249 "\n\n<b><span foreground=\"blue\">",
1250 temp_str[0],
1251 "</span></b>\n",
1252 _("Continue anyway?"),
1253 NULL);
1254 create_dialog(_("Confirm to close a window with child process"),
1255 "Confirm to close a window with child process",
1256 DIALOG_OK_CANCEL,
1257 page_data->window,
1258 FALSE,
1259 FALSE,
1260 10,
1261 GTK_RESPONSE_CANCEL,
1262 GTK_STOCK_DIALOG_QUESTION,
1263 temp_str[1],
1264 TRUE,
1265 70,
1266 TRUE,
1267 BOX_VERTICALITY,
1268 5,
1269 dialog_data);
1270 create_entry_hbox = (g_list_length(window_list) > 1);
1271 create_SIGKILL_and_EXIT_widget(dialog_data, TRUE, create_entry_hbox, _("those tabs"));
1272 break;
1273 case CONFIRM_TO_EXIT_WITH_CHILD_PROCESS: // 25
1274 temp_str[0] = g_strdup_printf(_("Confirm to close %s"), PACKAGE);
1275 temp_str[1] = g_strdup_printf("Confirm to close %s", PACKAGE);
1276 // get the command line of running foreground program
1277 temp_str[2] = g_strdup_printf(_("The following programs are still running under %s:"),
1278 PACKAGE);
1279 temp_str[3] = g_markup_escape_text(win_data->temp_data, -1);
1280 temp_str[4] = g_strconcat(temp_str[2] ,
1281 "\n\n<b><span foreground=\"blue\">",
1282 temp_str[3],
1283 "</span></b>\n",
1284 _("Continue anyway?"),
1285 NULL);
1286 create_dialog(temp_str[0],
1287 temp_str[1],
1288 DIALOG_OK_CANCEL,
1289 page_data->window,
1290 FALSE,
1291 FALSE,
1292 10,
1293 GTK_RESPONSE_CANCEL,
1294 GTK_STOCK_DIALOG_QUESTION,
1295 temp_str[4],
1296 TRUE,
1297 70,
1298 TRUE,
1299 BOX_VERTICALITY,
1300 5,
1301 dialog_data);
1302 create_SIGKILL_and_EXIT_widget(dialog_data, TRUE, TRUE, PACKAGE);
1303 break;
1304 case CONFIRM_TO_PASTE_TEXTS_TO_VTE_TERMINAL:
1305 temp_str[0] = g_strconcat(_("Trying to paste the following texts to the Vte Terminal:"),
1306 "\n\n",
1307 win_data->temp_data,
1308 "\n\n",
1309 _("Continue anyway?"),
1310 "\n",
1311 NULL);
1312 create_dialog(_("Confirm to paste texts to the Vte Terminal"),
1313 "Confirm to paste texts to the Vte Terminal",
1314 DIALOG_OK_CANCEL,
1315 page_data->window,
1316 FALSE,
1317 FALSE,
1318 10,
1319 GTK_RESPONSE_OK,
1320 GTK_STOCK_DIALOG_QUESTION,
1321 temp_str[0],
1322 FALSE,
1323 70,
1324 FALSE,
1325 BOX_NONE,
1326 0,
1327 dialog_data);
1328 // <Join and paste> Button
1329 GtkWidget *join_button = gtk_dialog_add_button (GTK_DIALOG(dialog_data->window),
1330 _("Join and paste"), GTK_RESPONSE_ACCEPT);
1331 gtk_button_set_image (GTK_BUTTON(join_button),
1332 gtk_image_new_from_stock(GTK_STOCK_PASTE, GTK_ICON_SIZE_BUTTON));
1333 gtk_button_box_set_child_secondary (GTK_BUTTON_BOX(gtk_dialog_get_action_area(GTK_DIALOG(dialog_data->window))),
1334 join_button, TRUE);
1335 break;
1336 case VIEW_THE_CLIPBOARD:
1337 create_dialog(_("Clipboard"),
1338 "Clipboard",
1339 DIALOG_OK,
1340 page_data->window,
1341 FALSE,
1342 FALSE,
1343 10,
1344 GTK_RESPONSE_OK,
1345 NULL,
1346 win_data->temp_data,
1347 FALSE,
1348 70,
1349 FALSE,
1350 BOX_NONE,
1351 0,
1352 dialog_data);
1353 break;
1354 default:
1355 #ifdef FATAL
1356 print_switch_out_of_range_error_dialog("dialog", "style", style);
1357 #endif
1358 goto FINISH;
1359 }
1360
1361 // We'll use gtk_dialog_run() to show the whole dialog
1362 // g_debug("Finish creating dialog!");
1363 gtk_widget_show_all (dialog_data->window);
1364
1365 // GtkRequisition requisition;
1366 // gtk_window_get_size(GTK_WINDOW(dialog_data->window),
1367 // &requisition.width, &requisition.height);
1368 // g_debug("! The final window size is %d x %d",
1369 // requisition.width, requisition.height);
1370
1371 // FIXME: Due to a bug in the GTK+2(?), we should set the ellipsize after the dialog is shown.
1372 // Or, the vertical size of title label may be cut, and some text may not shown.
1373 if ((dialog_data->title_label) && (gtk_label_get_max_width_chars(GTK_LABEL(dialog_data->title_label)) > 0))
1374 gtk_label_set_ellipsize(GTK_LABEL(dialog_data->title_label), PANGO_ELLIPSIZE_MIDDLE);
1375
1376 #ifdef UNIT_TEST
1377 for (dialog_response=GTK_RESPONSE_HELP; dialog_response<=GTK_RESPONSE_NONE; dialog_response++)
1378 {
1379 #else
1380 dialog_response = gtk_dialog_run(GTK_DIALOG(dialog_data->window));
1381 #endif
1382 switch (dialog_response)
1383 {
1384 case GTK_RESPONSE_OK:
1385 {
1386 switch (style)
1387 {
1388 // style 1: change the tab's name
1389 case EDIT_LABEL:
1390 // g_debug("Got label name: %s",gtk_entry_get_text(GTK_ENTRY(entry)));
1391 g_free(page_data->custom_page_name);
1392
1393 const gchar *text = gtk_entry_get_text(GTK_ENTRY(dialog_data->operate[0]));
1394 #ifdef SAFEMODE
1395 if ((text) && (text[0]!='\0'))
1396 #else
1397 if (text[0]!='\0')
1398 #endif
1399 // store page_data->page_name
1400 page_data->custom_page_name = g_strdup(text);
1401 else
1402 page_data->custom_page_name = NULL;
1403
1404 // g_debug("Get the page name = %s, color = %s",
1405 // page_data->custom_page_name, page_data->tab_color);
1406 if (page_data->page_update_method == PAGE_METHOD_WINDOW_TITLE)
1407 page_data->window_title_updated = 1;
1408 get_and_update_page_name(page_data, FALSE);
1409
1410 break;
1411 case ADD_NEW_LOCALES:
1412 {
1413 const gchar *text = gtk_entry_get_text(GTK_ENTRY(dialog_data->operate[0]));
1414 g_free(win_data->default_locale);
1415 win_data->default_locale = g_strdup(text);
1416
1417 text = gtk_entry_get_text(GTK_ENTRY(dialog_data->operate[1]));
1418 g_free(win_data->locales_list);
1419 win_data->locales_list = g_strdup(text);
1420
1421 gtk_widget_destroy(dialog_data->window);
1422 dialog_data->window = NULL;
1423
1424 refresh_locale_and_encoding_list(win_data);
1425 break;
1426 }
1427 // style 2: change the saturation of background
1428 case CHANGE_BACKGROUND_SATURATION:
1429 // style 9: change the foreground color
1430 case CHANGE_THE_FOREGROUND_COLOR:
1431 // style 10: change the background color
1432 case CHANGE_THE_BACKGROUND_COLOR:
1433 // style 9: change the cursor color
1434 case CHANGE_THE_CURSOR_COLOR:
1435 // style 11: change the text color of window title
1436 case CHANGE_THE_TEXT_COLOR_OF_WINDOW_TITLE:
1437 // style 12: change the text color of cmdline
1438 case CHANGE_THE_TEXT_COLOR_OF_CMDLINE:
1439 // style 13: change the text color of current dir
1440 case CHANGE_THE_TEXT_COLOR_OF_CURRENT_DIR:
1441 // style 14: change the text color of custom page name
1442 case CHANGE_THE_TEXT_COLOR_OF_CUSTOM_PAGE_NAME:
1443 // style 15: change the text color of root privileges cmdline
1444 case CHANGE_THE_TEXT_COLOR_OF_ROOT_PRIVILEGES_CMDLINE:
1445 // style 16: change the text color of normal text
1446 case CHANGE_THE_TEXT_COLOR_OF_NORMAL_TEXT:
1447 {
1448 // g_debug("Setting the colors. Type = %d", style);
1449 switch (style)
1450 {
1451 case CHANGE_BACKGROUND_SATURATION:
1452 win_data->background_saturation = gtk_range_get_value(GTK_RANGE(dialog_data->operate[0])) + 0.0005;
1453 break;
1454 #ifdef ENABLE_GDKCOLOR_TO_STRING
1455 case CHANGE_THE_FOREGROUND_COLOR:
1456 if (win_data->use_custom_theme == FALSE) clear_custom_colors_data(win_data, TRUE);
1457 update_fg_bg_color(win_data, dialog_data->original_color, TRUE);
1458 break;
1459 case CHANGE_THE_BACKGROUND_COLOR:
1460 if (win_data->use_custom_theme == FALSE) clear_custom_colors_data(win_data, FALSE);
1461 update_fg_bg_color(win_data, dialog_data->original_color, FALSE);
1462 break;
1463 case CHANGE_THE_CURSOR_COLOR:
1464 win_data->cursor_color = dialog_data->original_color;
1465 break;
1466 case CHANGE_THE_TEXT_COLOR_OF_WINDOW_TITLE:
1467 case CHANGE_THE_TEXT_COLOR_OF_CMDLINE:
1468 case CHANGE_THE_TEXT_COLOR_OF_CURRENT_DIR:
1469 case CHANGE_THE_TEXT_COLOR_OF_CUSTOM_PAGE_NAME:
1470 case CHANGE_THE_TEXT_COLOR_OF_ROOT_PRIVILEGES_CMDLINE:
1471 case CHANGE_THE_TEXT_COLOR_OF_NORMAL_TEXT:
1472 {
1473 gint page_color_type = style - CHANGE_THE_TEXT_COLOR_OF_WINDOW_TITLE;
1474 gchar *new_color = gdk_color_to_string(&(dialog_data->original_color));
1475
1476 struct Page *tmp_page_data = NULL;
1477 for (i=0; i<gtk_notebook_get_n_pages(GTK_NOTEBOOK(win_data->notebook)); i++)
1478 {
1479 tmp_page_data = get_page_data_from_nth_page(win_data, i);
1480 #ifdef SAFEMODE
1481 if (tmp_page_data==NULL) goto DESTROY_WINDOW;
1482 #endif
1483 if (page_data->tab_color == win_data->user_page_color[page_color_type])
1484 page_data->tab_color = new_color;
1485 }
1486
1487 g_free(win_data->user_page_color[page_color_type]);
1488 win_data->user_page_color[page_color_type] = new_color;
1489 break;
1490 }
1491 #endif
1492 }
1493 if (style>=CHANGE_THE_TEXT_COLOR_OF_WINDOW_TITLE &&
1494 style<=CHANGE_THE_TEXT_COLOR_OF_NORMAL_TEXT)
1495 // recover the color of pages
1496 recover_page_colors(dialog_data->window, page_data->window, page_data->notebook);
1497 else
1498 {
1499 struct Page *tmp_page_data = NULL;
1500 // change the saturation of background and foreground/background color
1501 for (i=0; i<gtk_notebook_get_n_pages(GTK_NOTEBOOK(win_data->notebook)); i++)
1502 {
1503 tmp_page_data = get_page_data_from_nth_page(win_data, i);
1504 #ifdef SAFEMODE
1505 if (tmp_page_data==NULL) goto DESTROY_WINDOW;
1506 #endif
1507 switch (style)
1508 {
1509 case CHANGE_BACKGROUND_SATURATION:
1510 set_background_saturation (NULL, 0,
1511 win_data->background_saturation,
1512 tmp_page_data->vte);
1513 break;
1514 case CHANGE_THE_FOREGROUND_COLOR:
1515 case CHANGE_THE_BACKGROUND_COLOR:
1516 case CHANGE_THE_CURSOR_COLOR:
1517 adjust_vte_color(GTK_COLOR_SELECTION(dialog_data->operate[0]),
1518 tmp_page_data->vte);
1519 break;
1520 }
1521 }
1522 }
1523 break;
1524 }
1525 // style 3: confirm to close multi pages
1526 case CONFIRM_TO_CLOSE_MULTI_PAGES:
1527 {
1528 // we need to destroy the dialog before confirm a working vte.
1529 if ((create_entry_hbox) && gtk_toggle_button_get_active(
1530 GTK_TOGGLE_BUTTON(dialog_data->operate[0])))
1531 {
1532 // g_debug ("CONFIRM_TO_CLOSE_MULTI_PAGES: call gtk_main_quit()");
1533 quit_gtk();
1534 force_to_quit = TRUE;
1535 // g_debug("Set force_to_quit to %d", force_to_quit);
1536 }
1537
1538 gtk_widget_destroy(dialog_data->window);
1539 dialog_data->window = NULL;
1540 close_multi_tabs(win_data, FALSE);
1541
1542 break;
1543 }
1544 // style 4: get function key value
1545 case SET_KEY_BINDING:
1546 {
1547 for (i=0; i<KEYS; i++)
1548 convert_string_to_user_key(i, dialog_data->user_key_value[i], win_data);
1549 break;
1550 }
1551 // style 23: confirm to close a tab with child process
1552 case CONFIRM_TO_CLOSE_A_TAB_WITH_CHILD_PROCESS:
1553 // style 24: confirm to close a window with child process
1554 case CONFIRM_TO_CLOSE_A_WINDOW_WITH_CHILD_PROCESS:
1555 // style 25: confirm to close LilyTerm with child process
1556 case CONFIRM_TO_EXIT_WITH_CHILD_PROCESS:
1557 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog_data->operate[1])))
1558 using_kill = TRUE;
1559 if ((style==CONFIRM_TO_CLOSE_A_WINDOW_WITH_CHILD_PROCESS) ||
1560 (style==CONFIRM_TO_EXIT_WITH_CHILD_PROCESS))
1561 force_to_quit = TRUE;
1562 // style 7: confirm to close running application
1563 case CONFIRM_TO_CLOSE_RUNNING_APPLICATION:
1564 if ((create_entry_hbox) && (gtk_toggle_button_get_active(
1565 GTK_TOGGLE_BUTTON(dialog_data->operate[0]))))
1566 {
1567 // g_debug ("CONFIRM_TO_CLOSE_RUNNING_APPLICATION(): call gtk_main_quit()");
1568 quit_gtk();
1569 force_to_quit = TRUE;
1570 }
1571 break;
1572 #ifdef ENABLE_RGBA
1573 // style 8: change the opacity of window
1574 case CHANGE_THE_OPACITY_OF_WINDOW:
1575 win_data->window_opacity =
1576 gtk_range_get_value(GTK_RANGE(dialog_data->operate[0]))+0.0005;
1577 break;
1578 case CHANGE_THE_OPACITY_OF_WINDOW_WHEN_INACTIVE:
1579 win_data->window_opacity_inactive =
1580 gtk_range_get_value(GTK_RANGE(dialog_data->operate[0]))+0.0005;
1581 set_window_opacity( NULL, 0, win_data->window_opacity, win_data);
1582 win_data->dim_window = TRUE;
1583 break;
1584 // style 19: Adjust the brightness of ANSI colors used in terminal
1585 case CHANGE_THE_ANSI_COLORS:
1586 case ADJUST_THE_BRIGHTNESS_OF_ANSI_COLORS_USED_IN_TERMINAL:
1587 {
1588 if (style==CHANGE_THE_ANSI_COLORS)
1589 {
1590 // g_debug("win_data->color_brightness = %0.3f, win_data->color_brightness_inactive = %0.3f",
1591 // win_data->color_brightness, win_data->color_brightness_inactive);
1592 gint i;
1593 for (i=0; i<COLOR; i++)
1594 {
1595 gint j;
1596 if (compare_color(&(system_color_theme[win_data->color_theme_index].color[i]),
1597 &(dialog_data->ansi_colors_orig[i])))
1598 {
1599 // print_color(i, "Color had been changed", dialog_data->ansi_colors_orig[i]);
1600
1601 for (j=0; j<THEME; j++)
1602 win_data->custom_color_theme[j].color[i] = dialog_data->ansi_colors_orig[i];
1603
1604 win_data->have_custom_color = TRUE;
1605 win_data->use_custom_theme = TRUE;
1606 }
1607 else
1608 {
1609 // restore to the system color theme
1610 for (j=0; j<THEME; j++)
1611 win_data->custom_color_theme[j].color[i] = system_color_theme[j].color[i];
1612 }
1613 }
1614
1615 // g_debug("dialog_data->original_have_custom_color = %d, win_data->have_custom_color = %d,"
1616 // " dialog_data->original_use_custom_theme = %d, win_data->use_custom_theme = %d",
1617 // dialog_data->original_have_custom_color, win_data->have_custom_color,
1618 // dialog_data->original_use_custom_theme, win_data->use_custom_theme);
1619 if ((dialog_data->original_have_custom_color != win_data->have_custom_color) ||
1620 (dialog_data->original_use_custom_theme != win_data->use_custom_theme))
1621 recreate_theme_menu_items(win_data);
1622 }
1623
1624 generate_all_color_datas(win_data);
1625
1626 struct Page *page_data;
1627 gboolean default_vte_color = use_default_vte_theme(win_data);
1628 for (i=0; i<gtk_notebook_get_n_pages(GTK_NOTEBOOK(win_data->notebook)); i++)
1629 {
1630 page_data = get_page_data_from_nth_page(win_data, i);
1631 #ifdef SAFEMODE
1632 if (page_data==NULL) goto DESTROY_WINDOW;
1633 #endif
1634 set_vte_color(page_data->vte, default_vte_color, win_data->cursor_color, win_data->color, FALSE);
1635 }
1636 // g_debug("win_data->color_brightness = %0.3f, win_data->color_brightness_inactive = %0.3f",
1637 // win_data->color_brightness, win_data->color_brightness_inactive);
1638 break;
1639 }
1640 case ADJUST_THE_BRIGHTNESS_OF_ANSI_COLORS_WHEN_INACTIVE:
1641 win_data->color_brightness_inactive = win_data->color_brightness;
1642 win_data->color_brightness = dialog_data->original_color_brightness;
1643 // g_debug("win_data->color_brightness = %0.3f, win_data->color_brightness_inactive = %0.3f",
1644 // win_data->color_brightness, win_data->color_brightness_inactive);
1645 win_data->dim_text = TRUE;
1646 generate_all_color_datas(win_data);
1647 set_vte_color(win_data->current_vte, use_default_vte_theme(win_data),
1648 win_data->cursor_color, win_data->color, FALSE);
1649 break;
1650 #endif
1651 }
1652 break;
1653 }
1654 case GTK_RESPONSE_ACCEPT:
1655 break;
1656 default:
1657 {
1658 switch (style)
1659 {
1660 // FIXME: vte_terminal_search_set_gregex(VTE_TERMINAL(win_data->current_vte), NULL) don't work.
1661 // case FIND_STRING:
1662 // vte_terminal_search_set_gregex(VTE_TERMINAL(win_data->current_vte), NULL);
1663 // vte_terminal_search_find_previous(VTE_TERMINAL(win_data->current_vte));
1664 // break;
1665 // style 2: change the saturation of background
1666 case CHANGE_BACKGROUND_SATURATION:
1667 // style 9: change the foreground color
1668 case CHANGE_THE_FOREGROUND_COLOR:
1669 // style 10: change the background color
1670 case CHANGE_THE_BACKGROUND_COLOR:
1671 // style 9: change the cursor color
1672 case CHANGE_THE_CURSOR_COLOR:
1673 if (style==CHANGE_BACKGROUND_SATURATION)
1674 {
1675 win_data->transparent_background = dialog_data->original_transparent_background;
1676 // g_debug("transparent_background = %d", transparent_background);
1677 set_background_saturation(NULL,
1678 0,
1679 win_data->background_saturation,
1680 win_data->current_vte);
1681 }
1682 switch (style)
1683 {
1684 case CHANGE_THE_FOREGROUND_COLOR:
1685 case CHANGE_THE_BACKGROUND_COLOR:
1686 case CHANGE_THE_CURSOR_COLOR:
1687 dialog_data->original_color = dialog_data->original_color;
1688 break;
1689 }
1690
1691 if (style!=CHANGE_BACKGROUND_SATURATION)
1692 {
1693 dialog_data->recover = TRUE;
1694 adjust_vte_color(GTK_COLOR_SELECTION(dialog_data->operate[0]),
1695 win_data->current_vte);
1696 }
1697 break;
1698 // style 4: get function key value
1699 case SET_KEY_BINDING:
1700 {
1701 for (i=0; i<KEYS; i++)
1702 g_free(dialog_data->user_key_value[i]);
1703 break;
1704 }
1705
1706 #ifdef ENABLE_RGBA
1707 // style 8: change the opacity of window
1708 case CHANGE_THE_OPACITY_OF_WINDOW:
1709 win_data->transparent_window = dialog_data->original_transparent_window;
1710 win_data->window_opacity = dialog_data->original_window_opacity;
1711 dim_window(win_data, 2);
1712 break;
1713 case CHANGE_THE_OPACITY_OF_WINDOW_WHEN_INACTIVE:
1714 win_data->window_is_inactivated = TRUE;
1715 dim_window(win_data, 2);
1716 win_data->transparent_window_inactive = dialog_data->original_transparent_window;
1717 win_data->window_opacity_inactive = dialog_data->original_window_opacity;
1718 win_data->dim_window = dialog_data->original_dim_window;
1719 break;
1720 #endif
1721 // style 11: change the text color of window title
1722 case CHANGE_THE_TEXT_COLOR_OF_WINDOW_TITLE:
1723 // style 12: change the text color of cmdline
1724 case CHANGE_THE_TEXT_COLOR_OF_CMDLINE:
1725 // style 13: change the text color of current dir
1726 case CHANGE_THE_TEXT_COLOR_OF_CURRENT_DIR:
1727 // style 14: change the text color of custom page name
1728 case CHANGE_THE_TEXT_COLOR_OF_CUSTOM_PAGE_NAME:
1729 // style 15: change the text color of root privileges cmdline
1730 case CHANGE_THE_TEXT_COLOR_OF_ROOT_PRIVILEGES_CMDLINE:
1731 // style 16: change the text color of normal text
1732 case CHANGE_THE_TEXT_COLOR_OF_NORMAL_TEXT:
1733 recover_page_colors(dialog_data->window, page_data->window, page_data->notebook);
1734 break;
1735 case CHANGE_THE_ANSI_COLORS:
1736 case ADJUST_THE_BRIGHTNESS_OF_ANSI_COLORS_USED_IN_TERMINAL:
1737 case ADJUST_THE_BRIGHTNESS_OF_ANSI_COLORS_WHEN_INACTIVE:
1738 if (style==CHANGE_THE_ANSI_COLORS)
1739 win_data->invert_color = dialog_data->original_invert_color;
1740
1741 // g_debug("dialog_data->original_color_brightness = %0.3f", dialog_data->original_color_brightness);
1742 win_data->color_brightness = dialog_data->original_color_brightness;
1743 win_data->color_brightness_inactive = dialog_data->original_color_brightness_inactive;
1744 win_data->dim_text = dialog_data->original_dim_text;
1745 // g_debug("win_data->color_brightness = %0.3f, win_data->color_brightness_inactive = %0.3f",
1746 // win_data->color_brightness, win_data->color_brightness_inactive);
1747
1748 // recover the color of current vte
1749 if (win_data->use_custom_theme)
1750 set_new_ansi_color(win_data->current_vte, dialog_data->ansi_colors,
1751 win_data->custom_color_theme[win_data->color_theme_index].color,
1752 win_data->color_brightness, win_data->invert_color,
1753 use_default_vte_theme(win_data), win_data->cursor_color, FALSE);
1754 else
1755 set_new_ansi_color(win_data->current_vte, dialog_data->ansi_colors,
1756 system_color_theme[win_data->color_theme_index].color,
1757 win_data->color_brightness, win_data->invert_color,
1758 use_default_vte_theme(win_data), win_data->cursor_color, FALSE);
1759 break;
1760 }
1761 break;
1762 }
1763 }
1764 #ifdef UNIT_TEST
1765 }
1766 #endif
1767 #ifdef SAFEMODE
1768 DESTROY_WINDOW:
1769 #endif
1770 // destroy dialog.
1771 // g_debug("dialog_data->window = %p", dialog_data->window);
1772 if ((dialog_response != GTK_RESPONSE_NONE) && (dialog_data->window))
1773 gtk_widget_destroy(dialog_data->window);
1774
1775 if ((style >= CHANGE_THE_TEXT_COLOR_OF_WINDOW_TITLE) && (style <= CHANGE_THE_TEXT_COLOR_OF_NORMAL_TEXT))
1776 {
1777 // g_debug("tabs_bar_is_shown = %d", tabs_bar_is_shown);
1778 if (tabs_bar_is_shown != gtk_notebook_get_show_tabs GTK_NOTEBOOK(win_data->notebook))
1779 hide_and_show_tabs_bar(win_data, OFF);
1780 }
1781
1782 if (style==PASTE_GRABBED_KEY_TO_EVERY_VTE_TERMINAL)
1783 // for PASTE_GRABBED_KEY_TO_EVERY_VTE_TERMINAL Only...
1784 win_data->enable_key_binding = enable_key_binding;
1785
1786 FINISH:
1787 dialog_activated--;
1788 // g_debug("Set dialog_activated = %d, gtk_widget_get_mapped(win_data->window) = %d", dialog_activated, gtk_widget_get_mapped(win_data->window));
1789 g_free(dialog_data);
1790 for (i=0; i<TEMPSTR; i++) g_free(temp_str[i]);
1791
1792 if (window_list == NULL && (dialog_activated==0))
1793 {
1794 quit_gtk();
1795 #ifdef DETAIL
1796 g_debug("+ lilyterm had been close normally!");
1797 #endif
1798 }
1799
1800 return dialog_response;
1801 }
1802
1803
init_dialog_ansi_colors_from_win_data(struct Window * win_data,struct Dialog * dialog_data)1804 void init_dialog_ansi_colors_from_win_data(struct Window *win_data, struct Dialog *dialog_data)
1805 {
1806 #ifdef DETAIL
1807 g_debug("! Launch init_dialog_ansi_colors_from_win_data() with win_data = %p, dialog_data = %p", win_data, dialog_data);
1808 #endif
1809 #ifdef SAFEMODE
1810 if ((win_data==NULL) || (dialog_data==NULL)) return;
1811 #endif
1812 gint i;
1813 for (i=COLOR-1; i>=0; i--)
1814 {
1815 if (win_data->use_custom_theme)
1816 dialog_data->ansi_colors_orig[i] = win_data->custom_color_theme[win_data->color_theme_index].color[i];
1817 else
1818 dialog_data->ansi_colors_orig[i] = system_color_theme[win_data->color_theme_index].color[i];
1819 }
1820 // print_color(i, "dialog_data->ansi_colors", dialog_data->ansi_colors_orig[i]);
1821 }
1822
dialog_invert_color_theme(GtkWidget * menuitem,struct Window * win_data)1823 void dialog_invert_color_theme(GtkWidget *menuitem, struct Window *win_data)
1824 {
1825 #ifdef DETAIL
1826 g_debug("! Launch dialog_invert_color_theme() with menuitem = %p", menuitem);
1827 #endif
1828 #ifdef SAFEMODE
1829 if ((menuitem==NULL) || (win_data==NULL)) return;
1830 #endif
1831 struct Dialog *dialog_data = (struct Dialog *)g_object_get_data(G_OBJECT(menu_active_window), "Dialog");
1832 #ifdef SAFEMODE
1833 if (dialog_data==NULL) return;
1834 #endif
1835 // g_debug("dialog_invert_color_theme(): (before) win_data->temp_index = %d, win_data->invert_color = %d",
1836 // win_data->temp_index, win_data->invert_color);
1837
1838 // win_data->temp_index will point to the color index in color_orig
1839
1840 // invert the color of current vte
1841 win_data->invert_color = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(menuitem));
1842 win_data->temp_index = get_color_index(TRUE, win_data->temp_index);
1843 // g_debug("dialog_invert_color_theme(): (after) win_data->temp_index = %d, win_data->invert_color = %d",
1844 // win_data->temp_index, win_data->invert_color);
1845 win_data->color_brightness = - win_data->color_brightness;
1846 win_data->color_brightness_inactive = -win_data->color_brightness_inactive;
1847 // g_debug("dialog_invert_color_theme(): win_data->color_brightness = %0.3f, win_data->color_brightness_inactive = %0.3f",
1848 // win_data->color_brightness, win_data->color_brightness_inactive);
1849
1850 set_new_ansi_color(win_data->current_vte, dialog_data->ansi_colors, dialog_data->ansi_colors_orig,
1851 win_data->color_brightness, win_data->invert_color, FALSE, win_data->cursor_color, FALSE);
1852
1853 // invert the brightness
1854 gtk_range_set_value(GTK_RANGE(dialog_data->operate[1]), win_data->color_brightness);
1855
1856 // update the color selection info
1857 // g_debug("dialog_invert_color_theme(): call update_ansi_color_info() with win_data->temp_index to %d", win_data->temp_index);
1858 gint converted_index = get_color_index(win_data->invert_color, win_data->temp_index);
1859 update_ansi_color_info(NULL, converted_index);
1860
1861 // update the color buttons
1862 update_color_buttons(win_data, dialog_data);
1863
1864 // set focus color button
1865 gtk_window_set_focus(GTK_WINDOW(dialog_data->window), dialog_data->color_button[converted_index]);
1866 }
1867
update_color_buttons(struct Window * win_data,struct Dialog * dialog_data)1868 void update_color_buttons(struct Window *win_data, struct Dialog *dialog_data)
1869 {
1870 #ifdef DETAIL
1871 g_debug("! Launch update_color_buttons() with win_data = %p, dialog_data = %p", win_data, dialog_data);
1872 #endif
1873 #ifdef SAFEMODE
1874 if ((win_data==NULL) || (dialog_data==NULL)) return;
1875 #endif
1876 // Get the default size of GTK_ICON_SIZE_MENU
1877 gint width = 16, height = 16;
1878 GtkSettings *settings = gtk_settings_get_default();
1879 if (settings) gtk_icon_size_lookup_for_settings (settings, GTK_ICON_SIZE_MENU, &width, &height);
1880
1881 // Get the color theme
1882 GdkColor* temp_color;
1883 if (win_data->use_custom_theme)
1884 temp_color = win_data->custom_color_theme[win_data->color_theme_index].color;
1885 else
1886 temp_color = system_color_theme[win_data->color_theme_index].color;
1887
1888 gint i, color_index;
1889 for (i=COLOR-1; i>=0; i--)
1890 {
1891 color_index = get_color_index(win_data->invert_color, i);
1892 GdkPixbuf *pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, width, height);
1893 gdk_pixbuf_fill (pixbuf,
1894 (guint32) (temp_color[color_index].red >> 8) << 24 |
1895 (temp_color[color_index].green >> 8) << 16 |
1896 (temp_color[color_index].blue >> 8) << 8);
1897
1898 GtkWidget *image = gtk_image_new_from_pixbuf (pixbuf);
1899 #ifdef SAFEMODE
1900 if (dialog_data->color_button[i])
1901 #endif
1902 gtk_button_set_image(GTK_BUTTON(dialog_data->color_button[i]), image);
1903 #ifdef DEBUG
1904 gchar *color_string = gdk_color_to_string(&(temp_color[color_index]));
1905 gchar *temp_str = g_strdup_printf("%s [%d] - %s", color[i].translation, color_index, color_string);
1906 #ifdef SAFEMODE
1907 if (dialog_data->color_button[i])
1908 #endif
1909 gtk_widget_set_tooltip_text(dialog_data->color_button[i], temp_str);
1910 g_free(temp_str);
1911 g_free(color_string);
1912 #else
1913 gtk_widget_set_tooltip_text(dialog_data->color_button[i], color[i].translation);
1914 #endif
1915 g_object_unref (pixbuf);
1916 }
1917 }
1918
get_color_index(gboolean invert_color,gint index)1919 gint get_color_index(gboolean invert_color, gint index)
1920 {
1921 #ifdef DETAIL
1922 g_debug("! Launch get_color_index() with invert_color = %d, index = %d", invert_color, index);
1923 #endif
1924 if ((index < 0) || (invert_color == FALSE)) return index;
1925
1926 switch (index)
1927 {
1928 case 0:
1929 return COLOR-1;
1930 case (COLOR/2)-1:
1931 return COLOR/2;
1932 case (COLOR/2):
1933 return COLOR/2-1;
1934 case COLOR-1:
1935 return 0;
1936 break;
1937 default:
1938 return (index + 8) % 16;
1939 }
1940 }
1941
clear_custom_colors_data(struct Window * win_data,gboolean update_fg)1942 void clear_custom_colors_data(struct Window *win_data, gboolean update_fg)
1943 {
1944 #ifdef DETAIL
1945 g_debug("! Launch clear_custom_colors_data() with win_data = %p, update_fg = %d", win_data, update_fg);
1946 #endif
1947 #ifdef SAFEMODE
1948 if (win_data==NULL) return;
1949 #endif
1950 gint i, j;
1951
1952 for (i=0; i<THEME; i++)
1953 for (j=0; j<COLOR; j++)
1954 win_data->custom_color_theme[i].color[j] = system_color_theme[i].color[j];
1955 }
1956
update_fg_bg_color(struct Window * win_data,GdkColor color,gboolean update_fg)1957 void update_fg_bg_color(struct Window *win_data, GdkColor color, gboolean update_fg)
1958 {
1959 #ifdef DETAIL
1960 g_debug("! Launch update_fg_bg_color() with win_data = %p, update_fg = %d", win_data, update_fg);
1961 #endif
1962 #ifdef SAFEMODE
1963 if (win_data==NULL) return;
1964 #endif
1965 gint color_index = 0;
1966 if (update_fg)
1967 {
1968 win_data->color[COLOR-1] = color;
1969 if (win_data->color_brightness > -1)
1970 adjust_ansi_color(&(win_data->color_inactive[COLOR-1]),
1971 &(win_data->color[COLOR-1]),
1972 win_data->color_brightness_inactive / (1 + win_data->color_brightness));
1973 color_index = COLOR-1;
1974 }
1975 else
1976 {
1977 win_data->color[0] = color;
1978 // FIXME: GtkColorSelection have no ALPHA-CHANGED signal.
1979 // so that the following code should be
1980 // marked for temporary.
1981 // background_saturation =
1982 // gtk_color_selection_get_current_alpha(
1983 // GTK_COLOR_SELECTION(adjustment))/65535;
1984 }
1985
1986 gint i, index = get_color_index(win_data->invert_color, color_index);
1987 // g_debug("update_fg_bg_color(): index = %d, win_data->invert_color = %d", index, win_data->invert_color);
1988 for (i=0; i<THEME; i++)
1989 {
1990 win_data->custom_color_theme[i].color[index] = color;
1991
1992 // gchar *temp_str = g_strdup_printf("%d (%02d): fg_color", i, index);
1993 // print_color (temp_str, win_data->custom_color_theme[i].color[index]);
1994 // g_free(temp_str);
1995 // temp_str = g_strdup_printf("%d (%02d): bg_color", i, get_color_index(win_data->invert_color, index));
1996 // print_color (temp_str, win_data->custom_color_theme[i].color[get_color_index(win_data->invert_color, index)]);
1997 // g_free(temp_str);
1998 }
1999
2000 win_data->have_custom_color = TRUE;
2001 if (win_data->use_custom_theme == FALSE)
2002 {
2003 win_data->use_custom_theme = TRUE;
2004 recreate_theme_menu_items(win_data);
2005 }
2006 }
2007
2008 // the win_data->temp_index will updated to get_color_index()!!
2009 // the color_index here is the serial no of button!!
update_ansi_color_info(GtkWidget * button,gint color_index)2010 void update_ansi_color_info(GtkWidget *button, gint color_index)
2011 {
2012 #ifdef DETAIL
2013 g_debug("! Launch update_ansi_color_info() with button = %p, color_index = %d", button, color_index);
2014 #endif
2015 #ifdef SAFEMODE
2016 if (menu_active_window==NULL) return;
2017 #endif
2018 struct Window *win_data = (struct Window *)g_object_get_data(G_OBJECT(menu_active_window), "Win_Data");
2019 #ifdef SAFEMODE
2020 if ((win_data==NULL) || (win_data->current_vte==NULL)) return;
2021 #endif
2022 struct Dialog *dialog_data = (struct Dialog *)g_object_get_data(G_OBJECT(menu_active_window), "Dialog");
2023 #ifdef SAFEMODE
2024 if (dialog_data==NULL) return;
2025 #endif
2026 gint convert_index = get_color_index(win_data->invert_color, color_index);
2027 gchar *tmp_topic = g_strdup_printf(_("Change the ansi color [%s] in terminal"), color[convert_index].translation);
2028 gtk_window_set_title(GTK_WINDOW(dialog_data->window), tmp_topic);
2029 g_free(tmp_topic);
2030
2031 // avoid to call adjust_vte_color()
2032 // g_debug("update_ansi_color_info(): set win_data->temp_index to -1");
2033 win_data->temp_index = -1;
2034 #ifdef SAFEMODE
2035 if (dialog_data->operate[0]==NULL) return;
2036 #endif
2037 gtk_color_selection_set_previous_color (GTK_COLOR_SELECTION(dialog_data->operate[0]), &(dialog_data->ansi_colors_orig[convert_index]));
2038 gtk_color_selection_set_current_color (GTK_COLOR_SELECTION(dialog_data->operate[0]), &(dialog_data->ansi_colors_orig[convert_index]));
2039 // win_data->temp_index will point to the color index in color_orig
2040 win_data->temp_index = convert_index;
2041 // g_debug("Launch update_ansi_color_info(): win_data->temp_index = %d", win_data->temp_index);
2042 }
2043
create_label_with_text(GtkWidget * box,gboolean set_markup,gboolean selectable,gint max_width_chars,const gchar * text)2044 GtkWidget *create_label_with_text(GtkWidget *box, gboolean set_markup, gboolean selectable, gint max_width_chars, const gchar *text)
2045 {
2046 #ifdef DETAIL
2047 g_debug("! Launch create_label_with_text() with box = %p, set_markup = %d, "
2048 "selectable = %d, max_width_chars = %d, text = %s",
2049 box, set_markup, selectable, max_width_chars, text);
2050 #endif
2051 #ifdef SAFEMODE
2052 if (text==NULL) return NULL;
2053 #endif
2054 GtkWidget *label = gtk_label_new(NULL);
2055 if (set_markup)
2056 gtk_label_set_markup(GTK_LABEL (label), text);
2057 else
2058 gtk_label_set_text(GTK_LABEL (label), text);
2059 if (selectable) gtk_label_set_selectable(GTK_LABEL(label), TRUE);
2060 if (max_width_chars) gtk_label_set_max_width_chars (GTK_LABEL(label), max_width_chars);
2061
2062 if (box) gtk_box_pack_start (GTK_BOX(box), label, FALSE, FALSE, 0);
2063 return label;
2064 }
2065
add_secondary_button(GtkWidget * dialog,const gchar * text,gint response_id,const gchar * stock_id)2066 GtkWidget *add_secondary_button(GtkWidget *dialog, const gchar *text, gint response_id, const gchar *stock_id)
2067 {
2068 #ifdef DETAIL
2069 g_debug("! Launch add_secondary_button() with dialog = %p, text = %s, response_id = %d, stock_id = %s",
2070 dialog, text, response_id, stock_id);
2071 #endif
2072 #ifdef SAFEMODE
2073 if ((text==NULL) || (dialog==NULL)) return NULL;
2074 #endif
2075 GtkWidget *button = gtk_dialog_add_button (GTK_DIALOG(dialog), text, response_id);
2076 if (stock_id)
2077 gtk_button_set_image (GTK_BUTTON(button),
2078 gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_BUTTON));
2079 gtk_button_box_set_child_secondary (GTK_BUTTON_BOX(gtk_dialog_get_action_area(GTK_DIALOG(dialog))), button, TRUE);
2080 return button;
2081 }
2082
2083 #if defined(ENABLE_FIND_STRING) || defined(UNIT_TEST)
refresh_regex_settings(GtkWidget * widget,struct Window * win_data)2084 void refresh_regex_settings(GtkWidget *widget, struct Window *win_data)
2085 {
2086 #ifdef DETAIL
2087 g_debug("! Launch refresh_regex_settings() with win_data = %p", win_data);
2088 #endif
2089 #ifdef SAFEMODE
2090 if ((win_data==NULL) || (win_data->window==NULL)) return;
2091 #endif
2092 struct Dialog *dialog_data = (struct Dialog *)g_object_get_data(G_OBJECT(menu_active_window), "Dialog");
2093 #ifdef SAFEMODE
2094 if (dialog_data==NULL) return;
2095 #endif
2096 g_free(win_data->find_string);
2097 #ifdef SAFEMODE
2098 if (dialog_data->operate[0]!=NULL)
2099 #endif
2100 win_data->find_string = g_strdup(gtk_entry_get_text(GTK_ENTRY(dialog_data->operate[0])));
2101 // win_data->find_case_sensitive = GTK_TOGGLE_BUTTON(dialog_data->operate[1])->active;
2102 #ifdef SAFEMODE
2103 if (dialog_data->operate[1]!=NULL)
2104 #endif
2105 win_data->find_case_sensitive = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog_data->operate[1]));
2106 // win_data->find_use_perl_regular_expressions = GTK_TOGGLE_BUTTON(dialog_data->operate[2])->active;
2107 #ifdef SAFEMODE
2108 if (dialog_data->operate[2]!=NULL)
2109 #endif
2110 win_data->find_use_perl_regular_expressions = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog_data->operate[2]));
2111
2112 // g_debug("Got win_data->find_string = %s", win_data->find_string);
2113 // g_debug("Got win_data->find_case_sensitive = %d", win_data->find_case_sensitive);
2114 // g_debug("win_data->find_use_perl_regular_expressions = %d", win_data->find_use_perl_regular_expressions);
2115
2116 refresh_regex(win_data, dialog_data);
2117 }
2118
refresh_regex(struct Window * win_data,struct Dialog * dialog_data)2119 void refresh_regex(struct Window *win_data, struct Dialog *dialog_data)
2120 {
2121 #ifdef DETAIL
2122 g_debug("! Launch refresh_regex with win_data = %p, dialog_data = %p", win_data, dialog_data);
2123 #endif
2124 #ifdef SAFEMODE
2125 if ((win_data==NULL) || (win_data->current_vte==NULL) || (dialog_data == NULL)) return;
2126 #endif
2127 #ifdef ENABLE_FIND_STRING
2128 gint RegexCompileFlags = G_REGEX_OPTIMIZE;
2129 if (! win_data->find_case_sensitive) RegexCompileFlags |= G_REGEX_CASELESS;
2130 if ((! win_data->find_use_perl_regular_expressions) &&
2131 (win_data->find_string && (win_data->find_string[0]!='\0')))
2132 {
2133 gchar *new_find_string = g_regex_escape_string(win_data->find_string, -1);
2134 g_free(win_data->find_string);
2135 win_data->find_string = new_find_string;
2136 }
2137
2138 gchar *find_string = win_data->find_string;
2139 if (find_string==NULL) find_string = "";
2140
2141 if (find_string[0]!='\0')
2142 {
2143 vte_terminal_search_find_next(VTE_TERMINAL(win_data->current_vte));
2144 GRegex *regex = NULL;
2145 regex = g_regex_new (find_string, RegexCompileFlags, 0, NULL);
2146 vte_terminal_search_set_gregex(VTE_TERMINAL(win_data->current_vte), regex);
2147 if (regex) g_regex_unref (regex);
2148 }
2149 else
2150 {
2151 // FIXME: It don't work!
2152 vte_terminal_search_set_gregex(VTE_TERMINAL(win_data->current_vte), NULL);
2153 }
2154
2155 gboolean update_bg_color = FALSE;
2156
2157 if ((find_string[0]=='\0') ||
2158 vte_terminal_search_find_previous(VTE_TERMINAL(win_data->current_vte)) ||
2159 vte_terminal_search_find_next(VTE_TERMINAL(win_data->current_vte)))
2160 {
2161 if (compare_color(&(win_data->find_entry_current_bg_color), &(win_data->find_entry_bg_color)))
2162 {
2163 update_bg_color = TRUE;
2164 win_data->find_entry_current_bg_color = win_data->find_entry_bg_color;
2165 }
2166 }
2167 else
2168 {
2169 if (compare_color(&(win_data->find_entry_current_bg_color), &(entry_not_find_bg_color)))
2170 {
2171 update_bg_color = TRUE;
2172 win_data->find_entry_current_bg_color = entry_not_find_bg_color;
2173 }
2174 }
2175
2176 # ifdef SAFEMODE
2177 if (dialog_data->operate[0]!=NULL)
2178 {
2179 # endif
2180 if (update_bg_color)
2181 {
2182 GtkRcStyle *rc_style = gtk_rc_style_new();
2183 rc_style->base[GTK_STATE_NORMAL] = win_data->find_entry_current_bg_color;
2184 rc_style->color_flags[GTK_STATE_NORMAL] |= GTK_RC_BASE;
2185 gtk_widget_modify_style (dialog_data->operate[0], rc_style);
2186 g_object_unref(rc_style);
2187 }
2188 # ifdef SAFEMODE
2189 }
2190 # endif
2191 # ifdef SAFEMODE
2192 if (dialog_data->operate[3]!=NULL)
2193 # endif
2194 gtk_widget_hide(dialog_data->operate[3]);
2195 #endif
2196 }
2197
find_str(GtkWidget * widget,Dialog_Find_Type type)2198 void find_str(GtkWidget *widget, Dialog_Find_Type type)
2199 {
2200 #ifdef DETAIL
2201 g_debug("! Launch find_str() with type = %d", type);
2202 #endif
2203
2204 #ifdef FATAL
2205 // g_debug("menu_active_window = %p", menu_active_window);
2206 if (menu_active_window==NULL)
2207 return print_active_window_is_null_error_dialog("find_str_in_vte()");
2208 #endif
2209 #ifdef SAFEMODE
2210 if (menu_active_window==NULL) return;
2211 #endif
2212 struct Window *win_data = (struct Window *)g_object_get_data(G_OBJECT(menu_active_window), "Win_Data");
2213 #ifdef SAFEMODE
2214 if ((win_data==NULL) || (win_data->current_vte==NULL)) return;
2215 #endif
2216 #ifdef ENABLE_FIND_STRING
2217 vte_terminal_search_set_wrap_around (VTE_TERMINAL(win_data->current_vte), FALSE);
2218 gboolean response = find_str_in_vte(win_data->current_vte, type);
2219
2220 vte_terminal_search_set_wrap_around (VTE_TERMINAL(win_data->current_vte), TRUE);
2221 struct Dialog *dialog_data = (struct Dialog *)g_object_get_data(G_OBJECT(menu_active_window), "Dialog");
2222 if (response)
2223 gtk_widget_hide(dialog_data->operate[3]);
2224 else
2225 {
2226 switch (type)
2227 {
2228 case FIND_PREV:
2229 set_markup_key_value(FALSE, "darkred",
2230 "Find hit top, continuing at bottom!",
2231 dialog_data->operate[3]);
2232 break;
2233 case FIND_NEXT:
2234 set_markup_key_value(FALSE, "darkred",
2235 "Find hit bottom, continuing at top!",
2236 dialog_data->operate[3]);
2237 break;
2238 # ifdef FATAL
2239 default:
2240 print_switch_out_of_range_error_dialog("find_str", "type", type);
2241 # endif
2242 }
2243 gtk_widget_show(dialog_data->operate[3]);
2244 find_str_in_vte(win_data->current_vte, type);
2245 }
2246 #endif
2247 }
2248
find_str_in_vte(GtkWidget * vte,Dialog_Find_Type type)2249 gboolean find_str_in_vte(GtkWidget *vte, Dialog_Find_Type type)
2250 {
2251 #ifdef DETAIL
2252 g_debug("! Launch find_str_in_vte() with type = %d", type);
2253 #endif
2254 #ifdef SAFEMODE
2255 if (vte==NULL) return FALSE;
2256 #endif
2257 gboolean response = FALSE;
2258
2259 #ifdef ENABLE_FIND_STRING
2260 switch (type)
2261 {
2262 case FIND_PREV:
2263 response = vte_terminal_search_find_previous(VTE_TERMINAL(vte));
2264 break;
2265 case FIND_NEXT:
2266 response = vte_terminal_search_find_next(VTE_TERMINAL(vte));
2267 break;
2268 # ifdef FATAL
2269 default:
2270 print_switch_out_of_range_error_dialog("find_str_in_vte", "type", type);
2271 # endif
2272 }
2273 #endif
2274 return response;
2275 }
2276 #endif
2277
2278
paste_text_to_vte_terminal(GtkWidget * widget,struct Dialog * dialog_data)2279 void paste_text_to_vte_terminal(GtkWidget *widget, struct Dialog *dialog_data)
2280 {
2281 #ifdef DETAIL
2282 g_debug("! Launch paste_text_to_vte_terminal()");
2283 #endif
2284 #ifdef SAFEMODE
2285 if ((dialog_data==NULL) || (dialog_data->operate[0]==NULL)) return;
2286 // g_debug("paste_text_to_vte_terminal() Got dialog_data->operate[0] = %p", dialog_data->operate[0]);
2287 #endif
2288 const gchar *text = gtk_entry_get_text(GTK_ENTRY(dialog_data->operate[0]));
2289 if ((text == NULL) || (text[0] == '\0')) return;
2290 #ifdef FATAL
2291 // g_debug("menu_active_window = %p", menu_active_window);
2292 if (menu_active_window==NULL)
2293 return print_active_window_is_null_error_dialog("paste_text_to_vte_terminal()");
2294 #endif
2295 #ifdef SAFEMODE
2296 if (menu_active_window==NULL) return;
2297 #endif
2298 struct Window *win_data = (struct Window *)g_object_get_data(G_OBJECT(menu_active_window), "Win_Data");
2299 #ifdef SAFEMODE
2300 if (win_data==NULL) return;
2301 #endif
2302
2303 gboolean append_new_line = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog_data->operate[1]));
2304 gchar *past_str = NULL;
2305 if (append_new_line)
2306 past_str = g_strdup_printf("%s\n", text);
2307 else
2308 past_str = g_strdup(text);
2309
2310 gint i;
2311 struct Page *page_data = NULL;
2312 for (i=0; i<gtk_notebook_get_n_pages(GTK_NOTEBOOK(win_data->notebook)); i++)
2313 {
2314 page_data = get_page_data_from_nth_page(win_data, i);
2315 #ifdef SAFEMODE
2316 if (page_data==NULL) continue;
2317 #endif
2318 vte_terminal_feed_child(VTE_TERMINAL(page_data->vte), past_str, -1);
2319 }
2320 g_free(past_str);
2321 gtk_entry_set_text (GTK_ENTRY(dialog_data->operate[0]), "");
2322 gtk_window_set_focus(GTK_WINDOW(win_data->window), dialog_data->operate[0]);
2323 }
2324
create_dialog(gchar * dialog_title_translation,gchar * dialog_title,Dialog_Button_Type type,GtkWidget * window,gboolean center,gboolean resizable,gint border_width,gint response,gchar * icon,gchar * title,gboolean selectable,gint max_width_chars,gboolean state_bottom,gint create_entry_hbox,gint entry_hbox_spacing,struct Dialog * dialog_data)2325 void create_dialog(gchar *dialog_title_translation, gchar *dialog_title, Dialog_Button_Type type,
2326 GtkWidget *window, gboolean center, gboolean resizable, gint border_width,
2327 gint response, gchar *icon, gchar *title, gboolean selectable, gint max_width_chars,
2328 gboolean state_bottom, gint create_entry_hbox, gint entry_hbox_spacing,
2329 struct Dialog *dialog_data)
2330 {
2331 #ifdef DETAIL
2332 g_debug("! Launch create_dialog() with dialog_title_translation = %s, "
2333 "dialog_title = %s, type = %d, window = %p, center = %d, resizable = %d, "
2334 "border_width = %d, response = %d, icon = %s, title = %s, selectable = %d, "
2335 "max_width_chars = %d, state_bottom = %d, create_entry_hbox = %d, dialog_data = %p",
2336 dialog_title_translation, dialog_title, type, window, center, resizable,
2337 border_width, response, icon, title, selectable, max_width_chars, state_bottom,
2338 create_entry_hbox, dialog_data);
2339 #endif
2340 #ifdef SAFEMODE
2341 if (dialog_data==NULL) return;
2342 #endif
2343 gboolean BOTTON_ORDER = gtk_alternative_dialog_button_order(NULL);
2344 // g_debug("gtk_alternative_dialog_button_order = %d" ,gtk_alternative_dialog_button_order (NULL));
2345
2346 // Strange behavior, If the locale is empty, or setted to 'C' or 'POSIX',
2347 // And 'default_locale' is setted in the profile,
2348 // All the UI will be translated to default_locale,
2349 // But the window title will be empty.
2350 // So, set it to un-translated string here.
2351 // g_debug("init_LC_CTYPE = %s", init_LC_CTYPE);
2352 if ((init_LC_CTYPE==NULL) || (init_LC_CTYPE[0]=='\0') ||
2353 (! compare_strings(init_LC_CTYPE, "C", TRUE)) ||
2354 (! compare_strings(init_LC_CTYPE, "\"C\"", TRUE)) ||
2355 (! compare_strings(init_LC_CTYPE, "POSIX", TRUE)) ||
2356 (! compare_strings(init_LC_CTYPE, "\"POSIX\"", TRUE)))
2357 dialog_title_translation = dialog_title;
2358
2359 // g_debug("dialog_title_translation = %s", dialog_title_translation);
2360 switch (type)
2361 {
2362 case DIALOG_OK:
2363 dialog_data->window = gtk_dialog_new_with_buttons (dialog_title_translation,
2364 GTK_WINDOW(window),
2365 #ifdef EXIST_GTK_DIALOG_NO_SEPARATOR
2366 GTK_DIALOG_NO_SEPARATOR |
2367 #endif
2368 GTK_DIALOG_DESTROY_WITH_PARENT,
2369 GTK_STOCK_OK,
2370 GTK_RESPONSE_OK,
2371 NULL);
2372 break;
2373 case DIALOG_OK_CANCEL:
2374 if (BOTTON_ORDER)
2375 dialog_data->window = gtk_dialog_new_with_buttons (dialog_title_translation,
2376 GTK_WINDOW(window),
2377 #ifdef EXIST_GTK_DIALOG_NO_SEPARATOR
2378 GTK_DIALOG_NO_SEPARATOR |
2379 #endif
2380 GTK_DIALOG_DESTROY_WITH_PARENT,
2381 GTK_STOCK_OK,
2382 GTK_RESPONSE_OK,
2383 GTK_STOCK_CANCEL,
2384 GTK_RESPONSE_CANCEL,
2385 NULL);
2386 else
2387 dialog_data->window = gtk_dialog_new_with_buttons (dialog_title_translation,
2388 GTK_WINDOW(window),
2389 #ifdef EXIST_GTK_DIALOG_NO_SEPARATOR
2390 GTK_DIALOG_NO_SEPARATOR |
2391 #endif
2392 GTK_DIALOG_DESTROY_WITH_PARENT,
2393 GTK_STOCK_CANCEL,
2394 GTK_RESPONSE_CANCEL,
2395 GTK_STOCK_OK,
2396 GTK_RESPONSE_OK,
2397 NULL);
2398 break;
2399 case DIALOG_QUIT:
2400 dialog_data->window = gtk_dialog_new_with_buttons (dialog_title_translation,
2401 GTK_WINDOW(window),
2402 #ifdef EXIST_GTK_DIALOG_NO_SEPARATOR
2403 GTK_DIALOG_NO_SEPARATOR |
2404 #endif
2405 GTK_DIALOG_DESTROY_WITH_PARENT,
2406 GTK_STOCK_QUIT,
2407 GTK_RESPONSE_CANCEL,
2408 NULL);
2409 break;
2410 case DIALOG_NONE:
2411 dialog_data->window = gtk_dialog_new();
2412 gtk_window_set_title(GTK_WINDOW(dialog_data->window), dialog_title_translation);
2413 gtk_window_set_transient_for (GTK_WINDOW(dialog_data->window), GTK_WINDOW(window));
2414 #ifdef EXIST_GTK_DIALOG_NO_SEPARATOR
2415 gtk_dialog_set_has_separator(GTK_DIALOG(dialog_data->window), FALSE);
2416 #endif
2417 gtk_window_set_destroy_with_parent (GTK_WINDOW (dialog_data->window), TRUE);
2418 break;
2419 default:
2420 #ifdef FATAL
2421 print_switch_out_of_range_error_dialog("create_dialog", "type", type);
2422 #endif
2423 return;
2424 }
2425
2426 // FIXME: It may be a bug in gtk+2?
2427 // if a dialog shown before main window is shown,
2428 // destroy the dialog will destroy the data of the icon, too.
2429 // and when showing main window with gtk_widget_show_all(win_data->window) later,
2430 // It will have no icon, and showing following error:
2431 // Gtk-CRITICAL **: gtk_window_realize_icon: assertion `info->icon_pixmap == NULL' failed
2432 // So, we need to set the icon for the dialog here.
2433 set_window_icon(dialog_data->window);
2434
2435 if (center) gtk_window_set_position (GTK_WINDOW (dialog_data->window), GTK_WIN_POS_CENTER);
2436 gtk_window_set_resizable (GTK_WINDOW (dialog_data->window), resizable);
2437 gtk_container_set_border_width (GTK_CONTAINER (dialog_data->window), border_width);
2438 gtk_dialog_set_default_response(GTK_DIALOG(dialog_data->window), response);
2439
2440 GtkWidget *main_hbox = gtk_hbox_new (FALSE, 5);
2441 gtk_container_add (GTK_CONTAINER (gtk_dialog_get_content_area(GTK_DIALOG(dialog_data->window))), main_hbox);
2442 GtkWidget *main_right_vbox = gtk_vbox_new (FALSE, 0);
2443 gtk_box_pack_end (GTK_BOX(main_hbox), main_right_vbox, FALSE, FALSE, 0);
2444
2445
2446 if (icon)
2447 {
2448 GtkWidget *icon_vbox = gtk_vbox_new (FALSE, 30);
2449 gtk_box_pack_start (GTK_BOX(main_hbox), icon_vbox, FALSE, FALSE, 10);
2450 GtkWidget *icon_image = gtk_image_new_from_stock (icon, GTK_ICON_SIZE_DIALOG);
2451 gtk_box_pack_start (GTK_BOX(icon_vbox), icon_image, FALSE, FALSE, 10);
2452 }
2453
2454 GtkWidget *state_vbox =NULL;
2455 if (title)
2456 state_vbox = gtk_vbox_new (FALSE, 15);
2457 else
2458 state_vbox = gtk_vbox_new (FALSE, 0);
2459
2460 gtk_box_pack_start (GTK_BOX(main_hbox), state_vbox, TRUE, TRUE, 0);
2461
2462 if (title)
2463 dialog_data->title_label = create_label_with_text(state_vbox, TRUE, selectable, max_width_chars, title);
2464
2465 if (state_bottom)
2466 {
2467 GtkWidget *state_bottom_hbox = gtk_hbox_new (FALSE, 3);
2468 gtk_box_pack_end (GTK_BOX(state_vbox), state_bottom_hbox, FALSE, FALSE, 0);
2469 }
2470
2471 if (create_entry_hbox)
2472 {
2473 switch (create_entry_hbox)
2474 {
2475 case BOX_HORIZONTAL:
2476 dialog_data->box = gtk_hbox_new (FALSE, entry_hbox_spacing);
2477 break;
2478 case BOX_VERTICALITY:
2479 dialog_data->box = gtk_vbox_new (FALSE, entry_hbox_spacing);
2480 break;
2481 default:
2482 #ifdef FATAL
2483 print_switch_out_of_range_error_dialog("create_dialog",
2484 "create_entry_hbox",
2485 create_entry_hbox);
2486 #endif
2487 break;
2488 }
2489 if (title)
2490 gtk_box_pack_start (GTK_BOX(state_vbox), dialog_data->box, TRUE, TRUE, 10);
2491 else
2492 gtk_box_pack_start (GTK_BOX(state_vbox), dialog_data->box, TRUE, TRUE, 0);
2493 }
2494 }
2495
create_entry_widget(GtkWidget * box,gchar * contents,gchar * name,gchar * default_value,gboolean activates_default)2496 GtkWidget *create_entry_widget (GtkWidget *box, gchar *contents, gchar *name, gchar *default_value, gboolean activates_default)
2497 {
2498 #ifdef DETAIL
2499 g_debug("! Launch create_entry_widget() with box = %p, contents = %s, name = %s, default_value = %s",
2500 box, contents, name, default_value);
2501 #endif
2502 #ifdef SAFEMODE
2503 if (box==NULL) return NULL;
2504 #endif
2505 GtkWidget *mainbox = gtk_vbox_new(FALSE, 10);
2506
2507 if (contents && contents[0]!='\0')
2508 {
2509 GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
2510 GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
2511 GtkWidget *label = gtk_label_new(contents);
2512 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
2513 gtk_box_pack_start(GTK_BOX(hbox), vbox, FALSE, FALSE, 0);
2514 gtk_box_pack_start(GTK_BOX(mainbox), hbox, FALSE, FALSE, 0);
2515 }
2516
2517 GtkWidget *hbox = gtk_hbox_new(FALSE, 5);
2518 GtkWidget *vbox = gtk_vbox_new(FALSE, 0);
2519 GtkWidget *label = gtk_label_new(name);
2520 gtk_box_pack_start (GTK_BOX(hbox), label, FALSE, FALSE, 0);
2521 GtkWidget *entry = gtk_entry_new ();
2522 if (default_value) gtk_entry_set_text(GTK_ENTRY(entry), default_value);
2523 gtk_entry_set_activates_default(GTK_ENTRY(entry), activates_default);
2524 gtk_box_pack_start(GTK_BOX (hbox), entry, TRUE, TRUE, 0);
2525 gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
2526 gtk_box_pack_start(GTK_BOX(mainbox), vbox, FALSE, FALSE, 0);
2527
2528 gtk_box_pack_start(GTK_BOX(box), mainbox, FALSE, FALSE, 0);
2529
2530 return entry;
2531 }
2532
create_frame_widget(struct Dialog * dialog_data,gchar * label,GtkWidget * label_widget,GtkWidget * child,guint padding)2533 GtkWidget *create_frame_widget (struct Dialog *dialog_data, gchar *label,
2534 GtkWidget *label_widget, GtkWidget *child, guint padding)
2535 {
2536 #ifdef DETAIL
2537 g_debug("! Launch create_frame_widget() with dialog_data = %p, label = %s, label_widget = %p, "
2538 "child = %p, padding = %d!", dialog_data, label, label_widget, child, padding);
2539 #endif
2540 #ifdef SAFEMODE
2541 if (dialog_data==NULL) return NULL;
2542 #endif
2543 GtkWidget *frame = gtk_frame_new (label);
2544 if (label_widget) gtk_frame_set_label_widget (GTK_FRAME(frame), label_widget);
2545 #ifdef SAFEMODE
2546 if (dialog_data->box!=NULL)
2547 #endif
2548 gtk_box_pack_start (GTK_BOX(dialog_data->box), frame, FALSE, FALSE, padding);
2549 GtkWidget *vbox = gtk_vbox_new (FALSE, 15);
2550 gtk_container_set_border_width (GTK_CONTAINER (vbox), 10);
2551 gtk_container_add (GTK_CONTAINER (frame), vbox);
2552 if (child) gtk_box_pack_start (GTK_BOX(vbox), child, FALSE, FALSE, 0);
2553 return vbox;
2554 }
2555
create_button_with_image(gchar * label_text,const gchar * stock_id,gboolean set_tooltip_text,GSourceFunc func,gpointer func_data)2556 GtkWidget *create_button_with_image(gchar *label_text, const gchar *stock_id, gboolean set_tooltip_text,
2557 GSourceFunc func, gpointer func_data)
2558 {
2559 #ifdef DETAIL
2560 g_debug("! Launch create_button_with_image() with label_text = %s, stock_id = %s!",
2561 label_text, stock_id);
2562 #endif
2563 GtkWidget *label = NULL;
2564
2565 #ifdef ENABLE_SET_TOOLTIP_TEXT
2566 if (set_tooltip_text)
2567 {
2568 label = gtk_button_new();
2569 gtk_widget_set_tooltip_text (label, label_text);
2570 }
2571 else
2572 #endif
2573 label = gtk_button_new_with_label(label_text);
2574
2575 gtk_button_set_image (GTK_BUTTON(label),
2576 gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU));
2577 gtk_button_set_relief(GTK_BUTTON(label), GTK_RELIEF_NONE);
2578 gtk_button_set_focus_on_click(GTK_BUTTON(label), FALSE);
2579 gtk_button_set_alignment(GTK_BUTTON(label), 0, 0.5);
2580 #ifdef SAFEMODE
2581 if (func)
2582 #endif
2583 g_signal_connect(G_OBJECT(label), "clicked", G_CALLBACK(func), func_data);
2584 return label;
2585 }
2586
create_hbox_with_text_and_image(gchar * text,const gchar * stock_id)2587 GtkWidget *create_hbox_with_text_and_image(gchar *text, const gchar *stock_id)
2588 {
2589 #ifdef DETAIL
2590 g_debug("! Launch create_hbox_with_text_and_image() with label_text = %s, stock_id = %s!",
2591 text, stock_id);
2592 #endif
2593 GtkWidget *hbox=gtk_hbox_new(FALSE, 0);
2594 set_widget_thickness(hbox, 0);
2595
2596 GtkWidget *label = gtk_label_new(text);
2597 gtk_box_pack_start(GTK_BOX(hbox), label, TRUE, TRUE, 0);
2598 GtkWidget *image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU);
2599 gtk_box_pack_start(GTK_BOX(hbox), image, FALSE, FALSE, 0);
2600 gtk_widget_show_all(hbox);
2601
2602 return hbox;
2603 }
2604
create_color_selection_widget(struct Dialog * dialog_data,GSourceFunc func,gpointer func_data)2605 void create_color_selection_widget(struct Dialog *dialog_data, GSourceFunc func, gpointer func_data)
2606 {
2607 #ifdef DETAIL
2608 g_debug("! Launch create_color_selection_widget() with dialog_data = %p!", dialog_data);
2609 #endif
2610 #ifdef SAFEMODE
2611 if (dialog_data==NULL) return;
2612 #endif
2613
2614 dialog_data->operate[0] = gtk_color_selection_new();
2615 // save the color data first
2616 gtk_color_selection_set_has_opacity_control(GTK_COLOR_SELECTION(dialog_data->operate[0]),
2617 FALSE);
2618 gtk_color_selection_set_has_palette(GTK_COLOR_SELECTION(dialog_data->operate[0]), FALSE);
2619 dialog_data->recover = FALSE;
2620
2621 // set the previous/current color of gtk_color_selection dialog
2622 gtk_color_selection_set_previous_color (GTK_COLOR_SELECTION(dialog_data->operate[0]),
2623 &(dialog_data->original_color));
2624 gtk_color_selection_set_current_color ( GTK_COLOR_SELECTION(dialog_data->operate[0]),
2625 &(dialog_data->original_color));
2626 #ifdef SAFEMODE
2627 if (dialog_data->box!=NULL)
2628 #endif
2629 gtk_box_pack_start (GTK_BOX(dialog_data->box), dialog_data->operate[0], TRUE, TRUE, 0);
2630 #ifdef SAFEMODE
2631 if (func)
2632 #endif
2633 g_signal_connect_after(dialog_data->operate[0], "color-changed",
2634 G_CALLBACK(func), func_data);
2635 }
2636
create_scale_widget(struct Dialog * dialog_data,gdouble min,gdouble max,gdouble step,gdouble value,GSourceFunc func,gpointer func_data)2637 void create_scale_widget(struct Dialog *dialog_data, gdouble min, gdouble max, gdouble step, gdouble value,
2638 GSourceFunc func, gpointer func_data)
2639 {
2640 #ifdef DETAIL
2641 g_debug("! Launch create_scale_widget() with dialog_data = %p, min = %3f, max = %3f, step = %3f, value = %3f!",
2642 dialog_data, min, max, step, value);
2643 #endif
2644 #ifdef SAFEMODE
2645 if (dialog_data==NULL) return;
2646 #endif
2647 GtkWidget *hbox1 = gtk_hbox_new (FALSE, 0);
2648 #ifdef SAFEMODE
2649 if (dialog_data->box!=NULL)
2650 #endif
2651 gtk_box_pack_start (GTK_BOX(dialog_data->box), hbox1, FALSE, FALSE, 0);
2652 #ifdef SAFEMODE
2653 if ((min==max) || (step==0)) return;
2654
2655 if (min>max)
2656 {
2657 gdouble tmp = max;
2658 max = min;
2659 min = tmp;
2660 }
2661 #endif
2662 dialog_data->operate[0] = gtk_hscale_new_with_range(min, max, step);
2663 gtk_widget_set_size_request(dialog_data->operate[0], 210, -1);
2664 gtk_range_set_value(GTK_RANGE(dialog_data->operate[0]), value);
2665 #ifdef SAFEMODE
2666 if (func)
2667 #endif
2668 g_signal_connect_after(dialog_data->operate[0], "change-value", G_CALLBACK(func), func_data);
2669 #ifdef SAFEMODE
2670 if (dialog_data->box!=NULL)
2671 #endif
2672 gtk_box_pack_start (GTK_BOX(dialog_data->box), dialog_data->operate[0], TRUE, TRUE, 0);
2673 GtkWidget *hbox2 = gtk_hbox_new (FALSE, 0);
2674 #ifdef SAFEMODE
2675 if (dialog_data->box!=NULL)
2676 #endif
2677 gtk_box_pack_end (GTK_BOX(dialog_data->box), hbox2, FALSE, FALSE, 0);
2678 }
2679
create_SIGKILL_and_EXIT_widget(struct Dialog * dialog_data,gboolean create_entry_hbox,gboolean create_force_kill_hbox,gchar * count_str)2680 void create_SIGKILL_and_EXIT_widget(struct Dialog *dialog_data, gboolean create_entry_hbox,
2681 gboolean create_force_kill_hbox, gchar *count_str)
2682 {
2683 #ifdef DETAIL
2684 g_debug("! Launch create_SIGKILL_and_EXIT_widget() with dialog_data = %p, create_entry_hbox = %d, "
2685 "create_force_kill_hbox = %d, count_str = %s!",
2686 dialog_data, create_entry_hbox, create_force_kill_hbox, count_str);
2687 #endif
2688 #ifdef SAFEMODE
2689 if (dialog_data==NULL) return;
2690 #endif
2691 if (create_entry_hbox)
2692 {
2693 gchar *message = g_strdup_printf(_("Try to kill %s with SIGKILL() "
2694 "to avoid terminate those programs!\n"
2695 "(MAY CAUSE DATA LOSS!!)"), count_str);
2696 dialog_data->operate[1] = gtk_check_button_new_with_label(message);
2697 g_free(message);
2698 #ifdef SAFEMODE
2699 if (dialog_data->box!=NULL)
2700 #endif
2701 gtk_box_pack_start (GTK_BOX(dialog_data->box), dialog_data->operate[1], FALSE, FALSE, 0);
2702 set_widget_can_not_get_focus(dialog_data->operate[1]);
2703 }
2704
2705 if (create_force_kill_hbox)
2706 {
2707 gchar *exit_str = g_strdup_printf(_("Force to close all the tabs and windows, and exit %s!"),
2708 PACKAGE);
2709 dialog_data->operate[0] = gtk_check_button_new_with_label(exit_str);
2710 g_free(exit_str);
2711 #ifdef SAFEMODE
2712 if (dialog_data->box!=NULL)
2713 #endif
2714 gtk_box_pack_start (GTK_BOX(dialog_data->box), dialog_data->operate[0], FALSE, FALSE, 0);
2715 set_widget_can_not_get_focus(dialog_data->operate[0]);
2716 }
2717 }
2718
2719 // The returned string should be freed when no longer needed.
get_colorful_profile(struct Window * win_data)2720 gchar *get_colorful_profile(struct Window *win_data)
2721 {
2722 #ifdef DETAIL
2723 g_debug("! Launch get_colorful_profile() with win_data = %p", win_data);
2724 #endif
2725 #ifdef SAFEMODE
2726 if (win_data==NULL) return NULL;
2727 #endif
2728
2729 gchar *profile;
2730 if (win_data->use_custom_profile)
2731 profile = g_strdup_printf("%s", win_data->profile);
2732 else
2733 profile = g_strdup_printf("%s/%s", profile_dir, USER_PROFILE);
2734
2735 // g_debug("win_data->runtime_encoding = %s", win_data->runtime_encoding);
2736 // g_debug("profile = %s", profile);
2737 gchar *utf8_profile = convert_str_to_utf8(profile, win_data->runtime_encoding);
2738 g_free(profile);
2739
2740 // g_debug("utf8_profile = %s", utf8_profile);
2741 return convert_text_to_html(&utf8_profile, TRUE, "blue", "b", NULL);
2742 }
2743
grab_key_press(GtkWidget * window,GdkEventKey * event,struct Dialog * dialog_data)2744 gboolean grab_key_press (GtkWidget *window, GdkEventKey *event, struct Dialog *dialog_data)
2745 {
2746 #ifdef DETAIL
2747 if (event) g_debug("! Launch grab_key_press() with key value = %d (%s)", event->keyval, gdk_keyval_name(event->keyval));
2748 #endif
2749 #ifdef SAFEMODE
2750 if (event==NULL) return FALSE;
2751 #endif
2752 gchar *key_value = g_strdup("");
2753 gint i=0;
2754
2755 // FIXME: Be careful for the setted key value (GDK_Shift_L abd GDK_Hyper_R) here...
2756 for (i=0; i<MOD; i++)
2757 if (event->state & modkeys[i].mod)
2758 key_value = deal_dialog_key_press_join_string(&key_value, "+", modkeys[i].name);
2759 key_value = deal_dialog_key_press_join_string(&key_value, " ", gdk_keyval_name(event->keyval));
2760 set_markup_key_value(TRUE, "blue", key_value, dialog_data->operate[0]);
2761
2762 struct Window *win_data = (struct Window *)g_object_get_data(G_OBJECT(menu_active_window), "Win_Data");
2763 #ifdef SAFEMODE
2764 if (win_data==NULL) return FALSE;
2765 #endif
2766 struct Page *page_data = NULL;
2767 for (i=0; i<gtk_notebook_get_n_pages(GTK_NOTEBOOK(win_data->notebook)); i++)
2768 {
2769 page_data = get_page_data_from_nth_page(win_data, i);
2770 #ifdef SAFEMODE
2771 if (page_data==NULL) continue;
2772 #endif
2773 // g_debug("Send key %s to vte %p!!", key_value, page_data->vte);
2774 // gtk_test_widget_send_key (page_data->vte, event->keyval, event->state);
2775 gtk_widget_event(page_data->vte, (GdkEvent *)event);
2776 }
2777 g_free(key_value);
2778 return TRUE;
2779 }
2780
deal_dialog_key_press(GtkWidget * window,GdkEventKey * event,struct Dialog * dialog_data)2781 gboolean deal_dialog_key_press(GtkWidget *window, GdkEventKey *event, struct Dialog *dialog_data)
2782 {
2783 #ifdef DETAIL
2784 if (event) g_debug("! Launch deal_dialog_key_press() with key value = %s", gdk_keyval_name(event->keyval));
2785 #endif
2786 #ifdef SAFEMODE
2787 if ((dialog_data==NULL) || (event==NULL)) return FALSE;
2788 #endif
2789 if (dialog_data->current_key_index < 0) return FALSE;
2790
2791 gchar *key_value = g_strdup("");
2792 gint i=0;
2793
2794 // FIXME: Be careful for the setted key value (GDK_Shift_L abd GDK_Hyper_R) here...
2795 if (((event->state & SHIFT_ONLY_MASK) || (event->keyval > GDK_KEY_asciitilde)) &&
2796 ((event->keyval < GDK_KEY_Shift_L) || (event->keyval > GDK_KEY_Hyper_R)))
2797 {
2798 for (i=0; i<MOD; i++)
2799 if (event->state & modkeys[i].mod)
2800 key_value = deal_dialog_key_press_join_string(&key_value, "+", modkeys[i].name);
2801 }
2802
2803 g_free(dialog_data->user_key_value[dialog_data->current_key_index]);
2804 gboolean key_value_need_free = FALSE;
2805 #ifdef SAFEMODE
2806 if ((key_value && (key_value[0]!='\0')) ||
2807 ((event->keyval >= GDK_KEY_F1) && (event->keyval <= GDK_KEY_F12)) ||
2808 (event->keyval == GDK_KEY_Menu) || (event->keyval == GDK_KEY_Super_L) || (event->keyval == GDK_KEY_Super_R))
2809 #else
2810 if (key_value[0]!='\0' ||
2811 ((event->keyval >= GDK_KEY_F1) && (event->keyval <= GDK_KEY_F12)) ||
2812 (event->keyval == GDK_KEY_Menu) || (event->keyval == GDK_KEY_Super_L) || (event->keyval == GDK_KEY_Super_R))
2813 #endif
2814 {
2815 gint keyval = event->keyval;
2816
2817 // Trying to show "Ctrl T" instead of "Ctrl t"
2818 if ((keyval>=GDK_KEY_a) && (keyval<=GDK_KEY_z)) keyval = keyval - GDK_KEY_a + GDK_KEY_A;
2819 key_value = deal_dialog_key_press_join_string(&key_value, " ", gdk_keyval_name(keyval));
2820 gboolean duplicated = FALSE;
2821
2822 // Check if the key is duplicated
2823 for (i=0; i<KEYS; i++)
2824 {
2825 if ((i!=dialog_data->current_key_index) &&
2826 (compare_strings(key_value, dialog_data->user_key_value[i], FALSE) == FALSE))
2827 {
2828 duplicated = TRUE;
2829 g_free(key_value);
2830 dialog_data->user_key_value[dialog_data->current_key_index] = g_strdup("");
2831 key_value_need_free = TRUE;
2832 key_value = g_strdup_printf(_("(Disabled, duplicated with [%s])"),
2833 system_keys[i].topic);
2834 }
2835 }
2836 if (! duplicated) dialog_data->user_key_value[dialog_data->current_key_index] = key_value;
2837 }
2838 else
2839 {
2840 dialog_data->user_key_value[dialog_data->current_key_index] = key_value;
2841 key_value = _("(Disabled)");
2842 }
2843
2844 // g_debug("Got function key = %s, and event->keyval = %X (%s)",
2845 // key_value, event->keyval, gdk_keyval_name(event->keyval));
2846
2847 set_markup_key_value(TRUE, "blue", key_value, dialog_data->operate[2]);
2848
2849 GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(dialog_data->treeview));
2850 GtkTreeSelection *treeselection = gtk_tree_view_get_selection (GTK_TREE_VIEW(dialog_data->treeview));
2851 GtkTreeIter iter;
2852 if (gtk_tree_selection_get_selected (treeselection, &model, &iter))
2853 gtk_tree_store_set (GTK_TREE_STORE (model), &iter, 1,
2854 dialog_data->user_key_value[dialog_data->current_key_index], -1);
2855
2856 if (key_value_need_free) g_free(key_value);
2857
2858 return TRUE;
2859 }
2860
set_markup_key_value(gboolean bold,gchar * color,gchar * key_value,GtkWidget * label)2861 void set_markup_key_value(gboolean bold, gchar *color, gchar *key_value, GtkWidget *label)
2862 {
2863 #ifdef DETAIL
2864 g_debug("! Launch set_markup_key_value() whith color = %s, key_value = %s, label = %p!",
2865 color, key_value, label);
2866 #endif
2867
2868 #ifdef SAFEMODE
2869 if (label==NULL) return;
2870 #endif
2871
2872 gchar *markup_text;
2873 if (bold)
2874 markup_text = convert_text_to_html (&key_value, FALSE, color, "b", NULL);
2875 else
2876 markup_text = convert_text_to_html (&key_value, FALSE, color, NULL);
2877 gtk_label_set_markup (GTK_LABEL (label), markup_text);
2878 g_free(markup_text);
2879 }
2880
2881 // WARNING: The "key_value" will free() in deal_dialog_key_press_join_string()
deal_dialog_key_press_join_string(StrAddr ** key_value,gchar * separator,gchar * append)2882 gchar *deal_dialog_key_press_join_string(StrAddr **key_value, gchar *separator, gchar *append)
2883 {
2884 #ifdef DETAIL
2885 g_debug("! Launch deal_dialog_key_press_join_string() with key_value = %s, separator = %s, append = %s", *key_value, separator, append);
2886 #endif
2887 #ifdef SAFEMODE
2888 if ((separator==NULL) || (append==NULL)) return *key_value;
2889 #endif
2890
2891 gchar *join_string = NULL;
2892 #ifdef SAFEMODE
2893 if (*key_value && ((*key_value)[0]!='\0'))
2894 #else
2895 if ((*key_value)[0]!='\0')
2896 #endif
2897 join_string = g_strdup_printf("%s%s%s",*key_value, separator, append);
2898 else
2899 join_string = g_strdup(append);
2900
2901 g_free(*key_value);
2902 #ifdef SAFEMODE
2903 *key_value = NULL;
2904 #endif
2905 return join_string;
2906 }
2907
adjust_vte_color(GtkColorSelection * colorselection,GtkWidget * vte)2908 void adjust_vte_color(GtkColorSelection *colorselection, GtkWidget *vte)
2909 {
2910 #ifdef DETAIL
2911 g_debug("! Launch adjust_vte_color() with colorselection = %p, vte = %p", colorselection, vte);
2912 #endif
2913 #ifdef SAFEMODE
2914 if (vte==NULL) return;
2915 #endif
2916 // g_debug("Changing the color for vte %p", vte);
2917 struct Dialog *dialog_data = (struct Dialog *)g_object_get_data(G_OBJECT(menu_active_window), "Dialog");
2918 // g_debug("Get dialog_data = %p", dialog_data);
2919 #ifdef SAFEMODE
2920 if (dialog_data==NULL) return;
2921 #endif
2922
2923 switch (dialog_data->type)
2924 {
2925 case CHANGE_THE_FOREGROUND_COLOR:
2926 case CHANGE_THE_BACKGROUND_COLOR:
2927 case CHANGE_THE_ANSI_COLORS:
2928 {
2929 #ifdef SAFEMODE
2930 if (vte==NULL) return;
2931 #endif
2932 struct Page *page_data = (struct Page *)g_object_get_data(G_OBJECT(vte), "Page_Data");
2933 #ifdef SAFEMODE
2934 if ((page_data==NULL) || (page_data->window==NULL)) return;
2935 #endif
2936 struct Window *win_data = (struct Window *)g_object_get_data(G_OBJECT(page_data->window),
2937 "Win_Data");
2938 #ifdef SAFEMODE
2939 if (win_data==NULL) return;
2940 #endif
2941 gint converted_index = get_color_index(win_data->invert_color, win_data->temp_index);
2942 // g_debug("adjust_vte_color(): win_data->temp_index = %d, converted_index = %d", win_data->temp_index, converted_index);
2943
2944 if ((dialog_data->type==CHANGE_THE_FOREGROUND_COLOR) ||
2945 ((dialog_data->type==CHANGE_THE_ANSI_COLORS) && (converted_index==(COLOR-1))))
2946 {
2947 if (! dialog_data->recover)
2948 gtk_color_selection_get_current_color (colorselection, &(dialog_data->original_color));
2949 vte_terminal_set_color_foreground(VTE_TERMINAL(vte), &(dialog_data->original_color));
2950 vte_terminal_set_color_bold (VTE_TERMINAL(vte), &(dialog_data->original_color));
2951
2952 if (dialog_data->type==CHANGE_THE_ANSI_COLORS)
2953 {
2954 dialog_data->ansi_colors[converted_index] = dialog_data->original_color;
2955 dialog_data->ansi_colors_orig[win_data->temp_index] = dialog_data->original_color;
2956 }
2957 }
2958 else if ((dialog_data->type==CHANGE_THE_BACKGROUND_COLOR) ||
2959 ((dialog_data->type==CHANGE_THE_ANSI_COLORS) && (converted_index==0)))
2960 {
2961 if (! dialog_data->recover)
2962 {
2963 gtk_color_selection_get_current_color (colorselection, &(dialog_data->original_color));
2964 // FIXME: GtkColorSelection have no ALPHA CHANGED signal.
2965 // so that the following code should be marked for temporary
2966 //if (use_rgba)
2967 //{
2968 // gint alpha = gtk_color_selection_get_current_alpha(colorselection);
2969 // g_debug("Current alpha = %d", alpha);
2970 // vte_terminal_set_opacity(VTE_TERMINAL(vte), alpha);
2971 // vte_terminal_set_background_saturation( VTE_TERMINAL(vte), 1-alpha/65535);
2972 //}
2973 }
2974 //else if (use_rgba)
2975 // set_background_saturation(NULL, 0, background_saturation, vte);
2976
2977 vte_terminal_set_color_background(VTE_TERMINAL(vte), &(dialog_data->original_color));
2978 vte_terminal_set_background_tint_color (VTE_TERMINAL(vte), &(dialog_data->original_color));
2979 if (dialog_data->type==CHANGE_THE_ANSI_COLORS)
2980 {
2981 dialog_data->ansi_colors[converted_index] = dialog_data->original_color;
2982 dialog_data->ansi_colors_orig[win_data->temp_index] = dialog_data->original_color;
2983 }
2984 }
2985 else
2986 // dialog_data->type==CHANGE_THE_ANSI_COLORS && (! fg_color) && (! bg_color)
2987 {
2988 // win_data->temp_index == -1: update_ansi_color_info() is called.
2989 if (win_data->temp_index > -1)
2990 {
2991 GdkColor tmp_color;
2992 gtk_color_selection_get_current_color (colorselection, &tmp_color);
2993
2994 // g_debug("adjust_vte_color(): update the %d color of colors_orig", win_data->temp_index);
2995 dialog_data->ansi_colors_orig[win_data->temp_index] = tmp_color;
2996 adjust_ansi_color(&dialog_data->ansi_colors[get_color_index(win_data->invert_color, win_data->temp_index)],
2997 &dialog_data->ansi_colors_orig[win_data->temp_index],
2998 win_data->color_brightness);
2999 set_vte_color(win_data->current_vte, FALSE, win_data->cursor_color, dialog_data->ansi_colors, FALSE);
3000 // set_new_ansi_color(win_data->current_vte, dialog_data->ansi_colors, dialog_data->ansi_colors_orig,
3001 // win_data->color_brightness, win_data->invert_color, FALSE, win_data->cursor_color);
3002 }
3003 }
3004 break;
3005 }
3006 case CHANGE_THE_CURSOR_COLOR:
3007 if (! dialog_data->recover)
3008 gtk_color_selection_get_current_color (colorselection, &(dialog_data->original_color));
3009 vte_terminal_set_color_cursor(VTE_TERMINAL(vte), &(dialog_data->original_color));
3010 break;
3011 case CHANGE_THE_TEXT_COLOR_OF_WINDOW_TITLE:
3012 case CHANGE_THE_TEXT_COLOR_OF_CMDLINE:
3013 case CHANGE_THE_TEXT_COLOR_OF_CURRENT_DIR:
3014 case CHANGE_THE_TEXT_COLOR_OF_CUSTOM_PAGE_NAME:
3015 case CHANGE_THE_TEXT_COLOR_OF_ROOT_PRIVILEGES_CMDLINE:
3016 case CHANGE_THE_TEXT_COLOR_OF_NORMAL_TEXT:
3017 {
3018 // the change of color will be shown(demo) in 1st page and demo page.
3019 gchar *current_color = NULL;
3020 gtk_color_selection_get_current_color (colorselection, &(dialog_data->original_color));
3021 #ifdef ENABLE_GDKCOLOR_TO_STRING
3022 current_color = gdk_color_to_string(&(dialog_data->original_color));
3023 #endif
3024 struct Page *page_data = (struct Page *)g_object_get_data(G_OBJECT(vte), "Page_Data");
3025 #ifdef SAFEMODE
3026 if (page_data)
3027 #endif
3028 update_page_name(page_data->window, vte, NULL, page_data->label_text, 1,
3029 _("Bold Demo Text"), current_color, FALSE, TRUE, FALSE, NULL,
3030 page_data->custom_window_title, FALSE);
3031
3032 page_data = (struct Page *)g_object_get_data(G_OBJECT(dialog_data->demo_vte), "Page_Data");
3033 #ifdef SAFEMODE
3034 if (page_data)
3035 #endif
3036 update_page_name(page_data->window, dialog_data->demo_vte, NULL,
3037 page_data->label_text, page_data->page_no+1,
3038 dialog_data->demo_text, current_color, FALSE, FALSE,
3039 FALSE, NULL, page_data->custom_window_title, FALSE);
3040 g_free(current_color);
3041 break;
3042 }
3043 default:
3044 #ifdef FATAL
3045 print_switch_out_of_range_error_dialog("adjust_vte_color",
3046 "dialog_data->type",
3047 dialog_data->type);
3048 #endif
3049 break;
3050 }
3051 }
3052
recover_page_colors(GtkWidget * dialog_window,GtkWidget * window,GtkWidget * notebook)3053 void recover_page_colors(GtkWidget *dialog_window, GtkWidget *window, GtkWidget *notebook)
3054 {
3055 #ifdef DETAIL
3056 g_debug("! Launch recover_page_colors() in window %p", window);
3057 #endif
3058
3059 #ifdef SAFEMODE
3060 if ((dialog_window==NULL) || (window==NULL)) return;
3061 #endif
3062
3063 struct Dialog *dialog_data = (struct Dialog *)g_object_get_data(G_OBJECT(menu_active_window), "Dialog");
3064 struct Window *win_data = (struct Window *)g_object_get_data(G_OBJECT(window), "Win_Data");
3065 #ifdef SAFEMODE
3066 if ((dialog_data==NULL) || (win_data==NULL)) return;
3067 #endif
3068 gint i;
3069 struct Page *page_data = NULL;
3070
3071 // g_debug("page_cmdline_color = %s", win_data->page_cmdline_color);
3072 // g_debug("page_dir_color = %s", win_data->page_dir_color);
3073 // g_debug("page_custom_color = %s", win_data->page_custom_color);
3074 // g_debug("page_root_color = %s", win_data->page_root_color);
3075 // g_debug("page_normal_color = %s", win_data->page_normal_color);
3076
3077 // delete the tab that we add when demo
3078 win_data->kill_color_demo_vte = TRUE;
3079 for (i=PAGE_COLOR; i>=dialog_data->total_page; i--)
3080 {
3081 page_data = get_page_data_from_nth_page(win_data, i);
3082 #ifdef SAFEMODE
3083 if (page_data)
3084 #endif
3085 close_page (page_data->vte, TRUE);
3086 }
3087 win_data->kill_color_demo_vte = FALSE;
3088
3089 // reset to the current page
3090 #ifdef SAFEMODE
3091 if (notebook)
3092 #endif
3093 gtk_notebook_set_current_page(GTK_NOTEBOOK(notebook), dialog_data->current_page_no);
3094
3095 // recover the title/color of pages
3096 for (i=0; i<dialog_data->total_page; i++)
3097 {
3098 page_data = get_page_data_from_nth_page(win_data, i);
3099
3100 // restore the is_bold of 1st page
3101 // g_debug("i = %d", i);
3102 if (i==0)
3103 page_data->is_bold = dialog_data->tab_1_is_bold;
3104
3105 // g_debug("Launch get_and_update_page_name() in recover_page_colors() for %d page!", i);
3106 // g_debug("page_data->page_update_method = %d", page_data->page_update_method);
3107 if (i <= PAGE_COLOR) page_data->page_update_method = dialog_data->original_update_method[i];
3108 if (page_data->page_update_method == PAGE_METHOD_WINDOW_TITLE) page_data->window_title_updated = 1;
3109 get_and_update_page_name(page_data, FALSE);
3110 }
3111 }
3112
check_and_add_locale_to_warned_locale_list(struct Window * win_data,gchar * new_locale)3113 gboolean check_and_add_locale_to_warned_locale_list(struct Window *win_data, gchar *new_locale)
3114 {
3115 #ifdef DETAIL
3116 g_debug("! Launch check_and_add_locale_to_warned_locale_list() with win_data = %p, new_locale = %s!",
3117 win_data, new_locale);
3118 #endif
3119 #ifdef SAFEMODE
3120 if ((win_data==NULL) || (new_locale==NULL) ||
3121 (win_data->warned_locale_list == NULL) ||
3122 (win_data->warned_locale_list->str == NULL)) return TRUE;
3123 #endif
3124 gchar *check_locale = g_strdup_printf(" %s ", new_locale);
3125 #ifdef SAFEMODE
3126 if (check_locale==NULL) return TRUE;
3127 #endif
3128 gboolean response = TRUE;
3129
3130 // g_debug("check_and_add_locale_to_warned_locale_list(): win_data->warned_locale_list = %p",
3131 // win_data->warned_locale_list);
3132 // g_debug("check_and_add_locale_to_warned_locale_list(): Checking '%s' in '%s'...",
3133 // check_locale, win_data->warned_locale_list->str);
3134 if (strstr(win_data->warned_locale_list->str, check_locale))
3135 response = FALSE;
3136 else
3137 g_string_append_printf(win_data->warned_locale_list, "%s ", new_locale);
3138 g_free(check_locale);
3139 return response;
3140 }
3141
create_invalid_locale_error_message(gchar * locale)3142 void create_invalid_locale_error_message(gchar *locale)
3143 {
3144 #ifdef DETAIL
3145 g_debug("! Launch create_invalid_locale_error_message() with locale = %s!", locale);
3146 #endif
3147 gchar *color_locale = convert_text_to_html(&locale, FALSE, "darkblue", "b", NULL);
3148 gchar *err_msg = g_strdup_printf(_("The locale \"%s\" seems NOT supported by your system!\n"
3149 "If you just added the locale datas recently,\n"
3150 "Please close all the windows of %s and try again."),
3151 color_locale, PACKAGE);
3152 error_dialog(NULL, _("Not supported locale!"), "Not supported locale!",
3153 GTK_STOCK_DIALOG_WARNING, err_msg, NULL);
3154 g_free(color_locale);
3155 g_free(err_msg);
3156 }
3157
3158 // 1. menu_active_window = NULL
3159 // 2. Not supported feature
3160 // 3. The format of socket data is out of date
3161 // 4. The following settings can NOT be applied
3162 // 5. Not supported locale!
3163 // 6. Error when creating child process
3164 // 7. Error when writing profile
3165 // 8. The format of your profile is out of date
3166 // 9. The profile is invalid
3167
error_dialog(GtkWidget * window,gchar * title_translation,gchar * title,gchar * icon,gchar * message,gchar * encoding)3168 void error_dialog(GtkWidget *window, gchar *title_translation, gchar *title,
3169 gchar *icon, gchar *message, gchar *encoding)
3170 {
3171 #ifdef DETAIL
3172 g_debug("! Launch error_dialog() with window = %p, title = %s, icon = %s, message = %s, encodig = %s",
3173 window, title, icon, message, encoding);
3174 #endif
3175
3176 dialog_activated++;
3177 // g_debug("Set dialog_activated = %d", dialog_activated);
3178
3179 gchar *utf8_message = convert_str_to_utf8(message, encoding);
3180 #ifdef UNIT_TEST
3181 g_message("%s", utf8_message);
3182 #else
3183 struct Dialog dialog_data;
3184
3185 // void create_dialog(gchar *dialog_title, Dialog_Button_Type type, GtkWidget *window, gboolean center,
3186 // gboolean resizable, gint border_width, gint response, gchar *icon,
3187 // gchar *title, gboolean selectable, gint max_width_chars,
3188 // gboolean state_bottom, gint create_entry_hbox, struct Dialog *dialog_data)
3189 create_dialog(title_translation, title, DIALOG_OK, window, TRUE,
3190 FALSE, 10, GTK_RESPONSE_OK, icon, utf8_message,
3191 FALSE, 0, TRUE, BOX_NONE, 0, &dialog_data);
3192 gtk_widget_show_all (dialog_data.window);
3193 gtk_dialog_run(GTK_DIALOG(dialog_data.window));
3194 gtk_widget_destroy(dialog_data.window);
3195 #endif
3196 g_free(utf8_message);
3197 dialog_activated--;
3198 // g_debug("Set dialog_activated = %d", dialog_activated);
3199 }
3200
3201 #ifdef FATAL
print_switch_out_of_range_error_dialog(gchar * function,gchar * var,gint value)3202 void print_switch_out_of_range_error_dialog(gchar *function, gchar *var, gint value)
3203 {
3204 gchar *err_msg = g_strdup_printf("%s(): the var \"%s\" (%d) is out of range\n\n"
3205 "Please report bug to %s, Thanks!",
3206 function, var, value, BUGREPORT);
3207 #ifdef SAFEMODE
3208 if (err_msg)
3209 #endif
3210 error_dialog(NULL, _("The following error occurred:"),
3211 "The following error occurred:",
3212 GTK_STOCK_DIALOG_ERROR, err_msg, NULL);
3213 g_free(err_msg);
3214 }
3215 #endif
3216
upgrade_dialog(gchar * version_str)3217 gboolean upgrade_dialog(gchar *version_str)
3218 {
3219 #ifdef DETAIL
3220 g_debug("! Launch upgrade_dialog() with version_str = %s", version_str);
3221 #endif
3222 gchar *err_msg = g_strdup_printf(_("You should upgrade to %s and recompile %s to support this feature."), version_str, PACKAGE);
3223 error_dialog(NULL, _("Not supported feature!"), "Not supported feature!",
3224 GTK_STOCK_DIALOG_WARNING, err_msg, NULL);
3225 g_free(err_msg);
3226 return FALSE;
3227 }
3228
set_ansi_color(GtkRange * range,GtkScrollType scroll,gdouble value,GtkWidget * vte)3229 gboolean set_ansi_color(GtkRange *range, GtkScrollType scroll, gdouble value, GtkWidget *vte)
3230 {
3231 #ifdef DETAIL
3232 g_debug("! Launch set_ansi_color() with range = %p, scroll = %u, value = %f, vte = %p",
3233 range, scroll, value, vte);
3234 #endif
3235
3236 #ifdef SAFEMODE
3237 if (vte==NULL) return FALSE;
3238 #endif
3239 struct Page *page_data = (struct Page *)g_object_get_data(G_OBJECT(vte), "Page_Data");
3240 #ifdef SAFEMODE
3241 if ((page_data==NULL) || (page_data->window==NULL)) return FALSE;
3242 #endif
3243 struct Window *win_data = (struct Window *)g_object_get_data(G_OBJECT(page_data->window),
3244 "Win_Data");
3245 #ifdef SAFEMODE
3246 if (win_data==NULL) return FALSE;
3247 #endif
3248
3249 value = CLAMP(value, -1, 1);
3250 win_data->color_brightness = value;
3251 // g_debug("set_ansi_color(): win_data->color_brightness = %0.3f, win_data->color_brightness_inactive = %0.3f",
3252 // win_data->color_brightness, win_data->color_brightness_inactive);
3253
3254 struct Dialog *dialog_data = (struct Dialog *)g_object_get_data(G_OBJECT(menu_active_window), "Dialog");
3255 #ifdef SAFEMODE
3256 if (dialog_data==NULL) return FALSE;
3257 #endif
3258 // We will not adject the value of fg_color
3259 // win_data->fg_color = get_inactive_color(dialog_data->original_fg_color,
3260 // win_data->color_brightness,
3261 // dialog_data->original_color_brightness);
3262 gboolean dim_fg_color = (dialog_data->type==ADJUST_THE_BRIGHTNESS_OF_ANSI_COLORS_WHEN_INACTIVE) ? TRUE : FALSE;
3263 set_new_ansi_color(win_data->current_vte, dialog_data->ansi_colors, dialog_data->ansi_colors_orig,
3264 win_data->color_brightness, win_data->invert_color, FALSE, win_data->cursor_color, dim_fg_color);
3265 return FALSE;
3266 }
3267
3268
get_inactive_color(GdkColor original_fg_color,gdouble new_brightness,gdouble old_brightness)3269 GdkColor get_inactive_color(GdkColor original_fg_color, gdouble new_brightness, gdouble old_brightness)
3270 {
3271 #ifdef DETAIL
3272 g_debug("! Launch get_inactive_color() with new_brightness = %3f, "
3273 "old_brightness = %3f!", new_brightness, old_brightness);
3274 #endif
3275 GdkColor inactive_color;
3276 if (new_brightness < old_brightness)
3277 adjust_ansi_color(&inactive_color,
3278 &(original_fg_color),
3279 (new_brightness - old_brightness) /
3280 (1 + old_brightness));
3281 else
3282 adjust_ansi_color(&inactive_color,
3283 &(original_fg_color),
3284 (new_brightness - old_brightness) /
3285 (1 - old_brightness));
3286 return inactive_color;
3287 }
3288
set_new_ansi_color(GtkWidget * vte,GdkColor color[COLOR],GdkColor color_orig[COLOR],gdouble color_brightness,gboolean invert_color,gboolean default_vte_color,GdkColor cursor_color,gboolean dim_fg_color)3289 void set_new_ansi_color(GtkWidget *vte, GdkColor color[COLOR], GdkColor color_orig[COLOR], gdouble color_brightness,
3290 gboolean invert_color, gboolean default_vte_color, GdkColor cursor_color, gboolean dim_fg_color)
3291 {
3292 #ifdef DETAIL
3293 g_debug("! Launch set_new_ansi_color() with vte = %p, color_brightness = %3f, invert_color = %d, default_vte_color = %d",
3294 vte, color_brightness, invert_color, default_vte_color);
3295 #endif
3296 #ifdef SAFEMODE
3297 if ((vte==NULL) || (color_orig==NULL) || (color==NULL)) return;
3298 #endif
3299 create_theme_color_data(color, color_orig, color_brightness, invert_color, default_vte_color, dim_fg_color);
3300 set_vte_color(vte, default_vte_color, cursor_color, color, FALSE);
3301 }
3302
hide_combo_box_capital(GtkCellLayout * cell_layout,GtkCellRenderer * cell,GtkTreeModel * tree_model,GtkTreeIter * iter,gpointer data)3303 void hide_combo_box_capital(GtkCellLayout *cell_layout, GtkCellRenderer *cell,
3304 GtkTreeModel *tree_model, GtkTreeIter *iter, gpointer data)
3305 {
3306 #ifdef DETAIL
3307 g_debug("! Launch hide_combo_box_capital() with cell_layout = %p, cell = %p, tree_model = %p, iter = %p!",
3308 cell_layout, cell, tree_model, iter);
3309 #endif
3310 #ifdef SAFEMODE
3311 if ((tree_model==NULL) || (iter==NULL)) return;
3312 #endif
3313 g_object_set (cell, "sensitive", !gtk_tree_model_iter_has_child(tree_model, iter), NULL);
3314 }
3315
update_key_info(GtkTreeSelection * treeselection,struct Dialog * dialog_data)3316 void update_key_info (GtkTreeSelection *treeselection, struct Dialog *dialog_data)
3317 {
3318 #ifdef DETAIL
3319 g_debug("! Launch update_key_info() with treeselection = %p, dialog_data = %p!", treeselection, dialog_data);
3320 #endif
3321 #ifdef SAFEMODE
3322 if ((dialog_data==NULL) || (treeselection==NULL)) return;
3323 #endif
3324 GtkTreeIter iter;
3325 GtkTreeModel *model = gtk_tree_view_get_model(gtk_tree_selection_get_tree_view(GTK_TREE_SELECTION (treeselection)));
3326 GtkTreePath *path = NULL;
3327 gchar *string = NULL;
3328 gchar **indices = NULL;
3329 if (gtk_tree_selection_get_selected (treeselection, &model, &iter))
3330 {
3331 gtk_widget_set_no_show_all (dialog_data->operate[3], FALSE);
3332 gtk_widget_show_all (dialog_data->operate[3]);
3333
3334 path = gtk_tree_model_get_path(model, &iter);
3335 string = gtk_tree_path_to_string (path);
3336 // g_debug ("update_key_info(): got string = %s", string);
3337 indices = split_string(string, ":", -1);
3338 #ifdef SAFEMODE
3339 if (indices)
3340 {
3341 #endif
3342 if (indices[0]==NULL) goto FINISH;
3343 if (indices[1]==NULL)
3344 {
3345 dialog_data->current_key_index = -1;
3346 set_markup_key_value(TRUE, "dark green", "", dialog_data->operate[1]);
3347 set_markup_key_value(TRUE, "blue", "", dialog_data->operate[2]);
3348 }
3349 else
3350 {
3351 dialog_data->current_key_index = dialog_data->KeyTree[atoi(indices[0])][atoi(indices[1])];
3352 // g_debug("KeyTree[%d][%d] = %d",
3353 // atoi(indices[0]), atoi(indices[1]), dialog_data->current_key_index);
3354 set_markup_key_value(TRUE, "dark green",
3355 system_keys[dialog_data->current_key_index].translation,
3356 dialog_data->operate[1]);
3357 // g_debug("dialog_data->current_key_index = %d, "
3358 // "dialog_data->user_key_value[dialog_data->current_key_index] = %s",
3359 // dialog_data->current_key_index,
3360 // dialog_data->user_key_value[dialog_data->current_key_index]);
3361 gchar *user_key_value = dialog_data->user_key_value[dialog_data->current_key_index];
3362 if ((user_key_value==NULL) || (user_key_value[0]=='\0'))
3363 user_key_value = _("(Disabled)");
3364 set_markup_key_value(TRUE, "blue", user_key_value, dialog_data->operate[2]);
3365 }
3366
3367 gchar *group_name = key_groups[atoi(indices[0])];
3368 set_markup_key_value(TRUE, NULL,
3369 group_name,
3370 dialog_data->operate[0]);
3371 gchar *disable_text = g_strdup_printf(_("Disable all the function keys of [%s] group."),
3372 group_name);
3373 gtk_button_set_label(GTK_BUTTON(dialog_data->operate[3]), disable_text);
3374 g_free(disable_text);
3375 #ifdef SAFEMODE
3376 }
3377 #endif
3378 }
3379
3380 FINISH:
3381 if (path) gtk_tree_path_free(path);
3382 if (string) g_free(string);
3383 if (indices) g_strfreev(indices);
3384 return;
3385 }
3386
clear_key_groups(struct Dialog * dialog_data,gboolean clear_all)3387 void clear_key_groups(struct Dialog *dialog_data, gboolean clear_all)
3388 {
3389 #ifdef DETAIL
3390 g_debug("! Launch clear_key_groups() with dialog_data = %p, clear_all = %d!", dialog_data, clear_all);
3391 #endif
3392 #ifdef SAFEMODE
3393 if ((dialog_data==NULL) || (dialog_data->treeview==NULL))return;
3394 #endif
3395 GtkTreeModel *model = gtk_tree_view_get_model(GTK_TREE_VIEW(dialog_data->treeview));
3396 GtkTreeSelection *treeselection = gtk_tree_view_get_selection (GTK_TREE_VIEW(dialog_data->treeview));
3397 GtkTreeIter iter_child;
3398 gint current_key_group = -1;
3399
3400 if (dialog_data->current_key_index > -1) current_key_group = system_keys[dialog_data->current_key_index].group;
3401
3402 gboolean iter_is_child = FALSE;
3403 GtkTreeIter iter, iter_parent;
3404
3405 if (gtk_tree_selection_get_selected (treeselection, &model, &iter_child))
3406 // theck if the selected item is "group" or "key"
3407 iter_is_child = gtk_tree_model_iter_parent (model, &iter_parent, &iter_child);
3408
3409 else
3410 // if nothing is selected, return!
3411 if (clear_all == FALSE) return;
3412
3413 if (iter_is_child)
3414 set_markup_key_value(TRUE, "blue", _("(Disabled)"), dialog_data->operate[2]);
3415 else
3416 set_markup_key_value(TRUE, "blue", "", dialog_data->operate[2]);
3417
3418
3419 if (clear_all)
3420 // call clean_model_foreach for each entry
3421 gtk_tree_model_foreach(model, clean_model_foreach, NULL);
3422 else
3423 {
3424 // if the selected item is "group"...
3425 if (! iter_is_child)
3426 {
3427 iter_parent = iter_child;
3428
3429 // Trying to find out 'dialog_data->current_key_index'
3430 GtkTreePath *path = gtk_tree_model_get_path(model, &iter_child);
3431 gchar *string = gtk_tree_path_to_string (path);
3432 // g_debug ("update_key_info(): got string = %s", string);
3433 current_key_group = atoi(string);
3434 gtk_tree_path_free(path);
3435 g_free(string);
3436 }
3437
3438 gint i, child = gtk_tree_model_iter_n_children (model, &iter_parent);
3439 // clear entries of the group
3440 for (i=0; i< child; i++)
3441 {
3442 if (gtk_tree_model_iter_nth_child (model, &iter, &iter_parent, i))
3443 gtk_tree_store_set (GTK_TREE_STORE (model), &iter, 1, "", -1);
3444 #ifdef SAFEMODE
3445 else
3446 break;
3447 #endif
3448 }
3449 }
3450
3451 #ifdef SAFEMODE
3452 // it should be happen...
3453 if ((clear_all== FALSE) && (current_key_group < 0)) return;
3454 #endif
3455
3456 gint i;
3457 for (i=0; i<KEYS; i++)
3458 {
3459 if (clear_all || (system_keys[i].group == current_key_group))
3460 {
3461 g_free(dialog_data->user_key_value[i]);
3462 dialog_data->user_key_value[i] = g_strdup("");
3463 }
3464 }
3465 }
3466
clean_model_foreach(GtkTreeModel * model,GtkTreePath * path,GtkTreeIter * iter,gpointer userdata)3467 gboolean clean_model_foreach(GtkTreeModel *model, GtkTreePath *path, GtkTreeIter *iter, gpointer userdata)
3468 {
3469 #ifdef DETAIL
3470 g_debug("! Launch clean_model_foreach() with model= %p, path = %p, iter = %p!", model, path, iter);
3471 #endif
3472 #ifdef SAFEMODE
3473 if (model==NULL) return FALSE;
3474 #endif
3475 if (gtk_tree_model_iter_has_child (model, iter) == FALSE)
3476 gtk_tree_store_set (GTK_TREE_STORE (model), iter, 1, "", -1);
3477 return FALSE;
3478 }
3479
3480
clear_key_group(GtkButton * button,struct Dialog * dialog_data)3481 void clear_key_group(GtkButton *button, struct Dialog *dialog_data)
3482 {
3483 #ifdef DETAIL
3484 g_debug("! Launch clear_key_group() with button = %p, dialog_data = %p!", button, dialog_data);
3485 #endif
3486 clear_key_groups(dialog_data, FALSE);
3487 }
3488
clear_key_group_all(GtkButton * button,struct Dialog * dialog_data)3489 void clear_key_group_all(GtkButton *button, struct Dialog *dialog_data)
3490 {
3491 #ifdef DETAIL
3492 g_debug("! Launch clear_key_group_all() with button = %p, dialog_data = %p!", button, dialog_data);
3493 #endif
3494 clear_key_groups(dialog_data, TRUE);
3495 }
3496
add_text_to_notebook(GtkWidget * notebook,const gchar * label,const gchar * stock_id,const gchar * text)3497 GtkWidget *add_text_to_notebook(GtkWidget *notebook, const gchar *label, const gchar *stock_id, const gchar *text)
3498 {
3499 #ifdef DETAIL
3500 g_debug("! Launch add_text_to_notebook() with notebook = %p, label = %s, stock_id = %s, text = %s",
3501 notebook, label, stock_id, text);
3502 #endif
3503 #ifdef SAFEMODE
3504 if (notebook==NULL) return NULL;
3505 #endif
3506 GtkWidget *text_label = create_label_with_text(NULL, TRUE, TRUE, 0, text);
3507 #ifdef SAFEMODE
3508 if (text_label==NULL) return NULL;
3509 #endif
3510 set_widget_can_not_get_focus(text_label);
3511
3512 GtkWidget *hbox = gtk_hbox_new(FALSE, 0);
3513 gtk_container_set_border_width(GTK_CONTAINER(hbox), 10);
3514 gtk_box_pack_start(GTK_BOX(hbox), text_label, TRUE, TRUE, 0);
3515
3516 GtkWidget *label_hbox = gtk_hbox_new(FALSE, 0);
3517 set_widget_thickness(label_hbox, 0);
3518 GtkWidget *image = gtk_image_new_from_stock(stock_id, GTK_ICON_SIZE_MENU);
3519 gtk_box_pack_start(GTK_BOX(label_hbox), image, FALSE, FALSE, 0);
3520 GtkWidget *label_text = gtk_label_new(label);
3521 gtk_box_pack_start(GTK_BOX(label_hbox), label_text, TRUE, TRUE, 0);
3522 gtk_widget_show_all(label_hbox);
3523
3524 gtk_notebook_append_page(GTK_NOTEBOOK(notebook), hbox, label_hbox);
3525
3526 return text_label;
3527 }
3528
show_usage_text(GtkWidget * notebook,gpointer page,guint page_num,struct Dialog * dialog_data)3529 void show_usage_text(GtkWidget *notebook, gpointer page, guint page_num, struct Dialog *dialog_data)
3530 {
3531 #ifdef DETAIL
3532 g_debug("! Launch show_usage_text() with notebook = %p, page = %p, page_num = %d, dialog_data = %p",
3533 notebook, page, page_num, dialog_data);
3534 #endif
3535 #ifdef SAFEMODE
3536 if (dialog_data==NULL) return;
3537 #endif
3538 gint i;
3539 for (i=0; i<5; i++)
3540 {
3541 #ifdef SAFEMODE
3542 if (dialog_data->operate[i]==NULL) continue;
3543 #endif
3544 if (i==page_num)
3545 gtk_widget_set_no_show_all(dialog_data->operate[i], FALSE);
3546 else
3547 {
3548 gtk_widget_set_no_show_all(dialog_data->operate[i], TRUE);
3549 gtk_widget_hide(dialog_data->operate[i]);
3550 }
3551 }
3552 #ifdef SAFEMODE
3553 if (dialog_data->window)
3554 #endif
3555 gtk_widget_show_all(dialog_data->window);
3556 }
3557
3558 //void err_page_data_is_null(gchar *function_name)
3559 //{
3560 // gchar *err_msg = g_strdup_printf("%s: page_data = NULL\n\n"
3561 // "Please report bug to %s, Thanks!",
3562 // function_name,
3563 // BUGREPORT);
3564 // error_dialog(NULL, err_msg, NULL, ERROR_MESSAGES);
3565 //#ifdef DETAIL
3566 // g_debug("* free err_msg %p (%s) in set_encoding()", err_msg, err_msg);
3567 //#endif
3568 // g_free(err_msg);
3569 //}
3570