X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=plugins%2Fplacement%2Fplacement.c;h=18c9c39b615895cb9e4b3d0971dd83012269478a;hb=ec9dd7fdd7531d2ca951a0b812bf8e63b6e9a377;hp=48cf5de3201942876e9911a6f4e1bb8884bc773d;hpb=b4b0c6257c15613f32736ee44f329198ac823c47;p=chaz%2Fopenbox diff --git a/plugins/placement/placement.c b/plugins/placement/placement.c index 48cf5de3..18c9c39b 100644 --- a/plugins/placement/placement.c +++ b/plugins/placement/placement.c @@ -10,7 +10,7 @@ static gboolean history; -static void parse_xml(xmlDocPtr doc, xmlNodePtr node, void *d) +static void parse_xml(ObParseInst *i, xmlDocPtr doc, xmlNodePtr node, void *d) { xmlNodePtr n; @@ -19,11 +19,45 @@ static void parse_xml(xmlDocPtr doc, xmlNodePtr node, void *d) history = parse_bool(doc, n); } -void plugin_setup_config() +void plugin_setup_config(ObParseInst *i) { history = TRUE; - parse_register("placement", parse_xml, NULL); + parse_register(i, "placement", parse_xml, NULL); +} + +static Rect* pick_head(ObClient *c) +{ + /* try direct parent first */ + if (c->transient_for && c->transient_for != OB_TRAN_GROUP) { + return screen_area_monitor(c->desktop, + client_monitor(c->transient_for)); + } + + /* more than one guy in his group (more than just him) */ + if (c->group && c->group->members->next) { + GSList *it; + + /* try on the client's desktop */ + for (it = c->group->members; it; it = g_slist_next(it)) { + ObClient *itc = it->data; + if (itc != c && + (itc->desktop == c->desktop || + itc->desktop == DESKTOP_ALL || c->desktop == DESKTOP_ALL)) + return screen_area_monitor(c->desktop, + client_monitor(it->data)); + } + + /* try on all desktops */ + for (it = c->group->members; it; it = g_slist_next(it)) { + ObClient *itc = it->data; + if (itc != c) + return screen_area_monitor(c->desktop, + client_monitor(it->data)); + } + } + + return NULL; } static void place_random(ObClient *c) @@ -33,9 +67,11 @@ static void place_random(ObClient *c) Rect *area; if (ob_state() == OB_STATE_STARTING) return; - - area = screen_area_monitor(c->desktop, - g_random_int_range(0, screen_num_monitors)); + + area = pick_head(c); + if (!area) + area = screen_area_monitor(c->desktop, + g_random_int_range(0, screen_num_monitors)); l = area->x; t = area->y; @@ -104,6 +140,24 @@ static void event(ObEvent *e, void *foo) } } + /* center parentless dialogs on the screen */ + if (e->data.c.client->type == OB_CLIENT_TYPE_DIALOG) { + Rect *area; + ObClient *c = e->data.c.client; + int x, y; + + area = pick_head(c); + if (!area) + area = screen_area_monitor(c->desktop, 0); + + x = (area->width - c->frame->area.width) / 2 + area->x; + y = (area->height - c->frame->area.height) / 2 + area->y; + client_configure(c, OB_CORNER_TOPLEFT, x, y, + c->area.width, c->area.height, + TRUE, TRUE); + return; + } + if (!history || !place_history(e->data.c.client)) place_random(e->data.c.client); }