⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 win2ktrans.c

📁 Linux下的多协议即时通讯程序源代码
💻 C
📖 第 1 页 / 共 2 页
字号:
/* * purple - Transparency plugin * * copyright (c) 1998-2002, rob flynn <rob@marko.net> * copyright (c) 2002-2003, Herman Bloggs <hermanator12002@yahoo.com> * copyright (c) 2005,      Daniel Atallah <daniel_atallah@yahoo.com> * * this program is free software; you can redistribute it and/or modify * it under the terms of the gnu general public license as published by * the free software foundation; either version 2 of the license, or * (at your option) any later version. * * this program is distributed in the hope that it will be useful, * but without any warranty; without even the implied warranty of * merchantability or fitness for a particular purpose.  see the * gnu general public license for more details. * * you should have received a copy of the gnu general public license * along with this program; if not, write to the free software * foundation, inc., 59 temple place, suite 330, boston, ma  02111-1307  usa * */#ifndef _WIN32_WINNT#define _WIN32_WINNT 0x0500#endif#include <gdk/gdkwin32.h>#include "internal.h"#include "core.h"#include "prefs.h"#include "debug.h"#include "gtkconv.h"#include "gtkplugin.h"#include "gtkprefs.h"#include "gtkblist.h"#include "gtkutils.h"#include "signals.h"#include "version.h"/* *  MACROS & DEFINES */#define WINTRANS_PLUGIN_ID	"gtk-win-trans"#define blist	(purple_get_blist() \		? (PIDGIN_BLIST(purple_get_blist()) \			? ((PIDGIN_BLIST(purple_get_blist()))->window) \			: NULL) \		: NULL)/* *  DATA STRUCTS */typedef struct {	GtkWidget *win;	GtkWidget *slider;} slider_win;/* *  LOCALS */static const char *OPT_WINTRANS_IM_ENABLED= "/plugins/gtk/win32/wintrans/im_enabled";static const char *OPT_WINTRANS_IM_ALPHA  = "/plugins/gtk/win32/wintrans/im_alpha";static const char *OPT_WINTRANS_IM_SLIDER = "/plugins/gtk/win32/wintrans/im_slider";static const char *OPT_WINTRANS_IM_ONFOCUS= "/plugins/gtk/win32/wintrans/im_solid_onfocus";static const char *OPT_WINTRANS_IM_ONTOP  = "/plugins/gtk/win32/wintrans/im_always_on_top";static const char *OPT_WINTRANS_BL_ENABLED= "/plugins/gtk/win32/wintrans/bl_enabled";static const char *OPT_WINTRANS_BL_ALPHA  = "/plugins/gtk/win32/wintrans/bl_alpha";static const char *OPT_WINTRANS_BL_ONFOCUS= "/plugins/gtk/win32/wintrans/bl_solid_onfocus";static const char *OPT_WINTRANS_BL_ONTOP  = "/plugins/gtk/win32/wintrans/bl_always_on_top";static GSList *window_list = NULL;static BOOL (*MySetLayeredWindowAttributes)(HWND hwnd, COLORREF crKey, BYTE bAlpha, DWORD dwFlags) = NULL;/* *  CODE */static GtkWidget *wpurple_button(const char *text, const char *pref, GtkWidget *page) {	GtkWidget *button;	button = gtk_check_button_new_with_mnemonic(text);	gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button),		purple_prefs_get_bool(pref));	gtk_box_pack_start(GTK_BOX(page), button, FALSE, FALSE, 0);	gtk_widget_show(button);	return button;}/* Set window transparency level */static void set_wintrans(GtkWidget *window, int alpha, gboolean enabled,		gboolean always_on_top) {	if (MySetLayeredWindowAttributes) {		HWND hWnd = GDK_WINDOW_HWND(window->window);		LONG style = GetWindowLong(hWnd, GWL_EXSTYLE);		if (enabled) {			style |= WS_EX_LAYERED;		} else {			style &= ~WS_EX_LAYERED;		}		SetWindowLong(hWnd, GWL_EXSTYLE, style);		if (enabled) {			SetWindowPos(hWnd,				always_on_top ? HWND_TOPMOST : HWND_NOTOPMOST,				0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);			MySetLayeredWindowAttributes(hWnd, 0, alpha, LWA_ALPHA);		} else {			/* Ask the window and its children to repaint */			SetWindowPos(hWnd, HWND_NOTOPMOST, 0, 0, 0, 0,				SWP_NOMOVE | SWP_NOSIZE | SWP_NOACTIVATE);			RedrawWindow(hWnd, NULL, NULL,				RDW_ERASE | RDW_INVALIDATE | RDW_FRAME | RDW_ALLCHILDREN);		}	}}/* When a conv window is focused, if we're only transparent when unfocused, * deal with transparency */static gboolean focus_conv_win_cb(GtkWidget *w, GdkEventFocus *e, gpointer d) {	if (purple_prefs_get_bool(OPT_WINTRANS_IM_ENABLED)			&& purple_prefs_get_bool(OPT_WINTRANS_IM_ONFOCUS)) {		GtkWidget *window = (GtkWidget *) d;		if (e->in) { /* Focused */			set_wintrans(window, 0, FALSE,				purple_prefs_get_bool(OPT_WINTRANS_IM_ONTOP));		} else {			set_wintrans(window,				purple_prefs_get_int(OPT_WINTRANS_IM_ALPHA),				TRUE,				purple_prefs_get_bool(OPT_WINTRANS_IM_ONTOP));		}	}	return FALSE;}/* When buddy list window is focused, * if we're only transparent when unfocused, deal with transparency */static gboolean focus_blist_win_cb(GtkWidget *w, GdkEventFocus *e, gpointer d) {	if (purple_prefs_get_bool(OPT_WINTRANS_BL_ENABLED)			&& purple_prefs_get_bool(OPT_WINTRANS_BL_ONFOCUS)) {		GtkWidget *window = (GtkWidget *) d;		if (e->in) { /* Focused */			set_wintrans(window, 0, FALSE,				purple_prefs_get_bool(OPT_WINTRANS_BL_ONTOP));		} else {			set_wintrans(window,				purple_prefs_get_int(OPT_WINTRANS_BL_ALPHA),				TRUE,				purple_prefs_get_bool(OPT_WINTRANS_BL_ONTOP));		}	}	return FALSE;}static void change_alpha(GtkWidget *w, gpointer data) {	int alpha = gtk_range_get_value(GTK_RANGE(w));	purple_prefs_set_int(OPT_WINTRANS_IM_ALPHA, alpha);	/* If we're in no-transparency on focus mode,	 * don't take effect immediately */	if (!purple_prefs_get_bool(OPT_WINTRANS_IM_ONFOCUS))		set_wintrans(GTK_WIDGET(data), alpha, TRUE,			purple_prefs_get_bool(OPT_WINTRANS_IM_ONTOP));}static GtkWidget *wintrans_slider(GtkWidget *win) {	GtkWidget *hbox;	GtkWidget *label, *slider;	GtkWidget *frame;	int imalpha = purple_prefs_get_int(OPT_WINTRANS_IM_ALPHA);	frame = gtk_frame_new(NULL);	gtk_frame_set_shadow_type(GTK_FRAME(frame), GTK_SHADOW_NONE);	gtk_widget_show(frame);	hbox = gtk_hbox_new(FALSE, 5);	gtk_container_add(GTK_CONTAINER(frame), hbox);	label = gtk_label_new(_("Opacity:"));	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 5);	gtk_widget_show(hbox);	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 */	g_signal_connect(GTK_OBJECT(slider), "value-changed",		GTK_SIGNAL_FUNC(change_alpha), win);	gtk_box_pack_start(GTK_BOX(hbox), slider, FALSE, TRUE, 5);	/* Set the initial transparency level */	set_wintrans(win, imalpha, TRUE,		purple_prefs_get_bool(OPT_WINTRANS_IM_ONTOP));	gtk_widget_show_all(hbox);	return frame;}static slider_win* find_slidwin(GtkWidget *win) {	GSList *tmp = window_list;	while (tmp) {		if (((slider_win*) (tmp->data))->win == win)			return (slider_win*) tmp->data;		tmp = tmp->next;	}	return NULL;}/* Clean up transparency stuff for the conv window */static void cleanup_conv_window(PidginWindow *win) {	GtkWidget *window = win->window;	slider_win *slidwin = NULL;	/* Remove window from the window list */	purple_debug_info(WINTRANS_PLUGIN_ID,		"Conv window destroyed... removing from list\n");	if ((slidwin = find_slidwin(window))) {		window_list = g_slist_remove(window_list, slidwin);		g_free(slidwin);	}	/* Remove the focus cbs */	g_signal_handlers_disconnect_by_func(G_OBJECT(window),		G_CALLBACK(focus_conv_win_cb), window);}static void purple_conversation_delete(PurpleConversation *conv) {	PidginWindow *win = pidgin_conv_get_window(PIDGIN_CONVERSATION(conv));	/* If it is the last conversation in the window, cleanup */	if (pidgin_conv_window_get_gtkconv_count(win) == 1)		cleanup_conv_window(win);}static void set_blist_trans(GtkWidget *w, const char *pref) {	gboolean enabled = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(w));	purple_prefs_set_bool(pref, enabled);	if (blist) {		set_wintrans(blist, purple_prefs_get_int(OPT_WINTRANS_BL_ALPHA),			purple_prefs_get_bool(OPT_WINTRANS_BL_ENABLED),			purple_prefs_get_bool(OPT_WINTRANS_IM_ONTOP));	}}static void add_slider(GtkWidget *win) {	GList *wl, *wl1;	GtkWidget *vbox = NULL;	/* Look up this window to see if it already has a slider */	if (!find_slidwin(win)) {		GtkWidget *slider_box = NULL;		slider_win *slidwin = NULL;		GtkRequisition slidereq;		gint width, height;		/* 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 {				purple_debug_error(WINTRANS_PLUGIN_ID,					"no vbox found\n");				return;			}		}		g_list_free(wl1);		slider_box = wintrans_slider(win);		/* Figure out how tall the slider wants to be */		gtk_widget_size_request(slider_box, &slidereq);		gtk_window_get_size(GTK_WINDOW(win), &width, &height);		gtk_box_pack_start(GTK_BOX(vbox),			slider_box, FALSE, FALSE, 0);		/* Make window taller so we don't slowly collapse its message area */		gtk_window_resize(GTK_WINDOW(win), width,			(height + slidereq.height));		/* 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_slist_append(window_list, slidwin);	}}static void remove_sliders() {	if (window_list) {		GSList *tmp = window_list;		while (tmp) {			slider_win *slidwin = (slider_win*) tmp->data;			if (slidwin != NULL &&					GTK_IS_WINDOW(slidwin->win)) {				GtkRequisition slidereq;				gint width, height;				/* Figure out how tall the slider was */				gtk_widget_size_request(					slidwin->slider, &slidereq);				gtk_window_get_size(					GTK_WINDOW(slidwin->win),					&width, &height);				gtk_widget_destroy(slidwin->slider);				gtk_window_resize(					GTK_WINDOW(slidwin->win),					width, (height - slidereq.height));			}			g_free(slidwin);			tmp = tmp->next;		}		g_slist_free(window_list);		window_list = NULL;	}}/* Remove all transparency related aspects from conversation windows */static void remove_convs_wintrans(gboolean remove_signal) {	GList *wins;	for (wins = pidgin_conv_windows_get_list(); wins; wins = wins->next) {		PidginWindow *win = wins->data;		GtkWidget *window = win->window;		if (purple_prefs_get_bool(OPT_WINTRANS_IM_ENABLED))			set_wintrans(window, 0, FALSE, FALSE);		/* Remove the focus cbs */		if (remove_signal)			g_signal_handlers_disconnect_by_func(G_OBJECT(window),				G_CALLBACK(focus_conv_win_cb), window);	}	remove_sliders();}static void set_conv_window_trans(PidginWindow *oldwin, PidginWindow *newwin) {	GtkWidget *win = newwin->window;	/* check prefs to see if we want trans */	if (purple_prefs_get_bool(OPT_WINTRANS_IM_ENABLED)) {		set_wintrans(win, purple_prefs_get_int(OPT_WINTRANS_IM_ALPHA),			TRUE, purple_prefs_get_bool(OPT_WINTRANS_IM_ONTOP));

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -