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:
parent
828c095c8b
commit
3c688bc4a7
4 changed files with 64 additions and 85 deletions
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
129
openbox/screen.c
129
openbox/screen.c
|
@ -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[j*4 + 0] =
|
||||||
dims[(i * screen_num_desktops + j) * 4+0] = monitor_area[i].x;
|
monitor_area[screen_num_monitors].x;
|
||||||
dims[(i * screen_num_desktops + j) * 4+1] = monitor_area[i].y;
|
dims[j*4 + 1] =
|
||||||
dims[(i * screen_num_desktops + j) * 4+2] = monitor_area[i].width;
|
monitor_area[screen_num_monitors].y;
|
||||||
dims[(i * screen_num_desktops + j) * 4+3] = monitor_area[i].height;
|
dims[j*4 + 2] =
|
||||||
|
monitor_area[screen_num_monitors].width;
|
||||||
|
dims[j*4 + 3] =
|
||||||
|
monitor_area[screen_num_monitors].height;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* calculate the work area from the struts */
|
||||||
|
for (j = 0; j < screen_num_desktops; ++j) {
|
||||||
|
gint l = 0, r = 0, t = 0, b = 0;
|
||||||
|
|
||||||
|
for (sit = struts_left; sit; sit = g_slist_next(sit)) {
|
||||||
|
ObScreenStrut *s = sit->data;
|
||||||
|
if (s->desktop == j || s->desktop == DESKTOP_ALL)
|
||||||
|
l = MAX(l, s->strut->left);
|
||||||
|
}
|
||||||
|
for (sit = struts_top; sit; sit = g_slist_next(sit)) {
|
||||||
|
ObScreenStrut *s = sit->data;
|
||||||
|
if (s->desktop == j || s->desktop == DESKTOP_ALL)
|
||||||
|
t = MAX(t, s->strut->top);
|
||||||
|
}
|
||||||
|
for (sit = struts_right; sit; sit = g_slist_next(sit)) {
|
||||||
|
ObScreenStrut *s = sit->data;
|
||||||
|
if (s->desktop == j || s->desktop == DESKTOP_ALL)
|
||||||
|
r = MAX(r, s->strut->right);
|
||||||
|
}
|
||||||
|
for (sit = struts_bottom; sit; sit = g_slist_next(sit)) {
|
||||||
|
ObScreenStrut *s = sit->data;
|
||||||
|
if (s->desktop == j || s->desktop == DESKTOP_ALL)
|
||||||
|
b = MAX(b, s->strut->bottom);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* calculate the work areas from the struts */
|
/* based on these margins, set the work area for the desktop */
|
||||||
for (i = 0; i < screen_num_monitors; ++i)
|
dims[j*4 + 0] += l;
|
||||||
for (j = 0; j < screen_num_desktops; ++j) {
|
dims[j*4 + 1] += t;
|
||||||
gint l = 0, r = 0, t = 0, b = 0;
|
dims[j*4 + 2] -= l + r;
|
||||||
|
dims[j*4 + 3] -= t + b;
|
||||||
|
}
|
||||||
|
|
||||||
/* only add the strut to the area if it touches the monitor */
|
/* set the legacy workarea hint to the union of all the monitors */
|
||||||
|
|
||||||
for (sit = struts_left; sit; sit = g_slist_next(sit)) {
|
|
||||||
ObScreenStrut *s = sit->data;
|
|
||||||
if ((s->desktop == j || s->desktop == DESKTOP_ALL) &&
|
|
||||||
STRUT_LEFT_ON_MONITOR(s->strut, i))
|
|
||||||
l = MAX(l, s->strut->left);
|
|
||||||
}
|
|
||||||
for (sit = struts_top; sit; sit = g_slist_next(sit)) {
|
|
||||||
ObScreenStrut *s = sit->data;
|
|
||||||
if ((s->desktop == j || s->desktop == DESKTOP_ALL) &&
|
|
||||||
STRUT_TOP_ON_MONITOR(s->strut, i))
|
|
||||||
t = MAX(t, s->strut->top);
|
|
||||||
}
|
|
||||||
for (sit = struts_right; sit; sit = g_slist_next(sit)) {
|
|
||||||
ObScreenStrut *s = sit->data;
|
|
||||||
if ((s->desktop == j || s->desktop == DESKTOP_ALL) &&
|
|
||||||
STRUT_RIGHT_ON_MONITOR(s->strut, i))
|
|
||||||
r = MAX(r, s->strut->right);
|
|
||||||
}
|
|
||||||
for (sit = struts_bottom; sit; sit = g_slist_next(sit)) {
|
|
||||||
ObScreenStrut *s = sit->data;
|
|
||||||
if ((s->desktop == j || s->desktop == DESKTOP_ALL) &&
|
|
||||||
STRUT_BOTTOM_ON_MONITOR(s->strut, i))
|
|
||||||
b = MAX(b, s->strut->bottom);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if the monitor is not against the edge of the root window,
|
|
||||||
the struts will include the distance from the root window's edge
|
|
||||||
to the monitor, so add that back into the monitor's work area */
|
|
||||||
if (l) l += RECT_LEFT (monitor_area[screen_num_monitors])
|
|
||||||
- RECT_LEFT (monitor_area[i]);
|
|
||||||
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
|
|
||||||
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)
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in a new issue