/* -*- indent-tabs-mode: nil; tab-width: 4; c-basic-offset: 4; -*-
place.c for the Openbox window manager
+ Copyright (c) 2006 Mikael Magnusson
Copyright (c) 2003 Ben Jansens
This program is free software; you can redistribute it and/or modify
#include "focus.h"
#include "config.h"
-static Rect* pick_head(ObClient *c)
+static Rect *pick_head(ObClient *c)
{
+ Rect *area = NULL;
+ guint i;
+ gint px, py;
+
/* try direct parent first */
if (c->transient_for && c->transient_for != OB_TRAN_GROUP) {
return screen_area_monitor(c->desktop,
}
}
- return NULL;
+ screen_pointer_pos(&px, &py);
+
+ for (i = 0; i < screen_num_monitors; i++) {
+ area = screen_area_monitor(c->desktop, i);
+ if (RECT_CONTAINS(*area, px, py))
+ break;
+ }
+ if (i == screen_num_monitors)
+ area = screen_area_monitor(c->desktop, 0);
+
+ /* Last resort */
+ if (!area)
+ area = screen_area_monitor(c->desktop,
+ g_random_int_range(0, screen_num_monitors));
+
+ return area;
}
static gboolean place_random(ObClient *client, gint *x, gint *y)
Rect *area;
area = pick_head(client);
- if (!area)
- area = screen_area_monitor(client->desktop,
- g_random_int_range(0, screen_num_monitors));
l = area->x;
t = area->y;
if (num[i] > num[most])
most = i;
+ g_free(num);
+
a = screen_physical_area_monitor(most);
if (RECT_CONTAINS(*a, a1->x, a1->y))
return -1;
static gboolean place_smart(ObClient *client, gint *x, gint *y,
ObSmartType type)
{
- guint i;
gboolean ret = FALSE;
GSList *spaces = NULL, *sit;
GList *it;
- for (i = 0; i < screen_num_monitors; ++i)
- spaces = area_add(spaces, screen_area_monitor(client->desktop, i));
+ spaces = area_add(spaces, pick_head(client));
/* stay out from under windows in higher layers */
for (it = stacking_list; it; it = g_list_next(it)) {
static gboolean place_under_mouse(ObClient *client, gint *x, gint *y)
{
- guint i;
gint l, r, t, b;
gint px, py;
Rect *area;
+ area = pick_head(client);
screen_pointer_pos(&px, &py);
- for (i = 0; i < screen_num_monitors; ++i) {
- area = screen_area_monitor(client->desktop, i);
- if (RECT_CONTAINS(*area, px, py))
- break;
- }
- if (i == screen_num_monitors)
- area = screen_area_monitor(client->desktop, 0);
-
l = area->x;
t = area->y;
r = area->x + area->width - client->frame->area.width;
return TRUE;
}
-void place_window_from_settings(ObClient *client, gint *x, gint *y, ObAppSettings *settings)
+static gboolean place_per_app_setting(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);
- }
+ if (settings->head == -1)
+ screen = pick_head(client);
else
screen = screen_area_monitor(client->desktop, settings->head);
return FALSE;
}
-void place_client(ObClient *client, gint *x, gint *y, ObAppSetting *settings)
+/* Return TRUE if we want client.c to enforce on-screen-keeping */
+gboolean place_client(ObClient *client, gint *x, gint *y,
+ ObAppSettings *settings)
{
+ gboolean ret = FALSE;
if (client->positioned)
- return;
- if (place_transient(client, x, y) ||
+ return FALSE;
+ if (place_transient(client, x, y))
+ ret = TRUE;
+ else if (!(
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) ||
place_smart(client, x, y, SMART_GROUP) ||
place_smart(client, x, y, SMART_FOCUSED) ||
- place_random(client, x, y)))
- {
- /* get where the client should be */
- frame_frame_gravity(client->frame, x, y);
- } else
+ place_random(client, x, y))))
g_assert_not_reached(); /* the last one better succeed */
+ /* get where the client should be */
+ frame_frame_gravity(client->frame, x, y);
+ return ret;
}