This commit was manufactured by cvs2svn to create branch 'uc'.
[gnokii.git] / xgnokii / xgnokii_dtmf.c
diff --git a/xgnokii/xgnokii_dtmf.c b/xgnokii/xgnokii_dtmf.c
new file mode 100644 (file)
index 0000000..7022db8
--- /dev/null
@@ -0,0 +1,336 @@
+/*
+
+  X G N O K I I
+
+  A Linux/Unix GUI for Nokia mobile phones.
+
+  Released under the terms of the GNU GPL, see file COPYING for more details.
+
+*/
+
+#include <stdio.h>
+#include <gtk/gtk.h>
+#include "misc.h"
+#include "xgnokii_common.h"
+#include "xgnokii.h"
+#include "xgnokii_lowlevel.h"
+#include "xgnokii_dtmf.h"
+#include "xpm/Send.xpm"
+#include "xpm/Delete.xpm"
+
+#define MAX_DTMF_LENGTH                50
+
+static GtkWidget *GUI_DTMFWindow;
+static GtkWidget *displayEntry;
+static ErrorDialog errorDialog = {NULL, NULL};
+static gchar *saveFileName;
+
+
+static inline void Help1 (GtkWidget *w, gpointer data)
+{
+  gchar *indx = g_strdup_printf ("/%s/gnokii/xgnokii/dtmf/index.htm", xgnokiiConfig.locale);
+  Help (w, indx);
+  g_free (indx);
+}
+
+
+static inline void ButtonCB (GtkWidget *widget,
+                      gpointer   data )
+{
+  gchar buf[2] = " ";
+
+  *buf = GPOINTER_TO_INT (data);
+  gtk_entry_append_text (GTK_ENTRY (displayEntry), buf);
+}
+
+
+static inline void ClearCB (GtkWidget *widget,
+                            gpointer   data )
+{
+  gtk_entry_set_text (GTK_ENTRY (displayEntry), "");
+}
+
+
+static inline void SendCB (GtkWidget *widget,
+                            gpointer   data )
+{
+  PhoneEvent *e;
+  gchar *buf = g_strdup (gtk_entry_get_text (GTK_ENTRY (displayEntry)));
+
+  if (*buf == '\0')
+  {
+    g_free (buf);
+    return;
+  }
+
+  e = g_malloc (sizeof (PhoneEvent));
+  e->event = Event_SendDTMF;
+  e->data = buf;
+  GUI_InsertEvent (e);
+}
+
+
+static void OkLoadDialog (GtkWidget *w, GtkFileSelection *fs)
+{
+  FILE *f;
+  gchar *fileName;
+  gchar line[MAX_DTMF_LENGTH + 1];
+  gchar buf[80];
+
+  fileName = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs));
+  gtk_widget_hide (GTK_WIDGET (fs));
+
+  if ((f = fopen (fileName, "r")) == NULL)
+  {
+    g_snprintf (buf, 80, _("Can't open file %s for reading!"), fileName);
+    gtk_label_set_text (GTK_LABEL(errorDialog.text), buf);
+    gtk_widget_show (errorDialog.dialog);
+    return;
+  }
+
+  fgets (line, MAX_DTMF_LENGTH + 1, f);
+  gtk_entry_set_text (GTK_ENTRY (displayEntry), line);
+  fclose (f);
+}
+
+
+static void LoadFileDialog ()
+{  
+  static GtkWidget *fileDialog = NULL;
+
+  if (fileDialog == NULL)
+  {
+    fileDialog = gtk_file_selection_new (_("Load"));
+    gtk_signal_connect (GTK_OBJECT (fileDialog), "delete_event",
+                        GTK_SIGNAL_FUNC (DeleteEvent), NULL);
+    gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->ok_button),
+                        "clicked", GTK_SIGNAL_FUNC (OkLoadDialog), (gpointer) fileDialog);
+    gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->cancel_button),
+                        "clicked", GTK_SIGNAL_FUNC (CancelDialog), (gpointer) fileDialog);
+  }
+
+  gtk_widget_show (fileDialog);
+}
+
+
+static void SaveDTMF ()
+{
+  FILE *f;
+  gchar buf[80];
+
+  if ((f = fopen (saveFileName, "w")) == NULL)
+  {
+    g_snprintf (buf, 80, _("Can't open file %s for writing!"), saveFileName);
+    gtk_label_set_text (GTK_LABEL(errorDialog.text), buf);
+    gtk_widget_show (errorDialog.dialog);
+    return;
+  }
+
+  fputs (gtk_entry_get_text (GTK_ENTRY (displayEntry)), f);
+  fclose (f);
+}
+
+
+static inline void YesSaveDialog (GtkWidget *w, gpointer data)
+{
+  gtk_widget_hide (GTK_WIDGET (data));
+  SaveDTMF();
+}
+
+
+static void OkSaveDialog (GtkWidget *w, GtkFileSelection *fs)
+{
+  FILE *f;
+  static YesNoDialog dialog = { NULL, NULL};
+  gchar err[80]; 
+
+  saveFileName = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs));
+  gtk_widget_hide (GTK_WIDGET (fs));
+
+  if ((f = fopen (saveFileName, "r")) != NULL)
+  {
+    fclose (f);
+    if (dialog.dialog == NULL)
+    {
+      CreateYesNoDialog (&dialog, YesSaveDialog, CancelDialog, GUI_DTMFWindow);
+      gtk_window_set_title (GTK_WINDOW (dialog.dialog), _("Overwrite file?"));
+      g_snprintf ( err, 80, _("File %s already exist.\nOverwrite?"), saveFileName); 
+      gtk_label_set_text (GTK_LABEL(dialog.text), err);
+    }
+    gtk_widget_show (dialog.dialog);
+  }
+  else
+    SaveDTMF ();
+}
+
+
+static void SaveFileDialog ()
+{
+  static GtkWidget *fileDialog = NULL;
+
+  if (fileDialog == NULL)
+  {
+    fileDialog = gtk_file_selection_new (_("Save"));
+    gtk_signal_connect (GTK_OBJECT (fileDialog), "delete_event",
+                        GTK_SIGNAL_FUNC (DeleteEvent), NULL);
+    gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->ok_button),
+                        "clicked", GTK_SIGNAL_FUNC (OkSaveDialog), (gpointer) fileDialog);
+    gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->cancel_button),
+                        "clicked", GTK_SIGNAL_FUNC (CancelDialog), (gpointer) fileDialog);
+  }
+
+  gtk_widget_show (fileDialog);
+}
+
+
+static inline void CloseDTMF (GtkWidget *w, gpointer data)
+{
+  gtk_widget_hide (GUI_DTMFWindow);
+}
+
+
+inline void GUI_ShowDTMF ()
+{
+  gtk_widget_show (GUI_DTMFWindow);
+}
+
+
+static GtkItemFactoryEntry menu_items[] = {
+  { NULL,              NULL,           NULL, 0, "<Branch>"},
+  { NULL,              "<control>O",   LoadFileDialog, 0, NULL},
+  { NULL,              "<control>S",   SaveFileDialog, 0, NULL},
+  { NULL,              NULL,           NULL, 0, "<Separator>"},
+  { NULL,              "<control>W",   CloseDTMF, 0, NULL},
+  { NULL,              NULL,           NULL, 0, "<LastBranch>"},
+  { NULL,              NULL,           Help1, 0, NULL},
+  { NULL,              NULL,           GUI_ShowAbout, 0, NULL},
+};
+
+
+static void InitMainMenu (void)
+{
+  menu_items[0].path = g_strdup (_("/_File"));
+  menu_items[1].path = g_strdup (_("/File/_Open"));
+  menu_items[2].path = g_strdup (_("/File/_Save"));
+  menu_items[3].path = g_strdup (_("/File/Sep1"));
+  menu_items[4].path = g_strdup (_("/File/_Close"));
+  menu_items[5].path = g_strdup (_("/_Help"));
+  menu_items[6].path = g_strdup (_("/Help/_Help"));
+  menu_items[7].path = g_strdup (_("/Help/_About"));
+}
+
+
+void GUI_CreateDTMFWindow ()
+{
+  int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
+  GtkItemFactory *item_factory;
+  GtkAccelGroup *accel_group;
+  GtkWidget *menubar;
+  GtkWidget *main_vbox;
+  GtkWidget *table;
+  GtkWidget *frame;
+  GtkWidget *button;
+  GtkWidget *pixmap;
+  gchar buf[2];
+  gint i,j;
+
+
+  InitMainMenu ();
+  GUI_DTMFWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_title (GTK_WINDOW (GUI_DTMFWindow), _("Dial Tone"));
+  //gtk_widget_set_usize (GTK_WIDGET (GUI_DTMFWindow), 436, 220);
+  gtk_signal_connect (GTK_OBJECT (GUI_DTMFWindow), "delete_event",
+                      GTK_SIGNAL_FUNC (DeleteEvent), NULL);
+  gtk_widget_realize (GUI_DTMFWindow);
+
+  accel_group = gtk_accel_group_new ();
+  item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", 
+                                       accel_group);
+
+  gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
+
+  gtk_accel_group_attach (accel_group, GTK_OBJECT (GUI_DTMFWindow));
+
+  /* Finally, return the actual menu bar created by the item factory. */ 
+  menubar = gtk_item_factory_get_widget (item_factory, "<main>");
+
+  main_vbox = gtk_vbox_new (FALSE, 1);
+  gtk_container_border_width (GTK_CONTAINER (main_vbox), 1);
+  gtk_container_add (GTK_CONTAINER (GUI_DTMFWindow), main_vbox);
+  gtk_widget_show (main_vbox);
+
+  gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, FALSE, 0);
+  gtk_widget_show (menubar);
+
+  table = gtk_table_new (8, 3, TRUE);
+
+  frame = gtk_frame_new (NULL);
+  gtk_container_add (GTK_CONTAINER (frame), table);
+  gtk_container_border_width (GTK_CONTAINER (frame), 10);
+  gtk_container_border_width (GTK_CONTAINER (table), 3);
+  gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
+  gtk_widget_show (frame);
+
+  gtk_table_set_row_spacings (GTK_TABLE (table), 2);
+  gtk_table_set_col_spacings (GTK_TABLE (table), 2);
+
+  displayEntry = gtk_entry_new_with_max_length (MAX_DTMF_LENGTH);
+  gtk_table_attach_defaults (GTK_TABLE (table), displayEntry, 0, 3, 0, 1);
+  gtk_widget_set_usize (displayEntry, 110, 22);
+
+  for (i = 0; i < 3; i++)
+    for (j = 0; j < 3; j++)
+    {
+      g_snprintf (buf, 2, "%d", j * 3 + i + 1);
+      button = gtk_button_new_with_label (buf);
+      gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                          GTK_SIGNAL_FUNC (ButtonCB), (gpointer) ((gint) *buf));
+      gtk_table_attach_defaults (GTK_TABLE (table), button, i, i + 1, j + 2, j + 3);
+    }
+
+  button = gtk_button_new_with_label ("*");
+  gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                      GTK_SIGNAL_FUNC (ButtonCB), (gpointer) '*');
+  gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 1, 5, 6);
+
+  button = gtk_button_new_with_label ("0");
+  gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                      GTK_SIGNAL_FUNC (ButtonCB), (gpointer) '0');
+  gtk_table_attach_defaults (GTK_TABLE (table), button, 1, 2, 5, 6);
+
+  button = gtk_button_new_with_label ("#");
+  gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                      GTK_SIGNAL_FUNC (ButtonCB), (gpointer) '#');
+  gtk_table_attach_defaults (GTK_TABLE (table), button, 2, 3, 5, 6);
+
+
+  button = gtk_button_new_with_label ("Pause");
+  gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                      GTK_SIGNAL_FUNC (ButtonCB), (gpointer) 'p');
+  gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 1, 6, 7);
+
+  button = gtk_button_new_with_label ("Wait");
+  gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                      GTK_SIGNAL_FUNC (ButtonCB), (gpointer) 'w');
+  gtk_table_attach_defaults (GTK_TABLE (table), button, 1, 2, 6, 7);
+
+  button = gtk_button_new ();
+  pixmap = NewPixmap(Send_xpm, GUI_DTMFWindow->window,
+                     &GUI_DTMFWindow->style->bg[GTK_STATE_NORMAL]);
+  gtk_container_add (GTK_CONTAINER (button), pixmap);
+  gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                      GTK_SIGNAL_FUNC (SendCB), (gpointer) NULL);
+  gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 3, 7, 8);
+
+  button = gtk_button_new ();
+  pixmap = NewPixmap(Delete_xpm, GUI_DTMFWindow->window,
+                     &GUI_DTMFWindow->style->bg[GTK_STATE_NORMAL]);
+  gtk_container_add (GTK_CONTAINER (button), pixmap);
+  gtk_signal_connect (GTK_OBJECT (button), "clicked",
+                      GTK_SIGNAL_FUNC (ClearCB), (gpointer) NULL);
+  gtk_table_attach_defaults (GTK_TABLE (table), button, 2, 3, 6, 7);
+
+  gtk_widget_show_all (table);
+
+  CreateErrorDialog (&errorDialog, GUI_DTMFWindow);
+}