xserver-multidpi/hw/darwin/quartz/quartzCocoa.m
Torrey Lyons 784e4d1cc0 Merge many XDarwin improvements:
- Fix launch of X clients by double clicking in the Finder when there is a
    space in the path (Torrey T. Lyons).
- Interpret scroll wheel mouse events correctly when shift is held down
    (Benjamin Burke).
- Add option to always use Mac command key equivalents (John Harper and
    Torrey T. Lyons).
- Add support for dynamic screen configuration changes in rootless mode
    (John Harper and Torrey T. Lyons).
- Add documentation on generic rootless layer (Torrey T. Lyons).
2004-07-30 19:12:18 +00:00

206 lines
6.0 KiB
Objective-C

/* $XdotOrg: xc/programs/Xserver/hw/darwin/quartz/quartzCocoa.m,v 1.2 2004/04/23 19:15:17 eich Exp $ */
/**************************************************************
*
* Quartz-specific support for the Darwin X Server
* that requires Cocoa and Objective-C.
*
* This file is separate from the parts of Quartz support
* that use X include files to avoid symbol collisions.
*
**************************************************************/
/*
* Copyright (c) 2001-2004 Torrey T. Lyons and Greg Parker.
* All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
* and/or sell copies of the Software, and to permit persons to whom the
* Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE ABOVE LISTED COPYRIGHT HOLDER(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
* OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
* ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*
* Except as contained in this notice, the name(s) of the above copyright
* holders shall not be used in advertising or otherwise to promote the sale,
* use or other dealings in this Software without prior written authorization.
*/
/* $XFree86: xc/programs/Xserver/hw/darwin/quartz/quartzCocoa.m,v 1.5 2004/06/08 22:58:10 torrey Exp $ */
#include "quartzCommon.h"
#define BOOL xBOOL
#include "darwin.h"
#undef BOOL
#include <Cocoa/Cocoa.h>
#import "Preferences.h"
#include "pseudoramiX.h"
extern void FatalError(const char *, ...);
extern char *display;
extern int noPanoramiXExtension;
/*
* QuartzReadPreferences
* Read the user preferences from the Cocoa front end.
*/
void QuartzReadPreferences(void)
{
char *fileString;
darwinFakeButtons = [Preferences fakeButtons];
darwinFakeMouse2Mask = [Preferences button2Mask];
darwinFakeMouse3Mask = [Preferences button3Mask];
darwinMouseAccelChange = [Preferences mouseAccelChange];
quartzUseSysBeep = [Preferences systemBeep];
quartzEnableKeyEquivalents = [Preferences enableKeyEquivalents];
// quartzRootless has already been set
if (quartzRootless) {
// Use PseudoramiX instead of Xinerama
noPanoramiXExtension = TRUE;
noPseudoramiXExtension = ![Preferences xinerama];
quartzUseAGL = [Preferences useAGL];
} else {
noPanoramiXExtension = ![Preferences xinerama];
noPseudoramiXExtension = TRUE;
// Full screen can't use AGL for GLX
quartzUseAGL = FALSE;
}
if ([Preferences useKeymapFile]) {
fileString = (char *) [[Preferences keymapFile] lossyCString];
darwinKeymapFile = (char *) malloc(strlen(fileString)+1);
if (! darwinKeymapFile)
FatalError("malloc failed in QuartzReadPreferences()!\n");
strcpy(darwinKeymapFile, fileString);
}
display = (char *) malloc(8);
if (! display)
FatalError("malloc failed in QuartzReadPreferences()!\n");
snprintf(display, 8, "%i", [Preferences display]);
darwinDesiredDepth = [Preferences depth] - 1;
}
/*
* QuartzWriteCocoaPasteboard
* Write text to the Mac OS X pasteboard.
*/
void QuartzWriteCocoaPasteboard(
char *text)
{
NSPasteboard *pasteboard;
NSArray *pasteboardTypes;
NSString *string;
if (! text) return;
pasteboard = [NSPasteboard generalPasteboard];
if (! pasteboard) return;
string = [NSString stringWithCString:text];
if (! string) return;
pasteboardTypes = [NSArray arrayWithObject:NSStringPboardType];
// nil owner because we don't provide type translations
[pasteboard declareTypes:pasteboardTypes owner:nil];
[pasteboard setString:string forType:NSStringPboardType];
}
/*
* QuartzReadCocoaPasteboard
* Read text from the Mac OS X pasteboard and return it as a heap string.
* The caller must free the string.
*/
char *QuartzReadCocoaPasteboard(void)
{
NSPasteboard *pasteboard;
NSArray *pasteboardTypes;
NSString *existingType;
char *text = NULL;
pasteboardTypes = [NSArray arrayWithObject:NSStringPboardType];
pasteboard = [NSPasteboard generalPasteboard];
if (! pasteboard) return NULL;
existingType = [pasteboard availableTypeFromArray:pasteboardTypes];
if (existingType) {
NSString *string = [pasteboard stringForType:existingType];
char *buffer;
if (! string) return NULL;
buffer = (char *) [string lossyCString];
text = (char *) malloc(strlen(buffer)+1);
if (text)
strcpy(text, buffer);
}
return text;
}
/*
* QuartzFSUseQDCursor
* Return whether the screen should use a QuickDraw cursor.
*/
int QuartzFSUseQDCursor(
int depth) // screen depth
{
switch ([Preferences useQDCursor]) {
case qdCursor_Always:
return TRUE;
case qdCursor_Never:
return FALSE;
case qdCursor_Not8Bit:
if (depth > 8)
return TRUE;
else
return FALSE;
}
return TRUE;
}
/*
* QuartzBlockHandler
* Clean out any autoreleased objects.
*/
void QuartzBlockHandler(
void *blockData,
void *pTimeout,
void *pReadmask)
{
static NSAutoreleasePool *aPool = nil;
[aPool release];
aPool = [[NSAutoreleasePool alloc] init];
}
/*
* QuartzWakeupHandler
*/
void QuartzWakeupHandler(
void *blockData,
int result,
void *pReadmask)
{
// nothing here
}