# HG changeset patch # User Herman Bloggs # Date 1038712107 0 # Node ID a997156437b6170a8fbe093e3c8a08e2bb360361 # Parent 0d8b71d0d8f848220ff24ff645c994c5ee619506 [gaim-migrate @ 4230] Win prefs page w/ transparency option added committer: Tailor Script diff -r 0d8b71d0d8f8 -r a997156437b6 src/Makefile.mingw --- a/src/Makefile.mingw Sun Dec 01 03:04:09 2002 +0000 +++ b/src/Makefile.mingw Sun Dec 01 03:08:27 2002 +0000 @@ -103,7 +103,8 @@ win32/win32dep.c \ win32/MinimizeToTray.c \ win32/libc_interface.c \ - win32/systray.c + win32/systray.c \ + win32/winprefs.c RC_SRC = win32/gaimrc.rc diff -r 0d8b71d0d8f8 -r a997156437b6 src/conversation.c --- a/src/conversation.c Sun Dec 01 03:04:09 2002 +0000 +++ b/src/conversation.c Sun Dec 01 03:08:27 2002 +0000 @@ -49,7 +49,7 @@ #include "prpl.h" #ifdef _WIN32 -#include /* fog getpid() */ +#include /* for getpid() */ #include #include "win32dep.h" #endif @@ -2783,6 +2783,17 @@ menubar = build_conv_menubar(c); gtk_box_pack_start(GTK_BOX(testidea), menubar, FALSE, TRUE, 0); gtk_box_pack_start(GTK_BOX(testidea), convo_notebook, TRUE, TRUE, 0); +#ifdef _WIN32 + /* Windows transparency slider */ + if ((wgaim_options & OPT_WGAIM_IMTRANS) && + (wgaim_options & OPT_WGAIM_SHOW_IMTRANS)) { + gtk_box_pack_start(GTK_BOX(testidea), + wgaim_wintrans_slider(win), + FALSE, FALSE, 0); + } else if(wgaim_options & OPT_WGAIM_IMTRANS) { + wgaim_set_wintrans(win, wgaim_get_imalpha()); + } +#endif gtk_widget_show(testidea); gtk_widget_show(convo_notebook); convo_menubar = menubar; @@ -2790,7 +2801,6 @@ gtk_container_add(GTK_CONTAINER(win), testidea); gtk_signal_connect(GTK_OBJECT(convo_notebook), "switch-page", GTK_SIGNAL_FUNC(convo_switch), NULL); - } else win = c->window = all_convos; @@ -2811,7 +2821,8 @@ gtk_box_pack_start(GTK_BOX(tabby), c->close, FALSE, FALSE, 0); gtk_widget_show_all(tabby); gtk_notebook_insert_page(GTK_NOTEBOOK(convo_notebook), cont, tabby, - g_list_index(conversations, c)); + g_list_index(conversations, c)); + gtk_widget_show(cont); } else { cont = win = gtk_window_new(GTK_WINDOW_TOPLEVEL); @@ -2917,6 +2928,23 @@ gtk_box_pack_start(GTK_BOX(vbox2), bbox, FALSE, FALSE, 0); gtk_widget_show(bbox); +#ifdef _WIN32 + /* Windows transparency slider */ + if ((wgaim_options & OPT_WGAIM_IMTRANS) && + (wgaim_options & OPT_WGAIM_SHOW_IMTRANS) && + !(im_options & OPT_IM_ONE_WINDOW)) { + GtkWidget *wsep = gtk_hseparator_new(); + gtk_box_pack_start(GTK_BOX(vbox2), wsep, FALSE, FALSE, 0); + gtk_widget_show(wsep); + gtk_box_pack_start(GTK_BOX(vbox2), + wgaim_wintrans_slider(c->window), + FALSE, FALSE, 0); + } else if((wgaim_options & OPT_WGAIM_IMTRANS) && + !(im_options & OPT_IM_ONE_WINDOW)) { + wgaim_set_wintrans(win, wgaim_get_imalpha()); + } +#endif + /* I'm leaving this here just incase we want to bring this back. I'd rather not have the close * button any more. If we do, though, it needs to be on the left side. I might bring it back and put * it on that side. */ diff -r 0d8b71d0d8f8 -r a997156437b6 src/gaimrc.c --- a/src/gaimrc.c Sun Dec 01 03:04:09 2002 +0000 +++ b/src/gaimrc.c Sun Dec 01 03:08:27 2002 +0000 @@ -57,6 +57,9 @@ guint sound_options; guint away_options; guint away_resend; +#ifdef _WIN32 +guint wgaim_options; +#endif int report_idle; int web_browser; @@ -170,8 +173,9 @@ return 6; } else if (!strcmp(tag, "proxy")) { return 7; + } else if (!strcmp(tag, "wgaim")) { + return 8; } - return -1; } @@ -765,6 +769,10 @@ } else if (!strcmp(p->option, "away_options")) { away_options = atoi(p->value[0]); away_resend = atoi(p->value[1]); +#ifdef _WIN32 + } else if(!strcmp(p->option, "wgaim_options")) { + wgaim_options = atoi(p->value[0]); +#endif } else if (!strcmp(p->option, "font_face")) { g_snprintf(fontface, sizeof(fontface), "%s", p->value[0]); } else if (!strcmp(p->option, "font_size")) { @@ -873,7 +881,9 @@ fprintf(f, "\tfont_options { %u }\n", font_options); fprintf(f, "\tsound_options { %u }\n", sound_options); fprintf(f, "\taway_options { %u } { %u }\n", away_options, away_resend); - +#ifdef _WIN32 + fprintf(f, "\twgaim_options { %u }\n", wgaim_options); +#endif fprintf(f, "\tfont_face { %s }\n", fontface); fprintf(f, "\tfont_size { %d }\n", fontsize); fprintf(f, "\tforeground { %d } { %d } { %d }\n", fgcolor.red, fgcolor.green, fgcolor.blue); @@ -1120,6 +1130,37 @@ fprintf(f, "}\n"); } +#ifdef _WIN32 +static void gaimrc_read_wgaim(FILE *f) +{ + char buf[2048]; + struct parse parse_buffer; + struct parse *p; + + buf[0] = 0; + + while (buf[0] != '}') { + if (buf[0] == '#') + continue; + + if (!fgets(buf, sizeof(buf), f)) + return; + + p = parse_line(buf, &parse_buffer); + + if (!strcmp(p->option, "imalpha")) { + wgaim_set_imalpha(atoi(p->value[0])); + } + } +} + +static void gaimrc_write_wgaim(FILE *f) +{ + fprintf(f, "wgaim {\n"); + fprintf(f, "\timalpha { %d }\n", wgaim_get_imalpha()); + fprintf(f, "}\n"); +} +#endif static void set_defaults() { @@ -1165,6 +1206,10 @@ away_options = OPT_AWAY_BACK_ON_IM; +#ifdef _WIN32 + wgaim_options = 0; +#endif + for (i = 0; i < NUM_SOUNDS; i++) sound_file[i] = NULL; font_options = 0; @@ -1259,6 +1304,11 @@ case 7: gaimrc_read_proxy(f); break; +#ifdef _WIN32 + case 8: + gaimrc_read_wgaim(f); + break; +#endif default: /* NOOP */ break; @@ -1300,6 +1350,9 @@ gaimrc_write_plugins(f); #endif gaimrc_write_proxy(f); +#ifdef _WIN32 + gaimrc_write_wgaim(f); +#endif fclose(f); chmod(buf, S_IRUSR | S_IWUSR); diff -r 0d8b71d0d8f8 -r a997156437b6 src/prefs.c --- a/src/prefs.c Sun Dec 01 03:04:09 2002 +0000 +++ b/src/prefs.c Sun Dec 01 03:08:27 2002 +0000 @@ -39,6 +39,10 @@ #include "prpl.h" #include "proxy.h" +#ifdef _WIN32 +#include "win32dep.h" +#endif + char fontface[128]; GtkWidget *tree_v = NULL; @@ -59,7 +63,7 @@ GtkCTreeNode *general_node = NULL; GtkCTreeNode *deny_node = NULL; GtkWidget *prefs_proxy_frame = NULL; -static GtkWidget *gaim_button(const char *, guint *, int, GtkWidget *); +GtkWidget *gaim_button(const char *, guint *, int, GtkWidget *); GtkWidget *gaim_labeled_spin_button(GtkWidget *, const gchar *, int*, int, int, GtkSizeGroup *); static GtkWidget *gaim_dropdown(GtkWidget *, const gchar *, int *, int, ...); static GtkWidget *show_color_pref(GtkWidget *, gboolean); @@ -1394,6 +1398,9 @@ prefs_notebook_add_page(_("Sound Events"), NULL, sound_events_page(), &c, &p, notebook_page++); prefs_notebook_add_page(_("Away / Idle"), NULL, away_page(), &p, NULL, notebook_page++); prefs_notebook_add_page(_("Away Messages"), NULL, away_message_page(), &c, &p, notebook_page++); +#ifdef _WIN32 + prefs_notebook_add_page(_("Windows Only"), NULL, wgaim_winprefs_page(), &p, NULL, notebook_page++); +#endif #if USE_PLUGINS prefs_notebook_add_page(_("Plugins"), NULL, plugin_page(), &plugin_iter, NULL, notebook_page++); while (l) { @@ -1741,6 +1748,14 @@ save_prefs(); } +#ifdef _WIN32 +static void set_wgaim_option(GtkWidget *w, int option) +{ + wgaim_options ^= option; + save_prefs(); +} +#endif + GtkWidget *gaim_button(const char *text, guint *options, int option, GtkWidget *page) { GtkWidget *button; @@ -1749,7 +1764,7 @@ gtk_box_pack_start(GTK_BOX(page), button, FALSE, FALSE, 0); gtk_object_set_user_data(GTK_OBJECT(button), options); - if (options == &misc_options) + if (options == &misc_options) gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(set_misc_option), (int *)option); if (options == &logging_options) @@ -1773,10 +1788,11 @@ if (options == &sound_options) gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(set_sound_option), (int *)option); - if (options == &away_options) - gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(set_away_option), +#ifdef _WIN32 + if (options == &wgaim_options) + gtk_signal_connect(GTK_OBJECT(button), "clicked", GTK_SIGNAL_FUNC(set_wgaim_option), (int *)option); - +#endif gtk_widget_show(button); return button; diff -r 0d8b71d0d8f8 -r a997156437b6 src/win32/mingw_plus/winuser_extra.h --- a/src/win32/mingw_plus/winuser_extra.h Sun Dec 01 03:04:09 2002 +0000 +++ b/src/win32/mingw_plus/winuser_extra.h Sun Dec 01 03:08:27 2002 +0000 @@ -27,4 +27,13 @@ DWORD dwTimeout; } FLASHWINFO, *PFLASHWINFO; +/* These defines aren't found in the current version of mingw */ +#ifndef LWA_ALPHA +#define LWA_ALPHA 0x00000002 +#endif + +#ifndef WS_EX_LAYERED +#define WS_EX_LAYERED 0x00080000 +#endif + #endif /* _WINUSER_EXTRA_H_ */ diff -r 0d8b71d0d8f8 -r a997156437b6 src/win32/win32dep.c --- a/src/win32/win32dep.c Sun Dec 01 03:04:09 2002 +0000 +++ b/src/win32/win32dep.c Sun Dec 01 03:08:27 2002 +0000 @@ -40,7 +40,7 @@ static char lib_dir[MAXPATHLEN]; static char locale_dir[MAXPATHLEN]; static int bhide_icon; - +static int imalpha = 255; /* * GLOBALS @@ -52,7 +52,8 @@ * PROTOS */ BOOL (*MyFlashWindowEx)(PFLASHWINFO pfwi)=NULL; - +BOOL (*MySetLayeredWindowAttributes)(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags)=NULL; +void wgaim_set_wintrans(GtkWidget *window, int trans); /* * STATIC CODE @@ -104,12 +105,17 @@ } } - -void load_winver_specific_procs(void) { +static void load_winver_specific_procs(void) { /* Used for Win98+ and WinNT5+ */ MyFlashWindowEx = (void*)find_and_loadproc("user32.dll", "FlashWindowEx" ); + /* Used for Win2k+ */ + MySetLayeredWindowAttributes = (void*)find_and_loadproc("user32.dll", "SetLayeredWindowAttributes" ); } +/* Transparency slider callbacks */ +static void change_im_alpha(GtkWidget *w, gpointer data) { + wgaim_set_wintrans(GTK_WIDGET(data), gtk_range_get_value(GTK_RANGE(w))); +} /* * PUBLIC CODE @@ -181,6 +187,52 @@ } } +/* Set window transparency level */ +void wgaim_set_wintrans(GtkWidget *window, int trans) { + if(MySetLayeredWindowAttributes) { + HWND hWnd = GDK_WINDOW_HWND(window->window); + SetWindowLong(hWnd,GWL_EXSTYLE,GetWindowLong(hWnd,GWL_EXSTYLE) | WS_EX_LAYERED); + MySetLayeredWindowAttributes(hWnd,0,trans,LWA_ALPHA); + } +} + +void wgaim_set_imalpha(int val) { + imalpha = val; +} + +int wgaim_get_imalpha(int val) { + return imalpha; +} + +int wgaim_has_transparency() { + return MySetLayeredWindowAttributes ? TRUE : FALSE; +} + +GtkWidget *wgaim_wintrans_slider(GtkWidget *win) { + GtkWidget *hbox; + GtkWidget *label, *slider; + + hbox = gtk_hbox_new(FALSE, 5); + + label = gtk_label_new(_("Opacity:")); + gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5); + + slider = gtk_hscale_new_with_range(50,255,1); + gtk_range_set_value(GTK_RANGE(slider), imalpha); + gtk_widget_set_usize(GTK_WIDGET(slider), 200, -1); + + /* On slider val change, update window's transparency level */ + gtk_signal_connect(GTK_OBJECT(slider), "value-changed", GTK_SIGNAL_FUNC(change_im_alpha), win); + gtk_box_pack_start(GTK_BOX(hbox), slider, FALSE, TRUE, 5); + + /* Set the initial transparency level */ + wgaim_set_wintrans(win, imalpha); + + gtk_widget_show_all(hbox); + + return hbox; +} + /* Windows Initializations */ void wgaim_init(void) { diff -r 0d8b71d0d8f8 -r a997156437b6 src/win32/win32dep.h --- a/src/win32/win32dep.h Sun Dec 01 03:04:09 2002 +0000 +++ b/src/win32/win32dep.h Sun Dec 01 03:08:27 2002 +0000 @@ -10,6 +10,7 @@ #include "winerror.h" #include "libc_interface.h" #include "systray.h" +#include "winprefs.h" /* * PROTOS @@ -21,6 +22,11 @@ /* Misc */ HINSTANCE wgaim_hinstance(void); extern void wgaim_im_blink(GtkWidget*); +extern GtkWidget *wgaim_wintrans_slider(GtkWidget*); +extern void wgaim_set_wintrans(GtkWidget*, int); +extern void wgaim_set_imalpha(int); +extern int wgaim_get_imalpha(); +extern int wgaim_has_transparency(); /* Determine Gaim paths */ extern char* wgaim_install_dir(void);