X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=fc087d44848f6f1547dd874113747f27f9497872;hb=4bf6b1b551be744be4fbe4d1faab5be12d051378;hp=a8a15673f8e372bfe97ff15084c8719efa985d60;hpb=6d0c4d7fadd2d67760ef62e11385fd261ba6a3c4;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index a8a15673..fc087d44 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -33,7 +33,6 @@ #include "focus.h" #include "stacking.h" #include "openbox.h" -#include "hooks.h" #include "group.h" #include "config.h" #include "menuframe.h" @@ -80,7 +79,6 @@ static void client_get_area(ObClient *self); static void client_get_desktop(ObClient *self); static void client_get_state(ObClient *self); static void client_get_shaped(ObClient *self); -static void client_get_mwm_hints(ObClient *self); static void client_get_colormap(ObClient *self); static void client_set_desktop_recursive(ObClient *self, guint target, @@ -233,7 +231,12 @@ void client_manage(Window window, ObPrompt *prompt) ob_debug("Window type: %d", self->type); ob_debug("Window group: 0x%x", self->group?self->group->leader:0); - ob_debug("Window name: %s class: %s", self->name, self->class); + ob_debug("Window name: %s class: %s role: %s", self->name, self->class, self->role); + + /* per-app settings override stuff from client_get_all, and return the + settings for other uses too. the returned settings is a shallow copy, + that needs to be freed with g_free(). */ + settings = client_get_settings_state(self); /* now we have all of the window's information so we can set this up. do this before creating the frame, so it can tell that we are still @@ -255,10 +258,6 @@ void client_manage(Window window, ObPrompt *prompt) time now */ grab_server(FALSE); - /* per-app settings override stuff from client_get_all, and return the - settings for other uses too. the returned settings is a shallow copy, - that needs to be freed with g_free(). */ - settings = client_get_settings_state(self); /* the session should get the last say though */ client_restore_session_state(self); @@ -439,7 +438,7 @@ void client_manage(Window window, ObPrompt *prompt) "Current focus_client: %s", (focus_client ? focus_client->title : "(none)")); ob_debug_type(OB_DEBUG_FOCUS, - "parent focuesed: %d relative focused: %d", + "parent focused: %d relative focused: %d", parent_focused, relative_focused); if (menu_frame_visible || moveresize_in_progress) { @@ -585,8 +584,6 @@ void client_manage(Window window, ObPrompt *prompt) ob_debug("Managed window 0x%lx plate 0x%x (%s)", window, self->frame->window, self->class); - - hooks_queue(OB_HOOK_WIN_NEW, self); } ObClient *client_fake_manage(Window window) @@ -661,9 +658,6 @@ void client_unmanage(ObClient *self) if (!self->prompt) XChangeSaveSet(obt_display, self->window, SetModeDelete); - /* this can't be queued to run later */ - hooks_run(OB_HOOK_WIN_CLOSE, self); - /* update the focus lists */ focus_order_remove(self); if (client_focused(self)) { @@ -1408,7 +1402,7 @@ static void client_update_transient_tree(ObClient *self, } } -static void client_get_mwm_hints(ObClient *self) +void client_get_mwm_hints(ObClient *self) { guint num; guint32 *hints; @@ -1758,7 +1752,8 @@ void client_setup_decor_and_functions(ObClient *self, gboolean reconfig) /* finally, the user can have requested no decorations, which overrides everything (but doesnt give it a border if it doesnt have one) */ if (self->undecorated) - self->decorations = 0; + self->decorations &= (config_theme_keepborder ? + OB_FRAME_DECOR_BORDER : 0); /* if we don't have a titlebar, then we cannot shade! */ if (!(self->decorations & OB_FRAME_DECOR_TITLEBAR)) @@ -2378,7 +2373,7 @@ ObClient *client_search_focus_tree_full(ObClient *self) for (it = self->parents; it; it = g_slist_next(it)) { ObClient *c = it->data; - if ((c = client_search_focus_tree_full(it->data))) return c; + if ((c = client_search_focus_tree_full(c))) return c; } return NULL; @@ -2546,8 +2541,6 @@ gboolean client_show(ObClient *self) desktop! */ client_change_wm_state(self); - - hooks_queue(OB_HOOK_WIN_VISIBLE, self); } return show; } @@ -2586,8 +2579,6 @@ gboolean client_hide(ObClient *self) desktop! */ client_change_wm_state(self); - - hooks_queue(OB_HOOK_WIN_INVISIBLE, self); } return hide; } @@ -3181,9 +3172,6 @@ static void client_iconify_recursive(ObClient *self, frame_begin_iconify_animation(self->frame, iconic); /* do this after starting the animation so it doesn't flash */ client_showhide(self); - - hooks_queue((iconic ? OB_HOOK_WIN_ICONIC : OB_HOOK_WIN_UNICONIC), - self); } /* iconify all direct transients, and deiconify all transients @@ -3271,8 +3259,6 @@ void client_maximize(ObClient *self, gboolean max, gint dir) client_setup_decor_and_functions(self, FALSE); client_move_resize(self, x, y, w, h); - - hooks_queue((max ? OB_HOOK_WIN_MAX : OB_HOOK_WIN_UNMAX), self); } void client_shade(ObClient *self, gboolean shade) @@ -3286,8 +3272,6 @@ void client_shade(ObClient *self, gboolean shade) client_change_wm_state(self); /* the window is being hidden/shown */ /* resize the frame to just the titlebar */ frame_adjust_area(self->frame, FALSE, TRUE, FALSE); - - hooks_queue((shade ? OB_HOOK_WIN_SHADE : OB_HOOK_WIN_UNSHADE), self); } static void client_ping_event(ObClient *self, gboolean dead) @@ -3499,9 +3483,6 @@ static void client_set_desktop_recursive(ObClient *self, /* the new desktop's geometry may be different, so we may need to resize, for example if we are maximized */ client_reconfigure(self, FALSE); - - if (old != self->desktop) - hooks_queue(OB_HOOK_WIN_DESK_CHANGE, self); } /* move all transients */ @@ -3538,19 +3519,38 @@ ObClient *client_search_modal_child(ObClient *self) return NULL; } +static gboolean client_validate_unmap(ObClient *self, int n) +{ + XEvent e; + gboolean ret = TRUE; + + if (XCheckTypedWindowEvent(obt_display, self->window, UnmapNotify, &e)) { + if (n < self->ignore_unmaps) // ignore this one, but look for more + ret = client_validate_unmap(self, n+1); + else + ret = FALSE; // the window is going to become unmanaged + + /* put them back on the event stack so they end up in the same order */ + XPutBackEvent(obt_display, &e); + } + + return ret; +} + gboolean client_validate(ObClient *self) { XEvent e; XSync(obt_display, FALSE); /* get all events on the server */ - if (XCheckTypedWindowEvent(obt_display, self->window, DestroyNotify, &e) || - XCheckTypedWindowEvent(obt_display, self->window, UnmapNotify, &e)) - { + if (XCheckTypedWindowEvent(obt_display, self->window, DestroyNotify, &e)) { XPutBackEvent(obt_display, &e); return FALSE; } + if (!client_validate_unmap(self, 0)) + return FALSE; + return TRUE; } @@ -3620,6 +3620,8 @@ void client_set_state(ObClient *self, Atom action, glong data1, glong data2) value = self->demands_attention; else if (state == OBT_PROP_ATOM(OB_WM_STATE_UNDECORATED)) value = undecorated; + else + g_assert_not_reached(); action = value ? OBT_PROP_ATOM(NET_WM_STATE_REMOVE) : OBT_PROP_ATOM(NET_WM_STATE_ADD); } @@ -3907,9 +3909,6 @@ void client_set_undecorated(ObClient *self, gboolean undecorated) self->undecorated = undecorated; client_setup_decor_and_functions(self, TRUE); client_change_state(self); /* reflect this in the state hints */ - - hooks_queue((undecorated ? - OB_HOOK_WIN_UNDECORATED : OB_HOOK_WIN_DECORATED), self); } }