[Xfce4-commits] <xfdesktop:master> Made changes so that DISABLE_DEPRECATED and GSEAL flags can be enabled.

Eric Koegel noreply at xfce.org
Fri Jan 25 12:36:01 CET 2013


Updating branch refs/heads/master
         to 26b9e349bc3497922318bbc5940075d0c497cc8a (commit)
       from 8392598a7a549370a37c1d7a59cd64c4ca7a9329 (commit)

commit 26b9e349bc3497922318bbc5940075d0c497cc8a
Author: Eric Koegel <eric.koegel at gmail.com>
Date:   Sun Dec 23 09:18:09 2012 +0300

    Made changes so that DISABLE_DEPRECATED and GSEAL flags can be enabled.

 common/xfdesktop-common.c         |    6 +-
 settings/main.c                   |   23 ++-
 src/main.c                        |    7 +-
 src/windowlist.c                  |    6 +-
 src/xfce-backdrop.c               |    4 +-
 src/xfce-desktop.c                |   60 +++---
 src/xfdesktop-clipboard-manager.c |   26 ++-
 src/xfdesktop-file-icon-manager.c |   42 +++--
 src/xfdesktop-file-utils.c        |    4 +-
 src/xfdesktop-icon-view.c         |  351 ++++++++++++++++++++++---------------
 10 files changed, 307 insertions(+), 222 deletions(-)

diff --git a/common/xfdesktop-common.c b/common/xfdesktop-common.c
index 64aee8d..34942a5 100644
--- a/common/xfdesktop-common.c
+++ b/common/xfdesktop-common.c
@@ -316,9 +316,9 @@ xfdesktop_check_is_running(Window *xid)
         xscreen = 0;
 
     g_snprintf(selection_name, 100, XFDESKTOP_SELECTION_FMT, xscreen);
-    selection_atom = XInternAtom(GDK_DISPLAY(), selection_name, False);
+    selection_atom = XInternAtom(gdk_x11_get_default_xdisplay(), selection_name, False);
 
-    if((*xid = XGetSelectionOwner(GDK_DISPLAY(), selection_atom)))
+    if((*xid = XGetSelectionOwner(gdk_x11_get_default_xdisplay(), selection_atom)))
         return TRUE;
 
     return FALSE;
@@ -334,7 +334,7 @@ xfdesktop_send_client_message(Window xid, const gchar *msg)
     gtk_widget_realize(win);
 
     gev.type = GDK_CLIENT_EVENT;
-    gev.window = win->window;
+    gev.window = gtk_widget_get_window(win);
     gev.send_event = TRUE;
     gev.message_type = gdk_atom_intern("STRING", FALSE);
     gev.data_format = 8;
diff --git a/settings/main.c b/settings/main.c
index f4ded70..743398d 100644
--- a/settings/main.c
+++ b/settings/main.c
@@ -42,6 +42,7 @@
 
 #include <gdk-pixbuf/gdk-pixbuf.h>
 #include <gtk/gtk.h>
+#include <gdk/gdkx.h>
 
 #include <libxfce4util/libxfce4util.h>
 #include <xfconf/xfconf.h>
@@ -743,7 +744,8 @@ xfdesktop_settings_dialog_populate_image_list(AppearancePanel *panel)
 
     /* generate previews of each image -- the new thread will own
      * the reference on the list store, so let's not unref it here */
-    if(!g_thread_create(xfdesktop_settings_create_all_previews, ls, FALSE, NULL)) {
+    if(!g_thread_try_new("xfdesktop_settings_create_all_previews",
+                         xfdesktop_settings_create_all_previews, ls, NULL)) {
         g_critical("Failed to spawn thread; backdrop previews will be unavailable.");
         g_object_unref(G_OBJECT(ls));
     }
@@ -938,8 +940,9 @@ add_file_button_clicked(GtkWidget *button,
         g_slist_free(filenames);
 
         if(!pdata->iters
-           || !g_thread_create(xfdesktop_settings_create_some_previews,
-                               pdata, FALSE, NULL))
+           || !g_thread_try_new("xfdesktop_settings_create_some_previews",
+                                xfdesktop_settings_create_some_previews,
+                                pdata, NULL))
         {
             if(pdata->iters)
                 g_critical("Unable to create thread for single image preview.");
@@ -1172,14 +1175,15 @@ image_treeview_drag_data_received(GtkWidget *widget,
     pdata->model = g_object_ref(G_OBJECT(model));
 
     if(TARGET_TEXT_URI_LIST != info
-        || selection_data->format != 8
-        || selection_data->length <= 0)
+        || gtk_selection_data_get_format(selection_data) != 8
+        || gtk_selection_data_get_length(selection_data) <= 0)
     {
         gtk_drag_finish(context, FALSE, FALSE, time_);
+        g_free(pdata);
         return;
     }
 
-    p = (gchar *)selection_data->data;
+    p = (gchar *)gtk_selection_data_get_data(selection_data);
     while(*p) {
         if(*p != '#') {
             gchar *q;
@@ -1251,8 +1255,9 @@ image_treeview_drag_data_received(GtkWidget *widget,
     file_added = !!pdata->iters;
 
     if(!pdata->iters
-       || !g_thread_create(xfdesktop_settings_create_some_previews,
-                           pdata, FALSE, NULL))
+       || !g_thread_try_new("xfdesktop_settings_create_some_previews",
+                            xfdesktop_settings_create_some_previews,
+                            pdata, NULL))
     {
         if(pdata->iters)
             g_critical("Unable to create thread for single image preview.");
@@ -1718,7 +1723,7 @@ main(int argc, char **argv)
         gtk_window_present(GTK_WINDOW (dialog));
 
         /* To prevent the settings dialog to be saved in the session */
-        gdk_set_sm_client_id("FAKE ID");
+        gdk_x11_set_sm_client_id("FAKE ID");
 
         gtk_main();
     } else {
diff --git a/src/main.c b/src/main.c
index 76b275b..f8b7063 100644
--- a/src/main.c
+++ b/src/main.c
@@ -253,10 +253,7 @@ main(int argc, char **argv)
     
     /* bind gettext textdomain */
     xfce_textdomain(GETTEXT_PACKAGE, LOCALEDIR, "UTF-8");
-    
-#if defined(ENABLE_FILE_ICONS) || defined(USE_DESKTOP_MENU)
-    g_thread_init(NULL);
-#endif
+
 #ifdef ENABLE_FILE_ICONS
     dbus_g_thread_init();
 #endif
@@ -374,7 +371,7 @@ main(int argc, char **argv)
         menu_attach(XFCE_DESKTOP(desktops[i]));
         windowlist_attach(XFCE_DESKTOP(desktops[i]));
         gtk_widget_show(desktops[i]);
-        gdk_window_lower(desktops[i]->window);
+        gdk_window_lower(gtk_widget_get_window(desktops[i]));
     }
     
     for(i = 0; i < nscreens; ++i) {
diff --git a/src/windowlist.c b/src/windowlist.c
index 32343d6..e337a6e 100644
--- a/src/windowlist.c
+++ b/src/windowlist.c
@@ -61,14 +61,14 @@ set_num_workspaces(GtkWidget *w, gpointer num)
     GdkWindow *groot = gdk_screen_get_root_window(gscreen);
 
     if(!xa_NET_NUMBER_OF_DESKTOPS) {
-        xa_NET_NUMBER_OF_DESKTOPS = XInternAtom(GDK_DISPLAY(),
+        xa_NET_NUMBER_OF_DESKTOPS = XInternAtom(gdk_x11_get_default_xdisplay(),
                 "_NET_NUMBER_OF_DESKTOPS", False);
     }
 
     n = GPOINTER_TO_INT(num);
 
     sev.type = ClientMessage;
-    sev.display = GDK_DISPLAY();
+    sev.display = gdk_x11_get_default_xdisplay();
     sev.format = 32;
     sev.window = GDK_WINDOW_XID(groot);
     sev.message_type = xa_NET_NUMBER_OF_DESKTOPS;
@@ -76,7 +76,7 @@ set_num_workspaces(GtkWidget *w, gpointer num)
 
     gdk_error_trap_push();
 
-    XSendEvent(GDK_DISPLAY(), GDK_WINDOW_XID(groot), False,
+    XSendEvent(gdk_x11_get_default_xdisplay(), GDK_WINDOW_XID(groot), False,
             SubstructureNotifyMask | SubstructureRedirectMask,
             (XEvent *)&sev);
 
diff --git a/src/xfce-backdrop.c b/src/xfce-backdrop.c
index b07492f..4ec88bf 100644
--- a/src/xfce-backdrop.c
+++ b/src/xfce-backdrop.c
@@ -516,7 +516,7 @@ xfce_backdrop_new(GdkVisual *visual)
     g_return_val_if_fail(GDK_IS_VISUAL(visual), NULL);
     
     backdrop = g_object_new(XFCE_TYPE_BACKDROP, NULL);
-    backdrop->priv->bpp = visual->depth;
+    backdrop->priv->bpp = gdk_visual_get_depth(visual);
     
     return backdrop;
 }
@@ -541,7 +541,7 @@ xfce_backdrop_new_with_size(GdkVisual *visual,
     
     backdrop = g_object_new(XFCE_TYPE_BACKDROP, NULL);
     
-    backdrop->priv->bpp = visual->depth;
+    backdrop->priv->bpp = gdk_visual_get_depth(visual);
     backdrop->priv->width = width;
     backdrop->priv->height = height;
 
diff --git a/src/xfce-desktop.c b/src/xfce-desktop.c
index 526ecf7..b3f3d29 100644
--- a/src/xfce-desktop.c
+++ b/src/xfce-desktop.c
@@ -311,6 +311,7 @@ backdrop_changed_cb(XfceBackdrop *backdrop, gpointer user_data)
     XfceDesktop *desktop = XFCE_DESKTOP(user_data);
     GdkPixmap *pmap = desktop->priv->bg_pixmap;
     GdkScreen *gscreen = desktop->priv->gscreen;
+    cairo_t *cr;
     GdkPixbuf *pix;
     GdkRectangle rect;
     guint i;
@@ -320,7 +321,7 @@ backdrop_changed_cb(XfceBackdrop *backdrop, gpointer user_data)
     
     g_return_if_fail(XFCE_IS_DESKTOP(desktop));
     
-    if(desktop->priv->updates_frozen || !GTK_WIDGET_REALIZED(GTK_WIDGET(desktop)))
+    if(desktop->priv->updates_frozen || !gtk_widget_get_realized(GTK_WIDGET(desktop)))
         return;
     
     TRACE("really entering");
@@ -362,11 +363,11 @@ backdrop_changed_cb(XfceBackdrop *backdrop, gpointer user_data)
         gdk_screen_get_monitor_geometry(gscreen, monitor, &rect);
     }
 
-    gdk_draw_pixbuf(GDK_DRAWABLE(pmap), GTK_WIDGET(desktop)->style->black_gc,
-                    pix, 0, 0, rect.x, rect.y,
-                    gdk_pixbuf_get_width(pix), gdk_pixbuf_get_height(pix),
-                    GDK_RGB_DITHER_MAX, 0, 0);
+    cr = gdk_cairo_create(GDK_DRAWABLE(pmap));
+    gdk_cairo_set_source_pixbuf(cr, pix, rect.x, rect.y);
+    cairo_paint(cr);
     g_object_unref(G_OBJECT(pix));
+    cairo_destroy(cr);
     
     /* tell gtk to redraw the repainted area */
     gtk_widget_queue_draw_area(GTK_WIDGET(desktop), rect.x, rect.y,
@@ -419,11 +420,11 @@ screen_size_changed_cb(GdkScreen *gscreen, gpointer user_data)
     
     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(desktop)->window),
+    desktop->priv->bg_pixmap = gdk_pixmap_new(GDK_DRAWABLE(gtk_widget_get_window(GTK_WIDGET(desktop))),
                                               w, h, -1);
     set_real_root_window_pixmap(desktop->priv->gscreen,
                                 desktop->priv->bg_pixmap);
-    gdk_window_set_back_pixmap(GTK_WIDGET(desktop)->window,
+    gdk_window_set_back_pixmap(gtk_widget_get_window(GTK_WIDGET(desktop)),
                                desktop->priv->bg_pixmap, FALSE);
     
     /* special case for 1 backdrop to handle xinerama stretching */
@@ -526,26 +527,26 @@ screen_set_selection(XfceDesktop *desktop)
     gchar selection_name[100];
     Atom selection_atom, manager_atom;
     
-    xwin = GDK_WINDOW_XID(GTK_WIDGET(desktop)->window);
+    xwin = GDK_WINDOW_XID(gtk_widget_get_window(GTK_WIDGET(desktop)));
     xscreen = gdk_screen_get_number(desktop->priv->gscreen);
     
     g_snprintf(selection_name, 100, XFDESKTOP_SELECTION_FMT, xscreen);
-    selection_atom = XInternAtom(GDK_DISPLAY(), selection_name, False);
-    manager_atom = XInternAtom(GDK_DISPLAY(), "MANAGER", False);
+    selection_atom = XInternAtom(gdk_x11_get_default_xdisplay(), selection_name, False);
+    manager_atom = XInternAtom(gdk_x11_get_default_xdisplay(), "MANAGER", False);
 
     /* the previous check in src/main.c occurs too early, so workaround by
      * adding this one. */
-   if(XGetSelectionOwner(GDK_DISPLAY(), selection_atom) != None) {
+   if(XGetSelectionOwner(gdk_x11_get_default_xdisplay(), selection_atom) != None) {
        g_warning("%s: already running, quitting.", PACKAGE);
        exit(0);
    }
 
-    XSelectInput(GDK_DISPLAY(), xwin, PropertyChangeMask | ButtonPressMask);
-    XSetSelectionOwner(GDK_DISPLAY(), selection_atom, xwin, GDK_CURRENT_TIME);
+    XSelectInput(gdk_x11_get_default_xdisplay(), xwin, PropertyChangeMask | ButtonPressMask);
+    XSetSelectionOwner(gdk_x11_get_default_xdisplay(), selection_atom, xwin, GDK_CURRENT_TIME);
 
     /* Check to see if we managed to claim the selection. If not,
      * we treat it as if we got it then immediately lost it */
-    if(XGetSelectionOwner(GDK_DISPLAY(), selection_atom) == xwin) {
+    if(XGetSelectionOwner(gdk_x11_get_default_xdisplay(), selection_atom) == xwin) {
         XClientMessageEvent xev;
         Window xroot = GDK_WINDOW_XID(gdk_screen_get_root_window(desktop->priv->gscreen));
         
@@ -559,7 +560,7 @@ screen_set_selection(XfceDesktop *desktop)
         xev.data.l[3] = 0;    /* manager specific data */
         xev.data.l[4] = 0;    /* manager specific data */
 
-        XSendEvent(GDK_DISPLAY(), xroot, False, StructureNotifyMask, (XEvent *)&xev);
+        XSendEvent(gdk_x11_get_default_xdisplay(), xroot, False, StructureNotifyMask, (XEvent *)&xev);
     } else {
         g_error("%s: could not set selection ownership", PACKAGE);
         exit(1);
@@ -669,7 +670,6 @@ xfce_desktop_init(XfceDesktop *desktop)
 {
     desktop->priv = G_TYPE_INSTANCE_GET_PRIVATE(desktop, XFCE_TYPE_DESKTOP,
                                                 XfceDesktopPriv);
-    GTK_WINDOW(desktop)->type = GTK_WINDOW_TOPLEVEL;
     
     gtk_window_set_type_hint(GTK_WINDOW(desktop), GDK_WINDOW_TYPE_HINT_DESKTOP);
     gtk_window_set_accept_focus(GTK_WINDOW(desktop), FALSE);
@@ -798,12 +798,12 @@ xfce_desktop_realize(GtkWidget *widget)
     gtk_window_move(GTK_WINDOW(desktop), 0, 0);
     
     atom = gdk_atom_intern("_NET_WM_WINDOW_TYPE_DESKTOP", FALSE);
-    gdk_property_change(GTK_WIDGET(desktop)->window,
+    gdk_property_change(gtk_widget_get_window(GTK_WIDGET(desktop)),
             gdk_atom_intern("_NET_WM_WINDOW_TYPE", FALSE),
             gdk_atom_intern("ATOM", FALSE), 32,
             GDK_PROP_MODE_REPLACE, (guchar *)&atom, 1);
 
-    xid = GDK_WINDOW_XID(GTK_WIDGET(desktop)->window);
+    xid = GDK_WINDOW_XID(gtk_widget_get_window(GTK_WIDGET(desktop)));
     groot = gdk_screen_get_root_window(desktop->priv->gscreen);
     
     gdk_property_change(groot,
@@ -852,9 +852,9 @@ xfce_desktop_unrealize(GtkWidget *widget)
                                              desktop);
     }
     
-    if(GTK_WIDGET_MAPPED(widget))
+    if(gtk_widget_get_mapped(widget))
         gtk_widget_unmap(widget);
-    GTK_WIDGET_UNSET_FLAGS(widget, GTK_MAPPED);
+    gtk_widget_set_mapped(widget, FALSE);
     
     gtk_container_forall(GTK_CONTAINER(widget),
                          (GtkCallback)gtk_widget_unrealize,
@@ -895,13 +895,13 @@ xfce_desktop_unrealize(GtkWidget *widget)
     
     gtk_window_set_icon(GTK_WINDOW(widget), NULL);
     
-    gtk_style_detach(widget->style);
-    g_object_unref(G_OBJECT(widget->window));
-    widget->window = NULL;
+    gtk_style_detach(gtk_widget_get_style(widget));
+    g_object_unref(G_OBJECT(gtk_widget_get_window(widget)));
+    gtk_widget_set_window(widget, NULL);
     
     gtk_selection_remove_all(widget);
     
-    GTK_WIDGET_UNSET_FLAGS(widget, GTK_REALIZED);
+    gtk_widget_set_realized(widget, FALSE);
 }
 
 static gboolean
@@ -964,7 +964,7 @@ xfce_desktop_expose(GtkWidget *w,
     if(evt->count != 0)
         return FALSE;
     
-    gdk_window_clear_area(w->window, evt->area.x, evt->area.y,
+    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));
@@ -998,7 +998,7 @@ xfce_desktop_style_set(GtkWidget *w,
 #endif
     
     if(GDK_IS_WINDOW(desktop->priv->bg_pixmap))
-        gdk_window_set_back_pixmap(w->window, desktop->priv->bg_pixmap, FALSE);
+        gdk_window_set_back_pixmap(gtk_widget_get_window(w), desktop->priv->bg_pixmap, FALSE);
     gtk_widget_queue_draw(w);
 
 #ifdef ENABLE_DESKTOP_ICONS
@@ -1279,7 +1279,7 @@ xfce_desktop_set_icon_style(XfceDesktop *desktop,
     }
     
     desktop->priv->icons_style = style;
-    if(GTK_WIDGET_REALIZED(desktop))
+    if(gtk_widget_get_realized(GTK_WIDGET(desktop)))
         xfce_desktop_setup_icon_view(desktop);
 #endif
 }
@@ -1380,7 +1380,7 @@ xfce_desktop_thaw_updates(XfceDesktop *desktop)
     g_return_if_fail(XFCE_IS_DESKTOP(desktop));
     
     desktop->priv->updates_frozen = FALSE;
-    if(GTK_WIDGET_REALIZED(desktop))
+    if(gtk_widget_get_realized(GTK_WIDGET(desktop)))
         xfce_desktop_monitors_changed(desktop->priv->gscreen, desktop);
 }
 
@@ -1389,7 +1389,7 @@ xfce_desktop_peek_backdrop(XfceDesktop *desktop,
                            guint monitor)
 {
     g_return_val_if_fail(XFCE_IS_DESKTOP(desktop)
-                         && GTK_WIDGET_REALIZED(GTK_WIDGET(desktop))
+                         && gtk_widget_get_realized(GTK_WIDGET(desktop))
                          && monitor < desktop->priv->nbackdrops, NULL);
     return desktop->priv->backdrops[monitor];
 }
@@ -1474,7 +1474,7 @@ xfce_desktop_refresh(XfceDesktop *desktop)
 
     g_return_if_fail(XFCE_IS_DESKTOP(desktop));
 
-    if(!GTK_WIDGET_REALIZED(desktop))
+    if(!gtk_widget_get_realized(GTK_WIDGET(desktop)))
         return;
 
     /* reload image */
diff --git a/src/xfdesktop-clipboard-manager.c b/src/xfdesktop-clipboard-manager.c
index ed90aa0..d5d8e50 100644
--- a/src/xfdesktop-clipboard-manager.c
+++ b/src/xfdesktop-clipboard-manager.c
@@ -237,8 +237,12 @@ xfdesktop_clipboard_manager_finalize (GObject *object)
   g_list_free (manager->files);
 
   /* disconnect from the clipboard */
-  g_signal_handlers_disconnect_by_func (G_OBJECT (manager->clipboard), xfdesktop_clipboard_manager_owner_changed, manager);
-  g_object_set_qdata (G_OBJECT (manager->clipboard), xfdesktop_clipboard_manager_quark, NULL);
+  g_signal_handlers_disconnect_by_func (G_OBJECT (manager->clipboard),
+                                        xfdesktop_clipboard_manager_owner_changed,
+                                        manager);
+  g_object_set_qdata (G_OBJECT (manager->clipboard),
+                      xfdesktop_clipboard_manager_quark,
+                      NULL);
   g_object_unref (G_OBJECT (manager->clipboard));
 
   (*G_OBJECT_CLASS (xfdesktop_clipboard_manager_parent_class)->finalize) (object);
@@ -322,11 +326,11 @@ xfdesktop_clipboard_manager_contents_received (GtkClipboard     *clipboard,
   gchar                          *data;
 
   /* check whether the retrieval worked */
-  if (G_LIKELY (selection_data->length > 0))
+  if (G_LIKELY (gtk_selection_data_get_length(selection_data) > 0))
     {
       /* be sure the selection data is zero-terminated */
-      data = (gchar *) selection_data->data;
-      data[selection_data->length] = '\0';
+      data = (gchar *) gtk_selection_data_get_data(selection_data);
+      data[gtk_selection_data_get_length(selection_data)] = '\0';
 
       /* check whether to copy or move */
       if (g_ascii_strncasecmp (data, "copy\n", 5) == 0)
@@ -473,12 +477,20 @@ xfdesktop_clipboard_manager_get_callback (GtkClipboard     *clipboard,
     {
     case TARGET_GNOME_COPIED_FILES:
       data = g_strconcat (manager->files_cutted ? "cut\n" : "copy\n", string_list, NULL);
-      gtk_selection_data_set (selection_data, selection_data->target, 8, (guchar *) data, strlen (data));
+      gtk_selection_data_set (selection_data,
+                              gtk_selection_data_get_target(selection_data),
+                              8,
+                              (guchar *) data,
+                              strlen (data));
       g_free (data);
       break;
 
     case TARGET_UTF8_STRING:
-      gtk_selection_data_set (selection_data, selection_data->target, 8, (guchar *) string_list, strlen (string_list));
+      gtk_selection_data_set (selection_data,
+                              gtk_selection_data_get_target(selection_data),
+                              8,
+                              (guchar *) string_list,
+                              strlen (string_list));
       break;
 
     default:
diff --git a/src/xfdesktop-file-icon-manager.c b/src/xfdesktop-file-icon-manager.c
index 72b6d09..d5e9ce3 100644
--- a/src/xfdesktop-file-icon-manager.c
+++ b/src/xfdesktop-file-icon-manager.c
@@ -1150,7 +1150,7 @@ xfdesktop_file_icon_menu_fill_template_menu(GtkWidget *menu,
                            || have_templates;
 
           /* check if any items were added to the submenu */
-          if (GTK_MENU_SHELL(submenu)->children)
+          if (gtk_menu_item_get_submenu(GTK_MENU_ITEM(submenu)))
             {
               /* create a new menu item for the submenu */
               item = gtk_image_menu_item_new_with_label (g_file_info_get_display_name(info));
@@ -2860,7 +2860,7 @@ xfdesktop_file_icon_manager_drag_drop(XfdesktopIconViewManager *manager,
         } else
             source_file = fmanager->priv->folder;
         
-        if(gdk_property_get(context->source_window,
+        if(gdk_property_get(gdk_drag_context_get_source_window(context),
                             gdk_atom_intern("XdndDirectSave0", FALSE),
                             gdk_atom_intern("text/plain", FALSE),
                             0, 1024, FALSE, NULL, NULL, &prop_len,
@@ -2873,7 +2873,7 @@ xfdesktop_file_icon_manager_drag_drop(XfdesktopIconViewManager *manager,
             uri = g_file_get_uri(file);
             g_object_unref(file);
             
-            gdk_property_change(context->source_window,
+            gdk_property_change(gdk_drag_context_get_source_window(context),
                                 gdk_atom_intern("XdndDirectSave0", FALSE),
                                 gdk_atom_intern("text/plain", FALSE), 8,
                                 GDK_PROP_MODE_REPLACE, (const guchar *)uri,
@@ -2917,6 +2917,7 @@ static void xfdesktop_dnd_item_cancel(GtkWidget *item, GdkDragAction *action)
  * @manager     : the #XfdesktopIconViewManager instance
  * @drop_icon   : the #XfdesktopIcon to which is being dropped.
  * @context     : the #GdkDragContext of the icons being dropped.
+ * @action      : the #GdkDragAction that the user selected. [out]
  * @row         : the row on the desktop to drop to.
  * @col         : the col on the desktop to drop to.
  * @ time_      : the starting time of the drag event.
@@ -2930,6 +2931,7 @@ static void xfdesktop_dnd_item_cancel(GtkWidget *item, GdkDragAction *action)
 static void xfdesktop_dnd_menu (XfdesktopIconViewManager *manager,
                                 XfdesktopIcon *drop_icon,
                                 GdkDragContext *context,
+                                GdkDragAction *action,
                                 guint16 row,
                                 guint16 col,
                                 guint time_)
@@ -2983,7 +2985,7 @@ static void xfdesktop_dnd_menu (XfdesktopIconViewManager *manager,
     g_signal_handler_disconnect(G_OBJECT(menu), signal_id);
     g_main_loop_unref(loop);
 
-    context->action = response;
+    *action = response;
 
     g_object_unref(G_OBJECT(menu));
 }
@@ -3004,14 +3006,17 @@ xfdesktop_file_icon_manager_drag_data_received(XfdesktopIconViewManager *manager
     GFile *tfile = NULL;
     gboolean copy_only = TRUE, drop_ok = FALSE;
     GList *file_list;
+    GdkDragAction action;
     gboolean user_selected_action = FALSE;
 
     TRACE("entering");
 
-    if(context->action == GDK_ACTION_ASK) {
-        xfdesktop_dnd_menu(manager, drop_icon, context, row, col, time_);
+    action = gdk_drag_context_get_selected_action(context);
 
-        if(context->action == 0) {
+    if(action == GDK_ACTION_ASK) {
+        xfdesktop_dnd_menu(manager, drop_icon, context, &action, row, col, time_);
+
+        if(action == 0) {
             gtk_drag_finish(context, FALSE, FALSE, time_);
             return;
         }
@@ -3023,16 +3028,13 @@ xfdesktop_file_icon_manager_drag_data_received(XfdesktopIconViewManager *manager
         /* we don't suppose XdndDirectSave stage 3, result F, i.e., the app
          * has to save the data itself given the filename we provided in
          * stage 1 */
-        if(8 == data->format && 1 == data->length && 'F' == data->data[0]) {
-            gdk_property_change(context->source_window,
+        if(8 == gtk_selection_data_get_format(data)
+           && 1 == gtk_selection_data_get_length(data)
+           && 'F' == gtk_selection_data_get_data(data)[0]) {
+            gdk_property_change(gdk_drag_context_get_source_window(context),
                                 gdk_atom_intern("XdndDirectSave0", FALSE),
                                 gdk_atom_intern("text/plain", FALSE), 8,
                                 GDK_PROP_MODE_REPLACE, (const guchar *)"", 0);
-        } else if(8 == data->format && data->length == 1
-                  && 'S' == data->data[0])
-        {
-            /* FIXME: do we really need to do anything here?  xfdesktop should
-             * detect when something changes on its own */
         }
         
         drop_ok = TRUE;
@@ -3049,7 +3051,7 @@ xfdesktop_file_icon_manager_drag_data_received(XfdesktopIconViewManager *manager
             source_file = fmanager->priv->folder;
         
         if(source_file && exo_desktop_item_edit) {
-            gchar **parts = g_strsplit((const gchar *)data->data, "\n", -1);
+            gchar **parts = g_strsplit((const gchar *)gtk_selection_data_get_data(data), "\n", -1);
             
             if(2 == g_strv_length(parts)) {
                 gchar *cwd = g_file_get_uri(source_file);
@@ -3090,14 +3092,14 @@ xfdesktop_file_icon_manager_drag_data_received(XfdesktopIconViewManager *manager
             tinfo = xfdesktop_file_icon_peek_file_info(file_icon);
         }
         
-        copy_only = (context->action == GDK_ACTION_COPY);
+        copy_only = (action == GDK_ACTION_COPY);
         
         if(tfile && g_file_has_uri_scheme(tfile, "trash") && copy_only) {
             gtk_drag_finish(context, FALSE, FALSE, time_);
             return;
         }
         
-        file_list = xfdesktop_file_utils_file_list_from_string((const gchar *)data->data);
+        file_list = xfdesktop_file_utils_file_list_from_string((const gchar *)gtk_selection_data_get_data(data));
         if(file_list) {
             GtkWidget *toplevel = gtk_widget_get_toplevel(GTK_WIDGET(fmanager->priv->icon_view));
 
@@ -3162,7 +3164,7 @@ xfdesktop_file_icon_manager_drag_data_received(XfdesktopIconViewManager *manager
                                             G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE))
                         {
                             copy_only = FALSE;
-                            context->action = GDK_ACTION_MOVE;
+                            action = GDK_ACTION_MOVE;
                         }
                     }
 
@@ -3195,7 +3197,7 @@ xfdesktop_file_icon_manager_drag_data_received(XfdesktopIconViewManager *manager
                 if(dest_file_list) {
                     dest_file_list = g_list_reverse(dest_file_list);
 
-                    drop_ok = xfdesktop_file_utils_transfer_files(context->action, 
+                    drop_ok = xfdesktop_file_utils_transfer_files(action,
                                                                   file_list, 
                                                                   dest_file_list,
                                                                   fmanager->priv->gscreen);
@@ -3235,7 +3237,7 @@ xfdesktop_file_icon_manager_drag_data_get(XfdesktopIconViewManager *manager,
     file_list = xfdesktop_file_utils_file_icon_list_to_file_list(drag_icons);
     str = xfdesktop_file_utils_file_list_to_string(file_list);
 
-    gtk_selection_data_set(data, data->target, 8, (guchar *)str, strlen(str));
+    gtk_selection_data_set(data, gtk_selection_data_get_target(data), 8, (guchar *)str, strlen(str));
     
     g_free(str);
     xfdesktop_file_utils_file_list_free(file_list);
diff --git a/src/xfdesktop-file-utils.c b/src/xfdesktop-file-utils.c
index 2670bbd..ed721d9 100644
--- a/src/xfdesktop-file-utils.c
+++ b/src/xfdesktop-file-utils.c
@@ -585,12 +585,12 @@ xfdesktop_file_utils_set_window_cursor(GtkWindow *window,
 {
     GdkCursor *cursor;
 
-    if(!window || !GTK_WIDGET(window)->window)
+    if(!window || !gtk_widget_get_window(GTK_WIDGET(window)))
         return;
 
     cursor = gdk_cursor_new(cursor_type);
     if(G_LIKELY(cursor)) {
-        gdk_window_set_cursor(GTK_WIDGET(window)->window, cursor);
+        gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(window)), cursor);
         gdk_cursor_unref(cursor);
     }
 }
diff --git a/src/xfdesktop-icon-view.c b/src/xfdesktop-icon-view.c
index 1ea1296..5c62478 100644
--- a/src/xfdesktop-icon-view.c
+++ b/src/xfdesktop-icon-view.c
@@ -304,6 +304,8 @@ static void xfdesktop_screen_size_changed_cb(GdkScreen *gscreen,
 static GdkFilterReturn xfdesktop_rootwin_watch_workarea(GdkXEvent *gxevent,
                                                         GdkEvent *event,
                                                         gpointer user_data);
+static void xfdesktop_move_all_icons_to_pending_icons_list(XfdesktopIconView *icon_view);
+static void xfdesktop_move_all_pending_icons_to_desktop(XfdesktopIconView* icon_view);
 static void xfdesktop_grid_do_resize(XfdesktopIconView *icon_view);
 static inline gboolean xfdesktop_rectangle_contains_point(GdkRectangle *rect,
                                                           gint x,
@@ -372,7 +374,7 @@ xfdesktop_icon_view_class_init(XfdesktopIconViewClass *klass)
     GtkWidgetClass *widget_class = (GtkWidgetClass *)klass;
     GtkBindingSet *binding_set;
 
-    binding_set = gtk_binding_set_by_class(klass); //g_type_class_peek(g_type_from_name("XfceDesktop")));
+    binding_set = gtk_binding_set_by_class(klass);
     
     g_type_class_add_private(klass, sizeof(XfdesktopIconViewPrivate));
     
@@ -585,61 +587,61 @@ xfdesktop_icon_view_class_init(XfdesktopIconViewClass *klass)
 #undef XFDESKTOP_PARAM_FLAGS
 
     /* same binding entries as GtkIconView */
-    gtk_binding_entry_add_signal(binding_set, GDK_a, GDK_CONTROL_MASK,
+    gtk_binding_entry_add_signal(binding_set, GDK_KEY_a, GDK_CONTROL_MASK,
                                  "select-all", 0);
-    gtk_binding_entry_add_signal(binding_set, GDK_a,
+    gtk_binding_entry_add_signal(binding_set, GDK_KEY_a,
                                  GDK_CONTROL_MASK | GDK_SHIFT_MASK,
                                  "unselect-all", 0);
-    gtk_binding_entry_add_signal(binding_set, GDK_space, GDK_CONTROL_MASK, 
+    gtk_binding_entry_add_signal(binding_set, GDK_KEY_space, GDK_CONTROL_MASK,
                                  "toggle-cursor-item", 0);
-    gtk_binding_entry_add_signal(binding_set, GDK_KP_Space, GDK_CONTROL_MASK,
+    gtk_binding_entry_add_signal(binding_set, GDK_KEY_KP_Space, GDK_CONTROL_MASK,
                                  "toggle-cursor-item", 0);
 
-    gtk_binding_entry_add_signal(binding_set, GDK_space, 0,
+    gtk_binding_entry_add_signal(binding_set, GDK_KEY_space, 0,
                                  "activate-cursor-item", 0);
-    gtk_binding_entry_add_signal(binding_set, GDK_KP_Space, 0,
+    gtk_binding_entry_add_signal(binding_set, GDK_KEY_KP_Space, 0,
                                  "activate-cursor-item", 0);
-    gtk_binding_entry_add_signal(binding_set, GDK_Return, 0, 
+    gtk_binding_entry_add_signal(binding_set, GDK_KEY_Return, 0,
                                  "activate-cursor-item", 0);
-    gtk_binding_entry_add_signal(binding_set, GDK_ISO_Enter, 0, 
+    gtk_binding_entry_add_signal(binding_set, GDK_KEY_ISO_Enter, 0,
                                  "activate-cursor-item", 0);
-    gtk_binding_entry_add_signal(binding_set, GDK_KP_Enter, 0, 
+    gtk_binding_entry_add_signal(binding_set, GDK_KEY_KP_Enter, 0,
                                  "activate-cursor-item", 0);
 
-    xfdesktop_icon_view_add_move_binding(binding_set, GDK_Up, 0,
+    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_Up, 0,
                                          GTK_MOVEMENT_DISPLAY_LINES, -1);
-    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KP_Up, 0,
+    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_KP_Up, 0,
                                          GTK_MOVEMENT_DISPLAY_LINES, -1);
 
-    xfdesktop_icon_view_add_move_binding(binding_set, GDK_Down, 0,
+    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_Down, 0,
                                          GTK_MOVEMENT_DISPLAY_LINES, 1);
-    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KP_Down, 0,
+    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_KP_Down, 0,
                                          GTK_MOVEMENT_DISPLAY_LINES, 1);
 
-    xfdesktop_icon_view_add_move_binding(binding_set, GDK_p, GDK_CONTROL_MASK,
+    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_p, GDK_CONTROL_MASK,
                                          GTK_MOVEMENT_DISPLAY_LINES, -1);
 
-    xfdesktop_icon_view_add_move_binding(binding_set, GDK_n, GDK_CONTROL_MASK,
+    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_n, GDK_CONTROL_MASK,
                                          GTK_MOVEMENT_DISPLAY_LINES, 1);
 
-    xfdesktop_icon_view_add_move_binding(binding_set, GDK_Home, 0,
+    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,
                                          GTK_MOVEMENT_BUFFER_ENDS, -1);
 
-    xfdesktop_icon_view_add_move_binding(binding_set, GDK_End, 0,
+    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_End, 0,
                                          GTK_MOVEMENT_BUFFER_ENDS, 1);
-    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KP_End, 0,
+    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_KP_End, 0,
                                          GTK_MOVEMENT_BUFFER_ENDS, 1);
 
-    xfdesktop_icon_view_add_move_binding(binding_set, GDK_Right, 0, 
+    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_Right, 0,
                                          GTK_MOVEMENT_VISUAL_POSITIONS, 1);
-    xfdesktop_icon_view_add_move_binding(binding_set, GDK_Left, 0, 
+    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_Left, 0,
                                          GTK_MOVEMENT_VISUAL_POSITIONS, -1);
 
-    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KP_Right, 0, 
+    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_KP_Right, 0,
                                          GTK_MOVEMENT_VISUAL_POSITIONS, 1);
-    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KP_Left, 0, 
+    xfdesktop_icon_view_add_move_binding(binding_set, GDK_KEY_KP_Left, 0,
                                          GTK_MOVEMENT_VISUAL_POSITIONS, -1);
 
     xfdesktop_cell_highlight_quark = g_quark_from_static_string("xfdesktop-icon-view-cell-highlight");
@@ -673,7 +675,7 @@ xfdesktop_icon_view_init(XfdesktopIconView *icon_view)
     g_signal_connect(G_OBJECT(icon_view), "query-tooltip",
                      G_CALLBACK(xfdesktop_icon_view_show_tooltip), NULL);
     
-    GTK_WIDGET_SET_FLAGS(GTK_WIDGET(icon_view), GTK_NO_WINDOW);
+    gtk_widget_set_has_window(GTK_WIDGET(icon_view), FALSE);
 }
 
 static void
@@ -751,7 +753,7 @@ xfdesktop_icon_view_add_move_binding(GtkBindingSet *binding_set,
                                  G_TYPE_INT, count);
 
     gtk_binding_entry_add_signal(binding_set, keyval, GDK_SHIFT_MASK,
-                                 "move-cursor", 2,
+                                 I_("move-cursor"), 2,
                                  G_TYPE_ENUM, step,
                                  G_TYPE_INT, count);
 
@@ -760,12 +762,12 @@ xfdesktop_icon_view_add_move_binding(GtkBindingSet *binding_set,
 
     gtk_binding_entry_add_signal(binding_set, keyval,
                                  GDK_CONTROL_MASK | GDK_SHIFT_MASK,
-                                 "move-cursor", 2,
+                                 I_("move-cursor"), 2,
                                  G_TYPE_ENUM, step,
                                  G_TYPE_INT, count);
 
     gtk_binding_entry_add_signal(binding_set, keyval, GDK_CONTROL_MASK,
-                                 "move-cursor", 2,
+                                 I_("move-cursor"), 2,
                                  G_TYPE_ENUM, step,
                                  G_TYPE_INT, count);
 }
@@ -960,7 +962,7 @@ xfdesktop_icon_view_focus_in(GtkWidget *widget,
     XfdesktopIconView *icon_view = XFDESKTOP_ICON_VIEW(user_data);
     GList *l;
     
-    GTK_WIDGET_SET_FLAGS(GTK_WIDGET(icon_view), GTK_HAS_FOCUS);
+    gtk_widget_grab_focus(GTK_WIDGET(icon_view));
     DBG("GOT FOCUS");
     
     for(l = icon_view->priv->selected_icons; l; l = l->next) {
@@ -978,7 +980,6 @@ xfdesktop_icon_view_focus_out(GtkWidget *widget,
     XfdesktopIconView *icon_view = XFDESKTOP_ICON_VIEW(user_data);
     GList *l;
     
-    GTK_WIDGET_UNSET_FLAGS(GTK_WIDGET(icon_view), GTK_HAS_FOCUS);
     DBG("LOST FOCUS");
 
     for(l = icon_view->priv->selected_icons; l; l = l->next) {
@@ -986,8 +987,8 @@ xfdesktop_icon_view_focus_out(GtkWidget *widget,
     }
 
     if(G_UNLIKELY(icon_view->priv->single_click)) {
-        if(G_LIKELY(icon_view->priv->parent_window->window != NULL)) {
-            gdk_window_set_cursor(icon_view->priv->parent_window->window, NULL);
+        if(G_LIKELY(gtk_widget_get_window(GTK_WIDGET(icon_view->priv->parent_window)) != NULL)) {
+            gdk_window_set_cursor(gtk_widget_get_window(GTK_WIDGET(icon_view->priv->parent_window)), NULL);
         }
     }
 
@@ -1125,7 +1126,7 @@ xfdesktop_icon_view_motion_notify(GtkWidget *widget,
             gdk_region_destroy(region_intersect);
         }
 
-        gdk_window_invalidate_region(widget->window, region, TRUE);;
+        gdk_window_invalidate_region(gtk_widget_get_window(widget), region, TRUE);
         gdk_region_destroy(region);
 
         /* update list of selected icons */
@@ -1229,8 +1230,8 @@ xfdesktop_icon_view_leave_notify(GtkWidget *widget,
     }
 
     if(G_UNLIKELY(icon_view->priv->single_click)) {
-        if(GTK_WIDGET_REALIZED(widget)) {
-            gdk_window_set_cursor(widget->window, NULL);
+        if(gtk_widget_get_realized(widget)) {
+            gdk_window_set_cursor(gtk_widget_get_window(widget), NULL);
         }
     }
     
@@ -1285,25 +1286,25 @@ xfdesktop_icon_view_clear_drag_highlight(XfdesktopIconView *icon_view,
         return;
 
     gtk_widget_queue_draw_area(GTK_WIDGET(icon_view),
-                               cell_highlight->x,
+                               cell_highlight->x - 1,
                                cell_highlight->y,
-                               1,
+                               2,
                                cell_highlight->height);
     gtk_widget_queue_draw_area(GTK_WIDGET(icon_view),
-                               cell_highlight->x + cell_highlight->width,
+                               cell_highlight->x + cell_highlight->width - 1,
                                cell_highlight->y,
-                               1,
+                               2,
                                cell_highlight->height);
     gtk_widget_queue_draw_area(GTK_WIDGET(icon_view),
                                cell_highlight->x,
-                               cell_highlight->y,
+                               cell_highlight->y - 1,
                                cell_highlight->width,
-                               1);
+                               2);
     gtk_widget_queue_draw_area(GTK_WIDGET(icon_view),
                                cell_highlight->x,
-                               cell_highlight->y + cell_highlight->height,
-                               cell_highlight->width + 1,  /* why? */
-                               1);
+                               cell_highlight->y + cell_highlight->height - 1,
+                               cell_highlight->width,
+                               2);
     
     cell_highlight->width = cell_highlight->height = 0;
 }
@@ -1315,6 +1316,7 @@ xfdesktop_icon_view_draw_drag_highlight(XfdesktopIconView *icon_view,
                                         guint16 col)
 {
     GtkWidget *widget = GTK_WIDGET(icon_view);
+    cairo_t *cr;
     GdkRectangle *cell_highlight;
     gint newx, newy;
     
@@ -1337,10 +1339,13 @@ xfdesktop_icon_view_draw_drag_highlight(XfdesktopIconView *icon_view,
     cell_highlight->x = newx;
     cell_highlight->y = newy;
     cell_highlight->width = cell_highlight->height = CELL_SIZE;
-    
-    gdk_draw_rectangle(GDK_DRAWABLE(widget->window),
-                       widget->style->bg_gc[GTK_STATE_SELECTED], FALSE,
-                       newx, newy, CELL_SIZE, CELL_SIZE);
+
+    cr = gdk_cairo_create(GDK_DRAWABLE(gtk_widget_get_window(widget)));
+    gdk_cairo_set_source_color(cr, &gtk_widget_get_style(widget)->bg[GTK_STATE_SELECTED]);
+    cairo_set_line_width(cr, 0.5);
+    cairo_rectangle(cr, newx, newy, CELL_SIZE, CELL_SIZE);
+    cairo_stroke(cr);
+    cairo_destroy(cr);
 }
 
 static gboolean
@@ -1391,7 +1396,7 @@ xfdesktop_icon_view_drag_motion(GtkWidget *widget,
         if(is_local_drag)  /* # 1 */
             our_action = GDK_ACTION_MOVE;
         else  /* #3 */
-            our_action = context->suggested_action;
+            our_action = gdk_drag_context_get_suggested_action(context);
     } else {
         /* start with everything */
         GdkDragAction allowed_actions = (GDK_ACTION_MOVE | GDK_ACTION_COPY
@@ -1418,8 +1423,8 @@ xfdesktop_icon_view_drag_motion(GtkWidget *widget,
         /* #2 or #4 */
         allowed_actions &= xfdesktop_icon_get_allowed_drop_actions(icon_on_dest);
         
-        if(allowed_actions & context->suggested_action)
-            our_action = context->suggested_action;
+        if(allowed_actions & gdk_drag_context_get_suggested_action(context))
+            our_action = gdk_drag_context_get_suggested_action(context);
         else {
             /* priority: move, copy, link */
             if(allowed_actions & GDK_ACTION_MOVE)
@@ -1492,7 +1497,7 @@ xfdesktop_icon_view_drag_drop(GtkWidget *widget,
             for(l = icon_view->priv->selected_icons; l; l = l->next) {
                 if(xfdesktop_icon_do_drop_dest(icon_on_dest,
                                                XFDESKTOP_ICON(l->data),
-                                               context->action))
+                                               gdk_drag_context_get_selected_action(context)))
                 {
                     ret = TRUE;
                 }
@@ -1636,13 +1641,27 @@ xfdesktop_icon_view_compare_icons(gconstpointer *a,
 }
 
 static void
+xfdesktop_move_icon_from_pending_list_to_icons_list(XfdesktopIconView *icon_view,
+                                                    XfdesktopIcon *icon)
+{
+    GList *pending_icons = icon_view->priv->pending_icons;
+    GList *icon_list = icon_view->priv->icons;
+
+    if(g_list_find(pending_icons, icon)) {
+        /* Add the icon to the icon list and remove from the pending list */
+        icon_list = g_list_append(icon_list, icon);
+        pending_icons = g_list_remove(pending_icons, icon);
+    }
+}
+
+static void
 xfdesktop_icon_view_append_icons(XfdesktopIconView *icon_view,
                                  GList *icon_list,
                                  guint16 *row,
                                  guint16 *col)
 {
     GList *l = NULL;
-    for(l = icon_list; l; l = l->next) {
+    for(l = icon_list; l != NULL; l = g_list_next(l)) {
 
         /* Find the next available spot for an icon */
         do {
@@ -1662,6 +1681,38 @@ xfdesktop_icon_view_append_icons(XfdesktopIconView *icon_view,
     }
 }
 
+static void
+xfdesktop_icon_view_append_pending_icons(XfdesktopIconView *icon_view)
+{
+    GList *l = NULL;
+    guint16 row = 0, col = 0;
+
+    for(l = icon_view->priv->pending_icons; l != NULL; l = g_list_next(l)) {
+
+        /* Find the next available spot for an icon */
+        do {
+            if(row + 1 >= icon_view->priv->nrows) {
+                ++col;
+                row = 0;
+            } else {
+                ++row;
+            }
+
+            /* Check that we haven't ran out of space */
+            if(col > icon_view->priv->ncols)
+                return;
+        } while(!xfdesktop_grid_is_free_position(icon_view, row, col));
+
+        /* set new position */
+        xfdesktop_icon_set_position(l->data, row, col);
+        xfdesktop_grid_unset_position_free(icon_view, l->data);
+
+        xfdesktop_move_icon_from_pending_list_to_icons_list(icon_view, l->data);
+
+        xfdesktop_icon_view_invalidate_icon(icon_view, l->data, TRUE);
+    }
+}
+
 void
 xfdesktop_icon_view_sort_icons(XfdesktopIconView *icon_view)
 {
@@ -1737,7 +1788,7 @@ xfdesktop_icon_view_style_set(GtkWidget *widget,
 
     /* default the shadow color to the inverse of the text color */
     if (!icon_view->priv->shadow_color) {
-        icon_view->priv->shadow_color = gdk_color_copy(&widget->style->fg[GTK_STATE_NORMAL]);
+        icon_view->priv->shadow_color = gdk_color_copy(&gtk_widget_get_style(widget)->fg[GTK_STATE_NORMAL]);
         icon_view->priv->shadow_color->red   ^= 0xffff;
         icon_view->priv->shadow_color->green ^= 0xffff;
         icon_view->priv->shadow_color->blue  ^= 0xffff;
@@ -1763,7 +1814,7 @@ xfdesktop_icon_view_style_set(GtkWidget *widget,
 
     /* default the shadow color to the inverse of the text color */
     if (!icon_view->priv->selected_shadow_color) {
-        icon_view->priv->selected_shadow_color = gdk_color_copy(&widget->style->fg[GTK_STATE_SELECTED]);
+        icon_view->priv->selected_shadow_color = gdk_color_copy(&gtk_widget_get_style(widget)->fg[GTK_STATE_SELECTED]);
         icon_view->priv->selected_shadow_color->red   ^= 0xffff;
         icon_view->priv->selected_shadow_color->green ^= 0xffff;
         icon_view->priv->selected_shadow_color->blue  ^= 0xffff;
@@ -1829,20 +1880,21 @@ xfdesktop_icon_view_realize(GtkWidget *widget)
     PangoContext *pctx;
     GdkScreen *gscreen;
     GdkWindow *groot;
-    GList *l, *leftovers = NULL;
 
     icon_view->priv->parent_window = gtk_widget_get_toplevel(widget);
     g_return_if_fail(icon_view->priv->parent_window);
-    widget->window = icon_view->priv->parent_window->window;
+    gtk_widget_set_window(widget, gtk_widget_get_window(icon_view->priv->parent_window));
     
-    widget->style = gtk_style_attach(widget->style, widget->window);
+    gtk_widget_set_style(widget,
+                         gtk_style_attach(gtk_widget_get_style(widget),
+                                          gtk_widget_get_window(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. */
     xfdesktop_icon_view_manager_init(icon_view->priv->manager, icon_view);
     
-    GTK_WIDGET_SET_FLAGS(widget, GTK_REALIZED);
+    gtk_widget_set_realized(widget, TRUE);
     
     gtk_window_set_accept_focus(GTK_WINDOW(icon_view->priv->parent_window),
                                 TRUE);
@@ -1903,15 +1955,7 @@ xfdesktop_icon_view_realize(GtkWidget *widget)
                            G_CALLBACK(xfdesktop_icon_view_icon_theme_changed),
                            icon_view);
     
-    for(l = icon_view->priv->pending_icons; l; l = l->next) {
-        XfdesktopIcon *icon = XFDESKTOP_ICON(l->data);
-        if(xfdesktop_icon_view_icon_find_position(icon_view, icon))
-            xfdesktop_icon_view_add_item_internal(icon_view, icon);
-        else
-            leftovers = g_list_prepend(leftovers, icon);
-    }
-    g_list_free(icon_view->priv->pending_icons);
-    icon_view->priv->pending_icons = g_list_reverse(leftovers);
+    xfdesktop_move_all_pending_icons_to_desktop(icon_view);
 }
 
 static void
@@ -1920,7 +1964,6 @@ xfdesktop_icon_view_unrealize(GtkWidget *widget)
     XfdesktopIconView *icon_view = XFDESKTOP_ICON_VIEW(widget);
     GdkScreen *gscreen;
     GdkWindow *groot;
-    GList *l;
     
     gtk_window_set_accept_focus(GTK_WINDOW(icon_view->priv->parent_window), FALSE);
     
@@ -1959,17 +2002,9 @@ xfdesktop_icon_view_unrealize(GtkWidget *widget)
     /* FIXME: really clear these? */
     g_list_free(icon_view->priv->selected_icons);
     icon_view->priv->selected_icons = NULL;
-    
-    /* move all icons into the pending_icons list */
-    for(l = icon_view->priv->icons; l; l = l->next) {
-        g_signal_handlers_disconnect_by_func(G_OBJECT(l->data),
-                                             G_CALLBACK(xfdesktop_icon_view_icon_changed),
-                                             icon_view);
-    }
-    icon_view->priv->pending_icons = g_list_concat(icon_view->priv->icons,
-                                                   icon_view->priv->pending_icons);
-    icon_view->priv->icons = NULL;
-    
+
+    xfdesktop_move_all_icons_to_pending_icons_list(icon_view);
+
     g_free(icon_view->priv->grid_layout);
     icon_view->priv->grid_layout = NULL;
     
@@ -1991,8 +2026,8 @@ xfdesktop_icon_view_unrealize(GtkWidget *widget)
         icon_view->priv->selected_shadow_color = NULL;
     }
     
-    widget->window = NULL;
-    GTK_WIDGET_UNSET_FLAGS(widget, GTK_REALIZED);
+    gtk_widget_set_window(widget, NULL);
+    gtk_widget_set_realized(widget, FALSE);
 }
 
 static gboolean
@@ -2017,7 +2052,7 @@ xfdesktop_icon_view_expose(GtkWidget *widget,
         GdkRectangle intersect;
         cairo_t *cr;
 
-        cr = gdk_cairo_create(GDK_DRAWABLE(widget->window));
+        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,
@@ -2366,7 +2401,7 @@ xfdesktop_icon_view_real_move_cursor(XfdesktopIconView *icon_view,
     if(count == 0)
         return FALSE;
 
-    if(!GTK_WIDGET_HAS_FOCUS(GTK_WIDGET(icon_view)))
+    if(gtk_widget_has_focus(GTK_WIDGET(icon_view)))
         return FALSE;
 
     gtk_widget_grab_focus(GTK_WIDGET(icon_view));
@@ -2601,7 +2636,7 @@ xfdesktop_icon_view_invalidate_icon(XfdesktopIconView *icon_view,
 
     /* we always have to invalidate the old extents */
     if(xfdesktop_icon_get_extents(icon, NULL, NULL, &extents)) {
-        if(GTK_WIDGET_REALIZED(icon_view)) {
+        if(gtk_widget_get_realized(GTK_WIDGET(icon_view))) {
             gtk_widget_queue_draw_area(GTK_WIDGET(icon_view), extents.x,
                                        extents.y, extents.width,
                                        extents.height);
@@ -2619,7 +2654,7 @@ xfdesktop_icon_view_invalidate_icon(XfdesktopIconView *icon_view,
                                                     &total_extents))
         {
             g_warning("Trying to invalidate icon, but can't recalculate extents");
-        } else if(GTK_WIDGET_REALIZED(icon_view)) {
+        } else if(gtk_widget_get_realized(GTK_WIDGET(icon_view))) {
             gtk_widget_queue_draw_area(GTK_WIDGET(icon_view),
                                        total_extents.x, total_extents.y,
                                        total_extents.width, total_extents.height);
@@ -2652,7 +2687,7 @@ xfdesktop_icon_view_invalidate_icon_pixbuf(XfdesktopIconView *icon_view,
         rect.x += CELL_PADDING + ((CELL_SIZE - 2 * CELL_PADDING) - rect.width) / 2;
         rect.y += CELL_PADDING + SPACING;
     
-        if(GTK_WIDGET_REALIZED(icon_view)) {
+        if(gtk_widget_get_realized(GTK_WIDGET(icon_view))) {
             gtk_widget_queue_draw_area(GTK_WIDGET(icon_view), rect.x, rect.y,
                                        rect.width, rect.height);
         }
@@ -2679,8 +2714,8 @@ xfdesktop_paint_rounded_box(XfdesktopIconView *icon_view,
     box_area.height += label_radius * 2;
     
     if(gdk_rectangle_intersect(&box_area, expose_area, &intersection)) {
-        cairo_t *cr = gdk_cairo_create(GTK_WIDGET(icon_view)->window);
-        GtkStyle *style = GTK_WIDGET(icon_view)->style;
+        cairo_t *cr = gdk_cairo_create(gtk_widget_get_window(GTK_WIDGET(icon_view)));
+        GtkStyle *style = gtk_widget_get_style(GTK_WIDGET(icon_view));
         double alpha;
 
         if(state == GTK_STATE_NORMAL)
@@ -2772,7 +2807,6 @@ xfdesktop_icon_view_setup_pango_layout(XfdesktopIconView *icon_view,
 
     pango_layout_get_pixel_extents(playout, NULL, &prect);
     if(prect.width > TEXT_WIDTH) {
-//        if(icon != icon_view->priv->cursor && icon_view->priv->ellipsize_icon_labels)
         if(!g_list_find(icon_view->priv->selected_icons, icon) && icon_view->priv->ellipsize_icon_labels)
             pango_layout_set_ellipsize(playout, PANGO_ELLIPSIZE_END);
         else {
@@ -2878,6 +2912,34 @@ xfdesktop_icon_view_update_icon_extents(XfdesktopIconView *icon_view,
 }
 
 static void
+xfdesktop_icon_view_draw_image(cairo_t *cr, GdkPixbuf *pix, GdkRectangle *rect)
+{
+    cairo_save(cr);
+
+    gdk_cairo_rectangle(cr, rect);
+    cairo_clip(cr);
+
+    gdk_cairo_set_source_pixbuf(cr, pix, rect->x, rect->y);
+    cairo_paint(cr);
+
+    cairo_restore(cr);
+}
+
+static void
+xfdesktop_icon_view_draw_text(cairo_t *cr, PangoLayout *playout,
+                              gint x, gint y, GdkColor *color)
+{
+    cairo_save(cr);
+
+    cairo_move_to(cr, x, y);
+
+    gdk_cairo_set_source_color(cr, color);
+    pango_cairo_show_layout(cr, playout);
+
+    cairo_restore(cr);
+}
+
+static void
 xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view,
                                XfdesktopIcon *icon,
                                GdkRectangle *area)
@@ -2889,12 +2951,14 @@ xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view,
     GdkRectangle intersection;
     gchar x_offset = 0, y_offset = 0;
     GdkColor *sh_text_col = NULL;
-    
-    /*TRACE("entering (%s)", xfdesktop_icon_peek_label(icon));*/
-    TRACE("entering, (area=%dx%d+%d+%d)", area->width, area->height,
-          area->x, area->y);
+    cairo_t *cr;
+
+    TRACE("entering, (%s)(area=%dx%d+%d+%d)", xfdesktop_icon_peek_label(icon),
+          area->width, area->height, area->x, area->y);
 
     playout = icon_view->priv->playout;
+
+    cr = gdk_cairo_create(GDK_DRAWABLE(gtk_widget_get_window(widget)));
     
     xfdesktop_icon_get_extents(icon, &pixbuf_extents,
                                &text_extents, &total_extents);
@@ -2910,7 +2974,7 @@ xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view,
     }
 
     if(g_list_find(icon_view->priv->selected_icons, icon)) {
-        if(GTK_WIDGET_FLAGS(widget) & GTK_HAS_FOCUS)
+        if(gtk_widget_has_focus(widget))
             state = GTK_STATE_SELECTED;
         else
             state = GTK_STATE_ACTIVE;
@@ -2922,7 +2986,7 @@ xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view,
         GdkPixbuf *pix_free = NULL;
 
         if(state != GTK_STATE_NORMAL) {
-            pix_free = exo_gdk_pixbuf_colorize(pix, &widget->style->base[state]);
+            pix_free = exo_gdk_pixbuf_colorize(pix, &gtk_widget_get_style(widget)->base[state]);
             pix = pix_free;
         }
 
@@ -2935,15 +2999,10 @@ xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view,
         }
 
         TRACE("painting pixbuf at %dx%d+%d+%d",
-              intersection.width, intersection.height,
-              intersection.x, intersection.y);
-        
-        gdk_draw_pixbuf(GDK_DRAWABLE(widget->window), widget->style->black_gc,
-                        pix, intersection.x - pixbuf_extents.x,
-                        intersection.y - pixbuf_extents.y,
-                        intersection.x, intersection.y,
-                        intersection.width, intersection.height,
-                        GDK_RGB_DITHER_NORMAL, 0, 0);
+              pixbuf_extents.width, pixbuf_extents.height,
+              pixbuf_extents.x, pixbuf_extents.y);
+
+        xfdesktop_icon_view_draw_image(cr, pix, &pixbuf_extents);
         
         if(pix_free)
             g_object_unref(G_OBJECT(pix_free));
@@ -2963,40 +3022,19 @@ xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view,
 
     /* draw text shadow for the label text if an offset was defined */
     if(x_offset || y_offset) {
-        GdkGC *tmp_gc;
-
-        /* FIXME: it's probably not good for performance to create and
-         * destroy a GC every time an icon gets painted.  might want
-         * to cache this somewhere. */
-
-        /* save the original gc */
-        tmp_gc = gdk_gc_new(GDK_DRAWABLE(widget->window));
-        gdk_gc_copy(tmp_gc, widget->style->text_gc[state]);
-
-        /* set the new foreground color */
-        gdk_gc_set_rgb_fg_color(widget->style->text_gc[state], sh_text_col);
-
-        /* paint the shadow */
-        gtk_paint_layout(widget->style, widget->window, state, TRUE,
-                         area, widget, "label",
-                         text_extents.x + x_offset,
-                         text_extents.y + y_offset,
-                         playout);
-
-        /* restore the original gc */
-        gdk_gc_copy(widget->style->text_gc[state], tmp_gc);
-
-        /* clean */
-        g_object_unref(G_OBJECT(tmp_gc));
+        xfdesktop_icon_view_draw_text(cr, playout,
+                                      text_extents.x + x_offset,
+                                      text_extents.y + y_offset,
+                                      sh_text_col);
     }
-    
-    gtk_paint_layout(widget->style, widget->window, state, FALSE,
-                     area, widget, "label",
-                     text_extents.x, text_extents.y, playout);
+
+    xfdesktop_icon_view_draw_text(cr, playout,
+                                  text_extents.x,
+                                  text_extents.y,
+                                  gtk_widget_get_style(widget)->fg);
 
 #if 0 /*def DEBUG*/
     {
-        cairo_t *cr = gdk_cairo_create(GDK_DRAWABLE(GTK_WIDGET(icon_view)->window));
         GdkRectangle cell = { 0, };
         guint16 row, col;
 
@@ -3027,7 +3065,6 @@ xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view,
         cairo_rectangle(cr, cell.x, cell.y, cell.width, cell.height);
         cairo_stroke(cr);
 
-        cairo_destroy(cr);
 
         //DBG("cell extents:       %dx%d+%d+%d", cell.width, cell.height, cell.x, cell.y);
         //DBG("new pixbuf extents: %dx%d+%d+%d", pixbuf_extents.width, pixbuf_extents.height, pixbuf_extents.x, pixbuf_extents.y);
@@ -3035,13 +3072,14 @@ xfdesktop_icon_view_paint_icon(XfdesktopIconView *icon_view,
         //DBG("new total extents:  %dx%d+%d+%d", total_extents.width, total_extents.height, total_extents.x, total_extents.y);
     }
 #endif
+
+    cairo_destroy(cr);
 }
 
 static void
-xfdesktop_grid_do_resize(XfdesktopIconView *icon_view)
+xfdesktop_move_all_icons_to_pending_icons_list(XfdesktopIconView *icon_view)
 {
-    XfdesktopFileIconManager *fmanager = NULL;
-    GList *l, *leftovers = NULL;
+    GList *l = NULL;
     
     /* move all icons into the pending_icons list and remove from the desktop */
     for(l = icon_view->priv->icons; l; l = l->next) {
@@ -3067,6 +3105,13 @@ xfdesktop_grid_do_resize(XfdesktopIconView *icon_view)
     xfdesktop_setup_grids(icon_view);
     
     DUMP_GRID_LAYOUT(icon_view);
+}
+
+static void
+xfdesktop_move_all_pending_icons_to_desktop(XfdesktopIconView* icon_view)
+{
+    XfdesktopFileIconManager *fmanager;
+    GList *l, *leftovers = NULL;
 
 #ifdef ENABLE_FILE_ICONS
     if(XFDESKTOP_IS_FILE_ICON_MANAGER(icon_view->priv->manager))
@@ -3098,7 +3143,31 @@ xfdesktop_grid_do_resize(XfdesktopIconView *icon_view)
     }
     g_list_free(icon_view->priv->pending_icons);
     icon_view->priv->pending_icons = g_list_reverse(leftovers);
+
+    xfdesktop_icon_view_append_pending_icons(icon_view);
+}
+
+static void
+xfdesktop_grid_do_resize(XfdesktopIconView *icon_view)
+{
+    xfdesktop_move_all_icons_to_pending_icons_list(icon_view);
+
+#if 0 /*def DEBUG*/
+    DUMP_GRID_LAYOUT(icon_view);
+#endif
+
+    memset(icon_view->priv->grid_layout, 0,
+           icon_view->priv->nrows * icon_view->priv->ncols
+           * sizeof(XfdesktopIcon *));
     
+    xfdesktop_setup_grids(icon_view);
+
+#if 0 /*def DEBUG*/
+    DUMP_GRID_LAYOUT(icon_view);
+#endif
+
+    xfdesktop_move_all_pending_icons_to_desktop(icon_view);
+
     gtk_widget_queue_draw(GTK_WIDGET(icon_view));
 }
 
@@ -3459,7 +3528,7 @@ xfdesktop_icon_view_add_item(XfdesktopIconView *icon_view,
     g_object_set_data(G_OBJECT(icon), "--xfdesktop-icon-view", icon_view);
     g_object_ref(G_OBJECT(icon));
     
-    if(!GTK_WIDGET_REALIZED(GTK_WIDGET(icon_view))) {
+    if(!gtk_widget_get_realized(GTK_WIDGET(icon_view))) {
         /* if we aren't realized, we don't know what our grid looks like, so
          * just hang onto the icon for later */
         if(xfdesktop_icon_get_position(icon, &row, &col)) {
@@ -3849,7 +3918,7 @@ xfdesktop_icon_view_set_icon_size(XfdesktopIconView *icon_view,
     
     icon_view->priv->icon_size = icon_size;
     
-    if(GTK_WIDGET_REALIZED(icon_view)) {
+    if(gtk_widget_get_realized(GTK_WIDGET(icon_view))) {
         xfdesktop_grid_do_resize(icon_view);
         gtk_widget_queue_draw(GTK_WIDGET(icon_view));
     }
@@ -3873,7 +3942,7 @@ xfdesktop_icon_view_set_font_size(XfdesktopIconView *icon_view,
     
     icon_view->priv->font_size = font_size_points;
     
-    if(GTK_WIDGET_REALIZED(icon_view)) {
+    if(gtk_widget_get_realized(GTK_WIDGET(icon_view))) {
         xfdesktop_icon_view_modify_font_size(icon_view, font_size_points);
         xfdesktop_grid_do_resize(icon_view);
         gtk_widget_queue_draw(GTK_WIDGET(icon_view));


More information about the Xfce4-commits mailing list