diff options
author | Pixel <pixel@nobis-crew.org> | 2010-06-15 00:59:57 -0700 |
---|---|---|
committer | Pixel <pixel@nobis-crew.org> | 2010-06-15 00:59:57 -0700 |
commit | eed0eb6a476d54ce19aeff137984aa981d9e3976 (patch) | |
tree | 807891636efd2f87dcbd261e971216269973ae07 /iup/src/gtk/iupmac_info.c | |
parent | ccc8261e4d48de89da4ddfe7b55e378ae0cd6f47 (diff) |
Upgrading to iup 3.1
Diffstat (limited to 'iup/src/gtk/iupmac_info.c')
-rw-r--r-- | iup/src/gtk/iupmac_info.c | 358 |
1 files changed, 358 insertions, 0 deletions
diff --git a/iup/src/gtk/iupmac_info.c b/iup/src/gtk/iupmac_info.c new file mode 100644 index 0000000..a040bad --- /dev/null +++ b/iup/src/gtk/iupmac_info.c @@ -0,0 +1,358 @@ +/** \file + * \brief MAC OS System Information + * + * See Copyright Notice in "iup.h" + */ + +#include <stdio.h> +#include <stdlib.h> +#include <string.h> + +/* This module should depend only on IUP core headers and + Mac OS Carbon system headers. */ + +#include <Carbon/Carbon.h> + +#include <sys/utsname.h> +#include <unistd.h> +#include <limits.h> +#include <errno.h> +#include <sys/stat.h> + +#include <gtk/gtk.h> + +#include "iup.h" + +#include "iup_str.h" +#include "iup_drv.h" +#include "iup_drvinfo.h" + +#define IUP_MAC_ERROR -1 + +/****************************************** + ** These are NOT working as expected. So we kept the posix versions. *** + +static void iupMacStrToUniChar(const char* buffer, UniChar* outBuf, long length, long* outLen) +{ + CFStringRef stringRef = CFStringCreateWithCString(NULL, buffer, kCFStringEncodingUTF8); + + CFStringGetCharacters (stringRef, CFRangeMake(0, CFStringGetLength(stringRef)), outBuf); + *outLen = (long) CFStringGetLength (stringRef); + + CFRelease(stringRef); +} + +int iupdrvMakeDirectory(const char* name) +{ + FSRef refParent, refNew; + UniChar nameDir; + long lenDir; + + if(FSFindFolder(kUserDomain, kCurrentUserFolderType, kDontCreateFolder, &refParent) != noErr) + return 0; + + iupMacStrToUniChar(name, &nameDir, strlen(name), &lenDir); + + if(FSMakeFSRefUnicode(&refParent, lenDir, &nameDir, kTextEncodingUnknown, &refNew) != fnfErr) // fnfErr => Directory does not exists + return 0; + + if(FSCreateDirectoryUnicode(&refParent, lenDir, &nameDir, kFSCatInfoNone, NULL, &refNew, NULL, NULL) != noErr) + return 0; + + return 1; +} + +char* iupdrvGetCurrentDirectory(void) +{ + FSRef refDir; + FSVolumeRefNum vRefNum; + long dirID; + size_t size = 256; + char *buffer = (char *)malloc(size); + + if(HGetVol(NULL, &vRefNum, &dirID) != noErr) // Deprecated in Mac OS X v10.4 + return 0; + + if(FSMakeFSRef(vRefNum, dirID, NULL, &refDir) != noErr) // Deprecated in Mac OS X v10.5 + return 0; + + FSRefMakePath (&refDir, (UInt8*)buffer, size); + + return buffer; +} + +int iupdrvSetCurrentDirectory(const char* dir) +{ + FSRef refDir; + FSCatalogInfo catalogInfo; + int isDirectory; + + if(FSPathMakeRef((const UInt8*)dir, &refDir, &isDirectory) != noErr) + return 0; + + if (!isDirectory) + return 0; + + if(FSGetCatalogInfo(refDir, kFSCatInfoVolume + kFSCatInfoNodeID, &catalogInfo, NULL, NULL, NULL) != noErr) + return 0; + + if(HSetVol(NULL, catalogInfo.volume, catalogInfo.nodeID) != noErr) // Deprecated in Mac OS X v10.4 + return 0; + + return 1; +} + +char* iupdrvGetCurrentDirectory(void) +{ + char* path = iupStrGetMemory(256); + CFBundleRef mainBundle = CFBundleGetMainBundle(); + CFURLRef curDir = CFBundleCopyBundleURL(mainBundle); + CFStringRef cfStringRef = CFURLCopyFileSystemPath(curDir, kCFURLPOSIXPathStyle); + + CFStringGetCString(cfStringRef, path, 256, kCFStringEncodingUTF8); + + return path; +} +*********************************************/ + +int iupdrvMakeDirectory(const char* name) +{ + mode_t oldmask = umask((mode_t)0); + int fail = mkdir(name, S_IRUSR | S_IWUSR | S_IXUSR | S_IRGRP | + S_IWGRP | S_IXGRP | S_IROTH | S_IXOTH); + umask (oldmask); + if (fail) + return 0; + return 1; +} + +static int iMacIsFolder(const char* name) +{ + FSRef refName; + Boolean isFolder; + + if(FSPathMakeRef((const UInt8*)name, &refName, &isFolder) != noErr) + return IUP_MAC_ERROR; + + return isFolder; +} + +int iupdrvIsFile(const char* name) +{ + int isDir = iMacIsFolder(name); + + if((isDir != IUP_MAC_ERROR) && !isDir) + return 1; + + return 0; +} + +int iupdrvIsDirectory(const char* name) +{ + int isDir = iMacIsFolder(name); + + if((isDir != IUP_MAC_ERROR) && isDir) + return 1; + + return 0; +} + +char* iupdrvGetCurrentDirectory(void) +{ + size_t size = 256; + char *buffer = (char *)malloc(size); + + for (;;) + { + if (getcwd(buffer, size) != NULL) + return buffer; + + if (errno != ERANGE) + { + free(buffer); + return NULL; + } + + size += size; + buffer = (char *)realloc(buffer, size); + } + + return NULL; +} + +int iupdrvSetCurrentDirectory(const char* dir) +{ + return chdir(dir) == 0? 1: 0; +} + +int iupdrvGetWindowDecor(void* wnd, int *border, int *caption) +{ + Rect rect; + CGRect cg; + int minX, minY; + + CGDirectDisplayID mainDisplayID = CGMainDisplayID(); + GDHandle hGDev; + DMGetGDeviceByDisplayID((DisplayIDType)mainDisplayID, &hGDev, false); + + GetAvailableWindowPositioningBounds(hGDev, &rect); + + cg = CGRectMake(rect.left, rect.top, rect.right - rect.left, rect.bottom - rect.top); + + minX = (int)CGRectGetMinX(cg); + minY = (int)CGRectGetMinY(cg); + + if (minX >= 0 && minY >= 0 && (minY >= minX)) + { + *border = minX; + *caption = minY - *border; + + return 1; + } + + *border = 0; + *caption = 0; + + return 0; +} + +void iupdrvGetScreenSize(int *width, int *height) +{ + int w_size = CGDisplayPixelsWide(kCGDirectMainDisplay); + int h_size = CGDisplayPixelsHigh(kCGDirectMainDisplay); + + *width = w_size; + *height = h_size; +} + +void iupdrvGetFullSize(int *width, int *height) +{ + CGRect rect; + + rect = CGDisplayBounds(kCGDirectMainDisplay); + + *width = (int)CGRectGetWidth(rect); + *height = (int)CGRectGetHeight(rect); +} + +int iupdrvGetScreenDepth(void) +{ + return CGDisplayBitsPerPixel(kCGDirectMainDisplay); /* Deprecated in Mac OS X v10.6 */ +} + +void iupdrvGetCursorPos(int *x, int *y) +{ + Point pnt; + CGPoint point; + + GetMouse(&pnt); + point = CGPointMake(pnt.h, pnt.v); + + *x = (int)point.x; + *y = (int)point.y; +} + +void iupdrvGetKeyState(char* key) +{ + if (GetCurrentEventKeyModifiers() & shiftKey) + key[0] = 'S'; + else + key[0] = ' '; + + if (GetCurrentEventKeyModifiers() & controlKey) + key[1] = 'C'; + else + key[1] = ' '; + + if (GetCurrentEventKeyModifiers() & optionKey) + key[2] = 'A'; + else + key[2] = ' '; + + if (GetCurrentEventKeyModifiers() & cmdKey) + key[3] = 'Y'; + else + key[3] = ' '; + + key[4] = 0; +} + +char *iupdrvGetSystemName(void) +{ + long systemVersion; + + if (Gestalt(gestaltSystemVersion, &systemVersion) == noErr) + { + if (systemVersion >= 0x1060) + return "Snow Leopard"; + else if (systemVersion >= 0x1050) + return "Leopard"; + else if (systemVersion >= 0x1040) + return "Tiger"; + else if (systemVersion >= 0x1030) + return "Panther"; + else if (systemVersion >= 0x1020) + return "Jaguar"; + else if (systemVersion >= 0x1010) + return "Puma"; + else if (systemVersion >= 0x1010) + return "Cheetah"; + } + + return "MacOS"; +} + +char *iupdrvGetSystemVersion(void) +{ + char* str = iupStrGetMemory(70); + long systemVersion, versionMajor, versionMinor, versionBugFix, systemArchitecture; + + if (Gestalt(gestaltSystemVersion, &systemVersion) != noErr) + { + printf("Unable to obtain system version\n"); + return NULL; + } + + if (systemVersion < 0x1040) + { + /* Major, Minor, Bug fix */ + sprintf(str, "%ld.%ld.%ld", ((systemVersion & 0xF000) >> 12) * 10 + ((systemVersion & 0x0F00) >> 8), + ((systemVersion & 0x00F0) >> 4), (systemVersion & 0x000F)); + } + else /* MAC_OS_X_VERSION_10_4 or later */ + { + Gestalt(gestaltSystemVersionMajor, &versionMajor); + Gestalt(gestaltSystemVersionMinor, &versionMinor); + Gestalt(gestaltSystemVersionBugFix, &versionBugFix); + + sprintf(str, "%ld.%ld.%ld", versionMajor, versionMinor, versionBugFix); + } + + if(Gestalt(gestaltSysArchitecture, &systemArchitecture) == noErr) + { + if (systemArchitecture == gestalt68k) + sprintf(str, "%s %s", str, "(Motorola 68k)"); + else if (systemArchitecture == gestaltPowerPC) + sprintf(str, "%s %s", str, "(Power PC)"); + else /* gestaltIntel */ + sprintf(str, "%s %s", str, "(Intel)"); + } + + return str; +} + +char *iupdrvGetComputerName(void) +{ + char* str = iupStrGetMemory(50); + CFStringRef computerName = CSCopyMachineName(); + CFStringGetCString(computerName, str, 50, kCFStringEncodingUTF8); + return str; +} + +char *iupdrvGetUserName(void) +{ + char* str = iupStrGetMemory(50); + CFStringRef userName = CSCopyUserName(TRUE); /* TRUE = login name FALSE = user name */ + CFStringGetCString(userName, str, 50, kCFStringEncodingUTF8); + return str; +} |