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