gboolean e_composer_paste_text (EMsgComposer *composer, GtkClipboard *clipboard) { EHTMLEditor *editor; EHTMLEditorView *view; EHTMLEditorSelection *editor_selection; gchar *text; g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE); g_return_val_if_fail (GTK_IS_CLIPBOARD (clipboard), FALSE); if (!(text = gtk_clipboard_wait_for_text (clipboard))) return FALSE; editor = e_msg_composer_get_editor (composer); view = e_html_editor_get_view (editor); editor_selection = e_html_editor_view_get_selection (view); /* If WebView doesn't have focus, focus it */ if (!gtk_widget_has_focus (GTK_WIDGET (view))) gtk_widget_grab_focus (GTK_WIDGET (view)); e_html_editor_selection_insert_text (editor_selection, text); g_free (text); return TRUE; }
gboolean e_composer_paste_uris (EMsgComposer *composer, GtkClipboard *clipboard) { EAttachmentStore *store; EAttachmentView *view; gchar **uris; gint ii; g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE); g_return_val_if_fail (GTK_IS_CLIPBOARD (clipboard), FALSE); view = e_msg_composer_get_attachment_view (composer); store = e_attachment_view_get_store (view); /* Extract the URI data from the clipboard. */ uris = gtk_clipboard_wait_for_uris (clipboard); g_return_val_if_fail (uris != NULL, FALSE); /* Add the URIs to the attachment store. */ for (ii = 0; uris[ii] != NULL; ii++) { EAttachment *attachment; attachment = e_attachment_new_for_uri (uris[ii]); e_attachment_store_add_attachment (store, attachment); e_attachment_load_async ( attachment, (GAsyncReadyCallback) e_attachment_load_handle_error, composer); g_object_unref (attachment); } return TRUE; }
static void xfdesktop_clipboard_manager_get_callback (GtkClipboard *clipboard, GtkSelectionData *selection_data, guint target_info, gpointer user_data) { XfdesktopClipboardManager *manager = XFDESKTOP_CLIPBOARD_MANAGER (user_data); GList *file_list = NULL; gchar *string_list; gchar *data; g_return_if_fail (GTK_IS_CLIPBOARD (clipboard)); g_return_if_fail (XFDESKTOP_IS_CLIPBOARD_MANAGER (manager)); g_return_if_fail (manager->clipboard == clipboard); /* determine the file list from the icon list */ file_list = xfdesktop_file_utils_file_icon_list_to_file_list (manager->files); /* determine the string representation of the file list */ string_list = xfdesktop_file_utils_file_list_to_string (file_list); switch (target_info) { case TARGET_GNOME_COPIED_FILES: data = g_strconcat (manager->files_cutted ? "cut\n" : "copy\n", string_list, NULL); 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, gtk_selection_data_get_target(selection_data), 8, (guchar *) string_list, strlen (string_list)); break; default: g_assert_not_reached (); } /* cleanup */ xfdesktop_file_utils_file_list_free (file_list); g_free (string_list); }
static void xfdesktop_clipboard_manager_owner_changed (GtkClipboard *clipboard, GdkEventOwnerChange *event, XfdesktopClipboardManager *manager) { g_return_if_fail (GTK_IS_CLIPBOARD (clipboard)); g_return_if_fail (XFDESKTOP_IS_CLIPBOARD_MANAGER (manager)); g_return_if_fail (manager->clipboard == clipboard); /* need to take a reference on the manager, because the clipboards * "targets received callback" mechanism is not cancellable. */ g_object_ref (G_OBJECT (manager)); /* request the list of supported targets from the new owner */ gtk_clipboard_request_contents (clipboard, gdk_atom_intern ("TARGETS", FALSE), xfdesktop_clipboard_manager_targets_received, manager); }
static void xfdesktop_clipboard_manager_clear_callback (GtkClipboard *clipboard, gpointer user_data) { XfdesktopClipboardManager *manager = XFDESKTOP_CLIPBOARD_MANAGER (user_data); GList *lp; g_return_if_fail (GTK_IS_CLIPBOARD (clipboard)); g_return_if_fail (XFDESKTOP_IS_CLIPBOARD_MANAGER (manager)); g_return_if_fail (manager->clipboard == clipboard); /* release the pending files */ for (lp = manager->files; lp != NULL; lp = lp->next) { g_object_weak_unref(G_OBJECT (lp->data), (GWeakNotify)xfdesktop_clipboard_manager_file_destroyed, manager); g_object_unref (G_OBJECT (lp->data)); } g_list_free (manager->files); manager->files = NULL; }
static void xfdesktop_clipboard_manager_targets_received (GtkClipboard *clipboard, GtkSelectionData *selection_data, gpointer user_data) { XfdesktopClipboardManager *manager = XFDESKTOP_CLIPBOARD_MANAGER (user_data); GdkAtom *targets; gint n_targets; gint n; g_return_if_fail (GTK_IS_CLIPBOARD (clipboard)); g_return_if_fail (XFDESKTOP_IS_CLIPBOARD_MANAGER (manager)); g_return_if_fail (manager->clipboard == clipboard); /* reset the "can-paste" state */ manager->can_paste = FALSE; /* check the list of targets provided by the owner */ if (gtk_selection_data_get_targets (selection_data, &targets, &n_targets)) { for (n = 0; n < n_targets; ++n) if (targets[n] == manager->x_special_gnome_copied_files) { manager->can_paste = TRUE; break; } g_free (targets); } /* notify listeners that we have a new clipboard state */ g_signal_emit (G_OBJECT (manager), manager_signals[CHANGED], 0); g_object_notify (G_OBJECT (manager), "can-paste"); /* drop the reference taken for the callback */ g_object_unref (G_OBJECT (manager)); }
gboolean e_composer_paste_image (EMsgComposer *composer, GtkClipboard *clipboard) { EHTMLEditor *editor; EHTMLEditorView *html_editor_view; EAttachmentStore *store; EAttachmentView *view; GdkPixbuf *pixbuf = NULL; gchar *filename = NULL; gchar *uri = NULL; gboolean success = FALSE; GError *error = NULL; g_return_val_if_fail (E_IS_MSG_COMPOSER (composer), FALSE); g_return_val_if_fail (GTK_IS_CLIPBOARD (clipboard), FALSE); view = e_msg_composer_get_attachment_view (composer); store = e_attachment_view_get_store (view); /* Extract the image data from the clipboard. */ pixbuf = gtk_clipboard_wait_for_image (clipboard); g_return_val_if_fail (pixbuf != NULL, FALSE); /* Reserve a temporary file. */ filename = e_mktemp (NULL); if (filename == NULL) { g_set_error ( &error, G_FILE_ERROR, g_file_error_from_errno (errno), "Could not create temporary file: %s", g_strerror (errno)); goto exit; } /* Save the pixbuf as a temporary file in image/png format. */ if (!gdk_pixbuf_save (pixbuf, filename, "png", &error, NULL)) goto exit; /* Convert the filename to a URI. */ uri = g_filename_to_uri (filename, NULL, &error); if (uri == NULL) goto exit; /* In HTML mode, paste the image into the message body. * In text mode, add the image to the attachment store. */ editor = e_msg_composer_get_editor (composer); html_editor_view = e_html_editor_get_view (editor); if (e_html_editor_view_get_html_mode (html_editor_view)) { EHTMLEditorSelection *selection; selection = e_html_editor_view_get_selection (html_editor_view); e_html_editor_selection_insert_image (selection, uri); e_html_editor_selection_scroll_to_caret (selection); } else { EAttachment *attachment; attachment = e_attachment_new_for_uri (uri); e_attachment_store_add_attachment (store, attachment); e_attachment_load_async ( attachment, (GAsyncReadyCallback) e_attachment_load_handle_error, composer); g_object_unref (attachment); } success = TRUE; exit: if (error != NULL) { g_warning ("%s", error->message); g_error_free (error); } g_object_unref (pixbuf); g_free (filename); g_free (uri); return success; }