Index: views/window/native_window_gtk.cc |
=================================================================== |
--- views/window/native_window_gtk.cc (revision 86938) |
+++ views/window/native_window_gtk.cc (working copy) |
@@ -80,6 +80,7 @@ |
NativeWindowGtk::NativeWindowGtk(internal::NativeWindowDelegate* delegate) |
: NativeWidgetGtk(delegate->AsNativeWidgetDelegate()), |
delegate_(delegate), |
+ window_state_(GDK_WINDOW_STATE_WITHDRAWN), |
window_closed_(false) { |
is_window_ = true; |
} |
@@ -181,6 +182,14 @@ |
SaveWindowPosition(); |
} |
+gboolean NativeWindowGtk::OnWindowStateEvent(GtkWidget* widget, |
+ GdkEventWindowState* event) { |
+ window_state_ = event->new_window_state; |
+ if (!(window_state_ & GDK_WINDOW_STATE_WITHDRAWN)) |
+ SaveWindowPosition(); |
+ return FALSE; |
+} |
+ |
gboolean NativeWindowGtk::OnLeaveNotify(GtkWidget* widget, |
GdkEventCrossing* event) { |
gdk_window_set_cursor(widget->window, gfx::GetCursor(GDK_LEFT_PTR)); |
@@ -198,6 +207,8 @@ |
g_signal_connect(G_OBJECT(GetNativeWindow()), "configure-event", |
G_CALLBACK(CallConfigureEvent), this); |
+ g_signal_connect(G_OBJECT(GetNativeWindow()), "window-state-event", |
+ G_CALLBACK(CallWindowStateEvent), this); |
} |
//////////////////////////////////////////////////////////////////////////////// |
@@ -291,6 +302,51 @@ |
NativeWidgetGtk::SetBounds(bounds); |
} |
+void NativeWindowGtk::HideWindow() { |
+ GetWindow()->Hide(); |
+} |
+ |
+void NativeWindowGtk::Activate() { |
+ gtk_window_present(GTK_WINDOW(GetNativeView())); |
+} |
+ |
+void NativeWindowGtk::Deactivate() { |
+ gdk_window_lower(GTK_WIDGET(GetNativeView())->window); |
+} |
+ |
+void NativeWindowGtk::Maximize() { |
+ gtk_window_maximize(GetNativeWindow()); |
+} |
+ |
+void NativeWindowGtk::Minimize() { |
+ gtk_window_iconify(GetNativeWindow()); |
+} |
+ |
+void NativeWindowGtk::Restore() { |
+ if (IsMaximized()) |
+ gtk_window_unmaximize(GetNativeWindow()); |
+ else if (IsMinimized()) |
+ gtk_window_deiconify(GetNativeWindow()); |
+ else if (IsFullscreen()) |
+ SetFullscreen(false); |
+} |
+ |
+bool NativeWindowGtk::IsActive() const { |
+ return NativeWidgetGtk::IsActive(); |
+} |
+ |
+bool NativeWindowGtk::IsVisible() const { |
+ return GTK_WIDGET_VISIBLE(GetNativeView()); |
+} |
+ |
+bool NativeWindowGtk::IsMaximized() const { |
+ return window_state_ & GDK_WINDOW_STATE_MAXIMIZED; |
+} |
+ |
+bool NativeWindowGtk::IsMinimized() const { |
+ return window_state_ & GDK_WINDOW_STATE_ICONIFIED; |
+} |
+ |
void NativeWindowGtk::SetFullscreen(bool fullscreen) { |
if (fullscreen) |
gtk_window_fullscreen(GetNativeWindow()); |
@@ -310,12 +366,20 @@ |
return NULL; |
} |
+void NativeWindowGtk::SetAlwaysOnTop(bool always_on_top) { |
+ gtk_window_set_keep_above(GetNativeWindow(), always_on_top); |
+} |
+ |
void NativeWindowGtk::UpdateFrameAfterFrameChange() { |
// We currently don't support different frame types on Gtk, so we don't |
// need to implement this. |
NOTIMPLEMENTED(); |
} |
+gfx::NativeWindow NativeWindowGtk::GetNativeWindow() const { |
+ return GTK_WINDOW(GetNativeView()); |
+} |
+ |
bool NativeWindowGtk::ShouldUseNativeFrame() const { |
return false; |
} |
@@ -328,23 +392,6 @@ |
} |
//////////////////////////////////////////////////////////////////////////////// |
-// NativeWindowGtk, NativeWidgetGtk overrides: |
- |
-void NativeWindowGtk::Restore() { |
- if (IsFullscreen()) |
- SetFullscreen(false); |
- else |
- NativeWidgetGtk::Restore(); |
-} |
- |
-gboolean NativeWindowGtk::OnWindowStateEvent(GtkWidget* widget, |
- GdkEventWindowState* event) { |
- if (!(event->new_window_state & GDK_WINDOW_STATE_WITHDRAWN)) |
- SaveWindowPosition(); |
- return NativeWidgetGtk::OnWindowStateEvent(widget, event); |
-} |
- |
-//////////////////////////////////////////////////////////////////////////////// |
// NativeWindowGtk, private: |
// static |
@@ -354,6 +401,13 @@ |
return window_gtk->OnConfigureEvent(widget, event); |
} |
+// static |
+gboolean NativeWindowGtk::CallWindowStateEvent(GtkWidget* widget, |
+ GdkEventWindowState* event, |
+ NativeWindowGtk* window_gtk) { |
+ return window_gtk->OnWindowStateEvent(widget, event); |
+} |
+ |
void NativeWindowGtk::SaveWindowPosition() { |
// The delegate may have gone away on us. |
if (!GetWindow()->window_delegate()) |