- /* set the windows/appearances up */
- XMoveResizeWindow(ob_display, self->bg, x, y, w, h);
-
- self->a_text->surface.parent = self->a_bg;
- self->a_text->surface.parentx = l + iconw +
- ob_rr_theme->padding * (self->hasicon ? 2 : 1);
- self->a_text->surface.parenty = t + ob_rr_theme->padding;
- XMoveResizeWindow(ob_display, self->text,
- l + iconw + ob_rr_theme->padding *
- (self->hasicon ? 2 : 1),
- t + ob_rr_theme->padding, textw, texth);
-
- RrPaint(self->a_bg, self->bg, w, h);
- RrPaint(self->a_text, self->text, textw, texth);
+ /* Find the monitor which contains the biggest part of the popup.
+ * If the popup is completely off screen, limit it to the intersection
+ * of all monitors and then try again. If it's still off screen, put it
+ * on monitor 0. */
+ RECT_SET(mon, x, y, w, h);
+ m = screen_find_monitor(&mon);
+ area = screen_physical_area_monitor(m);
+
+ x=MAX(MIN(x, area->x+area->width-w),area->x);
+ y=MAX(MIN(y, area->y+area->height-h),area->y);
+
+ if (m == screen_num_monitors) {
+ RECT_SET(mon, x, y, w, h);
+ m = screen_find_monitor(&mon);
+ if (m == screen_num_monitors)
+ m = 0;
+ area = screen_physical_area_monitor(m);
+
+ x=MAX(MIN(x, area->x+area->width-w),area->x);
+ y=MAX(MIN(y, area->y+area->height-h),area->y);
+ }