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