From 1e1d8fbd34f8fd6c79a3a1a1fa83a872ee273b44 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sun, 9 May 2010 15:35:56 +0000 Subject: [PATCH] Began to implement the user interface for phone calls --- src/callbacks.c | 23 +++++++++ src/callbacks.h | 5 ++ src/phone.c | 127 +++++++++++++++++++++++++++++++++++++++++++++--- src/phone.h | 8 +++ 4 files changed, 155 insertions(+), 8 deletions(-) diff --git a/src/callbacks.c b/src/callbacks.c index 6df06bc..90459bd 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -77,6 +77,29 @@ static GdkFilterReturn _filter_message_show(Phone * phone, } +/* calls */ +/* on_phone_call_answer */ +void on_phone_call_answer(gpointer data) +{ + /* FIXME implement */ +} + + +/* on_phone_call_hangup */ +void on_phone_call_hangup(gpointer data) +{ + /* FIXME implement */ +} + + +/* on_phone_call_reject */ +void on_phone_call_reject(gpointer data) +{ + /* FIXME implement */ +} + + +/* code */ /* on_phone_code_clear */ void on_phone_code_clear(gpointer data) { diff --git a/src/callbacks.h b/src/callbacks.h index b7f9fed..87b05f4 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -26,6 +26,11 @@ gboolean on_phone_closex(gpointer data); GdkFilterReturn on_phone_filter(GdkXEvent * xevent, GdkEvent * event, gpointer data); +/* calls */ +void on_phone_call_answer(gpointer data); +void on_phone_call_hangup(gpointer data); +void on_phone_call_reject(gpointer data); + /* code */ void on_phone_code_clear(gpointer data); void on_phone_code_clicked(GtkWidget * widget, gpointer data); diff --git a/src/phone.c b/src/phone.c index 32976aa..ffa5763 100644 --- a/src/phone.c +++ b/src/phone.c @@ -71,6 +71,15 @@ struct _Phone /* widgets */ PangoFontDescription * bold; + /* call */ + GtkWidget * ca_window; + GtkWidget * ca_answer; + GtkWidget * ca_hangup; + GtkWidget * ca_image; + GtkWidget * ca_reject; + GtkWidget * ca_volume; + GtkWidget * ca_speaker; + /* code */ PhoneCode en_code; GtkWidget * en_window; @@ -106,6 +115,7 @@ struct _Phone /* prototypes */ +static GtkWidget * _phone_create_button(char const * icon, char const * label); static GtkWidget * _phone_create_dialpad(Phone * phone, char const * button1_image, char const * button1_label, GCallback button1_callback, @@ -170,6 +180,7 @@ Phone * phone_new(char const * device, unsigned int baudrate, int retry, /* widgets */ phone->bold = pango_font_description_new(); pango_font_description_set_weight(phone->bold, PANGO_WEIGHT_BOLD); + phone->ca_window = NULL; phone->en_window = NULL; phone->en_progress = NULL; phone->co_window = NULL; @@ -221,6 +232,7 @@ static gboolean _new_idle(gpointer data) { Phone * phone = data; + phone_show_call(phone, FALSE); phone_show_contacts(phone, FALSE); phone_show_dialer(phone, FALSE); phone_show_messages(phone, FALSE); @@ -448,6 +460,99 @@ void phone_messages_write(Phone * phone, char const * number, char const * text) /* show */ +/* phone_show_call */ +void phone_show_call(Phone * phone, gboolean show, ...) +{ + va_list ap; + PhoneCall call; + GtkWidget * vbox; + GtkWidget * hbox; + + if(show == FALSE) + { + if(phone->ca_window != NULL) + gtk_widget_hide(phone->ca_window); + return; + } + va_start(ap, show); + call = va_arg(ap, PhoneCall); + va_end(ap); + if(phone->ca_window == NULL) + { + phone->ca_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_default_size(GTK_WINDOW(phone->ca_window), 200, + 300); +#if GTK_CHECK_VERSION(2, 6, 0) + gtk_window_set_icon_name(GTK_WINDOW(phone->ca_window), + "call-start"); +#endif + vbox = gtk_vbox_new(FALSE, 4); + gtk_container_set_border_width(GTK_CONTAINER(vbox), 4); + /* buttons */ + phone->ca_answer = _phone_create_button("call-start", + _("Answer")); + g_signal_connect_swapped(G_OBJECT(phone->ca_answer), "clicked", + G_CALLBACK(on_phone_call_answer), phone); + gtk_box_pack_start(GTK_BOX(vbox), phone->ca_answer, FALSE, TRUE, + 0); + phone->ca_hangup = _phone_create_button("call-stop", + _("Hangup")); + g_signal_connect_swapped(G_OBJECT(phone->ca_hangup), "clicked", + G_CALLBACK(on_phone_call_hangup), phone); + gtk_box_pack_start(GTK_BOX(vbox), phone->ca_hangup, FALSE, TRUE, + 0); + phone->ca_reject = _phone_create_button("call-stop", + _("Reject")); + g_signal_connect_swapped(G_OBJECT(phone->ca_reject), "clicked", + G_CALLBACK(on_phone_call_reject), phone); + gtk_box_pack_start(GTK_BOX(vbox), phone->ca_reject, FALSE, TRUE, + 0); + hbox = gtk_hbox_new(FALSE, 0); + phone->ca_image = gtk_image_new_from_icon_name( + "audio-volume-muted", GTK_ICON_SIZE_BUTTON); + gtk_box_pack_start(GTK_BOX(hbox), phone->ca_image, FALSE, TRUE, + 4); + phone->ca_volume = gtk_hscale_new_with_range(0.0, 1.0, 0.02); + gtk_box_pack_start(GTK_BOX(hbox), phone->ca_volume, TRUE, TRUE, + 0); + gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, TRUE, 0); + phone->ca_speaker = gtk_toggle_button_new_with_label( + _("Loudspeaker")); + gtk_button_set_image(GTK_BUTTON(phone->ca_speaker), + gtk_image_new_from_icon_name("stock_volume", + GTK_ICON_SIZE_BUTTON)); + gtk_box_pack_start(GTK_BOX(vbox), phone->ca_speaker, FALSE, + TRUE, 0); + gtk_container_add(GTK_CONTAINER(phone->ca_window), vbox); + } + phone_show_dialer(phone, FALSE); + gtk_window_set_transient_for(GTK_WINDOW(phone->ca_window), GTK_WINDOW( + phone->di_window)); + gtk_widget_show_all(phone->ca_window); + switch(call) + { + case PHONE_CALL_ESTABLISHED: + gtk_window_set_title(GTK_WINDOW(phone->ca_window), + _("In conversation")); + gtk_widget_hide(phone->ca_answer); + gtk_widget_hide(phone->ca_reject); + break; + case PHONE_CALL_INCOMING: + gtk_window_set_title(GTK_WINDOW(phone->ca_window), + _("Incoming call")); + gtk_widget_hide(phone->ca_hangup); + break; + case PHONE_CALL_OUTGOING: + gtk_window_set_title(GTK_WINDOW(phone->ca_window), + _("Outgoing call")); + gtk_widget_hide(phone->ca_answer); + gtk_widget_hide(phone->ca_reject); + break; + } + gtk_window_present(GTK_WINDOW(phone->ca_window)); +} + + /* phone_show_code */ void phone_show_code(Phone * phone, gboolean show, ...) { @@ -703,17 +808,11 @@ void phone_show_messages(Phone * phone, gboolean show) * - each GtkTreeView has a GtkTreeModelFilter as model * - each GtkTreeModelFilter is a variant of the GtkListStore */ hbox = gtk_hbox_new(TRUE, 0); - widget = gtk_button_new_with_label(_("Inbox")); - gtk_button_set_image(GTK_BUTTON(widget), - gtk_image_new_from_icon_name("stock_inbox", - GTK_ICON_SIZE_BUTTON)); + widget = _phone_create_button("stock_inbox", _("Inbox")); g_signal_connect_swapped(G_OBJECT(widget), "clicked", G_CALLBACK(on_phone_messages_inbox), phone); gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0); - widget = gtk_button_new_with_label(_("Sent")); - gtk_button_set_image(GTK_BUTTON(widget), - gtk_image_new_from_icon_name("stock_outbox", - GTK_ICON_SIZE_BUTTON)); + widget = _phone_create_button("stock_outbox", _("Sent")); g_signal_connect_swapped(G_OBJECT(widget), "clicked", G_CALLBACK(on_phone_messages_outbox), phone); gtk_box_pack_start(GTK_BOX(hbox), widget, TRUE, TRUE, 0); @@ -891,6 +990,18 @@ void phone_write_send(Phone * phone) /* private */ +/* phone_create_button */ +static GtkWidget * _phone_create_button(char const * icon, char const * label) +{ + GtkWidget * ret; + + ret = gtk_button_new_with_label(label); + gtk_button_set_image(GTK_BUTTON(ret), gtk_image_new_from_icon_name(icon, + GTK_ICON_SIZE_BUTTON)); + return ret; +} + + /* phone_create_dialpad */ static GtkWidget * _phone_create_dialpad(Phone * phone, char const * button1_image, char const * button1_label, diff --git a/src/phone.h b/src/phone.h index 848d14d..b4da8ed 100644 --- a/src/phone.h +++ b/src/phone.h @@ -25,6 +25,13 @@ /* types */ typedef struct _Phone Phone; +typedef enum _PhoneCall +{ + PHONE_CALL_ESTABLISHED = 0, + PHONE_CALL_INCOMING, + PHONE_CALL_OUTGOING +} PhoneCall; + typedef enum _PhoneCode { PHONE_CODE_SIM_PIN = 0 @@ -58,6 +65,7 @@ void phone_delete(Phone * phone); int phone_error(Phone * phone, char const * message, int ret); /* interface */ +void phone_show_call(Phone * phone, gboolean show, ...); void phone_show_code(Phone * phone, gboolean show, ...); void phone_show_contacts(Phone * phone, gboolean show); void phone_show_dialer(Phone * phone, gboolean show);