Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2009 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2009 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/gtk/browser_window_gtk.h" | 5 #include "chrome/browser/gtk/browser_window_gtk.h" |
| 6 | 6 |
| 7 #include <gdk/gdkkeysyms.h> | 7 #include <gdk/gdkkeysyms.h> |
| 8 #include <X11/XF86keysym.h> | 8 #include <X11/XF86keysym.h> |
| 9 | 9 |
| 10 #include <string> | 10 #include <string> |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 118 // actually a couple pixels more that should overlap the toolbar and web | 118 // actually a couple pixels more that should overlap the toolbar and web |
| 119 // content area, but we don't use those pixels. | 119 // content area, but we don't use those pixels. |
| 120 const int kContentShadowThickness = 2; | 120 const int kContentShadowThickness = 2; |
| 121 // The offset to the background when the custom frame is off. We want the | 121 // The offset to the background when the custom frame is off. We want the |
| 122 // window background to line up with the tab background regardless of whether | 122 // window background to line up with the tab background regardless of whether |
| 123 // we're in custom frame mode or not. Since themes are designed with the | 123 // we're in custom frame mode or not. Since themes are designed with the |
| 124 // custom frame in mind, we need to offset the background when the custom frame | 124 // custom frame in mind, we need to offset the background when the custom frame |
| 125 // is off. | 125 // is off. |
| 126 const int kCustomFrameBackgroundVerticalOffset = 15; | 126 const int kCustomFrameBackgroundVerticalOffset = 15; |
| 127 | 127 |
| 128 // When a window is moved or resized, GTK will call MainWindowConfigured below. | |
|
tony
2009/09/18 18:45:12
Nit: I expect this comment to either be in the hea
Mike Mammarella
2009/09/18 21:18:40
Done.
| |
| 129 // The GdkEventConfigure* that we get doesn't have quite the right coordinates | |
| 130 // though (they're relative to the drawable window area, rather than any window | |
| 131 // manager decorations, if enabled), so we need to call gtk_window_get_position | |
| 132 // to get the right values. (Otherwise session restore, if enabled, will | |
| 133 // restore windows to incorrect positions.) That's a round trip to the X server | |
| 134 // though, so we set a debounce timer and only call it after we haven't seen a | |
| 135 // reconfigure event in a short while. | |
| 136 const int kDebounceTimeoutMilliseconds = 100; | |
| 137 | |
| 128 base::LazyInstance<ActiveWindowWatcher> | 138 base::LazyInstance<ActiveWindowWatcher> |
| 129 g_active_window_watcher(base::LINKER_INITIALIZED); | 139 g_active_window_watcher(base::LINKER_INITIALIZED); |
| 130 | 140 |
| 131 gboolean MainWindowConfigured(GtkWindow* window, GdkEventConfigure* event, | 141 gboolean MainWindowConfigured(GtkWindow* window, GdkEventConfigure* event, |
| 132 BrowserWindowGtk* browser_win) { | 142 BrowserWindowGtk* browser_win) { |
| 133 gfx::Rect bounds = gfx::Rect(event->x, event->y, event->width, event->height); | 143 gfx::Rect bounds = gfx::Rect(event->x, event->y, event->width, event->height); |
| 134 browser_win->OnBoundsChanged(bounds); | 144 browser_win->OnBoundsChanged(bounds); |
| 135 return FALSE; | 145 return FALSE; |
| 136 } | 146 } |
| 137 | 147 |
| (...skipping 1216 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1354 | 1364 |
| 1355 void BrowserWindowGtk::OnBoundsChanged(const gfx::Rect& bounds) { | 1365 void BrowserWindowGtk::OnBoundsChanged(const gfx::Rect& bounds) { |
| 1356 GetLocationBar()->location_entry()->ClosePopup(); | 1366 GetLocationBar()->location_entry()->ClosePopup(); |
| 1357 | 1367 |
| 1358 if (bounds_.size() != bounds.size()) | 1368 if (bounds_.size() != bounds.size()) |
| 1359 OnSizeChanged(bounds.width(), bounds.height()); | 1369 OnSizeChanged(bounds.width(), bounds.height()); |
| 1360 | 1370 |
| 1361 bounds_ = bounds; | 1371 bounds_ = bounds; |
| 1362 if (!IsFullscreen() && !IsMaximized()) | 1372 if (!IsFullscreen() && !IsMaximized()) |
| 1363 restored_bounds_ = bounds; | 1373 restored_bounds_ = bounds; |
| 1374 | |
| 1375 // We don't use Reset() because the timer may not yet be running. | |
| 1376 // (In that case Stop() is a no-op.) | |
| 1377 mainwin_configure_debounce_timer_.Stop(); | |
| 1378 mainwin_configure_debounce_timer_.Start(base::TimeDelta::FromMilliseconds( | |
| 1379 kDebounceTimeoutMilliseconds), this, | |
| 1380 &BrowserWindowGtk::OnDebouncedBoundsChanged); | |
| 1381 } | |
| 1382 | |
| 1383 void BrowserWindowGtk::OnDebouncedBoundsChanged() { | |
| 1384 gint x, y; | |
| 1385 gtk_window_get_position(window_, &x, &y); | |
| 1386 gfx::Point origin(x, y); | |
| 1387 bounds_.set_origin(origin); | |
|
tony
2009/09/18 18:45:12
Should we update restored_bounds_ too?
Mike Mammarella
2009/09/18 21:18:40
Done.
| |
| 1364 SaveWindowPosition(); | 1388 SaveWindowPosition(); |
| 1365 } | 1389 } |
| 1366 | 1390 |
| 1367 void BrowserWindowGtk::OnStateChanged(GdkWindowState state, | 1391 void BrowserWindowGtk::OnStateChanged(GdkWindowState state, |
| 1368 GdkWindowState changed_mask) { | 1392 GdkWindowState changed_mask) { |
| 1369 state_ = state; | 1393 state_ = state; |
| 1370 | 1394 |
| 1371 if (changed_mask & GDK_WINDOW_STATE_FULLSCREEN) { | 1395 if (changed_mask & GDK_WINDOW_STATE_FULLSCREEN) { |
| 1372 bool is_fullscreen = state & GDK_WINDOW_STATE_FULLSCREEN; | 1396 bool is_fullscreen = state & GDK_WINDOW_STATE_FULLSCREEN; |
| 1373 browser_->UpdateCommandsForFullscreenMode(is_fullscreen); | 1397 browser_->UpdateCommandsForFullscreenMode(is_fullscreen); |
| (...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1477 geometry.min_height = 1; | 1501 geometry.min_height = 1; |
| 1478 gtk_window_set_geometry_hints(window_, NULL, &geometry, GDK_HINT_MIN_SIZE); | 1502 gtk_window_set_geometry_hints(window_, NULL, &geometry, GDK_HINT_MIN_SIZE); |
| 1479 | 1503 |
| 1480 // If we call gtk_window_maximize followed by gtk_window_present, compiz gets | 1504 // If we call gtk_window_maximize followed by gtk_window_present, compiz gets |
| 1481 // confused and maximizes the window, but doesn't set the | 1505 // confused and maximizes the window, but doesn't set the |
| 1482 // GDK_WINDOW_STATE_MAXIMIZED bit. So instead, we keep track of whether to | 1506 // GDK_WINDOW_STATE_MAXIMIZED bit. So instead, we keep track of whether to |
| 1483 // maximize and call it after gtk_window_present. | 1507 // maximize and call it after gtk_window_present. |
| 1484 maximize_after_show_ = browser_->GetSavedMaximizedState(); | 1508 maximize_after_show_ = browser_->GetSavedMaximizedState(); |
| 1485 | 1509 |
| 1486 gfx::Rect bounds = browser_->GetSavedWindowBounds(); | 1510 gfx::Rect bounds = browser_->GetSavedWindowBounds(); |
| 1487 // We don't blindly call SetBounds here, that sets a forced position | 1511 // We don't blindly call SetBounds here: that sets a forced position |
| 1488 // on the window and we intentionally *don't* do that for normal | 1512 // on the window and we intentionally *don't* do that for normal |
| 1489 // windows. We tested many programs and none of them restored their | 1513 // windows. Most programs do not restore their window position on |
| 1490 // position on Linux. | 1514 // Linux, instead letting the window manager choose a position. |
| 1491 // | 1515 // |
| 1492 // However, in cases like dropping a tab where the bounds are | 1516 // However, in cases like dropping a tab where the bounds are |
| 1493 // specifically set, we do want to position explicitly. | 1517 // specifically set, we do want to position explicitly. We also |
| 1518 // force the position as part of session restore, as applications | |
| 1519 // that restore other, similar state (for instance GIMP, audacity, | |
| 1520 // pidgin, dia, and gkrellm) do tend to restore their positions. | |
| 1494 if (browser_->bounds_overridden()) { | 1521 if (browser_->bounds_overridden()) { |
| 1495 // For popups, bounds are set in terms of the client area rather than the | 1522 // For popups, bounds are set in terms of the client area rather than the |
| 1496 // entire window. | 1523 // entire window. |
| 1497 SetBoundsImpl(bounds, !(browser_->type() & Browser::TYPE_POPUP)); | 1524 SetBoundsImpl(bounds, !(browser_->type() & Browser::TYPE_POPUP)); |
| 1498 } else { | 1525 } else { |
| 1499 // Ignore the position but obey the size. | 1526 // Ignore the position but obey the size. |
| 1500 SetWindowSize(window_, bounds.width(), bounds.height()); | 1527 SetWindowSize(window_, bounds.width(), bounds.height()); |
| 1501 } | 1528 } |
| 1502 } | 1529 } |
| 1503 | 1530 |
| (...skipping 699 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2203 // special-case the ones where the custom frame should be used. These names | 2230 // special-case the ones where the custom frame should be used. These names |
| 2204 // are taken from the WMs' source code. | 2231 // are taken from the WMs' source code. |
| 2205 return (wm_name == "Blackbox" || | 2232 return (wm_name == "Blackbox" || |
| 2206 wm_name == "compiz" || | 2233 wm_name == "compiz" || |
| 2207 wm_name == "e16" || // Enlightenment DR16 | 2234 wm_name == "e16" || // Enlightenment DR16 |
| 2208 wm_name == "KWin" || | 2235 wm_name == "KWin" || |
| 2209 wm_name == "Metacity" || | 2236 wm_name == "Metacity" || |
| 2210 wm_name == "Openbox" || | 2237 wm_name == "Openbox" || |
| 2211 wm_name == "Xfwm4"); | 2238 wm_name == "Xfwm4"); |
| 2212 } | 2239 } |
| OLD | NEW |