#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 ObAppSetting *get_settings(ObClient *client)
+{
+ GSList *a = config_per_app_settings;
+
+ while (a) {
+ ObAppSetting *app = (ObAppSetting *) a->data;
+
+ if (!strcmp(app->name, client->name)) {
+ ob_debug("Window matching: %s\n", app->name);
+
+ return (ObAppSetting *) a->data;
+ }
+
+ a = a->next;
+ }
+ return NULL;
+}
+
void client_manage(Window window)
{
ObClient *self;
client_apply_startup_state(self);
/* get and set application level settings */
- /* XXX move that function here */
- settings = (ObAppSetting *) get_client_settings(self);
+ settings = get_settings(self);
if (settings) {
if (settings->shade && !settings->decor)
gint x = self->area.x, ox = x;
gint y = self->area.y, oy = y;
- if (settings)
- /* XXX put this in place.c */
- place_window_from_settings(settings, self, &x, &y);
- else
- place_client(self, &x, &y);
+ place_client(self, &x, &y, settings);
/* make sure the window is visible. */
client_find_onscreen(self, &x, &y,
struct _ObGroup;
struct _ObSessionState;
-typedef struct _ObClient ObClient;
-typedef struct _ObClientIcon ObClientIcon;
+typedef struct _ObClient ObClient;
+typedef struct _ObClientIcon ObClientIcon;
+typedef struct _ObAppSettings ObAppSettings;
/* The value in client.transient_for indicating it is a transient for its
group instead of for a single window */
guint nicons;
};
+struct _ObAppSettings
+{
+ gchar *name;
+ gboolean decor;
+ gboolean shade;
+ gboolean focus;
+
+ Point position;
+ gboolean center_x;
+ gboolean center_y;
+ gboolean pos_given;
+
+ guint desktop;
+ guint head;
+
+ guint layer;
+};
+
extern GList *client_list;
void client_startup(gboolean reconfig);
#include "mouse.h"
#include "prop.h"
#include "translate.h"
-#include "per_app_settings.h"
#include "parser/parse.h"
#include "openbox.h"
gchar *name;
while (app) {
+ gboolean x_pos_given = FALSE;
if (parse_attr_string("name", app, &name)) {
xmlNodePtr n, c;
- ObAppSetting *setting = g_new0(ObAppSetting, 1);
- setting->name = name;
+ ObAppSettings *settings = g_new0(ObAppSetting, 1);
+ settings->name = name;
- setting->decor = TRUE;
+ settings->decor = TRUE;
if ((n = parse_find_node("decor", app->children)))
- setting->decor = parse_bool(doc, n);
+ settings->decor = parse_bool(doc, n);
if ((n = parse_find_node("shade", app->children)))
- setting->shade = parse_bool(doc, n);
+ settings->shade = parse_bool(doc, n);
- setting->position.x = setting->position.y = -1;
+ settings->position.x = settings->position.y = 0;
+ settings->pos_given = FALSE;
if ((n = parse_find_node("position", app->children))) {
if ((c = parse_find_node("x", n->children))) {
if (!strcmp(parse_string(doc, c), "center")) {
- setting->center_x = TRUE;
+ settings->center_x = TRUE;
+ x_pos_given = TRUE;
+ } else {
+ settings->position.x = parse_int(doc, c);
+ x_pos_given = TRUE;
}
- else
- setting->position.x = parse_int(doc, c);
}
- if ((c = parse_find_node("y", n->children))) {
+ if (x_pos_given && (c = parse_find_node("y", n->children))) {
if (!strcmp(parse_string(doc, c), "center")) {
- setting->center_y = TRUE;
+ settings->center_y = TRUE;
+ settings->pos_given;
+ } else {
+ settings->position.y = parse_int(doc, c);
+ settings->pos_given;
}
- else
- setting->position.y = parse_int(doc, c);
}
}
if ((n = parse_find_node("focus", app->children)))
- setting->focus = parse_bool(doc, n);
+ settings->focus = parse_bool(doc, n);
if ((n = parse_find_node("desktop", app->children)))
- setting->desktop = parse_int(doc, n);
+ settings->desktop = parse_int(doc, n);
else
- setting->desktop = -1;
+ settings->desktop = -1;
if ((n = parse_find_node("head", app->children))) {
if (!strcmp(parse_string(doc, n), "mouse"))
- setting->head = -1;
+ settings->head = -1;
else
- setting->head = parse_int(doc, n);
+ settings->head = parse_int(doc, n);
}
if ((n = parse_find_node("layer", app->children))) {
if (!strcmp(parse_string(doc, n), "above"))
- setting->layer = 1;
+ settings->layer = 1;
else if (!strcmp(parse_string(doc, n), "below"))
- setting->layer = -1;
+ settings->layer = -1;
else
- setting->layer = 0;
+ settings->layer = 0;
}
config_per_app_settings = g_slist_append(config_per_app_settings,
+++ /dev/null
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- client.h for the Openbox window manager
- Copyright (c) 2006 Mikael Magnusson
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#include "per_app_settings.h"
-#include "screen.h"
-#include "config.h"
-
-/* XXX put in client.c */
-/* This should possibly do something more interesting than just match
- * against WM_CLASS literally. */
-ObAppSetting *get_client_settings(ObClient *client)
-{
- GSList *a = config_per_app_settings;
-
- while (a) {
- ObAppSetting *app = (ObAppSetting *) a->data;
-
- if (!strcmp(app->name, client->name)) {
- ob_debug("Window matching: %s\n", app->name);
-
- return (ObAppSetting *) a->data;
- }
-
- a = a->next;
- }
- return NULL;
-}
-
-/* XXX put in place.c */
-void place_window_from_settings(ObAppSetting *setting, ObClient *client, gint *x, gint *y)
-{
- gint px, py, i;
- Rect *screen;
-
- /* Find which head the pointer is on, partly taken from place.c */
- if (setting->head == -1) {
- screen_pointer_pos(&px, &py);
-
- for (i = 0; i < screen_num_monitors; i++) {
- screen = screen_area_monitor(client->desktop, i);
- if (RECT_CONTAINS(*screen, px, py))
- break;
- }
-
- if (i == screen_num_monitors)
- screen = screen_area_monitor(client->desktop, 0);
- }
- else
- screen = screen_area_monitor(client->desktop, setting->head);
-
- if (setting->position.x == -1 && setting->center_x)
- *x = screen->x + screen->width / 2 - client->area.width / 2;
- else if (setting->position.x != -1)
- *x = screen->x + setting->position.x;
-
- if (setting->position.y == -1 && setting->center_y)
- *y = screen->y + screen->height / 2 - client->area.height / 2;
- else if (setting->position.y != -1)
- *y = screen->y + setting->position.y;
-
-}
+++ /dev/null
-/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
-
- client.h for the Openbox window manager
- Copyright (c) 2006 Mikael Magnusson
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- See the COPYING file for a copy of the GNU General Public License.
-*/
-
-#ifndef __per_app_settings_h
-#define __per_app_settings_h
-
-#include "client.h"
-
-typedef struct _ObAppSetting ObAppSetting;
-
-struct _ObAppSetting
-{
- gchar *name;
- gboolean decor;
- gboolean shade;
- gboolean focus;
-
- Point position;
- gboolean center_x;
- gboolean center_y;
-
- guint desktop;
- guint head;
-
- guint layer;
-};
-
-ObAppSetting *get_client_settings(ObClient *client);
-void place_window_from_settings(ObAppSetting *setting, ObClient *client, gint *x, gint *y);
-
-#endif
return TRUE;
}
+void place_window_from_settings(ObClient *client, gint *x, gint *y, ObAppSettings *settings)
+{
+ gint px, py, i;
+ Rect *screen;
+
+ if (!settings || (settings && !settings->pos_given))
+ return FALSE;
+
+ /* Find which head the pointer is on */
+ if (settings->head == -1 && screen_num_monitors > 1) {
+ screen_pointer_pos(&px, &py);
+
+ for (i = 0; i < screen_num_monitors; i++) {
+ screen = screen_area_monitor(client->desktop, i);
+ if (RECT_CONTAINS(*screen, px, py))
+ break;
+ }
+
+ if (i == screen_num_monitors)
+ screen = screen_area_monitor(client->desktop, 0);
+ }
+ else
+ screen = screen_area_monitor(client->desktop, settings->head);
+
+ if (settings->center_x)
+ *x = screen->x + screen->width / 2 - client->area.width / 2;
+ else
+ *x = screen->x + settings->position.x;
+
+ if (settings->center_y)
+ *y = screen->y + screen->height / 2 - client->area.height / 2;
+ else
+ *y = screen->y + settings->position.y;
+
+ return TRUE;
+}
+
static gboolean place_transient(ObClient *client, gint *x, gint *y)
{
if (client->transient_for) {
return FALSE;
}
-void place_client(ObClient *client, gint *x, gint *y)
+void place_client(ObClient *client, gint *x, gint *y, ObAppSetting *settings)
{
if (client->positioned)
return;
if (place_transient(client, x, y) ||
+ place_per_app_setting(client, x, y, settings) ||
((config_place_policy == OB_PLACE_POLICY_MOUSE) ?
place_under_mouse(client, x, y) :
place_smart(client, x, y, SMART_FULL) ||