diff options
author | Guy Harris <guy@alum.mit.edu> | 2013-02-02 05:34:31 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2013-02-02 05:34:31 +0000 |
commit | 6ebabce7b50702ef8f49653f8d6d2bcde424c027 (patch) | |
tree | 8da0cd6d22b1c6b1d7449c603f29b96df9c5880e /ui/recent.c | |
parent | ab3840049e8de97b835a393fc964b2bd61e04ff9 (diff) |
Move the GUI-independent window geometry stuff to ui/recent.c, so we
only have one copy.
svn path=/trunk/; revision=47440
Diffstat (limited to 'ui/recent.c')
-rw-r--r-- | ui/recent.c | 178 |
1 files changed, 156 insertions, 22 deletions
diff --git a/ui/recent.c b/ui/recent.c index d66759672f..d8af54b353 100644 --- a/ui/recent.c +++ b/ui/recent.c @@ -127,6 +127,162 @@ free_col_width_info(recent_settings_t *rs) rs->col_width_list = NULL; } +/** Write the geometry values of a single window to the recent file. + * + * @param key unused + * @param value the geometry values + * @param rf recent file handle (FILE) + */ +static void +write_recent_geom(gpointer key _U_, gpointer value, gpointer rf) +{ + window_geometry_t *geom = value; + + fprintf(rf, "\n# Geometry and maximized state of %s window.\n", geom->key); + fprintf(rf, "# Decimal integers.\n"); + fprintf(rf, RECENT_GUI_GEOMETRY "%s.x: %d\n", geom->key, geom->x); + fprintf(rf, RECENT_GUI_GEOMETRY "%s.y: %d\n", geom->key, geom->y); + fprintf(rf, RECENT_GUI_GEOMETRY "%s.width: %d\n", geom->key, + geom->width); + fprintf(rf, RECENT_GUI_GEOMETRY "%s.height: %d\n", geom->key, + geom->height); + + fprintf(rf, "# TRUE or FALSE (case-insensitive).\n"); + fprintf(rf, RECENT_GUI_GEOMETRY "%s.maximized: %s\n", geom->key, + geom->maximized == TRUE ? "TRUE" : "FALSE"); + +} + +/* 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 */ +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 */ +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 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") + */ +static 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 = (gint)strtol(value, NULL, 10); + geom.set_pos = TRUE; + } else if (strcmp(key, "y") == 0) { + geom.y = (gint)strtol(value, NULL, 10); + geom.set_pos = TRUE; + } else if (strcmp(key, "width") == 0) { + geom.width = (gint)strtol(value, NULL, 10); + geom.set_size = TRUE; + } else if (strcmp(key, "height") == 0) { + geom.height = (gint)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 to the recent file. + * Will call write_recent_geom() for every existing window type. + * + * @param rf recent file handle from caller + */ +static void +window_geom_recent_write_all(FILE *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); +} + /* Attempt to Write out "recent common" to the user's recent common file. If we got an error report it with a dialog box and return FALSE, otherwise return TRUE. */ @@ -400,28 +556,6 @@ write_profile_recent(void) return TRUE; } - -/* write the geometry values of a window to recent file */ -void -write_recent_geom(gpointer key _U_, gpointer value, gpointer rf) -{ - window_geometry_t *geom = value; - - fprintf(rf, "\n# Geometry and maximized state of %s window.\n", geom->key); - fprintf(rf, "# Decimal integers.\n"); - fprintf(rf, RECENT_GUI_GEOMETRY "%s.x: %d\n", geom->key, geom->x); - fprintf(rf, RECENT_GUI_GEOMETRY "%s.y: %d\n", geom->key, geom->y); - fprintf(rf, RECENT_GUI_GEOMETRY "%s.width: %d\n", geom->key, - geom->width); - fprintf(rf, RECENT_GUI_GEOMETRY "%s.height: %d\n", geom->key, - geom->height); - - fprintf(rf, "# TRUE or FALSE (case-insensitive).\n"); - fprintf(rf, RECENT_GUI_GEOMETRY "%s.maximized: %s\n", geom->key, - geom->maximized == TRUE ? "TRUE" : "FALSE"); - -} - /* set one user's recent common file key/value pair */ static prefs_set_pref_e read_set_recent_common_pair_static(gchar *key, const gchar *value, |