[gtk+] iconview: Turn into no-window widget



commit 6c3d1fba7870ad31de10526c86559141e8a74386
Author: Benjamin Otte <otte redhat com>
Date:   Thu Nov 3 02:18:45 2016 +0100

    iconview: Turn into no-window widget

 gtk/gtkiconview.c        |   51 +++++++++++++++++++++++++++++++++------------
 gtk/gtkiconviewprivate.h |    1 +
 2 files changed, 38 insertions(+), 14 deletions(-)
---
diff --git a/gtk/gtkiconview.c b/gtk/gtkiconview.c
index b22cc39..82ca127 100644
--- a/gtk/gtkiconview.c
+++ b/gtk/gtkiconview.c
@@ -143,6 +143,8 @@ static void             gtk_icon_view_get_property              (GObject
 static void             gtk_icon_view_destroy                   (GtkWidget          *widget);
 static void             gtk_icon_view_realize                   (GtkWidget          *widget);
 static void             gtk_icon_view_unrealize                 (GtkWidget          *widget);
+static void             gtk_icon_view_map                       (GtkWidget          *widget);
+static void             gtk_icon_view_unmap                     (GtkWidget          *widget);
 static GtkSizeRequestMode gtk_icon_view_get_request_mode        (GtkWidget          *widget);
 static void gtk_icon_view_measure (GtkWidget *widget,
                                    GtkOrientation  orientation,
@@ -351,6 +353,8 @@ gtk_icon_view_class_init (GtkIconViewClass *klass)
   widget_class->destroy = gtk_icon_view_destroy;
   widget_class->realize = gtk_icon_view_realize;
   widget_class->unrealize = gtk_icon_view_unrealize;
+  widget_class->map = gtk_icon_view_map;
+  widget_class->unmap = gtk_icon_view_unmap;
   widget_class->get_request_mode = gtk_icon_view_get_request_mode;
   widget_class->measure = gtk_icon_view_measure;
   widget_class->size_allocate = gtk_icon_view_size_allocate;
@@ -951,7 +955,7 @@ gtk_icon_view_init (GtkIconView *icon_view)
   icon_view->priv->pixbuf_cell = NULL;  
   icon_view->priv->tooltip_column = -1;  
 
-  gtk_widget_set_has_window (GTK_WIDGET (icon_view), TRUE);
+  gtk_widget_set_has_window (GTK_WIDGET (icon_view), FALSE);
   gtk_widget_set_can_focus (GTK_WIDGET (icon_view), TRUE);
 
   icon_view->priv->item_orientation = GTK_ORIENTATION_VERTICAL;
@@ -1255,21 +1259,19 @@ gtk_icon_view_realize (GtkWidget *widget)
 {
   GtkIconView *icon_view = GTK_ICON_VIEW (widget);
   GtkAllocation allocation;
-  GdkWindow *window;
 
-  gtk_widget_set_realized (widget, TRUE);
+  GTK_WIDGET_CLASS (gtk_icon_view_parent_class)->realize (widget);
 
   gtk_widget_get_allocation (widget, &allocation);
 
   /* Make the main, clipping window */
-  window = gdk_window_new_child (gtk_widget_get_parent_window (widget),
-                                 GDK_VISIBILITY_NOTIFY_MASK,
-                                 &allocation);
-  gtk_widget_set_window (widget, window);
-  gtk_widget_register_window (widget, window);
+  icon_view->priv->view_window = gdk_window_new_child (gtk_widget_get_parent_window (widget),
+                                                       GDK_VISIBILITY_NOTIFY_MASK,
+                                                       &allocation);
+  gtk_widget_register_window (widget, icon_view->priv->view_window);
 
   /* Make the window for the icon view */
-  icon_view->priv->bin_window = gdk_window_new_child (window,
+  icon_view->priv->bin_window = gdk_window_new_child (icon_view->priv->view_window,
                                                       gtk_widget_get_events (widget)
                                                       | GDK_SCROLL_MASK
                                                       | GDK_SMOOTH_SCROLL_MASK
@@ -1297,9 +1299,33 @@ gtk_icon_view_unrealize (GtkWidget *widget)
   gdk_window_destroy (icon_view->priv->bin_window);
   icon_view->priv->bin_window = NULL;
 
+  gtk_widget_unregister_window (widget, icon_view->priv->view_window);
+  gdk_window_destroy (icon_view->priv->view_window);
+  icon_view->priv->view_window = NULL;
+
   GTK_WIDGET_CLASS (gtk_icon_view_parent_class)->unrealize (widget);
 }
 
+static void
+gtk_icon_view_map (GtkWidget *widget)
+{
+  GtkIconView *icon_view = GTK_ICON_VIEW (widget);
+
+  gdk_window_show (icon_view->priv->view_window);
+
+  GTK_WIDGET_CLASS (gtk_icon_view_parent_class)->map (widget);
+}
+
+static void
+gtk_icon_view_unmap (GtkWidget *widget)
+{
+  GtkIconView *icon_view = GTK_ICON_VIEW (widget);
+
+  GTK_WIDGET_CLASS (gtk_icon_view_parent_class)->unmap (widget);
+
+  gdk_window_hide (icon_view->priv->view_window);
+}
+
 static gint
 gtk_icon_view_get_n_items (GtkIconView *icon_view)
 {
@@ -1674,7 +1700,7 @@ gtk_icon_view_size_allocate (GtkWidget      *widget,
 
   if (gtk_widget_get_realized (widget))
     {
-      gdk_window_move_resize (gtk_widget_get_window (widget),
+      gdk_window_move_resize (icon_view->priv->view_window,
                              allocation->x, allocation->y,
                              allocation->width, allocation->height);
       gdk_window_resize (icon_view->priv->bin_window,
@@ -6081,15 +6107,12 @@ remove_scroll_timeout (GtkIconView *icon_view)
 static void
 gtk_icon_view_autoscroll (GtkIconView *icon_view)
 {
-  GdkWindow *window;
   gint px, py, width, height;
   gint hoffset, voffset;
 
-  window = gtk_widget_get_window (GTK_WIDGET (icon_view));
-
   px = icon_view->priv->event_last_x;
   py = icon_view->priv->event_last_y;
-  gdk_window_get_geometry (window, NULL, NULL, &width, &height);
+  gdk_window_get_geometry (icon_view->priv->view_window, NULL, NULL, &width, &height);
 
   /* see if we are near the edge. */
   voffset = py - 2 * SCROLL_EDGE_SIZE;
diff --git a/gtk/gtkiconviewprivate.h b/gtk/gtkiconviewprivate.h
index 01f010a..7dcfbc6 100644
--- a/gtk/gtkiconviewprivate.h
+++ b/gtk/gtkiconviewprivate.h
@@ -50,6 +50,7 @@ struct _GtkIconViewPrivate
 
   GtkSelectionMode selection_mode;
 
+  GdkWindow *view_window;
   GdkWindow *bin_window;
 
   GList *children;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]