Make the NET_WORKAREA hint work the way it used to, across all monitors

The spec is not going to change this hint, but rather add a new one. So for now
just revert to the old behaviour.
This commit is contained in:
Dana Jansens 2009-12-15 14:53:29 -05:00
parent 828c095c8b
commit 3c688bc4a7
4 changed files with 64 additions and 85 deletions

View file

@ -261,7 +261,7 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
const ObFocusCyclePopupTarget *newtarget; const ObFocusCyclePopupTarget *newtarget;
gint newtargetx, newtargety; gint newtargetx, newtargety;
screen_area = screen_physical_area_primary(); screen_area = screen_physical_area_primary(FALSE);
/* get the outside margins */ /* get the outside margins */
RrMargins(p->a_bg, &ml, &mt, &mr, &mb); RrMargins(p->a_bg, &ml, &mt, &mr, &mb);
@ -515,7 +515,7 @@ void focus_cycle_popup_single_show(struct _ObClient *c,
g_assert(popup.targets == NULL); g_assert(popup.targets == NULL);
/* position the popup */ /* position the popup */
a = screen_physical_area_primary(); a = screen_physical_area_primary(FALSE);
icon_popup_position(single_popup, CenterGravity, icon_popup_position(single_popup, CenterGravity,
a->x + a->width / 2, a->y + a->height / 2); a->x + a->width / 2, a->y + a->height / 2);
icon_popup_height(single_popup, POPUP_HEIGHT); icon_popup_height(single_popup, POPUP_HEIGHT);

View file

@ -91,7 +91,7 @@ static void set_curpos(KeyBindingTree *newpos)
g_free(oldtext); g_free(oldtext);
} }
a = screen_physical_area_primary(); a = screen_physical_area_primary(FALSE);
popup_position(popup, NorthWestGravity, a->x + 10, a->y + 10); popup_position(popup, NorthWestGravity, a->x + 10, a->y + 10);
/* 1 second delay for the popup to show */ /* 1 second delay for the popup to show */
popup_delay_show(popup, G_USEC_PER_SEC, text); popup_delay_show(popup, G_USEC_PER_SEC, text);

View file

@ -945,7 +945,7 @@ void screen_show_desktop_popup(guint d)
/* 0 means don't show the popup */ /* 0 means don't show the popup */
if (!config_desktop_popup_time) return; if (!config_desktop_popup_time) return;
a = screen_physical_area_primary(); a = screen_physical_area_primary(FALSE);
pager_popup_position(desktop_popup, CenterGravity, pager_popup_position(desktop_popup, CenterGravity,
a->x + a->width / 2, a->y + a->height / 2); a->x + a->width / 2, a->y + a->height / 2);
pager_popup_icon_size_multiplier(desktop_popup, pager_popup_icon_size_multiplier(desktop_popup,
@ -1285,19 +1285,6 @@ void screen_install_colormap(ObClient *client, gboolean install)
} }
} }
#define STRUT_LEFT_ON_MONITOR(s, i) \
(RANGES_INTERSECT(s->left_start, s->left_end - s->left_start + 1, \
monitor_area[i].y, monitor_area[i].height))
#define STRUT_RIGHT_ON_MONITOR(s, i) \
(RANGES_INTERSECT(s->right_start, s->right_end - s->right_start + 1, \
monitor_area[i].y, monitor_area[i].height))
#define STRUT_TOP_ON_MONITOR(s, i) \
(RANGES_INTERSECT(s->top_start, s->top_end - s->top_start + 1, \
monitor_area[i].x, monitor_area[i].width))
#define STRUT_BOTTOM_ON_MONITOR(s, i) \
(RANGES_INTERSECT(s->bottom_start, s->bottom_end - s->bottom_start + 1, \
monitor_area[i].x, monitor_area[i].width))
typedef struct { typedef struct {
guint desktop; guint desktop;
StrutPartial *strut; StrutPartial *strut;
@ -1325,7 +1312,7 @@ typedef struct {
void screen_update_areas(void) void screen_update_areas(void)
{ {
guint i, j; guint j;
gulong *dims; gulong *dims;
GList *it; GList *it;
GSList *sit; GSList *sit;
@ -1343,7 +1330,7 @@ void screen_update_areas(void)
config_margins.right_start = RECT_TOP(monitor_area[screen_num_monitors]); config_margins.right_start = RECT_TOP(monitor_area[screen_num_monitors]);
config_margins.right_end = RECT_BOTTOM(monitor_area[screen_num_monitors]); config_margins.right_end = RECT_BOTTOM(monitor_area[screen_num_monitors]);
dims = g_new(gulong, 4 * screen_num_desktops * screen_num_monitors); dims = g_new(gulong, 4 * screen_num_desktops);
RESET_STRUT_LIST(struts_left); RESET_STRUT_LIST(struts_left);
RESET_STRUT_LIST(struts_top); RESET_STRUT_LIST(struts_top);
@ -1389,69 +1376,51 @@ void screen_update_areas(void)
VALIDATE_STRUTS(struts_bottom, bottom, VALIDATE_STRUTS(struts_bottom, bottom,
monitor_area[screen_num_monitors].height / 2); monitor_area[screen_num_monitors].height / 2);
/* set up the work areas to be full screen */ /* set up the work area to be full screen across all monitors */
for (i = 0; i < screen_num_monitors; ++i)
for (j = 0; j < screen_num_desktops; ++j) { for (j = 0; j < screen_num_desktops; ++j) {
dims[(i * screen_num_desktops + j) * 4+0] = monitor_area[i].x; dims[j*4 + 0] =
dims[(i * screen_num_desktops + j) * 4+1] = monitor_area[i].y; monitor_area[screen_num_monitors].x;
dims[(i * screen_num_desktops + j) * 4+2] = monitor_area[i].width; dims[j*4 + 1] =
dims[(i * screen_num_desktops + j) * 4+3] = monitor_area[i].height; monitor_area[screen_num_monitors].y;
dims[j*4 + 2] =
monitor_area[screen_num_monitors].width;
dims[j*4 + 3] =
monitor_area[screen_num_monitors].height;
} }
/* calculate the work areas from the struts */ /* calculate the work area from the struts */
for (i = 0; i < screen_num_monitors; ++i)
for (j = 0; j < screen_num_desktops; ++j) { for (j = 0; j < screen_num_desktops; ++j) {
gint l = 0, r = 0, t = 0, b = 0; gint l = 0, r = 0, t = 0, b = 0;
/* only add the strut to the area if it touches the monitor */
for (sit = struts_left; sit; sit = g_slist_next(sit)) { for (sit = struts_left; sit; sit = g_slist_next(sit)) {
ObScreenStrut *s = sit->data; ObScreenStrut *s = sit->data;
if ((s->desktop == j || s->desktop == DESKTOP_ALL) && if (s->desktop == j || s->desktop == DESKTOP_ALL)
STRUT_LEFT_ON_MONITOR(s->strut, i))
l = MAX(l, s->strut->left); l = MAX(l, s->strut->left);
} }
for (sit = struts_top; sit; sit = g_slist_next(sit)) { for (sit = struts_top; sit; sit = g_slist_next(sit)) {
ObScreenStrut *s = sit->data; ObScreenStrut *s = sit->data;
if ((s->desktop == j || s->desktop == DESKTOP_ALL) && if (s->desktop == j || s->desktop == DESKTOP_ALL)
STRUT_TOP_ON_MONITOR(s->strut, i))
t = MAX(t, s->strut->top); t = MAX(t, s->strut->top);
} }
for (sit = struts_right; sit; sit = g_slist_next(sit)) { for (sit = struts_right; sit; sit = g_slist_next(sit)) {
ObScreenStrut *s = sit->data; ObScreenStrut *s = sit->data;
if ((s->desktop == j || s->desktop == DESKTOP_ALL) && if (s->desktop == j || s->desktop == DESKTOP_ALL)
STRUT_RIGHT_ON_MONITOR(s->strut, i))
r = MAX(r, s->strut->right); r = MAX(r, s->strut->right);
} }
for (sit = struts_bottom; sit; sit = g_slist_next(sit)) { for (sit = struts_bottom; sit; sit = g_slist_next(sit)) {
ObScreenStrut *s = sit->data; ObScreenStrut *s = sit->data;
if ((s->desktop == j || s->desktop == DESKTOP_ALL) && if (s->desktop == j || s->desktop == DESKTOP_ALL)
STRUT_BOTTOM_ON_MONITOR(s->strut, i))
b = MAX(b, s->strut->bottom); b = MAX(b, s->strut->bottom);
} }
/* if the monitor is not against the edge of the root window, /* based on these margins, set the work area for the desktop */
the struts will include the distance from the root window's edge dims[j*4 + 0] += l;
to the monitor, so add that back into the monitor's work area */ dims[j*4 + 1] += t;
if (l) l += RECT_LEFT (monitor_area[screen_num_monitors]) dims[j*4 + 2] -= l + r;
- RECT_LEFT (monitor_area[i]); dims[j*4 + 3] -= t + b;
if (t) t += RECT_TOP (monitor_area[screen_num_monitors])
- RECT_TOP (monitor_area[i]);
if (r) r -= RECT_RIGHT (monitor_area[screen_num_monitors])
- RECT_RIGHT (monitor_area[i]);
if (b) b -= RECT_BOTTOM(monitor_area[screen_num_monitors])
- RECT_BOTTOM(monitor_area[i]);
/* based on these margins, set the work area for the
monitor/desktop */
dims[(i * screen_num_desktops + j) * 4 + 0] += l;
dims[(i * screen_num_desktops + j) * 4 + 1] += t;
dims[(i * screen_num_desktops + j) * 4 + 2] -= l + r;
dims[(i * screen_num_desktops + j) * 4 + 3] -= t + b;
} }
/* all the work areas are not used here, only the ones for the first /* set the legacy workarea hint to the union of all the monitors */
monitor are */
PROP_SETA32(RootWindow(ob_display, ob_screen), net_workarea, cardinal, PROP_SETA32(RootWindow(ob_display, ob_screen), net_workarea, cardinal,
dims, 4 * screen_num_desktops); dims, 4 * screen_num_desktops);
@ -1690,7 +1659,7 @@ Rect* screen_physical_area_active(void)
return screen_physical_area_monitor(screen_monitor_active()); return screen_physical_area_monitor(screen_monitor_active());
} }
guint screen_monitor_primary(void) guint screen_monitor_primary(gboolean fixed)
{ {
if (config_primary_monitor_index > 0) { if (config_primary_monitor_index > 0) {
if (config_primary_monitor_index-1 < screen_num_monitors) if (config_primary_monitor_index-1 < screen_num_monitors)
@ -1698,15 +1667,17 @@ guint screen_monitor_primary(void)
else else
return 0; return 0;
} }
else if (fixed)
return 0;
else if (config_primary_monitor == OB_PLACE_MONITOR_ACTIVE) else if (config_primary_monitor == OB_PLACE_MONITOR_ACTIVE)
return screen_monitor_active(); return screen_monitor_active();
else /* config_primary_monitor == OB_PLACE_MONITOR_MOUSE */ else /* config_primary_monitor == OB_PLACE_MONITOR_MOUSE */
return screen_monitor_pointer(); return screen_monitor_pointer();
} }
Rect *screen_physical_area_primary(void) Rect *screen_physical_area_primary(gboolean fixed)
{ {
return screen_physical_area_monitor(screen_monitor_primary()); return screen_physical_area_monitor(screen_monitor_primary(fixed));
} }
void screen_set_root_cursor(void) void screen_set_root_cursor(void)

View file

@ -110,10 +110,18 @@ guint screen_monitor_active(void);
Rect *screen_physical_area_active(void); Rect *screen_physical_area_active(void);
/*! Returns the primary monitor, as specified by the config */ /*! Returns the primary monitor, as specified by the config.
guint screen_monitor_primary(void); @fixed If TRUE, then this will always return a fixed monitor, otherwise
it may change based on where focus is, or other heuristics.
*/
guint screen_monitor_primary(gboolean fixed);
Rect *screen_physical_area_primary(void); /*! Returns physical area for the primary monitor, as specified by the config.
@fixed If TRUE, then this will always use a fixed monitor as primary,
otherwise it may change based on where focus is, or other heuristics.
See screen_monitor_primary().
*/
Rect *screen_physical_area_primary(gboolean fixed);
/* doesn't include struts which the search area is already outside of when /* doesn't include struts which the search area is already outside of when
'search' is not NULL */ 'search' is not NULL */