]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/COSOperator.cpp
132232feb5875262e7bd8911fd150c9adec87ea6
[irrlicht.git] / source / Irrlicht / COSOperator.cpp
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
4 \r
5 #include "COSOperator.h"\r
6 \r
7 #ifdef _IRR_WINDOWS_API_\r
8 #include <windows.h>\r
9 #else\r
10 #include <string.h>\r
11 #include <unistd.h>\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
16 #endif\r
17 #endif\r
18 #endif\r
19 \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
25 #endif\r
26 #if defined(_IRR_COMPILE_WITH_OSX_DEVICE_)\r
27 #import <Cocoa/Cocoa.h>\r
28 #endif\r
29 \r
30 #include "fast_atof.h"\r
31 \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
39 #else\r
40         return false;\r
41 #endif\r
42 }();\r
43 #endif\r
44 \r
45 namespace irr\r
46 {\r
47 \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
52 {\r
53 }\r
54 #endif\r
55 \r
56 // constructor\r
57 COSOperator::COSOperator(const core::stringc& osVersion) : OperatingSystem(osVersion)\r
58 {\r
59         #ifdef _DEBUG\r
60         setDebugName("COSOperator");\r
61         #endif\r
62 }\r
63 \r
64 \r
65 //! returns the current operating system version as string.\r
66 const core::stringc& COSOperator::getOperatingSystemVersion() const\r
67 {\r
68         return OperatingSystem;\r
69 }\r
70 \r
71 \r
72 //! copies text to the clipboard\r
73 void COSOperator::copyToClipboard(const c8 *text) const\r
74 {\r
75         if (strlen(text)==0)\r
76                 return;\r
77 \r
78 #if defined(_IRR_COMPILE_WITH_SDL_DEVICE_)\r
79         SDL_SetClipboardText(text);\r
80 \r
81 #elif defined(_IRR_WINDOWS_API_)\r
82         if (!OpenClipboard(NULL) || text == 0)\r
83                 return;\r
84 \r
85         EmptyClipboard();\r
86 \r
87         core::stringw tempbuffer;\r
88         core::multibyteToWString(tempbuffer, text);\r
89         const u32 size = (tempbuffer.size() + 1) * sizeof(wchar_t);\r
90 \r
91         HGLOBAL clipbuffer;\r
92         void * buffer;\r
93 \r
94         clipbuffer = GlobalAlloc(GMEM_MOVEABLE, size);\r
95         buffer = GlobalLock(clipbuffer);\r
96 \r
97         memcpy(buffer, tempbuffer.c_str(), size);\r
98 \r
99         GlobalUnlock(clipbuffer);\r
100         SetClipboardData(CF_UNICODETEXT, clipbuffer);\r
101         CloseClipboard();\r
102 \r
103 #elif defined(_IRR_COMPILE_WITH_OSX_DEVICE_)\r
104     NSString *str = nil;\r
105     NSPasteboard *board = nil;\r
106 \r
107     if ((text != NULL) && (strlen(text) > 0))\r
108     {\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
113     }\r
114 \r
115 #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_)\r
116     if ( IrrDeviceLinux )\r
117         IrrDeviceLinux->copyToClipboard(text);\r
118 #endif\r
119 }\r
120 \r
121 \r
122 //! copies text to the primary selection\r
123 void COSOperator::copyToPrimarySelection(const c8 *text) const\r
124 {\r
125         if (strlen(text)==0)\r
126                 return;\r
127 \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
132 #endif\r
133 \r
134 #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_)\r
135     if ( IrrDeviceLinux )\r
136         IrrDeviceLinux->copyToPrimarySelection(text);\r
137 #endif\r
138 }\r
139 \r
140 \r
141 //! gets text from the clipboard\r
142 const c8* COSOperator::getTextFromClipboard() const\r
143 {\r
144 #if defined(_IRR_COMPILE_WITH_SDL_DEVICE_)\r
145         static char *text = nullptr;\r
146         if (text)\r
147                 SDL_free(text);\r
148         text = SDL_GetClipboardText();\r
149         return text;\r
150 \r
151 #elif defined(_IRR_WINDOWS_API_)\r
152         if (!OpenClipboard(NULL))\r
153                 return 0;\r
154 \r
155         wchar_t * buffer = 0;\r
156 \r
157         HANDLE hData = GetClipboardData( CF_UNICODETEXT );\r
158         buffer = (wchar_t*) GlobalLock( hData );\r
159 \r
160         core::wStringToMultibyte(ClipboardBuf, buffer);\r
161 \r
162         GlobalUnlock( hData );\r
163         CloseClipboard();\r
164 \r
165         return ClipboardBuf.c_str();\r
166 \r
167 #elif defined(_IRR_COMPILE_WITH_OSX_DEVICE_)\r
168     NSString* str = nil;\r
169     NSPasteboard* board = nil;\r
170     char* result = 0;\r
171 \r
172     board = [NSPasteboard generalPasteboard];\r
173     str = [board stringForType:NSStringPboardType];\r
174 \r
175     if (str != nil)\r
176         result = (char*)[str cStringUsingEncoding:NSUTF8StringEncoding];\r
177 \r
178     return (result);\r
179 \r
180 #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_)\r
181     if ( IrrDeviceLinux )\r
182         return IrrDeviceLinux->getTextFromClipboard();\r
183     return 0;\r
184 \r
185 #else\r
186 \r
187         return 0;\r
188 #endif\r
189 }\r
190 \r
191 \r
192 //! gets text from the primary selection\r
193 const c8* COSOperator::getTextFromPrimarySelection() const\r
194 {\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
199                 if (text)\r
200                         SDL_free(text);\r
201                 text = SDL_GetPrimarySelectionText();\r
202                 return text;\r
203         }\r
204 #endif\r
205         return 0;\r
206 \r
207 #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_)\r
208     if ( IrrDeviceLinux )\r
209         return IrrDeviceLinux->getTextFromPrimarySelection();\r
210     return 0;\r
211 \r
212 #else\r
213 \r
214         return 0;\r
215 #endif\r
216 }\r
217 \r
218 \r
219 bool COSOperator::getSystemMemory(u32* Total, u32* Avail) const\r
220 {\r
221 #if defined(_IRR_WINDOWS_API_)\r
222 \r
223         MEMORYSTATUSEX MemoryStatusEx;\r
224         MemoryStatusEx.dwLength = sizeof(MEMORYSTATUSEX);\r
225 \r
226         // cannot fail\r
227         GlobalMemoryStatusEx(&MemoryStatusEx);\r
228 \r
229         if (Total)\r
230                 *Total = (u32)(MemoryStatusEx.ullTotalPhys>>10);\r
231         if (Avail)\r
232                 *Avail = (u32)(MemoryStatusEx.ullAvailPhys>>10);\r
233         return true;\r
234 \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
239 \r
240         if (ps == -1 || (Total && pp == -1) || (Avail && ap == -1))\r
241                 return false;\r
242 \r
243         if (Total)\r
244                 *Total = (u32)((pp>>10)*ps);\r
245         if (Avail)\r
246                 *Avail = (u32)((ap>>10)*ps);\r
247         return true;\r
248 #elif defined(_IRR_OSX_PLATFORM_)\r
249         int mib[2];\r
250         int64_t physical_memory;\r
251         size_t length;\r
252 \r
253         // Get the Physical memory size\r
254         mib[0] = CTL_HW;\r
255         mib[1] = HW_MEMSIZE;\r
256         length = sizeof(int64_t);\r
257         sysctl(mib, 2, &physical_memory, &length, NULL, 0);\r
258 \r
259         if (Total)\r
260                 *Total = (u32)(physical_memory>>10);\r
261         if (Avail)\r
262                 *Avail = (u32)(physical_memory>>10); // we don't know better\r
263         return true;\r
264 #else\r
265         // TODO: implement for others\r
266         return false;\r
267 #endif\r
268 }\r
269 \r
270 \r
271 } // end namespace\r
272 \r