diff --git a/src/libgpaste/core/gpaste-clipboard.c b/src/libgpaste/core/gpaste-clipboard.c index d94404a..f212989 100644 --- a/src/libgpaste/core/gpaste-clipboard.c +++ b/src/libgpaste/core/gpaste-clipboard.c @@ -47,6 +47,70 @@ enum static guint signals[LAST_SIGNAL] = { 0 }; +static void +g_paste_clipboard_bootstrap_finish (GPasteClipboard *self, + GPasteHistory *history) +{ + GPasteClipboardPrivate *priv = g_paste_clipboard_get_instance_private (self); + + if (!priv->text && !priv->image_checksum) + { + const GSList *h = g_paste_history_get_history (history); + if (h) + g_paste_clipboard_select_item (self, h->data); + } +} + +static void +g_paste_clipboard_bootstrap_finish_text (GPasteClipboard *self, + const gchar *text G_GNUC_UNUSED, + gpointer user_data) +{ + g_paste_clipboard_bootstrap_finish (self, user_data); +} + +static void +g_paste_clipboard_bootstrap_finish_image (GPasteClipboard *self, + GdkPixbuf *image G_GNUC_UNUSED, + gpointer user_data) +{ + g_paste_clipboard_bootstrap_finish (self, user_data); +} + +/** + * g_paste_clipboard_bootstrap: + * @self: a #GPasteClipboard instance + * @history: a #GPasteHistory instance + * + * Bootstrap a #GPasteClipboard with an initial value + * + * Returns: + */ +G_PASTE_VISIBLE void +g_paste_clipboard_bootstrap (GPasteClipboard *self, + GPasteHistory *history) +{ + g_return_if_fail (G_PASTE_IS_CLIPBOARD (self)); + g_return_if_fail (G_PASTE_IS_HISTORY (history)); + + GPasteClipboardPrivate *priv = g_paste_clipboard_get_instance_private (self); + GtkClipboard *real = priv->real; + + if (gtk_clipboard_wait_is_uris_available (real) || + gtk_clipboard_wait_is_text_available (real)) + { + g_paste_clipboard_set_text (self, + g_paste_clipboard_bootstrap_finish_text, + history); + } + else if (gtk_clipboard_wait_is_image_available (real)) + { + g_paste_clipboard_set_image (self, + g_paste_clipboard_bootstrap_finish_image, + history); + } +} + /** * g_paste_clipboard_get_target: * @self: a #GPasteClipboard instance @@ -342,13 +406,12 @@ g_paste_clipboard_private_select_image (GPasteClipboardPrivate *priv, GdkPixbuf *image, const gchar *checksum) { - g_return_if_fail (image); + g_return_if_fail (GDK_IS_PIXBUF (image)); GtkClipboard *real = priv->real; g_paste_clipboard_private_set_image_checksum (priv, checksum); gtk_clipboard_set_image (real, image); - gtk_clipboard_store (real); } typedef struct { @@ -383,16 +446,14 @@ g_paste_clipboard_on_image_ready (GtkClipboard *clipboard G_GNUC_UNUSED, g_paste_clipboard_private_select_image (priv, image, checksum); - - if (data->callback) - data->callback (self, image, data->user_data); } else { - if (data->callback) - data->callback (self, NULL, data->user_data); - g_object_unref (image); + image = NULL; } + + if (data->callback) + data->callback (self, image, data->user_data); } /** diff --git a/src/libgpaste/core/gpaste-clipboard.h b/src/libgpaste/core/gpaste-clipboard.h index dd16ee8..2b475d6 100644 --- a/src/libgpaste/core/gpaste-clipboard.h +++ b/src/libgpaste/core/gpaste-clipboard.h @@ -24,8 +24,7 @@ #ifndef __G_PASTE_CLIPBOARD_H__ #define __G_PASTE_CLIPBOARD_H__ -#include -#include +#include G_BEGIN_DECLS @@ -52,6 +51,8 @@ typedef void (*GPasteClipboardImageCallback) (GPasteClipboard *self, G_PASTE_VISIBLE GType g_paste_clipboard_get_type (void); +void g_paste_clipboard_bootstrap (GPasteClipboard *self, + GPasteHistory *history); GdkAtom g_paste_clipboard_get_target (const GPasteClipboard *self); GtkClipboard *g_paste_clipboard_get_real (const GPasteClipboard *self); const gchar *g_paste_clipboard_get_text (const GPasteClipboard *self); diff --git a/src/libgpaste/core/gpaste-clipboards-manager.c b/src/libgpaste/core/gpaste-clipboards-manager.c index e24d8e6..dd76581 100644 --- a/src/libgpaste/core/gpaste-clipboards-manager.c +++ b/src/libgpaste/core/gpaste-clipboards-manager.c @@ -34,36 +34,6 @@ struct _GPasteClipboardsManagerPrivate G_DEFINE_TYPE_WITH_PRIVATE (GPasteClipboardsManager, g_paste_clipboards_manager, G_TYPE_OBJECT) -static void -g_paste_clipboards_manager_add_clipboard_finish (GPasteClipboardsManagerPrivate *priv, - GPasteClipboard *clipboard) -{ - if (!g_paste_clipboard_get_text (clipboard) && - !g_paste_clipboard_get_image_checksum (clipboard)) - { - const GSList *history = g_paste_history_get_history (priv->history); - if (history) - g_paste_clipboard_select_item (clipboard, history->data); - } -} - -static void -g_paste_clipboards_manager_on_text_ready (GPasteClipboard *clipboard, - const gchar *text G_GNUC_UNUSED, - gpointer user_data) -{ - g_paste_clipboards_manager_add_clipboard_finish (user_data, clipboard); -} - -static void -g_paste_clipboards_manager_on_image_ready (GPasteClipboard *clipboard, - GdkPixbuf *image, - gpointer user_data) -{ - g_clear_object (&image); - g_paste_clipboards_manager_add_clipboard_finish (user_data, clipboard); -} - /** * g_paste_clipboards_manager_add_clipboard: * @self: a #GPasteClipboardsManager instance @@ -81,23 +51,9 @@ g_paste_clipboards_manager_add_clipboard (GPasteClipboardsManager *self, g_return_if_fail (G_PASTE_IS_CLIPBOARD (clipboard)); GPasteClipboardsManagerPrivate *priv = g_paste_clipboards_manager_get_instance_private (self); - GtkClipboard *real = g_paste_clipboard_get_real (clipboard); priv->clipboards = g_slist_prepend (priv->clipboards, g_object_ref (clipboard)); - - if (gtk_clipboard_wait_is_uris_available (real) || - gtk_clipboard_wait_is_text_available (real)) - { - g_paste_clipboard_set_text (clipboard, - g_paste_clipboards_manager_on_text_ready, - priv); - } - else if (gtk_clipboard_wait_is_image_available (real)) - { - g_paste_clipboard_set_image (clipboard, - g_paste_clipboards_manager_on_image_ready, - priv); - } + g_paste_clipboard_bootstrap (clipboard, priv->history); } static void @@ -235,12 +191,8 @@ g_paste_clipboards_manager_image_ready (GPasteClipboard *clipboard, gboolean something_in_clipboard = !!g_paste_clipboard_get_image_checksum (clipboard); /* If our contents got updated */ - if (image) - { - if (data->track) - item = G_PASTE_ITEM (g_paste_image_item_new (image)); - g_object_unref (image); - } + if (image && data->track) + item = G_PASTE_ITEM (g_paste_image_item_new (image)); g_paste_clipboards_manager_notify_finish (priv, clipboard, item, NULL, something_in_clipboard); } diff --git a/src/libgpaste/core/gpaste-clipboards-manager.h b/src/libgpaste/core/gpaste-clipboards-manager.h index e671821..5638a81 100644 --- a/src/libgpaste/core/gpaste-clipboards-manager.h +++ b/src/libgpaste/core/gpaste-clipboards-manager.h @@ -25,7 +25,6 @@ #define __G_PASTE_CLIPBOARDS_MANAGER_H__ #include -#include G_BEGIN_DECLS diff --git a/src/libgpaste/libgpaste.sym b/src/libgpaste/libgpaste.sym index ef8223b..0d73dee 100644 --- a/src/libgpaste/libgpaste.sym +++ b/src/libgpaste/libgpaste.sym @@ -367,6 +367,8 @@ global: g_paste_client_show_history_finish; g_paste_client_show_history_sync; + g_paste_clipboard_bootstrap; + g_paste_history_search; g_paste_screensaver_client_get_type;