pidgin/plugins/gestures/gestures.c

Tue, 30 Aug 2022 04:21:55 -0500

author
Gary Kramlich <grim@reaperworld.com>
date
Tue, 30 Aug 2022 04:21:55 -0500
changeset 41634
f73f2b9c75b4
parent 41314
0dc72eacd8bf
child 41696
35f8ce475b21
permissions
-rw-r--r--

Do our best to set a transient parent for all of our dialogs

Testing Done:
Opened all of the dialogs and verified that the `GWarning` was no where to be found.

Reviewed at https://reviews.imfreedom.org/r/1698/

/*
 * Mouse gestures plugin for Purple
 *
 * Copyright (C) 2003 Christian Hammond.
 *
 * 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.
 */

#include <glib/gi18n-lib.h>

#include <purple.h>

#include <pidgin.h>

#include "gstroke.h"

#define GESTURES_PLUGIN_ID "gtk-x11-gestures"

static void
stroke_close(GtkWidget *widget, void *data)
{
	PurpleConversation *conv;
	PidginConversation *gtkconv;

	conv = (PurpleConversation *)data;

	/* Double-check */
	if (!PIDGIN_IS_PIDGIN_CONVERSATION(conv))
		return;

	gtkconv = PIDGIN_CONVERSATION(conv);

	gstroke_cleanup(gtkconv->history);
	g_object_unref(conv);
}

static void
stroke_prev_tab(GtkWidget *widget, void *data)
{
	PurpleConversation *conv;
	PidginConversation *gtkconv;
	GtkWidget *win;

	conv = (PurpleConversation *)data;
	gtkconv = PIDGIN_CONVERSATION(conv);
	win = gtk_widget_get_toplevel(gtkconv->tab_cont);

	pidgin_conversation_window_select_previous(PIDGIN_CONVERSATION_WINDOW(win));
}

static void
stroke_next_tab(GtkWidget *widget, void *data)
{
	PurpleConversation *conv;
	PidginConversation *gtkconv;
	GtkWidget *win;

	conv = (PurpleConversation *)data;
	gtkconv = PIDGIN_CONVERSATION(conv);
	win = gtk_widget_get_toplevel(gtkconv->tab_cont);

	pidgin_conversation_window_select_next(PIDGIN_CONVERSATION_WINDOW(win));
}

static void
stroke_new_win(GtkWidget *widget, void *data)
{
	GtkWidget *new_win, *old_win;
	PurpleConversation *conv;

	conv    = (PurpleConversation *)data;
	old_win = gtk_widget_get_parent(PIDGIN_CONVERSATION(conv)->tab_cont);

	if(pidgin_conversation_window_get_count(PIDGIN_CONVERSATION_WINDOW(old_win)) <= 1) {
		return;
	}

	new_win = pidgin_conversation_window_new();

	pidgin_conversation_window_remove(PIDGIN_CONVERSATION_WINDOW(old_win),
	                                  conv);
	pidgin_conversation_window_add(PIDGIN_CONVERSATION_WINDOW(new_win), conv);

	gtk_widget_show_all(new_win);
}

static void
attach_signals(PurpleConversation *conv)
{
	PidginConversation *gtkconv;

	gtkconv = PIDGIN_CONVERSATION(conv);

	gstroke_enable(gtkconv->history);
	gstroke_signal_connect(gtkconv->history, "14789",  stroke_close,    conv);
	gstroke_signal_connect(gtkconv->history, "1456",   stroke_close,    conv);
	gstroke_signal_connect(gtkconv->history, "1489",   stroke_close,    conv);
	gstroke_signal_connect(gtkconv->history, "74123",  stroke_next_tab, conv);
	gstroke_signal_connect(gtkconv->history, "7456",   stroke_next_tab, conv);
	gstroke_signal_connect(gtkconv->history, "96321",  stroke_prev_tab, conv);
	gstroke_signal_connect(gtkconv->history, "9654",   stroke_prev_tab, conv);
	gstroke_signal_connect(gtkconv->history, "25852",  stroke_new_win,  conv);
}

static void
new_conv_cb(PurpleConversation *conv)
{
	if (PIDGIN_IS_PIDGIN_CONVERSATION(conv))
		attach_signals(conv);
}

#if 0
static void
mouse_button_menu_cb(GtkComboBox *opt, gpointer data)
{
	int button = gtk_combo_box_get_active(opt);

	gstroke_set_mouse_button(button + 2);
}
#endif

static void
toggle_draw_cb(GtkToggleButton *toggle, gpointer data)
{
	purple_prefs_set_bool("/plugins/gtk/X11/gestures/visual",
		gtk_toggle_button_get_active(toggle));
}

static void
visual_pref_cb(const char *name, PurplePrefType type, gconstpointer value,
			   gpointer data)
{
	gstroke_set_draw_strokes((gboolean) GPOINTER_TO_INT(value) );
}

static GtkWidget *
get_config_frame(PurplePlugin *plugin)
{
	GtkWidget *ret;
	GtkWidget *vbox;
	GtkWidget *toggle;
#if 0
	GtkWidget *opt;
#endif

	/* Outside container */
	ret = gtk_box_new(GTK_ORIENTATION_VERTICAL, 18);
	gtk_container_set_border_width(GTK_CONTAINER(ret), 12);

	/* Configuration frame */
	vbox = pidgin_make_frame(ret, _("Mouse Gestures Configuration"));

#if 0
	/* Mouse button drop-down menu */
	opt = gtk_combo_box_new_text();

	gtk_combo_box_append_text(_("Middle mouse button"));
	gtk_combo_box_append_text(_("Right mouse button"));
	g_signal_connect(G_OBJECT(opt), "changed",
	                 G_CALLBACK(mouse_button_menu_cb), NULL);

	gtk_box_pack_start(GTK_BOX(vbox), opt, FALSE, FALSE, 0);
	gtk_combo_box_set_active(GTK_COMBO_BOX(opt),
							gstroke_get_mouse_button() - 2);
#endif

	/* "Visual gesture display" checkbox */
	toggle = gtk_check_button_new_with_mnemonic(_("_Visual gesture display"));
	gtk_box_pack_start(GTK_BOX(vbox), toggle, FALSE, FALSE, 0);
	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle),
			purple_prefs_get_bool("/plugins/gtk/X11/gestures/visual"));
	g_signal_connect(G_OBJECT(toggle), "toggled",
					 G_CALLBACK(toggle_draw_cb), NULL);

	gtk_widget_show_all(ret);

	return ret;
}

static GPluginPluginInfo *
gestures_query(GError **error)
{
	const gchar * const authors[] = {
		"Christian Hammond <chipx86@gnupdate.org>",
		NULL
	};

	return pidgin_plugin_info_new(
		"id",                   GESTURES_PLUGIN_ID,
		"name",                 N_("Mouse Gestures"),
		"version",              DISPLAY_VERSION,
		"category",             N_("User interface"),
		"summary",              N_("Provides support for mouse gestures"),
		"description",          N_("Allows support for mouse gestures in "
		                           "conversation windows. Drag the middle "
		                           "mouse button to perform certain "
		                           "actions:\n"
		                           " • Drag down and then to the right to "
		                           "close a conversation.\n"
		                           " • Drag up and then to the left to "
		                           "switch to the previous conversation.\n"
		                           " • Drag up and then to the right to "
		                           "switch to the next conversation."),
		"authors",              authors,
		"website",              PURPLE_WEBSITE,
		"abi-version",          PURPLE_ABI_VERSION,
		"gtk-config-frame-cb",  get_config_frame,
		NULL
	);
}

static gboolean
gestures_load(GPluginPlugin *plugin, GError **error)
{
	PurpleConversation *conv;
	PurpleConversationManager *manager;
	GList *list;

	purple_prefs_add_none("/plugins/gtk");
	purple_prefs_add_none("/plugins/gtk/X11");
	purple_prefs_add_none("/plugins/gtk/X11/gestures");
	purple_prefs_add_bool("/plugins/gtk/X11/gestures/visual", FALSE);

	purple_prefs_connect_callback(plugin,
		"/plugins/gtk/X11/gestures/visual", visual_pref_cb, NULL);
	gstroke_set_draw_strokes(purple_prefs_get_bool(
		"/plugins/gtk/X11/gestures/visual"));

	manager = purple_conversation_manager_get_default();
	list = purple_conversation_manager_get_all(manager);
	while(list != NULL) {
		conv = PURPLE_CONVERSATION(list->data);

		if(!PIDGIN_IS_PIDGIN_CONVERSATION(conv)) {
			list = g_list_delete_link(list, list);

			continue;
		}

		attach_signals(conv);

		list = g_list_delete_link(list, list);
	}

	purple_signal_connect(purple_conversations_get_handle(),
						"conversation-created",
						plugin, G_CALLBACK(new_conv_cb), NULL);

	return TRUE;
}

static gboolean
gestures_unload(GPluginPlugin *plugin, gboolean shutdown, GError **error)
{
	PurpleConversation *conv;
	PurpleConversationManager *manager;
	PidginConversation *gtkconv;
	GList *list;

	manager = purple_conversation_manager_get_default();
	list = purple_conversation_manager_get_all(manager);

	while(list != NULL) {
		conv = PURPLE_CONVERSATION(list->data);

		if (!PIDGIN_IS_PIDGIN_CONVERSATION(conv)) {
			list = g_list_delete_link(list, list);

			continue;
		}

		gtkconv = PIDGIN_CONVERSATION(conv);

		gstroke_cleanup(gtkconv->history);
		gstroke_disable(gtkconv->history);

		list = g_list_delete_link(list, list);
	}

	return TRUE;
}

GPLUGIN_NATIVE_PLUGIN_DECLARE(gestures)

mercurial