plugins/win32/winprefs/winprefs.c

changeset 6436
f2bf79a9db81
parent 6409
ea9ba622db3f
child 6494
21e66a116e2a
equal deleted inserted replaced
6435:8ef7bedffc67 6436:f2bf79a9db81
48 */ 48 */
49 static const char *OPT_WINPREFS_DBLIST_DOCKABLE = "/plugins/gtk/win32/winprefs/dblist_dockable"; 49 static const char *OPT_WINPREFS_DBLIST_DOCKABLE = "/plugins/gtk/win32/winprefs/dblist_dockable";
50 static const char *OPT_WINPREFS_DBLIST_DOCKED = "/plugins/gtk/win32/winprefs/dblist_docked"; 50 static const char *OPT_WINPREFS_DBLIST_DOCKED = "/plugins/gtk/win32/winprefs/dblist_docked";
51 static const char *OPT_WINPREFS_DBLIST_HEIGHT = "/plugins/gtk/win32/winprefs/dblist_height"; 51 static const char *OPT_WINPREFS_DBLIST_HEIGHT = "/plugins/gtk/win32/winprefs/dblist_height";
52 static const char *OPT_WINPREFS_DBLIST_SIDE = "/plugins/gtk/win32/winprefs/dblist_side"; 52 static const char *OPT_WINPREFS_DBLIST_SIDE = "/plugins/gtk/win32/winprefs/dblist_side";
53 static const char *OPT_WINPREFS_DBLIST_ON_TOP = "/plugins/gtk/win32/winprefs/dblist_on_top";
54 static const char *OPT_WINPREFS_BLIST_ON_TOP = "/plugins/gtk/win32/winprefs/blist_on_top";
55 static const char *OPT_WINPREFS_IM_BLINK = "/plugins/gtk/win32/winprefs/im_blink";
56
53 static GaimPlugin *plugin_id = NULL; 57 static GaimPlugin *plugin_id = NULL;
54 static GtkAppBar *blist_ab = NULL; 58 static GtkAppBar *blist_ab = NULL;
55 static GtkWidget *blist = NULL; 59 static GtkWidget *blist = NULL;
56 60
57 /* 61 /*
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
273 gaim_prefs_add_none("/plugins/gtk/win32/winprefs"); 424 gaim_prefs_add_none("/plugins/gtk/win32/winprefs");
274 gaim_prefs_add_bool(OPT_WINPREFS_DBLIST_DOCKABLE, FALSE); 425 gaim_prefs_add_bool(OPT_WINPREFS_DBLIST_DOCKABLE, FALSE);
275 gaim_prefs_add_bool(OPT_WINPREFS_DBLIST_DOCKED, FALSE); 426 gaim_prefs_add_bool(OPT_WINPREFS_DBLIST_DOCKED, FALSE);
276 gaim_prefs_add_int(OPT_WINPREFS_DBLIST_HEIGHT, 0); 427 gaim_prefs_add_int(OPT_WINPREFS_DBLIST_HEIGHT, 0);
277 gaim_prefs_add_int(OPT_WINPREFS_DBLIST_SIDE, 0); 428 gaim_prefs_add_int(OPT_WINPREFS_DBLIST_SIDE, 0);
429 gaim_prefs_add_bool(OPT_WINPREFS_DBLIST_ON_TOP, FALSE);
430 gaim_prefs_add_bool(OPT_WINPREFS_BLIST_ON_TOP, FALSE);
431 gaim_prefs_add_bool(OPT_WINPREFS_IM_BLINK, TRUE);
278 } 432 }
279 433
280 GAIM_INIT_PLUGIN(winprefs, init_plugin, info) 434 GAIM_INIT_PLUGIN(winprefs, init_plugin, info)

mercurial