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