int draw_window(struct window * w) { int i; /* clear background */ ggiSetGCForeground(w->vis, ggiMapColor(w->vis,&w->backgroundcolor)); ggiDrawBox(w->vis, w->xorigin, w->yorigin, w->xsize, w->ysize); /* draw border */ ggiSetGCForeground(w->vis, ggiMapColor(w->vis,&w->bordercolor)); for (i = w->borderwidth; i > 0; i--){ /*printf("border %d\n", i);*/ ggiDrawHLine(w->vis, w->xorigin, w->yorigin+i-1, w->xsize); ggiDrawHLine(w->vis, w->xorigin, w->yorigin+w->ysize-i, w->xsize); ggiDrawVLine(w->vis, w->xorigin+i-1, w->yorigin, w->ysize); ggiDrawVLine(w->vis, w->xorigin+w->xsize-i, w->yorigin, w->ysize); } ggiSetGCForeground(w->vis, ggiMapColor(w->vis,&w->titlecolor)); ggiSetGCBackground(w->vis, ggiMapColor(w->vis,&w->backgroundcolor)); ggiPuts(w->vis, w->xorigin+10, w->yorigin+/*2*/0, w->title); return 0; }
static void animate(ggi_visual_t vis, ggi_mode * mode, int j) { int f, w, h; ggi_pixel *buf; ggi_color c1, c2; c1.r = ((sin((double) j / 100) + 1) * 32768); c1.g = ((sin(2.094394 + (double) j / 100) + 1) * 32768); c1.b = ((sin(4.188789 + (double) j / 100) + 1) * 32768); c1.a = 0; c2.r = ((sin(3.141592 + (double) j / 100) + 1) * 32768); c2.g = ((sin(5.235986 + (double) j / 100) + 1) * 32768); c2.b = ((sin(7.330381 + (double) j / 100) + 1) * 32768); c2.a = 0; ggiSetGCForeground(vis, ggiMapColor(vis, &c1)); ggiSetGCBackground(vis, ggiMapColor(vis, &c2)); w = mode->virt.x / mode->frames; h = mode->virt.y / 5; buf = malloc(w * h * GT_SIZE(mode->graphtype)); if (buf == NULL) return; ggiSetOrigin(vis, j % (mode->virt.x - mode->visible.x + 1), j % (mode->virt.y - mode->visible.y + 1)); for (f = 0; f < mode->frames; f++) { int x, y, yspan; x = f * w; yspan = mode->virt.y - h; y = (j + (yspan * 2 * (f / mode->frames))) % (2 * yspan); y += yspan * 2 * f / mode->frames; y %= yspan * 2; if (y >= yspan) y = yspan * 2 - y; x += (int)(sin(3.14159264 * 4 * y / yspan) + 1) * (w * 1 / 10); ggiSetWriteFrame(vis, f); ggiSetReadFrame(vis, (f + 1) % mode->frames); animate_one_frame(vis, x, y, w * 4 / 5, h, buf, (x + w * (mode->frames - 1) + w / 2) % mode->virt.x); } free(buf); }
static void perf_PUTSTR(TeleUser *u, TeleCmdPutStrData *d) { /* Note: If your compiler fails here, then it * is _not_ ANSI C99 compliant */ int i; #ifdef _MSC_VER char *s = _alloca(d->length + 1); #else char s[d->length + 1]; #endif s[d->length] = '\0'; for(i = 0; i < d->length; ++i) { s[i] = (char)(d->text[i] & 0xFF); } /* for */ ggiSetGCForeground(vis, (ggi_pixel)d->fg); ggiSetGCBackground(vis, (ggi_pixel)d->bg); ggiPuts(vis, d->x, d->y, s); }
int main(int argc, const char *argv[]) { ggi_visual_t vis; ggi_mode mode; int i, j, cx, cy, c; char buf[80]; /* Set up the random number generator */ srandom((unsigned)time(NULL)); /* Initialize LibGGI */ if (giiInit() < 0) { fprintf(stderr, "Cannot initialize LibGII!\n"); return 1; } if (ggiInit() < 0) { fprintf(stderr, "Cannot initialize LibGGI!\n"); giiExit(); return 1; } vis = ggNewStem(NULL); if (!vis) { fprintf(stderr, "Cannot open create stem!\n"); ggiExit(); giiExit(); return 1; } if (giiAttach(vis) < 0) { fprintf(stderr, "Cannot attach LibGII!\n"); ggDelStem(vis); ggiExit(); giiExit(); return 1; } if (ggiAttach(vis) < 0) { fprintf(stderr, "Cannot attach LibGGI!\n"); ggDelStem(vis); ggiExit(); giiExit(); return 1; } /* Open default visual */ if (ggiOpen(vis, NULL) < 0) { fprintf(stderr, "Cannot open default visual!\n"); ggDelStem(vis); ggiExit(); giiExit(); return 1; } /* Set visual to async mode (drawing not immediate) */ ggiSetFlags(vis, GGIFLAG_ASYNC); /* Set default mode, but with multiple buffering */ if (argc > 1) { ggiParseMode(argv[1], &mode); } else { ggiParseMode("", &mode); if (mode.frames < 2) mode.frames = 2; } if (ggiSetMode(vis, &mode)) { fprintf(stderr, "Cannot set mode!\n"); ggDelStem(vis); ggiExit(); giiExit(); return 1; } ggiGetCharSize(vis, &cx, &cy); /* Setup palette */ if (GT_SCHEME(mode.graphtype) == GT_PALETTE) { ggiSetColorfulPalette(vis); } /* Write something into each frame */ for (i = 0; i < mode.frames; i++) { if (ggiSetWriteFrame(vis, i)) { fprintf(stderr, "Cannot set write frame!\n"); ggDelStem(vis); ggiExit(); giiExit(); return 1; } ggiSetGCBackground(vis, ggiMapColor(vis, &white)); ggiSetGCForeground(vis, ggiMapColor(vis, &white)); ggiFillscreen(vis); } /* Clip a small border so that clipping can be verified. */ ggiSetGCClipping(vis, 5, 5, mode.virt.x - 5, mode.virt.y - 5); /* Write something into each frame */ for (i = 0; i < mode.frames; i++) { ggiSetWriteFrame(vis, i); ggiSetGCBackground(vis, ggiMapColor(vis, &black)); ggiSetGCForeground(vis, ggiMapColor(vis, &black)); ggiFillscreen(vis); snprintf(buf, sizeof(buf), "Hello World #%d!", i); for (j = 0; j < mode.virt.y; j += cy) { ggi_color col; int x = random() % mode.virt.x; int h = (random() & 0x7fff) + 0x8000; int l = (random() & 0x7fff); /* Use different colors for different frames */ col.r = ((i + 1) & 1) ? h : l; col.g = ((i + 1) & 2) ? h : l; col.b = ((i + 1) & 4) ? h : l; ggiSetGCForeground(vis, ggiMapColor(vis, &col)); ggiPuts(vis, x, j, buf); } /* Flush commands before proceeding to the next frame */ ggiFlush(vis); } /* Cycle through frames */ i = 0; j = 0; do { if (ggiSetDisplayFrame(vis, i)) { ggPanic("Cannot set display frame!\n"); } /* Wait */ c = GIIK_VOID; do { struct timeval tv = { 0, 0 }; int key; /* Flush command before waiting for input */ ggiFlush(vis); key = giiEventPoll(vis, emKeyPress, &tv); if (key & emKeyPress) c = giiGetc(vis); ggUSleep(50000); animate(vis, &mode, j); j++; } while (c == GIIK_VOID || GII_KTYP(c) == GII_KT_MOD); i = (i + 1) % mode.frames; } while (c != 'q' && c != 'Q' && c != 'x' && c != 'X' && c != GIIUC_Escape); ggiClose(vis); ggDelStem(vis); ggiExit(); giiExit(); return 0; }
int do_menu(struct menu * m , int selected) { /* select a menu item by either a number or with arrow keys */ int i; int evmask; gii_event ev; struct timeval t= {0,0}; int oldselection = selected; draw_window(&m->w); if (m->toptext != NULL) { ggiSetGCForeground(m->w.vis, ggiMapColor(m->w.vis,&m->toptextcolor)); /* FIXME*/ ggiPuts(m->w.vis, m->w.xorigin+m->toptextx, m->w.yorigin+m->toptexty, m->toptext); } if (m->bottomtext != NULL) { ggiSetGCForeground(m->w.vis, ggiMapColor(m->w.vis,&m->bottomtextcolor)); /* FIXME*/ ggiPuts(m->w.vis, m->w.xorigin+m->bottomtextx, m->w.yorigin+m->bottomtexty, m->bottomtext); } for (i = 0; i<=m->lastentry; i++) { if (i!=selected) { ggiSetGCForeground(m->w.vis, ggiMapColor(m->w.vis,&m->entrycolor)); ggiSetGCBackground(m->w.vis, ggiMapColor(m->w.vis,&m->w.backgroundcolor)); } else { ggiSetGCForeground(m->w.vis, ggiMapColor(m->w.vis,&m->selectedcolor)); ggiSetGCBackground(m->w.vis, ggiMapColor(m->w.vis, &m->selectedbackgroundcolor)); } ggiPuts( m->w.vis, m->w.xorigin + m->entry[i].x, m->w.yorigin + m->entry[i].y, m->entry[i].text); } for (;;) { /* if we are in asynchronous mode, we must guarantee */ /* the user sees he's next. */ ggiFlush(m->w.vis); /* get a keypress */ evmask = emKey; giiEventPoll(m->w.vis, evmask, NULL); while (giiEventPoll(m->w.vis, evmask,&t)) { do { giiEventRead(m->w.vis,&ev, evmask); } while (!((1<<ev.any.type)&evmask)); switch(ev.any.type) { case evKeyPress: case evKeyRepeat: switch(ev.key.sym) { case '1': selected = 0; break; case '2': selected = 1; break; case '3': selected = 2; break; case '4': selected = 3; break; case '5': selected = 4; break; case '6': selected = 5; break; case '7': selected = 6; break; case '8': selected = 7; break; case '9': selected = 8; break; case GIIK_Up: selected--; break; case GIIK_Down: selected++; break; case GIIK_Enter: ggiFlush(m->w.vis); /* just to make sure */ return (selected); break; /* never get here */ case GIIUC_Escape: ggiFlush(m->w.vis); /* just to make sure */ return (-1); default: /*printf("unknown sym=%4x code=%4x\n", ev.key.sym, ev.key.code);*/ break; } default: /*printf("can't handle this event yet.\n");*/ break; } } ggiSetGCForeground(m->w.vis, ggiMapColor(m->w.vis,&m->entrycolor)); ggiSetGCBackground(m->w.vis, ggiMapColor(m->w.vis,&m->w.backgroundcolor)); ggiPuts( m->w.vis, m->w.xorigin+m->entry[oldselection].x, m->w.yorigin+m->entry[oldselection].y, m->entry[oldselection].text); if (selected<0) selected = 0; if (selected > m->lastentry) selected = m->lastentry; ggiSetGCForeground(m->w.vis, ggiMapColor(m->w.vis,&m->selectedcolor)); ggiSetGCBackground(m->w.vis, ggiMapColor(m->w.vis, &m->selectedbackgroundcolor)); ggiPuts( m->w.vis, m->w.xorigin + m->entry[selected].x, m->w.yorigin + m->entry[selected].y, m->entry[selected].text); oldselection = selected; } }