Closing the last few issues

Amit Chaudhuri amit.k.chaudhuri at gmail.com
Tue Feb 12 05:48:35 PST 2013


Guys,

I think I need shooting.  I believe the satellite stuff got back in because
I sent the wrong file. :(  Look at one, sign it off, send another.  Ouch..

This one excludes any satelitte binary rubbish AND includes the items
claimed; namely, the checks that window does not exceed screen real estate.

Grovel, grovel...especially to Henrik..

Signed off by Amit Chaudhuri <amit.k.chaudhuri at gmail.com>



On Tue, Feb 12, 2013 at 12:39 PM, Henrik Brautaset Aronsen <
subsurface at henrik.synth.no> wrote:

> Lubomir I. Ivanov wrote:
>
>> On 12 February 2013 14:05, Henrik Brautaset Aronsen
>> <subsurface at henrik.synth.no>  wrote:
>>
>>> I submitted your patch without the satellite.* stuff and added your text
>>> as
>>> comment -- in addition to my macos patch.
>>>
>>> Now, if Lubomir could add a windows patch on top of that... :)
>>>
>>>
>> i think i've read that dirk wanted these to be formatted in a parsable
>> configuration string?
>>
>> but also, we may need more than the x, y, width, height parameters:
>> - maximized flag
>> - current/preferred screen
>>
>
> I think we should stick with what we have now if we want this in v3.0.
>  Four separate integers is easy to support and doesn't take much space in
> the config file.  Parsing and building the string just makes the code
> slighty more complicated IMHO.
>
> Henrik
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.hohndel.org/pipermail/subsurface/attachments/20130212/5146ce16/attachment.html>
-------------- next part --------------
diff --git a/gtk-gui.c b/gtk-gui.c
index 20a2da8..1ce967f 100644
--- a/gtk-gui.c
+++ b/gtk-gui.c
@@ -311,6 +311,51 @@ static void file_open(GtkWidget *w, gpointer data)
 	gtk_widget_destroy(dialog);
 }
 
+void save_window_geometry(void)
+{
+	/* GDK_GRAVITY_NORTH_WEST assumed ( it is the default ) */
+	int window_origin_x, window_origin_y, window_width, window_height;
+	gtk_window_get_position(GTK_WINDOW (main_window), &window_origin_x, &window_origin_y);
+	gtk_window_get_size(GTK_WINDOW (main_window), &window_width, &window_height);
+
+	subsurface_set_conf_int("window_origin_x", window_origin_x);
+	subsurface_set_conf_int("window_origin_y", window_origin_y);
+	subsurface_set_conf_int("window_width", window_width);
+	subsurface_set_conf_int("window_height", window_height);
+}
+
+/* need to check for e.g. memory of another larger screen */
+void restore_window_geometry(void)
+{
+	int window_origin_x, window_origin_y, window_width, window_height;
+	int current_screen_height = -1, current_screen_width = -1;
+	GdkScreen *screen = NULL;
+
+	window_origin_x = subsurface_get_conf_int("window_origin_x");
+	window_origin_y = subsurface_get_conf_int("window_origin_y");
+	window_height = subsurface_get_conf_int("window_height");
+	window_width = subsurface_get_conf_int("window_width");
+
+	window_origin_x == -1 ? window_origin_x = 0 : window_origin_x;
+	window_origin_y == -1 ? window_origin_y = 0 : window_origin_y;
+	window_height == -1 ? window_height = 300 : window_height;
+	window_width == -1 ? window_width = 700 : window_width;
+
+	screen = gtk_window_get_screen(GTK_WINDOW(main_window));
+	if( screen ){
+		current_screen_height = gdk_screen_get_height(screen);
+		current_screen_width = gdk_screen_get_width(screen);
+	}
+
+	if( window_origin_x + window_width <= current_screen_width && window_origin_y + window_height <= current_screen_height){
+		gtk_window_move (GTK_WINDOW (main_window), window_origin_x, window_origin_y);
+		gtk_window_resize (GTK_WINDOW (main_window), window_width, window_height);
+	} else {
+		gtk_window_move (GTK_WINDOW (main_window), 0, 0);
+		gtk_window_resize (GTK_WINDOW (main_window), current_screen_width * 0.7, current_screen_height * 0.7);
+	}
+}
+
 gboolean on_delete(GtkWidget* w, gpointer data)
 {
 	/* Make sure to flush any modified dive data */
@@ -321,6 +366,7 @@ gboolean on_delete(GtkWidget* w, gpointer data)
 		quit = ask_save_changes();
 
 	if (quit){
+		save_window_geometry();
 		return FALSE; /* go ahead, kill the program, we're good now */
 	} else {
 		return TRUE; /* We are not leaving */
@@ -343,6 +389,7 @@ static void quit(GtkWidget *w, gpointer data)
 		quit = ask_save_changes();
 
 	if (quit){
+		save_window_geometry();
 		dive_list_destroy();
 		gtk_main_quit();
 	}
@@ -1249,6 +1296,7 @@ static void edit_dc_nicknames(GtkWidget *w, gpointer data)
 		GTK_STOCK_APPLY,
 		GTK_RESPONSE_APPLY,
 		NULL);
+
 	gtk_widget_set_size_request(dialog, 700, 400);
 
 	scroll = gtk_scrolled_window_new(NULL, NULL);
@@ -1618,6 +1666,7 @@ void init_ui(int *argcp, char ***argvp)
 	g_signal_connect (G_OBJECT (win), "key_press_event", G_CALLBACK (on_key_press), dive_list);
 
 	gtk_widget_set_app_paintable(win, TRUE);
+	restore_window_geometry();
 	gtk_widget_show_all(win);
 
 	return;
@@ -1628,6 +1677,8 @@ void run_ui(void)
 	gtk_main();
 }
 
+
+
 void exit_ui(void)
 {
 	subsurface_close_conf();
diff --git a/linux.c b/linux.c
index bf5c21d..4add7bb 100644
--- a/linux.c
+++ b/linux.c
@@ -38,6 +38,11 @@ void subsurface_set_conf_bool(char *name, int value)
 	gconf_client_set_bool(gconf, gconf_name(name), value > 0, NULL);
 }
 
+void subsurface_set_conf_int(char *name, int value)
+{
+	gconf_client_set_int(gconf, gconf_name(name), value , NULL);
+}
+
 const void *subsurface_get_conf(char *name)
 {
 	return gconf_client_get_string(gconf, gconf_name(name), NULL);
@@ -56,6 +61,15 @@ int subsurface_get_conf_bool(char *name)
 	return ret;
 }
 
+int subsurface_get_conf_int(char *name)
+{
+	int val = gconf_client_get_int(gconf, gconf_name(name), NULL);
+	if(!val)
+		return -1;
+
+	return val;
+}
+
 void subsurface_flush_conf(void)
 {
 	/* this is a no-op */
diff --git a/macos.c b/macos.c
index 2e549f9..90e184f 100644
--- a/macos.c
+++ b/macos.c
@@ -44,6 +44,11 @@ void subsurface_set_conf_bool(char *name, int value)
 		value ? kCFBooleanTrue : kCFBooleanFalse, SUBSURFACE_PREFERENCES);
 }
 
+void subsurface_set_conf_int(char *name, int value)
+{
+	/* CF pref stuff here? */
+}
+
 const void *subsurface_get_conf(char *name)
 {
 	CFPropertyListRef strpref;
@@ -64,6 +69,11 @@ int subsurface_get_conf_bool(char *name)
 	return boolpref;
 }
 
+int subsurface_get_conf_int(char *name)
+{
+	return -1; /* CF pref stuff here? */
+}
+
 void subsurface_flush_conf(void)
 {
 	int ok = CFPreferencesAppSynchronize(SUBSURFACE_PREFERENCES);
diff --git a/pref.h b/pref.h
index 7dd0e5a..c4287aa 100644
--- a/pref.h
+++ b/pref.h
@@ -44,9 +44,11 @@ extern struct preferences prefs, default_prefs;
 extern void subsurface_open_conf(void);
 extern void subsurface_set_conf(char *name, const char *value);
 extern void subsurface_set_conf_bool(char *name, gboolean value);
+extern void subsurface_set_conf_int(char *name, int value);
 extern void subsurface_unset_conf(char *name);
 extern const void *subsurface_get_conf(char *name);
 extern int subsurface_get_conf_bool(char *name);
+extern int subsurface_get_conf_int(char *name);
 extern void subsurface_flush_conf(void);
 extern void subsurface_close_conf(void);
 
diff --git a/windows.c b/windows.c
index 3db08de..948b1f7 100644
--- a/windows.c
+++ b/windows.c
@@ -84,6 +84,11 @@ void subsurface_set_conf_bool(char *name, int value)
 	free(wname);
 }
 
+void subsurface_set_conf_int(char *name, int value)
+{
+	/* call to set registry key to value here? */
+}
+
 const void *subsurface_get_conf(char *name)
 {
 	const int csize = 64;
@@ -127,6 +132,11 @@ int subsurface_get_conf_bool(char *name)
 	return get_from_registry(hkey, name);
 }
 
+int subsurface_get_conf_int(char *name)
+{
+	return -1; /* windows registry call here? */
+}
+
 void subsurface_flush_conf(void)
 {
 	/* this is a no-op */


More information about the subsurface mailing list