]> Dogcows Code - chaz/openbox/blobdiff - openbox/client.c
move the move/resize functionality into moveresize.c, for use with the netwm atoms...
[chaz/openbox] / openbox / client.c
index f4dd727b9dc33490d660d29f8b928b70ce349b23..17172dd99f37fb40b4597f24dad32ac4cbd9f0b2 100644 (file)
@@ -8,6 +8,7 @@
 #include "focus.h"
 #include "stacking.h"
 #include "dispatch.h"
+#include "openbox.h"
 #include "group.h"
 #include "config.h"
 
@@ -25,7 +26,7 @@ GList      *client_list      = NULL;
 GHashTable *client_map       = NULL;
 
 static Window *client_startup_stack_order = NULL;
-static gulong  client_startup_stack_size = 0;
+static guint  client_startup_stack_size = 0;
 
 static void client_get_all(Client *self);
 static void client_toggle_border(Client *self, gboolean show);
@@ -52,8 +53,9 @@ void client_startup()
                                  (GEqualFunc)map_key_comp);
 
     /* save the stacking order on startup! */
-    PROP_GET32U(ob_root, net_client_list_stacking, window,
-                client_startup_stack_order, client_startup_stack_size);
+    PROP_GETA32(ob_root, net_client_list_stacking, window,
+                (guint32**)&client_startup_stack_order,
+                &client_startup_stack_size);
 
     client_set_list();
 }
@@ -78,7 +80,7 @@ void client_set_list()
     } else
        windows = NULL;
 
-    PROP_SET32A(ob_root, net_client_list, window, windows, size);
+    PROP_SETA32(ob_root, net_client_list, window, (guint32*)windows, size);
 
     if (windows)
        g_free(windows);
@@ -238,7 +240,7 @@ void client_manage(Window window)
     dispatch_client(Event_Client_Mapped, self, 0, 0);
 
     /* focus the new window? */
-    if (ob_state != State_Starting) {
+    if (ob_state != State_Starting && client_normal(self)) {
         if (config_focus_new)
             client_focus(self);
         else if (self->transient_for) {
@@ -516,14 +518,6 @@ static void client_get_all(Client *self)
     client_update_icons(self);
     client_update_kwm_icon(self);
 
-    /* this makes sure that these windows appear on all desktops */
-    if (self->type == Type_Desktop)
-       self->desktop = DESKTOP_ALL;
-
-    /* set the desktop hint, to make sure that it always exists, and to
-       reflect any changes we've made here */
-    PROP_SET32(self->window, net_wm_desktop, cardinal, self->desktop);
-
     client_change_state(self);
 }
 
@@ -541,28 +535,31 @@ static void client_get_area(Client *self)
 
 static void client_get_desktop(Client *self)
 {
-    unsigned int d;
+    guint32 d;
 
-    if (PROP_GET32(self->window, net_wm_desktop, cardinal, d)) {
+    if (PROP_GET32(self->window, net_wm_desktop, cardinal, &d)) {
        if (d >= screen_num_desktops && d != DESKTOP_ALL)
            d = screen_num_desktops - 1;
        self->desktop = d;
     } else {
        /* defaults to the current desktop */
        self->desktop = screen_desktop;
+
+        /* set the desktop hint, to make sure that it always exists */
+        PROP_SET32(self->window, net_wm_desktop, cardinal, self->desktop);
     }
 }
 
 static void client_get_state(Client *self)
 {
-    gulong *state;
-    gulong num;
+    guint32 *state;
+    guint num;
   
     self->modal = self->shaded = self->max_horz = self->max_vert =
        self->fullscreen = self->above = self->below = self->iconic =
        self->skip_taskbar = self->skip_pager = FALSE;
 
-    if (PROP_GET32U(self->window, net_wm_state, atom, state, num)) {
+    if (PROP_GETA32(self->window, net_wm_state, atom, &state, &num)) {
        gulong i;
        for (i = 0; i < num; ++i) {
            if (state[i] == prop_atoms.net_wm_state_modal)
@@ -668,12 +665,13 @@ void client_update_transient_for(Client *self)
 
 static void client_get_mwm_hints(Client *self)
 {
-    unsigned long num;
-    unsigned long *hints;
+    guint num;
+    guint32 *hints;
 
     self->mwmhints.flags = 0; /* default to none */
 
-    if (PROP_GET32U(self->window, motif_wm_hints, motif_wm_hints, hints, num)) {
+    if (PROP_GETA32(self->window, motif_wm_hints, motif_wm_hints,
+                    &hints, &num)) {
        if (num >= MWM_ELEMENTS) {
            self->mwmhints.flags = hints[0];
            self->mwmhints.functions = hints[1];
@@ -685,11 +683,12 @@ static void client_get_mwm_hints(Client *self)
 
 void client_get_type(Client *self)
 {
-    gulong *val, num, i;
+    guint num, i;
+    guint32 *val;
 
     self->type = -1;
   
-    if (PROP_GET32U(self->window, net_wm_window_type, atom, val, num)) {
+    if (PROP_GETA32(self->window, net_wm_window_type, atom, &val, &num)) {
        /* use the first value that we know about in the array */
        for (i = 0; i < num; ++i) {
            if (val[i] == prop_atoms.net_wm_window_type_desktop)
@@ -731,17 +730,21 @@ void client_get_type(Client *self)
        else
            self->type = Type_Normal;
     }
+
+    /* this makes sure that these windows appear on all desktops */
+    if (self->type == Type_Desktop)
+       self->desktop = DESKTOP_ALL;
 }
 
 void client_update_protocols(Client *self)
 {
-    Atom *proto;
-    gulong num_return, i;
+    guint32 *proto;
+    guint num_return, i;
 
     self->focus_notify = FALSE;
     self->delete_window = FALSE;
 
-    if (PROP_GET32U(self->window, wm_protocols, atom, proto, num_return)) {
+    if (PROP_GETA32(self->window, wm_protocols, atom, &proto, &num_return)) {
        for (i = 0; i < num_return; ++i) {
            if (proto[i] == prop_atoms.wm_delete_window) {
                /* this means we can request the window to close */
@@ -927,6 +930,12 @@ void client_setup_decor_and_functions(Client *self)
     if (!(self->decorations & Decor_Titlebar))
        self->functions &= ~Func_Shade;
 
+    /* now we need to check against rules for the client's current state */
+    if (self->fullscreen) {
+       self->functions &= (Func_Close | Func_Fullscreen | Func_Iconify);
+       self->decorations = 0;
+    }
+
     client_change_allowed_actions(self);
 
     if (self->frame) {
@@ -940,7 +949,7 @@ void client_setup_decor_and_functions(Client *self)
 
 static void client_change_allowed_actions(Client *self)
 {
-    Atom actions[9];
+    guint32 actions[9];
     int num = 0;
 
     actions[num++] = prop_atoms.net_wm_action_change_desktop;
@@ -962,7 +971,7 @@ static void client_change_allowed_actions(Client *self)
        actions[num++] = prop_atoms.net_wm_action_maximize_vert;
     }
 
-    PROP_SET32A(self->window, net_wm_allowed_actions, atom, actions, num);
+    PROP_SETA32(self->window, net_wm_allowed_actions, atom, actions, num);
 
     /* make sure the window isn't breaking any rules now */
 
@@ -1005,6 +1014,7 @@ void client_update_wmhints(Client *self)
 {
     XWMHints *hints;
     gboolean ur = FALSE;
+    GSList *it;
 
     /* assume a window takes input if it doesnt specify */
     self->can_focus = TRUE;
@@ -1023,35 +1033,57 @@ void client_update_wmhints(Client *self)
            ur = TRUE;
 
        if (!(hints->flags & WindowGroupHint))
-            hints->window_group = None; /* no group */
+            hints->window_group = None;
+
         /* did the group state change? */
-        if (hints->window_group != (self->group ? self->group->leader : None)){
+        if (hints->window_group !=
+            (self->group ? self->group->leader : None)) {
             /* remove from the old group if there was one */
-            if (self->group != NULL)
+            if (self->group != NULL) {
+                /* remove transients of the group */
+                for (it = self->group->members; it; it = it->next)
+                    if (it->data != self &&
+                        ((Client*)it->data)->transient_for == TRAN_GROUP) {
+                        self->transients = g_slist_remove(self->transients,
+                                                          it->data);
+                    }
                 group_remove(self->group, self);
-            if (hints->window_group != None)
+                self->group = NULL;
+            }
+            if (hints->window_group != None) {
                 self->group = group_add(hints->window_group, self);
 
+                /* add other transients of the group that are already
+                   set up */
+                for (it = self->group->members; it; it = it->next)
+                    if (it->data != self &&
+                        ((Client*)it->data)->transient_for == TRAN_GROUP)
+                        self->transients = g_slist_append(self->transients,
+                                                          it->data);
+            }
+
             /* because the self->transient flag wont change from this call,
                we don't need to update the window's type and such, only its
-               transient_for, and the transients lists of other windows in the
-               group may be affected */
+               transient_for, and the transients lists of other windows in
+               the group may be affected */
             client_update_transient_for(self);
         }
 
-       if (hints->flags & IconPixmapHint) {
-           client_update_kwm_icon(self);
-           /* try get the kwm icon first, this is a fallback only */
-           if (self->pixmap_icon == None) {
-               self->pixmap_icon = hints->icon_pixmap;
-               if (hints->flags & IconMaskHint)
-                   self->pixmap_icon_mask = hints->icon_mask;
-               else
-                   self->pixmap_icon_mask = None;
-
-               if (self->frame)
-                   frame_adjust_icon(self->frame);
-           }
+        client_update_kwm_icon(self);
+        /* try get the kwm icon first, this is a fallback only */
+        if (self->pixmap_icon == None) {
+            if (hints->flags & IconPixmapHint) {
+                if (self->pixmap_icon == None) {
+                    self->pixmap_icon = hints->icon_pixmap;
+                    if (hints->flags & IconMaskHint)
+                        self->pixmap_icon_mask = hints->icon_mask;
+                    else
+                        self->pixmap_icon_mask = None;
+
+                    if (self->frame)
+                        frame_adjust_icon(self->frame);
+                }
+            }
        }
 
        XFree(hints);
@@ -1070,31 +1102,19 @@ void client_update_wmhints(Client *self)
 
 void client_update_title(Client *self)
 {
-    gchar *data = NULL;
+    char *data = NULL;
 
     g_free(self->title);
      
     /* try netwm */
-    if (!PROP_GETS(self->window, net_wm_name, utf8, data)) {
+    if (!PROP_GETS(self->window, net_wm_name, utf8, &data))
        /* try old x stuff */
-       if (PROP_GETS(self->window, wm_name, string, data)) {
-           /* convert it to UTF-8 */
-           gsize r, w;
-           gchar *u;
-
-           u = g_locale_to_utf8(data, -1, &r, &w, NULL);
-           if (u == NULL) {
-               g_warning("Unable to convert string to UTF-8");
-           } else {
-               g_free(data);
-               data = u;
-           }
-       }
-       if (data == NULL)
+       if (!PROP_GETS(self->window, wm_name, locale, &data))
            data = g_strdup("Unnamed Window");
 
-       PROP_SETS(self->window, net_wm_visible_name, utf8, data);
-    }
+    /* look for duplicates and append a number */
+
+    PROP_SETS(self->window, net_wm_visible_name, data);
 
     self->title = data;
 
@@ -1104,40 +1124,25 @@ void client_update_title(Client *self)
 
 void client_update_icon_title(Client *self)
 {
-    gchar *data = NULL;
+    char *data = NULL;
 
     g_free(self->icon_title);
      
     /* try netwm */
-    if (!PROP_GETS(self->window, net_wm_icon_name, utf8, data)) {
+    if (!PROP_GETS(self->window, net_wm_icon_name, utf8, &data))
        /* try old x stuff */
-       if (PROP_GETS(self->window, wm_icon_name, string, data)) {
-           /* convert it to UTF-8 */
-           gsize r, w;
-           gchar *u;
-
-           u = g_locale_to_utf8(data, -1, &r, &w, NULL);
-           if (u == NULL) {
-               g_warning("Unable to convert string to UTF-8");
-           } else {
-               g_free(data);
-               data = u;
-           }
-       }
-       if (data == NULL)
-           data = g_strdup("Unnamed Window");
+       if (!PROP_GETS(self->window, wm_icon_name, locale, &data))
+            data = g_strdup("Unnamed Window");
 
-       PROP_SETS(self->window, net_wm_visible_icon_name, utf8, data);
-    }
+    PROP_SETS(self->window, net_wm_visible_icon_name, data);
 
     self->icon_title = data;
 }
 
 void client_update_class(Client *self)
 {
-    GPtrArray *data;
-    gchar *s;
-    guint i;
+    char **data;
+    char *s;
 
     if (self->name) g_free(self->name);
     if (self->class) g_free(self->class);
@@ -1145,20 +1150,16 @@ void client_update_class(Client *self)
 
     self->name = self->class = self->role = NULL;
 
-    data = g_ptr_array_new();
-     
-    if (PROP_GETSA(self->window, wm_class, string, data)) {
-       if (data->len > 0)
-           self->name = g_strdup(g_ptr_array_index(data, 0));
-       if (data->len > 1)
-           self->class = g_strdup(g_ptr_array_index(data, 1));
+    if (PROP_GETSS(self->window, wm_class, locale, &data)) {
+        if (data[0]) {
+           self->name = g_strdup(data[0]);
+            if (data[1])
+                self->class = g_strdup(data[1]);
+        }
+        g_strfreev(data);     
     }
-     
-    for (i = 0; i < data->len; ++i)
-       g_free(g_ptr_array_index(data, i));
-    g_ptr_array_free(data, TRUE);
 
-    if (PROP_GETS(self->window, wm_window_role, string, s))
+    if (PROP_GETS(self->window, wm_window_role, locale, &s))
        self->role = g_strdup(s);
 
     if (self->name == NULL) self->name = g_strdup("");
@@ -1168,13 +1169,18 @@ void client_update_class(Client *self)
 
 void client_update_strut(Client *self)
 {
-    gulong *data;
+    guint num;
+    guint32 *data;
 
-    if (PROP_GET32A(self->window, net_wm_strut, cardinal, data, 4)) {
-       STRUT_SET(self->strut, data[0], data[2], data[1], data[3]);
-       g_free(data);
-    } else
+    if (!PROP_GETA32(self->window, net_wm_strut, cardinal, &data, &num)) {
        STRUT_SET(self->strut, 0, 0, 0, 0);
+    } else {
+        if (num == 4)
+            STRUT_SET(self->strut, data[0], data[2], data[1], data[3]);
+        else
+            STRUT_SET(self->strut, 0, 0, 0, 0);
+       g_free(data);
+    }
 
     /* updating here is pointless while we're being mapped cuz we're not in
        the client list yet */
@@ -1184,9 +1190,9 @@ void client_update_strut(Client *self)
 
 void client_update_icons(Client *self)
 {
-    unsigned long num;
-    unsigned long *data;
-    unsigned long w, h, i;
+    guint num;
+    guint32 *data;
+    guint w, h, i;
     int j;
 
     for (j = 0; j < self->nicons; ++j)
@@ -1195,7 +1201,7 @@ void client_update_icons(Client *self)
        g_free(self->icons);
     self->nicons = 0;
 
-    if (PROP_GET32U(self->window, net_wm_icon, cardinal, data, num)) {
+    if (PROP_GETA32(self->window, net_wm_icon, cardinal, &data, &num)) {
        /* figure out how many valid icons are in here */
        i = 0;
        while (num - i > 2) {
@@ -1228,14 +1234,18 @@ void client_update_icons(Client *self)
 
 void client_update_kwm_icon(Client *self)
 {
-    Pixmap *data;
+    guint num;
+    guint32 *data;
 
-    if (PROP_GET32A(self->window, kwm_win_icon, kwm_win_icon, data, 2)) {
-       self->pixmap_icon = data[0];
-       self->pixmap_icon_mask = data[1];
-       g_free(data);
-    } else {
+    if (!PROP_GETA32(self->window, kwm_win_icon, kwm_win_icon, &data, &num)) {
        self->pixmap_icon = self->pixmap_icon_mask = None;
+    } else {
+        if (num == 2) {
+            self->pixmap_icon = data[0];
+            self->pixmap_icon_mask = data[1];
+        } else
+            self->pixmap_icon = self->pixmap_icon_mask = None;
+       g_free(data);
     }
     if (self->frame)
        frame_adjust_icon(self->frame);
@@ -1243,13 +1253,13 @@ void client_update_kwm_icon(Client *self)
 
 static void client_change_state(Client *self)
 {
-    unsigned long state[2];
-    Atom netstate[10];
-    int num;
+    guint32 state[2];
+    guint32 netstate[10];
+    guint num;
 
     state[0] = self->wmstate;
     state[1] = None;
-    PROP_SET32A(self->window, wm_state, wm_state, state, 2);
+    PROP_SETA32(self->window, wm_state, wm_state, state, 2);
 
     num = 0;
     if (self->modal)
@@ -1272,7 +1282,7 @@ static void client_change_state(Client *self)
        netstate[num++] = prop_atoms.net_wm_state_above;
     if (self->below)
        netstate[num++] = prop_atoms.net_wm_state_below;
-    PROP_SET32A(self->window, net_wm_state, atom, netstate, num);
+    PROP_SETA32(self->window, net_wm_state, atom, netstate, num);
 
     client_calc_layer(self);
 
@@ -1294,44 +1304,64 @@ static Client *search_focus_tree(Client *node, Client *skip)
     return NULL;
 }
 
+static void calc_recursive(Client *self, StackLayer l, gboolean raised)
+{
+    StackLayer old;
+    GSList *it;
+
+    old = self->layer;
+    self->layer = l;
+
+    for (it = self->transients; it; it = it->next)
+        calc_recursive(it->data, l, raised ? raised : l != old);
+
+    if (!raised && l != old)
+       if (self->frame)
+           stacking_raise(self);
+}
+
 void client_calc_layer(Client *self)
 {
     StackLayer l;
-    gboolean fs;
-    Client *c;
-
-    /* are we fullscreen, or do we have a fullscreen transient parent? */
-    c = self;
-    fs = FALSE;
-    while (c && c != TRAN_GROUP) { /* XXX do smthng with the TRAN_GROUP case?*/
-       if (c->fullscreen) {
-           fs = TRUE;
-           break;
-       }
-       c = c->transient_for;
-    }
-    if (!fs && self->fullscreen) {
-       /* is one of our transients focused? */
-       c = search_focus_tree(self, self);
-       if (c != NULL) fs = TRUE;
+    gboolean f;
+
+    /* transients take on the layer of their parents */
+    if (self->transient_for) {
+        if (self->transient_for != TRAN_GROUP) {
+            self = self->transient_for;
+        } else {
+            GSList *it;
+
+            for (it = self->group->members; it; it = it->next)
+                if (it->data != self &&
+                    ((Client*)it->data)->transient_for != TRAN_GROUP) {
+                    self = it->data;
+                    break;
+                }
+        }
     }
-  
+
+    /* is us or one of our transients focused? */
+    if (client_focused(self))
+        f = TRUE;
+    else if (search_focus_tree(self, self))
+        f = TRUE;
+    else
+        f = FALSE;
+
     if (self->iconic) l = Layer_Icon;
-    else if (fs) l = Layer_Fullscreen;
+    /* fullscreen windows are only in the fullscreen layer while focused */
+    else if (self->fullscreen && f) l = Layer_Fullscreen;
     else if (self->type == Type_Desktop) l = Layer_Desktop;
     else if (self->type == Type_Dock) {
-       if (!self->below) l = Layer_Top;
-       else l = Layer_Normal;
+        if (!self->below) l = Layer_Top;
+        else l = Layer_Normal;
     }
     else if (self->above) l = Layer_Above;
     else if (self->below) l = Layer_Below;
     else l = Layer_Normal;
-     
-    if (l != self->layer) {
-       self->layer = l;
-       if (self->frame)
-           stacking_raise(self);
-    }
+
+    calc_recursive(self, l, FALSE);
 }
 
 gboolean client_should_show(Client *self)
@@ -1413,6 +1443,7 @@ void client_configure(Client *self, Corner anchor, int x, int y, int w, int h,
        y = 0;
        w = screen_physical_size.width;
        h = screen_physical_size.height;
+        user = FALSE; /* ignore that increment etc shit when in fullscreen */
     } else {
         /* set the size and position if maximized */
         if (self->max_horz) {
@@ -1557,24 +1588,18 @@ void client_fullscreen(Client *self, gboolean fs, gboolean savearea)
        self->fullscreen == fs) return;         /* already done */
 
     self->fullscreen = fs;
-    client_change_state(self); /* change the state hints on the client */
+    client_change_state(self); /* change the state hints on the client,
+                                  and adjust out layer/stacking */
 
     if (fs) {
-       /* save the functions and remove them */
-       self->pre_fs_func = self->functions;
-       self->functions &= (Func_Close | Func_Fullscreen |
-                           Func_Iconify);
-       /* save the decorations and remove them */
-       self->pre_fs_decor = self->decorations;
-       self->decorations = 0;
        if (savearea) {
-           long dimensions[4];
+           guint32 dimensions[4];
            dimensions[0] = self->area.x;
            dimensions[1] = self->area.y;
            dimensions[2] = self->area.width;
            dimensions[3] = self->area.height;
   
-           PROP_SET32A(self->window, openbox_premax, cardinal,
+           PROP_SETA32(self->window, openbox_premax, cardinal,
                        dimensions, 4);
        }
 
@@ -1582,37 +1607,32 @@ void client_fullscreen(Client *self, gboolean fs, gboolean savearea)
            as appropriate when the window is fullscreened */
         x = y = w = h = 0;
     } else {
-       long *dimensions;
-
-       self->functions = self->pre_fs_func;
-       self->decorations = self->pre_fs_decor;
-         
-       if (PROP_GET32A(self->window, openbox_premax, cardinal,
-                       dimensions, 4)) {
-           x = dimensions[0];
-           y = dimensions[1];
-           w = dimensions[2];
-           h = dimensions[3];
+        guint num;
+       gint32 *dimensions;
+
+        /* pick some fallbacks... */
+        x = screen_area(self->desktop)->x +
+            screen_area(self->desktop)->width / 4;
+        y = screen_area(self->desktop)->y +
+            screen_area(self->desktop)->height / 4;
+        w = screen_area(self->desktop)->width / 2;
+        h = screen_area(self->desktop)->height / 2;
+
+       if (PROP_GETA32(self->window, openbox_premax, cardinal,
+                        (guint32**)&dimensions, &num)) {
+            if (num == 4) {
+                x = dimensions[0];
+                y = dimensions[1];
+                w = dimensions[2];
+                h = dimensions[3];
+            }
            g_free(dimensions);
-       } else {
-           /* pick some fallbacks... */
-           x = screen_area(self->desktop)->x +
-               screen_area(self->desktop)->width / 4;
-           y = screen_area(self->desktop)->y +
-               screen_area(self->desktop)->height / 4;
-           w = screen_area(self->desktop)->width / 2;
-           h = screen_area(self->desktop)->height / 2;
        }
     }
 
-    client_change_allowed_actions(self); /* based on the new _functions */
-
-    /* when fullscreening, don't obey things like increments, fill the
-       screen */
-    client_configure(self, Corner_TopLeft, x, y, w, h, !fs, TRUE);
+    client_setup_decor_and_functions(self);
 
-    /* raise (back) into our stacking layer */
-    stacking_raise(self);
+    client_configure(self, Corner_TopLeft, x, y, w, h, TRUE, TRUE);
 
     /* try focus us when we go into fullscreen mode */
     client_focus(self);
@@ -1620,6 +1640,8 @@ void client_fullscreen(Client *self, gboolean fs, gboolean savearea)
 
 void client_iconify(Client *self, gboolean iconic, gboolean curdesk)
 {
+    GSList *it;
+
     /* move up the transient chain as far as possible first if deiconifying */
     if (!iconic)
         while (self->transient_for) {
@@ -1637,8 +1659,7 @@ void client_iconify(Client *self, gboolean iconic, gboolean curdesk)
                     Client *c = it->data;
 
                     if (c != self && c->transient_for->iconic != iconic &&
-                        (c->transient_for != TRAN_GROUP ||
-                         c->group != self->group)) {
+                        c->transient_for != TRAN_GROUP) {
                         self = it->data;
                         break;
                     }
@@ -1674,12 +1695,8 @@ void client_iconify(Client *self, gboolean iconic, gboolean curdesk)
                     self, 0, 0);
 
     /* iconify all transients */
-    if (self->transients) {
-        GSList *it;
-
-        for (it = self->transients; it != NULL; it = it->next)
-            if (it->data != self) client_iconify(it->data, iconic, curdesk);
-    }
+    for (it = self->transients; it != NULL; it = it->next)
+        if (it->data != self) client_iconify(it->data, iconic, curdesk);
 }
 
 void client_maximize(Client *self, gboolean max, int dir, gboolean savearea)
@@ -1708,8 +1725,9 @@ void client_maximize(Client *self, gboolean max, int dir, gboolean savearea)
 
     if (max) {
        if (savearea) {
-           long dimensions[4];
-           long *readdim;
+           gint32 dimensions[4];
+           gint32 *readdim;
+            guint num;
 
            dimensions[0] = x;
            dimensions[1] = y;
@@ -1718,48 +1736,53 @@ void client_maximize(Client *self, gboolean max, int dir, gboolean savearea)
 
            /* get the property off the window and use it for the dimensions
               we are already maxed on */
-           if (PROP_GET32A(self->window, openbox_premax, cardinal,
-                           readdim, 4)) {
-               if (self->max_horz) {
-                   dimensions[0] = readdim[0];
-                   dimensions[2] = readdim[2];
-               }
-               if (self->max_vert) {
-                   dimensions[1] = readdim[1];
-                   dimensions[3] = readdim[3];
-               }
+           if (PROP_GETA32(self->window, openbox_premax, cardinal,
+                           (guint32**)&readdim, &num)) {
+                if (num == 4) {
+                    if (self->max_horz) {
+                        dimensions[0] = readdim[0];
+                        dimensions[2] = readdim[2];
+                    }
+                    if (self->max_vert) {
+                        dimensions[1] = readdim[1];
+                        dimensions[3] = readdim[3];
+                    }
+                }
                g_free(readdim);
            }
 
-           PROP_SET32A(self->window, openbox_premax, cardinal,
-                       dimensions, 4);
+           PROP_SETA32(self->window, openbox_premax, cardinal,
+                       (guint32*)dimensions, 4);
        }
     } else {
-       long *dimensions;
+        guint num;
+       gint32 *dimensions;
+
+        /* pick some fallbacks... */
+        if (dir == 0 || dir == 1) { /* horz */
+            x = screen_area(self->desktop)->x +
+                screen_area(self->desktop)->width / 4;
+            w = screen_area(self->desktop)->width / 2;
+        }
+        if (dir == 0 || dir == 2) { /* vert */
+            y = screen_area(self->desktop)->y +
+                screen_area(self->desktop)->height / 4;
+            h = screen_area(self->desktop)->height / 2;
+        }
 
-       if (PROP_GET32A(self->window, openbox_premax, cardinal,
-                       dimensions, 4)) {
-           if (dir == 0 || dir == 1) { /* horz */
-               x = dimensions[0];
-               w = dimensions[2];
-           }
-           if (dir == 0 || dir == 2) { /* vert */
-               y = dimensions[1];
-               h = dimensions[3];
-           }
-           g_free(dimensions);
-       } else {
-           /* pick some fallbacks... */
-           if (dir == 0 || dir == 1) { /* horz */
-               x = screen_area(self->desktop)->x +
-                   screen_area(self->desktop)->width / 4;
-               w = screen_area(self->desktop)->width / 2;
-           }
-           if (dir == 0 || dir == 2) { /* vert */
-               y = screen_area(self->desktop)->y +
-                   screen_area(self->desktop)->height / 4;
-               h = screen_area(self->desktop)->height / 2;
-           }
+       if (PROP_GETA32(self->window, openbox_premax, cardinal,
+                       (guint32**)&dimensions, &num)) {
+            if (num == 4) {
+                if (dir == 0 || dir == 1) { /* horz */
+                    x = dimensions[0];
+                    w = dimensions[2];
+                }
+                if (dir == 0 || dir == 2) { /* vert */
+                    y = dimensions[1];
+                    h = dimensions[3];
+                }
+            }
+            g_free(dimensions);
        }
     }
 
@@ -2124,7 +2147,9 @@ gboolean client_focus(Client *self)
 void client_unfocus(Client *self)
 {
     g_assert(focus_client == self);
+#ifdef DEBUG_FOCUS
     g_message("client_unfocus");
+#endif
     focus_fallback(Fallback_Unfocusing);
 }
 
This page took 0.048905 seconds and 4 git commands to generate.