#include "keyboard.h"
#include "mouse.h"
#include "render/render.h"
+#include "per_app_settings.h"
#include <glib.h>
#include <X11/Xutil.h>
windows = NULL;
PROP_SETA32(RootWindow(ob_display, ob_screen),
- net_client_list, window, (guint32*)windows, size);
+ net_client_list, window, (gulong*)windows, size);
if (windows)
g_free(windows);
XSetWindowAttributes attrib_set;
XWMHints *wmhint;
gboolean activate = FALSE;
+ ObAppSetting *settings;
grab_server(TRUE);
client_apply_startup_state(self);
+ /* get and set application level settings */
+ settings = (ObAppSetting *) get_client_settings(self);
+
+ if (settings) {
+ if (settings->shade && !settings->decor)
+ settings->decor = TRUE;
+
+ client_shade(self, settings->shade);
+ client_set_undecorated(self, !settings->decor);
+
+ if (settings->desktop != -1)
+ client_set_desktop(self, settings->desktop, FALSE);
+
+ client_set_layer(self, settings->layer);
+ }
+
stacking_add(CLIENT_AS_WINDOW(self));
client_restore_session_stacking(self);
/* focus the new window? */
if (ob_state() != OB_STATE_STARTING &&
- (config_focus_new || client_search_focus_parent(self)) &&
+ (config_focus_new || client_search_focus_parent(self)) ||
+ (settings && settings->focus) &&
/* 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 */
place_client(self, &x, &y);
- /* make sure the window is visible.
-
- this is about the rude parameter:
- non-normal clients has less rules, and
- windows that are being restored from a session
- do also. we can assume you want it back where
- you saved it */
- client_move_onscreen(self, client_normal(self) && !self->session);
+ if (settings)
+ place_window_from_settings(settings, self, &x, &y);
+
+ /* make sure the window is visible. */
+ client_find_onscreen(self, &x, &y,
+ self->frame->area.width,
+ self->frame->area.height,
+ /* non-normal clients has less rules, and
+ windows that are being restored from a
+ session do also. we can assume you want
+ it back where you saved it. Clients saying
+ they placed themselves are subjected to
+ harder rules, ones that are placed by
+ place.c or by the user are allowed partially
+ off-screen and on xinerama divides (ie,
+ it is up to the placement routines to avoid
+ the xinerama divides) */
+ ((self->positioned & PPosition) &&
+ !(self->positioned & USPosition)) &&
+ client_normal(self) &&
+ !self->session);
+ if (x != ox || y != oy)
+ client_move(self, x, y);
}
keyboard_grab_for_client(self, TRUE);
self->session = it->data;
RECT_SET_POINT(self->area, self->session->x, self->session->y);
- self->positioned = TRUE;
+ self->positioned = PPosition;
if (self->session->w > 0)
self->area.width = self->session->w;
if (self->session->h > 0)
would be */
/* XXX watch for xinerama dead areas */
-
- /* a = screen_area(self->desktop); */
- a = screen_physical_area_monitor(client_monitor(self));
+ /* This makes sure windows aren't entirely outside of the screen so you
+ * can't see them at all */
if (client_normal(self)) {
+ a = screen_area(self->desktop);
if (!self->strut.right && *x >= a->x + a->width - 1)
*x = a->x + a->width - self->frame->area.width;
if (!self->strut.bottom && *y >= a->y + a->height - 1)
*y = a->y;
}
+ /* This here doesn't let windows even a pixel outside the screen,
+ * when called from client_manage, programs placing themselves are
+ * forced completely onscreen, while things like
+ * 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 (rude) {
- /* this is my MOZILLA BITCHSLAP. oh ya it fucking feels good.
- Java can suck it too. */
-
+ /* avoid the xinerama monitor divide while we're at it,
+ * remember to fix the placement stuff to avoid it also and
+ * then remove this XXX */
+ a = screen_physical_area_monitor(client_monitor(self));
/* dont let windows map/move into the strut unless they
are bigger than the available area */
if (w <= a->width) {
/* normal windows can't request placement! har har
if (!client_normal(self))
*/
- self->positioned = !!(size.flags & (PPosition|USPosition));
+ self->positioned = (size.flags & (PPosition|USPosition));
if (size.flags & PWinGravity) {
self->gravity = size.win_gravity;
(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 = config_theme_keepborder ? OB_FRAME_DECOR_BORDER : 0;
}
}
static void client_change_allowed_actions(ObClient *self)
{
- guint32 actions[9];
+ gulong actions[9];
gint num = 0;
/* desktop windows are kept on all desktops */
static void client_change_state(ObClient *self)
{
- guint32 state[2];
- guint32 netstate[11];
+ gulong state[2];
+ gulong netstate[11];
guint num;
state[0] = self->wmstate;
else if (self->type == OB_CLIENT_TYPE_DESKTOP)
l = OB_STACKING_LAYER_DESKTOP;
else if (self->type == OB_CLIENT_TYPE_DOCK) {
- if (self->above) l = OB_STACKING_LAYER_DOCK_ABOVE;
- else if (self->below) l = OB_STACKING_LAYER_DOCK_BELOW;
- else l = OB_STACKING_LAYER_DOCK_NORMAL;
+ if (self->below) l = OB_STACKING_LAYER_NORMAL;
+ else l = OB_STACKING_LAYER_ABOVE;
}
else if (self->above) l = OB_STACKING_LAYER_ABOVE;
else if (self->below) l = OB_STACKING_LAYER_BELOW;
void client_activate(ObClient *self, gboolean here)
{
+ /* This check is for the client_list_menu trying to activate
+ * a closed client. */
+ if (!g_list_find(client_list, self)) return;
if (client_normal(self) && screen_showing_desktop)
screen_show_desktop(FALSE);
if (self->iconic)
if (self->undecorated != undecorated) {
self->undecorated = undecorated;
client_setup_decor_and_functions(self);
+ /* Make sure the client knows it might have moved. Maybe there is a
+ * better way of doing this so only one client_configure is sent, but
+ * since 125 of these are sent per second when moving the window (with
+ * user = FALSE) i doubt it matters much.
+ */
+ client_configure(self, OB_CORNER_TOPLEFT, self->area.x, self->area.y,
+ self->area.width, self->area.height, TRUE, TRUE);
client_change_state(self); /* reflect this in the state hints */
}
}