Mercurial > pidgin.yaz
diff plugins/gestures/gestures.c @ 4390:16540914c963
[gaim-migrate @ 4656]
Added a mouse gestures plugin. Yes, you heard me.
committer: Tailor Script <tailor@pidgin.im>
author | Christian Hammond <chipx86@chipx86.com> |
---|---|
date | Wed, 22 Jan 2003 13:57:27 +0000 |
parents | |
children | 2308397639df |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/plugins/gestures/gestures.c Wed Jan 22 13:57:27 2003 +0000 @@ -0,0 +1,282 @@ +/* + * Mouse gestures plugin for Gaim + * + * 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., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ +#include "config.h" + +#ifndef GAIM_PLUGINS +#define GAIM_PLUGINS +#endif + +#include "gaim.h" +#include "gstroke.h" + +static GModule *handle = NULL; +struct gaim_plugin_description desc; + +static void +stroke_close(GtkWidget *widget, void *data) +{ + struct gaim_conversation *conv; + struct gaim_gtk_conversation *gtkconv; + + conv = (struct gaim_conversation *)data; + + /* Double-check */ + if (!GAIM_IS_GTK_CONVERSATION(conv)) + return; + + gtkconv = GAIM_GTK_CONVERSATION(conv); + + gstroke_cleanup(gtkconv->imhtml); + gaim_conversation_destroy(conv); +} + +static void +stroke_prev_tab(GtkWidget *widget, void *data) +{ + struct gaim_conversation *conv; + struct gaim_window *win; + unsigned int index; + + conv = (struct gaim_conversation *)data; + win = gaim_conversation_get_window(conv); + index = gaim_conversation_get_index(conv); + + if (index == 0) + index = gaim_window_get_conversation_count(win) - 1; + else + index--; + + gaim_window_switch_conversation(win, index); +} + +static void +stroke_next_tab(GtkWidget *widget, void *data) +{ + struct gaim_conversation *conv; + struct gaim_window *win; + unsigned int index; + + conv = (struct gaim_conversation *)data; + win = gaim_conversation_get_window(conv); + index = gaim_conversation_get_index(conv); + + if (index == gaim_window_get_conversation_count(win) - 1) + index = 0; + else + index++; + + gaim_window_switch_conversation(win, index); +} + +void +stroke_new_win(GtkWidget *widget, void *data) +{ + struct gaim_window *new_win, *old_win; + struct gaim_conversation *conv; + + conv = (struct gaim_conversation *)data; + old_win = gaim_conversation_get_window(conv); + + if (gaim_window_get_conversation_count(old_win) <= 1) + return; + + new_win = gaim_window_new(); + + gaim_window_remove_conversation(old_win, gaim_conversation_get_index(conv)); + gaim_window_add_conversation(new_win, conv); + + gaim_window_show(new_win); +} + +static void +attach_signals(struct gaim_conversation *conv) +{ + struct gaim_gtk_conversation *gtkconv; + + gtkconv = GAIM_GTK_CONVERSATION(conv); + + gstroke_enable(gtkconv->imhtml); + gstroke_signal_connect(gtkconv->imhtml, "14789", stroke_close, conv); + gstroke_signal_connect(gtkconv->imhtml, "1456", stroke_close, conv); + gstroke_signal_connect(gtkconv->imhtml, "74123", stroke_next_tab, conv); + gstroke_signal_connect(gtkconv->imhtml, "7456", stroke_next_tab, conv); + gstroke_signal_connect(gtkconv->imhtml, "96321", stroke_prev_tab, conv); + gstroke_signal_connect(gtkconv->imhtml, "9654", stroke_prev_tab, conv); + gstroke_signal_connect(gtkconv->imhtml, "25852", stroke_new_win, conv); +} + +static void +new_conv_cb(char *who) +{ + struct gaim_conversation *conv; + + conv = gaim_find_conversation(who); + + if (conv == NULL || !GAIM_IS_GTK_CONVERSATION(conv)) + return; + + attach_signals(conv); +} + +#if 0 +static void +mouse_button_menu_cb(GtkMenuItem *item, gpointer data) +{ + int button = (int)data; + + gstroke_set_mouse_button(button + 2); +} +#endif + +static void +toggle_draw_cb(GtkToggleButton *toggle, gpointer data) +{ + gstroke_set_draw_strokes(!gstroke_draw_strokes()); +} + +char * +gaim_plugin_init(GModule *h) +{ + struct gaim_conversation *conv; + GList *l; + + handle = h; + + for (l = gaim_get_conversations(); l != NULL; l = l->next) { + conv = (struct gaim_conversation *)l->data; + + if (!GAIM_IS_GTK_CONVERSATION(conv)) + continue; + + attach_signals(conv); + } + + gaim_signal_connect(handle, event_new_conversation, new_conv_cb, NULL); + + return NULL; +} + +void +gaim_plugin_remove(void) +{ + struct gaim_conversation *conv; + struct gaim_gtk_conversation *gtkconv; + GList *l; + + for (l = gaim_get_conversations(); l != NULL; l = l->next) { + conv = (struct gaim_conversation *)l->data; + + if (!GAIM_IS_GTK_CONVERSATION(conv)) + continue; + + gtkconv = GAIM_GTK_CONVERSATION(conv); + + gstroke_cleanup(gtkconv->imhtml); + } +} + +GtkWidget * +gaim_plugin_config_gtk(void) +{ + GtkWidget *ret; + GtkWidget *vbox; + GtkWidget *toggle; +#if 0 + GtkWidget *opt; + GtkWidget *menu, *item; +#endif + + /* Outside container */ + ret = gtk_vbox_new(FALSE, 18); + gtk_container_set_border_width(GTK_CONTAINER(ret), 12); + + /* Configuration frame */ + vbox = make_frame(ret, _("Mouse Gestures Configuration")); + +#if 0 + /* Mouse button drop-down menu */ + menu = gtk_menu_new(); + opt = gtk_option_menu_new(); + + item = gtk_menu_item_new_with_label(_("Middle mouse button")); + g_signal_connect(G_OBJECT(item), "activate", + G_CALLBACK(mouse_button_menu_cb), opt); + gtk_menu_append(menu, item); + + item = gtk_menu_item_new_with_label(_("Right mouse button")); + g_signal_connect(G_OBJECT(item), "activate", + G_CALLBACK(mouse_button_menu_cb), opt); + gtk_menu_append(menu, item); + + gtk_box_pack_start(GTK_BOX(vbox), opt, FALSE, FALSE, 0); + gtk_option_menu_set_menu(GTK_OPTION_MENU(opt), menu); + gtk_option_menu_set_history(GTK_OPTION_MENU(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), + gstroke_draw_strokes()); + g_signal_connect(G_OBJECT(toggle), "toggled", + G_CALLBACK(toggle_draw_cb), NULL); + + gtk_widget_show_all(ret); + + return ret; +} + +struct gaim_plugin_description * +gaim_plugin_desc() +{ + desc.api_version = PLUGIN_API_VERSION; + desc.name = g_strdup(_("Mouse Gestures")); + desc.version = g_strdup(VERSION); + desc.description = g_strdup( + _("Allows support for mouse gestures in conversation windows.\n\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.")); + desc.authors = g_strdup("Christian Hammond <chipx86@gnupdate.org>"); + desc.url = g_strdup(WEBSITE); + + return &desc; +} + +char * +name(void) +{ + return _("Mouse Gestures"); +} + +char * +description(void) +{ + return _("Allows support for mouse gestures in conversation windows.\n\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."); +}