]> git.lizzy.rs Git - irrlicht.git/blob - source/Irrlicht/COSOperator.cpp
SDL: Support clipboard
[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 #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_)\r
23 #include "CIrrDeviceLinux.h"\r
24 #endif\r
25 #if defined(_IRR_COMPILE_WITH_OSX_DEVICE_)\r
26 #import <Cocoa/Cocoa.h>\r
27 #endif\r
28 \r
29 #include "fast_atof.h"\r
30 \r
31 namespace irr\r
32 {\r
33 \r
34 #if defined(_IRR_COMPILE_WITH_X11_DEVICE_)\r
35 // constructor  linux\r
36         COSOperator::COSOperator(const core::stringc& osVersion, CIrrDeviceLinux* device)\r
37 : OperatingSystem(osVersion), IrrDeviceLinux(device)\r
38 {\r
39 }\r
40 #endif\r
41 \r
42 // constructor\r
43 COSOperator::COSOperator(const core::stringc& osVersion) : OperatingSystem(osVersion)\r
44 {\r
45         #ifdef _DEBUG\r
46         setDebugName("COSOperator");\r
47         #endif\r
48 }\r
49 \r
50 \r
51 //! returns the current operating system version as string.\r
52 const core::stringc& COSOperator::getOperatingSystemVersion() const\r
53 {\r
54         return OperatingSystem;\r
55 }\r
56 \r
57 \r
58 //! copies text to the clipboard\r
59 void COSOperator::copyToClipboard(const c8 *text) const\r
60 {\r
61         if (strlen(text)==0)\r
62                 return;\r
63 \r
64 #if defined(_IRR_COMPILE_WITH_SDL_DEVICE_)\r
65         SDL_SetClipboardText(text);\r
66 \r
67 #elif defined(_IRR_WINDOWS_API_)\r
68         if (!OpenClipboard(NULL) || text == 0)\r
69                 return;\r
70 \r
71         EmptyClipboard();\r
72 \r
73         core::stringw tempbuffer;\r
74         core::multibyteToWString(tempbuffer, text);\r
75         const u32 size = (tempbuffer.size() + 1) * sizeof(wchar_t);\r
76 \r
77         HGLOBAL clipbuffer;\r
78         void * buffer;\r
79 \r
80         clipbuffer = GlobalAlloc(GMEM_MOVEABLE, size);\r
81         buffer = GlobalLock(clipbuffer);\r
82 \r
83         memcpy(buffer, tempbuffer.c_str(), size);\r
84 \r
85         GlobalUnlock(clipbuffer);\r
86         SetClipboardData(CF_UNICODETEXT, clipbuffer);\r
87         CloseClipboard();\r
88 \r
89 #elif defined(_IRR_COMPILE_WITH_OSX_DEVICE_)\r
90     NSString *str = nil;\r
91     NSPasteboard *board = nil;\r
92 \r
93     if ((text != NULL) && (strlen(text) > 0))\r
94     {\r
95         str = [NSString stringWithCString:text encoding:NSUTF8StringEncoding];\r
96         board = [NSPasteboard generalPasteboard];\r
97         [board declareTypes:[NSArray arrayWithObject:NSStringPboardType] owner:NSApp];\r
98         [board setString:str forType:NSStringPboardType];\r
99     }\r
100 \r
101 #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_)\r
102     if ( IrrDeviceLinux )\r
103         IrrDeviceLinux->copyToClipboard(text);\r
104 #endif\r
105 }\r
106 \r
107 \r
108 //! copies text to the primary selection\r
109 void COSOperator::copyToPrimarySelection(const c8 *text) const\r
110 {\r
111         if (strlen(text)==0)\r
112                 return;\r
113 \r
114 #if defined(_IRR_COMPILE_WITH_X11_DEVICE_)\r
115     if ( IrrDeviceLinux )\r
116         IrrDeviceLinux->copyToPrimarySelection(text);\r
117 #endif\r
118 }\r
119 \r
120 \r
121 //! gets text from the clipboard\r
122 const c8* COSOperator::getTextFromClipboard() const\r
123 {\r
124 #if defined(_IRR_COMPILE_WITH_SDL_DEVICE_)\r
125         static char *text = nullptr;\r
126         if (text)\r
127                 SDL_free(text);\r
128         text = SDL_GetClipboardText();\r
129         return text;\r
130 \r
131 #elif defined(_IRR_WINDOWS_API_)\r
132         if (!OpenClipboard(NULL))\r
133                 return 0;\r
134 \r
135         wchar_t * buffer = 0;\r
136 \r
137         HANDLE hData = GetClipboardData( CF_UNICODETEXT );\r
138         buffer = (wchar_t*) GlobalLock( hData );\r
139 \r
140         core::wStringToMultibyte(ClipboardBuf, buffer);\r
141 \r
142         GlobalUnlock( hData );\r
143         CloseClipboard();\r
144 \r
145         return ClipboardBuf.c_str();\r
146 \r
147 #elif defined(_IRR_COMPILE_WITH_OSX_DEVICE_)\r
148     NSString* str = nil;\r
149     NSPasteboard* board = nil;\r
150     char* result = 0;\r
151 \r
152     board = [NSPasteboard generalPasteboard];\r
153     str = [board stringForType:NSStringPboardType];\r
154 \r
155     if (str != nil)\r
156         result = (char*)[str cStringUsingEncoding:NSUTF8StringEncoding];\r
157 \r
158     return (result);\r
159 \r
160 #elif defined(_IRR_COMPILE_WITH_X11_DEVICE_)\r
161     if ( IrrDeviceLinux )\r
162         return IrrDeviceLinux->getTextFromClipboard();\r
163     return 0;\r
164 \r
165 #else\r
166 \r
167         return 0;\r
168 #endif\r
169 }\r
170 \r
171 \r
172 //! gets text from the primary selection\r
173 const c8* COSOperator::getTextFromPrimarySelection() const\r
174 {\r
175 #if defined(_IRR_COMPILE_WITH_X11_DEVICE_)\r
176     if ( IrrDeviceLinux )\r
177         return IrrDeviceLinux->getTextFromPrimarySelection();\r
178     return 0;\r
179 \r
180 #else\r
181 \r
182         return 0;\r
183 #endif\r
184 }\r
185 \r
186 \r
187 bool COSOperator::getSystemMemory(u32* Total, u32* Avail) const\r
188 {\r
189 #if defined(_IRR_WINDOWS_API_)\r
190 \r
191         MEMORYSTATUSEX MemoryStatusEx;\r
192         MemoryStatusEx.dwLength = sizeof(MEMORYSTATUSEX);\r
193 \r
194         // cannot fail\r
195         GlobalMemoryStatusEx(&MemoryStatusEx);\r
196 \r
197         if (Total)\r
198                 *Total = (u32)(MemoryStatusEx.ullTotalPhys>>10);\r
199         if (Avail)\r
200                 *Avail = (u32)(MemoryStatusEx.ullAvailPhys>>10);\r
201         return true;\r
202 \r
203 #elif defined(_IRR_POSIX_API_) && defined(_SC_PHYS_PAGES) && defined(_SC_AVPHYS_PAGES)\r
204         long ps = sysconf(_SC_PAGESIZE);\r
205         long pp = sysconf(_SC_PHYS_PAGES);\r
206         long ap = sysconf(_SC_AVPHYS_PAGES);\r
207 \r
208         if (ps == -1 || (Total && pp == -1) || (Avail && ap == -1))\r
209                 return false;\r
210 \r
211         if (Total)\r
212                 *Total = (u32)((pp>>10)*ps);\r
213         if (Avail)\r
214                 *Avail = (u32)((ap>>10)*ps);\r
215         return true;\r
216 #elif defined(_IRR_OSX_PLATFORM_)\r
217         int mib[2];\r
218         int64_t physical_memory;\r
219         size_t length;\r
220 \r
221         // Get the Physical memory size\r
222         mib[0] = CTL_HW;\r
223         mib[1] = HW_MEMSIZE;\r
224         length = sizeof(int64_t);\r
225         sysctl(mib, 2, &physical_memory, &length, NULL, 0);\r
226 \r
227         if (Total)\r
228                 *Total = (u32)(physical_memory>>10);\r
229         if (Avail)\r
230                 *Avail = (u32)(physical_memory>>10); // we don't know better\r
231         return true;\r
232 #else\r
233         // TODO: implement for others\r
234         return false;\r
235 #endif\r
236 }\r
237 \r
238 \r
239 } // end namespace\r
240 \r