Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(416)

Side by Side Diff: ui/views/widget/desktop_aura/desktop_window_tree_host_x11.cc

Issue 2867693004: Snapshot of all changes to get jumbo in blink and content.
Patch Set: Exclude certain files from jumbo because of a Windows problem Created 3 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « ui/base/x/x11_util_internal.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h" 5 #include "ui/views/widget/desktop_aura/desktop_window_tree_host_x11.h"
6 6
7 #include <X11/extensions/shape.h> 7 #include <X11/extensions/shape.h>
8 #include <X11/extensions/XInput2.h> 8 #include <X11/extensions/XInput2.h>
9 #include <X11/Xatom.h> 9 #include <X11/Xatom.h>
10 #include <X11/Xregion.h> 10 #include <X11/Xregion.h>
(...skipping 456 matching lines...) Expand 10 before | Expand all | Expand 10 after
467 // we don't destroy the window before the callback returned (as the caller 467 // we don't destroy the window before the callback returned (as the caller
468 // may delete ourselves on destroy and the ATL callback would still 468 // may delete ourselves on destroy and the ATL callback would still
469 // dereference us when the callback returns). 469 // dereference us when the callback returns).
470 base::ThreadTaskRunnerHandle::Get()->PostTask( 470 base::ThreadTaskRunnerHandle::Get()->PostTask(
471 FROM_HERE, base::Bind(&DesktopWindowTreeHostX11::CloseNow, 471 FROM_HERE, base::Bind(&DesktopWindowTreeHostX11::CloseNow,
472 close_widget_factory_.GetWeakPtr())); 472 close_widget_factory_.GetWeakPtr()));
473 } 473 }
474 } 474 }
475 475
476 void DesktopWindowTreeHostX11::CloseNow() { 476 void DesktopWindowTreeHostX11::CloseNow() {
477 if (xwindow_ == None) 477 if (xwindow_ == X11Constants::None)
478 return; 478 return;
479 479
480 ReleaseCapture(); 480 ReleaseCapture();
481 native_widget_delegate_->OnNativeWidgetDestroying(); 481 native_widget_delegate_->OnNativeWidgetDestroying();
482 482
483 // If we have children, close them. Use a copy for iteration because they'll 483 // If we have children, close them. Use a copy for iteration because they'll
484 // remove themselves. 484 // remove themselves.
485 std::set<DesktopWindowTreeHostX11*> window_children_copy = window_children_; 485 std::set<DesktopWindowTreeHostX11*> window_children_copy = window_children_;
486 for (std::set<DesktopWindowTreeHostX11*>::iterator it = 486 for (std::set<DesktopWindowTreeHostX11*>::iterator it =
487 window_children_copy.begin(); it != window_children_copy.end(); 487 window_children_copy.begin(); it != window_children_copy.end();
(...skipping 17 matching lines...) Expand all
505 // Destroy the compositor before destroying the |xwindow_| since shutdown 505 // Destroy the compositor before destroying the |xwindow_| since shutdown
506 // may try to swap, and the swap without a window causes an X error, which 506 // may try to swap, and the swap without a window causes an X error, which
507 // causes a crash with in-process renderer. 507 // causes a crash with in-process renderer.
508 DestroyCompositor(); 508 DestroyCompositor();
509 509
510 open_windows().remove(xwindow_); 510 open_windows().remove(xwindow_);
511 // Actually free our native resources. 511 // Actually free our native resources.
512 if (ui::PlatformEventSource::GetInstance()) 512 if (ui::PlatformEventSource::GetInstance())
513 ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this); 513 ui::PlatformEventSource::GetInstance()->RemovePlatformEventDispatcher(this);
514 XDestroyWindow(xdisplay_, xwindow_); 514 XDestroyWindow(xdisplay_, xwindow_);
515 xwindow_ = None; 515 xwindow_ = X11Constants::None;
516 516
517 desktop_native_widget_aura_->OnHostClosed(); 517 desktop_native_widget_aura_->OnHostClosed();
518 } 518 }
519 519
520 aura::WindowTreeHost* DesktopWindowTreeHostX11::AsWindowTreeHost() { 520 aura::WindowTreeHost* DesktopWindowTreeHostX11::AsWindowTreeHost() {
521 return this; 521 return this;
522 } 522 }
523 523
524 void DesktopWindowTreeHostX11::ShowWindowWithState( 524 void DesktopWindowTreeHostX11::ShowWindowWithState(
525 ui::WindowShowState show_state) { 525 ui::WindowShowState show_state) {
(...skipping 222 matching lines...) Expand 10 before | Expand all | Expand 10 after
748 memset(&xclient, 0, sizeof(xclient)); 748 memset(&xclient, 0, sizeof(xclient));
749 xclient.type = ClientMessage; 749 xclient.type = ClientMessage;
750 xclient.xclient.window = xwindow_; 750 xclient.xclient.window = xwindow_;
751 xclient.xclient.message_type = gfx::GetAtom("_NET_ACTIVE_WINDOW"); 751 xclient.xclient.message_type = gfx::GetAtom("_NET_ACTIVE_WINDOW");
752 xclient.xclient.format = 32; 752 xclient.xclient.format = 32;
753 xclient.xclient.data.l[0] = 1; // Specified we are an app. 753 xclient.xclient.data.l[0] = 1; // Specified we are an app.
754 xclient.xclient.data.l[1] = timestamp; 754 xclient.xclient.data.l[1] = timestamp;
755 // TODO(thomasanderson): if another chrome window is active, specify that in 755 // TODO(thomasanderson): if another chrome window is active, specify that in
756 // data.l[2]. The EWMH spec claims this may make the WM more likely to 756 // data.l[2]. The EWMH spec claims this may make the WM more likely to
757 // service our _NET_ACTIVE_WINDOW request. 757 // service our _NET_ACTIVE_WINDOW request.
758 xclient.xclient.data.l[2] = None; 758 xclient.xclient.data.l[2] = X11Constants::None;
759 xclient.xclient.data.l[3] = 0; 759 xclient.xclient.data.l[3] = 0;
760 xclient.xclient.data.l[4] = 0; 760 xclient.xclient.data.l[4] = 0;
761 761
762 XSendEvent(xdisplay_, x_root_window_, False, 762 XSendEvent(xdisplay_, x_root_window_, X11Constants::False,
763 SubstructureRedirectMask | SubstructureNotifyMask, &xclient); 763 SubstructureRedirectMask | SubstructureNotifyMask, &xclient);
764 } else { 764 } else {
765 XRaiseWindow(xdisplay_, xwindow_); 765 XRaiseWindow(xdisplay_, xwindow_);
766 // Directly ask the X server to give focus to the window. Note that the call 766 // Directly ask the X server to give focus to the window. Note that the call
767 // would have raised an X error if the window is not mapped. 767 // would have raised an X error if the window is not mapped.
768 auto old_error_handler = XSetErrorHandler(IgnoreX11Errors); 768 auto old_error_handler = XSetErrorHandler(IgnoreX11Errors);
769 XSetInputFocus(xdisplay_, xwindow_, RevertToParent, timestamp); 769 XSetInputFocus(xdisplay_, xwindow_, RevertToParent, timestamp);
770 // At this point, we know we will receive focus, and some 770 // At this point, we know we will receive focus, and some
771 // webdriver tests depend on a window being IsActive() immediately 771 // webdriver tests depend on a window being IsActive() immediately
772 // after an Activate(), so just set this state now. 772 // after an Activate(), so just set this state now.
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
805 805
806 // |has_window_focus_| and |has_pointer_focus_| are mutually exclusive. 806 // |has_window_focus_| and |has_pointer_focus_| are mutually exclusive.
807 DCHECK(!has_window_focus_ || !has_pointer_focus_); 807 DCHECK(!has_window_focus_ || !has_pointer_focus_);
808 808
809 return is_active; 809 return is_active;
810 } 810 }
811 811
812 void DesktopWindowTreeHostX11::Maximize() { 812 void DesktopWindowTreeHostX11::Maximize() {
813 if (HasWMSpecProperty("_NET_WM_STATE_FULLSCREEN")) { 813 if (HasWMSpecProperty("_NET_WM_STATE_FULLSCREEN")) {
814 // Unfullscreen the window if it is fullscreen. 814 // Unfullscreen the window if it is fullscreen.
815 SetWMSpecState(false, gfx::GetAtom("_NET_WM_STATE_FULLSCREEN"), None); 815 SetWMSpecState(false, gfx::GetAtom("_NET_WM_STATE_FULLSCREEN"), X11Constants ::None);
816 816
817 // Resize the window so that it does not have the same size as a monitor. 817 // Resize the window so that it does not have the same size as a monitor.
818 // (Otherwise, some window managers immediately put the window back in 818 // (Otherwise, some window managers immediately put the window back in
819 // fullscreen mode). 819 // fullscreen mode).
820 gfx::Rect adjusted_bounds_in_pixels(bounds_in_pixels_.origin(), 820 gfx::Rect adjusted_bounds_in_pixels(bounds_in_pixels_.origin(),
821 AdjustSize(bounds_in_pixels_.size())); 821 AdjustSize(bounds_in_pixels_.size()));
822 if (adjusted_bounds_in_pixels != bounds_in_pixels_) 822 if (adjusted_bounds_in_pixels != bounds_in_pixels_)
823 SetBoundsInPixels(adjusted_bounds_in_pixels); 823 SetBoundsInPixels(adjusted_bounds_in_pixels);
824 } 824 }
825 825
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
859 bool DesktopWindowTreeHostX11::IsMinimized() const { 859 bool DesktopWindowTreeHostX11::IsMinimized() const {
860 return HasWMSpecProperty("_NET_WM_STATE_HIDDEN"); 860 return HasWMSpecProperty("_NET_WM_STATE_HIDDEN");
861 } 861 }
862 862
863 bool DesktopWindowTreeHostX11::HasCapture() const { 863 bool DesktopWindowTreeHostX11::HasCapture() const {
864 return g_current_capture == this; 864 return g_current_capture == this;
865 } 865 }
866 866
867 void DesktopWindowTreeHostX11::SetAlwaysOnTop(bool always_on_top) { 867 void DesktopWindowTreeHostX11::SetAlwaysOnTop(bool always_on_top) {
868 is_always_on_top_ = always_on_top; 868 is_always_on_top_ = always_on_top;
869 SetWMSpecState(always_on_top, gfx::GetAtom("_NET_WM_STATE_ABOVE"), None); 869 SetWMSpecState(always_on_top, gfx::GetAtom("_NET_WM_STATE_ABOVE"), X11Constant s::None);
870 } 870 }
871 871
872 bool DesktopWindowTreeHostX11::IsAlwaysOnTop() const { 872 bool DesktopWindowTreeHostX11::IsAlwaysOnTop() const {
873 return is_always_on_top_; 873 return is_always_on_top_;
874 } 874 }
875 875
876 void DesktopWindowTreeHostX11::SetVisibleOnAllWorkspaces(bool always_visible) { 876 void DesktopWindowTreeHostX11::SetVisibleOnAllWorkspaces(bool always_visible) {
877 SetWMSpecState(always_visible, gfx::GetAtom("_NET_WM_STATE_STICKY"), None); 877 SetWMSpecState(always_visible, gfx::GetAtom("_NET_WM_STATE_STICKY"), X11Consta nts::None);
878 878
879 int new_desktop = 0; 879 int new_desktop = 0;
880 if (always_visible) { 880 if (always_visible) {
881 new_desktop = kAllDesktops; 881 new_desktop = kAllDesktops;
882 } else { 882 } else {
883 if (!ui::GetCurrentDesktop(&new_desktop)) 883 if (!ui::GetCurrentDesktop(&new_desktop))
884 return; 884 return;
885 } 885 }
886 886
887 workspace_ = base::IntToString(kAllDesktops); 887 workspace_ = base::IntToString(kAllDesktops);
888 XEvent xevent; 888 XEvent xevent;
889 memset (&xevent, 0, sizeof (xevent)); 889 memset (&xevent, 0, sizeof (xevent));
890 xevent.type = ClientMessage; 890 xevent.type = ClientMessage;
891 xevent.xclient.window = xwindow_; 891 xevent.xclient.window = xwindow_;
892 xevent.xclient.message_type = gfx::GetAtom("_NET_WM_DESKTOP"); 892 xevent.xclient.message_type = gfx::GetAtom("_NET_WM_DESKTOP");
893 xevent.xclient.format = 32; 893 xevent.xclient.format = 32;
894 xevent.xclient.data.l[0] = new_desktop; 894 xevent.xclient.data.l[0] = new_desktop;
895 xevent.xclient.data.l[1] = 0; 895 xevent.xclient.data.l[1] = 0;
896 xevent.xclient.data.l[2] = 0; 896 xevent.xclient.data.l[2] = 0;
897 xevent.xclient.data.l[3] = 0; 897 xevent.xclient.data.l[3] = 0;
898 xevent.xclient.data.l[4] = 0; 898 xevent.xclient.data.l[4] = 0;
899 XSendEvent(xdisplay_, x_root_window_, False, 899 XSendEvent(xdisplay_, x_root_window_, X11Constants::False,
900 SubstructureRedirectMask | SubstructureNotifyMask, 900 SubstructureRedirectMask | SubstructureNotifyMask, &xevent);
901 &xevent);
902 } 901 }
903 902
904 bool DesktopWindowTreeHostX11::IsVisibleOnAllWorkspaces() const { 903 bool DesktopWindowTreeHostX11::IsVisibleOnAllWorkspaces() const {
905 // We don't need a check for _NET_WM_STATE_STICKY because that would specify 904 // We don't need a check for _NET_WM_STATE_STICKY because that would specify
906 // that the window remain in a fixed position even if the viewport scrolls. 905 // that the window remain in a fixed position even if the viewport scrolls.
907 // This is different from the type of workspace that's associated with 906 // This is different from the type of workspace that's associated with
908 // _NET_WM_DESKTOP. 907 // _NET_WM_DESKTOP.
909 return GetWorkspace() == base::IntToString(kAllDesktops); 908 return GetWorkspace() == base::IntToString(kAllDesktops);
910 } 909 }
911 910
912 bool DesktopWindowTreeHostX11::SetWindowTitle(const base::string16& title) { 911 bool DesktopWindowTreeHostX11::SetWindowTitle(const base::string16& title) {
913 if (window_title_ == title) 912 if (window_title_ == title)
914 return false; 913 return false;
915 window_title_ = title; 914 window_title_ = title;
916 std::string utf8str = base::UTF16ToUTF8(title); 915 std::string utf8str = base::UTF16ToUTF8(title);
917 XChangeProperty(xdisplay_, xwindow_, gfx::GetAtom("_NET_WM_NAME"), 916 XChangeProperty(xdisplay_, xwindow_, gfx::GetAtom("_NET_WM_NAME"),
918 gfx::GetAtom("UTF8_STRING"), 8, PropModeReplace, 917 gfx::GetAtom("UTF8_STRING"), 8, PropModeReplace,
919 reinterpret_cast<const unsigned char*>(utf8str.c_str()), 918 reinterpret_cast<const unsigned char*>(utf8str.c_str()),
920 utf8str.size()); 919 utf8str.size());
921 XTextProperty xtp; 920 XTextProperty xtp;
922 char* c_utf8_str = const_cast<char*>(utf8str.c_str()); 921 char* c_utf8_str = const_cast<char*>(utf8str.c_str());
923 if (Xutf8TextListToTextProperty(xdisplay_, &c_utf8_str, 1, 922 if (Xutf8TextListToTextProperty(xdisplay_, &c_utf8_str, 1, XUTF8StringStyle,
924 XUTF8StringStyle, &xtp) == Success) { 923 &xtp) == X11Constants::Success) {
925 XSetWMName(xdisplay_, xwindow_, &xtp); 924 XSetWMName(xdisplay_, xwindow_, &xtp);
926 XFree(xtp.value); 925 XFree(xtp.value);
927 } 926 }
928 return true; 927 return true;
929 } 928 }
930 929
931 void DesktopWindowTreeHostX11::ClearNativeFocus() { 930 void DesktopWindowTreeHostX11::ClearNativeFocus() {
932 // This method is weird and misnamed. Instead of clearing the native focus, 931 // This method is weird and misnamed. Instead of clearing the native focus,
933 // it sets the focus to our |content_window_|, which will trigger a cascade 932 // it sets the focus to our |content_window_|, which will trigger a cascade
934 // of focus changes into views. 933 // of focus changes into views.
(...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after
1005 1004
1006 // Work around a bug where if we try to unfullscreen, metacity immediately 1005 // Work around a bug where if we try to unfullscreen, metacity immediately
1007 // fullscreens us again. This is a little flickery and not necessary if 1006 // fullscreens us again. This is a little flickery and not necessary if
1008 // there's a gnome-panel, but it's not easy to detect whether there's a 1007 // there's a gnome-panel, but it's not easy to detect whether there's a
1009 // panel or not. 1008 // panel or not.
1010 bool unmaximize_and_remaximize = !fullscreen && IsMaximized() && 1009 bool unmaximize_and_remaximize = !fullscreen && IsMaximized() &&
1011 ui::GuessWindowManager() == ui::WM_METACITY; 1010 ui::GuessWindowManager() == ui::WM_METACITY;
1012 1011
1013 if (unmaximize_and_remaximize) 1012 if (unmaximize_and_remaximize)
1014 Restore(); 1013 Restore();
1015 SetWMSpecState(fullscreen, gfx::GetAtom("_NET_WM_STATE_FULLSCREEN"), None); 1014 SetWMSpecState(fullscreen, gfx::GetAtom("_NET_WM_STATE_FULLSCREEN"), X11Consta nts::None);
1016 if (unmaximize_and_remaximize) 1015 if (unmaximize_and_remaximize)
1017 Maximize(); 1016 Maximize();
1018 1017
1019 // Try to guess the size we will have after the switch to/from fullscreen: 1018 // Try to guess the size we will have after the switch to/from fullscreen:
1020 // - (may) avoid transient states 1019 // - (may) avoid transient states
1021 // - works around Flash content which expects to have the size updated 1020 // - works around Flash content which expects to have the size updated
1022 // synchronously. 1021 // synchronously.
1023 // See https://crbug.com/361408 1022 // See https://crbug.com/361408
1024 if (fullscreen) { 1023 if (fullscreen) {
1025 restored_bounds_in_pixels_ = bounds_in_pixels_; 1024 restored_bounds_in_pixels_ = bounds_in_pixels_;
(...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after
1264 DesktopWindowTreeHostX11* old_capturer = g_current_capture; 1263 DesktopWindowTreeHostX11* old_capturer = g_current_capture;
1265 1264
1266 // Update |g_current_capture| prior to calling OnHostLostWindowCapture() to 1265 // Update |g_current_capture| prior to calling OnHostLostWindowCapture() to
1267 // avoid releasing pointer grab. 1266 // avoid releasing pointer grab.
1268 g_current_capture = this; 1267 g_current_capture = this;
1269 if (old_capturer) 1268 if (old_capturer)
1270 old_capturer->OnHostLostWindowCapture(); 1269 old_capturer->OnHostLostWindowCapture();
1271 1270
1272 // If the pointer is already in |xwindow_|, we will not get a crossing event 1271 // If the pointer is already in |xwindow_|, we will not get a crossing event
1273 // with a mode of NotifyGrab, so we must record the grab state manually. 1272 // with a mode of NotifyGrab, so we must record the grab state manually.
1274 has_pointer_grab_ |= !GrabPointer(xwindow_, true, None); 1273 has_pointer_grab_ |= !GrabPointer(xwindow_, true, X11Constants::None);
1275 } 1274 }
1276 1275
1277 void DesktopWindowTreeHostX11::ReleaseCapture() { 1276 void DesktopWindowTreeHostX11::ReleaseCapture() {
1278 if (g_current_capture == this) { 1277 if (g_current_capture == this) {
1279 // Release mouse grab asynchronously. A window managed by Chrome is likely 1278 // Release mouse grab asynchronously. A window managed by Chrome is likely
1280 // the topmost window underneath the mouse so the capture release being 1279 // the topmost window underneath the mouse so the capture release being
1281 // asynchronous is likely inconsequential. 1280 // asynchronous is likely inconsequential.
1282 g_current_capture = NULL; 1281 g_current_capture = NULL;
1283 UngrabPointer(); 1282 UngrabPointer();
1284 has_pointer_grab_ = false; 1283 has_pointer_grab_ = false;
1285 1284
1286 OnHostLostWindowCapture(); 1285 OnHostLostWindowCapture();
1287 } 1286 }
1288 } 1287 }
1289 1288
1290 void DesktopWindowTreeHostX11::SetCursorNative(gfx::NativeCursor cursor) { 1289 void DesktopWindowTreeHostX11::SetCursorNative(gfx::NativeCursor cursor) {
1291 XDefineCursor(xdisplay_, xwindow_, cursor.platform()); 1290 XDefineCursor(xdisplay_, xwindow_, cursor.platform());
1292 } 1291 }
1293 1292
1294 void DesktopWindowTreeHostX11::MoveCursorToScreenLocationInPixels( 1293 void DesktopWindowTreeHostX11::MoveCursorToScreenLocationInPixels(
1295 const gfx::Point& location_in_pixels) { 1294 const gfx::Point& location_in_pixels) {
1296 XWarpPointer(xdisplay_, None, x_root_window_, 0, 0, 0, 0, 1295 XWarpPointer(xdisplay_, X11Constants::None, x_root_window_, 0, 0, 0, 0,
1297 bounds_in_pixels_.x() + location_in_pixels.x(), 1296 bounds_in_pixels_.x() + location_in_pixels.x(),
1298 bounds_in_pixels_.y() + location_in_pixels.y()); 1297 bounds_in_pixels_.y() + location_in_pixels.y());
1299 } 1298 }
1300 1299
1301 void DesktopWindowTreeHostX11::OnCursorVisibilityChangedNative(bool show) { 1300 void DesktopWindowTreeHostX11::OnCursorVisibilityChangedNative(bool show) {
1302 // TODO(erg): Conditional on us enabling touch on desktop linux builds, do 1301 // TODO(erg): Conditional on us enabling touch on desktop linux builds, do
1303 // the same tap-to-click disabling here that chromeos does. 1302 // the same tap-to-click disabling here that chromeos does.
1304 } 1303 }
1305 1304
1306 //////////////////////////////////////////////////////////////////////////////// 1305 ////////////////////////////////////////////////////////////////////////////////
(...skipping 19 matching lines...) Expand all
1326 void DesktopWindowTreeHostX11::OnMaximizedStateChanged() {} 1325 void DesktopWindowTreeHostX11::OnMaximizedStateChanged() {}
1327 1326
1328 //////////////////////////////////////////////////////////////////////////////// 1327 ////////////////////////////////////////////////////////////////////////////////
1329 // DesktopWindowTreeHostX11, private: 1328 // DesktopWindowTreeHostX11, private:
1330 1329
1331 void DesktopWindowTreeHostX11::InitX11Window( 1330 void DesktopWindowTreeHostX11::InitX11Window(
1332 const Widget::InitParams& params) { 1331 const Widget::InitParams& params) {
1333 unsigned long attribute_mask = CWBackPixmap | CWBitGravity; 1332 unsigned long attribute_mask = CWBackPixmap | CWBitGravity;
1334 XSetWindowAttributes swa; 1333 XSetWindowAttributes swa;
1335 memset(&swa, 0, sizeof(swa)); 1334 memset(&swa, 0, sizeof(swa));
1336 swa.background_pixmap = None; 1335 swa.background_pixmap = X11Constants::None;
1337 swa.bit_gravity = NorthWestGravity; 1336 swa.bit_gravity = NorthWestGravity;
1338 1337
1339 ::Atom window_type; 1338 ::Atom window_type;
1340 switch (params.type) { 1339 switch (params.type) {
1341 case Widget::InitParams::TYPE_MENU: 1340 case Widget::InitParams::TYPE_MENU:
1342 swa.override_redirect = True; 1341 swa.override_redirect = X11Constants::True;
1343 window_type = gfx::GetAtom("_NET_WM_WINDOW_TYPE_MENU"); 1342 window_type = gfx::GetAtom("_NET_WM_WINDOW_TYPE_MENU");
1344 break; 1343 break;
1345 case Widget::InitParams::TYPE_TOOLTIP: 1344 case Widget::InitParams::TYPE_TOOLTIP:
1346 swa.override_redirect = True; 1345 swa.override_redirect = X11Constants::True;
1347 window_type = gfx::GetAtom("_NET_WM_WINDOW_TYPE_TOOLTIP"); 1346 window_type = gfx::GetAtom("_NET_WM_WINDOW_TYPE_TOOLTIP");
1348 break; 1347 break;
1349 case Widget::InitParams::TYPE_POPUP: 1348 case Widget::InitParams::TYPE_POPUP:
1350 swa.override_redirect = True; 1349 swa.override_redirect = X11Constants::True;
1351 window_type = gfx::GetAtom("_NET_WM_WINDOW_TYPE_NOTIFICATION"); 1350 window_type = gfx::GetAtom("_NET_WM_WINDOW_TYPE_NOTIFICATION");
1352 break; 1351 break;
1353 case Widget::InitParams::TYPE_DRAG: 1352 case Widget::InitParams::TYPE_DRAG:
1354 swa.override_redirect = True; 1353 swa.override_redirect = X11Constants::True;
1355 window_type = gfx::GetAtom("_NET_WM_WINDOW_TYPE_DND"); 1354 window_type = gfx::GetAtom("_NET_WM_WINDOW_TYPE_DND");
1356 break; 1355 break;
1357 default: 1356 default:
1358 window_type = gfx::GetAtom("_NET_WM_WINDOW_TYPE_NORMAL"); 1357 window_type = gfx::GetAtom("_NET_WM_WINDOW_TYPE_NORMAL");
1359 break; 1358 break;
1360 } 1359 }
1361 // An in-activatable window should not interact with the system wm. 1360 // An in-activatable window should not interact with the system wm.
1362 if (!activatable_) 1361 if (!activatable_)
1363 swa.override_redirect = True; 1362 swa.override_redirect = X11Constants::True;
1364 1363
1365 if (swa.override_redirect) 1364 if (swa.override_redirect)
1366 attribute_mask |= CWOverrideRedirect; 1365 attribute_mask |= CWOverrideRedirect;
1367 1366
1368 bool enable_transparent_visuals; 1367 bool enable_transparent_visuals;
1369 switch (params.opacity) { 1368 switch (params.opacity) {
1370 case Widget::InitParams::OPAQUE_WINDOW: 1369 case Widget::InitParams::OPAQUE_WINDOW:
1371 enable_transparent_visuals = false; 1370 enable_transparent_visuals = false;
1372 break; 1371 break;
1373 case Widget::InitParams::TRANSLUCENT_WINDOW: 1372 case Widget::InitParams::TRANSLUCENT_WINDOW:
(...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after
1706 xclient.xclient.window = xwindow_; 1705 xclient.xclient.window = xwindow_;
1707 xclient.xclient.message_type = gfx::GetAtom("_NET_WM_STATE"); 1706 xclient.xclient.message_type = gfx::GetAtom("_NET_WM_STATE");
1708 xclient.xclient.format = 32; 1707 xclient.xclient.format = 32;
1709 xclient.xclient.data.l[0] = 1708 xclient.xclient.data.l[0] =
1710 enabled ? k_NET_WM_STATE_ADD : k_NET_WM_STATE_REMOVE; 1709 enabled ? k_NET_WM_STATE_ADD : k_NET_WM_STATE_REMOVE;
1711 xclient.xclient.data.l[1] = state1; 1710 xclient.xclient.data.l[1] = state1;
1712 xclient.xclient.data.l[2] = state2; 1711 xclient.xclient.data.l[2] = state2;
1713 xclient.xclient.data.l[3] = 1; 1712 xclient.xclient.data.l[3] = 1;
1714 xclient.xclient.data.l[4] = 0; 1713 xclient.xclient.data.l[4] = 0;
1715 1714
1716 XSendEvent(xdisplay_, x_root_window_, False, 1715 XSendEvent(xdisplay_, x_root_window_, X11Constants::False,
1717 SubstructureRedirectMask | SubstructureNotifyMask, 1716 SubstructureRedirectMask | SubstructureNotifyMask, &xclient);
1718 &xclient);
1719 } 1717 }
1720 1718
1721 bool DesktopWindowTreeHostX11::HasWMSpecProperty(const char* property) const { 1719 bool DesktopWindowTreeHostX11::HasWMSpecProperty(const char* property) const {
1722 return window_properties_.find(gfx::GetAtom(property)) != 1720 return window_properties_.find(gfx::GetAtom(property)) !=
1723 window_properties_.end(); 1721 window_properties_.end();
1724 } 1722 }
1725 1723
1726 void DesktopWindowTreeHostX11::SetUseNativeFrame(bool use_native_frame) { 1724 void DesktopWindowTreeHostX11::SetUseNativeFrame(bool use_native_frame) {
1727 use_native_frame_ = use_native_frame; 1725 use_native_frame_ = use_native_frame;
1728 ui::SetUseOSWindowFrame(xwindow_, use_native_frame); 1726 ui::SetUseOSWindowFrame(xwindow_, use_native_frame);
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
1826 } 1824 }
1827 } 1825 }
1828 1826
1829 // If we didn't set the shape for any reason, reset the shaping information. 1827 // If we didn't set the shape for any reason, reset the shaping information.
1830 // How this is done depends on the border style, due to quirks and bugs in 1828 // How this is done depends on the border style, due to quirks and bugs in
1831 // various window managers. 1829 // various window managers.
1832 if (ShouldUseNativeFrame()) { 1830 if (ShouldUseNativeFrame()) {
1833 // If the window has system borders, the mask must be set to null (not a 1831 // If the window has system borders, the mask must be set to null (not a
1834 // rectangle), because several window managers (eg, KDE, XFCE, XMonad) will 1832 // rectangle), because several window managers (eg, KDE, XFCE, XMonad) will
1835 // not put borders on a window with a custom shape. 1833 // not put borders on a window with a custom shape.
1836 XShapeCombineMask(xdisplay_, xwindow_, ShapeBounding, 0, 0, None, ShapeSet); 1834 XShapeCombineMask(xdisplay_, xwindow_, ShapeBounding, 0, 0,
1835 X11Constants::None, ShapeSet);
1837 } else { 1836 } else {
1838 // Conversely, if the window does not have system borders, the mask must be 1837 // Conversely, if the window does not have system borders, the mask must be
1839 // manually set to a rectangle that covers the whole window (not null). This 1838 // manually set to a rectangle that covers the whole window (not null). This
1840 // is due to a bug in KWin <= 4.11.5 (KDE bug #330573) where setting a null 1839 // is due to a bug in KWin <= 4.11.5 (KDE bug #330573) where setting a null
1841 // shape causes the hint to disable system borders to be ignored (resulting 1840 // shape causes the hint to disable system borders to be ignored (resulting
1842 // in a double border). 1841 // in a double border).
1843 XRectangle r = {0, 1842 XRectangle r = {0,
1844 0, 1843 0,
1845 static_cast<unsigned short>(bounds_in_pixels_.width()), 1844 static_cast<unsigned short>(bounds_in_pixels_.width()),
1846 static_cast<unsigned short>(bounds_in_pixels_.height())}; 1845 static_cast<unsigned short>(bounds_in_pixels_.height())};
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
2158 Atom message_type = xev->xclient.message_type; 2157 Atom message_type = xev->xclient.message_type;
2159 if (message_type == gfx::GetAtom("WM_PROTOCOLS")) { 2158 if (message_type == gfx::GetAtom("WM_PROTOCOLS")) {
2160 Atom protocol = static_cast<Atom>(xev->xclient.data.l[0]); 2159 Atom protocol = static_cast<Atom>(xev->xclient.data.l[0]);
2161 if (protocol == gfx::GetAtom("WM_DELETE_WINDOW")) { 2160 if (protocol == gfx::GetAtom("WM_DELETE_WINDOW")) {
2162 // We have received a close message from the window manager. 2161 // We have received a close message from the window manager.
2163 OnHostCloseRequested(); 2162 OnHostCloseRequested();
2164 } else if (protocol == gfx::GetAtom("_NET_WM_PING")) { 2163 } else if (protocol == gfx::GetAtom("_NET_WM_PING")) {
2165 XEvent reply_event = *xev; 2164 XEvent reply_event = *xev;
2166 reply_event.xclient.window = x_root_window_; 2165 reply_event.xclient.window = x_root_window_;
2167 2166
2168 XSendEvent(xdisplay_, 2167 XSendEvent(xdisplay_, reply_event.xclient.window, X11Constants::False,
2169 reply_event.xclient.window,
2170 False,
2171 SubstructureRedirectMask | SubstructureNotifyMask, 2168 SubstructureRedirectMask | SubstructureNotifyMask,
2172 &reply_event); 2169 &reply_event);
2173 } 2170 }
2174 } else if (message_type == gfx::GetAtom("XdndEnter")) { 2171 } else if (message_type == gfx::GetAtom("XdndEnter")) {
2175 drag_drop_client_->OnXdndEnter(xev->xclient); 2172 drag_drop_client_->OnXdndEnter(xev->xclient);
2176 } else if (message_type == gfx::GetAtom("XdndLeave")) { 2173 } else if (message_type == gfx::GetAtom("XdndLeave")) {
2177 drag_drop_client_->OnXdndLeave(xev->xclient); 2174 drag_drop_client_->OnXdndLeave(xev->xclient);
2178 } else if (message_type == gfx::GetAtom("XdndPosition")) { 2175 } else if (message_type == gfx::GetAtom("XdndPosition")) {
2179 drag_drop_client_->OnXdndPosition(xev->xclient); 2176 drag_drop_client_->OnXdndPosition(xev->xclient);
2180 } else if (message_type == gfx::GetAtom("XdndStatus")) { 2177 } else if (message_type == gfx::GetAtom("XdndStatus")) {
(...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after
2328 2325
2329 // static 2326 // static
2330 DesktopWindowTreeHost* DesktopWindowTreeHost::Create( 2327 DesktopWindowTreeHost* DesktopWindowTreeHost::Create(
2331 internal::NativeWidgetDelegate* native_widget_delegate, 2328 internal::NativeWidgetDelegate* native_widget_delegate,
2332 DesktopNativeWidgetAura* desktop_native_widget_aura) { 2329 DesktopNativeWidgetAura* desktop_native_widget_aura) {
2333 return new DesktopWindowTreeHostX11(native_widget_delegate, 2330 return new DesktopWindowTreeHostX11(native_widget_delegate,
2334 desktop_native_widget_aura); 2331 desktop_native_widget_aura);
2335 } 2332 }
2336 2333
2337 } // namespace views 2334 } // namespace views
OLDNEW
« no previous file with comments | « ui/base/x/x11_util_internal.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698