server: Implemented the server side of Get/SetLayeredWindowAttributes.
diff --git a/server/window.c b/server/window.c
index dedb120..3cd767e 100644
--- a/server/window.c
+++ b/server/window.c
@@ -79,6 +79,10 @@
void* instance; /* creator instance */
unsigned int is_unicode : 1; /* ANSI or unicode */
unsigned int is_linked : 1; /* is it linked into the parent z-order list? */
+ unsigned int is_layered : 1; /* has layered info been set? */
+ unsigned int color_key; /* color key for a layered window */
+ unsigned int alpha; /* alpha value for a layered window */
+ unsigned int layered_flags; /* flags for a layered window */
unsigned long user_data; /* user-specific data */
WCHAR *text; /* window caption text */
unsigned int paint_flags; /* various painting flags */
@@ -479,6 +483,7 @@
win->instance = NULL;
win->is_unicode = 1;
win->is_linked = 0;
+ win->is_layered = 0;
win->user_data = 0;
win->text = NULL;
win->paint_flags = 0;
@@ -1873,6 +1878,7 @@
/* WS_EX_TOPMOST can only be changed for unlinked windows */
if (!win->is_linked) win->ex_style = req->ex_style;
else win->ex_style = (req->ex_style & ~WS_EX_TOPMOST) | (win->ex_style & WS_EX_TOPMOST);
+ if (!(win->ex_style & WS_EX_LAYERED)) win->is_layered = 0;
}
if (req->flags & SET_WIN_ID) win->id = req->id;
if (req->flags & SET_WIN_INSTANCE) win->instance = req->instance;
@@ -2468,3 +2474,39 @@
progman_window = new_progman_window;
taskman_window = new_taskman_window;
}
+
+/* retrieve layered info for a window */
+DECL_HANDLER(get_window_layered_info)
+{
+ struct window *win = get_window( req->handle );
+
+ if (!win) return;
+
+ if (win->is_layered)
+ {
+ reply->color_key = win->color_key;
+ reply->alpha = win->alpha;
+ reply->flags = win->layered_flags;
+ }
+ else set_win32_error( ERROR_INVALID_WINDOW_HANDLE );
+}
+
+
+/* set layered info for a window */
+DECL_HANDLER(set_window_layered_info)
+{
+ struct window *win = get_window( req->handle );
+
+ if (!win) return;
+
+ if (win->ex_style & WS_EX_LAYERED)
+ {
+ if (req->flags & LWA_ALPHA) win->alpha = req->alpha;
+ else if (!win->is_layered) win->alpha = 0; /* alpha init value is 0 */
+
+ win->color_key = req->color_key;
+ win->layered_flags = req->flags;
+ win->is_layered = 1;
+ }
+ else set_win32_error( ERROR_INVALID_WINDOW_HANDLE );
+}