source: abuse/branches/pd/imlib/port/mac/event.c @ 528

Last change on this file since 528 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.4 KB
Line 
1#include "system.h"
2#include "image.hpp"
3#include "palette.hpp"
4#include "mdlread.hpp"
5#include "video.hpp"
6#include "gifread.hpp"
7#include "macs.hpp"
8#include "mouse.hpp"
9#include "event.hpp"
10#include "sprite.hpp"
11
12#include <OSEvents.h>
13
14extern CWindowPtr mainwin;
15const short MACEVENTS = mUpMask | mDownMask | keyUpMask | keyDownMask | autoKeyMask;
16short OldEventMask;
17EventRecord MacEv;
18int mmoved,mbed,mac_ready,keyed,mouse2ed;
19char mac_modifier[8],mac_oldmod[8];
20enum mac_modnum
21{
22        MAC_COMMAND = 0x37,
23        MAC_LSHIFT,
24        MAC_CAPSLOCK,
25        MAC_LOPTION,
26        MAC_LCONTROL,
27        MAC_RSHIFT,
28        MAC_ROPTION,
29        MAC_RCONTROL,
30        MAC_LAST
31};
32int mac_map[8] =
33{
34        JK_COMMAND,
35        JK_SHIFT_L,
36        JK_CAPS,
37        JK_ALT_L,
38        JK_CTRL_L,
39        JK_SHIFT_R,
40        JK_ALT_R,
41        JK_CTRL_R,
42};
43
44void event_handler::flush_screen()
45{
46  update_dirty(screen);
47}
48
49int event_handler::get_key_flags()
50{
51        return 0;
52}
53
54int event_handler::event_waiting()
55{
56        unsigned char km[16];
57        int i;
58       
59        if (ewaiting || mmoved || mbed || mac_ready || keyed)
60                return 1;
61
62        // Get key states & map to array
63        GetKeys((unsigned long*)&km);
64        for (i=0; i<MAC_LAST-MAC_COMMAND; i++) {
65                mac_modifier[i] = (km[ (i+MAC_COMMAND) >> 3 ] >> ((i+MAC_COMMAND) & 7)) & 1;
66                if (mac_modifier[i] != mac_oldmod[i])
67                        keyed = 1;
68        }
69
70        mouse->update();
71        mouse->set_button(mouse->button() | (mouse2ed << 1));
72        if (mouse->lastx() != mouse->x() || mouse->lasty() != mouse->y())
73        {
74                mmoved = 1;
75        }
76        if (mouse->last_button() != mouse->button())
77        {
78                mbed = 1;
79        }
80       
81        mac_ready = (mac_ready)? 1 : GetOSEvent(MACEVENTS,&MacEv);
82
83        return ewaiting || mmoved || mbed || mac_ready || keyed;
84}
85
86event_handler::event_handler(image *screen, palette *pal)
87{
88  CHECK(screen && pal);
89  mouse=new JCMouse(screen,pal);
90  mhere=1;
91  OldEventMask = *((short*)0x0144);
92        SetEventMask(MACEVENTS);
93  ewaiting=0;
94  mmoved = 0;
95  mac_ready = 0;
96  mouse2ed = 0;
97}
98
99void event_handler::get_event(event &ev)
100{
101//
102  int kf,kf_change=0;
103  event *ep;
104 
105  while (!event_waiting()) ;
106
107  ep=(event *)events.first();
108  if (ep)
109  {
110        ev=*ep;
111    events.unlink((linked_node *)ep);
112    delete ep;
113    ewaiting = (events.first()!=NULL);
114  }
115  else if (mmoved) {
116        ev.type = EV_MOUSE_MOVE;
117    ev.mouse_move.x=mouse->x();
118    ev.mouse_move.y=mouse->y();
119    ev.mouse_button=mouse->button();
120    mouse->mouse_sprite()->x = mouse->x();
121    mouse->mouse_sprite()->y = mouse->y();
122        mmoved = 0;
123  }
124  else if (mbed) {
125    ev.mouse_move.x=mouse->x();
126    ev.mouse_move.y=mouse->y();
127    ev.mouse_button=mouse->button();
128    ev.type=EV_MOUSE_BUTTON;
129    mbed = 0;
130  }
131  else if (keyed) {
132        int found;
133       
134    ev.mouse_move.x=mouse->x();
135    ev.mouse_move.y=mouse->y();
136    ev.mouse_button=mouse->button();
137                found = -1;
138                keyed = 0;
139        for (int i=0; i<MAC_LAST-MAC_COMMAND; i++)
140        {
141                        if (mac_modifier[i] != mac_oldmod[i])
142                                if (found<0)
143                                        found = i;
144                                else
145                                        keyed = 1;
146                }
147                ev.key = mac_map[found];
148                mac_oldmod[found] = mac_modifier[found];
149                if (mac_modifier[found])
150                        ev.type = EV_KEY;
151                else
152                        ev.type = EV_KEYRELEASE;
153        }
154  else if (mac_ready)
155  {
156    // note : that the mouse status
157    // should be know even if
158    // other event has occured
159    ev.mouse_move.x=mouse->x();
160    ev.mouse_move.y=mouse->y();
161    ev.mouse_button=mouse->button();
162
163    switch (MacEv.what)
164    {
165        /*
166        case ConfigureNotify :
167                break;
168        case updateEvt :
169        {
170                ev.type=EV_REDRAW;
171          ev.redraw.x1=0;
172          ev.redraw.y1=0;
173          ev.redraw.x2=ev.redraw.x1+10;  // must replace this to redraw whole window!
174          ev.redraw.y2=ev.redraw.y1+10;
175          ev.redraw.start=NULL;
176        } break;
177      */
178      case keyDown :
179      case keyUp :
180      case autoKey :
181      {
182        if (MacEv.what==keyUp)
183          ev.type=EV_KEYRELEASE;
184        else
185                ev.type=EV_KEY;
186        switch ((MacEv.message & keyCodeMask)>>8)
187        {
188                case 0x7d :     ev.key=JK_DOWN; break;
189          case 0x7e :   ev.key=JK_UP;  break;
190          case 0x7b :   ev.key=JK_LEFT;  break;
191          case 0x7c :   ev.key=JK_RIGHT;  break;
192          /*
193          case XK_Control_L :   ev.key=JK_CTRL_L;  break;
194          case XK_Control_R :   ev.key=JK_CTRL_R;  break;
195          case XK_Alt_L :               ev.key=JK_ALT_L;  break;
196          case XK_Alt_R :               ev.key=JK_ALT_R;  break;
197          case XK_Shift_L :     ev.key=JK_SHIFT_L;  break;
198          case XK_Shift_R :     ev.key=JK_SHIFT_R;  break;
199          */
200          case 0x47 :   ev.key=JK_NUM_LOCK;  break;
201          case 0x73 :   ev.key=JK_HOME;  break;
202          case 0x77 :   ev.key=JK_END;  break;
203          case 0x33 :           ev.key=JK_BACKSPACE;  break;
204          case 0x30 :           ev.key=JK_TAB;  break;
205          case 0x4c :           ev.key=JK_ENTER;  break;
206          case 0x39 :           ev.key=JK_CAPS;  break;
207                case 0x35 :             ev.key=JK_ESC;  break;
208                case 0x71 :   ev.key=JK_F1; break;
209          case 0x78 :   ev.key=JK_F2;break;
210          case 0x63 :   ev.key=JK_F3; break;
211          case 0x76 :   ev.key=JK_F4; break;
212          case 0x60 :   ev.key=JK_F5; break;
213          case 0x61 :   ev.key=JK_F6; break;
214          case 0x62 :   ev.key=JK_F7; break;
215          case 0x64 :   ev.key=JK_F8; break;
216          case 0x65 :   ev.key=JK_F9; break;
217          case 0x6d :   ev.key=JK_F10; break;
218                case 0x67 :   ev.key=JK_INSERT; break;
219                case 0x74 :   ev.key=JK_PAGEUP; break;
220                case 0x79 :   ev.key=JK_PAGEDOWN; break;
221               
222                case 0x52: // generate mouse 2 event
223                        mouse2ed = (ev.type == EV_KEY);
224                        ev.type = EV_MOUSE_BUTTON;
225                                                mouse->set_button((mouse->button()&1) | (mouse2ed << 1));
226                                ev.mouse_button |= mouse->button();
227                                mbed = 1;
228                        break;
229          default :
230            // modifiers in event.modifiers
231                                                ev.key = MacEv.message &charCodeMask;
232        }
233      } break;
234      /*
235      case MotionNotify :
236      {
237        mouse->update(MacEv.xmotion.x,MacEv.xmotion.y,mouse->button());
238        ev.type=EV_MOUSE_MOVE;
239        ev.mouse_move.x=mouse->x();
240        ev.mouse_move.y=mouse->y();
241      } break;
242      */
243      /* now handled automatically
244      case mouseUp :
245      case mouseDown :
246      {
247        ev.type=EV_MOUSE_BUTTON;
248      } break;
249      */
250    }
251    mac_ready=0;
252  }
253  else
254        ev.type = EV_SPURIOUS;
255}
256
257
258void event_handler::add_redraw(int X1, int Y1, int X2, int Y2, void *Start)
259{
260  event *ev;
261  ev=new event;
262  ev->type=EV_REDRAW;
263  ev->redraw.x1=X1; ev->redraw.x2=X2;
264  ev->redraw.y1=Y1; ev->redraw.y2=Y2; ev->redraw.start=Start;
265  events.add_end((linked_node *)ev);
266}
267
268event_handler::~event_handler()
269{
270        SetEventMask(OldEventMask);
271        delete mouse;
272}
273
274
275
276
277
278
Note: See TracBrowser for help on using the repository browser.