commit
de826c3dd2
@ -69,12 +69,7 @@ static const char* const X11_EVENT_STRINGS[] =
|
||||
};
|
||||
#endif
|
||||
|
||||
void xf_send_mouse_motion_event(rdpInput* input, boolean down, uint32 button, uint16 x, uint16 y)
|
||||
{
|
||||
input->MouseEvent(input, PTR_FLAGS_MOVE, x, y);
|
||||
}
|
||||
|
||||
boolean xf_event_Expose(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_Expose(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
int x, y;
|
||||
int w, h;
|
||||
@ -106,55 +101,51 @@ boolean xf_event_Expose(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_VisibilityNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_VisibilityNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
xfi->unobscured = event->xvisibility.state == VisibilityUnobscured;
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_MotionNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_MotionNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
rdpInput* input;
|
||||
int x, y;
|
||||
Window childWindow;
|
||||
|
||||
input = xfi->instance->input;
|
||||
x = event->xmotion.x;
|
||||
y = event->xmotion.y;
|
||||
|
||||
if (app != true)
|
||||
if (xfi->mouse_motion != true)
|
||||
{
|
||||
if (xfi->mouse_motion != true)
|
||||
{
|
||||
if ((event->xmotion.state & (Button1Mask | Button2Mask | Button3Mask)) == 0)
|
||||
return true;
|
||||
}
|
||||
if ((event->xmotion.state & (Button1Mask | Button2Mask | Button3Mask)) == 0)
|
||||
return true;
|
||||
}
|
||||
|
||||
input->MouseEvent(input, PTR_FLAGS_MOVE, event->xmotion.x, event->xmotion.y);
|
||||
|
||||
if (xfi->fullscreen)
|
||||
XSetInputFocus(xfi->display, xfi->window->handle, RevertToPointerRoot, CurrentTime);
|
||||
if (app)
|
||||
{
|
||||
// Translate to desktop coordinates
|
||||
XTranslateCoordinates(xfi->display, event->xmotion.window,
|
||||
RootWindowOfScreen(xfi->screen),
|
||||
x, y, &x, &y, &childWindow);
|
||||
}
|
||||
else if (xfi->mouse_motion == true)
|
||||
|
||||
input->MouseEvent(input, PTR_FLAGS_MOVE, x, y);
|
||||
|
||||
if (xfi->fullscreen)
|
||||
{
|
||||
rdpWindow* window;
|
||||
int x = event->xmotion.x;
|
||||
int y = event->xmotion.y;
|
||||
rdpRail* rail = ((rdpContext*) xfi->context)->rail;
|
||||
|
||||
window = window_list_get_by_extra_id(rail->list, (void*) event->xmotion.window);
|
||||
|
||||
if (window != NULL)
|
||||
{
|
||||
x += window->windowOffsetX;
|
||||
y += window->windowOffsetY;
|
||||
input->MouseEvent(input, PTR_FLAGS_MOVE, x, y);
|
||||
}
|
||||
XSetInputFocus(xfi->display, xfi->window->handle, RevertToPointerRoot, CurrentTime);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_ButtonPress(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_ButtonPress(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
uint16 x, y;
|
||||
uint16 flags;
|
||||
int x, y;
|
||||
int flags;
|
||||
Window childWindow;
|
||||
boolean wheel;
|
||||
boolean extended;
|
||||
rdpInput* input;
|
||||
@ -232,16 +223,10 @@ boolean xf_event_ButtonPress(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
if (app)
|
||||
{
|
||||
rdpWindow* window;
|
||||
rdpRail* rail = ((rdpContext*) xfi->context)->rail;
|
||||
|
||||
window = window_list_get_by_extra_id(rail->list, (void*) event->xbutton.window);
|
||||
|
||||
if (window != NULL)
|
||||
{
|
||||
x += window->windowOffsetX;
|
||||
y += window->windowOffsetY;
|
||||
}
|
||||
// Translate to desktop coordinates
|
||||
XTranslateCoordinates(xfi->display, event->xmotion.window,
|
||||
RootWindowOfScreen(xfi->screen),
|
||||
x, y, &x, &y, &childWindow);
|
||||
}
|
||||
|
||||
if (extended)
|
||||
@ -254,10 +239,11 @@ boolean xf_event_ButtonPress(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_ButtonRelease(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_ButtonRelease(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
uint16 x, y;
|
||||
uint16 flags;
|
||||
int x, y;
|
||||
int flags;
|
||||
Window childWindow;
|
||||
boolean extended;
|
||||
rdpInput* input;
|
||||
|
||||
@ -315,16 +301,10 @@ boolean xf_event_ButtonRelease(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
if (app)
|
||||
{
|
||||
rdpWindow* window;
|
||||
rdpRail* rail = ((rdpContext*) xfi->context)->rail;
|
||||
|
||||
window = window_list_get_by_extra_id(rail->list, (void*) event->xbutton.window);
|
||||
|
||||
if (window != NULL)
|
||||
{
|
||||
x += window->windowOffsetX;
|
||||
y += window->windowOffsetY;
|
||||
}
|
||||
// Translate to desktop coordinates
|
||||
XTranslateCoordinates(xfi->display, event->xmotion.window,
|
||||
RootWindowOfScreen(xfi->screen),
|
||||
x, y, &x, &y, &childWindow);
|
||||
}
|
||||
|
||||
if (extended)
|
||||
@ -336,7 +316,7 @@ boolean xf_event_ButtonRelease(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_KeyPress(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_KeyPress(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
KeySym keysym;
|
||||
char str[256];
|
||||
@ -353,7 +333,7 @@ boolean xf_event_KeyPress(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_KeyRelease(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_KeyRelease(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
XEvent next_event;
|
||||
|
||||
@ -375,7 +355,7 @@ boolean xf_event_KeyRelease(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_FocusIn(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_FocusIn(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
if (event->xfocus.mode == NotifyGrab)
|
||||
return true;
|
||||
@ -396,7 +376,7 @@ boolean xf_event_FocusIn(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_FocusOut(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_FocusOut(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
if (event->xfocus.mode == NotifyUngrab)
|
||||
return true;
|
||||
@ -412,7 +392,7 @@ boolean xf_event_FocusOut(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_MappingNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_MappingNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
if (event->xmapping.request == MappingModifier)
|
||||
{
|
||||
@ -423,7 +403,7 @@ boolean xf_event_MappingNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_ClientMessage(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_ClientMessage(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
if ((event->xclient.message_type == xfi->WM_PROTOCOLS)
|
||||
&& ((Atom) event->xclient.data.l[0] == xfi->WM_DELETE_WINDOW))
|
||||
@ -453,7 +433,7 @@ boolean xf_event_ClientMessage(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_EnterNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_EnterNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
if (app != true)
|
||||
{
|
||||
@ -484,7 +464,7 @@ boolean xf_event_EnterNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_LeaveNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_LeaveNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
if (app != true)
|
||||
{
|
||||
@ -495,7 +475,7 @@ boolean xf_event_LeaveNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_ConfigureNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_ConfigureNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
rdpWindow* window;
|
||||
rdpRail* rail = ((rdpContext*) xfi->context)->rail;
|
||||
@ -533,7 +513,7 @@ boolean xf_event_ConfigureNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return True;
|
||||
}
|
||||
|
||||
boolean xf_event_MapNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_MapNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
rdpWindow* window;
|
||||
rdpRail* rail = ((rdpContext*) xfi->context)->rail;
|
||||
@ -554,7 +534,7 @@ boolean xf_event_MapNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_UnmapNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_UnmapNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
rdpWindow* window;
|
||||
rdpRail* rail = ((rdpContext*) xfi->context)->rail;
|
||||
@ -575,7 +555,7 @@ boolean xf_event_UnmapNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_SelectionNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_SelectionNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
if (app != true)
|
||||
{
|
||||
@ -586,7 +566,7 @@ boolean xf_event_SelectionNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_SelectionRequest(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_SelectionRequest(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
if (app != true)
|
||||
{
|
||||
@ -597,7 +577,7 @@ boolean xf_event_SelectionRequest(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_SelectionClear(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_SelectionClear(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
if (app != true)
|
||||
{
|
||||
@ -608,7 +588,7 @@ boolean xf_event_SelectionClear(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_PropertyNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
static boolean xf_event_PropertyNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
{
|
||||
if (app != true)
|
||||
{
|
||||
@ -619,7 +599,7 @@ boolean xf_event_PropertyNotify(xfInfo* xfi, XEvent* event, boolean app)
|
||||
return true;
|
||||
}
|
||||
|
||||
boolean xf_event_suppress_events(xfInfo *xfi, rdpWindow *window, XEvent*event)
|
||||
static boolean xf_event_suppress_events(xfInfo *xfi, rdpWindow *window, XEvent*event)
|
||||
{
|
||||
if (! xfi->remote_app)
|
||||
return false;
|
||||
|
@ -86,7 +86,7 @@ void xf_rail_paint(xfInfo* xfi, rdpRail* rail, sint32 uleft, sint32 utop, uint32
|
||||
}
|
||||
}
|
||||
|
||||
void xf_rail_CreateWindow(rdpRail* rail, rdpWindow* window)
|
||||
static void xf_rail_CreateWindow(rdpRail* rail, rdpWindow* window)
|
||||
{
|
||||
xfInfo* xfi;
|
||||
xfWindow* xfw;
|
||||
@ -102,13 +102,13 @@ void xf_rail_CreateWindow(rdpRail* rail, rdpWindow* window)
|
||||
|
||||
xf_SetWindowStyle(xfi, xfw, window->style, window->extendedStyle);
|
||||
|
||||
XStoreName(xfi->display, xfw->handle, window->title);
|
||||
xf_SetWindowText(xfi, xfw, window->title);
|
||||
|
||||
window->extra = (void*) xfw;
|
||||
window->extraId = (void*) xfw->handle;
|
||||
}
|
||||
|
||||
void xf_rail_MoveWindow(rdpRail* rail, rdpWindow* window)
|
||||
static void xf_rail_MoveWindow(rdpRail* rail, rdpWindow* window)
|
||||
{
|
||||
xfInfo* xfi;
|
||||
xfWindow* xfw;
|
||||
@ -116,21 +116,12 @@ void xf_rail_MoveWindow(rdpRail* rail, rdpWindow* window)
|
||||
xfi = (xfInfo*) rail->extra;
|
||||
xfw = (xfWindow*) window->extra;
|
||||
|
||||
// Do nothing if window is already in the correct position
|
||||
if ( xfw->left == window->windowOffsetX &&
|
||||
xfw->top == window->windowOffsetY &&
|
||||
xfw->width == window->windowWidth &&
|
||||
xfw->height == window->windowHeight)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
xf_MoveWindow((xfInfo*) rail->extra, xfw,
|
||||
window->windowOffsetX, window->windowOffsetY,
|
||||
window->windowWidth, window->windowHeight);
|
||||
xf_MoveWindow(xfi, xfw,
|
||||
window->windowOffsetX, window->windowOffsetY,
|
||||
window->windowWidth, window->windowHeight);
|
||||
}
|
||||
|
||||
void xf_rail_ShowWindow(rdpRail* rail, rdpWindow* window, uint8 state)
|
||||
static void xf_rail_ShowWindow(rdpRail* rail, rdpWindow* window, uint8 state)
|
||||
{
|
||||
xfInfo* xfi;
|
||||
xfWindow* xfw;
|
||||
@ -138,10 +129,10 @@ void xf_rail_ShowWindow(rdpRail* rail, rdpWindow* window, uint8 state)
|
||||
xfi = (xfInfo*) rail->extra;
|
||||
xfw = (xfWindow*) window->extra;
|
||||
|
||||
xf_ShowWindow((xfInfo*) rail->extra, xfw, state);
|
||||
xf_ShowWindow(xfi, xfw, state);
|
||||
}
|
||||
|
||||
void xf_rail_SetWindowText(rdpRail* rail, rdpWindow* window)
|
||||
static void xf_rail_SetWindowText(rdpRail* rail, rdpWindow* window)
|
||||
{
|
||||
xfInfo* xfi;
|
||||
xfWindow* xfw;
|
||||
@ -149,10 +140,10 @@ void xf_rail_SetWindowText(rdpRail* rail, rdpWindow* window)
|
||||
xfi = (xfInfo*) rail->extra;
|
||||
xfw = (xfWindow*) window->extra;
|
||||
|
||||
XStoreName(xfi->display, xfw->handle, window->title);
|
||||
xf_SetWindowText(xfi, xfw, window->title);
|
||||
}
|
||||
|
||||
void xf_rail_SetWindowIcon(rdpRail* rail, rdpWindow* window, rdpIcon* icon)
|
||||
static void xf_rail_SetWindowIcon(rdpRail* rail, rdpWindow* window, rdpIcon* icon)
|
||||
{
|
||||
xfInfo* xfi;
|
||||
xfWindow* xfw;
|
||||
@ -166,7 +157,7 @@ void xf_rail_SetWindowIcon(rdpRail* rail, rdpWindow* window, rdpIcon* icon)
|
||||
xf_SetWindowIcon(xfi, xfw, icon);
|
||||
}
|
||||
|
||||
void xf_rail_SetWindowRects(rdpRail* rail, rdpWindow* window)
|
||||
static void xf_rail_SetWindowRects(rdpRail* rail, rdpWindow* window)
|
||||
{
|
||||
xfInfo* xfi;
|
||||
xfWindow* xfw;
|
||||
@ -177,7 +168,7 @@ void xf_rail_SetWindowRects(rdpRail* rail, rdpWindow* window)
|
||||
xf_SetWindowRects(xfi, xfw, window->windowRects, window->numWindowRects);
|
||||
}
|
||||
|
||||
void xf_rail_SetWindowVisibilityRects(rdpRail* rail, rdpWindow* window)
|
||||
static void xf_rail_SetWindowVisibilityRects(rdpRail* rail, rdpWindow* window)
|
||||
{
|
||||
xfInfo* xfi;
|
||||
xfWindow* xfw;
|
||||
@ -188,7 +179,7 @@ void xf_rail_SetWindowVisibilityRects(rdpRail* rail, rdpWindow* window)
|
||||
xf_SetWindowVisibilityRects(xfi, xfw, window->windowRects, window->numWindowRects);
|
||||
}
|
||||
|
||||
void xf_rail_DestroyWindow(rdpRail* rail, rdpWindow* window)
|
||||
static void xf_rail_DestroyWindow(rdpRail* rail, rdpWindow* window)
|
||||
{
|
||||
xfWindow* xfw;
|
||||
xfw = (xfWindow*) window->extra;
|
||||
@ -312,34 +303,43 @@ void xf_rail_end_local_move(xfInfo* xfi, rdpWindow *window)
|
||||
xfWindow* xfw;
|
||||
rdpChannels* channels;
|
||||
RAIL_WINDOW_MOVE_ORDER window_move;
|
||||
int x,y;
|
||||
rdpInput* input = xfi->instance->input;
|
||||
int x,y;
|
||||
Window root_window;
|
||||
Window child_window;
|
||||
unsigned int mask;
|
||||
int child_x;
|
||||
int child_y;
|
||||
|
||||
xfw = (xfWindow*) window->extra;
|
||||
channels = xfi->_context->channels;
|
||||
|
||||
// Send RDP client event to inform RDP server
|
||||
|
||||
window_move.windowId = window->windowId;
|
||||
window_move.left = xfw->left;
|
||||
window_move.top = xfw->top;
|
||||
window_move.right = xfw->right + 1; // In the update to RDP the position is one past the window
|
||||
window_move.bottom = xfw->bottom + 1;
|
||||
|
||||
DEBUG_X11_LMS("window=0x%X rc={l=%d t=%d r=%d b=%d} w=%d h=%d",
|
||||
(uint32) xfw->handle,
|
||||
xfw->left, xfw->top, xfw->right, xfw->bottom,
|
||||
xfw->width, xfw->height);
|
||||
|
||||
xf_send_rail_client_event(channels, RDP_EVENT_TYPE_RAIL_CLIENT_WINDOW_MOVE, &window_move);
|
||||
/*
|
||||
* For keyboard moves send and explicit update to RDP server
|
||||
*/
|
||||
window_move.windowId = window->windowId;
|
||||
window_move.left = xfw->left;
|
||||
window_move.top = xfw->top;
|
||||
window_move.right = xfw->right + 1; // The update to RDP the position is one past the window
|
||||
window_move.bottom = xfw->bottom + 1;
|
||||
|
||||
// Send synthetic button up event to the RDP server. This is per the RDP spec to
|
||||
// indicate a local move has finished.
|
||||
xf_send_rail_client_event(channels,
|
||||
RDP_EVENT_TYPE_RAIL_CLIENT_WINDOW_MOVE, &window_move);
|
||||
|
||||
/*
|
||||
* Simulate button up at new position to end the local move (per RDP spec)
|
||||
*/
|
||||
|
||||
x = xfw->left + xfw->local_move.window_x;
|
||||
y = xfw->top + xfw->local_move.window_y;
|
||||
XQueryPointer(xfi->display, xfw->handle,
|
||||
&root_window, &child_window,
|
||||
&x, &y, &child_x, &child_y, &mask);
|
||||
input->MouseEvent(input, PTR_FLAGS_BUTTON1, x, y);
|
||||
|
||||
|
||||
// Proactively update the RAIL window dimensions. There is a race condition where
|
||||
// we can start to receive GDI orders for the new window dimensions before we
|
||||
// receive the RAIL ORDER for the new window size. This avoids that race condition.
|
||||
@ -531,12 +531,14 @@ void xf_process_rail_server_localmovesize_event(xfInfo* xfi, rdpChannels* channe
|
||||
direction = _NET_WM_MOVERESIZE_MOVE_KEYBOARD;
|
||||
x = movesize->posX;
|
||||
y = movesize->posY;
|
||||
break;
|
||||
/* FIXME: local keyboard moves not working */
|
||||
return;
|
||||
case RAIL_WMSZ_KEYSIZE: //0xB
|
||||
direction = _NET_WM_MOVERESIZE_SIZE_KEYBOARD;
|
||||
x = movesize->posX;
|
||||
y = movesize->posY;
|
||||
break;
|
||||
/* FIXME: local keyboard moves not working */
|
||||
return;
|
||||
}
|
||||
|
||||
if (movesize->isMoveSizeStart)
|
||||
|
@ -231,22 +231,26 @@ void xf_SetWindowStyle(xfInfo* xfi, xfWindow* window, uint32 style, uint32 ex_st
|
||||
if ((ex_style & WS_EX_TOPMOST) || (ex_style & WS_EX_TOOLWINDOW))
|
||||
{
|
||||
/*
|
||||
* These include tool tips, dropdown menus, etc. These won't work
|
||||
* correctly if the local window manager resizes or moves them.
|
||||
* Set override redirect to prevent this from occurring.
|
||||
* Tooltips and menu items should be unmanaged windows
|
||||
* (called "override redirect" in X windows parlance)
|
||||
* If they are managed, there are issues with window focus that
|
||||
* cause the windows to behave improperly. For example, a mouse
|
||||
* press will dismiss a drop-down menu because the RDP server
|
||||
* sees that as a focus out event from the window owning the
|
||||
* dropdown.
|
||||
*/
|
||||
|
||||
XSetWindowAttributes attrs;
|
||||
attrs.override_redirect = True;
|
||||
XChangeWindowAttributes(xfi->display, window->handle, CWOverrideRedirect, &attrs);
|
||||
|
||||
window->is_transient = true;
|
||||
xf_SetWindowUnlisted(xfi, window);
|
||||
|
||||
window_type = xfi->_NET_WM_WINDOW_TYPE_POPUP;
|
||||
}
|
||||
else if (style & WS_POPUP)
|
||||
{
|
||||
/* this includes dialogs, popups, etc, that need to be full-fledged windows */
|
||||
window->is_transient = true;
|
||||
window_type = xfi->_NET_WM_WINDOW_TYPE_DIALOG;
|
||||
xf_SetWindowUnlisted(xfi, window);
|
||||
}
|
||||
@ -260,6 +264,11 @@ void xf_SetWindowStyle(xfInfo* xfi, xfWindow* window, uint32 style, uint32 ex_st
|
||||
|
||||
}
|
||||
|
||||
void xf_SetWindowText(xfInfo *xfi, xfWindow* window, char *name)
|
||||
{
|
||||
XStoreName(xfi->display, window->handle, name);
|
||||
}
|
||||
|
||||
xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height, boolean decorations)
|
||||
{
|
||||
xfWindow* window;
|
||||
@ -315,8 +324,10 @@ xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height,
|
||||
XSelectInput(xfi->display, window->handle, input_mask);
|
||||
XMapWindow(xfi->display, window->handle);
|
||||
|
||||
//NOTE: This must be done here to handle reparenting the window, so that we dont miss the event and hang waiting for the next one
|
||||
/* wait for VisibilityNotify */
|
||||
/*
|
||||
* NOTE: This must be done here to handle reparenting the window,
|
||||
* so that we dont miss the event and hang waiting for the next one
|
||||
*/
|
||||
do
|
||||
{
|
||||
XMaskEvent(xfi->display, VisibilityChangeMask, &xevent);
|
||||
@ -324,7 +335,8 @@ xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height,
|
||||
while (xevent.type != VisibilityNotify);
|
||||
}
|
||||
|
||||
XStoreName(xfi->display, window->handle, name);
|
||||
xf_SetWindowText(xfi, window, name);
|
||||
|
||||
|
||||
return window;
|
||||
}
|
||||
@ -419,8 +431,8 @@ xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width,
|
||||
(uint32) window->handle, window->left, window->top, window->right, window->bottom,
|
||||
window->width, window->height, wnd->windowId);
|
||||
|
||||
xf_SetWindowDecorations(xfi, window, window->decorations);
|
||||
xf_SetWindowStyle(xfi, window, wnd->style, wnd->extendedStyle);
|
||||
memset(&gcv, 0, sizeof(gcv));
|
||||
window->gc = XCreateGC(xfi->display, window->handle, GCGraphicsExposures, &gcv);
|
||||
|
||||
class_hints = XAllocClassHint();
|
||||
|
||||
@ -448,11 +460,14 @@ xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width,
|
||||
ColormapChangeMask | OwnerGrabButtonMask;
|
||||
|
||||
XSelectInput(xfi->display, window->handle, input_mask);
|
||||
|
||||
xf_SetWindowDecorations(xfi, window, window->decorations);
|
||||
xf_SetWindowStyle(xfi, window, wnd->style, wnd->extendedStyle);
|
||||
xf_ShowWindow(xfi, window, WINDOW_SHOW);
|
||||
|
||||
XMapWindow(xfi->display, window->handle);
|
||||
|
||||
memset(&gcv, 0, sizeof(gcv));
|
||||
window->gc = XCreateGC(xfi->display, window->handle, GCGraphicsExposures, &gcv);
|
||||
|
||||
/* Move doesn't seem to work until window is mapped. */
|
||||
xf_MoveWindow(xfi, window, x, y, width, height);
|
||||
|
||||
return window;
|
||||
@ -486,8 +501,6 @@ void xf_SetWindowMinMaxInfo(xfInfo* xfi, xfWindow* window,
|
||||
|
||||
void xf_StartLocalMoveSize(xfInfo* xfi, xfWindow* window, int direction, int x, int y)
|
||||
{
|
||||
Window child_window;
|
||||
|
||||
if (window->local_move.state != LMS_NOT_ACTIVE)
|
||||
return;
|
||||
|
||||
@ -499,17 +512,14 @@ void xf_StartLocalMoveSize(xfInfo* xfi, xfWindow* window, int direction, int x,
|
||||
window->window->windowOffsetX, window->window->windowOffsetY,
|
||||
window->window->windowWidth, window->window->windowHeight, x, y);
|
||||
|
||||
/*
|
||||
* Save original mouse location relative to root. This will be needed
|
||||
* to end local move to RDP server and/or X server
|
||||
*/
|
||||
window->local_move.root_x = x;
|
||||
window->local_move.root_y = y;
|
||||
window->local_move.state = LMS_STARTING;
|
||||
|
||||
XTranslateCoordinates(xfi->display, RootWindowOfScreen(xfi->screen), window->handle,
|
||||
window->local_move.root_x,
|
||||
window->local_move.root_y,
|
||||
&window->local_move.window_x,
|
||||
&window->local_move.window_y,
|
||||
&child_window);
|
||||
|
||||
XUngrabPointer(xfi->display, CurrentTime);
|
||||
|
||||
xf_SendClientEvent(xfi, window,
|
||||
@ -614,6 +624,10 @@ void xf_ShowWindow(xfInfo* xfi, xfWindow* window, uint8 state)
|
||||
|
||||
case WINDOW_SHOW:
|
||||
XMapWindow(xfi->display, window->handle);
|
||||
if (window->is_transient)
|
||||
{
|
||||
xf_SetWindowUnlisted(xfi, window);
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
@ -660,6 +674,9 @@ void xf_SetWindowRects(xfInfo* xfi, xfWindow* window, RECTANGLE_16* rects, int n
|
||||
int i;
|
||||
XRectangle* xrects;
|
||||
|
||||
if (nrects == 0)
|
||||
return;
|
||||
|
||||
xrects = xmalloc(sizeof(XRectangle) * nrects);
|
||||
|
||||
for (i = 0; i < nrects; i++)
|
||||
@ -682,6 +699,9 @@ void xf_SetWindowVisibilityRects(xfInfo* xfi, xfWindow* window, RECTANGLE_16* re
|
||||
int i;
|
||||
XRectangle* xrects;
|
||||
|
||||
if (nrects == 0)
|
||||
return;
|
||||
|
||||
xrects = xmalloc(sizeof(XRectangle) * nrects);
|
||||
|
||||
for (i = 0; i < nrects; i++)
|
||||
@ -693,7 +713,7 @@ void xf_SetWindowVisibilityRects(xfInfo* xfi, xfWindow* window, RECTANGLE_16* re
|
||||
}
|
||||
|
||||
#ifdef WITH_XEXT
|
||||
//XShapeCombineRectangles(xfi->display, window->handle, ShapeBounding, 0, 0, xrects, nrects, ShapeSet, 0);
|
||||
XShapeCombineRectangles(xfi->display, window->handle, ShapeBounding, 0, 0, xrects, nrects, ShapeSet, 0);
|
||||
#endif
|
||||
|
||||
xfree(xrects);
|
||||
|
@ -91,6 +91,7 @@ xfWindow* xf_CreateDesktopWindow(xfInfo* xfi, char* name, int width, int height,
|
||||
void xf_ResizeDesktopWindow(xfInfo* xfi, xfWindow* window, int width, int height);
|
||||
|
||||
xfWindow* xf_CreateWindow(xfInfo* xfi, rdpWindow* wnd, int x, int y, int width, int height, uint32 id);
|
||||
void xf_SetWindowText(xfInfo *xfi, xfWindow* window, 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);
|
||||
|
@ -29,7 +29,6 @@
|
||||
#=============================================================================
|
||||
|
||||
find_path(XV_INCLUDE_DIR NAMES X11/extensions/Xv.h
|
||||
PATH_SUFFIXES X11/extensions
|
||||
DOC "The Xv include directory"
|
||||
)
|
||||
|
||||
|
@ -43,7 +43,6 @@ struct rdp_window
|
||||
rdpWindow* next;
|
||||
uint32 windowId;
|
||||
uint32 ownerWindowId;
|
||||
rdpWindow* ownerWindow;
|
||||
uint32 style;
|
||||
uint32 extendedStyle;
|
||||
uint8 showState;
|
||||
|
Loading…
Reference in New Issue
Block a user