[maemo-commits] [maemo-commits] r8609 - projects/haf/trunk/osso-application-installer/src

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Mon Dec 4 18:08:11 EET 2006
Author: marivoll
Date: 2006-12-04 18:08:09 +0200 (Mon, 04 Dec 2006)
New Revision: 8609

Modified:
   projects/haf/trunk/osso-application-installer/src/details.cc
   projects/haf/trunk/osso-application-installer/src/details.h
   projects/haf/trunk/osso-application-installer/src/log.cc
   projects/haf/trunk/osso-application-installer/src/main.cc
   projects/haf/trunk/osso-application-installer/src/repo.cc
   projects/haf/trunk/osso-application-installer/src/search.cc
   projects/haf/trunk/osso-application-installer/src/settings.cc
   projects/haf/trunk/osso-application-installer/src/util.cc
   projects/haf/trunk/osso-application-installer/src/util.h
Log:
	Keep track of dialog stacking order in a general way. (N48797)
	
	* src/details.cc, src/details.h, src/log.cc, src/main.cc,
	src/repo.cc, src/search.cc, src/settings.cc, src/util.cc,
	src/util.h
	(push_dialog_parent, pop_dialog_parent, get_dialog_parent): New,
	Use them for all dialogs by pushing nerwly created ones and
	popping when they are destroyed.
	* src/main.cc (main): Push the main window as the default dialog
	parent.
	* src/details.h, src/details.cc (show_package_details): Removed
	'parent' parameter.  Updated all callers.  Don't pass parent
	around via closure etc.
	* src/repo.cc (show_repo_edit_dialog): Removed 'parent' parameter.
	Updated all callers.  Don't pass parent around via closure etc.


Modified: projects/haf/trunk/osso-application-installer/src/details.cc
===================================================================
--- projects/haf/trunk/osso-application-installer/src/details.cc	2006-12-04 15:39:00 UTC (rev 8608)
+++ projects/haf/trunk/osso-application-installer/src/details.cc	2006-12-04 16:08:09 UTC (rev 8609)
@@ -35,7 +35,6 @@
 #define _(x) gettext (x)
 
 struct spd_closure {
-  GtkWindow *parent;
   package_info *pi;
   detail_kind kind;
   bool show_problems;
@@ -252,12 +251,12 @@
 static void
 details_response (GtkDialog *dialog, gint response, gpointer clos)
 {
+  pop_dialog_parent ();
   gtk_widget_destroy (GTK_WIDGET (dialog));
 }
 
 static void
-show_with_details (GtkWindow *parent, 
-		   package_info *pi, bool show_problems)
+show_with_details (package_info *pi, bool show_problems)
 {
   GtkWidget *dialog, *notebook;
   GtkWidget *table, *common;
@@ -415,11 +414,12 @@
 				  GTK_POLICY_AUTOMATIC);
 
   dialog = gtk_dialog_new_with_buttons (_("ai_ti_details"),
-					parent,
+					get_dialog_parent (),
 					GTK_DIALOG_MODAL,
 					_("ai_bd_details_close"),
 					GTK_RESPONSE_OK,
 					NULL);
+  push_dialog_parent (dialog);
 
   gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
   set_dialog_help (dialog, AI_TOPIC ("packagedetailsview"));
@@ -500,7 +500,6 @@
 get_package_details_reply (int cmd, apt_proto_decoder *dec, void *clos)
 {
   spd_closure *c = (spd_closure *)clos;
-  GtkWindow *parent = c->parent;
   package_info *pi = c->pi;
   detail_kind kind = c->kind;
   bool show_problems = c->show_problems;
@@ -532,7 +531,7 @@
 
   pi->have_detail_kind = kind;
 
-  show_with_details (parent, pi, show_problems);
+  show_with_details (pi, show_problems);
 }
 
 void
@@ -549,21 +548,18 @@
 				    data);
   else
     {
-      GtkWindow *parent = c->parent;
       bool show_problems = c->show_problems;
       delete c;
 
-      show_with_details (parent, pi, show_problems);
+      show_with_details (pi, show_problems);
     }
 }
 
 void
-show_package_details (GtkWindow *parent,
-		      package_info *pi, detail_kind kind,
+show_package_details (package_info *pi, detail_kind kind,
 		      bool show_problems)
 {
   spd_closure *c = new spd_closure;
-  c->parent = parent;
   c->pi = pi;
   c->kind = kind;
   c->show_problems = show_problems;

Modified: projects/haf/trunk/osso-application-installer/src/details.h
===================================================================
--- projects/haf/trunk/osso-application-installer/src/details.h	2006-12-04 15:39:00 UTC (rev 8608)
+++ projects/haf/trunk/osso-application-installer/src/details.h	2006-12-04 16:08:09 UTC (rev 8609)
@@ -26,8 +26,7 @@
 
 #include "main.h"
 
-void show_package_details (GtkWindow *parent,
-			   package_info *p, detail_kind kind,
+void show_package_details (package_info *p, detail_kind kind,
 			   bool show_problems);
 
 void decode_summary (apt_proto_decoder *dec,

Modified: projects/haf/trunk/osso-application-installer/src/log.cc
===================================================================
--- projects/haf/trunk/osso-application-installer/src/log.cc	2006-12-04 15:39:00 UTC (rev 8608)
+++ projects/haf/trunk/osso-application-installer/src/log.cc	2006-12-04 16:08:09 UTC (rev 8609)
@@ -151,17 +151,19 @@
  				save_log, NULL);
 
   if (response == GTK_RESPONSE_CLOSE)
-    gtk_widget_destroy (GTK_WIDGET (dialog));
+    {
+      pop_dialog_parent ();
+      gtk_widget_destroy (GTK_WIDGET (dialog));
+    }
 }
 
-
 void
 show_log ()
 {
   GtkWidget *dialog, *text_view;
 
   dialog = gtk_dialog_new_with_buttons (_("ai_ti_log"),
-					get_main_window (),
+					get_dialog_parent (),
 					GTK_DIALOG_MODAL,
 					_("ai_bd_log_save_as"),
 					RESPONSE_SAVE,
@@ -170,6 +172,7 @@
 					_("ai_bd_log_close"),
 					GTK_RESPONSE_CLOSE,
 					NULL);
+  push_dialog_parent (dialog);
   respond_on_escape (GTK_DIALOG (dialog), GTK_RESPONSE_CLOSE);
 
   gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);

Modified: projects/haf/trunk/osso-application-installer/src/main.cc
===================================================================
--- projects/haf/trunk/osso-application-installer/src/main.cc	2006-12-04 15:39:00 UTC (rev 8608)
+++ projects/haf/trunk/osso-application-installer/src/main.cc	2006-12-04 16:08:09 UTC (rev 8609)
@@ -1494,7 +1494,7 @@
 available_package_details (gpointer data)
 {
   package_info *pi = (package_info *)data;
-  show_package_details (get_main_window (), pi, install_details, false);
+  show_package_details (pi, install_details, false);
 }
 
 void
@@ -1517,7 +1517,7 @@
 installed_package_details (gpointer data)
 {
   package_info *pi = (package_info *)data;
-  show_package_details (get_main_window (), pi, remove_details, false);
+  show_package_details (pi, remove_details, false);
 }
 
 static void uninstall_package (package_info *);
@@ -2772,6 +2772,7 @@
 
   window = hildon_window_new ();
   gtk_window_set_title (GTK_WINDOW (window), _("ai_ap_application_installer"));
+  push_dialog_parent (window);
 
   main_window = GTK_WINDOW (window);
 

Modified: projects/haf/trunk/osso-application-installer/src/repo.cc
===================================================================
--- projects/haf/trunk/osso-application-installer/src/repo.cc	2006-12-04 15:39:00 UTC (rev 8608)
+++ projects/haf/trunk/osso-application-installer/src/repo.cc	2006-12-04 16:08:09 UTC (rev 8609)
@@ -69,7 +69,6 @@
   GtkTreeView *tree;
   GtkListStore *store;
 
-  GtkWindow *dialog;
   GtkWidget *edit_button;
   GtkWidget *delete_button;
 
@@ -300,6 +299,7 @@
 
   delete c;
 
+  pop_dialog_parent ();
   gtk_widget_destroy (GTK_WIDGET (dialog));
 }
 
@@ -345,8 +345,7 @@
 }
 
 static void
-show_repo_edit_dialog (GtkWindow *parent,
-		       repo_line *r, bool isnew, bool readonly)
+show_repo_edit_dialog (repo_line *r, bool isnew, bool readonly)
 {
   GtkWidget *dialog, *vbox, *caption;
   GtkSizeGroup *group;
@@ -370,7 +369,7 @@
     {
       GtkWidget *button;
 
-      dialog = gtk_dialog_new_with_buttons (title, parent,
+      dialog = gtk_dialog_new_with_buttons (title, get_dialog_parent (),
 					    GTK_DIALOG_MODAL,
 					    NULL);
 
@@ -382,7 +381,7 @@
       gtk_widget_grab_focus (button);
     }
   else
-    dialog = gtk_dialog_new_with_buttons (title, parent,
+    dialog = gtk_dialog_new_with_buttons (title, get_dialog_parent (),
 					  GTK_DIALOG_MODAL,
 					  _("ai_bd_new_repository_ok"),
 					  GTK_RESPONSE_OK,
@@ -390,6 +389,8 @@
 					  GTK_RESPONSE_CANCEL,
 					  NULL);
 
+  push_dialog_parent (dialog);
+
   gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
 
   // XXX - there is no help for the "edit" version of this dialog.
@@ -477,7 +478,7 @@
   *c->lastp = r;
   c->lastp = &r->next;
 
-  show_repo_edit_dialog (c->dialog, r, true, false);
+  show_repo_edit_dialog (r, true, false);
 }
 
 static void
@@ -576,7 +577,7 @@
 
       if (r->essential)
 	irritate_user (_("ai_ib_unable_edit"));
-      show_repo_edit_dialog (c->dialog, r, false, r->essential);
+      show_repo_edit_dialog (r, false, r->essential);
 
       return;
     }
@@ -606,6 +607,7 @@
 	}
       
       delete c;
+      pop_dialog_parent ();
       gtk_widget_destroy (GTK_WIDGET (dialog));
     }
 }
@@ -663,7 +665,6 @@
 		    GtkTreeViewColumn *column,
 		    gpointer data)
 {
-  repo_closure *c = (repo_closure *)data;
   GtkTreeModel *model = gtk_tree_view_get_model (treeview);
   GtkTreeIter iter;
 
@@ -676,7 +677,7 @@
 
       if (r->essential)
 	irritate_user (_("ai_ib_unable_edit"));
-      show_repo_edit_dialog (c->dialog, r, false, r->essential);
+      show_repo_edit_dialog (r, false, r->essential);
     }
 }
 
@@ -810,8 +811,7 @@
 {
   repo_add_closure *ac = (repo_add_closure *)data;
 
-  show_repo_edit_dialog (get_main_window (),
-			 ac->new_repo, true, true);
+  show_repo_edit_dialog (ac->new_repo, true, true);
 }
 
 static void
@@ -907,12 +907,11 @@
     {
       GtkWidget *dialog = gtk_dialog_new ();
 
-      c->dialog = GTK_WINDOW (dialog);
-
       gtk_window_set_title (GTK_WINDOW (dialog), _("ai_ti_repository"));
-      gtk_window_set_transient_for (GTK_WINDOW (dialog), get_main_window ());
+      gtk_window_set_transient_for (GTK_WINDOW (dialog), get_dialog_parent ());
       gtk_window_set_modal (GTK_WINDOW (dialog), TRUE);
-      
+      push_dialog_parent (dialog);
+
       gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
       gtk_dialog_add_button (GTK_DIALOG (dialog), 
 			     _("ai_bd_repository_new"), REPO_RESPONSE_NEW);

Modified: projects/haf/trunk/osso-application-installer/src/search.cc
===================================================================
--- projects/haf/trunk/osso-application-installer/src/search.cc	2006-12-04 15:39:00 UTC (rev 8608)
+++ projects/haf/trunk/osso-application-installer/src/search.cc	2006-12-04 16:08:09 UTC (rev 8609)
@@ -108,6 +108,7 @@
       search_packages (pattern, in_descriptions);
     }
 
+  pop_dialog_parent ();
   gtk_widget_destroy (GTK_WIDGET (dialog));
   delete c;
 }
@@ -131,13 +132,14 @@
   search_dialog_closure *c = new search_dialog_closure;
 
   dialog = gtk_dialog_new_with_buttons (_("ai_ti_search"),
-					get_main_window (),
+					get_dialog_parent (),
 					GTK_DIALOG_MODAL,
 					_("ai_bd_search_ok"),
 					GTK_RESPONSE_OK,
 					_("ai_bd_search_cancel"),
 					GTK_RESPONSE_CANCEL,
 					NULL);
+  push_dialog_parent (dialog);
   gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
   set_dialog_help (dialog, AI_TOPIC ("search"));
   //gtk_widget_set_usize (dialog, 400, -1);

Modified: projects/haf/trunk/osso-application-installer/src/settings.cc
===================================================================
--- projects/haf/trunk/osso-application-installer/src/settings.cc	2006-12-04 15:39:00 UTC (rev 8608)
+++ projects/haf/trunk/osso-application-installer/src/settings.cc	2006-12-04 16:08:09 UTC (rev 8609)
@@ -275,13 +275,14 @@
   settings_closure *c = new settings_closure;
 
   dialog = gtk_dialog_new_with_buttons (_("ai_ti_settings"),
-					get_main_window (),
+					get_dialog_parent (),
 					GTK_DIALOG_MODAL,
 					_("ai_bd_settings_ok"),
 					GTK_RESPONSE_OK,
 					_("ai_bd_settings_cancel"),
 					GTK_RESPONSE_CANCEL,
 					NULL);
+  push_dialog_parent (dialog);
   gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
   set_dialog_help (dialog, AI_TOPIC ("settings"));
 
@@ -311,6 +312,7 @@
       sort_all_packages ();
     }
 
+  pop_dialog_parent ();
   gtk_widget_destroy (GTK_WIDGET (dialog));
 }
 
@@ -319,7 +321,8 @@
 {
   GtkWidget *dialog;
 
-  dialog = hildon_sort_dialog_new (get_main_window ());
+  dialog = hildon_sort_dialog_new (get_dialog_parent ());
+  push_dialog_parent (dialog);
 
   hildon_sort_dialog_add_sort_key (HILDON_SORT_DIALOG (dialog),
 				   _("ai_va_sort_name"));

Modified: projects/haf/trunk/osso-application-installer/src/util.cc
===================================================================
--- projects/haf/trunk/osso-application-installer/src/util.cc	2006-12-04 15:39:00 UTC (rev 8608)
+++ projects/haf/trunk/osso-application-installer/src/util.cc	2006-12-04 16:08:09 UTC (rev 8609)
@@ -72,6 +72,34 @@
 #define BTNAME_MATCH_RULE "type='signal',interface='" BTNAME_SIGNAL_IF \
                           "',member='" BTNAME_SIG_CHANGED "'"
 
+static GSList *dialog_parents = NULL;
+
+GtkWindow *
+get_dialog_parent ()
+{
+  if (dialog_parents)
+    return GTK_WINDOW (dialog_parents->data);
+  else
+    return NULL;
+}
+
+void
+push_dialog_parent (GtkWidget *w)
+{
+  dialog_parents = g_slist_prepend (dialog_parents, w);
+}
+
+void
+pop_dialog_parent ()
+{
+  if (dialog_parents)
+    {
+      GSList *old = dialog_parents;
+      dialog_parents = dialog_parents->next;
+      g_slist_free_1 (old);
+    }
+}
+
 struct ayn_closure {
   package_info *pi;
   detail_kind kind;
@@ -88,7 +116,7 @@
   if (response == 1)
     {
       if (c->pi)
-	show_package_details (GTK_WINDOW (dialog), c->pi, c->kind, false);
+	show_package_details (c->pi, c->kind, false);
       else if (c->details)
 	c->details (c->data);
       return;
@@ -100,6 +128,7 @@
     c->pi->unref ();
   delete c;
 
+  pop_dialog_parent ();
   gtk_widget_destroy (GTK_WIDGET (dialog));
   cont (response == GTK_RESPONSE_OK, data);
 }
@@ -166,12 +195,13 @@
 
   dialog = gtk_dialog_new_with_buttons
     (title,
-     get_main_window (),
+     get_dialog_parent (),
      GTK_DIALOG_MODAL,
      _("ai_bd_confirm_ok"),      GTK_RESPONSE_OK,
      _("ai_bd_confirm_details"), 1,
      _("ai_bd_confirm_cancel"),  GTK_RESPONSE_CANCEL,
      NULL);
+  push_dialog_parent (dialog);
 
   gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
   gtk_container_add (GTK_CONTAINER (GTK_DIALOG (dialog)->vbox),
@@ -198,12 +228,13 @@
 
   dialog = gtk_dialog_new_with_buttons
     (title,
-     get_main_window (),
+     get_dialog_parent (),
      GTK_DIALOG_MODAL,
      _("ai_bd_confirm_ok"),      GTK_RESPONSE_OK,
      _("ai_bd_confirm_details"), 1,
      _("ai_bd_confirm_cancel"),  GTK_RESPONSE_CANCEL,
      NULL);
+  push_dialog_parent (dialog);
 
   gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
   GtkWidget *label = gtk_label_new (question);
@@ -253,7 +284,7 @@
 
   if (response == 1)
     {
-      show_package_details (GTK_WINDOW (dialog), c->pi, c->kind, true);
+      show_package_details (c->pi, c->kind, true);
     }
   else
     {
@@ -399,11 +430,12 @@
 
   dialog = gtk_dialog_new_with_buttons
     (_("ai_ti_notice"),
-     get_main_window (),
+     get_dialog_parent (),
      GTK_DIALOG_MODAL,
      _("ai_bd_notice_ok"),      GTK_RESPONSE_OK,
      _("ai_bd_notice_cancel"),  GTK_RESPONSE_CANCEL,
      NULL);
+  push_dialog_parent (dialog);
 
   gtk_dialog_set_has_separator (GTK_DIALOG (dialog), FALSE);
   const char *text = (sure
@@ -1423,6 +1455,7 @@
 
   char *uri = gtk_file_chooser_get_uri (GTK_FILE_CHOOSER (dialog));
 
+  pop_dialog_parent ();
   gtk_widget_destroy (GTK_WIDGET (dialog));
 
   if (response == GTK_RESPONSE_OK)
@@ -1443,13 +1476,14 @@
   GtkFileFilter *filter;
 
   fcd = hildon_file_chooser_dialog_new_with_properties
-    (get_main_window (),
+    (get_dialog_parent (),
      "action",            GTK_FILE_CHOOSER_ACTION_OPEN,
      "title",             _("ai_ti_select_package"),
      "empty_text",        _("ai_ia_select_package_no_packages"),
      "open_button_text",  _("ai_bd_select_package"),
      NULL);
   gtk_window_set_modal (GTK_WINDOW (fcd), TRUE);
+  push_dialog_parent (fcd);
 
   filter = gtk_file_filter_new ();
   gtk_file_filter_add_mime_type (filter, "application/x-deb");
@@ -1478,10 +1512,11 @@
   GtkWidget *fcd;
 
   fcd = hildon_file_chooser_dialog_new_with_properties
-    (parent,
+    (get_dialog_parent (),
      "action",            GTK_FILE_CHOOSER_ACTION_SAVE,
      "title",             title,
      NULL);
+  push_dialog_parent (fcd);
   gtk_window_set_modal (GTK_WINDOW (fcd), TRUE);
 
   gtk_file_chooser_set_current_name (GTK_FILE_CHOOSER (fcd), default_filename);

Modified: projects/haf/trunk/osso-application-installer/src/util.h
===================================================================
--- projects/haf/trunk/osso-application-installer/src/util.h	2006-12-04 15:39:00 UTC (rev 8608)
+++ projects/haf/trunk/osso-application-installer/src/util.h	2006-12-04 16:08:09 UTC (rev 8609)
@@ -40,6 +40,10 @@
 
   The dialogs are application modal.
 
+  PUSH_DIALOG_PARENT and POP_DIALOG_PARENT are used to keep track of
+  the top-most window to be used as the parent for new dialogs.
+  GET_DIALOG_PARENT returns that window.
+
   ASK_YES_NO shows QUESTION in a confirmation note.  The result RES
   passed to the continuation CONT is true when the user clicks "Ok",
   of course, and false otherwise.
@@ -86,6 +90,10 @@
 
 */
 
+void push_dialog_parent (GtkWidget *window);
+void pop_dialog_parent ();
+GtkWindow *get_dialog_parent ();
+
 void ask_yes_no (const gchar *question,
 		 void (*cont) (bool res, void *data), void *data);
 


More information about the maemo-commits mailing list