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)
46class SkRegion;
47namespace aura {
48class Window;
49}
50namespace ui {
51class Cursor;
52class Event;
53}
54#endif  // defined(USE_AURA)
55
56#if defined(OS_WIN)
57#include <windows.h>  // NOLINT
58typedef struct HFONT__* HFONT;
59struct IAccessible;
60#elif defined(OS_IOS)
61struct CGContext;
62#ifdef __OBJC__
63@class UIEvent;
64@class UIFont;
65@class UIImage;
66@class UIView;
67@class UIWindow;
68@class UITextField;
69#else
70class UIEvent;
71class UIFont;
72class UIImage;
73class UIView;
74class UIWindow;
75class UITextField;
76#endif  // __OBJC__
77#elif defined(OS_MACOSX)
78struct 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
88class NSCursor;
89class NSEvent;
90class NSFont;
91class NSImage;
92struct NSView;
93class NSWindow;
94class NSTextField;
95#endif  // __OBJC__
96#elif defined(OS_POSIX)
97typedef struct _PangoFontDescription PangoFontDescription;
98typedef struct _cairo cairo_t;
99#endif
100
101#if defined(OS_ANDROID)
102struct ANativeWindow;
103namespace ui {
104class WindowAndroid;
105class ViewAndroid;
106}
107#endif
108class SkBitmap;
109
110namespace gfx {
111
112#if defined(USE_AURA)
113typedef ui::Cursor NativeCursor;
114typedef aura::Window* NativeView;
115typedef aura::Window* NativeWindow;
116typedef SkRegion* NativeRegion;
117typedef ui::Event* NativeEvent;
118#elif defined(OS_IOS)
119typedef void* NativeCursor;
120typedef UIView* NativeView;
121typedef UIWindow* NativeWindow;
122typedef UIEvent* NativeEvent;
123#elif defined(OS_MACOSX)
124typedef NSCursor* NativeCursor;
125typedef NSView* NativeView;
126typedef NSWindow* NativeWindow;
127typedef void* NativeRegion;
128typedef NSEvent* NativeEvent;
129#elif defined(OS_ANDROID)
130typedef void* NativeCursor;
131typedef ui::ViewAndroid* NativeView;
132typedef ui::WindowAndroid* NativeWindow;
133typedef void* NativeRegion;
134typedef jobject NativeEvent;
135#endif
136
137#if defined(OS_WIN)
138typedef HFONT NativeFont;
139typedef HWND NativeEditView;
140typedef HDC NativeDrawingContext;
141typedef IAccessible* NativeViewAccessible;
142#elif defined(OS_IOS)
143typedef UIFont* NativeFont;
144typedef UITextField* NativeEditView;
145typedef CGContext* NativeDrawingContext;
146#ifdef __OBJC__
147typedef id NativeViewAccessible;
148#else
149typedef void* NativeViewAccessible;
150#endif
151#elif defined(OS_MACOSX)
152typedef NSFont* NativeFont;
153typedef NSTextField* NativeEditView;
154typedef CGContext* NativeDrawingContext;
155#ifdef __OBJC__
156typedef id NativeViewAccessible;
157#else
158typedef void* NativeViewAccessible;
159#endif
160#elif defined(USE_CAIRO)
161typedef PangoFontDescription* NativeFont;
162typedef void* NativeEditView;
163typedef cairo_t* NativeDrawingContext;
164typedef void* NativeViewAccessible;
165#else
166typedef void* NativeFont;
167typedef void* NativeEditView;
168typedef void* NativeDrawingContext;
169typedef void* NativeViewAccessible;
170#endif
171
172// A constant value to indicate that gfx::NativeCursor refers to no cursor.
173#if defined(USE_AURA)
174const int kNullCursor = 0;
175#else
176const gfx::NativeCursor kNullCursor = static_cast<gfx::NativeCursor>(NULL);
177#endif
178
179#if defined(OS_IOS)
180typedef UIImage NativeImageType;
181#elif defined(OS_MACOSX)
182typedef NSImage NativeImageType;
183#else
184typedef SkBitmap NativeImageType;
185#endif
186typedef NativeImageType* NativeImage;
187
188// Note: for test_shell we're packing a pointer into the NativeViewId. So, if
189// you make it a type which is smaller than a pointer, you have to fix
190// test_shell.
191//
192// See comment at the top of the file for usage.
193typedef intptr_t NativeViewId;
194
195// PluginWindowHandle is an abstraction wrapping "the types of windows
196// used by NPAPI plugins". On Windows it's an HWND, on X it's an X
197// window id.
198#if defined(OS_WIN)
199  typedef HWND PluginWindowHandle;
200  const PluginWindowHandle kNullPluginWindow = NULL;
201#elif defined(USE_X11)
202  typedef unsigned long PluginWindowHandle;
203  const PluginWindowHandle kNullPluginWindow = 0;
204#elif defined(OS_ANDROID)
205  typedef uint64 PluginWindowHandle;
206  const PluginWindowHandle kNullPluginWindow = 0;
207#elif defined(USE_OZONE)
208  typedef intptr_t PluginWindowHandle;
209  const PluginWindowHandle kNullPluginWindow = 0;
210#else
211  // On Mac we don't have windowed plugins. We use a NULL/0 PluginWindowHandle
212  // in shared code to indicate there is no window present.
213  typedef bool PluginWindowHandle;
214  const PluginWindowHandle kNullPluginWindow = 0;
215#endif
216
217enum SurfaceType {
218  EMPTY,
219  NATIVE_DIRECT,
220  NATIVE_TRANSPORT,
221  TEXTURE_TRANSPORT,
222  SURFACE_TYPE_LAST = TEXTURE_TRANSPORT
223};
224
225struct GLSurfaceHandle {
226  GLSurfaceHandle()
227      : handle(kNullPluginWindow),
228        transport_type(EMPTY),
229        parent_client_id(0) {
230  }
231  GLSurfaceHandle(PluginWindowHandle handle_, SurfaceType transport_)
232      : handle(handle_),
233        transport_type(transport_),
234        parent_client_id(0) {
235    DCHECK(!is_null() || handle == kNullPluginWindow);
236    DCHECK(transport_type != TEXTURE_TRANSPORT ||
237           handle == kNullPluginWindow);
238  }
239  bool is_null() const { return transport_type == EMPTY; }
240  bool is_transport() const {
241    return transport_type == NATIVE_TRANSPORT ||
242           transport_type == TEXTURE_TRANSPORT;
243  }
244  PluginWindowHandle handle;
245  SurfaceType transport_type;
246  uint32 parent_client_id;
247};
248
249// AcceleratedWidget provides a surface to compositors to paint pixels.
250#if defined(OS_WIN)
251typedef HWND AcceleratedWidget;
252const AcceleratedWidget kNullAcceleratedWidget = NULL;
253#elif defined(USE_X11)
254typedef unsigned long AcceleratedWidget;
255const AcceleratedWidget kNullAcceleratedWidget = 0;
256#elif defined(OS_IOS)
257typedef UIView* AcceleratedWidget;
258const AcceleratedWidget kNullAcceleratedWidget = 0;
259#elif defined(OS_MACOSX)
260typedef NSView* AcceleratedWidget;
261const AcceleratedWidget kNullAcceleratedWidget = 0;
262#elif defined(OS_ANDROID)
263typedef ANativeWindow* AcceleratedWidget;
264const AcceleratedWidget kNullAcceleratedWidget = 0;
265#elif defined(USE_OZONE)
266typedef intptr_t AcceleratedWidget;
267const AcceleratedWidget kNullAcceleratedWidget = 0;
268#else
269#error unknown platform
270#endif
271
272}  // namespace gfx
273
274#endif  // UI_GFX_NATIVE_WIDGET_TYPES_H_
275