[yocto] [matchbox-desktop-2][PATCH 01/16] Initial port to GTK+ 3

Jussi Kukkonen jussi.kukkonen at intel.com
Thu Apr 28 06:02:54 PDT 2016


From: Ross Burton <ross.burton at intel.com>

More to be done, but it works.  The only known regression is that startup
notification isn't multi-screen aware, but this should be ported to use GAppInfo
in the future.

Also themeing is likely to be broken, but this needs to be rethought for GTK+ 3
anyway.
---
 configure.ac             |  2 +-
 libtaku/launcher-util.c  | 23 +++++++----------
 libtaku/taku-icon-tile.c |  6 ++---
 libtaku/taku-table.c     | 64 ++++++++++++++++++++++++++----------------------
 libtaku/taku-tile.c      | 44 ++++++++++++++-------------------
 src/desktop.c            |  2 +-
 src/taku-category-bar.c  | 12 ++++++---
 7 files changed, 75 insertions(+), 78 deletions(-)

diff --git a/configure.ac b/configure.ac
index 5ec6f76..afa64ae 100644
--- a/configure.ac
+++ b/configure.ac
@@ -18,7 +18,7 @@ if test x$inotify_support = xyes; then
         AC_DEFINE(WITH_INOTIFY, [1], [If inotify is enabled])
 fi
 
-PKG_CHECK_MODULES(GTK, [glib-2.0 >= 2.14 gtk+-2.0 x11])
+PKG_CHECK_MODULES(GTK, [glib-2.0 >= 2.14 gtk+-3.0 x11])
 
 AC_ARG_ENABLE(startup_notification,
         AC_HELP_STRING([--disable-startup-notification], [disable startup notification support]),
diff --git a/libtaku/launcher-util.c b/libtaku/launcher-util.c
index b8e37d1..89333f9 100644
--- a/libtaku/launcher-util.c
+++ b/libtaku/launcher-util.c
@@ -266,23 +266,18 @@ launcher_start (GtkWidget *widget,
                                   gtk_get_current_event_time ());
   }
 #endif
-  
-  /* GTK+ 2.11.3 has a gdk_spawn_on_screen which doesn't trash envp */
-#if GTK_CHECK_VERSION(2,11,3)
-  if (!gdk_spawn_on_screen (gtk_widget_get_screen (widget),
-#else
-  if (!g_spawn_async (
-#endif
-                            NULL, argv, NULL,
-                            G_SPAWN_SEARCH_PATH,
-                            child_setup,
+
+  /* TODO: use GAppInfo */
+  if (!g_spawn_async (NULL, argv, NULL,
+                      G_SPAWN_SEARCH_PATH,
+                      child_setup,
 #ifdef USE_LIBSN
-                            use_sn ? context : NULL,
+                      use_sn ? context : NULL,
 #else
-                            NULL,
+                      NULL,
 #endif
-                            NULL,
-                            &error)) {
+                      NULL,
+                      &error)) {
     g_warning ("Cannot launch %s: %s", argv[0], error->message);
     g_error_free (error);
 #ifdef USE_LIBSN
diff --git a/libtaku/taku-icon-tile.c b/libtaku/taku-icon-tile.c
index 7af3d19..2e562aa 100644
--- a/libtaku/taku-icon-tile.c
+++ b/libtaku/taku-icon-tile.c
@@ -65,13 +65,13 @@ tile_arrange (TakuIconTile *tile)
     case GTK_ORIENTATION_VERTICAL :
       gtk_misc_set_alignment (GTK_MISC (tile->priv->primary), 0.5, 0.5);
       gtk_misc_set_alignment (GTK_MISC (tile->priv->secondary), 0.5, 0.5);
-      box = gtk_vbox_new (FALSE, 6);
+      box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
       break;
     default:
     case GTK_ORIENTATION_HORIZONTAL :
       gtk_misc_set_alignment (GTK_MISC (tile->priv->primary), 0.0, 0.5);
       gtk_misc_set_alignment (GTK_MISC (tile->priv->secondary), 0.0, 0.5);
-      box = gtk_hbox_new (FALSE, 6);
+      box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6);
       break;
     }
     
@@ -79,7 +79,7 @@ tile_arrange (TakuIconTile *tile)
     
     gtk_box_pack_start (GTK_BOX (box), tile->priv->icon, FALSE, FALSE, 0);
     
-    vbox = gtk_vbox_new (FALSE, 6);
+    vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 6);
     gtk_widget_show (vbox);
 
     gtk_box_pack_start (GTK_BOX (vbox), tile->priv->primary, TRUE, TRUE, 0);
diff --git a/libtaku/taku-table.c b/libtaku/taku-table.c
index 1b2fa0e..67f630e 100644
--- a/libtaku/taku-table.c
+++ b/libtaku/taku-table.c
@@ -128,7 +128,7 @@ im_context_commit_cb (GtkIMContext *context,
     }
 
     tile = g_sequence_get (iter);
-    if (!GTK_WIDGET_VISIBLE (tile))
+    if (!gtk_widget_get_visible (GTK_WIDGET (tile)))
       goto next;
 
     text = taku_tile_get_search_key (tile);
@@ -155,20 +155,25 @@ next:
 static gboolean
 on_tile_focus (GtkWidget *widget, GdkEventFocus *event, gpointer user_data)
 {
-  GtkWidget *viewport = GTK_WIDGET (user_data)->parent;
+  GtkWidget *container = GTK_WIDGET (user_data);
+  GtkWidget *viewport = gtk_widget_get_parent (container);
+  GtkAllocation widget_alloc, viewport_alloc;
   GtkAdjustment *adjustment;
-  
-  /* If the lowest point of the tile is lower than the height of the viewport, 
+
+  gtk_widget_get_allocation (widget, &widget_alloc);
+  gtk_widget_get_allocation (viewport, &viewport_alloc);
+
+  /* If the lowest point of the tile is lower than the height of the viewport,
    * or if the top of the tile is higher than the viewport is... */
-  if (widget->allocation.y +
-      widget->allocation.height > viewport->allocation.height ||
-      widget->allocation.y < viewport->allocation.height) {
-    adjustment = gtk_viewport_get_vadjustment (GTK_VIEWPORT (viewport));
-    
+  if (widget_alloc.y +
+      widget_alloc.height > viewport_alloc.height ||
+      widget_alloc.y < viewport_alloc.height) {
+    adjustment = gtk_scrollable_get_vadjustment (GTK_SCROLLABLE (viewport));
+
     gtk_adjustment_clamp_page (adjustment,
-                               widget->allocation.y,
-                               widget->allocation.y +
-                               widget->allocation.height);
+                               widget_alloc.y,
+                               widget_alloc.y +
+                               widget_alloc.height);
   }
 
   return FALSE;
@@ -216,7 +221,7 @@ reflow (TakuTable *table)
   int i;
 
   /* Only reflow when necessary */
-  if (!GTK_WIDGET_REALIZED (table))
+  if (!gtk_widget_get_realized (GTK_WIDGET (table)))
     return;
 
   /* Remove dummies */
@@ -320,21 +325,25 @@ calculate_columns (GtkWidget *widget)
   PangoFontMetrics *metrics;
   int width, new_cols;
   guint cell_text_width = DEFAULT_WIDTH;
+  GtkAllocation allocation;
+
+  gtk_widget_get_allocation (widget, &allocation);
 
   /* If we are currently reflowing the tiles, or the final allocation hasn't
      been decided yet, return */
-  if (!GTK_WIDGET_REALIZED (widget) || table->priv->reflowing ||
-      widget->allocation.width <= 1)
+  if (!gtk_widget_get_realized (widget) ||
+      table->priv->reflowing ||
+      allocation.width <= 1)
     return;
 
   context = gtk_widget_get_pango_context (widget);
-  metrics = pango_context_get_metrics (context, widget->style->font_desc, NULL);
+  metrics = pango_context_get_metrics (context, gtk_widget_get_style (widget)->font_desc, NULL);
 
   gtk_widget_style_get (widget, "cell-text-width", &cell_text_width, NULL);
 
   width = PANGO_PIXELS
           (cell_text_width * pango_font_metrics_get_approximate_char_width (metrics));
-  new_cols = MAX (1, widget->allocation.width / width);
+  new_cols = MAX (1, allocation.width / width);
 
   if (table->priv->columns != new_cols) {
     table->priv->columns = new_cols;
@@ -352,7 +361,7 @@ taku_table_realize (GtkWidget *widget)
 
   (* GTK_WIDGET_CLASS (taku_table_parent_class)->realize) (widget);
 
-  gtk_im_context_set_client_window (self->priv->im_context, widget->window);
+  gtk_im_context_set_client_window (self->priv->im_context, gtk_widget_get_window (widget));
 
   calculate_columns (widget);
 }
@@ -368,15 +377,11 @@ taku_table_unrealize (GtkWidget *widget)
 }
 
 static void
-taku_table_size_allocate (GtkWidget     *widget,
-                          GtkAllocation *allocation)
+on_size_allocate (GtkWidget     *widget,
+                          GtkAllocation *allocation,
+                          gpointer       user_data)
 {
-  widget->allocation = *allocation;
-
   calculate_columns (widget);
-
-  (* GTK_WIDGET_CLASS (taku_table_parent_class)->size_allocate)
-    (widget, allocation);
 }
 
 static void
@@ -438,7 +443,7 @@ taku_table_grab_focus (GtkWidget *widget)
   while (!g_sequence_iter_is_end (iter)) {
     GtkWidget *widget = g_sequence_get (iter);
 
-    if (GTK_WIDGET_VISIBLE (widget)) {
+    if (gtk_widget_get_visible (widget)) {
       gtk_widget_grab_focus (widget);
 
       break;
@@ -472,16 +477,15 @@ taku_table_class_init (TakuTableClass *klass)
   g_type_class_add_private (klass, sizeof (TakuTablePrivate));
 
   object_class->finalize     = taku_table_finalize;
-  
+
   widget_class->realize         = taku_table_realize;
   widget_class->unrealize       = taku_table_unrealize;
-  widget_class->size_allocate   = taku_table_size_allocate;
   widget_class->style_set       = taku_table_style_set;
   widget_class->focus_in_event  = taku_table_focus_in_event;
   widget_class->focus_out_event = taku_table_focus_out_event;
   widget_class->key_press_event = taku_table_key_press_event;
   widget_class->grab_focus      = taku_table_grab_focus;
-  
+
   container_class->add    = container_add;
   container_class->remove = container_remove;
 
@@ -498,6 +502,8 @@ taku_table_init (TakuTable *self)
 {
   self->priv = GET_PRIVATE (self);
 
+  g_signal_connect (self, "size-allocate", G_CALLBACK (on_size_allocate), NULL);
+
   gtk_container_set_border_width (GTK_CONTAINER (self), 6);
   gtk_table_set_row_spacings (GTK_TABLE (self), 6);
   gtk_table_set_col_spacings (GTK_TABLE (self), 6);
diff --git a/libtaku/taku-tile.c b/libtaku/taku-tile.c
index 958c131..52f7885 100644
--- a/libtaku/taku-tile.c
+++ b/libtaku/taku-tile.c
@@ -29,32 +29,23 @@ enum {
 static guint signals[LAST_SIGNAL];
 
 static gboolean
-taku_tile_expose (GtkWidget      *widget,
-                  GdkEventExpose *event)
+taku_tile_draw (GtkWidget *widget, cairo_t *cr, gpointer user_data)
 {
-  if (GTK_WIDGET_DRAWABLE (widget)) {
-    gint x, y, width, height;
-    GtkStateType state;
-
-    x = widget->allocation.x;
-    y = widget->allocation.y;
-    width = widget->allocation.width;
-    height = widget->allocation.height;
-
-    state = GTK_WIDGET_STATE (widget);
-    /* If this isn't isn't being drawn active and it's focused, highlight it */
-    if (state != GTK_STATE_ACTIVE && GTK_WIDGET_HAS_FOCUS (widget)) {
-      state = GTK_STATE_SELECTED;
-    
-
-      gtk_paint_flat_box (widget->style, widget->window,
-                          state, GTK_SHADOW_NONE,
-                          &event->area, widget, NULL,
-                          x, y, width, height);
-    }
-    (* GTK_WIDGET_CLASS (taku_tile_parent_class)->expose_event) (widget, event);
+  GtkStyleContext *context;
+  int width, height;
+
+  context = gtk_widget_get_style_context (widget);
+
+  width = gtk_widget_get_allocated_width (widget);
+  height = gtk_widget_get_allocated_height (widget);
+
+  if (gtk_style_context_get_state (context) != GTK_STATE_FLAG_ACTIVE &&
+      gtk_widget_has_focus (widget)) {
+    gtk_style_context_set_state (context, GTK_STATE_SELECTED);
+
+    gtk_render_background (context, cr, 0, 0, width, height);
   }
-  
+
   return FALSE;
 }
 
@@ -123,7 +114,6 @@ taku_tile_class_init (TakuTileClass *klass)
 {
   GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
 
-  widget_class->expose_event = taku_tile_expose;
   widget_class->button_release_event = taku_tile_button_release;
   widget_class->enter_notify_event = taku_tile_enter_notify;
   widget_class->leave_notify_event = taku_tile_leave_notify;
@@ -152,9 +142,11 @@ taku_tile_class_init (TakuTileClass *klass)
 static void
 taku_tile_init (TakuTile *self)
 {
-  GTK_WIDGET_SET_FLAGS (GTK_WIDGET (self), GTK_CAN_FOCUS);
+  gtk_widget_set_can_focus (GTK_WIDGET (self), TRUE);
   gtk_event_box_set_visible_window (GTK_EVENT_BOX (self), FALSE);
   gtk_container_set_border_width (GTK_CONTAINER (self), 6);
+
+  g_signal_connect (self, "draw", G_CALLBACK (taku_tile_draw), NULL);
 }
 
 GtkWidget *
diff --git a/src/desktop.c b/src/desktop.c
index 94b4ddf..22beeab 100644
--- a/src/desktop.c
+++ b/src/desktop.c
@@ -180,7 +180,7 @@ create_desktop (void)
   gtk_container_add (GTK_CONTAINER (window), fixed);
 
   /* Main VBox */
-  box = gtk_vbox_new (FALSE, 0);
+  box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
   gtk_widget_show (box);
   gtk_fixed_put (GTK_FIXED (fixed), box, 0, 0);
   /* Set a sane default in case there is no work area defined yet */
diff --git a/src/taku-category-bar.c b/src/taku-category-bar.c
index afbe90d..765c713 100644
--- a/src/taku-category-bar.c
+++ b/src/taku-category-bar.c
@@ -135,11 +135,13 @@ position_menu (GtkMenu *menu,
                int *x, int *y, gboolean *push_in, gpointer user_data)
 {
   GtkWidget *widget = GTK_WIDGET (user_data);
+  GtkAllocation allocation;
 
-  gdk_window_get_origin (widget->window, x, y);
+  gdk_window_get_origin (gtk_widget_get_window (widget), x, y);
+  gtk_widget_get_allocation (widget, &allocation);
 
-  *x += widget->allocation.x;
-  *y += widget->allocation.y + widget->allocation.height;
+  *x += allocation.x;
+  *y += allocation.y + allocation.height;
 
   *push_in = TRUE;
 }
@@ -172,6 +174,7 @@ popup_menu (GtkWidget *button, GdkEventButton *event, gpointer user_data)
   TakuCategoryBar *bar;
   TakuCategoryBarPrivate *priv;
   GtkWidget *menu;
+  GtkAllocation allocation;
   GList *l;
 
   bar = TAKU_CATEGORY_BAR (user_data);
@@ -183,7 +186,8 @@ popup_menu (GtkWidget *button, GdkEventButton *event, gpointer user_data)
 
   /* Create menu */
   menu = gtk_menu_new ();
-  gtk_widget_set_size_request (menu, GTK_WIDGET (button)->allocation.width, -1);
+  gtk_widget_get_allocation (button, &allocation);
+  gtk_widget_set_size_request (menu, allocation.width, -1);
 
   g_signal_connect (menu, "selection-done", G_CALLBACK (popdown_menu), button);
 
-- 
2.8.1




More information about the yocto mailing list