⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 xwin.c

📁 rdesktop is a client for Microsoft Windows NT Terminal Server, Windows 2000 Terminal Services, Wind
💻 C
📖 第 1 页 / 共 5 页
字号:
		rdpdr_check_fds(&rfds, &wfds, (BOOL) False);		if (FD_ISSET(rdp_socket, &rfds))			return 1;#ifdef WITH_RDPSND		if (g_dsp_busy && FD_ISSET(g_dsp_fd, &wfds))			wave_out_play();#endif	}}voidui_move_pointer(int x, int y){	XWarpPointer(g_display, g_wnd, g_wnd, 0, 0, 0, 0, x, y);}HBITMAPui_create_bitmap(int width, int height, uint8 * data){	XImage *image;	Pixmap bitmap;	uint8 *tdata;	int bitmap_pad;	if (g_server_depth == 8)	{		bitmap_pad = 8;	}	else	{		bitmap_pad = g_bpp;		if (g_bpp == 24)			bitmap_pad = 32;	}	tdata = (g_owncolmap ? data : translate_image(width, height, data));	bitmap = XCreatePixmap(g_display, g_wnd, width, height, g_depth);	image = XCreateImage(g_display, g_visual, g_depth, ZPixmap, 0,			     (char *) tdata, width, height, bitmap_pad, 0);	XPutImage(g_display, bitmap, g_create_bitmap_gc, image, 0, 0, 0, 0, width, height);	XFree(image);	if (tdata != data)		xfree(tdata);	return (HBITMAP) bitmap;}voidui_paint_bitmap(int x, int y, int cx, int cy, int width, int height, uint8 * data){	XImage *image;	uint8 *tdata;	int bitmap_pad;	if (g_server_depth == 8)	{		bitmap_pad = 8;	}	else	{		bitmap_pad = g_bpp;		if (g_bpp == 24)			bitmap_pad = 32;	}	tdata = (g_owncolmap ? data : translate_image(width, height, data));	image = XCreateImage(g_display, g_visual, g_depth, ZPixmap, 0,			     (char *) tdata, width, height, bitmap_pad, 0);	if (g_ownbackstore)	{		XPutImage(g_display, g_backstore, g_gc, image, 0, 0, x, y, cx, cy);		XCopyArea(g_display, g_backstore, g_wnd, g_gc, x, y, cx, cy, x, y);		ON_ALL_SEAMLESS_WINDOWS(XCopyArea,					(g_display, g_backstore, sw->wnd, g_gc, x, y, cx, cy,					 x - sw->xoffset, y - sw->yoffset));	}	else	{		XPutImage(g_display, g_wnd, g_gc, image, 0, 0, x, y, cx, cy);		ON_ALL_SEAMLESS_WINDOWS(XCopyArea,					(g_display, g_wnd, sw->wnd, g_gc, x, y, cx, cy,					 x - sw->xoffset, y - sw->yoffset));	}	XFree(image);	if (tdata != data)		xfree(tdata);}voidui_destroy_bitmap(HBITMAP bmp){	XFreePixmap(g_display, (Pixmap) bmp);}HGLYPHui_create_glyph(int width, int height, uint8 * data){	XImage *image;	Pixmap bitmap;	int scanline;	scanline = (width + 7) / 8;	bitmap = XCreatePixmap(g_display, g_wnd, width, height, 1);	if (g_create_glyph_gc == 0)		g_create_glyph_gc = XCreateGC(g_display, bitmap, 0, NULL);	image = XCreateImage(g_display, g_visual, 1, ZPixmap, 0, (char *) data,			     width, height, 8, scanline);	image->byte_order = MSBFirst;	image->bitmap_bit_order = MSBFirst;	XInitImage(image);	XPutImage(g_display, bitmap, g_create_glyph_gc, image, 0, 0, 0, 0, width, height);	XFree(image);	return (HGLYPH) bitmap;}voidui_destroy_glyph(HGLYPH glyph){	XFreePixmap(g_display, (Pixmap) glyph);}HCURSORui_create_cursor(unsigned int x, unsigned int y, int width, int height,		 uint8 * andmask, uint8 * xormask){	HGLYPH maskglyph, cursorglyph;	XColor bg, fg;	Cursor xcursor;	uint8 *cursor, *pcursor;	uint8 *mask, *pmask;	uint8 nextbit;	int scanline, offset;	int i, j;	scanline = (width + 7) / 8;	offset = scanline * height;	cursor = (uint8 *) xmalloc(offset);	memset(cursor, 0, offset);	mask = (uint8 *) xmalloc(offset);	memset(mask, 0, offset);	/* approximate AND and XOR masks with a monochrome X pointer */	for (i = 0; i < height; i++)	{		offset -= scanline;		pcursor = &cursor[offset];		pmask = &mask[offset];		for (j = 0; j < scanline; j++)		{			for (nextbit = 0x80; nextbit != 0; nextbit >>= 1)			{				if (xormask[0] || xormask[1] || xormask[2])				{					*pcursor |= (~(*andmask) & nextbit);					*pmask |= nextbit;				}				else				{					*pcursor |= ((*andmask) & nextbit);					*pmask |= (~(*andmask) & nextbit);				}				xormask += 3;			}			andmask++;			pcursor++;			pmask++;		}	}	fg.red = fg.blue = fg.green = 0xffff;	bg.red = bg.blue = bg.green = 0x0000;	fg.flags = bg.flags = DoRed | DoBlue | DoGreen;	cursorglyph = ui_create_glyph(width, height, cursor);	maskglyph = ui_create_glyph(width, height, mask);	xcursor =		XCreatePixmapCursor(g_display, (Pixmap) cursorglyph,				    (Pixmap) maskglyph, &fg, &bg, x, y);	ui_destroy_glyph(maskglyph);	ui_destroy_glyph(cursorglyph);	xfree(mask);	xfree(cursor);	return (HCURSOR) xcursor;}voidui_set_cursor(HCURSOR cursor){	g_current_cursor = (Cursor) cursor;	XDefineCursor(g_display, g_wnd, g_current_cursor);	ON_ALL_SEAMLESS_WINDOWS(XDefineCursor, (g_display, sw->wnd, g_current_cursor));}voidui_destroy_cursor(HCURSOR cursor){	XFreeCursor(g_display, (Cursor) cursor);}voidui_set_null_cursor(void){	ui_set_cursor(g_null_cursor);}#define MAKE_XCOLOR(xc,c) \		(xc)->red   = ((c)->red   << 8) | (c)->red; \		(xc)->green = ((c)->green << 8) | (c)->green; \		(xc)->blue  = ((c)->blue  << 8) | (c)->blue; \		(xc)->flags = DoRed | DoGreen | DoBlue;HCOLOURMAPui_create_colourmap(COLOURMAP * colours){	COLOURENTRY *entry;	int i, ncolours = colours->ncolours;	if (!g_owncolmap)	{		uint32 *map = (uint32 *) xmalloc(sizeof(*g_colmap) * ncolours);		XColor xentry;		XColor xc_cache[256];		uint32 colour;		int colLookup = 256;		for (i = 0; i < ncolours; i++)		{			entry = &colours->colours[i];			MAKE_XCOLOR(&xentry, entry);			if (XAllocColor(g_display, g_xcolmap, &xentry) == 0)			{				/* Allocation failed, find closest match. */				int j = 256;				int nMinDist = 3 * 256 * 256;				long nDist = nMinDist;				/* only get the colors once */				while (colLookup--)				{					xc_cache[colLookup].pixel = colLookup;					xc_cache[colLookup].red = xc_cache[colLookup].green =						xc_cache[colLookup].blue = 0;					xc_cache[colLookup].flags = 0;					XQueryColor(g_display,						    DefaultColormap(g_display,								    DefaultScreen(g_display)),						    &xc_cache[colLookup]);				}				colLookup = 0;				/* approximate the pixel */				while (j--)				{					if (xc_cache[j].flags)					{						nDist = ((long) (xc_cache[j].red >> 8) -							 (long) (xentry.red >> 8)) *							((long) (xc_cache[j].red >> 8) -							 (long) (xentry.red >> 8)) +							((long) (xc_cache[j].green >> 8) -							 (long) (xentry.green >> 8)) *							((long) (xc_cache[j].green >> 8) -							 (long) (xentry.green >> 8)) +							((long) (xc_cache[j].blue >> 8) -							 (long) (xentry.blue >> 8)) *							((long) (xc_cache[j].blue >> 8) -							 (long) (xentry.blue >> 8));					}					if (nDist < nMinDist)					{						nMinDist = nDist;						xentry.pixel = j;					}				}			}			colour = xentry.pixel;			/* update our cache */			if (xentry.pixel < 256)			{				xc_cache[xentry.pixel].red = xentry.red;				xc_cache[xentry.pixel].green = xentry.green;				xc_cache[xentry.pixel].blue = xentry.blue;			}			map[i] = colour;		}		return map;	}	else	{		XColor *xcolours, *xentry;		Colormap map;		xcolours = (XColor *) xmalloc(sizeof(XColor) * ncolours);		for (i = 0; i < ncolours; i++)		{			entry = &colours->colours[i];			xentry = &xcolours[i];			xentry->pixel = i;			MAKE_XCOLOR(xentry, entry);		}		map = XCreateColormap(g_display, g_wnd, g_visual, AllocAll);		XStoreColors(g_display, map, xcolours, ncolours);		xfree(xcolours);		return (HCOLOURMAP) map;	}}voidui_destroy_colourmap(HCOLOURMAP map){	if (!g_owncolmap)		xfree(map);	else		XFreeColormap(g_display, (Colormap) map);}voidui_set_colourmap(HCOLOURMAP map){	if (!g_owncolmap)	{		if (g_colmap)			xfree(g_colmap);		g_colmap = (uint32 *) map;	}	else	{		XSetWindowColormap(g_display, g_wnd, (Colormap) map);		ON_ALL_SEAMLESS_WINDOWS(XSetWindowColormap, (g_display, sw->wnd, (Colormap) map));	}}voidui_set_clip(int x, int y, int cx, int cy){	g_clip_rectangle.x = x;	g_clip_rectangle.y = y;	g_clip_rectangle.width = cx;	g_clip_rectangle.height = cy;	XSetClipRectangles(g_display, g_gc, 0, 0, &g_clip_rectangle, 1, YXBanded);}voidui_reset_clip(void){	g_clip_rectangle.x = 0;	g_clip_rectangle.y = 0;	g_clip_rectangle.width = g_width;	g_clip_rectangle.height = g_height;	XSetClipRectangles(g_display, g_gc, 0, 0, &g_clip_rectangle, 1, YXBanded);}voidui_bell(void){	XBell(g_display, 0);}voidui_destblt(uint8 opcode,	   /* dest */ int x, int y, int cx, int cy){	SET_FUNCTION(opcode);	FILL_RECTANGLE(x, y, cx, cy);	RESET_FUNCTION(opcode);}static uint8 hatch_patterns[] = {	0x00, 0x00, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00,	/* 0 - bsHorizontal */	0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08,	/* 1 - bsVertical */	0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01,	/* 2 - bsFDiagonal */	0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,	/* 3 - bsBDiagonal */	0x08, 0x08, 0x08, 0xff, 0x08, 0x08, 0x08, 0x08,	/* 4 - bsCross */	0x81, 0x42, 0x24, 0x18, 0x18, 0x24, 0x42, 0x81	/* 5 - bsDiagCross */};voidui_patblt(uint8 opcode,	  /* dest */ int x, int y, int cx, int cy,	  /* brush */ BRUSH * brush, int bgcolour, int fgcolour){	Pixmap fill;	uint8 i, ipattern[8];	SET_FUNCTION(opcode);	switch (brush->style)	{		case 0:	/* Solid */			SET_FOREGROUND(fgcolour);			FILL_RECTANGLE_BACKSTORE(x, y, cx, cy);			break;		case 2:	/* Hatch */			fill = (Pixmap) ui_create_glyph(8, 8,							hatch_patterns + brush->pattern[0] * 8);			SET_FOREGROUND(fgcolour);			SET_BACKGROUND(bgcolour);			XSetFillStyle(g_display, g_gc, FillOpaqueStippled);			XSetStipple(g_display, g_gc, fill);			XSetTSOrigin(g_display, g_gc, brush->xorigin, brush->yorigin);			FILL_RECTANGLE_BACKSTORE(x, y, cx, cy);			XSetFillStyle(g_display, g_gc, FillSolid);			XSetTSOrigin(g_display, g_gc, 0, 0);			ui_destroy_glyph((HGLYPH) fill);			break;		case 3:	/* Pattern */			for (i = 0; i != 8; i++)				ipattern[7 - i] = brush->pattern[i];			fill = (Pixmap) ui_create_glyph(8, 8, ipattern);			SET_FOREGROUND(bgcolour);			SET_BACKGROUND(fgcolour);			XSetFillStyle(g_display, g_gc, FillOpaqueStippled);			XSetStipple(g_display, g_gc, fill);			XSetTSOrigin(g_display, g_gc, brush->xorigin, brush->yorigin);			FILL_RECTANGLE_BACKSTORE(x, y, cx, cy);			XSetFillStyle(g_display, g_gc, FillSolid);			XSetTSOrigin(g_display, g_gc, 0, 0);			ui_destroy_glyph((HGLYPH) fill);			break;		default:			unimpl("brush %d\n", brush->style);	}	RESET_FUNCTION(opcode);	if (g_ownbackstore)		XCopyArea(g_display, g_backstore, g_wnd, g_gc, x, y, cx, cy, x, y);	ON_ALL_SEAMLESS_WINDOWS(XCopyArea,				(g_display, g_ownbackstore ? g_backstore : g_wnd, sw->wnd, g_gc,				 x, y, cx, cy, x - sw->xoffset, y - sw->yoffset));}voidui_screenblt(uint8 opcode,	     /* dest */ int x, int y, int cx, int cy,	     /* src */ int srcx, int srcy){	SET_FUNCTION(opcode);	if (g_ownbackstore)	{		XCopyArea(g_display, g_Unobscured ? g_wnd : g_backstore,			  g_wnd, g_gc, srcx, srcy, cx, cy, x, y);		XCopyArea(g_display, g_backstore, g_backstore, g_gc, srcx, srcy, cx, cy, x, y);	}	else	{		XCopyArea(g_display, g_wnd, g_wnd, g_gc, srcx, srcy, cx, cy, x, y);	}	ON_ALL_SEAMLESS_WINDOWS(XCopyArea,				(g_display, g_ownbackstore ? g_backstore : g_wnd,				 sw->wnd, g_gc, x, y, cx, cy, x - sw->xoffset, y - sw->yoffset));	RESET_FUNCTION(opcode);}voidui_memblt(uint8 opcode,	  /* dest */ int x, int y, int cx, int cy,	  /* src */ HBITMAP src, int srcx, int srcy){	SET_FUNCTION(opcode);	XCopyArea(g_display, (Pixmap) src, g_wnd, g_gc, srcx, srcy, cx, cy, x, y);	ON_ALL_SEAMLESS_WINDOWS(XCopyArea,				(g_display, (Pixmap) src, sw->wnd, g_gc,				 srcx, srcy, cx, cy, x - sw->xoffset, y - sw->yoffset));	if (g_ownbackstore)		XCopyArea(g_display, (Pixmap) src, g_backstore, g_gc, srcx, srcy, cx, cy, x, y);	RESET_FUNCTION(opcode);}voidui_triblt(uint8 opcode,	  /* dest */ int x, int y, int cx, int cy,	  /* src */ HBITMAP src, int srcx, int srcy,	  /* brush */ BRUSH * brush, int bgcolour, int fgcolour){	/* This is potentially difficult to do in general. Until someone	   comes up with a more efficient way of doing it I am using cases. */	switch (opcode)	{		case 0x69:	/* PDSxxn */			ui_memblt(ROP2_XOR, x, y, cx, cy, src, srcx, srcy);			ui_patblt(ROP2_NXOR, x, y, cx, cy, brush, bgcolour, fgcolour);			break;		case 0xb8:	/* PSDPxax */			ui_patblt(ROP2_XOR, x, y, cx, cy, brush, bgcolour, fgcolour);			ui_memblt(ROP2_AND, x, y, cx, cy, src, srcx, srcy);			ui_patblt(ROP2_XOR, x, y, cx, cy, brush, bgcolour, fgcolour);			break;		case 0xc0:	/* PSa */			ui_memblt(ROP2_COPY, x, y, cx, cy, src, srcx, srcy);			ui_patblt(ROP2_AND, x, y, cx, cy, brush, bgcolour, fgcolour);			break;		default:			unimpl("triblt 0x%x\n", opcode);			ui_memblt(ROP2_COPY, x, y, cx, cy, src, srcx, srcy);	}}voidui_line(uint8 opcode,	/* dest */ int startx, int starty, int endx, int endy,	/* pen */ PEN * pen){	SET_FUNCTION(opcode);	SET_FOREGROUND(pen->colour);	XDrawLine(g_display, g_wnd, g_gc, startx, starty, endx, endy);	ON_ALL_SEAMLESS_WINDOWS(XDrawLine, (g_display, sw->wnd, g_gc,					    startx - sw->xoffset, starty - sw->yoffset,					    endx - sw->xoffset, endy - sw->yoffset));	if (g_ownbackstore)		XDrawLine(g_display, g_backstore, g_gc, startx, starty, endx, endy);	RESET_FUNCTION(opcode);}voidui_rect(	       /* dest */ int x, int y, int cx, int cy,	       /* brush */ int colour){	SET_FOREGROUND(colour);	FILL_RECTANGLE(x, y, cx, cy);}voidui_polygon(uint8 opcode,	   /* mode */ uint8 fillmode,	   /* dest */ POINT * point, int npoints,	   /* brush */ BRUSH * brush, int bgcolour, int fgcolour){	uint8 style, i, ipattern[8];	Pixmap fill;	SET_FUNCTION(opcode);	switch (fillmode)	{		case ALTERNATE:

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -