Changeset 3343 in project


Ignore:
Timestamp:
03/09/07 17:22:15 (14 years ago)
Author:
thu
Message:

added autorepeat enabling/disabling

Location:
gl-display-glx
Files:
8 edited

Legend:

Unmodified
Added
Removed
  • gl-display-glx/TODO

    r3309 r3343  
    66-----------
    77
     8- put everything in a trunk directory
    89- clean source code from use/require/etc
    910- use finalizers (register a feature when the code uses finalizers?)
  • gl-display-glx/gl-display-events-util.scm

    r3309 r3343  
    6565  (process))
    6666
    67 
    68 
    6967(define (key-pressed? event)
    7068  (eqv? 'KEY-PRESSED (gl-display:event-type event)))
  • gl-display-glx/gl-display-glx.scm

    r3309 r3343  
    3232    gl-display:screen-width
    3333    gl-display:screen-height
     34    gl-display:enable-autorepeat
     35    gl-display:disable-autorepeat
    3436    )
    3537  )
     
    144146  (foreign-lambda unsigned-int "get_screen_height" c-pointer))
    145147
     148(define gl-display:enable-autorepeat
     149  (foreign-lambda void "enable_autorepeat" c-pointer))
     150(define gl-display:disable-autorepeat
     151  (foreign-lambda void "disable_autorepeat" c-pointer))
     152
    146153; An optional list of properties can be provided.
    147154; The supported properties are:
  • gl-display-glx/gl-proj.scm

    r3309 r3343  
    5757          ,@rest
    5858          (gl:PopMatrix)))
     59
  • gl-display-glx/gl-util.scm

    r3309 r3343  
    5151  (gl:Enable gl:CULL_FACE))
    5252
    53 ; TODO merge the two following procedure.
    54 
    55 ; Draw a unit square on the x/y plane.
    56 (define (unit-square-xy)
    57   (emit-quads
    58     (vertex -0.5 -0.5)
    59     (vertex  0.5 -0.5)
    60     (vertex  0.5  0.5)
    61     (vertex -0.5  0.5)))
    62 
    6353; Draw a square on the x/y plane. Size is given in argument.
    6454(define (square-xy size)
     
    7060      (vertex  s  s)
    7161      (vertex -s  s))))
     62
     63; Draw a cube.
     64(define (gl-util:cube size)
     65  (let ((-s (/ (- size) 2))
     66        (s (/ size 2)))
     67    (emit-quads
     68      (gl:Color3f 1 0.7 0)
     69      (vertex -s -s  s) ; front
     70      (vertex  s -s  s)
     71      (vertex  s  s  s)
     72      (vertex -s  s  s)
     73     
     74      (gl:Color3f 0.9 0.6 0)
     75      (vertex  s -s  s) ; right (its left)
     76      (vertex  s -s -s)
     77      (vertex  s  s -s)
     78      (vertex  s  s  s)
     79     
     80      (gl:Color3f 0.9 0.5 0.1)
     81      (vertex  s -s -s) ; back
     82      (vertex -s -s -s)
     83      (vertex -s  s -s)
     84      (vertex  s  s -s)
     85     
     86      (gl:Color3f 1.0 0.6 0.1)
     87      (vertex -s -s -s) ; left
     88      (vertex -s -s  s)
     89      (vertex -s  s  s)
     90      (vertex -s  s -s)
     91     
     92      (gl:Color3f 0.8 0.6 0.2)
     93      (vertex -s -s -s) ; bottom
     94      (vertex  s -s -s)
     95      (vertex  s -s  s)
     96      (vertex -s -s  s)
     97     
     98      (gl:Color3f 1.0 0.5 0.2)
     99      (vertex -s  s  s) ; top
     100      (vertex  s  s  s)
     101      (vertex  s  s -s)
     102      (vertex -s  s -s)
     103      )))
     104
     105(define (gl-util:axis size)
     106  (emit-lines
     107    (gl:Color3f 1 0 0) ; x
     108    (vertex 0 0 0)
     109    (vertex size 0 0)
     110
     111    (gl:Color3f 0 0 1) ; y
     112    (vertex 0 0 0)
     113    (vertex 0 size 0)
     114
     115    (gl:Color3f 0 1 0) ; z
     116    (vertex 0 0 0)
     117    (vertex 0 0 size)))
    72118
    73119; Draw a grid.
  • gl-display-glx/glx_display.c

    r3309 r3343  
    6464#endif
    6565 
     66void
     67enable_autorepeat (
     68#ifndef GLX_DISPLAY_SINGLESTATE
     69  gl_window_t  * gl_window
     70#endif
     71  )
     72{
     73  gl_window->autorepeat_flag = 1;
     74}
     75
     76void
     77disable_autorepeat (
     78#ifndef GLX_DISPLAY_SINGLESTATE
     79  gl_window_t  * gl_window
     80#endif
     81  )
     82{
     83  gl_window->autorepeat_flag = 0;
     84}
     85
    6686void
    6787destroy_gl_window (
     
    85105        XF86VidModeSetViewPort(GLWin.dpy, GLWin.screen, 0, 0);
    86106    }*/
     107
    87108  XCloseDisplay(gl_window->display);
    88109}
     
    141162  if( !gl_window->display )
    142163    exit_on_err(" XOpenDisplay failed.");
    143 
     164 
    144165  gl_window->screen = DefaultScreen( gl_window->display );
    145166
     
    207228  {
    208229    XEvent e;
    209     XNextEvent( gl_window->display, &e);
     230    XNextEvent( gl_window->display, &e );
    210231    if ( e.type == MapNotify ) break;
    211232  }
     
    299320  static XEvent e;
    300321  static int pending = 0;
    301 
    302   if (pending == 0) pending = XPending( gl_window->display );
    303   if (pending > 0)
    304   {
     322  int repeating = 1;
     323
     324  if ( pending == 0 ) pending = XPending( gl_window->display );
     325  while ( pending > 0 && repeating )
     326  {
     327    repeating = 0;
    305328    XNextEvent( gl_window->display, &e );
    306329    pending--;
    307   }
    308   else
     330
     331    /* Handle autorepeat.
     332     * The mechanic is taken from Quake3.
     333     * In Quake3, they assume the KeyRelease and
     334     * the followinf KeyPress have the same time.
     335     * Here, I've added a delta of 10 because
     336     * I experienced different times for
     337     * autorepeating events (actually, it was only
     338     * a delta of 1 millisecond...).
     339     */
     340    if ( e.type == KeyRelease && !gl_window->autorepeat_flag )
     341    {
     342      if ( pending == 0 ) pending = XPending( gl_window->display );
     343      if ( pending > 0 )
     344      {
     345        XEvent peekevent;
     346        XPeekEvent( gl_window->display, &peekevent );
     347        if ((peekevent.type == KeyPress) &&
     348            (peekevent.xkey.keycode == e.xkey.keycode) &&
     349            (peekevent.xkey.time >= e.xkey.time &&
     350             peekevent.xkey.time <= e.xkey.time + 10))
     351        {
     352          /* it's autorepeating, remove the KeyPress. */
     353          XNextEvent( gl_window->display, &e );
     354          pending--;
     355          repeating = 1;
     356        }
     357      }
     358    }
     359  }
     360 
     361  if ( repeating )
    309362  {
    310363    e.type = LASTEvent + 1; /* means 'no event' */
  • gl-display-glx/glx_display.h

    r3309 r3343  
    1919  int          double_buffered_flag;
    2020  int          mouse_flag;
     21  int          autorepeat_flag;
    2122  /* XF86VidModeModeInfo original_mode; *//* i.e. desktop mode */
    2223  int          x;
     
    4041unsigned int get_screen_height( gl_window_t  * gl_window );
    4142#endif
     43
     44void
     45enable_autorepeat (
     46#ifndef GLX_DISPLAY_SINGLESTATE
     47  gl_window_t  * gl_window
     48#endif
     49  );
     50
     51void
     52disable_autorepeat (
     53#ifndef GLX_DISPLAY_SINGLESTATE
     54  gl_window_t  * gl_window
     55#endif
     56  );
    4257 
    4358void destroy_gl_window (
  • gl-display-glx/samples/s03-repl.scm

    r3309 r3343  
    1616(gl-util:initialize)
    1717(gl-proj:viewport *display*)
    18 (gl-proj:perspective *display*)
    19 (gl-proj:orthographic *display*)
    2018(enable-backface-culling)
    2119
     
    6462             ))))
    6563
     64; TODO write a procedure to map a key to a command
     65; to create shortcuts easilly.
     66
     67(define (event-for-shortcut event)
     68  (if (key-released? event)
     69    (let ((key (gl-display:event-key event)))
     70      (cond ((eq? key #\esc)
     71             (events:send 'commands (list 'command (gl-display:time) '(quit)))
     72             #t)
     73            (else #f)))
     74    #f))
     75
    6676(define (event-for-command event)
    6777  (if (key-pressed? event)
     
    8898(events:handle 'gui
    8999    (lambda (event)
    90       (let ((e-for-c (event-for-command event)))
    91         (cond (e-for-c)
    92               ((escape-key-released? event)
    93                (events:send 'commands (list 'command (gl-display:time) '(quit))))))))
     100      (cond ((event-for-shortcut event))
     101            ((event-for-command  event)))))
    94102
    95103(define (quit) (set! *continue* #f))
     
    104112                              (var () (print "an exception occured in the command"))))))))))
    105113
     114(define *y-rot* 0)
     115(define (y-rot)
     116  (set! *y-rot* (if (= *y-rot* 360) 1 (+ *y-rot* 1))))
    106117(define (render)
    107118  (clear)
    108119  (gl:Color3f 0 0 0)
     120  (gl-proj:perspective *display*)
    109121  (load-identity)
     122  (gl:Translatef 0 2 -8)
     123  (square-xy 2)
     124 
     125  (gl:Translatef 0 -2 0)
     126  (gl-util:axis 2)
     127 
     128  (gl:Translatef 0 -2 0)
     129  (gl:Rotatef *y-rot* 0 1 0)
     130  (y-rot)
     131  (gl-util:cube 2)
     132 
    110133  (preserving-matrices
     134    (gl:Color3f 0.2 0.3 1)
     135    (gl-proj:orthographic *display*)
    111136    (gl:Translatef (* (gl-display:width *display*) -0.4) 0 0)
    112     (gl-font:print (string-append "> " (buffer:string))))
    113   (gl:Translatef (* (gl-display:width *display*) -0.4) -40 0)
    114   (gl-font:print (string-append "; " *output-buffer*))
     137    (gl-font:print (string-append "> " (buffer:string)))
     138    (load-identity)
     139    (gl:Translatef (* (gl-display:width *display*) -0.4) -40 0)
     140    (gl-font:print (string-append "; " *output-buffer*)))
    115141  (gl-display:swap *display*))
    116142
     
    125151  (gl-display:destroy *display*))
    126152
    127 (gl:Enable gl:TEXTURE_2D)
    128153(go)
Note: See TracChangeset for help on using the changeset viewer.