finch/plugins/gntclipboard/gntclipboard.c

changeset 42678
0b9b81b6ff18
parent 42677
66b49e545c53
child 42679
192a8112562f
--- a/finch/plugins/gntclipboard/gntclipboard.c	Wed Apr 10 02:23:01 2024 -0500
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,171 +0,0 @@
-/**
- * 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., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
- */
-
-#define _POSIX_C_SOURCE 200809L /* Needed to get kill(2). */
-
-#include <purpleconfig.h>
-
-#include <glib.h>
-#include <glib/gi18n-lib.h>
-
-#define PLUGIN_ID           "gntclipboard"
-#define PLUGIN_DOMAIN       (g_quark_from_static_string(PLUGIN_ID))
-
-#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 <purple.h>
-
-#include <gnt.h>
-
-#include <finch.h>
-
-#ifdef HAVE_X11
-static pid_t child = 0;
-
-static gulong sig_handle;
-
-static void
-set_clip(gchar *string)
-{
-	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;
-		}
-	}
-}
-
-static void
-clipboard_changed(G_GNUC_UNUSED GntWM *wm, gchar *string)
-{
-	if (child) {
-		kill(child, SIGTERM);
-	}
-	if ((child = fork()) == 0) {
-		set_clip(string);
-		_exit(0);
-	}
-}
-#endif
-
-static GPluginPluginInfo *
-gnt_clipboard_query(G_GNUC_UNUSED GError **error) {
-	const gchar * const authors[] = {
-		"Richard Nelson <wabz@whatsbeef.net>",
-		NULL
-	};
-
-	return finch_plugin_info_new(
-		"id",           PLUGIN_ID,
-		"name",         N_("GntClipboard"),
-		"version",      DISPLAY_VERSION,
-		"category",     N_("Utility"),
-		"summary",      N_("Clipboard plugin"),
-		"description",  N_("When the gnt clipboard contents change, the "
-		                   "contents are made available to X, if possible."),
-		"authors",      authors,
-		"website",      PURPLE_WEBSITE,
-		"abi-version",  PURPLE_ABI_VERSION,
-		NULL
-	);
-}
-
-static gboolean
-gnt_clipboard_load(G_GNUC_UNUSED GPluginPlugin *plugin,
-                   G_GNUC_UNUSED GError **error)
-{
-#ifdef HAVE_X11
-	if (!XOpenDisplay(NULL)) {
-		purple_debug_warning("gntclipboard", "Couldn't find X display\n");
-		purple_notify_error(NULL, _("Error"), _("Error loading the plugin."),
-				_("Couldn't find X display"), NULL);
-		return FALSE;
-	}
-	if (!getenv("WINDOWID")) {
-		purple_debug_warning("gntclipboard", "Couldn't find window\n");
-		purple_notify_error(NULL, _("Error"), _("Error loading the plugin."),
-				_("Couldn't find window"), NULL);
-		return FALSE;
-	}
-	sig_handle = g_signal_connect(G_OBJECT(gnt_get_clipboard()), "clipboard_changed", G_CALLBACK(clipboard_changed), NULL);
-	return TRUE;
-#else
-	g_set_error(error, PLUGIN_DOMAIN, 0, _("This plugin cannot be loaded "
-			"because it was not built with X11 support."));
-	return FALSE;
-#endif
-}
-
-static gboolean
-gnt_clipboard_unload(G_GNUC_UNUSED GPluginPlugin *plugin,
-                     G_GNUC_UNUSED gboolean shutdown,
-                     G_GNUC_UNUSED GError **error)
-{
-#ifdef HAVE_X11
-	if (child) {
-		kill(child, SIGTERM);
-		child = 0;
-	}
-	g_signal_handler_disconnect(G_OBJECT(gnt_get_clipboard()), sig_handle);
-#endif
-	return TRUE;
-}
-
-GPLUGIN_NATIVE_PLUGIN_DECLARE(gnt_clipboard)

mercurial