xorg: work on driver

ulab-next
Jay Sorg 11 years ago
parent 885804cf14
commit 522cedf12e

@ -1,5 +1,5 @@
/* /*
Copyright 2005-2013 Jay Sorg Copyright 2005-2014 Jay Sorg
Permission to use, copy, modify, distribute, and sell this software and its Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that documentation for any purpose is hereby granted without fee, provided that
@ -38,6 +38,20 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
#define RDPCLAMP(_val, _lo, _hi) \ #define RDPCLAMP(_val, _lo, _hi) \
(_val) < (_lo) ? (_lo) : (_val) > (_hi) ? (_hi) : (_val) (_val) < (_lo) ? (_lo) : (_val) > (_hi) ? (_hi) : (_val)
struct image_data
{
int width;
int height;
int bpp;
int Bpp;
int lineBytes;
char *pixels;
char *shmem_pixels;
int shmem_id;
int shmem_offset;
int shmem_lineBytes;
};
/* defined in rdpClientCon.h */ /* defined in rdpClientCon.h */
typedef struct _rdpClientCon rdpClientCon; typedef struct _rdpClientCon rdpClientCon;
@ -84,6 +98,8 @@ struct _rdpPixmapRec
}; };
typedef struct _rdpPixmapRec rdpPixmapRec; typedef struct _rdpPixmapRec rdpPixmapRec;
typedef struct _rdpPixmapRec * rdpPixmapPtr; typedef struct _rdpPixmapRec * rdpPixmapPtr;
#define GETPIXPRIV(_dev, _pPixmap) (rdpPixmapPtr) \
rdpGetPixmapPrivate(&((_pPixmap)->devPrivates), (_dev)->privateKeyRecPixmap)
/* move this to common header */ /* move this to common header */
struct _rdpRec struct _rdpRec
@ -141,6 +157,7 @@ struct _rdpRec
int sendUpdateScheduled; /* boolean */ int sendUpdateScheduled; /* boolean */
OsTimerPtr sendUpdateTimer; OsTimerPtr sendUpdateTimer;
int do_dirty_os; /* boolean */
int do_dirty_ons; /* boolean */ int do_dirty_ons; /* boolean */
int disconnect_scheduled; /* boolean */ int disconnect_scheduled; /* boolean */
int do_kill_disconnected; /* boolean */ int do_kill_disconnected; /* boolean */
@ -150,6 +167,8 @@ struct _rdpRec
int disconnect_timeout_s; int disconnect_timeout_s;
int disconnect_time_ms; int disconnect_time_ms;
int conNumber;
}; };
typedef struct _rdpRec rdpRec; typedef struct _rdpRec rdpRec;
typedef struct _rdpRec * rdpPtr; typedef struct _rdpRec * rdpPtr;

@ -1,5 +1,5 @@
/* /*
Copyright 2005-2013 Jay Sorg Copyright 2005-2014 Jay Sorg
Permission to use, copy, modify, distribute, and sell this software and its Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that documentation for any purpose is hereby granted without fee, provided that
@ -38,6 +38,7 @@ Client connection to xrdp
#include "rdpDraw.h" #include "rdpDraw.h"
#include "rdpClientCon.h" #include "rdpClientCon.h"
#include "rdpMisc.h" #include "rdpMisc.h"
#include "rdpInput.h"
#define LOG_LEVEL 1 #define LOG_LEVEL 1
#define LLOGLN(_level, _args) \ #define LLOGLN(_level, _args) \
@ -62,9 +63,9 @@ Client connection to xrdp
a GXnoop, D a GXnoop, D
b GXorInverted, DPno b GXorInverted, DPno
c GXcopy, P c GXcopy, P
d GXorReverse, PDno d GXorReverse, PDno
e GXor, DPo e GXor, DPo
f GXset 1 f GXset 1
*/ */
static int g_rdp_opcodes[16] = static int g_rdp_opcodes[16] =
@ -87,33 +88,501 @@ static int g_rdp_opcodes[16] =
0xff /* GXset 0xf 1 */ 0xff /* GXset 0xf 1 */
}; };
/******************************************************************************/
static int static int
rdpClientConSendPending(rdpPtr dev, rdpClientCon *clientCon); rdpClientConGotConnection(ScreenPtr pScreen, rdpPtr dev)
{
rdpClientCon *clientCon;
int new_sck;
LLOGLN(0, ("rdpClientConGotConnection:"));
clientCon = (rdpClientCon *) g_malloc(sizeof(rdpClientCon), 1);
make_stream(clientCon->in_s);
init_stream(clientCon->in_s, 8192);
make_stream(clientCon->out_s);
init_stream(clientCon->out_s, 8192 * 4 + 100);
new_sck = g_sck_accept(dev->listen_sck);
if (new_sck == -1)
{
LLOGLN(0, ("rdpClientConGotConnection: g_sck_accept failed"));
}
else
{
LLOGLN(0, ("rdpClientConGotConnection: g_sck_accept ok new_sck %d",
new_sck));
clientCon->sck = new_sck;
g_sck_set_non_blocking(clientCon->sck);
g_sck_tcp_set_no_delay(clientCon->sck); /* only works if TCP */
clientCon->connected = TRUE;
clientCon->sckClosed = FALSE;
clientCon->begin = FALSE;
dev->conNumber++;
clientCon->conNumber = dev->conNumber;
AddEnabledDevice(clientCon->sck);
}
if (dev->clientConTail == NULL)
{
LLOGLN(0, ("rdpClientConGotConnection: adding only clientCon"));
dev->clientConHead = clientCon;
dev->clientConTail = clientCon;
}
else
{
LLOGLN(0, ("rdpClientConGotConnection: adding clientCon"));
dev->clientConTail->next = clientCon;
dev->clientConTail = clientCon;
}
return 0;
}
/******************************************************************************/
static CARD32
rdpDeferredDisconnectCallback(OsTimerPtr timer, CARD32 now, pointer arg)
{
CARD32 lnow_ms;
rdpPtr dev;
dev = (rdpPtr) arg;
LLOGLN(10, ("rdpDeferredDisconnectCallback"));
if (dev->clientConHead != NULL)
{
/* this should not happen */
LLOGLN(0, ("rdpDeferredDisconnectCallback: connected"));
if (dev->disconnectTimer != NULL)
{
LLOGLN(0, ("rdpDeferredDisconnectCallback: canceling g_dis_timer"));
TimerCancel(dev->disconnectTimer);
TimerFree(dev->disconnectTimer);
dev->disconnectTimer = NULL;
}
dev->disconnect_scheduled = FALSE;
return 0;
}
else
{
LLOGLN(10, ("rdpDeferredDisconnectCallback: not connected"));
}
lnow_ms = GetTimeInMillis();
if (lnow_ms - dev->disconnect_time_ms > dev->disconnect_timeout_s * 1000)
{
LLOGLN(0, ("rdpDeferredDisconnectCallback: exit X11rdp"));
kill(getpid(), SIGTERM);
return 0;
}
dev->disconnectTimer = TimerSet(dev->disconnectTimer, 0, 1000 * 10,
rdpDeferredDisconnectCallback, dev);
return 0;
}
/*****************************************************************************/
static int
rdpClientConDisconnect(rdpPtr dev, rdpClientCon *clientCon)
{
int index;
rdpClientCon *pcli;
rdpClientCon *plcli;
LLOGLN(0, ("rdpClientConDisconnect:"));
if (dev->do_kill_disconnected)
{
if (dev->disconnect_scheduled == FALSE)
{
LLOGLN(0, ("rdpClientConDisconnect: starting g_dis_timer"));
dev->disconnectTimer = TimerSet(dev->disconnectTimer, 0, 1000 * 10,
rdpDeferredDisconnectCallback, dev);
dev->disconnect_scheduled = TRUE;
}
dev->disconnect_time_ms = GetTimeInMillis();
}
RemoveEnabledDevice(clientCon->sck);
g_sck_close(clientCon->sck);
if (clientCon->maxOsBitmaps > 0)
{
for (index = 0; index < clientCon->maxOsBitmaps; index++)
{
if (clientCon->osBitmaps[index].used)
{
if (clientCon->osBitmaps[index].priv != NULL)
{
clientCon->osBitmaps[index].priv->status = 0;
}
}
}
}
g_free(clientCon->osBitmaps);
plcli = NULL;
pcli = dev->clientConHead;
while (pcli != NULL)
{
if (pcli == clientCon)
{
if (plcli == NULL)
{
/* removing first item */
dev->clientConHead = pcli->next;
if (dev->clientConHead == NULL)
{
dev->clientConTail = NULL;
}
}
else
{
plcli->next = pcli->next;
}
break;
}
plcli = pcli;
pcli = pcli->next;
}
g_free(clientCon);
return 0;
}
/*****************************************************************************/
/* returns error */
static int
rdpClientConSend(rdpPtr dev, rdpClientCon *clientCon, char *data, int len)
{
int sent;
LLOGLN(10, ("rdpClientConSend - sending %d bytes", len));
if (clientCon->sckClosed)
{
return 1;
}
while (len > 0)
{
sent = g_sck_send(clientCon->sck, data, len, 0);
if (sent == -1)
{
if (g_sck_last_error_would_block(clientCon->sck))
{
g_sleep(1);
}
else
{
LLOGLN(0, ("rdpClientConSend: g_tcp_send failed(returned -1)"));
rdpClientConDisconnect(dev, clientCon);
return 1;
}
}
else if (sent == 0)
{
LLOGLN(0, ("rdpClientConSend: g_tcp_send failed(returned zero)"));
rdpClientConDisconnect(dev, clientCon);
return 1;
}
else
{
data += sent;
len -= sent;
}
}
return 0;
}
/******************************************************************************/
static int
rdpClientConSendMsg(rdpPtr dev, rdpClientCon *clientCon)
{
int len;
int rv;
struct stream *s;
rv = 1;
s = clientCon->out_s;
if (s != NULL)
{
len = (int) (s->end - s->data);
if (len > s->size)
{
LLOGLN(0, ("rdpClientConSendMsg: overrun error len %d count %d",
len, clientCon->count));
}
s_pop_layer(s, iso_hdr);
out_uint16_le(s, 3);
out_uint16_le(s, clientCon->count);
out_uint32_le(s, len - 8);
rv = rdpClientConSend(dev, clientCon, s->data, len);
}
if (rv != 0)
{
LLOGLN(0, ("rdpClientConSendMsg: error in rdpup_send_msg"));
}
return rv;
}
/******************************************************************************/
static int
rdpClientConSendPending(rdpPtr dev, rdpClientCon *clientCon)
{
int rv;
rv = 0;
if (clientCon->connected && clientCon->begin)
{
out_uint16_le(clientCon->out_s, 2); /* XR_SERVER_END_UPDATE */
out_uint16_le(clientCon->out_s, 4); /* size */
clientCon->count++;
s_mark_end(clientCon->out_s);
if (rdpClientConSendMsg(dev, clientCon) != 0)
{
LLOGLN(0, ("rdpClientConSendPending: rdpClientConSendMsg failed"));
rv = 1;
}
}
clientCon->count = 0;
clientCon->begin = FALSE;
return rv;
}
/******************************************************************************/
/* returns error */
static int
rdpClientConRecv(rdpPtr dev, rdpClientCon *clientCon, char *data, int len)
{
int rcvd;
if (clientCon->sckClosed)
{
return 1;
}
while (len > 0)
{
rcvd = g_sck_recv(clientCon->sck, data, len, 0);
if (rcvd == -1)
{
if (g_sck_last_error_would_block(clientCon->sck))
{
g_sleep(1);
}
else
{
LLOGLN(0, ("rdpClientConRecv: g_sck_recv failed(returned -1)"));
rdpClientConDisconnect(dev, clientCon);
return 1;
}
}
else if (rcvd == 0)
{
LLOGLN(0, ("rdpClientConRecv: g_sck_recv failed(returned 0)"));
rdpClientConDisconnect(dev, clientCon);
return 1;
}
else
{
data += rcvd;
len -= rcvd;
}
}
return 0;
}
/******************************************************************************/
static int
rdpClientConRecvMsg(rdpPtr dev, rdpClientCon *clientCon)
{
int len;
int rv;
struct stream *s;
rv = 1;
s = clientCon->in_s;
if (s != 0)
{
init_stream(s, 4);
rv = rdpClientConRecv(dev, clientCon, s->data, 4);
if (rv == 0)
{
in_uint32_le(s, len);
if (len > 3)
{
init_stream(s, len);
rv = rdpClientConRecv(dev, clientCon, s->data, len - 4);
}
}
}
if (rv != 0)
{
LLOGLN(0, ("rdpClientConRecvMsg: error"));
}
return rv;
}
/******************************************************************************/
static int
rdpClientConSendCaps(rdpPtr dev, rdpClientCon *clientCon)
{
struct stream *ls;
int len;
int rv;
int cap_count;
int cap_bytes;
make_stream(ls);
init_stream(ls, 8192);
s_push_layer(ls, iso_hdr, 8);
cap_count = 0;
cap_bytes = 0;
#if 0
out_uint16_le(ls, 0);
out_uint16_le(ls, 4);
cap_count++;
cap_bytes += 4;
out_uint16_le(ls, 1);
out_uint16_le(ls, 4);
cap_count++;
cap_bytes += 4;
#endif
s_mark_end(ls);
len = (int)(ls->end - ls->data);
s_pop_layer(ls, iso_hdr);
out_uint16_le(ls, 2); /* caps */
out_uint16_le(ls, cap_count); /* num caps */
out_uint32_le(ls, cap_bytes); /* caps len after header */
rv = rdpClientConSend(dev, clientCon, ls->data, len);
if (rv != 0)
{
LLOGLN(0, ("rdpClientConSendCaps: rdpup_send failed"));
}
free_stream(ls);
return rv;
}
/******************************************************************************/
static int static int
rdpClientConSendMsg(rdpPtr dev, rdpClientCon *clientCon); rdpClientConProcessMsgVersion(rdpPtr dev, rdpClientCon *clientCon,
int param1, int param2, int param3, int param4)
{
LLOGLN(0, ("rdpClientConProcessMsgVersion: version %d %d %d %d",
param1, param2, param3, param4));
if ((param1 > 0) || (param2 > 0) || (param3 > 0) || (param4 > 0))
{
rdpClientConSendCaps(dev, clientCon);
}
return 0;
}
/******************************************************************************/ /******************************************************************************/
static int static int
rdpClientConGotConnection(ScreenPtr pScreen, rdpPtr dev) rdpClientConProcessMsgClientInput(rdpPtr dev, rdpClientCon *clientCon)
{ {
rdpClientCon *clientCon; struct stream *s;
int msg;
int param1;
int param2;
int param3;
int param4;
LLOGLN(0, ("rdpClientConGotConnection:")); s = clientCon->in_s;
clientCon = (rdpClientCon *) g_malloc(sizeof(rdpClientCon), 1); in_uint32_le(s, msg);
make_stream(clientCon->in_s); in_uint32_le(s, param1);
init_stream(clientCon->in_s, 8192); in_uint32_le(s, param2);
make_stream(clientCon->out_s); in_uint32_le(s, param3);
init_stream(clientCon->out_s, 8192 * 4 + 100); in_uint32_le(s, param4);
if (dev->clientConTail == NULL)
LLOGLN(10, ("rdpClientConProcessMsgClientInput: msg %d param1 %d param2 %d "
"param3 %d param4 %d", msg, param1, param2, param3, param4));
if (msg < 100)
{
rdpInputKeyboardEvent(dev, msg, param1, param2, param3, param4);
}
else if (msg < 200)
{
rdpInputMouseEvent(dev, msg, param1, param2, param3, param4);
}
else if (msg == 200) /* invalidate */
{ {
dev->clientConHead = clientCon; }
dev->clientConTail = clientCon; else if (msg == 300) /* resize desktop */
{
}
else if (msg == 301) /* version */
{
rdpClientConProcessMsgVersion(dev, clientCon,
param1, param2, param3, param4);
} }
else else
{ {
dev->clientConTail->next = clientCon; LLOGLN(0, ("rdpClientConProcessMsgClientInput: unknown msg %d", msg));
dev->clientConTail = clientCon; }
return 0;
}
/******************************************************************************/
static int
rdpClientConProcessMsgClientInfo(rdpPtr dev, rdpClientCon *clientCon)
{
LLOGLN(0, ("rdpClientConProcessMsgClientInfo:"));
return 0;
}
/******************************************************************************/
static int
rdpClientConProcessMsgClientRegion(rdpPtr dev, rdpClientCon *clientCon)
{
LLOGLN(0, ("rdpClientConProcessMsgClientRegion:"));
return 0;
}
/******************************************************************************/
static int
rdpClientConProcessMsg(rdpPtr dev, rdpClientCon *clientCon)
{
int msg_type;
struct stream *s;
LLOGLN(10, ("rdpClientConProcessMsg:"));
s = clientCon->in_s;
in_uint16_le(s, msg_type);
LLOGLN(10, ("rdpClientConProcessMsg: msg_type %d", msg_type));
switch (msg_type)
{
case 103: /* client input */
rdpClientConProcessMsgClientInput(dev, clientCon);
break;
case 104: /* client info */
rdpClientConProcessMsgClientInfo(dev, clientCon);
break;
case 105: /* client region */
rdpClientConProcessMsgClientRegion(dev, clientCon);
break;
default:
break;
} }
return 0; return 0;
} }
@ -121,7 +590,13 @@ rdpClientConGotConnection(ScreenPtr pScreen, rdpPtr dev)
static int static int
rdpClientConGotData(ScreenPtr pScreen, rdpPtr dev, rdpClientCon *clientCon) rdpClientConGotData(ScreenPtr pScreen, rdpPtr dev, rdpClientCon *clientCon)
{ {
LLOGLN(0, ("rdpClientConGotData:")); LLOGLN(10, ("rdpClientConGotData:"));
if (rdpClientConRecvMsg(dev, clientCon) == 0)
{
rdpClientConProcessMsg(dev, clientCon);
}
return 0; return 0;
} }
@ -293,108 +768,6 @@ rdpClientConDeinit(rdpPtr dev)
return 0; return 0;
} }
/******************************************************************************/
static CARD32
rdpClientConDeferredDisconnectCallback(OsTimerPtr timer, CARD32 now,
pointer arg)
{
CARD32 lnow_ms;
rdpPtr dev;
LLOGLN(10, ("rdpClientConDeferredDisconnectCallback"));
dev = (rdpPtr) arg;
if (dev->clientConHead != NULL) /* is there any connection ? */
{
LLOGLN(0, ("rdpClientConDeferredDisconnectCallback: one connected"));
if (dev->disconnectTimer != NULL)
{
LLOGLN(0, ("rdpClientConDeferredDisconnectCallback: "
"canceling disconnectTimer"));
TimerCancel(dev->disconnectTimer);
TimerFree(dev->disconnectTimer);
dev->disconnectTimer = NULL;
}
dev->disconnectScheduled = FALSE;
return 0;
}
else
{
LLOGLN(10, ("rdpClientConDeferredDisconnectCallback: not connected"));
}
lnow_ms = GetTimeInMillis();
if (lnow_ms - dev->disconnect_time_ms > dev->disconnect_timeout_s * 1000)
{
LLOGLN(0, ("rdpClientConDeferredDisconnectCallback: exit X11rdp"));
kill(getpid(), SIGTERM);
return 0;
}
dev->disconnectTimer = TimerSet(dev->disconnectTimer, 0, 1000 * 10,
rdpClientConDeferredDisconnectCallback,
dev);
return 0;
}
/*****************************************************************************/
static int
rdpClientConDisconnect(rdpPtr dev, rdpClientCon *clientCon)
{
//int index;
LLOGLN(0, ("rdpClientConDisconnect:"));
if (dev->do_kill_disconnected)
{
if (dev->disconnect_scheduled == FALSE)
{
LLOGLN(0, ("rdpClientConDisconnect: starting g_dis_timer"));
dev->disconnectTimer = TimerSet(dev->disconnectTimer, 0, 1000 * 10,
rdpClientConDeferredDisconnectCallback, dev);
dev->disconnect_scheduled = TRUE;
}
dev->disconnect_time_ms = GetTimeInMillis();
}
//rdpClientConDelete(dev, clientCon);
#if 0
// TODO
RemoveEnabledDevice(clientCon->sck);
clientCon->connected = FALSE;
g_sck_close(clientCon->sck);
clientCon->sck = 0;
clientCon->sckClosed = TRUE;
clientCon->osBitmapNumUsed = 0;
clientCon->rdpIndex = -1;
if (clientCon->maxOsBitmaps > 0)
{
for (index = 0; index < clientCon->maxOsBitmaps; index++)
{
if (clientCon->osBitmaps[index].used)
{
if (g_os_bitmaps[index].priv != 0)
{
g_os_bitmaps[index].priv->status = 0;
}
}
}
}
g_os_bitmap_alloc_size = 0;
g_max_os_bitmaps = 0;
g_free(g_os_bitmaps);
g_os_bitmaps = 0;
g_use_rail = 0;
g_do_glyph_cache = 0;
g_do_composite = 0;
#endif
return 0;
}
/******************************************************************************/ /******************************************************************************/
int int
rdpClientConBeginUpdate(rdpPtr dev, rdpClientCon *clientCon) rdpClientConBeginUpdate(rdpPtr dev, rdpClientCon *clientCon)
@ -1178,112 +1551,6 @@ rdpClientConUpdateOsUse(rdpPtr dev, rdpClientCon *clientCon, int rdpindex)
return 0; return 0;
} }
/*****************************************************************************/
/* returns error */
static int
rdpClientConSend(rdpPtr dev, rdpClientCon *clientCon, char *data, int len)
{
int sent;
LLOGLN(10, ("rdpClientConSend - sending %d bytes", len));
if (clientCon->sckClosed)
{
return 1;
}
while (len > 0)
{
sent = g_sck_send(clientCon->sck, data, len, 0);
if (sent == -1)
{
if (g_sck_last_error_would_block(clientCon->sck))
{
g_sleep(1);
}
else
{
LLOGLN(0, ("rdpClientConSend: g_tcp_send failed(returned -1)"));
rdpClientConDisconnect(dev, clientCon);
return 1;
}
}
else if (sent == 0)
{
LLOGLN(0, ("rdpClientConSend: g_tcp_send failed(returned zero)"));
rdpClientConDisconnect(dev, clientCon);
return 1;
}
else
{
data += sent;
len -= sent;
}
}
return 0;
}
/******************************************************************************/
static int
rdpClientConSendMsg(rdpPtr dev, rdpClientCon *clientCon)
{
int len;
int rv;
struct stream *s;
rv = 1;
s = clientCon->out_s;
if (s != NULL)
{
len = (int) (s->end - s->data);
if (len > s->size)
{
LLOGLN(0, ("rdpClientConSendMsg: overrun error len %d count %d",
len, clientCon->count));
}
s_pop_layer(s, iso_hdr);
out_uint16_le(s, 3);
out_uint16_le(s, clientCon->count);
out_uint32_le(s, len - 8);
rv = rdpClientConSend(dev, clientCon, s->data, len);
}
if (rv != 0)
{
LLOGLN(0, ("rdpClientConSendMsg: error in rdpup_send_msg"));
}
return rv;
}
/******************************************************************************/
static int
rdpClientConSendPending(rdpPtr dev, rdpClientCon *clientCon)
{
int rv;
rv = 0;
if (clientCon->connected && clientCon->begin)
{
out_uint16_le(clientCon->out_s, 2); /* XR_SERVER_END_UPDATE */
out_uint16_le(clientCon->out_s, 4); /* size */
clientCon->count++;
s_mark_end(clientCon->out_s);
if (rdpClientConSendMsg(dev, clientCon) != 0)
{
LLOGLN(0, ("rdpClientConSendPending: rdpClientConSendMsg failed"));
rv = 1;
}
}
clientCon->count = 0;
clientCon->begin = FALSE;
return rv;
}
/******************************************************************************/ /******************************************************************************/
static CARD32 static CARD32
rdpClientConDeferredUpdateCallback(OsTimerPtr timer, CARD32 now, pointer arg) rdpClientConDeferredUpdateCallback(OsTimerPtr timer, CARD32 now, pointer arg)
@ -1325,9 +1592,9 @@ rdpClientConScheduleDeferredUpdate(rdpPtr dev)
if (dev->sendUpdateScheduled == FALSE) if (dev->sendUpdateScheduled == FALSE)
{ {
dev->sendUpdateScheduled = TRUE; dev->sendUpdateScheduled = TRUE;
dev->sendUpdateTimer = TimerSet(dev->sendUpdateTimer, 0, 40, dev->sendUpdateTimer =
rdpClientConDeferredUpdateCallback, TimerSet(dev->sendUpdateTimer, 0, 40,
dev); rdpClientConDeferredUpdateCallback, dev);
} }
} }

@ -1,5 +1,5 @@
/* /*
Copyright 2005-2013 Jay Sorg Copyright 2005-2014 Jay Sorg
Permission to use, copy, modify, distribute, and sell this software and its Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that documentation for any purpose is hereby granted without fee, provided that
@ -24,6 +24,17 @@ Client connection to xrdp
#ifndef _RDPCLIENTCON_H #ifndef _RDPCLIENTCON_H
#define _RDPCLIENTCON_H #define _RDPCLIENTCON_H
/* used in rdpGlyphs.c */
struct font_cache
{
int offset;
int baseline;
int width;
int height;
int crc;
int stamp;
};
struct rdpup_os_bitmap struct rdpup_os_bitmap
{ {
int used; int used;
@ -58,6 +69,12 @@ struct _rdpClientCon
int rdpIndex; /* current os target */ int rdpIndex; /* current os target */
int conNumber;
/* rdpGlyphs.c */
struct font_cache font_cache[12][256];
int font_stamp;
struct _rdpClientCon *next; struct _rdpClientCon *next;
}; };

@ -1,5 +1,5 @@
/* /*
Copyright 2012-2013 Jay Sorg Copyright 2012-2014 Jay Sorg
Permission to use, copy, modify, distribute, and sell this software and its Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that documentation for any purpose is hereby granted without fee, provided that

@ -1,5 +1,5 @@
/* /*
Copyright 2005-2013 Jay Sorg Copyright 2005-2014 Jay Sorg
Permission to use, copy, modify, distribute, and sell this software and its Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that documentation for any purpose is hereby granted without fee, provided that

@ -1,5 +1,5 @@
/* /*
Copyright 2013 Jay Sorg Copyright 2013-2014 Jay Sorg
Permission to use, copy, modify, distribute, and sell this software and its Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that documentation for any purpose is hereby granted without fee, provided that

@ -1,5 +1,5 @@
/* /*
Copyright 2013 Jay Sorg Copyright 2013-2014 Jay Sorg
Permission to use, copy, modify, distribute, and sell this software and its Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that documentation for any purpose is hereby granted without fee, provided that
@ -492,7 +492,7 @@ rdpInputKeyboard(rdpPtr dev, int msg, long param1, long param2,
rdpKeyboard *keyboard; rdpKeyboard *keyboard;
keyboard = &(dev->keyboard); keyboard = &(dev->keyboard);
LLOGLN(0, ("rdpInputKeyboard:")); LLOGLN(10, ("rdpInputKeyboard:"));
switch (msg) switch (msg)
{ {
case 15: /* key down */ case 15: /* key down */

@ -1,5 +1,5 @@
/* /*
Copyright 2013 Jay Sorg Copyright 2013-2014 Jay Sorg
Permission to use, copy, modify, distribute, and sell this software and its Permission to use, copy, modify, distribute, and sell this software and its
documentation for any purpose is hereby granted without fee, provided that documentation for any purpose is hereby granted without fee, provided that
@ -152,7 +152,7 @@ rdpInputMouse(rdpPtr dev, int msg,
{ {
rdpPointer *pointer; rdpPointer *pointer;
LLOGLN(0, ("rdpInputMouse:")); LLOGLN(10, ("rdpInputMouse:"));
pointer = &(dev->pointer); pointer = &(dev->pointer);
switch (msg) switch (msg)
{ {

Loading…
Cancel
Save