diff --git a/src/callbacks.c b/src/callbacks.c index 92f544d..aed1892 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -23,9 +23,10 @@ /* on_phone_closex */ gboolean on_phone_closex(gpointer data) { - /* FIXME is that all? */ - gtk_main_quit(); - return FALSE; + GtkWidget * widget = data; + + gtk_widget_hide(widget); + return TRUE; } diff --git a/src/phone.c b/src/phone.c index 60b0b0b..ff0e1c6 100644 --- a/src/phone.c +++ b/src/phone.c @@ -34,127 +34,72 @@ struct _Phone GSM * gsm; /* widgets */ - /* dialpad */ + PangoFontDescription * bold; + + /* contacts */ + GtkWidget * co_window; + + /* dialer */ + GtkWidget * di_window; GtkWidget * di_entry; + + /* messages */ + GtkWidget * me_window; }; +/* prototypes */ +static GtkWidget * _phone_create_dialpad(Phone * phone); + + /* public */ /* functions */ /* phone_new */ -static GtkWidget * _new_dialpad(Phone * phone); +static gboolean _new_idle(gpointer data); Phone * phone_new(char const * device, unsigned int baudrate) { Phone * phone; - PangoFontDescription * desc; - GtkWidget * window; - GtkWidget * vbox; - GtkWidget * widget; #ifdef DEBUG fprintf(stderr, "DEBUG: %s(\"%s\", %u)\n", __func__, device, baudrate); #endif if((phone = malloc(sizeof(*phone))) == NULL) return NULL; - desc = pango_font_description_new(); - pango_font_description_set_weight(desc, PANGO_WEIGHT_BOLD); if(device == NULL) device = "/dev/modem"; phone->gsm = gsm_new(device, baudrate); + /* widgets */ + phone->bold = pango_font_description_new(); + pango_font_description_set_weight(phone->bold, PANGO_WEIGHT_BOLD); + phone->di_window = NULL; + phone->co_window = NULL; + phone->me_window = NULL; + /* check errors */ if(phone->gsm == NULL) { phone_delete(phone); return NULL; } - window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_title(GTK_WINDOW(window), "Phone"); - g_signal_connect_swapped(G_OBJECT(window), "delete-event", G_CALLBACK( - on_phone_closex), phone); - vbox = gtk_vbox_new(FALSE, 0); - /* entry */ - phone->di_entry = gtk_entry_new(); - gtk_widget_modify_font(phone->di_entry, desc); - gtk_box_pack_start(GTK_BOX(vbox), phone->di_entry, FALSE, TRUE, 0); - /* dialpad */ - widget = _new_dialpad(phone); - gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, TRUE, 0); - gtk_container_add(GTK_CONTAINER(window), vbox); - gtk_widget_show_all(window); - pango_font_description_free(desc); + g_idle_add(_new_idle, phone); return phone; } -static GtkWidget * _new_dialpad(Phone * phone) +static gboolean _new_idle(gpointer data) { - static struct - { - char character; - char const * label; - } numbers[12] = { - { '1', "_1\n" }, - { '2', "_2\nABC" }, - { '3', "_3\nDEF" }, - { '4', "_4\nGHI" }, - { '5', "_5\nJKL" }, - { '6', "_6\nMNO" }, - { '7', "_7\nPQRS" }, - { '8', "_8\nTUV" }, - { '9', "_9\nWXYZ" }, - { '*', "_*\n+" }, - { '0', "_0\n" }, - { '#', "_#\n" } - }; - GtkWidget * table; - GtkWidget * button; - GtkWidget * image; - GtkWidget * label; - int i; + Phone * phone = data; - table = gtk_table_new(5, 6, TRUE); - /* call */ - button = gtk_button_new(); - image = gtk_image_new_from_icon_name("call-start", - GTK_ICON_SIZE_BUTTON); - gtk_button_set_image(GTK_BUTTON(button), image); - gtk_button_set_label(GTK_BUTTON(button), _("Call")); - g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK( - on_phone_dialpad_call), phone); - gtk_table_attach(GTK_TABLE(table), button, 0, 3, 0, 1, - GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 2, 2); - button = gtk_button_new(); - image = gtk_image_new_from_icon_name("call-stop", GTK_ICON_SIZE_BUTTON); - gtk_button_set_image(GTK_BUTTON(button), image); - gtk_button_set_label(GTK_BUTTON(button), _("Hang up")); - g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK( - on_phone_dialpad_hangup), phone); - gtk_table_attach(GTK_TABLE(table), button, 3, 6, 0, 1, - GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 2, 2); - /* numbers */ - for(i = 0; i < 12; i++) - { - button = gtk_button_new(); - label = gtk_label_new(NULL); - gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); - gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), - numbers[i].label); - gtk_container_add(GTK_CONTAINER(button), label); - g_object_set_data(G_OBJECT(button), "character", - &numbers[i].character); - g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK( - on_phone_dialpad_clicked), phone); - gtk_table_attach(GTK_TABLE(table), button, (i % 3) * 2, - ((i % 3) + 1) * 2, (i / 3) + 1, (i / 3) + 2, - GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, - 2, 2); - } - return table; + phone_show_contacts(phone, FALSE); + phone_show_dialer(phone, TRUE); + phone_show_messages(phone, FALSE); + return FALSE; } /* phone_delete */ void phone_delete(Phone * phone) { + pango_font_description_free(phone->bold); if(phone->gsm != NULL) gsm_delete(phone->gsm); free(phone); @@ -222,3 +167,144 @@ void phone_hangup(Phone * phone) gsm_hangup(phone->gsm); gtk_entry_set_text(GTK_ENTRY(phone->di_entry), ""); } + + +/* phone_show_contacts */ +void phone_show_contacts(Phone * phone, gboolean show) +{ + if(phone->co_window == NULL) + { + phone->co_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(phone->co_window), + _("Contacts")); + g_signal_connect_swapped(G_OBJECT(phone->co_window), + "delete-event", G_CALLBACK(on_phone_closex), + phone->co_window); + /* FIXME implement */ + } + if(show) + gtk_widget_show(phone->co_window); /* XXX force focus? */ + else + gtk_widget_hide(phone->co_window); +} + + +/* phone_show_dialer */ +void phone_show_dialer(Phone * phone, gboolean show) +{ + GtkWidget * vbox; + GtkWidget * widget; + + if(phone->di_window == NULL) + { + phone->di_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(phone->di_window), _("Dialer")); + g_signal_connect_swapped(G_OBJECT(phone->di_window), + "delete-event", G_CALLBACK(on_phone_closex), + phone->di_window); + vbox = gtk_vbox_new(FALSE, 0); + /* entry */ + phone->di_entry = gtk_entry_new(); + gtk_widget_modify_font(phone->di_entry, phone->bold); + gtk_box_pack_start(GTK_BOX(vbox), phone->di_entry, FALSE, TRUE, + 0); + /* dialpad */ + widget = _phone_create_dialpad(phone); + gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, TRUE, 0); + gtk_container_add(GTK_CONTAINER(phone->di_window), vbox); + gtk_widget_show_all(vbox); + } + if(show) + gtk_widget_show(phone->di_window); /* XXX force focus? */ + else + gtk_widget_hide(phone->di_window); +} + + +/* phone_show_messages */ +void phone_show_messages(Phone * phone, gboolean show) +{ + if(phone->me_window == NULL) + { + phone->me_window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_title(GTK_WINDOW(phone->me_window), + _("Messages")); + g_signal_connect_swapped(G_OBJECT(phone->me_window), + "delete-event", G_CALLBACK(on_phone_closex), + phone->me_window); + /* FIXME implement */ + } + if(show) + gtk_widget_show(phone->me_window); /* XXX force focus? */ + else + gtk_widget_hide(phone->me_window); +} + + +/* private */ +/* phone_create_dialpad */ +static GtkWidget * _phone_create_dialpad(Phone * phone) +{ + static struct + { + char character; + char const * label; + } numbers[12] = { + { '1', "_1\n" }, + { '2', "_2\nABC" }, + { '3', "_3\nDEF" }, + { '4', "_4\nGHI" }, + { '5', "_5\nJKL" }, + { '6', "_6\nMNO" }, + { '7', "_7\nPQRS" }, + { '8', "_8\nTUV" }, + { '9', "_9\nWXYZ" }, + { '*', "_*\n+" }, + { '0', "_0\n" }, + { '#', "_#\n" } + }; + GtkWidget * table; + GtkWidget * button; + GtkWidget * image; + GtkWidget * label; + int i; + + table = gtk_table_new(5, 6, TRUE); + /* call */ + button = gtk_button_new(); + image = gtk_image_new_from_icon_name("call-start", + GTK_ICON_SIZE_BUTTON); + gtk_button_set_image(GTK_BUTTON(button), image); + gtk_button_set_label(GTK_BUTTON(button), _("Call")); + g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK( + on_phone_dialpad_call), phone); + gtk_table_attach(GTK_TABLE(table), button, 0, 3, 0, 1, + GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 2, 2); + button = gtk_button_new(); + image = gtk_image_new_from_icon_name("call-stop", GTK_ICON_SIZE_BUTTON); + gtk_button_set_image(GTK_BUTTON(button), image); + gtk_button_set_label(GTK_BUTTON(button), _("Hang up")); + g_signal_connect_swapped(G_OBJECT(button), "clicked", G_CALLBACK( + on_phone_dialpad_hangup), phone); + gtk_table_attach(GTK_TABLE(table), button, 3, 6, 0, 1, + GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, 2, 2); + /* numbers */ + for(i = 0; i < 12; i++) + { + button = gtk_button_new(); + label = gtk_label_new(NULL); + gtk_label_set_justify(GTK_LABEL(label), GTK_JUSTIFY_CENTER); + gtk_label_set_markup_with_mnemonic(GTK_LABEL(label), + numbers[i].label); + gtk_container_add(GTK_CONTAINER(button), label); + g_object_set_data(G_OBJECT(button), "character", + &numbers[i].character); + g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK( + on_phone_dialpad_clicked), phone); + gtk_table_attach(GTK_TABLE(table), button, (i % 3) * 2, + ((i % 3) + 1) * 2, (i / 3) + 1, (i / 3) + 2, + GTK_EXPAND | GTK_FILL, GTK_EXPAND | GTK_FILL, + 2, 2); + } + return table; +} diff --git a/src/phone.h b/src/phone.h index 5995cb0..01789b3 100644 --- a/src/phone.h +++ b/src/phone.h @@ -18,6 +18,8 @@ #ifndef PHONE_PHONE_H # define PHONE_PHONE_H +# include + /* Phone */ /* types */ @@ -32,6 +34,12 @@ void phone_delete(Phone * phone); /* useful */ int phone_error(Phone * phone, char const * message, int ret); +/* interface */ +void phone_show_contacts(Phone * phone, gboolean show); +void phone_show_dialer(Phone * phone, gboolean show); +void phone_show_messages(Phone * phone, gboolean show); + +/* dialer */ void phone_call(Phone * phone, char const * number); void phone_hangup(Phone * phone);