Skip to content
Browse files

Date: Wed, 31 Dec 2003 21:55:30 +0100

From: Max Horn
Subject: SDL: video/quartz cleanup

while doing some experimental changes in the quartz code, I was annoyed
by having to recompile that one big .o file over and over again. So I
decided to finally realize one TODO: properly splitting the code over
multiple files :-).

With two exceptions, I didn't make code changes, only rearranged files
and added new headers. Since there are several new files, making a
patch didn't work out so well, so I decided to just send you all the
new & modified files.

The one source change I made is related to showing/hiding the mouse. I
renamed cursor_visible to cursor_should_be_visible and cursor_hidden to
cursor_visible; I think that makes reading the code easier.
Then I added two new functions: QZ_ShowMouse and QZ_HideMouse. They
help manage cursor_visible (the former 'cursor_hidden'). Finally I
replaced the Carbon ShowCursor/HiderCuror calls by [NSCursor hide] and
[NSCursor unhide]. The API docs are not conclusive, but it might be
that with those the "cursor_visible" (former 'cursor_hidden') hack may
not be necessary anymore; however so far I didn't test this hypothesis,
so I left that in.

The other change was to remove in_foreground and use [NSApp isActive]
instead: Manually keeping track of whether we are in the foreground is
error prone. This should work better in some corner cases.
  • Loading branch information
slouken committed Jan 4, 2004
1 parent 0db9408 commit 4191f6a8099e6f6e1c687ff4654d1586de9b1f2d
@@ -0,0 +1,83 @@
SDL - Simple DirectMedia Layer
Copyright (C) 1997-2003 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.
This library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with this library; if not, write to the Free
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
Sam Lantinga

Obscuring code: maximum number of windows above ours (inclusive)
Note: this doesn't work too well in practice and should be
phased out when we add OpenGL 2D acceleration. It was never
enabled in the first place, so this shouldn't be a problem ;-)
#define kMaxWindows 256

/* Some of the Core Graphics Server API for obscuring code */
#define kCGSWindowLevelTop 2147483632
#define kCGSWindowLevelDockIconDrag 500
#define kCGSWindowLevelDockMenu 101
#define kCGSWindowLevelMenuIgnore 21
#define kCGSWindowLevelMenu 20
#define kCGSWindowLevelDockLabel 12
#define kCGSWindowLevelDockIcon 11
#define kCGSWindowLevelDock 10
#define kCGSWindowLevelUtility 3
#define kCGSWindowLevelNormal 0

For completeness; We never use these window levels, they are always below us
#define kCGSWindowLevelMBarShadow -20
#define kCGSWindowLevelDesktopPicture -2147483647
#define kCGSWindowLevelDesktop -2147483648

typedef CGError CGSError;
typedef long CGSWindowCount;
typedef void * CGSConnectionID;
typedef int CGSWindowID;
typedef CGSWindowID* CGSWindowIDList;
typedef CGWindowLevel CGSWindowLevel;
typedef NSRect CGSRect;

extern CGSConnectionID _CGSDefaultConnection ();

extern CGSError CGSGetOnScreenWindowList (CGSConnectionID cid,
CGSConnectionID owner,
CGSWindowCount listCapacity,
CGSWindowIDList list,
CGSWindowCount *listCount);

extern CGSError CGSGetScreenRectForWindow (CGSConnectionID cid,
CGSWindowID wid,
CGSRect *rect);

extern CGWindowLevel CGSGetWindowLevel (CGSConnectionID cid,
CGSWindowID wid,
CGSWindowLevel *level);

extern CGSError CGSDisplayHWFill (CGDirectDisplayID id, unsigned int x, unsigned int y,
unsigned int w, unsigned int h, unsigned int color);

extern CGSError CGSDisplayCanHWFill (CGDirectDisplayID id);

extern CGSError CGSGetMouseEnabledFlags (CGSConnectionID cid, CGSWindowID wid, int *flags);

int CGSDisplayHWSync (CGDirectDisplayID id);

@@ -6,12 +6,13 @@ libvideo_quartz_la_SOURCES = $(QUARTZ_SRCS)

# The SDL MacOS X Quartz video driver sources
CGS.h \
SDL_QuartzEvents.m \
SDL_QuartzGL.m \
SDL_QuartzKeys.h \
SDL_QuartzVideo.h \

# These files are included by SDL_QuartzVideo.m (is that right??)
noinst_HEADERS = \
SDL_QuartzEvents.m \
SDL_QuartzVideo.m \
SDL_QuartzWindow.h \
SDL_QuartzWindow.m \
SDL_QuartzWM.m \
@@ -1,6 +1,6 @@
SDL - Simple DirectMedia Layer
Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002 Sam Lantinga
Copyright (C) 1997-2003 Sam Lantinga
This library is free software; you can redistribute it and/or
modify it under the terms of the GNU Library General Public
@@ -19,12 +19,15 @@
Sam Lantinga
#include <stdlib.h> // For getenv()

#include "SDL_QuartzVideo.h"

#include <stdlib.h> // For getenv()
#include <IOKit/IOMessage.h> // For wake from sleep detection
#include <IOKit/pwr_mgt/IOPMLib.h> // For wake from sleep detection
#include "SDL_QuartzKeys.h"

static void QZ_InitOSKeymap (_THIS) {
void QZ_InitOSKeymap (_THIS) {
const void *KCHRPtr;
UInt32 state;
UInt32 value;
@@ -283,7 +286,7 @@ static void QZ_DoModifiers (_THIS, unsigned int newMods) {
key.sym = mapping[i];
/* If this was Caps Lock, we need some additional voodoo to make SDL happy */
if (bit == NSAlphaShiftKeyMask)
SDL_PrivateKeyboard (SDL_PRESSED, &key);
SDL_PrivateKeyboard (SDL_PRESSED, &key);
SDL_PrivateKeyboard (SDL_RELEASED, &key);
else if ( newMask &&
@@ -302,13 +305,9 @@ static void QZ_DoModifiers (_THIS, unsigned int newMods) {

static void QZ_DoActivate (_THIS)
in_foreground = YES;

/* Hide the cursor if it was hidden by SDL_ShowCursor() */
if (!cursor_visible && !cursor_hidden) {
HideCursor ();
cursor_hidden = YES;
if (!cursor_should_be_visible)
QZ_HideMouse (this);

/* Regrab input, only if it was previously grabbed */
if ( current_grab_mode == SDL_GRAB_ON ) {
@@ -323,8 +322,6 @@ static void QZ_DoActivate (_THIS)

static void QZ_DoDeactivate (_THIS) {

in_foreground = NO;

/* Get the current cursor location, for restore on activate */
cursor_loc = [ NSEvent mouseLocation ]; /* global coordinates */
if (qz_window)
@@ -335,10 +332,8 @@ static void QZ_DoDeactivate (_THIS) {
CGAssociateMouseAndMouseCursorPosition (1);

/* Show the cursor if it was hidden by SDL_ShowCursor() */
if (!cursor_visible && cursor_hidden) {
ShowCursor ();
cursor_hidden = NO;
if (!cursor_should_be_visible)
QZ_ShowMouse (this);

SDL_PrivateAppActive (0, SDL_APPINPUTFOCUS);
@@ -359,13 +354,13 @@ void QZ_SleepNotificationHandler (void * refcon,
IOAllowPowerChange(power_connection, (long) messageArgument);
case kIOMessageSystemHasPoweredOn:
/* awake */
/* awake */

static void QZ_RegisterForSleepNotifications (_THIS)
void QZ_RegisterForSleepNotifications (_THIS)
CFRunLoopSourceRef rls;
IONotificationPortRef thePortRef;
@@ -400,7 +395,7 @@ static int QZ_OtherMouseButtonToSDL(int button)

static void QZ_PumpEvents (_THIS)
void QZ_PumpEvents (_THIS)
int firstMouseEvent;
CGMouseDelta dx, dy;
@@ -445,7 +440,7 @@ static void QZ_PumpEvents (_THIS)
BOOL isInGameWin;

#define DO_MOUSE_DOWN(button) do { \
if ( in_foreground ) { \
if ( [ NSApp isActive ] ) { \
if ( isInGameWin ) { \
SDL_PrivateMouseButton (SDL_PRESSED, button, 0, 0); \
expect_mouse_up |= 1<<button; \

0 comments on commit 4191f6a

Please sign in to comment.