xfreerdp: handled RAIL window minimize events

This commit is contained in:
Marc-André Moreau 2011-08-21 23:15:19 -04:00
parent f46d3d51c6
commit aaa2f22b10
7 changed files with 72 additions and 2 deletions

View File

@ -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:

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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;
};

View File

@ -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;

View File

@ -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)