Mercurial > pidgin
annotate finch/libgnt/gntwm.c @ 17930:71df538ed27c
FIX: Rebinding would crash when one would try to bind without grabbing a new key comb.
author | Eric Polino <aluink@pidgin.im> |
---|---|
date | Thu, 07 Jun 2007 21:58:04 +0000 |
parents | f3952839e6aa |
children | 3ee6ea8a66f8 |
rev | line source |
---|---|
17928
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
1 /** |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
2 * GNT - The GLib Ncurses Toolkit |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
3 * |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
4 * GNT is the legal property of its developers, whose names are too numerous |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
5 * to list here. Please refer to the COPYRIGHT file distributed with this |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
6 * source distribution. |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
7 * |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
8 * This library is free software; you can redistribute it and/or modify |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
9 * it under the terms of the GNU General Public License as published by |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
10 * the Free Software Foundation; either version 2 of the License, or |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
11 * (at your option) any later version. |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
12 * |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
13 * This program is distributed in the hope that it will be useful, |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
16 * GNU General Public License for more details. |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
17 * |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
18 * You should have received a copy of the GNU General Public License |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
19 * along with this program; if not, write to the Free Software |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
20 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
21 */ |
8410511f4dbb
applied changes from 016401bd409e6229fae0ab1e80d9fef9365511b3
Eric Polino <aluink@pidgin.im>
parents:
17927
diff
changeset
|
22 |
15817 | 23 #define _GNU_SOURCE |
24 #if defined(__APPLE__) | |
25 #define _XOPEN_SOURCE_EXTENDED | |
26 #endif | |
27 | |
28 #include "config.h" | |
29 | |
30 #include <ctype.h> | |
31 #include <stdlib.h> | |
32 #include <string.h> | |
33 #include <time.h> | |
34 | |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
35 #include "gntbutton.h" |
15817 | 36 #include "gntwm.h" |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
37 #include "gntentry.h" |
15817 | 38 #include "gntstyle.h" |
39 #include "gntmarshal.h" | |
40 #include "gnt.h" | |
41 #include "gntbox.h" | |
16126
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
42 #include "gntlabel.h" |
15817 | 43 #include "gntmenu.h" |
44 #include "gnttextview.h" | |
45 #include "gnttree.h" | |
46 #include "gntutils.h" | |
16126
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
47 #include "gntwindow.h" |
15817 | 48 |
49 #define IDLE_CHECK_INTERVAL 5 /* 5 seconds */ | |
50 | |
51 enum | |
52 { | |
53 SIG_NEW_WIN, | |
54 SIG_DECORATE_WIN, | |
55 SIG_CLOSE_WIN, | |
56 SIG_CONFIRM_RESIZE, | |
57 SIG_RESIZED, | |
58 SIG_CONFIRM_MOVE, | |
59 SIG_MOVED, | |
60 SIG_UPDATE_WIN, | |
61 SIG_GIVE_FOCUS, | |
62 SIG_KEY_PRESS, | |
63 SIG_MOUSE_CLICK, | |
64 SIGS | |
65 }; | |
66 | |
67 static guint signals[SIGS] = { 0 }; | |
68 static void gnt_wm_new_window_real(GntWM *wm, GntWidget *widget); | |
69 static void gnt_wm_win_resized(GntWM *wm, GntNode *node); | |
70 static void gnt_wm_win_moved(GntWM *wm, GntNode *node); | |
71 static void gnt_wm_give_focus(GntWM *wm, GntWidget *widget); | |
72 static void update_window_in_list(GntWM *wm, GntWidget *wid); | |
73 static void shift_window(GntWM *wm, GntWidget *widget, int dir); | |
74 | |
17048
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
75 #ifndef NO_WIDECHAR |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
76 static int widestringwidth(wchar_t *wide); |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
77 #endif |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
78 |
15817 | 79 static gboolean write_already(gpointer data); |
80 static int write_timeout; | |
81 static time_t last_active_time; | |
82 static gboolean idle_update; | |
83 | |
17823
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
84 static gboolean ignore_keys = FALSE; |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
85 |
17926
57c508361cff
Made rebind_info a static member with default values.
Eric Polino <aluink@pidgin.im>
parents:
17925
diff
changeset
|
86 static struct |
17923
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
87 { |
17927
f189497429c5
The rebinding of keys now removes the old binding and puts the new on in place. So only the new binding works and the old one is gone.
Eric Polino <aluink@pidgin.im>
parents:
17926
diff
changeset
|
88 char * okeys; /* Old keystrokes */ |
f189497429c5
The rebinding of keys now removes the old binding and puts the new on in place. So only the new binding works and the old one is gone.
Eric Polino <aluink@pidgin.im>
parents:
17926
diff
changeset
|
89 char * keys; /* New Keystrokes being bound to the action */ |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
90 GntBindableClass * klass; /* Class of the object that's getting keys rebound */ |
17925
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
91 char * name; /* The name of the action */ |
17923
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
92 GList * params; /* The list of paramaters */ |
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
93 |
17927
f189497429c5
The rebinding of keys now removes the old binding and puts the new on in place. So only the new binding works and the old one is gone.
Eric Polino <aluink@pidgin.im>
parents:
17926
diff
changeset
|
94 } rebind_info = {NULL,NULL,NULL,NULL,NULL}; |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
95 |
15817 | 96 static GList * |
97 g_list_bring_to_front(GList *list, gpointer data) | |
98 { | |
99 list = g_list_remove(list, data); | |
100 list = g_list_prepend(list, data); | |
101 return list; | |
102 } | |
103 | |
104 static void | |
105 free_node(gpointer data) | |
106 { | |
107 GntNode *node = data; | |
108 hide_panel(node->panel); | |
109 del_panel(node->panel); | |
110 g_free(node); | |
111 } | |
112 | |
113 static void | |
114 draw_taskbar(GntWM *wm, gboolean reposition) | |
115 { | |
116 static WINDOW *taskbar = NULL; | |
117 GList *iter; | |
118 int n, width = 0; | |
119 int i; | |
120 | |
121 if (taskbar == NULL) { | |
122 taskbar = newwin(1, getmaxx(stdscr), getmaxy(stdscr) - 1, 0); | |
123 } else if (reposition) { | |
124 int Y_MAX = getmaxy(stdscr) - 1; | |
125 mvwin(taskbar, Y_MAX, 0); | |
126 } | |
127 | |
128 wbkgdset(taskbar, '\0' | COLOR_PAIR(GNT_COLOR_NORMAL)); | |
129 werase(taskbar); | |
130 | |
131 n = g_list_length(wm->list); | |
132 if (n) | |
133 width = getmaxx(stdscr) / n; | |
134 | |
135 for (i = 0, iter = wm->list; iter; iter = iter->next, i++) | |
136 { | |
137 GntWidget *w = iter->data; | |
138 int color; | |
139 const char *title; | |
140 | |
141 if (w == wm->ordered->data) { | |
142 /* This is the current window in focus */ | |
143 color = GNT_COLOR_TITLE; | |
144 } else if (GNT_WIDGET_IS_FLAG_SET(w, GNT_WIDGET_URGENT)) { | |
145 /* This is a window with the URGENT hint set */ | |
146 color = GNT_COLOR_URGENT; | |
147 } else { | |
148 color = GNT_COLOR_NORMAL; | |
149 } | |
150 wbkgdset(taskbar, '\0' | COLOR_PAIR(color)); | |
151 if (iter->next) | |
152 mvwhline(taskbar, 0, width * i, ' ' | COLOR_PAIR(color), width); | |
153 else | |
154 mvwhline(taskbar, 0, width * i, ' ' | COLOR_PAIR(color), getmaxx(stdscr) - width * i); | |
155 title = GNT_BOX(w)->title; | |
156 mvwprintw(taskbar, 0, width * i, "%s", title ? title : "<gnt>"); | |
157 if (i) | |
158 mvwaddch(taskbar, 0, width *i - 1, ACS_VLINE | A_STANDOUT | COLOR_PAIR(GNT_COLOR_NORMAL)); | |
159 | |
160 update_window_in_list(wm, w); | |
161 } | |
162 | |
163 wrefresh(taskbar); | |
164 } | |
165 | |
166 static void | |
167 copy_win(GntWidget *widget, GntNode *node) | |
168 { | |
169 WINDOW *src, *dst; | |
170 int shadow; | |
171 if (!node) | |
172 return; | |
173 src = widget->window; | |
174 dst = node->window; | |
175 shadow = gnt_widget_has_shadow(widget) ? 1 : 0; | |
176 copywin(src, dst, node->scroll, 0, 0, 0, getmaxy(dst) - 1, getmaxx(dst) - 1, 0); | |
177 } | |
178 | |
17048
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
179 /** |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
180 * The following is a workaround for a bug in most versions of ncursesw. |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
181 * Read about it in: http://article.gmane.org/gmane.comp.lib.ncurses.bugs/2751 |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
182 * |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
183 * In short, if a panel hides one cell of a multi-cell character, then the rest |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
184 * of the characters in that line get screwed. The workaround here is to erase |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
185 * any such character preemptively. |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
186 * |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
187 * Caveat: If a wide character is erased, and the panel above it is moved enough |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
188 * to expose the entire character, it is not always redrawn. |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
189 */ |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
190 static void |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
191 work_around_for_ncurses_bug() |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
192 { |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
193 #ifndef NO_WIDECHAR |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
194 PANEL *panel = NULL; |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
195 while ((panel = panel_below(panel)) != NULL) { |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
196 int sx, ex, sy, ey, w, y; |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
197 cchar_t ch; |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
198 PANEL *below = panel; |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
199 |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
200 sx = panel->win->_begx; |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
201 ex = panel->win->_maxx + sx; |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
202 sy = panel->win->_begy; |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
203 ey = panel->win->_maxy + sy; |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
204 |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
205 while ((below = panel_below(below)) != NULL) { |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
206 if (sy > below->win->_begy + below->win->_maxy || |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
207 ey < below->win->_begy) |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
208 continue; |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
209 if (sx > below->win->_begx + below->win->_maxx || |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
210 ex < below->win->_begx) |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
211 continue; |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
212 for (y = MAX(sy, below->win->_begy); y <= MIN(ey, below->win->_begy + below->win->_maxy); y++) { |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
213 if (mvwin_wch(below->win, y - below->win->_begy, sx - 1 - below->win->_begx, &ch) != OK) |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
214 goto right; |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
215 w = widestringwidth(ch.chars); |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
216 if (w > 1 && (ch.attr & 1)) { |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
217 ch.chars[0] = ' '; |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
218 ch.attr &= ~ A_CHARTEXT; |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
219 mvwadd_wch(below->win, y - below->win->_begy, sx - 1 - below->win->_begx, &ch); |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
220 touchline(below->win, y - below->win->_begy, 1); |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
221 } |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
222 right: |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
223 if (mvwin_wch(below->win, y - below->win->_begy, ex + 1 - below->win->_begx, &ch) != OK) |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
224 continue; |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
225 w = widestringwidth(ch.chars); |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
226 if (w > 1 && !(ch.attr & 1)) { |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
227 ch.chars[0] = ' '; |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
228 ch.attr &= ~ A_CHARTEXT; |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
229 mvwadd_wch(below->win, y - below->win->_begy, ex + 1 - below->win->_begx, &ch); |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
230 touchline(below->win, y - below->win->_begy, 1); |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
231 } |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
232 } |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
233 } |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
234 } |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
235 #endif |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
236 } |
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
237 |
15817 | 238 static gboolean |
239 update_screen(GntWM *wm) | |
240 { | |
241 if (wm->menu) { | |
242 GntMenu *top = wm->menu; | |
243 while (top) { | |
244 GntNode *node = g_hash_table_lookup(wm->nodes, top); | |
245 if (node) | |
246 top_panel(node->panel); | |
247 top = top->submenu; | |
248 } | |
249 } | |
17048
f1abdde52538
A workaround for an ncurses bug about multi-cell characters and panels.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16518
diff
changeset
|
250 work_around_for_ncurses_bug(); |
15817 | 251 update_panels(); |
252 doupdate(); | |
253 return TRUE; | |
254 } | |
255 | |
256 static gboolean | |
257 sanitize_position(GntWidget *widget, int *x, int *y) | |
258 { | |
259 int X_MAX = getmaxx(stdscr); | |
260 int Y_MAX = getmaxy(stdscr) - 1; | |
261 int w, h; | |
262 int nx, ny; | |
263 gboolean changed = FALSE; | |
264 | |
265 gnt_widget_get_size(widget, &w, &h); | |
266 if (x) { | |
267 if (*x + w > X_MAX) { | |
268 nx = MAX(0, X_MAX - w); | |
269 if (nx != *x) { | |
270 *x = nx; | |
271 changed = TRUE; | |
272 } | |
273 } | |
274 } | |
275 if (y) { | |
276 if (*y + h > Y_MAX) { | |
277 ny = MAX(0, Y_MAX - h); | |
278 if (ny != *y) { | |
279 *y = ny; | |
280 changed = TRUE; | |
281 } | |
282 } | |
283 } | |
284 return changed; | |
285 } | |
286 | |
287 static void | |
288 refresh_node(GntWidget *widget, GntNode *node, gpointer null) | |
289 { | |
290 int x, y, w, h; | |
291 int nw, nh; | |
292 | |
293 int X_MAX = getmaxx(stdscr); | |
294 int Y_MAX = getmaxy(stdscr) - 1; | |
295 | |
296 gnt_widget_get_position(widget, &x, &y); | |
297 gnt_widget_get_size(widget, &w, &h); | |
298 | |
299 if (sanitize_position(widget, &x, &y)) | |
300 gnt_screen_move_widget(widget, x, y); | |
301 | |
302 nw = MIN(w, X_MAX); | |
303 nh = MIN(h, Y_MAX); | |
304 if (nw != w || nh != h) | |
305 gnt_screen_resize_widget(widget, nw, nh); | |
306 } | |
307 | |
308 static void | |
309 read_window_positions(GntWM *wm) | |
310 { | |
311 #if GLIB_CHECK_VERSION(2,6,0) | |
312 GKeyFile *gfile = g_key_file_new(); | |
313 char *filename = g_build_filename(g_get_home_dir(), ".gntpositions", NULL); | |
314 GError *error = NULL; | |
315 char **keys; | |
316 gsize nk; | |
317 | |
318 if (!g_key_file_load_from_file(gfile, filename, G_KEY_FILE_NONE, &error)) { | |
319 g_printerr("GntWM: %s\n", error->message); | |
320 g_error_free(error); | |
321 g_free(filename); | |
322 return; | |
323 } | |
324 | |
325 keys = g_key_file_get_keys(gfile, "positions", &nk, &error); | |
326 if (error) { | |
327 g_printerr("GntWM: %s\n", error->message); | |
328 g_error_free(error); | |
329 error = NULL; | |
330 } else { | |
331 while (nk--) { | |
332 char *title = keys[nk]; | |
333 gsize l; | |
334 char **coords = g_key_file_get_string_list(gfile, "positions", title, &l, NULL); | |
335 if (l == 2) { | |
336 int x = atoi(coords[0]); | |
337 int y = atoi(coords[1]); | |
338 GntPosition *p = g_new0(GntPosition, 1); | |
339 p->x = x; | |
340 p->y = y; | |
341 g_hash_table_replace(wm->positions, g_strdup(title + 1), p); | |
342 } else { | |
343 g_printerr("GntWM: Invalid number of arguments for positioing a window.\n"); | |
344 } | |
345 g_strfreev(coords); | |
346 } | |
347 g_strfreev(keys); | |
348 } | |
349 | |
350 g_free(filename); | |
15964 | 351 g_key_file_free(gfile); |
15817 | 352 #endif |
353 } | |
354 | |
355 static gboolean check_idle(gpointer n) | |
356 { | |
357 if (idle_update) { | |
358 time(&last_active_time); | |
359 idle_update = FALSE; | |
360 } | |
361 return TRUE; | |
362 } | |
363 | |
364 static void | |
365 gnt_wm_init(GTypeInstance *instance, gpointer class) | |
366 { | |
367 GntWM *wm = GNT_WM(instance); | |
368 wm->list = NULL; | |
369 wm->ordered = NULL; | |
370 wm->event_stack = FALSE; | |
371 wm->windows = NULL; | |
372 wm->actions = NULL; | |
373 wm->nodes = g_hash_table_new_full(g_direct_hash, g_direct_equal, NULL, free_node); | |
374 wm->positions = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); | |
375 if (gnt_style_get_bool(GNT_STYLE_REMPOS, TRUE)) | |
376 read_window_positions(wm); | |
377 g_timeout_add(IDLE_CHECK_INTERVAL * 1000, check_idle, NULL); | |
378 time(&last_active_time); | |
379 } | |
380 | |
381 static void | |
382 switch_window(GntWM *wm, int direction) | |
383 { | |
384 GntWidget *w = NULL, *wid = NULL; | |
385 int pos; | |
386 | |
387 if (wm->_list.window || wm->menu) | |
388 return; | |
389 | |
390 if (!wm->ordered || !wm->ordered->next) | |
391 return; | |
392 | |
393 w = wm->ordered->data; | |
394 pos = g_list_index(wm->list, w); | |
395 pos += direction; | |
396 | |
397 if (pos < 0) | |
398 wid = g_list_last(wm->list)->data; | |
399 else if (pos >= g_list_length(wm->list)) | |
400 wid = wm->list->data; | |
401 else if (pos >= 0) | |
402 wid = g_list_nth_data(wm->list, pos); | |
403 | |
404 wm->ordered = g_list_bring_to_front(wm->ordered, wid); | |
405 | |
406 gnt_wm_raise_window(wm, wm->ordered->data); | |
407 | |
408 if (w != wid) { | |
409 gnt_widget_set_focus(w, FALSE); | |
410 } | |
411 } | |
412 | |
413 static gboolean | |
414 window_next(GntBindable *bindable, GList *null) | |
415 { | |
416 GntWM *wm = GNT_WM(bindable); | |
417 switch_window(wm, 1); | |
418 return TRUE; | |
419 } | |
420 | |
421 static gboolean | |
422 window_prev(GntBindable *bindable, GList *null) | |
423 { | |
424 GntWM *wm = GNT_WM(bindable); | |
425 switch_window(wm, -1); | |
426 return TRUE; | |
427 } | |
428 | |
429 static gboolean | |
430 switch_window_n(GntBindable *bind, GList *list) | |
431 { | |
432 GntWM *wm = GNT_WM(bind); | |
433 GntWidget *w = NULL; | |
434 GList *l; | |
435 int n; | |
436 | |
437 if (!wm->ordered) | |
438 return TRUE; | |
439 | |
440 if (list) | |
441 n = GPOINTER_TO_INT(list->data); | |
442 else | |
443 n = 0; | |
444 | |
445 w = wm->ordered->data; | |
446 | |
447 if ((l = g_list_nth(wm->list, n)) != NULL) | |
448 { | |
449 gnt_wm_raise_window(wm, l->data); | |
450 } | |
451 | |
452 if (l && w != l->data) | |
453 { | |
454 gnt_widget_set_focus(w, FALSE); | |
455 } | |
456 return TRUE; | |
457 } | |
458 | |
459 static gboolean | |
460 window_scroll_up(GntBindable *bindable, GList *null) | |
461 { | |
462 GntWM *wm = GNT_WM(bindable); | |
463 GntWidget *window; | |
464 GntNode *node; | |
465 | |
466 if (!wm->ordered) | |
467 return TRUE; | |
468 | |
469 window = wm->ordered->data; | |
470 node = g_hash_table_lookup(wm->nodes, window); | |
471 if (!node) | |
472 return TRUE; | |
473 | |
474 if (node->scroll) { | |
475 node->scroll--; | |
476 copy_win(window, node); | |
477 update_screen(wm); | |
478 } | |
479 return TRUE; | |
480 } | |
481 | |
482 static gboolean | |
483 window_scroll_down(GntBindable *bindable, GList *null) | |
484 { | |
485 GntWM *wm = GNT_WM(bindable); | |
486 GntWidget *window; | |
487 GntNode *node; | |
488 int w, h; | |
489 | |
490 if (!wm->ordered) | |
491 return TRUE; | |
492 | |
493 window = wm->ordered->data; | |
494 node = g_hash_table_lookup(wm->nodes, window); | |
495 if (!node) | |
496 return TRUE; | |
497 | |
498 gnt_widget_get_size(window, &w, &h); | |
499 if (h - node->scroll > getmaxy(node->window)) { | |
500 node->scroll++; | |
501 copy_win(window, node); | |
502 update_screen(wm); | |
503 } | |
504 return TRUE; | |
505 } | |
506 | |
507 static gboolean | |
508 window_close(GntBindable *bindable, GList *null) | |
509 { | |
510 GntWM *wm = GNT_WM(bindable); | |
511 | |
512 if (wm->_list.window) | |
513 return TRUE; | |
514 | |
515 if (wm->ordered) { | |
516 gnt_widget_destroy(wm->ordered->data); | |
517 } | |
518 | |
519 return TRUE; | |
520 } | |
521 | |
17923
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
522 static void |
17825
aeb8c9fbb577
Fixed some curlies for functions
Eric Polino <aluink@pidgin.im>
parents:
17824
diff
changeset
|
523 free_rebind_info() |
aeb8c9fbb577
Fixed some curlies for functions
Eric Polino <aluink@pidgin.im>
parents:
17824
diff
changeset
|
524 { |
17926
57c508361cff
Made rebind_info a static member with default values.
Eric Polino <aluink@pidgin.im>
parents:
17925
diff
changeset
|
525 g_free(rebind_info.name); |
57c508361cff
Made rebind_info a static member with default values.
Eric Polino <aluink@pidgin.im>
parents:
17925
diff
changeset
|
526 g_free(rebind_info.keys); |
17927
f189497429c5
The rebinding of keys now removes the old binding and puts the new on in place. So only the new binding works and the old one is gone.
Eric Polino <aluink@pidgin.im>
parents:
17926
diff
changeset
|
527 g_free(rebind_info.okeys); |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
528 } |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
529 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
530 static gboolean |
17825
aeb8c9fbb577
Fixed some curlies for functions
Eric Polino <aluink@pidgin.im>
parents:
17824
diff
changeset
|
531 help_for_widget_cancel_button_activate(GntBindable *bindable, gpointer data) |
aeb8c9fbb577
Fixed some curlies for functions
Eric Polino <aluink@pidgin.im>
parents:
17824
diff
changeset
|
532 { |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
533 free_rebind_info(); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
534 gnt_widget_destroy(GNT_WIDGET(data)); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
535 return TRUE; |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
536 } |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
537 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
538 static gboolean |
17825
aeb8c9fbb577
Fixed some curlies for functions
Eric Polino <aluink@pidgin.im>
parents:
17824
diff
changeset
|
539 help_for_widget_bind_button_activate(GntBindable *bindable, gpointer data) |
aeb8c9fbb577
Fixed some curlies for functions
Eric Polino <aluink@pidgin.im>
parents:
17824
diff
changeset
|
540 { |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
541 |
17930
71df538ed27c
FIX: Rebinding would crash when one would try to bind without grabbing a new key comb.
Eric Polino <aluink@pidgin.im>
parents:
17929
diff
changeset
|
542 if(rebind_info.keys){ |
71df538ed27c
FIX: Rebinding would crash when one would try to bind without grabbing a new key comb.
Eric Polino <aluink@pidgin.im>
parents:
17929
diff
changeset
|
543 gnt_bindable_register_binding(rebind_info.klass, |
71df538ed27c
FIX: Rebinding would crash when one would try to bind without grabbing a new key comb.
Eric Polino <aluink@pidgin.im>
parents:
17929
diff
changeset
|
544 NULL, |
71df538ed27c
FIX: Rebinding would crash when one would try to bind without grabbing a new key comb.
Eric Polino <aluink@pidgin.im>
parents:
17929
diff
changeset
|
545 rebind_info.okeys, |
71df538ed27c
FIX: Rebinding would crash when one would try to bind without grabbing a new key comb.
Eric Polino <aluink@pidgin.im>
parents:
17929
diff
changeset
|
546 rebind_info.params); |
71df538ed27c
FIX: Rebinding would crash when one would try to bind without grabbing a new key comb.
Eric Polino <aluink@pidgin.im>
parents:
17929
diff
changeset
|
547 gnt_bindable_register_binding(rebind_info.klass, |
71df538ed27c
FIX: Rebinding would crash when one would try to bind without grabbing a new key comb.
Eric Polino <aluink@pidgin.im>
parents:
17929
diff
changeset
|
548 rebind_info.name, |
71df538ed27c
FIX: Rebinding would crash when one would try to bind without grabbing a new key comb.
Eric Polino <aluink@pidgin.im>
parents:
17929
diff
changeset
|
549 rebind_info.keys, |
71df538ed27c
FIX: Rebinding would crash when one would try to bind without grabbing a new key comb.
Eric Polino <aluink@pidgin.im>
parents:
17929
diff
changeset
|
550 rebind_info.params); |
71df538ed27c
FIX: Rebinding would crash when one would try to bind without grabbing a new key comb.
Eric Polino <aluink@pidgin.im>
parents:
17929
diff
changeset
|
551 } |
17926
57c508361cff
Made rebind_info a static member with default values.
Eric Polino <aluink@pidgin.im>
parents:
17925
diff
changeset
|
552 free_rebind_info(); |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
553 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
554 gnt_widget_destroy(GNT_WIDGET(data)); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
555 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
556 return TRUE; |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
557 } |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
558 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
559 static gboolean |
17825
aeb8c9fbb577
Fixed some curlies for functions
Eric Polino <aluink@pidgin.im>
parents:
17824
diff
changeset
|
560 help_for_widget_grab_key(GntBindable *bindable, const char *text, gpointer *data) |
aeb8c9fbb577
Fixed some curlies for functions
Eric Polino <aluink@pidgin.im>
parents:
17824
diff
changeset
|
561 { |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
562 |
17929
f3952839e6aa
Changed the rebinding window to use a GntTextView instead of a GntLabel to display the new key combination
Eric Polino <aluink@pidgin.im>
parents:
17928
diff
changeset
|
563 GntTextView *textview= GNT_TEXT_VIEW(data); |
17923
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
564 char *new_text; |
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
565 const char *tmp; |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
566 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
567 if(text && *text){ |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
568 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
569 if(!strcmp(text, GNT_KEY_CTRL_I) || !strcmp(text, GNT_KEY_ENTER)){ |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
570 return FALSE; |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
571 } |
17923
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
572 |
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
573 tmp = gnt_key_lookup(text); |
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
574 new_text = g_strdup_printf("KEY: \"%s\"",tmp); |
17929
f3952839e6aa
Changed the rebinding window to use a GntTextView instead of a GntLabel to display the new key combination
Eric Polino <aluink@pidgin.im>
parents:
17928
diff
changeset
|
575 gnt_text_view_clear(textview); |
f3952839e6aa
Changed the rebinding window to use a GntTextView instead of a GntLabel to display the new key combination
Eric Polino <aluink@pidgin.im>
parents:
17928
diff
changeset
|
576 gnt_text_view_append_text_with_flags(textview,new_text,GNT_TEXT_FLAG_NORMAL); |
f3952839e6aa
Changed the rebinding window to use a GntTextView instead of a GntLabel to display the new key combination
Eric Polino <aluink@pidgin.im>
parents:
17928
diff
changeset
|
577 g_free(new_text); |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
578 |
17926
57c508361cff
Made rebind_info a static member with default values.
Eric Polino <aluink@pidgin.im>
parents:
17925
diff
changeset
|
579 g_free(rebind_info.keys); |
57c508361cff
Made rebind_info a static member with default values.
Eric Polino <aluink@pidgin.im>
parents:
17925
diff
changeset
|
580 rebind_info.keys = g_strdup(text); |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
581 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
582 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
583 return TRUE; |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
584 } |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
585 return FALSE; |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
586 } |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
587 static void |
17825
aeb8c9fbb577
Fixed some curlies for functions
Eric Polino <aluink@pidgin.im>
parents:
17824
diff
changeset
|
588 help_for_widget_activate(GntBindable *bindable, gpointer widget) |
aeb8c9fbb577
Fixed some curlies for functions
Eric Polino <aluink@pidgin.im>
parents:
17824
diff
changeset
|
589 { |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
590 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
591 GntTree * tree = GNT_TREE(bindable); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
592 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
593 GntWidget *vbox = gnt_box_new(FALSE,TRUE); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
594 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
595 GntWidget *label; |
17923
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
596 const char * widget_name = g_type_name(G_OBJECT_TYPE(widget)); |
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
597 char * keys; |
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
598 |
17929
f3952839e6aa
Changed the rebinding window to use a GntTextView instead of a GntLabel to display the new key combination
Eric Polino <aluink@pidgin.im>
parents:
17928
diff
changeset
|
599 GntWidget *key_textview; |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
600 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
601 GntWidget *bind_button, *cancel_button; |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
602 GntWidget *button_box; |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
603 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
604 GntWidget *win = gnt_window_new(); |
17923
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
605 GList * current_row_data,*itr; |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
606 char * tmp; |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
607 |
17926
57c508361cff
Made rebind_info a static member with default values.
Eric Polino <aluink@pidgin.im>
parents:
17925
diff
changeset
|
608 rebind_info.klass = GNT_BINDABLE_GET_CLASS(widget); |
17923
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
609 |
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
610 current_row_data = gnt_tree_get_selection_text_list(tree); |
17926
57c508361cff
Made rebind_info a static member with default values.
Eric Polino <aluink@pidgin.im>
parents:
17925
diff
changeset
|
611 rebind_info.name = g_strdup(g_list_nth_data(current_row_data,1)); |
17923
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
612 |
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
613 keys = gnt_tree_get_selection_data(tree); |
17927
f189497429c5
The rebinding of keys now removes the old binding and puts the new on in place. So only the new binding works and the old one is gone.
Eric Polino <aluink@pidgin.im>
parents:
17926
diff
changeset
|
614 rebind_info.okeys = g_strdup(gnt_key_translate(keys)); |
17923
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
615 |
17926
57c508361cff
Made rebind_info a static member with default values.
Eric Polino <aluink@pidgin.im>
parents:
17925
diff
changeset
|
616 rebind_info.params = NULL; |
17923
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
617 |
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
618 itr = current_row_data; |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
619 while(itr){ |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
620 g_free(itr->data); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
621 itr = itr->next; |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
622 } |
17923
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
623 g_list_free(current_row_data); |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
624 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
625 gnt_box_set_alignment(GNT_BOX(vbox), GNT_ALIGN_MID); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
626 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
627 gnt_box_set_title(GNT_BOX(win),"Key Capture"); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
628 |
17926
57c508361cff
Made rebind_info a static member with default values.
Eric Polino <aluink@pidgin.im>
parents:
17925
diff
changeset
|
629 tmp = g_strdup_printf("Type the new bindings for %s in a %s.",rebind_info.name,widget_name); |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
630 label = gnt_label_new(tmp); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
631 g_free(tmp); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
632 gnt_box_add_widget(GNT_BOX(vbox),label); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
633 |
17923
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
634 tmp = g_strdup_printf("KEY: \"%s\"",keys); |
17929
f3952839e6aa
Changed the rebinding window to use a GntTextView instead of a GntLabel to display the new key combination
Eric Polino <aluink@pidgin.im>
parents:
17928
diff
changeset
|
635 key_textview = gnt_text_view_new(); |
f3952839e6aa
Changed the rebinding window to use a GntTextView instead of a GntLabel to display the new key combination
Eric Polino <aluink@pidgin.im>
parents:
17928
diff
changeset
|
636 gnt_widget_set_size(key_textview,key_textview->priv.x,2); |
f3952839e6aa
Changed the rebinding window to use a GntTextView instead of a GntLabel to display the new key combination
Eric Polino <aluink@pidgin.im>
parents:
17928
diff
changeset
|
637 gnt_text_view_append_text_with_flags(GNT_TEXT_VIEW(key_textview),tmp,GNT_TEXT_FLAG_NORMAL); |
17923
3177ef1d6824
Fixed a few names that weren't formatted properly.
Eric Polino <aluink@pidgin.im>
parents:
17922
diff
changeset
|
638 g_free(tmp); |
17929
f3952839e6aa
Changed the rebinding window to use a GntTextView instead of a GntLabel to display the new key combination
Eric Polino <aluink@pidgin.im>
parents:
17928
diff
changeset
|
639 gnt_widget_set_name(key_textview,"keystroke"); |
f3952839e6aa
Changed the rebinding window to use a GntTextView instead of a GntLabel to display the new key combination
Eric Polino <aluink@pidgin.im>
parents:
17928
diff
changeset
|
640 gnt_box_add_widget(GNT_BOX(vbox),key_textview); |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
641 |
17929
f3952839e6aa
Changed the rebinding window to use a GntTextView instead of a GntLabel to display the new key combination
Eric Polino <aluink@pidgin.im>
parents:
17928
diff
changeset
|
642 g_signal_connect(G_OBJECT(win), "key_pressed", G_CALLBACK(help_for_widget_grab_key),key_textview); |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
643 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
644 button_box = gnt_box_new(FALSE,FALSE); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
645 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
646 bind_button = gnt_button_new("BIND"); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
647 gnt_widget_set_name(bind_button,"bind"); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
648 gnt_box_add_widget(GNT_BOX(button_box), bind_button); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
649 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
650 cancel_button = gnt_button_new("Cancel"); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
651 gnt_widget_set_name(cancel_button,"cancel"); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
652 gnt_box_add_widget(GNT_BOX(button_box),cancel_button); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
653 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
654 g_signal_connect(G_OBJECT(bind_button), "activate", G_CALLBACK(help_for_widget_bind_button_activate),win); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
655 g_signal_connect(G_OBJECT(cancel_button), "activate", G_CALLBACK(help_for_widget_cancel_button_activate),win); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
656 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
657 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
658 gnt_box_add_widget(GNT_BOX(vbox),button_box); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
659 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
660 gnt_box_add_widget(GNT_BOX(win),vbox); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
661 gnt_widget_show(win); |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
662 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
663 } |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
664 |
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
665 static gboolean |
17925
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
666 build_help_window(GntWidget *widget){ |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
667 |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
668 GntWidget *tree,*win; |
16126
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
669 char *title; |
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
670 |
17925
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
671 tree = gnt_widget_bindings_view(widget); |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
672 g_signal_connect(G_OBJECT(tree), "activate", G_CALLBACK(help_for_widget_activate), widget); |
17824
b242187b3591
Created a new window that will be used for key-rebinding. Right now it doesn't rebind the keys, but that can be added soon. A bit of esthetical work remains.
Eric Polino <aluink@pidgin.im>
parents:
17823
diff
changeset
|
673 |
16126
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
674 win = gnt_window_new(); |
17925
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
675 title = g_strdup_printf("Bindings for %s", g_type_name(G_OBJECT_TYPE(widget))); |
16126
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
676 gnt_box_set_title(GNT_BOX(win), title); |
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
677 if (tree) |
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
678 gnt_box_add_widget(GNT_BOX(win), tree); |
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
679 else |
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
680 gnt_box_add_widget(GNT_BOX(win), gnt_label_new("This widget has no customizable bindings.")); |
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
681 |
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
682 gnt_widget_show(win); |
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
683 |
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
684 return TRUE; |
17925
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
685 |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
686 } |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
687 |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
688 static gboolean |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
689 help_for_widget(GntBindable *bindable, GList *null) |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
690 { |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
691 GntWM *wm = GNT_WM(bindable); |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
692 GntWidget *widget; |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
693 |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
694 if (!wm->ordered) |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
695 return TRUE; |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
696 |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
697 widget = wm->ordered->data; |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
698 if (!GNT_IS_BOX(widget)) |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
699 return TRUE; |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
700 |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
701 return build_help_window(GNT_BOX(widget)->active); |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
702 |
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
703 |
16126
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
704 } |
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
705 |
17924
1abacdef8205
Alt-\ allows to rebind keys to the wm
Eric Polino <aluink@pidgin.im>
parents:
17923
diff
changeset
|
706 static gboolean |
1abacdef8205
Alt-\ allows to rebind keys to the wm
Eric Polino <aluink@pidgin.im>
parents:
17923
diff
changeset
|
707 help_for_wm(GntBindable *bindable, GList *null){ |
1abacdef8205
Alt-\ allows to rebind keys to the wm
Eric Polino <aluink@pidgin.im>
parents:
17923
diff
changeset
|
708 |
17925
85c6b51d3085
Refactored common code from help_for_widget and help_for_wm.
Eric Polino <aluink@pidgin.im>
parents:
17924
diff
changeset
|
709 return build_help_window(GNT_WIDGET(bindable)); |
17924
1abacdef8205
Alt-\ allows to rebind keys to the wm
Eric Polino <aluink@pidgin.im>
parents:
17923
diff
changeset
|
710 |
1abacdef8205
Alt-\ allows to rebind keys to the wm
Eric Polino <aluink@pidgin.im>
parents:
17923
diff
changeset
|
711 } |
1abacdef8205
Alt-\ allows to rebind keys to the wm
Eric Polino <aluink@pidgin.im>
parents:
17923
diff
changeset
|
712 |
15817 | 713 static void |
714 destroy__list(GntWidget *widget, GntWM *wm) | |
715 { | |
716 wm->_list.window = NULL; | |
717 wm->_list.tree = NULL; | |
718 wm->windows = NULL; | |
719 wm->actions = NULL; | |
720 update_screen(wm); | |
721 } | |
722 | |
723 static void | |
724 setup__list(GntWM *wm) | |
725 { | |
726 GntWidget *tree, *win; | |
727 win = wm->_list.window = gnt_box_new(FALSE, FALSE); | |
728 gnt_box_set_toplevel(GNT_BOX(win), TRUE); | |
729 gnt_box_set_pad(GNT_BOX(win), 0); | |
730 GNT_WIDGET_SET_FLAGS(win, GNT_WIDGET_TRANSIENT); | |
731 | |
732 tree = wm->_list.tree = gnt_tree_new(); | |
733 gnt_box_add_widget(GNT_BOX(win), tree); | |
734 | |
735 g_signal_connect(G_OBJECT(win), "destroy", G_CALLBACK(destroy__list), wm); | |
736 } | |
737 | |
738 static void | |
739 window_list_activate(GntTree *tree, GntWM *wm) | |
740 { | |
741 GntWidget *widget = gnt_tree_get_selection_data(GNT_TREE(tree)); | |
742 | |
743 if (!wm->ordered || !widget) | |
744 return; | |
745 | |
746 gnt_widget_destroy(wm->_list.window); | |
747 gnt_wm_raise_window(wm, widget); | |
748 } | |
749 | |
750 static void | |
751 populate_window_list(GntWM *wm) | |
752 { | |
753 GList *iter; | |
754 GntTree *tree = GNT_TREE(wm->windows->tree); | |
755 for (iter = wm->list; iter; iter = iter->next) { | |
756 GntBox *box = GNT_BOX(iter->data); | |
757 | |
758 gnt_tree_add_row_last(tree, box, | |
759 gnt_tree_create_row(tree, box->title), NULL); | |
760 update_window_in_list(wm, GNT_WIDGET(box)); | |
761 } | |
762 } | |
763 | |
764 static gboolean | |
765 window_list_key_pressed(GntWidget *widget, const char *text, GntWM *wm) | |
766 { | |
767 if (text[1] == 0 && wm->ordered) { | |
768 GntWidget *sel = gnt_tree_get_selection_data(GNT_TREE(widget)); | |
769 switch (text[0]) { | |
770 case '-': | |
16127
063274e9cb27
These bindings are easier for changing window order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16126
diff
changeset
|
771 case ',': |
15817 | 772 shift_window(wm, sel, -1); |
773 break; | |
16127
063274e9cb27
These bindings are easier for changing window order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16126
diff
changeset
|
774 case '=': |
063274e9cb27
These bindings are easier for changing window order.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16126
diff
changeset
|
775 case '.': |
15817 | 776 shift_window(wm, sel, 1); |
777 break; | |
778 default: | |
779 return FALSE; | |
780 } | |
781 gnt_tree_remove_all(GNT_TREE(widget)); | |
782 populate_window_list(wm); | |
783 gnt_tree_set_selected(GNT_TREE(widget), sel); | |
784 return TRUE; | |
785 } | |
786 return FALSE; | |
787 } | |
788 | |
789 static gboolean | |
790 window_list(GntBindable *bindable, GList *null) | |
791 { | |
792 GntWM *wm = GNT_WM(bindable); | |
793 GntWidget *tree, *win; | |
794 | |
795 if (wm->_list.window || wm->menu) | |
796 return TRUE; | |
797 | |
798 if (!wm->ordered) | |
799 return TRUE; | |
800 | |
801 setup__list(wm); | |
802 wm->windows = &wm->_list; | |
803 | |
804 win = wm->windows->window; | |
805 tree = wm->windows->tree; | |
806 | |
807 gnt_box_set_title(GNT_BOX(win), "Window List"); | |
808 | |
809 populate_window_list(wm); | |
810 | |
811 gnt_tree_set_selected(GNT_TREE(tree), wm->ordered->data); | |
812 g_signal_connect(G_OBJECT(tree), "activate", G_CALLBACK(window_list_activate), wm); | |
813 g_signal_connect(G_OBJECT(tree), "key_pressed", G_CALLBACK(window_list_key_pressed), wm); | |
814 | |
815 gnt_tree_set_col_width(GNT_TREE(tree), 0, getmaxx(stdscr) / 3); | |
816 gnt_widget_set_size(tree, 0, getmaxy(stdscr) / 2); | |
817 gnt_widget_set_position(win, getmaxx(stdscr) / 3, getmaxy(stdscr) / 4); | |
818 | |
819 gnt_widget_show(win); | |
820 return TRUE; | |
821 } | |
822 | |
823 static gboolean | |
824 dump_screen(GntBindable *bindable, GList *null) | |
825 { | |
826 int x, y; | |
827 chtype old = 0, now = 0; | |
828 FILE *file = fopen("dump.html", "w"); | |
17117
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
829 struct { |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
830 char ascii; |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
831 char *unicode; |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
832 } unis[] = { |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
833 {'q', "─"}, |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
834 {'t', "├"}, |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
835 {'u', "┤"}, |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
836 {'x', "│"}, |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
837 {'-', "↑"}, |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
838 {'.', "↓"}, |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
839 {'l', "┌"}, |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
840 {'k', "┐"}, |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
841 {'m', "└"}, |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
842 {'j', "┘"}, |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
843 {'a', "▒"}, |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
844 {'\0', NULL} |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
845 }; |
15817 | 846 |
17117
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
847 fprintf(file, "<head>\n <meta http-equiv='Content-Type' content='text/html; charset=utf-8' />\n</head>\n<body>\n"); |
15817 | 848 fprintf(file, "<pre>"); |
849 for (y = 0; y < getmaxy(stdscr); y++) { | |
850 for (x = 0; x < getmaxx(stdscr); x++) { | |
17117
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
851 char ch[2] = {0, 0}, *print; |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
852 #ifdef NO_WIDECHAR |
15817 | 853 now = mvwinch(curscr, y, x); |
17117
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
854 ch[0] = now & A_CHARTEXT; |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
855 now ^= ch[0]; |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
856 #else |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
857 cchar_t wch; |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
858 char unicode[12]; |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
859 mvwin_wch(curscr, y, x, &wch); |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
860 now = wch.attr; |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
861 ch[0] = (char)(wch.chars[0] & 0xff); |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
862 #endif |
15817 | 863 |
864 #define CHECK(attr, start, end) \ | |
865 do \ | |
866 { \ | |
867 if (now & attr) \ | |
868 { \ | |
869 if (!(old & attr)) \ | |
870 fprintf(file, "%s", start); \ | |
871 } \ | |
872 else if (old & attr) \ | |
873 { \ | |
874 fprintf(file, "%s", end); \ | |
875 } \ | |
876 } while (0) | |
877 | |
878 CHECK(A_BOLD, "<b>", "</b>"); | |
879 CHECK(A_UNDERLINE, "<u>", "</u>"); | |
880 CHECK(A_BLINK, "<blink>", "</blink>"); | |
881 | |
882 if ((now & A_COLOR) != (old & A_COLOR) || | |
883 (now & A_REVERSE) != (old & A_REVERSE)) | |
884 { | |
885 int ret; | |
886 short fgp, bgp, r, g, b; | |
887 struct | |
888 { | |
889 int r, g, b; | |
890 } fg, bg; | |
891 | |
892 ret = pair_content(PAIR_NUMBER(now & A_COLOR), &fgp, &bgp); | |
893 if (fgp == -1) | |
894 fgp = COLOR_BLACK; | |
895 if (bgp == -1) | |
896 bgp = COLOR_WHITE; | |
897 if (now & A_REVERSE) | |
17146
e5cc13b1e0ca
Fix a compiler warning by using a temporary variable for swapping.
Richard Laager <rlaager@wiktel.com>
parents:
17117
diff
changeset
|
898 { |
e5cc13b1e0ca
Fix a compiler warning by using a temporary variable for swapping.
Richard Laager <rlaager@wiktel.com>
parents:
17117
diff
changeset
|
899 short tmp = fgp; |
e5cc13b1e0ca
Fix a compiler warning by using a temporary variable for swapping.
Richard Laager <rlaager@wiktel.com>
parents:
17117
diff
changeset
|
900 fgp = bgp; |
e5cc13b1e0ca
Fix a compiler warning by using a temporary variable for swapping.
Richard Laager <rlaager@wiktel.com>
parents:
17117
diff
changeset
|
901 bgp = tmp; |
e5cc13b1e0ca
Fix a compiler warning by using a temporary variable for swapping.
Richard Laager <rlaager@wiktel.com>
parents:
17117
diff
changeset
|
902 } |
15817 | 903 ret = color_content(fgp, &r, &g, &b); |
904 fg.r = r; fg.b = b; fg.g = g; | |
905 ret = color_content(bgp, &r, &g, &b); | |
906 bg.r = r; bg.b = b; bg.g = g; | |
907 #define ADJUST(x) (x = x * 255 / 1000) | |
908 ADJUST(fg.r); | |
909 ADJUST(fg.g); | |
910 ADJUST(fg.b); | |
911 ADJUST(bg.r); | |
912 ADJUST(bg.b); | |
913 ADJUST(bg.g); | |
914 | |
915 if (x) fprintf(file, "</span>"); | |
916 fprintf(file, "<span style=\"background:#%02x%02x%02x;color:#%02x%02x%02x\">", | |
917 bg.r, bg.g, bg.b, fg.r, fg.g, fg.b); | |
918 } | |
17117
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
919 print = ch; |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
920 #ifndef NO_WIDECHAR |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
921 if (wch.chars[0] > 255) { |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
922 snprintf(unicode, sizeof(unicode), "&#x%x;", wch.chars[0]); |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
923 print = unicode; |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
924 } |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
925 #endif |
15817 | 926 if (now & A_ALTCHARSET) |
927 { | |
17117
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
928 int u; |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
929 for (u = 0; unis[u].ascii; u++) { |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
930 if (ch[0] == unis[u].ascii) { |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
931 print = unis[u].unicode; |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
932 break; |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
933 } |
15817 | 934 } |
17117
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
935 if (!unis[u].ascii) |
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
936 print = " "; |
15817 | 937 } |
17117
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
938 if (ch[0] == '&') |
15817 | 939 fprintf(file, "&"); |
17117
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
940 else if (ch[0] == '<') |
15817 | 941 fprintf(file, "<"); |
17117
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
942 else if (ch[0] == '>') |
15817 | 943 fprintf(file, ">"); |
944 else | |
17117
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
945 fprintf(file, "%s", print); |
15817 | 946 old = now; |
947 } | |
948 fprintf(file, "</span>\n"); | |
949 old = 0; | |
950 } | |
17117
3c4280387259
Generate nicer HTML dumps.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
17048
diff
changeset
|
951 fprintf(file, "</pre>\n</body>"); |
15817 | 952 fclose(file); |
953 return TRUE; | |
954 } | |
955 | |
956 static void | |
957 shift_window(GntWM *wm, GntWidget *widget, int dir) | |
958 { | |
959 GList *all = wm->list; | |
960 GList *list = g_list_find(all, widget); | |
961 int length, pos; | |
962 if (!list) | |
963 return; | |
964 | |
965 length = g_list_length(all); | |
966 pos = g_list_position(all, list); | |
967 | |
968 pos += dir; | |
969 if (dir > 0) | |
970 pos++; | |
971 | |
972 if (pos < 0) | |
973 pos = length; | |
974 else if (pos > length) | |
975 pos = 0; | |
976 | |
977 all = g_list_insert(all, widget, pos); | |
978 all = g_list_delete_link(all, list); | |
979 wm->list = all; | |
980 draw_taskbar(wm, FALSE); | |
981 } | |
982 | |
983 static gboolean | |
984 shift_left(GntBindable *bindable, GList *null) | |
985 { | |
986 GntWM *wm = GNT_WM(bindable); | |
987 if (wm->_list.window) | |
988 return TRUE; | |
989 | |
990 shift_window(wm, wm->ordered->data, -1); | |
991 return TRUE; | |
992 } | |
993 | |
994 static gboolean | |
995 shift_right(GntBindable *bindable, GList *null) | |
996 { | |
997 GntWM *wm = GNT_WM(bindable); | |
998 if (wm->_list.window) | |
999 return TRUE; | |
1000 | |
1001 shift_window(wm, wm->ordered->data, 1); | |
1002 return TRUE; | |
1003 } | |
1004 | |
1005 static void | |
1006 action_list_activate(GntTree *tree, GntWM *wm) | |
1007 { | |
1008 GntAction *action = gnt_tree_get_selection_data(tree); | |
1009 action->callback(); | |
1010 gnt_widget_destroy(wm->_list.window); | |
1011 } | |
1012 | |
1013 static int | |
1014 compare_action(gconstpointer p1, gconstpointer p2) | |
1015 { | |
1016 const GntAction *a1 = p1; | |
1017 const GntAction *a2 = p2; | |
1018 | |
1019 return g_utf8_collate(a1->label, a2->label); | |
1020 } | |
1021 | |
1022 static gboolean | |
1023 list_actions(GntBindable *bindable, GList *null) | |
1024 { | |
1025 GntWidget *tree, *win; | |
1026 GList *iter; | |
1027 GntWM *wm = GNT_WM(bindable); | |
1028 if (wm->_list.window || wm->menu) | |
1029 return TRUE; | |
1030 | |
1031 if (wm->acts == NULL) | |
1032 return TRUE; | |
1033 | |
1034 setup__list(wm); | |
1035 wm->actions = &wm->_list; | |
1036 | |
1037 win = wm->actions->window; | |
1038 tree = wm->actions->tree; | |
1039 | |
1040 gnt_box_set_title(GNT_BOX(win), "Actions"); | |
1041 GNT_WIDGET_SET_FLAGS(tree, GNT_WIDGET_NO_BORDER); | |
1042 /* XXX: Do we really want this? */ | |
1043 gnt_tree_set_compare_func(GNT_TREE(tree), compare_action); | |
1044 | |
1045 for (iter = wm->acts; iter; iter = iter->next) { | |
1046 GntAction *action = iter->data; | |
1047 gnt_tree_add_row_last(GNT_TREE(tree), action, | |
1048 gnt_tree_create_row(GNT_TREE(tree), action->label), NULL); | |
1049 } | |
1050 g_signal_connect(G_OBJECT(tree), "activate", G_CALLBACK(action_list_activate), wm); | |
1051 gnt_widget_set_size(tree, 0, g_list_length(wm->acts)); | |
1052 gnt_widget_set_position(win, 0, getmaxy(stdscr) - 3 - g_list_length(wm->acts)); | |
1053 | |
1054 gnt_widget_show(win); | |
1055 return TRUE; | |
1056 } | |
1057 | |
1058 #ifndef NO_WIDECHAR | |
1059 static int | |
1060 widestringwidth(wchar_t *wide) | |
1061 { | |
1062 int len, ret; | |
1063 char *string; | |
1064 | |
1065 len = wcstombs(NULL, wide, 0) + 1; | |
1066 string = g_new0(char, len); | |
1067 wcstombs(string, wide, len); | |
1068 ret = gnt_util_onscreen_width(string, NULL); | |
1069 g_free(string); | |
1070 return ret; | |
1071 } | |
1072 #endif | |
1073 | |
1074 /* Returns the onscreen width of the character at the position */ | |
1075 static int | |
1076 reverse_char(WINDOW *d, int y, int x, gboolean set) | |
1077 { | |
1078 #define DECIDE(ch) (set ? ((ch) | A_REVERSE) : ((ch) & ~A_REVERSE)) | |
1079 | |
1080 #ifdef NO_WIDECHAR | |
1081 chtype ch; | |
1082 ch = mvwinch(d, y, x); | |
1083 mvwaddch(d, y, x, DECIDE(ch)); | |
1084 return 1; | |
1085 #else | |
1086 cchar_t ch; | |
1087 int wc = 1; | |
1088 if (mvwin_wch(d, y, x, &ch) == OK) { | |
1089 wc = widestringwidth(ch.chars); | |
1090 ch.attr = DECIDE(ch.attr); | |
1091 ch.attr &= WA_ATTRIBUTES; /* XXX: This is a workaround for a bug */ | |
1092 mvwadd_wch(d, y, x, &ch); | |
1093 } | |
1094 | |
1095 return wc; | |
1096 #endif | |
1097 } | |
1098 | |
1099 static void | |
1100 window_reverse(GntWidget *win, gboolean set, GntWM *wm) | |
1101 { | |
1102 int i; | |
1103 int w, h; | |
1104 WINDOW *d; | |
1105 | |
1106 if (GNT_WIDGET_IS_FLAG_SET(win, GNT_WIDGET_NO_BORDER)) | |
1107 return; | |
1108 | |
1109 d = win->window; | |
1110 gnt_widget_get_size(win, &w, &h); | |
1111 | |
1112 if (gnt_widget_has_shadow(win)) { | |
1113 --w; | |
1114 --h; | |
1115 } | |
1116 | |
1117 /* the top and bottom */ | |
1118 for (i = 0; i < w; i += reverse_char(d, 0, i, set)); | |
1119 for (i = 0; i < w; i += reverse_char(d, h-1, i, set)); | |
1120 | |
1121 /* the left and right */ | |
1122 for (i = 0; i < h; i += reverse_char(d, i, 0, set)); | |
1123 for (i = 0; i < h; i += reverse_char(d, i, w-1, set)); | |
1124 | |
1125 copy_win(win, g_hash_table_lookup(wm->nodes, win)); | |
1126 update_screen(wm); | |
1127 } | |
1128 | |
1129 static gboolean | |
1130 start_move(GntBindable *bindable, GList *null) | |
1131 { | |
1132 GntWM *wm = GNT_WM(bindable); | |
1133 if (wm->_list.window || wm->menu) | |
1134 return TRUE; | |
1135 if (!wm->ordered) | |
1136 return TRUE; | |
1137 | |
1138 wm->mode = GNT_KP_MODE_MOVE; | |
1139 window_reverse(GNT_WIDGET(wm->ordered->data), TRUE, wm); | |
1140 | |
1141 return TRUE; | |
1142 } | |
1143 | |
1144 static gboolean | |
1145 start_resize(GntBindable *bindable, GList *null) | |
1146 { | |
1147 GntWM *wm = GNT_WM(bindable); | |
1148 if (wm->_list.window || wm->menu) | |
1149 return TRUE; | |
1150 if (!wm->ordered) | |
1151 return TRUE; | |
1152 | |
1153 wm->mode = GNT_KP_MODE_RESIZE; | |
1154 window_reverse(GNT_WIDGET(wm->ordered->data), TRUE, wm); | |
1155 | |
1156 return TRUE; | |
1157 } | |
1158 | |
1159 static gboolean | |
1160 wm_quit(GntBindable *bindable, GList *list) | |
1161 { | |
1162 GntWM *wm = GNT_WM(bindable); | |
1163 if (write_timeout) | |
1164 write_already(wm); | |
1165 g_main_loop_quit(wm->loop); | |
1166 return TRUE; | |
1167 } | |
1168 | |
1169 static gboolean | |
1170 return_true(GntWM *wm, GntWidget *w, int *a, int *b) | |
1171 { | |
1172 return TRUE; | |
1173 } | |
1174 | |
1175 static gboolean | |
1176 refresh_screen(GntBindable *bindable, GList *null) | |
1177 { | |
1178 GntWM *wm = GNT_WM(bindable); | |
1179 | |
1180 endwin(); | |
1181 refresh(); | |
1182 curs_set(0); /* endwin resets the cursor to normal */ | |
1183 | |
1184 g_hash_table_foreach(wm->nodes, (GHFunc)refresh_node, NULL); | |
1185 update_screen(wm); | |
1186 draw_taskbar(wm, TRUE); | |
1187 | |
1188 return FALSE; | |
1189 } | |
1190 | |
16518
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1191 static gboolean |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1192 toggle_clipboard(GntBindable *bindable, GList *n) |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1193 { |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1194 static GntWidget *clip; |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1195 gchar *text; |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1196 int maxx, maxy; |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1197 if (clip) { |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1198 gnt_widget_destroy(clip); |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1199 clip = NULL; |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1200 return TRUE; |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1201 } |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1202 getmaxyx(stdscr, maxy, maxx); |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1203 text = gnt_get_clipboard_string(); |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1204 clip = gnt_hwindow_new(FALSE); |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1205 GNT_WIDGET_SET_FLAGS(clip, GNT_WIDGET_TRANSIENT); |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1206 GNT_WIDGET_SET_FLAGS(clip, GNT_WIDGET_NO_BORDER); |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1207 gnt_box_set_pad(GNT_BOX(clip), 0); |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1208 gnt_box_add_widget(GNT_BOX(clip), gnt_label_new(" ")); |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1209 gnt_box_add_widget(GNT_BOX(clip), gnt_label_new(text)); |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1210 gnt_box_add_widget(GNT_BOX(clip), gnt_label_new(" ")); |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1211 gnt_widget_set_position(clip, 0, 0); |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1212 gnt_widget_draw(clip); |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1213 g_free(text); |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1214 return TRUE; |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1215 } |
403332494b92
Move the toggle-clipboard operation to the default wm.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16281
diff
changeset
|
1216 |
17823
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1217 static gboolean |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1218 ignore_keys_start(GntBindable *bindable, GList *n){ |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1219 GntWM *wm = GNT_WM(bindable); |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1220 |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1221 if(!wm->menu && !wm->_list.window && wm->mode == GNT_KP_MODE_NORMAL){ |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1222 ignore_keys = TRUE; |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1223 return TRUE; |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1224 } |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1225 return FALSE; |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1226 } |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1227 |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1228 static gboolean |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1229 ignore_keys_end(GntBindable *bindable, GList *n){ |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1230 return ignore_keys ? !(ignore_keys = FALSE) : FALSE; |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1231 } |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1232 |
15817 | 1233 static void |
1234 gnt_wm_class_init(GntWMClass *klass) | |
1235 { | |
1236 int i; | |
1237 | |
1238 klass->new_window = gnt_wm_new_window_real; | |
1239 klass->decorate_window = NULL; | |
1240 klass->close_window = NULL; | |
1241 klass->window_resize_confirm = return_true; | |
1242 klass->window_resized = gnt_wm_win_resized; | |
1243 klass->window_move_confirm = return_true; | |
1244 klass->window_moved = gnt_wm_win_moved; | |
1245 klass->window_update = NULL; | |
1246 klass->key_pressed = NULL; | |
1247 klass->mouse_clicked = NULL; | |
1248 klass->give_focus = gnt_wm_give_focus; | |
1249 | |
1250 signals[SIG_NEW_WIN] = | |
1251 g_signal_new("new_win", | |
1252 G_TYPE_FROM_CLASS(klass), | |
1253 G_SIGNAL_RUN_LAST, | |
1254 G_STRUCT_OFFSET(GntWMClass, new_window), | |
1255 NULL, NULL, | |
1256 g_cclosure_marshal_VOID__POINTER, | |
1257 G_TYPE_NONE, 1, G_TYPE_POINTER); | |
1258 signals[SIG_DECORATE_WIN] = | |
1259 g_signal_new("decorate_win", | |
1260 G_TYPE_FROM_CLASS(klass), | |
1261 G_SIGNAL_RUN_LAST, | |
1262 G_STRUCT_OFFSET(GntWMClass, decorate_window), | |
1263 NULL, NULL, | |
1264 g_cclosure_marshal_VOID__POINTER, | |
1265 G_TYPE_NONE, 1, G_TYPE_POINTER); | |
1266 signals[SIG_CLOSE_WIN] = | |
1267 g_signal_new("close_win", | |
1268 G_TYPE_FROM_CLASS(klass), | |
1269 G_SIGNAL_RUN_LAST, | |
1270 G_STRUCT_OFFSET(GntWMClass, close_window), | |
1271 NULL, NULL, | |
1272 g_cclosure_marshal_VOID__POINTER, | |
1273 G_TYPE_NONE, 1, G_TYPE_POINTER); | |
1274 signals[SIG_CONFIRM_RESIZE] = | |
1275 g_signal_new("confirm_resize", | |
1276 G_TYPE_FROM_CLASS(klass), | |
1277 G_SIGNAL_RUN_LAST, | |
1278 G_STRUCT_OFFSET(GntWMClass, window_resize_confirm), | |
1279 gnt_boolean_handled_accumulator, NULL, | |
1280 gnt_closure_marshal_BOOLEAN__POINTER_POINTER_POINTER, | |
1281 G_TYPE_BOOLEAN, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER); | |
1282 | |
1283 signals[SIG_CONFIRM_MOVE] = | |
1284 g_signal_new("confirm_move", | |
1285 G_TYPE_FROM_CLASS(klass), | |
1286 G_SIGNAL_RUN_LAST, | |
1287 G_STRUCT_OFFSET(GntWMClass, window_move_confirm), | |
1288 gnt_boolean_handled_accumulator, NULL, | |
1289 gnt_closure_marshal_BOOLEAN__POINTER_POINTER_POINTER, | |
1290 G_TYPE_BOOLEAN, 3, G_TYPE_POINTER, G_TYPE_POINTER, G_TYPE_POINTER); | |
1291 | |
1292 signals[SIG_RESIZED] = | |
1293 g_signal_new("window_resized", | |
1294 G_TYPE_FROM_CLASS(klass), | |
1295 G_SIGNAL_RUN_LAST, | |
1296 G_STRUCT_OFFSET(GntWMClass, window_resized), | |
1297 NULL, NULL, | |
1298 g_cclosure_marshal_VOID__POINTER, | |
1299 G_TYPE_NONE, 1, G_TYPE_POINTER); | |
1300 signals[SIG_MOVED] = | |
1301 g_signal_new("window_moved", | |
1302 G_TYPE_FROM_CLASS(klass), | |
1303 G_SIGNAL_RUN_LAST, | |
1304 G_STRUCT_OFFSET(GntWMClass, window_moved), | |
1305 NULL, NULL, | |
1306 g_cclosure_marshal_VOID__POINTER, | |
1307 G_TYPE_NONE, 1, G_TYPE_POINTER); | |
1308 signals[SIG_UPDATE_WIN] = | |
1309 g_signal_new("window_update", | |
1310 G_TYPE_FROM_CLASS(klass), | |
1311 G_SIGNAL_RUN_LAST, | |
1312 G_STRUCT_OFFSET(GntWMClass, window_update), | |
1313 NULL, NULL, | |
1314 g_cclosure_marshal_VOID__POINTER, | |
1315 G_TYPE_NONE, 1, G_TYPE_POINTER); | |
1316 signals[SIG_GIVE_FOCUS] = | |
1317 g_signal_new("give_focus", | |
1318 G_TYPE_FROM_CLASS(klass), | |
1319 G_SIGNAL_RUN_LAST, | |
1320 G_STRUCT_OFFSET(GntWMClass, give_focus), | |
1321 NULL, NULL, | |
1322 g_cclosure_marshal_VOID__POINTER, | |
1323 G_TYPE_NONE, 1, G_TYPE_POINTER); | |
1324 | |
1325 signals[SIG_MOUSE_CLICK] = | |
1326 g_signal_new("mouse_clicked", | |
1327 G_TYPE_FROM_CLASS(klass), | |
1328 G_SIGNAL_RUN_LAST, | |
1329 G_STRUCT_OFFSET(GntWMClass, mouse_clicked), | |
1330 gnt_boolean_handled_accumulator, NULL, | |
1331 gnt_closure_marshal_BOOLEAN__INT_INT_INT_POINTER, | |
1332 G_TYPE_BOOLEAN, 4, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_POINTER); | |
1333 | |
1334 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "window-next", window_next, | |
1335 "\033" "n", NULL); | |
1336 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "window-prev", window_prev, | |
1337 "\033" "p", NULL); | |
1338 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "window-close", window_close, | |
1339 "\033" "c", NULL); | |
1340 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "window-list", window_list, | |
1341 "\033" "w", NULL); | |
1342 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "dump-screen", dump_screen, | |
1343 "\033" "d", NULL); | |
1344 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "shift-left", shift_left, | |
1345 "\033" ",", NULL); | |
1346 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "shift-right", shift_right, | |
1347 "\033" ".", NULL); | |
1348 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "action-list", list_actions, | |
1349 "\033" "a", NULL); | |
1350 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "start-move", start_move, | |
1351 "\033" "m", NULL); | |
1352 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "start-resize", start_resize, | |
1353 "\033" "r", NULL); | |
1354 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "wm-quit", wm_quit, | |
1355 "\033" "q", NULL); | |
1356 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "refresh-screen", refresh_screen, | |
1357 "\033" "l", NULL); | |
1358 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "switch-window-n", switch_window_n, | |
17823
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1359 NULL, NULL); |
15817 | 1360 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "window-scroll-down", window_scroll_down, |
1361 "\033" GNT_KEY_CTRL_J, NULL); | |
1362 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "window-scroll-up", window_scroll_up, | |
1363 "\033" GNT_KEY_CTRL_K, NULL); | |
16126
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
1364 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "help-for-widget", help_for_widget, |
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
1365 "\033" "/", NULL); |
17924
1abacdef8205
Alt-\ allows to rebind keys to the wm
Eric Polino <aluink@pidgin.im>
parents:
17923
diff
changeset
|
1366 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "help-for-wm", help_for_wm, |
1abacdef8205
Alt-\ allows to rebind keys to the wm
Eric Polino <aluink@pidgin.im>
parents:
17923
diff
changeset
|
1367 "\033" "\\", NULL); |
17823
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1368 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "toggle-clipboard", toggle_clipboard, |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1369 "\033" "C", NULL); |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1370 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "ignore-keys-start", ignore_keys_start, |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1371 GNT_KEY_CTRL_G, NULL); |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1372 gnt_bindable_class_register_action(GNT_BINDABLE_CLASS(klass), "ignore-keys-end", ignore_keys_end, |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1373 "\033" GNT_KEY_CTRL_G, NULL); |
15817 | 1374 |
1375 gnt_style_read_actions(G_OBJECT_CLASS_TYPE(klass), GNT_BINDABLE_CLASS(klass)); | |
1376 | |
1377 /* Make sure Alt+x are detected properly. */ | |
1378 for (i = '0'; i <= '9'; i++) { | |
1379 char str[] = "\033X"; | |
1380 str[1] = i; | |
1381 gnt_keys_add_combination(str); | |
1382 } | |
1383 | |
1384 GNTDEBUG; | |
1385 } | |
1386 | |
1387 /****************************************************************************** | |
1388 * GntWM API | |
1389 *****************************************************************************/ | |
1390 GType | |
1391 gnt_wm_get_gtype(void) | |
1392 { | |
1393 static GType type = 0; | |
1394 | |
1395 if(type == 0) { | |
1396 static const GTypeInfo info = { | |
1397 sizeof(GntWMClass), | |
1398 NULL, /* base_init */ | |
1399 NULL, /* base_finalize */ | |
1400 (GClassInitFunc)gnt_wm_class_init, | |
1401 NULL, | |
1402 NULL, /* class_data */ | |
1403 sizeof(GntWM), | |
1404 0, /* n_preallocs */ | |
1405 gnt_wm_init, /* instance_init */ | |
1406 NULL /* value_table */ | |
1407 }; | |
1408 | |
1409 type = g_type_register_static(GNT_TYPE_BINDABLE, | |
1410 "GntWM", | |
1411 &info, 0); | |
1412 } | |
1413 | |
1414 return type; | |
1415 } | |
1416 static void | |
1417 update_window_in_list(GntWM *wm, GntWidget *wid) | |
1418 { | |
1419 GntTextFormatFlags flag = 0; | |
1420 | |
1421 if (wm->windows == NULL) | |
1422 return; | |
1423 | |
1424 if (wid == wm->ordered->data) | |
1425 flag |= GNT_TEXT_FLAG_DIM; | |
1426 else if (GNT_WIDGET_IS_FLAG_SET(wid, GNT_WIDGET_URGENT)) | |
1427 flag |= GNT_TEXT_FLAG_BOLD; | |
1428 | |
1429 gnt_tree_set_row_flags(GNT_TREE(wm->windows->tree), wid, flag); | |
1430 } | |
1431 | |
1432 static void | |
1433 gnt_wm_new_window_real(GntWM *wm, GntWidget *widget) | |
1434 { | |
1435 GntNode *node; | |
1436 gboolean transient = FALSE; | |
1437 | |
1438 if (widget->window == NULL) | |
1439 return; | |
1440 | |
1441 node = g_new0(GntNode, 1); | |
1442 node->me = widget; | |
1443 node->scroll = 0; | |
1444 | |
1445 g_hash_table_replace(wm->nodes, widget, node); | |
1446 | |
1447 refresh_node(widget, node, NULL); | |
1448 | |
1449 transient = !!GNT_WIDGET_IS_FLAG_SET(node->me, GNT_WIDGET_TRANSIENT); | |
1450 | |
1451 #if 1 | |
1452 { | |
1453 int x, y, w, h, maxx, maxy; | |
1454 gboolean shadow = TRUE; | |
1455 | |
1456 if (!gnt_widget_has_shadow(widget)) | |
1457 shadow = FALSE; | |
1458 x = widget->priv.x; | |
1459 y = widget->priv.y; | |
1460 w = widget->priv.width; | |
1461 h = widget->priv.height; | |
1462 | |
1463 getmaxyx(stdscr, maxy, maxx); | |
1464 maxy -= 1; /* room for the taskbar */ | |
1465 maxy -= shadow; | |
1466 maxx -= shadow; | |
1467 | |
1468 x = MAX(0, x); | |
1469 y = MAX(0, y); | |
1470 if (x + w >= maxx) | |
1471 x = MAX(0, maxx - w); | |
1472 if (y + h >= maxy) | |
1473 y = MAX(0, maxy - h); | |
1474 | |
1475 w = MIN(w, maxx); | |
1476 h = MIN(h, maxy); | |
1477 node->window = newwin(h + shadow, w + shadow, y, x); | |
1478 copy_win(widget, node); | |
1479 } | |
1480 #endif | |
1481 | |
1482 node->panel = new_panel(node->window); | |
1483 set_panel_userptr(node->panel, node); | |
1484 | |
1485 if (!transient) { | |
1486 if (node->me != wm->_list.window) { | |
1487 GntWidget *w = NULL; | |
1488 | |
1489 if (wm->ordered) | |
1490 w = wm->ordered->data; | |
1491 | |
1492 wm->list = g_list_append(wm->list, widget); | |
1493 | |
1494 if (wm->event_stack) | |
1495 wm->ordered = g_list_prepend(wm->ordered, widget); | |
1496 else | |
1497 wm->ordered = g_list_append(wm->ordered, widget); | |
1498 | |
1499 gnt_widget_set_focus(widget, TRUE); | |
1500 if (w) | |
1501 gnt_widget_set_focus(w, FALSE); | |
1502 } | |
1503 | |
1504 if (wm->event_stack || node->me == wm->_list.window) { | |
1505 gnt_wm_raise_window(wm, node->me); | |
1506 } else { | |
1507 bottom_panel(node->panel); /* New windows should not grab focus */ | |
1508 gnt_widget_set_urgent(node->me); | |
1509 } | |
1510 } | |
1511 } | |
1512 | |
1513 void gnt_wm_new_window(GntWM *wm, GntWidget *widget) | |
1514 { | |
1515 while (widget->parent) | |
1516 widget = widget->parent; | |
1517 | |
1518 if (GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_INVISIBLE) || | |
1519 g_hash_table_lookup(wm->nodes, widget)) { | |
1520 update_screen(wm); | |
1521 return; | |
1522 } | |
1523 | |
1524 if (GNT_IS_BOX(widget)) { | |
1525 const char *title = GNT_BOX(widget)->title; | |
1526 GntPosition *p = NULL; | |
1527 if (title && (p = g_hash_table_lookup(wm->positions, title)) != NULL) { | |
1528 sanitize_position(widget, &p->x, &p->y); | |
1529 gnt_widget_set_position(widget, p->x, p->y); | |
1530 mvwin(widget->window, p->y, p->x); | |
1531 } | |
1532 } | |
1533 | |
1534 g_signal_emit(wm, signals[SIG_NEW_WIN], 0, widget); | |
1535 g_signal_emit(wm, signals[SIG_DECORATE_WIN], 0, widget); | |
1536 | |
1537 if (wm->windows && !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_TRANSIENT)) { | |
1538 if ((GNT_IS_BOX(widget) && GNT_BOX(widget)->title) && wm->_list.window != widget | |
1539 && GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_CAN_TAKE_FOCUS)) { | |
1540 gnt_tree_add_row_last(GNT_TREE(wm->windows->tree), widget, | |
1541 gnt_tree_create_row(GNT_TREE(wm->windows->tree), GNT_BOX(widget)->title), | |
1542 NULL); | |
1543 update_window_in_list(wm, widget); | |
1544 } | |
1545 } | |
1546 | |
1547 update_screen(wm); | |
1548 draw_taskbar(wm, FALSE); | |
1549 } | |
1550 | |
1551 void gnt_wm_window_decorate(GntWM *wm, GntWidget *widget) | |
1552 { | |
1553 g_signal_emit(wm, signals[SIG_DECORATE_WIN], 0, widget); | |
1554 } | |
1555 | |
1556 void gnt_wm_window_close(GntWM *wm, GntWidget *widget) | |
1557 { | |
1558 GntNode *node; | |
1559 int pos; | |
1560 | |
1561 if ((node = g_hash_table_lookup(wm->nodes, widget)) == NULL) | |
1562 return; | |
1563 | |
1564 g_signal_emit(wm, signals[SIG_CLOSE_WIN], 0, widget); | |
1565 g_hash_table_remove(wm->nodes, widget); | |
1566 | |
1567 if (wm->windows) { | |
1568 gnt_tree_remove(GNT_TREE(wm->windows->tree), widget); | |
1569 } | |
1570 | |
1571 pos = g_list_index(wm->list, widget); | |
1572 | |
1573 if (pos != -1) { | |
1574 wm->list = g_list_remove(wm->list, widget); | |
1575 wm->ordered = g_list_remove(wm->ordered, widget); | |
1576 | |
1577 if (wm->ordered) | |
1578 gnt_wm_raise_window(wm, wm->ordered->data); | |
1579 } | |
1580 | |
1581 update_screen(wm); | |
1582 draw_taskbar(wm, FALSE); | |
1583 } | |
1584 | |
1585 time_t gnt_wm_get_idle_time() | |
1586 { | |
1587 return time(NULL) - last_active_time; | |
1588 } | |
1589 | |
1590 gboolean gnt_wm_process_input(GntWM *wm, const char *keys) | |
1591 { | |
1592 gboolean ret = FALSE; | |
1593 | |
1594 keys = gnt_bindable_remap_keys(GNT_BINDABLE(wm), keys); | |
1595 | |
1596 idle_update = TRUE; | |
1597 | |
17823
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1598 if(ignore_keys){ |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1599 if(keys && !strcmp(keys, "\033" GNT_KEY_CTRL_G)){ |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1600 if(gnt_bindable_perform_action_key(GNT_BINDABLE(wm), keys)){ |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1601 return TRUE; |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1602 } |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1603 } |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1604 return wm->ordered ? gnt_widget_key_pressed(GNT_WIDGET(wm->ordered->data), keys) : FALSE; |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1605 } |
c609b4009dbe
1. Cleaned up a bit of dirty formatting in the _register_action lines in _class_init
Eric Polino <aluink@pidgin.im>
parents:
17117
diff
changeset
|
1606 |
16126
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
1607 if (gnt_bindable_perform_action_key(GNT_BINDABLE(wm), keys)) { |
15817 | 1608 return TRUE; |
16126
d07f5128dd6b
alt-/ to get a list of keybindings for the focused widget.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15995
diff
changeset
|
1609 } |
15817 | 1610 |
1611 /* Do some manual checking */ | |
1612 if (wm->ordered && wm->mode != GNT_KP_MODE_NORMAL) { | |
1613 int xmin = 0, ymin = 0, xmax = getmaxx(stdscr), ymax = getmaxy(stdscr) - 1; | |
1614 int x, y, w, h; | |
1615 GntWidget *widget = GNT_WIDGET(wm->ordered->data); | |
1616 int ox, oy, ow, oh; | |
1617 | |
1618 gnt_widget_get_position(widget, &x, &y); | |
1619 gnt_widget_get_size(widget, &w, &h); | |
1620 ox = x; oy = y; | |
1621 ow = w; oh = h; | |
1622 | |
1623 if (wm->mode == GNT_KP_MODE_MOVE) { | |
1624 if (strcmp(keys, GNT_KEY_LEFT) == 0) { | |
1625 if (x > xmin) | |
1626 x--; | |
1627 } else if (strcmp(keys, GNT_KEY_RIGHT) == 0) { | |
1628 if (x + w < xmax) | |
1629 x++; | |
1630 } else if (strcmp(keys, GNT_KEY_UP) == 0) { | |
1631 if (y > ymin) | |
1632 y--; | |
1633 } else if (strcmp(keys, GNT_KEY_DOWN) == 0) { | |
1634 if (y + h < ymax) | |
1635 y++; | |
1636 } | |
1637 if (ox != x || oy != y) { | |
1638 gnt_screen_move_widget(widget, x, y); | |
1639 window_reverse(widget, TRUE, wm); | |
1640 return TRUE; | |
1641 } | |
1642 } else if (wm->mode == GNT_KP_MODE_RESIZE) { | |
1643 if (strcmp(keys, GNT_KEY_LEFT) == 0) { | |
1644 w--; | |
1645 } else if (strcmp(keys, GNT_KEY_RIGHT) == 0) { | |
1646 if (x + w < xmax) | |
1647 w++; | |
1648 } else if (strcmp(keys, GNT_KEY_UP) == 0) { | |
1649 h--; | |
1650 } else if (strcmp(keys, GNT_KEY_DOWN) == 0) { | |
1651 if (y + h < ymax) | |
1652 h++; | |
1653 } | |
1654 if (oh != h || ow != w) { | |
1655 gnt_screen_resize_widget(widget, w, h); | |
1656 window_reverse(widget, TRUE, wm); | |
1657 return TRUE; | |
1658 } | |
1659 } | |
1660 if (strcmp(keys, "\r") == 0 || strcmp(keys, "\033") == 0) { | |
1661 window_reverse(widget, FALSE, wm); | |
1662 wm->mode = GNT_KP_MODE_NORMAL; | |
1663 } | |
1664 return TRUE; | |
1665 } | |
1666 | |
1667 /* Escape to close the window-list or action-list window */ | |
1668 if (strcmp(keys, "\033") == 0) { | |
1669 if (wm->_list.window) { | |
1670 gnt_widget_destroy(wm->_list.window); | |
1671 return TRUE; | |
1672 } | |
1673 } else if (keys[0] == '\033' && isdigit(keys[1]) && keys[2] == '\0') { | |
1674 /* Alt+x for quick switch */ | |
1675 int n = *(keys + 1) - '0'; | |
1676 GList *list = NULL; | |
1677 | |
1678 if (n == 0) | |
1679 n = 10; | |
1680 | |
1681 list = g_list_append(list, GINT_TO_POINTER(n - 1)); | |
1682 switch_window_n(GNT_BINDABLE(wm), list); | |
1683 g_list_free(list); | |
1684 return TRUE; | |
1685 } | |
1686 | |
1687 if (wm->menu) | |
1688 ret = gnt_widget_key_pressed(GNT_WIDGET(wm->menu), keys); | |
1689 else if (wm->_list.window) | |
1690 ret = gnt_widget_key_pressed(wm->_list.window, keys); | |
1691 else if (wm->ordered) | |
1692 ret = gnt_widget_key_pressed(GNT_WIDGET(wm->ordered->data), keys); | |
1693 return ret; | |
1694 } | |
1695 | |
1696 static void | |
1697 gnt_wm_win_resized(GntWM *wm, GntNode *node) | |
1698 { | |
1699 /*refresh_node(node->me, node, NULL);*/ | |
1700 } | |
1701 | |
1702 static void | |
1703 gnt_wm_win_moved(GntWM *wm, GntNode *node) | |
1704 { | |
1705 refresh_node(node->me, node, NULL); | |
1706 } | |
1707 | |
1708 void gnt_wm_resize_window(GntWM *wm, GntWidget *widget, int width, int height) | |
1709 { | |
1710 gboolean ret = TRUE; | |
1711 GntNode *node; | |
1712 int shadow; | |
1713 int maxx, maxy; | |
1714 | |
1715 while (widget->parent) | |
1716 widget = widget->parent; | |
1717 node = g_hash_table_lookup(wm->nodes, widget); | |
1718 if (!node) | |
1719 return; | |
1720 | |
1721 g_signal_emit(wm, signals[SIG_CONFIRM_RESIZE], 0, widget, &width, &height, &ret); | |
1722 if (!ret) | |
1723 return; /* resize is not permitted */ | |
1724 hide_panel(node->panel); | |
1725 gnt_widget_set_size(widget, width, height); | |
1726 gnt_widget_draw(widget); | |
1727 | |
1728 shadow = gnt_widget_has_shadow(widget) ? 1 : 0; | |
1729 maxx = getmaxx(stdscr) - shadow; | |
1730 maxy = getmaxy(stdscr) - 1 - shadow; | |
1731 height = MIN(height, maxy); | |
1732 width = MIN(width, maxx); | |
15978
2a82bc8d57f7
More fixes for resizing when shadow is turned on.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
15964
diff
changeset
|
1733 wresize(node->window, height, width); |
15817 | 1734 replace_panel(node->panel, node->window); |
1735 | |
1736 g_signal_emit(wm, signals[SIG_RESIZED], 0, node); | |
1737 | |
1738 show_panel(node->panel); | |
1739 update_screen(wm); | |
1740 } | |
1741 | |
1742 static void | |
1743 write_gdi(gpointer key, gpointer value, gpointer data) | |
1744 { | |
1745 GntPosition *p = value; | |
1746 fprintf(data, ".%s = %d;%d\n", (char *)key, p->x, p->y); | |
1747 } | |
1748 | |
1749 static gboolean | |
1750 write_already(gpointer data) | |
1751 { | |
1752 GntWM *wm = data; | |
1753 FILE *file; | |
1754 char *filename; | |
1755 | |
1756 filename = g_build_filename(g_get_home_dir(), ".gntpositions", NULL); | |
1757 | |
1758 file = fopen(filename, "wb"); | |
1759 if (file == NULL) { | |
1760 g_printerr("GntWM: error opening file to save positions\n"); | |
1761 } else { | |
1762 fprintf(file, "[positions]\n"); | |
1763 g_hash_table_foreach(wm->positions, write_gdi, file); | |
1764 fclose(file); | |
1765 } | |
1766 | |
1767 g_free(filename); | |
1768 g_source_remove(write_timeout); | |
1769 write_timeout = 0; | |
1770 return FALSE; | |
1771 } | |
1772 | |
1773 static void | |
1774 write_positions_to_file(GntWM *wm) | |
1775 { | |
1776 if (write_timeout) { | |
1777 g_source_remove(write_timeout); | |
1778 } | |
1779 write_timeout = g_timeout_add(10000, write_already, wm); | |
1780 } | |
1781 | |
1782 void gnt_wm_move_window(GntWM *wm, GntWidget *widget, int x, int y) | |
1783 { | |
1784 gboolean ret = TRUE; | |
1785 GntNode *node; | |
1786 | |
1787 while (widget->parent) | |
1788 widget = widget->parent; | |
1789 node = g_hash_table_lookup(wm->nodes, widget); | |
1790 if (!node) | |
1791 return; | |
1792 | |
1793 g_signal_emit(wm, signals[SIG_CONFIRM_MOVE], 0, widget, &x, &y, &ret); | |
1794 if (!ret) | |
1795 return; /* resize is not permitted */ | |
1796 | |
1797 gnt_widget_set_position(widget, x, y); | |
1798 move_panel(node->panel, y, x); | |
1799 | |
1800 g_signal_emit(wm, signals[SIG_MOVED], 0, node); | |
15995
bc2dd3358d46
Don't remember the position of transient windows
Richard Nelson <wabz@pidgin.im>
parents:
15978
diff
changeset
|
1801 if (gnt_style_get_bool(GNT_STYLE_REMPOS, TRUE) && GNT_IS_BOX(widget) && |
bc2dd3358d46
Don't remember the position of transient windows
Richard Nelson <wabz@pidgin.im>
parents:
15978
diff
changeset
|
1802 !GNT_WIDGET_IS_FLAG_SET(widget, GNT_WIDGET_TRANSIENT)) { |
15817 | 1803 const char *title = GNT_BOX(widget)->title; |
1804 if (title) { | |
1805 GntPosition *p = g_new0(GntPosition, 1); | |
1806 GntWidget *wid = node->me; | |
1807 p->x = wid->priv.x; | |
1808 p->y = wid->priv.y; | |
1809 g_hash_table_replace(wm->positions, g_strdup(title), p); | |
1810 write_positions_to_file(wm); | |
1811 } | |
1812 } | |
1813 | |
1814 update_screen(wm); | |
1815 } | |
1816 | |
1817 static void | |
1818 gnt_wm_give_focus(GntWM *wm, GntWidget *widget) | |
1819 { | |
1820 GntNode *node = g_hash_table_lookup(wm->nodes, widget); | |
1821 | |
1822 if (!node) | |
1823 return; | |
1824 | |
1825 if (widget != wm->_list.window && !GNT_IS_MENU(widget) && | |
1826 wm->ordered->data != widget) { | |
1827 GntWidget *w = wm->ordered->data; | |
1828 wm->ordered = g_list_bring_to_front(wm->ordered, widget); | |
1829 gnt_widget_set_focus(w, FALSE); | |
1830 } | |
1831 | |
1832 gnt_widget_set_focus(widget, TRUE); | |
1833 GNT_WIDGET_UNSET_FLAGS(widget, GNT_WIDGET_URGENT); | |
1834 gnt_widget_draw(widget); | |
1835 top_panel(node->panel); | |
1836 | |
1837 if (wm->_list.window) { | |
1838 GntNode *nd = g_hash_table_lookup(wm->nodes, wm->_list.window); | |
1839 top_panel(nd->panel); | |
1840 } | |
1841 update_screen(wm); | |
1842 draw_taskbar(wm, FALSE); | |
1843 } | |
1844 | |
1845 void gnt_wm_update_window(GntWM *wm, GntWidget *widget) | |
1846 { | |
1847 GntNode *node; | |
1848 | |
1849 while (widget->parent) | |
1850 widget = widget->parent; | |
1851 if (!GNT_IS_MENU(widget)) | |
1852 gnt_box_sync_children(GNT_BOX(widget)); | |
1853 | |
1854 node = g_hash_table_lookup(wm->nodes, widget); | |
1855 if (node == NULL) { | |
1856 gnt_wm_new_window(wm, widget); | |
1857 } else | |
1858 g_signal_emit(wm, signals[SIG_UPDATE_WIN], 0, node); | |
1859 | |
1860 copy_win(widget, node); | |
1861 update_screen(wm); | |
1862 draw_taskbar(wm, FALSE); | |
1863 } | |
1864 | |
1865 gboolean gnt_wm_process_click(GntWM *wm, GntMouseEvent event, int x, int y, GntWidget *widget) | |
1866 { | |
1867 gboolean ret = TRUE; | |
1868 idle_update = TRUE; | |
1869 g_signal_emit(wm, signals[SIG_MOUSE_CLICK], 0, event, x, y, widget, &ret); | |
1870 return ret; | |
1871 } | |
1872 | |
1873 void gnt_wm_raise_window(GntWM *wm, GntWidget *widget) | |
1874 { | |
1875 g_signal_emit(wm, signals[SIG_GIVE_FOCUS], 0, widget); | |
1876 } | |
1877 | |
16281
82b6fdd899a9
Dialogs opened resulting from a mouse-click should fain focus.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16127
diff
changeset
|
1878 void gnt_wm_set_event_stack(GntWM *wm, gboolean set) |
82b6fdd899a9
Dialogs opened resulting from a mouse-click should fain focus.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16127
diff
changeset
|
1879 { |
82b6fdd899a9
Dialogs opened resulting from a mouse-click should fain focus.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16127
diff
changeset
|
1880 wm->event_stack = set; |
82b6fdd899a9
Dialogs opened resulting from a mouse-click should fain focus.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16127
diff
changeset
|
1881 } |
82b6fdd899a9
Dialogs opened resulting from a mouse-click should fain focus.
Sadrul Habib Chowdhury <imadil@gmail.com>
parents:
16127
diff
changeset
|
1882 |