#include "keyboard.h"
#include "mouse.h"
#include "render/render.h"
-#include "per_app_settings.h"
#include <glib.h>
#include <X11/Xutil.h>
XFree(children);
}
+/* This should possibly do something more interesting than just match
+ * against WM_CLASS literally. */
+static ObAppSettings *get_settings(ObClient *client)
+{
+ GSList *a = config_per_app_settings;
+
+ while (a) {
+ ObAppSettings *app = (ObAppSettings *) a->data;
+
+ if (
+ (app->name && !app->class && !strcmp(app->name, client->name))
+ || (app->class && !app->name && !strcmp(app->class, client->class))
+ || (app->class && app->name && !strcmp(app->class, client->class)
+ && !strcmp(app->name, client->name))
+ ) {
+ ob_debug("Window matching: %s\n", app->name);
+ /* Match if no role was specified in the per app setting, or if the string
+ * matches the beginning of the role, since apps like to set the role to
+ * things like browser-window-23c4b2f */
+ if (!app->role || !strncmp(app->role, client->role, strlen(app->role)))
+ return app;
+ }
+
+ a = a->next;
+ }
+ return NULL;
+}
+
void client_manage(Window window)
{
ObClient *self;
XSetWindowAttributes attrib_set;
XWMHints *wmhint;
gboolean activate = FALSE;
- ObAppSetting *settings;
+ ObAppSettings *settings;
grab_server(TRUE);
client_apply_startup_state(self);
/* get and set application level settings */
- settings = (ObAppSetting *) get_client_settings(self);
+ settings = get_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)
+ /* Don't worry, we won't actually both shade and undecorate the
+ * window when push comes to shove. */
+ if (settings->shade != -1)
+ client_shade(self, settings->shade);
+ if (settings->decor != -1)
+ client_set_undecorated(self, !settings->decor);
+ if (settings->iconic != -1)
+ client_iconify(self, settings->iconic, FALSE);
+ if (settings->skip_pager != -1) {
+ self->skip_pager = !!settings->skip_pager;
+ client_change_state(self);
+ }
+ if (settings->skip_taskbar != -1) {
+ self->skip_taskbar = !!settings->skip_taskbar;
+ client_change_state(self);
+ }
+
+ /* 1 && -1 shouldn't be possible by the code in config.c */
+ if (settings->max_vert == 1 && self->max_horz == 1)
+ client_maximize(self, TRUE, 0, TRUE);
+ else if (settings->max_vert == 0 && self->max_horz == 0)
+ client_maximize(self, FALSE, 0, TRUE);
+ else if (settings->max_vert == 1 && self->max_horz == 0) {
+ client_maximize(self, TRUE, 2, TRUE);
+ client_maximize(self, FALSE, 1, TRUE);
+ } else if (settings->max_vert == 0 && self->max_horz == 1) {
+ client_maximize(self, TRUE, 1, TRUE);
+ client_maximize(self, FALSE, 2, TRUE);
+ }
+
+ if (settings->fullscreen != -1)
+ client_fullscreen(self, !!settings->fullscreen, TRUE);
+
+ if (settings->desktop < screen_num_desktops)
client_set_desktop(self, settings->desktop, FALSE);
- client_set_layer(self, settings->layer);
+ if (settings->layer > -2 && settings->layer < 2)
+ client_set_layer(self, settings->layer);
+
}
stacking_add(CLIENT_AS_WINDOW(self));
/* focus the new window? */
if (ob_state() != OB_STATE_STARTING &&
(config_focus_new || client_search_focus_parent(self)) ||
- (settings && settings->focus) &&
+ (settings && settings->focus == TRUE) &&
/* 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 */
gint x = self->area.x, ox = x;
gint y = self->area.y, oy = y;
- place_client(self, &x, &y);
-
- if (settings)
- place_window_from_settings(settings, self, &x, &y);
+ place_client(self, &x, &y, settings);
/* make sure the window is visible. */
client_find_onscreen(self, &x, &y,
/* set the size and position if fullscreen */
if (self->fullscreen) {
-#ifdef VIDMODE
- gint dot;
- XF86VidModeModeLine mode;
-#endif
Rect *a;
guint i;
i = client_monitor(self);
a = screen_physical_area_monitor(i);
-#ifdef VIDMODE
- if (i == 0 && /* primary head */
- extensions_vidmode &&
- XF86VidModeGetViewPort(ob_display, ob_screen, &x, &y) &&
- /* get the mode last so the mode.privsize isnt freed incorrectly */
- XF86VidModeGetModeLine(ob_display, ob_screen, &dot, &mode)) {
- x += a->x;
- y += a->y;
- w = mode.hdisplay;
- h = mode.vdisplay;
- if (mode.privsize) XFree(mode.private);
- } else
-#endif
- {
- x = a->x;
- y = a->y;
- w = a->width;
- h = a->height;
- }
+ x = a->x;
+ y = a->y;
+ w = a->width;
+ h = a->height;
user = FALSE; /* ignore that increment etc shit when in fullscreen */
} else {
focus_order_remove(self);
focus_order_add_new(self);
- /* this is here cuz with the VIDMODE extension, the viewport can
- change while a fullscreen window is iconic, and when it
- uniconifies, it would be nice if it did so to the new position
- of the viewport */
- client_reconfigure(self);
-
changed = TRUE;
}
}