HACK: pinfo->private_data points to smb_info again
[wireshark-wip.git] / ui / gtk / prefs_layout.c
blob12adf0efc780afae71da4116263398dd58d0bcbb
1 /* layout_prefs.c
2 * Dialog box for layout preferences
4 * $Id$
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.
25 #include "config.h"
27 #include <gtk/gtk.h>
29 #include <epan/prefs.h>
31 #include "cfile.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"
43 #include "layouts.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);
52 typedef struct {
53 layout_type_e type;
54 layout_pane_content_e content[3];
55 } layout_t;
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;
75 char buf[64];
78 /* radio vbox */
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);
122 return radio_vb;
125 static void
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) {
132 int i;
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);
166 break;
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);
169 break;
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);
172 break;
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);
175 break;
176 default:
177 g_assert_not_reached();
183 static void layout_set(GtkWidget * main_vb, layout_t *layout) {
184 GtkWidget *radio_vb;
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) {
198 GtkWidget *radio_vb;
199 GtkWidget ** layout_type_buttons = (GtkWidget **)g_object_get_data(G_OBJECT(main_vb), LAYOUT_TYPE_BUTTONS_KEY);
200 int i;
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);
205 break;
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) {
219 switch (pane) {
220 case 1:
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;
227 break;
228 case 2:
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;
235 break;
236 case 3:
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;
243 break;
244 default:
245 /* If the user selects "None" we're not going to intervene. */
246 break;
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));
254 layout_t layout;
256 layout_get((GtkWidget *)data, &layout);
257 layout_validate(&layout, pane);
258 layout_set((GtkWidget *)data, &layout);
261 static void
262 layout_defaults_cb (GtkWidget * w _U_, gpointer data)
264 layout_t default_layout = {
265 layout_type_5,
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 },
286 { NULL, NULL, 0 }
288 static const enum_val_t highlight_style_vals[] = {
289 { "FALSE", "Bold", FALSE },
290 { "TRUE", "Inverse", TRUE },
291 { NULL, NULL, 0 }
293 static const enum_val_t filter_toolbar_placement_vals[] = {
294 { "FALSE", "Below the main toolbar", FALSE },
295 { "TRUE", "Insert into statusbar", TRUE },
296 { NULL, NULL, 0 }
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 },
302 { NULL, NULL, 0 }
305 GtkWidget*
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];
323 int pos = 0;
324 int i;
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);
331 /* pane frame */
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);
342 /* button hbox */
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);
347 /* pane layout */
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);
369 /* radio hbox */
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);
401 /* Main grid */
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);
421 /* Toolbar prefs */
422 toolbar_style_om = create_preference_option_menu(main_grid, pos++,
423 "Toolbar style:",
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);
442 /* Window title */
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);
453 return(main_vb);
456 static gint
457 fetch_enum_value(gpointer control, const enum_val_t *enumvals)
459 return fetch_preference_option_menu_val(GTK_WIDGET(control), enumvals);
462 void
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))));
490 void
491 layout_prefs_apply(GtkWidget *w _U_)
493 main_titlebar_update();
494 main_widgets_rearrange();
497 void
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);