📄 svgawin.c
字号:
int i;
int j;
uint8* temp;
if (x == srcx && y == srcy)
return;
if (warp_coords(&x, &y, &cx, &cy, &srcx, &srcy))
{
if (contains_mouse(x, y, cx, cy) || contains_mouse(srcx, srcy, cx, cy))
draw_cursor_under(mousex, mousey);
if (opcode == 0xc) /* copy */
accel_screen_copy(x, y, cx, cy, srcx, srcy);
else
{
temp = (uint8*)xmalloc(cx * cy * g_server_Bpp);
for (i = 0; i < cy; i++)
for (j = 0; j < cx; j++)
set_pixel2(j, i, get_pixel(srcx + j, srcy + i), temp, cx, g_server_bpp);
for (i = 0; i < cy; i++)
for (j = 0; j < cx; j++)
set_pixel(x + j, y + i, get_pixel2(j, i, temp, cx, g_server_bpp), opcode);
xfree(temp);
}
cache_rect(x, y, cx, cy, False);
draw_cache_rects(); // draw them all so screen is not jumpy
}
}
/*****************************************************************************/
void ui_patblt(uint8 opcode, int x, int y, int cx, int cy,
BRUSH * brush, int bgcolour, int fgcolour)
{
int i;
int j;
uint8 ipattern[8];
if (warp_coords(&x, &y, &cx, &cy, NULL, NULL))
{
if (contains_mouse(x, y, cx, cy))
draw_cursor_under(mousex, mousey);
switch (brush->style)
{
case 0:
fill_rect(x, y, cx, cy, fgcolour, opcode);
break;
case 3:
for (i = 0; i < 8; i++)
ipattern[i] = ~brush->pattern[7 - i];
for (i = 0; i < cy; i++)
for (j = 0; j < cx; j++)
if (is_pixel_on(ipattern, (x + j + brush->xorigin) % 8,
(y + i + brush->yorigin) % 8, 8, 1))
set_pixel(x + j, y + i, fgcolour, opcode);
else
set_pixel(x + j, y + i, bgcolour, opcode);
break;
}
cache_rect(x, y, cx, cy, False);
}
}
/*****************************************************************************/
void ui_destblt(uint8 opcode, int x, int y, int cx, int cy)
{
if (warp_coords(&x, &y, &cx, &cy, NULL, NULL))
{
if (contains_mouse(x, y, cx, cy))
draw_cursor_under(mousex, mousey);
fill_rect(x, y, cx, cy, -1, opcode);
cache_rect(x, y, cx, cy, False);
}
}
/*****************************************************************************/
void ui_move_pointer(int x, int y)
{
}
/*****************************************************************************/
void ui_set_null_cursor(void)
{
draw_cursor_under(mousex, mousey);
mousex = mousex - mcursor.x;
mousey = mousey - mcursor.y;
memset(&mcursor, 0, sizeof(mcursor));
memset(mcursor.andmask, 255, sizeof(mcursor.andmask));
memset(mcursor.xormask, 0, sizeof(mcursor.xormask));
draw_cursor();
}
/*****************************************************************************/
void ui_paint_bitmap(int x, int y, int cx, int cy,
int width, int height, uint8* data)
{
if (warp_coords(&x, &y, &cx, &cy, NULL, NULL))
{
if (contains_mouse(x, y, cx, cy))
draw_cursor_under(mousex, mousey);
accel_draw_box(x, y, cx, cy, data, width * g_server_Bpp);
cache_rect(x, y, cx, cy, False);
}
}
/*****************************************************************************/
void* ui_create_cursor(unsigned int x, unsigned int y,
int width, int height,
uint8* andmask, uint8* xormask)
{
tcursor* c;
int i;
int j;
c = (tcursor*)xmalloc(sizeof(tcursor));
memset(c, 0, sizeof(tcursor));
c->w = width;
c->h = height;
c->x = x;
c->y = y;
for (i = 0; i < 32; i++)
{
for (j = 0; j < 32; j++)
{
if (is_pixel_on(andmask, j, i, 32, 1))
set_pixel_on(c->andmask, j, 31 - i, 32, 8, 255);
if (is_pixel_on(xormask, j, i, 32, 24))
set_pixel_on(c->xormask, j, 31 - i, 32, 8, 255);
}
}
return (void*)c;
}
/*****************************************************************************/
void ui_destroy_cursor(void* cursor)
{
if (cursor != NULL)
xfree(cursor);
}
/*****************************************************************************/
void ui_set_cursor(void* cursor)
{
int x;
int y;
int ox;
int oy;
ox = mousex;
oy = mousey;
x = mousex + mcursor.x;
y = mousey + mcursor.y;
memcpy(&mcursor, cursor, sizeof(tcursor));
mousex = x - mcursor.x;
mousey = y - mcursor.y;
draw_cursor_under(ox, oy);
draw_cursor();
}
/*****************************************************************************/
uint16 ui_get_numlock_state(unsigned int state)
{
return 0;
}
/*****************************************************************************/
unsigned int read_keyboard_state(void)
{
return 0;
}
/*****************************************************************************/
void ui_resize_window(void)
{
}
/*****************************************************************************/
void ui_begin_update(void)
{
}
/*****************************************************************************/
void ui_end_update(void)
{
draw_cache_rects();
draw_cursor();
}
/*****************************************************************************/
void ui_polygon(uint8 opcode, uint8 fillmode, POINT * point, int npoints,
BRUSH * brush, int bgcolour, int fgcolour)
{
}
/*****************************************************************************/
void ui_polyline(uint8 opcode, POINT * points, int npoints, PEN * pen)
{
}
/*****************************************************************************/
void ui_ellipse(uint8 opcode, uint8 fillmode,
int x, int y, int cx, int cy,
BRUSH * brush, int bgcolour, int fgcolour)
{
}
/*****************************************************************************/
void generate_random(uint8* random)
{
memcpy(random, "12345678901234567890123456789012", 32);
}
/*****************************************************************************/
void save_licence(uint8* data, int length)
{
}
/*****************************************************************************/
int load_licence(uint8** data)
{
return 0;
}
/*****************************************************************************/
void* xrealloc(void* in_val, int size)
{
return realloc(in_val, size);
}
/*****************************************************************************/
void* xmalloc(int size)
{
return malloc(size);
}
/*****************************************************************************/
void xfree(void* in_val)
{
free(in_val);
}
/*****************************************************************************/
char * xstrdup(const char * s)
{
char * mem = strdup(s);
if (mem == NULL)
{
perror("strdup");
exit(1);
}
return mem;
}
/*****************************************************************************/
void warning(char* format, ...)
{
va_list ap;
fprintf(stderr, "WARNING: ");
va_start(ap, format);
vfprintf(stderr, format, ap);
va_end(ap);
}
/*****************************************************************************/
void unimpl(char* format, ...)
{
va_list ap;
fprintf(stderr, "NOT IMPLEMENTED: ");
va_start(ap, format);
vfprintf(stderr, format, ap);
va_end(ap);
}
/*****************************************************************************/
void error(char* format, ...)
{
va_list ap;
fprintf(stderr, "ERROR: ");
va_start(ap, format);
vfprintf(stderr, format, ap);
va_end(ap);
}
BOOL rd_pstcache_mkdir(void)
{
return 0;
}
/*****************************************************************************/
int rd_open_file(char *filename)
{
return 0;
}
/*****************************************************************************/
void rd_close_file(int fd)
{
return;
}
/*****************************************************************************/
int rd_read_file(int fd, void *ptr, int len)
{
return 0;
}
/*****************************************************************************/
int rd_write_file(int fd, void* ptr, int len)
{
return 0;
}
/*****************************************************************************/
int rd_lseek_file(int fd, int offset)
{
return 0;
}
/*****************************************************************************/
BOOL rd_lock_file(int fd, int start, int len)
{
return False;
}
/*****************************************************************************/
void get_username_and_hostname(void)
{
char fullhostname[64];
char* p;
struct passwd* pw;
STRNCPY(g_username, "unknown", sizeof(g_username));
STRNCPY(g_hostname, "unknown", sizeof(g_hostname));
pw = getpwuid(getuid());
if (pw != NULL && pw->pw_name != NULL)
{
STRNCPY(g_username, pw->pw_name, sizeof(g_username));
}
if (gethostname(fullhostname, sizeof(fullhostname)) != -1)
{
p = strchr(fullhostname, '.');
if (p != NULL)
*p = 0;
STRNCPY(g_hostname, fullhostname, sizeof(g_hostname));
}
}
/*****************************************************************************/
void out_params(void)
{
fprintf(stderr, "rdesktop: A Remote Desktop Protocol client.\n");
fprintf(stderr, "Version " VERSION ". Copyright (C) 1999-2003 Matt Chapman.\n");
fprintf(stderr, "See http://www.rdesktop.org/ for more information.\n\n");
fprintf(stderr, "Usage: svgardesktop [options] server\n");
fprintf(stderr, " -g: desktop geometry (WxH)\n");
fprintf(stderr, " -4: use RDP version 4\n");
fprintf(stderr, " -5: use RDP version 5 (default)\n");
fprintf(stderr, " -t: tcp port\n");
fprintf(stderr, " -u: user name\n");
fprintf(stderr, " -n: client hostname\n");
fprintf(stderr, " -d: disable accel funcs\n");
fprintf(stderr, " -a: connection colour depth\n");
fprintf(stderr, " -l: low memory\n");
fprintf(stderr, "\n");
}
/* produce a hex dump */
void hexdump(uint8* p, uint32 len)
{
uint8* line;
int i;
int thisline;
int offset;
line = p;
offset = 0;
while (offset < len)
{
printf("%04x ", offset);
thisline = len - offset;
if (thisline > 16)
thisline = 16;
for (i = 0; i < thisline; i++)
printf("%02x ", line[i]);
for (; i < 16; i++)
printf(" ");
for (i = 0; i < thisline; i++)
printf("%c", (line[i] >= 0x20 && line[i] < 0x7f) ? line[i] : '.');
printf("\n");
offset += thisline;
line += thisline;
}
}
/*****************************************************************************/
int parse_parameters(int in_argc, char** in_argv)
{
int i;
char* p;
if (in_argc <= 1)
{
out_params();
return 0;
}
g_argc = in_argc;
g_argv = in_argv;
for (i = 1; i < in_argc; i++)
{
strcpy(g_servername, in_argv[i]);
if (strcmp(in_argv[i], "-g") == 0)
{
g_width = strtol(in_argv[i + 1], &p, 10);
if (g_width <= 0)
{
error("invalid geometry\n");
return 0;
}
if (*p == 'x')
g_height = strtol(p + 1, NULL, 10);
if (g_height <= 0)
{
error("invalid geometry\n");
return 0;
}
g_width = (g_width + 3) & ~3;
}
else if (strcmp(in_argv[i], "-4") == 0)
g_use_rdp5 = 0;
else if (strcmp(in_argv[i], "-5") == 0)
g_use_rdp5 = 1;
else if (strcmp(in_argv[i], "-t") == 0)
g_tcp_port_rdp = strtol(in_argv[i + 1], &p, 10);
else if (strcmp(in_argv[i], "-h") == 0)
{
out_params();
return 0;
}
else if (strcmp(in_argv[i], "-n") == 0)
{
STRNCPY(g_hostname, in_argv[i + 1], sizeof(g_hostname));
}
else if (strcmp(in_argv[i], "-u") == 0)
{
STRNCPY(g_username, in_argv[i + 1], sizeof(g_username));
}
else if (strcmp(in_argv[i], "-d") == 0)
{
use_accel = 0;
}
else if (strcmp(in_argv[i], "-a") == 0)
{
g_server_bpp = strtol(in_argv[i + 1], NULL, 10);
if (g_server_bpp != 8 && g_server_bpp != 16)
{
error("invalid server bpp\n");
return 0;
}
g_server_Bpp = (g_server_bpp + 7) / 8;
}
else if (strcmp(in_argv[i], "-l") == 0)
g_save_mem = 1;
}
return 1;
}
/*****************************************************************************/
int main(int in_argc, char** in_argv)
{
get_username_and_hostname();
if (!parse_parameters(in_argc, in_argv))
return 0;
if (!ui_init())
return 1;
if (!ui_create_window())
return 1;
ui_main_loop();
ui_destroy_window();
ui_deinit();
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -