diff options
author | Sjoerd Simons <sjoerd.simons@collabora.co.uk> | 2009-02-03 17:03:29 +0800 |
---|---|---|
committer | Xavier Claessens <xclaesse@src.gnome.org> | 2009-02-03 17:03:29 +0800 |
commit | 88815ca856049baa8987f9e5103a8ed080815039 (patch) | |
tree | 08d2c9c100d6b72595526a5d690021772ecb8c9f | |
parent | c39a9ee9166fda185bbb392b45f4de8abeea25fa (diff) | |
download | gsoc2013-empathy-88815ca856049baa8987f9e5103a8ed080815039.tar gsoc2013-empathy-88815ca856049baa8987f9e5103a8ed080815039.tar.gz gsoc2013-empathy-88815ca856049baa8987f9e5103a8ed080815039.tar.bz2 gsoc2013-empathy-88815ca856049baa8987f9e5103a8ed080815039.tar.lz gsoc2013-empathy-88815ca856049baa8987f9e5103a8ed080815039.tar.xz gsoc2013-empathy-88815ca856049baa8987f9e5103a8ed080815039.tar.zst gsoc2013-empathy-88815ca856049baa8987f9e5103a8ed080815039.zip |
Show a dialog when the user clicks on a incoming call
show a nice dialog when the user clicks on an incoming call to give a choice to
either accept or reject the call, without popping up the full VOIP UI
Signed-off-by: Sjoerd Simons <sjoerd.simons@collabora.co.uk>
svn path=/trunk/; revision=2394
-rw-r--r-- | src/empathy-event-manager.c | 85 |
1 files changed, 83 insertions, 2 deletions
diff --git a/src/empathy-event-manager.c b/src/empathy-event-manager.c index 15a783947..3f9766540 100644 --- a/src/empathy-event-manager.c +++ b/src/empathy-event-manager.c @@ -32,6 +32,7 @@ #include <libempathy/empathy-tp-chat.h> #include <libempathy/empathy-tp-call.h> #include <libempathy/empathy-utils.h> +#include <libempathy/empathy-call-factory.h> #include <extensions/extensions.h> @@ -60,6 +61,8 @@ typedef struct { EmpathyTubeDispatch *tube_dispatch; /* option signal handler */ gulong handler; + /* optional accept widget */ + GtkWidget *dialog; } EventManagerApproval; typedef struct { @@ -127,6 +130,11 @@ event_manager_approval_free (EventManagerApproval *approval) if (approval->tube_dispatch != NULL) g_object_unref (approval->tube_dispatch); + if (approval->dialog != NULL) + { + gtk_widget_destroy (approval->dialog); + } + g_slice_free (EventManagerApproval, approval); } @@ -317,6 +325,79 @@ event_update (EmpathyEventManager *manager, EventPriv *event, g_signal_emit (manager, signals[EVENT_UPDATED], 0, event); } +event_manager_call_window_confirmation_dialog_response_cb (GtkDialog *dialog, + gint response, gpointer user_data) +{ + EventManagerApproval *approval = user_data; + + gtk_widget_destroy (approval->dialog); + approval->dialog = NULL; + + if (response != GTK_RESPONSE_ACCEPT) + { + EmpathyTpCall *call = + EMPATHY_TP_CALL ( + empathy_dispatch_operation_get_channel_wrapper ( + approval->operation)); + + g_object_ref (call); + if (empathy_dispatch_operation_claim (approval->operation)) + empathy_tp_call_close (call); + g_object_unref (call); + + } + else + { + EmpathyCallFactory *factory = empathy_call_factory_get (); + empathy_call_factory_claim_channel (factory, approval->operation); + } +} + +static void +event_channel_process_voip_func (EventPriv *event) +{ + GtkWidget *dialog; + GtkWidget *button; + GtkWidget *image; + + if (event->approval->dialog != NULL) + { + gtk_window_present (GTK_WINDOW (event->approval->dialog)); + return; + } + + dialog = gtk_message_dialog_new (GTK_WINDOW (empathy_main_window_get()), + GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT, + GTK_MESSAGE_QUESTION, GTK_BUTTONS_NONE, _("Incoming call")); + gtk_message_dialog_format_secondary_text ( + GTK_MESSAGE_DIALOG (dialog), + _("%s is calling you, do you want to answer?"), + empathy_contact_get_name (event->approval->contact)); + + gtk_dialog_set_default_response (GTK_DIALOG (dialog), + GTK_RESPONSE_OK); + + button = gtk_dialog_add_button (GTK_DIALOG (dialog), + _("_Reject"), GTK_RESPONSE_REJECT); + image = gtk_image_new_from_icon_name (GTK_STOCK_CANCEL, + GTK_ICON_SIZE_BUTTON); + gtk_button_set_image (GTK_BUTTON (button), image); + + button = gtk_dialog_add_button (GTK_DIALOG (dialog), + _("_Answer"), GTK_RESPONSE_ACCEPT); + + image = gtk_image_new_from_icon_name (GTK_STOCK_APPLY, GTK_ICON_SIZE_BUTTON); + gtk_button_set_image (GTK_BUTTON (button), image); + + g_signal_connect (dialog, "response", + G_CALLBACK (event_manager_call_window_confirmation_dialog_response_cb), + event->approval); + + gtk_widget_show (dialog); + + event->approval->dialog = dialog; +} + static void event_manager_chat_message_received_cb (EmpathyTpChat *tp_chat, EmpathyMessage *message, EventManagerApproval *approval) @@ -432,8 +513,8 @@ event_manager_media_channel_got_name_cb (EmpathyContact *contact, empathy_contact_get_name (contact)); event_manager_add (approval->manager, - approval->contact, EMPATHY_IMAGE_VOIP, header, NULL, - approval, event_channel_process_func, NULL); + approval->contact, EMPATHY_IMAGE_VOIP, msg, + approval, event_channel_process_voip_func, NULL); g_free (header); event_manager_start_ringing (approval->manager); |