X-Git-Url: http://git.hungrycats.org/cgi-bin/gitweb.cgi?p=xscreensaver;a=blobdiff_plain;f=hacks%2Fglx%2Fgltrackball.c;h=e3c0cd42402fdb781b03a48a0be8e502d4c7f9c9;hp=c7ddc8b3364d89a0c462f62a52470cd41d21f08d;hb=6b1c86cf395f59389e4ece4ea8f4bea2c332745b;hpb=13dbc569cdc6e29019722c0ef9b932a925efbcad diff --git a/hacks/glx/gltrackball.c b/hacks/glx/gltrackball.c index c7ddc8b3..e3c0cd42 100644 --- a/hacks/glx/gltrackball.c +++ b/hacks/glx/gltrackball.c @@ -1,4 +1,4 @@ -/* gltrackball, Copyright (c) 2002 Jamie Zawinski +/* gltrackball, Copyright (c) 2002-2008 Jamie Zawinski * GL-flavored wrapper for trackball.c * * Permission to use, copy, modify, distribute, and sell this software and its @@ -10,10 +10,19 @@ * implied warranty. */ -#include "config.h" -#include #include -#include +#include + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifdef HAVE_COCOA +# include +#else +# include +#endif + #include "trackball.h" #include "gltrackball.h" @@ -73,3 +82,61 @@ gltrackball_rotate (trackball_state *ts) build_rotmatrix (m, ts->q); glMultMatrixf (&m[0][0]); } + + +# define Button4 4 /* X11/Xlib.h */ +# define Button5 5 +# define Button6 6 +# define Button7 7 + +/* Call this when a mouse-wheel click is detected. + Clicks act like horizontal or vertical drags. + Percent is the length of the drag as a percentage of the screen size. + Button is 'Button4' or 'Button5' (for the vertical wheel) + or 'Button5' or 'Button6' (for the horizontal wheel). + If `flip_p' is true, swap the horizontal and vertical axes. + */ +void +gltrackball_mousewheel (trackball_state *ts, + int button, int percent, int flip_p) +{ + int up_p; + double move; + int horizontal_p; + +#ifdef HAVE_COCOA + flip_p = 0; /* MacOS has already handled this. */ +#endif + + switch (button) { + case Button4: up_p = 1; horizontal_p = 0; break; + case Button5: up_p = 0; horizontal_p = 0; break; + case Button6: up_p = 1; horizontal_p = 1; break; + case Button7: up_p = 0; horizontal_p = 1; break; + default: abort(); break; + } + + if (flip_p) + { + horizontal_p = !horizontal_p; + up_p = !up_p; + } + + move = (up_p + ? 1.0 - (percent / 100.0) + : 1.0 + (percent / 100.0)); + + gltrackball_start (ts, 50, 50, 100, 100); + if (horizontal_p) + gltrackball_track (ts, 50*move, 50, 100, 100); + else + gltrackball_track (ts, 50, 50*move, 100, 100); +} + +void +gltrackball_get_quaternion (trackball_state *ts, float q[4]) +{ + int i; + for (i=0; i<4; i++) + q[i] = ts->q[i]; +}