From dc471fac8ed7db8a0b0847d1f6d65e09601df46d Mon Sep 17 00:00:00 2001 From: Eric Koegel Date: Sun, 23 Dec 2012 09:18:09 +0300 Subject: 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 #include +#include #include #include @@ -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, >k_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(>k_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(>k_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, >k_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)); -- 1.7.10.4