summaryrefslogtreecommitdiffstats
path: root/views
diff options
context:
space:
mode:
Diffstat (limited to 'views')
-rw-r--r--views/widget/widget.h4
-rw-r--r--views/widget/widget_gtk.cc11
-rw-r--r--views/widget/widget_gtk.h1
-rw-r--r--views/widget/widget_win.cc5
-rw-r--r--views/widget/widget_win.h1
5 files changed, 22 insertions, 0 deletions
diff --git a/views/widget/widget.h b/views/widget/widget.h
index 14a61a0..1dabf08 100644
--- a/views/widget/widget.h
+++ b/views/widget/widget.h
@@ -10,6 +10,7 @@
class ThemeProvider;
namespace gfx {
+class Path;
class Rect;
}
@@ -49,6 +50,9 @@ class Widget {
// Sizes and/or places the widget to the specified bounds, size or position.
virtual void SetBounds(const gfx::Rect& bounds) = 0;
+ // Sets a shape on the widget.
+ virtual void SetShape(const gfx::Path& shape) = 0;
+
// Hides the widget then closes it after a return to the message loop.
virtual void Close() = 0;
diff --git a/views/widget/widget_gtk.cc b/views/widget/widget_gtk.cc
index 4928d27..776af0d 100644
--- a/views/widget/widget_gtk.cc
+++ b/views/widget/widget_gtk.cc
@@ -4,6 +4,7 @@
#include "views/widget/widget_gtk.h"
+#include "app/gfx/path.h"
#include "base/compiler_specific.h"
#include "views/fill_layout.h"
#include "views/widget/default_theme_provider.h"
@@ -270,6 +271,16 @@ void WidgetGtk::SetBounds(const gfx::Rect& bounds) {
}
}
+void WidgetGtk::SetShape(const gfx::Path& shape) {
+ DCHECK(widget_);
+ DCHECK(widget_->window);
+
+ gdk_window_shape_combine_region(widget_->window, NULL, 0, 0);
+ GdkRegion* region = shape.CreateGdkRegion();
+ gdk_window_shape_combine_region(widget_->window, region, 0, 0);
+ gdk_region_destroy(region);
+}
+
void WidgetGtk::Close() {
if (!widget_)
return; // No need to do anything.
diff --git a/views/widget/widget_gtk.h b/views/widget/widget_gtk.h
index 8ac47fc..2442f74 100644
--- a/views/widget/widget_gtk.h
+++ b/views/widget/widget_gtk.h
@@ -71,6 +71,7 @@ class WidgetGtk : public Widget, public MessageLoopForUI::Observer {
// Overridden from Widget:
virtual void GetBounds(gfx::Rect* out, bool including_frame) const;
virtual void SetBounds(const gfx::Rect& bounds);
+ virtual void SetShape(const gfx::Path& shape);
virtual void Close();
virtual void CloseNow();
virtual void Show();
diff --git a/views/widget/widget_win.cc b/views/widget/widget_win.cc
index adce4d9..353fcbc 100644
--- a/views/widget/widget_win.cc
+++ b/views/widget/widget_win.cc
@@ -5,6 +5,7 @@
#include "views/widget/widget_win.h"
#include "app/gfx/canvas.h"
+#include "app/gfx/path.h"
#include "app/win_util.h"
#include "base/gfx/native_theme.h"
#include "base/string_util.h"
@@ -258,6 +259,10 @@ void WidgetWin::SetBounds(const gfx::Rect& bounds) {
SWP_NOACTIVATE | SWP_NOZORDER);
}
+void WidgetWin::SetShape(const gfx::Path& shape) {
+ SetWindowRgn(shape.CreateHRGN(), TRUE);
+}
+
void WidgetWin::Close() {
if (!IsWindow())
return; // No need to do anything.
diff --git a/views/widget/widget_win.h b/views/widget/widget_win.h
index fa6bab6..c57de93 100644
--- a/views/widget/widget_win.h
+++ b/views/widget/widget_win.h
@@ -214,6 +214,7 @@ class WidgetWin : public Widget,
// Overridden from Widget:
virtual void GetBounds(gfx::Rect* out, bool including_frame) const;
virtual void SetBounds(const gfx::Rect& bounds);
+ virtual void SetShape(const gfx::Path& shape);
virtual void Close();
virtual void CloseNow();
virtual void Show();