Mercurial > pidgin
annotate finch/libgnt/gntmain.c @ 17044:53e757c37e06
Ignore bold, underline and other formatting type things in SPAN tags if
"Show formatting on incoming messages" is turned off. This makes handling
of these things consistent with other formatting tags.
Fixes #520.
author | Stu Tomlinson <stu@nosnilmot.com> |
---|---|
date | Fri, 11 May 2007 20:06:57 +0000 |
parents | d2904afe89e2 |
children | a19b8d71f868 |
rev | line source |
---|---|
15817 | 1 #define _GNU_SOURCE |
2 #if defined(__APPLE__) | |
3 #define _XOPEN_SOURCE_EXTENDED | |
4 #endif | |
5 | |
6 #include "config.h" | |
7 | |
8 #include <gmodule.h> | |
9 | |
10 #include <sys/types.h> | |
11 #include <sys/wait.h> | |
12 | |
13 #include "gnt.h" | |
14 #include "gntbox.h" | |
16888
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
15 #include "gntbutton.h" |
15817 | 16 #include "gntcolors.h" |
17 #include "gntclipboard.h" | |
18 #include "gntkeys.h" | |
16888
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
19 #include "gntlabel.h" |
15817 | 20 #include "gntmenu.h" |
21 #include "gntstyle.h" | |
22 #include "gnttree.h" | |
23 #include "gntutils.h" | |
16888
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
24 #include "gntwindow.h" |
15817 | 25 #include "gntwm.h" |
26 | |
27 #include <panel.h> | |
28 | |
29 #include <stdio.h> | |
30 #include <stdlib.h> | |
31 #include <locale.h> | |
32 #include <unistd.h> | |
33 #include <signal.h> | |
34 #include <string.h> | |
35 #include <ctype.h> | |
36 #include <errno.h> | |
37 | |
38 /** | |
39 * Notes: Interesting functions to look at: | |
40 * scr_dump, scr_init, scr_restore: for workspaces | |
41 * | |
42 * Need to wattrset for colors to use with PDCurses. | |
43 */ | |
44 | |
45 static GIOChannel *channel = NULL; | |
46 | |
47 static gboolean ascii_only; | |
48 static gboolean mouse_enabled; | |
49 | |
50 static void setup_io(void); | |
51 | |
52 static gboolean refresh_screen(); | |
53 | |
54 GntWM *wm; | |
55 static GntClipboard *clipboard; | |
56 | |
57 #define HOLDING_ESCAPE (escape_stuff.timer != 0) | |
58 | |
59 static struct { | |
60 int timer; | |
61 } escape_stuff; | |
62 | |
63 static gboolean | |
64 escape_timeout(gpointer data) | |
65 { | |
66 gnt_wm_process_input(wm, "\033"); | |
67 escape_stuff.timer = 0; | |
68 return FALSE; | |
69 } | |
70 | |
71 /** | |
72 * Mouse support: | |
73 * - bring a window on top if you click on its taskbar | |
74 * - click on the top-bar of the active window and drag+drop to move a window | |
75 * - click on a window to bring it to focus | |
76 * - allow scrolling in tree/textview on wheel-scroll event | |
77 * - click to activate button or select a row in tree | |
78 * wishlist: | |
79 * - have a little [X] on the windows, and clicking it will close that window. | |
80 */ | |
81 static gboolean | |
82 detect_mouse_action(const char *buffer) | |
83 { | |
84 int x, y; | |
85 static enum { | |
86 MOUSE_NONE, | |
87 MOUSE_LEFT, | |
88 MOUSE_RIGHT, | |
89 MOUSE_MIDDLE | |
90 } button = MOUSE_NONE; | |
91 static GntWidget *remember = NULL; | |
92 static int offset = 0; | |
93 GntMouseEvent event; | |
94 GntWidget *widget = NULL; | |
95 PANEL *p = NULL; | |
96 | |
97 if (!wm->ordered || buffer[0] != 27) | |
98 return FALSE; | |
99 | |
100 buffer++; | |
101 if (strlen(buffer) < 5) | |
102 return FALSE; | |
103 | |
104 x = buffer[3]; | |
105 y = buffer[4]; | |
106 if (x < 0) x += 256; | |
107 if (y < 0) y += 256; | |
108 x -= 33; | |
109 y -= 33; | |
110 | |
111 while ((p = panel_below(p)) != NULL) { | |
112 const GntNode *node = panel_userptr(p); | |
113 GntWidget *wid; | |
114 if (!node) | |
115 continue; | |
116 wid = node->me; | |
117 if (x >= wid->priv.x && x < wid->priv.x + wid->priv.width) { | |
118 if (y >= wid->priv.y && y < wid->priv.y + wid->priv.height) { | |
119 widget = wid; | |
120 break; | |
121 } | |
122 } | |
123 } | |
124 | |
125 if (strncmp(buffer, "[M ", 3) == 0) { | |
126 /* left button down */ | |
127 /* Bring the window you clicked on to front */ | |
128 /* If you click on the topbar, then you can drag to move the window */ | |
129 event = GNT_LEFT_MOUSE_DOWN; | |
130 } else if (strncmp(buffer, "[M\"", 3) == 0) { | |
131 /* right button down */ | |
132 event = GNT_RIGHT_MOUSE_DOWN; | |
133 } else if (strncmp(buffer, "[M!", 3) == 0) { | |
134 /* middle button down */ | |
135 event = GNT_MIDDLE_MOUSE_DOWN; | |
136 } else if (strncmp(buffer, "[M`", 3) == 0) { | |
137 /* wheel up*/ | |
138 event = GNT_MOUSE_SCROLL_UP; | |
139 } else if (strncmp(buffer, "[Ma", 3) == 0) { | |
140 /* wheel down */ | |
141 event = GNT_MOUSE_SCROLL_DOWN; | |
142 } else if (strncmp(buffer, "[M#", 3) == 0) { | |
143 /* button up */ | |
144 event = GNT_MOUSE_UP; | |
145 } else | |
146 return FALSE; | |
147 | |
148 if (gnt_wm_process_click(wm, event, x, y, widget)) | |
149 return TRUE; | |
150 | |
151 if (event == GNT_LEFT_MOUSE_DOWN && widget && widget != wm->_list.window && | |
152 !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_TRANSIENT)) { | |
153 if (widget != wm->ordered->data) { | |
154 gnt_wm_raise_window(wm, widget); | |
155 } | |
156 if (y == widget->priv.y) { | |
157 offset = x - widget->priv.x; | |
158 remember = widget; | |
159 button = MOUSE_LEFT; | |
160 } | |
161 } else if (event == GNT_MOUSE_UP) { | |
162 if (button == MOUSE_NONE && y == getmaxy(stdscr) - 1) { | |
163 /* Clicked on the taskbar */ | |
164 int n = g_list_length(wm->list); | |
165 if (n) { | |
166 int width = getmaxx(stdscr) / n; | |
167 gnt_bindable_perform_action_named(GNT_BINDABLE(wm), "switch-window-n", x/width, NULL); | |
168 } | |
169 } else if (button == MOUSE_LEFT && remember) { | |
170 x -= offset; | |
171 if (x < 0) x = 0; | |
172 if (y < 0) y = 0; | |
173 gnt_screen_move_widget(remember, x, y); | |
174 } | |
175 button = MOUSE_NONE; | |
176 remember = NULL; | |
177 offset = 0; | |
178 } | |
179 | |
180 gnt_widget_clicked(widget, event, x, y); | |
181 return TRUE; | |
182 } | |
183 | |
184 static gboolean | |
185 io_invoke_error(GIOChannel *source, GIOCondition cond, gpointer data) | |
186 { | |
187 int id = GPOINTER_TO_INT(data); | |
188 g_source_remove(id); | |
189 g_io_channel_unref(source); | |
190 | |
191 channel = NULL; | |
192 setup_io(); | |
193 return TRUE; | |
194 } | |
195 | |
196 static gboolean | |
197 io_invoke(GIOChannel *source, GIOCondition cond, gpointer null) | |
198 { | |
199 char keys[256]; | |
200 int rd = read(STDIN_FILENO, keys + HOLDING_ESCAPE, sizeof(keys) - 1 - HOLDING_ESCAPE); | |
201 char *k; | |
202 if (rd < 0) | |
203 { | |
204 int ch = getch(); /* This should return ERR, but let's see what it really returns */ | |
205 endwin(); | |
206 printf("ERROR: %s\n", strerror(errno)); | |
207 printf("File descriptor is: %d\n\nGIOChannel is: %p\ngetch() = %d\n", STDIN_FILENO, source, ch); | |
208 raise(SIGABRT); | |
209 } | |
210 else if (rd == 0) | |
211 { | |
212 endwin(); | |
213 printf("EOF\n"); | |
214 raise(SIGABRT); | |
215 } | |
216 | |
16281
82b6fdd899a9
Dialogs opened resulting from a mouse-click should fain focus.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
217 gnt_wm_set_event_stack(wm, TRUE); |
15817 | 218 rd += HOLDING_ESCAPE; |
219 keys[rd] = 0; | |
220 if (mouse_enabled && detect_mouse_action(keys)) | |
16281
82b6fdd899a9
Dialogs opened resulting from a mouse-click should fain focus.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
221 goto end; |
15817 | 222 |
223 if (HOLDING_ESCAPE) | |
224 keys[0] = '\033'; | |
225 k = keys; | |
226 while (rd) { | |
227 char back; | |
228 int p; | |
229 | |
230 if (k[0] == '\033' && rd == 1) { | |
231 if (escape_stuff.timer) { | |
232 gnt_wm_process_input(wm, "\033\033"); | |
233 g_source_remove(escape_stuff.timer); | |
234 escape_stuff.timer = 0; | |
235 break; | |
236 } | |
237 escape_stuff.timer = g_timeout_add(250, escape_timeout, NULL); | |
238 break; | |
239 } | |
240 | |
241 gnt_keys_refine(k); | |
242 p = MAX(1, gnt_keys_find_combination(k)); | |
243 back = k[p]; | |
244 k[p] = '\0'; | |
245 gnt_wm_process_input(wm, k); /* XXX: */ | |
246 k[p] = back; | |
247 rd -= p; | |
248 k += p; | |
249 } | |
16281
82b6fdd899a9
Dialogs opened resulting from a mouse-click should fain focus.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
250 end: |
82b6fdd899a9
Dialogs opened resulting from a mouse-click should fain focus.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15817
diff
changeset
|
251 gnt_wm_set_event_stack(wm, FALSE); |
15817 | 252 return TRUE; |
253 } | |
254 | |
255 static void | |
256 setup_io() | |
257 { | |
258 int result; | |
259 channel = g_io_channel_unix_new(STDIN_FILENO); | |
260 g_io_channel_set_close_on_unref(channel, TRUE); | |
261 | |
262 #if 0 | |
263 g_io_channel_set_encoding(channel, NULL, NULL); | |
264 g_io_channel_set_buffered(channel, FALSE); | |
265 g_io_channel_set_flags(channel, G_IO_FLAG_NONBLOCK, NULL ); | |
266 #endif | |
267 | |
268 result = g_io_add_watch_full(channel, G_PRIORITY_HIGH, | |
269 (G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_PRI), | |
270 io_invoke, NULL, NULL); | |
271 | |
272 g_io_add_watch_full(channel, G_PRIORITY_HIGH, | |
273 (G_IO_NVAL), | |
274 io_invoke_error, GINT_TO_POINTER(result), NULL); | |
275 | |
276 g_io_channel_unref(channel); /* Apparently this caused crashes for some people. | |
277 But irssi does this, so I am going to assume the | |
278 crashes were caused by some other stuff. */ | |
279 | |
280 g_printerr("gntmain: setting up IO\n"); | |
281 } | |
282 | |
283 static gboolean | |
284 refresh_screen() | |
285 { | |
286 gnt_bindable_perform_action_named(GNT_BINDABLE(wm), "refresh-screen", NULL); | |
287 return FALSE; | |
288 } | |
289 | |
290 /* Xerox */ | |
291 static void | |
292 clean_pid(void) | |
293 { | |
294 int status; | |
295 pid_t pid; | |
296 | |
297 do { | |
298 pid = waitpid(-1, &status, WNOHANG); | |
299 } while (pid != 0 && pid != (pid_t)-1); | |
300 | |
301 if ((pid == (pid_t) - 1) && (errno != ECHILD)) { | |
302 char errmsg[BUFSIZ]; | |
303 g_snprintf(errmsg, BUFSIZ, "Warning: waitpid() returned %d", pid); | |
304 perror(errmsg); | |
305 } | |
306 } | |
307 | |
308 static void | |
16888
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
309 exit_confirmed(gpointer null) |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
310 { |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
311 gnt_bindable_perform_action_named(GNT_BINDABLE(wm), "wm-quit", NULL); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
312 } |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
313 |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
314 static void |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
315 exit_win_close(GntWidget *w, GntWidget **win) |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
316 { |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
317 *win = NULL; |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
318 } |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
319 |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
320 static void |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
321 ask_before_exit() |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
322 { |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
323 static GntWidget *win = NULL; |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
324 GntWidget *bbox, *button; |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
325 |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
326 if (win) |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
327 goto raise; |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
328 |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
329 win = gnt_vwindow_new(FALSE); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
330 gnt_box_add_widget(GNT_BOX(win), gnt_label_new("Are you sure you want to quit?")); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
331 gnt_box_set_title(GNT_BOX(win), "Quit?"); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
332 gnt_box_set_alignment(GNT_BOX(win), GNT_ALIGN_MID); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
333 g_signal_connect(G_OBJECT(win), "destroy", G_CALLBACK(exit_win_close), &win); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
334 |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
335 bbox = gnt_hbox_new(FALSE); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
336 gnt_box_add_widget(GNT_BOX(win), bbox); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
337 |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
338 button = gnt_button_new("Quit"); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
339 g_signal_connect(G_OBJECT(button), "activate", G_CALLBACK(exit_confirmed), NULL); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
340 gnt_box_add_widget(GNT_BOX(bbox), button); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
341 |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
342 button = gnt_button_new("Cancel"); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
343 g_signal_connect_swapped(G_OBJECT(button), "activate", G_CALLBACK(gnt_widget_destroy), win); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
344 gnt_box_add_widget(GNT_BOX(bbox), button); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
345 |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
346 gnt_widget_show(win); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
347 raise: |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
348 gnt_wm_raise_window(wm, win); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
349 } |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
350 |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
351 static void |
15817 | 352 sighandler(int sig) |
353 { | |
354 switch (sig) { | |
355 #ifdef SIGWINCH | |
356 case SIGWINCH: | |
357 werase(stdscr); | |
358 wrefresh(stdscr); | |
359 g_idle_add(refresh_screen, NULL); | |
360 signal(SIGWINCH, sighandler); | |
361 break; | |
362 #endif | |
363 case SIGCHLD: | |
364 clean_pid(); | |
365 signal(SIGCHLD, sighandler); | |
366 break; | |
16888
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
367 case SIGINT: |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
368 ask_before_exit(); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
369 signal(SIGINT, sighandler); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
370 break; |
15817 | 371 } |
372 } | |
373 | |
374 static void | |
375 init_wm() | |
376 { | |
377 const char *name = gnt_style_get(GNT_STYLE_WM); | |
378 gpointer handle; | |
379 | |
380 if (name && *name) { | |
381 handle = g_module_open(name, G_MODULE_BIND_LAZY); | |
382 if (handle) { | |
383 gboolean (*init)(GntWM **); | |
384 if (g_module_symbol(handle, "gntwm_init", (gpointer)&init)) { | |
385 init(&wm); | |
386 } | |
387 } | |
388 } | |
389 if (wm == NULL) | |
390 wm = g_object_new(GNT_TYPE_WM, NULL); | |
391 } | |
392 | |
393 void gnt_init() | |
394 { | |
395 char *filename; | |
396 const char *locale; | |
397 | |
398 if (channel) | |
399 return; | |
400 | |
401 locale = setlocale(LC_ALL, ""); | |
402 | |
403 setup_io(); | |
404 | |
405 if (locale && (strstr(locale, "UTF") || strstr(locale, "utf"))) | |
406 ascii_only = FALSE; | |
407 else | |
408 ascii_only = TRUE; | |
409 | |
410 initscr(); | |
411 typeahead(-1); | |
412 noecho(); | |
413 curs_set(0); | |
414 | |
415 gnt_init_keys(); | |
416 gnt_init_styles(); | |
417 | |
418 filename = g_build_filename(g_get_home_dir(), ".gntrc", NULL); | |
419 gnt_style_read_configure_file(filename); | |
420 g_free(filename); | |
421 | |
422 gnt_init_colors(); | |
423 | |
424 wbkgdset(stdscr, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); | |
425 refresh(); | |
426 | |
427 #ifdef ALL_MOUSE_EVENTS | |
428 if ((mouse_enabled = gnt_style_get_bool(GNT_STYLE_MOUSE, FALSE))) | |
429 mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL); | |
430 #endif | |
431 | |
432 wbkgdset(stdscr, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); | |
433 werase(stdscr); | |
434 wrefresh(stdscr); | |
435 | |
436 #ifdef SIGWINCH | |
437 signal(SIGWINCH, sighandler); | |
438 #endif | |
439 signal(SIGCHLD, sighandler); | |
16888
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16781
diff
changeset
|
440 signal(SIGINT, sighandler); |
15817 | 441 signal(SIGPIPE, SIG_IGN); |
442 | |
443 g_type_init(); | |
444 | |
445 init_wm(); | |
446 | |
447 clipboard = g_object_new(GNT_TYPE_CLIPBOARD, NULL); | |
448 } | |
449 | |
450 void gnt_main() | |
451 { | |
452 wm->loop = g_main_loop_new(NULL, FALSE); | |
453 g_main_loop_run(wm->loop); | |
454 } | |
455 | |
456 /********************************* | |
457 * Stuff for 'window management' * | |
458 *********************************/ | |
459 | |
460 void gnt_screen_occupy(GntWidget *widget) | |
461 { | |
462 gnt_wm_new_window(wm, widget); | |
463 } | |
464 | |
465 void gnt_screen_release(GntWidget *widget) | |
466 { | |
467 gnt_wm_window_close(wm, widget); | |
468 } | |
469 | |
470 void gnt_screen_update(GntWidget *widget) | |
471 { | |
472 gnt_wm_update_window(wm, widget); | |
473 } | |
474 | |
475 gboolean gnt_widget_has_focus(GntWidget *widget) | |
476 { | |
477 GntWidget *w; | |
478 if (!widget) | |
479 return FALSE; | |
480 | |
481 if (GNT_IS_MENU(widget)) | |
482 return TRUE; | |
483 | |
484 w = widget; | |
485 | |
486 while (widget->parent) | |
487 widget = widget->parent; | |
488 | |
489 if (widget == wm->_list.window) | |
490 return TRUE; | |
491 if (wm->ordered && wm->ordered->data == widget) { | |
492 if (GNT_IS_BOX(widget) && | |
493 (GNT_BOX(widget)->active == w || widget == w)) | |
494 return TRUE; | |
495 } | |
496 return FALSE; | |
497 } | |
498 | |
499 void gnt_widget_set_urgent(GntWidget *widget) | |
500 { | |
501 while (widget->parent) | |
502 widget = widget->parent; | |
503 | |
504 if (wm->ordered && wm->ordered->data == widget) | |
505 return; | |
506 | |
507 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_URGENT); | |
508 | |
509 gnt_wm_update_window(wm, widget); | |
510 } | |
511 | |
512 void gnt_quit() | |
513 { | |
514 g_hash_table_destroy(wm->nodes); /* XXX: */ | |
515 update_panels(); | |
516 doupdate(); | |
517 gnt_uninit_colors(); | |
518 gnt_uninit_styles(); | |
519 endwin(); | |
520 } | |
521 | |
522 gboolean gnt_ascii_only() | |
523 { | |
524 return ascii_only; | |
525 } | |
526 | |
527 void gnt_screen_resize_widget(GntWidget *widget, int width, int height) | |
528 { | |
529 gnt_wm_resize_window(wm, widget, width, height); | |
530 } | |
531 | |
532 void gnt_screen_move_widget(GntWidget *widget, int x, int y) | |
533 { | |
534 gnt_wm_move_window(wm, widget, x, y); | |
535 } | |
536 | |
537 void gnt_screen_rename_widget(GntWidget *widget, const char *text) | |
538 { | |
539 gnt_box_set_title(GNT_BOX(widget), text); | |
540 gnt_widget_draw(widget); | |
541 gnt_wm_update_window(wm, widget); | |
542 } | |
543 | |
544 void gnt_register_action(const char *label, void (*callback)()) | |
545 { | |
546 GntAction *action = g_new0(GntAction, 1); | |
547 action->label = g_strdup(label); | |
548 action->callback = callback; | |
549 | |
550 wm->acts = g_list_append(wm->acts, action); | |
551 } | |
552 | |
553 static void | |
554 reset_menu(GntWidget *widget, gpointer null) | |
555 { | |
556 wm->menu = NULL; | |
557 } | |
558 | |
559 gboolean gnt_screen_menu_show(gpointer newmenu) | |
560 { | |
561 if (wm->menu) { | |
562 /* For now, if a menu is being displayed, then another menu | |
563 * can NOT take over. */ | |
564 return FALSE; | |
565 } | |
566 | |
567 wm->menu = newmenu; | |
568 GNT_WIDGET_UNSET_FLAGS(GNT_WIDGET(wm->menu), GNT_WIDGET_INVISIBLE); | |
569 gnt_widget_draw(GNT_WIDGET(wm->menu)); | |
570 | |
571 g_signal_connect(G_OBJECT(wm->menu), "hide", G_CALLBACK(reset_menu), NULL); | |
16781
d0f9b2b217cf
Fix context menu unusualness in the buddylist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
572 g_signal_connect(G_OBJECT(wm->menu), "destroy", G_CALLBACK(reset_menu), NULL); |
15817 | 573 |
574 return TRUE; | |
575 } | |
576 | |
577 void gnt_set_clipboard_string(gchar *string) | |
578 { | |
579 gnt_clipboard_set_string(clipboard, string); | |
580 } | |
581 | |
582 GntClipboard *gnt_get_clipboard() | |
583 { | |
584 return clipboard; | |
585 } | |
586 gchar *gnt_get_clipboard_string() | |
587 { | |
588 return gnt_clipboard_get_string(clipboard); | |
589 } |