1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #ifndef UI_GFX_NATIVE_WIDGET_TYPES_H_ 6 #define UI_GFX_NATIVE_WIDGET_TYPES_H_ 7 8 #include "build/build_config.h" 9 10 #if defined(OS_ANDROID) 11 #include <jni.h> 12 #endif 13 14 #include "base/basictypes.h" 15 #include "base/logging.h" 16 #include "ui/gfx/gfx_export.h" 17 18 // This file provides cross platform typedefs for native widget types. 19 // NativeWindow: this is a handle to a native, top-level window 20 // NativeView: this is a handle to a native UI element. It may be the 21 // same type as a NativeWindow on some platforms. 22 // NativeViewId: Often, in our cross process model, we need to pass around a 23 // reference to a "window". This reference will, say, be echoed back from a 24 // renderer to the browser when it wishes to query its size. On Windows we 25 // use an HWND for this. 26 // 27 // As a rule of thumb - if you're in the renderer, you should be dealing 28 // with NativeViewIds. This should remind you that you shouldn't be doing 29 // direct operations on platform widgets from the renderer process. 30 // 31 // If you're in the browser, you're probably dealing with NativeViews, 32 // unless you're in the IPC layer, which will be translating between 33 // NativeViewIds from the renderer and NativeViews. 34 // 35 // NativeEditView: a handle to a native edit-box. The Mac folks wanted this 36 // specific typedef. 37 // 38 // NativeImage: The platform-specific image type used for drawing UI elements 39 // in the browser. 40 // 41 // The name 'View' here meshes with OS X where the UI elements are called 42 // 'views' and with our Chrome UI code where the elements are also called 43 // 'views'. 44 45 #if defined(USE_AURA) 46 class SkRegion; 47 namespace aura { 48 class Window; 49 } 50 namespace ui { 51 class Cursor; 52 class Event; 53 } 54 #endif // defined(USE_AURA) 55 56 #if defined(OS_WIN) 57 #include <windows.h> // NOLINT 58 typedef struct HFONT__* HFONT; 59 struct IAccessible; 60 #elif defined(OS_IOS) 61 struct CGContext; 62 #ifdef __OBJC__ 63 @class UIEvent; 64 @class UIFont; 65 @class UIImage; 66 @class UIView; 67 @class UIWindow; 68 @class UITextField; 69 #else 70 class UIEvent; 71 class UIFont; 72 class UIImage; 73 class UIView; 74 class UIWindow; 75 class UITextField; 76 #endif // __OBJC__ 77 #elif defined(OS_MACOSX) 78 struct CGContext; 79 #ifdef __OBJC__ 80 @class NSCursor; 81 @class NSEvent; 82 @class NSFont; 83 @class NSImage; 84 @class NSView; 85 @class NSWindow; 86 @class NSTextField; 87 #else 88 class NSCursor; 89 class NSEvent; 90 class NSFont; 91 class NSImage; 92 struct NSView; 93 class NSWindow; 94 class NSTextField; 95 #endif // __OBJC__ 96 #elif defined(OS_POSIX) 97 typedef struct _PangoFontDescription PangoFontDescription; 98 typedef struct _cairo cairo_t; 99 #endif 100 101 #if defined(TOOLKIT_GTK) 102 typedef struct _GdkCursor GdkCursor; 103 typedef union _GdkEvent GdkEvent; 104 typedef struct _GdkPixbuf GdkPixbuf; 105 typedef struct _GdkRegion GdkRegion; 106 typedef struct _GtkWidget GtkWidget; 107 typedef struct _GtkWindow GtkWindow; 108 #elif defined(OS_ANDROID) 109 struct ANativeWindow; 110 namespace ui { 111 class WindowAndroid; 112 class ViewAndroid; 113 } 114 #endif 115 class SkBitmap; 116 117 namespace gfx { 118 119 #if defined(USE_AURA) 120 typedef ui::Cursor NativeCursor; 121 typedef aura::Window* NativeView; 122 typedef aura::Window* NativeWindow; 123 typedef SkRegion* NativeRegion; 124 typedef ui::Event* NativeEvent; 125 #elif defined(OS_WIN) 126 typedef HCURSOR NativeCursor; 127 typedef HWND NativeView; 128 typedef HWND NativeWindow; 129 typedef HRGN NativeRegion; 130 typedef MSG NativeEvent; 131 #elif defined(OS_IOS) 132 typedef void* NativeCursor; 133 typedef UIView* NativeView; 134 typedef UIWindow* NativeWindow; 135 typedef UIEvent* NativeEvent; 136 #elif defined(OS_MACOSX) 137 typedef NSCursor* NativeCursor; 138 typedef NSView* NativeView; 139 typedef NSWindow* NativeWindow; 140 typedef NSEvent* NativeEvent; 141 #elif defined(TOOLKIT_GTK) 142 typedef GdkCursor* NativeCursor; 143 typedef GtkWidget* NativeView; 144 typedef GtkWindow* NativeWindow; 145 typedef GdkRegion* NativeRegion; 146 typedef GdkEvent* NativeEvent; 147 #elif defined(OS_ANDROID) 148 typedef void* NativeCursor; 149 typedef ui::ViewAndroid* NativeView; 150 typedef ui::WindowAndroid* NativeWindow; 151 typedef void* NativeRegion; 152 typedef jobject NativeEvent; 153 #endif 154 155 #if defined(OS_WIN) 156 typedef HFONT NativeFont; 157 typedef HWND NativeEditView; 158 typedef HDC NativeDrawingContext; 159 typedef IAccessible* NativeViewAccessible; 160 #elif defined(OS_IOS) 161 typedef UIFont* NativeFont; 162 typedef UITextField* NativeEditView; 163 typedef CGContext* NativeDrawingContext; 164 #elif defined(OS_MACOSX) 165 typedef NSFont* NativeFont; 166 typedef NSTextField* NativeEditView; 167 typedef CGContext* NativeDrawingContext; 168 typedef void* NativeViewAccessible; 169 #elif defined(TOOLKIT_GTK) 170 typedef PangoFontDescription* NativeFont; 171 typedef GtkWidget* NativeEditView; 172 typedef cairo_t* NativeDrawingContext; 173 typedef void* NativeViewAccessible; 174 #elif defined(USE_CAIRO) 175 typedef PangoFontDescription* NativeFont; 176 typedef void* NativeEditView; 177 typedef cairo_t* NativeDrawingContext; 178 typedef void* NativeViewAccessible; 179 #else 180 typedef void* NativeFont; 181 typedef void* NativeEditView; 182 typedef void* NativeDrawingContext; 183 typedef void* NativeViewAccessible; 184 #endif 185 186 // A constant value to indicate that gfx::NativeCursor refers to no cursor. 187 #if defined(USE_AURA) 188 const int kNullCursor = 0; 189 #else 190 const gfx::NativeCursor kNullCursor = static_cast<gfx::NativeCursor>(NULL); 191 #endif 192 193 #if defined(OS_IOS) 194 typedef UIImage NativeImageType; 195 #elif defined(OS_MACOSX) 196 typedef NSImage NativeImageType; 197 #elif defined(TOOLKIT_GTK) 198 typedef GdkPixbuf NativeImageType; 199 #else 200 typedef SkBitmap NativeImageType; 201 #endif 202 typedef NativeImageType* NativeImage; 203 204 // Note: for test_shell we're packing a pointer into the NativeViewId. So, if 205 // you make it a type which is smaller than a pointer, you have to fix 206 // test_shell. 207 // 208 // See comment at the top of the file for usage. 209 typedef intptr_t NativeViewId; 210 211 #if defined(OS_WIN) && !defined(USE_AURA) 212 // Convert a NativeViewId to a NativeView. 213 // 214 // On Windows, we pass an HWND into the renderer. As stated above, the renderer 215 // should not be performing operations on the view. 216 static inline NativeView NativeViewFromId(NativeViewId id) { 217 return reinterpret_cast<NativeView>(id); 218 } 219 #define NativeViewFromIdInBrowser(x) NativeViewFromId(x) 220 #elif defined(OS_POSIX) || defined(USE_AURA) 221 // On Mac, Linux and USE_AURA, a NativeView is a pointer to an object, and is 222 // useless outside the process in which it was created. NativeViewFromId should 223 // only be used inside the appropriate platform ifdef outside of the browser. 224 // (NativeViewFromIdInBrowser can be used everywhere in the browser.) If your 225 // cross-platform design involves a call to NativeViewFromId from outside the 226 // browser it will never work on Mac or Linux and is fundamentally broken. 227 228 // Please do not call this from outside the browser. It won't work; the name 229 // should give you a subtle hint. 230 static inline NativeView NativeViewFromIdInBrowser(NativeViewId id) { 231 return reinterpret_cast<NativeView>(id); 232 } 233 #endif // defined(OS_POSIX) 234 235 // PluginWindowHandle is an abstraction wrapping "the types of windows 236 // used by NPAPI plugins". On Windows it's an HWND, on X it's an X 237 // window id. 238 #if defined(OS_WIN) 239 typedef HWND PluginWindowHandle; 240 const PluginWindowHandle kNullPluginWindow = NULL; 241 #elif defined(USE_X11) 242 typedef unsigned long PluginWindowHandle; 243 const PluginWindowHandle kNullPluginWindow = 0; 244 #elif defined(USE_AURA) && defined(OS_MACOSX) 245 // Mac-Aura uses NSView-backed GLSurface. Regular Mac does not. 246 // TODO(dhollowa): Rationalize these two definitions. http://crbug.com/104551. 247 typedef NSView* PluginWindowHandle; 248 const PluginWindowHandle kNullPluginWindow = 0; 249 #elif defined(OS_ANDROID) 250 typedef uint64 PluginWindowHandle; 251 const PluginWindowHandle kNullPluginWindow = 0; 252 #elif defined(USE_OZONE) 253 typedef intptr_t PluginWindowHandle; 254 const PluginWindowHandle kNullPluginWindow = 0; 255 #else 256 // On OS X we don't have windowed plugins. 257 // We use a NULL/0 PluginWindowHandle in shared code to indicate there 258 // is no window present, so mirror that behavior here. 259 // 260 // The GPU plugin is currently an exception to this rule. As of this 261 // writing it uses some NPAPI infrastructure, and minimally we need 262 // to identify the plugin instance via this window handle. When the 263 // GPU plugin becomes a full-on GPU process, this typedef can be 264 // returned to a bool. For now we use a type large enough to hold a 265 // pointer on 64-bit architectures in case we need this capability. 266 typedef uint64 PluginWindowHandle; 267 const PluginWindowHandle kNullPluginWindow = 0; 268 #endif 269 270 enum SurfaceType { 271 EMPTY, 272 NATIVE_DIRECT, 273 NATIVE_TRANSPORT, 274 TEXTURE_TRANSPORT 275 }; 276 277 struct GLSurfaceHandle { 278 GLSurfaceHandle() 279 : handle(kNullPluginWindow), 280 transport_type(EMPTY), 281 parent_gpu_process_id(0), 282 parent_client_id(0) { 283 } 284 GLSurfaceHandle(PluginWindowHandle handle_, SurfaceType transport_) 285 : handle(handle_), 286 transport_type(transport_), 287 parent_gpu_process_id(0), 288 parent_client_id(0) { 289 DCHECK(!is_null() || handle == kNullPluginWindow); 290 DCHECK(transport_type != TEXTURE_TRANSPORT || 291 handle == kNullPluginWindow); 292 } 293 bool is_null() const { return transport_type == EMPTY; } 294 bool is_transport() const { 295 return transport_type == NATIVE_TRANSPORT || 296 transport_type == TEXTURE_TRANSPORT; 297 } 298 PluginWindowHandle handle; 299 SurfaceType transport_type; 300 int parent_gpu_process_id; 301 uint32 parent_client_id; 302 }; 303 304 // AcceleratedWidget provides a surface to compositors to paint pixels. 305 #if defined(OS_WIN) 306 typedef HWND AcceleratedWidget; 307 const AcceleratedWidget kNullAcceleratedWidget = NULL; 308 #elif defined(USE_X11) 309 typedef unsigned long AcceleratedWidget; 310 const AcceleratedWidget kNullAcceleratedWidget = 0; 311 #elif defined(OS_IOS) 312 typedef UIView* AcceleratedWidget; 313 const AcceleratedWidget kNullAcceleratedWidget = 0; 314 #elif defined(OS_MACOSX) 315 typedef NSView* AcceleratedWidget; 316 const AcceleratedWidget kNullAcceleratedWidget = 0; 317 #elif defined(OS_ANDROID) 318 typedef ANativeWindow* AcceleratedWidget; 319 const AcceleratedWidget kNullAcceleratedWidget = 0; 320 #elif defined(USE_OZONE) 321 typedef intptr_t AcceleratedWidget; 322 const AcceleratedWidget kNullAcceleratedWidget = 0; 323 #else 324 #error unknown platform 325 #endif 326 327 } // namespace gfx 328 329 #endif // UI_GFX_NATIVE_WIDGET_TYPES_H_ 330