| OLD | NEW |
| 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 // This file defines utility functions for X11 (Linux only). This code has been | 5 // This file defines utility functions for X11 (Linux only). This code has been |
| 6 // ported from XCB since we can't use XCB on Ubuntu while its 32-bit support | 6 // ported from XCB since we can't use XCB on Ubuntu while its 32-bit support |
| 7 // remains woefully incomplete. | 7 // remains woefully incomplete. |
| 8 | 8 |
| 9 #include "ui/base/x/x11_util.h" | 9 #include "ui/base/x/x11_util.h" |
| 10 | 10 |
| (...skipping 637 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 648 | 648 |
| 649 if (!IsShapeAvailable()) | 649 if (!IsShapeAvailable()) |
| 650 return true; | 650 return true; |
| 651 | 651 |
| 652 // According to http://www.x.org/releases/X11R7.6/doc/libXext/shapelib.html, | 652 // According to http://www.x.org/releases/X11R7.6/doc/libXext/shapelib.html, |
| 653 // if an X display supports the shape extension the bounds of a window are | 653 // if an X display supports the shape extension the bounds of a window are |
| 654 // defined as the intersection of the window bounds and the interior | 654 // defined as the intersection of the window bounds and the interior |
| 655 // rectangles. This means to determine if a point is inside a window for the | 655 // rectangles. This means to determine if a point is inside a window for the |
| 656 // purpose of input handling we have to check the rectangles in the ShapeInput | 656 // purpose of input handling we have to check the rectangles in the ShapeInput |
| 657 // list. | 657 // list. |
| 658 int dummy; | 658 // According to http://www.x.org/releases/current/doc/xextproto/shape.html, |
| 659 int input_rects_size = 0; | 659 // we need to also respect the ShapeBounding rectangles. |
| 660 XRectangle* input_rects = XShapeGetRectangles( | 660 // The effective input region of a window is defined to be the intersection |
| 661 gfx::GetXDisplay(), window, ShapeInput, &input_rects_size, &dummy); | 661 // of the client input region with both the default input region and the |
| 662 if (!input_rects) | 662 // client bounding region. Any portion of the client input region that is not |
| 663 return true; | 663 // included in both the default input region and the client bounding region |
| 664 bool is_in_input_rects = false; | 664 // will not be included in the effective input region on the screen. |
| 665 for (int i = 0; i < input_rects_size; ++i) { | 665 int rectangle_kind[] = {ShapeInput, ShapeBounding}; |
| 666 // The ShapeInput rects appear to be in window space, so we have to | 666 for (size_t kind_index = 0; |
| 667 // translate by the window_rect's offset to map to screen space. | 667 kind_index < arraysize(rectangle_kind); |
| 668 gfx::Rect input_rect = | 668 kind_index++) { |
| 669 gfx::Rect(input_rects[i].x + window_rect.x(), | 669 int dummy; |
| 670 input_rects[i].y + window_rect.y(), | 670 int shape_rects_size = 0; |
| 671 input_rects[i].width, input_rects[i].height); | 671 XRectangle* shape_rects = XShapeGetRectangles(gfx::GetXDisplay(), |
| 672 if (input_rect.Contains(screen_loc)) { | 672 window, |
| 673 is_in_input_rects = true; | 673 rectangle_kind[kind_index], |
| 674 break; | 674 &shape_rects_size, |
| 675 &dummy); |
| 676 if (!shape_rects) |
| 677 continue; |
| 678 bool is_in_shape_rects = false; |
| 679 for (int i = 0; i < shape_rects_size; ++i) { |
| 680 // The ShapeInput and ShapeBounding rects are to be in window space, so we |
| 681 // have to translate by the window_rect's offset to map to screen space. |
| 682 gfx::Rect shape_rect = |
| 683 gfx::Rect(shape_rects[i].x + window_rect.x(), |
| 684 shape_rects[i].y + window_rect.y(), |
| 685 shape_rects[i].width, shape_rects[i].height); |
| 686 if (shape_rect.Contains(screen_loc)) { |
| 687 is_in_shape_rects = true; |
| 688 break; |
| 689 } |
| 675 } | 690 } |
| 691 XFree(shape_rects); |
| 692 if (!is_in_shape_rects) |
| 693 return false; |
| 676 } | 694 } |
| 677 XFree(input_rects); | 695 return true; |
| 678 return is_in_input_rects; | |
| 679 } | 696 } |
| 680 | 697 |
| 681 | 698 |
| 682 bool PropertyExists(XID window, const std::string& property_name) { | 699 bool PropertyExists(XID window, const std::string& property_name) { |
| 683 Atom type = None; | 700 Atom type = None; |
| 684 int format = 0; // size in bits of each item in 'property' | 701 int format = 0; // size in bits of each item in 'property' |
| 685 unsigned long num_items = 0; | 702 unsigned long num_items = 0; |
| 686 unsigned char* property = NULL; | 703 unsigned char* property = NULL; |
| 687 | 704 |
| 688 int result = GetProperty(window, property_name, 1, | 705 int result = GetProperty(window, property_name, 1, |
| (...skipping 844 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1533 << "request_code " << static_cast<int>(error_event.request_code) << ", " | 1550 << "request_code " << static_cast<int>(error_event.request_code) << ", " |
| 1534 << "minor_code " << static_cast<int>(error_event.minor_code) | 1551 << "minor_code " << static_cast<int>(error_event.minor_code) |
| 1535 << " (" << request_str << ")"; | 1552 << " (" << request_str << ")"; |
| 1536 } | 1553 } |
| 1537 | 1554 |
| 1538 // ---------------------------------------------------------------------------- | 1555 // ---------------------------------------------------------------------------- |
| 1539 // End of x11_util_internal.h | 1556 // End of x11_util_internal.h |
| 1540 | 1557 |
| 1541 | 1558 |
| 1542 } // namespace ui | 1559 } // namespace ui |
| OLD | NEW |