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

Side by Side Diff: chrome/browser/ui/libgtkui/gtk_util.cc

Issue 2609943005: Gtk3: Add support for Gtk3.20 themes (Closed)
Patch Set: Created 3 years, 11 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
« no previous file with comments | « chrome/browser/ui/libgtkui/gtk_ui.cc ('k') | chrome/browser/ui/libgtkui/native_theme_gtk3.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/ui/libgtkui/gtk_util.h" 5 #include "chrome/browser/ui/libgtkui/gtk_util.h"
6 6
7 #include <dlfcn.h>
7 #include <gdk/gdk.h> 8 #include <gdk/gdk.h>
8 #include <gdk/gdkx.h> 9 #include <gdk/gdkx.h>
9 #include <gtk/gtk.h> 10 #include <gtk/gtk.h>
10 #include <stddef.h> 11 #include <stddef.h>
11 12
12 #include <memory> 13 #include <memory>
13 14
14 #include "base/command_line.h" 15 #include "base/command_line.h"
15 #include "base/debug/leak_annotations.h" 16 #include "base/debug/leak_annotations.h"
16 #include "base/environment.h" 17 #include "base/environment.h"
(...skipping 28 matching lines...) Expand all
45 { 46 {
46 // http://crbug.com/423873 47 // http://crbug.com/423873
47 ANNOTATE_SCOPED_MEMORY_LEAK; 48 ANNOTATE_SCOPED_MEMORY_LEAK;
48 init_func(&argc, &argv_pointer); 49 init_func(&argc, &argv_pointer);
49 } 50 }
50 for (size_t i = 0; i < args.size(); ++i) { 51 for (size_t i = 0; i < args.size(); ++i) {
51 free(argv[i]); 52 free(argv[i]);
52 } 53 }
53 } 54 }
54 55
56 #if GTK_MAJOR_VERSION == 3
57 void* GetGtk3SharedLibrary() {
58 static void* gtk3lib = dlopen("libgtk-3.so.0", RTLD_LAZY);
59 DCHECK(gtk3lib);
60 return gtk3lib;
61 }
62 #endif
63
55 } // namespace 64 } // namespace
56 65
57 namespace libgtkui { 66 namespace libgtkui {
58 67
59 // Theme colors returned by GetSystemColor(). 68 // Theme colors returned by GetSystemColor().
60 const SkColor kInvalidColorIdColor = SkColorSetRGB(255, 0, 128); 69 const SkColor kInvalidColorIdColor = SkColorSetRGB(255, 0, 128);
61 const SkColor kURLTextColor = SkColorSetRGB(0x0b, 0x80, 0x43); 70 const SkColor kURLTextColor = SkColorSetRGB(0x0b, 0x80, 0x43);
62 71
63 SkColor NormalURLColor(SkColor foreground) { 72 SkColor NormalURLColor(SkColor foreground) {
64 color_utils::HSL fg_hsl, hue_hsl; 73 color_utils::HSL fg_hsl, hue_hsl;
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 } 201 }
193 202
194 #if GTK_MAJOR_VERSION > 2 203 #if GTK_MAJOR_VERSION > 2
195 ScopedStyleContext AppendNode(GtkStyleContext* context, 204 ScopedStyleContext AppendNode(GtkStyleContext* context,
196 const std::string& css_node) { 205 const std::string& css_node) {
197 GtkWidgetPath* path = 206 GtkWidgetPath* path =
198 context ? gtk_widget_path_copy(gtk_style_context_get_path(context)) 207 context ? gtk_widget_path_copy(gtk_style_context_get_path(context))
199 : gtk_widget_path_new(); 208 : gtk_widget_path_new();
200 209
201 enum { 210 enum {
202 // TODO(thomasanderson): Add CSS_NAME here to handle the Gtk3.20 case.
203 CSS_TYPE, 211 CSS_TYPE,
212 CSS_NAME,
204 CSS_CLASS, 213 CSS_CLASS,
205 CSS_PSEUDOCLASS, 214 CSS_PSEUDOCLASS,
206 } part_type = CSS_TYPE; 215 } part_type = CSS_TYPE;
207 static const struct { 216 static const struct {
208 const char* name; 217 const char* name;
209 GtkStateFlags state_flag; 218 GtkStateFlags state_flag;
210 } pseudo_classes[] = { 219 } pseudo_classes[] = {
211 {"active", GTK_STATE_FLAG_ACTIVE}, 220 {"active", GTK_STATE_FLAG_ACTIVE},
212 {"hover", GTK_STATE_FLAG_PRELIGHT}, 221 {"hover", GTK_STATE_FLAG_PRELIGHT},
213 {"selected", GTK_STATE_FLAG_SELECTED}, 222 {"selected", GTK_STATE_FLAG_SELECTED},
214 {"disabled", GTK_STATE_FLAG_INSENSITIVE}, 223 {"disabled", GTK_STATE_FLAG_INSENSITIVE},
215 {"indeterminate", GTK_STATE_FLAG_INCONSISTENT}, 224 {"indeterminate", GTK_STATE_FLAG_INCONSISTENT},
216 {"focus", GTK_STATE_FLAG_FOCUSED}, 225 {"focus", GTK_STATE_FLAG_FOCUSED},
217 {"backdrop", GTK_STATE_FLAG_BACKDROP}, 226 {"backdrop", GTK_STATE_FLAG_BACKDROP},
218 // TODO(thomasanderson): These state flags are only available in 227 // TODO(thomasanderson): These state flags are only available in
219 // GTK 3.10 or later, which is unavailable in the wheezy 228 // GTK 3.10 or later, which is unavailable in the wheezy
220 // sysroot. Add them once the sysroot is updated to jessie. 229 // sysroot. Add them once the sysroot is updated to jessie.
221 // { "link", GTK_STATE_FLAG_LINK }, 230 // { "link", GTK_STATE_FLAG_LINK },
222 // { "visited", GTK_STATE_FLAG_VISITED }, 231 // { "visited", GTK_STATE_FLAG_VISITED },
223 // { "checked", GTK_STATE_FLAG_CHECKED }, 232 // { "checked", GTK_STATE_FLAG_CHECKED },
224 }; 233 };
225 GtkStateFlags state = 234 GtkStateFlags state =
226 context ? gtk_style_context_get_state(context) : GTK_STATE_FLAG_NORMAL; 235 context ? gtk_style_context_get_state(context) : GTK_STATE_FLAG_NORMAL;
227 base::StringTokenizer t(css_node, ".:"); 236 base::StringTokenizer t(css_node, ".:#");
228 t.set_options(base::StringTokenizer::RETURN_DELIMS); 237 t.set_options(base::StringTokenizer::RETURN_DELIMS);
229 while (t.GetNext()) { 238 while (t.GetNext()) {
230 if (t.token_is_delim()) { 239 if (t.token_is_delim()) {
231 if (t.token_begin() == css_node.begin()) { 240 if (t.token_begin() == css_node.begin()) {
232 // Special case for the first token. 241 // Special case for the first token.
233 gtk_widget_path_append_type(path, G_TYPE_NONE); 242 gtk_widget_path_append_type(path, G_TYPE_NONE);
234 } 243 }
235 switch (*t.token_begin()) { 244 switch (*t.token_begin()) {
245 case '#':
246 part_type = CSS_NAME;
247 break;
236 case '.': 248 case '.':
237 part_type = CSS_CLASS; 249 part_type = CSS_CLASS;
238 break; 250 break;
239 case ':': 251 case ':':
240 part_type = CSS_PSEUDOCLASS; 252 part_type = CSS_PSEUDOCLASS;
241 break; 253 break;
242 default: 254 default:
243 NOTREACHED(); 255 NOTREACHED();
244 } 256 }
245 } else { 257 } else {
246 switch (part_type) { 258 switch (part_type) {
259 case CSS_NAME: {
260 static auto* _gtk_widget_path_iter_set_object_name =
261 reinterpret_cast<void (*)(GtkWidgetPath*, gint, const char*)>(
262 dlsym(GetGtk3SharedLibrary(),
263 "gtk_widget_path_iter_set_object_name"));
Elliot Glaysher 2017/01/05 18:14:45 You probably want this inside the version checked
Tom (Use chromium acct) 2017/01/05 20:27:05 Done.
264 if (gtk_get_major_version() > 3 ||
265 (gtk_get_major_version() == 3 && gtk_get_minor_version() >= 20)) {
266 DCHECK(_gtk_widget_path_iter_set_object_name);
267 _gtk_widget_path_iter_set_object_name(path, -1, t.token().c_str());
268 } else {
269 gtk_widget_path_iter_add_class(path, -1, t.token().c_str());
270 }
271 break;
272 }
247 case CSS_TYPE: { 273 case CSS_TYPE: {
248 GType type = g_type_from_name(t.token().c_str()); 274 GType type = g_type_from_name(t.token().c_str());
249 DCHECK(type); 275 DCHECK(type);
250 gtk_widget_path_append_type(path, type); 276 gtk_widget_path_append_type(path, type);
251 break; 277 break;
252 } 278 }
253 case CSS_CLASS: { 279 case CSS_CLASS: {
254 gtk_widget_path_iter_add_class(path, -1, t.token().c_str()); 280 gtk_widget_path_iter_add_class(path, -1, t.token().c_str());
255 break; 281 break;
256 } 282 }
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after
399 } 425 }
400 426
401 AddBorders(context); 427 AddBorders(context);
402 PixelSurface surface; 428 PixelSurface surface;
403 gtk_render_frame(context, surface.cairo(), 0, 0, 1, 1); 429 gtk_render_frame(context, surface.cairo(), 0, 0, 1, 1);
404 return surface.GetPixelValue(); 430 return surface.GetPixelValue();
405 } 431 }
406 #endif 432 #endif
407 433
408 } // namespace libgtkui 434 } // namespace libgtkui
OLDNEW
« no previous file with comments | « chrome/browser/ui/libgtkui/gtk_ui.cc ('k') | chrome/browser/ui/libgtkui/native_theme_gtk3.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698