Ignore:
Timestamp:
Mar 8, 2006, 10:28:41 AM (15 years ago)
Author:
Sam Hocevar
Message:
  • Split event.c into the appropriate driver_*.c files.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/caca/driver_x11.c

    r540 r548  
    2323
    2424#include <X11/Xlib.h>
     25#include <X11/Xutil.h>
     26#include <X11/keysym.h>
    2527#if defined(HAVE_X11_XKBLIB_H)
    2628#   include <X11/XKBlib.h>
     
    163165    for(;;)
    164166    {
    165         XEvent event;
    166         XNextEvent(kk->x11.dpy, &event);
    167         if (event.type == MapNotify)
     167        XEvent xevent;
     168        XNextEvent(kk->x11.dpy, &xevent);
     169        if (xevent.type == MapNotify)
    168170            break;
    169171    }
     
    312314}
    313315
     316static unsigned int x11_get_event(caca_t *kk)
     317{
     318    unsigned int event = 0;
     319    XEvent xevent;
     320    char key;
     321
     322    while(XCheckWindowEvent(kk->x11.dpy, kk->x11.window,
     323                            kk->x11.event_mask, &xevent) == True)
     324    {
     325        KeySym keysym;
     326
     327        /* Expose event */
     328        if(xevent.type == Expose)
     329        {
     330            XCopyArea(kk->x11.dpy, kk->x11.pixmap,
     331                      kk->x11.window, kk->x11.gc, 0, 0,
     332                      kk->qq->width * kk->x11.font_width,
     333                      kk->qq->height * kk->x11.font_height, 0, 0);
     334            continue;
     335        }
     336
     337        /* Resize event */
     338        if(xevent.type == ConfigureNotify)
     339        {
     340            unsigned int w, h;
     341
     342            w = (xevent.xconfigure.width + kk->x11.font_width / 3)
     343                  / kk->x11.font_width;
     344            h = (xevent.xconfigure.height + kk->x11.font_height / 3)
     345                  / kk->x11.font_height;
     346
     347            if(!w || !h || (w == kk->qq->width && h == kk->qq->height))
     348                continue;
     349
     350            kk->x11.new_width = w;
     351            kk->x11.new_height = h;
     352
     353            /* If we are already resizing, ignore the new signal */
     354            if(kk->resize)
     355                continue;
     356
     357            kk->resize = 1;
     358
     359            return CACA_EVENT_RESIZE;
     360        }
     361
     362        /* Check for mouse motion events */
     363        if(xevent.type == MotionNotify)
     364        {
     365            unsigned int newx = xevent.xmotion.x / kk->x11.font_width;
     366            unsigned int newy = xevent.xmotion.y / kk->x11.font_height;
     367
     368            if(newx >= kk->qq->width)
     369                newx = kk->qq->width - 1;
     370            if(newy >= kk->qq->height)
     371                newy = kk->qq->height - 1;
     372
     373            if(kk->mouse_x == newx && kk->mouse_y == newy)
     374                continue;
     375
     376            kk->mouse_x = newx;
     377            kk->mouse_y = newy;
     378
     379            return CACA_EVENT_MOUSE_MOTION | (kk->mouse_x << 12) | kk->mouse_y;
     380        }
     381
     382        /* Check for mouse press and release events */
     383        if(xevent.type == ButtonPress)
     384            return CACA_EVENT_MOUSE_PRESS
     385                    | ((XButtonEvent *)&xevent)->button;
     386
     387        if(xevent.type == ButtonRelease)
     388            return CACA_EVENT_MOUSE_RELEASE
     389                    | ((XButtonEvent *)&xevent)->button;
     390
     391        /* Check for key press and release events */
     392        if(xevent.type == KeyPress)
     393            event |= CACA_EVENT_KEY_PRESS;
     394        else if(xevent.type == KeyRelease)
     395            event |= CACA_EVENT_KEY_RELEASE;
     396        else
     397            continue;
     398
     399        if(XLookupString(&xevent.xkey, &key, 1, NULL, NULL))
     400            return event | key;
     401
     402        keysym = XKeycodeToKeysym(kk->x11.dpy, xevent.xkey.keycode, 0);
     403        switch(keysym)
     404        {
     405        case XK_F1:    return event | CACA_KEY_F1;
     406        case XK_F2:    return event | CACA_KEY_F2;
     407        case XK_F3:    return event | CACA_KEY_F3;
     408        case XK_F4:    return event | CACA_KEY_F4;
     409        case XK_F5:    return event | CACA_KEY_F5;
     410        case XK_F6:    return event | CACA_KEY_F6;
     411        case XK_F7:    return event | CACA_KEY_F7;
     412        case XK_F8:    return event | CACA_KEY_F8;
     413        case XK_F9:    return event | CACA_KEY_F9;
     414        case XK_F10:   return event | CACA_KEY_F10;
     415        case XK_F11:   return event | CACA_KEY_F11;
     416        case XK_F12:   return event | CACA_KEY_F12;
     417        case XK_F13:   return event | CACA_KEY_F13;
     418        case XK_F14:   return event | CACA_KEY_F14;
     419        case XK_F15:   return event | CACA_KEY_F15;
     420        case XK_Left:  return event | CACA_KEY_LEFT;
     421        case XK_Right: return event | CACA_KEY_RIGHT;
     422        case XK_Up:    return event | CACA_KEY_UP;
     423        case XK_Down:  return event | CACA_KEY_DOWN;
     424        default:       return CACA_EVENT_NONE;
     425        }
     426    }
     427
     428    return CACA_EVENT_NONE;
     429}
     430
    314431/*
    315432 * XXX: following functions are local
    316433 */
    317434
    318 static int x11_error_handler(Display *dpy, XErrorEvent *event)
     435static int x11_error_handler(Display *dpy, XErrorEvent *xevent)
    319436{
    320437    /* Ignore the error */
     
    337454    kk->driver.display = x11_display;
    338455    kk->driver.handle_resize = x11_handle_resize;
     456    kk->driver.get_event = x11_get_event;
    339457}
    340458
Note: See TracChangeset for help on using the changeset viewer.