/dev/twasilczyk/imgupload: 965aaea4a59b: Imgupload: use our own ...
Tomasz Wasilczyk <[email protected]>
| Newsgroups | gmane.comp.gnome.gaim.cvs |
|---|---|
| Message-ID | <[email protected]> |
Changeset: 965aaea4a59bb10cce8a7d13b8040a73b5271959 Author: Tomasz Wasilczyk <[email protected]> Date: 2014-05-19 14:23 +0200 Branch: default URL: https://hg.pidgin.im/dev/twasilczyk/imgupload/rev/965aaea4a59b Description: Imgupload: use our own insert image callback for hooked conversations diffstat: libpurple/marshallers.list | 1 + pidgin/gtkwebview.c | 27 +++++++++++++++++++++++++++ pidgin/gtkwebview.h | 1 + pidgin/plugins/imgupload.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 73 insertions(+), 0 deletions(-) diffs (162 lines): diff --git a/libpurple/marshallers.list b/libpurple/marshallers.list --- a/libpurple/marshallers.list +++ b/libpurple/marshallers.list @@ -6,3 +6,4 @@ VOID:ENUM,STRING,STRING VOID:ENUM,STRING,STRING,BOOLEAN VOID:FLAGS,FLAGS VOID:STRING,STRING,OBJECT,OBJECT +BOOLEAN:OBJECT diff --git a/pidgin/gtkwebview.c b/pidgin/gtkwebview.c --- a/pidgin/gtkwebview.c +++ b/pidgin/gtkwebview.c @@ -24,6 +24,7 @@ #include "debug.h" #include "glibcompat.h" #include "image-store.h" +#include "marshallers.h" #include "pidgin.h" #include "pidginstock.h" @@ -60,6 +61,7 @@ enum { UPDATE_FORMAT, CHANGED, HTML_APPENDED, + INSERT_IMAGE, LAST_SIGNAL }; static guint signals[LAST_SIGNAL] = { 0 }; @@ -1308,6 +1310,20 @@ fill_spellcheck_dicts(void) #endif +static gboolean +pidgin_webview_insert_image_accu(GSignalInvocationHint *ihint, + GValue *return_accu, const GValue *handler_return, gpointer _unused) +{ + gboolean cancel; + + cancel = g_value_get_boolean(handler_return); + if (!cancel) + return FALSE; + + g_value_set_boolean(return_accu, TRUE); + return TRUE; +} + static void pidgin_webview_class_init(PidginWebViewClass *klass, gpointer userdata) { @@ -1359,6 +1375,12 @@ pidgin_webview_class_init(PidginWebViewC g_cclosure_marshal_VOID__OBJECT, G_TYPE_NONE, 1, WEBKIT_TYPE_DOM_RANGE, NULL); + signals[INSERT_IMAGE] = g_signal_new("insert-image", + G_TYPE_FROM_CLASS(gobject_class), G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET(PidginWebViewClass, insert_image), + pidgin_webview_insert_image_accu, NULL, + purple_smarshal_BOOLEAN__OBJECT, G_TYPE_BOOLEAN, 1, + PURPLE_TYPE_IMAGE); /* Class Methods */ @@ -2217,9 +2239,14 @@ pidgin_webview_insert_image(PidginWebVie WebKitDOMDocument *dom; char *img; guint id; + gboolean cancel; g_return_if_fail(webview != NULL); + g_signal_emit(webview, signals[INSERT_IMAGE], 0, image, &cancel); + if (cancel) + return; + id = purple_image_store_add(image); priv = PIDGIN_WEBVIEW_GET_PRIVATE(webview); dom = webkit_web_view_get_dom_document(WEBKIT_WEB_VIEW(webview)); diff --git a/pidgin/gtkwebview.h b/pidgin/gtkwebview.h --- a/pidgin/gtkwebview.h +++ b/pidgin/gtkwebview.h @@ -102,6 +102,7 @@ struct _PidginWebViewClass void (*update_format)(PidginWebView *); void (*changed)(PidginWebView *); void (*html_appended)(PidginWebView *, WebKitDOMRange *); + gboolean (*insert_image)(PidginWebView *, PurpleImage *); }; G_BEGIN_DECLS diff --git a/pidgin/plugins/imgupload.c b/pidgin/plugins/imgupload.c --- a/pidgin/plugins/imgupload.c +++ b/pidgin/plugins/imgupload.c @@ -47,6 +47,43 @@ imgup_conn_is_hooked(PurpleConnection *g * Plugin setup ******************************************************************************/ +static gboolean +imgup_pidconv_insert_image(PidginWebView *webview, PurpleImage *image, + gpointer _gtkconv) +{ + PidginConversation *gtkconv = _gtkconv; + PurpleConversation *conv = gtkconv->active_conv; + + if (!imgup_conn_is_hooked(purple_conversation_get_connection(conv))) + return FALSE; + + purple_debug_fatal("imgupload", "not yet implemented"); + + return TRUE; +} + +static void +imgup_pidconv_init(PidginConversation *gtkconv) +{ + PidginWebView *webview; + + webview = PIDGIN_WEBVIEW(gtkconv->entry); + + g_signal_connect(G_OBJECT(webview), "insert-image", + G_CALLBACK(imgup_pidconv_insert_image), gtkconv); +} + +static void +imgup_pidconv_uninit(PidginConversation *gtkconv) +{ + PidginWebView *webview; + + webview = PIDGIN_WEBVIEW(gtkconv->entry); + + g_signal_handlers_disconnect_by_func(G_OBJECT(webview), + G_CALLBACK(imgup_pidconv_insert_image), gtkconv); +} + static void imgup_conv_init(PurpleConversation *conv) { @@ -129,6 +166,8 @@ imgup_plugin_load(PurplePlugin *plugin) for (; it; it = g_list_next(it)) { PurpleConversation *conv = it->data; imgup_conv_init(conv); + if (PIDGIN_IS_PIDGIN_CONVERSATION(conv)) + imgup_pidconv_init(PIDGIN_CONVERSATION(conv)); } purple_signal_connect(purple_connections_get_handle(), @@ -137,6 +176,9 @@ imgup_plugin_load(PurplePlugin *plugin) purple_signal_connect(purple_connections_get_handle(), "signing-off", plugin, PURPLE_CALLBACK(imgup_conn_uninit), NULL); + purple_signal_connect(pidgin_conversations_get_handle(), + "conversation-displayed", plugin, + PURPLE_CALLBACK(imgup_pidconv_init), NULL); return TRUE; } @@ -150,6 +192,8 @@ imgup_plugin_unload(PurplePlugin *plugin for (; it; it = g_list_next(it)) { PurpleConversation *conv = it->data; imgup_conv_uninit(conv); + if (PIDGIN_IS_PIDGIN_CONVERSATION(conv)) + imgup_pidconv_uninit(PIDGIN_CONVERSATION(conv)); } it = purple_connections_get_all();