Changeset 287 for libcaca/trunk/src


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/src
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • 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.