Fumbeling about at the Cocoa implementation.

git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3@6960 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
This commit is contained in:
Matthias Melcher 2009-12-08 23:15:30 +00:00
parent 0b0afc165b
commit 0f0a4672c9
2 changed files with 104 additions and 35 deletions

View File

@ -36,10 +36,34 @@
// Standard MacOS Carbon API includes...
#include <Carbon/Carbon.h>
#if (MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5) && !__LP64__
#include <config.h>
#ifdef __APPLE_COCOA__
#ifndef MAC_OS_X_VERSION_10_3
#define MAC_OS_X_VERSION_10_3 1030
#endif
#ifndef MAC_OS_X_VERSION_10_4
#define MAC_OS_X_VERSION_10_4 1040
#endif
#ifndef MAC_OS_X_VERSION_10_5
#define MAC_OS_X_VERSION_10_5 1050
#endif
#ifndef MAC_OS_X_VERSION_10_6
#define MAC_OS_X_VERSION_10_6 1060
#endif
#ifndef MAC_OS_X_VERSION_MAX_ALLOWED
#define MAC_OS_X_VERSION_MAX_ALLOWED MAC_OS_X_VERSION_10_3
#endif
#ifndef CGFLOAT_DEFINED //appears with 10.5 in CGBase.h
#if defined(__LP64__) && __LP64__
typedef double CGFloat;
#else
typedef float CGFloat;
#endif
#include <config.h>
#endif
#endif
// Now make some fixes to the headers...
#undef check // Dunno where this comes from...

View File

@ -61,16 +61,15 @@ extern "C" {
#include <stdarg.h>
#import <Cocoa/Cocoa.h>
#include <AvailabilityMacros.h>
#if defined(__LP64__) && __LP64__
typedef double CGFloat;
#else
typedef float CGFloat;
#endif
#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5
#ifndef NSINTEGER_DEFINED //appears with 10.5 in NSObjCRuntime.h
#if defined(__LP64__) && __LP64__
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif
#endif
@ -105,15 +104,15 @@ static void cocoaMouseHandler(NSEvent *theEvent);
// public variables
int fl_screen;
CGContextRef fl_gc = 0;
void *fl_system_menu; // this is really a NSMenu*
void *fl_system_menu; // this is really a NSMenu*
Fl_Sys_Menu_Bar *fl_sys_menu_bar = 0;
void *fl_default_cursor; // this is really a NSCursor*
void *fl_capture = 0; // (NSWindow*) we need this to compensate for a missing(?) mouse capture
//ulong fl_event_time; // the last timestamp from an x event
char fl_key_vector[32]; // used by Fl::get_key()
bool fl_show_iconic; // true if called from iconize() - shows the next created window in collapsed state
int fl_disable_transient_for; // secret method of removing TRANSIENT_FOR
//const Fl_Window* fl_modal_for; // parent of modal() window
void *fl_default_cursor; // this is really a NSCursor*
void *fl_capture = 0; // (NSWindow*) we need this to compensate for a missing(?) mouse capture
//ulong fl_event_time; // the last timestamp from an x event
char fl_key_vector[32]; // used by Fl::get_key()
bool fl_show_iconic; // true if called from iconize() - shows the next created window in collapsed state
int fl_disable_transient_for; // secret method of removing TRANSIENT_FOR
//const Fl_Window* fl_modal_for; // parent of modal() window
Fl_Region fl_window_region = 0;
Window fl_window;
Fl_Window *Fl_Window::current_;
@ -660,8 +659,8 @@ static double do_queued_events( double time = 0.0 )
}
}
NSEvent *event = [NSApp nextEventMatchingMask:NSAnyEventMask
untilDate:[NSDate dateWithTimeIntervalSinceNow:time]
inMode:NSDefaultRunLoopMode dequeue:YES];
untilDate:[NSDate dateWithTimeIntervalSinceNow:time]
inMode:NSDefaultRunLoopMode dequeue:YES];
BOOL needSendEvent = YES;
if([event type] == NSLeftMouseDown) {
Fl_Window *grab = Fl::grab();
@ -1255,7 +1254,11 @@ extern "C" {
UInt32 _arg3, UInt32 _arg4, UInt32 _arg5);
}
@interface FLDelegate : NSObject {
@interface FLDelegate : NSObject
#if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_6
<NSWindowDelegate, NSApplicationDelegate>
#endif
{
}
- (void)windowDidMove:(NSNotification *)notif;
- (void)windowDidResize:(NSNotification *)notif;
@ -1413,7 +1416,7 @@ void fl_open_display() {
// conditional code compiled on 10.2 will still work on newer releases...
OSErr err;
#if __LP64__
err = TransformProcessType(&cur_psn, kProcessTransformToForegroundApplication);
err = TransformProcessType(&cur_psn, kProcessTransformToForegroundApplication);
#else
#if MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_2
@ -2746,6 +2749,23 @@ int MACscreen_init(XRectangle screens[])
return num_screens;
}
@interface FLaboutItemTarget : NSObject
{
}
- (void)showPanel;
@end
@implementation FLaboutItemTarget
- (void)showPanel
{
NSDictionary *options;
options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSString stringWithFormat:@" FLTK %d.%d Cocoa", FL_MAJOR_VERSION,
FL_MINOR_VERSION ], @"Copyright",
nil];
[NSApp orderFrontStandardAboutPanelWithOptions:options];
}
@end
static NSMenu *appleMenu;
static void createAppleMenu(void)
{
@ -2763,7 +2783,9 @@ static void createAppleMenu(void)
appleMenu = [[NSMenu alloc] initWithTitle:@""];
/* Add menu items */
title = [@"About " stringByAppendingString:(NSString*)nsappname];
[appleMenu addItemWithTitle:title action:@selector(orderFrontStandardAboutPanel:) keyEquivalent:@""];
[appleMenu addItemWithTitle:title action:@selector(showPanel) keyEquivalent:@""];
FLaboutItemTarget *about = [[FLaboutItemTarget alloc] init];
[[appleMenu itemAtIndex:0] setTarget:about];
[appleMenu addItem:[NSMenuItem separatorItem]];
// Services Menu
services = [[[NSMenu alloc] init] autorelease];
@ -2818,7 +2840,7 @@ static void createAppleMenu(void)
}
- (void) doCallback:(id)obj
{
cb((Fl_Widget*)obj, data);
if (cb) cb((Fl_Widget*)obj, data);
}
- (void*)getItemData
{
@ -2865,6 +2887,26 @@ void MACsetAboutMenu( Fl_Callback *cb, void *data )
[item setTarget:item];
}
static char *remove_ampersand(const char *s)
{
char *ret = strdup(s);
const char *p = s;
char *q = ret;
while(*p != 0) {
if (p[0]=='&') {
if (p[1]=='&') {
*q++ = '&'; p+=2;
} else {
p++;
}
} else {
*q++ = *p++;
}
}
*q = 0;
return ret;
}
void *MACMenuOrItemOperation(const char *operation, ...)
/* these operations apply to menus, submenus, or menu items
*/
@ -2881,7 +2923,7 @@ void *MACMenuOrItemOperation(const char *operation, ...)
menu = va_arg(ap, NSMenu*);
value = va_arg(ap, int);
retval = (void *)[menu itemAtIndex:value];
}
}
else if(strcmp(operation, "setKeyEquivalent") == 0) {//arguments: NSMenuItem*, int
item = va_arg(ap, NSMenuItem*);
value = va_arg(ap, int);
@ -2898,16 +2940,17 @@ void *MACMenuOrItemOperation(const char *operation, ...)
if ( value & FL_ALT ) macMod |= NSAlternateKeyMask;
if ( value & FL_CTRL ) macMod |= NSControlKeyMask;
[item setKeyEquivalentModifierMask:macMod];
}
}
else if(strcmp(operation, "setState") == 0) {//arguments: NSMenuItem*, int
item = va_arg(ap, NSMenuItem*);
value = va_arg(ap, int);
[item setState:(value ? NSOnState : NSOffState)];
}
}
else if(strcmp(operation, "initWithTitle") == 0) {//arguments: const char*title. Returns the newly created menu
//creates a new (sub)menu
pter = va_arg(ap, void *);
CFStringRef title = CFStringCreateWithCString(NULL, (const char *)pter, kCFStringEncodingUTF8);
//creates a new (sub)menu
char *ts = remove_ampersand(va_arg(ap, char *));
CFStringRef title = CFStringCreateWithCString(NULL, ts, kCFStringEncodingUTF8);
free(ts);
NSMenu *menu = [[NSMenu alloc] initWithTitle:(NSString*)title];
CFRelease(title);
[menu setAutoenablesItems:NO];
@ -2915,13 +2958,13 @@ void *MACMenuOrItemOperation(const char *operation, ...)
[menu autorelease];
}
else if(strcmp(operation, "numberOfItems") == 0) {//arguments: NSMenu *menu, int *pcount
//upon return, *pcount is set to menu's item count
//upon return, *pcount is set to menu's item count
menu = va_arg(ap, NSMenu*);
pter = va_arg(ap, void *);
*(int*)pter = [menu numberOfItems];
}
else if(strcmp(operation, "setSubmenu") == 0) {//arguments: NSMenuItem *item, NSMenu *menu
//sets 'menu' as submenu attached to 'item'
//sets 'menu' as submenu attached to 'item'
item = va_arg(ap, NSMenuItem*);
menu = va_arg(ap, NSMenu*);
[item setSubmenu:menu];
@ -2937,8 +2980,9 @@ void *MACMenuOrItemOperation(const char *operation, ...)
}
else if(strcmp(operation, "setTitle") == 0) {//arguments: NSMenuItem*, const char *
item = va_arg(ap, NSMenuItem*);
pter = va_arg(ap, void *);
CFStringRef title = CFStringCreateWithCString(NULL, (const char *)pter, kCFStringEncodingUTF8);
char *ts = remove_ampersand(va_arg(ap, char *));
CFStringRef title = CFStringCreateWithCString(NULL, ts, kCFStringEncodingUTF8);
free(ts);
[item setTitle:(NSString*)title];
CFRelease(title);
}
@ -2948,7 +2992,7 @@ void *MACMenuOrItemOperation(const char *operation, ...)
[menu removeItem:[menu itemAtIndex:value]];
}
else if(strcmp(operation, "getItemData") == 0) {//arguments: NSMenu*, int. Returns the item's data
//items can have a callback and a data pointer attached to them. This returns the data pointer
//items can have a callback and a data pointer attached to them. This returns the data pointer
menu = va_arg(ap, NSMenu*);
value = va_arg(ap, int);
retval = [(FLMenuItem *)[menu itemAtIndex:value] getItemData];
@ -2959,11 +3003,12 @@ void *MACMenuOrItemOperation(const char *operation, ...)
//attaches callback 'cb' and data pointer 'data' to it
//upon return, puts the rank of the new item in *prank unless prank is NULL
menu = va_arg(ap, NSMenu*);
const char *name = va_arg(ap, const char*);
char *name = remove_ampersand(va_arg(ap, const char*));
Fl_Callback *cb = va_arg(ap, Fl_Callback*);
pter = va_arg(ap, void *);
int *prank = va_arg(ap, int*);
CFStringRef cfname = CFStringCreateWithCString(NULL, name, kCFStringEncodingUTF8);
free(name);
FLMenuItem *item = [FLMenuItem alloc];
[item initWithTitle:(NSString*)cfname action:@selector(doCallback:) keyEquivalent:@""];
[item putData:cb pter:pter];