]> spindle.queued.net Git - midori/commitdiff
Grow and shrink tabs dynamically to available space
authorTomasz Szatkowski <szatkus@gmail.com>
Wed, 23 Mar 2011 19:41:40 +0000 (20:41 +0100)
committerChristian Dywan <christian@twotoasts.de>
Wed, 23 Mar 2011 19:41:40 +0000 (20:41 +0100)
Fixes: https://bugs.launchpad.net/midori/+bug/735993
midori/midori-browser.c
midori/midori-view.c

index 4399236eafb237ae063c535d8aaace27267e9811..e74ebcff76f34eece855e6585c2d440943cf5f91 100644 (file)
@@ -1462,6 +1462,31 @@ midori_browser_tab_destroy_cb (GtkWidget*     widget,
     return FALSE;
 }
 
+static void
+_midori_browser_update_notebook (MidoriBrowser* browser)
+{
+    guint i;
+    gint new_size = 0;
+    gint n = gtk_notebook_get_n_pages (GTK_NOTEBOOK(browser->notebook));
+    const gint max_size = 150;
+    const gint min_size = 32;
+    GtkAllocation notebook_size;
+
+    gtk_widget_get_allocation (browser->notebook, &notebook_size);
+    if (n > 0) new_size = notebook_size.width / n - 7;
+    if (new_size < min_size) new_size = min_size;
+    if (new_size > max_size) new_size = max_size;
+
+    for (i = 0; i < n; i++)
+    {
+        GtkWidget* view;
+        GtkWidget* label;
+        view = gtk_notebook_get_nth_page (GTK_NOTEBOOK(browser->notebook), i);
+        label = gtk_notebook_get_tab_label (GTK_NOTEBOOK(browser->notebook), view);
+        gtk_widget_set_size_request (label, new_size, -1);
+    }
+}
+
 static void
 _midori_browser_add_tab (MidoriBrowser* browser,
                          GtkWidget*     view)
@@ -1540,6 +1565,7 @@ _midori_browser_add_tab (MidoriBrowser* browser,
         G_CALLBACK (midori_browser_tab_destroy_cb), browser);
 
     _midori_browser_update_actions (browser);
+    _midori_browser_update_notebook (browser);
 }
 
 static void
@@ -1547,6 +1573,7 @@ _midori_browser_remove_tab (MidoriBrowser* browser,
                             GtkWidget*     view)
 {
     gtk_widget_destroy (view);
+    _midori_browser_update_notebook (browser);
 }
 
 /**
@@ -5199,6 +5226,14 @@ midori_browser_size_allocate_cb (MidoriBrowser* browser,
     }
 }
 
+static void
+gtk_notebook_size_allocated_cb (GtkWidget*     widget,
+                                GdkRectangle*  allocation,
+                                MidoriBrowser* browser)
+{
+    _midori_browser_update_notebook (browser);
+}
+
 static void
 midori_browser_destroy_cb (MidoriBrowser* browser)
 {
@@ -5215,6 +5250,9 @@ midori_browser_destroy_cb (MidoriBrowser* browser)
     g_signal_handlers_disconnect_by_func (browser->notebook,
                                           midori_browser_notebook_reorder_tab_cb,
                                           NULL);
+    g_signal_handlers_disconnect_by_func (browser->notebook,
+                                          gtk_notebook_size_allocated_cb,
+                                          NULL);
     gtk_container_foreach (GTK_CONTAINER (browser->notebook),
                            (GtkCallback) gtk_widget_destroy, NULL);
 }
@@ -5934,6 +5972,9 @@ midori_browser_init (MidoriBrowser* browser)
     g_signal_connect (browser->notebook, "page-reordered",
                       G_CALLBACK (midori_browser_notebook_page_reordered_cb),
                       browser);
+    g_signal_connect (browser->notebook, "size-allocate",
+                      G_CALLBACK (gtk_notebook_size_allocated_cb),
+                      browser);
     g_signal_connect_after (browser->notebook, "button-press-event",
         G_CALLBACK (midori_browser_notebook_button_press_event_after_cb),
                       browser);
index f4e85e00fdea162678564a85107d5d888dae7ebe..654db5f169eadcd66b5e6aa581f6104967151ec0 100644 (file)
@@ -4591,18 +4591,13 @@ midori_view_update_tab_title (GtkWidget* label,
                               gint       size,
                               gdouble    angle)
 {
-    gint width;
-
-    sokoke_widget_get_text_size (label, "M", &width, NULL);
     if (angle == 0.0 || angle == 360.0)
     {
-        gtk_widget_set_size_request (label, width * size, -1);
         if (gtk_label_get_ellipsize (GTK_LABEL (label)) != PANGO_ELLIPSIZE_START)
             gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_END);
     }
     else
     {
-        gtk_widget_set_size_request (label, -1, width * size);
         gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_NONE);
     }
     gtk_label_set_angle (GTK_LABEL (label), angle);
@@ -4767,13 +4762,13 @@ midori_view_get_proxy_tab_label (MidoriView* view)
         if (katze_object_get_boolean (view->settings, "close-buttons-left"))
         {
             gtk_box_pack_end (GTK_BOX (hbox), view->tab_icon, FALSE, FALSE, 0);
-            gtk_box_pack_end (GTK_BOX (hbox), view->tab_title, FALSE, TRUE, 0);
+            gtk_box_pack_end (GTK_BOX (hbox), view->tab_title, TRUE, TRUE, 0);
             gtk_box_pack_start (GTK_BOX (hbox), align, FALSE, FALSE, 0);
         }
         else
         {
             gtk_box_pack_start (GTK_BOX (hbox), view->tab_icon, FALSE, FALSE, 0);
-            gtk_box_pack_start (GTK_BOX (hbox), view->tab_title, FALSE, TRUE, 0);
+            gtk_box_pack_start (GTK_BOX (hbox), view->tab_title, TRUE, TRUE, 0);
             gtk_box_pack_end (GTK_BOX (hbox), align, FALSE, FALSE, 0);
         }
         gtk_widget_show_all (GTK_WIDGET (event_box));