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>.
9 Released under the terms of the GNU GPL, see file COPYING for more details.
11 Last modification: Mon May 01 2000
12 Modified by Jan Derfinak
18 # include <sys/types.h>
19 # include <sys/wait.h>
24 #include "misc.h" /* for _() */
25 #include "xgnokii_common.h"
27 #include "xpm/quest.xpm"
28 #include "xpm/stop.xpm"
29 #include "xpm/info.xpm"
37 static GSList *guiEvents = NULL;
40 inline void DeleteEvent (const GtkWidget *widget, const GdkEvent *event, const gpointer data)
42 gtk_widget_hide (GTK_WIDGET (widget));
46 inline void CancelDialog (const GtkWidget *widget, const gpointer data)
48 gtk_widget_hide (GTK_WIDGET (data));
52 void CreateErrorDialog (ErrorDialog *errorDialog, GtkWidget *window)
54 GtkWidget *button, *hbox, *pixmap;
56 errorDialog->dialog = gtk_dialog_new ();
57 gtk_window_set_title (GTK_WINDOW (errorDialog->dialog), _("Error"));
58 gtk_window_set_modal (GTK_WINDOW (errorDialog->dialog), TRUE);
59 gtk_window_position (GTK_WINDOW (errorDialog->dialog), GTK_WIN_POS_MOUSE);
60 gtk_container_set_border_width (GTK_CONTAINER (errorDialog->dialog), 5);
61 gtk_signal_connect (GTK_OBJECT (errorDialog->dialog), "delete_event",
62 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
64 button = gtk_button_new_with_label (_("Cancel"));
65 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (errorDialog->dialog)->action_area),
66 button, FALSE, FALSE, 0);
67 gtk_signal_connect (GTK_OBJECT (button), "clicked",
68 GTK_SIGNAL_FUNC (CancelDialog), (gpointer) errorDialog->dialog);
69 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
70 gtk_widget_grab_default (button);
71 gtk_widget_show (button);
73 hbox = gtk_hbox_new (FALSE, 0);
74 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (errorDialog->dialog)->vbox), hbox);
75 gtk_widget_show (hbox);
79 pixmap = NewPixmap (stop_xpm, window->window,
80 &window->style->bg[GTK_STATE_NORMAL]);
81 gtk_box_pack_start (GTK_BOX(hbox), pixmap, FALSE, FALSE, 10);
82 gtk_widget_show (pixmap);
85 errorDialog->text = gtk_label_new ("");
86 gtk_box_pack_start (GTK_BOX(hbox), errorDialog->text, FALSE, FALSE, 10);
87 gtk_widget_show (errorDialog->text);
91 void CreateInfoDialog (InfoDialog *infoDialog, GtkWidget *window)
93 GtkWidget *hbox, *pixmap;
95 infoDialog->dialog = gtk_dialog_new ();
96 gtk_window_set_title (GTK_WINDOW (infoDialog->dialog), _("Info"));
97 gtk_window_set_modal (GTK_WINDOW (infoDialog->dialog), TRUE);
98 gtk_window_position (GTK_WINDOW (infoDialog->dialog), GTK_WIN_POS_MOUSE);
99 gtk_container_set_border_width (GTK_CONTAINER (infoDialog->dialog), 5);
100 gtk_signal_connect (GTK_OBJECT (infoDialog->dialog), "delete_event",
101 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
103 hbox = gtk_hbox_new (FALSE, 0);
104 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (infoDialog->dialog)->vbox), hbox);
105 gtk_widget_show_now (hbox);
109 pixmap = NewPixmap (info_xpm, window->window,
110 &window->style->bg[GTK_STATE_NORMAL]);
111 gtk_box_pack_start (GTK_BOX(hbox), pixmap, FALSE, FALSE, 10);
112 gtk_widget_show_now (pixmap);
115 infoDialog->text = gtk_label_new ("");
116 gtk_box_pack_start (GTK_BOX(hbox), infoDialog->text, FALSE, FALSE, 10);
117 gtk_widget_show_now (infoDialog->text);
121 void CreateYesNoDialog (YesNoDialog *yesNoDialog, const GtkSignalFunc yesFunc,
122 const GtkSignalFunc noFunc, GtkWidget *window)
124 GtkWidget *button, *hbox, *pixmap;
126 yesNoDialog->dialog = gtk_dialog_new ();
127 gtk_window_position (GTK_WINDOW (yesNoDialog->dialog), GTK_WIN_POS_MOUSE);
128 gtk_window_set_modal (GTK_WINDOW (yesNoDialog->dialog), TRUE);
129 gtk_container_set_border_width (GTK_CONTAINER (yesNoDialog->dialog), 5);
130 gtk_signal_connect (GTK_OBJECT (yesNoDialog->dialog), "delete_event",
131 GTK_SIGNAL_FUNC (DeleteEvent), NULL);
134 button = gtk_button_new_with_label (_("Yes"));
135 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (yesNoDialog->dialog)->action_area),
136 button, FALSE, TRUE, 0);
137 gtk_signal_connect (GTK_OBJECT (button), "clicked",
138 GTK_SIGNAL_FUNC (yesFunc), (gpointer) yesNoDialog->dialog);
139 GTK_WIDGET_SET_FLAGS (button, GTK_CAN_DEFAULT);
140 gtk_widget_grab_default (button);
141 gtk_widget_show (button);
143 button = gtk_button_new_with_label (_("No"));
144 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (yesNoDialog->dialog)->action_area),
145 button, FALSE, TRUE, 0);
146 gtk_signal_connect (GTK_OBJECT (button), "clicked",
147 GTK_SIGNAL_FUNC (noFunc), (gpointer) yesNoDialog->dialog);
148 gtk_widget_show (button);
150 button = gtk_button_new_with_label (_("Cancel"));
151 gtk_box_pack_start (GTK_BOX (GTK_DIALOG (yesNoDialog->dialog)->action_area),
152 button, FALSE, TRUE, 0);
153 gtk_signal_connect (GTK_OBJECT (button), "clicked",
154 GTK_SIGNAL_FUNC (CancelDialog), (gpointer) yesNoDialog->dialog);
155 gtk_widget_show (button);
157 hbox = gtk_hbox_new (FALSE, 0);
158 gtk_container_add (GTK_CONTAINER (GTK_DIALOG (yesNoDialog->dialog)->vbox), hbox);
159 gtk_widget_show (hbox);
163 pixmap = NewPixmap (quest_xpm, window->window,
164 &window->style->bg[GTK_STATE_NORMAL]);
165 gtk_box_pack_start (GTK_BOX (hbox), pixmap, FALSE, FALSE, 10);
166 gtk_widget_show (pixmap);
169 yesNoDialog->text = gtk_label_new ("");
170 gtk_box_pack_start (GTK_BOX (hbox), yesNoDialog->text, FALSE, FALSE, 10);
171 gtk_widget_show (yesNoDialog->text);
175 GtkWidget* NewPixmap (gchar **data, GdkWindow *window, GdkColor *background)
181 pixmap = gdk_pixmap_create_from_xpm_d (window, &mask, background, data);
183 wpixmap = gtk_pixmap_new (pixmap, mask);
189 gint LaunchProcess (const gchar *p, const gchar *arg, const gint infile,
190 const gint outfile, const gint errfile)
203 if (getuid () != geteuid ())
206 signal (SIGINT, SIG_DFL);
207 signal (SIGQUIT, SIG_DFL);
208 signal (SIGTSTP, SIG_DFL);
209 signal (SIGTTIN, SIG_DFL);
210 signal (SIGTTOU, SIG_DFL);
211 signal (SIGCHLD, SIG_DFL);
213 if (infile != STDIN_FILENO)
215 dup2 (infile, STDIN_FILENO);
218 if (outfile != STDOUT_FILENO)
220 dup2 (outfile, STDOUT_FILENO);
223 if (errfile != STDERR_FILENO)
225 dup2 (errfile, STDERR_FILENO);
229 execlp (p, p, arg, NULL);
230 g_print (_("Can't exec %s\n"), p);
231 execlp ("/bin/false", p, NULL);
240 void RemoveZombie (const gint sign)
248 void Help (const GtkWidget *w, const gpointer data)
250 gchar buf[255] = "file:";
252 strncat (buf, xgnokiiConfig.xgnokiidir, 255 - strlen (buf));
254 strncat (buf, (gchar *) data, 255 - strlen (buf));
256 LaunchProcess (xgnokiiConfig.helpviewer, buf, STDIN_FILENO, STDOUT_FILENO, STDERR_FILENO);
260 inline gint strrncmp (const gchar * const s1, const gchar * const s2, size_t n)
262 gint l1 = strlen (s1);
263 gint l2 = strlen (s2);
265 if (l1 == 0 && l2 != 0)
267 else if (l1 != 0 && l2 == 0)
270 while (l1-- > 0 && l2-- > 0 && n-- > 0)
274 else if (s1[l1] > s2[l2])
282 inline void GUI_Refresh (void)
284 while (gtk_events_pending())
285 gtk_main_iteration();
289 inline void SetSortColumn (GtkWidget *widget, SortColumn *data)
291 gtk_clist_set_sort_column (GTK_CLIST (data->clist), data->column);
292 gtk_clist_sort (GTK_CLIST (data->clist));
296 inline void GUIEventAdd (GUIEventType type, void (*func)(void))
298 GUIEvent *event = g_malloc (sizeof (GUIEvent));
303 guiEvents = g_slist_append (guiEvents, event);
307 bool GUIEventRemove (GUIEventType type, void (*func)(void))
315 list = g_slist_find (guiEvents, &event);
318 g_print ("Nasiel som\n");
319 guiEvents = g_slist_remove_link (guiEvents, list);
320 g_slist_free_1 (list);
327 static inline void CallEvent (gpointer data, gpointer user_data)
329 GUIEvent *event = (GUIEvent *) data;
331 if (event->type == GPOINTER_TO_INT (user_data))
335 inline void GUIEventSend (GUIEventType type)
337 g_slist_foreach (guiEvents, CallEvent, GINT_TO_POINTER (type));