1 // Copyright (C) 2002-2012 Nikolaus Gebhardt
\r
2 // This file is part of the "Irrlicht Engine".
\r
3 // For conditions of distribution and use, see copyright notice in irrlicht.h
\r
5 #include "COSOperator.h"
\r
7 #ifdef _IRR_WINDOWS_API_
\r
12 #ifndef _IRR_ANDROID_PLATFORM_
\r
13 #include <sys/types.h>
\r
14 #ifdef _IRR_OSX_PLATFORM_
\r
15 #include <sys/sysctl.h>
\r
20 #if defined(_IRR_COMPILE_WITH_SDL_DEVICE_)
\r
21 #include <SDL_clipboard.h>
\r
22 #include <SDL_version.h>
\r
23 #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_)
\r
24 #include "CIrrDeviceLinux.h"
\r
26 #if defined(_IRR_COMPILE_WITH_OSX_DEVICE_)
\r
27 #import <Cocoa/Cocoa.h>
\r
30 #include "fast_atof.h"
\r
32 #if defined(_IRR_COMPILE_WITH_SDL_DEVICE_)
\r
33 static bool sdl_supports_primary_selection = [] {
\r
34 #if SDL_VERSION_ATLEAST(2, 25, 0)
\r
35 SDL_version linked_version;
\r
36 SDL_GetVersion(&linked_version);
\r
37 return (linked_version.major == 2 && linked_version.minor >= 25)
\r
38 || linked_version.major > 2;
\r
48 #if defined(_IRR_COMPILE_WITH_X11_DEVICE_)
\r
49 // constructor linux
\r
50 COSOperator::COSOperator(const core::stringc& osVersion, CIrrDeviceLinux* device)
\r
51 : OperatingSystem(osVersion), IrrDeviceLinux(device)
\r
57 COSOperator::COSOperator(const core::stringc& osVersion) : OperatingSystem(osVersion)
\r
60 setDebugName("COSOperator");
\r
65 //! returns the current operating system version as string.
\r
66 const core::stringc& COSOperator::getOperatingSystemVersion() const
\r
68 return OperatingSystem;
\r
72 //! copies text to the clipboard
\r
73 void COSOperator::copyToClipboard(const c8 *text) const
\r
75 if (strlen(text)==0)
\r
78 #if defined(_IRR_COMPILE_WITH_SDL_DEVICE_)
\r
79 SDL_SetClipboardText(text);
\r
81 #elif defined(_IRR_WINDOWS_API_)
\r
82 if (!OpenClipboard(NULL) || text == 0)
\r
87 core::stringw tempbuffer;
\r
88 core::multibyteToWString(tempbuffer, text);
\r
89 const u32 size = (tempbuffer.size() + 1) * sizeof(wchar_t);
\r
94 clipbuffer = GlobalAlloc(GMEM_MOVEABLE, size);
\r
95 buffer = GlobalLock(clipbuffer);
\r
97 memcpy(buffer, tempbuffer.c_str(), size);
\r
99 GlobalUnlock(clipbuffer);
\r
100 SetClipboardData(CF_UNICODETEXT, clipbuffer);
\r
103 #elif defined(_IRR_COMPILE_WITH_OSX_DEVICE_)
\r
104 NSString *str = nil;
\r
105 NSPasteboard *board = nil;
\r
107 if ((text != NULL) && (strlen(text) > 0))
\r
109 str = [NSString stringWithCString:text encoding:NSUTF8StringEncoding];
\r
110 board = [NSPasteboard generalPasteboard];
\r
111 [board declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:NSApp];
\r
112 [board setString:str forType:NSStringPboardType];
\r
115 #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_)
\r
116 if ( IrrDeviceLinux )
\r
117 IrrDeviceLinux->copyToClipboard(text);
\r
122 //! copies text to the primary selection
\r
123 void COSOperator::copyToPrimarySelection(const c8 *text) const
\r
125 if (strlen(text)==0)
\r
128 #if defined(_IRR_COMPILE_WITH_SDL_DEVICE_)
\r
129 #if SDL_VERSION_ATLEAST(2, 25, 0)
\r
130 if (sdl_supports_primary_selection)
\r
131 SDL_SetPrimarySelectionText(text);
\r
134 #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_)
\r
135 if ( IrrDeviceLinux )
\r
136 IrrDeviceLinux->copyToPrimarySelection(text);
\r
141 //! gets text from the clipboard
\r
142 const c8* COSOperator::getTextFromClipboard() const
\r
144 #if defined(_IRR_COMPILE_WITH_SDL_DEVICE_)
\r
145 static char *text = nullptr;
\r
148 text = SDL_GetClipboardText();
\r
151 #elif defined(_IRR_WINDOWS_API_)
\r
152 if (!OpenClipboard(NULL))
\r
155 wchar_t * buffer = 0;
\r
157 HANDLE hData = GetClipboardData( CF_UNICODETEXT );
\r
158 buffer = (wchar_t*) GlobalLock( hData );
\r
160 core::wStringToMultibyte(ClipboardBuf, buffer);
\r
162 GlobalUnlock( hData );
\r
165 return ClipboardBuf.c_str();
\r
167 #elif defined(_IRR_COMPILE_WITH_OSX_DEVICE_)
\r
168 NSString* str = nil;
\r
169 NSPasteboard* board = nil;
\r
172 board = [NSPasteboard generalPasteboard];
\r
173 str = [board stringForType:NSStringPboardType];
\r
176 result = (char*)[str cStringUsingEncoding:NSUTF8StringEncoding];
\r
180 #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_)
\r
181 if ( IrrDeviceLinux )
\r
182 return IrrDeviceLinux->getTextFromClipboard();
\r
192 //! gets text from the primary selection
\r
193 const c8* COSOperator::getTextFromPrimarySelection() const
\r
195 #if defined(_IRR_COMPILE_WITH_SDL_DEVICE_)
\r
196 #if SDL_VERSION_ATLEAST(2, 25, 0)
\r
197 if (sdl_supports_primary_selection) {
\r
198 static char *text = nullptr;
\r
201 text = SDL_GetPrimarySelectionText();
\r
207 #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_)
\r
208 if ( IrrDeviceLinux )
\r
209 return IrrDeviceLinux->getTextFromPrimarySelection();
\r
219 bool COSOperator::getSystemMemory(u32* Total, u32* Avail) const
\r
221 #if defined(_IRR_WINDOWS_API_)
\r
223 MEMORYSTATUSEX MemoryStatusEx;
\r
224 MemoryStatusEx.dwLength = sizeof(MEMORYSTATUSEX);
\r
227 GlobalMemoryStatusEx(&MemoryStatusEx);
\r
230 *Total = (u32)(MemoryStatusEx.ullTotalPhys>>10);
\r
232 *Avail = (u32)(MemoryStatusEx.ullAvailPhys>>10);
\r
235 #elif defined(_IRR_POSIX_API_) && defined(_SC_PHYS_PAGES) && defined(_SC_AVPHYS_PAGES)
\r
236 long ps = sysconf(_SC_PAGESIZE);
\r
237 long pp = sysconf(_SC_PHYS_PAGES);
\r
238 long ap = sysconf(_SC_AVPHYS_PAGES);
\r
240 if (ps == -1 || (Total && pp == -1) || (Avail && ap == -1))
\r
244 *Total = (u32)((pp>>10)*ps);
\r
246 *Avail = (u32)((ap>>10)*ps);
\r
248 #elif defined(_IRR_OSX_PLATFORM_)
\r
250 int64_t physical_memory;
\r
253 // Get the Physical memory size
\r
255 mib[1] = HW_MEMSIZE;
\r
256 length = sizeof(int64_t);
\r
257 sysctl(mib, 2, &physical_memory, &length, NULL, 0);
\r
260 *Total = (u32)(physical_memory>>10);
\r
262 *Avail = (u32)(physical_memory>>10); // we don't know better
\r
265 // TODO: implement for others
\r