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