Browse Source

When using xinerama and all monitors are equal size, full width will expand across monitors.

Actually, I have no idea if it really works, but at least it doesn't seem to mess up single monitor operation ;-)

(Old svn revision: 19105)
upstream/xfce4-panel-4.10.1
Jasper Huijsmans 18 years ago
parent
commit
162710c534
  1. 39
      panel/panel-app.c
  2. 5
      panel/panel-app.h
  3. 74
      panel/panel-properties.c

39
panel/panel-app.c

@ -78,6 +78,10 @@ struct _PanelApp
int current_panel;
GList *dialogs;
/* check whether monitors in Xinerama are aligned */
guint xinerama_and_equal_width;
guint xinerama_and_equal_height;
};
static PanelApp panel_app = {0};
@ -272,7 +276,8 @@ create_monitor_list (void)
GdkDisplay *display;
GdkScreen *screen;
XfceMonitor *monitor;
int n_screens, n_monitors, i, j;
int n_screens, n_monitors, i, j, w, h;
gboolean equal_w, equal_h;
panel_app.monitor_list = g_ptr_array_new ();
@ -280,6 +285,8 @@ create_monitor_list (void)
n_screens = gdk_display_get_n_screens (display);
equal_w = equal_h = TRUE;
for (i = 0; i < n_screens; ++i)
{
screen = gdk_display_get_screen (display, i);
@ -296,6 +303,18 @@ create_monitor_list (void)
gdk_screen_get_monitor_geometry (screen, j, &(monitor->geometry));
g_ptr_array_add (panel_app.monitor_list, monitor);
if (j > 0)
{
if (w != monitor->geometry.width)
equal_w = FALSE;
if (h != monitor->geometry.height)
equal_h = FALSE;
}
w = monitor->geometry.width;
h = monitor->geometry.height;
#if TEST_MULTIPLE_MONITORS
monitor = g_new (XfceMonitor, 1);
@ -311,6 +330,12 @@ create_monitor_list (void)
g_signal_connect (screen, "size-changed",
G_CALLBACK (monitor_size_changed), NULL);
}
if (n_screens == 1 && n_monitors > 1)
{
panel_app.xinerama_and_equal_width = equal_w;
panel_app.xinerama_and_equal_height = equal_h;
}
}
/* open dialogs */
@ -784,4 +809,16 @@ panel_app_get_panel_list (void)
return panel_app.panel_list;
}
/* check whether monitors in Xinerama are aligned */
gboolean
panel_app_monitors_equal_height (void)
{
return panel_app.xinerama_and_equal_height;
}
gboolean
panel_app_monitors_equal_width (void)
{
return panel_app.xinerama_and_equal_width;
}

5
panel/panel-app.h

@ -73,6 +73,10 @@ XfceMonitor *panel_app_get_monitor (int n);
int panel_app_get_n_monitors (void);
gboolean panel_app_monitors_equal_height (void);
gboolean panel_app_monitors_equal_width (void);
/* keep track of open dialogs */
void panel_app_register_dialog (GtkWidget *dialog);
@ -86,6 +90,7 @@ int panel_app_get_current_panel (void);
/* get panel list */
G_CONST_RETURN GPtrArray *panel_app_get_panel_list (void);
G_END_DECLS
#endif /* _PANEL_APP_H */

74
panel/panel-properties.c

@ -385,6 +385,20 @@ panel_set_position (Panel *panel, XfceScreenPosition position,
x += xoffset;
y += yoffset;
if (priv->full_width)
{
if (xfce_screen_position_is_horizontal (position))
{
if (panel_app_monitors_equal_height ())
x = 0;
}
else
{
if (!panel_app_monitors_equal_width ())
y = 0;
}
}
gtk_window_move (GTK_WINDOW (panel), x, y);
_set_struts (panel, x, y, req.width, req.height);
@ -405,8 +419,8 @@ panel_screen_size_changed (GdkScreen *screen, Panel *panel)
gdk_screen_get_monitor_geometry (screen, xmon->num,
&(xmon->geometry));
panel_set_position (panel, priv->screen_position,
priv->xoffset, priv->yoffset);
priv->full_width = !priv->full_width;
panel_set_full_width (panel, !priv->full_width);
}
/* transparency and autohide */
@ -479,13 +493,19 @@ _set_hidden (Panel *panel, gboolean hide)
}
else if (xfce_screen_position_is_horizontal (priv->screen_position))
{
w = xmon->geometry.width;
if (!panel_app_monitors_equal_height ())
w = xmon->geometry.width;
else
w = gdk_screen_get_width (xmon->screen);
h = -1;
}
else
{
w = -1;
h = xmon->geometry.height;
if (!panel_app_monitors_equal_width ())
h = xmon->geometry.height;
else
h = gdk_screen_get_height (xmon->screen);
}
gtk_widget_show (priv->itembar);
@ -644,11 +664,27 @@ panel_init_position (Panel *panel)
if (priv->full_width)
{
if (xfce_screen_position_is_horizontal (priv->screen_position))
gtk_widget_set_size_request (GTK_WIDGET (panel),
xmon->geometry.width, -1);
{
int w;
if (!panel_app_monitors_equal_height ())
w = xmon->geometry.width;
else
w = gdk_screen_get_width (xmon->screen);
gtk_widget_set_size_request (GTK_WIDGET (panel), w, -1);
}
else
gtk_widget_set_size_request (GTK_WIDGET (panel),
-1, xmon->geometry.height);
{
int h;
if (!panel_app_monitors_equal_width ())
h = xmon->geometry.height;
else
h = gdk_screen_get_height (xmon->screen);
gtk_widget_set_size_request (GTK_WIDGET (panel), -1, h);
}
}
panel_set_position (panel, priv->screen_position,
@ -779,20 +815,20 @@ void
panel_set_full_width (Panel *panel, gboolean fullwidth)
{
PanelPrivate *priv;
XfceMonitor *xmon;
priv = PANEL_GET_PRIVATE (panel);
xmon = panel_app_get_monitor (priv->monitor);
if (fullwidth != priv->full_width)
{
priv->full_width = fullwidth;
if (GTK_WIDGET_VISIBLE (GTK_WIDGET (panel)))
{
XfceMonitor *xmon;
int w, h;
xmon = panel_app_get_monitor (priv->monitor);
if (!priv->full_width)
{
w = h = -1;
@ -800,13 +836,19 @@ panel_set_full_width (Panel *panel, gboolean fullwidth)
else if (xfce_screen_position_is_horizontal (
priv->screen_position))
{
w = xmon->geometry.width;
if (!panel_app_monitors_equal_height())
w = xmon->geometry.width;
else
w = gdk_screen_get_width (xmon->screen);
h = -1;
}
else
{
w = -1;
h = xmon->geometry.height;
if (!panel_app_monitors_equal_width())
h = xmon->geometry.height;
else
h = gdk_screen_get_height (xmon->screen);
}
gtk_widget_set_size_request (GTK_WIDGET (panel), w, h);
@ -904,9 +946,9 @@ panel_set_monitor (Panel *panel, int monitor)
gtk_widget_hide (GTK_WIDGET (panel));
gtk_window_set_screen (GTK_WINDOW (panel), xmon->screen);
gtk_widget_show (GTK_WIDGET (panel));
panel_set_position (panel, priv->screen_position,
priv->xoffset, priv->yoffset);
priv->full_width = !priv->full_width;
panel_set_full_width (panel, !priv->full_width);
}
}

Loading…
Cancel
Save