From aaa2f22b109ce5eef4c9b338dcd0f054e954cded Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Sun, 21 Aug 2011 23:15:19 -0400 Subject: [PATCH] xfreerdp: handled RAIL window minimize events --- client/X11/xf_event.c | 25 ++++++++++++++++++++++++- client/X11/xf_rail.c | 12 ++++++++++++ client/X11/xf_window.c | 26 ++++++++++++++++++++++++++ client/X11/xf_window.h | 1 + include/freerdp/rail/rail.h | 2 ++ include/freerdp/update.h | 6 ++++++ libfreerdp-rail/window.c | 2 +- 7 files changed, 72 insertions(+), 2 deletions(-) diff --git a/client/X11/xf_event.c b/client/X11/xf_event.c index 6e7bda691..c55347fe2 100644 --- a/client/X11/xf_event.c +++ b/client/X11/xf_event.c @@ -418,6 +418,28 @@ boolean xf_event_ConfigureNotify(xfInfo* xfi, XEvent* event, boolean app) return True; } +boolean xf_event_MapNotify(xfInfo* xfi, XEvent* event, boolean app) +{ + xfWindow* xfw; + rdpWindow* window; + + if (app != True) + return True; + + window = window_list_get_by_extra_id(xfi->rail->list, (void*) event->xany.window); + + if (window != NULL) + { + xfw = (xfWindow*) window->extra; + + /* local maximize event */ + + XFlush(xfi->display); + } + + return True; +} + boolean xf_event_process(freerdp* instance, XEvent* event) { boolean app = False; @@ -434,7 +456,7 @@ boolean xf_event_process(freerdp* instance, XEvent* event) app = True; } -#if 0 +#if 1 if (event->type != MotionNotify) printf("X11 %s Event\n", X11_EVENT_STRINGS[event->type]); #endif @@ -496,6 +518,7 @@ boolean xf_event_process(freerdp* instance, XEvent* event) break; case MapNotify: + status = xf_event_MapNotify(xfi, event, app); break; case ReparentNotify: diff --git a/client/X11/xf_rail.c b/client/X11/xf_rail.c index f6051c7f4..5e3daa9bc 100644 --- a/client/X11/xf_rail.c +++ b/client/X11/xf_rail.c @@ -100,6 +100,17 @@ void xf_rail_MoveWindow(rdpRail* rail, rdpWindow* window) window->windowWidth, window->windowHeight); } +void xf_rail_ShowWindow(rdpRail* rail, rdpWindow* window, uint8 state) +{ + xfInfo* xfi; + xfWindow* xfw; + + xfi = (xfInfo*) rail->extra; + xfw = (xfWindow*) window->extra; + + xf_ShowWindow((xfInfo*) rail->extra, xfw, state); +} + void xf_rail_SetWindowText(rdpRail* rail, rdpWindow* window) { xfInfo* xfi; @@ -137,6 +148,7 @@ void xf_rail_register_callbacks(xfInfo* xfi, rdpRail* rail) rail->extra = (void*) xfi; rail->CreateWindow = xf_rail_CreateWindow; rail->MoveWindow = xf_rail_MoveWindow; + rail->ShowWindow = xf_rail_ShowWindow; rail->SetWindowText = xf_rail_SetWindowText; rail->SetWindowIcon = xf_rail_SetWindowIcon; rail->DestroyWindow = xf_rail_DestroyWindow; diff --git a/client/X11/xf_window.c b/client/X11/xf_window.c index 2de350bf8..b802bd129 100644 --- a/client/X11/xf_window.c +++ b/client/X11/xf_window.c @@ -309,6 +309,32 @@ void xf_MoveWindow(xfInfo* xfi, xfWindow* window, int x, int y, int width, int h window->height = height; } +void xf_ShowWindow(xfInfo* xfi, xfWindow* window, uint8 state) +{ + printf("xf_ShowWindow:%d\n", state); + + switch (state) + { + case WINDOW_HIDE: + XIconifyWindow(xfi->display, window->handle, xfi->screen_number); + break; + + case WINDOW_SHOW_MINIMIZED: + XIconifyWindow(xfi->display, window->handle, xfi->screen_number); + break; + + case WINDOW_SHOW_MAXIMIZED: + XRaiseWindow(xfi->display, window->handle); + break; + + case WINDOW_SHOW: + XRaiseWindow(xfi->display, window->handle); + break; + } + + XFlush(xfi->display); +} + void xf_SetWindowIcon(xfInfo* xfi, xfWindow* window, rdpIcon* icon) { Atom atom; diff --git a/client/X11/xf_window.h b/client/X11/xf_window.h index dace12bc3..0ace1b11c 100644 --- a/client/X11/xf_window.h +++ b/client/X11/xf_window.h @@ -51,6 +51,7 @@ xfWindow* desktop_create(xfInfo* xfi, char* name); xfWindow* xf_CreateWindow(xfInfo* xfi, int x, int y, int width, int height, char* name); void xf_MoveWindow(xfInfo* xfi, xfWindow* window, int x, int y, int width, int height); +void xf_ShowWindow(xfInfo* xfi, xfWindow* window, uint8 state); void xf_SetWindowIcon(xfInfo* xfi, xfWindow* window, rdpIcon* icon); void xf_DestroyWindow(xfInfo* xfi, xfWindow* window); diff --git a/include/freerdp/rail/rail.h b/include/freerdp/rail/rail.h index 30894fe18..371e8c484 100644 --- a/include/freerdp/rail/rail.h +++ b/include/freerdp/rail/rail.h @@ -36,6 +36,7 @@ typedef struct rdp_rail rdpRail; typedef void (*railCreateWindow)(rdpRail* rail, rdpWindow* window); typedef void (*railDestroyWindow)(rdpRail* rail, rdpWindow* window); typedef void (*railMoveWindow)(rdpRail* rail, rdpWindow* window); +typedef void (*railShowWindow)(rdpRail* rail, rdpWindow* window, uint8 state); typedef void (*railSetWindowText)(rdpRail* rail, rdpWindow* window); typedef void (*railSetWindowIcon)(rdpRail* rail, rdpWindow* window, rdpIcon* icon); @@ -50,6 +51,7 @@ struct rdp_rail railCreateWindow CreateWindow; railDestroyWindow DestroyWindow; railMoveWindow MoveWindow; + railShowWindow ShowWindow; railSetWindowText SetWindowText; railSetWindowIcon SetWindowIcon; }; diff --git a/include/freerdp/update.h b/include/freerdp/update.h index 3d9ce52cd..1398f02c5 100644 --- a/include/freerdp/update.h +++ b/include/freerdp/update.h @@ -867,6 +867,12 @@ typedef struct _SURFACE_BITS_COMMAND SURFACE_BITS_COMMAND; #define WINDOW_ORDER_FIELD_DESKTOP_ZORDER 0x00000010 #define WINDOW_ORDER_FIELD_DESKTOP_ACTIVE_WND 0x00000020 +/* Window Show States */ +#define WINDOW_HIDE 0x00 +#define WINDOW_SHOW_MINIMIZED 0x02 +#define WINDOW_SHOW_MAXIMIZED 0x03 +#define WINDOW_SHOW 0x05 + /* Update Interface */ typedef struct rdp_update rdpUpdate; diff --git a/libfreerdp-rail/window.c b/libfreerdp-rail/window.c index 19370aa6c..f28055b64 100644 --- a/libfreerdp-rail/window.c +++ b/libfreerdp-rail/window.c @@ -173,7 +173,7 @@ void rail_UpdateWindow(rdpRail* rail, rdpWindow* window) if (window->fieldFlags & WINDOW_ORDER_FIELD_SHOW) { - + IFCALL(rail->ShowWindow, rail, window, window->showState); } if (window->fieldFlags & WINDOW_ORDER_FIELD_TITLE)