[Xfce4-commits] <midori:master> Grow and shrink tabs dynamically to available space

Christian Dywan noreply at xfce.org
Wed Mar 23 20:44:01 CET 2011


Updating branch refs/heads/master
         to a9a5b38c292e89fa104e1561ab8b1e2ca47d052b (commit)
       from 6e2d9fdcc2e45b8f67dfb4ae92647aa475ddcb1b (commit)

commit a9a5b38c292e89fa104e1561ab8b1e2ca47d052b
Author: Tomasz Szatkowski <szatkus at gmail.com>
Date:   Wed Mar 23 20:41:40 2011 +0100

    Grow and shrink tabs dynamically to available space
    
    Fixes: https://bugs.launchpad.net/midori/+bug/735993

 midori/midori-browser.c |   41 +++++++++++++++++++++++++++++++++++++++++
 midori/midori-view.c    |    9 ++-------
 2 files changed, 43 insertions(+), 7 deletions(-)

diff --git a/midori/midori-browser.c b/midori/midori-browser.c
index 4399236..e74ebcf 100644
--- a/midori/midori-browser.c
+++ b/midori/midori-browser.c
@@ -1463,6 +1463,31 @@ midori_browser_tab_destroy_cb (GtkWidget*     widget,
 }
 
 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);
 }
 
 /**
@@ -5200,6 +5227,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)
 {
     g_object_set_data (G_OBJECT (browser), "midori-browser-destroyed", (void*)1);
@@ -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);
diff --git a/midori/midori-view.c b/midori/midori-view.c
index f4e85e0..654db5f 100644
--- a/midori/midori-view.c
+++ b/midori/midori-view.c
@@ -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));



More information about the Xfce4-commits mailing list