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

📄 window.c.bm

📁 早期freebsd实现
💻 BM
📖 第 1 页 / 共 2 页
字号:
		if (ev.xany.window == win->boardwin) {			switch (ev.type) {			    case ButtonPress:				button_pressed(&ev, win);				break;			    case ButtonRelease:				button_released(&ev, win);				break;			    case Expose:				/* Redraw... */				win_redraw(win, &ev);				break;			    case 0:			    case NoExpose:				break;			    default:				fprintf(stderr, "Bad event type %d\n", ev.type);				exit(1);			}		} else if (ev.xany.window == win->wclockwin) {			switch (ev.type) {			    case Expose:				clock_draw(win, WHITE);				break;			    case 0:			    case NoExpose:				break;			    default:				fprintf(stderr, "Bad event type %d\n", ev.type);				exit(1);			}		} else if (ev.xany.window == win->bclockwin) {			switch (ev.type) {			    case Expose:				clock_draw(win, BLACK);				break;			    case 0:			    case NoExpose:				break;			    default:				fprintf(stderr, "Bad event type %d\n", ev.type);				exit(1);			}		} else if (ev.xany.window == win->jailwin) {			switch (ev.type) {			    case Expose:				jail_draw(win);				break;			    case 0:			    case NoExpose:				break;			    default:				fprintf(stderr, "Bad event type %d\n", ev.type);				exit(1);			}		} else if (ev.xany.window == win->buttonwin) {			switch (ev.type) {			    case ButtonPress:				button_service(win, &ev);				break;			    case Expose:				button_draw(win);				break;			    case 0:			    case NoExpose:				break;			    default:				fprintf(stderr, "Bad event type %d\n", ev.type);				exit(1);			}		} else if (ev.xany.window == win->icon) {			icon_refresh(win);		} else if (ev.xany.window == win->basewin) {			message_send(win, &ev);		} else {			fprintf(stderr, "Internal Error: service: bad win\n");			fprintf(stderr, "window = %d, event = %d\n", ev.xany.window,					ev.type);		}	}	return;}voidwin_redraw(win, event)	windata *win;	XEvent *event;{	XExposeEvent *ev = &event->xexpose;	int x1, y1, x2, y2, i, j;	drawgrid(win);	if (ev) {		x1 = ev->x / (SQUARE_WIDTH + BORDER_WIDTH);		y1 = ev->y / (SQUARE_HEIGHT + BORDER_WIDTH);		x2 = (ev->x + ev->width) / (SQUARE_WIDTH + BORDER_WIDTH);		y2 = (ev->y + ev->height) / (SQUARE_HEIGHT + BORDER_WIDTH);	} else {		x1 = 0;		y1 = 0;		x2 = SIZE - 1;		y2 = SIZE - 1;	}	if (x1 < 0) x1 = 0;	if (y1 < 0) y1 = 0;	if (x2 < 0) x2 = 0;	if (y2 < 0) y2 = 0;	if (x1 > SIZE - 1) x1 = SIZE - 1;	if (y1 > SIZE - 1) y1 = SIZE - 1;	if (x2 > SIZE - 1) x2 = SIZE - 1;	if (y2 > SIZE - 1) y2 = SIZE - 1;	if (win->flipped) {		y1 = SIZE - y2 - 1;		y2 = SIZE - y1 - 1;		x1 = SIZE - x2 - 1;		x2 = SIZE - x1 - 1;	}	for (i = x1; i <= x2; i++) 		for (j = y1; j <= y2; j++) {			if (chessboard->square[j][i].color == NONE)				win_erasepiece(j, i, WHITE);			else				win_drawpiece(&chessboard->square[j][i], j, i,						WHITE);			if (!oneboard) {				if (chessboard->square[j][i].color == NONE)					win_erasepiece(j, i, BLACK);				else					win_drawpiece(&chessboard->square[j][i],							j, i, BLACK);			}		}		return;}static boolsetup(dispname, win)	char *dispname;	windata *win;{	char buf[BSIZE], *s;	Pixmap bm, bmask;	Cursor cur;	extern char *program, *recfile;		if (!(win->display = XOpenDisplay(dispname)))		return (false);		/* Now get boolean defaults... */	if ((s = XGetDefault(win->display, program, "noisy")) && eq(s, "on"))		noisyflag = true;	if ((s = XGetDefault(win->display, program, "savemoves")) && eq(s, "on"))		saveflag = true;	if ((s = XGetDefault(win->display, program, "algebraic")) && eq(s, "on"))		record_english = false;	if ((s = XGetDefault(win->display, program, "blackandwhite")) && eq(s, "on"))		bnwflag = true;	if ((s = XGetDefault(win->display, program, "quickrestore")) && eq(s, "on"))		quickflag = true;	if ((s = XGetDefault(win->display, program, "flash")) && eq(s, "on"))		win_flashmove = true;		/* ... numeric variables ... */	if (s = XGetDefault(win->display, program, "numflashes"))		num_flashes = atoi(s);	if (s = XGetDefault(win->display, program, "flashsize"))		flash_size = atoi(s);		/* ... and strings. */	if (s = XGetDefault(win->display, program, "progname"))		progname = s;	if (s = XGetDefault(win->display, program, "proghost"))		proghost = s;	if (s = XGetDefault(win->display, program, "recordfile"))		recfile = s;	if (s = XGetDefault(win->display, program, "blackpiece"))		black_piece_color = s;	if (s = XGetDefault(win->display, program, "whitepiece"))		white_piece_color = s;	if (s = XGetDefault(win->display, program, "blacksquare"))		black_square_color = s;	if (s = XGetDefault(win->display, program, "whitesquare"))		white_square_color = s;	if (s = XGetDefault(win->display, program, "bordercolor"))		border_color = s;	if (s = XGetDefault(win->display, program, "textcolor"))		text_color = s;	if (s = XGetDefault(win->display, program, "textback"))		text_back = s;	if (s = XGetDefault(win->display, program, "errortext"))		error_text = s;	if (s = XGetDefault(win->display, program, "playertext"))		player_text = s;	if (s = XGetDefault(win->display, program, "cursorcolor"))		cursor_color = s;	if ((DisplayPlanes(win->display, 0) == 1) || bnwflag)		win->bnw = true;		/* Allocate colors... */	if (win->bnw) {		win->blackpiece.pixel = BlackPixel (win->display, 0);		win->whitepiece.pixel = WhitePixel (win->display, 0);		win->blacksquare.pixel = BlackPixel (win->display, 0);		win->whitesquare.pixel = WhitePixel (win->display, 0);		win->border.pixel = BlackPixel (win->display, 0);		win->textcolor.pixel = BlackPixel (win->display, 0);		win->textback.pixel = WhitePixel (win->display, 0);		win->playertext.pixel = BlackPixel (win->display, 0);		win->errortext.pixel = BlackPixel (win->display, 0);		win->cursorcolor.pixel = BlackPixel (win->display, 0) ;	} else {	    if (!XParseColor(win->display,			     DefaultColormap(win->display, 0),			     black_piece_color, &win->blackpiece) ||  		!XParseColor(win->display,			     DefaultColormap(win->display, 0),			     white_piece_color, &win->whitepiece) ||  		!XParseColor(win->display,			     DefaultColormap(win->display, 0),			     black_square_color, &win->blacksquare) ||  		!XParseColor(win->display,			     DefaultColormap(win->display, 0),			     white_square_color, &win->whitesquare) ||  		!XParseColor(win->display,			     DefaultColormap(win->display, 0),			     border_color, &win->border) ||  		!XParseColor(win->display,			     DefaultColormap(win->display, 0),			     text_color, &win->textcolor) ||  		!XParseColor(win->display,			     DefaultColormap(win->display, 0),			     text_back, &win->textback) ||  		!XParseColor(win->display,			     DefaultColormap(win->display, 0),			     error_text, &win->errortext) ||  		!XParseColor(win->display,			     DefaultColormap(win->display, 0),			     player_text, &win->playertext) ||  		!XParseColor(win->display,			     DefaultColormap(win->display, 0),			     cursor_color, &win->cursorcolor) ||		!XAllocColor(win->display,			     DefaultColormap(win->display, 0),			     &win->blackpiece) ||  		!XAllocColor(win->display,			     DefaultColormap(win->display, 0),			     &win->whitepiece) ||  		!XAllocColor(win->display,			     DefaultColormap(win->display, 0),			     &win->blacksquare) ||  		!XAllocColor(win->display,			     DefaultColormap(win->display, 0),			     &win->whitesquare) ||   		!XAllocColor(win->display,			     DefaultColormap(win->display, 0),			     &win->border) ||  		!XAllocColor(win->display,			     DefaultColormap(win->display, 0),			     &win->textcolor) ||  		!XAllocColor(win->display,			     DefaultColormap(win->display, 0),			     &win->textback) ||  		!XAllocColor(win->display,			     DefaultColormap(win->display, 0),			     &win->errortext) ||  		!XAllocColor(win->display,			     DefaultColormap(win->display, 0),			     &win->playertext) ||  		!XAllocColor(win->display,			     DefaultColormap(win->display, 0),			     &win->cursorcolor))   		fprintf(stderr, "Can't get color...\n");	}	/* Get fonts... */	win->small = XLoadQueryFont(win->display,SMALL_FONT);	win->medium = XLoadQueryFont(win->display,MEDIUM_FONT);	win->large = XLoadQueryFont(win->display,LARGE_FONT);		/* Create the windows... */	win->basewin =	    XCreateSimpleWindow(win->display,DefaultRootWindow(win->display),			  BASE_XPOS, BASE_YPOS, 			  BASE_WIDTH, BASE_HEIGHT, 0,			  BlackPixel(win->display, 0),			  WhitePixel(win->display, 0)); 	win->boardwin = XCreateSimpleWindow(win->display,win->basewin,					    BOARD_XPOS, BOARD_YPOS, 					    BOARD_WIDTH, BOARD_HEIGHT,					    BORDER_WIDTH,					    win->border.pixel,					    WhitePixel(win->display, 0));	win->recwin = XCreateSimpleWindow(win->display,win->basewin,					  RECORD_XPOS, RECORD_YPOS,					  RECORD_WIDTH, RECORD_HEIGHT,					  BORDER_WIDTH, win->border.pixel,					  win->textback.pixel);	win->jailwin = XCreateSimpleWindow(win->display,win->basewin,					   JAIL_XPOS, JAIL_YPOS,					   JAIL_WIDTH, JAIL_HEIGHT,					   BORDER_WIDTH,					   win->border.pixel,					   win->textback.pixel);	win->wclockwin = XCreateSimpleWindow(win->display,win->basewin,					     WCLOCK_XPOS, WCLOCK_YPOS,					     CLOCK_WIDTH, CLOCK_HEIGHT,					     BORDER_WIDTH, win->border.pixel,					     win->textback.pixel);	win->bclockwin = XCreateSimpleWindow(win->display,win->basewin,					     BCLOCK_XPOS, BCLOCK_YPOS,					     CLOCK_WIDTH, CLOCK_HEIGHT,					     BORDER_WIDTH, win->border.pixel,					     win->textback.pixel);	win->messagewin = XCreateSimpleWindow(win->display,win->basewin,					      MESS_XPOS, MESS_YPOS,					      MESS_WIDTH, MESS_HEIGHT,					      BORDER_WIDTH, win->border.pixel,					      win->textback.pixel);	win->buttonwin = XCreateSimpleWindow(win->display,win->basewin,					     BUTTON_XPOS, BUTTON_YPOS,					     BUTTON_WIDTH, BUTTON_HEIGHT,					     BORDER_WIDTH, win->border.pixel,					     win->textback.pixel);		/* Let's define an icon... */	win->iconpixmap = XCreatePixmapFromBitmapData(win->display,						      win->basewin, icon_bits,						      icon_width, icon_height,						      win->blacksquare.pixel,						      win->whitesquare.pixel,						      1);		bm = XCreateBitmapFromData(win->display,				   win->basewin, xchess_bits,				   xchess_width, xchess_height);	bmask = XCreateBitmapFromData(win->display,				   win->basewin, xchess_mask_bits,				   xchess_width, xchess_height);	cur = XCreatePixmapCursor(win->display, bm, bmask,			    &win->cursorcolor,			    &WhitePixel(win->display, 0),			    xchess_x_hot, xchess_y_hot);	XFreePixmap(win->display, bm);	XFreePixmap(win->display, bmask);		XDefineCursor(win->display,win->basewin, cur);	XMapSubwindows(win->display,win->basewin);	XMapRaised(win->display,win->basewin);	XSelectInput(win->display,win->basewin, KeyPressMask);	XSelectInput(win->display,win->boardwin,		     ButtonPressMask | ButtonReleaseMask | ExposureMask);	XSelectInput(win->display,win->recwin,		     ButtonReleaseMask | ExposureMask);	XSelectInput(win->display,win->jailwin, ExposureMask);	XSelectInput(win->display,win->wclockwin, ExposureMask);	XSelectInput(win->display,win->bclockwin, ExposureMask);	XSelectInput(win->display,win->messagewin,		     ButtonReleaseMask | ExposureMask);	XSelectInput(win->display,win->buttonwin,		     ButtonPressMask | ExposureMask);		message_init(win);	record_init(win);	button_draw(win);	jail_init(win);	clock_init(win, WHITE);	clock_init(win, BLACK);	if (timeunit) {		if (timeunit > 1800)			sprintf(buf, "%d moves every %.2lg hours.\n",				movesperunit, ((double) timeunit) / 3600);		else if (timeunit > 30)			sprintf(buf, "%d moves every %.2lg minutes.\n",				movesperunit, ((double) timeunit) / 60);		else			sprintf(buf, "%d moves every %d seconds.\n",				movesperunit, timeunit);		message_add(win, buf, false);	}		return (true);}static voiddrawgrid(win)	windata *win;{	int i;	XGCValues gc;	gc.function = GXcopy;	gc.plane_mask = AllPlanes;	gc.foreground = win->border.pixel;	gc.line_width = 0;	gc.line_style = LineSolid;		XChangeGC(win->display,		  DefaultGC(win->display, 0),		  GCFunction | GCPlaneMask | GCForeground |		  GCLineWidth | GCLineStyle, &gc);		/* Draw the lines... horizontal, */	for (i = 1; i < SIZE; i++)		XDrawLine(win->display, win->boardwin,			  DefaultGC(win->display, 0), 0,			  i * (SQUARE_WIDTH + BORDER_WIDTH) -			      BORDER_WIDTH / 2,			  SIZE * (SQUARE_WIDTH + BORDER_WIDTH),			  i * (SQUARE_WIDTH + BORDER_WIDTH) -			      BORDER_WIDTH / 2);	/* and vertical... */	for (i = 1; i < SIZE; i++)		XDrawLine(win->display, win->boardwin,			  DefaultGC(win->display, 0),			  i * (SQUARE_WIDTH + BORDER_WIDTH) -				BORDER_WIDTH / 2, 0,			  i * (SQUARE_WIDTH + BORDER_WIDTH) -			        BORDER_WIDTH / 2, 			  SIZE * (SQUARE_WIDTH + BORDER_WIDTH));	return;}voidwin_restart(){	win1->flipped = false;	win_redraw(win1, (XEvent *) NULL);	if (!oneboard) {		win2->flipped = true;		win_redraw(win2, (XEvent *) NULL);	}	return;}static voidicon_refresh(win)	windata *win;{	XCopyArea(win->display, win->iconpixmap, win->icon,		  DefaultGC(win->display, 0),		  0, 0, icon_width, icon_height, 0, 0);	return;}

⌨️ 快捷键说明

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