/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();
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.