xfreerdp-server: change event queue

This commit is contained in:
Marc-André Moreau 2013-02-17 12:23:25 -05:00
parent aa8851fb45
commit f12e4ff89d
3 changed files with 30 additions and 30 deletions

View File

@ -85,6 +85,7 @@ void xf_xdamage_subtract_region(xfPeerContext* xfp, int x, int y, int width, int
void* xf_frame_rate_thread(void* param) void* xf_frame_rate_thread(void* param)
{ {
xfInfo* xfi; xfInfo* xfi;
HGDI_RGN region;
xfPeerContext* xfp; xfPeerContext* xfp;
freerdp_peer* client; freerdp_peer* client;
UINT32 wait_interval; UINT32 wait_interval;
@ -93,6 +94,7 @@ void* xf_frame_rate_thread(void* param)
xfp = (xfPeerContext*) client->context; xfp = (xfPeerContext*) client->context;
xfi = xfp->info; xfi = xfp->info;
region = xfp->hdc->hwnd->invalid;
wait_interval = 1000000 / xfp->fps; wait_interval = 1000000 / xfp->fps;
while (1) while (1)
@ -100,11 +102,27 @@ void* xf_frame_rate_thread(void* param)
/* check if we should terminate */ /* check if we should terminate */
pthread_testcancel(); pthread_testcancel();
MessageQueue_Post(xfp->queue, (void*) xfp, if (!region->null)
MakeMessageId(PeerEvent, FrameRateTick), NULL, NULL); {
UINT32 xy, wh;
pthread_mutex_lock(&(xfp->mutex));
xy = (region->x << 16) | region->y;
wh = (region->w << 16) | region->h;
region->null = 1;
pthread_mutex_unlock(&(xfp->mutex));
MessageQueue_Post(xfp->queue, (void*) xfp,
MakeMessageId(PeerEvent, EncodeRegion),
(void*) (size_t) xy, (void*) (size_t) wh);
}
USleep(wait_interval); USleep(wait_interval);
} }
return NULL;
} }
void* xf_monitor_updates(void* param) void* xf_monitor_updates(void* param)
@ -127,7 +145,7 @@ void* xf_monitor_updates(void* param)
xfi = xfp->info; xfi = xfp->info;
fds = xfi->xfds; fds = xfi->xfds;
wait_interval = (1000000 / 2500); wait_interval = 1000000 / xfp->fps;
ZeroMemory(&timeout, sizeof(struct timeval)); ZeroMemory(&timeout, sizeof(struct timeval));
pthread_create(&(xfp->frame_rate_thread), 0, xf_frame_rate_thread, (void*) client); pthread_create(&(xfp->frame_rate_thread), 0, xf_frame_rate_thread, (void*) client);
@ -150,7 +168,7 @@ void* xf_monitor_updates(void* param)
} }
else if (select_status == 0) else if (select_status == 0)
{ {
//printf("select timeout\n");
} }
pthread_mutex_lock(&(xfp->mutex)); pthread_mutex_lock(&(xfp->mutex));
@ -166,7 +184,6 @@ void* xf_monitor_updates(void* param)
if (xevent.type == xfi->xdamage_notify_event) if (xevent.type == xfi->xdamage_notify_event)
{ {
UINT32 xy, wh;
notify = (XDamageNotifyEvent*) &xevent; notify = (XDamageNotifyEvent*) &xevent;
x = notify->area.x; x = notify->area.x;
@ -176,12 +193,9 @@ void* xf_monitor_updates(void* param)
xf_xdamage_subtract_region(xfp, x, y, width, height); xf_xdamage_subtract_region(xfp, x, y, width, height);
xy = (x << 16) | y; pthread_mutex_lock(&(xfp->mutex));
wh = (width << 16) | height; gdi_InvalidateRegion(xfp->hdc, x, y, width, height);
pthread_mutex_unlock(&(xfp->mutex));
MessageQueue_Post(xfp->queue, (void*) xfp,
MakeMessageId(PeerEvent, InvalidRegion),
(void*) (size_t) xy, (void*) (size_t) wh);
} }
} }
} }

View File

@ -309,7 +309,7 @@ void xf_peer_init(freerdp_peer* client)
xfp = (xfPeerContext*) client->context; xfp = (xfPeerContext*) client->context;
xfp->fps = 24; xfp->fps = 16;
xfp->thread = 0; xfp->thread = 0;
xfp->activations = 0; xfp->activations = 0;
@ -507,7 +507,6 @@ BOOL xf_peer_check_fds(freerdp_peer* client)
xfInfo* xfi; xfInfo* xfi;
wMessage message; wMessage message;
xfPeerContext* xfp; xfPeerContext* xfp;
HGDI_RGN invalid_region;
xfp = (xfPeerContext*) client->context; xfp = (xfPeerContext*) client->context;
xfi = xfp->info; xfi = xfp->info;
@ -517,7 +516,7 @@ BOOL xf_peer_check_fds(freerdp_peer* client)
if (MessageQueue_Peek(xfp->queue, &message, TRUE)) if (MessageQueue_Peek(xfp->queue, &message, TRUE))
{ {
if (message.id == MakeMessageId(PeerEvent, InvalidRegion)) if (message.id == MakeMessageId(PeerEvent, EncodeRegion))
{ {
UINT32 xy, wh; UINT32 xy, wh;
UINT16 x, y, w, h; UINT16 x, y, w, h;
@ -531,20 +530,8 @@ BOOL xf_peer_check_fds(freerdp_peer* client)
w = ((wh & 0xFFFF0000) >> 16); w = ((wh & 0xFFFF0000) >> 16);
h = (wh & 0x0000FFFF); h = (wh & 0x0000FFFF);
gdi_InvalidateRegion(xfp->hdc, x, y, w, h); if (w * h > 0)
} xf_peer_rfx_update(client, x, y, w, h);
else if (message.id == MakeMessageId(PeerEvent, FrameRateTick))
{
invalid_region = xfp->hdc->hwnd->invalid;
if (!invalid_region->null)
{
xf_peer_rfx_update(client, invalid_region->x, invalid_region->y,
invalid_region->w, invalid_region->h);
}
invalid_region->null = 1;
xfp->hdc->hwnd->ninvalid = 0;
} }
} }

View File

@ -39,8 +39,7 @@ typedef struct xf_peer_context xfPeerContext;
#define PeerEvent_Class (PeerEvent_Base + 1) #define PeerEvent_Class (PeerEvent_Base + 1)
#define PeerEvent_InvalidRegion 1 #define PeerEvent_EncodeRegion 1
#define PeerEvent_FrameRateTick 2
struct xf_peer_context struct xf_peer_context
{ {