OLD | NEW |
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_ui.h" | 5 #include "chrome/browser/ui/libgtkui/gtk_ui.h" |
6 | 6 |
7 #include <math.h> | 7 #include <math.h> |
8 #include <pango/pango.h> | 8 #include <pango/pango.h> |
9 #include <X11/Xcursor/Xcursor.h> | 9 #include <X11/Xcursor/Xcursor.h> |
10 | 10 |
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
109 ~GtkButtonImageSource() override {} | 109 ~GtkButtonImageSource() override {} |
110 | 110 |
111 gfx::ImageSkiaRep GetImageForScale(float scale) override { | 111 gfx::ImageSkiaRep GetImageForScale(float scale) override { |
112 int width = width_ * scale; | 112 int width = width_ * scale; |
113 int height = height_ * scale; | 113 int height = height_ * scale; |
114 | 114 |
115 SkBitmap border; | 115 SkBitmap border; |
116 border.allocN32Pixels(width, height); | 116 border.allocN32Pixels(width, height); |
117 border.eraseColor(0); | 117 border.eraseColor(0); |
118 | 118 |
| 119 cairo_surface_t* surface = cairo_image_surface_create_for_data( |
| 120 static_cast<unsigned char*>(border.getAddr(0, 0)), CAIRO_FORMAT_ARGB32, |
| 121 width, height, width * 4); |
| 122 cairo_t* cr = cairo_create(surface); |
| 123 |
| 124 #if GTK_MAJOR_VERSION == 2 |
119 // Create a temporary GTK button to snapshot | 125 // Create a temporary GTK button to snapshot |
120 GtkWidget* window = gtk_offscreen_window_new(); | 126 GtkWidget* window = gtk_offscreen_window_new(); |
121 GtkWidget* button = gtk_toggle_button_new(); | 127 GtkWidget* button = gtk_toggle_button_new(); |
122 | 128 |
123 if (state_ == ui::NativeTheme::kPressed) | 129 if (state_ == ui::NativeTheme::kPressed) |
124 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), true); | 130 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(button), true); |
125 else if (state_ == ui::NativeTheme::kDisabled) | 131 else if (state_ == ui::NativeTheme::kDisabled) |
126 gtk_widget_set_sensitive(button, false); | 132 gtk_widget_set_sensitive(button, false); |
127 | 133 |
128 gtk_widget_set_size_request(button, width, height); | 134 gtk_widget_set_size_request(button, width, height); |
129 gtk_container_add(GTK_CONTAINER(window), button); | 135 gtk_container_add(GTK_CONTAINER(window), button); |
130 | 136 |
131 if (is_blue_) | 137 if (is_blue_) |
132 TurnButtonBlue(button); | 138 TurnButtonBlue(button); |
133 | 139 |
134 gtk_widget_show_all(window); | 140 gtk_widget_show_all(window); |
135 | 141 |
136 cairo_surface_t* surface = cairo_image_surface_create_for_data( | |
137 static_cast<unsigned char*>(border.getAddr(0, 0)), CAIRO_FORMAT_ARGB32, | |
138 width, height, width * 4); | |
139 cairo_t* cr = cairo_create(surface); | |
140 | |
141 #if GTK_MAJOR_VERSION == 2 | |
142 if (focus_) | 142 if (focus_) |
143 GTK_WIDGET_SET_FLAGS(button, GTK_HAS_FOCUS); | 143 GTK_WIDGET_SET_FLAGS(button, GTK_HAS_FOCUS); |
144 | 144 |
145 int w, h; | 145 int w, h; |
146 GdkPixmap* pixmap; | 146 GdkPixmap* pixmap; |
147 | 147 |
148 { | 148 { |
149 // http://crbug.com/346740 | 149 // http://crbug.com/346740 |
150 ANNOTATE_SCOPED_MEMORY_LEAK; | 150 ANNOTATE_SCOPED_MEMORY_LEAK; |
151 pixmap = gtk_widget_get_snapshot(button, nullptr); | 151 pixmap = gtk_widget_get_snapshot(button, nullptr); |
152 } | 152 } |
153 | 153 |
154 gdk_drawable_get_size(GDK_DRAWABLE(pixmap), &w, &h); | 154 gdk_drawable_get_size(GDK_DRAWABLE(pixmap), &w, &h); |
155 GdkColormap* colormap = gdk_drawable_get_colormap(pixmap); | 155 GdkColormap* colormap = gdk_drawable_get_colormap(pixmap); |
156 GdkPixbuf* pixbuf = gdk_pixbuf_get_from_drawable( | 156 GdkPixbuf* pixbuf = gdk_pixbuf_get_from_drawable( |
157 nullptr, GDK_DRAWABLE(pixmap), colormap, 0, 0, 0, 0, w, h); | 157 nullptr, GDK_DRAWABLE(pixmap), colormap, 0, 0, 0, 0, w, h); |
158 | 158 |
159 gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0); | 159 gdk_cairo_set_source_pixbuf(cr, pixbuf, 0, 0); |
160 cairo_paint(cr); | 160 cairo_paint(cr); |
161 | 161 |
162 g_object_unref(pixbuf); | 162 g_object_unref(pixbuf); |
163 g_object_unref(pixmap); | 163 g_object_unref(pixmap); |
| 164 |
| 165 gtk_widget_destroy(window); |
164 #else | 166 #else |
165 GtkStyleContext* context = gtk_widget_get_style_context(button); | 167 ScopedStyleContext context = GetStyleContextFromCss( |
| 168 is_blue_ ? "GtkButton#button.default.suggested-action" |
| 169 : "GtkButton#button"); |
| 170 GtkStateFlags state_flags = StateToStateFlags(state_); |
| 171 if (focus_) { |
| 172 state_flags = |
| 173 static_cast<GtkStateFlags>(state_flags | GTK_STATE_FLAG_FOCUSED); |
| 174 } |
| 175 gtk_style_context_set_state(context, state_flags); |
166 gtk_render_background(context, cr, 0, 0, width, height); | 176 gtk_render_background(context, cr, 0, 0, width, height); |
167 gtk_render_frame(context, cr, 0, 0, width, height); | 177 gtk_render_frame(context, cr, 0, 0, width, height); |
168 if (focus_) | 178 if (focus_) |
169 gtk_render_focus(context, cr, 0, 0, width, height); | 179 gtk_render_focus(context, cr, 0, 0, width, height); |
170 #endif | 180 #endif |
171 | 181 |
172 cairo_destroy(cr); | 182 cairo_destroy(cr); |
173 cairo_surface_destroy(surface); | 183 cairo_surface_destroy(surface); |
174 | 184 |
175 gtk_widget_destroy(window); | |
176 | |
177 return gfx::ImageSkiaRep(border, scale); | 185 return gfx::ImageSkiaRep(border, scale); |
178 } | 186 } |
179 | 187 |
180 private: | 188 private: |
181 bool is_blue_; | 189 bool is_blue_; |
182 bool focus_; | 190 bool focus_; |
183 ui::NativeTheme::State state_; | 191 ui::NativeTheme::State state_; |
184 int width_; | 192 int width_; |
185 int height_; | 193 int height_; |
186 | 194 |
(...skipping 890 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1077 | 1085 |
1078 float GtkUi::GetDeviceScaleFactor() const { | 1086 float GtkUi::GetDeviceScaleFactor() const { |
1079 return device_scale_factor_; | 1087 return device_scale_factor_; |
1080 } | 1088 } |
1081 | 1089 |
1082 } // namespace libgtkui | 1090 } // namespace libgtkui |
1083 | 1091 |
1084 views::LinuxUI* BuildGtkUi() { | 1092 views::LinuxUI* BuildGtkUi() { |
1085 return new libgtkui::GtkUi; | 1093 return new libgtkui::GtkUi; |
1086 } | 1094 } |
OLD | NEW |