XWMHints *wmhint;
gboolean activate = FALSE;
ObAppSettings *settings;
+ gint placex, placey;
grab_server(TRUE);
activate = TRUE;
}
+ /* adjust the frame to the client's size before showing or placing
+ the window */
+ frame_adjust_area(self->frame, FALSE, TRUE, FALSE);
+ frame_adjust_client_area(self->frame);
+
+ /* where the frame was placed is where the window was originally */
+ placex = self->area.x;
+ placey = self->area.y;
+
/* figure out placement for the window */
if (ob_state() == OB_STATE_RUNNING) {
gboolean transient;
(self->positioned == USPosition ? "user specified" :
"BADNESS !?"))), self->area.x, self->area.y);
- transient = place_client(self, &self->area.x, &self->area.y, settings);
+ transient = place_client(self, &placex, &placey, settings);
/* make sure the window is visible. */
- client_find_onscreen(self, &self->area.x, &self->area.y,
+ client_find_onscreen(self, &placex, &placey,
self->area.width, self->area.height,
/* non-normal clients has less rules, and
windows that are being restored from a
}
ob_debug("placing window 0x%x at %d, %d with size %d x %d\n",
- self->window, self->area.x, self->area.y,
+ self->window, placex, placey,
self->area.width, self->area.height);
if (self->session)
ob_debug(" but session requested %d %d instead, overriding\n",
self->session->x, self->session->y);
- /* adjust the frame to the client's size before showing the window */
- frame_adjust_area(self->frame, FALSE, TRUE, FALSE);
- frame_adjust_client_area(self->frame);
-
-
/* do this after the window is placed, so the premax/prefullscreen numbers
won't be all wacko!!
also, this moves the window to the position where it has been placed
will get the right sizes and positions if the client is starting with
those states
*/
- client_configure(self, self->area.x, self->area.y,
+ client_configure(self, placex, placey,
self->area.width, self->area.height,
FALSE, TRUE);
if (app->name &&
!g_pattern_match(app->name, strlen(self->name), self->name, NULL))
match = FALSE;
- if (app->class &&
- !g_pattern_match(app->class, strlen(self->class),self->class,NULL))
+ else if (app->class &&
+ !g_pattern_match(app->class,
+ strlen(self->class), self->class, NULL))
match = FALSE;
- if (app->role &&
- !g_pattern_match(app->role, strlen(self->role), self->role, NULL))
+ else if (app->role &&
+ !g_pattern_match(app->role,
+ strlen(self->role), self->role, NULL))
match = FALSE;
if (match) {
}
}
- if (settings) {
- if (settings->shade != -1)
- self->shaded = !!settings->shade;
- if (settings->decor != -1)
- self->undecorated = !settings->decor;
- if (settings->iconic != -1)
- self->iconic = !!settings->iconic;
- if (settings->skip_pager != -1)
- self->skip_pager = !!settings->skip_pager;
- if (settings->skip_taskbar != -1)
- self->skip_taskbar = !!settings->skip_taskbar;
+ if (settings->shade != -1)
+ self->shaded = !!settings->shade;
+ if (settings->decor != -1)
+ self->undecorated = !settings->decor;
+ if (settings->iconic != -1)
+ self->iconic = !!settings->iconic;
+ if (settings->skip_pager != -1)
+ self->skip_pager = !!settings->skip_pager;
+ if (settings->skip_taskbar != -1)
+ self->skip_taskbar = !!settings->skip_taskbar;
- if (settings->max_vert != -1)
- self->max_vert = !!settings->max_vert;
- if (settings->max_horz != -1)
- self->max_horz = !!settings->max_horz;
+ if (settings->max_vert != -1)
+ self->max_vert = !!settings->max_vert;
+ if (settings->max_horz != -1)
+ self->max_horz = !!settings->max_horz;
- if (settings->fullscreen != -1)
- self->fullscreen = !!settings->fullscreen;
+ if (settings->fullscreen != -1)
+ self->fullscreen = !!settings->fullscreen;
- if (settings->desktop) {
- if (settings->desktop == DESKTOP_ALL)
- self->desktop = settings->desktop;
- else if (settings->desktop > 0 &&
- settings->desktop <= screen_num_desktops)
- self->desktop = settings->desktop - 1;
- }
+ if (settings->desktop) {
+ if (settings->desktop == DESKTOP_ALL)
+ self->desktop = settings->desktop;
+ else if (settings->desktop > 0 &&
+ settings->desktop <= screen_num_desktops)
+ self->desktop = settings->desktop - 1;
+ }
- if (settings->layer == -1) {
- self->below = TRUE;
- self->above = FALSE;
- }
- else if (settings->layer == 0) {
- self->below = FALSE;
- self->above = FALSE;
- }
- else if (settings->layer == 1) {
- self->below = FALSE;
- self->above = TRUE;
- }
+ if (settings->layer == -1) {
+ self->below = TRUE;
+ self->above = FALSE;
+ }
+ else if (settings->layer == 0) {
+ self->below = FALSE;
+ self->above = FALSE;
+ }
+ else if (settings->layer == 1) {
+ self->below = FALSE;
+ self->above = TRUE;
}
return settings;
}
POINT_SET(newbl, newtl.x, newbr.y);
/* is it moving or just resizing from some corner? */
- stationary_l = oldtl.x == oldtl.x;
- stationary_r = oldtr.x == oldtr.x;
- stationary_t = oldtl.y == oldtl.y;
- stationary_b = oldbl.y == oldbl.y;
+ stationary_l = oldtl.x == newtl.x;
+ stationary_r = oldtr.x == newtr.x;
+ stationary_t = oldtl.y == newtl.y;
+ stationary_b = oldbl.y == newbl.y;
/* if left edge is growing and didnt move right edge */
if (stationary_r && newtl.x < oldtl.x)
* xterm -geometry resolution-width/2 will work fine. Trying to
* place it completely offscreen will be handled in the above code.
* Sorry for this confused comment, i am tired. */
- if (fw <= mon_a->width) {
- if (rudel && !self->strut.left && *x < mon_a->x) *x = mon_a->x;
- if (ruder && !self->strut.right && *x + fw > mon_a->x + mon_a->width)
- *x = mon_a->x + mon_a->width - fw;
- }
- if (fh <= mon_a->height) {
- if (rudet && !self->strut.top && *y < mon_a->y) *y = mon_a->y;
- if (rudeb && !self->strut.bottom && *y + fh > mon_a->y + mon_a->height)
- *y = mon_a->y + mon_a->height - fh;
- }
+ if (rudel && !self->strut.left && *x < mon_a->x) *x = mon_a->x;
+ if (ruder && !self->strut.right && *x + fw > mon_a->x + mon_a->width)
+ *x = mon_a->x + MAX(0, mon_a->width - fw);
+
+ if (rudet && !self->strut.top && *y < mon_a->y) *y = mon_a->y;
+ if (rudeb && !self->strut.bottom && *y + fh > mon_a->y + mon_a->height)
+ *y = mon_a->y + MAX(0, mon_a->height - fh);
/* get where the client should be */
frame_frame_gravity(self->frame, x, y, w, h);
state[0] = self->wmstate;
state[1] = None;
PROP_SETA32(self->window, wm_state, wm_state, state, 2);
+ ob_debug("setting wm_state %d\n", self->wmstate);
}
}
if (client_should_show(self)) {
frame_show(self->frame);
show = TRUE;
- }
- /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it
- needs to be in IconicState. This includes when it is on another
- desktop!
- */
- client_change_wm_state(self);
+ /* According to the ICCCM (sec 4.1.3.1) when a window is not visible,
+ it needs to be in IconicState. This includes when it is on another
+ desktop!
+ */
+ client_change_wm_state(self);
+ }
return show;
}
frame_hide(self->frame);
hide = TRUE;
- }
- /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it
- needs to be in IconicState. This includes when it is on another
- desktop!
- */
- client_change_wm_state(self);
+ /* According to the ICCCM (sec 4.1.3.1) when a window is not visible,
+ it needs to be in IconicState. This includes when it is on another
+ desktop!
+ */
+ client_change_wm_state(self);
+ }
return hide;
}
{
if (!client_show(self))
client_hide(self);
-
- /* According to the ICCCM (sec 4.1.3.1) when a window is not visible, it
- needs to be in IconicState. This includes when it is on another
- desktop!
- */
- client_change_wm_state(self);
}
gboolean client_normal(ObClient *self) {
/* make the frame recalculate its dimentions n shit without changing
anything visible for real, this way the constraints below can work with
the updated frame dimensions. */
- frame_adjust_area(self->frame, TRUE, TRUE, TRUE);
+ frame_adjust_area(self->frame, FALSE, TRUE, TRUE);
/* work within the prefered sizes given by the window */
if (!(*w == self->area.width && *h == self->area.height)) {
/* find the frame's dimensions and move/resize it */
fmoved = moved;
fresized = resized;
+
+ /* if decorations changed, then readjust everything for the frame */
if (self->decorations != fdecor ||
self->max_horz != fhorz || self->max_vert != fvert)
{
fmoved = fresized = TRUE;
}
+
+ /* adjust the frame */
if (fmoved || fresized)
frame_adjust_area(self->frame, fmoved, fresized, FALSE);