gboolean clientIsValidTransientOrModal (Client * c) { g_return_val_if_fail (c != NULL, FALSE); TRACE ("entering clientIsValidTransientOrModal"); if (clientIsTransientOrModalForGroup (c)) { ScreenInfo *screen_info = c->screen_info; GList *list; /* Look for a valid transient or modal for the same group */ for (list = screen_info->windows_stack; list; list = g_list_next (list)) { Client *c2 = (Client *) list->data; if (c2 != c) { if (clientIsTransientOrModalFor (c, c2)) { /* We found one, look no further */ return TRUE; } } } } else if (clientIsTransientOrModal (c)) { return (clientGetTransient (c) != NULL); } return (FALSE); }
void clientInitPosition (Client * c) { ScreenInfo *screen_info; Client *c2; GdkRectangle rect; int full_x, full_y, full_w, full_h, msx, msy; gint n_monitors; gboolean place; gboolean position; g_return_if_fail (c != NULL); TRACE ("entering clientInitPosition"); screen_info = c->screen_info; msx = 0; msy = 0; position = (c->size->flags & (PPosition | USPosition)); n_monitors = myScreenGetNumMonitors (c->screen_info); if ((n_monitors > 1) || (screen_info->params->placement_mode == PLACE_MOUSE)) { getMouseXY (screen_info, screen_info->xroot, &msx, &msy); myScreenFindMonitorAtPoint (screen_info, msx, msy, &rect); } else { gdk_screen_get_monitor_geometry (screen_info->gscr, 0, &rect); } if (position || (c->type & (WINDOW_TYPE_DONT_PLACE | WINDOW_TYPE_DIALOG)) || clientIsTransient (c)) { if (!position && clientIsTransient (c) && (c2 = clientGetTransient (c))) { /* Center transient relative to their parent window */ c->x = c2->x + (c2->width - c->width) / 2; c->y = c2->y + (c2->height - c->height) / 2; if (n_monitors > 1) { msx = frameX (c) + (frameWidth (c) / 2); msy = frameY (c) + (frameHeight (c) / 2); myScreenFindMonitorAtPoint (screen_info, msx, msy, &rect); } } if (CONSTRAINED_WINDOW (c)) { clientKeepVisible (c, n_monitors, &rect); } place = FALSE; } else { place = TRUE; } full_x = MAX (screen_info->params->xfwm_margins[STRUTS_LEFT], rect.x); full_y = MAX (screen_info->params->xfwm_margins[STRUTS_TOP], rect.y); full_w = MIN (screen_info->width - screen_info->params->xfwm_margins[STRUTS_RIGHT], rect.x + rect.width) - full_x; full_h = MIN (screen_info->height - screen_info->params->xfwm_margins[STRUTS_BOTTOM], rect.y + rect.height) - full_y; /* Adjust size to the widest size available, not covering struts */ clientMaxSpace (screen_info, &full_x, &full_y, &full_w, &full_h); /* If the windows is smaller than the given ratio of the available screen area, or if the window is larger than the screen area or if the given ratio is higher than 100% place the window at the center. Otherwise, place the window "smartly", using the good old CPU consuming algorithm... */ if (place) { if ((screen_info->params->placement_ratio >= 100) || (100 * frameWidth(c) * frameHeight(c)) < (screen_info->params->placement_ratio * full_w * full_h)) { if (screen_info->params->placement_mode == PLACE_MOUSE) { mousePlacement (c, full_x, full_y, full_w, full_h, msx, msy); } else { centerPlacement (c, full_x, full_y, full_w, full_h); } } else if ((frameWidth(c) >= full_w) && (frameHeight(c) >= full_h)) { centerPlacement (c, full_x, full_y, full_w, full_h); } else { smartPlacement (c, full_x, full_y, full_w, full_h); } } if (c->type & WINDOW_REGULAR_FOCUSABLE) { clientAutoMaximize (c, full_w, full_h); } }