summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-02-09 21:07:35 +0000
committerjhawkins@chromium.org <jhawkins@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-02-09 21:07:35 +0000
commitbdb5267835bee24d3550e1aae9bdefa9cb885e49 (patch)
tree5003413243d1c2444487ffff089be100104798ab
parent4b3893dfe996fe6529daf1c18c4318dff5ab4562 (diff)
downloadchromium_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.cc60
-rw-r--r--chrome/browser/browser_window_gtk.h11
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_