source: abuse/tags/pd/macabuse/imlib/port/x11/event.c @ 49

Last change on this file since 49 was 49, checked in by Sam Hocevar, 15 years ago
  • Imported original public domain release, for future reference.
  • Property svn:keywords set to Id
File size: 6.7 KB
Line 
1#include "system.h"
2#include "xinclude.h"
3#include "image.hpp"
4#include "palette.hpp"
5#include "mdlread.hpp"
6#include "video.hpp"
7#include "gifread.hpp"
8#include "macs.hpp"
9#include "mouse.hpp"
10#include "event.hpp"
11#include "sprite.hpp"
12#include "xinclude.h"
13
14
15extern Display *display;
16extern int screen_num;
17extern Screen *screen_ptr;
18extern Window mainwin;
19
20void event_handler::flush_screen()
21{
22  update_dirty(screen);
23}
24
25int event_handler::get_key_flags()
26{
27  Window w1,w2;
28  int j;
29  unsigned mask;
30  XQueryPointer(display,mainwin,&w1,&w2,&j,&j,&j,&j,&mask);
31  return ((mask&ShiftMask)!=0)<<3 | ((mask&ControlMask)!=0)<<2 |
32         ((mask&8)!=0)<<1;
33}
34
35
36int event_handler::event_waiting()
37{
38  if (ewaiting) return 1;
39  if (XPending(display))
40    ewaiting=1;
41/*  else if (last_keystat!=get_key_flags())
42    ewaiting=1;*/
43  return ewaiting;
44}
45
46event_handler::event_handler(image *screen, palette *pal)
47{
48  CHECK(screen && pal);
49  mouse=new JCMouse(screen,pal);
50  mhere=mouse->exsist();
51  last_keystat=get_key_flags();
52  XSelectInput(display,mainwin,
53    KeyPressMask | VisibilityChangeMask | ButtonPressMask | ButtonReleaseMask |
54    ButtonMotionMask | PointerMotionMask | KeyReleaseMask |
55    ExposureMask | StructureNotifyMask);
56  mhere=1;
57  ewaiting=0;
58}
59
60void event_handler::get_event(event &ev)
61{
62  int kf,kf_change=0;
63  event *ep;
64  while (!ewaiting)
65    event_waiting();
66
67  ep=(event *)events.first();
68  if (ep)
69  { ev=*ep;
70    events.unlink((linked_node *)ep);
71    delete ep;
72    ewaiting=events.first()!=NULL;
73  }
74  else
75  {
76    // note : that the mouse status
77    // should be know even if
78    // other event has occured
79    ev.mouse_move.x=mouse->x();
80    ev.mouse_move.y=mouse->y();
81    ev.mouse_button=mouse->button();
82
83/*    kf=get_key_flags();
84    if (kf!=last_keystat)
85    { last_keystat=kf;
86      kf_change=1;
87      ev.type=EV_KEY_SPECIAL;
88      ev.key_special.shift=kf&2;
89      ev.key_special.ctrl=kf&4;
90      ev.key_special.alt=kf&8;
91    } */
92
93    XEvent xev;
94    image *n;
95    int np,ij,sp;
96    linked_node *pagep;
97    if (XPending(display))
98    {
99      XNextEvent(display,&xev);
100      ev.window=(jwindow *)xev.xany.window;
101      switch (xev.type)
102      {
103        case ConfigureNotify :
104        {
105          if (xev.xany.window==mainwin && (screen->width()!=xev.xconfigure.width ||
106                screen->height()!=xev.xconfigure.height))
107          {
108            XFlush(display);
109            int new_width=xev.xconfigure.width&~3;  // must be word alligned
110            if (new_width!=xev.xconfigure.width)
111              XResizeWindow(display,mainwin,new_width,xev.xconfigure.height);
112
113            screen->change_size(new_width,xev.xconfigure.height);
114            screen->clear_dirties();
115            screen->clear();
116
117            xres=screen->width()-1;
118            yres=screen->height()-1;
119            ev.type=EV_RESIZE;
120          }
121          else
122            ev.type=EV_SPURIOUS;
123        } break;
124         
125        case Expose :
126        { ev.type=EV_REDRAW;
127          ev.redraw.x1=xev.xexpose.x;
128          ev.redraw.y1=xev.xexpose.y;
129          ev.redraw.x2=ev.redraw.x1+xev.xexpose.width;
130          ev.redraw.y2=ev.redraw.y1+xev.xexpose.height;
131          ev.redraw.start=NULL;
132        } break;
133        case KeyPress :
134        case KeyRelease :
135        {
136          if (!kf_change)  // if the key flags changed, it's not a real key
137          {
138            char buf;
139            KeySym ks;
140            XLookupString(&xev.xkey,&buf,1,&ks,NULL);
141            if (xev.type==KeyPress)
142              ev.type=EV_KEY;
143            else ev.type=EV_KEYRELEASE;
144            switch (ks)
145            { case XK_Down :            ev.key=JK_DOWN; break;
146              case XK_Up :              ev.key=JK_UP;  break;
147              case XK_Left :            ev.key=JK_LEFT;  break;
148              case XK_Right :           ev.key=JK_RIGHT;  break;
149              case XK_Control_L :       ev.key=JK_CTRL_L;  break;
150              case XK_Control_R :       ev.key=JK_CTRL_R;  break;
151              case XK_Alt_L :           ev.key=JK_ALT_L;  break;
152              case XK_Alt_R :           ev.key=JK_ALT_R;  break;
153              case XK_Shift_L :         ev.key=JK_SHIFT_L;  break;
154              case XK_Shift_R :         ev.key=JK_SHIFT_R;  break;
155              case XK_Num_Lock :        ev.key=JK_NUM_LOCK;  break;
156              case XK_Home :            ev.key=JK_HOME;  break;
157              case XK_End :             ev.key=JK_END;  break;
158              case XK_BackSpace :       ev.key=JK_BACKSPACE;  break;
159              case XK_Tab :             ev.key=JK_TAB;  break;
160              case XK_Return :          ev.key=JK_ENTER;  break;
161              case XK_Caps_Lock :       ev.key=JK_CAPS;  break;
162              case XK_Escape :          ev.key=JK_ESC;  break;
163              case XK_F1 :              ev.key=JK_F1; break;
164              case XK_F2 :              ev.key=JK_F2; break;
165              case XK_F3 :              ev.key=JK_F3; break;
166              case XK_F4 :              ev.key=JK_F4; break;
167              case XK_F5 :              ev.key=JK_F5; break;
168              case XK_F6 :              ev.key=JK_F6; break;
169              case XK_F7 :              ev.key=JK_F7; break;
170              case XK_F8 :              ev.key=JK_F8; break;
171              case XK_F9 :              ev.key=JK_F9; break;
172              case XK_F10 :             ev.key=JK_F10; break;
173              case XK_Insert :          ev.key=JK_INSERT; break;
174              case XK_Page_Up :         ev.key=JK_PAGEUP; break;
175              case XK_Page_Down :       ev.key=JK_PAGEDOWN; break;
176              default :
177               if (buf)
178               {
179                 ev.key=(int)buf;
180               }
181               else ev.type=EV_SPURIOUS;
182            }
183          }
184        } break;
185        case MotionNotify :
186        {
187          mouse->update(xev.xmotion.x,xev.xmotion.y,mouse->button());
188          ev.type=EV_MOUSE_MOVE;
189          ev.mouse_move.x=mouse->x();
190          ev.mouse_move.y=mouse->y();
191        } break;
192        case ButtonRelease :
193        { switch (xev.xbutton.button)
194          { case 1 : ev.mouse_button&=(0xff-1); break;
195            case 2 : ev.mouse_button&=(0xff-4); break;
196            case 3 : ev.mouse_button&=(0xff-2); break;
197          }
198        } // no break here please...
199        case ButtonPress :
200        {
201          if (xev.type==ButtonPress)
202          { switch (xev.xbutton.button)
203            { case 1 : ev.mouse_button|=1; break;
204              case 2 : ev.mouse_button|=4; break;
205              case 3 : ev.mouse_button|=2; break;
206            }
207          }
208          mouse->update(mouse->x(),mouse->y(),ev.mouse_button);
209          ev.type=EV_MOUSE_BUTTON;
210          ev.mouse_move.x=mouse->x();
211          ev.mouse_move.y=mouse->y();
212        } break;
213      }
214    }
215    ewaiting=0;
216  }
217}
218
219
220void event_handler::add_redraw(int X1, int Y1, int X2, int Y2, void *Start)
221{
222  event *ev;
223  ev=new event;
224  ev->type=EV_REDRAW;
225  ev->redraw.x1=X1; ev->redraw.x2=X2;
226  ev->redraw.y1=Y1; ev->redraw.y2=Y2; ev->redraw.start=Start;
227  events.add_end((linked_node *)ev);
228}
229
230event_handler::~event_handler() { delete mouse; }
231
232
233
234
235
236
Note: See TracBrowser for help on using the repository browser.