next step to save the size and postition of the dialogs (using a hashtable)

move the get/set window size functionality from main to ui_util,
add some functions to handle windows/dialogs.

changed help and about dialog to suit the current window API

svn path=/trunk/; revision=10974
This commit is contained in:
Ulf Lamping 2004-05-23 17:37:36 +00:00
parent 461c0d59cd
commit 01c236864a
7 changed files with 418 additions and 165 deletions

View File

@ -1,6 +1,6 @@
/* about_dlg.c
*
* $Id: about_dlg.c,v 1.10 2004/05/22 07:32:11 guy Exp $
* $Id: about_dlg.c,v 1.11 2004/05/23 17:37:36 ulfl Exp $
*
* Ulf Lamping <ulf.lamping@web.de>
*
@ -228,7 +228,16 @@ about_ethereal_cb( GtkWidget *w _U_, gpointer data _U_ )
* not? (The GNOME 1.x GnomeAbout widget uses GnomeDialog.)
*/
about_ethereal_w = dlg_window_new("About Ethereal");
SIGNAL_CONNECT(about_ethereal_w, "destroy", about_ethereal_destroy_cb, NULL);
/* set the initial position (must be done, before show is called!) */
/* default position is not appropriate for the about dialog */
#if GTK_MAJOR_VERSION >= 2
gtk_window_set_position(GTK_WINDOW(about_ethereal_w), GTK_WIN_POS_CENTER_ON_PARENT);
#else
gtk_window_set_position(GTK_WINDOW(about_ethereal_w), GTK_WIN_POS_CENTER);
#endif
/* setting the size is dangerous here, as making it too short will
* clip content on GTK1, so simply use the natural size */
/*gtk_window_set_default_size(GTK_WINDOW(about_ethereal_w), 600, 400);*/
gtk_container_border_width(GTK_CONTAINER(about_ethereal_w), 6);
main_vb = gtk_vbox_new(FALSE, 12);
@ -249,7 +258,6 @@ about_ethereal_cb( GtkWidget *w _U_, gpointer data _U_ )
#endif
folders_page = about_folders_page_new();
WIDGET_SET_SIZE(folders_page, 500, 200);
page_lb = gtk_label_new("Folders");
gtk_notebook_append_page(GTK_NOTEBOOK(main_nb), folders_page, page_lb);
@ -264,16 +272,13 @@ about_ethereal_cb( GtkWidget *w _U_, gpointer data _U_ )
gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
ok_btn = OBJECT_GET_DATA(bbox, GTK_STOCK_OK);
SIGNAL_CONNECT_OBJECT(ok_btn, "clicked", gtk_widget_destroy,
about_ethereal_w);
gtk_widget_grab_default(ok_btn);
window_set_cancel_button(about_ethereal_w, ok_btn, window_cancel_button_cb);
/* Catch the "key_press_event" signal in the window, so that we can catch
the ESC key being pressed and act as if the "Cancel" button had
been selected. */
dlg_set_cancel(about_ethereal_w, ok_btn);
SIGNAL_CONNECT(about_ethereal_w, "delete_event", window_delete_event_cb, NULL);
SIGNAL_CONNECT(about_ethereal_w, "destroy", about_ethereal_destroy_cb, NULL);
gtk_widget_show_all(about_ethereal_w);
window_present(about_ethereal_w);
}
static void

View File

@ -1,7 +1,7 @@
/* dlg_utils.c
* Utilities to use when constructing dialogs
*
* $Id: dlg_utils.c,v 1.31 2004/05/22 19:56:18 ulfl Exp $
* $Id: dlg_utils.c,v 1.32 2004/05/23 17:37:36 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -287,7 +287,7 @@ dlg_button_row_new(gchar *stock_id_first, ...)
/* this is called, when a dialog was closed */
void on_dialog_destroyed(GtkWidget *dialog _U_, gpointer data _U_)
void dlg_destroy_cb(GtkWidget *dialog, gpointer data)
{
#if GTK_MAJOR_VERSION >= 2
if(top_level) {
@ -296,9 +296,6 @@ void on_dialog_destroyed(GtkWidget *dialog _U_, gpointer data _U_)
gtk_window_present(GTK_WINDOW(top_level));
}
#endif
/* XXX - saved the size of this dialog */
/* currently unclear, how the dialogs should be identified */
}
@ -313,6 +310,7 @@ dlg_window_new(const gchar *title)
#else
win = window_new(GTK_WINDOW_TOPLEVEL, title);
#endif
/*
* XXX - if we're running in the capture child process, we can't easily
* make this window transient for the main process's window. We just
@ -331,34 +329,11 @@ dlg_window_new(const gchar *title)
gtk_window_set_transient_for(GTK_WINDOW(win), GTK_WINDOW(top_level));
}
SIGNAL_CONNECT(win, "destroy", on_dialog_destroyed, win);
SIGNAL_CONNECT(win, "destroy", dlg_destroy_cb, NULL);
return win;
}
void
dlg_window_present(GtkWidget *win, GtkWindowPosition pos)
{
/* to stay compatible with GTK1.x, only these three pos values are allowed */
g_assert(
pos == GTK_WIN_POS_NONE ||
pos == GTK_WIN_POS_CENTER ||
pos == GTK_WIN_POS_MOUSE); /* preferred for most dialogs */
#if GTK_MAJOR_VERSION >= 2
gtk_window_present(GTK_WINDOW(win));
if(pos == GTK_WIN_POS_CENTER) {
pos = GTK_WIN_POS_CENTER_ON_PARENT;
}
#endif
gtk_window_set_position(GTK_WINDOW(win), pos);
/* XXX - set a previously saved size of this dialog */
/* currently unclear, how the dialogs should be identified */
}
/* Create a file selection dialog box window that belongs to Ethereal's
main window. */

View File

@ -1,7 +1,7 @@
/* dlg_utils.h
* Declarations of utilities to use when constructing dialogs
*
* $Id: dlg_utils.h,v 1.13 2004/05/22 19:56:18 ulfl Exp $
* $Id: dlg_utils.h,v 1.14 2004/05/23 17:37:36 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -25,13 +25,10 @@
#ifndef __DLG_UTILS_H__
#define __DLG_UTILS_H__
/* Create a dialog box window that belongs to Ethereal's main window. */
/* Create a dialog box window that belongs to Ethereal's main window,
* see wíndow_new() for usage */
extern GtkWidget *dlg_window_new(const gchar *);
/* Show the created dialog box window. */
/* use GTK_WIN_POS_CENTER or GTK_WIN_POS_MOUSE only! */
extern void dlg_window_present(GtkWidget *win, GtkWindowPosition pos);
/* Create a file selection dialog box window that belongs to Ethereal's
main window. */
typedef enum {
@ -60,6 +57,8 @@ extern void dlg_set_activate(GtkWidget *widget, GtkWidget *ok_button);
the key being pressed is the <Esc> key. */
extern void dlg_set_cancel(GtkWidget *widget, GtkWidget *cancel_button);
/* used by compat_macros.h only */
extern GtkWidget *dlg_radio_button_new_with_label_with_mnemonic(GSList *group,
const gchar *label, GtkAccelGroup *accel_group);
extern GtkWidget *dlg_check_button_new_with_label_with_mnemonic(const gchar *label,

View File

@ -1,6 +1,6 @@
/* help_dlg.c
*
* $Id: help_dlg.c,v 1.52 2004/05/22 19:56:18 ulfl Exp $
* $Id: help_dlg.c,v 1.53 2004/05/23 17:37:36 ulfl Exp $
*
* Laurent Deniel <laurent.deniel@free.fr>
*
@ -48,7 +48,6 @@
#define NOTEBOOK_KEY "notebook_key"
#define TEXT_KEY "txt_key"
static void help_close_cb(GtkWidget *w, gpointer data);
static void help_destroy_cb(GtkWidget *w, gpointer data);
static void insert_text(GtkWidget *w, const char *buffer, int nchars);
static void set_help_text(GtkWidget *w, const char *help_file_path);
@ -98,7 +97,7 @@ GtkWidget * text_page_new(const char *absolute_path)
gtk_text_set_line_wrap(GTK_TEXT(txt), TRUE);
#else
gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(txt_scrollw),
GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
txt = gtk_text_view_new();
gtk_text_view_set_editable(GTK_TEXT_VIEW(txt), FALSE);
gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(txt), GTK_WRAP_WORD);
@ -174,10 +173,8 @@ void help_cb(GtkWidget *w _U_, gpointer data _U_)
return;
}
help_w = dlg_window_new("Ethereal: Help");
SIGNAL_CONNECT(help_w, "destroy", help_destroy_cb, NULL);
/* XXX: improve this, e.g. remember the last window size in a file */
WIDGET_SET_SIZE(help_w, DEF_WIDTH, DEF_HEIGHT);
help_w = window_new(GTK_WINDOW_TOPLEVEL, "Ethereal: Help");
gtk_window_set_default_size(GTK_WINDOW(help_w), DEF_WIDTH, DEF_HEIGHT);
gtk_container_border_width(GTK_CONTAINER(help_w), 2);
/* Container for each row of widgets */
@ -219,24 +216,20 @@ void help_cb(GtkWidget *w _U_, gpointer data _U_)
fclose(help_toc_file);
/* Buttons (only "Ok" for now) */
/* Button row */
bbox = dlg_button_row_new(GTK_STOCK_OK, NULL);
gtk_box_pack_end(GTK_BOX(main_vb), bbox, FALSE, FALSE, 5);
close_bt = OBJECT_GET_DATA(bbox, GTK_STOCK_OK);
SIGNAL_CONNECT(close_bt, "clicked", help_close_cb, help_w);
gtk_widget_grab_default(close_bt);
window_set_cancel_button(help_w, close_bt, window_cancel_button_cb);
SIGNAL_CONNECT(help_w, "delete_event", window_delete_event_cb, NULL);
SIGNAL_CONNECT(help_w, "destroy", help_destroy_cb, NULL);
gtk_quit_add_destroy(gtk_main_level(), GTK_OBJECT(help_w));
/* Catch the "key_press_event" signal in the window, so that we can catch
the ESC key being pressed and act as if the "Cancel" button had
been selected. */
dlg_set_cancel(help_w, close_bt);
gtk_widget_show_all(help_w);
dlg_window_present(help_w, GTK_WIN_POS_MOUSE);
window_present(help_w);
} /* help_cb */
@ -275,15 +268,6 @@ void help_topic_cb(GtkWidget *w _U_, gpointer data _U_) {
}
/*
* Close help dialog.
*/
static void help_close_cb(GtkWidget *w _U_, gpointer data)
{
gtk_widget_destroy(GTK_WIDGET(data));
}
/*
* Help dialog is closed now.
*/

View File

@ -1,6 +1,6 @@
/* main.c
*
* $Id: main.c,v 1.438 2004/05/22 04:15:01 guy Exp $
* $Id: main.c,v 1.439 2004/05/23 17:37:36 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -1168,35 +1168,25 @@ main_window_delete_event_cb(GtkWidget *widget _U_, GdkEvent *event _U_, gpointer
}
}
static void
main_load_window_geometry(GtkWidget *widget
#if GTK_MAJOR_VERSION < 2
_U_
#endif
)
{
/* as we now have the geometry from the recent file, set it */
if (prefs.gui_geometry_save_position) {
gtk_widget_set_uposition(GTK_WIDGET(top_level),
recent.gui_geometry_main_x,
recent.gui_geometry_main_y);
}
if (prefs.gui_geometry_save_size) {
WIDGET_SET_SIZE(top_level,
recent.gui_geometry_main_width,
recent.gui_geometry_main_height);
} else {
WIDGET_SET_SIZE(top_level, DEF_WIDTH, -1);
}
#if GTK_MAJOR_VERSION >= 2
if(prefs.gui_geometry_save_maximized) {
if (recent.gui_geometry_main_maximized) {
gdk_window_maximize(widget->window);
} else {
gdk_window_unmaximize(widget->window);
}
}
static void
main_load_window_geometry(GtkWidget *widget)
{
window_geometry_t geom;
geom.set_pos = prefs.gui_geometry_save_position;
geom.x = recent.gui_geometry_main_x;
geom.y = recent.gui_geometry_main_y;
geom.set_size = prefs.gui_geometry_save_size;
geom.width = recent.gui_geometry_main_width;
geom.height = recent.gui_geometry_main_height;
geom.set_maximized = prefs.gui_geometry_save_maximized;
geom.maximized = recent.gui_geometry_main_maximized;
window_set_geometry(widget, &geom);
#if GTK_MAJOR_VERSION >= 2
/* XXX - rename recent settings? */
if (recent.gui_geometry_main_upper_pane)
gtk_paned_set_position(GTK_PANED(main_first_pane), recent.gui_geometry_main_upper_pane);
@ -1207,56 +1197,27 @@ main_load_window_geometry(GtkWidget *widget
#endif
}
static void
main_save_window_geometry(GtkWidget *widget)
{
gint desk_x, desk_y;
#if GTK_MAJOR_VERSION >= 2
GdkWindowState state;
#endif
window_geometry_t geom;
/* 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
*/
window_get_geometry(widget, &geom);
if (prefs.gui_geometry_save_position) {
gdk_window_get_root_origin(widget->window,
&recent.gui_geometry_main_x,
&recent.gui_geometry_main_y);
if (gdk_window_get_deskrelative_origin(widget->window,
&desk_x, &desk_y)) {
if (desk_x <= recent.gui_geometry_main_x &&
desk_y <= recent.gui_geometry_main_y)
{
recent.gui_geometry_main_x = desk_x;
recent.gui_geometry_main_y = desk_y;
}
}
recent.gui_geometry_main_x = geom.x;
recent.gui_geometry_main_y = geom.y;
}
if (prefs.gui_geometry_save_size) {
/* XXX - Is this the "approved" method? */
gdk_window_get_size(widget->window,
&recent.gui_geometry_main_width,
&recent.gui_geometry_main_height);
recent.gui_geometry_main_width = geom.width,
recent.gui_geometry_main_height = geom.height;
}
#if GTK_MAJOR_VERSION >= 2
if(prefs.gui_geometry_save_maximized) {
state = gdk_window_get_state(widget->window);
recent.gui_geometry_main_maximized = (state == GDK_WINDOW_STATE_MAXIMIZED);
recent.gui_geometry_main_maximized = geom.maximized;
}
recent.gui_geometry_main_upper_pane = gtk_paned_get_position(GTK_PANED(main_first_pane));

View File

@ -1,7 +1,7 @@
/* ui_util.c
* UI utility routines
*
* $Id: ui_util.c,v 1.23 2004/05/21 08:55:07 ulfl Exp $
* $Id: ui_util.c,v 1.24 2004/05/23 17:37:36 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -45,6 +45,11 @@
#include "image/eicon3d16.xpm"
/* XXX - remove this later again, when dlg_xx function cleanup done */
#include "dlg_utils.h"
#define WIN_REG_KEY "win_reg_key"
/* 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
@ -107,6 +112,7 @@ window_icon_realize_cb (GtkWidget *win, gpointer data _U_)
#endif
}
/* Create a new window, of the specified type, with the specified title
(if any) and the Ethereal icon. */
GtkWidget *
@ -118,9 +124,271 @@ window_new(GtkWindowType type, const gchar *title)
if (title != NULL)
gtk_window_set_title(GTK_WINDOW(win), title);
SIGNAL_CONNECT(win, "realize", window_icon_realize_cb, NULL);
/* register this window title (it might change later!) */
if(title && strlen(title)) {
OBJECT_SET_DATA(win, WIN_REG_KEY, g_strdup(title));
}
/* 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 */
/* set the initial position (must be done, before show is called!) */
gtk_window_set_position(GTK_WINDOW(win), GTK_WIN_POS_MOUSE);
#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 couldn't shrink the window again */
gtk_window_set_policy(GTK_WINDOW(win), TRUE, TRUE, FALSE);
#endif
return win;
}
/* Present the created window. */
void
window_present(GtkWidget *win)
{
window_geometry_t geom;
#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? */
if(window_load_geom(win, &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);
}
}
/* 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)
{
/* SIGNAL_CONNECT_OBJECT(bt, "clicked", cb, win);*/
SIGNAL_CONNECT(bt, "clicked", cb, win);
gtk_widget_grab_default(bt);
/* Catch the "key_press_event" signal in the window, so that we can catch
the ESC key being pressed and act as if the "Cancel" button had
been selected. */
dlg_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 hashtable for all known window classes,
* the initial window title is the key, and the geometry is the value */
GHashTable *window_class_hash = NULL;
/* save the window and it's current geometry into the hashtable */
static void
window_save_geom(GtkWidget *win, window_geometry_t *geom)
{
gchar *reg;
gchar *key;
window_geometry_t *work;
reg = OBJECT_GET_DATA(win, WIN_REG_KEY);
if(reg) {
/* init hashtable, if not already done */
if(!window_class_hash) {
window_class_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_class_hash, reg);
if(work) {
g_hash_table_remove(window_class_hash, reg);
g_free(work->key);
g_free(work);
}
/* malloc and insert the new one */
work = g_malloc(sizeof(*geom));
*work = *geom;
key = g_strdup(reg);
work->key = key;
g_hash_table_insert(window_class_hash, key, work);
}
}
/* load the desired geometry for this window from the hashtable */
gboolean
window_load_geom(GtkWidget *win, window_geometry_t *geom)
{
gchar *reg;
window_geometry_t *p;
reg = OBJECT_GET_DATA(win, WIN_REG_KEY);
if(reg) {
/* init hashtable, if not already done */
if(!window_class_hash) {
window_class_hash = g_hash_table_new (g_str_hash, g_str_equal);
}
p = g_hash_table_lookup(window_class_hash, reg);
if(p) {
*geom = *p;
return TRUE;
}
}
return FALSE;
}
void
window_destroy(GtkWidget *win)
{
window_geometry_t geom;
gchar * title;
/* this 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) */
window_get_geometry(win, &geom);
window_save_geom(win, &geom);
title = OBJECT_GET_DATA(win, WIN_REG_KEY);
gtk_widget_destroy(win);
g_free(title);
}
/* 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) {
#if GTK_MAJOR_VERSION < 2
GdkPixmap *icon;
GdkBitmap * mask;
icon = gdk_pixmap_create_from_xpm_d(top_level->window, &mask, &top_level->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(top_level), &pixmap, &bitmap, 128);
return gtk_image_new_from_pixmap (pixmap, bitmap);
#endif
}
/* Set the name of the top-level window and its icon to the specified
string. */
void
@ -159,29 +427,6 @@ void main_window_quit(void)
}
/* 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) {
#if GTK_MAJOR_VERSION < 2
GdkPixmap *icon;
GdkBitmap * mask;
icon = gdk_pixmap_create_from_xpm_d(top_level->window, &mask, &top_level->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(top_level), &pixmap, &bitmap, 128);
return gtk_image_new_from_pixmap (pixmap, bitmap);
#endif
}
typedef struct pipe_input_tag {
gint source;

View File

@ -1,7 +1,7 @@
/* ui_util.h
* Definitions for UI utility routines
*
* $Id: ui_util.h,v 1.9 2004/05/20 18:18:12 ulfl Exp $
* $Id: ui_util.h,v 1.10 2004/05/23 17:37:36 ulfl Exp $
*
* Ethereal - Network traffic analyzer
* By Gerald Combs <gerald@ethereal.com>
@ -25,16 +25,100 @@
#ifndef __GTKGUIUI_UTIL_H__
#define __GTKGUIUI_UTIL_H__
/* Some words about windows / dialogs.
*
* delete event: the window managers "X" (e.g. upper right edge) of the window
* was clicked, default handler will call gtk_widget_destroy()
* destroy event: everything is already gone, only cleanup of left over ressources
* can/should be done now
*
* Hint: 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 handled by ui_util
*
* A typical window / dialog will be created by:
*
* 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. a scrolled_window_new() is used
* be sure the given is larger than the initial size, otherwise might get clipped content 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(my_win) show all the widgets in the window
*
* window_present(...) present the window on screen and
* (if available) set previously saved position and size
*
* 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"!
*/
/* Create a new window, of the specified type, with the specified title
(if any) and the Ethereal icon. */
GtkWidget *window_new(GtkWindowType, const gchar *);
* (if any) and the Ethereal icon.
* If you want to create a dialog, use dlg_window_new() instead.
* type window type, typical GTK_WINDOW_TOPLEVEL
* title title to show, will also set the window class for saving size etc. */
extern GtkWidget *window_new(GtkWindowType type, const gchar *title);
/* Present the created window. This will put the window on top and
* (if available) set previously saved position and size. */
extern void window_present(GtkWidget *win);
typedef void (*window_cancel_button_fct) (GtkWidget *w, gpointer data);
/* register the default cancel button "Cancel"/"Close"/"Ok" of this window */
extern void window_set_cancel_button(GtkWidget *win, GtkWidget *bt, window_cancel_button_fct cb);
/* Remember current window position and size and then destroy the window,
* call this instead of gtk_widget_destroy(); */
extern void window_destroy(GtkWidget *win);
/* default callback handler for cancel button "clicked" signal,
* use this for window_set_cancel_button(), will simply call window_destroy() */
extern void window_cancel_button_cb(GtkWidget *w _U_, gpointer data);
/* default callback handler: the window managers X of the window was clicked (delete_event),
* use this for SIGNAL_CONNECT(), will simply call window_destroy() */
extern gboolean
window_delete_event_cb(GtkWidget *win, GdkEvent *event _U_, gpointer user_data _U_);
typedef struct window_geometry_s {
gchar *key;
gboolean set_pos;
gint x;
gint y;
gboolean set_size;
gint width;
gint height;
gboolean set_maximized;
gboolean maximized; /* this is valid in GTK2 only */
} window_geometry_t;
/* get the geometry of a window from window_new() */
extern void window_get_geometry(GtkWidget *win, window_geometry_t *geom);
/* set the geometry of a window from window_new() */
extern void window_set_geometry(GtkWidget *win, window_geometry_t *geom);
/* load the geometry values for a window from previously saved values */
extern gboolean window_load_geom(GtkWidget *win, window_geometry_t *geom);
/* 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. */
void reactivate_window(GtkWidget *);
void reactivate_window(GtkWidget *win);
/* Create a GtkScrolledWindow, set its scrollbar placement appropriately,
and remember it. */