]> Pileus Git - ~andy/gtk/commitdiff
Support the ICCCM urgency hint. (#61858, Havoc Pennington)
authorMatthias Clasen <mclasen@redhat.com>
Fri, 17 Jun 2005 20:19:32 +0000 (20:19 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Fri, 17 Jun 2005 20:19:32 +0000 (20:19 +0000)
2005-06-17  Matthias Clasen  <mclasen@redhat.com>

Support the ICCCM urgency hint.  (#61858, Havoc Pennington)

* gtk/gtk.symbols:
* gtk/gtkwindow.[hc]: Add a GtkWindow::urgency-hint property
with getter and setter.

* gdk/gdk.symbols:
* gdk/gdkwindow.h:
* gdk/x11/gdkwindow-x11.c (gdk_window_set_urgency_hint):
Add a setter for the urgency hint.

* gdk/x11/gdkwindow-x11.h (struct _GdkToplevelX11): Store
urgency hint here.

* gdk/x11/gdkwindow-x11.c (update_wm_hints): Set the urgency
hint in the WM_HINTS property when appropriate.

13 files changed:
ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-8
docs/reference/ChangeLog
docs/reference/gdk/gdk-sections.txt
docs/reference/gtk/gtk-sections.txt
gdk/gdk.symbols
gdk/gdkwindow.h
gdk/x11/gdkwindow-x11.c
gdk/x11/gdkwindow-x11.h
gtk/gtk.symbols
gtk/gtkwindow.c
gtk/gtkwindow.h

index 70de302199c286cec44adcc24b9b6930f11b9309..6fd90d65c7fd669f603ddc11fb3708772d44e9e1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
        GDK_ACTION_COPY. Otherwise apps that check the suggested_action
        field, like eog, won't accept dropped files.
 
+2005-06-17  Matthias Clasen  <mclasen@redhat.com>
+
+       Support the ICCCM urgency hint.  (#61858, Havoc Pennington)
+       
+       * gtk/gtk.symbols: 
+       * gtk/gtkwindow.[hc]: Add a GtkWindow::urgency-hint property
+       with getter and setter.
+
+       * gdk/gdk.symbols: 
+       * gdk/gdkwindow.h: 
+       * gdk/x11/gdkwindow-x11.c (gdk_window_set_urgency_hint): 
+       Add a setter for the urgency hint.
+
+       * gdk/x11/gdkwindow-x11.h (struct _GdkToplevelX11): Store
+       urgency hint here.
+
+       * gdk/x11/gdkwindow-x11.c (update_wm_hints): Set the urgency
+       hint in the WM_HINTS property when appropriate.
+
 2005-06-17  Matthias Clasen  <mclasen@redhat.com>
 
        * gdk/gdkcursor.h: Define GDK_IS_CURSOR() and GDK_CURSOR().
index 70de302199c286cec44adcc24b9b6930f11b9309..6fd90d65c7fd669f603ddc11fb3708772d44e9e1 100644 (file)
        GDK_ACTION_COPY. Otherwise apps that check the suggested_action
        field, like eog, won't accept dropped files.
 
+2005-06-17  Matthias Clasen  <mclasen@redhat.com>
+
+       Support the ICCCM urgency hint.  (#61858, Havoc Pennington)
+       
+       * gtk/gtk.symbols: 
+       * gtk/gtkwindow.[hc]: Add a GtkWindow::urgency-hint property
+       with getter and setter.
+
+       * gdk/gdk.symbols: 
+       * gdk/gdkwindow.h: 
+       * gdk/x11/gdkwindow-x11.c (gdk_window_set_urgency_hint): 
+       Add a setter for the urgency hint.
+
+       * gdk/x11/gdkwindow-x11.h (struct _GdkToplevelX11): Store
+       urgency hint here.
+
+       * gdk/x11/gdkwindow-x11.c (update_wm_hints): Set the urgency
+       hint in the WM_HINTS property when appropriate.
+
 2005-06-17  Matthias Clasen  <mclasen@redhat.com>
 
        * gdk/gdkcursor.h: Define GDK_IS_CURSOR() and GDK_CURSOR().
index 70de302199c286cec44adcc24b9b6930f11b9309..6fd90d65c7fd669f603ddc11fb3708772d44e9e1 100644 (file)
        GDK_ACTION_COPY. Otherwise apps that check the suggested_action
        field, like eog, won't accept dropped files.
 
+2005-06-17  Matthias Clasen  <mclasen@redhat.com>
+
+       Support the ICCCM urgency hint.  (#61858, Havoc Pennington)
+       
+       * gtk/gtk.symbols: 
+       * gtk/gtkwindow.[hc]: Add a GtkWindow::urgency-hint property
+       with getter and setter.
+
+       * gdk/gdk.symbols: 
+       * gdk/gdkwindow.h: 
+       * gdk/x11/gdkwindow-x11.c (gdk_window_set_urgency_hint): 
+       Add a setter for the urgency hint.
+
+       * gdk/x11/gdkwindow-x11.h (struct _GdkToplevelX11): Store
+       urgency hint here.
+
+       * gdk/x11/gdkwindow-x11.c (update_wm_hints): Set the urgency
+       hint in the WM_HINTS property when appropriate.
+
 2005-06-17  Matthias Clasen  <mclasen@redhat.com>
 
        * gdk/gdkcursor.h: Define GDK_IS_CURSOR() and GDK_CURSOR().
index 47ba6c7233b67f4ea4a5ef7fa67ab2047ebd1b8d..84c4b391ca6685a8aed12d5d6d4490d9020d9f57 100644 (file)
@@ -1,3 +1,8 @@
+2005-06-17  Matthias Clasen  <mclasen@redhat.com>
+
+       * gtk/gtk-sections.txt: 
+       * gdk/gdk-sections.txt: Add urgency hint API.
+
 2005-06-14  Matthias Clasen  <mclasen@redhat.com>
 
        * gdk/gdk-sections.txt: Add new functions.
index b2434a900e9bca84cea43f86e2b3e787a98bd0be..36f64f15fa322c9c3239914a1573368e7a2c670d 100644 (file)
@@ -705,6 +705,7 @@ gdk_window_set_modal_hint
 gdk_window_set_type_hint
 gdk_window_set_skip_taskbar_hint
 gdk_window_set_skip_pager_hint
+gdk_window_set_urgency_hint
 gdk_window_get_position
 gdk_window_get_root_origin
 gdk_window_get_frame_extents
index d45f75ce1d648c6ff763c3a6c02ed89e361110a7..d44124d303fb615ef8587e75cadf2a63f6458ad1 100644 (file)
@@ -4730,6 +4730,7 @@ gtk_window_set_role
 gtk_window_set_type_hint
 gtk_window_set_skip_taskbar_hint
 gtk_window_set_skip_pager_hint
+gtk_window_set_urgency_hint
 gtk_window_set_accept_focus
 gtk_window_set_focus_on_map
 gtk_window_get_decorated
@@ -4751,6 +4752,7 @@ gtk_window_get_transient_for
 gtk_window_get_type_hint
 gtk_window_get_skip_taskbar_hint
 gtk_window_get_skip_pager_hint
+gtk_window_get_urgency_hint
 gtk_window_get_accept_focus
 gtk_window_get_focus_on_map
 gtk_window_move
index c5f5239887040195a86940cb14157a085a035776..7839ece7c4ef74855a17bbda1c6609315e2bd848 100644 (file)
@@ -708,6 +708,7 @@ gdk_window_set_type_hint
 gdk_window_set_modal_hint
 gdk_window_set_skip_taskbar_hint
 gdk_window_set_skip_pager_hint
+gdk_window_set_urgency_hint
 gdk_window_set_geometry_hints
 gdk_window_set_title
 gdk_window_set_role
index 47e5620bc70e00a8ef5cd226087f24eff9215646..85ac3a537acbb4ea79f56cb235fd9915d89bbcfe 100644 (file)
@@ -414,6 +414,8 @@ void gdk_window_set_skip_taskbar_hint (GdkWindow *window,
                                        gboolean   skips_taskbar);
 void gdk_window_set_skip_pager_hint   (GdkWindow *window,
                                        gboolean   skips_pager);
+void gdk_window_set_urgency_hint      (GdkWindow *window,
+                                      gboolean   urgent);
 
 void          gdk_window_set_geometry_hints (GdkWindow        *window,
                                             GdkGeometry      *geometry,
index 87957a3cf06b6b7b3b66e6429c8f0c00514b9a17..d939a6345db0cd390995dd4e3f87a3da82a09936 100644 (file)
@@ -1270,6 +1270,9 @@ update_wm_hints (GdkWindow *window,
     }
   else
     wm_hints.window_group = GDK_DISPLAY_X11 (display)->leader_window;
+
+  if (toplevel->urgency_hint)
+    wm_hints.flags |= XUrgencyHint;
   
   XSetWMHints (GDK_WINDOW_XDISPLAY (window),
               GDK_WINDOW_XID (window),
@@ -2342,6 +2345,34 @@ gdk_window_set_skip_pager_hint (GdkWindow *window,
                             NULL);
 }
 
+/**
+ * gdk_window_set_urgency_hint:
+ * @window: a toplevel #GdkWindow
+ * @urgent: %TRUE if the window is urgent
+ * 
+ * Toggles whether a window needs the user's
+ * urgent attention.
+ *
+ * Since: 2.8
+ **/
+void
+gdk_window_set_urgency_hint (GdkWindow *window,
+                            gboolean   urgent)
+{
+  GdkToplevelX11 *toplevel;
+    
+  g_return_if_fail (GDK_IS_WINDOW (window));
+  g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD);
+  
+  if (GDK_WINDOW_DESTROYED (window))
+    return;
+
+  toplevel = _gdk_x11_window_get_toplevel (window);
+  toplevel->urgency_hint = urgent;
+  
+  update_wm_hints (window, FALSE);
+}
+
 /**
  * gdk_window_set_geometry_hints:
  * @window: a toplevel #GdkWindow
index 63e721e4e26f97daf52ec47bc9767309a13bd7b0..18fa23a0575340a6917ce56a6f7ae502b5ad6637 100644 (file)
@@ -111,6 +111,7 @@ struct _GdkToplevelX11
   /* Set if we are requesting these hints */
   guint skip_taskbar_hint : 1;
   guint skip_pager_hint : 1;
+  guint urgency_hint : 1;
 
   guint on_all_desktops : 1;   /* _NET_WM_STICKY == 0xFFFFFFFF */
 
index 3a468e28e27d41365231fde107eb02d8683be198..9fa563c28ac75cf6ffbbdc8489f6bf5159189348 100644 (file)
@@ -3912,6 +3912,7 @@ gtk_window_get_screen
 gtk_window_get_size
 gtk_window_get_skip_pager_hint
 gtk_window_get_skip_taskbar_hint
+gtk_window_get_urgency_hint
 gtk_window_get_title
 gtk_window_get_transient_for
 gtk_window_get_type G_GNUC_CONST
@@ -3975,6 +3976,7 @@ gtk_window_set_role
 gtk_window_set_screen
 gtk_window_set_skip_pager_hint
 gtk_window_set_skip_taskbar_hint
+gtk_window_set_urgency_hint
 gtk_window_set_title
 gtk_window_set_transient_for
 gtk_window_set_type_hint
index bee9590f2026bc42b8803278e94c6b40844f9f02..5f7f4f499f801450838da192c3a722879834a84d 100644 (file)
@@ -82,6 +82,7 @@ enum {
   PROP_TYPE_HINT,
   PROP_SKIP_TASKBAR_HINT,
   PROP_SKIP_PAGER_HINT,
+  PROP_URGENCY_HINT,
   PROP_ACCEPT_FOCUS,
   PROP_FOCUS_ON_MAP,
   PROP_DECORATED,
@@ -165,6 +166,7 @@ struct _GtkWindowPrivate
   guint fullscreen_initially : 1;
   guint skips_taskbar : 1;
   guint skips_pager : 1;
+  guint urgent : 1;
   guint accept_focus : 1;
   guint focus_on_map : 1;
 };
@@ -580,6 +582,14 @@ gtk_window_class_init (GtkWindowClass *klass)
                                                          FALSE,
                                                          GTK_PARAM_READWRITE));  
 
+  g_object_class_install_property (gobject_class,
+                                  PROP_URGENCY_HINT,
+                                  g_param_spec_boolean ("urgency-hint",
+                                                         P_("Urgent"),
+                                                         P_("TRUE if the window should be brought to the user's attention."),
+                                                         FALSE,
+                                                         GTK_PARAM_READWRITE));  
+
   /**
    * GtkWindow:accept-focus-hint:
    *
@@ -868,6 +878,10 @@ gtk_window_set_property (GObject      *object,
       gtk_window_set_skip_pager_hint (window,
                                       g_value_get_boolean (value));
       break;
+    case PROP_URGENCY_HINT:
+      gtk_window_set_urgency_hint (window,
+                                  g_value_get_boolean (value));
+      break;
     case PROP_ACCEPT_FOCUS:
       gtk_window_set_accept_focus (window,
                                   g_value_get_boolean (value));
@@ -968,6 +982,10 @@ gtk_window_get_property (GObject      *object,
       g_value_set_boolean (value,
                            gtk_window_get_skip_pager_hint (window));
       break;
+    case PROP_URGENCY_HINT:
+      g_value_set_boolean (value,
+                           gtk_window_get_urgency_hint (window));
+      break;
     case PROP_ACCEPT_FOCUS:
       g_value_set_boolean (value,
                            gtk_window_get_accept_focus (window));
@@ -2057,6 +2075,60 @@ gtk_window_get_skip_pager_hint (GtkWindow *window)
   return priv->skips_pager;
 }
 
+/**
+ * gtk_window_set_urgency_hint:
+ * @window: a #GtkWindow 
+ * @setting: %TRUE to mark this window as urgent
+ * 
+ * Windows may set a hint asking the desktop environment to draw
+ * the users attention to the window. This function sets this hint.
+ * 
+ * Since: 2.8
+ **/
+void
+gtk_window_set_urgency_hint (GtkWindow *window,
+                            gboolean   setting)
+{
+  GtkWindowPrivate *priv;
+
+  g_return_if_fail (GTK_IS_WINDOW (window));
+  
+  priv = GTK_WINDOW_GET_PRIVATE (window);
+
+  setting = setting != FALSE;
+
+  if (priv->urgent != setting)
+    {
+      priv->urgent = setting;
+      if (GTK_WIDGET_REALIZED (window))
+        gdk_window_set_urgency_hint (GTK_WIDGET (window)->window,
+                                    priv->urgent);
+      g_object_notify (G_OBJECT (window), "urgency-hint");
+    }
+}
+
+/**
+ * gtk_window_get_urgency_hint:
+ * @window: a #GtkWindow
+ * 
+ * Gets the value set by gtk_window_set_urgency_hint()
+ * 
+ * Return value: %TRUE if window is urgent
+ * 
+ * Since: 2.8
+ **/
+gboolean
+gtk_window_get_urgency_hint (GtkWindow *window)
+{
+  GtkWindowPrivate *priv;
+
+  g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
+  
+  priv = GTK_WINDOW_GET_PRIVATE (window);
+
+  return priv->urgent;
+}
+
 /**
  * gtk_window_set_accept_focus:
  * @window: a #GtkWindow 
index 177290f2161a2008f3e1ec2c9bbe5b0ec77a0650..5c4e4a8d7ad2a1fe83e7ced308912786a5c72fa0 100644 (file)
@@ -204,6 +204,9 @@ gboolean   gtk_window_get_skip_taskbar_hint    (GtkWindow           *window);
 void       gtk_window_set_skip_pager_hint      (GtkWindow           *window,
                                                 gboolean             setting);
 gboolean   gtk_window_get_skip_pager_hint      (GtkWindow           *window);
+void       gtk_window_set_urgency_hint         (GtkWindow           *window,
+                                                gboolean             setting);
+gboolean   gtk_window_get_urgency_hint         (GtkWindow           *window);
 void       gtk_window_set_accept_focus         (GtkWindow           *window,
                                                 gboolean             setting);
 gboolean   gtk_window_get_accept_focus         (GtkWindow           *window);