]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
match the declarations in the header
[chaz/openbox] / openbox / client.c
index 54dc2bbdec84d0aa5e0dc3d0668cc1b13b11de1c..75aecf41f630500d154f15e90b0655b06d48cd80 100644 (file)
@@ -1,8 +1,8 @@
-#include "debug.h"
 #include "client.h"
+#include "debug.h"
+#include "startupnotify.h"
 #include "dock.h"
 #include "xerror.h"
-#include "startup.h"
 #include "screen.h"
 #include "moveresize.h"
 #include "place.h"
@@ -37,6 +37,7 @@ GSList     *client_destructors = NULL;
 
 static void client_get_all(ObClient *self);
 static void client_toggle_border(ObClient *self, gboolean show);
+static void client_get_startup_id(ObClient *self);
 static void client_get_area(ObClient *self);
 static void client_get_desktop(ObClient *self);
 static void client_get_state(ObClient *self);
@@ -51,21 +52,23 @@ static void client_restore_session_state(ObClient *self);
 static void client_restore_session_stacking(ObClient *self);
 static void client_urgent_notify(ObClient *self);
 
-void client_startup()
+void client_startup(gboolean reconfig)
 {
+    if (reconfig) return;
+
     client_set_list();
 }
 
-void client_shutdown()
+void client_shutdown(gboolean reconfig)
 {
 }
 
-void client_add_destructor(ObClientDestructorFunc func)
+void client_add_destructor(GDestroyNotify func)
 {
     client_destructors = g_slist_prepend(client_destructors, (gpointer)func);
 }
 
-void client_remove_destructor(ObClientDestructorFunc func)
+void client_remove_destructor(GDestroyNotify func)
 {
     client_destructors = g_slist_remove(client_destructors, (gpointer)func);
 }
@@ -163,35 +166,8 @@ void client_manage_all()
     }
     XFree(children);
 
-    /* stack them as they were on startup!
-       why with stacking_lower? Why, because then windows who aren't in the
-       stacking list are on the top where you can see them instead of buried
-       at the bottom! */
-    for (i = startup_stack_size; i > 0; --i) {
-        ObWindow *obw;
-
-        w = startup_stack_order[i-1];
-        obw = g_hash_table_lookup(window_map, &w);
-        if (obw) {
-            g_assert(WINDOW_IS_CLIENT(obw));
-            stacking_lower(CLIENT_AS_WINDOW(obw));
-        }
-    }
-    g_free(startup_stack_order);
-    startup_stack_order = NULL;
-    startup_stack_size = 0;
-
-    if (config_focus_new) {
-        ObWindow *active;
-
-        active = g_hash_table_lookup(window_map, &startup_active);
-        if (active) {
-            g_assert(WINDOW_IS_CLIENT(active));
-            if (!client_focus(WINDOW_AS_CLIENT(active)))
-                focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS);
-        } else
-            focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS);
-    }
+    if (config_focus_new)
+        focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS);
 }
 
 void client_manage(Window window)
@@ -249,9 +225,18 @@ void client_manage(Window window)
     self->obwin.type = Window_Client;
     self->window = window;
 
+    /* non-zero defaults */
+    self->title_count = 1;
+    self->wmstate = NormalState;
+    self->layer = -1;
+    self->decorate = TRUE;
+    self->desktop = screen_num_desktops; /* always an invalid value */
+
     client_get_all(self);
     client_restore_session_state(self);
 
+    sn_app_started(self->class);
+
     client_change_state(self);
 
     /* remove the client's border (and adjust re gravity) */
@@ -423,7 +408,7 @@ void client_unmanage(ObClient *self)
     }
 
     for (it = client_destructors; it; it = g_slist_next(it)) {
-        ObClientDestructorFunc func = (ObClientDestructorFunc) it->data;
+        GDestroyNotify func = (GDestroyNotify) it->data;
         func(self);
     }
         
@@ -667,15 +652,10 @@ static void client_toggle_border(ObClient *self, gboolean show)
 
 static void client_get_all(ObClient *self)
 {
-    /* non-zero defaults */
-    self->title_count = 1;
-    self->wmstate = NormalState;
-    self->layer = -1;
-    self->decorate = TRUE;
-
     client_get_area(self);
     client_update_transient_for(self);
     client_update_wmhints(self);
+    client_get_startup_id(self);
     client_get_desktop(self);
     client_get_state(self);
     client_get_shaped(self);
@@ -699,6 +679,14 @@ static void client_get_all(ObClient *self)
     client_update_icons(self);
 }
 
+static void client_get_startup_id(ObClient *self)
+{
+    if (!(PROP_GETS(self->window, net_startup_id, utf8, &self->startup_id)))
+        if (self->group)
+            PROP_GETS(self->group->leader,
+                      net_startup_id, utf8, &self->startup_id);
+}
+
 static void client_get_area(ObClient *self)
 {
     XWindowAttributes wattrib;
@@ -739,9 +727,16 @@ static void client_get_desktop(ObClient *self)
                     }
             }
        }
-       if (!trdesk)
-           /* defaults to the current desktop */
-           self->desktop = screen_desktop;
+       if (!trdesk) {
+           /* try get from the startup-notification protocol */
+           if (sn_get_desktop(self->startup_id, &self->desktop)) {
+               if (self->desktop >= screen_num_desktops &&
+                   self->desktop != DESKTOP_ALL)
+                   self->desktop = screen_num_desktops - 1;
+           } else
+               /* defaults to the current desktop */
+               self->desktop = screen_desktop;
+       }
     }
     if (self->desktop != d) {
         /* set the desktop hint, to make sure that it always exists */
@@ -817,7 +812,11 @@ void client_update_transient_for(ObClient *self)
             target = g_hash_table_lookup(window_map, &t);
             /* if this happens then we need to check for it*/
             g_assert(target != self);
-            g_assert(!target || WINDOW_IS_CLIENT(target));
+            if (target && !WINDOW_IS_CLIENT(target)) {
+                /* this can happen when a dialog is a child of
+                   a dockapp, for example */
+                target = NULL;
+            }
             
             if (!target && self->group) {
                 /* not transient to a client, see if it is transient for a
@@ -1833,7 +1832,6 @@ void client_configure_full(ObClient *self, ObCorner anchor,
 
     if (!(w == self->area.width && h == self->area.height)) {
         int basew, baseh, minw, minh;
-        int mw, mh, aw, ah;
 
         /* base size is substituted with min size if not specified */
         if (self->base_size.width || self->base_size.height) {
@@ -1852,23 +1850,6 @@ void client_configure_full(ObClient *self, ObCorner anchor,
             minh = self->base_size.height;
         }
 
-        /* for interactive resizing. have to move half an increment in each
-           direction. */
-
-        /* how far we are towards the next size inc */
-        mw = (w - basew) % self->size_inc.width; 
-        mh = (h - baseh) % self->size_inc.height;
-        /* amount to add */
-        aw = self->size_inc.width / 2;
-        ah = self->size_inc.height / 2;
-        /* don't let us move into a new size increment */
-        if (mw + aw >= self->size_inc.width)
-            aw = self->size_inc.width - mw - 1;
-        if (mh + ah >= self->size_inc.height)
-            ah = self->size_inc.height - mh - 1;
-        w += aw;
-        h += ah;
-    
         /* if this is a user-requested resize, then check against min/max
            sizes */
 
This page took 0.024986 seconds and 4 git commands to generate.