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

Side by Side Diff: chrome/browser/gtk/gtk_theme_provider.cc

Issue 1783010: GTK: more signal handler foolproofing. (Closed) Base URL: http://src.chromium.org/git/chromium.git
Patch Set: Created 10 years, 7 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/gtk/gtk_theme_provider.h ('k') | chrome/browser/gtk/menu_bar_helper.h » ('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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/gtk/gtk_theme_provider.h" 5 #include "chrome/browser/gtk/gtk_theme_provider.h"
6 6
7 #include <gtk/gtk.h> 7 #include <gtk/gtk.h>
8 8
9 #include <set> 9 #include <set>
10 10
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
138 GtkThemeProvider::GtkThemeProvider() 138 GtkThemeProvider::GtkThemeProvider()
139 : BrowserThemeProvider(), 139 : BrowserThemeProvider(),
140 fake_window_(gtk_window_new(GTK_WINDOW_TOPLEVEL)), 140 fake_window_(gtk_window_new(GTK_WINDOW_TOPLEVEL)),
141 fake_frame_(meta_frames_new()) { 141 fake_frame_(meta_frames_new()) {
142 fake_label_.Own(gtk_label_new("")); 142 fake_label_.Own(gtk_label_new(""));
143 fake_entry_.Own(gtk_entry_new()); 143 fake_entry_.Own(gtk_entry_new());
144 144
145 // Only realized widgets receive style-set notifications, which we need to 145 // Only realized widgets receive style-set notifications, which we need to
146 // broadcast new theme images and colors. 146 // broadcast new theme images and colors.
147 gtk_widget_realize(fake_frame_); 147 gtk_widget_realize(fake_frame_);
148 g_signal_connect(fake_frame_, "style-set", G_CALLBACK(&OnStyleSet), this); 148 signals_.Connect(fake_frame_, "style-set", G_CALLBACK(&OnStyleSet), this);
149 } 149 }
150 150
151 GtkThemeProvider::~GtkThemeProvider() { 151 GtkThemeProvider::~GtkThemeProvider() {
152 profile()->GetPrefs()->RemovePrefObserver(prefs::kUsesSystemTheme, this); 152 profile()->GetPrefs()->RemovePrefObserver(prefs::kUsesSystemTheme, this);
153 gtk_widget_destroy(fake_window_); 153 gtk_widget_destroy(fake_window_);
154 gtk_widget_destroy(fake_frame_); 154 gtk_widget_destroy(fake_frame_);
155 fake_label_.Destroy(); 155 fake_label_.Destroy();
156 fake_entry_.Destroy(); 156 fake_entry_.Destroy();
157 157
158 // We have to call this because FreePlatformCached() in ~BrowserThemeProvider 158 // We have to call this because FreePlatformCached() in ~BrowserThemeProvider
159 // doesn't call the right virutal FreePlatformCaches. 159 // doesn't call the right virutal FreePlatformCaches.
160 FreePlatformCaches(); 160 FreePlatformCaches();
161
162 // Disconnect from the destroy signal of any redisual widgets in
163 // |chrome_buttons_|.
164 for (std::vector<GtkWidget*>::iterator it = chrome_buttons_.begin();
165 it != chrome_buttons_.end(); ++it) {
166 gtk_signal_disconnect_by_data(GTK_OBJECT(*it), this);
167 }
168 } 161 }
169 162
170 void GtkThemeProvider::Init(Profile* profile) { 163 void GtkThemeProvider::Init(Profile* profile) {
171 profile->GetPrefs()->AddPrefObserver(prefs::kUsesSystemTheme, this); 164 profile->GetPrefs()->AddPrefObserver(prefs::kUsesSystemTheme, this);
172 use_gtk_ = profile->GetPrefs()->GetBoolean(prefs::kUsesSystemTheme); 165 use_gtk_ = profile->GetPrefs()->GetBoolean(prefs::kUsesSystemTheme);
173 166
174 BrowserThemeProvider::Init(profile); 167 BrowserThemeProvider::Init(profile);
175 } 168 }
176 169
177 SkBitmap* GtkThemeProvider::GetBitmapNamed(int id) const { 170 SkBitmap* GtkThemeProvider::GetBitmapNamed(int id) const {
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
242 if ((type == NotificationType::PREF_CHANGED) && 235 if ((type == NotificationType::PREF_CHANGED) &&
243 (*Details<std::wstring>(details).ptr() == prefs::kUsesSystemTheme)) 236 (*Details<std::wstring>(details).ptr() == prefs::kUsesSystemTheme))
244 use_gtk_ = profile()->GetPrefs()->GetBoolean(prefs::kUsesSystemTheme); 237 use_gtk_ = profile()->GetPrefs()->GetBoolean(prefs::kUsesSystemTheme);
245 } 238 }
246 239
247 GtkWidget* GtkThemeProvider::BuildChromeButton() { 240 GtkWidget* GtkThemeProvider::BuildChromeButton() {
248 GtkWidget* button = HoverControllerGtk::CreateChromeButton(); 241 GtkWidget* button = HoverControllerGtk::CreateChromeButton();
249 gtk_chrome_button_set_use_gtk_rendering(GTK_CHROME_BUTTON(button), use_gtk_); 242 gtk_chrome_button_set_use_gtk_rendering(GTK_CHROME_BUTTON(button), use_gtk_);
250 chrome_buttons_.push_back(button); 243 chrome_buttons_.push_back(button);
251 244
252 g_signal_connect(button, "destroy", G_CALLBACK(OnDestroyChromeButtonThunk), 245 signals_.Connect(button, "destroy", G_CALLBACK(OnDestroyChromeButtonThunk),
253 this); 246 this);
254 return button; 247 return button;
255 } 248 }
256 249
257 GtkWidget* GtkThemeProvider::CreateToolbarSeparator() { 250 GtkWidget* GtkThemeProvider::CreateToolbarSeparator() {
258 GtkWidget* separator = gtk_vseparator_new(); 251 GtkWidget* separator = gtk_vseparator_new();
259 GtkWidget* alignment = gtk_alignment_new(0, 0, 1, 1); 252 GtkWidget* alignment = gtk_alignment_new(0, 0, 1, 1);
260 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment), 253 gtk_alignment_set_padding(GTK_ALIGNMENT(alignment),
261 kSeparatorPadding, kSeparatorPadding, kSeparatorPadding, 0); 254 kSeparatorPadding, kSeparatorPadding, kSeparatorPadding, 0);
262 gtk_container_add(GTK_CONTAINER(alignment), separator); 255 gtk_container_add(GTK_CONTAINER(alignment), separator);
263 256
264 g_signal_connect(separator, "expose-event", 257 signals_.Connect(separator, "expose-event",
265 G_CALLBACK(OnSeparatorExposeThunk), this); 258 G_CALLBACK(OnSeparatorExposeThunk), this);
266 return alignment; 259 return alignment;
267 } 260 }
268 261
269 bool GtkThemeProvider::UseGtkTheme() const { 262 bool GtkThemeProvider::UseGtkTheme() const {
270 return use_gtk_; 263 return use_gtk_;
271 } 264 }
272 265
273 GdkColor GtkThemeProvider::GetGdkColor(int id) const { 266 GdkColor GtkThemeProvider::GetGdkColor(int id) const {
274 return gfx::SkColorToGdkColor(GetColor(id)); 267 return gfx::SkColorToGdkColor(GetColor(id));
(...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after
883 cairo_set_line_width(cr, 1.0); 876 cairo_set_line_width(cr, 1.0);
884 cairo_move_to(cr, start_x, widget->allocation.y); 877 cairo_move_to(cr, start_x, widget->allocation.y);
885 cairo_line_to(cr, start_x, 878 cairo_line_to(cr, start_x,
886 widget->allocation.y + widget->allocation.height); 879 widget->allocation.y + widget->allocation.height);
887 cairo_stroke(cr); 880 cairo_stroke(cr);
888 cairo_destroy(cr); 881 cairo_destroy(cr);
889 cairo_pattern_destroy(pattern); 882 cairo_pattern_destroy(pattern);
890 883
891 return TRUE; 884 return TRUE;
892 } 885 }
OLDNEW
« no previous file with comments | « chrome/browser/gtk/gtk_theme_provider.h ('k') | chrome/browser/gtk/menu_bar_helper.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698