[Xfce4-commits] [xfce/xfdesktop] 01/34: Initial porting to Gtk 3

noreply at xfce.org noreply at xfce.org
Sun Apr 16 07:06:35 CEST 2017


This is an automated email from the git hooks/post-receive script.

eric pushed a commit to branch master
in repository xfce/xfdesktop.

commit 7b76bb74c0b4956007f699507ec9a9c1a704c863
Author: florian.weigelt <florian.weigelt at mailbox.tu-dresden.de>
Date:   Wed Feb 1 17:04:07 2017 +0100

    Initial porting to Gtk 3
---
 common/xfdesktop-common.h   |   3 +-
 configure.ac.in             |  32 ++++----
 settings/main.c             |   3 +-
 src/gtkcairoblur.c          |  27 -------
 src/xfce-backdrop.c         |   3 +-
 src/xfce-desktop.c          | 187 +++++++++++++++++++-------------------------
 src/xfce-desktop.h          |   6 +-
 src/xfdesktop-application.c |   6 +-
 src/xfdesktop-icon-view.c   | 101 +++++++++++++-----------
 src/xfdesktop-window-icon.c |   3 +-
 10 files changed, 163 insertions(+), 208 deletions(-)

diff --git a/common/xfdesktop-common.h b/common/xfdesktop-common.h
index 9e76e78..59aab6f 100644
--- a/common/xfdesktop-common.h
+++ b/common/xfdesktop-common.h
@@ -38,8 +38,7 @@
 #define DEFAULT_BACKDROP         DATADIR "/backgrounds/xfce/xfce-teal.jpg"
 #define DEFAULT_ICON_FONT_SIZE   12
 #define DEFAULT_ICON_SIZE        48
-#define ITHEME_FLAGS             (GTK_ICON_LOOKUP_USE_BUILTIN \
-                                  | GTK_ICON_LOOKUP_GENERIC_FALLBACK)
+#define ITHEME_FLAGS             (GTK_ICON_LOOKUP_USE_BUILTIN)
 
 #define LIST_TEXT                "# xfce backdrop list"
 #define XFDESKTOP_SELECTION_FMT  "XFDESKTOP_SELECTION_%d"
diff --git a/configure.ac.in b/configure.ac.in
index 6a30789..6cd5d2a 100644
--- a/configure.ac.in
+++ b/configure.ac.in
@@ -5,7 +5,7 @@ dnl
 
 dnl version info
 m4_define([xfdesktop_version_major], [4])
-m4_define([xfdesktop_version_minor], [12])
+m4_define([xfdesktop_version_minor], [13])
 m4_define([xfdesktop_version_micro], [0])
 m4_define([xfdesktop_version_nano], [])
 m4_define([xfdesktop_version_build], [@REVISION@])
@@ -13,18 +13,18 @@ m4_define([xfdesktop_version_tag],[git])
 m4_define([xfdesktop_version], [xfdesktop_version_major().xfdesktop_version_minor().xfdesktop_version_micro()ifelse(xfdesktop_version_nano(), [], [], [.xfdesktop_version_nano()])ifelse(xfdesktop_version_tag(), [git], [xfdesktop_version_tag()-xfdesktop_version_build()], [xfdesktop_version_tag()])])
 
 dnl minimum required versions
-m4_define([glib_minimum_version], [2.30.0])
-m4_define([gtk_minimum_version], [2.24.0])
-m4_define([libxfce4util_minimum_version], [4.10.0])
-m4_define([libxfce4ui_minimum_version], [4.11.1])
-m4_define([xfce_minimum_version], [4.10.0])
-m4_define([garcon_minimum_version], [0.1.2])
-m4_define([exo_minimum_version], [0.7.0])
+m4_define([glib_minimum_version], [2.42.0])
+m4_define([gtk_minimum_version], [3.22.0])
+m4_define([libxfce4util_minimum_version], [4.12.0])
+m4_define([libxfce4ui_minimum_version], [4.12.0])
+m4_define([xfce_minimum_version], [4.12.0])
+m4_define([garcon_minimum_version], [0.5.0])
+m4_define([exo_minimum_version], [0.10.2])
 m4_define([thunar_minimum_version], [1.2.0])
 m4_define([dbus_minimum_version], [0.84])
-m4_define([wnck_minimum_version], [2.30])
+m4_define([wnck_minimum_version], [3.20])
 m4_define([intltool_minimum_version], [0.31])
-m4_define([xfconf_minimum_version], [4.10.0])
+m4_define([xfconf_minimum_version], [4.12.0])
 m4_define([cairo_minimum_version], [1.6])
 
 dnl define a short version string for xfdesktop
@@ -93,15 +93,15 @@ XDT_CHECK_PACKAGE([GIO], [gio-2.0], [glib_minimum_version])
 XDT_CHECK_PACKAGE([GMODULE], [gmodule-2.0], [glib_minimum_version])
 XDT_CHECK_PACKAGE([GOBJECT], [gobject-2.0], [glib_minimum_version])
 XDT_CHECK_PACKAGE([GTHREAD], [gthread-2.0], [glib_minimum_version])
-XDT_CHECK_PACKAGE([GTK], [gtk+-2.0], [gtk_minimum_version])
+XDT_CHECK_PACKAGE([GTK], [gtk+-3.0], [gtk_minimum_version])
 XDT_CHECK_PACKAGE([DBUS], [dbus-glib-1], [dbus_minimum_version])
 XDT_CHECK_PACKAGE([LIBXFCE4UTIL], [libxfce4util-1.0],
                   [libxfce4util_minimum_version])
-XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-1],
+XDT_CHECK_PACKAGE([LIBXFCE4UI], [libxfce4ui-2],
                   [libxfce4ui_minimum_version])
-XDT_CHECK_PACKAGE([LIBWNCK], [libwnck-1.0], [wnck_minimum_version])
+XDT_CHECK_PACKAGE([LIBWNCK], [libwnck-3.0], [wnck_minimum_version])
 XDT_CHECK_PACKAGE([XFCONF], [libxfconf-0], [xfconf_minimum_version])
-XDT_CHECK_PACKAGE([LIBEXO], [exo-1], [exo_minimum_version])
+XDT_CHECK_PACKAGE([LIBEXO], [exo-2], [exo_minimum_version])
 XDT_CHECK_PACKAGE([CAIRO], [cairo], [cairo_minimum_version])
 
 XDT_CHECK_OPTIONAL_PACKAGE([GIO_UNIX], [gio-unix-2.0], [glib_minimum_version], [gio-unix],
@@ -162,10 +162,10 @@ if test "x$ac_cv_enable_desktop_menu" = "xno"; then
     build_desktop_menu="no"
 else
     dnl time for more abuse!
-    XDT_CHECK_PACKAGE([GARCON], [garcon-1],
+    XDT_CHECK_PACKAGE([GARCON], [garcon-2],
                       [garcon_minimum_version], [build_desktop_menu="yes"],
                       [
-echo "*** Optional package garcon-1 was either not found on your system"
+echo "*** Optional package garcon-2 was either not found on your system"
 echo "*** or is too old.  Please install or upgrade to at least version"
 echo "*** garcon_minimum_version, or adjust the PKG_CONFIG_PATH environment variable"
 echo "*** if you installed the new version of the package in a nonstandard"
diff --git a/settings/main.c b/settings/main.c
index d44c6ef..46593af 100644
--- a/settings/main.c
+++ b/settings/main.c
@@ -42,6 +42,7 @@
 
 #include <gdk-pixbuf/gdk-pixbuf.h>
 #include <gtk/gtk.h>
+#include <gtk/gtkx.h>
 #include <gdk/gdkx.h>
 
 #include <glib.h>
@@ -2051,7 +2052,7 @@ xfdesktop_settings_response(GtkWidget *dialog, gint response_id, gpointer user_d
     }
 }
 
-static GdkNativeWindow opt_socket_id = 0;
+static Window opt_socket_id = 0;
 static gboolean opt_version = FALSE;
 static gboolean opt_enable_debug = FALSE;
 static GOptionEntry option_entries[] = {
diff --git a/src/gtkcairoblur.c b/src/gtkcairoblur.c
index 8d57120..2ad5eb8 100644
--- a/src/gtkcairoblur.c
+++ b/src/gtkcairoblur.c
@@ -172,33 +172,6 @@ _boxblur (guchar  *buffer,
 
 static const cairo_user_data_key_t original_cr_key;
 
-static gboolean
-gdk_cairo_get_clip_rectangle (cairo_t      *cr,
-                              cairo_rectangle_int_t *rect)
-{
-  double x1, y1, x2, y2;
-  gboolean clip_exists;
-
-  cairo_clip_extents (cr, &x1, &y1, &x2, &y2);
-
-  clip_exists = x1 < x2 && y1 < y2;
-
-  if (rect)
-  {
-    x1 = floor (x1);
-    y1 = floor (y1);
-    x2 = ceil (x2);
-    y2 = ceil (y2);
-
-    rect->x = CLAMP (x1, G_MININT, G_MAXINT);
-    rect->y = CLAMP (y1, G_MININT, G_MAXINT);
-    rect->width = CLAMP (x2 - x1, G_MININT, G_MAXINT);
-    rect->height = CLAMP (y2 - y1, G_MININT, G_MAXINT);
-  }
-
-  return clip_exists;
-}
-
 cairo_t *
 gtk_css_shadow_value_start_drawing (cairo_t *cr, gdouble radius)
 {
diff --git a/src/xfce-backdrop.c b/src/xfce-backdrop.c
index f9b5501..d451a9d 100644
--- a/src/xfce-backdrop.c
+++ b/src/xfce-backdrop.c
@@ -2114,7 +2114,8 @@ xfce_backdrop_loader_closed_cb(GdkPixbufLoader *loader,
     }
 
     backdrop->priv->animation = gdk_pixbuf_loader_get_animation(loader);
-    backdrop->priv->animation_iter = gdk_pixbuf_animation_get_iter(backdrop->priv->animation, NULL);
+    if(GDK_IS_PIXBUF_ANIMATION(backdrop->priv->animation))
+        backdrop->priv->animation_iter = gdk_pixbuf_animation_get_iter(backdrop->priv->animation, NULL);
 
     /* manually load the first frame */
     xfce_backdrop_create_final_image(backdrop);
diff --git a/src/xfce-desktop.c b/src/xfce-desktop.c
index 8923bd2..892a5a0 100644
--- a/src/xfce-desktop.c
+++ b/src/xfce-desktop.c
@@ -96,7 +96,7 @@ struct _XfceDesktopPriv
     XfconfChannel *channel;
     gchar *property_prefix;
     
-    GdkPixmap *bg_pixmap;
+    cairo_surface_t *bg_surface;
     
     gint nworkspaces;
     XfceWorkspace **workspaces;
@@ -161,12 +161,11 @@ static gboolean xfce_desktop_button_release_event(GtkWidget *widget,
                                                   GdkEventButton *evt);
 static gboolean xfce_desktop_popup_menu(GtkWidget *widget);
 
-static gboolean xfce_desktop_expose(GtkWidget *w,
-                                    GdkEventExpose *evt);
+static gboolean xfce_desktop_draw(GtkWidget *w,
+                                  cairo_t *cr);
 static gboolean xfce_desktop_delete_event(GtkWidget *w,
                                           GdkEventAny *evt);
-static void xfce_desktop_style_set(GtkWidget *w,
-                                   GtkStyle *old_style);
+static void xfce_desktop_style_updated(GtkWidget *w);
 
 static void xfce_desktop_set_single_workspace_mode(XfceDesktop *desktop,
                                                    gboolean single_workspace);
@@ -298,19 +297,20 @@ set_imgfile_root_property(XfceDesktop *desktop, const gchar *filename,
                             gdk_atom_intern(property_name, FALSE));
     }
     
-    gdk_error_trap_pop();
+    gdk_error_trap_pop_ignored();
 }
 
 static void
-set_real_root_window_pixmap(GdkScreen *gscreen,
-                            GdkPixmap *pmap)
+set_real_root_window_surface(GdkScreen *gscreen,
+                            cairo_surface_t *surface)
 {
 #ifndef DISABLE_FOR_BUG7442
     Window xid;
     GdkWindow *groot;
+    cairo_pattern_t *pattern;
     
-    xid = GDK_DRAWABLE_XID(pmap);
     groot = gdk_screen_get_root_window(gscreen);
+    xid = GDK_WINDOW_XID(groot);
     
     gdk_error_trap_push();
     
@@ -319,18 +319,21 @@ set_real_root_window_pixmap(GdkScreen *gscreen,
             gdk_atom_intern("_XROOTPMAP_ID", FALSE),
             gdk_atom_intern("PIXMAP", FALSE), 32,
             GDK_PROP_MODE_REPLACE, (guchar *)&xid, 1);
-    /* and set the root window's BG pixmap, because aterm is somewhat lame. */
-    gdk_window_set_back_pixmap(groot, pmap, FALSE);
+    /* and set the root window's BG surface, because aterm is somewhat lame. */
+    pattern = cairo_pattern_create_for_surface(surface);
+    gdk_window_set_background_pattern(groot, pattern);
+    cairo_pattern_destroy(pattern);
     /* there really should be a standard for this crap... */
 
-    gdk_error_trap_pop();
+    gdk_error_trap_pop_ignored();
 #endif
 }
 
-static GdkPixmap *
-create_bg_pixmap(GdkScreen *gscreen, gpointer user_data)
+static cairo_surface_t *
+create_bg_surface(GdkScreen *gscreen, gpointer user_data)
 {
     XfceDesktop *desktop = user_data;
+    cairo_pattern_t *pattern;
     gint w, h;
 
     TRACE("entering");
@@ -338,7 +341,7 @@ create_bg_pixmap(GdkScreen *gscreen, gpointer user_data)
     g_return_val_if_fail(XFCE_IS_DESKTOP(desktop), NULL);
 
     /* If the workspaces haven't been created yet there's no need to do the
-     * background pixmap */
+     * background surface */
     if(desktop->priv->workspaces == NULL) {
         XF_DEBUG("exiting, desktop->priv->workspaces == NULL");
         return NULL;
@@ -351,28 +354,27 @@ create_bg_pixmap(GdkScreen *gscreen, gpointer user_data)
     gtk_widget_set_size_request(GTK_WIDGET(desktop), w, h);
     gtk_window_resize(GTK_WINDOW(desktop), w, h);
 
-    if(desktop->priv->bg_pixmap)
-        g_object_unref(G_OBJECT(desktop->priv->bg_pixmap));
-    desktop->priv->bg_pixmap = gdk_pixmap_new(GDK_DRAWABLE(gtk_widget_get_window(GTK_WIDGET(desktop))),
-                                              w, h, -1);
+    if(desktop->priv->bg_surface)
+        cairo_surface_destroy(desktop->priv->bg_surface);
+    desktop->priv->bg_surface = gdk_window_create_similar_surface(
+                                    gtk_widget_get_window(GTK_WIDGET(desktop)),
+                                                          CAIRO_CONTENT_COLOR_ALPHA, w, h);
 
-    if(!GDK_IS_PIXMAP(desktop->priv->bg_pixmap))
-        return NULL;
-
-    gdk_window_set_back_pixmap(gtk_widget_get_window(GTK_WIDGET(desktop)),
-                               desktop->priv->bg_pixmap, FALSE);
+    pattern = cairo_pattern_create_for_surface(desktop->priv->bg_surface);
+    gdk_window_set_background_pattern(gtk_widget_get_window(GTK_WIDGET(desktop)), pattern);
+    cairo_pattern_destroy(pattern);
 
-    return desktop->priv->bg_pixmap;
+    return desktop->priv->bg_surface;
 }
 
 static void
 backdrop_changed_cb(XfceBackdrop *backdrop, gpointer user_data)
 {
     XfceDesktop *desktop = XFCE_DESKTOP(user_data);
-    GdkPixmap *pmap = desktop->priv->bg_pixmap;
+    cairo_surface_t *surface = desktop->priv->bg_surface;
     GdkScreen *gscreen = desktop->priv->gscreen;
     GdkRectangle rect;
-    GdkRegion *clip_region = NULL;
+    cairo_region_t *clip_region = NULL;
     gint i, monitor = -1, current_workspace;
 #ifdef G_ENABLE_DEBUG
     gchar *monitor_name = NULL;
@@ -442,7 +444,7 @@ backdrop_changed_cb(XfceBackdrop *backdrop, gpointer user_data)
 
     if(monitor > 0
        && !xfce_workspace_get_xinerama_stretch(desktop->priv->workspaces[current_workspace])) {
-        clip_region = gdk_region_rectangle(&rect);
+        clip_region = cairo_region_create_rectangle(&rect);
 
         XF_DEBUG("clip_region: x: %d, y: %d, w: %d, h: %d",
                  rect.x, rect.y, rect.width, rect.height);
@@ -453,30 +455,30 @@ backdrop_changed_cb(XfceBackdrop *backdrop, gpointer user_data)
          */
         for(i = 0; i < monitor; i++) {
             GdkRectangle previous_monitor;
-            GdkRegion *previous_region;
+            cairo_region_t *previous_region;
             gdk_screen_get_monitor_geometry(gscreen, i, &previous_monitor);
 
             XF_DEBUG("previous_monitor: x: %d, y: %d, w: %d, h: %d",
                      previous_monitor.x, previous_monitor.y,
                      previous_monitor.width, previous_monitor.height);
 
-            previous_region = gdk_region_rectangle(&previous_monitor);
+            previous_region = cairo_region_create_rectangle(&previous_monitor);
 
-            gdk_region_subtract(clip_region, previous_region);
+            cairo_region_subtract(clip_region, previous_region);
 
-            gdk_region_destroy(previous_region);
+            cairo_region_destroy(previous_region);
         }
     }
 
     if(clip_region != NULL) {
         /* Update the area to redraw to limit the icons/area painted */
-        gdk_region_get_clipbox(clip_region, &rect);
+        cairo_region_get_extents(clip_region, &rect);
         XF_DEBUG("area to update: x: %d, y: %d, w: %d, h: %d",
                  rect.x, rect.y, rect.width, rect.height);
     }
 
     if(rect.width != 0 && rect.height != 0) {
-        /* get the composited backdrop pixmap */
+        /* get the composited backdrop pixbuf */
         GdkPixbuf *pix = xfce_backdrop_get_pixbuf(backdrop);
         cairo_t *cr;
 
@@ -485,26 +487,26 @@ backdrop_changed_cb(XfceBackdrop *backdrop, gpointer user_data)
             xfce_backdrop_generate_async(backdrop);
 
             if(clip_region != NULL)
-                gdk_region_destroy(clip_region);
+                cairo_region_destroy(clip_region);
 
             return;
         }
 
-        /* Create the background pixmap if it isn't already */
-        if(!GDK_IS_PIXMAP(pmap)) {
-            pmap = create_bg_pixmap(gscreen, desktop);
+        /* Create the background surface if it isn't already */
+        if(!desktop->priv->bg_surface) {
+            surface = create_bg_surface(gscreen, desktop);
 
-            if(!GDK_IS_PIXMAP(pmap)) {
+            if(!surface) {
                 g_object_unref(pix);
 
                 if(clip_region != NULL)
-                    gdk_region_destroy(clip_region);
+                    cairo_region_destroy(clip_region);
 
                 return;
             }
         }
 
-        cr = gdk_cairo_create(GDK_DRAWABLE(pmap));
+        cr = cairo_create(surface);
         gdk_cairo_set_source_pixbuf(cr, pix, rect.x, rect.y);
 
         /* clip the area so we don't draw over a previous wallpaper */
@@ -524,7 +526,7 @@ backdrop_changed_cb(XfceBackdrop *backdrop, gpointer user_data)
                                   monitor);
 
         /* do this again so apps watching the root win notice the update */
-        set_real_root_window_pixmap(gscreen, pmap);
+        set_real_root_window_surface(gscreen, surface);
 
         g_object_unref(G_OBJECT(pix));
         cairo_destroy(cr);
@@ -532,7 +534,7 @@ backdrop_changed_cb(XfceBackdrop *backdrop, gpointer user_data)
     }
 
     if(clip_region != NULL)
-        gdk_region_destroy(clip_region);
+        cairo_region_destroy(clip_region);
 }
 
 static void
@@ -551,10 +553,10 @@ screen_size_changed_cb(GdkScreen *gscreen, gpointer user_data)
     if(current_workspace < 0)
         return;
 
-    /* release the bg_pixmap since the dimensions may have changed */
-    if(desktop->priv->bg_pixmap) {
-        g_object_unref(desktop->priv->bg_pixmap);
-        desktop->priv->bg_pixmap = NULL;
+    /* release the bg_surface since the dimensions may have changed */
+    if(desktop->priv->bg_surface) {
+        cairo_surface_destroy(desktop->priv->bg_surface);
+        desktop->priv->bg_surface = NULL;
     }
 
     /* special case for 1 backdrop to handle xinerama stretching */
@@ -801,10 +803,10 @@ xfce_desktop_class_init(XfceDesktopClass *klass)
     widget_class->unrealize = xfce_desktop_unrealize;
     widget_class->button_press_event = xfce_desktop_button_press_event;
     widget_class->button_release_event = xfce_desktop_button_release_event;
-    widget_class->expose_event = xfce_desktop_expose;
+    widget_class->draw = xfce_desktop_draw;
     widget_class->delete_event = xfce_desktop_delete_event;
     widget_class->popup_menu = xfce_desktop_popup_menu;
-    widget_class->style_set = xfce_desktop_style_set;
+    widget_class->style_updated = xfce_desktop_style_updated;
     
     signals[SIG_POPULATE_ROOT_MENU] = g_signal_new("populate-root-menu",
                                                    XFCE_TYPE_DESKTOP,
@@ -1143,7 +1145,7 @@ xfce_desktop_unrealize(GtkWidget *widget)
 #ifndef DISABLE_FOR_BUG7442
     gdk_property_delete(groot, gdk_atom_intern("_XROOTPMAP_ID", FALSE));
     gdk_property_delete(groot, gdk_atom_intern("ESETROOT_PMAP_ID", FALSE));
-    gdk_window_set_back_pixmap(groot, NULL, FALSE);
+    gdk_window_set_back_background_pattern(groot, NULL);
 #endif
 
     if(desktop->priv->workspaces) {
@@ -1157,11 +1159,11 @@ xfce_desktop_unrealize(GtkWidget *widget)
     }
 
     gdk_flush();
-    gdk_error_trap_pop();
+    gdk_error_trap_pop_ignored();
 
-    if(desktop->priv->bg_pixmap) {
-        g_object_unref(G_OBJECT(desktop->priv->bg_pixmap));
-        desktop->priv->bg_pixmap = NULL;
+    if(desktop->priv->bg_surface) {
+        cairo_surface_destroy(desktop->priv->bg_surface);
+        desktop->priv->bg_surface = NULL;
     }
     
     gtk_window_set_icon(GTK_WINDOW(widget), NULL);
@@ -1195,11 +1197,12 @@ xfce_desktop_button_press_event(GtkWidget *w,
                 return FALSE;
 #endif
             /* no icons on the desktop, grab the focus and pop up the menu */
-            if(!gtk_widget_has_grab(w))
+            if(!gtk_widget_has_grab(w)) {
                 gtk_grab_add(w);
 
-                xfce_desktop_popup_root_menu(desktop, button, evt->time);
+                xfce_desktop_popup_root_menu(desktop, evt);
                 return TRUE;
+            }
         } else if(button == 2 || (button == 1 && (state & GDK_SHIFT_MASK)
                                   && (state & GDK_CONTROL_MASK)))
         {
@@ -1207,7 +1210,7 @@ xfce_desktop_button_press_event(GtkWidget *w,
             if(!gtk_widget_has_grab(w))
                 gtk_grab_add(w);
 
-            xfce_desktop_popup_secondary_root_menu(desktop, button, evt->time);
+            xfce_desktop_popup_secondary_root_menu(desktop, evt);
             return TRUE;
         }
     }
@@ -1232,44 +1235,31 @@ static gboolean
 xfce_desktop_popup_menu(GtkWidget *w)
 {
     GdkEventButton *evt;
-    guint button, etime;
 
     TRACE("entering");
 
     evt = (GdkEventButton *)gtk_get_current_event();
-    if(evt && GDK_BUTTON_PRESS == evt->type) {
-        button = evt->button;
-        etime = evt->time;
-    } else {
-        button = 0;
-        etime = gtk_get_current_event_time();
-    }
     
-    xfce_desktop_popup_root_menu(XFCE_DESKTOP(w), button, etime);
+    xfce_desktop_popup_root_menu(XFCE_DESKTOP(w), evt);
 
-    gdk_event_free((GdkEvent*)evt);
+    if(evt)
+        gdk_event_free((GdkEvent*)evt);
     return TRUE;
 }
 
 static gboolean
-xfce_desktop_expose(GtkWidget *w,
-                    GdkEventExpose *evt)
+xfce_desktop_draw(GtkWidget *w,
+                  cairo_t *cr)
 {
     GList *children, *l;
     
     /*TRACE("entering");*/
     
-    if(evt->count != 0)
-        return FALSE;
-    
-    gdk_window_clear_area(gtk_widget_get_window(w), evt->area.x, evt->area.y,
-                          evt->area.width, evt->area.height);
-    
     children = gtk_container_get_children(GTK_CONTAINER(w));
     for(l = children; l; l = l->next) {
-        gtk_container_propagate_expose(GTK_CONTAINER(w),
-                                       GTK_WIDGET(l->data),
-                                       evt);
+        gtk_container_propagate_draw(GTK_CONTAINER(w),
+                                     GTK_WIDGET(l->data),
+                                     cr);
     }
     g_list_free(children);
     
@@ -1291,6 +1281,7 @@ static gboolean
 style_refresh_cb(gpointer *w)
 {
     XfceDesktop *desktop = XFCE_DESKTOP(w);
+    cairo_pattern_t *pattern;
     gdouble old_font_size;
 
     TRACE("entering");
@@ -1305,8 +1296,12 @@ style_refresh_cb(gpointer *w)
     if(desktop->priv->workspaces == NULL)
         return FALSE;
 
-    if(GDK_IS_WINDOW(desktop->priv->bg_pixmap))
-        gdk_window_set_back_pixmap(gtk_widget_get_window(GTK_WIDGET(desktop)), desktop->priv->bg_pixmap, FALSE);
+    if(desktop->priv->bg_surface) {
+        pattern = cairo_pattern_create_for_surface(desktop->priv->bg_surface);
+        gdk_window_set_background_pattern(gtk_widget_get_window(GTK_WIDGET(desktop)),
+                                          pattern);
+        cairo_pattern_destroy(pattern);
+    }
 
     gtk_widget_queue_draw(GTK_WIDGET(desktop));
 
@@ -1330,7 +1325,7 @@ style_refresh_cb(gpointer *w)
 #endif
 
 static void
-xfce_desktop_style_set(GtkWidget *w, GtkStyle *old_style)
+xfce_desktop_style_updated(GtkWidget *w)
 {
 #ifdef ENABLE_DESKTOP_ICONS
     XfceDesktop *desktop = XFCE_DESKTOP(w);
@@ -1703,8 +1698,7 @@ xfce_desktop_menu_destroy_idled(gpointer data)
 
 static void
 xfce_desktop_do_menu_popup(XfceDesktop *desktop,
-                           guint button,
-                           guint activate_time,
+                           GdkEventButton *evt,
                            guint populate_signal)
 {
     GdkScreen *screen;
@@ -1737,42 +1731,25 @@ xfce_desktop_do_menu_popup(XfceDesktop *desktop,
 
     gtk_menu_attach_to_widget(GTK_MENU(menu), GTK_WIDGET(desktop), NULL);
 
-    /* Per gtk_menu_popup's documentation "for conflict-resolve initiation of
-     * concurrent requests for mouse/keyboard grab requests." */
-    if(activate_time == 0)
-        activate_time = gtk_get_current_event_time();
-
-    gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, button, activate_time);
+    gtk_menu_popup_at_pointer(GTK_MENU (menu), (GdkEvent *)evt);
 }
 
 void
 xfce_desktop_popup_root_menu(XfceDesktop *desktop,
-                             guint button,
-                             guint activate_time)
+                             GdkEventButton *evt)
 {
     TRACE("entering");
 
-    /* If it's launched by xfdesktop --menu we won't have an event time.
-     * Grab the keyboard focus */
-    if(activate_time == 0)
-        activate_time = xfdesktop_popup_keyboard_grab_available(gtk_widget_get_window(GTK_WIDGET(desktop)));
-
-    xfce_desktop_do_menu_popup(desktop, button, activate_time,
+    xfce_desktop_do_menu_popup(desktop, evt,
                                signals[SIG_POPULATE_ROOT_MENU]);
 
 }
 
 void
 xfce_desktop_popup_secondary_root_menu(XfceDesktop *desktop,
-                                       guint button,
-                                       guint activate_time)
+                                       GdkEventButton *evt)
 {
-    /* If it's launched by xfdesktop --windowlist we won't have an event time.
-     * Grab the keyboard focus */
-    if(activate_time == 0)
-        activate_time = xfdesktop_popup_keyboard_grab_available(gtk_widget_get_window(GTK_WIDGET(desktop)));
-
-    xfce_desktop_do_menu_popup(desktop, button, activate_time,
+    xfce_desktop_do_menu_popup(desktop, evt,
                                signals[SIG_POPULATE_SECONDARY_ROOT_MENU]);
 }
 
diff --git a/src/xfce-desktop.h b/src/xfce-desktop.h
index 640b778..8055a07 100644
--- a/src/xfce-desktop.h
+++ b/src/xfce-desktop.h
@@ -105,11 +105,9 @@ void xfce_desktop_thaw_updates(XfceDesktop *desktop);
 
 
 void xfce_desktop_popup_root_menu(XfceDesktop *desktop,
-                                  guint button,
-                                  guint activate_time);
+                                  GdkEventButton *evt);
 void xfce_desktop_popup_secondary_root_menu(XfceDesktop *desktop,
-                                            guint button,
-                                            guint activate_time);
+                                            GdkEventButton *evt);
 
 void xfce_desktop_refresh(XfceDesktop *desktop, gboolean advance_wallpaper);
 
diff --git a/src/xfdesktop-application.c b/src/xfdesktop-application.c
index 4152f84..f7e2cba 100644
--- a/src/xfdesktop-application.c
+++ b/src/xfdesktop-application.c
@@ -327,7 +327,7 @@ event_forward_to_rootwin(GdkScreen *gscreen, GdkEvent *event)
         xev2.button = xev.button;
     } else
         return;
-    xev.window = GDK_WINDOW_XWINDOW(gdk_screen_get_root_window(gscreen));
+    xev.window = GDK_WINDOW_XID(gdk_screen_get_root_window(gscreen));
     xev.root =  xev.window;
     xev.subwindow = None;
     xev.time = event->button.time;
@@ -511,10 +511,10 @@ cb_xfdesktop_application_menu(GAction  *action,
 
     if(popup_root_menu) {
         xfce_desktop_popup_root_menu(XFCE_DESKTOP(app->desktops[screen_num]),
-                                     0, GDK_CURRENT_TIME);
+                                     NULL);
     } else {
         xfce_desktop_popup_secondary_root_menu(XFCE_DESKTOP(app->desktops[screen_num]),
-                                               0, GDK_CURRENT_TIME);
+                                               NULL);
     }
 }
 
diff --git a/src/xfdesktop-icon-view.c b/src/xfdesktop-icon-view.c
index 0148bf6..d7b20d7 100644
--- a/src/xfdesktop-icon-view.c
+++ b/src/xfdesktop-icon-view.c
@@ -236,12 +236,11 @@ static gboolean xfdesktop_icon_view_motion_notify(GtkWidget *widget,
 static gboolean xfdesktop_icon_view_leave_notify(GtkWidget *widget,
                                                  GdkEventCrossing *evt,
                                                  gpointer user_data);
-static void xfdesktop_icon_view_style_set(GtkWidget *widget,
-                                          GtkStyle *previous_style);
+static void xfdesktop_icon_view_style_updated(GtkWidget *widget);
 static void xfdesktop_icon_view_realize(GtkWidget *widget);
 static void xfdesktop_icon_view_unrealize(GtkWidget *widget);
-static gboolean xfdesktop_icon_view_expose(GtkWidget *widget,
-                                           GdkEventExpose *evt);
+static gboolean xfdesktop_icon_view_draw(GtkWidget *widget,
+                                         cairo_t *cr);
 static void xfdesktop_icon_view_drag_begin(GtkWidget *widget,
                                            GdkDragContext *contest);
 static gboolean xfdesktop_icon_view_drag_motion(GtkWidget *widget,
@@ -416,10 +415,10 @@ xfdesktop_icon_view_class_init(XfdesktopIconViewClass *klass)
     gobject_class->set_property = xfce_icon_view_set_property;
     gobject_class->get_property = xfce_icon_view_get_property;
     
-    widget_class->style_set = xfdesktop_icon_view_style_set;
+    widget_class->style_updated = xfdesktop_icon_view_style_updated;
     widget_class->realize = xfdesktop_icon_view_realize;
     widget_class->unrealize = xfdesktop_icon_view_unrealize;
-    widget_class->expose_event = xfdesktop_icon_view_expose;
+    widget_class->draw = xfdesktop_icon_view_draw;
     widget_class->drag_begin = xfdesktop_icon_view_drag_begin;
     widget_class->drag_motion = xfdesktop_icon_view_drag_motion;
     widget_class->drag_drop = xfdesktop_icon_view_drag_drop;
@@ -689,7 +688,7 @@ xfdesktop_icon_view_class_init(XfdesktopIconViewClass *klass)
 
     xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_Home, 0,
                                          GTK_MOVEMENT_BUFFER_ENDS, -1);
-    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KP_Home, 0,
+    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_KP_Home, 0,
                                          GTK_MOVEMENT_BUFFER_ENDS, -1);
 
     xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_End, 0,
@@ -962,7 +961,7 @@ xfdesktop_icon_view_button_press(GtkWidget *widget,
             /* Since we're not over any icons this won't be the start of a
              * drag so we can pop up menu */
             if(evt->button == 3 || (evt->button == 1 && (evt->state & GDK_SHIFT_MASK))) {
-                xfce_desktop_popup_root_menu(XFCE_DESKTOP(widget), evt->button, evt->time);
+                xfce_desktop_popup_root_menu(XFCE_DESKTOP(widget), evt);
                 return TRUE;
             }
         }
@@ -1068,8 +1067,10 @@ xfdesktop_icon_view_button_release(GtkWidget *widget,
          * now.
          * We pass 0 as the button because the docs say that you must use 0
          * for pop ups other than button press events. */
-        if(icon_l && (icon = icon_l->data))
-            xfce_desktop_popup_root_menu(XFCE_DESKTOP(widget), 0, evt->time);
+        if(icon_l && (icon = icon_l->data)) {
+            evt->button = 0;
+            xfce_desktop_popup_root_menu(XFCE_DESKTOP(widget), evt);
+        }
     }
 
     if(evt->button == 1 && evt->state & GDK_CONTROL_MASK
@@ -1119,7 +1120,7 @@ xfdesktop_icon_view_key_press(GtkWidget *widget,
 
     /* since we're NO_WINDOW, events don't get delivered to us normally,
      * so we have to activate the bindings manually */
-    return gtk_bindings_activate_event(GTK_OBJECT(icon_view), evt);
+    return gtk_bindings_activate_event(G_OBJECT(icon_view), evt);
 }
 
 static gboolean
@@ -1266,7 +1267,7 @@ xfdesktop_icon_view_motion_notify(GtkWidget *widget,
                   || icon_view->priv->definitely_rubber_banding))
     {
         GdkRectangle old_rect, *new_rect, intersect;
-        GdkRegion *region;
+        cairo_region_t *region;
         GList *l;
 
         /* we're dragging with no icon under the cursor -> rubber band start
@@ -1287,13 +1288,13 @@ xfdesktop_icon_view_motion_notify(GtkWidget *widget,
         new_rect->width = ABS(evt->x - icon_view->priv->press_start_x) + 1;
         new_rect->height = ABS(evt->y - icon_view->priv->press_start_y) + 1;
 
-        region = gdk_region_rectangle(&old_rect);
-        gdk_region_union_with_rect(region, new_rect);
+        region = cairo_region_create_rectangle(&old_rect);
+        cairo_region_union_rectangle(region, new_rect);
 
         if(gdk_rectangle_intersect(&old_rect, new_rect, &intersect)
            && intersect.width > 2 && intersect.height > 2)
         {
-            GdkRegion *region_intersect;
+            cairo_region_t *region_intersect;
 
             /* invalidate border too */
             intersect.x += 1;
@@ -1301,13 +1302,13 @@ xfdesktop_icon_view_motion_notify(GtkWidget *widget,
             intersect.y += 1;
             intersect.height -= 2;
 
-            region_intersect = gdk_region_rectangle(&intersect);
-            gdk_region_subtract(region, region_intersect);
-            gdk_region_destroy(region_intersect);
+            region_intersect = cairo_region_create_rectangle(&intersect);
+            cairo_region_subtract(region, region_intersect);
+            cairo_region_destroy(region_intersect);
         }
 
         gdk_window_invalidate_region(gtk_widget_get_window(widget), region, TRUE);
-        gdk_region_destroy(region);
+        cairo_region_destroy(region);
 
         /* update list of selected icons */
 
@@ -1912,8 +1913,7 @@ xfdesktop_icon_view_icon_theme_changed(GtkIconTheme *icon_theme,
 }    
 
 static void
-xfdesktop_icon_view_style_set(GtkWidget *widget,
-                              GtkStyle *previous_style)
+xfdesktop_icon_view_style_updated(GtkWidget *widget)
 {
     XfdesktopIconView *icon_view = XFDESKTOP_ICON_VIEW(widget);
     GtkWidget *dummy;
@@ -2009,8 +2009,7 @@ xfdesktop_icon_view_style_set(GtkWidget *widget,
                          NULL);
     gtk_widget_destroy(dummy);
 
-    GTK_WIDGET_CLASS(xfdesktop_icon_view_parent_class)->style_set(widget,
-                                                                  previous_style);
+    GTK_WIDGET_CLASS(xfdesktop_icon_view_parent_class)->style_updated(widget);
 
     /* do this after we're sure we have a style set */
     if(!icon_view->priv->selection_box_color) {
@@ -2034,7 +2033,10 @@ xfdesktop_icon_view_realize(GtkWidget *widget)
     gtk_widget_set_style(widget,
                          gtk_style_attach(gtk_widget_get_style(widget),
                                           gtk_widget_get_window(widget)));
-    
+    /* we need this call here to initalize some members of icon_view->priv,
+     * those depend on custom style properties */
+    xfdesktop_icon_view_style_updated(widget);
+
     /* there's no reason to start up the manager before we're realized,
      * but we do NOT shut it down if we unrealize, since there may not be
      * a reason to do so.  shutdown occurs in finalize. */
@@ -2058,7 +2060,7 @@ xfdesktop_icon_view_realize(GtkWidget *widget)
     xfdesktop_setup_grids(icon_view);
     
     /* unfortunately GTK_NO_WINDOW widgets don't receive events, with the
-     * exception of expose events. */
+     * exception of draw events. */
     gtk_widget_add_events(icon_view->priv->parent_window,
                           GDK_POINTER_MOTION_HINT_MASK | GDK_KEY_PRESS_MASK
                           | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK
@@ -2177,29 +2179,31 @@ xfdesktop_icon_view_unrealize(GtkWidget *widget)
 }
 
 static gboolean
-xfdesktop_icon_view_expose(GtkWidget *widget,
-                           GdkEventExpose *evt)
+xfdesktop_icon_view_draw(GtkWidget *widget,
+                         cairo_t *cr)
 {
     XfdesktopIconView *icon_view = XFDESKTOP_ICON_VIEW(widget);
-    GdkRectangle *rects = NULL;
+    cairo_rectangle_list_t *rects;
+    cairo_rectangle_int_t temp;
     GdkRectangle clipbox;
-    gint n_rects = 0, i;
+    gint i;
 
     /*TRACE("entering");*/
     
-    if(evt->count != 0)
+    rects = cairo_copy_clip_rectangle_list(cr);
+
+    if(rects->status != CAIRO_STATUS_SUCCESS) {
+        cairo_rectangle_list_destroy (rects);
         return FALSE;
+    }
 
-    gdk_region_get_rectangles(evt->region, &rects, &n_rects);
-    gdk_region_get_clipbox(evt->region, &clipbox);
+    gdk_cairo_get_clip_rectangle(cr, &clipbox);
 
     xfdesktop_icon_view_repaint_icons(icon_view, &clipbox);
 
     if(icon_view->priv->definitely_rubber_banding) {
         GdkRectangle intersect;
-        cairo_t *cr;
 
-        cr = gdk_cairo_create(GDK_DRAWABLE(gtk_widget_get_window(widget)));
         cairo_set_line_width(cr, 1);
         cairo_set_operator(cr, CAIRO_OPERATOR_OVER);
         cairo_set_source_rgba(cr,
@@ -2210,10 +2214,16 @@ xfdesktop_icon_view_expose(GtkWidget *widget,
 
         /* paint each rectangle in the expose region with the rubber
          * band color, semi-transparently */
-        for(i = 0; i < n_rects; ++i) {
-            if(!gdk_rectangle_intersect(&rects[i],
-                                        &icon_view->priv->band_rect,
-                                        &intersect))
+        for(i = 0; i < rects->num_rectangles; ++i) {
+            /* rects only contains cairo_rectangle_t's (with double values) which we
+               cannot use in gdk_rectangle_intersect, so copy those values to temp.
+               If there is a better way please update this part */
+            temp.x = rects->rectangles[i].x;
+            temp.y = rects->rectangles[i].y;
+            temp.width = rects->rectangles[i].width;
+            temp.height = rects->rectangles[i].height;
+
+            if (!gdk_rectangle_intersect(&temp, &icon_view->priv->band_rect, &intersect))
             {
                 continue;
             }
@@ -2237,11 +2247,9 @@ xfdesktop_icon_view_expose(GtkWidget *widget,
 
             cairo_restore(cr);
         }
-
-        cairo_destroy(cr);
     }
 
-    g_free(rects);
+    cairo_rectangle_list_destroy(rects);
 
     return FALSE;
 }
@@ -2745,7 +2753,7 @@ xfdesktop_setup_grids(XfdesktopIconView *icon_view)
     new_size = (guint)icon_view->priv->nrows * icon_view->priv->ncols
                * sizeof(XfdesktopIcon *);
 
-    if(old_size == new_size) {
+    if(old_size == new_size && icon_view->priv->grid_layout != NULL) {
         DBG("old_size == new_size exiting");
         return;
     }
@@ -3138,7 +3146,7 @@ xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view,
 
     playout = icon_view->priv->playout;
 
-    cr = gdk_cairo_create(GDK_DRAWABLE(gtk_widget_get_window(widget)));
+    cr = gdk_cairo_create(gtk_widget_get_window(widget));
     
     if(!xfdesktop_icon_get_extents(icon, &pixbuf_extents,
                                    &text_extents, &total_extents))
@@ -3228,9 +3236,8 @@ xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view,
               text_extents.width, text_extents.height,
               text_extents.x, text_extents.y);
 
-        gtk_paint_layout(gtk_widget_get_style(widget), gtk_widget_get_window(widget),
-                         state, FALSE, area, widget, "label",
-                         text_extents.x, text_extents.y, playout);
+        gtk_render_layout(gtk_widget_get_style_context(widget), cr,
+                          text_extents.x, text_extents.y, playout);
     }
 
 
@@ -3575,7 +3582,7 @@ xfdesktop_get_workarea_single(XfdesktopIconView *icon_view,
             break;
     } while(bytes_after > 0);
     
-    gdk_error_trap_pop();
+    gdk_error_trap_pop_ignored();
     
     return ret;
 }
diff --git a/src/xfdesktop-window-icon.c b/src/xfdesktop-window-icon.c
index e157afd..9bd8eea 100644
--- a/src/xfdesktop-window-icon.c
+++ b/src/xfdesktop-window-icon.c
@@ -27,7 +27,6 @@
 #endif
 
 #include <libwnck/libwnck.h>
-#include <libwnck/window-action-menu.h>
 #include <libxfce4ui/libxfce4ui.h>
 
 #include "xfdesktop-window-icon.h"
@@ -189,7 +188,7 @@ xfdesktop_window_icon_populate_context_menu(XfdesktopIcon *icon,
                                             GtkWidget *menu)
 {
     XfdesktopWindowIcon *window_icon = XFDESKTOP_WINDOW_ICON(icon);
-    GtkWidget *amenu = wnck_create_window_action_menu(window_icon->priv->window);
+    GtkWidget *amenu = wnck_action_menu_new(window_icon->priv->window);
     GtkWidget *mi;
 
     mi = gtk_menu_item_new_with_mnemonic(_("_Window Actions"));

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the Xfce4-commits mailing list