Fixed fatal linker error (global symbol conflict of "writephonebook")
[gnokii.git] / xgnokii / xgnokii_dtmf.c
1 /*
2
3   X G N O K I I
4
5   A Linux/Unix GUI for Nokia mobile phones.
6   Copyright (C) 1999 Pavel Janík ml., Hugh Blemings
7   & Ján Derfiòák <ja@mail.upjs.sk>.
8
9   Released under the terms of the GNU GPL, see file COPYING for more details.
10
11   Last modification: Sun Apr 30 2000
12   Modified by Jan Derfinak
13
14 */
15
16 #include <stdio.h>
17 #include <gtk/gtk.h>
18 #include "misc.h"
19 #include "xgnokii_common.h"
20 #include "xgnokii.h"
21 #include "xgnokii_lowlevel.h"
22 #include "xgnokii_dtmf.h"
23 #include "xpm/Send.xpm"
24 #include "xpm/Delete.xpm"
25
26 #define MAX_DTMF_LENGTH         50
27
28 static GtkWidget *GUI_DTMFWindow;
29 static GtkWidget *displayEntry;
30 static ErrorDialog errorDialog = {NULL, NULL};
31 static gchar *saveFileName;
32
33
34 static inline void Help1 (GtkWidget *w, gpointer data)
35 {
36   gchar *indx = g_strdup_printf ("/help/%s/windows/dtmf/index.html", xgnokiiConfig.locale);
37   Help (w, indx);
38   g_free (indx);
39 }
40
41
42 static inline void ButtonCB (GtkWidget *widget,
43                       gpointer   data )
44 {
45   gchar buf[2] = " ";
46
47   *buf = GPOINTER_TO_INT (data);
48   gtk_entry_append_text (GTK_ENTRY (displayEntry), buf);
49 }
50
51
52 static inline void ClearCB (GtkWidget *widget,
53                             gpointer   data )
54 {
55   gtk_entry_set_text (GTK_ENTRY (displayEntry), "");
56 }
57
58
59 static inline void SendCB (GtkWidget *widget,
60                             gpointer   data )
61 {
62   PhoneEvent *e;
63   gchar *buf = g_strdup (gtk_entry_get_text (GTK_ENTRY (displayEntry)));
64
65   if (*buf == '\0')
66   {
67     g_free (buf);
68     return;
69   }
70
71   e = g_malloc (sizeof (PhoneEvent));
72   e->event = Event_SendDTMF;
73   e->data = buf;
74   GUI_InsertEvent (e);
75 }
76
77
78 static void OkLoadDialog (GtkWidget *w, GtkFileSelection *fs)
79 {
80   FILE *f;
81   gchar *fileName;
82   gchar line[MAX_DTMF_LENGTH + 1];
83   gchar buf[80];
84
85   fileName = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs));
86   gtk_widget_hide (GTK_WIDGET (fs));
87
88   if ((f = fopen (fileName, "r")) == NULL)
89   {
90     g_snprintf (buf, 80, _("Can't open file %s for reading!"), fileName);
91     gtk_label_set_text (GTK_LABEL(errorDialog.text), buf);
92     gtk_widget_show (errorDialog.dialog);
93     return;
94   }
95
96   fgets (line, MAX_DTMF_LENGTH + 1, f);
97   gtk_entry_set_text (GTK_ENTRY (displayEntry), line);
98   fclose (f);
99 }
100
101
102 static void LoadFileDialog ()
103 {  
104   static GtkWidget *fileDialog = NULL;
105
106   if (fileDialog == NULL)
107   {
108     fileDialog = gtk_file_selection_new (_("Load"));
109     gtk_signal_connect (GTK_OBJECT (fileDialog), "delete_event",
110                         GTK_SIGNAL_FUNC (DeleteEvent), NULL);
111     gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->ok_button),
112                         "clicked", GTK_SIGNAL_FUNC (OkLoadDialog), (gpointer) fileDialog);
113     gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->cancel_button),
114                         "clicked", GTK_SIGNAL_FUNC (CancelDialog), (gpointer) fileDialog);
115   }
116
117   gtk_widget_show (fileDialog);
118 }
119
120
121 static void SaveDTMF ()
122 {
123   FILE *f;
124   gchar buf[80];
125
126   if ((f = fopen (saveFileName, "w")) == NULL)
127   {
128     g_snprintf (buf, 80, _("Can't open file %s for writing!"), saveFileName);
129     gtk_label_set_text (GTK_LABEL(errorDialog.text), buf);
130     gtk_widget_show (errorDialog.dialog);
131     return;
132   }
133
134   fputs (gtk_entry_get_text (GTK_ENTRY (displayEntry)), f);
135   fclose (f);
136 }
137
138
139 static inline void YesSaveDialog (GtkWidget *w, gpointer data)
140 {
141   gtk_widget_hide (GTK_WIDGET (data));
142   SaveDTMF();
143 }
144
145
146 static void OkSaveDialog (GtkWidget *w, GtkFileSelection *fs)
147 {
148   FILE *f;
149   static YesNoDialog dialog = { NULL, NULL};
150   gchar err[80]; 
151
152   saveFileName = gtk_file_selection_get_filename (GTK_FILE_SELECTION (fs));
153   gtk_widget_hide (GTK_WIDGET (fs));
154
155   if ((f = fopen (saveFileName, "r")) != NULL)
156   {
157     fclose (f);
158     if (dialog.dialog == NULL)
159     {
160       CreateYesNoDialog (&dialog, YesSaveDialog, CancelDialog, GUI_DTMFWindow);
161       gtk_window_set_title (GTK_WINDOW (dialog.dialog), _("Overwrite file?"));
162       g_snprintf ( err, 80, _("File %s already exist.\nOverwrite?"), saveFileName); 
163       gtk_label_set_text (GTK_LABEL(dialog.text), err);
164     }
165     gtk_widget_show (dialog.dialog);
166   }
167   else
168     SaveDTMF ();
169 }
170
171
172 static void SaveFileDialog ()
173 {
174   static GtkWidget *fileDialog = NULL;
175
176   if (fileDialog == NULL)
177   {
178     fileDialog = gtk_file_selection_new (_("Save"));
179     gtk_signal_connect (GTK_OBJECT (fileDialog), "delete_event",
180                         GTK_SIGNAL_FUNC (DeleteEvent), NULL);
181     gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->ok_button),
182                         "clicked", GTK_SIGNAL_FUNC (OkSaveDialog), (gpointer) fileDialog);
183     gtk_signal_connect (GTK_OBJECT (GTK_FILE_SELECTION (fileDialog)->cancel_button),
184                         "clicked", GTK_SIGNAL_FUNC (CancelDialog), (gpointer) fileDialog);
185   }
186
187   gtk_widget_show (fileDialog);
188 }
189
190
191 static inline void CloseDTMF (GtkWidget *w, gpointer data)
192 {
193   gtk_widget_hide (GUI_DTMFWindow);
194 }
195
196
197 inline void GUI_ShowDTMF ()
198 {
199   gtk_widget_show (GUI_DTMFWindow);
200 }
201
202
203 static GtkItemFactoryEntry menu_items[] = {
204   { NULL,               NULL,           NULL, 0, "<Branch>"},
205   { NULL,               "<control>O",   LoadFileDialog, 0, NULL},
206   { NULL,               "<control>S",   SaveFileDialog, 0, NULL},
207   { NULL,               NULL,           NULL, 0, "<Separator>"},
208   { NULL,               "<control>W",   CloseDTMF, 0, NULL},
209   { NULL,               NULL,           NULL, 0, "<LastBranch>"},
210   { NULL,               NULL,           Help1, 0, NULL},
211   { NULL,               NULL,           GUI_ShowAbout, 0, NULL},
212 };
213
214
215 static void InitMainMenu (void)
216 {
217   menu_items[0].path = g_strdup (_("/_File"));
218   menu_items[1].path = g_strdup (_("/File/_Open"));
219   menu_items[2].path = g_strdup (_("/File/_Save"));
220   menu_items[3].path = g_strdup (_("/File/Sep1"));
221   menu_items[4].path = g_strdup (_("/File/_Close"));
222   menu_items[5].path = g_strdup (_("/_Help"));
223   menu_items[6].path = g_strdup (_("/Help/_Help"));
224   menu_items[7].path = g_strdup (_("/Help/_About"));
225 }
226
227
228 void GUI_CreateDTMFWindow ()
229 {
230   int nmenu_items = sizeof (menu_items) / sizeof (menu_items[0]);
231   GtkItemFactory *item_factory;
232   GtkAccelGroup *accel_group;
233   GtkWidget *menubar;
234   GtkWidget *main_vbox;
235   GtkWidget *table;
236   GtkWidget *frame;
237   GtkWidget *button;
238   GtkWidget *pixmap;
239   gchar buf[2];
240   gint i,j;
241
242
243   InitMainMenu ();
244   GUI_DTMFWindow = gtk_window_new (GTK_WINDOW_TOPLEVEL);
245   gtk_window_set_wmclass (GTK_WINDOW (GUI_DTMFWindow), "DTMFWindow", "Xgnokii");
246   gtk_window_set_title (GTK_WINDOW (GUI_DTMFWindow), _("Dial Tone"));
247   //gtk_widget_set_usize (GTK_WIDGET (GUI_DTMFWindow), 436, 220);
248   gtk_signal_connect (GTK_OBJECT (GUI_DTMFWindow), "delete_event",
249                       GTK_SIGNAL_FUNC (DeleteEvent), NULL);
250   gtk_widget_realize (GUI_DTMFWindow);
251
252   accel_group = gtk_accel_group_new ();
253   item_factory = gtk_item_factory_new (GTK_TYPE_MENU_BAR, "<main>", 
254                                        accel_group);
255
256   gtk_item_factory_create_items (item_factory, nmenu_items, menu_items, NULL);
257
258   gtk_accel_group_attach (accel_group, GTK_OBJECT (GUI_DTMFWindow));
259
260   /* Finally, return the actual menu bar created by the item factory. */ 
261   menubar = gtk_item_factory_get_widget (item_factory, "<main>");
262
263   main_vbox = gtk_vbox_new (FALSE, 1);
264   gtk_container_border_width (GTK_CONTAINER (main_vbox), 1);
265   gtk_container_add (GTK_CONTAINER (GUI_DTMFWindow), main_vbox);
266   gtk_widget_show (main_vbox);
267
268   gtk_box_pack_start (GTK_BOX (main_vbox), menubar, FALSE, FALSE, 0);
269   gtk_widget_show (menubar);
270
271   table = gtk_table_new (8, 3, TRUE);
272
273   frame = gtk_frame_new (NULL);
274   gtk_container_add (GTK_CONTAINER (frame), table);
275   gtk_container_border_width (GTK_CONTAINER (frame), 10);
276   gtk_container_border_width (GTK_CONTAINER (table), 3);
277   gtk_box_pack_start (GTK_BOX (main_vbox), frame, FALSE, FALSE, 0);
278   gtk_widget_show (frame);
279
280   gtk_table_set_row_spacings (GTK_TABLE (table), 2);
281   gtk_table_set_col_spacings (GTK_TABLE (table), 2);
282
283   displayEntry = gtk_entry_new_with_max_length (MAX_DTMF_LENGTH);
284   gtk_table_attach_defaults (GTK_TABLE (table), displayEntry, 0, 3, 0, 1);
285   gtk_widget_set_usize (displayEntry, 110, 22);
286
287   for (i = 0; i < 3; i++)
288     for (j = 0; j < 3; j++)
289     {
290       g_snprintf (buf, 2, "%d", j * 3 + i + 1);
291       button = gtk_button_new_with_label (buf);
292       gtk_signal_connect (GTK_OBJECT (button), "clicked",
293                           GTK_SIGNAL_FUNC (ButtonCB), (gpointer) ((gint) *buf));
294       gtk_table_attach_defaults (GTK_TABLE (table), button, i, i + 1, j + 2, j + 3);
295     }
296
297   button = gtk_button_new_with_label ("*");
298   gtk_signal_connect (GTK_OBJECT (button), "clicked",
299                       GTK_SIGNAL_FUNC (ButtonCB), (gpointer) '*');
300   gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 1, 5, 6);
301
302   button = gtk_button_new_with_label ("0");
303   gtk_signal_connect (GTK_OBJECT (button), "clicked",
304                       GTK_SIGNAL_FUNC (ButtonCB), (gpointer) '0');
305   gtk_table_attach_defaults (GTK_TABLE (table), button, 1, 2, 5, 6);
306
307   button = gtk_button_new_with_label ("#");
308   gtk_signal_connect (GTK_OBJECT (button), "clicked",
309                       GTK_SIGNAL_FUNC (ButtonCB), (gpointer) '#');
310   gtk_table_attach_defaults (GTK_TABLE (table), button, 2, 3, 5, 6);
311
312
313   button = gtk_button_new_with_label ("Pause");
314   gtk_signal_connect (GTK_OBJECT (button), "clicked",
315                       GTK_SIGNAL_FUNC (ButtonCB), (gpointer) 'p');
316   gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 1, 6, 7);
317
318   button = gtk_button_new_with_label ("Wait");
319   gtk_signal_connect (GTK_OBJECT (button), "clicked",
320                       GTK_SIGNAL_FUNC (ButtonCB), (gpointer) 'w');
321   gtk_table_attach_defaults (GTK_TABLE (table), button, 1, 2, 6, 7);
322
323   button = gtk_button_new ();
324   pixmap = NewPixmap(Send_xpm, GUI_DTMFWindow->window,
325                      &GUI_DTMFWindow->style->bg[GTK_STATE_NORMAL]);
326   gtk_container_add (GTK_CONTAINER (button), pixmap);
327   gtk_signal_connect (GTK_OBJECT (button), "clicked",
328                       GTK_SIGNAL_FUNC (SendCB), (gpointer) NULL);
329   gtk_table_attach_defaults (GTK_TABLE (table), button, 0, 3, 7, 8);
330
331   button = gtk_button_new ();
332   pixmap = NewPixmap(Delete_xpm, GUI_DTMFWindow->window,
333                      &GUI_DTMFWindow->style->bg[GTK_STATE_NORMAL]);
334   gtk_container_add (GTK_CONTAINER (button), pixmap);
335   gtk_signal_connect (GTK_OBJECT (button), "clicked",
336                       GTK_SIGNAL_FUNC (ClearCB), (gpointer) NULL);
337   gtk_table_attach_defaults (GTK_TABLE (table), button, 2, 3, 6, 7);
338
339   gtk_widget_show_all (table);
340
341   CreateErrorDialog (&errorDialog, GUI_DTMFWindow);
342 }