Changeset 347


Ignore:
Timestamp:
Jan 13, 2004, 9:03:48 PM (17 years ago)
Author:
Sam Hocevar
Message:
  • src/event.c: + Added the CACA_EVENT_RESIZE event. + Added caca_get_mouse_x() and caca_get_mouse_y().
  • src/graphics.c: + Window resize handling in the X11 driver.
  • examples/aafire.c: + Fixed a bad assumption in the resize handling code.
Location:
libcaca/trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/examples/aafire.c

    r344 r347  
    220220                   caca_bitmap, bitmap);
    221221  caca_refresh();
    222   XSIZ = caca_get_width() * 2;
    223   YSIZ = caca_get_height() * 2 - 4;
     222  /*XSIZ = caca_get_width() * 2;
     223  YSIZ = caca_get_height() * 2 - 4;*/
    224224#else
    225225  aa_renderpalette (context, palette, params, 0, 0, aa_scrwidth (context),
  • libcaca/trunk/src/caca.h

    r343 r347  
    182182    CACA_EVENT_MOUSE_RELEASE = 0x08000000, /**< A mouse button was released. */
    183183    CACA_EVENT_MOUSE_MOTION =  0x10000000, /**< The mouse was moved. */
     184    CACA_EVENT_RESIZE =        0x20000000, /**< The window was resized. */
    184185    CACA_EVENT_ANY =           0xff000000  /**< Bitmask for any event. */
    185186};
     
    259260unsigned int caca_get_event(unsigned int);
    260261unsigned int caca_wait_event(unsigned int);
     262unsigned int caca_get_mouse_x(void);
     263unsigned int caca_get_mouse_y(void);
    261264/*  @} */
    262265
  • libcaca/trunk/src/caca_internals.h

    r336 r347  
    7474extern unsigned int _caca_width;
    7575extern unsigned int _caca_height;
     76extern unsigned int _caca_new_width;
     77extern unsigned int _caca_new_height;
    7678
    7779/* Internal libcaca features */
     
    8486extern Display *x11_dpy;
    8587extern Window x11_window;
     88extern long int x11_event_mask;
    8689extern int x11_font_width, x11_font_height;
    8790#endif
  • libcaca/trunk/src/event.c

    r345 r347  
    6969static int events = 0;
    7070#endif
     71
     72static unsigned int mouse_x = 0, mouse_y = 0;
    7173
    7274#if !defined(_DOXYGEN_SKIP_ME)
     
    131133}
    132134
     135/** \brief Return the X mouse coordinate.
     136 *
     137 *  This function returns the X coordinate of the mouse position last time
     138 *  it was detected. This function is not reliable if the ncurses or S-Lang
     139 *  drivers are being used, because mouse position is only detected when
     140 *  the mouse is clicked. Other drivers such as X11 work well.
     141 *
     142 *  \return The X mouse coordinate.
     143 */
     144unsigned int caca_get_mouse_x(void)
     145{
     146    return mouse_x;
     147}
     148
     149/** \brief Return the Y mouse coordinate.
     150 *
     151 *  This function returns the Y coordinate of the mouse position last time
     152 *  it was detected. This function is not reliable if the ncurses or S-Lang
     153 *  drivers are being used, because mouse position is only detected when
     154 *  the mouse is clicked. Other drivers such as X11 work well.
     155 *
     156 *  \return The Y mouse coordinate.
     157 */
     158unsigned int caca_get_mouse_y(void)
     159{
     160    return mouse_y;
     161}
     162
    133163/*
    134164 * XXX: The following functions are local.
     
    217247    {
    218248        XEvent xevent;
    219         static unsigned int x11_x = 0, x11_y = 0;
    220         long int xevent_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask
    221                                 | ButtonReleaseMask | PointerMotionMask;
    222249        char key;
    223250
    224         while(XCheckWindowEvent(x11_dpy, x11_window, xevent_mask, &xevent)
     251        while(XCheckWindowEvent(x11_dpy, x11_window, x11_event_mask, &xevent)
    225252               == True)
    226253        {
    227254            KeySym keysym;
     255
     256            /* Resize event */
     257            if(xevent.type == ConfigureNotify)
     258            {
     259                unsigned int w = xevent.xconfigure.width / x11_font_width;
     260                unsigned int h = xevent.xconfigure.height / x11_font_height;
     261
     262                if(w == _caca_width && h == _caca_height)
     263                    continue;
     264
     265                _caca_new_width = w;
     266                _caca_new_height = h;
     267
     268                return CACA_EVENT_RESIZE;
     269            }
    228270
    229271            /* Check for mouse motion events */
     
    238280                    newy = _caca_height - 1;
    239281
    240                 if(x11_x == newx && x11_y == newy)
     282                if(mouse_x == newx && mouse_y == newy)
    241283                    continue;
    242284
    243                 x11_x = newx & 0xfff;
    244                 x11_y = newy & 0xfff;
    245 
    246                 return CACA_EVENT_MOUSE_MOTION | (newx << 12) | (newy << 0);
     285                mouse_x = newx;
     286                mouse_y = newy;
     287
     288                return CACA_EVENT_MOUSE_MOTION | (mouse_x << 12) | mouse_y;
    247289            }
    248290
     
    428470            }
    429471
    430             return CACA_EVENT_MOUSE_MOTION | (mevent.x << 12) | mevent.y;
     472            if(mouse_x == (unsigned int)mevent.x &&
     473               mouse_y == (unsigned int)mevent.y)
     474                return _pop_event();
     475
     476            mouse_x = mevent.x;
     477            mouse_y = mevent.y;
     478
     479            return CACA_EVENT_MOUSE_MOTION | (mouse_x << 12) | mouse_y;
    431480        }
    432481
     
    493542        {
    494543            int button = (SLang_getkey() - ' ' + 1) & 0xf;
    495             int x = SLang_getkey() - '!';
    496             int y = SLang_getkey() - '!';
     544            unsigned int x = SLang_getkey() - '!';
     545            unsigned int y = SLang_getkey() - '!';
    497546            _push_event(CACA_EVENT_MOUSE_PRESS | button);
    498547            _push_event(CACA_EVENT_MOUSE_RELEASE | button);
    499             return CACA_EVENT_MOUSE_MOTION | (x << 12) | (y << 0);
     548
     549            if(mouse_x == x && mouse_y == y)
     550                return _pop_event();
     551
     552            mouse_x = x;
     553            mouse_y = y;
     554
     555            return CACA_EVENT_MOUSE_MOTION | (mouse_x << 12) | mouse_y;
    500556        }
    501557
     
    552608        DWORD num;
    553609
    554         GetNumberOfConsoleInputEvents(win32_hin, &num);
    555         if(num == 0)
     610        for( ; ; )
     611        {
     612            GetNumberOfConsoleInputEvents(win32_hin, &num);
     613            if(num == 0)
     614                break;
     615
     616            ReadConsoleInput(win32_hin, &rec, 1, &num);
     617            if(rec.EventType == KEY_EVENT)
     618            {
     619                if(rec.Event.KeyEvent.bKeyDown)
     620                    event = CACA_EVENT_KEY_PRESS;
     621                else
     622                    event = CACA_EVENT_KEY_RELEASE;
     623
     624                if(rec.Event.KeyEvent.uChar.AsciiChar)
     625                    return event | rec.Event.KeyEvent.uChar.AsciiChar;
     626            }
     627
     628            if(rec.EventType == MOUSE_EVENT)
     629            {
     630                if(rec.Event.MouseEvent.dwEventFlags == 0)
     631                {
     632                    if(rec.Event.MouseEvent.dwButtonState & 0x01)
     633                        return CACA_EVENT_MOUSE_PRESS | 0x000001;
     634
     635                    if(rec.Event.MouseEvent.dwButtonState & 0x02)
     636                        return CACA_EVENT_MOUSE_PRESS | 0x000002;
     637                }
     638                else if(rec.Event.MouseEvent.dwEventFlags == MOUSE_MOVED)
     639                {
     640                    COORD pos = rec.Event.MouseEvent.dwMousePosition;
     641
     642                    if(mouse_x == (unsigned int)pos.X &&
     643                       mouse_y == (unsigned int)pos.Y)
     644                        continue;
     645
     646                    mouse_x = pos.X;
     647                    mouse_y = pos.Y;
     648
     649                    return CACA_EVENT_MOUSE_MOTION | (mouse_x << 12) | mouse_y;
     650                }
     651#if 0
     652                else if(rec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)
     653                {
     654                    cout << rec.Event.MouseEvent.dwMousePosition.X << "," <<
     655                            rec.Event.MouseEvent.dwMousePosition.Y << "  " << flush;
     656                }
     657                else if(rec.Event.MouseEvent.dwEventFlags == MOUSE_WHEELED)
     658                {
     659                    SetConsoleCursorPosition(hOut,
     660                                             WheelWhere);
     661                    if(rec.Event.MouseEvent.dwButtonState & 0xFF000000)
     662                        cout << "Down" << flush;
     663                    else
     664                        cout << "Up  " << flush;
     665                }
     666#endif
     667            }
     668
     669            /* Unknown event */
    556670            return CACA_EVENT_NONE;
    557 
    558         ReadConsoleInput(win32_hin, &rec, 1, &num);
    559         if(rec.EventType == KEY_EVENT)
    560         {
    561             if(rec.Event.KeyEvent.bKeyDown)
    562                 event = CACA_EVENT_KEY_PRESS;
    563             else
    564                 event = CACA_EVENT_KEY_RELEASE;
    565 
    566             if(rec.Event.KeyEvent.uChar.AsciiChar)
    567                 return event | rec.Event.KeyEvent.uChar.AsciiChar;
    568         }
    569         else if(rec.EventType == MOUSE_EVENT)
    570         {
    571             if(rec.Event.MouseEvent.dwEventFlags == 0)
    572             {
    573                 if(rec.Event.MouseEvent.dwButtonState & 0x01)
    574                     return CACA_EVENT_MOUSE_PRESS | 0x000001;
    575 
    576                 if(rec.Event.MouseEvent.dwButtonState & 0x02)
    577                     return CACA_EVENT_MOUSE_PRESS | 0x000002;
    578             }
    579             else if(rec.Event.MouseEvent.dwEventFlags == MOUSE_MOVED)
    580             {
    581                 return CACA_EVENT_MOUSE_MOTION
    582                         | (rec.Event.MouseEvent.dwMousePosition.X << 12)
    583                         | (rec.Event.MouseEvent.dwMousePosition.Y);
    584             }
    585 #if 0
    586             else if(rec.Event.MouseEvent.dwEventFlags == DOUBLE_CLICK)
    587             {
    588                 cout << rec.Event.MouseEvent.dwMousePosition.X << "," <<
    589                         rec.Event.MouseEvent.dwMousePosition.Y << "  " << flush;
    590             }
    591             else if(rec.Event.MouseEvent.dwEventFlags == MOUSE_WHEELED)
    592             {
    593                 SetConsoleCursorPosition(hOut,
    594                                          WheelWhere);
    595                 if(rec.Event.MouseEvent.dwButtonState & 0xFF000000)
    596                     cout << "Down" << flush;
    597                 else
    598                     cout << "Up  " << flush;
    599             }
    600 #endif
    601         }
    602 
     671        }
     672
     673        /* No event */
    603674        return CACA_EVENT_NONE;
    604675    }
  • libcaca/trunk/src/graphics.c

    r345 r347  
    7979unsigned int _caca_width = 0;
    8080unsigned int _caca_height = 0;
     81unsigned int _caca_new_width = 0;
     82unsigned int _caca_new_height = 0;
    8183#endif
    8284
     
    155157Display *x11_dpy;
    156158Window x11_window;
     159long int x11_event_mask = KeyPressMask | KeyReleaseMask | ButtonPressMask
     160            | ButtonReleaseMask | PointerMotionMask | StructureNotifyMask;
    157161int x11_font_width, x11_font_height;
    158162static GC x11_gc;
     
    230234 * Local functions
    231235 */
     236static void caca_handle_resize(void);
     237
    232238#if defined(USE_SLANG)
    233239static void slang_init_palette(void);
     
    797803#endif
    798804
    799         XSelectInput(x11_dpy, x11_window,
    800                      KeyPressMask | KeyReleaseMask | ButtonPressMask
    801                       | ButtonReleaseMask | PointerMotionMask);
     805        XSelectInput(x11_dpy, x11_window, x11_event_mask);
    802806
    803807        XSync(x11_dpy, False);
     
    888892
    889893    _caca_scratch_line = malloc(_caca_width + 1);
     894
     895    _caca_new_width = _caca_width;
     896    _caca_new_height = _caca_height;
    890897
    891898    _caca_delay = 0;
     
    11631170    }
    11641171
     1172    if(_caca_width != _caca_new_width || _caca_height != _caca_new_height)
     1173        caca_handle_resize();
     1174
    11651175    /* Wait until _caca_delay + time of last call */
    11661176    ticks += _caca_getticks(&timer);
     
    11801190    if(lastticks > (int)_caca_delay)
    11811191        lastticks = 0;
     1192}
     1193
     1194/*
     1195 * XXX: following functions are loca
     1196 */
     1197static void caca_handle_resize(void)
     1198{
     1199    unsigned int old_width = _caca_width;
     1200    unsigned int old_height = _caca_height;
     1201
     1202    _caca_width = _caca_new_width;
     1203    _caca_height = _caca_new_height;
     1204
     1205    free(_caca_empty_line);
     1206    _caca_empty_line = malloc(_caca_width + 1);
     1207    memset(_caca_empty_line, ' ', _caca_width);
     1208    _caca_empty_line[_caca_width] = '\0';
     1209
     1210    free(_caca_scratch_line);
     1211    _caca_scratch_line = malloc(_caca_width + 1);
     1212
     1213#if defined(USE_SLANG)
     1214    if(_caca_driver == CACA_DRIVER_SLANG)
     1215    {
     1216    }
     1217    else
     1218#endif
     1219#if defined(USE_NCURSES)
     1220    if(_caca_driver == CACA_DRIVER_NCURSES)
     1221    {
     1222    }
     1223    else
     1224#endif
     1225#if defined(USE_CONIO)
     1226    if(_caca_driver == CACA_DRIVER_CONIO)
     1227    {
     1228    }
     1229    else
     1230#endif
     1231#if defined(USE_X11)
     1232    if(_caca_driver == CACA_DRIVER_X11)
     1233    {
     1234        XFreePixmap(x11_dpy, x11_pixmap);
     1235        free(x11_char);
     1236        free(x11_attr);
     1237
     1238        x11_pixmap = XCreatePixmap(x11_dpy, x11_window,
     1239                                   _caca_width * x11_font_width,
     1240                                   _caca_height * x11_font_height,
     1241                                   DefaultDepth(x11_dpy,
     1242                                                DefaultScreen(x11_dpy)));
     1243        x11_char = malloc(_caca_width * _caca_height * sizeof(int));
     1244        memset(x11_char, 0, _caca_width * _caca_height * sizeof(int));
     1245        x11_attr = malloc(_caca_width * _caca_height * sizeof(int));
     1246        memset(x11_attr, 0, _caca_width * _caca_height * sizeof(int));
     1247    }
     1248    else
     1249#endif
     1250#if defined(USE_WIN32)
     1251    if(_caca_driver == CACA_DRIVER_WIN32)
     1252    {
     1253    }
     1254    else
     1255#endif
     1256    {
     1257        /* Dummy */
     1258    }
    11821259}
    11831260
     
    12301307static int x11_error_handler(Display *dpy, XErrorEvent *event)
    12311308{
     1309    /* Ignore the error */
    12321310    return 0;
    12331311}
Note: See TracChangeset for help on using the changeset viewer.