pidgin/plugins/transparency.c

changeset 40994
1eb6d260980d
parent 40360
e21f3bbcc2a5
child 41081
0c1c063d71f6
equal deleted inserted replaced
40993:2032d26a8d6b 40994:1eb6d260980d
19 * along with this program; if not, write to the Free Software 19 * along with this program; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 * 02111-1301, USA. 21 * 02111-1301, USA.
22 * 22 *
23 */ 23 */
24 #include "internal.h" 24
25 #include <glib.h>
26 #include <glib/gi18n-lib.h>
25 27
26 #include <purple.h> 28 #include <purple.h>
27 29
28 #include "gtkconv.h" 30 #include <gplugin.h>
29 #include "gtkplugin.h" 31 #include <gplugin-native.h>
30 #include "gtkprefs.h" 32
31 #include "gtkblist.h" 33 #include <pidgin.h>
32 #include "gtkutils.h"
33 #include "signals.h"
34 #include "version.h"
35 34
36 /* 35 /*
37 * MACROS & DEFINES 36 * MACROS & DEFINES
38 */ 37 */
39 /* The plugin name is left unchanged from its WinAPI days in order to keep it 38 /* The plugin name is left unchanged from its WinAPI days in order to keep it
40 * loading for users who were using it. */ 39 * loading for users who were using it. */
41 #define WINTRANS_PLUGIN_ID "gtk-win-trans" 40 #define WINTRANS_PLUGIN_ID "gtk-win-trans"
42
43 #define blist (purple_get_blist() \
44 ? (PIDGIN_BLIST(purple_get_blist()) \
45 ? ((PIDGIN_BLIST(purple_get_blist()))->window) \
46 : NULL) \
47 : NULL)
48 41
49 /* 42 /*
50 * DATA STRUCTS 43 * DATA STRUCTS
51 */ 44 */
52 typedef struct { 45 typedef struct {
70 63
71 /* 64 /*
72 * CODE 65 * CODE
73 */ 66 */
74 67
68 static GtkWidget *
69 get_buddy_list_window(void) {
70 PurpleBuddyList *purple_blist = NULL;
71
72 purple_blist = purple_blist_get_default();
73 if(PIDGIN_IS_BUDDY_LIST(purple_blist)) {
74 PidginBuddyList *pidgin_blist = PIDGIN_BUDDY_LIST(purple_blist);
75
76 return pidgin_blist->window;
77 }
78
79 return NULL;
80 }
81
75 /* Set window transparency level */ 82 /* Set window transparency level */
76 static void set_wintrans(GtkWidget *window, int alpha, gboolean enabled, 83 static void set_wintrans(GtkWidget *window, int alpha, gboolean enabled,
77 gboolean always_on_top) { 84 gboolean always_on_top) {
85 GdkWindow *gdk_window = gtk_widget_get_window(window);
86
78 if (enabled) { 87 if (enabled) {
79 gdk_window_set_opacity(window->window, alpha / 255.0); 88 gdk_window_set_opacity(gdk_window, alpha / 255.0);
80 gdk_window_set_keep_above(window->window, always_on_top); 89 gdk_window_set_keep_above(gdk_window, always_on_top);
81 } else { 90 } else {
82 gdk_window_set_opacity(window->window, 1); 91 gdk_window_set_opacity(gdk_window, 1);
83 gdk_window_set_keep_above(window->window, 0); 92 gdk_window_set_keep_above(gdk_window, 0);
84 } 93 }
85 } 94 }
86 95
87 /* When a conv window is focused, if we're only transparent when unfocused, 96 /* When a conv window is focused, if we're only transparent when unfocused,
88 * deal with transparency */ 97 * deal with transparency */
143 152
144 frame = gtk_frame_new(NULL); 153 frame = gtk_frame_new(NULL);
145 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE); 154 gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE);
146 gtk_widget_show(frame); 155 gtk_widget_show(frame);
147 156
148 hbox = gtk_hbox_new(FALSE, 5); 157 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
149 gtk_container_add(GTK_CONTAINER(frame), hbox); 158 gtk_container_add(GTK_CONTAINER(frame), hbox);
150 159
151 label = gtk_label_new(_("Opacity:")); 160 label = gtk_label_new(_("Opacity:"));
152 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); 161 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
153 gtk_widget_show(hbox); 162 gtk_widget_show(hbox);
154 163
155 slider = gtk_hscale_new_with_range(50, 255, 1); 164 slider = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, 50, 255, 1);
156 gtk_range_set_value(GTK_RANGE(slider), imalpha); 165 gtk_range_set_value(GTK_RANGE(slider), imalpha);
157 gtk_widget_set_usize(GTK_WIDGET(slider), 200, -1);
158 166
159 /* On slider val change, update window's transparency level */ 167 /* On slider val change, update window's transparency level */
160 g_signal_connect(GTK_OBJECT(slider), "value-changed", 168 g_signal_connect(G_OBJECT(slider), "value-changed",
161 G_CALLBACK(change_alpha), win); 169 G_CALLBACK(change_alpha), win);
162 170
163 gtk_box_pack_start(GTK_BOX(hbox), slider, FALSE, TRUE, 5); 171 gtk_box_pack_start(GTK_BOX(hbox), slider, FALSE, TRUE, 5);
164 172
165 /* Set the initial transparency level */ 173 /* Set the initial transparency level */
181 } 189 }
182 return NULL; 190 return NULL;
183 } 191 }
184 192
185 /* Clean up transparency stuff for the conv window */ 193 /* Clean up transparency stuff for the conv window */
186 static void cleanup_conv_window(PidginWindow *win) { 194 static void cleanup_conv_window(PidginConvWindow *win) {
187 GtkWidget *window = win->window; 195 GtkWidget *window = win->window;
188 slider_win *slidwin = NULL; 196 slider_win *slidwin = NULL;
189 197
190 /* Remove window from the window list */ 198 /* Remove window from the window list */
191 purple_debug_info(WINTRANS_PLUGIN_ID, 199 purple_debug_info(WINTRANS_PLUGIN_ID,
201 G_CALLBACK(focus_conv_win_cb), window); 209 G_CALLBACK(focus_conv_win_cb), window);
202 } 210 }
203 211
204 static void 212 static void
205 conversation_delete_cb(PurpleConversation *conv) { 213 conversation_delete_cb(PurpleConversation *conv) {
206 PidginWindow *win = pidgin_conv_get_window(PIDGIN_CONVERSATION(conv)); 214 PidginConvWindow *win = pidgin_conv_get_window(PIDGIN_CONVERSATION(conv));
207 /* If it is the last conversation in the window, cleanup */ 215 /* If it is the last conversation in the window, cleanup */
208 if (win != NULL && pidgin_conv_window_get_gtkconv_count(win) == 1) 216 if (win != NULL && pidgin_conv_window_get_gtkconv_count(win) == 1)
209 cleanup_conv_window(win); 217 cleanup_conv_window(win);
210 } 218 }
211 219
212 static void set_blist_trans(GtkWidget *w, const char *pref) { 220 static void set_blist_trans(GtkWidget *w, const char *pref) {
221 GtkWidget *window = get_buddy_list_window();
213 gboolean enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w)); 222 gboolean enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w));
214 purple_prefs_set_bool(pref, enabled); 223 purple_prefs_set_bool(pref, enabled);
215 if (blist) { 224 if (window != NULL) {
216 set_wintrans(blist, purple_prefs_get_int(OPT_WINTRANS_BL_ALPHA), 225 set_wintrans(window, purple_prefs_get_int(OPT_WINTRANS_BL_ALPHA),
217 purple_prefs_get_bool(OPT_WINTRANS_BL_ENABLED), 226 purple_prefs_get_bool(OPT_WINTRANS_BL_ENABLED),
218 purple_prefs_get_bool(OPT_WINTRANS_IM_ONTOP)); 227 purple_prefs_get_bool(OPT_WINTRANS_IM_ONTOP));
219 } 228 }
220 } 229 }
221 230
225 234
226 /* Look up this window to see if it already has a slider */ 235 /* Look up this window to see if it already has a slider */
227 if (!find_slidwin(win)) { 236 if (!find_slidwin(win)) {
228 GtkWidget *slider_box = NULL; 237 GtkWidget *slider_box = NULL;
229 slider_win *slidwin = NULL; 238 slider_win *slidwin = NULL;
230 GtkRequisition slidereq;
231 gint width, height;
232 239
233 /* Get top vbox */ 240 /* Get top vbox */
234 for (wl1 = wl = gtk_container_get_children( 241 for (wl1 = wl = gtk_container_get_children(
235 GTK_CONTAINER(win)); 242 GTK_CONTAINER(win));
236 wl != NULL; 243 wl != NULL;
237 wl = wl->next) { 244 wl = wl->next) {
238 if (GTK_IS_VBOX(GTK_OBJECT(wl->data))) 245 if (GTK_IS_BOX(G_OBJECT(wl->data)))
239 vbox = GTK_WIDGET(wl->data); 246 vbox = GTK_WIDGET(wl->data);
240 else { 247 else {
241 purple_debug_error(WINTRANS_PLUGIN_ID, 248 purple_debug_error(WINTRANS_PLUGIN_ID,
242 "no vbox found\n"); 249 "no vbox found\n");
243 return; 250 return;
244 } 251 }
245 } 252 }
246 g_list_free(wl1); 253 g_list_free(wl1);
247 254
248 slider_box = wintrans_slider(win); 255 slider_box = wintrans_slider(win);
249 /* Figure out how tall the slider wants to be */ 256 gtk_box_pack_start(GTK_BOX(vbox), slider_box, FALSE, FALSE, 0);
250 gtk_widget_size_request(slider_box, &slidereq); 257
251 gtk_window_get_size(GTK_WINDOW(win), &width, &height);
252 gtk_box_pack_start(GTK_BOX(vbox),
253 slider_box, FALSE, FALSE, 0);
254 /* Add window to list, to track that it has a slider */ 258 /* Add window to list, to track that it has a slider */
255 slidwin = g_new0(slider_win, 1); 259 slidwin = g_new0(slider_win, 1);
256 slidwin->win = win; 260 slidwin->win = win;
257 slidwin->slider = slider_box; 261 slidwin->slider = slider_box;
258 window_list = g_slist_append(window_list, slidwin); 262 window_list = g_slist_append(window_list, slidwin);
279 /* Remove all transparency related aspects from conversation windows */ 283 /* Remove all transparency related aspects from conversation windows */
280 static void remove_convs_wintrans(gboolean remove_signal) { 284 static void remove_convs_wintrans(gboolean remove_signal) {
281 GList *wins; 285 GList *wins;
282 286
283 for (wins = pidgin_conv_windows_get_list(); wins; wins = wins->next) { 287 for (wins = pidgin_conv_windows_get_list(); wins; wins = wins->next) {
284 PidginWindow *win = wins->data; 288 PidginConvWindow *win = wins->data;
285 GtkWidget *window = win->window; 289 GtkWidget *window = win->window;
286 290
287 if (purple_prefs_get_bool(OPT_WINTRANS_IM_ENABLED)) 291 if (purple_prefs_get_bool(OPT_WINTRANS_IM_ENABLED))
288 set_wintrans(window, 0, FALSE, FALSE); 292 set_wintrans(window, 0, FALSE, FALSE);
289 293
294 } 298 }
295 299
296 remove_sliders(); 300 remove_sliders();
297 } 301 }
298 302
299 static void set_conv_window_trans(PidginWindow *oldwin, PidginWindow *newwin) { 303 static void set_conv_window_trans(PidginConvWindow *oldwin, PidginConvWindow *newwin) {
300 GtkWidget *win = newwin->window; 304 GtkWidget *win = newwin->window;
301 305
302 /* check prefs to see if we want trans */ 306 /* check prefs to see if we want trans */
303 if (purple_prefs_get_bool(OPT_WINTRANS_IM_ENABLED)) { 307 if (purple_prefs_get_bool(OPT_WINTRANS_IM_ENABLED)) {
304 set_wintrans(win, purple_prefs_get_int(OPT_WINTRANS_IM_ALPHA), 308 set_wintrans(win, purple_prefs_get_int(OPT_WINTRANS_IM_ALPHA),
331 335
332 if (purple_prefs_get_bool(OPT_WINTRANS_IM_ENABLED)) { 336 if (purple_prefs_get_bool(OPT_WINTRANS_IM_ENABLED)) {
333 GList *wins; 337 GList *wins;
334 338
335 for (wins = pidgin_conv_windows_get_list(); wins; wins = wins->next) { 339 for (wins = pidgin_conv_windows_get_list(); wins; wins = wins->next) {
336 PidginWindow *win = wins->data; 340 PidginConvWindow *win = wins->data;
337 set_conv_window_trans(NULL, win); 341 set_conv_window_trans(NULL, win);
338 } 342 }
339 343
340 if (!purple_prefs_get_bool(OPT_WINTRANS_IM_SLIDER)) 344 if (!purple_prefs_get_bool(OPT_WINTRANS_IM_SLIDER))
341 remove_sliders(); 345 remove_sliders();
343 else 347 else
344 remove_convs_wintrans(FALSE); 348 remove_convs_wintrans(FALSE);
345 } 349 }
346 350
347 static void 351 static void
348 conv_updated_cb(PurpleConversation *conv, PurpleConvUpdateType type) { 352 conv_updated_cb(PurpleConversation *conv, PurpleConversationUpdateType type) {
349 PidginConversation *pconv = PIDGIN_CONVERSATION(conv); 353 PidginConversation *pconv = PIDGIN_CONVERSATION(conv);
350 PidginWindow *win = pidgin_conv_get_window(pconv); 354 PidginConvWindow *win = pidgin_conv_get_window(pconv);
351 355
352 if (type == PURPLE_CONV_UPDATE_UNSEEN && !pidgin_conv_is_hidden(pconv) 356 if (type == PURPLE_CONVERSATION_UPDATE_UNSEEN && !pidgin_conv_is_hidden(pconv)
353 && pconv->unseen_state == PIDGIN_UNSEEN_NONE 357 && pconv->unseen_state == PIDGIN_UNSEEN_NONE
354 && pidgin_conv_window_get_gtkconv_count(win) == 1) { 358 && pidgin_conv_window_get_gtkconv_count(win) == 1) {
355 GtkWidget *window = win->window; 359 GtkWidget *window = win->window;
356 gboolean has_focus; 360 gboolean has_focus;
357 361
370 } 374 }
371 } 375 }
372 376
373 static void 377 static void
374 new_conversation_cb(PurpleConversation *conv) { 378 new_conversation_cb(PurpleConversation *conv) {
375 PidginWindow *win = pidgin_conv_get_window(PIDGIN_CONVERSATION(conv)); 379 PidginConvWindow *win = pidgin_conv_get_window(PIDGIN_CONVERSATION(conv));
376 380
377 /* If it is the first conversation in the window, 381 /* If it is the first conversation in the window,
378 * add the sliders, and set transparency */ 382 * add the sliders, and set transparency */
379 if (!pidgin_conv_is_hidden(PIDGIN_CONVERSATION(conv)) && pidgin_conv_window_get_gtkconv_count(win) == 1) { 383 if (!pidgin_conv_is_hidden(PIDGIN_CONVERSATION(conv)) && pidgin_conv_window_get_gtkconv_count(win) == 1) {
380 GtkWidget *window = win->window; 384 GtkWidget *window = win->window;
388 } 392 }
389 } 393 }
390 394
391 static void 395 static void
392 blist_created_cb(PurpleBuddyList *purple_blist, gpointer data) { 396 blist_created_cb(PurpleBuddyList *purple_blist, gpointer data) {
393 if (blist) { 397 GtkWidget *window = get_buddy_list_window();
398 if (window != NULL) {
394 if (purple_prefs_get_bool(OPT_WINTRANS_BL_ENABLED)) { 399 if (purple_prefs_get_bool(OPT_WINTRANS_BL_ENABLED)) {
395 set_wintrans(blist, 400 set_wintrans(window,
396 purple_prefs_get_int(OPT_WINTRANS_BL_ALPHA), 401 purple_prefs_get_int(OPT_WINTRANS_BL_ALPHA),
397 TRUE, 402 TRUE,
398 purple_prefs_get_bool(OPT_WINTRANS_BL_ONTOP)); 403 purple_prefs_get_bool(OPT_WINTRANS_BL_ONTOP));
399 } 404 }
400 405
401 g_signal_connect(G_OBJECT(blist), "focus_in_event", 406 g_signal_connect(G_OBJECT(window), "focus_in_event",
402 G_CALLBACK(focus_blist_win_cb), blist); 407 G_CALLBACK(focus_blist_win_cb), window);
403 g_signal_connect(G_OBJECT(blist), "focus_out_event", 408 g_signal_connect(G_OBJECT(window), "focus_out_event",
404 G_CALLBACK(focus_blist_win_cb), blist); 409 G_CALLBACK(focus_blist_win_cb), window);
405 } 410 }
406 } 411 }
407 412
408 static void alpha_change(GtkWidget *w, gpointer data) { 413 static void alpha_change(GtkWidget *w, gpointer data) {
409 GList *wins; 414 GList *wins;
410 int imalpha = gtk_range_get_value(GTK_RANGE(w)); 415 int imalpha = gtk_range_get_value(GTK_RANGE(w));
411 416
412 for (wins = pidgin_conv_windows_get_list(); wins; wins = wins->next) { 417 for (wins = pidgin_conv_windows_get_list(); wins; wins = wins->next) {
413 PidginWindow *win = wins->data; 418 PidginConvWindow *win = wins->data;
414 set_wintrans(win->window, imalpha, TRUE, 419 set_wintrans(win->window, imalpha, TRUE,
415 purple_prefs_get_bool(OPT_WINTRANS_IM_ONTOP)); 420 purple_prefs_get_bool(OPT_WINTRANS_IM_ONTOP));
416 } 421 }
417 } 422 }
418 423
421 int alpha = gtk_range_get_value(GTK_RANGE(w)); 426 int alpha = gtk_range_get_value(GTK_RANGE(w));
422 purple_prefs_set_int(pref, alpha); 427 purple_prefs_set_int(pref, alpha);
423 } 428 }
424 429
425 static void bl_alpha_change(GtkWidget *w, gpointer data) { 430 static void bl_alpha_change(GtkWidget *w, gpointer data) {
426 if (blist) 431 GtkWidget *window = get_buddy_list_window();
427 change_alpha(w, blist); 432 if (window != NULL) {
433 change_alpha(w, window);
434 }
428 } 435 }
429 436
430 static void update_existing_convs() { 437 static void update_existing_convs() {
431 GList *wins; 438 GList *wins;
432 439
433 for (wins = pidgin_conv_windows_get_list(); wins; wins = wins->next) { 440 for (wins = pidgin_conv_windows_get_list(); wins; wins = wins->next) {
434 PidginWindow *win = wins->data; 441 PidginConvWindow *win = wins->data;
435 GtkWidget *window = win->window; 442 GtkWidget *window = win->window;
436 443
437 set_conv_window_trans(NULL, win); 444 set_conv_window_trans(NULL, win);
438 445
439 g_signal_connect(G_OBJECT(window), "focus_in_event", 446 g_signal_connect(G_OBJECT(window), "focus_in_event",
441 g_signal_connect(G_OBJECT(window), "focus_out_event", 448 g_signal_connect(G_OBJECT(window), "focus_out_event",
442 G_CALLBACK(focus_conv_win_cb), window); 449 G_CALLBACK(focus_conv_win_cb), window);
443 } 450 }
444 } 451 }
445 452
446 /* 453 static GtkWidget *
447 * EXPORTED FUNCTIONS 454 get_config_frame(PurplePlugin *plugin) {
448 */
449 static gboolean plugin_load(PurplePlugin *plugin) {
450
451 purple_signal_connect(purple_conversations_get_handle(),
452 "conversation-created", plugin,
453 PURPLE_CALLBACK(new_conversation_cb), NULL);
454
455 /* Set callback to remove window from the list, if the window is destroyed */
456 purple_signal_connect(purple_conversations_get_handle(),
457 "deleting-conversation", plugin,
458 PURPLE_CALLBACK(conversation_delete_cb), NULL);
459
460 purple_signal_connect(pidgin_conversations_get_handle(),
461 "conversation-dragging", plugin,
462 PURPLE_CALLBACK(set_conv_window_trans), NULL);
463
464 purple_signal_connect(purple_conversations_get_handle(),
465 "conversation-updated", plugin,
466 PURPLE_CALLBACK(conv_updated_cb), NULL);
467
468 update_existing_convs();
469
470 if (blist)
471 blist_created_cb(NULL, NULL);
472 else
473 purple_signal_connect(pidgin_blist_get_handle(),
474 "gtkblist-created", plugin,
475 PURPLE_CALLBACK(blist_created_cb), NULL);
476
477
478 return TRUE;
479 }
480
481 static gboolean plugin_unload(PurplePlugin *plugin) {
482 purple_debug_info(WINTRANS_PLUGIN_ID, "Unloading transparency plugin\n");
483
484 remove_convs_wintrans(TRUE);
485
486 if (blist) {
487 if (purple_prefs_get_bool(OPT_WINTRANS_BL_ENABLED))
488 set_wintrans(blist, 0, FALSE, FALSE);
489
490 /* Remove the focus cbs */
491 g_signal_handlers_disconnect_by_func(G_OBJECT(blist),
492 G_CALLBACK(focus_blist_win_cb), blist);
493 }
494
495 return TRUE;
496 }
497
498 static GtkWidget *get_config_frame(PurplePlugin *plugin) {
499 GtkWidget *ret; 455 GtkWidget *ret;
500 GtkWidget *imtransbox, *bltransbox; 456 GtkWidget *imtransbox, *bltransbox;
501 GtkWidget *hbox; 457 GtkWidget *hbox;
502 GtkWidget *label, *slider; 458 GtkWidget *label, *slider;
503 GtkWidget *button; 459 GtkWidget *button;
504 GtkWidget *trans_box; 460 GtkWidget *trans_box;
505 461
506 ret = gtk_vbox_new(FALSE, 18); 462 ret = gtk_box_new(GTK_ORIENTATION_VERTICAL, 18);
507 gtk_container_set_border_width(GTK_CONTAINER (ret), 12); 463 gtk_container_set_border_width(GTK_CONTAINER (ret), 12);
508 464
509 /* IM Convo trans options */ 465 /* IM Convo trans options */
510 imtransbox = pidgin_make_frame(ret, _("IM Conversation Windows")); 466 imtransbox = pidgin_make_frame(ret, _("IM Conversation Windows"));
511 button = pidgin_prefs_checkbox(_("_IM window transparency"), 467 button = pidgin_prefs_checkbox(_("_IM window transparency"),
512 OPT_WINTRANS_IM_ENABLED, imtransbox); 468 OPT_WINTRANS_IM_ENABLED, imtransbox);
513 g_signal_connect(GTK_OBJECT(button), "clicked", 469 g_signal_connect(G_OBJECT(button), "clicked",
514 G_CALLBACK(update_convs_wintrans), 470 G_CALLBACK(update_convs_wintrans),
515 (gpointer) OPT_WINTRANS_IM_ENABLED); 471 (gpointer) OPT_WINTRANS_IM_ENABLED);
516 472
517 trans_box = gtk_vbox_new(FALSE, 18); 473 trans_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 18);
518 gtk_widget_show(trans_box); 474 gtk_widget_show(trans_box);
519 g_object_bind_property(button, "active", trans_box, "sensitive", 475 g_object_bind_property(button, "active", trans_box, "sensitive",
520 G_BINDING_SYNC_CREATE); 476 G_BINDING_SYNC_CREATE);
521 477
522 button = pidgin_prefs_checkbox(_("_Show slider bar in IM window"), 478 button = pidgin_prefs_checkbox(_("_Show slider bar in IM window"),
523 OPT_WINTRANS_IM_SLIDER, trans_box); 479 OPT_WINTRANS_IM_SLIDER, trans_box);
524 g_signal_connect(GTK_OBJECT(button), "clicked", 480 g_signal_connect(G_OBJECT(button), "clicked",
525 G_CALLBACK(update_convs_wintrans), 481 G_CALLBACK(update_convs_wintrans),
526 (gpointer) OPT_WINTRANS_IM_SLIDER); 482 (gpointer) OPT_WINTRANS_IM_SLIDER);
527 483
528 button = pidgin_prefs_checkbox( 484 button = pidgin_prefs_checkbox(
529 _("Remove IM window transparency on focus"), 485 _("Remove IM window transparency on focus"),
530 OPT_WINTRANS_IM_ONFOCUS, trans_box); 486 OPT_WINTRANS_IM_ONFOCUS, trans_box);
531 487
532 button = pidgin_prefs_checkbox(_("Always on top"), OPT_WINTRANS_IM_ONTOP, 488 button = pidgin_prefs_checkbox(_("Always on top"), OPT_WINTRANS_IM_ONTOP,
533 trans_box); 489 trans_box);
534 g_signal_connect(GTK_OBJECT(button), "clicked", 490 g_signal_connect(G_OBJECT(button), "clicked",
535 G_CALLBACK(update_convs_wintrans), 491 G_CALLBACK(update_convs_wintrans),
536 (gpointer) OPT_WINTRANS_IM_ONTOP); 492 (gpointer) OPT_WINTRANS_IM_ONTOP);
537 493
538 gtk_box_pack_start(GTK_BOX(imtransbox), trans_box, FALSE, FALSE, 5); 494 gtk_box_pack_start(GTK_BOX(imtransbox), trans_box, FALSE, FALSE, 5);
539 495
540 /* IM transparency slider */ 496 /* IM transparency slider */
541 hbox = gtk_hbox_new(FALSE, 5); 497 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
542 498
543 label = gtk_label_new(_("Opacity:")); 499 label = gtk_label_new(_("Opacity:"));
544 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); 500 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
545 501
546 slider = gtk_hscale_new_with_range(50, 255, 1); 502 slider = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, 50, 255, 1);
547 gtk_range_set_value(GTK_RANGE(slider), 503 gtk_range_set_value(GTK_RANGE(slider),
548 purple_prefs_get_int(OPT_WINTRANS_IM_ALPHA)); 504 purple_prefs_get_int(OPT_WINTRANS_IM_ALPHA));
549 gtk_widget_set_usize(GTK_WIDGET(slider), 200, -1); 505
550 506 g_signal_connect(G_OBJECT(slider), "value-changed",
551 g_signal_connect(GTK_OBJECT(slider), "value-changed",
552 G_CALLBACK(alpha_change), NULL); 507 G_CALLBACK(alpha_change), NULL);
553 g_signal_connect(GTK_OBJECT(slider), "focus-out-event", 508 g_signal_connect(G_OBJECT(slider), "focus-out-event",
554 G_CALLBACK(alpha_pref_set_int), 509 G_CALLBACK(alpha_pref_set_int),
555 (gpointer) OPT_WINTRANS_IM_ALPHA); 510 (gpointer) OPT_WINTRANS_IM_ALPHA);
556 511
557 gtk_box_pack_start(GTK_BOX(hbox), slider, FALSE, TRUE, 5); 512 gtk_box_pack_start(GTK_BOX(hbox), slider, FALSE, TRUE, 5);
558 513
562 517
563 /* Buddy List trans options */ 518 /* Buddy List trans options */
564 bltransbox = pidgin_make_frame (ret, _("Buddy List Window")); 519 bltransbox = pidgin_make_frame (ret, _("Buddy List Window"));
565 button = pidgin_prefs_checkbox(_("_Buddy List window transparency"), 520 button = pidgin_prefs_checkbox(_("_Buddy List window transparency"),
566 OPT_WINTRANS_BL_ENABLED, bltransbox); 521 OPT_WINTRANS_BL_ENABLED, bltransbox);
567 g_signal_connect(GTK_OBJECT(button), "clicked", 522 g_signal_connect(G_OBJECT(button), "clicked",
568 G_CALLBACK(set_blist_trans), 523 G_CALLBACK(set_blist_trans),
569 (gpointer) OPT_WINTRANS_BL_ENABLED); 524 (gpointer) OPT_WINTRANS_BL_ENABLED);
570 525
571 trans_box = gtk_vbox_new(FALSE, 18); 526 trans_box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 18);
572 gtk_widget_show(trans_box); 527 gtk_widget_show(trans_box);
573 g_object_bind_property(button, "active", trans_box, "sensitive", 528 g_object_bind_property(button, "active", trans_box, "sensitive",
574 G_BINDING_SYNC_CREATE); 529 G_BINDING_SYNC_CREATE);
575 button = pidgin_prefs_checkbox( 530 button = pidgin_prefs_checkbox(
576 _("Remove Buddy List window transparency on focus"), 531 _("Remove Buddy List window transparency on focus"),
577 OPT_WINTRANS_BL_ONFOCUS, trans_box); 532 OPT_WINTRANS_BL_ONFOCUS, trans_box);
578 button = pidgin_prefs_checkbox(_("Always on top"), OPT_WINTRANS_BL_ONTOP, 533 button = pidgin_prefs_checkbox(_("Always on top"), OPT_WINTRANS_BL_ONTOP,
579 trans_box); 534 trans_box);
580 g_signal_connect(GTK_OBJECT(button), "clicked", 535 g_signal_connect(G_OBJECT(button), "clicked",
581 G_CALLBACK(set_blist_trans), 536 G_CALLBACK(set_blist_trans),
582 (gpointer) OPT_WINTRANS_BL_ONTOP); 537 (gpointer) OPT_WINTRANS_BL_ONTOP);
583 gtk_box_pack_start(GTK_BOX(bltransbox), trans_box, FALSE, FALSE, 5); 538 gtk_box_pack_start(GTK_BOX(bltransbox), trans_box, FALSE, FALSE, 5);
584 539
585 /* IM transparency slider */ 540 /* IM transparency slider */
586 hbox = gtk_hbox_new(FALSE, 5); 541 hbox = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 5);
587 542
588 label = gtk_label_new(_("Opacity:")); 543 label = gtk_label_new(_("Opacity:"));
589 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); 544 gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);
590 545
591 slider = gtk_hscale_new_with_range(50, 255, 1); 546 slider = gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL, 50, 255, 1);
592 gtk_range_set_value(GTK_RANGE(slider), 547 gtk_range_set_value(GTK_RANGE(slider),
593 purple_prefs_get_int(OPT_WINTRANS_BL_ALPHA)); 548 purple_prefs_get_int(OPT_WINTRANS_BL_ALPHA));
594 549
595 gtk_widget_set_usize(GTK_WIDGET(slider), 200, -1); 550 g_signal_connect(G_OBJECT(slider), "value-changed",
596
597 g_signal_connect(GTK_OBJECT(slider), "value-changed",
598 G_CALLBACK(bl_alpha_change), NULL); 551 G_CALLBACK(bl_alpha_change), NULL);
599 g_signal_connect(GTK_OBJECT(slider), "focus-out-event", 552 g_signal_connect(G_OBJECT(slider), "focus-out-event",
600 G_CALLBACK(alpha_pref_set_int), 553 G_CALLBACK(alpha_pref_set_int),
601 (gpointer) OPT_WINTRANS_BL_ALPHA); 554 (gpointer) OPT_WINTRANS_BL_ALPHA);
602 555
603 gtk_box_pack_start(GTK_BOX(hbox), slider, FALSE, TRUE, 5); 556 gtk_box_pack_start(GTK_BOX(hbox), slider, FALSE, TRUE, 5);
604 557
608 561
609 gtk_widget_show_all(ret); 562 gtk_widget_show_all(ret);
610 return ret; 563 return ret;
611 } 564 }
612 565
613 static PidginPluginUiInfo ui_info = 566 static GPluginPluginInfo *
614 { 567 transparency_query(GError **error) {
615 get_config_frame, 568 const gchar * const authors[] = {
616 0, /* page_num (Reserved) */ 569 "Pidgin Developers <devel@pidgin.im>",
617 570 NULL
618 /* padding */ 571 };
619 NULL, 572
620 NULL, 573 return pidgin_plugin_info_new(
621 NULL, 574 "id", WINTRANS_PLUGIN_ID,
622 NULL 575 "name", N_("Transparency"),
623 }; 576 "version", DISPLAY_VERSION,
624 577 "category", N_("User interface"),
625 static PurplePluginInfo info = 578 "summary", N_("Variable Transparency for the buddy list and conversations."),
626 { 579 "description", N_("This plugin enables variable alpha transparency on conversation windows and the buddy list."),
627 PURPLE_PLUGIN_MAGIC, 580 "authors", authors,
628 PURPLE_MAJOR_VERSION, 581 "website", PURPLE_WEBSITE,
629 PURPLE_MINOR_VERSION, 582 "abi-version", PURPLE_ABI_VERSION,
630 PURPLE_PLUGIN_STANDARD, /**< type */ 583 "gtk-config-frame-cb", get_config_frame,
631 PIDGIN_PLUGIN_TYPE, /**< ui_requirement */ 584 NULL
632 0, /**< flags */ 585 );
633 NULL, /**< dependencies */ 586 }
634 PURPLE_PRIORITY_DEFAULT, /**< priority */ 587
635 WINTRANS_PLUGIN_ID, /**< id */ 588 static gboolean
636 N_("Transparency"), /**< name */ 589 transparency_load(GPluginPlugin *plugin, GError **error) {
637 DISPLAY_VERSION, /**< version */ 590 GtkWidget *window = NULL;
638 /** summary */ 591 gpointer conv_handle = NULL;
639 N_("Variable Transparency for the buddy list and conversations."), 592
640 /** description */
641 N_("This plugin enables variable alpha transparency on conversation windows and the buddy list."),
642 "Herman Bloggs <hermanator12002@yahoo.com>", /**< author */
643 PURPLE_WEBSITE, /**< homepage */
644 plugin_load, /**< load */
645 plugin_unload, /**< unload */
646 NULL, /**< destroy */
647 &ui_info, /**< ui_info */
648 NULL, /**< extra_info */
649 NULL, /**< prefs_info */
650 NULL, /**< actions */
651
652 /* padding */
653 NULL,
654 NULL,
655 NULL,
656 NULL
657 };
658
659 static void
660 init_plugin(PurplePlugin *plugin)
661 {
662 purple_prefs_add_none("/plugins/gtk"); 593 purple_prefs_add_none("/plugins/gtk");
663 purple_prefs_add_none("/plugins/gtk/transparency"); 594 purple_prefs_add_none("/plugins/gtk/transparency");
664 purple_prefs_add_bool(OPT_WINTRANS_IM_ENABLED, FALSE); 595 purple_prefs_add_bool(OPT_WINTRANS_IM_ENABLED, FALSE);
665 purple_prefs_add_int(OPT_WINTRANS_IM_ALPHA, 255); 596 purple_prefs_add_int(OPT_WINTRANS_IM_ALPHA, 255);
666 purple_prefs_add_bool(OPT_WINTRANS_IM_SLIDER, FALSE); 597 purple_prefs_add_bool(OPT_WINTRANS_IM_SLIDER, FALSE);
669 purple_prefs_add_bool(OPT_WINTRANS_BL_ENABLED, FALSE); 600 purple_prefs_add_bool(OPT_WINTRANS_BL_ENABLED, FALSE);
670 purple_prefs_add_int(OPT_WINTRANS_BL_ALPHA, 255); 601 purple_prefs_add_int(OPT_WINTRANS_BL_ALPHA, 255);
671 purple_prefs_add_bool(OPT_WINTRANS_BL_ONFOCUS, FALSE); 602 purple_prefs_add_bool(OPT_WINTRANS_BL_ONFOCUS, FALSE);
672 purple_prefs_add_bool(OPT_WINTRANS_BL_ONTOP, FALSE); 603 purple_prefs_add_bool(OPT_WINTRANS_BL_ONTOP, FALSE);
673 purple_prefs_rename("/plugins/gtk/win32/wintrans", "/plugins/gtk/transparency"); 604 purple_prefs_rename("/plugins/gtk/win32/wintrans", "/plugins/gtk/transparency");
674 } 605
675 606 conv_handle = purple_conversations_get_handle();
676 PURPLE_INIT_PLUGIN(wintrans, init_plugin, info) 607 purple_signal_connect(conv_handle, "conversation-created", plugin,
608 PURPLE_CALLBACK(new_conversation_cb), NULL);
609
610 /* Set callback to remove window from the list, if the window is destroyed */
611 purple_signal_connect(conv_handle, "deleting-conversation", plugin,
612 PURPLE_CALLBACK(conversation_delete_cb), NULL);
613
614 purple_signal_connect(conv_handle, "conversation-dragging", plugin,
615 PURPLE_CALLBACK(set_conv_window_trans), NULL);
616
617 purple_signal_connect(conv_handle, "conversation-updated", plugin,
618 PURPLE_CALLBACK(conv_updated_cb), NULL);
619
620 update_existing_convs();
621
622 window = get_buddy_list_window();
623 if(window != NULL) {
624 blist_created_cb(NULL, NULL);
625 } else {
626 purple_signal_connect(pidgin_blist_get_handle(),
627 "gtkblist-created", plugin,
628 PURPLE_CALLBACK(blist_created_cb), NULL);
629 }
630
631 return TRUE;
632 }
633
634 static gboolean
635 transparency_unload(GPluginPlugin *plugin, GError **error) {
636 GtkWidget *window = NULL;
637
638 purple_debug_info(WINTRANS_PLUGIN_ID, "Unloading transparency plugin\n");
639
640 remove_convs_wintrans(TRUE);
641
642 window = get_buddy_list_window();
643 if (window != NULL) {
644 if (purple_prefs_get_bool(OPT_WINTRANS_BL_ENABLED))
645 set_wintrans(window, 0, FALSE, FALSE);
646
647 /* Remove the focus cbs */
648 g_signal_handlers_disconnect_by_func(G_OBJECT(window),
649 G_CALLBACK(focus_blist_win_cb), window);
650 }
651
652 return TRUE;
653 }
654
655 GPLUGIN_NATIVE_PLUGIN_DECLARE(transparency)
656

mercurial