diff options
author | Charles Lehner <cel@celehner.com> | 2015-07-05 21:54:56 -0400 |
---|---|---|
committer | Charles Lehner <cel@celehner.com> | 2015-07-05 21:54:56 -0400 |
commit | c96f478125d885acc3e567dc04ce95364b89d8b6 (patch) | |
tree | a0c1ff1511b824bddea6615def768a798f69940f /modules/gtk | |
parent | 9ef06aa7fb2a236e6a41cd9c5cb34c73a4a7a378 (diff) |
gtk: add command for activating the popup menu
Diffstat (limited to 'modules/gtk')
-rw-r--r-- | modules/gtk/gtk_mod.c | 48 |
1 files changed, 41 insertions, 7 deletions
diff --git a/modules/gtk/gtk_mod.c b/modules/gtk/gtk_mod.c index 813c0f1..a6d804e 100644 --- a/modules/gtk/gtk_mod.c +++ b/modules/gtk/gtk_mod.c @@ -47,6 +47,7 @@ struct gtk_mod { struct gtk_mod mod_obj; enum gtk_mod_events { + MQ_POPUP, MQ_CONNECT, MQ_QUIT, MQ_ANSWER, @@ -452,26 +453,32 @@ static void message_handler(const struct pl *peer, const struct pl *ctype, } -static gboolean status_icon_on_button_press(GtkStatusIcon *status_icon, - GdkEventButton *event, - struct gtk_mod *mod) +static void popup_menu(struct gtk_mod *mod, GtkMenuPositionFunc position, + gpointer position_arg, guint button, guint32 activate_time) { if (!mod->contacts_inited) { init_contacts_menu(mod); mod->contacts_inited = TRUE; } - /* If the current UA was changed through another UI, update it here */ + /* Update things that may have been changed through another UI */ update_current_accounts_menu_item(mod); - update_ua_presence(mod); gtk_widget_show_all(mod->app_menu); gtk_menu_popup(GTK_MENU(mod->app_menu), NULL, NULL, - gtk_status_icon_position_menu, status_icon, - event->button, event->time); + position, position_arg, + button, activate_time); +} + +static gboolean status_icon_on_button_press(GtkStatusIcon *status_icon, + GdkEventButton *event, + struct gtk_mod *mod) +{ + popup_menu(mod, gtk_status_icon_position_menu, status_icon, + event->button, event->time); return TRUE; } @@ -513,6 +520,12 @@ static void mqueue_handler(int id, void *data, void *arg) switch ((enum gtk_mod_events)id) { + case MQ_POPUP: + gdk_threads_enter(); + popup_menu(mod, NULL, NULL, 0, GPOINTER_TO_UINT(data)); + gdk_threads_leave(); + break; + case MQ_CONNECT: uri = data; err = ua_connect(ua, &call, NULL, uri, NULL, VIDMODE_ON); @@ -811,6 +824,22 @@ static struct aufilt vumeter = { }; +static int cmd_popup_menu(struct re_printf *pf, void *unused) +{ + (void)pf; + (void)unused; + + mqueue_push(mod_obj.mq, MQ_POPUP, GUINT_TO_POINTER(GDK_CURRENT_TIME)); + + return 0; +} + + +static const struct cmd cmdv[] = { + {'G', 0, "Pop up GTK+ menu", cmd_popup_menu }, +}; + + static int module_init(void) { int err = 0; @@ -825,12 +854,17 @@ static int module_init(void) aufilt_register(&vumeter); err = message_init(message_handler, &mod_obj); + if (err) + return err; + + err = cmd_register(cmdv, ARRAY_SIZE(cmdv)); return err; } static int module_close(void) { + cmd_unregister(cmdv); if (mod_obj.run) { gdk_threads_enter(); gtk_main_quit(); |