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

Side by Side Diff: chrome/browser/ui/gtk/apps/native_app_window_gtk.cc

Issue 26427002: Add always-on-top property to app windows (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Merge Created 7 years, 2 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
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 1 // Copyright 2013 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/gtk/apps/native_app_window_gtk.h" 5 #include "chrome/browser/ui/gtk/apps/native_app_window_gtk.h"
6 6
7 #include <gdk/gdkx.h> 7 #include <gdk/gdkx.h>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/message_loop/message_pump_gtk.h" 10 #include "base/message_loop/message_pump_gtk.h"
(...skipping 30 matching lines...) Expand all
41 } // namespace 41 } // namespace
42 42
43 NativeAppWindowGtk::NativeAppWindowGtk(ShellWindow* shell_window, 43 NativeAppWindowGtk::NativeAppWindowGtk(ShellWindow* shell_window,
44 const ShellWindow::CreateParams& params) 44 const ShellWindow::CreateParams& params)
45 : shell_window_(shell_window), 45 : shell_window_(shell_window),
46 window_(NULL), 46 window_(NULL),
47 state_(GDK_WINDOW_STATE_WITHDRAWN), 47 state_(GDK_WINDOW_STATE_WITHDRAWN),
48 is_active_(false), 48 is_active_(false),
49 content_thinks_its_fullscreen_(false), 49 content_thinks_its_fullscreen_(false),
50 frameless_(params.frame == ShellWindow::FRAME_NONE), 50 frameless_(params.frame == ShellWindow::FRAME_NONE),
51 always_on_top_(params.always_on_top),
51 frame_cursor_(NULL), 52 frame_cursor_(NULL),
52 atom_cache_(base::MessagePumpGtk::GetDefaultXDisplay(), kAtomsToCache), 53 atom_cache_(base::MessagePumpGtk::GetDefaultXDisplay(), kAtomsToCache),
53 is_x_event_listened_(false) { 54 is_x_event_listened_(false) {
54 Observe(web_contents()); 55 Observe(web_contents());
55 56
56 window_ = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL)); 57 window_ = GTK_WINDOW(gtk_window_new(GTK_WINDOW_TOPLEVEL));
57 58
58 gfx::NativeView native_view = 59 gfx::NativeView native_view =
59 web_contents()->GetView()->GetNativeView(); 60 web_contents()->GetView()->GetNativeView();
60 gtk_container_add(GTK_CONTAINER(window_), native_view); 61 gtk_container_add(GTK_CONTAINER(window_), native_view);
(...skipping 23 matching lines...) Expand all
84 // get our first configure-event 85 // get our first configure-event
85 bounds_ = restored_bounds_ = params.bounds; 86 bounds_ = restored_bounds_ = params.bounds;
86 gint x, y; 87 gint x, y;
87 gtk_window_get_position(window_, &x, &y); 88 gtk_window_get_position(window_, &x, &y);
88 bounds_.set_origin(gfx::Point(x, y)); 89 bounds_.set_origin(gfx::Point(x, y));
89 90
90 // Hide titlebar when {frame: 'none'} specified on ShellWindow. 91 // Hide titlebar when {frame: 'none'} specified on ShellWindow.
91 if (frameless_) 92 if (frameless_)
92 gtk_window_set_decorated(window_, false); 93 gtk_window_set_decorated(window_, false);
93 94
95 if (always_on_top_)
96 gtk_window_set_keep_above(window_, TRUE);
97
94 int min_width = params.minimum_size.width(); 98 int min_width = params.minimum_size.width();
95 int min_height = params.minimum_size.height(); 99 int min_height = params.minimum_size.height();
96 int max_width = params.maximum_size.width(); 100 int max_width = params.maximum_size.width();
97 int max_height = params.maximum_size.height(); 101 int max_height = params.maximum_size.height();
98 GdkGeometry hints; 102 GdkGeometry hints;
99 int hints_mask = 0; 103 int hints_mask = 0;
100 if (min_width || min_height) { 104 if (min_width || min_height) {
101 hints.min_height = min_height; 105 hints.min_height = min_height;
102 hints.min_width = min_width; 106 hints.min_width = min_width;
103 hints_mask |= GDK_HINT_MIN_SIZE; 107 hints_mask |= GDK_HINT_MIN_SIZE;
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
332 } 336 }
333 337
334 return GDK_FILTER_CONTINUE; 338 return GDK_FILTER_CONTINUE;
335 } 339 }
336 340
337 void NativeAppWindowGtk::FlashFrame(bool flash) { 341 void NativeAppWindowGtk::FlashFrame(bool flash) {
338 gtk_window_set_urgency_hint(window_, flash); 342 gtk_window_set_urgency_hint(window_, flash);
339 } 343 }
340 344
341 bool NativeAppWindowGtk::IsAlwaysOnTop() const { 345 bool NativeAppWindowGtk::IsAlwaysOnTop() const {
342 return false; 346 return always_on_top_;
343 } 347 }
344 348
345 void NativeAppWindowGtk::RenderViewHostChanged( 349 void NativeAppWindowGtk::RenderViewHostChanged(
346 content::RenderViewHost* old_host, 350 content::RenderViewHost* old_host,
347 content::RenderViewHost* new_host) { 351 content::RenderViewHost* new_host) {
348 web_contents()->GetView()->Focus(); 352 web_contents()->GetView()->Focus();
349 } 353 }
350 354
351 gfx::Insets NativeAppWindowGtk::GetFrameInsets() const { 355 gfx::Insets NativeAppWindowGtk::GetFrameInsets() const {
352 if (frameless_) 356 if (frameless_)
(...skipping 21 matching lines...) Expand all
374 rect_with_decorations.width - current_width - left_inset); 378 rect_with_decorations.width - current_width - left_inset);
375 } 379 }
376 380
377 bool NativeAppWindowGtk::IsVisible() const { 381 bool NativeAppWindowGtk::IsVisible() const {
378 return gtk_widget_get_visible(GTK_WIDGET(window_)); 382 return gtk_widget_get_visible(GTK_WIDGET(window_));
379 } 383 }
380 384
381 void NativeAppWindowGtk::HideWithApp() {} 385 void NativeAppWindowGtk::HideWithApp() {}
382 void NativeAppWindowGtk::ShowWithApp() {} 386 void NativeAppWindowGtk::ShowWithApp() {}
383 387
388 void NativeAppWindowGtk::SetAlwaysOnTop(bool always_on_top) {
389 if (always_on_top_ != always_on_top) {
390 // gdk_window_get_state() does not give us the correct value for the
391 // GDK_WINDOW_STATE_ABOVE bit. Cache the current state.
392 always_on_top_ = always_on_top;
393 gtk_window_set_keep_above(window_, always_on_top_ ? TRUE : FALSE);
394 shell_window_->OnNativeWindowChanged();
395 }
396 }
397
384 gfx::NativeView NativeAppWindowGtk::GetHostView() const { 398 gfx::NativeView NativeAppWindowGtk::GetHostView() const {
385 NOTIMPLEMENTED(); 399 NOTIMPLEMENTED();
386 return NULL; 400 return NULL;
387 } 401 }
388 402
389 gfx::Point NativeAppWindowGtk::GetDialogPosition(const gfx::Size& size) { 403 gfx::Point NativeAppWindowGtk::GetDialogPosition(const gfx::Size& size) {
390 gint current_width = 0; 404 gint current_width = 0;
391 gint current_height = 0; 405 gint current_height = 0;
392 gtk_window_get_size(window_, &current_width, &current_height); 406 gtk_window_get_size(window_, &current_width, &current_height);
393 return gfx::Point(current_width / 2 - size.width() / 2, 407 return gfx::Point(current_width / 2 - size.width() / 2,
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
644 } 658 }
645 659
646 void NativeAppWindowGtk::UpdateDraggableRegions( 660 void NativeAppWindowGtk::UpdateDraggableRegions(
647 const std::vector<extensions::DraggableRegion>& regions) { 661 const std::vector<extensions::DraggableRegion>& regions) {
648 // Draggable region is not supported for non-frameless window. 662 // Draggable region is not supported for non-frameless window.
649 if (!frameless_) 663 if (!frameless_)
650 return; 664 return;
651 665
652 draggable_region_.reset(ShellWindow::RawDraggableRegionsToSkRegion(regions)); 666 draggable_region_.reset(ShellWindow::RawDraggableRegionsToSkRegion(regions));
653 } 667 }
OLDNEW
« no previous file with comments | « chrome/browser/ui/gtk/apps/native_app_window_gtk.h ('k') | chrome/browser/ui/gtk/browser_window_gtk.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698