Home | History | Annotate | Download | only in gfx
      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