Annotation of hatari/src/gui-sdl/sdlgui.c, revision 1.1.1.1

1.1       root        1: /*
                      2:   Hatari - sdlgui.c
                      3: 
                      4:   This file is distributed under the GNU Public License, version 2 or at
                      5:   your option any later version. Read the file gpl.txt for details.
                      6: 
                      7:   A tiny graphical user interface for Hatari.
                      8: */
                      9: char SDLGui_rcsid[] = "Hatari $Id: sdlgui.c,v 1.6 2004/06/18 18:07:16 thothy Exp $";
                     10: 
                     11: #include <SDL.h>
                     12: #include <ctype.h>
                     13: #include <string.h>
                     14: 
                     15: #include "main.h"
                     16: #include "memAlloc.h"
                     17: #include "screen.h"
                     18: #include "sdlgui.h"
                     19: 
                     20: #include "font5x8.h"
                     21: #include "font10x16.h"
                     22: 
                     23: 
                     24: static SDL_Surface *pSmallFontGfx = NULL;   /* The small font graphics */
                     25: static SDL_Surface *pBigFontGfx = NULL;     /* The big font graphics */
                     26: static SDL_Surface *fontgfx = NULL;         /* The actual font graphics */
                     27: static int fontwidth, fontheight;           /* Width & height of the actual font */
                     28: 
                     29: 
                     30: 
                     31: /*-----------------------------------------------------------------------*/
                     32: /*
                     33:   Load an 1 plane XBM into a 8 planes SDL_Surface.
                     34: */
                     35: static SDL_Surface *SDLGui_LoadXBM(int w, int h, Uint8 *srcbits)
                     36: {
                     37:   SDL_Surface *bitmap;
                     38:   Uint8 *dstbits;
                     39:   int x, y, srcpitch;
                     40:   int mask;
                     41: 
                     42:   /* Allocate the bitmap */
                     43:   bitmap = SDL_CreateRGBSurface(SDL_SWSURFACE, w, h, 8, 0, 0, 0, 0);
                     44:   if (bitmap == NULL)
                     45:   {
                     46:     fprintf(stderr, "Couldn't allocate bitmap: %s", SDL_GetError());
                     47:     return(NULL);
                     48:   }
                     49: 
                     50:   srcpitch = ((w + 7) / 8);
                     51:   dstbits = (Uint8 *)bitmap->pixels;
                     52:   mask = 1;
                     53: 
                     54:   /* Copy the pixels */
                     55:   for (y = 0 ; y < h ; y++)
                     56:   {
                     57:     for (x = 0 ; x < w ; x++)
                     58:     {
                     59:       dstbits[x] = (srcbits[x / 8] & mask) ? 1 : 0;
                     60:       mask <<= 1;
                     61:       mask |= (mask >> 8);
                     62:       mask &= 0xFF;
                     63:     }
                     64:     dstbits += bitmap->pitch;
                     65:     srcbits += srcpitch;
                     66:   }
                     67: 
                     68:   return(bitmap);
                     69: }
                     70: 
                     71: 
                     72: /*-----------------------------------------------------------------------*/
                     73: /*
                     74:   Initialize the GUI.
                     75: */
                     76: int SDLGui_Init(void)
                     77: {
                     78:   SDL_Color blackWhiteColors[2] = {{255, 255, 255, 0}, {0, 0, 0, 0}};
                     79: 
                     80:   /* Initialize the font graphics: */
                     81:   pSmallFontGfx = SDLGui_LoadXBM(font5x8_width, font5x8_height, font5x8_bits);
                     82:   pBigFontGfx = SDLGui_LoadXBM(font10x16_width, font10x16_height, font10x16_bits);
                     83:   if (pSmallFontGfx == NULL || pBigFontGfx == NULL)
                     84:   {
                     85:     fprintf(stderr, "Error: Can not init font graphics!\n");
                     86:     return -1;
                     87:   }
                     88: 
                     89:   /* Set color palette of the font graphics: */
                     90:   SDL_SetColors(pSmallFontGfx, blackWhiteColors, 0, 2);
                     91:   SDL_SetColors(pBigFontGfx, blackWhiteColors, 0, 2);
                     92: 
                     93:   /* Set font color 0 as transparent: */
                     94:   SDL_SetColorKey(pSmallFontGfx, (SDL_SRCCOLORKEY|SDL_RLEACCEL), 0);
                     95:   SDL_SetColorKey(pBigFontGfx, (SDL_SRCCOLORKEY|SDL_RLEACCEL), 0);
                     96: 
                     97:   return 0;
                     98: }
                     99: 
                    100: 
                    101: /*-----------------------------------------------------------------------*/
                    102: /*
                    103:   Uninitialize the GUI.
                    104: */
                    105: int SDLGui_UnInit(void)
                    106: {
                    107:   if (pSmallFontGfx)
                    108:   {
                    109:     SDL_FreeSurface(pSmallFontGfx);
                    110:     pSmallFontGfx = NULL;
                    111:   }
                    112: 
                    113:   if (pBigFontGfx)
                    114:   {
                    115:     SDL_FreeSurface(pBigFontGfx);
                    116:     pBigFontGfx = NULL;
                    117:   }
                    118: 
                    119:   return 0;
                    120: }
                    121: 
                    122: 
                    123: /*-----------------------------------------------------------------------*/
                    124: /*
                    125:   Prepare the font to suit the actual resolution.
                    126: */
                    127: int SDLGui_PrepareFont(void)
                    128: {
                    129:   /* Decide which font to use - small or big one: */
                    130:   if (sdlscrn->w >= 640 && sdlscrn->h >= 400 && pBigFontGfx != NULL)
                    131:   {
                    132:     fontgfx = pBigFontGfx;
                    133:   }
                    134:   else
                    135:   {
                    136:     fontgfx = pSmallFontGfx;
                    137:   }
                    138: 
                    139:   if (fontgfx == NULL)
                    140:   {
                    141:     fprintf(stderr, "Error: A problem with the font occured!\n");
                    142:     return -1;
                    143:   }
                    144: 
                    145:   /* Get the font width and height: */
                    146:   fontwidth = fontgfx->w/16;
                    147:   fontheight = fontgfx->h/16;
                    148: 
                    149:   return 0;
                    150: }
                    151: 
                    152: 
                    153: /*-----------------------------------------------------------------------*/
                    154: /*
                    155:   Center a dialog so that it appears in the middle of the screen.
                    156:   Note: We only store the coordinates in the root box of the dialog,
                    157:   all other objects in the dialog are positioned relatively to this one.
                    158: */
                    159: void SDLGui_CenterDlg(SGOBJ *dlg)
                    160: {
                    161:   dlg[0].x = (sdlscrn->w/fontwidth-dlg[0].w)/2;
                    162:   dlg[0].y = (sdlscrn->h/fontheight-dlg[0].h)/2;
                    163: }
                    164: 
                    165: 
                    166: /*-----------------------------------------------------------------------*/
                    167: /*
                    168:   Draw a text string.
                    169: */
                    170: static void SDLGui_Text(int x, int y, const char *txt)
                    171: {
                    172:   int i;
                    173:   char c;
                    174:   SDL_Rect sr, dr;
                    175: 
                    176:   for(i=0; txt[i]!=0; i++)
                    177:   {
                    178:     c = txt[i];
                    179:     sr.x=fontwidth*(c%16);  sr.y=fontheight*(c/16);
                    180:     sr.w=fontwidth;         sr.h=fontheight;
                    181:     dr.x=x+i*fontwidth;     dr.y=y;
                    182:     dr.w=fontwidth;         dr.h=fontheight;
                    183:     SDL_BlitSurface(fontgfx, &sr, sdlscrn, &dr);
                    184:   }
                    185: }
                    186: 
                    187: 
                    188: /*-----------------------------------------------------------------------*/
                    189: /*
                    190:   Draw a dialog text object.
                    191: */
                    192: static void SDLGui_DrawText(SGOBJ *tdlg, int objnum)
                    193: {
                    194:   int x, y;
                    195:   x = (tdlg[0].x+tdlg[objnum].x)*fontwidth;
                    196:   y = (tdlg[0].y+tdlg[objnum].y)*fontheight;
                    197:   SDLGui_Text(x, y, tdlg[objnum].txt);
                    198: }
                    199: 
                    200: 
                    201: /*-----------------------------------------------------------------------*/
                    202: /*
                    203:   Draw a edit field object.
                    204: */
                    205: static void SDLGui_DrawEditField(SGOBJ *edlg, int objnum)
                    206: {
                    207:   int x, y;
                    208:   SDL_Rect rect;
                    209: 
                    210:   x = (edlg[0].x+edlg[objnum].x)*fontwidth;
                    211:   y = (edlg[0].y+edlg[objnum].y)*fontheight;
                    212:   SDLGui_Text(x, y, edlg[objnum].txt);
                    213: 
                    214:   rect.x = x;    rect.y = y + edlg[objnum].h * fontheight;
                    215:   rect.w = edlg[objnum].w * fontwidth;    rect.h = 1;
                    216:   SDL_FillRect(sdlscrn, &rect, SDL_MapRGB(sdlscrn->format,160,160,160));
                    217: }
                    218: 
                    219: 
                    220: /*-----------------------------------------------------------------------*/
                    221: /*
                    222:   Draw a dialog box object.
                    223: */
                    224: static void SDLGui_DrawBox(SGOBJ *bdlg, int objnum)
                    225: {
                    226:   SDL_Rect rect;
                    227:   int x, y, w, h, offset;
                    228:   Uint32 grey = SDL_MapRGB(sdlscrn->format,192,192,192);
                    229:   Uint32 upleftc, downrightc;
                    230: 
                    231:   x = bdlg[objnum].x*fontwidth;
                    232:   y = bdlg[objnum].y*fontheight;
                    233:   if(objnum>0)                    /* Since the root object is a box, too, */
                    234:   {                               /* we have to look for it now here and only */
                    235:     x += bdlg[0].x*fontwidth;     /* add its absolute coordinates if we need to */
                    236:     y += bdlg[0].y*fontheight;
                    237:   }
                    238:   w = bdlg[objnum].w*fontwidth;
                    239:   h = bdlg[objnum].h*fontheight;
                    240: 
                    241:   if( bdlg[objnum].state&SG_SELECTED )
                    242:   {
                    243:     upleftc = SDL_MapRGB(sdlscrn->format,128,128,128);
                    244:     downrightc = SDL_MapRGB(sdlscrn->format,255,255,255);
                    245:   }
                    246:   else
                    247:   {
                    248:     upleftc = SDL_MapRGB(sdlscrn->format,255,255,255);
                    249:     downrightc = SDL_MapRGB(sdlscrn->format,128,128,128);
                    250:   }
                    251: 
                    252:   /* The root box should be bigger than the screen, so we disable the offset there: */
                    253:   if (objnum != 0)
                    254:     offset = 1;
                    255:   else
                    256:     offset = 0;
                    257: 
                    258:   /* Draw background: */
                    259:   rect.x = x;  rect.y = y;
                    260:   rect.w = w;  rect.h = h;
                    261:   SDL_FillRect(sdlscrn, &rect, grey);
                    262: 
                    263:   /* Draw upper border: */
                    264:   rect.x = x;  rect.y = y - offset;
                    265:   rect.w = w;  rect.h = 1;
                    266:   SDL_FillRect(sdlscrn, &rect, upleftc);
                    267: 
                    268:   /* Draw left border: */
                    269:   rect.x = x - offset;  rect.y = y;
                    270:   rect.w = 1;  rect.h = h;
                    271:   SDL_FillRect(sdlscrn, &rect, upleftc);
                    272: 
                    273:   /* Draw bottom border: */
                    274:   rect.x = x;  rect.y = y + h - 1 + offset;
                    275:   rect.w = w;  rect.h = 1;
                    276:   SDL_FillRect(sdlscrn, &rect, downrightc);
                    277: 
                    278:   /* Draw right border: */
                    279:   rect.x = x + w - 1 + offset;  rect.y = y;
                    280:   rect.w = 1;  rect.h = h;
                    281:   SDL_FillRect(sdlscrn, &rect, downrightc);
                    282: }
                    283: 
                    284: 
                    285: /*-----------------------------------------------------------------------*/
                    286: /*
                    287:   Draw a normal button.
                    288: */
                    289: static void SDLGui_DrawButton(SGOBJ *bdlg, int objnum)
                    290: {
                    291:   int x,y;
                    292: 
                    293:   SDLGui_DrawBox(bdlg, objnum);
                    294: 
                    295:   x = (bdlg[0].x+bdlg[objnum].x+(bdlg[objnum].w-strlen(bdlg[objnum].txt))/2)*fontwidth;
                    296:   y = (bdlg[0].y+bdlg[objnum].y+(bdlg[objnum].h-1)/2)*fontheight;
                    297: 
                    298:   if( bdlg[objnum].state&SG_SELECTED )
                    299:   {
                    300:     x+=1;
                    301:     y+=1;
                    302:   }
                    303:   SDLGui_Text(x, y, bdlg[objnum].txt);
                    304: }
                    305: 
                    306: 
                    307: /*-----------------------------------------------------------------------*/
                    308: /*
                    309:   Draw a dialog radio button object.
                    310: */
                    311: static void SDLGui_DrawRadioButton(SGOBJ *rdlg, int objnum)
                    312: {
                    313:   char str[80];
                    314:   int x, y;
                    315: 
                    316:   x = (rdlg[0].x+rdlg[objnum].x)*fontwidth;
                    317:   y = (rdlg[0].y+rdlg[objnum].y)*fontheight;
                    318: 
                    319:   if( rdlg[objnum].state&SG_SELECTED )
                    320:     str[0]=SGRADIOBUTTON_SELECTED;
                    321:    else
                    322:     str[0]=SGRADIOBUTTON_NORMAL;
                    323:   str[1]=' ';
                    324:   strcpy(&str[2], rdlg[objnum].txt);
                    325: 
                    326:   SDLGui_Text(x, y, str);
                    327: }
                    328: 
                    329: 
                    330: /*-----------------------------------------------------------------------*/
                    331: /*
                    332:   Draw a dialog check box object.
                    333: */
                    334: static void SDLGui_DrawCheckBox(SGOBJ *cdlg, int objnum)
                    335: {
                    336:   char str[80];
                    337:   int x, y;
                    338: 
                    339:   x = (cdlg[0].x+cdlg[objnum].x)*fontwidth;
                    340:   y = (cdlg[0].y+cdlg[objnum].y)*fontheight;
                    341: 
                    342:   if( cdlg[objnum].state&SG_SELECTED )
                    343:     str[0]=SGCHECKBOX_SELECTED;
                    344:    else
                    345:     str[0]=SGCHECKBOX_NORMAL;
                    346:   str[1]=' ';
                    347:   strcpy(&str[2], cdlg[objnum].txt);
                    348: 
                    349:   SDLGui_Text(x, y, str);
                    350: }
                    351: 
                    352: 
                    353: /*-----------------------------------------------------------------------*/
                    354: /*
                    355:   Draw a dialog popup button object.
                    356: */
                    357: static void SDLGui_DrawPopupButton(SGOBJ *pdlg, int objnum)
                    358: {
                    359:   int x, y, w, h;
                    360:   const char *downstr = "\x02";
                    361: 
                    362:   SDLGui_DrawBox(pdlg, objnum);
                    363: 
                    364:   x = (pdlg[0].x+pdlg[objnum].x)*fontwidth;
                    365:   y = (pdlg[0].y+pdlg[objnum].y)*fontheight;
                    366:   w = pdlg[objnum].w*fontwidth;
                    367:   h = pdlg[objnum].h*fontheight;
                    368: 
                    369:   SDLGui_Text(x, y, pdlg[objnum].txt);
                    370:   SDLGui_Text(x+w-fontwidth, y, downstr);
                    371: }
                    372: 
                    373: 
                    374: /*-----------------------------------------------------------------------*/
                    375: /*
                    376:   Let the user insert text into an edit field object.
                    377:   NOTE: The dlg[objnum].txt must point to an an array that is big enough
                    378:   for dlg[objnum].w characters!
                    379: */
                    380: static void SDLGui_EditField(SGOBJ *dlg, int objnum)
                    381: {
                    382:   int cursorPos;                        /* Position of the cursor in the edit field */
                    383:   int blinkState = 0;                   /* Used for cursor blinking */
                    384:   BOOL bStopEditing = FALSE;            /* TRUE if user wants to exit the edit field */
                    385:   char *txt;                            /* Shortcut for dlg[objnum].txt */
                    386:   SDL_Rect rect;
                    387:   Uint32 grey, cursorCol;
                    388:   SDL_Event event;
                    389: 
                    390:   grey = SDL_MapRGB(sdlscrn->format,192,192,192);
                    391:   cursorCol = SDL_MapRGB(sdlscrn->format,128,128,128);
                    392: 
                    393:   rect.x = (dlg[0].x + dlg[objnum].x) * fontwidth;
                    394:   rect.y = (dlg[0].y + dlg[objnum].y) * fontheight;
                    395:   rect.w = (dlg[objnum].w + 1) * fontwidth - 1;
                    396:   rect.h = dlg[objnum].h * fontheight;
                    397: 
                    398:   txt = dlg[objnum].txt;
                    399:   cursorPos = strlen(txt);
                    400: 
                    401:   do
                    402:   {
                    403:     /* Look for events */
                    404:     if(SDL_PollEvent(&event) == 0)
                    405:     {
                    406:       /* No event: Wait some time for cursor blinking */
                    407:       SDL_Delay(250);
                    408:       blinkState ^= 1;
                    409:     }
                    410:     else
                    411:     {
                    412:       int keysym;
                    413: 
                    414:       /* Handle events */
                    415:       do
                    416:       {
                    417:         switch(event.type)
                    418:         {
                    419:           case SDL_QUIT:                        /* User wants to quit */
                    420:             bQuitProgram = TRUE;
                    421:             bStopEditing = TRUE;
                    422:             break;
                    423:           case SDL_MOUSEBUTTONDOWN:             /* Mouse pressed -> stop editing */
                    424:             bStopEditing = TRUE;
                    425:             break;
                    426:           case SDL_KEYDOWN:                     /* Key pressed */
                    427:             keysym = event.key.keysym.sym;
                    428:             switch(keysym)
                    429:             {
                    430:               case SDLK_RETURN:
                    431:               case SDLK_KP_ENTER:
                    432:                 bStopEditing = TRUE;
                    433:                 break;
                    434:               case SDLK_LEFT:
                    435:                 if(cursorPos > 0)
                    436:                   cursorPos -= 1;
                    437:                 break;
                    438:               case SDLK_RIGHT:
                    439:                 if(cursorPos < strlen(txt))
                    440:                   cursorPos += 1;
                    441:                 break;
                    442:               case SDLK_BACKSPACE:
                    443:                 if(cursorPos > 0)
                    444:                 {
                    445:                   memmove(&txt[cursorPos-1], &txt[cursorPos], strlen(&txt[cursorPos])+1);
                    446:                   cursorPos -= 1;
                    447:                 }
                    448:                 break;
                    449:               case SDLK_DELETE:
                    450:                 if(cursorPos < strlen(txt))
                    451:                   memmove(&txt[cursorPos], &txt[cursorPos+1], strlen(&txt[cursorPos+1])+1);
                    452:                 break;
                    453:               default:
                    454:                 /* If it is a "good" key then insert it into the text field */
                    455:                 if(keysym >= 32 && keysym < 256)
                    456:                 {
                    457:                   if(strlen(txt) < dlg[objnum].w)
                    458:                   {
                    459:                     memmove(&txt[cursorPos+1], &txt[cursorPos], strlen(&txt[cursorPos])+1);
                    460:                     if(event.key.keysym.mod & (KMOD_LSHIFT|KMOD_RSHIFT))
                    461:                       txt[cursorPos] = toupper(keysym);
                    462:                     else
                    463:                       txt[cursorPos] = keysym;
                    464:                     cursorPos += 1;
                    465:                   }
                    466:                 }
                    467:                 break;
                    468:             }
                    469:             break;
                    470:         }
                    471:       }
                    472:       while(SDL_PollEvent(&event));
                    473: 
                    474:       blinkState = 1;
                    475:     }
                    476: 
                    477:     /* Redraw the text field: */
                    478:     SDL_FillRect(sdlscrn, &rect, grey);  /* Draw background */
                    479:     /* Draw the cursor: */
                    480:     if(blinkState && !bStopEditing)
                    481:     {
                    482:       SDL_Rect cursorrect;
                    483:       cursorrect.x = rect.x + cursorPos * fontwidth;  cursorrect.y = rect.y;
                    484:       cursorrect.w = fontwidth;  cursorrect.h = rect.h;
                    485:       SDL_FillRect(sdlscrn, &cursorrect, cursorCol);
                    486:     }
                    487:     SDLGui_Text(rect.x, rect.y, dlg[objnum].txt);  /* Draw text */
                    488:     SDL_UpdateRects(sdlscrn, 1, &rect);
                    489:   }
                    490:   while(!bStopEditing);
                    491: }
                    492: 
                    493: 
                    494: /*-----------------------------------------------------------------------*/
                    495: /*
                    496:   Draw a whole dialog.
                    497: */
                    498: static void SDLGui_DrawDialog(SGOBJ *dlg)
                    499: {
                    500:   int i;
                    501:   for(i=0; dlg[i].type!=-1; i++ )
                    502:   {
                    503:     switch( dlg[i].type )
                    504:     {
                    505:       case SGBOX:
                    506:         SDLGui_DrawBox(dlg, i);
                    507:         break;
                    508:       case SGTEXT:
                    509:         SDLGui_DrawText(dlg, i);
                    510:         break;
                    511:       case SGEDITFIELD:
                    512:         SDLGui_DrawEditField(dlg, i);
                    513:         break;
                    514:       case SGBUTTON:
                    515:         SDLGui_DrawButton(dlg, i);
                    516:         break;
                    517:       case SGRADIOBUT:
                    518:         SDLGui_DrawRadioButton(dlg, i);
                    519:         break;
                    520:       case SGCHECKBOX:
                    521:         SDLGui_DrawCheckBox(dlg, i);
                    522:         break;
                    523:       case SGPOPUP:
                    524:         SDLGui_DrawPopupButton(dlg, i);
                    525:         break;
                    526:     }
                    527:   }
                    528:   SDL_UpdateRect(sdlscrn, 0,0,0,0);
                    529: }
                    530: 
                    531: 
                    532: /*-----------------------------------------------------------------------*/
                    533: /*
                    534:   Search an object at a certain position.
                    535: */
                    536: static int SDLGui_FindObj(SGOBJ *dlg, int fx, int fy)
                    537: {
                    538:   int len, i;
                    539:   int ob = -1;
                    540:   int xpos, ypos;
                    541: 
                    542:   len = 0;
                    543:   while( dlg[len].type!=-1)   len++;
                    544: 
                    545:   xpos = fx/fontwidth;
                    546:   ypos = fy/fontheight;
                    547:   /* Now search for the object: */
                    548:   for(i=len; i>0; i--)
                    549:   {
                    550:     if(xpos>=dlg[0].x+dlg[i].x && ypos>=dlg[0].y+dlg[i].y
                    551:        && xpos<dlg[0].x+dlg[i].x+dlg[i].w && ypos<dlg[0].y+dlg[i].y+dlg[i].h)
                    552:     {
                    553:       ob = i;
                    554:       break;
                    555:     }
                    556:   }
                    557: 
                    558:   return ob;
                    559: }
                    560: 
                    561: 
                    562: /*-----------------------------------------------------------------------*/
                    563: /*
                    564:   Show and process a dialog. Returns the button number that has been
                    565:   pressed or -1 if something went wrong.
                    566: */
                    567: int SDLGui_DoDialog(SGOBJ *dlg)
                    568: {
                    569:   int obj=0;
                    570:   int oldbutton=0;
                    571:   int retbutton=0;
                    572:   int i, j, b;
                    573:   SDL_Event evnt;
                    574:   SDL_Rect rct;
                    575:   Uint32 grey;
                    576:   SDL_Surface *pBgSurface;
                    577:   SDL_Rect dlgrect, bgrect;
                    578:   
                    579:   grey = SDL_MapRGB(sdlscrn->format,192,192,192);
                    580: 
                    581:   dlgrect.x = dlg[0].x * fontwidth;
                    582:   dlgrect.y = dlg[0].y * fontheight;
                    583:   dlgrect.w = dlg[0].w * fontwidth;
                    584:   dlgrect.h = dlg[0].h * fontheight;
                    585: 
                    586:   bgrect.x = bgrect.y = 0;
                    587:   bgrect.w = dlgrect.w;
                    588:   bgrect.h = dlgrect.h;
                    589: 
                    590:   /* Save background */
                    591:   pBgSurface = SDL_CreateRGBSurface(SDL_SWSURFACE, dlgrect.w, dlgrect.h, sdlscrn->format->BitsPerPixel,
                    592:                    sdlscrn->format->Rmask, sdlscrn->format->Gmask, sdlscrn->format->Bmask, sdlscrn->format->Amask);
                    593:   if (sdlscrn->format->palette != NULL)
                    594:   {
                    595:     SDL_SetColors(pBgSurface, sdlscrn->format->palette->colors, 0, sdlscrn->format->palette->ncolors-1);
                    596:   }
                    597: 
                    598:   if (pBgSurface != NULL)
                    599:   {
                    600:     SDL_BlitSurface(sdlscrn,  &dlgrect, pBgSurface, &bgrect);
                    601:   }
                    602:   else
                    603:   {
                    604:     fprintf(stderr, "SDLGUI_DoDialog: CreateRGBSurface failed: %s\n", SDL_GetError());
                    605:   }
                    606: 
                    607:   /* (Re-)draw the dialog */
                    608:   SDLGui_DrawDialog(dlg);
                    609: 
                    610:   /* Is the left mouse button still pressed? Yes -> Handle TOUCHEXIT objects here */
                    611:   SDL_PumpEvents();
                    612:   b = SDL_GetMouseState(&i, &j);
                    613:   obj = SDLGui_FindObj(dlg, i, j);
                    614:   if(obj>0 && (dlg[obj].flags&SG_TOUCHEXIT) )
                    615:   {
                    616:     oldbutton = obj;
                    617:     if( b&SDL_BUTTON(1) )
                    618:     {
                    619:       dlg[obj].state |= SG_SELECTED;
                    620:       retbutton = obj;
                    621:     }
                    622:   }
                    623: 
                    624:   /* The main loop */
                    625:   while(retbutton==0 && !bQuitProgram)
                    626:   {
                    627:     if( SDL_WaitEvent(&evnt)==1 )  /* Wait for events */
                    628:       switch(evnt.type)
                    629:       {
                    630:         case SDL_KEYDOWN:
                    631:           break;
                    632:         case SDL_QUIT:
                    633:           bQuitProgram = TRUE;
                    634:           break;
                    635:         case SDL_MOUSEBUTTONDOWN:
                    636:           obj = SDLGui_FindObj(dlg, evnt.button.x, evnt.button.y);
                    637:           if(obj>0)
                    638:           {
                    639:             if(dlg[obj].type==SGBUTTON)
                    640:             {
                    641:               dlg[obj].state |= SG_SELECTED;
                    642:               SDLGui_DrawButton(dlg, obj);
                    643:               SDL_UpdateRect(sdlscrn, (dlg[0].x+dlg[obj].x)*fontwidth-2, (dlg[0].y+dlg[obj].y)*fontheight-2,
                    644:                              dlg[obj].w*fontwidth+4, dlg[obj].h*fontheight+4);
                    645:               oldbutton=obj;
                    646:             }
                    647:             if( dlg[obj].flags&SG_TOUCHEXIT )
                    648:             {
                    649:               dlg[obj].state |= SG_SELECTED;
                    650:               retbutton = obj;
                    651:             }
                    652:           }
                    653:           break;
                    654:         case SDL_MOUSEBUTTONUP:
                    655:           obj = SDLGui_FindObj(dlg, evnt.button.x, evnt.button.y);
                    656:           if(obj>0)
                    657:           {
                    658:             switch(dlg[obj].type)
                    659:             {
                    660:               case SGBUTTON:
                    661:                 if(oldbutton==obj)
                    662:                   retbutton=obj;
                    663:                 break;
                    664:               case SGEDITFIELD:
                    665:                 SDLGui_EditField(dlg, obj);
                    666:                 break;
                    667:               case SGRADIOBUT:
                    668:                 for(i=obj-1; i>0 && dlg[i].type==SGRADIOBUT; i--)
                    669:                 {
                    670:                   dlg[i].state &= ~SG_SELECTED;  /* Deselect all radio buttons in this group */
                    671:                   rct.x = (dlg[0].x+dlg[i].x)*fontwidth;
                    672:                   rct.y = (dlg[0].y+dlg[i].y)*fontheight;
                    673:                   rct.w = fontwidth;  rct.h = fontheight;
                    674:                   SDL_FillRect(sdlscrn, &rct, grey); /* Clear old */
                    675:                   SDLGui_DrawRadioButton(dlg, i);
                    676:                   SDL_UpdateRects(sdlscrn, 1, &rct);
                    677:                 }
                    678:                 for(i=obj+1; dlg[i].type==SGRADIOBUT; i++)
                    679:                 {
                    680:                   dlg[i].state &= ~SG_SELECTED;  /* Deselect all radio buttons in this group */
                    681:                   rct.x = (dlg[0].x+dlg[i].x)*fontwidth;
                    682:                   rct.y = (dlg[0].y+dlg[i].y)*fontheight;
                    683:                   rct.w = fontwidth;  rct.h = fontheight;
                    684:                   SDL_FillRect(sdlscrn, &rct, grey); /* Clear old */
                    685:                   SDLGui_DrawRadioButton(dlg, i);
                    686:                   SDL_UpdateRects(sdlscrn, 1, &rct);
                    687:                 }
                    688:                 dlg[obj].state |= SG_SELECTED;  /* Select this radio button */
                    689:                 rct.x = (dlg[0].x+dlg[obj].x)*fontwidth;
                    690:                 rct.y = (dlg[0].y+dlg[obj].y)*fontheight;
                    691:                 rct.w = fontwidth;  rct.h = fontheight;
                    692:                 SDL_FillRect(sdlscrn, &rct, grey); /* Clear old */
                    693:                 SDLGui_DrawRadioButton(dlg, obj);
                    694:                 SDL_UpdateRects(sdlscrn, 1, &rct);
                    695:                 break;
                    696:               case SGCHECKBOX:
                    697:                 dlg[obj].state ^= SG_SELECTED;
                    698:                 rct.x = (dlg[0].x+dlg[obj].x)*fontwidth;
                    699:                 rct.y = (dlg[0].y+dlg[obj].y)*fontheight;
                    700:                 rct.w = fontwidth;  rct.h = fontheight;
                    701:                 SDL_FillRect(sdlscrn, &rct, grey); /* Clear old */
                    702:                 SDLGui_DrawCheckBox(dlg, obj);
                    703:                 SDL_UpdateRects(sdlscrn, 1, &rct);
                    704:                 break;
                    705:               case SGPOPUP:
                    706:                 dlg[obj].state |= SG_SELECTED;
                    707:                 SDLGui_DrawPopupButton(dlg, obj);
                    708:                 SDL_UpdateRect(sdlscrn, (dlg[0].x+dlg[obj].x)*fontwidth-2, (dlg[0].y+dlg[obj].y)*fontheight-2,
                    709:                            dlg[obj].w*fontwidth+4, dlg[obj].h*fontheight+4);
                    710:                 retbutton=obj;
                    711:                 break;
                    712:             }
                    713:           }
                    714:           if(oldbutton>0)
                    715:           {
                    716:             dlg[oldbutton].state &= ~SG_SELECTED;
                    717:             SDLGui_DrawButton(dlg, oldbutton);
                    718:             SDL_UpdateRect(sdlscrn, (dlg[0].x+dlg[oldbutton].x)*fontwidth-2, (dlg[0].y+dlg[oldbutton].y)*fontheight-2,
                    719:                            dlg[oldbutton].w*fontwidth+4, dlg[oldbutton].h*fontheight+4);
                    720:             oldbutton = 0;
                    721:           }
                    722:           if( dlg[obj].flags&SG_EXIT )
                    723:           {
                    724:             retbutton = obj;
                    725:           }
                    726:           break;
                    727:       }
                    728:   }
                    729: 
                    730:   /* Restore background */
                    731:   if (pBgSurface)
                    732:   {
                    733:     SDL_BlitSurface(pBgSurface, &bgrect, sdlscrn,  &dlgrect);
                    734:     SDL_FreeSurface(pBgSurface);
                    735:   }
                    736: 
                    737:   if(bQuitProgram)
                    738:     retbutton = -1;
                    739: 
                    740:   return retbutton;
                    741: }
                    742: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.