1 /* -*- c-basic-offset:2; tab-width:2; indent-tabs-mode:nil -*- */
2 
3 #include <stdio.h> /* sprintf */
4 #include <gtk/gtk.h>
5 #include <glib.h>
6 #include <pobl/bl_mem.h>
7 #include <pobl/bl_debug.h>
8 #include <pobl/bl_str.h>
9 
10 #include <c_intl.h>
11 
12 #include "mc_char_encoding.h"
13 #include "mc_auto_detect.h"
14 #include "mc_ctl.h"
15 #include "mc_color.h"
16 #include "mc_bgtype.h"
17 #include "mc_alpha.h"
18 #include "mc_tabsize.h"
19 #include "mc_logsize.h"
20 #include "mc_wordsep.h"
21 #include "mc_font.h"
22 #include "mc_space.h"
23 #include "mc_im.h"
24 #include "mc_sb_view.h"
25 #include "mc_io.h"
26 #include "mc_pty.h"
27 #include "mc_flags.h"
28 #include "mc_ratio.h"
29 #include "mc_radio.h"
30 #include "mc_char_width.h"
31 #include "mc_geometry.h"
32 #include "mc_click.h"
33 #include "mc_opentype.h"
34 
35 #if 0
36 #define __DEBUG
37 #endif
38 
39 /* --- static functions --- */
40 
41 #ifdef DEBUG
check_mem_leak(void)42 static void check_mem_leak(void) {
43   bl_mem_free_all();
44 }
45 #endif
46 
end_application(GtkWidget * widget,gpointer data)47 static void end_application(GtkWidget *widget, gpointer data) { gtk_main_quit(); }
48 
49 /*
50  *  ********  procedures when buttons are clicked  ********
51  */
52 
update(mc_io_t io)53 static int update(mc_io_t io) {
54   const char *gui = mc_get_gui();
55 
56   mc_update_char_encoding();
57   mc_update_auto_detect();
58   mc_update_color(MC_COLOR_FG);
59   if (mc_is_color_bg()) {
60     mc_update_bgtype();
61     mc_update_alpha();
62   } else {
63     /*
64      * alpha must be updated before bgtype because transparent or wall picture
65      * bgtype could change alpha from 255 to 0.
66      */
67     mc_update_alpha();
68     mc_update_bgtype();
69   }
70   mc_update_tabsize();
71   mc_update_logsize();
72   mc_update_wordsep();
73   mc_update_geometry();
74   mc_update_font_misc();
75   mc_update_space(MC_SPACE_LINE);
76   mc_update_space(MC_SPACE_LETTER);
77   mc_update_space(MC_SPACE_UNDERLINE);
78   mc_update_space(MC_SPACE_BASELINE);
79   mc_update_ratio(MC_RATIO_SCREEN_WIDTH);
80   mc_update_radio(MC_RADIO_MOD_META_MODE);
81   mc_update_radio(MC_RADIO_BELL_MODE);
82   mc_update_radio(MC_RADIO_LOG_VTSEQ);
83   mc_update_ratio(MC_RATIO_BRIGHTNESS);
84   mc_update_ratio(MC_RATIO_CONTRAST);
85   mc_update_ratio(MC_RATIO_GAMMA);
86   mc_update_ratio(MC_RATIO_FADE);
87   mc_update_im();
88   mc_update_cursor_color();
89   mc_update_substitute_color();
90   mc_update_ctl();
91   mc_update_char_width();
92   mc_update_click_interval();
93   mc_update_opentype();
94 
95   mc_update_flag_mode(MC_FLAG_COMB);
96   mc_update_flag_mode(MC_FLAG_DYNCOMB);
97   mc_update_flag_mode(MC_FLAG_RECVUCS);
98   if (strcmp(gui, "xlib") == 0) {
99     mc_update_flag_mode(MC_FLAG_CLIPBOARD);
100   }
101   mc_update_flag_mode(MC_FLAG_LOCALECHO);
102   mc_update_flag_mode(MC_FLAG_BLINKCURSOR);
103   mc_update_flag_mode(MC_FLAG_STATICBACKSCROLL);
104   mc_update_flag_mode(MC_FLAG_REGARDURIASWORD);
105   mc_update_flag_mode(MC_FLAG_OTLAYOUT);
106 
107   mc_update_radio(MC_RADIO_SB_MODE);
108 
109   if (strcmp(gui, "quartz") != 0) {
110     mc_update_color(MC_COLOR_SBFG);
111     mc_update_color(MC_COLOR_SBBG);
112     mc_update_sb_view_name();
113   }
114 
115   mc_flush(io);
116 
117   if (io == mc_io_set) {
118     mc_update_font_name(mc_io_set_font);
119     mc_update_vtcolor(mc_io_set_color);
120   } else if (io == mc_io_set_save) {
121     mc_update_font_name(mc_io_set_save_font);
122     mc_update_vtcolor(mc_io_set_save_color);
123   }
124 
125   return 1;
126 }
127 
cancel_clicked(GtkWidget * widget,gpointer data)128 static gint cancel_clicked(GtkWidget *widget, gpointer data) {
129   gtk_main_quit();
130   return FALSE;
131 }
132 
apply_clicked(GtkWidget * widget,gpointer data)133 static gint apply_clicked(GtkWidget *widget, gpointer data) {
134   update(mc_io_set);
135   return 1;
136 }
137 
saveexit_clicked(GtkWidget * widget,gpointer data)138 static gint saveexit_clicked(GtkWidget *widget, gpointer data) {
139   update(mc_io_set_save);
140   gtk_main_quit();
141   return 1;
142 }
143 
applyexit_clicked(GtkWidget * widget,gpointer data)144 static gint applyexit_clicked(GtkWidget *widget, gpointer data) {
145   update(mc_io_set);
146   gtk_main_quit();
147   return 1;
148 }
149 
larger_clicked(GtkWidget * widget,gpointer data)150 static gint larger_clicked(GtkWidget *widget, gpointer data) {
151   mc_set_str_value("fontsize", "larger");
152   mc_flush(mc_io_set);
153 
154   return 1;
155 }
156 
smaller_clicked(GtkWidget * widget,gpointer data)157 static gint smaller_clicked(GtkWidget *widget, gpointer data) {
158   mc_set_str_value("fontsize", "smaller");
159   mc_flush(mc_io_set);
160 
161   return 1;
162 }
163 
full_reset_clicked(GtkWidget * widget,gpointer data)164 static gint full_reset_clicked(GtkWidget *widget, gpointer data) {
165   mc_exec("full_reset");
166 
167   return 1;
168 }
169 
snapshot_clicked(GtkWidget * widget,gpointer data)170 static gint snapshot_clicked(GtkWidget *widget, gpointer data) {
171   mc_exec("snapshot");
172 
173   return 1;
174 }
175 
176 #ifdef USE_LIBSSH2
177 
178 #define MY_RESPONSE_RETURN 1
179 #define MY_RESPONSE_EXIT 2
180 #define MY_RESPONSE_SEND 3
181 #define MY_RESPONSE_RECV 4
182 
drag_data_received(GtkWidget * widget,GdkDragContext * context,gint x,gint y,GtkSelectionData * data,guint info,guint time)183 static void drag_data_received(GtkWidget *widget, GdkDragContext *context, gint x, gint y,
184                                GtkSelectionData *data, guint info, guint time) {
185   gchar **uris;
186   gchar *filename;
187 
188 #if GTK_CHECK_VERSION(2, 14, 0)
189   uris = g_uri_list_extract_uris(gtk_selection_data_get_data(data));
190 #else
191   uris = g_uri_list_extract_uris(data->data);
192 #endif
193   filename = g_filename_from_uri(uris[0], NULL, NULL);
194   gtk_entry_set_text(GTK_ENTRY(widget), filename);
195   g_free(filename);
196   g_strfreev(uris);
197 }
198 
ssh_scp_clicked(GtkWidget * widget,gpointer data)199 static gint ssh_scp_clicked(GtkWidget *widget, gpointer data) {
200   GtkWidget *dialog;
201   GtkWidget *content_area;
202   GtkWidget *hbox;
203   GtkWidget *label;
204   GtkWidget *local_entry;
205   GtkWidget *remote_entry;
206   gint res;
207   GtkTargetEntry local_targets[] = {
208       {"text/uri-list", 0, 0},
209   };
210 
211   gtk_widget_hide(gtk_widget_get_toplevel(widget));
212 
213   dialog = gtk_dialog_new();
214   gtk_window_set_title(GTK_WINDOW(dialog), "mlconfig");
215   gtk_dialog_add_button(GTK_DIALOG(dialog), _("Send"), MY_RESPONSE_SEND);
216   gtk_dialog_add_button(GTK_DIALOG(dialog), _("Recv"), MY_RESPONSE_RECV);
217   gtk_dialog_add_button(GTK_DIALOG(dialog), _("Return"), MY_RESPONSE_RETURN);
218   gtk_dialog_add_button(GTK_DIALOG(dialog), _("Exit"), MY_RESPONSE_EXIT);
219 
220 #if GTK_CHECK_VERSION(2, 14, 0)
221   content_area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));
222 #else
223   content_area = GTK_DIALOG(dialog)->vbox;
224 #endif
225 
226   hbox = gtk_hbox_new(FALSE, 0);
227   gtk_widget_show(hbox);
228 
229   label = gtk_label_new(_("Local"));
230   gtk_widget_show(label);
231   gtk_widget_set_size_request(label, 70, -1);
232   gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 1);
233 
234   local_entry = gtk_entry_new();
235   gtk_widget_show(local_entry);
236   gtk_widget_set_size_request(local_entry, 280, -1);
237   gtk_drag_dest_set(local_entry, GTK_DEST_DEFAULT_ALL, local_targets, 1, GDK_ACTION_COPY);
238   g_signal_connect(local_entry, "drag-data-received", G_CALLBACK(drag_data_received), NULL);
239   gtk_box_pack_start(GTK_BOX(hbox), local_entry, FALSE, FALSE, 1);
240 
241   gtk_container_add(GTK_CONTAINER(content_area), hbox);
242 
243   hbox = gtk_hbox_new(FALSE, 0);
244   gtk_widget_show(hbox);
245 
246   label = gtk_label_new(_("Remote"));
247   gtk_widget_show(label);
248   gtk_widget_set_size_request(label, 70, -1);
249   gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 1);
250 
251   remote_entry = gtk_entry_new();
252   gtk_widget_show(remote_entry);
253   gtk_widget_set_size_request(remote_entry, 280, -1);
254 
255   gtk_box_pack_start(GTK_BOX(hbox), remote_entry, FALSE, FALSE, 1);
256 
257   gtk_container_add(GTK_CONTAINER(content_area), hbox);
258 
259   while ((res = gtk_dialog_run(GTK_DIALOG(dialog))) >= MY_RESPONSE_SEND) {
260     char *cmd;
261     const gchar *local_path;
262     const gchar *remote_path;
263 
264     local_path = gtk_entry_get_text(GTK_ENTRY(local_entry));
265     remote_path = gtk_entry_get_text(GTK_ENTRY(remote_entry));
266 
267     if ((cmd = alloca(28 + strlen(local_path) + strlen(remote_path)))) {
268       char *p;
269 
270       if (res == MY_RESPONSE_SEND) {
271         if (!*local_path) {
272           bl_msg_printf(
273               "Local file path to send "
274               "is not specified.\n");
275 
276           continue;
277         }
278 
279         sprintf(cmd, "scp \"local:%s\" \"remote:%s\" UTF8", local_path, remote_path);
280       } else /* if( res == MY_RESPONSE_RECV) */
281       {
282         if (!*remote_path) {
283           bl_msg_printf(
284               "Remote file path to receive "
285               "is not specified.\n");
286 
287           continue;
288         }
289 
290         sprintf(cmd, "scp \"remote:%s\" \"local:%s\" UTF8", remote_path, local_path);
291       }
292 
293       p = cmd + strlen(cmd) - 2;
294       if (*p == '\\') {
295         /*
296          * Avoid to be parsed as follows.
297          * "local:c:\foo\bar\" => local:c:\foo\bar"
298          */
299         *(p++) = '\"';
300         *p = '\0';
301       }
302 
303       mc_exec(cmd);
304     }
305   }
306 
307   if (res == MY_RESPONSE_EXIT) {
308     gtk_main_quit();
309 
310     return FALSE;
311   } else /* if (res == MY_RESPONSE_RETURN) */
312   {
313     gtk_widget_destroy(dialog);
314     gtk_widget_show_all(gtk_widget_get_toplevel(widget));
315 
316     return TRUE;
317   }
318 }
319 
320 #endif /* USE_LIBSSH2 */
321 
pty_new_button_clicked(GtkWidget * widget,gpointer data)322 static gint pty_new_button_clicked(GtkWidget *widget, gpointer data) {
323   mc_exec("open_pty");
324   mc_flush(mc_io_set);
325   gtk_main_quit();
326 
327   return 1;
328 }
329 
pty_button_clicked(GtkWidget * widget,gpointer data)330 static gint pty_button_clicked(GtkWidget *widget, gpointer data) {
331   mc_select_pty();
332 
333   /*
334    * As soon as  pty changed, stdout is also changed, but mlconfig couldn't
335    * follow it.
336    */
337   gtk_main_quit();
338 
339   return 1;
340 }
341 
event(GtkWidget * widget,GdkEvent * event,gpointer data)342 static gboolean event(GtkWidget *widget, GdkEvent *event, gpointer data) {
343   if (event->type == GDK_FOCUS_CHANGE && !((GdkEventFocus*)event)->in) {
344     gtk_window_set_keep_above(GTK_WINDOW(widget), FALSE);
345     g_signal_handlers_disconnect_by_func(widget, event, NULL);
346   }
347 
348   return FALSE;
349 }
350 
351 /*
352  *  ********  Building GUI (lower part, independent buttons)  ********
353  */
354 
addbutton(const char * label,gint (func)(GtkWidget *,gpointer),GtkWidget * box)355 static void addbutton(const char *label, gint(func)(GtkWidget*, gpointer), GtkWidget *box) {
356   GtkWidget *button;
357   button = gtk_button_new_with_label(label);
358   g_signal_connect(button, "clicked", G_CALLBACK(func), NULL);
359   gtk_widget_show(button);
360   gtk_box_pack_start(GTK_BOX(box), button, TRUE, TRUE, 0);
361 }
362 
apply_cancel_button(void)363 static GtkWidget *apply_cancel_button(void) {
364   GtkWidget *hbox;
365 
366   hbox = gtk_hbox_new(FALSE, 5);
367   gtk_widget_show(hbox);
368 
369   addbutton(_("Save&Exit"), saveexit_clicked, hbox);
370 
371   if (!mc_io_is_file()) {
372     addbutton(_("Apply&Exit"), applyexit_clicked, hbox);
373     addbutton(_("Apply"), apply_clicked, hbox);
374   }
375 
376   addbutton(_("Cancel"), cancel_clicked, hbox);
377 
378   return hbox;
379 }
380 
font_large_small(void)381 static GtkWidget *font_large_small(void) {
382   GtkWidget *frame;
383   GtkWidget *hbox;
384 
385   frame = gtk_frame_new(_("Font size (temporary)"));
386   gtk_widget_show(frame);
387 
388   hbox = gtk_hbox_new(FALSE, 5);
389   gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
390   gtk_widget_show(hbox);
391   gtk_container_add(GTK_CONTAINER(frame), hbox);
392 
393   addbutton(_("Larger"), larger_clicked, hbox);
394   addbutton(_("Smaller"), smaller_clicked, hbox);
395 
396 #if GTK_CHECK_VERSION(2, 12, 0)
397   gtk_widget_set_tooltip_text(frame,
398                               "If you change fonts from \"Select\" button in \"Font\" tab, "
399                               "it is not recommended to change font size here.");
400 #endif
401 
402   return frame;
403 }
404 
command(void)405 static GtkWidget *command(void) {
406   GtkWidget *frame;
407   GtkWidget *hbox;
408 
409   frame = gtk_frame_new(_("Command"));
410   gtk_widget_show(frame);
411 
412   hbox = gtk_hbox_new(FALSE, 5);
413   gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
414   gtk_widget_show(hbox);
415   gtk_container_add(GTK_CONTAINER(frame), hbox);
416 
417   addbutton(_("Full reset"), full_reset_clicked, hbox);
418   addbutton(_("Snapshot"), snapshot_clicked, hbox);
419 #ifdef USE_LIBSSH2
420   addbutton(_("SCP"), ssh_scp_clicked, hbox);
421 #endif
422 
423   return frame;
424 }
425 
pty_list(void)426 static GtkWidget *pty_list(void) {
427   GtkWidget *frame;
428   GtkWidget *hbox;
429   GtkWidget *config_widget;
430 
431   if ((config_widget = mc_pty_config_widget_new()) == NULL) {
432     return NULL;
433   }
434   gtk_widget_show(config_widget);
435 
436   frame = gtk_frame_new(_("PTY List"));
437   gtk_widget_show(frame);
438 
439   hbox = gtk_hbox_new(FALSE, 5);
440   gtk_container_set_border_width(GTK_CONTAINER(hbox), 5);
441   gtk_widget_show(hbox);
442   gtk_container_add(GTK_CONTAINER(frame), hbox);
443 
444   addbutton(_(" New "), pty_new_button_clicked, hbox);
445   addbutton(_("Select"), pty_button_clicked, hbox);
446 
447   gtk_box_pack_start(GTK_BOX(hbox), config_widget, TRUE, TRUE, 0);
448 
449   return frame;
450 }
451 
452 /*
453  *  ********  Building GUI (main part, page (tab)-separated widgets)  ********
454  */
455 
show(void)456 static int show(void) {
457   GtkWidget *window;
458   GtkWidget *vbox;
459   GtkWidget *vbox2;
460   GtkWidget *hbox;
461   GtkWidget *notebook;
462   GtkWidget *frame;
463   GtkWidget *label;
464   GtkWidget *config_widget;
465   GtkWidget *separator;
466   const char *gui = mc_get_gui();
467 
468   window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
469   g_signal_connect(window, "destroy", G_CALLBACK(end_application), NULL);
470   gtk_window_set_title(GTK_WINDOW(window), _("mlterm configuration"));
471   gtk_container_set_border_width(GTK_CONTAINER(window), 0);
472 
473   vbox = gtk_vbox_new(FALSE, 10);
474   gtk_widget_show(vbox);
475   gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
476   gtk_container_add(GTK_CONTAINER(window), vbox);
477 
478   /* whole screen (except for the contents of notebook) */
479 
480   notebook = gtk_notebook_new();
481   gtk_notebook_set_tab_pos(GTK_NOTEBOOK(notebook), GTK_POS_TOP);
482   gtk_widget_show(notebook);
483   gtk_box_pack_start(GTK_BOX(vbox), notebook, TRUE, TRUE, 0);
484 
485   separator = gtk_hseparator_new();
486   gtk_widget_show(separator);
487   gtk_box_pack_start(GTK_BOX(vbox), separator, FALSE, FALSE, 0);
488 
489   hbox = apply_cancel_button();
490   gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
491 
492   hbox = gtk_hbox_new(FALSE, 0);
493   gtk_widget_show(hbox);
494   gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
495   frame = font_large_small();
496   gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 5);
497   frame = command();
498   gtk_box_pack_start(GTK_BOX(hbox), frame, TRUE, TRUE, 5);
499 
500   frame = pty_list();
501   gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
502 
503   /* contents of the "Encoding" tab */
504 
505   label = gtk_label_new(_("Encoding"));
506   gtk_widget_show(label);
507   vbox = gtk_vbox_new(FALSE, 3);
508   gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
509   gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
510   gtk_widget_show(vbox);
511 
512   config_widget = mc_char_encoding_config_widget_new();
513   gtk_widget_show(config_widget);
514   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
515 
516   config_widget = mc_auto_detect_config_widget_new();
517   gtk_widget_show(config_widget);
518   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
519 
520   config_widget = mc_im_config_widget_new();
521   gtk_widget_show(config_widget);
522   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
523 
524   config_widget = mc_ctl_config_widget_new();
525   gtk_widget_show(config_widget);
526   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
527 
528   hbox = gtk_hbox_new(FALSE, 0);
529   gtk_widget_show(hbox);
530   gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
531 
532   config_widget = mc_flag_config_widget_new(MC_FLAG_COMB);
533   gtk_widget_show(config_widget);
534   gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
535 
536   config_widget = mc_flag_config_widget_new(MC_FLAG_DYNCOMB);
537   gtk_widget_show(config_widget);
538   gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
539 
540   config_widget = mc_flag_config_widget_new(MC_FLAG_RECVUCS);
541   gtk_widget_show(config_widget);
542   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
543 
544   config_widget = mc_opentype_config_widget_new();
545   gtk_widget_show(config_widget);
546   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
547 
548   config_widget = mc_char_width_config_widget_new();
549   gtk_widget_show(config_widget);
550   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
551 
552   /* contents of the "Font" tab */
553 
554   label = gtk_label_new(_("Font"));
555   gtk_widget_show(label);
556   vbox = gtk_vbox_new(FALSE, 0);
557   gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
558   gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
559   gtk_widget_show(vbox);
560 
561   config_widget = mc_font_config_widget_new();
562   gtk_widget_show(config_widget);
563   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
564 
565   hbox = gtk_hbox_new(FALSE, 0);
566   gtk_widget_show(hbox);
567   gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
568 
569   config_widget = mc_space_config_widget_new(MC_SPACE_LINE);
570   gtk_widget_show(config_widget);
571   gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
572 
573   config_widget = mc_space_config_widget_new(MC_SPACE_LETTER);
574   gtk_widget_show(config_widget);
575   gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
576 
577   config_widget = mc_space_config_widget_new(MC_SPACE_UNDERLINE);
578   gtk_widget_show(config_widget);
579   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
580 
581   config_widget = mc_space_config_widget_new(MC_SPACE_BASELINE);
582   gtk_widget_show(config_widget);
583   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
584 
585   config_widget = mc_ratio_config_widget_new(MC_RATIO_SCREEN_WIDTH);
586   gtk_widget_show(config_widget);
587   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
588 
589   /* contents of the "Background" tab */
590 
591   label = gtk_label_new(_("Background"));
592   gtk_widget_show(label);
593   vbox = gtk_vbox_new(FALSE, 3);
594   gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
595   gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
596   gtk_widget_show(vbox);
597 
598   config_widget = mc_bgtype_config_widget_new();
599   gtk_widget_show(config_widget);
600   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
601 
602   frame = gtk_frame_new(_("Picture/Transparent"));
603   gtk_widget_show(frame);
604   gtk_box_pack_start(GTK_BOX(vbox), frame, FALSE, FALSE, 0);
605   vbox2 = gtk_vbox_new(FALSE, 3);
606   gtk_widget_show(vbox2);
607   gtk_container_add(GTK_CONTAINER(frame), vbox2);
608   hbox = gtk_hbox_new(FALSE, 0);
609   gtk_container_set_border_width(GTK_CONTAINER(hbox), 2);
610   gtk_widget_show(hbox);
611   gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0);
612 
613   config_widget = mc_ratio_config_widget_new(MC_RATIO_BRIGHTNESS);
614   gtk_widget_show(config_widget);
615   gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
616 
617   config_widget = mc_ratio_config_widget_new(MC_RATIO_GAMMA);
618   gtk_widget_show(config_widget);
619   gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
620 
621   hbox = gtk_hbox_new(FALSE, 0);
622   gtk_container_set_border_width(GTK_CONTAINER(hbox), 2);
623   gtk_widget_show(hbox);
624   gtk_box_pack_start(GTK_BOX(vbox2), hbox, FALSE, FALSE, 0);
625 
626   config_widget = mc_ratio_config_widget_new(MC_RATIO_CONTRAST);
627   gtk_widget_show(config_widget);
628   gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
629 
630   config_widget = mc_alpha_config_widget_new();
631   gtk_widget_show(config_widget);
632   gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
633 
634   config_widget = mc_ratio_config_widget_new(MC_RATIO_FADE);
635   gtk_widget_show(config_widget);
636   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
637 
638   /* contents of the "Color" tab */
639 
640   label = gtk_label_new(_("Color"));
641   gtk_widget_show(label);
642   vbox = gtk_vbox_new(FALSE, 3);
643   gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
644   gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
645   gtk_widget_show(vbox);
646 
647   config_widget = mc_cursor_color_config_widget_new();
648   gtk_widget_show(config_widget);
649   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
650 
651   config_widget = mc_substitute_color_config_widget_new();
652   gtk_widget_show(config_widget);
653   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
654 
655   config_widget = mc_vtcolor_config_widget_new();
656   gtk_widget_show(config_widget);
657   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
658 
659   /* contents of the "Scrollbar" tab */
660 
661   label = gtk_label_new(_("Scrollbar"));
662   gtk_widget_show(label);
663   vbox = gtk_vbox_new(FALSE, 3);
664   gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
665   gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
666   gtk_widget_show(vbox);
667 
668   config_widget = mc_radio_config_widget_new(MC_RADIO_SB_MODE);
669   gtk_widget_show(config_widget);
670   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
671 
672   if (strcmp(gui, "quartz") != 0) {
673     config_widget = mc_sb_view_config_widget_new();
674     gtk_widget_show(config_widget);
675     gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
676 
677     hbox = gtk_hbox_new(FALSE, 0);
678     gtk_widget_show(hbox);
679     gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
680 
681     config_widget = mc_color_config_widget_new(MC_COLOR_SBFG);
682     gtk_widget_show(config_widget);
683     gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 5);
684 
685     config_widget = mc_color_config_widget_new(MC_COLOR_SBBG);
686     gtk_widget_show(config_widget);
687     gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
688   }
689 
690   /* contents of the "Others" tab */
691 
692   label = gtk_label_new(_("Others"));
693   gtk_widget_show(label);
694   vbox = gtk_vbox_new(FALSE, 3);
695   gtk_container_set_border_width(GTK_CONTAINER(vbox), 5);
696   gtk_notebook_append_page(GTK_NOTEBOOK(notebook), vbox, label);
697   gtk_widget_show(vbox);
698 
699   hbox = gtk_hbox_new(FALSE, 0);
700   gtk_widget_show(hbox);
701   gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
702 
703   config_widget = mc_tabsize_config_widget_new();
704   gtk_widget_show(config_widget);
705   gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
706 
707   config_widget = mc_logsize_config_widget_new();
708   gtk_widget_show(config_widget);
709   gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
710 
711   hbox = gtk_hbox_new(FALSE, 0);
712   gtk_widget_show(hbox);
713   gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
714 
715   config_widget = mc_geometry_config_widget_new();
716   gtk_widget_show(config_widget);
717   gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
718 
719   config_widget = mc_wordsep_config_widget_new();
720   gtk_widget_show(config_widget);
721   gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
722 
723   config_widget = mc_click_interval_config_widget_new();
724   gtk_widget_show(config_widget);
725   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
726 
727   config_widget = mc_radio_config_widget_new(MC_RADIO_MOD_META_MODE);
728   gtk_widget_show(config_widget);
729   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
730 
731   config_widget = mc_radio_config_widget_new(MC_RADIO_BELL_MODE);
732   gtk_widget_show(config_widget);
733   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
734 
735   config_widget = mc_radio_config_widget_new(MC_RADIO_LOG_VTSEQ);
736   gtk_widget_show(config_widget);
737   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
738 
739   hbox = gtk_hbox_new(FALSE, 0);
740   gtk_widget_show(hbox);
741   gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
742 
743   if (strcmp(gui, "xlib") == 0) {
744     config_widget = mc_flag_config_widget_new(MC_FLAG_CLIPBOARD);
745     gtk_widget_show(config_widget);
746     gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
747   }
748 
749   config_widget = mc_flag_config_widget_new(MC_FLAG_LOCALECHO);
750   gtk_widget_show(config_widget);
751   gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
752 
753   config_widget = mc_flag_config_widget_new(MC_FLAG_BLINKCURSOR);
754   gtk_widget_show(config_widget);
755   gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
756 
757   config_widget = mc_flag_config_widget_new(MC_FLAG_STATICBACKSCROLL);
758   gtk_widget_show(config_widget);
759   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
760 
761   hbox = gtk_hbox_new(FALSE, 0);
762   gtk_widget_show(hbox);
763   gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
764 
765   config_widget = mc_flag_config_widget_new(MC_FLAG_REGARDURIASWORD);
766   gtk_widget_show(config_widget);
767   gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
768 
769   config_widget = mc_flag_config_widget_new(MC_FLAG_BROADCAST);
770   gtk_widget_show(config_widget);
771   gtk_box_pack_start(GTK_BOX(hbox), config_widget, FALSE, FALSE, 0);
772 
773   config_widget = mc_flag_config_widget_new(MC_FLAG_TRIMNEWLINE);
774   gtk_widget_show(config_widget);
775   gtk_box_pack_start(GTK_BOX(vbox), config_widget, FALSE, FALSE, 0);
776 
777   gtk_window_set_position(GTK_WINDOW(window), GTK_WIN_POS_MOUSE);
778 #if !GTK_CHECK_VERSION(2, 90, 0)
779   gtk_window_set_policy(GTK_WINDOW(window), 0, 0, 0);
780 #endif
781 
782   gtk_widget_show(window);
783 
784   if (strcmp(gui, "win32") == 0 || strcmp(gui, "quartz") == 0) {
785     gtk_window_set_keep_above(GTK_WINDOW(window), TRUE);
786     g_signal_connect(window, "event", G_CALLBACK(event), NULL);
787   }
788 
789   gtk_main();
790 
791   return 1;
792 }
793 
794 /* --- global functions --- */
795 
main(int argc,char ** argv)796 int main(int argc, char **argv) {
797   int is_file_io = 0;
798 
799 #ifdef DEBUG
800   atexit(check_mem_leak);
801 #endif
802 
803   /*
804    * Loading libim-*.so after gtk im module is loaded might break internal states
805    * in gtk or input method library.
806    */
807   mc_im_init();
808 
809 #if !GTK_CHECK_VERSION(2, 90, 0)
810   gtk_set_locale();
811 #endif
812 
813   bindtextdomain("mlconfig", LOCALEDIR);
814   bind_textdomain_codeset("mlconfig", "UTF-8");
815   textdomain("mlconfig");
816 
817   if (argc == 1) {
818     is_file_io = 1;
819   } else {
820     int count;
821 
822     for (count = 0; count < argc; count++) {
823 #ifdef __DEBUG
824       fprintf(stderr, "%s\n", argv[count]);
825 #endif
826 
827       if (strcmp(argv[count], "--file") == 0) {
828         is_file_io = 1;
829       }
830     }
831   }
832   mc_io_set_use_file(is_file_io);
833 
834   bl_set_msg_log_file_name("mlterm/msg.log");
835 
836   gtk_init(&argc, &argv);
837 
838   if (show() == 0) {
839     bl_msg_printf("Starting mlconfig failed.\n");
840 
841     return 1;
842   } else {
843     return 0;
844   }
845 }
846