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);