2 * Dialog box for layout preferences
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
29 #include <epan/prefs.h>
33 #include "ui/ui_util.h"
35 #include "ui/gtk/prefs_layout.h"
36 #include "ui/gtk/gtkglobals.h"
37 #include "ui/gtk/prefs_dlg.h"
38 #include "ui/gtk/main_titlebar.h"
39 #include "ui/gtk/gui_utils.h"
40 #include "ui/gtk/main.h"
41 #include "ui/gtk/dlg_utils.h"
45 #define LAYOUT_QTY (layout_type_max - 1)
48 static void layout_validate_cb(GtkWidget
*rb
, gpointer data
);
49 static gint
fetch_enum_value(gpointer control
, const enum_val_t
*enumvals
);
54 layout_pane_content_e content
[3];
58 #define LAYOUT_TYPE_BUTTONS_KEY "layout_type_buttons"
60 #define LAYOUT_NONE_RB_KEY "layout_none_radio_button"
61 #define LAYOUT_PLIST_RB_KEY "layout_plist_radio_button"
62 #define LAYOUT_PDETAILS_RB_KEY "layout_pdetails_radio_button"
63 #define LAYOUT_PBYTES_RB_KEY "layout_pbytes_radio_button"
65 #define LAYOUT_CONTENT1_VB_KEY "layout_content1_vbox"
66 #define LAYOUT_CONTENT2_VB_KEY "layout_content2_vbox"
67 #define LAYOUT_CONTENT3_VB_KEY "layout_content3_vbox"
69 #define LAYOUT_PANE_KEY "layout_pane"
72 static GtkWidget
*layout_content_radio_vbox(GtkWidget
*main_vb
, int i
, layout_pane_content_e content
) {
73 GtkWidget
*radio_vb
, *radio_lb
;
74 GtkWidget
*radio_none_rb
, *radio_plist_rb
, *radio_pdetails_rb
, *radio_pbytes_rb
;
79 radio_vb
= ws_gtk_box_new(GTK_ORIENTATION_VERTICAL
, 0, FALSE
);
80 gtk_container_set_border_width(GTK_CONTAINER(radio_vb
), 6);
82 g_snprintf (buf
, sizeof(buf
), "Pane %d:", i
);
83 radio_lb
= gtk_label_new(buf
);
84 gtk_misc_set_alignment(GTK_MISC(radio_lb
), 0.0f
, 0.5f
);
85 gtk_container_add(GTK_CONTAINER(radio_vb
), radio_lb
);
87 radio_plist_rb
= gtk_radio_button_new_with_mnemonic_from_widget(NULL
, "Packet List");
88 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_plist_rb
), content
== layout_pane_content_plist
);
89 gtk_widget_set_tooltip_text (radio_plist_rb
, "Put the packet list in this pane.");
90 gtk_container_add(GTK_CONTAINER(radio_vb
), radio_plist_rb
);
92 radio_pdetails_rb
= gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(radio_plist_rb
), "Packet Details");
93 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_pdetails_rb
), content
== layout_pane_content_pdetails
);
94 gtk_widget_set_tooltip_text (radio_pdetails_rb
, "Put the packet details tree in this pane.");
95 gtk_container_add(GTK_CONTAINER(radio_vb
), radio_pdetails_rb
);
97 radio_pbytes_rb
= gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(radio_plist_rb
), "Packet Bytes");
98 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_pbytes_rb
), content
== layout_pane_content_pbytes
);
99 gtk_widget_set_tooltip_text (radio_pbytes_rb
, "Put the packet bytes dump in this pane.");
100 gtk_container_add(GTK_CONTAINER(radio_vb
), radio_pbytes_rb
);
102 radio_none_rb
= gtk_radio_button_new_with_mnemonic_from_widget(GTK_RADIO_BUTTON(radio_plist_rb
), "None");
103 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_none_rb
), content
== layout_pane_content_none
);
104 gtk_widget_set_tooltip_text (radio_none_rb
, "Put nothing in this pane.");
105 gtk_container_add(GTK_CONTAINER(radio_vb
), radio_none_rb
);
107 g_object_set_data(G_OBJECT(radio_vb
), LAYOUT_PLIST_RB_KEY
, radio_plist_rb
);
108 g_object_set_data(G_OBJECT(radio_vb
), LAYOUT_PDETAILS_RB_KEY
, radio_pdetails_rb
);
109 g_object_set_data(G_OBJECT(radio_vb
), LAYOUT_PBYTES_RB_KEY
, radio_pbytes_rb
);
110 g_object_set_data(G_OBJECT(radio_vb
), LAYOUT_NONE_RB_KEY
, radio_none_rb
);
112 g_object_set_data(G_OBJECT(radio_plist_rb
), LAYOUT_PANE_KEY
, GINT_TO_POINTER(i
));
113 g_object_set_data(G_OBJECT(radio_pdetails_rb
), LAYOUT_PANE_KEY
, GINT_TO_POINTER(i
));
114 g_object_set_data(G_OBJECT(radio_pbytes_rb
), LAYOUT_PANE_KEY
, GINT_TO_POINTER(i
));
115 g_object_set_data(G_OBJECT(radio_none_rb
), LAYOUT_PANE_KEY
, GINT_TO_POINTER(-1));
117 g_signal_connect(radio_plist_rb
, "toggled", G_CALLBACK(layout_validate_cb
), main_vb
);
118 g_signal_connect(radio_pdetails_rb
, "toggled", G_CALLBACK(layout_validate_cb
), main_vb
);
119 g_signal_connect(radio_pbytes_rb
, "toggled", G_CALLBACK(layout_validate_cb
), main_vb
);
120 g_signal_connect(radio_none_rb
, "toggled", G_CALLBACK(layout_validate_cb
), main_vb
);
126 layout_type_changed_cb (GtkToggleButton
* togglebutton
, gpointer user_data
)
128 GtkWidget
** layout_type_buttons
= (GtkWidget
**) user_data
;
129 static gboolean dampen_feedback_loop
= FALSE
;
131 if (!dampen_feedback_loop
) {
133 dampen_feedback_loop
= TRUE
;
134 for (i
=0; i
<LAYOUT_QTY
; ++i
) {
135 GtkToggleButton
* tb
= GTK_TOGGLE_BUTTON(layout_type_buttons
[i
]);
136 gboolean active
= togglebutton
==tb
;
137 if (gtk_toggle_button_get_active(tb
) != active
)
138 gtk_toggle_button_set_active (tb
, active
);
140 dampen_feedback_loop
= FALSE
;
145 static layout_pane_content_e
layout_pane_get_content(GtkWidget
* radio_vb
) {
147 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(radio_vb
), LAYOUT_NONE_RB_KEY
))))
148 return layout_pane_content_none
;
149 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(radio_vb
), LAYOUT_PLIST_RB_KEY
))))
150 return layout_pane_content_plist
;
151 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(radio_vb
), LAYOUT_PDETAILS_RB_KEY
))))
152 return layout_pane_content_pdetails
;
153 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(radio_vb
), LAYOUT_PBYTES_RB_KEY
))))
154 return layout_pane_content_pbytes
;
156 g_assert_not_reached();
157 return (layout_pane_content_e
)-1;
160 static void layout_pane_set_content(GtkWidget
* radio_vb
, layout_pane_content_e pane_content
) {
163 switch(pane_content
) {
164 case(layout_pane_content_none
):
165 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(radio_vb
), LAYOUT_NONE_RB_KEY
)), TRUE
);
167 case(layout_pane_content_plist
):
168 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(radio_vb
), LAYOUT_PLIST_RB_KEY
)), TRUE
);
170 case(layout_pane_content_pdetails
):
171 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(radio_vb
), LAYOUT_PDETAILS_RB_KEY
)), TRUE
);
173 case(layout_pane_content_pbytes
):
174 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(g_object_get_data(G_OBJECT(radio_vb
), LAYOUT_PBYTES_RB_KEY
)), TRUE
);
177 g_assert_not_reached();
183 static void layout_set(GtkWidget
* main_vb
, layout_t
*layout
) {
185 GtkWidget
** layout_type_buttons
= (GtkWidget
**)g_object_get_data(G_OBJECT(main_vb
), LAYOUT_TYPE_BUTTONS_KEY
);
187 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(layout_type_buttons
[layout
->type
- 1]), TRUE
);
189 radio_vb
= (GtkWidget
*)g_object_get_data(G_OBJECT(main_vb
), LAYOUT_CONTENT1_VB_KEY
);
190 layout_pane_set_content(radio_vb
, layout
->content
[0]);
191 radio_vb
= (GtkWidget
*)g_object_get_data(G_OBJECT(main_vb
), LAYOUT_CONTENT2_VB_KEY
);
192 layout_pane_set_content(radio_vb
, layout
->content
[1]);
193 radio_vb
= (GtkWidget
*)g_object_get_data(G_OBJECT(main_vb
), LAYOUT_CONTENT3_VB_KEY
);
194 layout_pane_set_content(radio_vb
, layout
->content
[2]);
197 static void layout_get(GtkWidget
* main_vb
, layout_t
*layout_out
) {
199 GtkWidget
** layout_type_buttons
= (GtkWidget
**)g_object_get_data(G_OBJECT(main_vb
), LAYOUT_TYPE_BUTTONS_KEY
);
202 for (i
=0; i
<LAYOUT_QTY
; ++i
) {
203 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(layout_type_buttons
[i
]))) {
204 layout_out
->type
= (layout_type_e
)(i
+ 1);
209 radio_vb
= (GtkWidget
*)g_object_get_data(G_OBJECT(main_vb
), LAYOUT_CONTENT1_VB_KEY
);
210 layout_out
->content
[0] = layout_pane_get_content(radio_vb
);
211 radio_vb
= (GtkWidget
*)g_object_get_data(G_OBJECT(main_vb
), LAYOUT_CONTENT2_VB_KEY
);
212 layout_out
->content
[1] = layout_pane_get_content(radio_vb
);
213 radio_vb
= (GtkWidget
*)g_object_get_data(G_OBJECT(main_vb
), LAYOUT_CONTENT3_VB_KEY
);
214 layout_out
->content
[2] = layout_pane_get_content(radio_vb
);
217 static void layout_validate(layout_t
*layout
, int pane
) {
221 if(layout
->content
[1] == layout
->content
[0]) {
222 layout
->content
[1] = layout_pane_content_none
;
224 if(layout
->content
[2] == layout
->content
[0]) {
225 layout
->content
[2] = layout_pane_content_none
;
229 if(layout
->content
[0] == layout
->content
[1]) {
230 layout
->content
[0] = layout_pane_content_none
;
232 if(layout
->content
[2] == layout
->content
[1]) {
233 layout
->content
[2] = layout_pane_content_none
;
237 if(layout
->content
[0] == layout
->content
[2]) {
238 layout
->content
[0] = layout_pane_content_none
;
240 if(layout
->content
[1] == layout
->content
[2]) {
241 layout
->content
[1] = layout_pane_content_none
;
245 /* If the user selects "None" we're not going to intervene. */
252 static void layout_validate_cb(GtkWidget
*rb
, gpointer data
) {
253 int pane
= GPOINTER_TO_INT(g_object_get_data(G_OBJECT(rb
), LAYOUT_PANE_KEY
));
256 layout_get((GtkWidget
*)data
, &layout
);
257 layout_validate(&layout
, pane
);
258 layout_set((GtkWidget
*)data
, &layout
);
262 layout_defaults_cb (GtkWidget
* w _U_
, gpointer data
)
264 layout_t default_layout
= {
267 layout_pane_content_plist
,
268 layout_pane_content_pdetails
,
269 layout_pane_content_pbytes
273 layout_set((GtkWidget
*)data
, &default_layout
);
276 #define ALTERN_COLORS_KEY "altern_colors"
277 #define HEX_DUMP_HIGHLIGHT_STYLE_KEY "hex_dump_highlight_style"
278 #define FILTER_TOOLBAR_PLACEMENT_KEY "filter_toolbar_show_in_statusbar"
279 #define GUI_TOOLBAR_STYLE_KEY "toolbar_style"
280 #define GUI_FILTER_TOOLBAR_STYLE_KEY "filter_toolbar_style"
281 #define GUI_WINDOW_TITLE_KEY "window_title"
283 static const enum_val_t altern_colors_vals
[] = {
284 { "FALSE", "No", FALSE
},
285 { "TRUE", "Yes", TRUE
},
288 static const enum_val_t highlight_style_vals
[] = {
289 { "FALSE", "Bold", FALSE
},
290 { "TRUE", "Inverse", TRUE
},
293 static const enum_val_t filter_toolbar_placement_vals
[] = {
294 { "FALSE", "Below the main toolbar", FALSE
},
295 { "TRUE", "Insert into statusbar", TRUE
},
298 static const enum_val_t toolbar_style_vals
[] = {
299 { "ICONS", "Icons only", TB_STYLE_ICONS
},
300 { "TEXT", "Text only", TB_STYLE_TEXT
},
301 { "BOTH", "Icons & Text", TB_STYLE_BOTH
},
306 layout_prefs_show(void)
308 GtkWidget
*main_vb
, *button_hb
, *type_tb
;
309 GtkWidget
*pane_fr
, *pane_vb
;
310 GtkWidget
*radio_hb
, *radio_vb
;
311 GtkWidget
*default_vb
, *default_bt
;
312 GtkWidget
*main_grid
, *hbox
;
313 GtkWidget
*altern_colors_om
;
314 GtkWidget
*highlight_style_om
;
315 GtkWidget
*toolbar_style_om
;
316 GtkWidget
*filter_toolbar_style_om
;
317 GtkWidget
*filter_toolbar_placement_om
;
318 GtkWidget
*window_title_te
;
320 GtkWidget
** layout_type_buttons
= (GtkWidget
**)g_malloc (sizeof(GtkWidget
*) * LAYOUT_QTY
);
321 GtkWidget
*layout_pixbufs
[LAYOUT_QTY
];
327 /* main vertical box */
328 main_vb
= ws_gtk_box_new(GTK_ORIENTATION_VERTICAL
, 7, FALSE
);
329 gtk_container_set_border_width(GTK_CONTAINER(main_vb
), 5);
332 pane_fr
= gtk_frame_new("Panes");
333 gtk_box_pack_start(GTK_BOX(main_vb
), pane_fr
, FALSE
, FALSE
, 0);
334 gtk_widget_show(pane_fr
);
336 /* pane vertical box */
337 pane_vb
= ws_gtk_box_new(GTK_ORIENTATION_VERTICAL
, 7, FALSE
);
338 gtk_container_set_border_width(GTK_CONTAINER(pane_vb
), 5);
339 gtk_container_add(GTK_CONTAINER(pane_fr
), pane_vb
);
340 gtk_widget_show(pane_vb
);
343 button_hb
= ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL
, 0, FALSE
);
344 gtk_container_set_border_width(GTK_CONTAINER(button_hb
), 6);
345 gtk_box_pack_start (GTK_BOX(pane_vb
), button_hb
, FALSE
, FALSE
, 0);
348 layout_pixbufs
[0] = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_inline(-1, layout_5_pb_data
, FALSE
, NULL
));
349 layout_pixbufs
[1] = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_inline(-1, layout_2_pb_data
, FALSE
, NULL
));
350 layout_pixbufs
[2] = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_inline(-1, layout_1_pb_data
, FALSE
, NULL
));
351 layout_pixbufs
[3] = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_inline(-1, layout_4_pb_data
, FALSE
, NULL
));
352 layout_pixbufs
[4] = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_inline(-1, layout_3_pb_data
, FALSE
, NULL
));
353 layout_pixbufs
[5] = gtk_image_new_from_pixbuf(gdk_pixbuf_new_from_inline(-1, layout_6_pb_data
, FALSE
, NULL
));
354 for (i
=0; i
<LAYOUT_QTY
; ++i
)
356 type_tb
= gtk_toggle_button_new ();
357 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(type_tb
),
358 (layout_type_e
)(i
+ 1) == prefs
.gui_layout_type
);
360 gtk_container_add (GTK_CONTAINER(type_tb
), layout_pixbufs
[i
]);
362 g_signal_connect(type_tb
, "toggled", G_CALLBACK(layout_type_changed_cb
), layout_type_buttons
);
363 layout_type_buttons
[i
] = type_tb
;
364 gtk_box_pack_start (GTK_BOX(button_hb
), type_tb
, TRUE
, FALSE
, 0);
367 g_object_set_data(G_OBJECT(main_vb
), LAYOUT_TYPE_BUTTONS_KEY
, layout_type_buttons
);
370 radio_hb
= ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL
, 0, FALSE
);
371 gtk_container_set_border_width(GTK_CONTAINER(radio_hb
), 6);
372 gtk_box_pack_start (GTK_BOX(pane_vb
), radio_hb
, FALSE
, FALSE
, 0);
374 radio_vb
= layout_content_radio_vbox(main_vb
, 1, prefs
.gui_layout_content_1
);
375 gtk_container_set_border_width(GTK_CONTAINER(radio_vb
), 6);
376 gtk_box_pack_start (GTK_BOX(radio_hb
), radio_vb
, FALSE
, FALSE
, 0);
377 g_object_set_data(G_OBJECT(main_vb
), LAYOUT_CONTENT1_VB_KEY
, radio_vb
);
379 radio_vb
= layout_content_radio_vbox(main_vb
, 2, prefs
.gui_layout_content_2
);
380 gtk_container_set_border_width(GTK_CONTAINER(radio_vb
), 6);
381 gtk_box_pack_start (GTK_BOX(radio_hb
), radio_vb
, FALSE
, FALSE
, 0);
382 g_object_set_data(G_OBJECT(main_vb
), LAYOUT_CONTENT2_VB_KEY
, radio_vb
);
384 radio_vb
= layout_content_radio_vbox(main_vb
, 3, prefs
.gui_layout_content_3
);
385 gtk_container_set_border_width(GTK_CONTAINER(radio_vb
), 6);
386 gtk_box_pack_start (GTK_BOX(radio_hb
), radio_vb
, FALSE
, FALSE
, 0);
387 g_object_set_data(G_OBJECT(main_vb
), LAYOUT_CONTENT3_VB_KEY
, radio_vb
);
389 default_vb
= ws_gtk_box_new(GTK_ORIENTATION_VERTICAL
, 0, FALSE
);
390 default_bt
= gtk_button_new_with_label("Default panes");
391 gtk_widget_set_tooltip_text (default_bt
, "Reset the pane layout settings to default values.");
392 g_signal_connect(default_bt
, "clicked", G_CALLBACK(layout_defaults_cb
), main_vb
);
393 gtk_box_pack_end(GTK_BOX(default_vb
), default_bt
, FALSE
, FALSE
, 0);
394 gtk_box_pack_end(GTK_BOX(radio_hb
), default_vb
, FALSE
, FALSE
, 0);
396 /* Main horizontal box */
397 /* XXX - Is there a better way to center the grid ? */
398 hbox
= ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL
, 7, FALSE
);
399 gtk_box_pack_start (GTK_BOX(main_vb
), hbox
, TRUE
, FALSE
, 0);
402 main_grid
= ws_gtk_grid_new();
403 gtk_box_pack_start( GTK_BOX(hbox
), main_grid
, FALSE
, FALSE
, 0 );
404 ws_gtk_grid_set_row_spacing( GTK_GRID(main_grid
), 10 );
405 ws_gtk_grid_set_column_spacing( GTK_GRID(main_grid
), 15 );
407 /* Alternating row colors in list and tree views */
408 altern_colors_om
= create_preference_option_menu(main_grid
, pos
++,
409 "Alternating row colors in lists and trees:",
410 "Select whether or not the rows of lists and trees have alternating color.",
411 altern_colors_vals
, prefs
.gui_altern_colors
);
412 g_object_set_data(G_OBJECT(main_vb
), ALTERN_COLORS_KEY
, altern_colors_om
);
414 /* Packet Bytes Dump highlight style */
415 highlight_style_om
= create_preference_option_menu(main_grid
, pos
++,
416 "Packet bytes highlight style:",
417 "Select the style in which the packet bytes dump will be displayed.",
418 highlight_style_vals
, prefs
.gui_hex_dump_highlight_style
);
419 g_object_set_data(G_OBJECT(main_vb
), HEX_DUMP_HIGHLIGHT_STYLE_KEY
, highlight_style_om
);
422 toolbar_style_om
= create_preference_option_menu(main_grid
, pos
++,
424 "Select the style in which the toolbar will be displayed.",
425 toolbar_style_vals
, prefs
.gui_toolbar_main_style
);
426 g_object_set_data(G_OBJECT(main_vb
), GUI_TOOLBAR_STYLE_KEY
, toolbar_style_om
);
428 /* Filter toolbar prefs */
429 filter_toolbar_style_om
= create_preference_option_menu(main_grid
, pos
++,
430 "Filter toolbar style:",
431 "Select the style in which the filter toolbar will be displayed.",
432 toolbar_style_vals
, prefs
.gui_toolbar_filter_style
);
433 g_object_set_data(G_OBJECT(main_vb
), GUI_FILTER_TOOLBAR_STYLE_KEY
, filter_toolbar_style_om
);
435 /* Placement of Filter toolbar */
436 filter_toolbar_placement_om
= create_preference_option_menu(main_grid
, pos
++,
437 "Filter toolbar placement:",
438 "Select where the filter toolbar will be displayed.",
439 filter_toolbar_placement_vals
, prefs
.filter_toolbar_show_in_statusbar
);
440 g_object_set_data(G_OBJECT(main_vb
), FILTER_TOOLBAR_PLACEMENT_KEY
, filter_toolbar_placement_om
);
443 window_title_te
= create_preference_entry(main_grid
, pos
++,
444 "Custom window title (appended to existing titles):",
445 "Enter the text to be appended to the window title.",
446 prefs
.gui_window_title
);
447 gtk_entry_set_text(GTK_ENTRY(window_title_te
), prefs
.gui_window_title
);
448 g_object_set_data(G_OBJECT(main_vb
), GUI_WINDOW_TITLE_KEY
, window_title_te
);
450 /* Show 'em what we got */
451 gtk_widget_show_all(main_vb
);
457 fetch_enum_value(gpointer control
, const enum_val_t
*enumvals
)
459 return fetch_preference_option_menu_val(GTK_WIDGET(control
), enumvals
);
463 layout_prefs_fetch(GtkWidget
*w
)
465 layout_t layout_fetched
;
467 layout_get(w
, &layout_fetched
);
469 prefs
.gui_layout_type
= layout_fetched
.type
;
470 prefs
.gui_layout_content_1
= layout_fetched
.content
[0];
471 prefs
.gui_layout_content_2
= layout_fetched
.content
[1];
472 prefs
.gui_layout_content_3
= layout_fetched
.content
[2];
474 prefs
.gui_altern_colors
= fetch_enum_value(
475 g_object_get_data(G_OBJECT(w
), ALTERN_COLORS_KEY
), altern_colors_vals
);
476 prefs
.filter_toolbar_show_in_statusbar
= fetch_enum_value(
477 g_object_get_data(G_OBJECT(w
), FILTER_TOOLBAR_PLACEMENT_KEY
), filter_toolbar_placement_vals
);
478 prefs
.gui_hex_dump_highlight_style
= fetch_enum_value(
479 g_object_get_data(G_OBJECT(w
), HEX_DUMP_HIGHLIGHT_STYLE_KEY
), highlight_style_vals
);
480 prefs
.gui_toolbar_main_style
= fetch_enum_value(
481 g_object_get_data(G_OBJECT(w
), GUI_TOOLBAR_STYLE_KEY
), toolbar_style_vals
);
482 prefs
.gui_toolbar_filter_style
= fetch_enum_value(
483 g_object_get_data(G_OBJECT(w
), GUI_FILTER_TOOLBAR_STYLE_KEY
), toolbar_style_vals
);
485 g_free(prefs
.gui_window_title
);
486 prefs
.gui_window_title
= g_strdup(gtk_entry_get_text(
487 GTK_ENTRY(g_object_get_data(G_OBJECT(w
), GUI_WINDOW_TITLE_KEY
))));
491 layout_prefs_apply(GtkWidget
*w _U_
)
493 main_titlebar_update();
494 main_widgets_rearrange();
498 layout_prefs_destroy(GtkWidget
*main_vb
)
500 GtkWidget
** layout_type_buttons
= (GtkWidget
**)g_object_get_data(G_OBJECT(main_vb
), LAYOUT_TYPE_BUTTONS_KEY
);
502 g_free(layout_type_buttons
);