diff finch/plugins/gntclipboard.c @ 15817:0e3a8505ebbe

renamed gaim-text to finch
author Sean Egan <seanegan@gmail.com>
date Sun, 18 Mar 2007 19:38:15 +0000
parents
children 32c366eeeb99
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/finch/plugins/gntclipboard.c	Sun Mar 18 19:38:15 2007 +0000
@@ -0,0 +1,168 @@
+/**
+ * @file gntclipboard.c
+ *
+ * Copyright (C) 2007 Richard Nelson <wabz@whatsbeef.net>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+
+#include "internal.h"
+#include <glib.h>
+
+#define PLUGIN_STATIC_NAME	"GntClipboard"
+
+#ifdef HAVE_X11
+#include <X11/Xlib.h>
+#include <X11/Xutil.h>
+#include <X11/Xatom.h>
+#endif
+
+#include <sys/types.h>
+#include <signal.h>
+
+#include <glib.h>
+
+#include <plugin.h>
+#include <version.h>
+#include <debug.h>
+#include <gntwm.h>
+
+#include <gntplugin.h>
+
+static pid_t child = 0;
+
+static gulong sig_handle;
+
+static void
+set_clip(gchar *string)
+{
+#ifdef HAVE_X11
+	Window w;
+	XEvent e, respond;
+	XSelectionRequestEvent *req;
+	const char *ids;
+	Display *dpy = XOpenDisplay(NULL);
+
+	if (!dpy)
+		return;
+	ids = getenv("WINDOWID");
+	if (ids == NULL)
+		return;
+	w = atoi(ids);
+	XSetSelectionOwner(dpy, XA_PRIMARY, w, CurrentTime);
+	XFlush(dpy);
+	XSelectInput(dpy, w, StructureNotifyMask);
+	while (TRUE) {
+		XNextEvent(dpy, &e); /* this blocks. */
+		req = &e.xselectionrequest;
+		if (e.type == SelectionRequest) {
+			XChangeProperty(dpy,
+				req->requestor,
+				req->property,
+				XA_STRING,
+				8, PropModeReplace,
+				(unsigned char *)string,
+				strlen(string));
+			respond.xselection.property = req->property;
+			respond.xselection.type = SelectionNotify;
+			respond.xselection.display = req->display;
+			respond.xselection.requestor = req->requestor;
+			respond.xselection.selection = req->selection;
+			respond.xselection.target= req->target;
+			respond.xselection.time = req->time;
+			XSendEvent(dpy, req->requestor, 0, 0, &respond);
+			XFlush (dpy);
+		} else if (e.type == SelectionClear) {
+			return;
+		}
+	}
+#endif
+	return;
+}
+
+static void
+clipboard_changed(GntWM *wm, gchar *string)
+{
+#ifdef HAVE_X11
+	if (child) {
+		kill(child, SIGTERM);
+	}
+	if ((child = fork() == 0)) {
+		set_clip(string);
+		_exit(0);
+	}
+#endif
+}
+
+static gboolean
+plugin_load(GaimPlugin *plugin)
+{
+	if (!XOpenDisplay(NULL)) {
+		gaim_debug_warning("gntclipboard", "Couldn't find X display\n");
+		return FALSE;
+	}
+	if (!getenv("WINDOWID")) {
+		gaim_debug_warning("gntclipboard", "Couldn't find window\n");
+		return FALSE;
+	}
+	sig_handle = g_signal_connect(G_OBJECT(gnt_get_clipboard()), "clipboard_changed", G_CALLBACK(clipboard_changed), NULL);
+	return TRUE;
+}
+
+static gboolean
+plugin_unload(GaimPlugin *plugin)
+{
+	if (child) {
+		kill(child, SIGTERM);
+		child = 0;
+	}
+	g_signal_handler_disconnect(G_OBJECT(gnt_get_clipboard()), sig_handle);
+	return TRUE;
+}
+
+static GaimPluginInfo info =
+{
+	GAIM_PLUGIN_MAGIC,
+	GAIM_MAJOR_VERSION,
+	GAIM_MINOR_VERSION,
+	GAIM_PLUGIN_STANDARD,
+	GAIM_GNT_PLUGIN_TYPE,
+	0,
+	NULL,
+	GAIM_PRIORITY_DEFAULT,
+	"gntclipboard",
+	N_("GntClipboard"),
+	VERSION,
+	N_("Clipboard plugin"),
+	N_("When the gnt clipboard contents change, "
+		"the contents are made available to X, if possible."),
+	"Richard Nelson <wabz@whatsbeef.net>",
+	"http://gaim.sourceforge.net",
+	plugin_load,
+	plugin_unload,
+	NULL,
+	NULL,
+	NULL,
+	NULL,
+	NULL
+};
+
+static void
+init_plugin(GaimPlugin *plugin)
+{
+}
+
+GAIM_INIT_PLUGIN(PLUGIN_STATIC_NAME, init_plugin, info)