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