Skip to content
GitLab
Explore
Sign in
Register
Primary navigation
Search or go to…
Project
Synchronet
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container Registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
Main
Synchronet
Commits
d5d059e7
Commit
d5d059e7
authored
13 years ago
by
deuce
Browse files
Options
Downloads
Patches
Plain Diff
Synchronize with the conio version.
parent
402edbbe
No related branches found
Branches containing commit
No related tags found
Tags containing commit
No related merge requests found
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
src/xpdev/SDLMain.m
+171
-70
171 additions, 70 deletions
src/xpdev/SDLMain.m
with
171 additions
and
70 deletions
src/xpdev/SDLMain.m
+
171
−
70
View file @
d5d059e7
...
...
@@ -5,35 +5,69 @@
Feel free to customize this file to suit your needs
*/
#import "SDL.h"
#import "SDLMain.h"
#import <sys/param.h>
/* for MAXPATHLEN */
#import <unistd.h>
#include
"SDL.h"
#include
"SDLMain.h"
#include
<sys/param.h>
/* for MAXPATHLEN */
#include
<unistd.h>
/* For some reaon, Apple removed setAppleMenu from the headers in 10.4,
but the method still is there and works. To avoid warnings, we declare
it ourselves here. */
@interface
NSApplication
(
SDL_Missing_Methods
)
-
(
void
)
setAppleMenu
:(
NSMenu
*
)
menu
;
@end
/* Use this flag to determine whether we use SDLMain.nib or not */
#define SDL_USE_NIB_FILE 0
/* Use this flag to determine whether we use CPS (docking) or not */
#define SDL_USE_CPS 1
#ifdef SDL_USE_CPS
/* Portions of CPS.h */
typedef
struct
CPSProcessSerNum
{
UInt32
lo
;
UInt32
hi
;
}
CPSProcessSerNum
;
extern
OSErr
CPSGetCurrentProcess
(
CPSProcessSerNum
*
psn
);
extern
OSErr
CPSEnableForegroundOperation
(
CPSProcessSerNum
*
psn
,
UInt32
_arg2
,
UInt32
_arg3
,
UInt32
_arg4
,
UInt32
_arg5
);
extern
OSErr
CPSSetFrontProcess
(
CPSProcessSerNum
*
psn
);
#endif
/* SDL_USE_CPS */
static
int
gArgc
;
static
char
**
gArgv
;
static
BOOL
gFinderLaunch
;
static
BOOL
gCalledAppMainline
=
FALSE
;
static
NSString
*
getApplicationName
(
void
)
{
const
NSDictionary
*
dict
;
NSString
*
appName
=
0
;
/* Determine the application name */
dict
=
(
const
NSDictionary
*
)
CFBundleGetInfoDictionary
(
CFBundleGetMainBundle
());
if
(
dict
)
appName
=
[
dict
objectForKey
:
@"CFBundleName"
];
if
(
!
[
appName
length
])
appName
=
[[
NSProcessInfo
processInfo
]
processName
];
return
appName
;
}
#if SDL_USE_NIB_FILE
/* A helper category for NSString */
@interface
NSString
(
ReplaceSubString
)
-
(
NSString
*
)
stringByReplacingRange
:(
NSRange
)
aRange
with
:(
NSString
*
)
aString
;
@end
#else
/* An internal Apple class used to setup Apple menus */
@interface
NSAppleMenuController
:
NSObject
{}
-
(
void
)
controlMenu
:(
NSMenu
*
)
aMenu
;
@end
#endif
@interface
S
DL
Application
:
NS
Application
@interface
N
SApplication
(
SDL
Application
)
@end
@implementation
SDLApplication
@implementation
NSApplication
(
SDLApplication
)
/* Invoked from the Quit menu item */
-
(
void
)
terminate
:(
id
)
sender
{
...
...
@@ -44,31 +78,22 @@ static BOOL gFinderLaunch;
}
@end
/* The main class of the application, the application's delegate */
@implementation
SDLMain
/* Set the working directory to the .app's parent directory */
-
(
void
)
setupWorkingDirectory
:(
BOOL
)
shouldChdir
{
char
parentdir
[
MAXPATHLEN
];
char
*
c
;
strncpy
(
parentdir
,
gArgv
[
0
],
sizeof
(
parentdir
)
);
c
=
(
char
*
)
parentdir
;
while
(
*
c
!=
'\0'
)
/* go to end */
c
++
;
while
(
*
c
!=
'/'
)
/* back up to parent */
c
--
;
*
c
++
=
'\0'
;
/* cut off last part (binary name) */
if
(
shouldChdir
)
{
assert
(
chdir
(
parentdir
)
==
0
);
/* chdir to the binary app's parent */
assert
(
chdir
(
"../../../"
)
==
0
);
/* chdir to the .app's parent */
char
parentdir
[
MAXPATHLEN
];
CFURLRef
url
=
CFBundleCopyBundleURL
(
CFBundleGetMainBundle
());
CFURLRef
url2
=
CFURLCreateCopyDeletingLastPathComponent
(
0
,
url
);
if
(
CFURLGetFileSystemRepresentation
(
url2
,
1
,
(
UInt8
*
)
parentdir
,
MAXPATHLEN
))
{
chdir
(
parentdir
);
/* chdir to the binary app's parent */
}
CFRelease
(
url
);
CFRelease
(
url2
);
}
}
...
...
@@ -94,43 +119,60 @@ static BOOL gFinderLaunch;
if
([
menuItem
hasSubmenu
])
[
self
fixMenu
:[
menuItem
submenu
]
withAppName
:
appName
];
}
[
aMenu
sizeToFit
];
}
#else
void
set
up
Appl
e
Menu
(
void
)
static
void
setAppl
ication
Menu
(
void
)
{
/* warning: this code is very odd */
NSAppleMenuController
*
appleMenuController
;
NSMenu
*
appleMenu
;
NSMenuItem
*
appleMenuItem
;
appleMenuController
=
[[
NSAppleMenuController
alloc
]
init
];
NSMenuItem
*
menuItem
;
NSString
*
title
;
NSString
*
appName
;
appName
=
getApplicationName
();
appleMenu
=
[[
NSMenu
alloc
]
initWithTitle
:
@""
];
appleMenuItem
=
[[
NSMenuItem
alloc
]
initWithTitle
:
@""
action
:
nil
keyEquivalent
:
@""
];
[
appleMenuItem
setSubmenu
:
appleMenu
];
/* yes, we do need to add it and then remove it --
if you don't add it, it doesn't get displayed
if you don't remove it, you have an extra, titleless item in the menubar
when you remove it, it appears to stick around
very, very odd */
[[
NSApp
mainMenu
]
addItem
:
appleMenuItem
];
[
appleMenuController
controlMenu
:
appleMenu
];
[[
NSApp
mainMenu
]
removeItem
:
appleMenuItem
];
/* Add menu items */
title
=
[
@"About "
stringByAppendingString
:
appName
];
[
appleMenu
addItemWithTitle
:
title
action
:
@selector
(
orderFrontStandardAboutPanel
:
)
keyEquivalent
:
@""
];
[
appleMenu
addItem
:[
NSMenuItem
separatorItem
]];
title
=
[
@"Hide "
stringByAppendingString
:
appName
];
[
appleMenu
addItemWithTitle
:
title
action
:
@selector
(
hide
:
)
keyEquivalent
:
@"h"
];
menuItem
=
(
NSMenuItem
*
)[
appleMenu
addItemWithTitle
:
@"Hide Others"
action
:
@selector
(
hideOtherApplications
:
)
keyEquivalent
:
@"h"
];
[
menuItem
setKeyEquivalentModifierMask
:(
NSAlternateKeyMask
|
NSCommandKeyMask
)];
[
appleMenu
addItemWithTitle
:
@"Show All"
action
:
@selector
(
unhideAllApplications
:
)
keyEquivalent
:
@""
];
[
appleMenu
addItem
:[
NSMenuItem
separatorItem
]];
title
=
[
@"Quit "
stringByAppendingString
:
appName
];
[
appleMenu
addItemWithTitle
:
title
action
:
@selector
(
terminate
:
)
keyEquivalent
:
@"q"
];
/* Put menu into the menubar */
menuItem
=
[[
NSMenuItem
alloc
]
initWithTitle
:
@""
action
:
nil
keyEquivalent
:
@""
];
[
menuItem
setSubmenu
:
appleMenu
];
[[
NSApp
mainMenu
]
addItem
:
menuItem
];
/* Tell the application object that this is now the application menu */
[
NSApp
setAppleMenu
:
appleMenu
];
/* Finally give up our references to the objects */
[
appleMenu
release
];
[
appleM
enuItem
release
];
[
m
enuItem
release
];
}
/* Create a window menu */
void
setupWindowMenu
(
void
)
static
void
setupWindowMenu
(
void
)
{
NSMenu
*
windowMenu
;
NSMenuItem
*
windowMenuItem
;
NSMenuItem
*
menuItem
;
NSMenu
*
windowMenu
;
NSMenuItem
*
windowMenuItem
;
NSMenuItem
*
menuItem
;
windowMenu
=
[[
NSMenu
alloc
]
initWithTitle
:
@"Window"
];
...
...
@@ -152,22 +194,31 @@ void setupWindowMenu(void)
[
windowMenuItem
release
];
}
extern
char
**
environ
;
/* Replacement for NSApplicationMain */
void
CustomApplicationMain
(
argc
,
argv
)
static
void
CustomApplicationMain
(
int
argc
,
char
**
argv
)
{
NSAutoreleasePool
*
pool
=
[[
NSAutoreleasePool
alloc
]
init
];
SDLMain
*
sdlMain
;
/* Ensure the application object is initialised */
[
S
DL
Application
sharedApplication
];
[
N
SApplication
sharedApplication
];
#ifdef SDL_USE_CPS
{
CPSProcessSerNum
PSN
;
/* Tell the dock about us */
if
(
!
CPSGetCurrentProcess
(
&
PSN
))
if
(
!
CPSEnableForegroundOperation
(
&
PSN
,
0x03
,
0x3C
,
0x2C
,
0x1103
))
if
(
!
CPSSetFrontProcess
(
&
PSN
))
[
NSApplication
sharedApplication
];
}
#endif
/* SDL_USE_CPS */
/* Set up the menubar */
[
NSApp
setMainMenu
:[[
NSMenu
alloc
]
init
]];
set
up
Appl
e
Menu
();
setAppl
ication
Menu
();
setupWindowMenu
();
/* Create SDLMain and make it the app delegate */
sdlMain
=
[[
SDLMain
alloc
]
init
];
[
NSApp
setDelegate
:
sdlMain
];
...
...
@@ -181,6 +232,56 @@ void CustomApplicationMain (argc, argv)
#endif
/*
* Catch document open requests...this lets us notice files when the app
* was launched by double-clicking a document, or when a document was
* dragged/dropped on the app's icon. You need to have a
* CFBundleDocumentsType section in your Info.plist to get this message,
* apparently.
*
* Files are added to gArgv, so to the app, they'll look like command line
* arguments. Previously, apps launched from the finder had nothing but
* an argv[0].
*
* This message may be received multiple times to open several docs on launch.
*
* This message is ignored once the app's mainline has been called.
*/
-
(
BOOL
)
application
:(
NSApplication
*
)
theApplication
openFile
:(
NSString
*
)
filename
{
const
char
*
temparg
;
size_t
arglen
;
char
*
arg
;
char
**
newargv
;
if
(
!
gFinderLaunch
)
/* MacOS is passing command line args. */
return
FALSE
;
if
(
gCalledAppMainline
)
/* app has started, ignore this document. */
return
FALSE
;
temparg
=
[
filename
UTF8String
];
arglen
=
SDL_strlen
(
temparg
)
+
1
;
arg
=
(
char
*
)
SDL_malloc
(
arglen
);
if
(
arg
==
NULL
)
return
FALSE
;
newargv
=
(
char
**
)
realloc
(
gArgv
,
sizeof
(
char
*
)
*
(
gArgc
+
2
));
if
(
newargv
==
NULL
)
{
SDL_free
(
arg
);
return
FALSE
;
}
gArgv
=
newargv
;
SDL_strlcpy
(
arg
,
temparg
,
arglen
);
gArgv
[
gArgc
++
]
=
arg
;
gArgv
[
gArgc
]
=
NULL
;
return
TRUE
;
}
extern
char
**
environ
;
/* Called when the internal event loop has just started running */
-
(
void
)
applicationDidFinishLaunching
:
(
NSNotification
*
)
note
{
...
...
@@ -191,10 +292,11 @@ void CustomApplicationMain (argc, argv)
#if SDL_USE_NIB_FILE
/* Set the main menu to contain the real app name instead of "SDL App" */
[
self
fixMenu
:[
NSApp
mainMenu
]
withAppName
:
[[
NSProcessInfo
processInfo
]
process
Name
]
];
[
self
fixMenu
:[
NSApp
mainMenu
]
withAppName
:
getApplication
Name
()
];
#endif
/* Hand off to main application code */
gCalledAppMainline
=
TRUE
;
status
=
SDL_main_env
(
gArgc
,
gArgv
,
environ
);
/* We're done, thank you for playing */
...
...
@@ -215,7 +317,7 @@ void CustomApplicationMain (argc, argv)
NSString
*
result
;
bufferSize
=
selfLen
+
aStringLen
-
aRange
.
length
;
buffer
=
NSAllocateMemoryPages
(
bufferSize
*
sizeof
(
unichar
));
buffer
=
(
unichar
*
)
NSAllocateMemoryPages
(
bufferSize
*
sizeof
(
unichar
));
/* Get first part into buffer */
localRange
.
location
=
0
;
...
...
@@ -252,29 +354,28 @@ void CustomApplicationMain (argc, argv)
/* Main entry point to executable - should *not* be SDL_main! */
int
main
(
int
argc
,
char
**
argv
)
{
/* Copy the arguments into a global variable */
int
i
;
/* This is passed if we are launched by double-clicking */
if
(
argc
>=
2
&&
strncmp
(
argv
[
1
],
"-psn"
,
4
)
==
0
)
{
gArgv
=
(
char
**
)
SDL_malloc
(
sizeof
(
char
*
)
*
2
);
gArgv
[
0
]
=
argv
[
0
];
gArgv
[
1
]
=
NULL
;
gArgc
=
1
;
gFinderLaunch
=
YES
;
gFinderLaunch
=
YES
;
}
else
{
int
i
;
gArgc
=
argc
;
gFinderLaunch
=
NO
;
gArgv
=
(
char
**
)
SDL_malloc
(
sizeof
(
char
*
)
*
(
argc
+
1
));
for
(
i
=
0
;
i
<=
argc
;
i
++
)
gArgv
[
i
]
=
argv
[
i
];
gFinderLaunch
=
NO
;
}
gArgv
=
(
char
**
)
malloc
(
sizeof
(
*
gArgv
)
*
(
gArgc
+
1
));
assert
(
gArgv
!=
NULL
);
for
(
i
=
0
;
i
<
gArgc
;
i
++
)
gArgv
[
i
]
=
argv
[
i
];
gArgv
[
i
]
=
NULL
;
#if SDL_USE_NIB_FILE
[
SDLApplication
poseAsClass
:[
NSApplication
class
]];
NSApplicationMain
(
argc
,
argv
);
#else
CustomApplicationMain
(
argc
,
argv
);
#endif
return
0
;
}
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment