ViewVC Help
View File | Revision Log | Show Annotations | Revision Graph | Root Listing
root/cebix/BasiliskII/src/MacOSX/Controller.mm
(Generate patch)

Comparing BasiliskII/src/MacOSX/Controller.mm (file contents):
Revision 1.2 by nigel, 2002-03-16T10:00:18Z vs.
Revision 1.15 by gbeauche, 2008-01-01T09:40:32Z

# Line 3 | Line 3
3   *
4   *      $Id$
5   *
6 < *  Basilisk II (C) 1997-2001 Christian Bauer
6 > *  Basilisk II (C) 1997-2008 Christian Bauer
7   *
8   *  This program is free software; you can redistribute it and/or modify
9   *  it under the terms of the GNU General Public License as published by
# Line 23 | Line 23
23   #import "Controller.h"
24   #import "Emulator.h"
25  
26 @implementation Controller
27
26   #import "sysdeps.h"                             // Types used in Basilisk C++ code
27  
28   #import <main.h>
# Line 33 | Line 31
31   #define DEBUG 0
32   #import <debug.h>
33  
34 + #import "misc_macosx.h"
35   #import "video_macosx.h"
36  
37 + @implementation Controller
38 +
39   //
40   // Standard NSApplication methods that we override
41   //
# Line 42 | Line 43
43   - (id) init
44   {
45   #ifdef ENABLE_MULTIPLE
46 <        emulators  = [[NSMutableArray alloc] init];
46 >        emulators  = [NSMutableArray new];
47   #endif
48          return [super init];
49   }
# Line 66 | Line 67
67  
68   - (void) sendEvent: (NSEvent *)event;
69   {
70 <        NSEventType     type = [event type];
70 >        // We can either process the event ourselves,
71 >        // or pass it to our superclass for the other UI objects to process
72 >        bool    passToSuper = false;
73 >
74 >        if ( [self isAnyEmulatorDisplayingSheets] ||
75 >                        [[thePrefsEditor window] isVisible] || ! [self isAnyEmulatorRunning] )
76 >                passToSuper = true;
77  
78 <        if ( type == NSKeyUp || type == NSKeyDown || type == NSFlagsChanged )
79 <                [self dispatchKeyEvent: event
80 <                                                  type: type];
78 >        if ( [[theEmulator screen] isFullScreen] )
79 >                passToSuper = false;
80 >
81 >        if ( passToSuper )
82 >                [super sendEvent: event];               // NSApplication default
83          else
84 <                [self dispatchEvent:    event
85 <                                           type:        type];
84 >        {
85 >                NSEventType     type = [event type];
86 >
87 >                if ( type == NSKeyUp || type == NSKeyDown || type == NSFlagsChanged )
88 >                        [self dispatchKeyEvent: event
89 >                                                          type: type];
90 >                else
91 >                        [self dispatchEvent: event
92 >                                                   type: type];
93 >        }
94   }
95  
96   // NSApplication methods which are invoked through delegation
# Line 101 | Line 118
118   //
119   //              switch ( NSRunAlertPanel(title, msg, def, alt, other, nil) )
120   //              {
121 < //                      case NSAlertDefault:   savePrefs();
122 < //                      case NSAlertAlternate: return NSTerminateNow;
123 < //                      case NSAlertOther:     return NSTerminateCancel;
121 > //                      case NSAlertDefault:    savePrefs();
122 > //                      case NSAlertAlternate:  return NSTerminateNow;
123 > //                      case NSAlertOther:              return NSTerminateCancel;
124   //              }
125   //      }
126  
# Line 144 | Line 161
161          for ( tmp = 0; tmp < [emulators count], ++tmp )
162          {
163                  theEmulator = [emulators objectAtIndex: tmp];
164 <                if ( [ theEmulator isRunning ] && [[theEmulator window] isKeyWindow ] )
164 >                view = [theEmulator screen];
165 >
166 >                if ( [ theEmulator isRunning ] &&
167 >                                ( [[theEmulator window] isKeyWindow] || [view isFullScreen] ) )
168                          break;
169          }
170          
171          if ( tmp < [emulators count] )          // i.e. if we exited the for loop
172   #else
173 <        if ( [theEmulator isRunning] && [[theEmulator window] isKeyWindow ] )
173 >        view = [theEmulator screen];
174 >
175 >        if ( [theEmulator isRunning] &&
176 >                                ( [[theEmulator window] isKeyWindow] || [view isFullScreen] ) )
177   #endif
178          {
179 <                view = [theEmulator screen];
157 <
179 >                D(NSLog(@"Got a key event - %d\n", [event keyCode]));
180                  switch ( type )
181                  {
182                          case NSKeyUp:
# Line 181 | Line 203
203   - (void) dispatchEvent: (NSEvent *)event
204                                    type: (NSEventType)type                              
205   {
206 +        EmulatorView    *view;
207 +        BOOL                    fullScreen;
208 +
209   #ifdef ENABLE_MULTIPLE
210          // We need to work out what window's Emulator should receive these messages
211  
# Line 190 | Line 215
215          for ( tmp = 0; tmp < [emulators count], ++tmp )
216          {
217                  theEmulator = [emulators objectAtIndex: tmp];
218 <                if ( [ theEmulator isRunning ] &&  [[theEmulator window] isMainWindow ] )
218 >                view = [theEmulator screen];
219 >                fullScreen = [view isFullScreen];
220 >
221 >                if ( [theEmulator isRunning] &&
222 >                                ( fullScreen || [[theEmulator window] isMainWindow] ) )
223                          break;
224          }
225          
226          if ( tmp < [emulators count] )          // i.e. if we exited the for loop
227   #else
228 <        if ( FULLSCREEN ||
229 <                ( [theEmulator isRunning] && [[theEmulator window] isMainWindow ] ) )
228 >        view = [theEmulator screen];
229 >        fullScreen = [view isFullScreen];
230 >
231 >        if ( [theEmulator isRunning] &&
232 >                                ( fullScreen || [[theEmulator window] isMainWindow] ) )
233   #endif
234          {
235 <                EmulatorView    *view = [theEmulator screen];
204 <
205 < //              if ( [view mouseInView] )
206 <                if ( [view mouseInView: event] || FULLSCREEN )
235 >                if ( fullScreen || [view mouseInView: event] )
236                  {
237                          switch ( type )
238                          {
# Line 215 | Line 244
244                                          break;
245                                  case NSLeftMouseDragged:
246                                  case NSMouseMoved:
247 <                                        [view processMouseMove: event];
247 >                                        if ( fullScreen )
248 >                                                [view fullscreenMouseMove];
249 >                                        else
250 >                                                [view processMouseMove: event];
251                                          break;
252                                  default:
253                                          [super sendEvent: event];               // NSApplication default
# Line 234 | Line 266
266                  [super sendEvent: event];
267   }
268  
269 +
270 + // Methods to display documentation:
271 +
272 + - (IBAction) HelpHowTo: (id)sender
273 + {
274 +        NSString        *path = [[NSBundle mainBundle] pathForResource: @"HowTo"
275 +                                                                                                                ofType: @"html"];
276 +
277 +        if ( ! path )
278 +                InfoSheet(@"Cannot find HowTo.html", [theEmulator window]);
279 +        else
280 +                if ( ! [[NSWorkspace sharedWorkspace] openFile: path] )
281 +                        InfoSheet(@"Cannot open HowTo.html with default app", [theEmulator window]);
282 + }
283 +
284 + - (IBAction) HelpToDo: (id)sender
285 + {
286 +        NSString        *path = [[NSBundle mainBundle] pathForResource: @"ToDo"
287 +                                                                                                                ofType: @"html"];
288 +
289 +        if ( ! path )
290 +                InfoSheet(@"Cannot find ToDo.html", [theEmulator window]);
291 +        else
292 +                if ( ! [[NSWorkspace sharedWorkspace] openFile: path
293 +                                                                           withApplication: @"TextEdit"] )
294 +                        InfoSheet(@"Cannot open ToDo.html with TextEdit", [theEmulator window]);
295 + }
296 +
297 + - (IBAction) HelpVersions: (id)sender
298 + {
299 +        NSString        *path = [[NSBundle mainBundle] pathForResource: @"Versions"
300 +                                                                                                                ofType: @"html"];
301 +
302 +        if ( ! path )
303 +                InfoSheet(@"Cannot find Versions.html", [theEmulator window]);
304 +        else
305 +                if ( ! [[NSWorkspace sharedWorkspace] openFile: path
306 +                                                                           withApplication: @"TextEdit"] )
307 +                        InfoSheet(@"Cannot open Versions.html with TextEdit",
308 +                                                                                                [theEmulator window]);
309 + }
310 +
311 +
312 + // Menu items which for managing more than one window
313 +
314   #ifdef ENABLE_MULTIPLE
315  
316   - (IBAction) NewEmulator: (id)sender
# Line 277 | Line 354
354  
355   #endif
356  
357 + - (BOOL) isAnyEmulatorDisplayingSheets
358 + {
359 + #ifdef ENABLE_MULTIPLE
360 +        int     tmp;
361 +
362 +        for ( tmp = 0; tmp < [emulators count], ++tmp )
363 +                if ( [[[emulators objectAtIndex: tmp] window] attachedSheet] )
364 +                        break;
365 +        
366 +        if ( tmp < [emulators count] )          // i.e. if we exited the for loop
367 + #else
368 +        if ( [[theEmulator window] attachedSheet] )
369 + #endif
370 +                return TRUE;
371 +
372 +        return FALSE;
373 + }
374 +
375   - (BOOL) isAnyEmulatorRunning
376   {
377   #ifdef ENABLE_MULTIPLE
# Line 312 | Line 407
407          return count;
408   }
409  
410 < @end
410 > @end

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines