wireshark/ui/qt/qt_ui_utils.cpp

159 lines
4.8 KiB
C++

/* qt_ui_utils.cpp
*
* $Id$
*
* Wireshark - Network traffic analyzer
* By Gerald Combs <gerald@wireshark.org>
* 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
#include <string.h>
#include <stdlib.h>
#include "qt_ui_utils.h"
#include "ui/recent.h"
#include "ui/ui_util.h"
// XXX - Copied from ui/gtk/gui_utils.c
#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);
/* the geometry hashtable for all known window classes,
* the window name is the key, and the geometry struct is the value */
static 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 = (window_geometry_t *) 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 = (window_geometry_t *) 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 = (window_geometry_t *) 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 */
extern "C" 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 = NULL; /* Will be set in window_geom_save () */
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 (g_ascii_strcasecmp(value, "true") == 0) {
geom.maximized = TRUE;
}
else {
geom.maximized = FALSE;
}
geom.set_maximized = TRUE;
} else {
/*
* Silently ignore the bogus key. We shouldn't abort here,
* as this could be due to a corrupt recent file.
*
* XXX - should we print a message about this?
*/
return;
}
/* save / replace geometry in hashtable */
window_geom_save(name, &geom);
}
/* write all geometry values of all windows from the hashtable to the recent file */
extern "C" 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);
}