Mercurial > pidgin.yaz
annotate finch/libgnt/gntmain.c @ 25094:11458e8584c2
Set a NULL statusline and CurrentMedia if the UBX returns an empty payload,
instead of trying to parse the empty text. If only users wouldn't freak out
just because they see the word "error"...
Fixes #8348.
author | Elliott Sales de Andrade <qulogic@pidgin.im> |
---|---|
date | Sun, 15 Feb 2009 22:52:47 +0000 |
parents | ea28a7b9113c |
children | de2ac0952487 |
rev | line source |
---|---|
18049
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
1 /** |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
2 * GNT - The GLib Ncurses Toolkit |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
3 * |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
4 * GNT is the legal property of its developers, whose names are too numerous |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
5 * to list here. Please refer to the COPYRIGHT file distributed with this |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
6 * source distribution. |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
7 * |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
8 * This library is free software; you can redistribute it and/or modify |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
9 * it under the terms of the GNU General Public License as published by |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
10 * the Free Software Foundation; either version 2 of the License, or |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
11 * (at your option) any later version. |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
12 * |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
13 * This program is distributed in the hope that it will be useful, |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
16 * GNU General Public License for more details. |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
17 * |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
18 * You should have received a copy of the GNU General Public License |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
19 * along with this program; if not, write to the Free Software |
19680
44b4e8bd759b
The FSF changed its address a while ago; our files were out of date.
John Bailey <rekkanoryo@rekkanoryo.org>
parents:
19179
diff
changeset
|
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02111-1301 USA |
18049
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
21 */ |
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
22 |
15818 | 23 #define _GNU_SOURCE |
24892
ea28a7b9113c
Compilation fixes for OpenBSD from the OpenBSD ports tree. Closes #8009.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
24503
diff
changeset
|
24 #if (defined(__APPLE__) || defined(__unix__)) && !defined(__FreeBSD__) && !defined(__OpenBSD__) |
15818 | 25 #define _XOPEN_SOURCE_EXTENDED |
26 #endif | |
27 | |
28 #include "config.h" | |
29 | |
30 #include <gmodule.h> | |
31 | |
32 #include <sys/types.h> | |
33 #include <sys/wait.h> | |
34 | |
24503
e2e57d3c0578
Use glib log functions to show error messages.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22696
diff
changeset
|
35 #include "gntinternal.h" |
e2e57d3c0578
Use glib log functions to show error messages.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22696
diff
changeset
|
36 #undef GNT_LOG_DOMAIN |
e2e57d3c0578
Use glib log functions to show error messages.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22696
diff
changeset
|
37 #define GNT_LOG_DOMAIN "Main" |
e2e57d3c0578
Use glib log functions to show error messages.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22696
diff
changeset
|
38 |
15818 | 39 #include "gnt.h" |
40 #include "gntbox.h" | |
16899
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
41 #include "gntbutton.h" |
15818 | 42 #include "gntcolors.h" |
43 #include "gntclipboard.h" | |
44 #include "gntkeys.h" | |
16899
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
45 #include "gntlabel.h" |
15818 | 46 #include "gntmenu.h" |
47 #include "gntstyle.h" | |
48 #include "gnttree.h" | |
49 #include "gntutils.h" | |
16899
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
50 #include "gntwindow.h" |
15818 | 51 #include "gntwm.h" |
52 | |
53 #include <panel.h> | |
54 | |
55 #include <stdio.h> | |
56 #include <stdlib.h> | |
57 #include <locale.h> | |
58 #include <unistd.h> | |
59 #include <signal.h> | |
60 #include <string.h> | |
61 #include <ctype.h> | |
62 #include <errno.h> | |
63 | |
64 /** | |
65 * Notes: Interesting functions to look at: | |
66 * scr_dump, scr_init, scr_restore: for workspaces | |
67 * | |
68 * Need to wattrset for colors to use with PDCurses. | |
69 */ | |
70 | |
71 static GIOChannel *channel = NULL; | |
18425
84d318eadc62
The input was causing some weird issues. This fixes it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18421
diff
changeset
|
72 static int channel_read_callback; |
15818 | 73 |
74 static gboolean ascii_only; | |
75 static gboolean mouse_enabled; | |
76 | |
77 static void setup_io(void); | |
78 | |
22007
c38d72677c8a
Probe for -Wstrict-prototypes to get some more warnings. I then cleaned up
Richard Laager <rlaager@wiktel.com>
parents:
21720
diff
changeset
|
79 static gboolean refresh_screen(void); |
15818 | 80 |
18049
1cedd520cd18
Doxygen skeleton and license info for gnt files.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17528
diff
changeset
|
81 static GntWM *wm; |
15818 | 82 static GntClipboard *clipboard; |
83 | |
84 #define HOLDING_ESCAPE (escape_stuff.timer != 0) | |
85 | |
86 static struct { | |
87 int timer; | |
88 } escape_stuff; | |
89 | |
90 static gboolean | |
91 escape_timeout(gpointer data) | |
92 { | |
93 gnt_wm_process_input(wm, "\033"); | |
94 escape_stuff.timer = 0; | |
95 return FALSE; | |
96 } | |
97 | |
98 /** | |
99 * Mouse support: | |
100 * - bring a window on top if you click on its taskbar | |
101 * - click on the top-bar of the active window and drag+drop to move a window | |
102 * - click on a window to bring it to focus | |
103 * - allow scrolling in tree/textview on wheel-scroll event | |
104 * - click to activate button or select a row in tree | |
105 * wishlist: | |
106 * - have a little [X] on the windows, and clicking it will close that window. | |
107 */ | |
108 static gboolean | |
109 detect_mouse_action(const char *buffer) | |
110 { | |
111 int x, y; | |
112 static enum { | |
113 MOUSE_NONE, | |
114 MOUSE_LEFT, | |
115 MOUSE_RIGHT, | |
116 MOUSE_MIDDLE | |
117 } button = MOUSE_NONE; | |
118 static GntWidget *remember = NULL; | |
119 static int offset = 0; | |
120 GntMouseEvent event; | |
121 GntWidget *widget = NULL; | |
122 PANEL *p = NULL; | |
123 | |
16414
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
16281
diff
changeset
|
124 if (!wm->cws->ordered || buffer[0] != 27) |
15818 | 125 return FALSE; |
126 | |
127 buffer++; | |
128 if (strlen(buffer) < 5) | |
129 return FALSE; | |
130 | |
131 x = buffer[3]; | |
132 y = buffer[4]; | |
133 if (x < 0) x += 256; | |
134 if (y < 0) y += 256; | |
135 x -= 33; | |
136 y -= 33; | |
137 | |
138 while ((p = panel_below(p)) != NULL) { | |
139 const GntNode *node = panel_userptr(p); | |
140 GntWidget *wid; | |
141 if (!node) | |
142 continue; | |
143 wid = node->me; | |
144 if (x >= wid->priv.x && x < wid->priv.x + wid->priv.width) { | |
145 if (y >= wid->priv.y && y < wid->priv.y + wid->priv.height) { | |
146 widget = wid; | |
147 break; | |
148 } | |
149 } | |
150 } | |
151 | |
152 if (strncmp(buffer, "[M ", 3) == 0) { | |
153 /* left button down */ | |
154 /* Bring the window you clicked on to front */ | |
155 /* If you click on the topbar, then you can drag to move the window */ | |
156 event = GNT_LEFT_MOUSE_DOWN; | |
157 } else if (strncmp(buffer, "[M\"", 3) == 0) { | |
158 /* right button down */ | |
159 event = GNT_RIGHT_MOUSE_DOWN; | |
160 } else if (strncmp(buffer, "[M!", 3) == 0) { | |
161 /* middle button down */ | |
162 event = GNT_MIDDLE_MOUSE_DOWN; | |
163 } else if (strncmp(buffer, "[M`", 3) == 0) { | |
164 /* wheel up*/ | |
165 event = GNT_MOUSE_SCROLL_UP; | |
166 } else if (strncmp(buffer, "[Ma", 3) == 0) { | |
167 /* wheel down */ | |
168 event = GNT_MOUSE_SCROLL_DOWN; | |
169 } else if (strncmp(buffer, "[M#", 3) == 0) { | |
170 /* button up */ | |
171 event = GNT_MOUSE_UP; | |
172 } else | |
173 return FALSE; | |
17058
a19b8d71f868
Do not process clicks on no widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16899
diff
changeset
|
174 |
17064
541c5ed54e90
Fix the commit from earlier today about null-widgets.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17058
diff
changeset
|
175 if (widget && gnt_wm_process_click(wm, event, x, y, widget)) |
15818 | 176 return TRUE; |
177 | |
178 if (event == GNT_LEFT_MOUSE_DOWN && widget && widget != wm->_list.window && | |
179 !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_TRANSIENT)) { | |
16414
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
16281
diff
changeset
|
180 if (widget != wm->cws->ordered->data) { |
15818 | 181 gnt_wm_raise_window(wm, widget); |
182 } | |
183 if (y == widget->priv.y) { | |
184 offset = x - widget->priv.x; | |
185 remember = widget; | |
186 button = MOUSE_LEFT; | |
187 } | |
188 } else if (event == GNT_MOUSE_UP) { | |
189 if (button == MOUSE_NONE && y == getmaxy(stdscr) - 1) { | |
190 /* Clicked on the taskbar */ | |
16414
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
16281
diff
changeset
|
191 int n = g_list_length(wm->cws->list); |
15818 | 192 if (n) { |
193 int width = getmaxx(stdscr) / n; | |
194 gnt_bindable_perform_action_named(GNT_BINDABLE(wm), "switch-window-n", x/width, NULL); | |
195 } | |
196 } else if (button == MOUSE_LEFT && remember) { | |
197 x -= offset; | |
198 if (x < 0) x = 0; | |
199 if (y < 0) y = 0; | |
200 gnt_screen_move_widget(remember, x, y); | |
201 } | |
202 button = MOUSE_NONE; | |
203 remember = NULL; | |
204 offset = 0; | |
205 } | |
206 | |
17064
541c5ed54e90
Fix the commit from earlier today about null-widgets.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17058
diff
changeset
|
207 if (widget) |
541c5ed54e90
Fix the commit from earlier today about null-widgets.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17058
diff
changeset
|
208 gnt_widget_clicked(widget, event, x, y); |
15818 | 209 return TRUE; |
210 } | |
211 | |
212 static gboolean | |
213 io_invoke_error(GIOChannel *source, GIOCondition cond, gpointer data) | |
214 { | |
215 int id = GPOINTER_TO_INT(data); | |
216 g_source_remove(id); | |
217 g_io_channel_unref(source); | |
218 | |
219 channel = NULL; | |
220 setup_io(); | |
221 return TRUE; | |
222 } | |
223 | |
224 static gboolean | |
225 io_invoke(GIOChannel *source, GIOCondition cond, gpointer null) | |
226 { | |
227 char keys[256]; | |
22296
6d3f8042f21f
Fix the "Finch doesn't work" bug. More specifically, it turned out to be
Stu Tomlinson <stu@nosnilmot.com>
parents:
22011
diff
changeset
|
228 gssize rd; |
15818 | 229 char *k; |
20309
d256249b22ea
applied changes from 4bbc209c8076ef89135700af844ec6bb04602c0a
Luke Schierer <lschiere@pidgin.im>
parents:
20225
diff
changeset
|
230 char *cvrt = NULL; |
18421
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
231 |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
232 if (wm->mode == GNT_KP_MODE_WAIT_ON_CHILD) |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
233 return FALSE; |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
234 |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
235 rd = read(STDIN_FILENO, keys + HOLDING_ESCAPE, sizeof(keys) - 1 - HOLDING_ESCAPE); |
15818 | 236 if (rd < 0) |
237 { | |
238 int ch = getch(); /* This should return ERR, but let's see what it really returns */ | |
239 endwin(); | |
240 printf("ERROR: %s\n", strerror(errno)); | |
241 printf("File descriptor is: %d\n\nGIOChannel is: %p\ngetch() = %d\n", STDIN_FILENO, source, ch); | |
242 raise(SIGABRT); | |
243 } | |
244 else if (rd == 0) | |
245 { | |
246 endwin(); | |
247 printf("EOF\n"); | |
248 raise(SIGABRT); | |
249 } | |
250 | |
251 rd += HOLDING_ESCAPE; | |
22696
8d74a9e409f1
Patch from Dylan Simon <dylan@dylex.net> to fix handling escape key
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22296
diff
changeset
|
252 if (HOLDING_ESCAPE) { |
15818 | 253 keys[0] = '\033'; |
22696
8d74a9e409f1
Patch from Dylan Simon <dylan@dylex.net> to fix handling escape key
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22296
diff
changeset
|
254 g_source_remove(escape_stuff.timer); |
8d74a9e409f1
Patch from Dylan Simon <dylan@dylex.net> to fix handling escape key
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22296
diff
changeset
|
255 escape_stuff.timer = 0; |
8d74a9e409f1
Patch from Dylan Simon <dylan@dylex.net> to fix handling escape key
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22296
diff
changeset
|
256 } |
20309
d256249b22ea
applied changes from 4bbc209c8076ef89135700af844ec6bb04602c0a
Luke Schierer <lschiere@pidgin.im>
parents:
20225
diff
changeset
|
257 keys[rd] = 0; |
d256249b22ea
applied changes from 4bbc209c8076ef89135700af844ec6bb04602c0a
Luke Schierer <lschiere@pidgin.im>
parents:
20225
diff
changeset
|
258 gnt_wm_set_event_stack(wm, TRUE); |
d256249b22ea
applied changes from 4bbc209c8076ef89135700af844ec6bb04602c0a
Luke Schierer <lschiere@pidgin.im>
parents:
20225
diff
changeset
|
259 |
d256249b22ea
applied changes from 4bbc209c8076ef89135700af844ec6bb04602c0a
Luke Schierer <lschiere@pidgin.im>
parents:
20225
diff
changeset
|
260 cvrt = g_locale_to_utf8(keys, rd, (gsize*)&rd, NULL, NULL); |
d256249b22ea
applied changes from 4bbc209c8076ef89135700af844ec6bb04602c0a
Luke Schierer <lschiere@pidgin.im>
parents:
20225
diff
changeset
|
261 k = cvrt ? cvrt : keys; |
d256249b22ea
applied changes from 4bbc209c8076ef89135700af844ec6bb04602c0a
Luke Schierer <lschiere@pidgin.im>
parents:
20225
diff
changeset
|
262 if (mouse_enabled && detect_mouse_action(k)) |
d256249b22ea
applied changes from 4bbc209c8076ef89135700af844ec6bb04602c0a
Luke Schierer <lschiere@pidgin.im>
parents:
20225
diff
changeset
|
263 goto end; |
19176
33201366bcd4
Fix some white-space and other similar issues. Preparing for a merge.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19171
diff
changeset
|
264 |
33201366bcd4
Fix some white-space and other similar issues. Preparing for a merge.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19171
diff
changeset
|
265 #if 0 |
33201366bcd4
Fix some white-space and other similar issues. Preparing for a merge.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19171
diff
changeset
|
266 /* I am not sure what's happening here. If this actually does something, |
33201366bcd4
Fix some white-space and other similar issues. Preparing for a merge.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19171
diff
changeset
|
267 * then this needs to go in gnt_keys_refine. */ |
33201366bcd4
Fix some white-space and other similar issues. Preparing for a merge.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19171
diff
changeset
|
268 if (*k < 0) { /* Alt not sending ESC* */ |
17535
d8b9bea550bc
Added a few lines to gnt_main::io_invoke to deal with ALT not sending ESC.
Eric Polino <aluink@pidgin.im>
parents:
17064
diff
changeset
|
269 *(k + 1) = 128 - *k; |
d8b9bea550bc
Added a few lines to gnt_main::io_invoke to deal with ALT not sending ESC.
Eric Polino <aluink@pidgin.im>
parents:
17064
diff
changeset
|
270 *k = 27; |
d8b9bea550bc
Added a few lines to gnt_main::io_invoke to deal with ALT not sending ESC.
Eric Polino <aluink@pidgin.im>
parents:
17064
diff
changeset
|
271 *(k + 2) = 0; |
d8b9bea550bc
Added a few lines to gnt_main::io_invoke to deal with ALT not sending ESC.
Eric Polino <aluink@pidgin.im>
parents:
17064
diff
changeset
|
272 rd++; |
d8b9bea550bc
Added a few lines to gnt_main::io_invoke to deal with ALT not sending ESC.
Eric Polino <aluink@pidgin.im>
parents:
17064
diff
changeset
|
273 } |
19176
33201366bcd4
Fix some white-space and other similar issues. Preparing for a merge.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19171
diff
changeset
|
274 #endif |
33201366bcd4
Fix some white-space and other similar issues. Preparing for a merge.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
19171
diff
changeset
|
275 |
15818 | 276 while (rd) { |
277 char back; | |
278 int p; | |
279 | |
280 if (k[0] == '\033' && rd == 1) { | |
281 escape_stuff.timer = g_timeout_add(250, escape_timeout, NULL); | |
282 break; | |
283 } | |
284 | |
285 gnt_keys_refine(k); | |
286 p = MAX(1, gnt_keys_find_combination(k)); | |
287 back = k[p]; | |
288 k[p] = '\0'; | |
289 gnt_wm_process_input(wm, k); /* XXX: */ | |
290 k[p] = back; | |
291 rd -= p; | |
292 k += p; | |
293 } | |
16281
82b6fdd899a9
Dialogs opened resulting from a mouse-click should fain focus.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15818
diff
changeset
|
294 end: |
21283
406aa3be6b32
Minor adjustments to prevent a crash, correct a data type and fix drawing.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21253
diff
changeset
|
295 if (wm) |
406aa3be6b32
Minor adjustments to prevent a crash, correct a data type and fix drawing.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21253
diff
changeset
|
296 gnt_wm_set_event_stack(wm, FALSE); |
20309
d256249b22ea
applied changes from 4bbc209c8076ef89135700af844ec6bb04602c0a
Luke Schierer <lschiere@pidgin.im>
parents:
20225
diff
changeset
|
297 g_free(cvrt); |
15818 | 298 return TRUE; |
299 } | |
300 | |
301 static void | |
302 setup_io() | |
303 { | |
304 int result; | |
305 channel = g_io_channel_unix_new(STDIN_FILENO); | |
306 g_io_channel_set_close_on_unref(channel, TRUE); | |
307 | |
308 #if 0 | |
309 g_io_channel_set_encoding(channel, NULL, NULL); | |
310 g_io_channel_set_buffered(channel, FALSE); | |
311 g_io_channel_set_flags(channel, G_IO_FLAG_NONBLOCK, NULL ); | |
312 #endif | |
313 | |
18425
84d318eadc62
The input was causing some weird issues. This fixes it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18421
diff
changeset
|
314 channel_read_callback = result = g_io_add_watch_full(channel, G_PRIORITY_HIGH, |
15818 | 315 (G_IO_IN | G_IO_HUP | G_IO_ERR | G_IO_PRI), |
316 io_invoke, NULL, NULL); | |
317 | |
318 g_io_add_watch_full(channel, G_PRIORITY_HIGH, | |
319 (G_IO_NVAL), | |
320 io_invoke_error, GINT_TO_POINTER(result), NULL); | |
321 | |
322 g_io_channel_unref(channel); /* Apparently this caused crashes for some people. | |
323 But irssi does this, so I am going to assume the | |
324 crashes were caused by some other stuff. */ | |
325 | |
24503
e2e57d3c0578
Use glib log functions to show error messages.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
22696
diff
changeset
|
326 gnt_warning("setting up IO (%d)", channel_read_callback); |
15818 | 327 } |
328 | |
329 static gboolean | |
22007
c38d72677c8a
Probe for -Wstrict-prototypes to get some more warnings. I then cleaned up
Richard Laager <rlaager@wiktel.com>
parents:
21720
diff
changeset
|
330 refresh_screen(void) |
15818 | 331 { |
332 gnt_bindable_perform_action_named(GNT_BINDABLE(wm), "refresh-screen", NULL); | |
333 return FALSE; | |
334 } | |
335 | |
336 /* Xerox */ | |
337 static void | |
338 clean_pid(void) | |
339 { | |
340 int status; | |
341 pid_t pid; | |
342 | |
343 do { | |
344 pid = waitpid(-1, &status, WNOHANG); | |
345 } while (pid != 0 && pid != (pid_t)-1); | |
346 | |
347 if ((pid == (pid_t) - 1) && (errno != ECHILD)) { | |
348 char errmsg[BUFSIZ]; | |
349 g_snprintf(errmsg, BUFSIZ, "Warning: waitpid() returned %d", pid); | |
350 perror(errmsg); | |
351 } | |
352 } | |
353 | |
354 static void | |
16899
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
355 exit_confirmed(gpointer null) |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
356 { |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
357 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:
16792
diff
changeset
|
358 } |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
359 |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
360 static void |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
361 exit_win_close(GntWidget *w, GntWidget **win) |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
362 { |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
363 *win = NULL; |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
364 } |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
365 |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
366 static void |
22007
c38d72677c8a
Probe for -Wstrict-prototypes to get some more warnings. I then cleaned up
Richard Laager <rlaager@wiktel.com>
parents:
21720
diff
changeset
|
367 ask_before_exit(void) |
16899
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
368 { |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
369 static GntWidget *win = NULL; |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
370 GntWidget *bbox, *button; |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
371 |
18439
ec80e921818c
Hide the menu when ctrl-c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18425
diff
changeset
|
372 if (wm->menu) { |
ec80e921818c
Hide the menu when ctrl-c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18425
diff
changeset
|
373 do { |
ec80e921818c
Hide the menu when ctrl-c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18425
diff
changeset
|
374 gnt_widget_hide(GNT_WIDGET(wm->menu)); |
ec80e921818c
Hide the menu when ctrl-c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18425
diff
changeset
|
375 if (wm->menu) |
ec80e921818c
Hide the menu when ctrl-c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18425
diff
changeset
|
376 wm->menu = wm->menu->parentmenu; |
ec80e921818c
Hide the menu when ctrl-c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18425
diff
changeset
|
377 } while (wm->menu); |
ec80e921818c
Hide the menu when ctrl-c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18425
diff
changeset
|
378 } |
ec80e921818c
Hide the menu when ctrl-c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18425
diff
changeset
|
379 |
16899
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
380 if (win) |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
381 goto raise; |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
382 |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
383 win = gnt_vwindow_new(FALSE); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
384 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:
16792
diff
changeset
|
385 gnt_box_set_title(GNT_BOX(win), "Quit?"); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
386 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:
16792
diff
changeset
|
387 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:
16792
diff
changeset
|
388 |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
389 bbox = gnt_hbox_new(FALSE); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
390 gnt_box_add_widget(GNT_BOX(win), bbox); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
391 |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
392 button = gnt_button_new("Quit"); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
393 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:
16792
diff
changeset
|
394 gnt_box_add_widget(GNT_BOX(bbox), button); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
395 |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
396 button = gnt_button_new("Cancel"); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
397 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:
16792
diff
changeset
|
398 gnt_box_add_widget(GNT_BOX(bbox), button); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
399 |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
400 gnt_widget_show(win); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
401 raise: |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
402 gnt_wm_raise_window(wm, win); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
403 } |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
404 |
17058
a19b8d71f868
Do not process clicks on no widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16899
diff
changeset
|
405 #ifdef SIGWINCH |
a19b8d71f868
Do not process clicks on no widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16899
diff
changeset
|
406 static void (*org_winch_handler)(int); |
a19b8d71f868
Do not process clicks on no widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16899
diff
changeset
|
407 #endif |
a19b8d71f868
Do not process clicks on no widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16899
diff
changeset
|
408 |
16899
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
409 static void |
15818 | 410 sighandler(int sig) |
411 { | |
412 switch (sig) { | |
413 #ifdef SIGWINCH | |
414 case SIGWINCH: | |
17251
8d3c28521112
I think this fixes #532.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17064
diff
changeset
|
415 erase(); |
22011
76e0463db3aa
Squash some compiler warnings, some from my -Wstrict-prototypes fixing.
Richard Laager <rlaager@wiktel.com>
parents:
22007
diff
changeset
|
416 g_idle_add((GSourceFunc)refresh_screen, NULL); |
20225
3c415481a943
applied changes from 388507622896337fe56945f851e3aabee3c0427f
Richard Laager <rlaager@wiktel.com>
parents:
19680
diff
changeset
|
417 if (org_winch_handler) |
3c415481a943
applied changes from 388507622896337fe56945f851e3aabee3c0427f
Richard Laager <rlaager@wiktel.com>
parents:
19680
diff
changeset
|
418 org_winch_handler(sig); |
15818 | 419 signal(SIGWINCH, sighandler); |
420 break; | |
421 #endif | |
422 case SIGCHLD: | |
423 clean_pid(); | |
424 signal(SIGCHLD, sighandler); | |
425 break; | |
16899
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
426 case SIGINT: |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
427 ask_before_exit(); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
428 signal(SIGINT, sighandler); |
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
429 break; |
15818 | 430 } |
431 } | |
432 | |
433 static void | |
22007
c38d72677c8a
Probe for -Wstrict-prototypes to get some more warnings. I then cleaned up
Richard Laager <rlaager@wiktel.com>
parents:
21720
diff
changeset
|
434 init_wm(void) |
15818 | 435 { |
436 const char *name = gnt_style_get(GNT_STYLE_WM); | |
437 gpointer handle; | |
438 | |
439 if (name && *name) { | |
440 handle = g_module_open(name, G_MODULE_BIND_LAZY); | |
441 if (handle) { | |
442 gboolean (*init)(GntWM **); | |
443 if (g_module_symbol(handle, "gntwm_init", (gpointer)&init)) { | |
444 init(&wm); | |
445 } | |
446 } | |
447 } | |
448 if (wm == NULL) | |
449 wm = g_object_new(GNT_TYPE_WM, NULL); | |
450 } | |
451 | |
452 void gnt_init() | |
453 { | |
454 char *filename; | |
455 const char *locale; | |
456 | |
457 if (channel) | |
458 return; | |
459 | |
460 locale = setlocale(LC_ALL, ""); | |
461 | |
462 setup_io(); | |
463 | |
18199
1bb3b07a6879
Detect wide character non-support at compile time, if possible.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18070
diff
changeset
|
464 #ifdef NO_WIDECHAR |
1bb3b07a6879
Detect wide character non-support at compile time, if possible.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18070
diff
changeset
|
465 ascii_only = TRUE; |
1bb3b07a6879
Detect wide character non-support at compile time, if possible.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18070
diff
changeset
|
466 #else |
15818 | 467 if (locale && (strstr(locale, "UTF") || strstr(locale, "utf"))) |
468 ascii_only = FALSE; | |
469 else | |
470 ascii_only = TRUE; | |
18199
1bb3b07a6879
Detect wide character non-support at compile time, if possible.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18070
diff
changeset
|
471 #endif |
15818 | 472 |
473 initscr(); | |
474 typeahead(-1); | |
475 noecho(); | |
476 curs_set(0); | |
477 | |
478 gnt_init_keys(); | |
479 gnt_init_styles(); | |
480 | |
481 filename = g_build_filename(g_get_home_dir(), ".gntrc", NULL); | |
482 gnt_style_read_configure_file(filename); | |
483 g_free(filename); | |
484 | |
485 gnt_init_colors(); | |
486 | |
21250
9187d331aebe
Add gnt_color_pair, which will replace color codes with 'appropriate' text
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
20309
diff
changeset
|
487 wbkgdset(stdscr, '\0' | gnt_color_pair(GNT_COLOR_NORMAL)); |
15818 | 488 refresh(); |
489 | |
490 #ifdef ALL_MOUSE_EVENTS | |
491 if ((mouse_enabled = gnt_style_get_bool(GNT_STYLE_MOUSE, FALSE))) | |
492 mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL); | |
493 #endif | |
494 | |
21250
9187d331aebe
Add gnt_color_pair, which will replace color codes with 'appropriate' text
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
20309
diff
changeset
|
495 wbkgdset(stdscr, '\0' | gnt_color_pair(GNT_COLOR_NORMAL)); |
15818 | 496 werase(stdscr); |
497 wrefresh(stdscr); | |
498 | |
499 #ifdef SIGWINCH | |
17058
a19b8d71f868
Do not process clicks on no widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16899
diff
changeset
|
500 org_winch_handler = signal(SIGWINCH, sighandler); |
15818 | 501 #endif |
502 signal(SIGCHLD, sighandler); | |
16899
d2904afe89e2
Ask before exiting when ctrl+c is pressed.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16792
diff
changeset
|
503 signal(SIGINT, sighandler); |
15818 | 504 signal(SIGPIPE, SIG_IGN); |
505 | |
506 g_type_init(); | |
507 | |
508 init_wm(); | |
509 | |
510 clipboard = g_object_new(GNT_TYPE_CLIPBOARD, NULL); | |
511 } | |
512 | |
513 void gnt_main() | |
514 { | |
515 wm->loop = g_main_loop_new(NULL, FALSE); | |
516 g_main_loop_run(wm->loop); | |
517 } | |
518 | |
519 /********************************* | |
520 * Stuff for 'window management' * | |
521 *********************************/ | |
522 | |
18344
310bad6dafe4
Allow raising window only from an event-stack, otherwise set the urgent flag.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18199
diff
changeset
|
523 void gnt_window_present(GntWidget *window) |
310bad6dafe4
Allow raising window only from an event-stack, otherwise set the urgent flag.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18199
diff
changeset
|
524 { |
310bad6dafe4
Allow raising window only from an event-stack, otherwise set the urgent flag.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18199
diff
changeset
|
525 if (wm->event_stack) |
310bad6dafe4
Allow raising window only from an event-stack, otherwise set the urgent flag.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18199
diff
changeset
|
526 gnt_wm_raise_window(wm, window); |
310bad6dafe4
Allow raising window only from an event-stack, otherwise set the urgent flag.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18199
diff
changeset
|
527 else |
310bad6dafe4
Allow raising window only from an event-stack, otherwise set the urgent flag.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18199
diff
changeset
|
528 gnt_widget_set_urgent(window); |
18070 | 529 } |
530 | |
15818 | 531 void gnt_screen_occupy(GntWidget *widget) |
532 { | |
533 gnt_wm_new_window(wm, widget); | |
534 } | |
535 | |
536 void gnt_screen_release(GntWidget *widget) | |
537 { | |
18716
0873698f8cce
This fixes a few weird crashes in pygnt.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18526
diff
changeset
|
538 if (wm) |
0873698f8cce
This fixes a few weird crashes in pygnt.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18526
diff
changeset
|
539 gnt_wm_window_close(wm, widget); |
15818 | 540 } |
541 | |
542 void gnt_screen_update(GntWidget *widget) | |
543 { | |
544 gnt_wm_update_window(wm, widget); | |
545 } | |
546 | |
547 gboolean gnt_widget_has_focus(GntWidget *widget) | |
548 { | |
549 GntWidget *w; | |
550 if (!widget) | |
551 return FALSE; | |
552 | |
553 if (GNT_IS_MENU(widget)) | |
554 return TRUE; | |
555 | |
556 w = widget; | |
557 | |
558 while (widget->parent) | |
559 widget = widget->parent; | |
560 | |
561 if (widget == wm->_list.window) | |
562 return TRUE; | |
16414
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
16281
diff
changeset
|
563 if (wm->cws->ordered && wm->cws->ordered->data == widget) { |
15818 | 564 if (GNT_IS_BOX(widget) && |
565 (GNT_BOX(widget)->active == w || widget == w)) | |
566 return TRUE; | |
567 } | |
568 return FALSE; | |
569 } | |
570 | |
571 void gnt_widget_set_urgent(GntWidget *widget) | |
572 { | |
573 while (widget->parent) | |
574 widget = widget->parent; | |
575 | |
16414
56d2ae9cbb5c
Initial workspace support. refs #51
Richard Nelson <wabz@pidgin.im>
parents:
16281
diff
changeset
|
576 if (wm->cws->ordered && wm->cws->ordered->data == widget) |
15818 | 577 return; |
578 | |
579 GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_URGENT); | |
580 | |
581 gnt_wm_update_window(wm, widget); | |
582 } | |
583 | |
584 void gnt_quit() | |
585 { | |
18716
0873698f8cce
This fixes a few weird crashes in pygnt.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18526
diff
changeset
|
586 g_object_unref(G_OBJECT(wm)); |
0873698f8cce
This fixes a few weird crashes in pygnt.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18526
diff
changeset
|
587 wm = NULL; |
0873698f8cce
This fixes a few weird crashes in pygnt.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18526
diff
changeset
|
588 |
15818 | 589 update_panels(); |
590 doupdate(); | |
591 gnt_uninit_colors(); | |
592 gnt_uninit_styles(); | |
593 endwin(); | |
594 } | |
595 | |
596 gboolean gnt_ascii_only() | |
597 { | |
598 return ascii_only; | |
599 } | |
600 | |
601 void gnt_screen_resize_widget(GntWidget *widget, int width, int height) | |
602 { | |
603 gnt_wm_resize_window(wm, widget, width, height); | |
604 } | |
605 | |
606 void gnt_screen_move_widget(GntWidget *widget, int x, int y) | |
607 { | |
608 gnt_wm_move_window(wm, widget, x, y); | |
609 } | |
610 | |
611 void gnt_screen_rename_widget(GntWidget *widget, const char *text) | |
612 { | |
613 gnt_box_set_title(GNT_BOX(widget), text); | |
614 gnt_widget_draw(widget); | |
615 gnt_wm_update_window(wm, widget); | |
616 } | |
617 | |
22007
c38d72677c8a
Probe for -Wstrict-prototypes to get some more warnings. I then cleaned up
Richard Laager <rlaager@wiktel.com>
parents:
21720
diff
changeset
|
618 void gnt_register_action(const char *label, void (*callback)(void)) |
15818 | 619 { |
620 GntAction *action = g_new0(GntAction, 1); | |
621 action->label = g_strdup(label); | |
622 action->callback = callback; | |
623 | |
624 wm->acts = g_list_append(wm->acts, action); | |
625 } | |
626 | |
627 static void | |
628 reset_menu(GntWidget *widget, gpointer null) | |
629 { | |
630 wm->menu = NULL; | |
631 } | |
632 | |
633 gboolean gnt_screen_menu_show(gpointer newmenu) | |
634 { | |
635 if (wm->menu) { | |
636 /* For now, if a menu is being displayed, then another menu | |
637 * can NOT take over. */ | |
638 return FALSE; | |
639 } | |
640 | |
641 wm->menu = newmenu; | |
642 GNT_WIDGET_UNSET_FLAGS(GNT_WIDGET(wm->menu), GNT_WIDGET_INVISIBLE); | |
643 gnt_widget_draw(GNT_WIDGET(wm->menu)); | |
644 | |
645 g_signal_connect(G_OBJECT(wm->menu), "hide", G_CALLBACK(reset_menu), NULL); | |
16792
d0f9b2b217cf
Fix context menu unusualness in the buddylist.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
646 g_signal_connect(G_OBJECT(wm->menu), "destroy", G_CALLBACK(reset_menu), NULL); |
15818 | 647 |
648 return TRUE; | |
649 } | |
650 | |
21161
e119edfc0fb0
applied changes from 172a59b41412c4630834d66f2e7ec3be970cc36b
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
20309
diff
changeset
|
651 void gnt_set_clipboard_string(const gchar *string) |
15818 | 652 { |
653 gnt_clipboard_set_string(clipboard, string); | |
654 } | |
655 | |
656 GntClipboard *gnt_get_clipboard() | |
657 { | |
658 return clipboard; | |
659 } | |
18421
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
660 |
15818 | 661 gchar *gnt_get_clipboard_string() |
662 { | |
663 return gnt_clipboard_get_string(clipboard); | |
664 } | |
18421
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
665 |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
666 #if GLIB_CHECK_VERSION(2,4,0) |
18526
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
667 typedef struct |
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
668 { |
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
669 void (*callback)(int status, gpointer data); |
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
670 gpointer data; |
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
671 } ChildProcess; |
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
672 |
18421
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
673 static void |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
674 reap_child(GPid pid, gint status, gpointer data) |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
675 { |
18526
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
676 ChildProcess *cp = data; |
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
677 if (cp->callback) { |
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
678 cp->callback(status, cp->data); |
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
679 } |
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
680 g_free(cp); |
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
681 clean_pid(); |
18421
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
682 wm->mode = GNT_KP_MODE_NORMAL; |
21720
ea56d9386081
Restore the screen properly after the child process ends.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21668
diff
changeset
|
683 endwin(); |
18421
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
684 setup_io(); |
21720
ea56d9386081
Restore the screen properly after the child process ends.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
21668
diff
changeset
|
685 refresh(); |
18421
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
686 refresh_screen(); |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
687 } |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
688 #endif |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
689 |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
690 gboolean gnt_giveup_console(const char *wd, char **argv, char **envp, |
18526
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
691 gint *stin, gint *stout, gint *sterr, |
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
692 void (*callback)(int status, gpointer data), gpointer data) |
18421
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
693 { |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
694 #if GLIB_CHECK_VERSION(2,4,0) |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
695 GPid pid = 0; |
18526
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
696 ChildProcess *cp = NULL; |
18421
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
697 |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
698 if (!g_spawn_async_with_pipes(wd, argv, envp, |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
699 G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD, |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
700 (GSpawnChildSetupFunc)endwin, NULL, |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
701 &pid, stin, stout, sterr, NULL)) |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
702 return FALSE; |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
703 |
18526
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
704 cp = g_new0(ChildProcess, 1); |
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
705 cp->callback = callback; |
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
706 cp->data = data; |
18425
84d318eadc62
The input was causing some weird issues. This fixes it.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18421
diff
changeset
|
707 g_source_remove(channel_read_callback); |
18421
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
708 wm->mode = GNT_KP_MODE_WAIT_ON_CHILD; |
18526
09db6fec9dce
Allow having a callback after the child process terminates. Use the callback
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18439
diff
changeset
|
709 g_child_watch_add(pid, reap_child, cp); |
18421
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
710 |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
711 return TRUE; |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
712 #else |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
713 return FALSE; |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
714 #endif |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
715 } |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
716 |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
717 gboolean gnt_is_refugee() |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
718 { |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
719 #if GLIB_CHECK_VERSION(2,4,0) |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
720 return (wm && wm->mode == GNT_KP_MODE_WAIT_ON_CHILD); |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
721 #else |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
722 return FALSE; |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
723 #endif |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
724 } |
e16d097c5739
Allow executing another application (eg. PAGER) that will use the same
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
18344
diff
changeset
|
725 |