diff options
author | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-09 21:07:35 +0000 |
---|---|---|
committer | jhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-02-09 21:07:35 +0000 |
commit | bdb5267835bee24d3550e1aae9bdefa9cb885e49 (patch) | |
tree | 5003413243d1c2444487ffff089be100104798ab | |
parent | 4b3893dfe996fe6529daf1c18c4318dff5ab4562 (diff) | |
download | chromium_src-bdb5267835bee24d3550e1aae9bdefa9cb885e49.zip chromium_src-bdb5267835bee24d3550e1aae9bdefa9cb885e49.tar.gz chromium_src-bdb5267835bee24d3550e1aae9bdefa9cb885e49.tar.bz2 |
Add more state implementation to the BrowserWindowGtk object. Window bounds and state are now tracked and configurable.
Review URL: http://codereview.chromium.org/21177
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@9413 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r-- | chrome/browser/browser_window_gtk.cc | 60 | ||||
-rw-r--r-- | chrome/browser/browser_window_gtk.h | 11 |
2 files changed, 58 insertions, 13 deletions
diff --git a/chrome/browser/browser_window_gtk.cc b/chrome/browser/browser_window_gtk.cc index 85f013a..a3f234c 100644 --- a/chrome/browser/browser_window_gtk.cc +++ b/chrome/browser/browser_window_gtk.cc @@ -4,9 +4,6 @@ #include "chrome/browser/browser_window_gtk.h" -#include <gtk/gtk.h> - -#include "base/gfx/rect.h" #include "base/logging.h" #include "chrome/browser/browser.h" @@ -17,6 +14,29 @@ gboolean MainWindowDestroyed(GtkWindow* window, BrowserWindowGtk* browser_win) { return FALSE; // Don't stop this message. } +gboolean MainWindowConfigured(GtkWindow* window, GdkEventConfigure* event, + BrowserWindowGtk* browser_win) { + gfx::Rect bounds = gfx::Rect(event->x, event->y, event->width, event->height); + browser_win->OnBoundsChanged(bounds); + return FALSE; +} + +gboolean MainWindowStateChanged(GtkWindow* window, GdkEventWindowState* event, + BrowserWindowGtk* browser_win) { + browser_win->OnStateChanged(event->new_window_state); + return FALSE; +} + +// Using gtk_window_get_position/size creates a race condition, so only use +// this to get the initial bounds. After window creation, we pick up the +// normal bounds by connecting to the configure-event signal. +gfx::Rect GetInitialWindowBounds(GtkWindow* window) { + gint x, y, width, height; + gtk_window_get_position(window, &x, &y); + gtk_window_get_size(window, &width, &height); + return gfx::Rect(x, y, width, height); +} + } // namespace BrowserWindowGtk::BrowserWindowGtk(Browser* browser) : browser_(browser) { @@ -33,6 +53,11 @@ void BrowserWindowGtk::Init() { gtk_window_set_default_size(window_, 640, 480); g_signal_connect(G_OBJECT(window_), "destroy", G_CALLBACK(MainWindowDestroyed), this); + g_signal_connect(G_OBJECT(window_), "configure-event", + G_CALLBACK(MainWindowConfigured), this); + g_signal_connect(G_OBJECT(window_), "window-state-event", + G_CALLBACK(MainWindowStateChanged), this); + bounds_ = GetInitialWindowBounds(window_); } void BrowserWindowGtk::Show() { @@ -40,7 +65,13 @@ void BrowserWindowGtk::Show() { } void BrowserWindowGtk::SetBounds(const gfx::Rect& bounds) { - NOTIMPLEMENTED(); + gint x = static_cast<gint>(bounds.x()); + gint y = static_cast<gint>(bounds.y()); + gint width = static_cast<gint>(bounds.width()); + gint height = static_cast<gint>(bounds.height()); + + gtk_window_move(window_, x, y); + gtk_window_resize(window_, width, height); } void BrowserWindowGtk::Close() { @@ -52,16 +83,16 @@ void BrowserWindowGtk::Close() { } void BrowserWindowGtk::Activate() { - NOTIMPLEMENTED(); + gtk_window_present(window_); } void BrowserWindowGtk::FlashFrame() { - NOTIMPLEMENTED(); + // May not be respected by all window managers. + gtk_window_set_urgency_hint(window_, TRUE); } void* BrowserWindowGtk::GetNativeHandle() { - NOTIMPLEMENTED(); - return NULL; + return window_; } BrowserWindowTesting* BrowserWindowGtk::GetBrowserWindowTesting() { @@ -91,13 +122,11 @@ void BrowserWindowGtk::SetStarredState(bool is_starred) { } gfx::Rect BrowserWindowGtk::GetNormalBounds() const { - NOTIMPLEMENTED(); - return gfx::Rect(); + return bounds_; } bool BrowserWindowGtk::IsMaximized() const { - NOTIMPLEMENTED(); - return false; + return (state_ & GDK_WINDOW_STATE_MAXIMIZED); } LocationBar* BrowserWindowGtk::GetLocationBar() const { @@ -187,3 +216,10 @@ void BrowserWindowGtk::DestroyBrowser() { browser_.reset(); } +void BrowserWindowGtk::OnBoundsChanged(const gfx::Rect& bounds) { + bounds_ = bounds; +} + +void BrowserWindowGtk::OnStateChanged(GdkWindowState state) { + state_ = state; +} diff --git a/chrome/browser/browser_window_gtk.h b/chrome/browser/browser_window_gtk.h index b7c4eea..d6e1104 100644 --- a/chrome/browser/browser_window_gtk.h +++ b/chrome/browser/browser_window_gtk.h @@ -5,10 +5,12 @@ #ifndef CHROME_BROWSER_WINDOW_GTK_H_ #define CHROME_BROWSER_WINDOW_GTK_H_ +#include <gtk/gtk.h> + +#include "base/gfx/rect.h" #include "base/scoped_ptr.h" #include "chrome/browser/browser_window.h" -typedef struct _GtkWindow GtkWindow; // An implementation of BrowserWindow for GTK. // Cross-platform code will interact with this object when @@ -57,10 +59,17 @@ class BrowserWindowGtk : public BrowserWindow { virtual void ShowHTMLDialog(HtmlDialogContentsDelegate* delegate, void* parent_window); + void OnBoundsChanged(const gfx::Rect& bounds); + void OnStateChanged(GdkWindowState state); + protected: virtual void DestroyBrowser(); GtkWindow* window_; scoped_ptr<Browser> browser_; + + private: + gfx::Rect bounds_; + GdkWindowState state_; }; #endif // CHROME_BROWSER_WINDOW_GTK_H_ |