https://bugs.launchpad.net/moonshot-ui/+bug/1279798
authorDan Breslau <dbreslau@painless-security.com>
Mon, 4 Apr 2016 17:13:37 +0000 (13:13 -0400)
committerDan Breslau <dbreslau@painless-security.com>
Mon, 4 Apr 2016 17:13:37 +0000 (13:13 -0400)
("UI doesn't take focus when already open")

The problem was that simply calling Window.show() doesn't mean that the window
is brought to the foreground. Actually, there is nothing that guarantees this,
because the user's settings and choice of window manager may affect the
behavior. However, research and experimentation shows that calling these
two Gtk.Window methods:

        set_urgency_hint(true);
        present();

does not bring the window to the foreground either, but does at least cause
the user to be notified that the window wants attention, much like the way
Windows may make a taskbar icon flash orange.

src/moonshot-identity-management-view.vala
src/moonshot-identity-manager-app.vala

index d9d7c5a..2088e49 100644 (file)
@@ -511,11 +511,26 @@ public class IdentityManagerView : Window {
             filter.refilter();
             redraw_id_card_widgets ();
             set_prompting_service(request.service);
-            show ();
+            make_visible();
         }
         this.request_queue.push_tail (request);
     }
 
+
+    /** Makes the window visible, or at least, notifies the user that the window
+      * wants to be visible.
+      *
+      * This differs from show() in that show() does not guarantee that the 
+      * window will be moved to the foreground. Actually, neither does this
+      * method, because the user's settings and window manager may affect the
+      * behavior significantly.
+      */
+    public void make_visible()
+    {
+        set_urgency_hint(true);
+        present();
+    }
+
     public IdCard check_add_password(IdCard identity, IdentityRequest request, IdentityManagerModel model)
     {
         IdCard retval = identity;
index a013cfb..0838f66 100644 (file)
@@ -67,7 +67,7 @@ public class IdentityManagerApp {
     private const int WINDOW_WIDTH = 400;
     private const int WINDOW_HEIGHT = 500;
     public void show() {
-        if (view != null) view.show();    
+        if (view != null) view.make_visible();
     }
        
     public IdentityManagerApp (bool headless, bool use_flat_file_store) {