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);
+ if (activate) {
+ /* if using focus_delay, stop the timer now so that focus doesn't go
+ moving on us */
+ event_halt_focus_delay();
+
+ client_focus(self);
+ }
/* client_activate does this but we aret using it so we have to do it
here as well */
OB_CLIENT_FUNC_MAXIMIZE |
OB_CLIENT_FUNC_SHADE);
if (self->delete_window) {
- self->functions |= OB_CLIENT_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->functions &= ~OB_CLIENT_FUNC_RESIZE;
+ self->min_size.height < self->max_size.height))
+ self->functions &= ~OB_CLIENT_FUNC_RESIZE;
switch (self->type) {
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 |= OB_CLIENT_FUNC_FULLSCREEN;
- break;
+ /* normal windows retain all of the possible decorations and
+ functionality, and are the only windows that you can fullscreen */
+ self->functions |= OB_CLIENT_FUNC_FULLSCREEN;
+ break;
case OB_CLIENT_TYPE_DIALOG:
case OB_CLIENT_TYPE_UTILITY:
- /* these windows cannot be maximized */
- self->functions &= ~OB_CLIENT_FUNC_MAXIMIZE;
- break;
+ /* these windows cannot be maximized */
+ self->functions &= ~OB_CLIENT_FUNC_MAXIMIZE;
+ break;
case OB_CLIENT_TYPE_MENU:
case OB_CLIENT_TYPE_TOOLBAR:
- /* these windows get less functionality */
- self->functions &= ~(OB_CLIENT_FUNC_ICONIFY | OB_CLIENT_FUNC_RESIZE);
- break;
+ /* these windows get less functionality */
+ self->functions &= ~(OB_CLIENT_FUNC_ICONIFY | OB_CLIENT_FUNC_RESIZE);
+ break;
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;
- break;
+ /* none of these windows are manipulated by the window manager */
+ self->decorations = 0;
+ self->functions = 0;
+ break;
}
/* Mwm Hints are applied subtractively to what has already been chosen for
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_HANDLE) ||
+ if (! (self->mwmhints.decorations & OB_MWM_DECOR_ALL)) {
+ 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;
- }
+ 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 &= ~OB_CLIENT_FUNC_RESIZE;
- if (! (self->mwmhints.functions & OB_MWM_FUNC_MOVE))
- self->functions &= ~OB_CLIENT_FUNC_MOVE;
+ if (! (self->mwmhints.functions & OB_MWM_FUNC_ALL)) {
+ if (! (self->mwmhints.functions & OB_MWM_FUNC_RESIZE))
+ self->functions &= ~OB_CLIENT_FUNC_RESIZE;
+ if (! (self->mwmhints.functions & OB_MWM_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 &= ~OB_CLIENT_FUNC_ICONIFY;
- if (! (self->mwmhints.functions & OB_MWM_FUNC_MAXIMIZE))
- self->functions &= ~OB_CLIENT_FUNC_MAXIMIZE;
+ if (! (self->mwmhints.functions & OB_MWM_FUNC_ICONIFY))
+ self->functions &= ~OB_CLIENT_FUNC_ICONIFY;
+ if (! (self->mwmhints.functions & OB_MWM_FUNC_MAXIMIZE))
+ self->functions &= ~OB_CLIENT_FUNC_MAXIMIZE;
*/
- /* dont let mwm hints kill the close button
- if (! (self->mwmhints.functions & MwmFunc_Close))
- self->functions &= ~OB_CLIENT_FUNC_CLOSE; */
- }
+ /* dont let mwm hints kill the close button
+ if (! (self->mwmhints.functions & MwmFunc_Close))
+ self->functions &= ~OB_CLIENT_FUNC_CLOSE; */
+ }
}
if (!(self->functions & OB_CLIENT_FUNC_SHADE))
self->decorations &= ~OB_FRAME_DECOR_HANDLE;
/* finally, the user can have requested no decorations, which overrides
- everything */
+ everything (but doesnt give it a border if it doesnt have one) */
if (self->undecorated)
- self->decorations = OB_FRAME_DECOR_BORDER;
+ self->decorations &= OB_FRAME_DECOR_BORDER;
/* if we don't have a titlebar, then we cannot shade! */
if (!(self->decorations & OB_FRAME_DECOR_TITLEBAR))
- self->functions &= ~OB_CLIENT_FUNC_SHADE;
+ self->functions &= ~OB_CLIENT_FUNC_SHADE;
/* now we need to check against rules for the client's current state */
if (self->fullscreen) {
- self->functions &= (OB_CLIENT_FUNC_CLOSE |
+ self->functions &= (OB_CLIENT_FUNC_CLOSE |
OB_CLIENT_FUNC_FULLSCREEN |
OB_CLIENT_FUNC_ICONIFY);
- self->decorations = 0;
+ self->decorations = 0;
}
client_change_allowed_actions(self);
actions[num++] = prop_atoms.net_wm_action_change_desktop;
if (self->functions & OB_CLIENT_FUNC_SHADE)
- actions[num++] = prop_atoms.net_wm_action_shade;
+ actions[num++] = prop_atoms.net_wm_action_shade;
if (self->functions & OB_CLIENT_FUNC_CLOSE)
- actions[num++] = prop_atoms.net_wm_action_close;
+ actions[num++] = prop_atoms.net_wm_action_close;
if (self->functions & OB_CLIENT_FUNC_MOVE)
- actions[num++] = prop_atoms.net_wm_action_move;
+ actions[num++] = prop_atoms.net_wm_action_move;
if (self->functions & OB_CLIENT_FUNC_ICONIFY)
- actions[num++] = prop_atoms.net_wm_action_minimize;
+ actions[num++] = prop_atoms.net_wm_action_minimize;
if (self->functions & OB_CLIENT_FUNC_RESIZE)
- actions[num++] = prop_atoms.net_wm_action_resize;
+ actions[num++] = prop_atoms.net_wm_action_resize;
if (self->functions & OB_CLIENT_FUNC_FULLSCREEN)
- actions[num++] = prop_atoms.net_wm_action_fullscreen;
+ actions[num++] = prop_atoms.net_wm_action_fullscreen;
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;
+ actions[num++] = prop_atoms.net_wm_action_maximize_horz;
+ actions[num++] = prop_atoms.net_wm_action_maximize_vert;
}
PROP_SETA32(self->window, net_wm_allowed_actions, atom, actions, num);
/* make sure the window isn't breaking any rules now */
if (!(self->functions & OB_CLIENT_FUNC_SHADE) && self->shaded) {
- if (self->frame) client_shade(self, FALSE);
- else self->shaded = FALSE;
+ if (self->frame) client_shade(self, FALSE);
+ else self->shaded = FALSE;
}
if (!(self->functions & OB_CLIENT_FUNC_ICONIFY) && self->iconic) {
- if (self->frame) client_iconify(self, FALSE, TRUE);
- else self->iconic = FALSE;
+ if (self->frame) client_iconify(self, FALSE, TRUE);
+ else self->iconic = FALSE;
}
if (!(self->functions & OB_CLIENT_FUNC_FULLSCREEN) && self->fullscreen) {
- if (self->frame) client_fullscreen(self, FALSE, TRUE);
- else self->fullscreen = FALSE;
+ if (self->frame) client_fullscreen(self, FALSE, TRUE);
+ else self->fullscreen = FALSE;
}
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;
+ if (self->frame) client_maximize(self, FALSE, 0, TRUE);
+ else self->max_vert = self->max_horz = FALSE;
}
}
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;
+ if (self->above) l = OB_STACKING_LAYER_DOCK_ABOVE;
+ else if (self->below) l = OB_STACKING_LAYER_DOCK_BELOW;
else l = OB_STACKING_LAYER_NORMAL;
}
else if (self->above) l = OB_STACKING_LAYER_ABOVE;
gboolean client_normal(ObClient *self) {
return ! (self->type == OB_CLIENT_TYPE_DESKTOP ||
self->type == OB_CLIENT_TYPE_DOCK ||
- self->type == OB_CLIENT_TYPE_SPLASH);
+ self->type == OB_CLIENT_TYPE_SPLASH);
}
static void client_apply_startup_state(ObClient *self)
h = self->area.height;
if (max) {
- if (savearea)
- self->pre_max_area = self->area;
+ if (savearea) {
+ if ((dir == 0 || dir == 1) && !self->max_horz) { /* horz */
+ RECT_SET(self->pre_max_area,
+ self->area.x, self->pre_max_area.y,
+ self->area.width, self->pre_max_area.height);
+ }
+ if ((dir == 0 || dir == 2) && !self->max_vert) { /* vert */
+ RECT_SET(self->pre_max_area,
+ self->pre_max_area.x, self->area.y,
+ self->pre_max_area.width, self->area.height);
+ }
+ }
} else {
Rect *a;
}
return ret;
}
+
+gboolean client_has_group_siblings(ObClient *self)
+{
+ return self->group && self->group->members->next;
+}