xfreerdp: remove RAIL dependency on deprecated event system
This commit is contained in:
parent
f3d1830eb4
commit
d955851052
@ -72,14 +72,11 @@
|
|||||||
#include <freerdp/codec/color.h>
|
#include <freerdp/codec/color.h>
|
||||||
#include <freerdp/codec/bitmap.h>
|
#include <freerdp/codec/bitmap.h>
|
||||||
|
|
||||||
#include <freerdp/utils/event.h>
|
|
||||||
#include <freerdp/utils/signal.h>
|
#include <freerdp/utils/signal.h>
|
||||||
#include <freerdp/utils/passphrase.h>
|
#include <freerdp/utils/passphrase.h>
|
||||||
#include <freerdp/client/cliprdr.h>
|
#include <freerdp/client/cliprdr.h>
|
||||||
#include <freerdp/client/channels.h>
|
#include <freerdp/client/channels.h>
|
||||||
|
|
||||||
#include <freerdp/rail.h>
|
|
||||||
|
|
||||||
#include <freerdp/client/file.h>
|
#include <freerdp/client/file.h>
|
||||||
#include <freerdp/client/cmdline.h>
|
#include <freerdp/client/cmdline.h>
|
||||||
|
|
||||||
@ -101,6 +98,7 @@
|
|||||||
#include "xf_input.h"
|
#include "xf_input.h"
|
||||||
#include "xf_channels.h"
|
#include "xf_channels.h"
|
||||||
#include "xfreerdp.h"
|
#include "xfreerdp.h"
|
||||||
|
|
||||||
#include <freerdp/log.h>
|
#include <freerdp/log.h>
|
||||||
#define TAG CLIENT_TAG("x11")
|
#define TAG CLIENT_TAG("x11")
|
||||||
|
|
||||||
@ -267,7 +265,7 @@ void xf_sw_end_paint(rdpContext *context)
|
|||||||
|
|
||||||
xf_lock_x11(xfc, FALSE);
|
xf_lock_x11(xfc, FALSE);
|
||||||
|
|
||||||
xf_rail_paint(xfc, context->rail, x, y, x + w - 1, y + h - 1);
|
xf_rail_paint(xfc, x, y, x + w - 1, y + h - 1);
|
||||||
|
|
||||||
xf_unlock_x11(xfc, FALSE);
|
xf_unlock_x11(xfc, FALSE);
|
||||||
}
|
}
|
||||||
@ -383,7 +381,7 @@ void xf_hw_end_paint(rdpContext *context)
|
|||||||
|
|
||||||
xf_lock_x11(xfc, FALSE);
|
xf_lock_x11(xfc, FALSE);
|
||||||
|
|
||||||
xf_rail_paint(xfc, context->rail, x, y, x + w - 1, y + h - 1);
|
xf_rail_paint(xfc, x, y, x + w - 1, y + h - 1);
|
||||||
|
|
||||||
xf_unlock_x11(xfc, FALSE);
|
xf_unlock_x11(xfc, FALSE);
|
||||||
}
|
}
|
||||||
|
@ -25,9 +25,8 @@
|
|||||||
#include <X11/Xutil.h>
|
#include <X11/Xutil.h>
|
||||||
|
|
||||||
#include <winpr/wlog.h>
|
#include <winpr/wlog.h>
|
||||||
#include <freerdp/utils/event.h>
|
|
||||||
|
|
||||||
#include <winpr/print.h>
|
#include <winpr/print.h>
|
||||||
|
|
||||||
#include <freerdp/utils/rail.h>
|
#include <freerdp/utils/rail.h>
|
||||||
#include <freerdp/rail/rail.h>
|
#include <freerdp/rail/rail.h>
|
||||||
|
|
||||||
@ -83,8 +82,55 @@ void xf_rail_disable_remoteapp_mode(xfContext* xfc)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void xf_rail_paint(xfContext* xfc, rdpRail* rail, INT32 uleft, INT32 utop, UINT32 uright, UINT32 ubottom)
|
void xf_rail_invalidate_region(xfContext* xfc, REGION16* invalidRegion)
|
||||||
{
|
{
|
||||||
|
int index;
|
||||||
|
int count;
|
||||||
|
RECTANGLE_16 updateRect;
|
||||||
|
RECTANGLE_16 windowRect;
|
||||||
|
ULONG_PTR* pKeys = NULL;
|
||||||
|
xfRailWindow* railWindow;
|
||||||
|
const RECTANGLE_16* extents;
|
||||||
|
REGION16 windowInvalidRegion;
|
||||||
|
|
||||||
|
region16_init(&windowInvalidRegion);
|
||||||
|
|
||||||
|
count = HashTable_GetKeys(xfc->railWindows, &pKeys);
|
||||||
|
|
||||||
|
for (index = 0; index < count; index++)
|
||||||
|
{
|
||||||
|
railWindow = (xfRailWindow*) HashTable_GetItemValue(xfc->railWindows, (void*) pKeys[index]);
|
||||||
|
|
||||||
|
if (railWindow)
|
||||||
|
{
|
||||||
|
windowRect.left = railWindow->x;
|
||||||
|
windowRect.top = railWindow->y;
|
||||||
|
windowRect.right = railWindow->x + railWindow->width;
|
||||||
|
windowRect.bottom = railWindow->y + railWindow->height;
|
||||||
|
|
||||||
|
region16_clear(&windowInvalidRegion);
|
||||||
|
region16_intersect_rect(&windowInvalidRegion, invalidRegion, &windowRect);
|
||||||
|
|
||||||
|
if (!region16_is_empty(&windowInvalidRegion))
|
||||||
|
{
|
||||||
|
extents = region16_extents(&windowInvalidRegion);
|
||||||
|
|
||||||
|
updateRect.left = extents->left - railWindow->x;
|
||||||
|
updateRect.top = extents->top - railWindow->y;
|
||||||
|
updateRect.right = extents->right - railWindow->x;
|
||||||
|
updateRect.bottom = extents->bottom - railWindow->y;
|
||||||
|
|
||||||
|
//InvalidateRect(railWindow->hWnd, &updateRect, FALSE);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
region16_uninit(&windowInvalidRegion);
|
||||||
|
}
|
||||||
|
|
||||||
|
void xf_rail_paint(xfContext* xfc, INT32 uleft, INT32 utop, UINT32 uright, UINT32 ubottom)
|
||||||
|
{
|
||||||
|
rdpRail* rail;
|
||||||
xfWindow* xfw;
|
xfWindow* xfw;
|
||||||
rdpWindow* window;
|
rdpWindow* window;
|
||||||
BOOL intersect;
|
BOOL intersect;
|
||||||
@ -93,6 +139,9 @@ void xf_rail_paint(xfContext* xfc, rdpRail* rail, INT32 uleft, INT32 utop, UINT3
|
|||||||
UINT32 iright, ibottom;
|
UINT32 iright, ibottom;
|
||||||
INT32 wleft, wtop;
|
INT32 wleft, wtop;
|
||||||
UINT32 wright, wbottom;
|
UINT32 wright, wbottom;
|
||||||
|
|
||||||
|
rail = ((rdpContext*) xfc)->rail;
|
||||||
|
|
||||||
window_list_rewind(rail->list);
|
window_list_rewind(rail->list);
|
||||||
|
|
||||||
while (window_list_has_next(rail->list))
|
while (window_list_has_next(rail->list))
|
||||||
@ -256,33 +305,13 @@ void xf_rail_register_callbacks(xfContext* xfc, rdpRail* rail)
|
|||||||
rail->rail_DesktopNonMonitored = xf_rail_DesktopNonMonitored;
|
rail->rail_DesktopNonMonitored = xf_rail_DesktopNonMonitored;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void xf_on_free_rail_client_event(wMessage* event)
|
|
||||||
{
|
|
||||||
rail_free_cloned_order(GetMessageType(event->id), event->wParam);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void xf_send_rail_client_event(rdpChannels* channels, UINT16 event_type, void* param)
|
|
||||||
{
|
|
||||||
wMessage* out_event = NULL;
|
|
||||||
void* payload = NULL;
|
|
||||||
payload = rail_clone_order(event_type, param);
|
|
||||||
|
|
||||||
if (payload != NULL)
|
|
||||||
{
|
|
||||||
out_event = freerdp_event_new(RailChannel_Class, event_type,
|
|
||||||
xf_on_free_rail_client_event, payload);
|
|
||||||
freerdp_channels_send_event(channels, out_event);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void xf_rail_send_activate(xfContext* xfc, Window xwindow, BOOL enabled)
|
void xf_rail_send_activate(xfContext* xfc, Window xwindow, BOOL enabled)
|
||||||
{
|
{
|
||||||
rdpRail* rail;
|
rdpRail* rail;
|
||||||
rdpChannels* channels;
|
|
||||||
rdpWindow* rail_window;
|
rdpWindow* rail_window;
|
||||||
RAIL_ACTIVATE_ORDER activate;
|
RAIL_ACTIVATE_ORDER activate;
|
||||||
|
|
||||||
rail = ((rdpContext*) xfc)->rail;
|
rail = ((rdpContext*) xfc)->rail;
|
||||||
channels = ((rdpContext*) xfc)->channels;
|
|
||||||
rail_window = window_list_get_by_extra_id(rail->list, (void*) xwindow);
|
rail_window = window_list_get_by_extra_id(rail->list, (void*) xwindow);
|
||||||
|
|
||||||
if (!rail_window)
|
if (!rail_window)
|
||||||
@ -290,17 +319,18 @@ void xf_rail_send_activate(xfContext* xfc, Window xwindow, BOOL enabled)
|
|||||||
|
|
||||||
activate.windowId = rail_window->windowId;
|
activate.windowId = rail_window->windowId;
|
||||||
activate.enabled = enabled;
|
activate.enabled = enabled;
|
||||||
xf_send_rail_client_event(channels, RailChannel_ClientActivate, &activate);
|
|
||||||
|
xfc->rail->ClientActivate(xfc->rail, &activate);
|
||||||
}
|
}
|
||||||
|
|
||||||
void xf_rail_send_client_system_command(xfContext* xfc, UINT32 windowId, UINT16 command)
|
void xf_rail_send_client_system_command(xfContext* xfc, UINT32 windowId, UINT16 command)
|
||||||
{
|
{
|
||||||
rdpChannels* channels;
|
|
||||||
RAIL_SYSCOMMAND_ORDER syscommand;
|
RAIL_SYSCOMMAND_ORDER syscommand;
|
||||||
channels = ((rdpContext*) xfc)->channels;
|
|
||||||
syscommand.windowId = windowId;
|
syscommand.windowId = windowId;
|
||||||
syscommand.command = command;
|
syscommand.command = command;
|
||||||
xf_send_rail_client_event(channels, RailChannel_ClientSystemCommand, &syscommand);
|
|
||||||
|
xfc->rail->ClientSystemCommand(xfc->rail, &syscommand);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -312,10 +342,9 @@ void xf_rail_send_client_system_command(xfContext* xfc, UINT32 windowId, UINT16
|
|||||||
void xf_rail_adjust_position(xfContext* xfc, rdpWindow* window)
|
void xf_rail_adjust_position(xfContext* xfc, rdpWindow* window)
|
||||||
{
|
{
|
||||||
xfWindow* xfw;
|
xfWindow* xfw;
|
||||||
rdpChannels* channels;
|
|
||||||
RAIL_WINDOW_MOVE_ORDER window_move;
|
RAIL_WINDOW_MOVE_ORDER window_move;
|
||||||
|
|
||||||
xfw = (xfWindow*) window->extra;
|
xfw = (xfWindow*) window->extra;
|
||||||
channels = ((rdpContext*) xfc)->channels;
|
|
||||||
|
|
||||||
if (! xfw->is_mapped || xfw->local_move.state != LMS_NOT_ACTIVE)
|
if (! xfw->is_mapped || xfw->local_move.state != LMS_NOT_ACTIVE)
|
||||||
return;
|
return;
|
||||||
@ -355,24 +384,23 @@ void xf_rail_adjust_position(xfContext* xfc, rdpWindow* window)
|
|||||||
window_move.right = window_move.left + xfw->width;
|
window_move.right = window_move.left + xfw->width;
|
||||||
window_move.bottom = window_move.top + xfw->height;
|
window_move.bottom = window_move.top + xfw->height;
|
||||||
|
|
||||||
xf_send_rail_client_event(channels, RailChannel_ClientWindowMove, &window_move);
|
xfc->rail->ClientWindowMove(xfc->rail, &window_move);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void xf_rail_end_local_move(xfContext* xfc, rdpWindow* window)
|
void xf_rail_end_local_move(xfContext* xfc, rdpWindow* window)
|
||||||
{
|
{
|
||||||
xfWindow* xfw;
|
|
||||||
rdpChannels* channels;
|
|
||||||
RAIL_WINDOW_MOVE_ORDER window_move;
|
|
||||||
rdpInput* input = xfc->instance->input;
|
|
||||||
int x, y;
|
int x, y;
|
||||||
Window root_window;
|
|
||||||
Window child_window;
|
|
||||||
unsigned int mask;
|
|
||||||
int child_x;
|
int child_x;
|
||||||
int child_y;
|
int child_y;
|
||||||
|
xfWindow* xfw;
|
||||||
|
unsigned int mask;
|
||||||
|
Window root_window;
|
||||||
|
Window child_window;
|
||||||
|
RAIL_WINDOW_MOVE_ORDER window_move;
|
||||||
|
rdpInput* input = xfc->instance->input;
|
||||||
|
|
||||||
xfw = (xfWindow*) window->extra;
|
xfw = (xfWindow*) window->extra;
|
||||||
channels = ((rdpContext*) xfc)->channels;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Although the rail server can give negative window coordinates when updating windowOffsetX and windowOffsetY,
|
* Although the rail server can give negative window coordinates when updating windowOffsetX and windowOffsetY,
|
||||||
@ -392,6 +420,7 @@ void xf_rail_end_local_move(xfContext* xfc, rdpWindow* window)
|
|||||||
* For keyboard moves send and explicit update to RDP server
|
* For keyboard moves send and explicit update to RDP server
|
||||||
*/
|
*/
|
||||||
window_move.windowId = window->windowId;
|
window_move.windowId = window->windowId;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Calculate new offsets for the rail server window
|
* Calculate new offsets for the rail server window
|
||||||
* Negative offset correction + rail server window offset + (difference in visibleOffset and new window local offset)
|
* Negative offset correction + rail server window offset + (difference in visibleOffset and new window local offset)
|
||||||
@ -400,13 +429,16 @@ void xf_rail_end_local_move(xfContext* xfc, rdpWindow* window)
|
|||||||
window_move.top = offsetY + window->windowOffsetY + (xfw->top - window->visibleOffsetY);
|
window_move.top = offsetY + window->windowOffsetY + (xfw->top - window->visibleOffsetY);
|
||||||
window_move.right = window_move.left + xfw->width; /* In the update to RDP the position is one past the window */
|
window_move.right = window_move.left + xfw->width; /* In the update to RDP the position is one past the window */
|
||||||
window_move.bottom = window_move.top + xfw->height;
|
window_move.bottom = window_move.top + xfw->height;
|
||||||
xf_send_rail_client_event(channels, RailChannel_ClientWindowMove, &window_move);
|
|
||||||
|
xfc->rail->ClientWindowMove(xfc->rail, &window_move);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Simulate button up at new position to end the local move (per RDP spec)
|
* Simulate button up at new position to end the local move (per RDP spec)
|
||||||
*/
|
*/
|
||||||
XQueryPointer(xfc->display, xfw->handle,
|
XQueryPointer(xfc->display, xfw->handle,
|
||||||
&root_window, &child_window,
|
&root_window, &child_window,
|
||||||
&x, &y, &child_x, &child_y, &mask);
|
&x, &y, &child_x, &child_y, &mask);
|
||||||
|
|
||||||
input->MouseEvent(input, PTR_FLAGS_BUTTON1, x, y);
|
input->MouseEvent(input, PTR_FLAGS_BUTTON1, x, y);
|
||||||
|
|
||||||
/* only send the mouse coordinates if not a keyboard move or size */
|
/* only send the mouse coordinates if not a keyboard move or size */
|
||||||
@ -428,52 +460,6 @@ void xf_rail_end_local_move(xfContext* xfc, rdpWindow* window)
|
|||||||
xfw->local_move.state = LMS_TERMINATING;
|
xfw->local_move.state = LMS_TERMINATING;
|
||||||
}
|
}
|
||||||
|
|
||||||
void xf_rail_invalidate_region(xfContext* xfc, REGION16* invalidRegion)
|
|
||||||
{
|
|
||||||
int index;
|
|
||||||
int count;
|
|
||||||
RECTANGLE_16 updateRect;
|
|
||||||
RECTANGLE_16 windowRect;
|
|
||||||
ULONG_PTR* pKeys = NULL;
|
|
||||||
xfRailWindow* railWindow;
|
|
||||||
const RECTANGLE_16* extents;
|
|
||||||
REGION16 windowInvalidRegion;
|
|
||||||
|
|
||||||
region16_init(&windowInvalidRegion);
|
|
||||||
|
|
||||||
count = HashTable_GetKeys(xfc->railWindows, &pKeys);
|
|
||||||
|
|
||||||
for (index = 0; index < count; index++)
|
|
||||||
{
|
|
||||||
railWindow = (xfRailWindow*) HashTable_GetItemValue(xfc->railWindows, (void*) pKeys[index]);
|
|
||||||
|
|
||||||
if (railWindow)
|
|
||||||
{
|
|
||||||
windowRect.left = railWindow->x;
|
|
||||||
windowRect.top = railWindow->y;
|
|
||||||
windowRect.right = railWindow->x + railWindow->width;
|
|
||||||
windowRect.bottom = railWindow->y + railWindow->height;
|
|
||||||
|
|
||||||
region16_clear(&windowInvalidRegion);
|
|
||||||
region16_intersect_rect(&windowInvalidRegion, invalidRegion, &windowRect);
|
|
||||||
|
|
||||||
if (!region16_is_empty(&windowInvalidRegion))
|
|
||||||
{
|
|
||||||
extents = region16_extents(&windowInvalidRegion);
|
|
||||||
|
|
||||||
updateRect.left = extents->left - railWindow->x;
|
|
||||||
updateRect.top = extents->top - railWindow->y;
|
|
||||||
updateRect.right = extents->right - railWindow->x;
|
|
||||||
updateRect.bottom = extents->bottom - railWindow->y;
|
|
||||||
|
|
||||||
//InvalidateRect(railWindow->hWnd, &updateRect, FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
region16_uninit(&windowInvalidRegion);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* RemoteApp Virtual Channel Extension */
|
/* RemoteApp Virtual Channel Extension */
|
||||||
|
|
||||||
static int xf_rail_server_execute_result(RailClientContext* context, RAIL_EXEC_RESULT_ORDER* execResult)
|
static int xf_rail_server_execute_result(RailClientContext* context, RAIL_EXEC_RESULT_ORDER* execResult)
|
||||||
|
@ -42,7 +42,7 @@ typedef struct xf_rail_window xfRailWindow;
|
|||||||
|
|
||||||
#include <freerdp/client/rail.h>
|
#include <freerdp/client/rail.h>
|
||||||
|
|
||||||
void xf_rail_paint(xfContext* xfc, rdpRail* rail, INT32 uleft, INT32 utop, UINT32 uright, UINT32 ubottom);
|
void xf_rail_paint(xfContext* xfc, INT32 uleft, INT32 utop, UINT32 uright, UINT32 ubottom);
|
||||||
void xf_rail_send_client_system_command(xfContext* xfc, UINT32 windowId, UINT16 command);
|
void xf_rail_send_client_system_command(xfContext* xfc, UINT32 windowId, UINT16 command);
|
||||||
void xf_rail_send_activate(xfContext* xfc, Window xwindow, BOOL enabled);
|
void xf_rail_send_activate(xfContext* xfc, Window xwindow, BOOL enabled);
|
||||||
void xf_rail_adjust_position(xfContext* xfc, rdpWindow* window);
|
void xf_rail_adjust_position(xfContext* xfc, rdpWindow* window);
|
||||||
|
@ -31,7 +31,6 @@
|
|||||||
#include <X11/Xatom.h>
|
#include <X11/Xatom.h>
|
||||||
#include <X11/extensions/XShm.h>
|
#include <X11/extensions/XShm.h>
|
||||||
|
|
||||||
#include <freerdp/utils/event.h>
|
|
||||||
#include <freerdp/log.h>
|
#include <freerdp/log.h>
|
||||||
#include <freerdp/client/tsmf.h>
|
#include <freerdp/client/tsmf.h>
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user