shell: Be smarter about smaller screen sizes
Make the minimum window size smaller, and the window resizable when using small screens. Based on patch from Ubuntu https://bugzilla.gnome.org/show_bug.cgi?id=673869
This commit is contained in:
parent
d955d484da
commit
ad0e02f100
1 changed files with 102 additions and 4 deletions
|
@ -49,6 +49,7 @@ G_DEFINE_TYPE (GnomeControlCenter, gnome_control_center, CC_TYPE_SHELL)
|
|||
* Both sizes are defined in https://live.gnome.org/Design/SystemSettings/ */
|
||||
#define FIXED_WIDTH 740
|
||||
#define FIXED_HEIGHT 636
|
||||
#define SMALL_SCREEN_FIXED_HEIGHT 500
|
||||
|
||||
#define MIN_ICON_VIEW_HEIGHT 300
|
||||
|
||||
|
@ -86,6 +87,10 @@ struct _GnomeControlCenterPrivate
|
|||
|
||||
gchar *default_window_title;
|
||||
gchar *default_window_icon;
|
||||
|
||||
int monitor_num;
|
||||
gboolean small_screen;
|
||||
gboolean small_screen_set;
|
||||
};
|
||||
|
||||
static const gchar *
|
||||
|
@ -591,6 +596,7 @@ setup_search (GnomeControlCenter *shell)
|
|||
gtk_icon_view_set_item_orientation (GTK_ICON_VIEW (search_view),
|
||||
GTK_ORIENTATION_HORIZONTAL);
|
||||
gtk_icon_view_set_spacing (GTK_ICON_VIEW (search_view), 6);
|
||||
gtk_icon_view_set_margin (GTK_ICON_VIEW (search_view), 12);
|
||||
gtk_icon_view_set_model (GTK_ICON_VIEW (search_view),
|
||||
GTK_TREE_MODEL (priv->search_filter));
|
||||
|
||||
|
@ -753,7 +759,10 @@ setup_model (GnomeControlCenter *shell)
|
|||
{
|
||||
GnomeControlCenterPrivate *priv = shell->priv;
|
||||
|
||||
gtk_container_set_border_width (GTK_CONTAINER (shell->priv->main_vbox), 10);
|
||||
gtk_widget_set_margin_top (shell->priv->main_vbox, 8);
|
||||
gtk_widget_set_margin_bottom (shell->priv->main_vbox, 8);
|
||||
gtk_widget_set_margin_left (shell->priv->main_vbox, 12);
|
||||
gtk_widget_set_margin_right (shell->priv->main_vbox, 12);
|
||||
gtk_container_set_focus_vadjustment (GTK_CONTAINER (shell->priv->main_vbox),
|
||||
gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (shell->priv->scrolled_window)));
|
||||
|
||||
|
@ -813,11 +822,10 @@ notebook_switch_page_cb (GtkNotebook *book,
|
|||
gtk_widget_show (W (priv->builder, "search-entry"));
|
||||
gtk_widget_hide (W (priv->builder, "lock-button"));
|
||||
|
||||
/* FIXME: select a height that fits into the screen
|
||||
* for small displays */
|
||||
gtk_widget_get_preferred_height_for_width (GTK_WIDGET (priv->main_vbox),
|
||||
FIXED_WIDTH, NULL, &nat_height);
|
||||
gtk_widget_set_size_request (priv->scrolled_window, FIXED_WIDTH, nat_height);
|
||||
gtk_widget_set_size_request (priv->scrolled_window, FIXED_WIDTH,
|
||||
priv->small_screen ? SMALL_SCREEN_FIXED_HEIGHT : nat_height);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -1095,14 +1103,101 @@ window_key_press_event (GtkWidget *win,
|
|||
return retval;
|
||||
}
|
||||
|
||||
static gint
|
||||
get_monitor_height (GnomeControlCenter *self)
|
||||
{
|
||||
GdkScreen *screen;
|
||||
GdkRectangle rect;
|
||||
|
||||
/* FIXME use workarea instead of raw screen geometry */
|
||||
screen = gtk_widget_get_screen (self->priv->window);
|
||||
gdk_screen_get_monitor_geometry (screen, self->priv->monitor_num, &rect);
|
||||
|
||||
return rect.height;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
update_monitor_number (GnomeControlCenter *self)
|
||||
{
|
||||
gboolean changed = FALSE;
|
||||
GtkWidget *widget;
|
||||
GdkScreen *screen;
|
||||
GdkWindow *window;
|
||||
int monitor;
|
||||
|
||||
widget = self->priv->window;
|
||||
|
||||
window = gtk_widget_get_window (widget);
|
||||
screen = gtk_widget_get_screen (widget);
|
||||
monitor = gdk_screen_get_monitor_at_window (screen, window);
|
||||
if (self->priv->monitor_num != monitor)
|
||||
{
|
||||
self->priv->monitor_num = monitor;
|
||||
changed = TRUE;
|
||||
}
|
||||
|
||||
return changed;
|
||||
}
|
||||
|
||||
static void
|
||||
update_small_screen_settings (GnomeControlCenter *self)
|
||||
{
|
||||
gboolean small;
|
||||
|
||||
update_monitor_number (self);
|
||||
small = get_monitor_height (self) <= FIXED_HEIGHT;
|
||||
|
||||
if (small)
|
||||
{
|
||||
gtk_window_set_resizable (GTK_WINDOW (self->priv->window), TRUE);
|
||||
gtk_widget_set_size_request (self->priv->scrolled_window, FIXED_WIDTH, SMALL_SCREEN_FIXED_HEIGHT);
|
||||
|
||||
if (!self->priv->small_screen_set
|
||||
&& self->priv->small_screen != small)
|
||||
gtk_window_maximize (GTK_WINDOW (self->priv->window));
|
||||
}
|
||||
else
|
||||
{
|
||||
if (!self->priv->small_screen_set
|
||||
&& self->priv->small_screen != small)
|
||||
gtk_window_unmaximize (GTK_WINDOW (self->priv->window));
|
||||
|
||||
gtk_window_set_resizable (GTK_WINDOW (self->priv->window), FALSE);
|
||||
}
|
||||
|
||||
self->priv->small_screen = small;
|
||||
self->priv->small_screen_set = TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
main_window_configure_cb (GtkWidget *widget,
|
||||
GdkEvent *event,
|
||||
GnomeControlCenter *self)
|
||||
{
|
||||
update_small_screen_settings (self);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
monitors_changed_cb (GdkScreen *screen,
|
||||
GnomeControlCenter *self)
|
||||
{
|
||||
update_small_screen_settings (self);
|
||||
}
|
||||
|
||||
static void
|
||||
gnome_control_center_init (GnomeControlCenter *self)
|
||||
{
|
||||
GError *err = NULL;
|
||||
GnomeControlCenterPrivate *priv;
|
||||
GdkScreen *screen;
|
||||
|
||||
priv = self->priv = CONTROL_CENTER_PRIVATE (self);
|
||||
|
||||
priv->monitor_num = -1;
|
||||
self->priv->small_screen = FALSE;
|
||||
self->priv->small_screen_set = FALSE;
|
||||
|
||||
/* load the user interface */
|
||||
priv->builder = gtk_builder_new ();
|
||||
|
||||
|
@ -1116,6 +1211,9 @@ gnome_control_center_init (GnomeControlCenter *self)
|
|||
|
||||
/* connect various signals */
|
||||
priv->window = W (priv->builder, "main-window");
|
||||
screen = gtk_widget_get_screen (priv->window);
|
||||
g_signal_connect (screen, "monitors-changed", G_CALLBACK (monitors_changed_cb), self);
|
||||
g_signal_connect (priv->window, "configure-event", G_CALLBACK (main_window_configure_cb), self);
|
||||
g_signal_connect_swapped (priv->window, "delete-event", G_CALLBACK (g_object_unref), self);
|
||||
g_signal_connect (priv->window, "key_press_event",
|
||||
G_CALLBACK (window_key_press_event), self);
|
||||
|
|
Loading…
Add table
Reference in a new issue