/* Note: If we are terminated, this could be called in the middle of another SDL video routine -- notably UpdateRects. */ void PG_VideoQuit(_THIS) { if (this->screen->pixels != NULL) { shmdt(this->screen->pixels); this->screen->pixels = NULL; pgDelete(this->hidden->bitmap); } pgDelete(this->hidden->wCanvas); pgDelete(this->hidden->wApp); }
static int evtChangeTheme(struct pgEvent *evt) { char buf[80]; int i; pghandle currContext; i = pgGetPayload(evt->from); if (array[i].active) { pgDelete(array[i].handle); array[i].active = 0; } else { /* fixme buffer overflow... */ strcpy(buf, pgGetString(array[i].dir)); strcat(buf, pgGetString(array[i].fname)); printf("buf: %s", buf); /* pgSetContext(*themeContext); */ /* array[i].handle = pgLoadTheme(pgFromFile(buf)); */ /* pgSetContext(*pageContext); */ currContext = pgGetContext(); pgSetContext(*(pghandle*)(evt->extra)); array[i].handle = pgLoadTheme(pgFromFile(buf)); pgSetContext(currContext); array[i].active = 1; } return 0; }
int btnFont(struct pgEvent *evt) { pghandle fnt; fnt = pgFontPicker("Pick a new font"); if (fnt) { /* Delete the old font, and set the new font */ pgDelete(pgGetWidget(wFontBtn,PG_WP_FONT)); pgSetWidget(wFontBtn,PG_WP_FONT,fnt,0); } return 0; }
void set_vfd_text(pghandle vfd,const char *text) { /* Use the lower level canvas commands to change the VFD's text. * The display's previous text is stored as its payload so we can * delete it, and we set the new text by changing the text gropnode's * parameter */ pghandle h; pgDelete(pgGetPayload(vfd)); h = pgNewString(text); pgWriteCmd(vfd,PGCANVAS_SETGROP,1,h); pgWriteCmd(vfd,PGCANVAS_REDRAW,0); pgSetPayload(vfd,h); }
int btnInput(struct pgEvent *evt) { pghandle str; str = pgInputDialog("Input Test", "What... is the air-speed velocity of\n" "an unladen swallow?", pgGetWidget(wInputBtn,PG_WP_TEXT)); if (str) { /* Normally we would use pgReplaceText, but we already have a * handle so we can save a step. */ pgDelete(pgGetWidget(wInputBtn,PG_WP_TEXT)); pgSetWidget(wInputBtn,PG_WP_TEXT,str,0); } return 0; }
int selectInterface (struct pgEvent *evt) { /* change the interface to monitor */ pghandle str; str = pgInputDialog ("Interface selection", "Which interface you want to monitor ?", pgGetWidget (wDeviceName, PG_WP_TEXT)); if (str) { /* Normally we would use pgReplaceText, but we already have a * handle so we can save a step. */ pgDelete (pgGetWidget( wDeviceName, PG_WP_TEXT)); pgSetWidget (wDeviceName, PG_WP_TEXT, str, 0); } return 0; }
SDL_Surface *PG_SetVideoMode(_THIS, SDL_Surface *current, int width, int height, int bpp, Uint32 flags) { if ( this->hidden->bitmap ) { /* Free old bitmap */ if (current->pixels) { shmdt(current->pixels); current->pixels = NULL; } pgDelete(this->hidden->bitmap); } /* Allocate the new pixel format for the screen */ if ( ! SDL_ReallocFormat(current, bpp, 0, 0, 0, 0) ) { SDL_SetError("Couldn't allocate new pixel format for requested mode"); return(NULL); } /* Create a new picogui bitmap */ this->hidden->bitmap = pgCreateBitmap(width,height); this->hidden->shm = *pgMakeSHMBitmap(this->hidden->bitmap); current->pixels = shmat(shmget(this->hidden->shm.shm_key, this->hidden->shm.shm_length,0),NULL,0); /* Reset the canvas, and draw persistent and incremental grops. * Use mapping and offsets to center it. */ pgWriteCmd(this->hidden->wCanvas, PGCANVAS_NUKE, 0); /* 0. Set the source position during incremental rendering */ pgWriteCmd(this->hidden->wCanvas, PGCANVAS_GROP, 5, PG_GROP_SETSRC,0,0,0,0); pgWriteCmd(this->hidden->wCanvas, PGCANVAS_GROPFLAGS, 1, PG_GROPF_INCREMENTAL); /* 1. Incremental bitmap rendering */ pgWriteCmd(this->hidden->wCanvas, PGCANVAS_GROP, 6, PG_GROP_BITMAP, 0,0,0,0,this->hidden->bitmap); pgWriteCmd(this->hidden->wCanvas, PGCANVAS_GROPFLAGS, 1, PG_GROPF_INCREMENTAL); /* 2. Normal bitmap rendering */ pgWriteCmd(this->hidden->wCanvas, PGCANVAS_GROP, 6, PG_GROP_BITMAP, 0,0,this->hidden->shm.width,this->hidden->shm.height,this->hidden->bitmap); /* Set up the new mode framebuffer */ current->flags = 0; current->w = this->hidden->shm.width; current->h = this->hidden->shm.height; current->pitch = this->hidden->shm.pitch; /* Set up pixel format */ current->format->BitsPerPixel = this->hidden->shm.bpp; current->format->BytesPerPixel = this->hidden->shm.bpp >> 3; if (this->hidden->shm.bpp & 7) current->format->BytesPerPixel++; current->format->palette = NULL; current->format->Rmask = this->hidden->shm.red_mask; current->format->Gmask = this->hidden->shm.green_mask; current->format->Bmask = this->hidden->shm.blue_mask; current->format->Amask = this->hidden->shm.alpha_mask; current->format->Rshift = this->hidden->shm.red_shift; current->format->Gshift = this->hidden->shm.green_shift; current->format->Bshift = this->hidden->shm.blue_shift; current->format->Ashift = this->hidden->shm.alpha_shift; current->format->Rloss = 8 - this->hidden->shm.red_length; current->format->Gloss = 8 - this->hidden->shm.green_length; current->format->Bloss = 8 - this->hidden->shm.blue_length; current->format->Aloss = 8 - this->hidden->shm.alpha_length; /* Draw the app */ pgUpdate(); /* We're done */ return(current); }
/* Options Dialog */ int btnDialog(struct pgEvent *btnevt) { struct pgEvent evt; pghandle wSampleTB,wOk,wCancel,wSetFont,wOptionBox,wTB; pghandle w24hour,wSeconds,wColon,wWeekDay,wDay,wMonth,wYear; struct clockData oldData; /* Save data in case of cancel */ oldData = currentClock; /* Top-level widgets */ pgEnterContext(); pgDialogBox("Clock Preferences"); wTB = pgNewWidget(PG_WIDGET_TOOLBAR,0,0); pgSetWidget(PGDEFAULT, PG_WP_SIDE,PG_S_BOTTOM, 0); wSampleTB = pgNewWidget(PG_WIDGET_TOOLBAR,0,0); wOptionBox = pgNewWidget(PG_WIDGET_BOX,0,0); pgNewWidget(PG_WIDGET_SCROLL,PG_DERIVE_BEFORE,wOptionBox); pgSetWidget(PGDEFAULT, PG_WP_BIND,wOptionBox, 0); /* Options */ w24hour = pgNewWidget(PG_WIDGET_CHECKBOX,PG_DERIVE_INSIDE,wOptionBox); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("24-hour clock"), PG_WP_ON,currentClock.enable24hour, 0); wSeconds = pgNewWidget(PG_WIDGET_CHECKBOX,0,0); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("Show seconds"), PG_WP_ON,currentClock.enableSeconds, 0); wColon = pgNewWidget(PG_WIDGET_CHECKBOX,0,0); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("Flash colon"), PG_WP_ON,currentClock.flashColon, 0); wSetFont = pgNewWidget(PG_WIDGET_BUTTON,0,0); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("Set Font"), PG_WP_SIDE,PG_S_TOP, 0); wWeekDay = pgNewWidget(PG_WIDGET_CHECKBOX,0,0); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("Show weekday"), PG_WP_ON,currentClock.enableWeekDay, 0); wDay = pgNewWidget(PG_WIDGET_CHECKBOX,0,0); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("Show day"), PG_WP_ON,currentClock.enableDay, 0); wMonth = pgNewWidget(PG_WIDGET_CHECKBOX,0,0); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("Show month"), PG_WP_ON,currentClock.enableMonth, 0); wYear = pgNewWidget(PG_WIDGET_CHECKBOX,0,0); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("Show year"), PG_WP_ON,currentClock.enableYear, /* Give the last one PG_S_ALL to avoid extra margin at the * bottom of wCheckBoxBox */ PG_WP_SIDE,PG_S_ALL, 0); /* Buttons */ wCancel = pgNewWidget(PG_WIDGET_BUTTON,PG_DERIVE_INSIDE,wTB); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgGetServerRes(PGRES_STRING_CANCEL), PG_WP_SIDE,PG_S_RIGHT, PG_WP_HOTKEY,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_HOTKEY_CANCEL), PG_WP_BITMAP,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_ICON_CANCEL), PG_WP_BITMASK,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_ICON_CANCEL_MASK), 0); wOk = pgNewWidget(PG_WIDGET_BUTTON,PG_DERIVE_INSIDE,wTB); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgGetServerRes(PGRES_STRING_OK), PG_WP_SIDE,PG_S_RIGHT, PG_WP_HOTKEY,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_HOTKEY_OK), PG_WP_BITMAP,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_ICON_OK), PG_WP_BITMASK,pgThemeLookup(PGTH_O_POPUP_MESSAGEDLG, PGTH_P_ICON_OK_MASK), 0); /* Sample clock */ currentClock.wClock = pgNewWidget(PG_WIDGET_FLATBUTTON,PG_DERIVE_INSIDE, wSampleTB); pgSetWidget(PGDEFAULT, PG_WP_SIDE,PG_S_ALL, 0); /* Run the dialog */ for (;;) { mungeSettings(); /* New settings take effect */ evt = *pgGetEvent(); /* Wait for an event */ /* Set Font */ if (evt.from == wSetFont) { pghandle fNew, fOld; fNew = pgFontPicker("Set Clock Font"); if (fNew) { fOld = currentClock.fClockFont; /* Send new font handle to the main context */ pgChangeContext(fNew,-1); /* Select new one, delete old one * (unless this was the original font we entered with. * Then, keep it around because we might cancel this dialog) */ currentClock.fClockFont = fNew; if (fOld != oldData.fClockFont) pgDelete(fOld); } } /* Cancel - revert everything */ else if (evt.from == wCancel) { currentClock = oldData; break; } /* Done. Revert widget, delete old font */ else if (evt.from == wOk) { if (oldData.fClockFont != currentClock.fClockFont) pgDelete(oldData.fClockFont); currentClock.wClock = oldData.wClock; break; } /* Set various flags */ else if (evt.from == wColon) currentClock.flashColon ^= 1; else if (evt.from == w24hour) currentClock.enable24hour ^= 1; else if (evt.from == wSeconds) currentClock.enableSeconds ^= 1; else if (evt.from == wWeekDay) currentClock.enableWeekDay ^= 1; else if (evt.from == wDay) currentClock.enableDay ^= 1; else if (evt.from == wMonth) currentClock.enableMonth ^= 1; else if (evt.from == wYear) currentClock.enableYear ^= 1; } storeSettings(); pgLeaveContext(); mungeSettings(); return 0; }
int main(int argc, char **argv) { struct pgEvent *evt; pghandle wApply,wClose,sTmp,wToolbar; pghandle wXres,wYres,wBpp,wRotate,wPopup; struct pgmodeinfo mi; char buf[20]; pgInit(argc,argv); wPopup = pgDialogBox("Set Video Mode"); /******** Take care of such niceties... */ wToolbar = pgNewWidget(PG_WIDGET_TOOLBAR,0,0); pgSetWidget(PGDEFAULT, PG_WP_SIDE,PG_S_BOTTOM, 0); wApply = pgNewWidget(PG_WIDGET_BUTTON,PG_DERIVE_INSIDE,wToolbar); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("Apply"), 0); wClose = pgNewWidget(PG_WIDGET_BUTTON,0,0); pgSetWidget(PGDEFAULT, PG_WP_TEXT,pgNewString("Close"), 0); /******** Mode options */ /* For now just make boxes, we'll fill them in later */ wXres = pgNewWidget(PG_WIDGET_BOX,PG_DERIVE_AFTER,wToolbar); pgSetWidget(PGDEFAULT,PG_WP_TRANSPARENT,1,0); wYres = pgNewWidget(PG_WIDGET_BOX,0,0); pgSetWidget(PGDEFAULT,PG_WP_TRANSPARENT,1,0); wBpp = pgNewWidget(PG_WIDGET_BOX,0,0); pgSetWidget(PGDEFAULT,PG_WP_TRANSPARENT,1,0); wRotate = pgNewWidget(PG_WIDGET_CHECKBOX,0,0); pgSetWidget(PGDEFAULT,PG_WP_TEXT,pgNewString("Rotation"),0); /* Fill in the boxes */ wXres = pgNewWidget(PG_WIDGET_FIELD,PG_DERIVE_INSIDE,wXres); pgSetWidget(PGDEFAULT, PG_WP_SIDE,PG_S_RIGHT, PG_WP_SIZE,50, PG_WP_SIZEMODE,PG_SZMODE_PERCENT, 0); pgNewWidget(PG_WIDGET_LABEL,0,0); pgSetWidget(PGDEFAULT, PG_WP_SIDE,PG_S_RIGHT, PG_WP_TEXT,pgNewString("Width:"), 0); wYres = pgNewWidget(PG_WIDGET_FIELD,PG_DERIVE_INSIDE,wYres); pgSetWidget(PGDEFAULT, PG_WP_SIDE,PG_S_RIGHT, PG_WP_SIZE,50, PG_WP_SIZEMODE,PG_SZMODE_PERCENT, 0); pgNewWidget(PG_WIDGET_LABEL,0,0); pgSetWidget(PGDEFAULT, PG_WP_SIDE,PG_S_RIGHT, PG_WP_TEXT,pgNewString("Height:"), 0); wBpp = pgNewWidget(PG_WIDGET_FIELD,PG_DERIVE_INSIDE,wBpp); pgSetWidget(PGDEFAULT, PG_WP_SIDE,PG_S_RIGHT, PG_WP_SIZE,50, PG_WP_SIZEMODE,PG_SZMODE_PERCENT, 0); pgNewWidget(PG_WIDGET_LABEL,0,0); pgSetWidget(PGDEFAULT, PG_WP_SIDE,PG_S_RIGHT, PG_WP_TEXT,pgNewString("BPP:"), 0); /******** Run a tiny event loop */ /* Big loop setting modes... */ for (;;) { /* Get actual mode info, put it in the widgets. * Not the best way, but for now pgReplaceTextFmt doesn't work on * field widgets because their handle handling is different :) * The field copies our string to an internal buffer so we don't need * to keep the handle around. Note that a server bug (listed in my * todo file) will cause a server segfault if pgReplaceText is used! */ mi = *pgGetVideoMode(); sprintf(buf,"%d",mi.xres); sTmp = pgNewString(buf); pgSetWidget(wXres,PG_WP_TEXT,sTmp,0); pgDelete(sTmp); sprintf(buf,"%d",mi.yres); sTmp = pgNewString(buf); pgSetWidget(wYres,PG_WP_TEXT,sTmp,0); pgDelete(sTmp); sprintf(buf,"%d",mi.bpp); sTmp = pgNewString(buf); pgSetWidget(wBpp,PG_WP_TEXT,sTmp,0); pgDelete(sTmp); pgSetWidget(wRotate,PG_WP_ON,mi.flags & PG_VID_ROTATE90,0); /* Small event loop waiting for an apply */ for (;;) { evt = pgGetEvent(); /* Done yet? */ if (evt->from == wClose) return 0; /* Any PG_WE_ACTIVATE causes apply, this covers clicking the apply * button or pressing enter in a field. Specifically exclude * clicking the rotate checkbox */ if (evt->type == PG_WE_ACTIVATE && evt->from != wRotate) break; } /* Set mode based on widget values */ pgSetVideoMode(atoi(pgGetString(pgGetWidget(wXres,PG_WP_TEXT))), atoi(pgGetString(pgGetWidget(wYres,PG_WP_TEXT))), atoi(pgGetString(pgGetWidget(wBpp,PG_WP_TEXT))), pgGetWidget(wRotate,PG_WP_ON) ? PG_FM_ON : PG_FM_OFF, PG_VID_ROTATE90); } return 0; }