# HG changeset patch # User Luke Schierer # Date 1084768754 0 # Node ID 92e061a1db1014b32ffde8071cdc54cdb7c9380b # Parent 7c008d98ef331326ca9152f4c71d2d72b075b52e [gaim-migrate @ 9735] (00:36:18) SimGuy: LSchiere: this is a patch to the wintrans plugin that does the following: (00:36:26) SimGuy: 1) Switches gaim_debug(FOO, ...) to gaim_debug_foo(...) (00:36:26) SimGuy: 2) Fixes a very old bug: (00:36:26) SimGuy: #781234 Transparency fails when dragging convo tab out of trans win (00:36:28) SimGuy: 3) Makes the preference changes take effect immediately, rather than only on new conversation windows, including enabling/disabling conversation window transparency and sliders. committer: Tailor Script diff -r 7c008d98ef33 -r 92e061a1db10 ChangeLog --- a/ChangeLog Mon May 17 02:40:04 2004 +0000 +++ b/ChangeLog Mon May 17 04:39:14 2004 +0000 @@ -36,6 +36,7 @@ * Print Gadu-Gadu messages to the debug window instead of the console * New tabs should scroll correctly again (Tim Ringenbach) * Ampersands in links should work right (Tim Ringenbach) + * Win32 transparency plugin fixes (Kevin Stange) Preference Changes: * Added a "none" smiley theme to replace the "Show graphical diff -r 7c008d98ef33 -r 92e061a1db10 plugins/win32/transparency/win2ktrans.c --- a/plugins/win32/transparency/win2ktrans.c Mon May 17 02:40:04 2004 +0000 +++ b/plugins/win32/transparency/win2ktrans.c Mon May 17 04:39:14 2004 +0000 @@ -104,7 +104,7 @@ if(MySetLayeredWindowAttributes) { HWND hWnd = GDK_WINDOW_HWND(window->window); SetWindowLong(hWnd, GWL_EXSTYLE, GetWindowLong(hWnd, GWL_EXSTYLE) & ~WS_EX_LAYERED); - + /* Ask the window and its children to repaint */ RedrawWindow(hWnd, NULL, NULL, RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN); } @@ -165,7 +165,7 @@ gboolean win_destroy_cb(GtkWidget *widget, GdkEvent *event, gpointer user_data) { slider_win *slidwin=NULL; /* Remove window from the window list */ - gaim_debug(GAIM_DEBUG_INFO, WINTRANS_PLUGIN_ID, "Conv window destoyed.. removing from list\n"); + gaim_debug_info(WINTRANS_PLUGIN_ID, "Conv window destoyed.. removing from list\n"); if((slidwin=find_slidwin(widget))) { window_list = g_list_remove(window_list, (gpointer)slidwin); @@ -174,60 +174,116 @@ return FALSE; } -static void gaim_new_conversation(GaimConversation *c) { +static void set_trans_option(GtkWidget *w, const char *pref) { + gaim_prefs_set_bool(pref, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))); + if(pref == OPT_WINTRANS_BL_ENABLED) { + if(blist) { + if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) + set_wintrans(blist, blalpha); + else + set_wintrans_off(blist); + } + } +} + +static void add_slider(GtkWidget *win) { GList *wl, *wl1; GtkWidget *vbox=NULL; - GtkWidget *win=NULL; - GaimGtkConversation *gtkconv; - GaimGtkWindow *gtkwin; + + /* Look up this window to see if it already has a slider */ + if(!find_slidwin(win)) { + GtkWidget *slider_box=NULL; + slider_win *slidwin=NULL; + + /* Get top vbox */ + for ( wl1 = wl = gtk_container_get_children(GTK_CONTAINER(win)); + wl != NULL; + wl = wl->next ) { + if ( GTK_IS_VBOX(GTK_OBJECT(wl->data)) ) + vbox = GTK_WIDGET(wl->data); + else { + gaim_debug_error(WINTRANS_PLUGIN_ID, "no vbox found\n"); + return; + } + } + g_list_free(wl1); + + slider_box = wintrans_slider(win); + gtk_box_pack_start(GTK_BOX(vbox), + slider_box, + FALSE, FALSE, 0); + /* Add window to list, to track that it has a slider */ + slidwin = g_new0( slider_win, 1 ); + slidwin->win = win; + slidwin->slider = slider_box; + window_list = g_list_append(window_list, (gpointer)slidwin); + /* Set callback to remove window from the list, if the window is destroyed */ + g_signal_connect(GTK_OBJECT(win), "destroy_event", G_CALLBACK(win_destroy_cb), NULL); + } +} - gtkconv = GAIM_GTK_CONVERSATION(c); - gtkwin = GAIM_GTK_WINDOW(gaim_conversation_get_window(c)); +static void remove_sliders() { + if(window_list) { + GList *tmp=window_list; + while(tmp) { + slider_win *slidwin = (slider_win*)tmp->data; + gtk_widget_destroy(slidwin->slider); + g_free(slidwin); + tmp=tmp->next; + } + g_list_free(window_list); + window_list = NULL; + } +} + +static void remove_convs_wintrans() { + GList *conv; + + for(conv = gaim_get_conversations(); conv != NULL; conv = conv->next) + set_wintrans_off(GAIM_GTK_WINDOW(gaim_conversation_get_window(conv->data))->window); +} - win = gtkwin->window; +static void update_convs_wintrans(GtkWidget *w, const char *pref) { + GList *conv; + + if (w != NULL) + set_trans_option(w, pref); + + if(gaim_prefs_get_bool(OPT_WINTRANS_IM_ENABLED)) { + for(conv = gaim_get_conversations(); conv != NULL; conv = conv->next) + set_wintrans(GAIM_GTK_WINDOW(gaim_conversation_get_window(conv->data))->window, gaim_prefs_get_int(OPT_WINTRANS_IM_ALPHA)); + } + else + remove_convs_wintrans(); + + if(gaim_prefs_get_bool(OPT_WINTRANS_IM_SLIDER) + && gaim_prefs_get_bool(OPT_WINTRANS_IM_ENABLED)) { + for(conv = gaim_get_conversations(); conv != NULL; conv = conv->next) + add_slider(GAIM_GTK_WINDOW(gaim_conversation_get_window(conv->data))->window); + } + else + remove_sliders(); +} + +static void set_window_trans(GaimConvWindow *oldwin, GaimConvWindow *newwin) { + GtkWidget *win = GAIM_GTK_WINDOW(newwin)->window; /* check prefs to see if we want trans */ if (gaim_prefs_get_bool(OPT_WINTRANS_IM_ENABLED) && gaim_prefs_get_bool(OPT_WINTRANS_IM_SLIDER)) { - /* Look up this window to see if it already has a slider */ - if(!find_slidwin(win)) { - GtkWidget *slider_box=NULL; - slider_win *slidwin=NULL; - - /* Get top vbox */ - for ( wl1 = wl = gtk_container_get_children(GTK_CONTAINER(win)); - wl != NULL; - wl = wl->next ) { - if ( GTK_IS_VBOX(GTK_OBJECT(wl->data)) ) - vbox = GTK_WIDGET(wl->data); - else { - gaim_debug(GAIM_DEBUG_ERROR, WINTRANS_PLUGIN_ID, "no vbox found\n"); - return; - } - } - g_list_free(wl1); + add_slider(win); + } - slider_box = wintrans_slider(win); - gtk_box_pack_start(GTK_BOX(vbox), - slider_box, - FALSE, FALSE, 0); - /* Add window to list, to track that it has a slider */ - slidwin = g_new0( slider_win, 1 ); - slidwin->win = win; - slidwin->slider = slider_box; - window_list = g_list_append(window_list, (gpointer)slidwin); - /* Set callback to remove window from the list, if the window is destroyed */ - g_signal_connect(GTK_OBJECT(win), "destroy_event", G_CALLBACK(win_destroy_cb), NULL); - } - else - return; - } - if(gaim_prefs_get_bool(OPT_WINTRANS_IM_ENABLED) && !gaim_prefs_get_bool(OPT_WINTRANS_IM_SLIDER)) { set_wintrans(win, imalpha); } } +static void gaim_new_conversation(GaimConversation *c) { + GaimConvWindow *win = gaim_conversation_get_window(c); + set_window_trans(NULL, win); +} + static void blist_created() { if(blist) { if(gaim_prefs_get_bool(OPT_WINTRANS_BL_ENABLED)) @@ -239,7 +295,11 @@ static void alpha_change(GtkWidget *w, gpointer data) { int *alpha = (int*)data; + GList *conv; *alpha = gtk_range_get_value(GTK_RANGE(w)); + + for(conv = gaim_get_conversations(); conv != NULL; conv = conv->next) + set_wintrans(GAIM_GTK_WINDOW(gaim_conversation_get_window(conv->data))->window, *alpha); } static void alpha_pref_set_int(GtkWidget *w, GdkEventFocus *e, const char *pref) { @@ -258,18 +318,6 @@ change_alpha(w, blist); } -static void set_trans_option(GtkWidget *w, const char *pref) { - gaim_prefs_set_bool(pref, gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))); - if(pref == OPT_WINTRANS_BL_ENABLED) { - if(blist) { - if(gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w))) - set_wintrans(blist, blalpha); - else - set_wintrans_off(blist); - } - } -} - /* * EXPORTED FUNCTIONS */ @@ -285,6 +333,10 @@ gaim_signal_connect((void*)gaim_connections_get_handle(), "signed-on", plugin, GAIM_CALLBACK(blist_created), NULL); MySetLayeredWindowAttributes = (void*)wgaim_find_and_loadproc("user32.dll", "SetLayeredWindowAttributes" ); + gaim_signal_connect((void*)gaim_gtk_conversations_get_handle(), "conversation-drag-ended", plugin, GAIM_CALLBACK(set_window_trans), NULL); + + update_convs_wintrans(NULL, NULL); + if(blist) { blist_created(); } @@ -293,21 +345,10 @@ } G_MODULE_EXPORT gboolean plugin_unload(GaimPlugin *plugin) { - gaim_debug(GAIM_DEBUG_INFO, WINTRANS_PLUGIN_ID, "Removing win2ktrans.dll plugin\n"); + gaim_debug_info(WINTRANS_PLUGIN_ID, "Removing win2ktrans.dll plugin\n"); - /* Remove slider bars */ - if(window_list) { - GList *tmp=window_list; - while(tmp) { - slider_win *slidwin = (slider_win*)tmp->data; - gtk_widget_destroy(slidwin->slider); - set_wintrans_off(slidwin->win); - g_free(slidwin); - tmp=tmp->next; - } - g_list_free(window_list); - window_list = NULL; - } + remove_convs_wintrans(); + if(blist) { set_wintrans_off(blist); } @@ -328,7 +369,7 @@ /* IM Convo trans options */ imtransbox = gaim_gtk_make_frame (ret, _("IM Conversation Windows")); button = wgaim_button(_("_IM window transparency"), OPT_WINTRANS_IM_ENABLED, imtransbox); - gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(set_trans_option), (void *)OPT_WINTRANS_IM_ENABLED); + gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(update_convs_wintrans), (void *)OPT_WINTRANS_IM_ENABLED); trans_box = gtk_vbox_new(FALSE, 18); if (!gaim_prefs_get_bool(OPT_WINTRANS_IM_ENABLED)) @@ -338,7 +379,7 @@ gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(gaim_gtk_toggle_sensitive), trans_box); button = wgaim_button(_("_Show slider bar in IM window"), OPT_WINTRANS_IM_SLIDER, trans_box); - gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(set_trans_option), (void *)OPT_WINTRANS_IM_SLIDER); + gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(update_convs_wintrans), (void *)OPT_WINTRANS_IM_SLIDER); gtk_box_pack_start(GTK_BOX(imtransbox), trans_box, FALSE, FALSE, 5); @@ -394,7 +435,7 @@ /* If this version of Windows dosn't support Transparency, grey out options */ if(!has_transparency()) { - gaim_debug(GAIM_DEBUG_WARNING, WINTRANS_PLUGIN_ID, "This version of windows dosn't support transparency\n"); + gaim_debug_warning(WINTRANS_PLUGIN_ID, "This version of windows dosn't support transparency\n"); gtk_widget_set_sensitive(GTK_WIDGET(imtransbox), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(button), FALSE); gtk_widget_set_sensitive(GTK_WIDGET(trans_box), FALSE);