diff --git a/panel/panel-app.c b/panel/panel-app.c index cc7d97df..9a21f41e 100644 --- a/panel/panel-app.c +++ b/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; +} diff --git a/panel/panel-app.h b/panel/panel-app.h index c1ba97f0..3f36d9ff 100644 --- a/panel/panel-app.h +++ b/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 */ diff --git a/panel/panel-properties.c b/panel/panel-properties.c index 6d61a0db..265a5a6e 100644 --- a/panel/panel-properties.c +++ b/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); } }