Changeset 287


Ignore:
Timestamp:
Dec 31, 2003, 2:16:47 AM (17 years ago)
Author:
Sam Hocevar
Message:
  • src/io.c: + Mouse support under X11. + Split the mouse motion and mouse click events.
  • examples/demo.c: + Mouse motion support.
Location:
libcaca/trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/doc

    • Property svn:ignore
      •  

        old new  
        11Makefile
        22Makefile.in
         3doxygen.cfg
         4man
        35html
        46latex
  • libcaca/trunk/examples/demo.c

    r268 r287  
    7272    while(!quit)
    7373    {
    74         int event = caca_get_event();
    75 
    76         if(event && demo)
     74        int menu = 0, mouse = 0, xmouse = 0, ymouse = 0;
     75        int event;
     76
     77        while((event = caca_get_event()))
     78        {
     79            if(demo && (event & CACA_EVENT_KEY_PRESS))
     80            {
     81                menu = 1;
     82                demo = NULL;
     83            }
     84            else if(event & CACA_EVENT_KEY_PRESS)
     85            {
     86                switch(event & 0xffff)
     87                {
     88                case 'q':
     89                case 'Q':
     90                    demo = NULL;
     91                    quit = 1;
     92                    break;
     93                case 'o':
     94                case 'O':
     95                    outline = (outline + 1) % 3;
     96                    display_menu();
     97                    break;
     98                case 'b':
     99                case 'B':
     100                    bounds = (bounds + 1) % 2;
     101                    display_menu();
     102                    break;
     103                case 'd':
     104                case 'D':
     105                    dithering = (dithering + 1) % 5;
     106                    caca_set_dithering(dithering);
     107                    display_menu();
     108                    break;
     109                case 'c':
     110                    demo = demo_color;
     111                    break;
     112                case 'f':
     113                case 'F':
     114                    demo = demo_all;
     115                    break;
     116                case '1':
     117                    demo = demo_dots;
     118                    break;
     119                case '2':
     120                    demo = demo_lines;
     121                    break;
     122                case '3':
     123                    demo = demo_boxes;
     124                    break;
     125                case '4':
     126                    demo = demo_triangles;
     127                    break;
     128                case '5':
     129                    demo = demo_ellipses;
     130                    break;
     131                case 's':
     132                case 'S':
     133                    if(sprite)
     134                        demo = demo_sprites;
     135                    break;
     136                case 'r':
     137                case 'R':
     138                    demo = demo_render;
     139                    break;
     140                }
     141
     142                if(demo)
     143                    caca_clear();
     144            }
     145            else if(event & CACA_EVENT_MOUSE_MOTION)
     146            {
     147                mouse = 1;
     148                xmouse = (event & 0xfff000) >> 12;
     149                ymouse = event & 0xfff;
     150            }
     151        }
     152
     153        if(menu || (mouse && !demo))
    77154        {
    78155            display_menu();
     156            if(mouse && !demo)
     157            {
     158                caca_set_color(CACA_COLOR_RED, CACA_COLOR_BLACK);
     159                caca_putstr(xmouse, ymouse, "|\\");
     160            }
    79161            caca_refresh();
    80             demo = NULL;
    81         }
    82         else if(event & CACA_EVENT_KEY_PRESS)
    83         {
    84         handle_key:
    85             switch(event & 0xffff)
    86             {
    87             case 'q':
    88             case 'Q':
    89                 demo = NULL;
    90                 quit = 1;
    91                 break;
    92             case 'o':
    93             case 'O':
    94                 outline = (outline + 1) % 3;
    95                 display_menu();
    96                 break;
    97             case 'b':
    98             case 'B':
    99                 bounds = (bounds + 1) % 2;
    100                 display_menu();
    101                 break;
    102             case 'd':
    103             case 'D':
    104                 dithering = (dithering + 1) % 5;
    105                 caca_set_dithering(dithering);
    106                 display_menu();
    107                 break;
    108             case 'c':
    109                 demo = demo_color;
    110                 break;
    111             case 'f':
    112             case 'F':
    113                 demo = demo_all;
    114                 break;
    115             case '1':
    116                 demo = demo_dots;
    117                 break;
    118             case '2':
    119                 demo = demo_lines;
    120                 break;
    121             case '3':
    122                 demo = demo_boxes;
    123                 break;
    124             case '4':
    125                 demo = demo_triangles;
    126                 break;
    127             case '5':
    128                 demo = demo_ellipses;
    129                 break;
    130             case 's':
    131             case 'S':
    132                 if(sprite)
    133                     demo = demo_sprites;
    134                 break;
    135             case 'r':
    136             case 'R':
    137                 demo = demo_render;
    138                 break;
    139             }
    140 
    141         handle_event:
    142             event = caca_get_event();
    143             if(event & CACA_EVENT_KEY_PRESS)
    144                 goto handle_key;
    145             else if(event)
    146                 goto handle_event;
    147 
    148             caca_refresh();
    149 
    150             if(demo)
    151                 caca_clear();
    152         }
    153         else if(event & CACA_EVENT_MOUSE_CLICK)
    154         {
    155             display_menu();
    156             caca_set_color(CACA_COLOR_RED, CACA_COLOR_BLACK);
    157             caca_putstr((event & 0xff00) >> 8, event & 0xff, "|\\");
    158             caca_refresh();
     162            mouse = menu = 0;
    159163        }
    160164
  • libcaca/trunk/src/caca.h

    r276 r287  
    176176enum caca_event
    177177{
    178     CACA_EVENT_NONE =        0x00000000, /**< No event. */
    179     CACA_EVENT_KEY_PRESS =   0x01000000, /**< A key was pressed. */
    180     CACA_EVENT_KEY_RELEASE = 0x02000000, /**< A key was released. */
    181     CACA_EVENT_MOUSE_CLICK = 0x04000000 /**< A mouse button was clicked. */
     178    CACA_EVENT_NONE =          0x00000000, /**< No event. */
     179    CACA_EVENT_KEY_PRESS =     0x01000000, /**< A key was pressed. */
     180    CACA_EVENT_KEY_RELEASE =   0x02000000, /**< A key was released. */
     181    CACA_EVENT_MOUSE_PRESS =   0x04000000, /**< A mouse button was pressed. */
     182    CACA_EVENT_MOUSE_RELEASE = 0x08000000, /**< A mouse button was released. */
     183    CACA_EVENT_MOUSE_MOTION =  0x10000000  /**< The mouse was moved. */
    182184};
    183185
  • libcaca/trunk/src/io.c

    r273 r287  
    7070{
    7171    unsigned int event = 0;
     72
     73#if defined(USE_X11)
     74    if(_caca_driver == CACA_DRIVER_X11)
     75    {
     76        XEvent xevent;
     77        static unsigned int x11_x = 0, x11_y = 0;
     78        long int xevent_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask
     79                                | ButtonReleaseMask | PointerMotionMask;
     80        char key;
     81
     82        while(XCheckWindowEvent(x11_dpy, x11_window, xevent_mask, &xevent)
     83               == True)
     84        {
     85            KeySym keysym;
     86
     87            if(xevent.type == MotionNotify)
     88            {
     89                unsigned int x = xevent.xmotion.x / x11_font_width;
     90                unsigned int y = xevent.xmotion.y / x11_font_height;
     91
     92                if(x11_x == x && x11_y == y)
     93                    continue;
     94
     95                if(x >= _caca_width)
     96                    x = _caca_width - 1;
     97                if(y >= _caca_height)
     98                    y = _caca_height - 1;
     99
     100                x11_x = x & 0xfff;
     101                x11_y = y & 0xfff;
     102
     103                return CACA_EVENT_MOUSE_MOTION | (x << 12) | (y << 0);
     104            }
     105
     106            if(xevent.type == ButtonPress)
     107                return CACA_EVENT_MOUSE_PRESS | 1;
     108
     109            if(xevent.type == ButtonPress)
     110                return CACA_EVENT_MOUSE_RELEASE | 1;
     111
     112            if(xevent.type == KeyPress)
     113                event |= CACA_EVENT_KEY_PRESS;
     114            else if(xevent.type == KeyRelease)
     115                event |= CACA_EVENT_KEY_RELEASE;
     116            else
     117                return 0;
     118
     119            if(XLookupString(&xevent.xkey, &key, 1, NULL, NULL))
     120                return event | key;
     121
     122            keysym = XKeycodeToKeysym(x11_dpy, xevent.xkey.keycode, 0);
     123            switch(keysym)
     124            {
     125            case XK_F1:    return event | CACA_KEY_F1;
     126            case XK_F2:    return event | CACA_KEY_F2;
     127            case XK_F3:    return event | CACA_KEY_F3;
     128            case XK_F4:    return event | CACA_KEY_F4;
     129            case XK_F5:    return event | CACA_KEY_F5;
     130            case XK_F6:    return event | CACA_KEY_F6;
     131            case XK_F7:    return event | CACA_KEY_F7;
     132            case XK_F8:    return event | CACA_KEY_F8;
     133            case XK_F9:    return event | CACA_KEY_F9;
     134            case XK_F10:   return event | CACA_KEY_F10;
     135            case XK_F11:   return event | CACA_KEY_F11;
     136            case XK_F12:   return event | CACA_KEY_F12;
     137            case XK_F13:   return event | CACA_KEY_F13;
     138            case XK_F14:   return event | CACA_KEY_F14;
     139            case XK_F15:   return event | CACA_KEY_F15;
     140            case XK_Left:  return event | CACA_KEY_LEFT;
     141            case XK_Right: return event | CACA_KEY_RIGHT;
     142            case XK_Up:    return event | CACA_KEY_UP;
     143            case XK_Down:  return event | CACA_KEY_DOWN;
     144            default:       return 0;
     145            }
     146        }
     147
     148        return 0;
     149    }
     150#endif
    72151
    73152    /* Read all available key events and push them into the buffer */
     
    97176            event |= (mevent.y) << 0;
    98177
    99             return CACA_EVENT_MOUSE_CLICK | event;
     178            return CACA_EVENT_MOUSE_PRESS | event;
    100179        }
    101180
     
    169248        event |= (_pop_key() - '!') << 0;
    170249
    171         return CACA_EVENT_MOUSE_CLICK | event;
     250        return CACA_EVENT_MOUSE_PRESS | event;
    172251    }
    173252    else if(keybuf[0] == '[' && keybuf[1] == '1' && keybuf[3] == '~' &&
     
    252331#endif
    253332#if defined(USE_X11)
    254     XEvent event;
    255     static int x11_x = 0, x11_y = 0;
    256     long int event_mask = KeyPressMask | ButtonPressMask | PointerMotionMask;
    257     char key;
    258333#endif
    259334
     
    275350#if defined(USE_X11)
    276351    case CACA_DRIVER_X11:
    277         while(XCheckWindowEvent(x11_dpy, x11_window, event_mask, &event)
    278                == True)
    279         {
    280             KeySym keysym;
    281 
    282             if(event.type == MotionNotify)
    283             {
    284                 x11_x = event.xmotion.x;
    285                 x11_y = event.xmotion.y;
    286                 continue;
    287             }
    288 
    289             if(event.type == ButtonPress)
    290             {
    291                 unsigned int x = x11_x / x11_font_width;
    292                 unsigned int y = x11_y / x11_font_height;
    293 
    294                 if(x >= _caca_width)
    295                     x = _caca_width - 1;
    296                 if(y >= _caca_height)
    297                     y = _caca_height - 1;
    298 
    299                 return CACA_EVENT_MOUSE_CLICK
    300                         | (1 << 16) | (x << 8) | (y << 0);
    301             }
    302 
    303             if(event.type != KeyPress)
    304                 continue;
    305 
    306             if(XLookupString(&event.xkey, &key, 1, NULL, NULL))
    307                 return key;
    308 
    309             keysym = XKeycodeToKeysym(x11_dpy, event.xkey.keycode, 0);
    310             switch(keysym)
    311             {
    312             case XK_F1:    return CACA_KEY_F1;
    313             case XK_F2:    return CACA_KEY_F2;
    314             case XK_F3:    return CACA_KEY_F3;
    315             case XK_F4:    return CACA_KEY_F4;
    316             case XK_F5:    return CACA_KEY_F5;
    317             case XK_F6:    return CACA_KEY_F6;
    318             case XK_F7:    return CACA_KEY_F7;
    319             case XK_F8:    return CACA_KEY_F8;
    320             case XK_F9:    return CACA_KEY_F9;
    321             case XK_F10:   return CACA_KEY_F10;
    322             case XK_F11:   return CACA_KEY_F11;
    323             case XK_F12:   return CACA_KEY_F12;
    324             case XK_F13:   return CACA_KEY_F13;
    325             case XK_F14:   return CACA_KEY_F14;
    326             case XK_F15:   return CACA_KEY_F15;
    327             case XK_Left:  return CACA_KEY_LEFT;
    328             case XK_Right: return CACA_KEY_RIGHT;
    329             case XK_Up:    return CACA_KEY_UP;
    330             case XK_Down:  return CACA_KEY_DOWN;
    331             default:       return 0;
    332             }
    333         }
    334 
    335         return 0;
    336352#endif
    337353    default:
Note: See TracChangeset for help on using the changeset viewer.