Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(82)

Side by Side Diff: ui/gfx/gtk_native_view_id_manager.h

Issue 231733005: Delete the GTK+ port of Chrome. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Remerge to ToT Created 6 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
(Empty)
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_GTK_NATIVE_VIEW_ID_MANAGER_H_
6 #define UI_GFX_GTK_NATIVE_VIEW_ID_MANAGER_H_
7
8 #include <map>
9
10 #include "base/synchronization/lock.h"
11 #include "ui/gfx/gfx_export.h"
12 #include "ui/gfx/native_widget_types.h"
13
14 template <typename T> struct DefaultSingletonTraits;
15
16 typedef unsigned long XID;
17 struct _GtkPreserveWindow;
18
19 // NativeViewIds are the opaque values which the renderer holds as a reference
20 // to a window.
21 //
22 // We could make NativeViewIds be the X id of the window. However, at the
23 // time when we need to tell the renderer about its NativeViewId, an XID isn't
24 // availible and it goes very much against the grain of the code to make it so.
25 // Also, we worry that GTK might choose to change the underlying X window id
26 // when, say, the widget is hidden or repacked. Finally, if we used XIDs then a
27 // compromised renderer could start asking questions about any X windows on the
28 // system.
29 //
30 // Thus, we have this object. It produces random NativeViewIds from GtkWidget
31 // pointers and observes the various signals from the widget for when an X
32 // window is created, destroyed etc. Thus it provides a thread safe mapping
33 // from NativeViewIds to the current XID for that widget.
34 class GFX_EXPORT GtkNativeViewManager {
35 public:
36 // Returns the singleton instance.
37 static GtkNativeViewManager* GetInstance();
38
39 // Must be called from the UI thread:
40 //
41 // Return a NativeViewId for the given widget and attach to the various
42 // signals emitted by that widget. The NativeViewId is pseudo-randomly
43 // allocated so that a compromised renderer trying to guess values will fail
44 // with high probability. The NativeViewId will not be reused for the
45 // lifetime of the GtkWidget.
46 gfx::NativeViewId GetIdForWidget(gfx::NativeView widget);
47
48 // May be called from any thread:
49 //
50 // xid: (output) the resulting X window ID, or 0
51 // id: a value previously returned from GetIdForWidget
52 // returns: true if |id| is a valid id, false otherwise.
53 //
54 // If the widget referenced by |id| does not current have an X window id,
55 // |*xid| is set to 0.
56 bool GetXIDForId(XID* xid, gfx::NativeViewId id);
57
58 // May be called from the UI thread:
59 //
60 // Same as GetXIDForId except it returns the NativeView (GtkWidget*).
61 bool GetNativeViewForId(gfx::NativeView* xid, gfx::NativeViewId id);
62
63 // Must be called from the UI thread because we may need the associated
64 // widget to create a window.
65 //
66 // Keeping the XID permanent requires a bit of overhead, so it must
67 // be explicitly requested.
68 //
69 // xid: (output) the resulting X window
70 // id: a value previously returned from GetIdForWidget
71 // returns: true if |id| is a valid id, false otherwise.
72 bool GetPermanentXIDForId(XID* xid, gfx::NativeViewId id);
73
74 // Can be called from any thread.
75 // Will return false if the given XID isn't permanent or has already been
76 // released.
77 bool AddRefPermanentXID(XID xid);
78
79 // Must be called from the UI thread because we may need to access a
80 // GtkWidget or destroy a GdkWindow.
81 //
82 // If the widget associated with the XID is still alive, allow the widget
83 // to destroy the associated XID when it wants. Otherwise, destroy the
84 // GdkWindow associated with the XID.
85 void ReleasePermanentXID(XID xid);
86
87 // These are actually private functions, but need to be called from statics.
88 void OnRealize(gfx::NativeView widget);
89 void OnUnrealize(gfx::NativeView widget);
90 void OnDestroy(gfx::NativeView widget);
91
92 private:
93 // This object is a singleton:
94 GtkNativeViewManager();
95 ~GtkNativeViewManager();
96 friend struct DefaultSingletonTraits<GtkNativeViewManager>;
97
98 struct NativeViewInfo {
99 NativeViewInfo() : widget(NULL), x_window_id(0) {
100 }
101 gfx::NativeView widget;
102 XID x_window_id;
103 };
104
105 gfx::NativeViewId GetWidgetId(gfx::NativeView id);
106
107 // protects native_view_to_id_ and id_to_info_
108 base::Lock lock_;
109
110 // If asked for an id for the same widget twice, we want to return the same
111 // id. So this records the current mapping.
112 std::map<gfx::NativeView, gfx::NativeViewId> native_view_to_id_;
113 std::map<gfx::NativeViewId, NativeViewInfo> id_to_info_;
114
115 struct PermanentXIDInfo {
116 PermanentXIDInfo() : widget(NULL), ref_count(0) {
117 }
118 _GtkPreserveWindow* widget;
119 int ref_count;
120 };
121
122 // Used to maintain the reference count for permanent XIDs
123 // (referenced by GetPermanentXIDForId and dereferenced by
124 // ReleasePermanentXID). Only those XIDs with a positive reference count
125 // will be in the table.
126 //
127 // In general, several GTK widgets may share the same X window. We assume
128 // that is not true of the widgets stored in this registry.
129 //
130 // An XID will map to NULL, if there is an outstanding reference but the
131 // widget was destroyed. In this case, the destruction of the X window
132 // is deferred to the dropping of all references.
133 std::map<XID, PermanentXIDInfo> perm_xid_to_info_;
134
135 DISALLOW_COPY_AND_ASSIGN(GtkNativeViewManager);
136 };
137
138 #endif // UI_GFX_GTK_NATIVE_VIEW_ID_MANAGER_H_
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698