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); }
/* * 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); }