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
a168faa5
Commit
a168faa5
authored
18 years ago
by
deuce
Browse files
Options
Downloads
Patches
Plain Diff
Move SDLMain.m too (whoops).
parent
5b5620c0
Branches
Branches containing commit
Tags
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
+280
-0
280 additions, 0 deletions
src/xpdev/SDLMain.m
with
280 additions
and
0 deletions
src/xpdev/SDLMain.m
0 → 100644
+
280
−
0
View file @
a168faa5
/* SDLMain.m - main entry point for our Cocoa-ized SDL app
Initial Version: Darrell Walisser <dwaliss1@purdue.edu>
Non-NIB-Code & other changes: Max Horn <max@quendi.de>
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>
/* Use this flag to determine whether we use SDLMain.nib or not */
#define SDL_USE_NIB_FILE 0
static
int
gArgc
;
static
char
**
gArgv
;
static
BOOL
gFinderLaunch
;
#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
SDLApplication
:
NSApplication
@end
@implementation
SDLApplication
/* Invoked from the Quit menu item */
-
(
void
)
terminate
:(
id
)
sender
{
/* Post a SDL_QUIT event */
SDL_Event
event
;
event
.
type
=
SDL_QUIT
;
SDL_PushEvent
(
&
event
);
}
@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 */
}
}
#if SDL_USE_NIB_FILE
/* Fix menu to contain the real app name instead of "SDL App" */
-
(
void
)
fixMenu
:(
NSMenu
*
)
aMenu
withAppName
:(
NSString
*
)
appName
{
NSRange
aRange
;
NSEnumerator
*
enumerator
;
NSMenuItem
*
menuItem
;
aRange
=
[[
aMenu
title
]
rangeOfString
:
@"SDL App"
];
if
(
aRange
.
length
!=
0
)
[
aMenu
setTitle
:
[[
aMenu
title
]
stringByReplacingRange
:
aRange
with
:
appName
]];
enumerator
=
[[
aMenu
itemArray
]
objectEnumerator
];
while
((
menuItem
=
[
enumerator
nextObject
]))
{
aRange
=
[[
menuItem
title
]
rangeOfString
:
@"SDL App"
];
if
(
aRange
.
length
!=
0
)
[
menuItem
setTitle
:
[[
menuItem
title
]
stringByReplacingRange
:
aRange
with
:
appName
]];
if
([
menuItem
hasSubmenu
])
[
self
fixMenu
:[
menuItem
submenu
]
withAppName
:
appName
];
}
[
aMenu
sizeToFit
];
}
#else
void
setupAppleMenu
(
void
)
{
/* warning: this code is very odd */
NSAppleMenuController
*
appleMenuController
;
NSMenu
*
appleMenu
;
NSMenuItem
*
appleMenuItem
;
appleMenuController
=
[[
NSAppleMenuController
alloc
]
init
];
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
];
[
appleMenu
release
];
[
appleMenuItem
release
];
}
/* Create a window menu */
void
setupWindowMenu
(
void
)
{
NSMenu
*
windowMenu
;
NSMenuItem
*
windowMenuItem
;
NSMenuItem
*
menuItem
;
windowMenu
=
[[
NSMenu
alloc
]
initWithTitle
:
@"Window"
];
/* "Minimize" item */
menuItem
=
[[
NSMenuItem
alloc
]
initWithTitle
:
@"Minimize"
action
:
@selector
(
performMiniaturize
:
)
keyEquivalent
:
@"m"
];
[
windowMenu
addItem
:
menuItem
];
[
menuItem
release
];
/* Put menu into the menubar */
windowMenuItem
=
[[
NSMenuItem
alloc
]
initWithTitle
:
@"Window"
action
:
nil
keyEquivalent
:
@""
];
[
windowMenuItem
setSubmenu
:
windowMenu
];
[[
NSApp
mainMenu
]
addItem
:
windowMenuItem
];
/* Tell the application object that this is now the window menu */
[
NSApp
setWindowsMenu
:
windowMenu
];
/* Finally give up our references to the objects */
[
windowMenu
release
];
[
windowMenuItem
release
];
}
extern
char
**
environ
;
/* Replacement for NSApplicationMain */
void
CustomApplicationMain
(
argc
,
argv
)
{
NSAutoreleasePool
*
pool
=
[[
NSAutoreleasePool
alloc
]
init
];
SDLMain
*
sdlMain
;
/* Ensure the application object is initialised */
[
SDLApplication
sharedApplication
];
/* Set up the menubar */
[
NSApp
setMainMenu
:[[
NSMenu
alloc
]
init
]];
setupAppleMenu
();
setupWindowMenu
();
/* Create SDLMain and make it the app delegate */
sdlMain
=
[[
SDLMain
alloc
]
init
];
[
NSApp
setDelegate
:
sdlMain
];
/* Start the main event loop */
[
NSApp
run
];
[
sdlMain
release
];
[
pool
release
];
}
#endif
/* Called when the internal event loop has just started running */
-
(
void
)
applicationDidFinishLaunching
:
(
NSNotification
*
)
note
{
int
status
;
/* Set the working directory to the .app's parent directory */
[
self
setupWorkingDirectory
:
gFinderLaunch
];
#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
]
processName
]];
#endif
/* Hand off to main application code */
status
=
SDL_main_env
(
gArgc
,
gArgv
,
environ
);
/* We're done, thank you for playing */
exit
(
status
);
}
@end
@implementation
NSString
(
ReplaceSubString
)
-
(
NSString
*
)
stringByReplacingRange
:(
NSRange
)
aRange
with
:(
NSString
*
)
aString
{
unsigned
int
bufferSize
;
unsigned
int
selfLen
=
[
self
length
];
unsigned
int
aStringLen
=
[
aString
length
];
unichar
*
buffer
;
NSRange
localRange
;
NSString
*
result
;
bufferSize
=
selfLen
+
aStringLen
-
aRange
.
length
;
buffer
=
NSAllocateMemoryPages
(
bufferSize
*
sizeof
(
unichar
));
/* Get first part into buffer */
localRange
.
location
=
0
;
localRange
.
length
=
aRange
.
location
;
[
self
getCharacters
:
buffer
range
:
localRange
];
/* Get middle part into buffer */
localRange
.
location
=
0
;
localRange
.
length
=
aStringLen
;
[
aString
getCharacters
:(
buffer
+
aRange
.
location
)
range
:
localRange
];
/* Get last part into buffer */
localRange
.
location
=
aRange
.
location
+
aRange
.
length
;
localRange
.
length
=
selfLen
-
localRange
.
location
;
[
self
getCharacters
:(
buffer
+
aRange
.
location
+
aStringLen
)
range
:
localRange
];
/* Build output string */
result
=
[
NSString
stringWithCharacters
:
buffer
length
:
bufferSize
];
NSDeallocateMemoryPages
(
buffer
,
bufferSize
);
return
result
;
}
@end
#ifdef main
# undef main
#endif
/* 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
)
{
gArgc
=
1
;
gFinderLaunch
=
YES
;
}
else
{
gArgc
=
argc
;
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