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 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
77 } | 77 } |
78 | 78 |
79 int DefaultX11IOErrorHandler(XDisplay* d) { | 79 int DefaultX11IOErrorHandler(XDisplay* d) { |
80 // If there's an IO error it likely means the X server has gone away | 80 // If there's an IO error it likely means the X server has gone away |
81 LOG(ERROR) << "X IO error received (X server probably went away)"; | 81 LOG(ERROR) << "X IO error received (X server probably went away)"; |
82 _exit(1); | 82 _exit(1); |
83 } | 83 } |
84 | 84 |
85 // Note: The caller should free the resulting value data. | 85 // Note: The caller should free the resulting value data. |
86 bool GetProperty(XID window, const std::string& property_name, long max_length, | 86 bool GetProperty(XID window, const std::string& property_name, long max_length, |
87 Atom* type, int* format, unsigned long* num_items, | 87 XAtom* type, int* format, unsigned long* num_items, |
88 unsigned char** property) { | 88 unsigned char** property) { |
89 Atom property_atom = GetAtom(property_name.c_str()); | 89 XAtom property_atom = GetAtom(property_name.c_str()); |
90 unsigned long remaining_bytes = 0; | 90 unsigned long remaining_bytes = 0; |
91 return XGetWindowProperty(gfx::GetXDisplay(), | 91 return XGetWindowProperty(gfx::GetXDisplay(), |
92 window, | 92 window, |
93 property_atom, | 93 property_atom, |
94 0, // offset into property data to read | 94 0, // offset into property data to read |
95 max_length, // max length to get | 95 max_length, // max length to get |
96 False, // deleted | 96 False, // deleted |
97 AnyPropertyType, | 97 AnyPropertyType, |
98 type, | 98 type, |
99 format, | 99 format, |
(...skipping 376 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
476 unsigned long status; | 476 unsigned long status; |
477 } MotifWmHints; | 477 } MotifWmHints; |
478 | 478 |
479 MotifWmHints motif_hints; | 479 MotifWmHints motif_hints; |
480 memset(&motif_hints, 0, sizeof(motif_hints)); | 480 memset(&motif_hints, 0, sizeof(motif_hints)); |
481 // Signals that the reader of the _MOTIF_WM_HINTS property should pay | 481 // Signals that the reader of the _MOTIF_WM_HINTS property should pay |
482 // attention to the value of |decorations|. | 482 // attention to the value of |decorations|. |
483 motif_hints.flags = (1L << 1); | 483 motif_hints.flags = (1L << 1); |
484 motif_hints.decorations = use_os_window_frame ? 1 : 0; | 484 motif_hints.decorations = use_os_window_frame ? 1 : 0; |
485 | 485 |
486 ::Atom hint_atom = GetAtom("_MOTIF_WM_HINTS"); | 486 XAtom hint_atom = GetAtom("_MOTIF_WM_HINTS"); |
487 XChangeProperty(gfx::GetXDisplay(), | 487 XChangeProperty(gfx::GetXDisplay(), |
488 window, | 488 window, |
489 hint_atom, | 489 hint_atom, |
490 hint_atom, | 490 hint_atom, |
491 32, | 491 32, |
492 PropModeReplace, | 492 PropModeReplace, |
493 reinterpret_cast<unsigned char*>(&motif_hints), | 493 reinterpret_cast<unsigned char*>(&motif_hints), |
494 sizeof(MotifWmHints)/sizeof(long)); | 494 sizeof(MotifWmHints)/sizeof(long)); |
495 } | 495 } |
496 | 496 |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
546 bool IsWindowVisible(XID window) { | 546 bool IsWindowVisible(XID window) { |
547 TRACE_EVENT0("ui", "IsWindowVisible"); | 547 TRACE_EVENT0("ui", "IsWindowVisible"); |
548 | 548 |
549 XWindowAttributes win_attributes; | 549 XWindowAttributes win_attributes; |
550 if (!XGetWindowAttributes(gfx::GetXDisplay(), window, &win_attributes)) | 550 if (!XGetWindowAttributes(gfx::GetXDisplay(), window, &win_attributes)) |
551 return false; | 551 return false; |
552 if (win_attributes.map_state != IsViewable) | 552 if (win_attributes.map_state != IsViewable) |
553 return false; | 553 return false; |
554 | 554 |
555 // Minimized windows are not visible. | 555 // Minimized windows are not visible. |
556 std::vector<Atom> wm_states; | 556 std::vector<XAtom> wm_states; |
557 if (GetAtomArrayProperty(window, "_NET_WM_STATE", &wm_states)) { | 557 if (GetAtomArrayProperty(window, "_NET_WM_STATE", &wm_states)) { |
558 Atom hidden_atom = GetAtom("_NET_WM_STATE_HIDDEN"); | 558 XAtom hidden_atom = GetAtom("_NET_WM_STATE_HIDDEN"); |
559 if (std::find(wm_states.begin(), wm_states.end(), hidden_atom) != | 559 if (std::find(wm_states.begin(), wm_states.end(), hidden_atom) != |
560 wm_states.end()) { | 560 wm_states.end()) { |
561 return false; | 561 return false; |
562 } | 562 } |
563 } | 563 } |
564 | 564 |
565 // Some compositing window managers (notably kwin) do not actually unmap | 565 // Some compositing window managers (notably kwin) do not actually unmap |
566 // windows on desktop switch, so we also must check the current desktop. | 566 // windows on desktop switch, so we also must check the current desktop. |
567 int window_desktop, current_desktop; | 567 int window_desktop, current_desktop; |
568 return (!GetWindowDesktop(window, &window_desktop) || | 568 return (!GetWindowDesktop(window, &window_desktop) || |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
656 } | 656 } |
657 XFree(shape_rects); | 657 XFree(shape_rects); |
658 if (!is_in_shape_rects) | 658 if (!is_in_shape_rects) |
659 return false; | 659 return false; |
660 } | 660 } |
661 return true; | 661 return true; |
662 } | 662 } |
663 | 663 |
664 | 664 |
665 bool PropertyExists(XID window, const std::string& property_name) { | 665 bool PropertyExists(XID window, const std::string& property_name) { |
666 Atom type = None; | 666 XAtom type = None; |
667 int format = 0; // size in bits of each item in 'property' | 667 int format = 0; // size in bits of each item in 'property' |
668 unsigned long num_items = 0; | 668 unsigned long num_items = 0; |
669 unsigned char* property = NULL; | 669 unsigned char* property = NULL; |
670 | 670 |
671 int result = GetProperty(window, property_name, 1, | 671 int result = GetProperty(window, property_name, 1, |
672 &type, &format, &num_items, &property); | 672 &type, &format, &num_items, &property); |
673 if (result != Success) | 673 if (result != Success) |
674 return false; | 674 return false; |
675 | 675 |
676 XFree(property); | 676 XFree(property); |
677 return num_items > 0; | 677 return num_items > 0; |
678 } | 678 } |
679 | 679 |
680 bool GetRawBytesOfProperty(XID window, | 680 bool GetRawBytesOfProperty(XID window, |
681 Atom property, | 681 XAtom property, |
682 scoped_refptr<base::RefCountedMemory>* out_data, | 682 scoped_refptr<base::RefCountedMemory>* out_data, |
683 size_t* out_data_items, | 683 size_t* out_data_items, |
684 Atom* out_type) { | 684 XAtom* out_type) { |
685 // Retrieve the data from our window. | 685 // Retrieve the data from our window. |
686 unsigned long nitems = 0; | 686 unsigned long nitems = 0; |
687 unsigned long nbytes = 0; | 687 unsigned long nbytes = 0; |
688 Atom prop_type = None; | 688 XAtom prop_type = None; |
689 int prop_format = 0; | 689 int prop_format = 0; |
690 unsigned char* property_data = NULL; | 690 unsigned char* property_data = NULL; |
691 if (XGetWindowProperty(gfx::GetXDisplay(), window, property, | 691 if (XGetWindowProperty(gfx::GetXDisplay(), window, property, |
692 0, 0x1FFFFFFF /* MAXINT32 / 4 */, False, | 692 0, 0x1FFFFFFF /* MAXINT32 / 4 */, False, |
693 AnyPropertyType, &prop_type, &prop_format, | 693 AnyPropertyType, &prop_type, &prop_format, |
694 &nitems, &nbytes, &property_data) != Success) { | 694 &nitems, &nbytes, &property_data) != Success) { |
695 return false; | 695 return false; |
696 } | 696 } |
697 | 697 |
698 if (prop_type == None) | 698 if (prop_type == None) |
(...skipping 26 matching lines...) Expand all Loading... |
725 if (out_data_items) | 725 if (out_data_items) |
726 *out_data_items = nitems; | 726 *out_data_items = nitems; |
727 | 727 |
728 if (out_type) | 728 if (out_type) |
729 *out_type = prop_type; | 729 *out_type = prop_type; |
730 | 730 |
731 return true; | 731 return true; |
732 } | 732 } |
733 | 733 |
734 bool GetIntProperty(XID window, const std::string& property_name, int* value) { | 734 bool GetIntProperty(XID window, const std::string& property_name, int* value) { |
735 Atom type = None; | 735 XAtom type = None; |
736 int format = 0; // size in bits of each item in 'property' | 736 int format = 0; // size in bits of each item in 'property' |
737 unsigned long num_items = 0; | 737 unsigned long num_items = 0; |
738 unsigned char* property = NULL; | 738 unsigned char* property = NULL; |
739 | 739 |
740 int result = GetProperty(window, property_name, 1, | 740 int result = GetProperty(window, property_name, 1, |
741 &type, &format, &num_items, &property); | 741 &type, &format, &num_items, &property); |
742 if (result != Success) | 742 if (result != Success) |
743 return false; | 743 return false; |
744 | 744 |
745 if (format != 32 || num_items != 1) { | 745 if (format != 32 || num_items != 1) { |
746 XFree(property); | 746 XFree(property); |
747 return false; | 747 return false; |
748 } | 748 } |
749 | 749 |
750 *value = static_cast<int>(*(reinterpret_cast<long*>(property))); | 750 *value = static_cast<int>(*(reinterpret_cast<long*>(property))); |
751 XFree(property); | 751 XFree(property); |
752 return true; | 752 return true; |
753 } | 753 } |
754 | 754 |
755 bool GetXIDProperty(XID window, const std::string& property_name, XID* value) { | 755 bool GetXIDProperty(XID window, const std::string& property_name, XID* value) { |
756 Atom type = None; | 756 XAtom type = None; |
757 int format = 0; // size in bits of each item in 'property' | 757 int format = 0; // size in bits of each item in 'property' |
758 unsigned long num_items = 0; | 758 unsigned long num_items = 0; |
759 unsigned char* property = NULL; | 759 unsigned char* property = NULL; |
760 | 760 |
761 int result = GetProperty(window, property_name, 1, | 761 int result = GetProperty(window, property_name, 1, |
762 &type, &format, &num_items, &property); | 762 &type, &format, &num_items, &property); |
763 if (result != Success) | 763 if (result != Success) |
764 return false; | 764 return false; |
765 | 765 |
766 if (format != 32 || num_items != 1) { | 766 if (format != 32 || num_items != 1) { |
767 XFree(property); | 767 XFree(property); |
768 return false; | 768 return false; |
769 } | 769 } |
770 | 770 |
771 *value = *(reinterpret_cast<XID*>(property)); | 771 *value = *(reinterpret_cast<XID*>(property)); |
772 XFree(property); | 772 XFree(property); |
773 return true; | 773 return true; |
774 } | 774 } |
775 | 775 |
776 bool GetIntArrayProperty(XID window, | 776 bool GetIntArrayProperty(XID window, |
777 const std::string& property_name, | 777 const std::string& property_name, |
778 std::vector<int>* value) { | 778 std::vector<int>* value) { |
779 Atom type = None; | 779 XAtom type = None; |
780 int format = 0; // size in bits of each item in 'property' | 780 int format = 0; // size in bits of each item in 'property' |
781 unsigned long num_items = 0; | 781 unsigned long num_items = 0; |
782 unsigned char* properties = NULL; | 782 unsigned char* properties = NULL; |
783 | 783 |
784 int result = GetProperty(window, property_name, | 784 int result = GetProperty(window, property_name, |
785 (~0L), // (all of them) | 785 (~0L), // (all of them) |
786 &type, &format, &num_items, &properties); | 786 &type, &format, &num_items, &properties); |
787 if (result != Success) | 787 if (result != Success) |
788 return false; | 788 return false; |
789 | 789 |
790 if (format != 32) { | 790 if (format != 32) { |
791 XFree(properties); | 791 XFree(properties); |
792 return false; | 792 return false; |
793 } | 793 } |
794 | 794 |
795 long* int_properties = reinterpret_cast<long*>(properties); | 795 long* int_properties = reinterpret_cast<long*>(properties); |
796 value->clear(); | 796 value->clear(); |
797 for (unsigned long i = 0; i < num_items; ++i) { | 797 for (unsigned long i = 0; i < num_items; ++i) { |
798 value->push_back(static_cast<int>(int_properties[i])); | 798 value->push_back(static_cast<int>(int_properties[i])); |
799 } | 799 } |
800 XFree(properties); | 800 XFree(properties); |
801 return true; | 801 return true; |
802 } | 802 } |
803 | 803 |
804 bool GetAtomArrayProperty(XID window, | 804 bool GetAtomArrayProperty(XID window, |
805 const std::string& property_name, | 805 const std::string& property_name, |
806 std::vector<Atom>* value) { | 806 std::vector<XAtom>* value) { |
807 Atom type = None; | 807 XAtom type = None; |
808 int format = 0; // size in bits of each item in 'property' | 808 int format = 0; // size in bits of each item in 'property' |
809 unsigned long num_items = 0; | 809 unsigned long num_items = 0; |
810 unsigned char* properties = NULL; | 810 unsigned char* properties = NULL; |
811 | 811 |
812 int result = GetProperty(window, property_name, | 812 int result = GetProperty(window, property_name, |
813 (~0L), // (all of them) | 813 (~0L), // (all of them) |
814 &type, &format, &num_items, &properties); | 814 &type, &format, &num_items, &properties); |
815 if (result != Success) | 815 if (result != Success) |
816 return false; | 816 return false; |
817 | 817 |
818 if (type != XA_ATOM) { | 818 if (type != XA_ATOM) { |
819 XFree(properties); | 819 XFree(properties); |
820 return false; | 820 return false; |
821 } | 821 } |
822 | 822 |
823 Atom* atom_properties = reinterpret_cast<Atom*>(properties); | 823 XAtom* atom_properties = reinterpret_cast<XAtom*>(properties); |
824 value->clear(); | 824 value->clear(); |
825 value->insert(value->begin(), atom_properties, atom_properties + num_items); | 825 value->insert(value->begin(), atom_properties, atom_properties + num_items); |
826 XFree(properties); | 826 XFree(properties); |
827 return true; | 827 return true; |
828 } | 828 } |
829 | 829 |
830 bool GetStringProperty( | 830 bool GetStringProperty( |
831 XID window, const std::string& property_name, std::string* value) { | 831 XID window, const std::string& property_name, std::string* value) { |
832 Atom type = None; | 832 XAtom type = None; |
833 int format = 0; // size in bits of each item in 'property' | 833 int format = 0; // size in bits of each item in 'property' |
834 unsigned long num_items = 0; | 834 unsigned long num_items = 0; |
835 unsigned char* property = NULL; | 835 unsigned char* property = NULL; |
836 | 836 |
837 int result = GetProperty(window, property_name, 1024, | 837 int result = GetProperty(window, property_name, 1024, |
838 &type, &format, &num_items, &property); | 838 &type, &format, &num_items, &property); |
839 if (result != Success) | 839 if (result != Success) |
840 return false; | 840 return false; |
841 | 841 |
842 if (format != 8) { | 842 if (format != 8) { |
(...skipping 12 matching lines...) Expand all Loading... |
855 int value) { | 855 int value) { |
856 std::vector<int> values(1, value); | 856 std::vector<int> values(1, value); |
857 return SetIntArrayProperty(window, name, type, values); | 857 return SetIntArrayProperty(window, name, type, values); |
858 } | 858 } |
859 | 859 |
860 bool SetIntArrayProperty(XID window, | 860 bool SetIntArrayProperty(XID window, |
861 const std::string& name, | 861 const std::string& name, |
862 const std::string& type, | 862 const std::string& type, |
863 const std::vector<int>& value) { | 863 const std::vector<int>& value) { |
864 DCHECK(!value.empty()); | 864 DCHECK(!value.empty()); |
865 Atom name_atom = GetAtom(name.c_str()); | 865 XAtom name_atom = GetAtom(name.c_str()); |
866 Atom type_atom = GetAtom(type.c_str()); | 866 XAtom type_atom = GetAtom(type.c_str()); |
867 | 867 |
868 // XChangeProperty() expects values of type 32 to be longs. | 868 // XChangeProperty() expects values of type 32 to be longs. |
869 scoped_ptr<long[]> data(new long[value.size()]); | 869 scoped_ptr<long[]> data(new long[value.size()]); |
870 for (size_t i = 0; i < value.size(); ++i) | 870 for (size_t i = 0; i < value.size(); ++i) |
871 data[i] = value[i]; | 871 data[i] = value[i]; |
872 | 872 |
873 gfx::X11ErrorTracker err_tracker; | 873 gfx::X11ErrorTracker err_tracker; |
874 XChangeProperty(gfx::GetXDisplay(), | 874 XChangeProperty(gfx::GetXDisplay(), |
875 window, | 875 window, |
876 name_atom, | 876 name_atom, |
877 type_atom, | 877 type_atom, |
878 32, // size in bits of items in 'value' | 878 32, // size in bits of items in 'value' |
879 PropModeReplace, | 879 PropModeReplace, |
880 reinterpret_cast<const unsigned char*>(data.get()), | 880 reinterpret_cast<const unsigned char*>(data.get()), |
881 value.size()); // num items | 881 value.size()); // num items |
882 return !err_tracker.FoundNewError(); | 882 return !err_tracker.FoundNewError(); |
883 } | 883 } |
884 | 884 |
885 bool SetAtomProperty(XID window, | 885 bool SetAtomProperty(XID window, |
886 const std::string& name, | 886 const std::string& name, |
887 const std::string& type, | 887 const std::string& type, |
888 Atom value) { | 888 XAtom value) { |
889 std::vector<Atom> values(1, value); | 889 std::vector<XAtom> values(1, value); |
890 return SetAtomArrayProperty(window, name, type, values); | 890 return SetAtomArrayProperty(window, name, type, values); |
891 } | 891 } |
892 | 892 |
893 bool SetAtomArrayProperty(XID window, | 893 bool SetAtomArrayProperty(XID window, |
894 const std::string& name, | 894 const std::string& name, |
895 const std::string& type, | 895 const std::string& type, |
896 const std::vector<Atom>& value) { | 896 const std::vector<XAtom>& value) { |
897 DCHECK(!value.empty()); | 897 DCHECK(!value.empty()); |
898 Atom name_atom = GetAtom(name.c_str()); | 898 XAtom name_atom = GetAtom(name.c_str()); |
899 Atom type_atom = GetAtom(type.c_str()); | 899 XAtom type_atom = GetAtom(type.c_str()); |
900 | 900 |
901 // XChangeProperty() expects values of type 32 to be longs. | 901 // XChangeProperty() expects values of type 32 to be longs. |
902 scoped_ptr<Atom[]> data(new Atom[value.size()]); | 902 scoped_ptr<XAtom[]> data(new XAtom[value.size()]); |
903 for (size_t i = 0; i < value.size(); ++i) | 903 for (size_t i = 0; i < value.size(); ++i) |
904 data[i] = value[i]; | 904 data[i] = value[i]; |
905 | 905 |
906 gfx::X11ErrorTracker err_tracker; | 906 gfx::X11ErrorTracker err_tracker; |
907 XChangeProperty(gfx::GetXDisplay(), | 907 XChangeProperty(gfx::GetXDisplay(), |
908 window, | 908 window, |
909 name_atom, | 909 name_atom, |
910 type_atom, | 910 type_atom, |
911 32, // size in bits of items in 'value' | 911 32, // size in bits of items in 'value' |
912 PropModeReplace, | 912 PropModeReplace, |
913 reinterpret_cast<const unsigned char*>(data.get()), | 913 reinterpret_cast<const unsigned char*>(data.get()), |
914 value.size()); // num items | 914 value.size()); // num items |
915 return !err_tracker.FoundNewError(); | 915 return !err_tracker.FoundNewError(); |
916 } | 916 } |
917 | 917 |
918 bool SetStringProperty(XID window, | 918 bool SetStringProperty(XID window, |
919 Atom property, | 919 XAtom property, |
920 Atom type, | 920 XAtom type, |
921 const std::string& value) { | 921 const std::string& value) { |
922 gfx::X11ErrorTracker err_tracker; | 922 gfx::X11ErrorTracker err_tracker; |
923 XChangeProperty(gfx::GetXDisplay(), | 923 XChangeProperty(gfx::GetXDisplay(), |
924 window, | 924 window, |
925 property, | 925 property, |
926 type, | 926 type, |
927 8, | 927 8, |
928 PropModeReplace, | 928 PropModeReplace, |
929 reinterpret_cast<const unsigned char*>(value.c_str()), | 929 reinterpret_cast<const unsigned char*>(value.c_str()), |
930 value.size()); | 930 value.size()); |
931 return !err_tracker.FoundNewError(); | 931 return !err_tracker.FoundNewError(); |
932 } | 932 } |
933 | 933 |
934 Atom GetAtom(const char* name) { | 934 XAtom GetAtom(const char* name) { |
935 // TODO(derat): Cache atoms to avoid round-trips to the server. | 935 // TODO(derat): Cache atoms to avoid round-trips to the server. |
936 return XInternAtom(gfx::GetXDisplay(), name, false); | 936 return XInternAtom(gfx::GetXDisplay(), name, false); |
937 } | 937 } |
938 | 938 |
939 void SetWindowClassHint(XDisplay* display, | 939 void SetWindowClassHint(XDisplay* display, |
940 XID window, | 940 XID window, |
941 const std::string& res_name, | 941 const std::string& res_name, |
942 const std::string& res_class) { | 942 const std::string& res_class) { |
943 XClassHint class_hints; | 943 XClassHint class_hints; |
944 // const_cast is safe because XSetClassHint does not modify the strings. | 944 // const_cast is safe because XSetClassHint does not modify the strings. |
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1220 } | 1220 } |
1221 | 1221 |
1222 void SetDefaultX11ErrorHandlers() { | 1222 void SetDefaultX11ErrorHandlers() { |
1223 SetX11ErrorHandlers(NULL, NULL); | 1223 SetX11ErrorHandlers(NULL, NULL); |
1224 } | 1224 } |
1225 | 1225 |
1226 bool IsX11WindowFullScreen(XID window) { | 1226 bool IsX11WindowFullScreen(XID window) { |
1227 // If _NET_WM_STATE_FULLSCREEN is in _NET_SUPPORTED, use the presence or | 1227 // If _NET_WM_STATE_FULLSCREEN is in _NET_SUPPORTED, use the presence or |
1228 // absence of _NET_WM_STATE_FULLSCREEN in _NET_WM_STATE to determine | 1228 // absence of _NET_WM_STATE_FULLSCREEN in _NET_WM_STATE to determine |
1229 // whether we're fullscreen. | 1229 // whether we're fullscreen. |
1230 Atom fullscreen_atom = GetAtom("_NET_WM_STATE_FULLSCREEN"); | 1230 XAtom fullscreen_atom = GetAtom("_NET_WM_STATE_FULLSCREEN"); |
1231 if (WmSupportsHint(fullscreen_atom)) { | 1231 if (WmSupportsHint(fullscreen_atom)) { |
1232 std::vector<Atom> atom_properties; | 1232 std::vector<XAtom> atom_properties; |
1233 if (GetAtomArrayProperty(window, | 1233 if (GetAtomArrayProperty(window, |
1234 "_NET_WM_STATE", | 1234 "_NET_WM_STATE", |
1235 &atom_properties)) { | 1235 &atom_properties)) { |
1236 return std::find(atom_properties.begin(), | 1236 return std::find(atom_properties.begin(), |
1237 atom_properties.end(), | 1237 atom_properties.end(), |
1238 fullscreen_atom) != | 1238 fullscreen_atom) != |
1239 atom_properties.end(); | 1239 atom_properties.end(); |
1240 } | 1240 } |
1241 } | 1241 } |
1242 | 1242 |
1243 gfx::Rect window_rect; | 1243 gfx::Rect window_rect; |
1244 if (!ui::GetWindowRect(window, &window_rect)) | 1244 if (!ui::GetWindowRect(window, &window_rect)) |
1245 return false; | 1245 return false; |
1246 | 1246 |
1247 // We can't use gfx::Screen here because we don't have an aura::Window. So | 1247 // We can't use gfx::Screen here because we don't have an aura::Window. So |
1248 // instead just look at the size of the default display. | 1248 // instead just look at the size of the default display. |
1249 // | 1249 // |
1250 // TODO(erg): Actually doing this correctly would require pulling out xrandr, | 1250 // TODO(erg): Actually doing this correctly would require pulling out xrandr, |
1251 // which we don't even do in the desktop screen yet. | 1251 // which we don't even do in the desktop screen yet. |
1252 ::XDisplay* display = gfx::GetXDisplay(); | 1252 ::XDisplay* display = gfx::GetXDisplay(); |
1253 ::Screen* screen = DefaultScreenOfDisplay(display); | 1253 ::Screen* screen = DefaultScreenOfDisplay(display); |
1254 int width = WidthOfScreen(screen); | 1254 int width = WidthOfScreen(screen); |
1255 int height = HeightOfScreen(screen); | 1255 int height = HeightOfScreen(screen); |
1256 return window_rect.size() == gfx::Size(width, height); | 1256 return window_rect.size() == gfx::Size(width, height); |
1257 } | 1257 } |
1258 | 1258 |
1259 bool WmSupportsHint(Atom atom) { | 1259 bool WmSupportsHint(XAtom atom) { |
1260 std::vector<Atom> supported_atoms; | 1260 std::vector<XAtom> supported_atoms; |
1261 if (!GetAtomArrayProperty(GetX11RootWindow(), | 1261 if (!GetAtomArrayProperty(GetX11RootWindow(), |
1262 "_NET_SUPPORTED", | 1262 "_NET_SUPPORTED", |
1263 &supported_atoms)) { | 1263 &supported_atoms)) { |
1264 return false; | 1264 return false; |
1265 } | 1265 } |
1266 | 1266 |
1267 return std::find(supported_atoms.begin(), supported_atoms.end(), atom) != | 1267 return std::find(supported_atoms.begin(), supported_atoms.end(), atom) != |
1268 supported_atoms.end(); | 1268 supported_atoms.end(); |
1269 } | 1269 } |
1270 | 1270 |
(...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1413 << "request_code " << static_cast<int>(error_event.request_code) << ", " | 1413 << "request_code " << static_cast<int>(error_event.request_code) << ", " |
1414 << "minor_code " << static_cast<int>(error_event.minor_code) | 1414 << "minor_code " << static_cast<int>(error_event.minor_code) |
1415 << " (" << request_str << ")"; | 1415 << " (" << request_str << ")"; |
1416 } | 1416 } |
1417 | 1417 |
1418 // ---------------------------------------------------------------------------- | 1418 // ---------------------------------------------------------------------------- |
1419 // End of x11_util_internal.h | 1419 // End of x11_util_internal.h |
1420 | 1420 |
1421 | 1421 |
1422 } // namespace ui | 1422 } // namespace ui |
OLD | NEW |