diff options
82 files changed, 1430 insertions, 1436 deletions
diff --git a/gtk/Makefile.am b/gtk/Makefile.am index f91adfe53e..cbd9869e2f 100644 --- a/gtk/Makefile.am +++ b/gtk/Makefile.am @@ -64,6 +64,7 @@ noinst_HEADERS = \ gtkglobals.h \ gtk_stat_util.h \ gui_prefs.h \ + gui_utils.h \ help_dlg.h \ hostlist_table.h \ isprint.h \ @@ -96,7 +97,6 @@ noinst_HEADERS = \ tap_dfilter_dlg.h \ text_page.h \ toolbar.h \ - ui_util.h \ voip_calls.h \ voip_calls_dlg.h \ webbrowser.h diff --git a/gtk/Makefile.common b/gtk/Makefile.common index 048a4b7b9b..0913d79883 100644 --- a/gtk/Makefile.common +++ b/gtk/Makefile.common @@ -67,6 +67,7 @@ ETHEREAL_GTK_SRC = \ graph_analysis.c \ gtk_stat_util.c \ gui_prefs.c \ + gui_utils.c \ help_dlg.c \ hostlist_table.c \ layout_prefs.c \ @@ -99,7 +100,6 @@ ETHEREAL_GTK_SRC = \ tap_dfilter_dlg.c \ text_page.c \ toolbar.c \ - ui_util.c \ voip_calls.c \ webbrowser.c diff --git a/gtk/about_dlg.c b/gtk/about_dlg.c index 9adf8ecd48..e6bdd77123 100644 --- a/gtk/about_dlg.c +++ b/gtk/about_dlg.c @@ -32,7 +32,7 @@ #include <epan/filesystem.h> #include <epan/plugins.h> #include "about_dlg.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "compat_macros.h" #include "globals.h" diff --git a/gtk/ansi_a_stat.c b/gtk/ansi_a_stat.c index e5351fbd20..9e3f26b7fc 100644 --- a/gtk/ansi_a_stat.c +++ b/gtk/ansi_a_stat.c @@ -53,7 +53,7 @@ #include "../globals.h" #include "filter_dlg.h" #include "compat_macros.h" -#include "ui_util.h" +#include "gui_utils.h" typedef struct column_arrows { diff --git a/gtk/ansi_map_stat.c b/gtk/ansi_map_stat.c index 370cba8813..50dbfa90e2 100644 --- a/gtk/ansi_map_stat.c +++ b/gtk/ansi_map_stat.c @@ -52,7 +52,7 @@ #include "filter_dlg.h" #include "compat_macros.h" #include <epan/dissectors/packet-ansi_map.h> -#include "ui_util.h" +#include "gui_utils.h" typedef struct column_arrows { diff --git a/gtk/bootp_stat.c b/gtk/bootp_stat.c index 5add45a336..7821e5b14b 100644 --- a/gtk/bootp_stat.c +++ b/gtk/bootp_stat.c @@ -36,7 +36,7 @@ #include <epan/stat.h> #include "stat_menu.h" #include "simple_dialog.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include <epan/tap.h> #include "../register.h" diff --git a/gtk/capture_dlg.c b/gtk/capture_dlg.c index 2688b41ebc..26bfd545fe 100644 --- a/gtk/capture_dlg.c +++ b/gtk/capture_dlg.c @@ -37,7 +37,7 @@ #include "globals.h" #include <epan/addr_resolv.h> #include "main.h" -#include "ui_util.h" +#include "gui_utils.h" #include "capture.h" #include "capture_dlg.h" #include "filter_dlg.h" diff --git a/gtk/capture_if_details_dlg.c b/gtk/capture_if_details_dlg.c index aba49ccb7a..963e0ead6b 100644 --- a/gtk/capture_if_details_dlg.c +++ b/gtk/capture_if_details_dlg.c @@ -42,7 +42,7 @@ #include "capture.h" #include "main.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "compat_macros.h" #include "help_dlg.h" diff --git a/gtk/capture_if_dlg.c b/gtk/capture_if_dlg.c index baa041a07e..2bbe1d7a86 100644 --- a/gtk/capture_if_dlg.c +++ b/gtk/capture_if_dlg.c @@ -54,7 +54,7 @@ #include "capture_dlg.h" #include "capture_if_details_dlg.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "wtap.h" diff --git a/gtk/capture_info_dlg.c b/gtk/capture_info_dlg.c index e241781c3d..1d182a33f6 100644 --- a/gtk/capture_info_dlg.c +++ b/gtk/capture_info_dlg.c @@ -41,7 +41,7 @@ #include "globals.h" #include "capture_ui_utils.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "main.h" #include "pcap-util.h" diff --git a/gtk/capture_prefs.c b/gtk/capture_prefs.c index 594d9d9527..cdbcb96da1 100644 --- a/gtk/capture_prefs.c +++ b/gtk/capture_prefs.c @@ -37,7 +37,7 @@ #include "gtkglobals.h" #include <epan/prefs.h> #include "prefs_dlg.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "simple_dialog.h" #include "pcap-util.h" diff --git a/gtk/color_dlg.c b/gtk/color_dlg.c index e35ed7c05f..3e7a0c65c2 100644 --- a/gtk/color_dlg.c +++ b/gtk/color_dlg.c @@ -40,7 +40,7 @@ #include <epan/dfilter/dfilter.h> #include "simple_dialog.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dfilter_expr_dlg.h" #include "compat_macros.h" #include "filter_dlg.h" diff --git a/gtk/column_prefs.c b/gtk/column_prefs.c index 01f058e6d4..f8367cf081 100644 --- a/gtk/column_prefs.c +++ b/gtk/column_prefs.c @@ -34,11 +34,7 @@ #include <epan/prefs.h> #include <epan/column.h> #include "compat_macros.h" -#include "ui_util.h" - -#if GTK_MAJOR_VERSION >= 2 -#include "ui_util.h" -#endif +#include "gui_utils.h" static GtkWidget *column_l, *del_bt, *title_te, *fmt_m, *up_bt, *dn_bt; static gint cur_fmt, cur_row; diff --git a/gtk/conversations_table.c b/gtk/conversations_table.c index 247271c5d4..5b6340aa3c 100644 --- a/gtk/conversations_table.c +++ b/gtk/conversations_table.c @@ -53,7 +53,7 @@ #include "gtk/color_dlg.h" #include "gtkglobals.h" #include "main.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "help_dlg.h" diff --git a/gtk/dcerpc_stat.c b/gtk/dcerpc_stat.c index abe0069c55..b473c479d4 100644 --- a/gtk/dcerpc_stat.c +++ b/gtk/dcerpc_stat.c @@ -44,7 +44,7 @@ #include "stat_menu.h" #include "simple_dialog.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include <epan/tap.h> #include "../register.h" #include <epan/dissectors/packet-dcerpc.h> diff --git a/gtk/decode_as_dcerpc.c b/gtk/decode_as_dcerpc.c index 9bc0be532a..5577a2aad6 100644 --- a/gtk/decode_as_dcerpc.c +++ b/gtk/decode_as_dcerpc.c @@ -34,7 +34,7 @@ #include "simple_dialog.h" #include <epan/packet.h> #include <epan/ipproto.h> -#include "ui_util.h" +#include "gui_utils.h" #include <epan/epan_dissect.h> #include "compat_macros.h" #include "decode_as_dcerpc.h" diff --git a/gtk/decode_as_dlg.c b/gtk/decode_as_dlg.c index 54bea4cdb4..7cc67a4902 100644 --- a/gtk/decode_as_dlg.c +++ b/gtk/decode_as_dlg.c @@ -35,7 +35,7 @@ #include "simple_dialog.h" #include <epan/packet.h> #include <epan/ipproto.h> -#include "ui_util.h" +#include "gui_utils.h" #include <epan/epan_dissect.h> #include "compat_macros.h" #include "decode_as_dcerpc.h" diff --git a/gtk/dfilter_expr_dlg.c b/gtk/dfilter_expr_dlg.c index 71d84c2c91..9084f183ee 100644 --- a/gtk/dfilter_expr_dlg.c +++ b/gtk/dfilter_expr_dlg.c @@ -49,7 +49,7 @@ #include "globals.h" #include "main.h" -#include "ui_util.h" +#include "gui_utils.h" #include "simple_dialog.h" #include "dlg_utils.h" #include "proto_dlg.h" diff --git a/gtk/dlg_utils.c b/gtk/dlg_utils.c index 72c53bd12d..88cbad70b7 100644 --- a/gtk/dlg_utils.c +++ b/gtk/dlg_utils.c @@ -34,7 +34,7 @@ #include "globals.h" #include "gtkglobals.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "keys.h" #include "compat_macros.h" diff --git a/gtk/dlg_utils.h b/gtk/dlg_utils.h index 478a7ff7ce..71118f7ee6 100644 --- a/gtk/dlg_utils.h +++ b/gtk/dlg_utils.h @@ -80,7 +80,7 @@ /** @file * Utilities for dialog boxes. Depending on the window functions in - * ui_util.h, see: @ref howto_window_page for details. + * gui_utils.h, see: @ref howto_window_page for details. * @ingroup dialog_group */ @@ -164,7 +164,7 @@ extern void set_last_open_dir(char *dirname); * @param stock_id_first the first button (e.g. GTK_STOCK_OK) * @param ... the next buttons, just like stock_id_first * @return the new button row - * @todo move this to ui_util.h + * @todo move this to gui_utils.h */ extern GtkWidget *dlg_button_row_new(const gchar *stock_id_first, ...); @@ -173,7 +173,7 @@ extern GtkWidget *dlg_button_row_new(const gchar *stock_id_first, ...); * * @param widget a widget which should be connected (usually a GtkEntry) * @param ok_button the button to be activated - * @todo move this to ui_util.h + * @todo move this to gui_utils.h */ extern void dlg_set_activate(GtkWidget *widget, GtkWidget *ok_button); diff --git a/gtk/fc_stat.c b/gtk/fc_stat.c index ce5f7f5c6c..a470b67ed5 100644 --- a/gtk/fc_stat.c +++ b/gtk/fc_stat.c @@ -46,7 +46,7 @@ #include "../timestats.h" #include "compat_macros.h" #include "../simple_dialog.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "../file.h" #include "../globals.h" diff --git a/gtk/file_dlg.c b/gtk/file_dlg.c index ac4af2fa1c..4cdcd7faa4 100644 --- a/gtk/file_dlg.c +++ b/gtk/file_dlg.c @@ -38,7 +38,7 @@ #include <epan/addr_resolv.h> #include "keys.h" #include "filter_dlg.h" -#include "ui_util.h" +#include "gui_utils.h" #include "alert_box.h" #include "simple_dialog.h" #include "menu.h" diff --git a/gtk/fileset_dlg.c b/gtk/fileset_dlg.c index 941ab8cc19..abd81d7b16 100644 --- a/gtk/fileset_dlg.c +++ b/gtk/fileset_dlg.c @@ -44,7 +44,7 @@ #include "compat_macros.h" #include "simple_dialog.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "main.h" diff --git a/gtk/filter_dlg.c b/gtk/filter_dlg.c index ec06e0de48..2568f2825b 100644 --- a/gtk/filter_dlg.c +++ b/gtk/filter_dlg.c @@ -36,7 +36,7 @@ #include "gtk/main.h" #include "filter_dlg.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "simple_dialog.h" #include "dfilter_expr_dlg.h" #include "compat_macros.h" diff --git a/gtk/find_dlg.c b/gtk/find_dlg.c index cbd5ab9f15..d7d0cfec35 100644 --- a/gtk/find_dlg.c +++ b/gtk/find_dlg.c @@ -36,7 +36,7 @@ #include <epan/strutil.h> #include "globals.h" -#include "ui_util.h" +#include "gui_utils.h" #include "find_dlg.h" #include "filter_dlg.h" #include "alert_box.h" diff --git a/gtk/flow_graph.c b/gtk/flow_graph.c index 1448ca569e..1fc5ce5d16 100644 --- a/gtk/flow_graph.c +++ b/gtk/flow_graph.c @@ -36,7 +36,7 @@ #include <epan/stat.h> #include "stat_menu.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "compat_macros.h" #include "gtkglobals.h" diff --git a/gtk/follow_dlg.c b/gtk/follow_dlg.c index 9b2fc5e5ea..5288560e69 100644 --- a/gtk/follow_dlg.c +++ b/gtk/follow_dlg.c @@ -58,7 +58,7 @@ #include <epan/addr_resolv.h> #include <epan/charsets.h> #include "util.h" -#include "ui_util.h" +#include "gui_utils.h" #include <epan/epan_dissect.h> #include <epan/filesystem.h> #include "compat_macros.h" diff --git a/gtk/goto_dlg.c b/gtk/goto_dlg.c index 259d8dd15e..d7918600e0 100644 --- a/gtk/goto_dlg.c +++ b/gtk/goto_dlg.c @@ -36,7 +36,7 @@ #include "simple_dialog.h" #include "dlg_utils.h" #include "compat_macros.h" -#include "ui_util.h" +#include "gui_utils.h" #include "help_dlg.h" /* Capture callback data keys */ diff --git a/gtk/graph_analysis.c b/gtk/graph_analysis.c index 320aa277ba..4cb874ba44 100644 --- a/gtk/graph_analysis.c +++ b/gtk/graph_analysis.c @@ -52,7 +52,7 @@ #include "gtkglobals.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "main.h" #include "compat_macros.h" #include "../color.h" diff --git a/gtk/gsm_a_stat.c b/gtk/gsm_a_stat.c index ca052c02a0..495efadbed 100644 --- a/gtk/gsm_a_stat.c +++ b/gtk/gsm_a_stat.c @@ -53,7 +53,7 @@ #include "../globals.h" #include "filter_dlg.h" #include "compat_macros.h" -#include "ui_util.h" +#include "gui_utils.h" typedef struct column_arrows { diff --git a/gtk/gsm_map_stat.c b/gtk/gsm_map_stat.c index 04b4e2aedb..715aad80cf 100644 --- a/gtk/gsm_map_stat.c +++ b/gtk/gsm_map_stat.c @@ -46,7 +46,7 @@ #include "image/clist_descend.xpm" #include "simple_dialog.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include <epan/tap.h> #include "../register.h" #include "../globals.h" diff --git a/gtk/gsm_map_summary.c b/gtk/gsm_map_summary.c index 0257edcd39..abd563e75b 100644 --- a/gtk/gsm_map_summary.c +++ b/gtk/gsm_map_summary.c @@ -43,7 +43,7 @@ #include "file.h" #include "summary.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "compat_macros.h" #include <epan/tap.h> diff --git a/gtk/gui_prefs.c b/gtk/gui_prefs.c index 91b928927d..7d2e7a378b 100644 --- a/gtk/gui_prefs.c +++ b/gtk/gui_prefs.c @@ -37,7 +37,7 @@ #include "supported_protos_dlg.h" #include <epan/prefs.h> #include "prefs_dlg.h" -#include "ui_util.h" +#include "gui_utils.h" #include "simple_dialog.h" #include "dlg_utils.h" #include "proto_draw.h" diff --git a/gtk/ui_util.c b/gtk/gui_utils.c index 0913567011..ac715ec06e 100644 --- a/gtk/ui_util.c +++ b/gtk/gui_utils.c @@ -1,1039 +1,1039 @@ -/* ui_util.c - * UI utility routines - * - * $Id$ - * - * Ethereal - Network traffic analyzer - * By Gerald Combs <gerald@ethereal.com> - * Copyright 1998 Gerald Combs - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifdef HAVE_CONFIG_H -# include "config.h" -#endif - -#include <string.h> - -#ifdef _WIN32 -#include <windows.h> -#endif - -#ifdef HAVE_IO_H -# include <io.h> -#endif - -#include <gtk/gtk.h> -#include <gdk/gdkkeysyms.h> - -#include "gtkglobals.h" -#include "ui_util.h" -#include <epan/prefs.h> -#include "epan/epan.h" -#include "../ui_util.h" -#include "compat_macros.h" -#include "recent.h" - - -#include "image/eicon3d16.xpm" - -/* XXX - remove this later again, when dlg_xx function cleanup done */ -#include "dlg_utils.h" - - -#define WINDOW_GEOM_KEY "window_geom" - - -/* load the geometry values for a window from previously saved values */ -static gboolean window_geom_load(const gchar *name, window_geometry_t *geom); - - - -/* Set our window icon. The GDK documentation doesn't provide any - actual documentation for gdk_window_set_icon(), so we'll steal - libgimp/gimpdialog.c:gimp_dialog_realize_callback() from the Gimp - sources and assume it's safe. - - XXX - The current icon size is fixed at 16x16 pixels, which looks fine - with kwm (KDE 1.x's window manager), Sawfish (the "default" window - manager for GNOME?), and under Windows with Exceed putting X windows - on the Windows desktop, using Exceed as the window manager, as those - window managers put a 16x16 icon on the title bar. - - The window managers in some windowing environments (e.g. dtwm in CDE) - and some stand-alone window managers have larger icon sizes (many window - managers put the window icon on the desktop, in the Windows 3.x style, - rather than in the titlebar, in the Windows 4.x style), so we need to - find a way to size our icon appropriately. - - The X11 Inter-Client Communications Conventions Manual, Version 1.1, - in X11R5, specifies that "a window manager that wishes to place - constraints on the sizes of icon pixmaps and/or windows should - place a property called WM_ICON_SIZE on the root"; that property - contains minimum width and height, maximum width and height, and - width and height increment values. "XGetIconSizes()" retrieves - that property; unfortunately, I've yet to find a window manager - that sets it on the root window (kwm, AfterStep, and Exceed don't - appear to set it). - - The X Desktop Group's Window Manager Standard specifies, in the section - on Application Window Properties, an _NET_WM_ICON property, presumably - set by the window manager, which is an array of possible icon sizes - for the client. There's no API in GTK+ 1.2[.x] for this; there may - eventually be one either in GTK+ 2.0 or GNOME 2.0. - - Some window managers can be configured to take the window name - specified by the WM_NAME property of a window or the resource - or class name specified by the WM_CLASS property and base the - choice of icon for the window on one of those; WM_CLASS for - Ethereal's windows has a resource name of "ethereal" and a class - name of "Ethereal". However, the way that's done is window-manager- - specific, and there's no way to determine what size a particular - window manager would want, so there's no way to automate this as - part of the installation of Ethereal. - */ -static void -window_icon_realize_cb (GtkWidget *win, gpointer data _U_) -{ -#ifndef _WIN32 - static GdkPixmap *icon_pmap = NULL; - static GdkBitmap *icon_mask = NULL; - GtkStyle *style; - - style = gtk_widget_get_style (win); - - if (icon_pmap == NULL) { - icon_pmap = gdk_pixmap_create_from_xpm_d (win->window, - &icon_mask, &style->bg[GTK_STATE_NORMAL], eicon3d16_xpm); - } - - gdk_window_set_icon (win->window, NULL, icon_pmap, icon_mask); -#endif -} - - -/* Create a new window, of the specified type, with the specified title - (if any) and the Ethereal icon. */ -GtkWidget * -window_new(GtkWindowType type, const gchar *title) -{ - GtkWidget *win; - - win = gtk_window_new(type); - if (title != NULL) - gtk_window_set_title(GTK_WINDOW(win), title); - SIGNAL_CONNECT(win, "realize", window_icon_realize_cb, NULL); - - /* XXX - which one is the correct default policy? or use a preference for this? */ - /* GTK_WIN_POS_NONE, GTK_WIN_POS_CENTER or GTK_WIN_POS_MOUSE */ - /* a lot of people dislike GTK_WIN_POS_MOUSE */ - - /* set the initial position (must be done, before show is called!) */ -#if GTK_MAJOR_VERSION >= 2 -/* gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER_ON_PARENT);*/ -#else -/* gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER);*/ -#endif - gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_NONE); - -#if GTK_MAJOR_VERSION < 2 - /* allow window to be shrinked by user, as gtk_widget_set_usize() will set minimum size and */ - /* the user never could shrink the window again */ - gtk_window_set_policy(GTK_WINDOW(win), TRUE, TRUE, FALSE); -#endif - - return win; -} - - -/* Same as window_new(), but will keep it's geometry values (size, position, ...). - * Be sure to use window_present() and window_destroy() appropriately! */ -GtkWidget * -window_new_with_geom(GtkWindowType type, const gchar *title, const gchar *geom_name) -{ - window_geometry_t geom; - GtkWidget *win = window_new(type, title); - - OBJECT_SET_DATA(win, WINDOW_GEOM_KEY, (gpointer)g_strdup(geom_name)); - - /* do we have a previously saved size and position of this window? */ - if(geom_name) { - /* It's a good idea to set the position and size of the window already here, - * as it's still invisible and won't "flicker the screen" while initially resizing. */ - if(window_geom_load(geom_name, &geom)) { - /* XXX - use prefs to select which values to set? */ - geom.set_pos = TRUE; - geom.set_size = TRUE; - geom.set_maximized = FALSE; /* don't maximize until window is shown */ - window_set_geometry(win, &geom); - } - } - - return win; -} - - -#if GTK_MAJOR_VERSION < 2 -/* We can't set the decorations until the window is realized. */ -static void -window_notitle_realize_cb (GtkWidget *win, gpointer data _U_) -{ - gdk_window_set_decorations(win->window, 0); -} -#endif - - -/* Create a new window for a splash screen; it's a main window, with no title, - positioned in the center of the screen. */ -GtkWidget * -splash_window_new(void) -{ - GtkWidget *win; - - win = gtk_window_new(GTK_WINDOW_TOPLEVEL); -#if GTK_MAJOR_VERSION >= 2 - gtk_window_set_decorated(GTK_WINDOW(win), FALSE); -#else - SIGNAL_CONNECT(win, "realize", window_notitle_realize_cb, NULL); -#endif - - /* set the initial position (must be done, before show is called!) */ - gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER); - - return win; -} - - -/* Present the created window on the screen. */ -void -window_present(GtkWidget *win) -{ - window_geometry_t geom; - const gchar *name; - -#if GTK_MAJOR_VERSION >= 2 - /* present this window */ - gtk_window_present(GTK_WINDOW(win)); -#endif - - /* do we have a previously saved size and position of this window? */ - name = OBJECT_GET_DATA(win, WINDOW_GEOM_KEY); - if(name) { - if(window_geom_load(name, &geom)) { - /* XXX - use prefs to select which values to set? */ - geom.set_pos = TRUE; - geom.set_size = TRUE; - geom.set_maximized = TRUE; - window_set_geometry(win, &geom); - } - } -} - - -static gint -window_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer cancel_button) -{ - g_return_val_if_fail (widget != NULL, FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - if (event->keyval == GDK_Escape) { - gtk_widget_activate(GTK_WIDGET(cancel_button)); - return TRUE; - } - - return FALSE; -} - - -/* Set the "key_press_event" signal for a top-level dialog window to - call a routine to activate the "Cancel" button for a dialog box if - the key being pressed is the <Esc> key. - - XXX - there should be a GTK+ widget that'll do that for you, and - let you specify a "Cancel" button. It should also not impose - a requirement that there be a separator in the dialog box, as - the GtkDialog widget does; the visual convention that there's - such a separator between the rest of the dialog boxes and buttons - such as "OK" and "Cancel" is, for better or worse, not universal - (not even in GTK+ - look at the GtkFileSelection dialog!). */ -static void -window_set_cancel(GtkWidget *widget, GtkWidget *cancel_button) -{ - SIGNAL_CONNECT(widget, "key_press_event", window_key_press_cb, cancel_button); -} - - -/* set the actions needed for the cancel "Close"/"Ok"/"Cancel" button that closes the window */ -void window_set_cancel_button(GtkWidget *win, GtkWidget *bt, window_cancel_button_fct cb) -{ - if(cb) - SIGNAL_CONNECT(bt, "clicked", cb, win); - - gtk_widget_grab_default(bt); - - window_set_cancel(win, bt); -} - - -/* default callback handler for cancel button "clicked" signal */ -void window_cancel_button_cb(GtkWidget *w _U_, gpointer data) -{ - window_destroy(GTK_WIDGET(data)); -} - - -/* default callback handler: the window managers X of the window was clicked (delete_event) */ -gboolean -window_delete_event_cb(GtkWidget *win, GdkEvent *event _U_, gpointer user_data _U_) -{ - window_destroy(win); - - /* event handled, don't do anything else */ - return TRUE; -} - - -/* get the geometry of a window from window_new() */ -void -window_get_geometry(GtkWidget *widget, window_geometry_t *geom) -{ - gint desk_x, desk_y; -#if GTK_MAJOR_VERSION >= 2 - GdkWindowState state; -#endif - - /* Try to grab our geometry. - - GTK+ provides two routines to get a window's position relative - to the X root window. If I understand the documentation correctly, - gdk_window_get_deskrelative_origin applies mainly to Enlightenment - and gdk_window_get_root_origin applies for all other WMs. - - The code below tries both routines, and picks the one that returns - the upper-left-most coordinates. - - More info at: - - http://mail.gnome.org/archives/gtk-devel-list/2001-March/msg00289.html - http://www.gtk.org/faq/#AEN606 - */ - - gdk_window_get_root_origin(widget->window, - &geom->x, - &geom->y); - if (gdk_window_get_deskrelative_origin(widget->window, - &desk_x, &desk_y)) { - if (desk_x <= geom->x && - desk_y <= geom->y) - { - geom->x = desk_x; - geom->y = desk_y; - } - } - - /* XXX - Is this the "approved" method? */ - gdk_window_get_size(widget->window, - &geom->width, - &geom->height); - -#if GTK_MAJOR_VERSION >= 2 - state = gdk_window_get_state(widget->window); - geom->maximized = (state == GDK_WINDOW_STATE_MAXIMIZED); -#endif -} - - -/* set the geometry of a window from window_new() */ -void -window_set_geometry(GtkWidget *widget, window_geometry_t *geom) -{ - /* as we now have the geometry from the recent file, set it */ - if (geom->set_pos) { - gtk_widget_set_uposition(widget, - geom->x, - geom->y); - } - - if (geom->set_size) { -#if GTK_MAJOR_VERSION >= 2 - gtk_window_resize(GTK_WINDOW(widget), -#else - gtk_window_set_default_size(GTK_WINDOW(widget), - geom->width, - geom->height); - gtk_widget_set_usize(widget, -#endif - /*WIDGET_SET_SIZE(widget,*/ - geom->width, - geom->height); - } - -#if GTK_MAJOR_VERSION >= 2 - if(geom->set_maximized) { - if (geom->maximized) { - gdk_window_maximize(widget->window); - } else { - gdk_window_unmaximize(widget->window); - } - } -#endif -} - - -/* the geometry hashtable for all known window classes, - * the window name is the key, and the geometry struct is the value */ -GHashTable *window_geom_hash = NULL; - - -/* save the window and it's current geometry into the geometry hashtable */ -static void -window_geom_save(const gchar *name, window_geometry_t *geom) -{ - gchar *key; - window_geometry_t *work; - - /* init hashtable, if not already done */ - if(!window_geom_hash) { - window_geom_hash = g_hash_table_new (g_str_hash, g_str_equal); - } - /* if we have an old one, remove and free it first */ - work = g_hash_table_lookup(window_geom_hash, name); - if(work) { - g_hash_table_remove(window_geom_hash, name); - g_free(work->key); - g_free(work); - } - - /* g_malloc and insert the new one */ - work = g_malloc(sizeof(*geom)); - *work = *geom; - key = g_strdup(name); - work->key = key; - g_hash_table_insert(window_geom_hash, key, work); -} - - -/* load the desired geometry for this window from the geometry hashtable */ -static gboolean -window_geom_load(const gchar *name, window_geometry_t *geom) -{ - window_geometry_t *p; - - /* init hashtable, if not already done */ - if(!window_geom_hash) { - window_geom_hash = g_hash_table_new (g_str_hash, g_str_equal); - } - - p = g_hash_table_lookup(window_geom_hash, name); - if(p) { - *geom = *p; - return TRUE; - } else { - return FALSE; - } -} - - -/* read in a single key value pair from the recent file into the geometry hashtable */ -void -window_geom_recent_read_pair(const char *name, const char *key, const char *value) -{ - window_geometry_t geom; - - - /* find window geometry maybe already in hashtable */ - if(!window_geom_load(name, &geom)) { - /* not in table, init geom with "basic" values */ - geom.key = g_strdup(name); - geom.set_pos = FALSE; - geom.x = -1; - geom.y = -1; - geom.set_size = FALSE; - geom.width = -1; - geom.height = -1; - - geom.set_maximized = FALSE;/* this is valid in GTK2 only */ - geom.maximized = FALSE; /* this is valid in GTK2 only */ - } - - if (strcmp(key, "x") == 0) { - geom.x = strtol(value, NULL, 10); - geom.set_pos = TRUE; - } else if (strcmp(key, "y") == 0) { - geom.y = strtol(value, NULL, 10); - geom.set_pos = TRUE; - } else if (strcmp(key, "width") == 0) { - geom.width = strtol(value, NULL, 10); - geom.set_size = TRUE; - } else if (strcmp(key, "height") == 0) { - geom.height = strtol(value, NULL, 10); - geom.set_size = TRUE; - } else if (strcmp(key, "maximized") == 0) { - if (strcasecmp(value, "true") == 0) { - geom.maximized = TRUE; - } - else { - geom.maximized = FALSE; - } - geom.set_maximized = TRUE; - } else { - g_assert_not_reached(); - } - - /* save / replace geometry in hashtable */ - window_geom_save(name, &geom); -} - - -/* write all geometry values of all windows from the hashtable to the recent file */ -void -window_geom_recent_write_all(gpointer rf) -{ - /* init hashtable, if not already done */ - if(!window_geom_hash) { - window_geom_hash = g_hash_table_new (g_str_hash, g_str_equal); - } - - g_hash_table_foreach(window_geom_hash, write_recent_geom, rf); -} - - -void -window_destroy(GtkWidget *win) -{ - window_geometry_t geom; - const gchar *name; - - /* get_geometry must be done *before* destroy is running, as the window geometry - * cannot be retrieved at destroy time (so don't use event "destroy" for this) */ - /* ...and don't do this at all, if we currently have no GdkWindow (e.g. if the - * GtkWidget is hidden) */ - if(!GTK_WIDGET_NO_WINDOW(win) && GTK_WIDGET_VISIBLE(win)) { - window_get_geometry(win, &geom); - - name = OBJECT_GET_DATA(win, WINDOW_GEOM_KEY); - if(name) { - window_geom_save(name, &geom); - g_free((gpointer)name); - } - } - - gtk_widget_destroy(win); -} - - -/* convert an xpm to a GtkWidget, using the window settings from it's parent */ -/* (be sure that the parent window is already being displayed) */ -GtkWidget *xpm_to_widget_from_parent(GtkWidget *parent, const char ** xpm) { -#if GTK_MAJOR_VERSION < 2 - GdkPixmap *icon; - GdkBitmap * mask; - - - icon = gdk_pixmap_create_from_xpm_d(parent->window, &mask, &parent->style->white, (char **) xpm); - return gtk_pixmap_new(icon, mask); -#else - GdkPixbuf * pixbuf; - GdkPixmap * pixmap; - GdkBitmap * bitmap; - - - pixbuf = gdk_pixbuf_new_from_xpm_data(xpm); - gdk_pixbuf_render_pixmap_and_mask_for_colormap (pixbuf, gtk_widget_get_colormap(parent), &pixmap, &bitmap, 128); - - return gtk_image_new_from_pixmap (pixmap, bitmap); -#endif -} - - -/* convert an xpm to a GtkWidget, using the top_level window settings */ -/* (be sure that the top_level window is already being displayed) */ -GtkWidget *xpm_to_widget(const char ** xpm) { - return xpm_to_widget_from_parent(top_level, xpm); -} - - -/* Set the name of the top-level window and its icon to the specified - string. */ -void -set_main_window_name(gchar *window_name) -{ - gchar *title; - - /* use user-defined window title if preference is set */ - title = create_user_window_title(window_name); - gtk_window_set_title(GTK_WINDOW(top_level), title); - gdk_window_set_icon_name(top_level->window, title); - g_free(title); -} - - -/* update the main window */ -void main_window_update(void) -{ - while (gtk_events_pending()) gtk_main_iteration(); -} - -#ifdef HAVE_LIBPCAP - -/* exit the main window */ -void main_window_exit(void) -{ - gtk_exit(0); -} - -/* quit a nested main window */ -void main_window_nested_quit(void) -{ - if (gtk_main_level() > 0) - gtk_main_quit(); -} - -/* quit the main window */ -void main_window_quit(void) -{ - gtk_main_quit(); -} - - - -typedef struct pipe_input_tag { - gint source; - gpointer user_data; - int *child_process; - pipe_input_cb_t input_cb; - guint pipe_input_id; -} pipe_input_t; - - -#ifdef _WIN32 -/* The timer has expired, see if there's stuff to read from the pipe, - if so, do the callback */ -static gint -pipe_timer_cb(gpointer data) -{ - HANDLE handle; - DWORD avail = 0; - gboolean result, result1; - DWORD childstatus; - pipe_input_t *pipe_input = data; - - - /* Oddly enough although Named pipes don't work on win9x, - PeekNamedPipe does !!! */ - handle = (HANDLE) _get_osfhandle (pipe_input->source); - result = PeekNamedPipe(handle, NULL, 0, NULL, &avail, NULL); - - /* Get the child process exit status */ - result1 = GetExitCodeProcess((HANDLE)*(pipe_input->child_process), - &childstatus); - - /* If the Peek returned an error, or there are bytes to be read - or the childwatcher thread has terminated then call the normal - callback */ - if (!result || avail > 0 || childstatus != STILL_ACTIVE) { - - /* avoid reentrancy problems and stack overflow */ - gtk_timeout_remove(pipe_input->pipe_input_id); - - /* And call the real handler */ - if (pipe_input->input_cb(pipe_input->source, pipe_input->user_data)) { - /* restore pipe handler */ - pipe_input->pipe_input_id = gtk_timeout_add(200, pipe_timer_cb, data); - } - - /* Return false so that this timer is not run again */ - return FALSE; - } - else { - /* No data so let timer run again */ - return TRUE; - } -} - -#else /* _WIN32 */ - -/* There's stuff to read from the sync pipe, meaning the child has sent - us a message, or the sync pipe has closed, meaning the child has - closed it (perhaps because it exited). */ -static void -pipe_input_cb(gpointer data, gint source _U_, - GdkInputCondition condition _U_) -{ - pipe_input_t *pipe_input = data; - - - /* avoid reentrancy problems and stack overflow */ - gtk_input_remove(pipe_input->pipe_input_id); - - if (pipe_input->input_cb(source, pipe_input->user_data)) { - /* restore pipe handler */ - pipe_input->pipe_input_id = gtk_input_add_full (source, - GDK_INPUT_READ|GDK_INPUT_EXCEPTION, - pipe_input_cb, - NULL, - data, - NULL); - } -} -#endif - -void pipe_input_set_handler(gint source, gpointer user_data, int *child_process, pipe_input_cb_t input_cb) -{ - static pipe_input_t pipe_input; - - pipe_input.source = source; - pipe_input.child_process = child_process; - pipe_input.user_data = user_data; - pipe_input.input_cb = input_cb; - -#ifdef _WIN32 - /* Tricky to use pipes in win9x, as no concept of wait. NT can - do this but that doesn't cover all win32 platforms. GTK can do - this but doesn't seem to work over processes. Attempt to do - something similar here, start a timer and check for data on every - timeout. */ - pipe_input.pipe_input_id = gtk_timeout_add(200, pipe_timer_cb, &pipe_input); -#else - pipe_input.pipe_input_id = gtk_input_add_full(source, - GDK_INPUT_READ|GDK_INPUT_EXCEPTION, - pipe_input_cb, - NULL, - &pipe_input, - NULL); -#endif -} - - -#endif /* HAVE_LIBPCAP */ - -/* Given a pointer to a GtkWidget for a top-level window, raise it and - de-iconify it. This routine is used if the user has done something to - ask that a window of a certain type be popped up when there can be only - one such window and such a window has already been popped up - we - pop up the existing one rather than creating a new one. - - XXX - we should request that it be given the input focus, too. Alas, - GDK has nothing to do that, e.g. by calling "XSetInputFocus()" in a - window in X. Besides, using "XSetInputFocus()" doesn't work anyway, - apparently due to the way GTK+/GDK manages the input focus. - - The X Desktop Group's Window Manager Standard specifies, in the section - on Root Window Properties, an _NET_ACTIVE_WINDOW client message that - can be sent to the root window, containing the window ID of the - window to activate; I infer that this might be the way to give the - window the input focus - I assume that means it's also de-iconified, - but I wouldn't assume it'd raise it. - - XXX - will this do the right thing on window systems other than X? */ -void -reactivate_window(GtkWidget *win) -{ - gdk_window_show(win->window); - gdk_window_raise(win->window); -} - -/* List of all GtkScrolledWindows, so we can globally set the scrollbar - placement of all of them. */ -static GList *scrolled_windows; - -static void setup_scrolled_window(GtkWidget *scrollw); -static void forget_scrolled_window(GtkWidget *scrollw, gpointer data); -static void set_scrollbar_placement_scrollw(GtkWidget *scrollw); - -/* Create a GtkScrolledWindow, set its scrollbar placement appropriately, - and remember it. */ -GtkWidget * -scrolled_window_new(GtkAdjustment *hadjustment, GtkAdjustment *vadjustment) -{ - GtkWidget *scrollw; - - scrollw = gtk_scrolled_window_new(hadjustment, vadjustment); - setup_scrolled_window(scrollw); - return scrollw; -} - -/* Set a GtkScrolledWindow's scrollbar placement and add it to the list - of GtkScrolledWindows. */ -static void -setup_scrolled_window(GtkWidget *scrollw) -{ - set_scrollbar_placement_scrollw(scrollw); - - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollw), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - - scrolled_windows = g_list_append(scrolled_windows, scrollw); - - /* Catch the "destroy" event on the widget, so that we remove it from - the list when it's destroyed. */ - SIGNAL_CONNECT(scrollw, "destroy", forget_scrolled_window, NULL); -} - -/* Remove a GtkScrolledWindow from the list of GtkScrolledWindows. */ -static void -forget_scrolled_window(GtkWidget *scrollw, gpointer data _U_) -{ - scrolled_windows = g_list_remove(scrolled_windows, scrollw); -} - -/* Set the scrollbar placement of a GtkScrolledWindow based upon user - preference. */ -static void -set_scrollbar_placement_scrollw(GtkWidget *scrollw) -{ - if (prefs.gui_scrollbar_on_right) { - gtk_scrolled_window_set_placement(GTK_SCROLLED_WINDOW(scrollw), - GTK_CORNER_TOP_LEFT); - } else { - gtk_scrolled_window_set_placement(GTK_SCROLLED_WINDOW(scrollw), - GTK_CORNER_TOP_RIGHT); - } -} - -static void -set_scrollbar_placement_cb(gpointer data, gpointer user_data _U_) -{ - set_scrollbar_placement_scrollw((GtkWidget *)data); -} - -/* Set the scrollbar placement of all GtkScrolledWindows based on - user preference. */ -void -set_scrollbar_placement_all(void) -{ - g_list_foreach(scrolled_windows, set_scrollbar_placement_cb, NULL); -} - -/* List of all CTrees/TreeViews, so we can globally set the line and - * expander style of all of them. */ -static GList *trees; - -static void setup_tree(GtkWidget *tree); -static void forget_tree(GtkWidget *tree, gpointer data); -static void set_tree_styles(GtkWidget *tree); - -/* Create a Tree, give it the right styles, and remember it. */ -#if GTK_MAJOR_VERSION < 2 -GtkWidget * -ctree_new(gint columns, gint tree_column) -#else -GtkWidget * -tree_view_new(GtkTreeModel *model) -#endif -{ - GtkWidget *tree; - -#if GTK_MAJOR_VERSION < 2 - tree = gtk_ctree_new(columns, tree_column); -#else - tree = gtk_tree_view_new_with_model(model); -#endif - setup_tree(tree); - return tree; -} - -#if GTK_MAJOR_VERSION < 2 -GtkWidget * -ctree_new_with_titles(gint columns, gint tree_column, const gchar *titles[]) -{ - GtkWidget *tree; - - tree = gtk_ctree_new_with_titles(columns, tree_column, (gchar **) titles); - setup_tree(tree); - return tree; -} -#endif - -/* Set a Tree's styles and add it to the list of Trees. */ -static void -setup_tree(GtkWidget *tree) -{ - set_tree_styles(tree); - - trees = g_list_append(trees, tree); - - /* Catch the "destroy" event on the widget, so that we remove it from - the list when it's destroyed. */ - SIGNAL_CONNECT(tree, "destroy", forget_tree, NULL); -} - -/* Remove a Tree from the list of Trees. */ -static void -forget_tree(GtkWidget *tree, gpointer data _U_) -{ - trees = g_list_remove(trees, tree); -} - -/* Set the styles of a Tree based upon user preferences. */ -static void -set_tree_styles(GtkWidget *tree) -{ -#if GTK_MAJOR_VERSION < 2 - g_assert(prefs.gui_ptree_line_style >= GTK_CTREE_LINES_NONE && - prefs.gui_ptree_line_style <= GTK_CTREE_LINES_TABBED); - gtk_ctree_set_line_style(GTK_CTREE(tree), prefs.gui_ptree_line_style); - g_assert(prefs.gui_ptree_expander_style >= GTK_CTREE_EXPANDER_NONE && - prefs.gui_ptree_expander_style <= GTK_CTREE_EXPANDER_CIRCULAR); - gtk_ctree_set_expander_style(GTK_CTREE(tree), - prefs.gui_ptree_expander_style); -#else - g_assert(prefs.gui_altern_colors >= 0 && prefs.gui_altern_colors <= 1); - gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree), - prefs.gui_altern_colors); -#endif -} - -static void -set_tree_styles_cb(gpointer data, gpointer user_data _U_) -{ - set_tree_styles((GtkWidget *)data); -} - -/* Set the styles of all Trees based upon style values. */ -void -set_tree_styles_all(void) -{ - g_list_foreach(trees, set_tree_styles_cb, NULL); -} - - - - -#if GTK_MAJOR_VERSION < 2 -/* convert variable argument list of values to array of strings (GTK2 -> GTK1) */ -static void -simple_list_convert(gchar **ent, va_list ap) -{ - int i; - char *s; - - while( (i = va_arg(ap, int)) != -1 ) { - s = va_arg(ap, char *); - ent[i] = s; - } -} -#endif - - -/* append a row to the simple list */ -/* use it like: simple_list_append(list, 0, "first", 1, "second", -1) */ -void -simple_list_append(GtkWidget *list, ...) -{ - va_list ap; - -#if GTK_MAJOR_VERSION < 2 - gchar *ent[10]; /* new entry added in clist */ -#else - GtkTreeIter iter; - GtkListStore *store; -#endif - - va_start(ap, list); -#if GTK_MAJOR_VERSION < 2 - simple_list_convert(ent, ap); - gtk_clist_append(GTK_CLIST(list), ent); -#else - store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list))); - gtk_list_store_append(store, &iter); - gtk_list_store_set_valist(store, &iter, ap); -#endif - va_end(ap); -} - -/* create a simple list widget */ -GtkWidget * -simple_list_new(gint cols, const gchar **titles) { - GtkWidget *plugins_list; -#if GTK_MAJOR_VERSION >= 2 - int i; - GtkListStore *store; - GtkCellRenderer *renderer; - GtkTreeViewColumn *column; -#endif - - -#if GTK_MAJOR_VERSION < 2 - plugins_list = gtk_clist_new_with_titles(cols, (gchar **) titles); - gtk_clist_set_selection_mode(GTK_CLIST(plugins_list), GTK_SELECTION_SINGLE); - gtk_clist_column_titles_passive(GTK_CLIST(plugins_list)); - if(titles) { - gtk_clist_column_titles_show(GTK_CLIST(plugins_list)); - } else { - gtk_clist_column_titles_hide(GTK_CLIST(plugins_list)); - } - gtk_clist_set_column_auto_resize(GTK_CLIST(plugins_list), 0, TRUE); - gtk_clist_set_column_auto_resize(GTK_CLIST(plugins_list), 1, TRUE); -#else - g_assert(cols <= 10); - store = gtk_list_store_new(cols, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, - G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); - plugins_list = tree_view_new(GTK_TREE_MODEL(store)); - g_object_unref(G_OBJECT(store)); - gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(plugins_list), (titles != NULL)); - for(i=0; i<cols; i++) { - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes(titles ? titles[i] : "", renderer, - "text", i, NULL); - gtk_tree_view_column_set_sort_column_id(column, i); - gtk_tree_view_append_column(GTK_TREE_VIEW(plugins_list), column); - } -#endif - - return plugins_list; -} - -extern void -copy_to_clipboard(GString *str) -{ -#if (GTK_MAJOR_VERSION >= 2) - GtkClipboard *cb; - - cb = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); /* Get the default clipboard */ - gtk_clipboard_set_text(cb, str->str, -1); /* Copy the byte data into the clipboard */ -#else - GtkWidget *window; - GtkWidget *text; - - window = window_new (GTK_WINDOW_TOPLEVEL,""); - text = gtk_text_new (NULL, NULL); /* Create the GtkText widget */ - gtk_container_add (GTK_CONTAINER (window), text); /* Avoid a GTK assertion */ - gtk_widget_realize (text); /* Realizing a widget creates a window for it, ready for us to insert some text */ - gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, str->str, -1); - gtk_editable_select_region((GtkEditable *)text, 0, -1); /* Select ALL text */ - gtk_editable_copy_clipboard((GtkEditable *)text); /* Copy the byte data into the clipboard */ -#endif -} - -/* - * Create a new window title string with user-defined title preference. - * (Or ignore it if unspecified). - */ -gchar * -create_user_window_title(const gchar *caption) -{ - /* fail-safe */ - if (caption == NULL) - return g_strdup(""); - - /* no user-defined title specified */ - if ((prefs.gui_window_title == NULL) || (*prefs.gui_window_title == '\0')) - return g_strdup(caption); - - return g_strdup_printf("%s %s", prefs.gui_window_title, caption); -} +/* ui_util.c
+ * UI utility routines
+ *
+ * $Id: ui_util.c 15286 2005-08-10 19:49:45Z ulfl $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <string.h>
+
+#ifdef _WIN32
+#include <windows.h>
+#endif
+
+#ifdef HAVE_IO_H
+# include <io.h>
+#endif
+
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+
+#include "gtkglobals.h"
+#include "gui_utils.h"
+#include <epan/prefs.h>
+#include "epan/epan.h"
+#include "../ui_util.h"
+#include "compat_macros.h"
+#include "recent.h"
+
+
+#include "image/eicon3d16.xpm"
+
+/* XXX - remove this later again, when dlg_xx function cleanup done */
+#include "dlg_utils.h"
+
+
+#define WINDOW_GEOM_KEY "window_geom"
+
+
+/* load the geometry values for a window from previously saved values */
+static gboolean window_geom_load(const gchar *name, window_geometry_t *geom);
+
+
+
+/* Set our window icon. The GDK documentation doesn't provide any
+ actual documentation for gdk_window_set_icon(), so we'll steal
+ libgimp/gimpdialog.c:gimp_dialog_realize_callback() from the Gimp
+ sources and assume it's safe.
+
+ XXX - The current icon size is fixed at 16x16 pixels, which looks fine
+ with kwm (KDE 1.x's window manager), Sawfish (the "default" window
+ manager for GNOME?), and under Windows with Exceed putting X windows
+ on the Windows desktop, using Exceed as the window manager, as those
+ window managers put a 16x16 icon on the title bar.
+
+ The window managers in some windowing environments (e.g. dtwm in CDE)
+ and some stand-alone window managers have larger icon sizes (many window
+ managers put the window icon on the desktop, in the Windows 3.x style,
+ rather than in the titlebar, in the Windows 4.x style), so we need to
+ find a way to size our icon appropriately.
+
+ The X11 Inter-Client Communications Conventions Manual, Version 1.1,
+ in X11R5, specifies that "a window manager that wishes to place
+ constraints on the sizes of icon pixmaps and/or windows should
+ place a property called WM_ICON_SIZE on the root"; that property
+ contains minimum width and height, maximum width and height, and
+ width and height increment values. "XGetIconSizes()" retrieves
+ that property; unfortunately, I've yet to find a window manager
+ that sets it on the root window (kwm, AfterStep, and Exceed don't
+ appear to set it).
+
+ The X Desktop Group's Window Manager Standard specifies, in the section
+ on Application Window Properties, an _NET_WM_ICON property, presumably
+ set by the window manager, which is an array of possible icon sizes
+ for the client. There's no API in GTK+ 1.2[.x] for this; there may
+ eventually be one either in GTK+ 2.0 or GNOME 2.0.
+
+ Some window managers can be configured to take the window name
+ specified by the WM_NAME property of a window or the resource
+ or class name specified by the WM_CLASS property and base the
+ choice of icon for the window on one of those; WM_CLASS for
+ Ethereal's windows has a resource name of "ethereal" and a class
+ name of "Ethereal". However, the way that's done is window-manager-
+ specific, and there's no way to determine what size a particular
+ window manager would want, so there's no way to automate this as
+ part of the installation of Ethereal.
+ */
+static void
+window_icon_realize_cb (GtkWidget *win, gpointer data _U_)
+{
+#ifndef _WIN32
+ static GdkPixmap *icon_pmap = NULL;
+ static GdkBitmap *icon_mask = NULL;
+ GtkStyle *style;
+
+ style = gtk_widget_get_style (win);
+
+ if (icon_pmap == NULL) {
+ icon_pmap = gdk_pixmap_create_from_xpm_d (win->window,
+ &icon_mask, &style->bg[GTK_STATE_NORMAL], eicon3d16_xpm);
+ }
+
+ gdk_window_set_icon (win->window, NULL, icon_pmap, icon_mask);
+#endif
+}
+
+
+/* Create a new window, of the specified type, with the specified title
+ (if any) and the Ethereal icon. */
+GtkWidget *
+window_new(GtkWindowType type, const gchar *title)
+{
+ GtkWidget *win;
+
+ win = gtk_window_new(type);
+ if (title != NULL)
+ gtk_window_set_title(GTK_WINDOW(win), title);
+ SIGNAL_CONNECT(win, "realize", window_icon_realize_cb, NULL);
+
+ /* XXX - which one is the correct default policy? or use a preference for this? */
+ /* GTK_WIN_POS_NONE, GTK_WIN_POS_CENTER or GTK_WIN_POS_MOUSE */
+ /* a lot of people dislike GTK_WIN_POS_MOUSE */
+
+ /* set the initial position (must be done, before show is called!) */
+#if GTK_MAJOR_VERSION >= 2
+/* gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER_ON_PARENT);*/
+#else
+/* gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER);*/
+#endif
+ gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_NONE);
+
+#if GTK_MAJOR_VERSION < 2
+ /* allow window to be shrinked by user, as gtk_widget_set_usize() will set minimum size and */
+ /* the user never could shrink the window again */
+ gtk_window_set_policy(GTK_WINDOW(win), TRUE, TRUE, FALSE);
+#endif
+
+ return win;
+}
+
+
+/* Same as window_new(), but will keep it's geometry values (size, position, ...).
+ * Be sure to use window_present() and window_destroy() appropriately! */
+GtkWidget *
+window_new_with_geom(GtkWindowType type, const gchar *title, const gchar *geom_name)
+{
+ window_geometry_t geom;
+ GtkWidget *win = window_new(type, title);
+
+ OBJECT_SET_DATA(win, WINDOW_GEOM_KEY, (gpointer)g_strdup(geom_name));
+
+ /* do we have a previously saved size and position of this window? */
+ if(geom_name) {
+ /* It's a good idea to set the position and size of the window already here,
+ * as it's still invisible and won't "flicker the screen" while initially resizing. */
+ if(window_geom_load(geom_name, &geom)) {
+ /* XXX - use prefs to select which values to set? */
+ geom.set_pos = TRUE;
+ geom.set_size = TRUE;
+ geom.set_maximized = FALSE; /* don't maximize until window is shown */
+ window_set_geometry(win, &geom);
+ }
+ }
+
+ return win;
+}
+
+
+#if GTK_MAJOR_VERSION < 2
+/* We can't set the decorations until the window is realized. */
+static void
+window_notitle_realize_cb (GtkWidget *win, gpointer data _U_)
+{
+ gdk_window_set_decorations(win->window, 0);
+}
+#endif
+
+
+/* Create a new window for a splash screen; it's a main window, with no title,
+ positioned in the center of the screen. */
+GtkWidget *
+splash_window_new(void)
+{
+ GtkWidget *win;
+
+ win = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+#if GTK_MAJOR_VERSION >= 2
+ gtk_window_set_decorated(GTK_WINDOW(win), FALSE);
+#else
+ SIGNAL_CONNECT(win, "realize", window_notitle_realize_cb, NULL);
+#endif
+
+ /* set the initial position (must be done, before show is called!) */
+ gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_CENTER);
+
+ return win;
+}
+
+
+/* Present the created window on the screen. */
+void
+window_present(GtkWidget *win)
+{
+ window_geometry_t geom;
+ const gchar *name;
+
+#if GTK_MAJOR_VERSION >= 2
+ /* present this window */
+ gtk_window_present(GTK_WINDOW(win));
+#endif
+
+ /* do we have a previously saved size and position of this window? */
+ name = OBJECT_GET_DATA(win, WINDOW_GEOM_KEY);
+ if(name) {
+ if(window_geom_load(name, &geom)) {
+ /* XXX - use prefs to select which values to set? */
+ geom.set_pos = TRUE;
+ geom.set_size = TRUE;
+ geom.set_maximized = TRUE;
+ window_set_geometry(win, &geom);
+ }
+ }
+}
+
+
+static gint
+window_key_press_cb (GtkWidget *widget, GdkEventKey *event, gpointer cancel_button)
+{
+ g_return_val_if_fail (widget != NULL, FALSE);
+ g_return_val_if_fail (event != NULL, FALSE);
+
+ if (event->keyval == GDK_Escape) {
+ gtk_widget_activate(GTK_WIDGET(cancel_button));
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+
+/* Set the "key_press_event" signal for a top-level dialog window to
+ call a routine to activate the "Cancel" button for a dialog box if
+ the key being pressed is the <Esc> key.
+
+ XXX - there should be a GTK+ widget that'll do that for you, and
+ let you specify a "Cancel" button. It should also not impose
+ a requirement that there be a separator in the dialog box, as
+ the GtkDialog widget does; the visual convention that there's
+ such a separator between the rest of the dialog boxes and buttons
+ such as "OK" and "Cancel" is, for better or worse, not universal
+ (not even in GTK+ - look at the GtkFileSelection dialog!). */
+static void
+window_set_cancel(GtkWidget *widget, GtkWidget *cancel_button)
+{
+ SIGNAL_CONNECT(widget, "key_press_event", window_key_press_cb, cancel_button);
+}
+
+
+/* set the actions needed for the cancel "Close"/"Ok"/"Cancel" button that closes the window */
+void window_set_cancel_button(GtkWidget *win, GtkWidget *bt, window_cancel_button_fct cb)
+{
+ if(cb)
+ SIGNAL_CONNECT(bt, "clicked", cb, win);
+
+ gtk_widget_grab_default(bt);
+
+ window_set_cancel(win, bt);
+}
+
+
+/* default callback handler for cancel button "clicked" signal */
+void window_cancel_button_cb(GtkWidget *w _U_, gpointer data)
+{
+ window_destroy(GTK_WIDGET(data));
+}
+
+
+/* default callback handler: the window managers X of the window was clicked (delete_event) */
+gboolean
+window_delete_event_cb(GtkWidget *win, GdkEvent *event _U_, gpointer user_data _U_)
+{
+ window_destroy(win);
+
+ /* event handled, don't do anything else */
+ return TRUE;
+}
+
+
+/* get the geometry of a window from window_new() */
+void
+window_get_geometry(GtkWidget *widget, window_geometry_t *geom)
+{
+ gint desk_x, desk_y;
+#if GTK_MAJOR_VERSION >= 2
+ GdkWindowState state;
+#endif
+
+ /* Try to grab our geometry.
+
+ GTK+ provides two routines to get a window's position relative
+ to the X root window. If I understand the documentation correctly,
+ gdk_window_get_deskrelative_origin applies mainly to Enlightenment
+ and gdk_window_get_root_origin applies for all other WMs.
+
+ The code below tries both routines, and picks the one that returns
+ the upper-left-most coordinates.
+
+ More info at:
+
+ http://mail.gnome.org/archives/gtk-devel-list/2001-March/msg00289.html
+ http://www.gtk.org/faq/#AEN606
+ */
+
+ gdk_window_get_root_origin(widget->window,
+ &geom->x,
+ &geom->y);
+ if (gdk_window_get_deskrelative_origin(widget->window,
+ &desk_x, &desk_y)) {
+ if (desk_x <= geom->x &&
+ desk_y <= geom->y)
+ {
+ geom->x = desk_x;
+ geom->y = desk_y;
+ }
+ }
+
+ /* XXX - Is this the "approved" method? */
+ gdk_window_get_size(widget->window,
+ &geom->width,
+ &geom->height);
+
+#if GTK_MAJOR_VERSION >= 2
+ state = gdk_window_get_state(widget->window);
+ geom->maximized = (state == GDK_WINDOW_STATE_MAXIMIZED);
+#endif
+}
+
+
+/* set the geometry of a window from window_new() */
+void
+window_set_geometry(GtkWidget *widget, window_geometry_t *geom)
+{
+ /* as we now have the geometry from the recent file, set it */
+ if (geom->set_pos) {
+ gtk_widget_set_uposition(widget,
+ geom->x,
+ geom->y);
+ }
+
+ if (geom->set_size) {
+#if GTK_MAJOR_VERSION >= 2
+ gtk_window_resize(GTK_WINDOW(widget),
+#else
+ gtk_window_set_default_size(GTK_WINDOW(widget),
+ geom->width,
+ geom->height);
+ gtk_widget_set_usize(widget,
+#endif
+ /*WIDGET_SET_SIZE(widget,*/
+ geom->width,
+ geom->height);
+ }
+
+#if GTK_MAJOR_VERSION >= 2
+ if(geom->set_maximized) {
+ if (geom->maximized) {
+ gdk_window_maximize(widget->window);
+ } else {
+ gdk_window_unmaximize(widget->window);
+ }
+ }
+#endif
+}
+
+
+/* the geometry hashtable for all known window classes,
+ * the window name is the key, and the geometry struct is the value */
+GHashTable *window_geom_hash = NULL;
+
+
+/* save the window and it's current geometry into the geometry hashtable */
+static void
+window_geom_save(const gchar *name, window_geometry_t *geom)
+{
+ gchar *key;
+ window_geometry_t *work;
+
+ /* init hashtable, if not already done */
+ if(!window_geom_hash) {
+ window_geom_hash = g_hash_table_new (g_str_hash, g_str_equal);
+ }
+ /* if we have an old one, remove and free it first */
+ work = g_hash_table_lookup(window_geom_hash, name);
+ if(work) {
+ g_hash_table_remove(window_geom_hash, name);
+ g_free(work->key);
+ g_free(work);
+ }
+
+ /* g_malloc and insert the new one */
+ work = g_malloc(sizeof(*geom));
+ *work = *geom;
+ key = g_strdup(name);
+ work->key = key;
+ g_hash_table_insert(window_geom_hash, key, work);
+}
+
+
+/* load the desired geometry for this window from the geometry hashtable */
+static gboolean
+window_geom_load(const gchar *name, window_geometry_t *geom)
+{
+ window_geometry_t *p;
+
+ /* init hashtable, if not already done */
+ if(!window_geom_hash) {
+ window_geom_hash = g_hash_table_new (g_str_hash, g_str_equal);
+ }
+
+ p = g_hash_table_lookup(window_geom_hash, name);
+ if(p) {
+ *geom = *p;
+ return TRUE;
+ } else {
+ return FALSE;
+ }
+}
+
+
+/* read in a single key value pair from the recent file into the geometry hashtable */
+void
+window_geom_recent_read_pair(const char *name, const char *key, const char *value)
+{
+ window_geometry_t geom;
+
+
+ /* find window geometry maybe already in hashtable */
+ if(!window_geom_load(name, &geom)) {
+ /* not in table, init geom with "basic" values */
+ geom.key = g_strdup(name);
+ geom.set_pos = FALSE;
+ geom.x = -1;
+ geom.y = -1;
+ geom.set_size = FALSE;
+ geom.width = -1;
+ geom.height = -1;
+
+ geom.set_maximized = FALSE;/* this is valid in GTK2 only */
+ geom.maximized = FALSE; /* this is valid in GTK2 only */
+ }
+
+ if (strcmp(key, "x") == 0) {
+ geom.x = strtol(value, NULL, 10);
+ geom.set_pos = TRUE;
+ } else if (strcmp(key, "y") == 0) {
+ geom.y = strtol(value, NULL, 10);
+ geom.set_pos = TRUE;
+ } else if (strcmp(key, "width") == 0) {
+ geom.width = strtol(value, NULL, 10);
+ geom.set_size = TRUE;
+ } else if (strcmp(key, "height") == 0) {
+ geom.height = strtol(value, NULL, 10);
+ geom.set_size = TRUE;
+ } else if (strcmp(key, "maximized") == 0) {
+ if (strcasecmp(value, "true") == 0) {
+ geom.maximized = TRUE;
+ }
+ else {
+ geom.maximized = FALSE;
+ }
+ geom.set_maximized = TRUE;
+ } else {
+ g_assert_not_reached();
+ }
+
+ /* save / replace geometry in hashtable */
+ window_geom_save(name, &geom);
+}
+
+
+/* write all geometry values of all windows from the hashtable to the recent file */
+void
+window_geom_recent_write_all(gpointer rf)
+{
+ /* init hashtable, if not already done */
+ if(!window_geom_hash) {
+ window_geom_hash = g_hash_table_new (g_str_hash, g_str_equal);
+ }
+
+ g_hash_table_foreach(window_geom_hash, write_recent_geom, rf);
+}
+
+
+void
+window_destroy(GtkWidget *win)
+{
+ window_geometry_t geom;
+ const gchar *name;
+
+ /* get_geometry must be done *before* destroy is running, as the window geometry
+ * cannot be retrieved at destroy time (so don't use event "destroy" for this) */
+ /* ...and don't do this at all, if we currently have no GdkWindow (e.g. if the
+ * GtkWidget is hidden) */
+ if(!GTK_WIDGET_NO_WINDOW(win) && GTK_WIDGET_VISIBLE(win)) {
+ window_get_geometry(win, &geom);
+
+ name = OBJECT_GET_DATA(win, WINDOW_GEOM_KEY);
+ if(name) {
+ window_geom_save(name, &geom);
+ g_free((gpointer)name);
+ }
+ }
+
+ gtk_widget_destroy(win);
+}
+
+
+/* convert an xpm to a GtkWidget, using the window settings from it's parent */
+/* (be sure that the parent window is already being displayed) */
+GtkWidget *xpm_to_widget_from_parent(GtkWidget *parent, const char ** xpm) {
+#if GTK_MAJOR_VERSION < 2
+ GdkPixmap *icon;
+ GdkBitmap * mask;
+
+
+ icon = gdk_pixmap_create_from_xpm_d(parent->window, &mask, &parent->style->white, (char **) xpm);
+ return gtk_pixmap_new(icon, mask);
+#else
+ GdkPixbuf * pixbuf;
+ GdkPixmap * pixmap;
+ GdkBitmap * bitmap;
+
+
+ pixbuf = gdk_pixbuf_new_from_xpm_data(xpm);
+ gdk_pixbuf_render_pixmap_and_mask_for_colormap (pixbuf, gtk_widget_get_colormap(parent), &pixmap, &bitmap, 128);
+
+ return gtk_image_new_from_pixmap (pixmap, bitmap);
+#endif
+}
+
+
+/* convert an xpm to a GtkWidget, using the top_level window settings */
+/* (be sure that the top_level window is already being displayed) */
+GtkWidget *xpm_to_widget(const char ** xpm) {
+ return xpm_to_widget_from_parent(top_level, xpm);
+}
+
+
+/* Set the name of the top-level window and its icon to the specified
+ string. */
+void
+set_main_window_name(gchar *window_name)
+{
+ gchar *title;
+
+ /* use user-defined window title if preference is set */
+ title = create_user_window_title(window_name);
+ gtk_window_set_title(GTK_WINDOW(top_level), title);
+ gdk_window_set_icon_name(top_level->window, title);
+ g_free(title);
+}
+
+
+/* update the main window */
+void main_window_update(void)
+{
+ while (gtk_events_pending()) gtk_main_iteration();
+}
+
+#ifdef HAVE_LIBPCAP
+
+/* exit the main window */
+void main_window_exit(void)
+{
+ gtk_exit(0);
+}
+
+/* quit a nested main window */
+void main_window_nested_quit(void)
+{
+ if (gtk_main_level() > 0)
+ gtk_main_quit();
+}
+
+/* quit the main window */
+void main_window_quit(void)
+{
+ gtk_main_quit();
+}
+
+
+
+typedef struct pipe_input_tag {
+ gint source;
+ gpointer user_data;
+ int *child_process;
+ pipe_input_cb_t input_cb;
+ guint pipe_input_id;
+} pipe_input_t;
+
+
+#ifdef _WIN32
+/* The timer has expired, see if there's stuff to read from the pipe,
+ if so, do the callback */
+static gint
+pipe_timer_cb(gpointer data)
+{
+ HANDLE handle;
+ DWORD avail = 0;
+ gboolean result, result1;
+ DWORD childstatus;
+ pipe_input_t *pipe_input = data;
+
+
+ /* Oddly enough although Named pipes don't work on win9x,
+ PeekNamedPipe does !!! */
+ handle = (HANDLE) _get_osfhandle (pipe_input->source);
+ result = PeekNamedPipe(handle, NULL, 0, NULL, &avail, NULL);
+
+ /* Get the child process exit status */
+ result1 = GetExitCodeProcess((HANDLE)*(pipe_input->child_process),
+ &childstatus);
+
+ /* If the Peek returned an error, or there are bytes to be read
+ or the childwatcher thread has terminated then call the normal
+ callback */
+ if (!result || avail > 0 || childstatus != STILL_ACTIVE) {
+
+ /* avoid reentrancy problems and stack overflow */
+ gtk_timeout_remove(pipe_input->pipe_input_id);
+
+ /* And call the real handler */
+ if (pipe_input->input_cb(pipe_input->source, pipe_input->user_data)) {
+ /* restore pipe handler */
+ pipe_input->pipe_input_id = gtk_timeout_add(200, pipe_timer_cb, data);
+ }
+
+ /* Return false so that this timer is not run again */
+ return FALSE;
+ }
+ else {
+ /* No data so let timer run again */
+ return TRUE;
+ }
+}
+
+#else /* _WIN32 */
+
+/* There's stuff to read from the sync pipe, meaning the child has sent
+ us a message, or the sync pipe has closed, meaning the child has
+ closed it (perhaps because it exited). */
+static void
+pipe_input_cb(gpointer data, gint source _U_,
+ GdkInputCondition condition _U_)
+{
+ pipe_input_t *pipe_input = data;
+
+
+ /* avoid reentrancy problems and stack overflow */
+ gtk_input_remove(pipe_input->pipe_input_id);
+
+ if (pipe_input->input_cb(source, pipe_input->user_data)) {
+ /* restore pipe handler */
+ pipe_input->pipe_input_id = gtk_input_add_full (source,
+ GDK_INPUT_READ|GDK_INPUT_EXCEPTION,
+ pipe_input_cb,
+ NULL,
+ data,
+ NULL);
+ }
+}
+#endif
+
+void pipe_input_set_handler(gint source, gpointer user_data, int *child_process, pipe_input_cb_t input_cb)
+{
+ static pipe_input_t pipe_input;
+
+ pipe_input.source = source;
+ pipe_input.child_process = child_process;
+ pipe_input.user_data = user_data;
+ pipe_input.input_cb = input_cb;
+
+#ifdef _WIN32
+ /* Tricky to use pipes in win9x, as no concept of wait. NT can
+ do this but that doesn't cover all win32 platforms. GTK can do
+ this but doesn't seem to work over processes. Attempt to do
+ something similar here, start a timer and check for data on every
+ timeout. */
+ pipe_input.pipe_input_id = gtk_timeout_add(200, pipe_timer_cb, &pipe_input);
+#else
+ pipe_input.pipe_input_id = gtk_input_add_full(source,
+ GDK_INPUT_READ|GDK_INPUT_EXCEPTION,
+ pipe_input_cb,
+ NULL,
+ &pipe_input,
+ NULL);
+#endif
+}
+
+
+#endif /* HAVE_LIBPCAP */
+
+/* Given a pointer to a GtkWidget for a top-level window, raise it and
+ de-iconify it. This routine is used if the user has done something to
+ ask that a window of a certain type be popped up when there can be only
+ one such window and such a window has already been popped up - we
+ pop up the existing one rather than creating a new one.
+
+ XXX - we should request that it be given the input focus, too. Alas,
+ GDK has nothing to do that, e.g. by calling "XSetInputFocus()" in a
+ window in X. Besides, using "XSetInputFocus()" doesn't work anyway,
+ apparently due to the way GTK+/GDK manages the input focus.
+
+ The X Desktop Group's Window Manager Standard specifies, in the section
+ on Root Window Properties, an _NET_ACTIVE_WINDOW client message that
+ can be sent to the root window, containing the window ID of the
+ window to activate; I infer that this might be the way to give the
+ window the input focus - I assume that means it's also de-iconified,
+ but I wouldn't assume it'd raise it.
+
+ XXX - will this do the right thing on window systems other than X? */
+void
+reactivate_window(GtkWidget *win)
+{
+ gdk_window_show(win->window);
+ gdk_window_raise(win->window);
+}
+
+/* List of all GtkScrolledWindows, so we can globally set the scrollbar
+ placement of all of them. */
+static GList *scrolled_windows;
+
+static void setup_scrolled_window(GtkWidget *scrollw);
+static void forget_scrolled_window(GtkWidget *scrollw, gpointer data);
+static void set_scrollbar_placement_scrollw(GtkWidget *scrollw);
+
+/* Create a GtkScrolledWindow, set its scrollbar placement appropriately,
+ and remember it. */
+GtkWidget *
+scrolled_window_new(GtkAdjustment *hadjustment, GtkAdjustment *vadjustment)
+{
+ GtkWidget *scrollw;
+
+ scrollw = gtk_scrolled_window_new(hadjustment, vadjustment);
+ setup_scrolled_window(scrollw);
+ return scrollw;
+}
+
+/* Set a GtkScrolledWindow's scrollbar placement and add it to the list
+ of GtkScrolledWindows. */
+static void
+setup_scrolled_window(GtkWidget *scrollw)
+{
+ set_scrollbar_placement_scrollw(scrollw);
+
+ gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollw),
+ GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+ scrolled_windows = g_list_append(scrolled_windows, scrollw);
+
+ /* Catch the "destroy" event on the widget, so that we remove it from
+ the list when it's destroyed. */
+ SIGNAL_CONNECT(scrollw, "destroy", forget_scrolled_window, NULL);
+}
+
+/* Remove a GtkScrolledWindow from the list of GtkScrolledWindows. */
+static void
+forget_scrolled_window(GtkWidget *scrollw, gpointer data _U_)
+{
+ scrolled_windows = g_list_remove(scrolled_windows, scrollw);
+}
+
+/* Set the scrollbar placement of a GtkScrolledWindow based upon user
+ preference. */
+static void
+set_scrollbar_placement_scrollw(GtkWidget *scrollw)
+{
+ if (prefs.gui_scrollbar_on_right) {
+ gtk_scrolled_window_set_placement(GTK_SCROLLED_WINDOW(scrollw),
+ GTK_CORNER_TOP_LEFT);
+ } else {
+ gtk_scrolled_window_set_placement(GTK_SCROLLED_WINDOW(scrollw),
+ GTK_CORNER_TOP_RIGHT);
+ }
+}
+
+static void
+set_scrollbar_placement_cb(gpointer data, gpointer user_data _U_)
+{
+ set_scrollbar_placement_scrollw((GtkWidget *)data);
+}
+
+/* Set the scrollbar placement of all GtkScrolledWindows based on
+ user preference. */
+void
+set_scrollbar_placement_all(void)
+{
+ g_list_foreach(scrolled_windows, set_scrollbar_placement_cb, NULL);
+}
+
+/* List of all CTrees/TreeViews, so we can globally set the line and
+ * expander style of all of them. */
+static GList *trees;
+
+static void setup_tree(GtkWidget *tree);
+static void forget_tree(GtkWidget *tree, gpointer data);
+static void set_tree_styles(GtkWidget *tree);
+
+/* Create a Tree, give it the right styles, and remember it. */
+#if GTK_MAJOR_VERSION < 2
+GtkWidget *
+ctree_new(gint columns, gint tree_column)
+#else
+GtkWidget *
+tree_view_new(GtkTreeModel *model)
+#endif
+{
+ GtkWidget *tree;
+
+#if GTK_MAJOR_VERSION < 2
+ tree = gtk_ctree_new(columns, tree_column);
+#else
+ tree = gtk_tree_view_new_with_model(model);
+#endif
+ setup_tree(tree);
+ return tree;
+}
+
+#if GTK_MAJOR_VERSION < 2
+GtkWidget *
+ctree_new_with_titles(gint columns, gint tree_column, const gchar *titles[])
+{
+ GtkWidget *tree;
+
+ tree = gtk_ctree_new_with_titles(columns, tree_column, (gchar **) titles);
+ setup_tree(tree);
+ return tree;
+}
+#endif
+
+/* Set a Tree's styles and add it to the list of Trees. */
+static void
+setup_tree(GtkWidget *tree)
+{
+ set_tree_styles(tree);
+
+ trees = g_list_append(trees, tree);
+
+ /* Catch the "destroy" event on the widget, so that we remove it from
+ the list when it's destroyed. */
+ SIGNAL_CONNECT(tree, "destroy", forget_tree, NULL);
+}
+
+/* Remove a Tree from the list of Trees. */
+static void
+forget_tree(GtkWidget *tree, gpointer data _U_)
+{
+ trees = g_list_remove(trees, tree);
+}
+
+/* Set the styles of a Tree based upon user preferences. */
+static void
+set_tree_styles(GtkWidget *tree)
+{
+#if GTK_MAJOR_VERSION < 2
+ g_assert(prefs.gui_ptree_line_style >= GTK_CTREE_LINES_NONE &&
+ prefs.gui_ptree_line_style <= GTK_CTREE_LINES_TABBED);
+ gtk_ctree_set_line_style(GTK_CTREE(tree), prefs.gui_ptree_line_style);
+ g_assert(prefs.gui_ptree_expander_style >= GTK_CTREE_EXPANDER_NONE &&
+ prefs.gui_ptree_expander_style <= GTK_CTREE_EXPANDER_CIRCULAR);
+ gtk_ctree_set_expander_style(GTK_CTREE(tree),
+ prefs.gui_ptree_expander_style);
+#else
+ g_assert(prefs.gui_altern_colors >= 0 && prefs.gui_altern_colors <= 1);
+ gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(tree),
+ prefs.gui_altern_colors);
+#endif
+}
+
+static void
+set_tree_styles_cb(gpointer data, gpointer user_data _U_)
+{
+ set_tree_styles((GtkWidget *)data);
+}
+
+/* Set the styles of all Trees based upon style values. */
+void
+set_tree_styles_all(void)
+{
+ g_list_foreach(trees, set_tree_styles_cb, NULL);
+}
+
+
+
+
+#if GTK_MAJOR_VERSION < 2
+/* convert variable argument list of values to array of strings (GTK2 -> GTK1) */
+static void
+simple_list_convert(gchar **ent, va_list ap)
+{
+ int i;
+ char *s;
+
+ while( (i = va_arg(ap, int)) != -1 ) {
+ s = va_arg(ap, char *);
+ ent[i] = s;
+ }
+}
+#endif
+
+
+/* append a row to the simple list */
+/* use it like: simple_list_append(list, 0, "first", 1, "second", -1) */
+void
+simple_list_append(GtkWidget *list, ...)
+{
+ va_list ap;
+
+#if GTK_MAJOR_VERSION < 2
+ gchar *ent[10]; /* new entry added in clist */
+#else
+ GtkTreeIter iter;
+ GtkListStore *store;
+#endif
+
+ va_start(ap, list);
+#if GTK_MAJOR_VERSION < 2
+ simple_list_convert(ent, ap);
+ gtk_clist_append(GTK_CLIST(list), ent);
+#else
+ store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(list)));
+ gtk_list_store_append(store, &iter);
+ gtk_list_store_set_valist(store, &iter, ap);
+#endif
+ va_end(ap);
+}
+
+/* create a simple list widget */
+GtkWidget *
+simple_list_new(gint cols, const gchar **titles) {
+ GtkWidget *plugins_list;
+#if GTK_MAJOR_VERSION >= 2
+ int i;
+ GtkListStore *store;
+ GtkCellRenderer *renderer;
+ GtkTreeViewColumn *column;
+#endif
+
+
+#if GTK_MAJOR_VERSION < 2
+ plugins_list = gtk_clist_new_with_titles(cols, (gchar **) titles);
+ gtk_clist_set_selection_mode(GTK_CLIST(plugins_list), GTK_SELECTION_SINGLE);
+ gtk_clist_column_titles_passive(GTK_CLIST(plugins_list));
+ if(titles) {
+ gtk_clist_column_titles_show(GTK_CLIST(plugins_list));
+ } else {
+ gtk_clist_column_titles_hide(GTK_CLIST(plugins_list));
+ }
+ gtk_clist_set_column_auto_resize(GTK_CLIST(plugins_list), 0, TRUE);
+ gtk_clist_set_column_auto_resize(GTK_CLIST(plugins_list), 1, TRUE);
+#else
+ g_assert(cols <= 10);
+ store = gtk_list_store_new(cols,
+ G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING,
+ G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
+ plugins_list = tree_view_new(GTK_TREE_MODEL(store));
+ g_object_unref(G_OBJECT(store));
+ gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(plugins_list), (titles != NULL));
+ for(i=0; i<cols; i++) {
+ renderer = gtk_cell_renderer_text_new();
+ column = gtk_tree_view_column_new_with_attributes(titles ? titles[i] : "", renderer,
+ "text", i, NULL);
+ gtk_tree_view_column_set_sort_column_id(column, i);
+ gtk_tree_view_append_column(GTK_TREE_VIEW(plugins_list), column);
+ }
+#endif
+
+ return plugins_list;
+}
+
+extern void
+copy_to_clipboard(GString *str)
+{
+#if (GTK_MAJOR_VERSION >= 2)
+ GtkClipboard *cb;
+
+ cb = gtk_clipboard_get(GDK_SELECTION_CLIPBOARD); /* Get the default clipboard */
+ gtk_clipboard_set_text(cb, str->str, -1); /* Copy the byte data into the clipboard */
+#else
+ GtkWidget *window;
+ GtkWidget *text;
+
+ window = window_new (GTK_WINDOW_TOPLEVEL,"");
+ text = gtk_text_new (NULL, NULL); /* Create the GtkText widget */
+ gtk_container_add (GTK_CONTAINER (window), text); /* Avoid a GTK assertion */
+ gtk_widget_realize (text); /* Realizing a widget creates a window for it, ready for us to insert some text */
+ gtk_text_insert (GTK_TEXT (text), NULL, NULL, NULL, str->str, -1);
+ gtk_editable_select_region((GtkEditable *)text, 0, -1); /* Select ALL text */
+ gtk_editable_copy_clipboard((GtkEditable *)text); /* Copy the byte data into the clipboard */
+#endif
+}
+
+/*
+ * Create a new window title string with user-defined title preference.
+ * (Or ignore it if unspecified).
+ */
+gchar *
+create_user_window_title(const gchar *caption)
+{
+ /* fail-safe */
+ if (caption == NULL)
+ return g_strdup("");
+
+ /* no user-defined title specified */
+ if ((prefs.gui_window_title == NULL) || (*prefs.gui_window_title == '\0'))
+ return g_strdup(caption);
+
+ return g_strdup_printf("%s %s", prefs.gui_window_title, caption);
+}
diff --git a/gtk/ui_util.h b/gtk/gui_utils.h index 99f89541ff..898b32f9f0 100644 --- a/gtk/ui_util.h +++ b/gtk/gui_utils.h @@ -1,308 +1,308 @@ -/* ui_util.h - * Definitions for UI utility routines - * - * $Id$ - * - * Ethereal - Network traffic analyzer - * By Gerald Combs <gerald@ethereal.com> - * Copyright 1998 Gerald Combs - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License - * as published by the Free Software Foundation; either version 2 - * of the License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef __GTKGUIUI_UTIL_H__ -#define __GTKGUIUI_UTIL_H__ - -/** @defgroup windows_group Windows - * - * There are the following toplevel windows: - * - * - @ref main_window_group - * - Statistic Windows (several different statistic windows) - * - * See: @ref howto_window_page for details. - * - */ - -/** @page howto_window_page How to develop a window / dialog - * - * Windows and dialogs are related to each other. Dialogs are special kind of windows, but they behave - * slightly different. Dialogs stick on it's parent window, normal windows will be much more independant - * from it's parent window. Dialogs should be used to ask or note the user something, while windows should - * show data independantly from the main window. - * Dialogs are created by calling dlg_window_new() which in turn will call window_new(). - * After that, dialogs can be developed the same way as windows, all window related functions in ui_util.h - * can be used for both. - * - * @section window_create Create a window - * - * A typical window / dialog will be created by the following calls: - * - * - window_new() will create a new window with default position and size, - * use dlg_window_new() if you need a dialog (transient to the main window) - * - gtk_window_set_default_size() to set the default size of the window. Only - * needed, if the initial size is not appropriate, e.g. when a scrolled_window_new() is used. - * Be sure that the given size is larger than the initial size, otherwise the window might - * clip the content (at least on GTK1) - * - SIGNAL_CONNECT(my_win, "destroy", my_destroy_cb, NULL) callback, if some cleanup needs to be - * done after the window is destroyed, e.g. free up memory, or set the window pointer - * of a singleton window (only one instance allowed, e.g. about dialog) back to zero - * - create and fill in the content and button widgets - * - gtk_widget_show_all() shows all the widgets in the window - * - window_present() present the window on screen and - * (if available) set previously saved position and size - * - * @section window_events Events - * - * The following events are usually interesting: - * - * - "delete_event": the window managers "X" (e.g. upper right edge) of the window - * was clicked, default handler will call gtk_widget_destroy() - * - "destroy": everything is already gone, only cleanup of left over ressources - * can/should be done now - * - * @section window_hints Hints - * - * If you want to save size and position, be sure to call window_destroy() instead of only - * gtk_widget_destroy(), so you will probably have to SIGNAL_CONNECT to the "delete_event"! - * - * Don't use WIDGET_SET_SIZE() to set the size of a window, - * use gtk_window_set_default_size() for that purpose! - * - * Be sure to call window_present() / window_destroy() appropriately, if you - * want to have size and position of the window handled by ui_util. - * - */ - -/** @file - * Utilities for Windows and other user interface functions. See: @ref howto_window_page for details. - * @ingroup dialog_group - * @ingroup windows_group - */ - -/** @name Window Functions - * @todo Move these window functions to a new file win_utils.h? - * @{ */ - -/** Create a new window with the Ethereal icon. - * If you want to create a dialog, use dlg_window_new() instead. - * - * @param type window type, typical GTK_WINDOW_TOPLEVEL - * @param title the title for the new window - * @return the newly created window - */ -extern GtkWidget *window_new(GtkWindowType type, const gchar *title); - -/** Same as window_new(), but will keep its geometry values (size, position, ...). - * Be sure to use window_present() and window_destroy() appropriately! - * - * @param type window type, typical GTK_WINDOW_TOPLEVEL - * @param title the title for the new window - * @param geom_name the name to distinguish this window, will also be used for the recent file (don't use special chars) - * @return the newly created window - */ -extern GtkWidget *window_new_with_geom(GtkWindowType type, const gchar *title, const gchar *geom_name); - -/** Create a new splash window, with no icon or title bar. - * - * @return the newly created window - */ -extern GtkWidget *splash_window_new(void); - -/** Present the created window on the top of the screen. This will put the window on top and - * (if available) set previously saved position and size. - * - * @param win the window from window_new() - */ -extern void window_present(GtkWidget *win); - -/** callback function for window_set_cancel_button() */ -typedef void (*window_cancel_button_fct) (GtkWidget *w, gpointer data); - -/** Register the default cancel button "Cancel"/"Close"/"Ok" of this window. - * This will set the callback function for this button, grab this button as the default one and - * set the "ESC" key handler to call the callback function if key is pressed. - * - * @param win the window from window_new() - * @param bt the default button of this window - * @param cb callback function to be called, when this button is pressed - */ -extern void window_set_cancel_button(GtkWidget *win, GtkWidget *bt, window_cancel_button_fct cb); - -/** Remember the current window position / size and then destroy the window. - * It's important to call this instead of gtk_widget_destroy() when using window_new_with_geom(). - * - * @param win the window from window_new() - */ -extern void window_destroy(GtkWidget *win); - -/** Default callback handler for cancel button "clicked" signal. - * Use this for window_set_cancel_button(), if no user specific functionality required, - * will simply call window_destroy() - */ -extern void window_cancel_button_cb(GtkWidget *w _U_, gpointer data); - -/** Default callback handler if the window managers X of the window was clicked (delete_event). - * Use this for SIGNAL_CONNECT(), if no user specific functionality required, - * will simply call window_destroy() - */ -extern gboolean window_delete_event_cb(GtkWidget *win, GdkEvent *event _U_, gpointer user_data _U_); - -/** geometry values for use in window_get_geometry() and window_set_geometry() */ -typedef struct window_geometry_s { - gchar *key; /**< current key in hashtable (internally used only) */ - gboolean set_pos; /**< set the x and y position values */ - gint x; /**< the windows x position */ - gint y; /**< the windows y position */ - gboolean set_size; /**< set the width and height values */ - gint width; /**< the windows width */ - gint height; /**< the windows height */ - - gboolean set_maximized; /**< set the maximized state (GTK2 only) */ - gboolean maximized; /**< the windows maximized state (GTK2 only) */ -} window_geometry_t; - -/** Get the geometry of a window. - * - * @param win the window from window_new() - * @param geom the current geometry values of the window, the set_xy values will not be used - * @todo if main uses the window_new_with_geom() to save size and such, make this function static - */ -extern void window_get_geometry(GtkWidget *win, window_geometry_t *geom); -/** Set the geometry of a window. - * - * @param win the window from window_new() - * @param geom the new geometry values of the window - * @todo if main uses the window_new_with_geom() to save size and such, make this function static - */ -extern void window_set_geometry(GtkWidget *win, window_geometry_t *geom); - -/** Write all geometry values of all windows to the recent file. - * Will call write_recent_geom() for every existing window type. - * - * @param rf recent file handle from caller - */ -extern void window_geom_recent_write_all(gpointer rf); - -/** Read in a single geometry key value pair from the recent file. - * - * @param name the geom_name of the window - * @param key the subkey of this pair (e.g. "x") - * @param value the new value (e.g. "123") - */ -extern void window_geom_recent_read_pair(const char *name, const char *key, const char *value); - -/** Raise a top-level window and de-iconify it. - * This routine is used if the user has done something to - * ask that a window of a certain type be popped up when there can be only - * one such window and such a window has already been popped up - we - * pop up the existing one rather than creating a new one. - * - * @param win the window from window_new() to be reactivated - */ -extern void reactivate_window(GtkWidget *win); - -/** @} */ - -/** Create a GtkScrolledWindow, set its scrollbar placement appropriately, - * and remember it. - * - * @param hadjustment horizontal adjustment - * @param vadjustment vertical adjustment - * @return the new scrolled window - */ -extern GtkWidget *scrolled_window_new(GtkAdjustment *hadjustment, - GtkAdjustment *vadjustment); - -/** Set the scrollbar placement of all scrolled windows based on user - preference. */ -extern void set_scrollbar_placement_all(void); - -#if GTK_MAJOR_VERSION < 2 -/** Create a GtkCTree, give it the right styles, and remember it. - * - * @param columns the number of columns - * @param tree_column which column has the tree graphic - * @return the newly created GtkCTree - */ -extern GtkWidget *ctree_new(gint columns, gint tree_column); -/** Create a GtkCTree, give it the right styles, and remember it. - * - * @param columns the number of columns - * @param tree_column which column has the tree graphic - * @param titles the titles of all columns - * @return the newly created GtkCTree - */ -extern GtkWidget *ctree_new_with_titles(gint columns, gint tree_column, - const gchar *titles[]); -#else -/** Create a GtkTreeView, give it the right styles, and remember it. - * - * @param model the model (the data) of this tree view - */ -extern GtkWidget *tree_view_new(GtkTreeModel *model); -#endif - -/** Create a simple list widget. - * - * @param cols number of columns - * @param titles the titles of all columns - * @return the new simple list widget - */ -extern GtkWidget *simple_list_new(gint cols, const gchar **titles); -/** Append a row to the simple list. - * - * @param list the list from simple_list_new() - * @param ... row and title, finished by -1 (e.g.: 0, "first", 1, "second", -1). - */ -extern void simple_list_append(GtkWidget *list, ...); - - - -/** Set the styles of all Trees based upon user preferences. */ -extern void set_tree_styles_all(void); - -/** Convert an xpm picture into a GtkWidget showing it. - * Beware: Ethereal's main window must already be visible! - * - * @param xpm the character array containing the picture - * @return a newly created GtkWidget showing the picture - */ -extern GtkWidget *xpm_to_widget(const char ** xpm); - -/** Convert an xpm picture into a GtkWidget showing it. - * Beware: the given parent window must already be visible! - * - * @param parent the parent window of to widget to be generated - * @param xpm the character array containing the picture - * @return a newly created GtkWidget showing the picture - */ -extern GtkWidget *xpm_to_widget_from_parent(GtkWidget *parent, const char ** xpm); - -/** Copy a GString to the clipboard. - * - * @param str GString that is to be copied to the clipboard. - */ -extern void copy_to_clipboard(GString *str); - -/** Create a new window title that includes user-defined preference string. - * - * @param caption string you want included in title (appended to user-defined string) - * @return a newly created title string including user-defined preference (if specified) - */ -extern gchar *create_user_window_title(const gchar *caption); - - -#endif /* __GTKGUIUI_UTIL_H__ */ +/* gui_utils.h
+ * Definitions for UI utility routines
+ *
+ * $Id: ui_util.h 15263 2005-08-08 17:22:55Z ulfl $
+ *
+ * Ethereal - Network traffic analyzer
+ * By Gerald Combs <gerald@ethereal.com>
+ * Copyright 1998 Gerald Combs
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * as published by the Free Software Foundation; either version 2
+ * of the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __GTKGUIUI_UTIL_H__
+#define __GTKGUIUI_UTIL_H__
+
+/** @defgroup windows_group Windows
+ *
+ * There are the following toplevel windows:
+ *
+ * - @ref main_window_group
+ * - Statistic Windows (several different statistic windows)
+ *
+ * See: @ref howto_window_page for details.
+ *
+ */
+
+/** @page howto_window_page How to develop a window / dialog
+ *
+ * Windows and dialogs are related to each other. Dialogs are special kind of windows, but they behave
+ * slightly different. Dialogs stick on it's parent window, normal windows will be much more independant
+ * from it's parent window. Dialogs should be used to ask or note the user something, while windows should
+ * show data independantly from the main window.
+ * Dialogs are created by calling dlg_window_new() which in turn will call window_new().
+ * After that, dialogs can be developed the same way as windows, all window related functions in gui_utils.h
+ * can be used for both.
+ *
+ * @section window_create Create a window
+ *
+ * A typical window / dialog will be created by the following calls:
+ *
+ * - window_new() will create a new window with default position and size,
+ * use dlg_window_new() if you need a dialog (transient to the main window)
+ * - gtk_window_set_default_size() to set the default size of the window. Only
+ * needed, if the initial size is not appropriate, e.g. when a scrolled_window_new() is used.
+ * Be sure that the given size is larger than the initial size, otherwise the window might
+ * clip the content (at least on GTK1)
+ * - SIGNAL_CONNECT(my_win, "destroy", my_destroy_cb, NULL) callback, if some cleanup needs to be
+ * done after the window is destroyed, e.g. free up memory, or set the window pointer
+ * of a singleton window (only one instance allowed, e.g. about dialog) back to zero
+ * - create and fill in the content and button widgets
+ * - gtk_widget_show_all() shows all the widgets in the window
+ * - window_present() present the window on screen and
+ * (if available) set previously saved position and size
+ *
+ * @section window_events Events
+ *
+ * The following events are usually interesting:
+ *
+ * - "delete_event": the window managers "X" (e.g. upper right edge) of the window
+ * was clicked, default handler will call gtk_widget_destroy()
+ * - "destroy": everything is already gone, only cleanup of left over ressources
+ * can/should be done now
+ *
+ * @section window_hints Hints
+ *
+ * If you want to save size and position, be sure to call window_destroy() instead of only
+ * gtk_widget_destroy(), so you will probably have to SIGNAL_CONNECT to the "delete_event"!
+ *
+ * Don't use WIDGET_SET_SIZE() to set the size of a window,
+ * use gtk_window_set_default_size() for that purpose!
+ *
+ * Be sure to call window_present() / window_destroy() appropriately, if you
+ * want to have size and position of the window handled by ui_util.
+ *
+ */
+
+/** @file
+ * Utilities for Windows and other user interface functions. See: @ref howto_window_page for details.
+ * @ingroup dialog_group
+ * @ingroup windows_group
+ */
+
+/** @name Window Functions
+ * @todo Move these window functions to a new file win_utils.h?
+ * @{ */
+
+/** Create a new window with the Ethereal icon.
+ * If you want to create a dialog, use dlg_window_new() instead.
+ *
+ * @param type window type, typical GTK_WINDOW_TOPLEVEL
+ * @param title the title for the new window
+ * @return the newly created window
+ */
+extern GtkWidget *window_new(GtkWindowType type, const gchar *title);
+
+/** Same as window_new(), but will keep its geometry values (size, position, ...).
+ * Be sure to use window_present() and window_destroy() appropriately!
+ *
+ * @param type window type, typical GTK_WINDOW_TOPLEVEL
+ * @param title the title for the new window
+ * @param geom_name the name to distinguish this window, will also be used for the recent file (don't use special chars)
+ * @return the newly created window
+ */
+extern GtkWidget *window_new_with_geom(GtkWindowType type, const gchar *title, const gchar *geom_name);
+
+/** Create a new splash window, with no icon or title bar.
+ *
+ * @return the newly created window
+ */
+extern GtkWidget *splash_window_new(void);
+
+/** Present the created window on the top of the screen. This will put the window on top and
+ * (if available) set previously saved position and size.
+ *
+ * @param win the window from window_new()
+ */
+extern void window_present(GtkWidget *win);
+
+/** callback function for window_set_cancel_button() */
+typedef void (*window_cancel_button_fct) (GtkWidget *w, gpointer data);
+
+/** Register the default cancel button "Cancel"/"Close"/"Ok" of this window.
+ * This will set the callback function for this button, grab this button as the default one and
+ * set the "ESC" key handler to call the callback function if key is pressed.
+ *
+ * @param win the window from window_new()
+ * @param bt the default button of this window
+ * @param cb callback function to be called, when this button is pressed
+ */
+extern void window_set_cancel_button(GtkWidget *win, GtkWidget *bt, window_cancel_button_fct cb);
+
+/** Remember the current window position / size and then destroy the window.
+ * It's important to call this instead of gtk_widget_destroy() when using window_new_with_geom().
+ *
+ * @param win the window from window_new()
+ */
+extern void window_destroy(GtkWidget *win);
+
+/** Default callback handler for cancel button "clicked" signal.
+ * Use this for window_set_cancel_button(), if no user specific functionality required,
+ * will simply call window_destroy()
+ */
+extern void window_cancel_button_cb(GtkWidget *w _U_, gpointer data);
+
+/** Default callback handler if the window managers X of the window was clicked (delete_event).
+ * Use this for SIGNAL_CONNECT(), if no user specific functionality required,
+ * will simply call window_destroy()
+ */
+extern gboolean window_delete_event_cb(GtkWidget *win, GdkEvent *event _U_, gpointer user_data _U_);
+
+/** geometry values for use in window_get_geometry() and window_set_geometry() */
+typedef struct window_geometry_s {
+ gchar *key; /**< current key in hashtable (internally used only) */
+ gboolean set_pos; /**< set the x and y position values */
+ gint x; /**< the windows x position */
+ gint y; /**< the windows y position */
+ gboolean set_size; /**< set the width and height values */
+ gint width; /**< the windows width */
+ gint height; /**< the windows height */
+
+ gboolean set_maximized; /**< set the maximized state (GTK2 only) */
+ gboolean maximized; /**< the windows maximized state (GTK2 only) */
+} window_geometry_t;
+
+/** Get the geometry of a window.
+ *
+ * @param win the window from window_new()
+ * @param geom the current geometry values of the window, the set_xy values will not be used
+ * @todo if main uses the window_new_with_geom() to save size and such, make this function static
+ */
+extern void window_get_geometry(GtkWidget *win, window_geometry_t *geom);
+/** Set the geometry of a window.
+ *
+ * @param win the window from window_new()
+ * @param geom the new geometry values of the window
+ * @todo if main uses the window_new_with_geom() to save size and such, make this function static
+ */
+extern void window_set_geometry(GtkWidget *win, window_geometry_t *geom);
+
+/** Write all geometry values of all windows to the recent file.
+ * Will call write_recent_geom() for every existing window type.
+ *
+ * @param rf recent file handle from caller
+ */
+extern void window_geom_recent_write_all(gpointer rf);
+
+/** Read in a single geometry key value pair from the recent file.
+ *
+ * @param name the geom_name of the window
+ * @param key the subkey of this pair (e.g. "x")
+ * @param value the new value (e.g. "123")
+ */
+extern void window_geom_recent_read_pair(const char *name, const char *key, const char *value);
+
+/** Raise a top-level window and de-iconify it.
+ * This routine is used if the user has done something to
+ * ask that a window of a certain type be popped up when there can be only
+ * one such window and such a window has already been popped up - we
+ * pop up the existing one rather than creating a new one.
+ *
+ * @param win the window from window_new() to be reactivated
+ */
+extern void reactivate_window(GtkWidget *win);
+
+/** @} */
+
+/** Create a GtkScrolledWindow, set its scrollbar placement appropriately,
+ * and remember it.
+ *
+ * @param hadjustment horizontal adjustment
+ * @param vadjustment vertical adjustment
+ * @return the new scrolled window
+ */
+extern GtkWidget *scrolled_window_new(GtkAdjustment *hadjustment,
+ GtkAdjustment *vadjustment);
+
+/** Set the scrollbar placement of all scrolled windows based on user
+ preference. */
+extern void set_scrollbar_placement_all(void);
+
+#if GTK_MAJOR_VERSION < 2
+/** Create a GtkCTree, give it the right styles, and remember it.
+ *
+ * @param columns the number of columns
+ * @param tree_column which column has the tree graphic
+ * @return the newly created GtkCTree
+ */
+extern GtkWidget *ctree_new(gint columns, gint tree_column);
+/** Create a GtkCTree, give it the right styles, and remember it.
+ *
+ * @param columns the number of columns
+ * @param tree_column which column has the tree graphic
+ * @param titles the titles of all columns
+ * @return the newly created GtkCTree
+ */
+extern GtkWidget *ctree_new_with_titles(gint columns, gint tree_column,
+ const gchar *titles[]);
+#else
+/** Create a GtkTreeView, give it the right styles, and remember it.
+ *
+ * @param model the model (the data) of this tree view
+ */
+extern GtkWidget *tree_view_new(GtkTreeModel *model);
+#endif
+
+/** Create a simple list widget.
+ *
+ * @param cols number of columns
+ * @param titles the titles of all columns
+ * @return the new simple list widget
+ */
+extern GtkWidget *simple_list_new(gint cols, const gchar **titles);
+/** Append a row to the simple list.
+ *
+ * @param list the list from simple_list_new()
+ * @param ... row and title, finished by -1 (e.g.: 0, "first", 1, "second", -1).
+ */
+extern void simple_list_append(GtkWidget *list, ...);
+
+
+
+/** Set the styles of all Trees based upon user preferences. */
+extern void set_tree_styles_all(void);
+
+/** Convert an xpm picture into a GtkWidget showing it.
+ * Beware: Ethereal's main window must already be visible!
+ *
+ * @param xpm the character array containing the picture
+ * @return a newly created GtkWidget showing the picture
+ */
+extern GtkWidget *xpm_to_widget(const char ** xpm);
+
+/** Convert an xpm picture into a GtkWidget showing it.
+ * Beware: the given parent window must already be visible!
+ *
+ * @param parent the parent window of to widget to be generated
+ * @param xpm the character array containing the picture
+ * @return a newly created GtkWidget showing the picture
+ */
+extern GtkWidget *xpm_to_widget_from_parent(GtkWidget *parent, const char ** xpm);
+
+/** Copy a GString to the clipboard.
+ *
+ * @param str GString that is to be copied to the clipboard.
+ */
+extern void copy_to_clipboard(GString *str);
+
+/** Create a new window title that includes user-defined preference string.
+ *
+ * @param caption string you want included in title (appended to user-defined string)
+ * @return a newly created title string including user-defined preference (if specified)
+ */
+extern gchar *create_user_window_title(const gchar *caption);
+
+
+#endif /* __GTKGUIUI_UTIL_H__ */
diff --git a/gtk/h225_counter.c b/gtk/h225_counter.c index 6c172e3c8f..8fa95e63ee 100644 --- a/gtk/h225_counter.c +++ b/gtk/h225_counter.c @@ -52,7 +52,7 @@ #include "../globals.h" #include "../tap_dfilter_dlg.h" #include "tap_dfilter_dlg.h" -#include "ui_util.h" +#include "gui_utils.h" static void gtk_h225counter_init(const char *optarg); diff --git a/gtk/h225_ras_srt.c b/gtk/h225_ras_srt.c index e55e353b64..5c04136806 100644 --- a/gtk/h225_ras_srt.c +++ b/gtk/h225_ras_srt.c @@ -53,7 +53,7 @@ #include "../globals.h" #include "../tap_dfilter_dlg.h" #include "tap_dfilter_dlg.h" -#include "ui_util.h" +#include "gui_utils.h" static void gtk_h225rassrt_init(const char *optarg); diff --git a/gtk/help_dlg.c b/gtk/help_dlg.c index 91810117b5..2af00ce804 100644 --- a/gtk/help_dlg.c +++ b/gtk/help_dlg.c @@ -37,7 +37,7 @@ #include "text_page.h" #include <epan/prefs.h> #include "gtkglobals.h" -#include "ui_util.h" +#include "gui_utils.h" #include "compat_macros.h" #include "dlg_utils.h" #include "simple_dialog.h" diff --git a/gtk/hostlist_table.c b/gtk/hostlist_table.c index 7ad13d8a0a..c7265506e8 100644 --- a/gtk/hostlist_table.c +++ b/gtk/hostlist_table.c @@ -50,7 +50,7 @@ #include "gtk/color_dlg.h" #include "gtkglobals.h" #include "main.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "help_dlg.h" diff --git a/gtk/io_stat.c b/gtk/io_stat.c index 7078a2ebd8..100b5e934f 100644 --- a/gtk/io_stat.c +++ b/gtk/io_stat.c @@ -41,7 +41,7 @@ #include <epan/packet_info.h> #include "gtkglobals.h" -#include "ui_util.h" +#include "gui_utils.h" #include <epan/stat.h> #include "stat_menu.h" #include <epan/tap.h> diff --git a/gtk/layout_prefs.c b/gtk/layout_prefs.c index b198df8a5c..09cc42d3ce 100644 --- a/gtk/layout_prefs.c +++ b/gtk/layout_prefs.c @@ -31,10 +31,8 @@ #include "globals.h" #include "layout_prefs.h" #include "gtkglobals.h" -/*#include <epan/resolv.h>*/ #include <epan/prefs.h> -/*#include "prefs_dlg.h"*/ -#include "ui_util.h" +#include "gui_utils.h" #include "main.h" #include "compat_macros.h" #include "dlg_utils.h" diff --git a/gtk/ldap_stat.c b/gtk/ldap_stat.c index 3fd02857c9..f9428e3754 100644 --- a/gtk/ldap_stat.c +++ b/gtk/ldap_stat.c @@ -46,7 +46,7 @@ #include "../timestats.h" #include "compat_macros.h" #include "../simple_dialog.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "../file.h" #include "../globals.h" diff --git a/gtk/main.c b/gtk/main.c index 6aa20ab69a..351bf1347a 100644 --- a/gtk/main.c +++ b/gtk/main.c @@ -81,7 +81,7 @@ #include "register.h" #include <epan/prefs-int.h> #include "ringbuffer.h" -#include "../ui_util.h" /* beware: ui_util.h exists twice! */ +#include "../ui_util.h" #include <epan/tap.h> #include <epan/stat.h> #include "util.h" @@ -110,7 +110,7 @@ #include "dlg_utils.h" #include "gtkglobals.h" #include "colors.h" -#include "ui_util.h" /* beware: ui_util.h exists twice! */ +#include "gui_utils.h" #include "compat_macros.h" #include "main.h" diff --git a/gtk/mgcp_stat.c b/gtk/mgcp_stat.c index fd7eb50cd1..9b24356f9a 100644 --- a/gtk/mgcp_stat.c +++ b/gtk/mgcp_stat.c @@ -53,7 +53,7 @@ #include "../globals.h" #include "../tap_dfilter_dlg.h" #include "tap_dfilter_dlg.h" -#include "ui_util.h" +#include "gui_utils.h" #define NUM_TIMESTATS 10 diff --git a/gtk/mtp3_stat.c b/gtk/mtp3_stat.c index 4f350c0a04..8bcf0b275a 100644 --- a/gtk/mtp3_stat.c +++ b/gtk/mtp3_stat.c @@ -52,7 +52,7 @@ #include "../globals.h" #include "filter_dlg.h" #include "compat_macros.h" -#include "ui_util.h" +#include "gui_utils.h" #include <epan/dissectors/packet-mtp3.h> #include "mtp3_stat.h" diff --git a/gtk/mtp3_summary.c b/gtk/mtp3_summary.c index 0de9494d6a..55e061cfc3 100644 --- a/gtk/mtp3_summary.c +++ b/gtk/mtp3_summary.c @@ -46,7 +46,7 @@ #include "image/clist_ascend.xpm" #include "image/clist_descend.xpm" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "compat_macros.h" #include <epan/tap.h> diff --git a/gtk/nameres_prefs.c b/gtk/nameres_prefs.c index f3fb415b2d..22d701009d 100644 --- a/gtk/nameres_prefs.c +++ b/gtk/nameres_prefs.c @@ -34,7 +34,7 @@ #include <epan/addr_resolv.h> #include <epan/prefs.h> #include "prefs_dlg.h" -#include "ui_util.h" +#include "gui_utils.h" #include "main.h" #include "menu.h" #include "compat_macros.h" diff --git a/gtk/packet_list.c b/gtk/packet_list.c index 5d2f414de9..2b00695d8f 100644 --- a/gtk/packet_list.c +++ b/gtk/packet_list.c @@ -35,7 +35,7 @@ #include "color.h" #include "color_filters.h" #include "../ui_util.h" -#include "ui_util.h" +#include "gui_utils.h" #include "main.h" #include "menu.h" #include "colors.h" diff --git a/gtk/packet_win.c b/gtk/packet_win.c index 427b4fe9d1..07321be5a0 100644 --- a/gtk/packet_win.c +++ b/gtk/packet_win.c @@ -56,7 +56,7 @@ #include "proto_draw.h" #include "keys.h" #include "gtkglobals.h" -#include "ui_util.h" +#include "gui_utils.h" #include <epan/plugins.h> #include <epan/epan_dissect.h> #include "compat_macros.h" diff --git a/gtk/plugins_dlg.c b/gtk/plugins_dlg.c index 90d4f47c8d..f7015f4e98 100644 --- a/gtk/plugins_dlg.c +++ b/gtk/plugins_dlg.c @@ -31,7 +31,7 @@ #include "globals.h" #include <epan/plugins.h> #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "compat_macros.h" #ifdef HAVE_PLUGINS diff --git a/gtk/prefs_dlg.c b/gtk/prefs_dlg.c index 6854008b03..69d5ee5539 100644 --- a/gtk/prefs_dlg.c +++ b/gtk/prefs_dlg.c @@ -45,7 +45,7 @@ #include "layout_prefs.h" #include "capture_prefs.h" #include "nameres_prefs.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "simple_dialog.h" #include "compat_macros.h" diff --git a/gtk/print_dlg.c b/gtk/print_dlg.c index 31c2395fe4..1992dc3081 100644 --- a/gtk/print_dlg.c +++ b/gtk/print_dlg.c @@ -37,7 +37,7 @@ #include "alert_box.h" #include "simple_dialog.h" #include "file_dlg.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "main.h" #include <epan/epan_dissect.h> diff --git a/gtk/print_prefs.c b/gtk/print_prefs.c index ad6e13327a..451c50f400 100644 --- a/gtk/print_prefs.c +++ b/gtk/print_prefs.c @@ -36,7 +36,7 @@ #include <epan/prefs.h> #include "prefs_dlg.h" #include "util.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "file_dlg.h" #include "compat_macros.h" diff --git a/gtk/progress_dlg.c b/gtk/progress_dlg.c index 120763774f..1adb0a9743 100644 --- a/gtk/progress_dlg.c +++ b/gtk/progress_dlg.c @@ -31,7 +31,7 @@ #include <gtk/gtk.h> #include "gtkglobals.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "progress_dlg.h" #include "compat_macros.h" diff --git a/gtk/proto_dlg.c b/gtk/proto_dlg.c index 7b968c8b6f..2772168a0e 100644 --- a/gtk/proto_dlg.c +++ b/gtk/proto_dlg.c @@ -35,7 +35,7 @@ #include "globals.h" #include "main.h" #include "util.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "proto_dlg.h" #include "simple_dialog.h" diff --git a/gtk/proto_draw.c b/gtk/proto_draw.c index 59f8fe8194..a9e0f2c29e 100644 --- a/gtk/proto_draw.c +++ b/gtk/proto_draw.c @@ -64,7 +64,7 @@ #include "proto_draw.h" #include "packet_win.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "gtkglobals.h" #include "compat_macros.h" #include "alert_box.h" diff --git a/gtk/proto_hier_stats_dlg.c b/gtk/proto_hier_stats_dlg.c index d9e4b0cdde..3f9f3f4769 100644 --- a/gtk/proto_hier_stats_dlg.c +++ b/gtk/proto_hier_stats_dlg.c @@ -30,7 +30,7 @@ #include "proto_hier_stats.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "main.h" #include "compat_macros.h" #include "help_dlg.h" diff --git a/gtk/range_utils.c b/gtk/range_utils.c index b35894275c..19ea06cb97 100644 --- a/gtk/range_utils.c +++ b/gtk/range_utils.c @@ -33,7 +33,7 @@ #include "globals.h" #include "packet-range.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "compat_macros.h" #include "simple_dialog.h" diff --git a/gtk/recent.c b/gtk/recent.c index 7849d5e99f..c51ea5d118 100644 --- a/gtk/recent.c +++ b/gtk/recent.c @@ -39,7 +39,7 @@ #include "main.h" #include <epan/prefs.h> #include <epan/prefs-int.h> -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "cfilter_combo_utils.h" #include "simple_dialog.h" diff --git a/gtk/rpc_progs.c b/gtk/rpc_progs.c index 03d4f06bc7..a69fa8053f 100644 --- a/gtk/rpc_progs.c +++ b/gtk/rpc_progs.c @@ -43,7 +43,7 @@ #include "../register.h" #include <epan/dissectors/packet-rpc.h> #include "../globals.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "compat_macros.h" diff --git a/gtk/rpc_stat.c b/gtk/rpc_stat.c index f1f9bcb3cc..53decfc517 100644 --- a/gtk/rpc_stat.c +++ b/gtk/rpc_stat.c @@ -40,7 +40,7 @@ #include <epan/stat.h> #include "stat_menu.h" #include "simple_dialog.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include <epan/tap.h> #include "../register.h" diff --git a/gtk/rtp_analysis.c b/gtk/rtp_analysis.c index fb38cdac1c..be4f2763e8 100644 --- a/gtk/rtp_analysis.c +++ b/gtk/rtp_analysis.c @@ -65,7 +65,7 @@ #include <epan/stat.h> #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "alert_box.h" #include "simple_dialog.h" #include "stat_menu.h" diff --git a/gtk/rtp_stream_dlg.c b/gtk/rtp_stream_dlg.c index 548697eb4b..7ba93641cc 100644 --- a/gtk/rtp_stream_dlg.c +++ b/gtk/rtp_stream_dlg.c @@ -38,7 +38,7 @@ #include "stat_menu.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "compat_macros.h" #include "gtkglobals.h" diff --git a/gtk/sctp_assoc_analyse.c b/gtk/sctp_assoc_analyse.c index 2a0610c215..6354a14edb 100644 --- a/gtk/sctp_assoc_analyse.c +++ b/gtk/sctp_assoc_analyse.c @@ -35,7 +35,7 @@ #include "register.h" #include "stat_menu.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "main.h" #include "compat_macros.h" diff --git a/gtk/sctp_byte_graph_dlg.c b/gtk/sctp_byte_graph_dlg.c index aaf60dc37c..4802014b3b 100644 --- a/gtk/sctp_byte_graph_dlg.c +++ b/gtk/sctp_byte_graph_dlg.c @@ -37,7 +37,7 @@ #include "../color.h" #include "stat_menu.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "main.h" #include "compat_macros.h" #include "simple_dialog.h" diff --git a/gtk/sctp_chunk_stat.c b/gtk/sctp_chunk_stat.c index 972ef49629..e81871446c 100644 --- a/gtk/sctp_chunk_stat.c +++ b/gtk/sctp_chunk_stat.c @@ -53,7 +53,7 @@ #include "../globals.h" #include "../tap_dfilter_dlg.h" #include "tap_dfilter_dlg.h" -#include "ui_util.h" +#include "gui_utils.h" static void sctpstat_init(const char *optarg); diff --git a/gtk/sctp_chunk_stat_dlg.c b/gtk/sctp_chunk_stat_dlg.c index cea840b03c..e5e330fca6 100644 --- a/gtk/sctp_chunk_stat_dlg.c +++ b/gtk/sctp_chunk_stat_dlg.c @@ -37,7 +37,7 @@ #include "stat_menu.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "main.h" #include "compat_macros.h" diff --git a/gtk/sctp_error_dlg.c b/gtk/sctp_error_dlg.c index e74c1af6f8..91211cd1c2 100644 --- a/gtk/sctp_error_dlg.c +++ b/gtk/sctp_error_dlg.c @@ -33,7 +33,7 @@ #include "simple_dialog.h" #include "stat_menu.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "main.h" #include "compat_macros.h" diff --git a/gtk/sctp_graph_dlg.c b/gtk/sctp_graph_dlg.c index e75df1f715..7bb7a92768 100644 --- a/gtk/sctp_graph_dlg.c +++ b/gtk/sctp_graph_dlg.c @@ -37,7 +37,7 @@ #include "../color.h" #include "stat_menu.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "main.h" #include "compat_macros.h" #include "simple_dialog.h" diff --git a/gtk/sctp_stat_dlg.c b/gtk/sctp_stat_dlg.c index 23de118f72..e497855569 100644 --- a/gtk/sctp_stat_dlg.c +++ b/gtk/sctp_stat_dlg.c @@ -37,7 +37,7 @@ #include "stat_menu.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "main.h" #include "compat_macros.h" diff --git a/gtk/service_response_time_table.c b/gtk/service_response_time_table.c index 9281766de0..9ef0c0b80c 100644 --- a/gtk/service_response_time_table.c +++ b/gtk/service_response_time_table.c @@ -44,7 +44,7 @@ #include "color.h" #include "gtk/color_dlg.h" #include "main.h" -#include "ui_util.h" +#include "gui_utils.h" #include "gtkglobals.h" diff --git a/gtk/simple_dialog.c b/gtk/simple_dialog.c index 249e19d662..39c953ac44 100644 --- a/gtk/simple_dialog.c +++ b/gtk/simple_dialog.c @@ -33,7 +33,7 @@ #include "gtkglobals.h" #include "simple_dialog.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "compat_macros.h" #include <epan/strutil.h> diff --git a/gtk/sip_stat.c b/gtk/sip_stat.c index 8554cc6528..e6ba9a8628 100644 --- a/gtk/sip_stat.c +++ b/gtk/sip_stat.c @@ -37,7 +37,7 @@ #include <epan/stat.h> #include "stat_menu.h" #include "simple_dialog.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include <epan/tap.h> #include "../register.h" diff --git a/gtk/smb_stat.c b/gtk/smb_stat.c index 5581bbf322..830471e432 100644 --- a/gtk/smb_stat.c +++ b/gtk/smb_stat.c @@ -46,7 +46,7 @@ #include "../timestats.h" #include "compat_macros.h" #include "../simple_dialog.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "../file.h" #include "../globals.h" diff --git a/gtk/stats_tree_stat.c b/gtk/stats_tree_stat.c index 0faf017cfb..7794a045b2 100644 --- a/gtk/stats_tree_stat.c +++ b/gtk/stats_tree_stat.c @@ -36,7 +36,7 @@ #include "globals.h" #include <epan/stat.h> #include "stat_menu.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include "compat_macros.h" #include "tap_dfilter_dlg.h" diff --git a/gtk/summary_dlg.c b/gtk/summary_dlg.c index 079862ed9d..d93bc8411f 100644 --- a/gtk/summary_dlg.c +++ b/gtk/summary_dlg.c @@ -43,7 +43,7 @@ #include "summary.h" #include "summary_dlg.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "compat_macros.h" #include "help_dlg.h" diff --git a/gtk/supported_protos_dlg.c b/gtk/supported_protos_dlg.c index a9978265c2..3b1def05f0 100644 --- a/gtk/supported_protos_dlg.c +++ b/gtk/supported_protos_dlg.c @@ -34,7 +34,7 @@ #include <epan/prefs.h> #include "globals.h" #include "gtkglobals.h" -#include "ui_util.h" +#include "gui_utils.h" #include "compat_macros.h" #include "dlg_utils.h" #include "font_utils.h" diff --git a/gtk/tap_dfilter_dlg.c b/gtk/tap_dfilter_dlg.c index be713cd836..262bc09ac7 100644 --- a/gtk/tap_dfilter_dlg.c +++ b/gtk/tap_dfilter_dlg.c @@ -44,7 +44,7 @@ #include "filter_dlg.h" #include "../tap_dfilter_dlg.h" #include "tap_dfilter_dlg.h" -#include "ui_util.h" +#include "gui_utils.h" #include "gtkglobals.h" diff --git a/gtk/tcp_graph.c b/gtk/tcp_graph.c index 1b48d014c6..11c5f98bad 100644 --- a/gtk/tcp_graph.c +++ b/gtk/tcp_graph.c @@ -38,7 +38,7 @@ #include <epan/packet.h> /* frame_data */ #include "gtkglobals.h" /* packet_list */ #include "simple_dialog.h" -#include "ui_util.h" +#include "gui_utils.h" #include "color.h" #include "compat_macros.h" #include "etypes.h" diff --git a/gtk/text_page.c b/gtk/text_page.c index 5bdb519b45..eb4d415682 100644 --- a/gtk/text_page.c +++ b/gtk/text_page.c @@ -34,7 +34,7 @@ #include "epan/filesystem.h" #include "text_page.h" -#include "ui_util.h" +#include "gui_utils.h" #include "compat_macros.h" #include "simple_dialog.h" #include "font_utils.h" diff --git a/gtk/voip_calls_dlg.c b/gtk/voip_calls_dlg.c index c02766ec8e..f05496bb67 100644 --- a/gtk/voip_calls_dlg.c +++ b/gtk/voip_calls_dlg.c @@ -53,7 +53,7 @@ #include <epan/stat.h> #include "stat_menu.h" #include "dlg_utils.h" -#include "ui_util.h" +#include "gui_utils.h" #include "compat_macros.h" #include "gtkglobals.h" diff --git a/gtk/wsp_stat.c b/gtk/wsp_stat.c index 463427073b..631a26c698 100644 --- a/gtk/wsp_stat.c +++ b/gtk/wsp_stat.c @@ -37,7 +37,7 @@ #include <epan/stat.h> #include "stat_menu.h" #include "simple_dialog.h" -#include "ui_util.h" +#include "gui_utils.h" #include "dlg_utils.h" #include <epan/tap.h> #include "../register.h" |