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

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