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 }