Do a better job of automatically sizing the window to fit contents

Try our best to avoid scrollbars.
This commit is contained in:
William Jon McCann 2010-10-31 17:55:20 -04:00
parent b9b2767d33
commit b2dc1dffa1
2 changed files with 43 additions and 67 deletions

View file

@ -56,6 +56,8 @@ struct _GnomeControlCenterPrivate
{ {
GtkBuilder *builder; GtkBuilder *builder;
GtkWidget *notebook; GtkWidget *notebook;
GtkWidget *main_vbox;
GtkWidget *scrolled_window;
GtkWidget *window; GtkWidget *window;
GtkWidget *search_entry; GtkWidget *search_entry;
@ -72,8 +74,6 @@ struct _GnomeControlCenterPrivate
gchar *default_window_title; gchar *default_window_title;
gchar *default_window_icon; gchar *default_window_icon;
gint overview_height;
}; };
/* Use a fixed width for the shell, since resizing horizontally is more awkward /* Use a fixed width for the shell, since resizing horizontally is more awkward
@ -125,7 +125,7 @@ activate_panel (GnomeControlCenter *shell,
{ {
GtkWidget *panel; GtkWidget *panel;
GtkWidget *box; GtkWidget *box;
gint i, old_page; gint i;
int nat_height; int nat_height;
/* create the panel plugin */ /* create the panel plugin */
@ -136,17 +136,6 @@ activate_panel (GnomeControlCenter *shell,
gtk_container_add (GTK_CONTAINER (box), panel); gtk_container_add (GTK_CONTAINER (box), panel);
old_page = gtk_notebook_get_current_page (GTK_NOTEBOOK (priv->notebook));
/* store the old size */
if (old_page == OVERVIEW_PAGE)
{
GtkAllocation alloc;
gtk_widget_get_allocation (priv->window, &alloc);
priv->overview_height = alloc.height;
}
i = gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), box, i = gtk_notebook_append_page (GTK_NOTEBOOK (priv->notebook), box,
NULL); NULL);
@ -160,11 +149,17 @@ activate_panel (GnomeControlCenter *shell,
gtk_widget_show (panel); gtk_widget_show (panel);
/* set the scrolled window small so that it doesn't force
the window to be larger than this panel */
gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (priv->scrolled_window), 50);
/* resize to the preferred size of the panel */ /* resize to the preferred size of the panel */
gtk_widget_set_size_request (priv->window, FIXED_WIDTH, -1); gtk_widget_set_size_request (priv->window, FIXED_WIDTH, -1);
gtk_widget_get_preferred_height (GTK_WIDGET (priv->window), gtk_widget_get_preferred_height (GTK_WIDGET (priv->window),
NULL, &nat_height); NULL, &nat_height);
gtk_window_resize (GTK_WINDOW (priv->window), FIXED_WIDTH, g_debug ("Setting panel height: %d", nat_height);
gtk_window_resize (GTK_WINDOW (priv->window),
FIXED_WIDTH,
nat_height); nat_height);
return; return;
} }
@ -216,7 +211,6 @@ shell_show_overview_page (GnomeControlCenterPrivate *priv)
gtk_notebook_remove_page (GTK_NOTEBOOK (priv->notebook), CAPPLET_PAGE); gtk_notebook_remove_page (GTK_NOTEBOOK (priv->notebook), CAPPLET_PAGE);
/* clear the search text */ /* clear the search text */
g_free (priv->filter_string); g_free (priv->filter_string);
priv->filter_string = g_strdup (""); priv->filter_string = g_strdup ("");
@ -226,21 +220,8 @@ shell_show_overview_page (GnomeControlCenterPrivate *priv)
gtk_window_set_title (GTK_WINDOW (priv->window), priv->default_window_title); gtk_window_set_title (GTK_WINDOW (priv->window), priv->default_window_title);
gtk_window_set_icon_name (GTK_WINDOW (priv->window), gtk_window_set_icon_name (GTK_WINDOW (priv->window),
priv->default_window_icon); priv->default_window_icon);
/* resize back to the original overview height */
if (priv->overview_height > 0)
{
gtk_widget_set_size_request (priv->window,
FIXED_WIDTH,
priv->overview_height);
gtk_window_resize (GTK_WINDOW (priv->window),
FIXED_WIDTH,
priv->overview_height);
}
} }
static void static void
item_activated_cb (CcShellCategoryView *view, item_activated_cb (CcShellCategoryView *view,
gchar *name, gchar *name,
@ -293,14 +274,10 @@ category_focus_in (GtkWidget *view,
static GList * static GList *
get_item_views (GnomeControlCenter *shell) get_item_views (GnomeControlCenter *shell)
{ {
GnomeControlCenterPrivate *priv = shell->priv;
GtkWidget *vbox;
GList *list, *l; GList *list, *l;
GList *res; GList *res;
vbox = W (priv->builder, "main-vbox"); list = gtk_container_get_children (GTK_CONTAINER (shell->priv->main_vbox));
list = gtk_container_get_children (GTK_CONTAINER (vbox));
res = NULL; res = NULL;
for (l = list; l; l = l->next) for (l = list; l; l = l->next)
{ {
@ -601,16 +578,12 @@ fill_model (GnomeControlCenter *shell)
GSList *list, *l; GSList *list, *l;
GMenuTreeDirectory *d; GMenuTreeDirectory *d;
GMenuTree *tree; GMenuTree *tree;
GtkWidget *vbox;
GtkWidget *sw;
GnomeControlCenterPrivate *priv = shell->priv; GnomeControlCenterPrivate *priv = shell->priv;
vbox = W (priv->builder, "main-vbox"); gtk_container_set_border_width (GTK_CONTAINER (shell->priv->main_vbox), 10);
gtk_container_set_border_width (GTK_CONTAINER (vbox), 10); gtk_container_set_focus_vadjustment (GTK_CONTAINER (shell->priv->main_vbox),
sw = W (priv->builder, "scrolledwindow1"); gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (shell->priv->scrolled_window)));
gtk_container_set_focus_vadjustment (GTK_CONTAINER (vbox),
gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (sw)));
tree = gmenu_tree_lookup (MENUDIR "/gnomecc.menu", 0); tree = gmenu_tree_lookup (MENUDIR "/gnomecc.menu", 0);
@ -649,7 +622,7 @@ fill_model (GnomeControlCenter *shell)
g_strdup (dir_name), g_free); g_strdup (dir_name), g_free);
categoryview = cc_shell_category_view_new (dir_name, filter); categoryview = cc_shell_category_view_new (dir_name, filter);
gtk_box_pack_start (GTK_BOX (vbox), categoryview, FALSE, TRUE, 0); gtk_box_pack_start (GTK_BOX (shell->priv->main_vbox), categoryview, FALSE, TRUE, 0);
g_signal_connect (cc_shell_category_view_get_item_view (CC_SHELL_CATEGORY_VIEW (categoryview)), g_signal_connect (cc_shell_category_view_get_item_view (CC_SHELL_CATEGORY_VIEW (categoryview)),
"desktop-item-activated", "desktop-item-activated",
G_CALLBACK (item_activated_cb), shell); G_CALLBACK (item_activated_cb), shell);
@ -913,26 +886,39 @@ gnome_control_center_class_init (GnomeControlCenterClass *klass)
} }
static void static void
vbox_style_set_cb (GtkWidget *widget, on_window_size_allocate (GtkWidget *widget,
GtkStyle *old_style) GtkAllocation *allocation,
GnomeControlCenter *self)
{ {
GtkWidget *parent; int height;
GtkStyle *style;
parent = gtk_widget_get_parent (widget); if (gtk_notebook_get_current_page (GTK_NOTEBOOK (self->priv->notebook)) == OVERVIEW_PAGE)
style = gtk_widget_get_style (widget); {
gtk_widget_modify_bg (parent, GTK_STATE_NORMAL, int monitor;
&style->base[GTK_STATE_NORMAL]); GdkScreen *screen;
gtk_widget_modify_fg (parent, GTK_STATE_NORMAL, GdkRectangle rect;
&style->text[GTK_STATE_NORMAL]); screen = gtk_widget_get_screen (widget);
monitor = gdk_screen_get_monitor_at_window (screen, gtk_widget_get_window (widget));
gdk_screen_get_monitor_geometry (screen, monitor, &rect);
gtk_widget_get_preferred_height_for_width (GTK_WIDGET (self->priv->main_vbox),
FIXED_WIDTH,
NULL,
&height);
height = MIN (height + 10, rect.height);
}
else
{
height = 50;
}
gtk_scrolled_window_set_min_content_height (GTK_SCROLLED_WINDOW (self->priv->scrolled_window), height);
} }
static void static void
gnome_control_center_init (GnomeControlCenter *self) gnome_control_center_init (GnomeControlCenter *self)
{ {
GError *err = NULL; GError *err = NULL;
GtkWidget *vbox;
GnomeControlCenterPrivate *priv; GnomeControlCenterPrivate *priv;
priv = self->priv = CONTROL_CENTER_PRIVATE (self); priv = self->priv = CONTROL_CENTER_PRIVATE (self);
@ -953,24 +939,16 @@ gnome_control_center_init (GnomeControlCenter *self)
g_signal_connect_swapped (priv->window, "delete-event", G_CALLBACK (g_object_unref), self); g_signal_connect_swapped (priv->window, "delete-event", G_CALLBACK (g_object_unref), self);
priv->notebook = W (priv->builder, "notebook"); priv->notebook = W (priv->builder, "notebook");
priv->scrolled_window = W (priv->builder, "scrolledwindow1");
gtk_widget_set_size_request (priv->scrolled_window, FIXED_WIDTH, -1);
priv->main_vbox = W (priv->builder, "main-vbox");
g_signal_connect (priv->scrolled_window, "size-allocate", G_CALLBACK (on_window_size_allocate), self);
g_signal_connect (priv->notebook, "switch-page", g_signal_connect (priv->notebook, "switch-page",
G_CALLBACK (notebook_switch_page_cb), priv); G_CALLBACK (notebook_switch_page_cb), priv);
g_signal_connect (gtk_builder_get_object (priv->builder, "home-button"), g_signal_connect (gtk_builder_get_object (priv->builder, "home-button"),
"clicked", G_CALLBACK (home_button_clicked_cb), self); "clicked", G_CALLBACK (home_button_clicked_cb), self);
/* setup background colours */
vbox = W (priv->builder, "main-vbox");
gtk_widget_set_size_request (vbox, 0, -1);
/* make sure the background of the vbox uses base/text colour combinations
* and is updated if the style changes */
vbox_style_set_cb (vbox, NULL);
g_signal_connect (vbox, "style-set", G_CALLBACK (vbox_style_set_cb),
NULL);
/* load the available settings panels */ /* load the available settings panels */
fill_model (self); fill_model (self);

View file

@ -3,8 +3,6 @@
<requires lib="gtk+" version="2.16"/> <requires lib="gtk+" version="2.16"/>
<!-- interface-naming-policy project-wide --> <!-- interface-naming-policy project-wide -->
<object class="GtkWindow" id="main-window"> <object class="GtkWindow" id="main-window">
<property name="width_request">675</property>
<property name="height_request">500</property>
<property name="title" translatable="yes">System Settings</property> <property name="title" translatable="yes">System Settings</property>
<property name="resizable">False</property> <property name="resizable">False</property>
<property name="icon_name">preferences-desktop</property> <property name="icon_name">preferences-desktop</property>