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

Side by Side Diff: chrome/browser/ui/panels/panel_browser_window_gtk.cc

Issue 10180011: Support painting panels with chromium themes on GTK. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync Created 8 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 | Annotate | Revision Log
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/panels/panel_browser_window_gtk.h" 5 #include "chrome/browser/ui/panels/panel_browser_window_gtk.h"
6 6
7 #include "base/bind.h" 7 #include "base/bind.h"
8 #include "chrome/browser/ui/browser_list.h" 8 #include "chrome/browser/ui/browser_list.h"
9 #include "chrome/browser/ui/gtk/browser_titlebar.h" 9 #include "chrome/browser/ui/gtk/browser_titlebar.h"
10 #include "chrome/browser/ui/gtk/custom_button.h" 10 #include "chrome/browser/ui/gtk/custom_button.h"
11 #include "chrome/browser/ui/gtk/theme_service_gtk.h"
11 #include "chrome/browser/ui/panels/panel.h" 12 #include "chrome/browser/ui/panels/panel.h"
12 #include "chrome/browser/ui/panels/panel_bounds_animation.h" 13 #include "chrome/browser/ui/panels/panel_bounds_animation.h"
13 #include "chrome/browser/ui/panels/panel_browser_titlebar_gtk.h" 14 #include "chrome/browser/ui/panels/panel_browser_titlebar_gtk.h"
14 #include "chrome/browser/ui/panels/panel_drag_gtk.h" 15 #include "chrome/browser/ui/panels/panel_drag_gtk.h"
15 #include "chrome/browser/ui/panels/panel_manager.h" 16 #include "chrome/browser/ui/panels/panel_manager.h"
16 #include "chrome/browser/ui/panels/panel_strip.h" 17 #include "chrome/browser/ui/panels/panel_strip.h"
17 #include "chrome/common/chrome_notification_types.h" 18 #include "chrome/common/chrome_notification_types.h"
18 #include "content/public/browser/notification_service.h" 19 #include "content/public/browser/notification_service.h"
20 #include "grit/theme_resources_standard.h"
21 #include "third_party/skia/include/core/SkShader.h"
22 #include "ui/gfx/canvas.h"
23 #include "ui/gfx/image/cairo_cached_surface.h"
24 #include "ui/gfx/image/image.h"
25 #include "ui/gfx/skia_util.h"
19 26
20 using content::WebContents; 27 using content::WebContents;
21 28
22 namespace { 29 namespace {
23 30
24 // RGB values for titlebar in draw attention state. A shade of orange. 31 // Colors used to draw active titlebar under default theme.
jennb 2012/04/27 18:36:13 active titlebar and frame
jianli 2012/04/27 20:22:34 Done.
25 const int kDrawAttentionR = 0xfa; 32 const SkColor kActiveBackgroundDefaultColorStart = 0xfff0f8fa;
dcheng 2012/04/27 01:18:39 Consider using SkColorSetARGB.
jianli 2012/04/27 20:22:34 Done.
26 const int kDrawAttentionG = 0x98; 33 const SkColor kActiveBackgroundDefaultColorEnd = 0xffc1d2dd;
27 const int kDrawAttentionB = 0x3a;
28 const float kDrawAttentionRFraction = kDrawAttentionR / 255.0;
29 const float kDrawAttentionGFraction = kDrawAttentionG / 255.0;
30 const float kDrawAttentionBFraction = kDrawAttentionB / 255.0;
31 34
32 // Markup for title text in draw attention state. Set to color white. 35 // Colors used to draw inactive titlebar under default theme.
jennb 2012/04/27 18:36:13 titlebar and frame
jianli 2012/04/27 20:22:34 Done.
33 const char* const kDrawAttentionTitleMarkupPrefix = 36 const SkColor kInactiveBackgroundDefaultColorStart = 0xffffffff;
34 "<span fgcolor='#ffffff'>"; 37 const SkColor kInactiveBackgroundDefaultColorEnd = 0xffe7edf1;
35 const char* const kDrawAttentionTitleMarkupSuffix = "</span>"; 38
39 // Colors used to draw titlebar for drawing attention under default theme.
jennb 2012/04/27 18:36:13 titlebar and frame
jianli 2012/04/27 20:22:34 Done.
40 // It is also used in non-default theme since attention color is not defined
41 // in the theme.
42 const SkColor kAttentionBackgroundDefaultColorStart = 0xffffab57;
43 const SkColor kAttentionBackgroundDefaultColorEnd = 0xffffab57;
36 44
37 // Set minimium width for window really small. 45 // Set minimium width for window really small.
38 const int kMinWindowWidth = 26; 46 const int kMinWindowWidth = 26;
39 47
48 gfx::Image* CreateGradientImage(SkColor start_color, SkColor end_color) {
49 // Though the height of titlebar, used for creating gradient, cannot be
50 // pre-determined, we use a reasonablly bigger value that should work for
51 // most of cases.
52 const int gradient_size = 32;
jennb 2012/04/27 18:36:13 How did you decide on this number?
jianli 2012/04/27 20:22:34 Added comment to explain this.
53 SkShader* shader = gfx::CreateGradientShader(
54 0, gradient_size, start_color, end_color);
55 SkPaint paint;
56 paint.setStyle(SkPaint::kFill_Style);
57 paint.setAntiAlias(true);
58 paint.setShader(shader);
59 shader->unref();
60 gfx::Canvas canvas(gfx::Size(1, gradient_size), true);
61 canvas.DrawRect(gfx::Rect(0, 0, 1, gradient_size), paint);
62 return new gfx::Image(new SkBitmap(canvas.ExtractBitmap()));
dcheng 2012/04/27 01:18:39 I think you can just do gfx::Image(canvas.ExtractB
jianli 2012/04/27 20:22:34 Done.
63 }
64
65 gfx::Image* GetActiveBackgroundDefaultImage() {
66 static gfx::Image* image = NULL;
67 if (!image) {
68 image = CreateGradientImage(kActiveBackgroundDefaultColorStart,
69 kActiveBackgroundDefaultColorEnd);
70 }
71 return image;
72 }
73
74 gfx::Image* GetInactiveBackgroundDefaultImage() {
75 static gfx::Image* image = NULL;
76 if (!image) {
77 image = CreateGradientImage(kInactiveBackgroundDefaultColorStart,
78 kInactiveBackgroundDefaultColorEnd);
79 }
80 return image;
81 }
82
83 gfx::Image* GetAttentionBackgroundDefaultImage() {
84 static gfx::Image* image = NULL;
85 if (!image) {
86 image = CreateGradientImage(kAttentionBackgroundDefaultColorStart,
87 kAttentionBackgroundDefaultColorEnd);
88 }
89 return image;
90 }
91
40 } // namespace 92 } // namespace
41 93
42 NativePanel* Panel::CreateNativePanel(Browser* browser, Panel* panel, 94 NativePanel* Panel::CreateNativePanel(Browser* browser, Panel* panel,
43 const gfx::Rect& bounds) { 95 const gfx::Rect& bounds) {
44 PanelBrowserWindowGtk* panel_browser_window_gtk = 96 PanelBrowserWindowGtk* panel_browser_window_gtk =
45 new PanelBrowserWindowGtk(browser, panel, bounds); 97 new PanelBrowserWindowGtk(browser, panel, bounds);
46 panel_browser_window_gtk->Init(); 98 panel_browser_window_gtk->Init();
47 return panel_browser_window_gtk; 99 return panel_browser_window_gtk;
48 } 100 }
49 101
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
81 registrar_.Add( 133 registrar_.Add(
82 this, 134 this,
83 chrome::NOTIFICATION_WINDOW_CLOSED, 135 chrome::NOTIFICATION_WINDOW_CLOSED,
84 content::Source<GtkWindow>(window())); 136 content::Source<GtkWindow>(window()));
85 } 137 }
86 138
87 BrowserTitlebar* PanelBrowserWindowGtk::CreateBrowserTitlebar() { 139 BrowserTitlebar* PanelBrowserWindowGtk::CreateBrowserTitlebar() {
88 return new PanelBrowserTitlebarGtk(this, window()); 140 return new PanelBrowserTitlebarGtk(this, window());
89 } 141 }
90 142
143 PanelBrowserTitlebarGtk* PanelBrowserWindowGtk::GetTitlebar() const {
144 return static_cast<PanelBrowserTitlebarGtk*>(titlebar());
145 }
146
91 bool PanelBrowserWindowGtk::GetWindowEdge(int x, int y, GdkWindowEdge* edge) { 147 bool PanelBrowserWindowGtk::GetWindowEdge(int x, int y, GdkWindowEdge* edge) {
92 // Only detect the window edge when panels can be resized by the user. 148 // Only detect the window edge when panels can be resized by the user.
93 // This method is used by the base class to detect when the cursor has 149 // This method is used by the base class to detect when the cursor has
94 // hit the window edge in order to change the cursor to a resize cursor 150 // hit the window edge in order to change the cursor to a resize cursor
95 // and to detect when to initiate a resize drag. 151 // and to detect when to initiate a resize drag.
96 panel::Resizability resizability = panel_->CanResizeByMouse(); 152 panel::Resizability resizability = panel_->CanResizeByMouse();
97 if (panel::NOT_RESIZABLE == resizability) 153 if (panel::NOT_RESIZABLE == resizability)
98 return false; 154 return false;
99 155
100 if (!BrowserWindowGtk::GetWindowEdge(x, y, edge)) 156 if (!BrowserWindowGtk::GetWindowEdge(x, y, edge))
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
165 window(), GTK_WIDGET(window()), &hints, GDK_HINT_MIN_SIZE); 221 window(), GTK_WIDGET(window()), &hints, GDK_HINT_MIN_SIZE);
166 222
167 DCHECK(frame_size_.IsEmpty()); 223 DCHECK(frame_size_.IsEmpty());
168 } 224 }
169 225
170 void PanelBrowserWindowGtk::SetBounds(const gfx::Rect& bounds) { 226 void PanelBrowserWindowGtk::SetBounds(const gfx::Rect& bounds) {
171 // This should never be called. 227 // This should never be called.
172 DLOG(WARNING) << "Unexpected call to PanelBrowserWindowGtk::SetBounds()"; 228 DLOG(WARNING) << "Unexpected call to PanelBrowserWindowGtk::SetBounds()";
173 } 229 }
174 230
231 bool PanelBrowserWindowGtk::IsMinimized() const {
jennb 2012/04/27 18:36:13 So confusing... Usually, Panel delegates to native
jianli 2012/04/27 20:22:34 Removed.
232 return panel_->IsMinimized();
233 }
234
175 void PanelBrowserWindowGtk::OnSizeChanged(int width, int height) { 235 void PanelBrowserWindowGtk::OnSizeChanged(int width, int height) {
176 BrowserWindowGtk::OnSizeChanged(width, height); 236 BrowserWindowGtk::OnSizeChanged(width, height);
177 237
178 if (!frame_size_.IsEmpty()) 238 if (!frame_size_.IsEmpty())
179 return; 239 return;
180 240
181 // The system is allowed to size the window before the desired panel 241 // The system is allowed to size the window before the desired panel
182 // bounds are applied. Save the frame size allocated by the system as 242 // bounds are applied. Save the frame size allocated by the system as
183 // it will be affected when we shrink the panel smaller than the frame. 243 // it will be affected when we shrink the panel smaller than the frame.
184 frame_size_ = GetNonClientFrameSize(); 244 frame_size_ = GetNonClientFrameSize();
185 245
186 int top = bounds_.bottom() - height; 246 int top = bounds_.bottom() - height;
187 int left = bounds_.right() - width; 247 int left = bounds_.right() - width;
188 248
189 gtk_window_move(window_, left, top); 249 gtk_window_move(window_, left, top);
190 StartBoundsAnimation(gfx::Rect(left, top, width, height), bounds_); 250 StartBoundsAnimation(gfx::Rect(left, top, width, height), bounds_);
191 panel_->OnWindowSizeAvailable(); 251 panel_->OnWindowSizeAvailable();
192 252
193 content::NotificationService::current()->Notify( 253 content::NotificationService::current()->Notify(
194 chrome::NOTIFICATION_PANEL_WINDOW_SIZE_KNOWN, 254 chrome::NOTIFICATION_PANEL_WINDOW_SIZE_KNOWN,
195 content::Source<Panel>(panel_.get()), 255 content::Source<Panel>(panel_.get()),
196 content::NotificationService::NoDetails()); 256 content::NotificationService::NoDetails());
197 } 257 }
198 258
199 bool PanelBrowserWindowGtk::UseCustomFrame() { 259 bool PanelBrowserWindowGtk::UseCustomFrame() {
200 // We always use custom frame for panels. 260 // We always use custom frame for panels.
201 return TRUE; 261 return true;
262 }
263
264 bool PanelBrowserWindowGtk::UsingCustomPopupFrame() const {
265 // We do not draw custom popup frame.
266 return false;
202 } 267 }
203 268
204 void PanelBrowserWindowGtk::DrawPopupFrame(cairo_t* cr, 269 void PanelBrowserWindowGtk::DrawPopupFrame(cairo_t* cr,
205 GtkWidget* widget, 270 GtkWidget* widget,
206 GdkEventExpose* event) { 271 GdkEventExpose* event) {
207 static_cast<PanelBrowserTitlebarGtk*>(titlebar())-> 272 NOTREACHED();
208 UpdateMinimizeRestoreButtonVisibility(); 273 }
209 274
210 BrowserWindowGtk::DrawPopupFrame(cr, widget, event); 275 const gfx::Image* PanelBrowserWindowGtk::GetFrameTheme() const {
276 if (is_drawing_attention_)
277 return GetAttentionBackgroundDefaultImage();
211 278
212 if (is_drawing_attention_) 279 bool is_active = IsActive();
213 DrawAttentionFrame(cr, widget, event); 280 ThemeServiceGtk* theme_provider = ThemeServiceGtk::GetFrom(
281 browser()->profile());
282
283 if (theme_provider->UsingDefaultTheme()) {
284 return is_active ? GetActiveBackgroundDefaultImage()
285 : GetInactiveBackgroundDefaultImage();
286 }
287
288 return theme_provider->GetImageNamed(
289 is_active ? IDR_THEME_TOOLBAR : IDR_THEME_TAB_BACKGROUND);
214 } 290 }
215 291
216 void PanelBrowserWindowGtk::DrawCustomFrame(cairo_t* cr, 292 void PanelBrowserWindowGtk::DrawCustomFrame(cairo_t* cr,
217 GtkWidget* widget, 293 GtkWidget* widget,
218 GdkEventExpose* event) { 294 GdkEventExpose* event) {
219 static_cast<PanelBrowserTitlebarGtk*>(titlebar())-> 295 GetTitlebar()->UpdateMinimizeRestoreButtonVisibility();
220 UpdateMinimizeRestoreButtonVisibility();
221 296
222 BrowserWindowGtk::DrawCustomFrame(cr, widget, event); 297 gfx::CairoCachedSurface* surface = GetFrameTheme()->ToCairo();
223 298
224 if (is_drawing_attention_) 299 surface->SetSource(cr, widget, 0, 0);
225 DrawAttentionFrame(cr, widget, event); 300 cairo_pattern_set_extend(cairo_get_source(cr), CAIRO_EXTEND_REPEAT);
226 } 301 cairo_rectangle(cr, event->area.x, event->area.y,
227 302 event->area.width, event->area.height);
228 void PanelBrowserWindowGtk::DrawAttentionFrame(cairo_t* cr, 303 cairo_fill(cr);
229 GtkWidget* widget,
230 GdkEventExpose* event) {
231 cairo_set_source_rgb(cr, kDrawAttentionRFraction,
232 kDrawAttentionGFraction,
233 kDrawAttentionBFraction);
234
235 GdkRectangle dest_rectangle = GetTitlebarRectForDrawAttention();
236 GdkRegion* dest_region = gdk_region_rectangle(&dest_rectangle);
237
238 gdk_region_intersect(dest_region, event->region);
239 gdk_cairo_region(cr, dest_region);
240
241 cairo_clip(cr);
242 cairo_paint(cr);
243 gdk_region_destroy(dest_region);
244 } 304 }
245 305
246 void PanelBrowserWindowGtk::ActiveWindowChanged(GdkWindow* active_window) { 306 void PanelBrowserWindowGtk::ActiveWindowChanged(GdkWindow* active_window) {
247 bool was_active = IsActive(); 307 bool was_active = IsActive();
248 BrowserWindowGtk::ActiveWindowChanged(active_window); 308 BrowserWindowGtk::ActiveWindowChanged(active_window);
249 bool is_active = IsActive(); 309 bool is_active = IsActive();
250 if (!window() || was_active == is_active) // State didn't change. 310 if (!window() || was_active == is_active) // State didn't change.
251 return; 311 return;
252 312
253 panel_->OnActiveStateChanged(is_active); 313 panel_->OnActiveStateChanged(is_active);
254 } 314 }
255 315
256 BrowserWindowGtk::TitleDecoration PanelBrowserWindowGtk::GetWindowTitle(
257 std::string* title) const {
258 if (is_drawing_attention_) {
259 std::string title_original;
260 BrowserWindowGtk::TitleDecoration title_decoration =
261 BrowserWindowGtk::GetWindowTitle(&title_original);
262 DCHECK_EQ(BrowserWindowGtk::PLAIN_TEXT, title_decoration);
263 gchar* title_escaped = g_markup_escape_text(title_original.c_str(), -1);
264 gchar* title_with_markup = g_strconcat(kDrawAttentionTitleMarkupPrefix,
265 title_escaped,
266 kDrawAttentionTitleMarkupSuffix,
267 NULL);
268 *title = title_with_markup;
269 g_free(title_escaped);
270 g_free(title_with_markup);
271 return BrowserWindowGtk::PANGO_MARKUP;
272 } else {
273 return BrowserWindowGtk::GetWindowTitle(title);
274 }
275 }
276
277 void PanelBrowserWindowGtk::Observe( 316 void PanelBrowserWindowGtk::Observe(
278 int type, 317 int type,
279 const content::NotificationSource& source, 318 const content::NotificationSource& source,
280 const content::NotificationDetails& details) { 319 const content::NotificationDetails& details) {
281 switch (type) { 320 switch (type) {
282 case chrome::NOTIFICATION_WINDOW_CLOSED: 321 case chrome::NOTIFICATION_WINDOW_CLOSED:
283 // Cleanup. 322 // Cleanup.
284 if (bounds_animator_.get()) 323 if (bounds_animator_.get())
285 bounds_animator_.reset(); 324 bounds_animator_.reset();
286 325
(...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after
404 } 443 }
405 444
406 void PanelBrowserWindowGtk::DrawAttention(bool draw_attention) { 445 void PanelBrowserWindowGtk::DrawAttention(bool draw_attention) {
407 DCHECK((panel_->attention_mode() & Panel::USE_PANEL_ATTENTION) != 0); 446 DCHECK((panel_->attention_mode() & Panel::USE_PANEL_ATTENTION) != 0);
408 447
409 if (is_drawing_attention_ == draw_attention) 448 if (is_drawing_attention_ == draw_attention)
410 return; 449 return;
411 450
412 is_drawing_attention_ = draw_attention; 451 is_drawing_attention_ = draw_attention;
413 452
414 GdkRectangle rect = GetTitlebarRectForDrawAttention(); 453 GetTitlebar()->UpdateTextColor();
415 gdk_window_invalidate_rect( 454 UserChangedTheme();
jennb 2012/04/27 18:36:13 Seems like overkill. We just want to repaint the t
jianli 2012/04/27 20:22:34 Done.
416 gtk_widget_get_window(GTK_WIDGET(window())), &rect, TRUE);
417
418 UpdateTitleBar();
419 455
420 if ((panel_->attention_mode() & Panel::USE_SYSTEM_ATTENTION) != 0) 456 if ((panel_->attention_mode() & Panel::USE_SYSTEM_ATTENTION) != 0)
421 ::BrowserWindowGtk::FlashFrame(draw_attention); 457 ::BrowserWindowGtk::FlashFrame(draw_attention);
422 } 458 }
423 459
424 bool PanelBrowserWindowGtk::IsDrawingAttention() const { 460 bool PanelBrowserWindowGtk::IsDrawingAttention() const {
425 return is_drawing_attention_; 461 return is_drawing_attention_;
426 } 462 }
427 463
428 bool PanelBrowserWindowGtk::PreHandlePanelKeyboardEvent( 464 bool PanelBrowserWindowGtk::PreHandlePanelKeyboardEvent(
(...skipping 13 matching lines...) Expand all
442 } 478 }
443 479
444 Browser* PanelBrowserWindowGtk::GetPanelBrowser() const { 480 Browser* PanelBrowserWindowGtk::GetPanelBrowser() const {
445 return browser(); 481 return browser();
446 } 482 }
447 483
448 void PanelBrowserWindowGtk::DestroyPanelBrowser() { 484 void PanelBrowserWindowGtk::DestroyPanelBrowser() {
449 DestroyBrowser(); 485 DestroyBrowser();
450 } 486 }
451 487
452 gfx::Size PanelBrowserWindowGtk::IconOnlySize() const { 488 gfx::Size PanelBrowserWindowGtk::IconOnlySize() const {
jennb 2012/04/27 18:36:13 go ahead and delete this obsoleted method in this
jianli 2012/04/27 20:22:34 Done.
453 GtkAllocation allocation; 489 return gfx::Size();
454 gtk_widget_get_allocation(titlebar_widget(), &allocation);
455 return gfx::Size(titlebar()->IconOnlyWidth(), allocation.height);
456 } 490 }
457 491
458 void PanelBrowserWindowGtk::EnsurePanelFullyVisible() { 492 void PanelBrowserWindowGtk::EnsurePanelFullyVisible() {
459 gtk_window_present(window()); 493 gtk_window_present(window());
460 } 494 }
461 495
462 void PanelBrowserWindowGtk::SetPanelAppIconVisibility(bool visible) { 496 void PanelBrowserWindowGtk::SetPanelAppIconVisibility(bool visible) {
463 return; 497 return;
464 } 498 }
465 499
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
498 532
499 bounds_animator_->Start(); 533 bounds_animator_->Start();
500 last_animation_progressed_bounds_ = animation_start_bounds_; 534 last_animation_progressed_bounds_ = animation_start_bounds_;
501 } 535 }
502 536
503 bool PanelBrowserWindowGtk::IsAnimatingBounds() const { 537 bool PanelBrowserWindowGtk::IsAnimatingBounds() const {
504 return bounds_animator_.get() && bounds_animator_->is_animating(); 538 return bounds_animator_.get() && bounds_animator_->is_animating();
505 } 539 }
506 540
507 void PanelBrowserWindowGtk::AnimationEnded(const ui::Animation* animation) { 541 void PanelBrowserWindowGtk::AnimationEnded(const ui::Animation* animation) {
508 titlebar()->SendEnterNotifyToCloseButtonIfUnderMouse(); 542 GetTitlebar()->SendEnterNotifyToCloseButtonIfUnderMouse();
509 panel_->manager()->OnPanelAnimationEnded(panel_.get()); 543 panel_->manager()->OnPanelAnimationEnded(panel_.get());
510 } 544 }
511 545
512 void PanelBrowserWindowGtk::AnimationProgressed( 546 void PanelBrowserWindowGtk::AnimationProgressed(
513 const ui::Animation* animation) { 547 const ui::Animation* animation) {
514 DCHECK(!frame_size_.IsEmpty()); 548 DCHECK(!frame_size_.IsEmpty());
515 549
516 gfx::Rect new_bounds = bounds_animator_->CurrentValueBetween( 550 gfx::Rect new_bounds = bounds_animator_->CurrentValueBetween(
517 animation_start_bounds_, bounds_); 551 animation_start_bounds_, bounds_);
518 552
519 gdk_window_move_resize(gtk_widget_get_window(GTK_WIDGET(window())), 553 gdk_window_move_resize(gtk_widget_get_window(GTK_WIDGET(window())),
520 new_bounds.x(), new_bounds.y(), 554 new_bounds.x(), new_bounds.y(),
521 new_bounds.width(), new_bounds.height()); 555 new_bounds.width(), new_bounds.height());
522 556
523 last_animation_progressed_bounds_ = new_bounds; 557 last_animation_progressed_bounds_ = new_bounds;
524 } 558 }
525 559
526 GdkRectangle PanelBrowserWindowGtk::GetTitlebarRectForDrawAttention() const {
527 GdkRectangle rect;
528 rect.x = 0;
529 rect.y = 0;
530 // We get the window width and not the titlebar_widget() width because we'd
531 // like for the window borders on either side of the title bar to be the same
532 // color.
533 GtkAllocation window_allocation;
534 gtk_widget_get_allocation(GTK_WIDGET(window()), &window_allocation);
535 rect.width = window_allocation.width;
536
537 GtkAllocation titlebar_allocation;
538 gtk_widget_get_allocation(titlebar_widget(), &titlebar_allocation);
539 rect.height = titlebar_allocation.height;
540
541 return rect;
542 }
543
544 gboolean PanelBrowserWindowGtk::OnTitlebarButtonReleaseEvent( 560 gboolean PanelBrowserWindowGtk::OnTitlebarButtonReleaseEvent(
545 GtkWidget* widget, GdkEventButton* event) { 561 GtkWidget* widget, GdkEventButton* event) {
546 if (event->button != 1) 562 if (event->button != 1)
547 return TRUE; 563 return TRUE;
548 564
549 panel_->OnTitlebarClicked((event->state & GDK_CONTROL_MASK) ? 565 panel_->OnTitlebarClicked((event->state & GDK_CONTROL_MASK) ?
550 panel::APPLY_TO_ALL : panel::NO_MODIFIER); 566 panel::APPLY_TO_ALL : panel::NO_MODIFIER);
551 return TRUE; 567 return TRUE;
552 } 568 }
553 569
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after
643 } 659 }
644 660
645 void NativePanelTestingGtk::FinishDragTitlebar() { 661 void NativePanelTestingGtk::FinishDragTitlebar() {
646 if (!panel_browser_window_gtk_->drag_helper_.get()) 662 if (!panel_browser_window_gtk_->drag_helper_.get())
647 return; 663 return;
648 664
649 panel_browser_window_gtk_->drag_helper_->EndDrag(false); 665 panel_browser_window_gtk_->drag_helper_->EndDrag(false);
650 } 666 }
651 667
652 bool NativePanelTestingGtk::VerifyDrawingAttention() const { 668 bool NativePanelTestingGtk::VerifyDrawingAttention() const {
653 std::string title; 669 return panel_browser_window_gtk_->IsDrawingAttention();
654 BrowserWindowGtk::TitleDecoration decoration =
655 panel_browser_window_gtk_->GetWindowTitle(&title);
656 return panel_browser_window_gtk_->IsDrawingAttention() &&
657 decoration == BrowserWindowGtk::PANGO_MARKUP;
658 } 670 }
659 671
660 bool NativePanelTestingGtk::VerifyActiveState(bool is_active) { 672 bool NativePanelTestingGtk::VerifyActiveState(bool is_active) {
661 // TODO(jianli): to be implemented. http://crbug.com/102737 673 // TODO(jianli): to be implemented. http://crbug.com/102737
662 return false; 674 return false;
663 } 675 }
664 676
665 void NativePanelTestingGtk::WaitForWindowCreationToComplete() const { 677 void NativePanelTestingGtk::WaitForWindowCreationToComplete() const {
666 while (panel_browser_window_gtk_->frame_size_.IsEmpty()) 678 while (panel_browser_window_gtk_->frame_size_.IsEmpty())
667 MessageLoopForUI::current()->RunAllPending(); 679 MessageLoopForUI::current()->RunAllPending();
668 while (panel_browser_window_gtk_->IsAnimatingBounds()) 680 while (panel_browser_window_gtk_->IsAnimatingBounds())
669 MessageLoopForUI::current()->RunAllPending(); 681 MessageLoopForUI::current()->RunAllPending();
670 } 682 }
671 683
672 bool NativePanelTestingGtk::IsWindowSizeKnown() const { 684 bool NativePanelTestingGtk::IsWindowSizeKnown() const {
673 return !panel_browser_window_gtk_->frame_size_.IsEmpty(); 685 return !panel_browser_window_gtk_->frame_size_.IsEmpty();
674 } 686 }
675 687
676 bool NativePanelTestingGtk::IsAnimatingBounds() const { 688 bool NativePanelTestingGtk::IsAnimatingBounds() const {
677 return panel_browser_window_gtk_->IsAnimatingBounds(); 689 return panel_browser_window_gtk_->IsAnimatingBounds();
678 } 690 }
679 691
680 bool NativePanelTestingGtk::IsButtonVisible( 692 bool NativePanelTestingGtk::IsButtonVisible(
681 TitlebarButtonType button_type) const { 693 TitlebarButtonType button_type) const {
682 PanelBrowserTitlebarGtk* titlebar = static_cast<PanelBrowserTitlebarGtk*>( 694 PanelBrowserTitlebarGtk* titlebar = panel_browser_window_gtk_->GetTitlebar();
683 panel_browser_window_gtk_->titlebar());
684 CustomDrawButton* button; 695 CustomDrawButton* button;
685 switch (button_type) { 696 switch (button_type) {
686 case CLOSE_BUTTON: 697 case CLOSE_BUTTON:
687 button = titlebar->close_button(); 698 button = titlebar->close_button();
688 break; 699 break;
689 case MINIMIZE_BUTTON: 700 case MINIMIZE_BUTTON:
690 button = titlebar->minimize_button(); 701 button = titlebar->minimize_button();
691 break; 702 break;
692 case RESTORE_BUTTON: 703 case RESTORE_BUTTON:
693 button = titlebar->unminimize_button(); 704 button = titlebar->unminimize_button();
694 break; 705 break;
695 default: 706 default:
696 NOTREACHED(); 707 NOTREACHED();
697 return false; 708 return false;
698 } 709 }
699 return gtk_widget_get_visible(button->widget()); 710 return gtk_widget_get_visible(button->widget());
700 } 711 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698