X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=openbox%2Fclient.c;h=a961c1496dd1aa80acb612835574429235fe1be6;hb=702995014a0ef567e98899bda931901d98461341;hp=f2f5d6caa476d456d42f65993d5e576aba43dc67;hpb=2477a38d2f3063b697e44bf3690cf280fb26ca8a;p=chaz%2Fopenbox diff --git a/openbox/client.c b/openbox/client.c index f2f5d6ca..a961c149 100644 --- a/openbox/client.c +++ b/openbox/client.c @@ -1,3 +1,4 @@ +#include "debug.h" #include "client.h" #include "dock.h" #include "xerror.h" @@ -67,7 +68,8 @@ void client_set_list() } else windows = NULL; - PROP_SETA32(ob_root, net_client_list, window, (guint32*)windows, size); + PROP_SETA32(RootWindow(ob_display, ob_screen), + net_client_list, window, (guint32*)windows, size); if (windows) g_free(windows); @@ -89,7 +91,7 @@ void client_foreach_transient(ObClient *self, ObClientForeachFunc func, void *da void client_foreach_ancestor(ObClient *self, ObClientForeachFunc func, void *data) { if (self->transient_for) { - if (self->transient_for != TRAN_GROUP) { + if (self->transient_for != OB_TRAN_GROUP) { if (!func(self->transient_for, data)) return; client_foreach_ancestor(self->transient_for, func, data); } else { @@ -113,7 +115,8 @@ void client_manage_all() XWMHints *wmhints; XWindowAttributes attrib; - XQueryTree(ob_display, ob_root, &w, &w, &children, &nchild); + XQueryTree(ob_display, RootWindow(ob_display, ob_screen), + &w, &w, &children, &nchild); /* remove all icon windows from the list */ for (i = 0; i < nchild; i++) { @@ -168,9 +171,9 @@ void client_manage_all() if (active) { g_assert(WINDOW_IS_CLIENT(active)); if (!client_focus(WINDOW_AS_CLIENT(active))) - focus_fallback(Fallback_NoFocus); + focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS); } else - focus_fallback(Fallback_NoFocus); + focus_fallback(OB_FOCUS_FALLBACK_NOFOCUS); } } @@ -214,7 +217,7 @@ void client_manage(Window window) XFree(wmhint); } - g_message("Managing window: %lx", window); + ob_debug("Managing window: %lx\n", window); /* choose the events we want to receive on the CLIENT window */ attrib_set.event_mask = CLIENT_EVENTMASK; @@ -253,39 +256,45 @@ void client_manage(Window window) /* update the focus lists */ focus_order_add_new(self); - /* focus the new window? */ - if (ob_state != OB_STATE_STARTING && config_focus_new && - (self->type == Type_Normal || self->type == Type_Dialog)) { - gboolean group_foc = FALSE; - - if (self->group) { - GSList *it; + stacking_add(CLIENT_AS_WINDOW(self)); - for (it = self->group->members; it; it = it->next) { - if (client_focused(it->data)) { - group_foc = TRUE; - break; - } - } - } + /* focus the new window? */ + if (ob_state() != OB_STATE_STARTING && config_focus_new && /* note the check against Type_Normal/Dialog, not client_normal(self), which would also include other types. in this case we want more strict rules for focus */ - if ((group_foc || - (!self->transient_for && (!self->group || - !self->group->members->next))) || - client_search_focus_tree_full(self) || - !focus_client || - !client_normal(focus_client)) { + (self->type == OB_CLIENT_TYPE_NORMAL || + self->type == OB_CLIENT_TYPE_DIALOG)) + { + if (self->desktop != screen_desktop) { /* activate the window */ - stacking_add(CLIENT_AS_WINDOW(self)); activate = TRUE; } else { - /* try to not get in the way */ - stacking_add_nonintrusive(CLIENT_AS_WINDOW(self)); + gboolean group_foc = FALSE; + + if (self->group) { + GSList *it; + + for (it = self->group->members; it; it = it->next) + { + if (client_focused(it->data)) + { + group_foc = TRUE; + break; + } + } + } + if ((group_foc || + (!self->transient_for && (!self->group || + !self->group->members->next))) || + client_search_focus_tree_full(self) || + !focus_client || + !client_normal(focus_client)) + { + /* activate the window */ + activate = TRUE; + } } - } else { - stacking_add(CLIENT_AS_WINDOW(self)); } dispatch_client(Event_Client_New, self, 0, 0); @@ -297,14 +306,24 @@ void client_manage(Window window) client_showhide(self); - if (activate) client_activate(self); + /* use client_focus instead of client_activate cuz client_activate does + stuff like switch desktops etc and I'm not interested in all that when + a window maps since its not based on an action from the user like + clicking a window to activate is. so keep the new window out of the way + but do focus it. */ + if (activate) client_focus(self); + + /* client_activate does this but we aret using it so we have to do it + here as well */ + if (screen_showing_desktop) + screen_show_desktop(FALSE); /* update the list hints */ client_set_list(); dispatch_client(Event_Client_Mapped, self, 0, 0); - g_message("Managed window 0x%lx (%s)", window, self->class); + ob_debug("Managed window 0x%lx (%s)\n", window, self->class); } void client_unmanage_all() @@ -316,16 +335,16 @@ void client_unmanage_all() /* called by client_unmanage() to close any menus referencing this client */ void client_close_menus(gpointer key, gpointer value, gpointer self) { - if (((Menu *)value)->client == (ObClient *)self) - menu_hide((Menu *)value); + if (((ObMenu *)value)->client == (ObClient *)self) + menu_hide((ObMenu *)value); } void client_unmanage(ObClient *self) { - int j; + guint j; GSList *it; - g_message("Unmanaging window: %lx (%s)", self->window, self->class); + ob_debug("Unmanaging window: %lx (%s)\n", self->window, self->class); dispatch_client(Event_Client_Destroy, self, 0, 0); g_assert(self != NULL); @@ -350,7 +369,7 @@ void client_unmanage(ObClient *self) screen_update_areas(); /* tell our parent(s) that we're gone */ - if (self->transient_for == TRAN_GROUP) { /* transient of group */ + if (self->transient_for == OB_TRAN_GROUP) { /* transient of group */ GSList *it; for (it = self->group->members; it; it = it->next) @@ -364,7 +383,7 @@ void client_unmanage(ObClient *self) /* tell our transients that we're gone */ for (it = self->transients; it != NULL; it = it->next) { - if (((ObClient*)it->data)->transient_for != TRAN_GROUP) { + if (((ObClient*)it->data)->transient_for != OB_TRAN_GROUP) { ((ObClient*)it->data)->transient_for = NULL; client_calc_layer(it->data); } @@ -403,7 +422,7 @@ void client_unmanage(ObClient *self) frame_release_client(self->frame, self); self->frame = NULL; - if (ob_state != OB_STATE_EXITING) { + if (ob_state() != OB_STATE_EXITING) { /* these values should not be persisted across a window unmapping/mapping */ prop_erase(self->window, prop_atoms.net_wm_desktop); @@ -416,7 +435,7 @@ void client_unmanage(ObClient *self) } - g_message("Unmanaged window 0x%lx", self->window); + ob_debug("Unmanaged window 0x%lx\n", self->window); /* free all data allocated in the client struct */ g_slist_free(self->transients); @@ -542,7 +561,7 @@ static void client_get_all(ObClient *self) self->layer = -1; self->urgent = FALSE; self->positioned = FALSE; - self->disabled_decorations = 0; + self->decorate = TRUE; self->group = NULL; self->nicons = 0; @@ -599,7 +618,7 @@ static void client_get_desktop(ObClient *self) gboolean trdesk = FALSE; if (self->transient_for) { - if (self->transient_for != TRAN_GROUP) { + if (self->transient_for != OB_TRAN_GROUP) { self->desktop = self->transient_for->desktop; trdesk = TRUE; } else { @@ -685,24 +704,24 @@ static void client_get_shaped(ObClient *self) void client_update_transient_for(ObClient *self) { Window t = None; - ObClient *c = NULL; + ObClient *target = NULL; if (XGetTransientForHint(ob_display, self->window, &t)) { self->transient = TRUE; if (t != self->window) { /* cant be transient to itself! */ - c = g_hash_table_lookup(window_map, &t); + target = g_hash_table_lookup(window_map, &t); /* if this happens then we need to check for it*/ - g_assert(c != self); - g_assert(!c || WINDOW_IS_CLIENT(c)); + g_assert(target != self); + g_assert(!target || WINDOW_IS_CLIENT(target)); - if (!c && self->group) { + if (!target && self->group) { /* not transient to a client, see if it is transient for a group */ if (t == self->group->leader || t == None || - t == ob_root) { + t == RootWindow(ob_display, ob_screen)) { /* window is a transient for its group! */ - c = TRAN_GROUP; + target = OB_TRAN_GROUP; } } } @@ -710,41 +729,41 @@ void client_update_transient_for(ObClient *self) self->transient = FALSE; /* if anything has changed... */ - if (c != self->transient_for) { - if (self->transient_for == TRAN_GROUP) { /* transient of group */ + if (target != self->transient_for) { + if (self->transient_for == OB_TRAN_GROUP) { /* transient of group */ GSList *it; /* remove from old parents */ - for (it = self->group->members; it; it = it->next) - if (it->data != self && - !((ObClient*)it->data)->transient_for) - ((ObClient*)it->data)->transients = - g_slist_remove(((ObClient*)it->data)->transients, self); + for (it = self->group->members; it; it = g_slist_next(it)) { + ObClient *c = it->data; + if (c != self && !c->transient_for) + c->transients = g_slist_remove(c->transients, self); + } } else if (self->transient_for != NULL) { /* transient of window */ /* remove from old parent */ self->transient_for->transients = g_slist_remove(self->transient_for->transients, self); } - self->transient_for = c; - if (self->transient_for == TRAN_GROUP) { /* transient of group */ + self->transient_for = target; + if (self->transient_for == OB_TRAN_GROUP) { /* transient of group */ GSList *it; /* add to new parents */ - for (it = self->group->members; it; it = it->next) - if (it->data != self && - !((ObClient*)it->data)->transient_for) - ((ObClient*)it->data)->transients = - g_slist_append(((ObClient*)it->data)->transients, self); + for (it = self->group->members; it; it = g_slist_next(it)) { + ObClient *c = it->data; + if (c != self && !c->transient_for) + c->transients = g_slist_append(c->transients, self); + } /* remove all transients which are in the group, that causes circlular pointer hell of doom */ - for (it = self->group->members; it; it = it->next) { + for (it = self->group->members; it; it = g_slist_next(it)) { GSList *sit, *next; for (sit = self->transients; sit; sit = next) { - next = sit->next; + next = g_slist_next(sit); if (sit->data == it->data) - self->transients = g_slist_remove(self->transients, - sit->data); + self->transients = + g_slist_delete_link(self->transients, sit); } } } else if (self->transient_for != NULL) { /* transient of window */ @@ -784,21 +803,21 @@ void client_get_type(ObClient *self) /* 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) - self->type = Type_Desktop; + self->type = OB_CLIENT_TYPE_DESKTOP; else if (val[i] == prop_atoms.net_wm_window_type_dock) - self->type = Type_Dock; + self->type = OB_CLIENT_TYPE_DOCK; else if (val[i] == prop_atoms.net_wm_window_type_toolbar) - self->type = Type_Toolbar; + self->type = OB_CLIENT_TYPE_TOOLBAR; else if (val[i] == prop_atoms.net_wm_window_type_menu) - self->type = Type_Menu; + self->type = OB_CLIENT_TYPE_MENU; else if (val[i] == prop_atoms.net_wm_window_type_utility) - self->type = Type_Utility; + self->type = OB_CLIENT_TYPE_UTILITY; else if (val[i] == prop_atoms.net_wm_window_type_splash) - self->type = Type_Splash; + self->type = OB_CLIENT_TYPE_SPLASH; else if (val[i] == prop_atoms.net_wm_window_type_dialog) - self->type = Type_Dialog; + self->type = OB_CLIENT_TYPE_DIALOG; else if (val[i] == prop_atoms.net_wm_window_type_normal) - self->type = Type_Normal; + self->type = OB_CLIENT_TYPE_NORMAL; else if (val[i] == prop_atoms.kde_net_wm_window_type_override) { /* prevent this window from getting any decor or functionality */ @@ -807,20 +826,20 @@ void client_get_type(ObClient *self) self->mwmhints.decorations = 0; self->mwmhints.functions = 0; } - if (self->type != (WindowType) -1) + if (self->type != (ObClientType) -1) break; /* grab the first legit type */ } g_free(val); } - if (self->type == (WindowType) -1) { + if (self->type == (ObClientType) -1) { /*the window type hint was not set, which means we either classify ourself as a normal window or a dialog, depending on if we are a transient. */ if (self->transient) - self->type = Type_Dialog; + self->type = OB_CLIENT_TYPE_DIALOG; else - self->type = Type_Normal; + self->type = OB_CLIENT_TYPE_NORMAL; } } @@ -912,46 +931,51 @@ void client_update_normal_hints(ObClient *self) void client_setup_decor_and_functions(ObClient *self) { /* start with everything (cept fullscreen) */ - self->decorations = Decor_Titlebar | Decor_Handle | Decor_Border | - Decor_Icon | Decor_AllDesktops | Decor_Iconify | Decor_Maximize | - Decor_Shade; - self->functions = Func_Resize | Func_Move | Func_Iconify | Func_Maximize | - Func_Shade; + self->decorations = (OB_FRAME_DECOR_TITLEBAR | + OB_FRAME_DECOR_HANDLE | + OB_FRAME_DECOR_GRIPS | + OB_FRAME_DECOR_BORDER | + OB_FRAME_DECOR_ICON | + OB_FRAME_DECOR_ALLDESKTOPS | + OB_FRAME_DECOR_ICONIFY | + OB_FRAME_DECOR_MAXIMIZE | + OB_FRAME_DECOR_SHADE); + self->functions = (OB_CLIENT_FUNC_RESIZE | + OB_CLIENT_FUNC_MOVE | + OB_CLIENT_FUNC_ICONIFY | + OB_CLIENT_FUNC_MAXIMIZE | + OB_CLIENT_FUNC_SHADE); if (self->delete_window) { - self->decorations |= Decor_Close; - self->functions |= Func_Close; + self->functions |= OB_CLIENT_FUNC_CLOSE; + self->decorations |= OB_FRAME_DECOR_CLOSE; } if (!(self->min_size.width < self->max_size.width || - self->min_size.height < self->max_size.height)) { - self->decorations &= ~(Decor_Maximize | Decor_Handle); - self->functions &= ~(Func_Resize | Func_Maximize); - } + self->min_size.height < self->max_size.height)) + self->functions &= ~OB_CLIENT_FUNC_RESIZE; switch (self->type) { - case Type_Normal: + case OB_CLIENT_TYPE_NORMAL: /* normal windows retain all of the possible decorations and functionality, and are the only windows that you can fullscreen */ - self->functions |= Func_Fullscreen; + self->functions |= OB_CLIENT_FUNC_FULLSCREEN; break; - case Type_Dialog: - case Type_Utility: + case OB_CLIENT_TYPE_DIALOG: + case OB_CLIENT_TYPE_UTILITY: /* these windows cannot be maximized */ - self->decorations &= ~Decor_Maximize; - self->functions &= ~Func_Maximize; + self->functions &= ~OB_CLIENT_FUNC_MAXIMIZE; break; - case Type_Menu: - case Type_Toolbar: + case OB_CLIENT_TYPE_MENU: + case OB_CLIENT_TYPE_TOOLBAR: /* these windows get less functionality */ - self->decorations &= ~(Decor_Iconify | Decor_Handle); - self->functions &= ~(Func_Iconify | Func_Resize); + self->functions &= ~(OB_CLIENT_FUNC_ICONIFY | OB_CLIENT_FUNC_RESIZE); break; - case Type_Desktop: - case Type_Dock: - case Type_Splash: + case OB_CLIENT_TYPE_DESKTOP: + case OB_CLIENT_TYPE_DOCK: + case OB_CLIENT_TYPE_SPLASH: /* none of these windows are manipulated by the window manager */ self->decorations = 0; self->functions = 0; @@ -962,65 +986,61 @@ void client_setup_decor_and_functions(ObClient *self) decor and functionality */ if (self->mwmhints.flags & OB_MWM_FLAG_DECORATIONS) { if (! (self->mwmhints.decorations & OB_MWM_DECOR_ALL)) { - if (! (self->mwmhints.decorations & OB_MWM_DECOR_BORDER)) - self->decorations &= ~Decor_Border; - if (! (self->mwmhints.decorations & OB_MWM_DECOR_HANDLE)) - self->decorations &= ~Decor_Handle; - if (! (self->mwmhints.decorations & OB_MWM_DECOR_TITLE)) - self->decorations &= ~Decor_Titlebar; - if (! (self->mwmhints.decorations & OB_MWM_DECOR_ICONIFY)) - self->decorations &= ~Decor_Iconify; - if (! (self->mwmhints.decorations & OB_MWM_DECOR_MAXIMIZE)) - self->decorations &= ~Decor_Maximize; + if (! ((self->mwmhints.decorations & OB_MWM_DECOR_HANDLE) || + (self->mwmhints.decorations & OB_MWM_DECOR_TITLE))) + /* if the mwm hints request no handle or title, then all + decorations are disabled */ + self->decorations = 0; } } if (self->mwmhints.flags & OB_MWM_FLAG_FUNCTIONS) { if (! (self->mwmhints.functions & OB_MWM_FUNC_ALL)) { if (! (self->mwmhints.functions & OB_MWM_FUNC_RESIZE)) - self->functions &= ~Func_Resize; + self->functions &= ~OB_CLIENT_FUNC_RESIZE; if (! (self->mwmhints.functions & OB_MWM_FUNC_MOVE)) - self->functions &= ~Func_Move; + self->functions &= ~OB_CLIENT_FUNC_MOVE; + /* dont let mwm hints kill any buttons if (! (self->mwmhints.functions & OB_MWM_FUNC_ICONIFY)) - self->functions &= ~Func_Iconify; + self->functions &= ~OB_CLIENT_FUNC_ICONIFY; if (! (self->mwmhints.functions & OB_MWM_FUNC_MAXIMIZE)) - self->functions &= ~Func_Maximize; + self->functions &= ~OB_CLIENT_FUNC_MAXIMIZE; + */ /* dont let mwm hints kill the close button if (! (self->mwmhints.functions & MwmFunc_Close)) - self->functions &= ~Func_Close; */ + self->functions &= ~OB_CLIENT_FUNC_CLOSE; */ } } + if (!(self->functions & OB_CLIENT_FUNC_SHADE)) + self->decorations &= ~OB_FRAME_DECOR_SHADE; + if (!(self->functions & OB_CLIENT_FUNC_ICONIFY)) + self->decorations &= ~OB_FRAME_DECOR_ICONIFY; + if (!(self->functions & OB_CLIENT_FUNC_RESIZE)) + self->decorations &= ~OB_FRAME_DECOR_GRIPS; + /* can't maximize without moving/resizing */ - if (!((self->functions & Func_Move) && (self->functions & Func_Resize))) - self->functions &= ~(Func_Maximize | Func_Fullscreen); - - /* finally, user specified disabled decorations are applied to subtract - decorations */ - if (self->disabled_decorations & Decor_Titlebar) - self->decorations &= ~Decor_Titlebar; - if (self->disabled_decorations & Decor_Handle) - self->decorations &= ~Decor_Handle; - if (self->disabled_decorations & Decor_Border) - self->decorations &= ~Decor_Border; - if (self->disabled_decorations & Decor_Iconify) - self->decorations &= ~Decor_Iconify; - if (self->disabled_decorations & Decor_Maximize) - self->decorations &= ~Decor_Maximize; - if (self->disabled_decorations & Decor_AllDesktops) - self->decorations &= ~Decor_AllDesktops; - if (self->disabled_decorations & Decor_Shade) - self->decorations &= ~Decor_Shade; - if (self->disabled_decorations & Decor_Close) - self->decorations &= ~Decor_Close; + if (!((self->functions & OB_CLIENT_FUNC_MAXIMIZE) && + (self->functions & OB_CLIENT_FUNC_MOVE) && + (self->functions & OB_CLIENT_FUNC_RESIZE))) { + self->functions &= ~OB_CLIENT_FUNC_MAXIMIZE; + self->decorations &= ~OB_FRAME_DECOR_MAXIMIZE; + } + + /* finally, the user can have requested no decorations, which overrides + everything */ + if (!self->decorate) + self->decorations = 0; /* if we don't have a titlebar, then we cannot shade! */ - if (!(self->decorations & Decor_Titlebar)) - self->functions &= ~Func_Shade; + if (!(self->decorations & OB_FRAME_DECOR_TITLEBAR)) + self->functions &= ~OB_CLIENT_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->functions &= (OB_CLIENT_FUNC_CLOSE | + OB_CLIENT_FUNC_FULLSCREEN | + OB_CLIENT_FUNC_ICONIFY); self->decorations = 0; } @@ -1028,15 +1048,19 @@ void client_setup_decor_and_functions(ObClient *self) if (self->frame) { /* this makes sure that these windows appear on all desktops */ - if (self->type == Type_Desktop && self->desktop != DESKTOP_ALL) + if (self->type == OB_CLIENT_TYPE_DESKTOP && + self->desktop != DESKTOP_ALL) client_set_desktop(self, DESKTOP_ALL, FALSE); /* adjust the client's decorations, etc. */ client_reconfigure(self); } else { /* this makes sure that these windows appear on all desktops */ - if (self->type == Type_Desktop && self->desktop != DESKTOP_ALL) + if (self->type == OB_CLIENT_TYPE_DESKTOP && + self->desktop != DESKTOP_ALL) + { self->desktop = DESKTOP_ALL; + } } } @@ -1046,22 +1070,22 @@ static void client_change_allowed_actions(ObClient *self) int num = 0; /* desktop windows are kept on all desktops */ - if (self->type != Type_Desktop) + if (self->type != OB_CLIENT_TYPE_DESKTOP) actions[num++] = prop_atoms.net_wm_action_change_desktop; - if (self->functions & Func_Shade) + if (self->functions & OB_CLIENT_FUNC_SHADE) actions[num++] = prop_atoms.net_wm_action_shade; - if (self->functions & Func_Close) + if (self->functions & OB_CLIENT_FUNC_CLOSE) actions[num++] = prop_atoms.net_wm_action_close; - if (self->functions & Func_Move) + if (self->functions & OB_CLIENT_FUNC_MOVE) actions[num++] = prop_atoms.net_wm_action_move; - if (self->functions & Func_Iconify) + if (self->functions & OB_CLIENT_FUNC_ICONIFY) actions[num++] = prop_atoms.net_wm_action_minimize; - if (self->functions & Func_Resize) + if (self->functions & OB_CLIENT_FUNC_RESIZE) actions[num++] = prop_atoms.net_wm_action_resize; - if (self->functions & Func_Fullscreen) + if (self->functions & OB_CLIENT_FUNC_FULLSCREEN) actions[num++] = prop_atoms.net_wm_action_fullscreen; - if (self->functions & Func_Maximize) { + if (self->functions & OB_CLIENT_FUNC_MAXIMIZE) { actions[num++] = prop_atoms.net_wm_action_maximize_horz; actions[num++] = prop_atoms.net_wm_action_maximize_vert; } @@ -1070,21 +1094,20 @@ static void client_change_allowed_actions(ObClient *self) /* make sure the window isn't breaking any rules now */ - if (!(self->functions & Func_Shade) && self->shaded) { + if (!(self->functions & OB_CLIENT_FUNC_SHADE) && self->shaded) { if (self->frame) client_shade(self, FALSE); else self->shaded = FALSE; } - if (!(self->functions & Func_Iconify) && self->iconic) { - g_message("UNSETTING ICONIC"); + if (!(self->functions & OB_CLIENT_FUNC_ICONIFY) && self->iconic) { if (self->frame) client_iconify(self, FALSE, TRUE); else self->iconic = FALSE; } - if (!(self->functions & Func_Fullscreen) && self->fullscreen) { + if (!(self->functions & OB_CLIENT_FUNC_FULLSCREEN) && self->fullscreen) { if (self->frame) client_fullscreen(self, FALSE, TRUE); else self->fullscreen = FALSE; } - if (!(self->functions & Func_Maximize) && (self->max_horz || - self->max_vert)) { + if (!(self->functions & OB_CLIENT_FUNC_MAXIMIZE) && (self->max_horz || + self->max_vert)) { if (self->frame) client_maximize(self, FALSE, 0, TRUE); else self->max_vert = self->max_horz = FALSE; } @@ -1114,7 +1137,7 @@ void client_update_wmhints(ObClient *self) /* only do this when first managing the window *AND* when we aren't starting up! */ - if (ob_state != OB_STATE_STARTING && self->frame == NULL) + if (ob_state() != OB_STATE_STARTING && self->frame == NULL) if (hints->flags & StateHint) self->iconic = hints->initial_state == IconicState; @@ -1144,11 +1167,12 @@ void client_update_wmhints(ObClient *self) if (!self->transient_for) { /* add other transients of the group that are already set up */ - for (it = self->group->members; it; it = it->next) - if (it->data != self && - ((ObClient*)it->data)->transient_for == TRAN_GROUP) - self->transients = g_slist_append(self->transients, - it->data); + for (it = self->group->members; it; it = it->next) { + ObClient *c = it->data; + if (c != self && c->transient_for == OB_TRAN_GROUP) + self->transients = + g_slist_append(self->transients, c); + } } } @@ -1167,8 +1191,8 @@ void client_update_wmhints(ObClient *self) if (ur != self->urgent) { self->urgent = ur; - g_message("Urgent Hint for 0x%lx: %s", self->window, - ur ? "ON" : "OFF"); + ob_debug("Urgent Hint for 0x%lx: %s\n", self->window, + ur ? "ON" : "OFF"); /* fire the urgent callback if we're mapped, otherwise, wait until after we're mapped */ if (self->frame) @@ -1305,11 +1329,10 @@ void client_update_icons(ObClient *self) { guint num; guint32 *data; - guint w, h, i; - int j; + guint w, h, i, j; - for (j = 0; j < self->nicons; ++j) - g_free(self->icons[j].data); + for (i = 0; i < self->nicons; ++i) + g_free(self->icons[i].data); if (self->nicons > 0) g_free(self->icons); self->nicons = 0; @@ -1452,7 +1475,7 @@ ObClient *client_search_focus_tree(ObClient *self) ObClient *client_search_focus_tree_full(ObClient *self) { if (self->transient_for) { - if (self->transient_for != TRAN_GROUP) { + if (self->transient_for != OB_TRAN_GROUP) { return client_search_focus_tree_full(self->transient_for); } else { GSList *it; @@ -1477,27 +1500,28 @@ ObClient *client_search_focus_tree_full(ObClient *self) return client_search_focus_tree(self); } -static StackLayer calc_layer(ObClient *self) +static ObStackingLayer calc_layer(ObClient *self) { - StackLayer l; + ObStackingLayer l; - if (self->fullscreen) 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->fullscreen) l = OB_STACKING_LAYER_FULLSCREEN; + else if (self->type == OB_CLIENT_TYPE_DESKTOP) + l = OB_STACKING_LAYER_DESKTOP; + else if (self->type == OB_CLIENT_TYPE_DOCK) { + if (!self->below) l = OB_STACKING_LAYER_TOP; + else l = OB_STACKING_LAYER_NORMAL; } - else if (self->above) l = Layer_Above; - else if (self->below) l = Layer_Below; - else l = Layer_Normal; + else if (self->above) l = OB_STACKING_LAYER_ABOVE; + else if (self->below) l = OB_STACKING_LAYER_BELOW; + else l = OB_STACKING_LAYER_NORMAL; return l; } static void client_calc_layer_recursive(ObClient *self, ObClient *orig, - StackLayer l, gboolean raised) + ObStackingLayer l, gboolean raised) { - StackLayer old, own; + ObStackingLayer old, own; GSList *it; old = self->layer; @@ -1518,7 +1542,7 @@ static void client_calc_layer_recursive(ObClient *self, ObClient *orig, void client_calc_layer(ObClient *self) { - StackLayer l; + ObStackingLayer l; ObClient *orig; orig = self; @@ -1551,8 +1575,9 @@ static void client_showhide(ObClient *self) } gboolean client_normal(ObClient *self) { - return ! (self->type == Type_Desktop || self->type == Type_Dock || - self->type == Type_Splash); + return ! (self->type == OB_CLIENT_TYPE_DESKTOP || + self->type == OB_CLIENT_TYPE_DOCK || + self->type == OB_CLIENT_TYPE_SPLASH); } static void client_apply_startup_state(ObClient *self) @@ -1659,11 +1684,11 @@ void client_configure(ObClient *self, ObCorner anchor, /* these override the above states! if you cant move you can't move! */ if (user) { - if (!(self->functions & Func_Move)) { + if (!(self->functions & OB_CLIENT_FUNC_MOVE)) { x = self->area.x; y = self->area.y; } - if (!(self->functions & Func_Resize)) { + if (!(self->functions & OB_CLIENT_FUNC_RESIZE)) { w = self->area.width; h = self->area.height; } @@ -1818,8 +1843,8 @@ void client_fullscreen(ObClient *self, gboolean fs, gboolean savearea) { int x, y, w, h; - if (!(self->functions & Func_Fullscreen) || /* can't */ - self->fullscreen == fs) return; /* already done */ + if (!(self->functions & OB_CLIENT_FUNC_FULLSCREEN) || /* can't */ + self->fullscreen == fs) return; /* already done */ self->fullscreen = fs; client_change_state(self); /* change the state hints on the client, @@ -1880,13 +1905,13 @@ static void client_iconify_recursive(ObClient *self, if (self->iconic != iconic) { - g_message("%sconifying window: 0x%lx", (iconic ? "I" : "Uni"), - self->window); + ob_debug("%sconifying window: 0x%lx\n", (iconic ? "I" : "Uni"), + self->window); self->iconic = iconic; if (iconic) { - if (self->functions & Func_Iconify) { + if (self->functions & OB_CLIENT_FUNC_ICONIFY) { self->wmstate = IconicState; self->ignore_unmaps++; /* we unmap the client itself so that we can get MapRequest @@ -1949,7 +1974,7 @@ void client_maximize(ObClient *self, gboolean max, int dir, gboolean savearea) int x, y, w, h; g_assert(dir == 0 || dir == 1 || dir == 2); - if (!(self->functions & Func_Maximize)) return; /* can't */ + if (!(self->functions & OB_CLIENT_FUNC_MAXIMIZE)) return; /* can't */ /* check if already done */ if (max) { @@ -2048,7 +2073,8 @@ void client_maximize(ObClient *self, gboolean max, int dir, gboolean savearea) void client_shade(ObClient *self, gboolean shade) { - if ((!(self->functions & Func_Shade) && shade) || /* can't shade */ + if ((!(self->functions & OB_CLIENT_FUNC_SHADE) && + shade) || /* can't shade */ self->shaded == shade) return; /* already done */ /* when we're iconic, don't change the wmstate */ @@ -2064,7 +2090,7 @@ void client_close(ObClient *self) { XEvent ce; - if (!(self->functions & Func_Close)) return; + if (!(self->functions & OB_CLIENT_FUNC_CLOSE)) return; /* XXX: itd be cool to do timeouts and shit here for killing the client's @@ -2100,7 +2126,7 @@ void client_set_desktop_recursive(ObClient *self, if (target != self->desktop) { - g_message("Setting desktop %u", target+1); + ob_debug("Setting desktop %u\n", target+1); g_assert(target < screen_num_desktops || target == DESKTOP_ALL); @@ -2390,9 +2416,9 @@ gboolean client_focus(ObClient *self) } #ifdef DEBUG_FOCUS - g_message("%sively focusing %lx at %d", (self->can_focus ? "act" : "pass"), - self->window, (int) - event_lasttime); + ob_debug("%sively focusing %lx at %d\n", + (self->can_focus ? "act" : "pass"), + self->window, (int) event_lasttime); #endif /* Cause the FocusIn to come back to us. Important for desktop switches, @@ -2406,9 +2432,9 @@ void client_unfocus(ObClient *self) { g_assert(focus_client == self); #ifdef DEBUG_FOCUS - g_message("client_unfocus for %lx", self->window); + ob_debug("client_unfocus for %lx\n", self->window); #endif - focus_fallback(Fallback_Unfocusing); + focus_fallback(OB_FOCUS_FALLBACK_UNFOCUSING); } void client_activate(ObClient *self) @@ -2416,7 +2442,10 @@ void client_activate(ObClient *self) if (client_normal(self) && screen_showing_desktop) screen_show_desktop(FALSE); if (self->iconic) - client_iconify(self, FALSE, TRUE); + client_iconify(self, FALSE, FALSE); + if (self->desktop != DESKTOP_ALL && + self->desktop != screen_desktop) + screen_set_desktop(self->desktop); else if (!self->frame->visible) /* if its not visible for other reasons, then don't mess with it */ @@ -2434,7 +2463,7 @@ gboolean client_focused(ObClient *self) ObClientIcon *client_icon(ObClient *self, int w, int h) { - int i; + guint i; /* si is the smallest image >= req */ /* li is the largest image < req */ unsigned long size, smallest = 0xffffffff, largest = 0, si = 0, li = 0; @@ -2587,7 +2616,7 @@ ObClient *client_search_top_transient(ObClient *self) { /* move up the transient chain as far as possible */ if (self->transient_for) { - if (self->transient_for != TRAN_GROUP) { + if (self->transient_for != OB_TRAN_GROUP) { return client_search_top_transient(self->transient_for); } else { GSList *it; @@ -2606,3 +2635,16 @@ ObClient *client_search_top_transient(ObClient *self) return self; } + +ObClient *client_search_transient(ObClient *self, ObClient *search) +{ + GSList *sit; + + for (sit = self->transients; sit; sit = g_slist_next(sit)) { + if (sit->data == search) + return search; + if (client_search_transient(sit->data, search)) + return search; + } + return NULL; +}