| 74 } |
78 } |
| 75 |
79 |
| 76 /* BLIST DOCKING */ |
80 /* BLIST DOCKING */ |
| 77 |
81 |
| 78 static void blist_save_state() { |
82 static void blist_save_state() { |
| 79 if(blist_ab && gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_DOCKABLE)) { |
83 if(blist_ab) { |
| 80 if(blist_ab->docked) { |
84 if(gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_DOCKABLE) && blist_ab->docked) { |
| 81 gaim_prefs_set_int(OPT_WINPREFS_DBLIST_HEIGHT, blist_ab->undocked_height); |
85 gaim_prefs_set_int(OPT_WINPREFS_DBLIST_HEIGHT, blist_ab->undocked_height); |
| 82 gaim_prefs_set_int(OPT_WINPREFS_DBLIST_SIDE, blist_ab->side); |
86 gaim_prefs_set_int(OPT_WINPREFS_DBLIST_SIDE, blist_ab->side); |
| 83 } |
87 gaim_prefs_set_bool(OPT_WINPREFS_DBLIST_DOCKED, blist_ab->docked); |
| 84 gaim_prefs_set_bool(OPT_WINPREFS_DBLIST_DOCKED, blist_ab->docked); |
88 } |
| 85 } |
89 else |
| |
90 gaim_prefs_set_bool(OPT_WINPREFS_DBLIST_DOCKED, FALSE); |
| |
91 } |
| |
92 } |
| |
93 |
| |
94 static void blist_set_ontop(gboolean val) { |
| |
95 if(!blist) |
| |
96 return; |
| |
97 if(val) |
| |
98 SetWindowPos(GDK_WINDOW_HWND(blist->window), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); |
| 86 else |
99 else |
| 87 gaim_prefs_set_bool(OPT_WINPREFS_DBLIST_DOCKED, FALSE); |
100 SetWindowPos(GDK_WINDOW_HWND(blist->window), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); |
| |
101 } |
| |
102 |
| |
103 static void blist_dock_cb(gboolean val) { |
| |
104 if(val) { |
| |
105 gaim_debug(GAIM_DEBUG_INFO, "winprefs", "Blist Docking..\n"); |
| |
106 if(gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_ON_TOP)) |
| |
107 blist_set_ontop(TRUE); |
| |
108 } |
| |
109 else { |
| |
110 gaim_debug(GAIM_DEBUG_INFO, "winprefs", "Blist Undocking..\n"); |
| |
111 if(gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_ON_TOP) && |
| |
112 !gaim_prefs_get_bool(OPT_WINPREFS_BLIST_ON_TOP)) |
| |
113 blist_set_ontop(FALSE); |
| |
114 } |
| 88 } |
115 } |
| 89 |
116 |
| 90 static void blist_set_dockable(gboolean val) { |
117 static void blist_set_dockable(gboolean val) { |
| 91 if(val) { |
118 if(val) { |
| 92 if(!blist_ab && blist) |
119 if(!blist_ab && blist) { |
| 93 blist_ab = gtk_appbar_add(blist); |
120 blist_ab = gtk_appbar_add(blist); |
| |
121 gtk_appbar_add_dock_cb(blist_ab, blist_dock_cb); |
| |
122 } |
| 94 } |
123 } |
| 95 else { |
124 else { |
| |
125 if(gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_ON_TOP) && |
| |
126 !gaim_prefs_get_bool(OPT_WINPREFS_BLIST_ON_TOP)) |
| |
127 blist_set_ontop(FALSE); |
| 96 gtk_appbar_remove(blist_ab); |
128 gtk_appbar_remove(blist_ab); |
| 97 blist_ab = NULL; |
129 blist_ab = NULL; |
| 98 } |
130 } |
| 99 } |
131 } |
| 100 |
132 |
| |
133 /* PLUGIN CALLBACKS */ |
| |
134 |
| |
135 /* We need this because the blist destroy cb won't be called before the |
| |
136 plugin is unloaded, when quitting */ |
| 101 static void gaim_quit_cb() { |
137 static void gaim_quit_cb() { |
| 102 gaim_debug(GAIM_DEBUG_INFO, WINPREFS_PLUGIN_ID, "gaim_quit_cb: removing appbar\n"); |
138 gaim_debug(GAIM_DEBUG_INFO, WINPREFS_PLUGIN_ID, "gaim_quit_cb: removing appbar\n"); |
| 103 blist_save_state(); |
139 blist_save_state(); |
| 104 blist_set_dockable(FALSE); |
140 blist_set_dockable(FALSE); |
| 105 } |
141 } |
| 106 |
142 |
| |
143 /* Needed when the last account is signed off.. and we get the login window */ |
| |
144 static void blist_destroy_cb() { |
| |
145 gaim_debug(GAIM_DEBUG_INFO, "winprefs", "blist_destroy_cb\n"); |
| |
146 blist_save_state(); |
| |
147 blist_set_dockable(FALSE); |
| |
148 gaim_signal_connect(plugin_id, event_signon, blist_create_cb, NULL); |
| |
149 } |
| |
150 |
| 107 static gboolean blist_create_cb_remove(gpointer data) { |
151 static gboolean blist_create_cb_remove(gpointer data) { |
| 108 gaim_signal_disconnect(plugin_id, event_signon, blist_create_cb); |
152 gaim_signal_disconnect(plugin_id, event_signon, blist_create_cb); |
| 109 return FALSE; |
153 return FALSE; |
| 110 } |
154 } |
| 111 |
155 |
| 112 static void blist_create_cb() { |
156 static void blist_create_cb() { |
| 113 gaim_debug(GAIM_DEBUG_INFO, WINPREFS_PLUGIN_ID, "event_signon\n"); |
157 gaim_debug(GAIM_DEBUG_INFO, WINPREFS_PLUGIN_ID, "event_signon\n"); |
| 114 |
158 |
| 115 blist = GAIM_GTK_BLIST(gaim_get_blist())->window; |
159 blist = GAIM_GTK_BLIST(gaim_get_blist())->window; |
| |
160 g_signal_connect(blist, "destroy", blist_destroy_cb, NULL); |
| |
161 |
| 116 if(gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_DOCKABLE)) { |
162 if(gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_DOCKABLE)) { |
| 117 blist_set_dockable(TRUE); |
163 blist_set_dockable(TRUE); |
| 118 if(gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_DOCKED)) { |
164 if(gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_DOCKED)) { |
| 119 blist_ab->undocked_height = gaim_prefs_get_int(OPT_WINPREFS_DBLIST_HEIGHT); |
165 blist_ab->undocked_height = gaim_prefs_get_int(OPT_WINPREFS_DBLIST_HEIGHT); |
| 120 gtk_appbar_dock(blist_ab, |
166 gtk_appbar_dock(blist_ab, |
| 121 gaim_prefs_get_int(OPT_WINPREFS_DBLIST_SIDE)); |
167 gaim_prefs_get_int(OPT_WINPREFS_DBLIST_SIDE)); |
| 122 } |
168 if(gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_ON_TOP)) |
| |
169 blist_set_ontop(TRUE); |
| |
170 } |
| |
171 } |
| |
172 if(gaim_prefs_get_bool(OPT_WINPREFS_BLIST_ON_TOP)) { |
| |
173 blist_set_ontop(TRUE); |
| 123 } |
174 } |
| 124 /* removing here will cause a crash when going to next cb |
175 /* removing here will cause a crash when going to next cb |
| 125 in the gaim signal cb loop.. so process delayed. */ |
176 in the gaim signal cb loop.. so process delayed. */ |
| 126 g_idle_add(blist_create_cb_remove, NULL); |
177 g_idle_add(blist_create_cb_remove, NULL); |
| 127 } |
178 } |
| 128 |
|
| 129 |
179 |
| 130 /* AUTOSTART */ |
180 /* AUTOSTART */ |
| 131 |
181 |
| 132 static int open_run_key(PHKEY phKey, REGSAM samDesired) { |
182 static int open_run_key(PHKEY phKey, REGSAM samDesired) { |
| 133 /* First try current user key (for WinNT & Win2k +), fall back to local machine */ |
183 /* First try current user key (for WinNT & Win2k +), fall back to local machine */ |
| 176 gaim_debug(GAIM_DEBUG_ERROR, WINPREFS_PLUGIN_ID, "Could not delete registry key value\n"); |
226 gaim_debug(GAIM_DEBUG_ERROR, WINPREFS_PLUGIN_ID, "Could not delete registry key value\n"); |
| 177 } |
227 } |
| 178 RegCloseKey(hKey); |
228 RegCloseKey(hKey); |
| 179 } |
229 } |
| 180 |
230 |
| 181 static void winprefs_set_blist_dockable(GtkWidget *w) { |
231 static void winprefs_set_blist_dockable(GtkWidget *w, GtkWidget *w1) { |
| 182 gaim_prefs_set_bool(OPT_WINPREFS_DBLIST_DOCKABLE, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))); |
232 gaim_prefs_set_bool(OPT_WINPREFS_DBLIST_DOCKABLE, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))); |
| 183 gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)) ? blist_set_dockable(TRUE) : blist_set_dockable(FALSE); |
233 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) { |
| 184 } |
234 blist_set_dockable(TRUE); |
| 185 |
235 gtk_widget_set_sensitive(w1, TRUE); |
| |
236 } |
| |
237 else { |
| |
238 blist_set_dockable(FALSE); |
| |
239 gtk_widget_set_sensitive(w1, FALSE); |
| |
240 } |
| |
241 } |
| |
242 |
| |
243 static void winprefs_set_blist_ontop(GtkWidget *w) { |
| |
244 gaim_prefs_set_bool(OPT_WINPREFS_BLIST_ON_TOP, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))); |
| |
245 |
| |
246 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) { |
| |
247 blist_set_ontop(TRUE); |
| |
248 } |
| |
249 else { |
| |
250 if(!(gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_DOCKABLE) && |
| |
251 gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_ON_TOP) && |
| |
252 (blist_ab && blist_ab->docked))) |
| |
253 blist_set_ontop(FALSE); |
| |
254 } |
| |
255 } |
| |
256 |
| |
257 static void winprefs_set_dblist_ontop(GtkWidget *w) { |
| |
258 gaim_prefs_set_bool(OPT_WINPREFS_DBLIST_ON_TOP, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))); |
| |
259 if(blist && blist_ab) { |
| |
260 if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) { |
| |
261 if(blist_ab->docked) |
| |
262 blist_set_ontop(TRUE); |
| |
263 } |
| |
264 else if(!gaim_prefs_get_bool(OPT_WINPREFS_BLIST_ON_TOP)) |
| |
265 blist_set_ontop(FALSE); |
| |
266 } |
| |
267 } |
| |
268 |
| |
269 static void winprefs_set_im_blink(GtkWidget *w) { |
| |
270 gaim_prefs_set_bool(OPT_WINPREFS_IM_BLINK, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))); |
| |
271 wgaim_im_blink_state(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))); |
| |
272 } |
| 186 |
273 |
| 187 /* |
274 /* |
| 188 * EXPORTED FUNCTIONS |
275 * EXPORTED FUNCTIONS |
| 189 */ |
276 */ |
| 190 |
277 |
| 191 gboolean plugin_load(GaimPlugin *plugin) { |
278 gboolean plugin_load(GaimPlugin *plugin) { |
| 192 plugin_id = plugin; |
279 plugin_id = plugin; |
| 193 |
280 |
| 194 /* blist docking init */ |
281 /* blist docking init */ |
| 195 if(!blist && gaim_get_blist() && GAIM_GTK_BLIST(gaim_get_blist())) { |
282 if(gaim_get_blist() && GAIM_GTK_BLIST(gaim_get_blist())) { |
| 196 blist = GAIM_GTK_BLIST(gaim_get_blist())->window; |
283 blist = GAIM_GTK_BLIST(gaim_get_blist())->window; |
| |
284 /* Set Dockable */ |
| 197 if(gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_DOCKABLE)) |
285 if(gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_DOCKABLE)) |
| 198 blist_set_dockable(TRUE); |
286 blist_set_dockable(TRUE); |
| |
287 /* Set On top */ |
| |
288 if(gaim_prefs_get_bool(OPT_WINPREFS_BLIST_ON_TOP)) |
| |
289 blist_set_ontop(TRUE); |
| |
290 g_signal_connect(blist, "destroy", blist_destroy_cb, NULL); |
| 199 } |
291 } |
| 200 else |
292 else |
| 201 gaim_signal_connect(plugin, event_signon, blist_create_cb, NULL); |
293 gaim_signal_connect(plugin, event_signon, blist_create_cb, NULL); |
| 202 |
294 |
| |
295 wgaim_im_blink_state(gaim_prefs_get_bool(OPT_WINPREFS_IM_BLINK)); |
| |
296 |
| 203 gaim_signal_connect(plugin, event_quit, gaim_quit_cb, NULL); |
297 gaim_signal_connect(plugin, event_quit, gaim_quit_cb, NULL); |
| 204 |
298 |
| 205 return TRUE; |
299 return TRUE; |
| 206 } |
300 } |
| 207 |
301 |
| 208 gboolean plugin_unload(GaimPlugin *plugin) { |
302 gboolean plugin_unload(GaimPlugin *plugin) { |
| 209 blist_set_dockable(FALSE); |
303 blist_set_dockable(FALSE); |
| |
304 wgaim_im_blink_state(TRUE); |
| 210 return TRUE; |
305 return TRUE; |
| 211 } |
306 } |
| 212 |
307 |
| 213 static GtkWidget* get_config_frame(GaimPlugin *plugin) { |
308 static GtkWidget* get_config_frame(GaimPlugin *plugin) { |
| 214 GtkWidget *ret; |
309 GtkWidget *ret; |
| 215 GtkWidget *button; |
310 GtkWidget *button; |
| |
311 GtkWidget *dbutton; |
| 216 GtkWidget *vbox; |
312 GtkWidget *vbox; |
| 217 HKEY hKey; |
313 char* gtk_version = NULL; |
| |
314 HKEY hKey = HKEY_CURRENT_USER; |
| 218 |
315 |
| 219 ret = gtk_vbox_new(FALSE, 18); |
316 ret = gtk_vbox_new(FALSE, 18); |
| 220 gtk_container_set_border_width (GTK_CONTAINER (ret), 12); |
317 gtk_container_set_border_width (GTK_CONTAINER (ret), 12); |
| 221 |
318 |
| |
319 while(hKey) { |
| |
320 char version[25]; |
| |
321 DWORD vlen = 25; |
| |
322 if(wgaim_read_reg_string(hKey, "SOFTWARE\\GTK\\2.0", "Version", (LPBYTE)&version, &vlen)) { |
| |
323 char revision[25]; |
| |
324 DWORD rlen = 25; |
| |
325 gboolean gotrev = FALSE; |
| |
326 if(wgaim_read_reg_string(hKey, "SOFTWARE\\GTK\\2.0", "Revision", (LPBYTE)&revision, &rlen)) { |
| |
327 revision[0] = g_ascii_toupper(revision[0]); |
| |
328 revision[1] = '\0'; |
| |
329 gotrev = TRUE; |
| |
330 } |
| |
331 gtk_version = g_strdup_printf("%s%s%s", |
| |
332 version, |
| |
333 gotrev?" Revision ":"", |
| |
334 gotrev?revision:""); |
| |
335 hKey = 0; |
| |
336 } |
| |
337 if(hKey == HKEY_CURRENT_USER) |
| |
338 hKey = HKEY_LOCAL_MACHINE; |
| |
339 else if(hKey == HKEY_LOCAL_MACHINE) |
| |
340 hKey = 0; |
| |
341 } |
| |
342 |
| |
343 /* Display Installed GTK+ Runtime Version */ |
| |
344 if(gtk_version) { |
| |
345 GtkWidget *label; |
| |
346 vbox = gaim_gtk_make_frame(ret, _("GTK+ Runtime Version")); |
| |
347 label = gtk_label_new(gtk_version); |
| |
348 gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0); |
| |
349 gtk_widget_show(label); |
| |
350 g_free(gtk_version); |
| |
351 } |
| |
352 |
| |
353 /* Autostart */ |
| 222 vbox = gaim_gtk_make_frame (ret, _("Startup")); |
354 vbox = gaim_gtk_make_frame (ret, _("Startup")); |
| 223 |
|
| 224 /* Autostart */ |
|
| 225 button = wgaim_button(_("_Start Gaim on Windows startup"), vbox); |
355 button = wgaim_button(_("_Start Gaim on Windows startup"), vbox); |
| 226 if(open_run_key(&hKey, KEY_QUERY_VALUE)) { |
356 if(open_run_key(&hKey, KEY_QUERY_VALUE)) { |
| 227 if(ERROR_SUCCESS == RegQueryValueEx(hKey, "Gaim", 0, NULL, NULL, NULL)) { |
357 if(ERROR_SUCCESS == RegQueryValueEx(hKey, "Gaim", 0, NULL, NULL, NULL)) { |
| 228 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); |
358 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), TRUE); |
| 229 } |
359 } |
| 230 } |
360 } |
| 231 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(winprefs_set_autostart), NULL); |
361 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(winprefs_set_autostart), NULL); |
| 232 |
362 |
| 233 /* Dockable Blist */ |
363 /* Buddy List */ |
| |
364 vbox = gaim_gtk_make_frame (ret, _("Buddy List")); |
| 234 button = wgaim_button(_("_Dockable Buddy List"), vbox); |
365 button = wgaim_button(_("_Dockable Buddy List"), vbox); |
| 235 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(winprefs_set_blist_dockable), NULL); |
|
| 236 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_DOCKABLE)); |
366 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_DOCKABLE)); |
| |
367 |
| |
368 /* Docked Blist On Top */ |
| |
369 dbutton = wgaim_button(_("Docked _Buddy List is always on top"), vbox); |
| |
370 gtk_signal_connect(GTK_OBJECT(dbutton), "clicked", GTK_SIGNAL_FUNC(winprefs_set_dblist_ontop), NULL); |
| |
371 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(dbutton), gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_ON_TOP)); |
| |
372 if(!gaim_prefs_get_bool(OPT_WINPREFS_DBLIST_DOCKABLE)) |
| |
373 gtk_widget_set_sensitive(GTK_WIDGET(dbutton), FALSE); |
| |
374 |
| |
375 /* Connect cb for Dockable option.. passing dblist on top button */ |
| |
376 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(winprefs_set_blist_dockable), dbutton); |
| |
377 |
| |
378 /* Blist On Top */ |
| |
379 button = wgaim_button(_("_Keep Buddy List window on top"), vbox); |
| |
380 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(winprefs_set_blist_ontop), NULL); |
| |
381 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), gaim_prefs_get_bool(OPT_WINPREFS_BLIST_ON_TOP)); |
| |
382 |
| |
383 /* Conversations */ |
| |
384 vbox = gaim_gtk_make_frame (ret, _("Conversations")); |
| |
385 button = wgaim_button(_("_Flash Window when messages are received"), vbox); |
| |
386 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(winprefs_set_im_blink), NULL); |
| |
387 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), gaim_prefs_get_bool(OPT_WINPREFS_IM_BLINK)); |
| 237 |
388 |
| 238 gtk_widget_show_all(ret); |
389 gtk_widget_show_all(ret); |
| 239 return ret; |
390 return ret; |
| 240 } |
391 } |
| 241 |
392 |