Mercurial > pidgin.yaz
comparison plugins/win32/transparency/win2ktrans.c @ 4105:e92d7712b8ba
[gaim-migrate @ 4320]
Buddy List now has trans options
committer: Tailor Script <tailor@pidgin.im>
author | Herman Bloggs <hermanator12002@yahoo.com> |
---|---|
date | Fri, 20 Dec 2002 18:08:47 +0000 |
parents | 72d973958607 |
children | 6c38239ff612 |
comparison
equal
deleted
inserted
replaced
4104:1fb22bf10b4f | 4105:e92d7712b8ba |
---|---|
22 */ | 22 */ |
23 #define GAIM_PLUGINS | 23 #define GAIM_PLUGINS |
24 | 24 |
25 #include <gtk/gtk.h> | 25 #include <gtk/gtk.h> |
26 #include <gdk/gdkwin32.h> | 26 #include <gdk/gdkwin32.h> |
27 /*#include "wintransparency.h"*/ | |
28 #include "gaim.h" | 27 #include "gaim.h" |
29 #include "win32dep.h" | 28 #include "win32dep.h" |
30 | 29 |
31 /* | 30 /* |
32 * MACROS & DEFINES | 31 * MACROS & DEFINES |
43 #endif | 42 #endif |
44 | 43 |
45 /* Transparency plugin configuration */ | 44 /* Transparency plugin configuration */ |
46 #define OPT_WGAIM_IMTRANS 0x00000001 | 45 #define OPT_WGAIM_IMTRANS 0x00000001 |
47 #define OPT_WGAIM_SHOW_IMTRANS 0x00000002 | 46 #define OPT_WGAIM_SHOW_IMTRANS 0x00000002 |
47 #define OPT_WGAIM_BLTRANS 0x00000004 | |
48 #define OPT_WGAIM_BUDDYWIN_ONTOP 0x00000008 | |
48 | 49 |
49 /* | 50 /* |
50 * GLOBALS | 51 * GLOBALS |
51 */ | 52 */ |
52 G_MODULE_IMPORT guint im_options; | 53 G_MODULE_IMPORT guint im_options; |
53 G_MODULE_IMPORT GtkWidget *all_convos; | 54 G_MODULE_IMPORT GtkWidget *all_convos; |
55 G_MODULE_IMPORT GtkWidget *blist; | |
54 | 56 |
55 /* | 57 /* |
56 * LOCALS | 58 * LOCALS |
57 */ | 59 */ |
58 static GtkWidget *slider_box=NULL; | 60 static GtkWidget *slider_box=NULL; |
59 static int imalpha = 255; | 61 static int imalpha = 255; |
62 static int blalpha = 255; | |
60 guint trans_options=0; | 63 guint trans_options=0; |
61 | 64 |
62 /* | 65 /* |
63 * PROTOS | 66 * PROTOS |
64 */ | 67 */ |
76 SetWindowLong(hWnd,GWL_EXSTYLE,GetWindowLong(hWnd,GWL_EXSTYLE) | WS_EX_LAYERED); | 79 SetWindowLong(hWnd,GWL_EXSTYLE,GetWindowLong(hWnd,GWL_EXSTYLE) | WS_EX_LAYERED); |
77 MySetLayeredWindowAttributes(hWnd,0,trans,LWA_ALPHA); | 80 MySetLayeredWindowAttributes(hWnd,0,trans,LWA_ALPHA); |
78 } | 81 } |
79 } | 82 } |
80 | 83 |
81 static void change_im_alpha(GtkWidget *w, gpointer data) { | 84 void set_wintrans_off(GtkWidget *window) { |
85 if(MySetLayeredWindowAttributes) { | |
86 HWND hWnd = GDK_WINDOW_HWND(window->window); | |
87 SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) & ~WS_EX_LAYERED); | |
88 | |
89 /* Ask the window and its children to repaint */ | |
90 RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); | |
91 } | |
92 } | |
93 | |
94 static void change_alpha(GtkWidget *w, gpointer data) { | |
82 set_wintrans(GTK_WIDGET(data), gtk_range_get_value(GTK_RANGE(w))); | 95 set_wintrans(GTK_WIDGET(data), gtk_range_get_value(GTK_RANGE(w))); |
83 } | 96 } |
84 | 97 |
85 int has_transparency() { | 98 int has_transparency() { |
86 return MySetLayeredWindowAttributes ? TRUE : FALSE; | 99 return MySetLayeredWindowAttributes ? TRUE : FALSE; |
105 slider = gtk_hscale_new_with_range(50,255,1); | 118 slider = gtk_hscale_new_with_range(50,255,1); |
106 gtk_range_set_value(GTK_RANGE(slider), imalpha); | 119 gtk_range_set_value(GTK_RANGE(slider), imalpha); |
107 gtk_widget_set_usize(GTK_WIDGET(slider), 200, -1); | 120 gtk_widget_set_usize(GTK_WIDGET(slider), 200, -1); |
108 | 121 |
109 /* On slider val change, update window's transparency level */ | 122 /* On slider val change, update window's transparency level */ |
110 gtk_signal_connect(GTK_OBJECT(slider), "value-changed", GTK_SIGNAL_FUNC(change_im_alpha), win); | 123 gtk_signal_connect(GTK_OBJECT(slider), "value-changed", GTK_SIGNAL_FUNC(change_alpha), win); |
111 | 124 |
112 gtk_box_pack_start(GTK_BOX(hbox), slider, FALSE, TRUE, 5); | 125 gtk_box_pack_start(GTK_BOX(hbox), slider, FALSE, TRUE, 5); |
113 | 126 |
114 /* Set the initial transparency level */ | 127 /* Set the initial transparency level */ |
115 set_wintrans(win, imalpha); | 128 set_wintrans(win, imalpha); |
182 !(trans_options & OPT_WGAIM_SHOW_IMTRANS)) { | 195 !(trans_options & OPT_WGAIM_SHOW_IMTRANS)) { |
183 set_wintrans(c->window, imalpha); | 196 set_wintrans(c->window, imalpha); |
184 } | 197 } |
185 } | 198 } |
186 | 199 |
187 static void im_alpha_change(GtkWidget *w, gpointer data) { | 200 static void blist_created() { |
188 imalpha = gtk_range_get_value(GTK_RANGE(w)); | 201 if(blist) { |
202 if(trans_options & OPT_WGAIM_BUDDYWIN_ONTOP) | |
203 SetWindowPos(GDK_WINDOW_HWND(blist->window), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); | |
204 else | |
205 SetWindowPos(GDK_WINDOW_HWND(blist->window), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); | |
206 | |
207 if(trans_options & OPT_WGAIM_BLTRANS) | |
208 set_wintrans(blist, blalpha); | |
209 else | |
210 set_wintrans_off(blist); | |
211 } | |
212 } | |
213 | |
214 static void alpha_change(GtkWidget *w, gpointer data) { | |
215 int *alpha = (int*)data; | |
216 *alpha = gtk_range_get_value(GTK_RANGE(w)); | |
217 } | |
218 | |
219 static void bl_alpha_change(GtkWidget *w, gpointer data) { | |
220 alpha_change(w, data); | |
221 if(blist) | |
222 change_alpha(w, blist); | |
189 } | 223 } |
190 | 224 |
191 /* Load options */ | 225 /* Load options */ |
192 static void load_trans_prefs() { | 226 static void load_trans_prefs() { |
193 FILE *f; | 227 FILE *f; |
212 if (strcmp(tag, "options")==0) { | 246 if (strcmp(tag, "options")==0) { |
213 fgets(buf, sizeof(buf), f); | 247 fgets(buf, sizeof(buf), f); |
214 sscanf(buf, "\ttrans_options { %d", &trans_options); | 248 sscanf(buf, "\ttrans_options { %d", &trans_options); |
215 continue; | 249 continue; |
216 } else if (strcmp(tag, "trans")==0) { | 250 } else if (strcmp(tag, "trans")==0) { |
217 fgets(buf, sizeof(buf), f); | 251 int num; |
218 sscanf(buf, "\timalpha { %d", &imalpha); | 252 for(fgets(buf, sizeof(buf), f);buf[0] != '}' && !feof(f);fgets(buf, sizeof(buf), f)) { |
219 continue; | 253 sscanf(buf, "\t%s { %d", tag, &num); |
254 if(strcmp(tag, "imalpha")==0) { | |
255 imalpha = num; | |
256 } | |
257 else if(strcmp(tag, "blalpha")==0) { | |
258 blalpha = num; | |
259 } | |
260 } | |
220 } | 261 } |
221 } | 262 } |
222 } | 263 } |
223 else | 264 else |
224 save_trans_prefs(); | 265 save_trans_prefs(); |
266 blist_created(); | |
225 } | 267 } |
226 | 268 |
227 /* Save options */ | 269 /* Save options */ |
228 | 270 |
229 static void write_options(FILE *f) { | 271 static void write_options(FILE *f) { |
230 fprintf(f, "options {\n"); | 272 fprintf(f, "options {\n"); |
231 fprintf(f, "\ttrans_options { %u }\n", trans_options); | 273 fprintf(f, "\ttrans_options { %u }\n", trans_options); |
232 fprintf(f, "}\n"); | 274 fprintf(f, "}\n"); |
233 } | 275 } |
234 | 276 |
235 static void write_trans(FILE *f) | 277 static void write_trans(FILE *f) { |
236 { | |
237 fprintf(f, "trans {\n"); | 278 fprintf(f, "trans {\n"); |
238 fprintf(f, "\timalpha { %d }\n", imalpha); | 279 fprintf(f, "\timalpha { %d }\n", imalpha); |
280 fprintf(f, "\tblalpha { %d }\n", blalpha); | |
239 fprintf(f, "}\n"); | 281 fprintf(f, "}\n"); |
240 } | 282 } |
241 | 283 |
242 static void save_trans_prefs() { | 284 static void save_trans_prefs() { |
243 FILE *f; | 285 FILE *f; |
244 char buf[1024]; | 286 char buf[1024]; |
245 | 287 |
246 if (gaim_home_dir()) { | 288 if (gaim_home_dir()) { |
247 g_snprintf(buf, sizeof(buf), "%s" G_DIR_SEPARATOR_S ".gaim" G_DIR_SEPARATOR_S "wintransrc", gaim_home_dir()); | 289 g_snprintf(buf, sizeof(buf), "%s" G_DIR_SEPARATOR_S ".gaim" G_DIR_SEPARATOR_S "wintransrc", gaim_home_dir()); |
248 } | 290 } |
249 else { | 291 else |
250 return; | 292 return; |
251 } | |
252 | 293 |
253 if ((f = fopen(buf, "w"))) { | 294 if ((f = fopen(buf, "w"))) { |
254 fprintf(f, "# wintransrc v%d\n", WINTRANS_VERSION); | 295 fprintf(f, "# wintransrc v%d\n", WINTRANS_VERSION); |
255 write_trans(f); | 296 write_trans(f); |
256 write_options(f); | 297 write_options(f); |
258 } | 299 } |
259 else | 300 else |
260 debug_printf("Error opening wintransrc\n"); | 301 debug_printf("Error opening wintransrc\n"); |
261 } | 302 } |
262 | 303 |
263 static void set_trans_option(GtkWidget *w, int option) | 304 static void set_trans_option(GtkWidget *w, int option) { |
264 { | |
265 trans_options ^= option; | 305 trans_options ^= option; |
266 save_trans_prefs(); | 306 save_trans_prefs(); |
307 | |
308 if(option == OPT_WGAIM_BUDDYWIN_ONTOP) { | |
309 if(blist) { | |
310 if(trans_options & OPT_WGAIM_BUDDYWIN_ONTOP) | |
311 SetWindowPos(GDK_WINDOW_HWND(blist->window), HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); | |
312 else | |
313 SetWindowPos(GDK_WINDOW_HWND(blist->window), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); | |
314 } | |
315 } else if(option == OPT_WGAIM_BLTRANS) { | |
316 if(blist) { | |
317 if(trans_options & OPT_WGAIM_BLTRANS) | |
318 set_wintrans(blist, blalpha); | |
319 else | |
320 set_wintrans_off(blist); | |
321 } | |
322 } | |
267 } | 323 } |
268 | 324 |
269 /* | 325 /* |
270 * EXPORTED FUNCTIONS | 326 * EXPORTED FUNCTIONS |
271 */ | 327 */ |
272 | 328 |
273 G_MODULE_EXPORT char *gaim_plugin_init(GModule *handle) { | 329 G_MODULE_EXPORT char *gaim_plugin_init(GModule *handle) { |
274 gaim_signal_connect(handle, event_new_conversation, gaim_new_conversation, NULL); | 330 gaim_signal_connect(handle, event_new_conversation, gaim_new_conversation, NULL); |
275 gaim_signal_connect(handle, event_del_conversation, gaim_del_conversation, NULL); | 331 gaim_signal_connect(handle, event_del_conversation, gaim_del_conversation, NULL); |
332 gaim_signal_connect(handle, event_signon, blist_created, NULL); | |
276 MySetLayeredWindowAttributes = (void*)wgaim_find_and_loadproc("user32.dll", "SetLayeredWindowAttributes" ); | 333 MySetLayeredWindowAttributes = (void*)wgaim_find_and_loadproc("user32.dll", "SetLayeredWindowAttributes" ); |
277 load_trans_prefs(); | 334 load_trans_prefs(); |
278 | 335 |
279 return NULL; | 336 return NULL; |
280 } | 337 } |
302 return _("This plugin enables variable alpha transparency on conversation windows.\n\n* Note: This plugin requires Win2000 or WinXP."); | 359 return _("This plugin enables variable alpha transparency on conversation windows.\n\n* Note: This plugin requires Win2000 or WinXP."); |
303 } | 360 } |
304 | 361 |
305 G_MODULE_EXPORT GtkWidget *gaim_plugin_config_gtk() { | 362 G_MODULE_EXPORT GtkWidget *gaim_plugin_config_gtk() { |
306 GtkWidget *ret; | 363 GtkWidget *ret; |
307 GtkWidget *vbox; | 364 GtkWidget *imtransbox, *bltransbox; |
308 GtkWidget *hbox; | 365 GtkWidget *hbox; |
309 GtkWidget *label, *slider; | 366 GtkWidget *label, *slider; |
310 GtkWidget *button; | 367 GtkWidget *button; |
311 GtkWidget *trans_box; | 368 GtkWidget *trans_box; |
312 | 369 |
313 ret = gtk_vbox_new(FALSE, 18); | 370 ret = gtk_vbox_new(FALSE, 18); |
314 gtk_container_set_border_width (GTK_CONTAINER (ret), 12); | 371 gtk_container_set_border_width (GTK_CONTAINER (ret), 12); |
315 | 372 |
316 /* transparency options */ | 373 /* IM Convo trans options */ |
317 vbox = make_frame (ret, _("Transparency")); | 374 imtransbox = make_frame (ret, _("IM Conversation Windows")); |
318 button = gaim_button(_("_IM window transparency"), &trans_options, OPT_WGAIM_IMTRANS, vbox); | 375 button = gaim_button(_("_IM window transparency"), &trans_options, OPT_WGAIM_IMTRANS, imtransbox); |
319 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(set_trans_option), (int *)OPT_WGAIM_IMTRANS); | 376 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(set_trans_option), (int *)OPT_WGAIM_IMTRANS); |
320 | 377 |
321 trans_box = gtk_vbox_new(FALSE, 18); | 378 trans_box = gtk_vbox_new(FALSE, 18); |
322 if (!(trans_options & OPT_WGAIM_IMTRANS)) | 379 if (!(trans_options & OPT_WGAIM_IMTRANS)) |
323 gtk_widget_set_sensitive(GTK_WIDGET(trans_box), FALSE); | 380 gtk_widget_set_sensitive(GTK_WIDGET(trans_box), FALSE); |
326 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(toggle_sensitive), trans_box); | 383 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(toggle_sensitive), trans_box); |
327 | 384 |
328 button = gaim_button(_("_Show slider bar in IM window"), &trans_options, OPT_WGAIM_SHOW_IMTRANS, trans_box); | 385 button = gaim_button(_("_Show slider bar in IM window"), &trans_options, OPT_WGAIM_SHOW_IMTRANS, trans_box); |
329 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(set_trans_option), (int *)OPT_WGAIM_SHOW_IMTRANS); | 386 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(set_trans_option), (int *)OPT_WGAIM_SHOW_IMTRANS); |
330 | 387 |
331 gtk_box_pack_start(GTK_BOX(vbox), trans_box, FALSE, FALSE, 5); | 388 gtk_box_pack_start(GTK_BOX(imtransbox), trans_box, FALSE, FALSE, 5); |
332 | 389 |
333 /* transparency slider */ | 390 /* IM transparency slider */ |
334 hbox = gtk_hbox_new(FALSE, 5); | 391 hbox = gtk_hbox_new(FALSE, 5); |
335 | 392 |
336 label = gtk_label_new(_("Default Opacity:")); | 393 label = gtk_label_new(_("Opacity:")); |
337 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); | 394 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); |
338 | 395 |
339 slider = gtk_hscale_new_with_range(50,255,1); | 396 slider = gtk_hscale_new_with_range(50,255,1); |
340 gtk_range_set_value(GTK_RANGE(slider), imalpha); | 397 gtk_range_set_value(GTK_RANGE(slider), imalpha); |
341 gtk_widget_set_usize(GTK_WIDGET(slider), 200, -1); | 398 gtk_widget_set_usize(GTK_WIDGET(slider), 200, -1); |
342 | 399 |
343 gtk_signal_connect(GTK_OBJECT(slider), "value-changed", GTK_SIGNAL_FUNC(im_alpha_change), NULL); | 400 gtk_signal_connect(GTK_OBJECT(slider), "value-changed", GTK_SIGNAL_FUNC(alpha_change), (void*)&imalpha); |
344 gtk_signal_connect(GTK_OBJECT(slider), "focus-out-event", GTK_SIGNAL_FUNC(save_trans_prefs), NULL); | 401 gtk_signal_connect(GTK_OBJECT(slider), "focus-out-event", GTK_SIGNAL_FUNC(save_trans_prefs), NULL); |
345 | 402 |
346 gtk_box_pack_start(GTK_BOX(hbox), slider, FALSE, TRUE, 5); | 403 gtk_box_pack_start(GTK_BOX(hbox), slider, FALSE, TRUE, 5); |
347 | 404 |
348 gtk_widget_show_all(hbox); | 405 gtk_widget_show_all(hbox); |
349 | 406 |
350 gtk_box_pack_start(GTK_BOX(trans_box), hbox, FALSE, FALSE, 5); | 407 gtk_box_pack_start(GTK_BOX(trans_box), hbox, FALSE, FALSE, 5); |
351 | 408 |
409 /* Buddy List trans options */ | |
410 bltransbox = make_frame (ret, _("Buddy List Window")); | |
411 button = gaim_button(_("_Keep Buddy List window on top"), &trans_options, OPT_WGAIM_BUDDYWIN_ONTOP, bltransbox); | |
412 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(set_trans_option), (int *)OPT_WGAIM_BUDDYWIN_ONTOP); | |
413 | |
414 button = gaim_button(_("_Buddy List window transparency"), &trans_options, OPT_WGAIM_BLTRANS, bltransbox); | |
415 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(set_trans_option), (int *)OPT_WGAIM_BLTRANS); | |
416 | |
417 trans_box = gtk_vbox_new(FALSE, 18); | |
418 if (!(trans_options & OPT_WGAIM_BLTRANS)) | |
419 gtk_widget_set_sensitive(GTK_WIDGET(trans_box), FALSE); | |
420 gtk_widget_show(trans_box); | |
421 gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(toggle_sensitive), trans_box); | |
422 gtk_box_pack_start(GTK_BOX(bltransbox), trans_box, FALSE, FALSE, 5); | |
423 | |
424 /* IM transparency slider */ | |
425 hbox = gtk_hbox_new(FALSE, 5); | |
426 | |
427 label = gtk_label_new(_("Opacity:")); | |
428 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); | |
429 | |
430 slider = gtk_hscale_new_with_range(50,255,1); | |
431 gtk_range_set_value(GTK_RANGE(slider), blalpha); | |
432 gtk_widget_set_usize(GTK_WIDGET(slider), 200, -1); | |
433 | |
434 gtk_signal_connect(GTK_OBJECT(slider), "value-changed", GTK_SIGNAL_FUNC(bl_alpha_change), (void*)&blalpha); | |
435 gtk_signal_connect(GTK_OBJECT(slider), "focus-out-event", GTK_SIGNAL_FUNC(save_trans_prefs), NULL); | |
436 | |
437 gtk_box_pack_start(GTK_BOX(hbox), slider, FALSE, TRUE, 5); | |
438 | |
439 gtk_widget_show_all(hbox); | |
440 | |
441 gtk_box_pack_start(GTK_BOX(trans_box), hbox, FALSE, FALSE, 5); | |
442 | |
352 /* If this version of Windows dosn't support Transparency, grey out options */ | 443 /* If this version of Windows dosn't support Transparency, grey out options */ |
353 if(!has_transparency()) { | 444 if(!has_transparency()) { |
354 gtk_widget_set_sensitive(GTK_WIDGET(vbox), FALSE); | 445 debug_printf("This version of windows dosn't support transparency\n"); |
446 gtk_widget_set_sensitive(GTK_WIDGET(imtransbox), FALSE); | |
447 gtk_widget_set_sensitive(GTK_WIDGET(button), FALSE); | |
448 gtk_widget_set_sensitive(GTK_WIDGET(trans_box), FALSE); | |
355 } | 449 } |
356 | 450 |
357 gtk_widget_show_all(ret); | 451 gtk_widget_show_all(ret); |
358 return ret; | 452 return ret; |
359 } | 453 } |