예제 #1
0
파일: titlebar.c 프로젝트: varialus/agar
static void
Draw(void *obj)
{
	AG_Titlebar *tbar = obj;

	AG_DrawBox(tbar,
	    AG_RECT(0, 0, WIDTH(tbar), HEIGHT(tbar)),
	    tbar->pressed ? -1 : 1,
	    AG_WindowIsFocused(tbar->win) ? WCOLOR(tbar,0) : WCOLOR_DIS(tbar,0));

	WIDGET_SUPER_OPS(tbar)->draw(tbar);
}
예제 #2
0
파일: drv_sdl_common.c 프로젝트: adsr/agar
/*
 * Process an input device event.
 * XXX TODO: a lot of this code is generic to all SW drivers.
 */
static int
ProcessInputEvent(AG_Driver *drv, AG_DriverEvent *dev)
{
	AG_DriverSw *dsw = (AG_DriverSw *)drv;
	AG_Window *win;

	/* Signal any modal windows of outside clicks. */
	if (dsw->Lmodal->n > 0) {
		win = dsw->Lmodal->v[dsw->Lmodal->n-1].data.p;
		switch (dev->type) {
		case AG_DRIVER_MOUSE_BUTTON_DOWN:
		case AG_DRIVER_MOUSE_BUTTON_UP:
			if (GenericModalClose(win,
			    dev->data.button.x, dev->data.button.y)) {
				return (1);
			}
			break;
		default:
			break;
		}
		goto scan;		/* Skip WM events */
	}

	/* Process WM events */
	switch (dev->type) {
	case AG_DRIVER_MOUSE_BUTTON_DOWN:		/* Focus on window */
		AG_WindowFocusAtPos(dsw, dev->data.button.x, dev->data.button.y);
		break;
	case AG_DRIVER_MOUSE_BUTTON_UP:			/* Terminate WM op */
		dsw->winop = AG_WINOP_NONE;
		break;
	default:
		break;
	}

scan:
	AG_FOREACH_WINDOW_REVERSE(win, dsw) {
		AG_ObjectLock(win);

		/* XXX TODO move invisible windows to different tailq! */
		if (!win->visible || (dsw->Lmodal->n > 0 &&
		    win != dsw->Lmodal->v[dsw->Lmodal->n-1].data.p)) {
			AG_ObjectUnlock(win);
			continue;
		}
		switch (dev->type) {
		case AG_DRIVER_MOUSE_MOTION:
			if (dsw->winop != AG_WINOP_NONE) {
				if (dsw->winSelected != win) {
					AG_ObjectUnlock(win);
					continue;
				}
				AG_WM_MouseMotion(dsw, win,
				    drv->mouse->xRel,
				    drv->mouse->yRel);
			}
			AG_ProcessMouseMotion(win,
			    dev->data.motion.x, dev->data.motion.y,
			    drv->mouse->xRel, drv->mouse->yRel,
			    drv->mouse->btnState);
			if (AG_WindowIsFocused(win)) {
				AG_MouseCursorUpdate(win,
				    dev->data.motion.x,
				    dev->data.motion.y);
			}
			break;
		case AG_DRIVER_MOUSE_BUTTON_UP:
			/* Terminate active window operations. */
			/* XXX redundant? */
			if (dsw->winop != AG_WINOP_NONE) {
				dsw->winop = AG_WINOP_NONE;
				dsw->winSelected = NULL;
			}
			AG_ProcessMouseButtonUp(win,
			    dev->data.button.x, dev->data.button.y,
			    dev->data.button.which);
			if (agWindowToFocus != NULL ||
			    !TAILQ_EMPTY(&agWindowDetachQ)) {
				AG_ObjectUnlock(win);
				return (1);
			}
			break;
		case AG_DRIVER_MOUSE_BUTTON_DOWN:
			if (!AG_WidgetArea(win, dev->data.button.x,
			    dev->data.button.y)) {
				AG_ObjectUnlock(win);
				continue;
			}
			if (win->wBorderBot > 0 &&
			    !(win->flags & AG_WINDOW_NORESIZE)) {
				dsw->winop = GenericMouseOverCtrl(win,
				    dev->data.button.x, dev->data.button.y);
				if (dsw->winop != AG_WINOP_NONE) {
					dsw->winSelected = win;
					AG_ObjectUnlock(win);
					return (1);
				}
			}
			AG_ProcessMouseButtonDown(win,
			    dev->data.button.x, dev->data.button.y,
			    dev->data.button.which);
			if (agWindowToFocus != NULL ||
			    !TAILQ_EMPTY(&agWindowDetachQ)) {
				AG_ObjectUnlock(win);
				return (1);
			}
			break;
		case AG_DRIVER_KEY_UP:
			if (dsw->winLastKeydown != NULL &&
			    dsw->winLastKeydown != win) {
				/*
				 * Key was initially pressed while another
				 * window was holding focus, ignore.
				 */
				dsw->winLastKeydown = NULL;
				break;
			}
			AG_ProcessKey(drv->kbd, win, AG_KEY_RELEASED,
			    dev->data.key.ks, dev->data.key.ucs);
			break;
		case AG_DRIVER_KEY_DOWN:
			AG_ProcessKey(drv->kbd, win, AG_KEY_PRESSED,
			    dev->data.key.ks, dev->data.key.ucs);
			break;
		default:
			break;
		}
		AG_ObjectUnlock(win);
	}