| 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 687 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 698 // of the client input region with both the default input region and the | 698 // of the client input region with both the default input region and the |
| 699 // client bounding region. Any portion of the client input region that is not | 699 // client bounding region. Any portion of the client input region that is not |
| 700 // included in both the default input region and the client bounding region | 700 // included in both the default input region and the client bounding region |
| 701 // will not be included in the effective input region on the screen. | 701 // will not be included in the effective input region on the screen. |
| 702 int rectangle_kind[] = {ShapeInput, ShapeBounding}; | 702 int rectangle_kind[] = {ShapeInput, ShapeBounding}; |
| 703 for (size_t kind_index = 0; | 703 for (size_t kind_index = 0; |
| 704 kind_index < arraysize(rectangle_kind); | 704 kind_index < arraysize(rectangle_kind); |
| 705 kind_index++) { | 705 kind_index++) { |
| 706 int dummy; | 706 int dummy; |
| 707 int shape_rects_size = 0; | 707 int shape_rects_size = 0; |
| 708 XRectangle* shape_rects = XShapeGetRectangles(gfx::GetXDisplay(), | 708 gfx::XScopedPtr<XRectangle[]> shape_rects(XShapeGetRectangles( |
| 709 window, | 709 gfx::GetXDisplay(), window, rectangle_kind[kind_index], |
| 710 rectangle_kind[kind_index], | 710 &shape_rects_size, &dummy)); |
| 711 &shape_rects_size, | |
| 712 &dummy); | |
| 713 if (!shape_rects) { | 711 if (!shape_rects) { |
| 714 // The shape is empty. This can occur when |window| is minimized. | 712 // The shape is empty. This can occur when |window| is minimized. |
| 715 DCHECK_EQ(0, shape_rects_size); | 713 DCHECK_EQ(0, shape_rects_size); |
| 716 return false; | 714 return false; |
| 717 } | 715 } |
| 718 bool is_in_shape_rects = false; | 716 bool is_in_shape_rects = false; |
| 719 for (int i = 0; i < shape_rects_size; ++i) { | 717 for (int i = 0; i < shape_rects_size; ++i) { |
| 720 // The ShapeInput and ShapeBounding rects are to be in window space, so we | 718 // The ShapeInput and ShapeBounding rects are to be in window space, so we |
| 721 // have to translate by the window_rect's offset to map to screen space. | 719 // have to translate by the window_rect's offset to map to screen space. |
| 720 const XRectangle& rect = shape_rects[i]; |
| 722 gfx::Rect shape_rect = | 721 gfx::Rect shape_rect = |
| 723 gfx::Rect(shape_rects[i].x + window_rect.x(), | 722 gfx::Rect(rect.x + window_rect.x(), rect.y + window_rect.y(), |
| 724 shape_rects[i].y + window_rect.y(), | 723 rect.width, rect.height); |
| 725 shape_rects[i].width, shape_rects[i].height); | |
| 726 if (shape_rect.Contains(screen_loc)) { | 724 if (shape_rect.Contains(screen_loc)) { |
| 727 is_in_shape_rects = true; | 725 is_in_shape_rects = true; |
| 728 break; | 726 break; |
| 729 } | 727 } |
| 730 } | 728 } |
| 731 XFree(shape_rects); | |
| 732 if (!is_in_shape_rects) | 729 if (!is_in_shape_rects) |
| 733 return false; | 730 return false; |
| 734 } | 731 } |
| 735 return true; | 732 return true; |
| 736 } | 733 } |
| 737 | 734 |
| 738 | 735 |
| 739 bool PropertyExists(XID window, const std::string& property_name) { | 736 bool PropertyExists(XID window, const std::string& property_name) { |
| 740 XAtom type = None; | 737 XAtom type = None; |
| 741 int format = 0; // size in bits of each item in 'property' | 738 int format = 0; // size in bits of each item in 'property' |
| 742 unsigned long num_items = 0; | 739 unsigned long num_items = 0; |
| 743 unsigned char* property = NULL; | 740 unsigned char* property = NULL; |
| 744 | 741 |
| 745 int result = GetProperty(window, property_name, 1, | 742 int result = GetProperty(window, property_name, 1, |
| 746 &type, &format, &num_items, &property); | 743 &type, &format, &num_items, &property); |
| 744 gfx::XScopedPtr<unsigned char> scoped_property(property); |
| 747 if (result != Success) | 745 if (result != Success) |
| 748 return false; | 746 return false; |
| 749 | 747 |
| 750 XFree(property); | |
| 751 return num_items > 0; | 748 return num_items > 0; |
| 752 } | 749 } |
| 753 | 750 |
| 754 bool GetRawBytesOfProperty(XID window, | 751 bool GetRawBytesOfProperty(XID window, |
| 755 XAtom property, | 752 XAtom property, |
| 756 scoped_refptr<base::RefCountedMemory>* out_data, | 753 scoped_refptr<base::RefCountedMemory>* out_data, |
| 757 size_t* out_data_items, | 754 size_t* out_data_items, |
| 758 XAtom* out_type) { | 755 XAtom* out_type) { |
| 759 // Retrieve the data from our window. | 756 // Retrieve the data from our window. |
| 760 unsigned long nitems = 0; | 757 unsigned long nitems = 0; |
| 761 unsigned long nbytes = 0; | 758 unsigned long nbytes = 0; |
| 762 XAtom prop_type = None; | 759 XAtom prop_type = None; |
| 763 int prop_format = 0; | 760 int prop_format = 0; |
| 764 unsigned char* property_data = NULL; | 761 unsigned char* property_data = NULL; |
| 765 if (XGetWindowProperty(gfx::GetXDisplay(), window, property, | 762 if (XGetWindowProperty(gfx::GetXDisplay(), window, property, |
| 766 0, 0x1FFFFFFF /* MAXINT32 / 4 */, False, | 763 0, 0x1FFFFFFF /* MAXINT32 / 4 */, False, |
| 767 AnyPropertyType, &prop_type, &prop_format, | 764 AnyPropertyType, &prop_type, &prop_format, |
| 768 &nitems, &nbytes, &property_data) != Success) { | 765 &nitems, &nbytes, &property_data) != Success) { |
| 769 return false; | 766 return false; |
| 770 } | 767 } |
| 768 gfx::XScopedPtr<unsigned char> scoped_property(property_data); |
| 771 | 769 |
| 772 if (prop_type == None) | 770 if (prop_type == None) |
| 773 return false; | 771 return false; |
| 774 | 772 |
| 775 size_t bytes = 0; | 773 size_t bytes = 0; |
| 776 // So even though we should theoretically have nbytes (and we can't | 774 // So even though we should theoretically have nbytes (and we can't |
| 777 // pass NULL there), we need to manually calculate the byte length here | 775 // pass NULL there), we need to manually calculate the byte length here |
| 778 // because nbytes always returns zero. | 776 // because nbytes always returns zero. |
| 779 switch (prop_format) { | 777 switch (prop_format) { |
| 780 case 8: | 778 case 8: |
| 781 bytes = nitems; | 779 bytes = nitems; |
| 782 break; | 780 break; |
| 783 case 16: | 781 case 16: |
| 784 bytes = sizeof(short) * nitems; | 782 bytes = sizeof(short) * nitems; |
| 785 break; | 783 break; |
| 786 case 32: | 784 case 32: |
| 787 bytes = sizeof(long) * nitems; | 785 bytes = sizeof(long) * nitems; |
| 788 break; | 786 break; |
| 789 default: | 787 default: |
| 790 NOTREACHED(); | 788 NOTREACHED(); |
| 791 break; | 789 break; |
| 792 } | 790 } |
| 793 | 791 |
| 794 if (out_data) | 792 if (out_data) |
| 795 *out_data = new XRefcountedMemory(property_data, bytes); | 793 *out_data = new XRefcountedMemory(scoped_property.release(), bytes); |
| 796 else | |
| 797 XFree(property_data); | |
| 798 | 794 |
| 799 if (out_data_items) | 795 if (out_data_items) |
| 800 *out_data_items = nitems; | 796 *out_data_items = nitems; |
| 801 | 797 |
| 802 if (out_type) | 798 if (out_type) |
| 803 *out_type = prop_type; | 799 *out_type = prop_type; |
| 804 | 800 |
| 805 return true; | 801 return true; |
| 806 } | 802 } |
| 807 | 803 |
| 808 bool GetIntProperty(XID window, const std::string& property_name, int* value) { | 804 bool GetIntProperty(XID window, const std::string& property_name, int* value) { |
| 809 XAtom type = None; | 805 XAtom type = None; |
| 810 int format = 0; // size in bits of each item in 'property' | 806 int format = 0; // size in bits of each item in 'property' |
| 811 unsigned long num_items = 0; | 807 unsigned long num_items = 0; |
| 812 unsigned char* property = NULL; | 808 unsigned char* property = NULL; |
| 813 | 809 |
| 814 int result = GetProperty(window, property_name, 1, | 810 int result = GetProperty(window, property_name, 1, |
| 815 &type, &format, &num_items, &property); | 811 &type, &format, &num_items, &property); |
| 812 gfx::XScopedPtr<unsigned char> scoped_property(property); |
| 816 if (result != Success) | 813 if (result != Success) |
| 817 return false; | 814 return false; |
| 818 | 815 |
| 819 if (format != 32 || num_items != 1) { | 816 if (format != 32 || num_items != 1) |
| 820 XFree(property); | |
| 821 return false; | 817 return false; |
| 822 } | |
| 823 | 818 |
| 824 *value = static_cast<int>(*(reinterpret_cast<long*>(property))); | 819 *value = static_cast<int>(*(reinterpret_cast<long*>(property))); |
| 825 XFree(property); | |
| 826 return true; | 820 return true; |
| 827 } | 821 } |
| 828 | 822 |
| 829 bool GetXIDProperty(XID window, const std::string& property_name, XID* value) { | 823 bool GetXIDProperty(XID window, const std::string& property_name, XID* value) { |
| 830 XAtom type = None; | 824 XAtom type = None; |
| 831 int format = 0; // size in bits of each item in 'property' | 825 int format = 0; // size in bits of each item in 'property' |
| 832 unsigned long num_items = 0; | 826 unsigned long num_items = 0; |
| 833 unsigned char* property = NULL; | 827 unsigned char* property = NULL; |
| 834 | 828 |
| 835 int result = GetProperty(window, property_name, 1, | 829 int result = GetProperty(window, property_name, 1, |
| 836 &type, &format, &num_items, &property); | 830 &type, &format, &num_items, &property); |
| 831 gfx::XScopedPtr<unsigned char> scoped_property(property); |
| 837 if (result != Success) | 832 if (result != Success) |
| 838 return false; | 833 return false; |
| 839 | 834 |
| 840 if (format != 32 || num_items != 1) { | 835 if (format != 32 || num_items != 1) |
| 841 XFree(property); | |
| 842 return false; | 836 return false; |
| 843 } | |
| 844 | 837 |
| 845 *value = *(reinterpret_cast<XID*>(property)); | 838 *value = *(reinterpret_cast<XID*>(property)); |
| 846 XFree(property); | |
| 847 return true; | 839 return true; |
| 848 } | 840 } |
| 849 | 841 |
| 850 bool GetIntArrayProperty(XID window, | 842 bool GetIntArrayProperty(XID window, |
| 851 const std::string& property_name, | 843 const std::string& property_name, |
| 852 std::vector<int>* value) { | 844 std::vector<int>* value) { |
| 853 XAtom type = None; | 845 XAtom type = None; |
| 854 int format = 0; // size in bits of each item in 'property' | 846 int format = 0; // size in bits of each item in 'property' |
| 855 unsigned long num_items = 0; | 847 unsigned long num_items = 0; |
| 856 unsigned char* properties = NULL; | 848 unsigned char* properties = NULL; |
| 857 | 849 |
| 858 int result = GetProperty(window, property_name, | 850 int result = GetProperty(window, property_name, |
| 859 (~0L), // (all of them) | 851 (~0L), // (all of them) |
| 860 &type, &format, &num_items, &properties); | 852 &type, &format, &num_items, &properties); |
| 853 gfx::XScopedPtr<unsigned char> scoped_properties(properties); |
| 861 if (result != Success) | 854 if (result != Success) |
| 862 return false; | 855 return false; |
| 863 | 856 |
| 864 if (format != 32) { | 857 if (format != 32) |
| 865 XFree(properties); | |
| 866 return false; | 858 return false; |
| 867 } | |
| 868 | 859 |
| 869 long* int_properties = reinterpret_cast<long*>(properties); | 860 long* int_properties = reinterpret_cast<long*>(properties); |
| 870 value->clear(); | 861 value->clear(); |
| 871 for (unsigned long i = 0; i < num_items; ++i) { | 862 for (unsigned long i = 0; i < num_items; ++i) { |
| 872 value->push_back(static_cast<int>(int_properties[i])); | 863 value->push_back(static_cast<int>(int_properties[i])); |
| 873 } | 864 } |
| 874 XFree(properties); | |
| 875 return true; | 865 return true; |
| 876 } | 866 } |
| 877 | 867 |
| 878 bool GetAtomArrayProperty(XID window, | 868 bool GetAtomArrayProperty(XID window, |
| 879 const std::string& property_name, | 869 const std::string& property_name, |
| 880 std::vector<XAtom>* value) { | 870 std::vector<XAtom>* value) { |
| 881 XAtom type = None; | 871 XAtom type = None; |
| 882 int format = 0; // size in bits of each item in 'property' | 872 int format = 0; // size in bits of each item in 'property' |
| 883 unsigned long num_items = 0; | 873 unsigned long num_items = 0; |
| 884 unsigned char* properties = NULL; | 874 unsigned char* properties = NULL; |
| 885 | 875 |
| 886 int result = GetProperty(window, property_name, | 876 int result = GetProperty(window, property_name, |
| 887 (~0L), // (all of them) | 877 (~0L), // (all of them) |
| 888 &type, &format, &num_items, &properties); | 878 &type, &format, &num_items, &properties); |
| 879 gfx::XScopedPtr<unsigned char> scoped_properties(properties); |
| 889 if (result != Success) | 880 if (result != Success) |
| 890 return false; | 881 return false; |
| 891 | 882 |
| 892 if (type != XA_ATOM) { | 883 if (type != XA_ATOM) |
| 893 XFree(properties); | |
| 894 return false; | 884 return false; |
| 895 } | |
| 896 | 885 |
| 897 XAtom* atom_properties = reinterpret_cast<XAtom*>(properties); | 886 XAtom* atom_properties = reinterpret_cast<XAtom*>(properties); |
| 898 value->clear(); | 887 value->clear(); |
| 899 value->insert(value->begin(), atom_properties, atom_properties + num_items); | 888 value->insert(value->begin(), atom_properties, atom_properties + num_items); |
| 900 XFree(properties); | |
| 901 return true; | 889 return true; |
| 902 } | 890 } |
| 903 | 891 |
| 904 bool GetStringProperty( | 892 bool GetStringProperty( |
| 905 XID window, const std::string& property_name, std::string* value) { | 893 XID window, const std::string& property_name, std::string* value) { |
| 906 XAtom type = None; | 894 XAtom type = None; |
| 907 int format = 0; // size in bits of each item in 'property' | 895 int format = 0; // size in bits of each item in 'property' |
| 908 unsigned long num_items = 0; | 896 unsigned long num_items = 0; |
| 909 unsigned char* property = NULL; | 897 unsigned char* property = NULL; |
| 910 | 898 |
| 911 int result = GetProperty(window, property_name, 1024, | 899 int result = GetProperty(window, property_name, 1024, |
| 912 &type, &format, &num_items, &property); | 900 &type, &format, &num_items, &property); |
| 901 gfx::XScopedPtr<unsigned char> scoped_property(property); |
| 913 if (result != Success) | 902 if (result != Success) |
| 914 return false; | 903 return false; |
| 915 | 904 |
| 916 if (format != 8) { | 905 if (format != 8) |
| 917 XFree(property); | |
| 918 return false; | 906 return false; |
| 919 } | |
| 920 | 907 |
| 921 value->assign(reinterpret_cast<char*>(property), num_items); | 908 value->assign(reinterpret_cast<char*>(property), num_items); |
| 922 XFree(property); | |
| 923 return true; | 909 return true; |
| 924 } | 910 } |
| 925 | 911 |
| 926 bool SetIntProperty(XID window, | 912 bool SetIntProperty(XID window, |
| 927 const std::string& name, | 913 const std::string& name, |
| 928 const std::string& type, | 914 const std::string& type, |
| 929 int value) { | 915 int value) { |
| 930 std::vector<int> values(1, value); | 916 std::vector<int> values(1, value); |
| 931 return SetIntArrayProperty(window, name, type, values); | 917 return SetIntArrayProperty(window, name, type, values); |
| 932 } | 918 } |
| (...skipping 238 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1171 unsigned char *data = NULL; | 1157 unsigned char *data = NULL; |
| 1172 if (GetProperty(window, | 1158 if (GetProperty(window, |
| 1173 "_NET_CLIENT_LIST_STACKING", | 1159 "_NET_CLIENT_LIST_STACKING", |
| 1174 ~0L, | 1160 ~0L, |
| 1175 &type, | 1161 &type, |
| 1176 &format, | 1162 &format, |
| 1177 &count, | 1163 &count, |
| 1178 &data) != Success) { | 1164 &data) != Success) { |
| 1179 return false; | 1165 return false; |
| 1180 } | 1166 } |
| 1167 gfx::XScopedPtr<unsigned char> scoped_data(data); |
| 1181 | 1168 |
| 1182 bool result = false; | 1169 bool result = false; |
| 1183 if (type == XA_WINDOW && format == 32 && data && count > 0) { | 1170 if (type == XA_WINDOW && format == 32 && data && count > 0) { |
| 1184 result = true; | 1171 result = true; |
| 1185 XID* stack = reinterpret_cast<XID*>(data); | 1172 XID* stack = reinterpret_cast<XID*>(data); |
| 1186 for (long i = static_cast<long>(count) - 1; i >= 0; i--) | 1173 for (long i = static_cast<long>(count) - 1; i >= 0; i--) |
| 1187 windows->push_back(stack[i]); | 1174 windows->push_back(stack[i]); |
| 1188 } | 1175 } |
| 1189 | 1176 |
| 1190 if (data) | |
| 1191 XFree(data); | |
| 1192 | |
| 1193 return result; | 1177 return result; |
| 1194 } | 1178 } |
| 1195 | 1179 |
| 1196 bool CopyAreaToCanvas(XID drawable, | 1180 bool CopyAreaToCanvas(XID drawable, |
| 1197 gfx::Rect source_bounds, | 1181 gfx::Rect source_bounds, |
| 1198 gfx::Point dest_offset, | 1182 gfx::Point dest_offset, |
| 1199 gfx::Canvas* canvas) { | 1183 gfx::Canvas* canvas) { |
| 1200 ui::XScopedImage scoped_image( | 1184 ui::XScopedImage scoped_image( |
| 1201 XGetImage(gfx::GetXDisplay(), drawable, | 1185 XGetImage(gfx::GetXDisplay(), drawable, |
| 1202 source_bounds.x(), source_bounds.y(), | 1186 source_bounds.x(), source_bounds.y(), |
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1343 if (!GetAtomArrayProperty(GetX11RootWindow(), | 1327 if (!GetAtomArrayProperty(GetX11RootWindow(), |
| 1344 "_NET_SUPPORTED", | 1328 "_NET_SUPPORTED", |
| 1345 &supported_atoms)) { | 1329 &supported_atoms)) { |
| 1346 return false; | 1330 return false; |
| 1347 } | 1331 } |
| 1348 | 1332 |
| 1349 return std::find(supported_atoms.begin(), supported_atoms.end(), atom) != | 1333 return std::find(supported_atoms.begin(), supported_atoms.end(), atom) != |
| 1350 supported_atoms.end(); | 1334 supported_atoms.end(); |
| 1351 } | 1335 } |
| 1352 | 1336 |
| 1337 XRefcountedMemory::XRefcountedMemory(unsigned char* x11_data, size_t length) |
| 1338 : x11_data_(length ? x11_data : nullptr), length_(length) { |
| 1339 } |
| 1340 |
| 1353 const unsigned char* XRefcountedMemory::front() const { | 1341 const unsigned char* XRefcountedMemory::front() const { |
| 1354 return x11_data_; | 1342 return x11_data_.get(); |
| 1355 } | 1343 } |
| 1356 | 1344 |
| 1357 size_t XRefcountedMemory::size() const { | 1345 size_t XRefcountedMemory::size() const { |
| 1358 return length_; | 1346 return length_; |
| 1359 } | 1347 } |
| 1360 | 1348 |
| 1361 XRefcountedMemory::~XRefcountedMemory() { | 1349 XRefcountedMemory::~XRefcountedMemory() { |
| 1362 XFree(x11_data_); | |
| 1363 } | |
| 1364 | |
| 1365 XScopedString::~XScopedString() { | |
| 1366 XFree(string_); | |
| 1367 } | 1350 } |
| 1368 | 1351 |
| 1369 XScopedImage::~XScopedImage() { | 1352 XScopedImage::~XScopedImage() { |
| 1370 reset(NULL); | 1353 reset(NULL); |
| 1371 } | 1354 } |
| 1372 | 1355 |
| 1373 void XScopedImage::reset(XImage* image) { | 1356 void XScopedImage::reset(XImage* image) { |
| 1374 if (image_ == image) | 1357 if (image_ == image) |
| 1375 return; | 1358 return; |
| 1376 if (image_) | 1359 if (image_) |
| (...skipping 86 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1463 XGetErrorText(dpy, error_event.error_code, error_str, sizeof(error_str)); | 1446 XGetErrorText(dpy, error_event.error_code, error_str, sizeof(error_str)); |
| 1464 | 1447 |
| 1465 strncpy(request_str, "Unknown", sizeof(request_str)); | 1448 strncpy(request_str, "Unknown", sizeof(request_str)); |
| 1466 if (error_event.request_code < 128) { | 1449 if (error_event.request_code < 128) { |
| 1467 std::string num = base::UintToString(error_event.request_code); | 1450 std::string num = base::UintToString(error_event.request_code); |
| 1468 XGetErrorDatabaseText( | 1451 XGetErrorDatabaseText( |
| 1469 dpy, "XRequest", num.c_str(), "Unknown", request_str, | 1452 dpy, "XRequest", num.c_str(), "Unknown", request_str, |
| 1470 sizeof(request_str)); | 1453 sizeof(request_str)); |
| 1471 } else { | 1454 } else { |
| 1472 int num_ext; | 1455 int num_ext; |
| 1473 char** ext_list = XListExtensions(dpy, &num_ext); | 1456 gfx::XScopedPtr<char* [], |
| 1457 gfx::XObjectDeleter<char*, int, XFreeExtensionList>> |
| 1458 ext_list(XListExtensions(dpy, &num_ext)); |
| 1474 | 1459 |
| 1475 for (int i = 0; i < num_ext; i++) { | 1460 for (int i = 0; i < num_ext; i++) { |
| 1476 int ext_code, first_event, first_error; | 1461 int ext_code, first_event, first_error; |
| 1477 XQueryExtension(dpy, ext_list[i], &ext_code, &first_event, &first_error); | 1462 XQueryExtension(dpy, ext_list[i], &ext_code, &first_event, &first_error); |
| 1478 if (error_event.request_code == ext_code) { | 1463 if (error_event.request_code == ext_code) { |
| 1479 std::string msg = base::StringPrintf( | 1464 std::string msg = base::StringPrintf( |
| 1480 "%s.%d", ext_list[i], error_event.minor_code); | 1465 "%s.%d", ext_list[i], error_event.minor_code); |
| 1481 XGetErrorDatabaseText( | 1466 XGetErrorDatabaseText( |
| 1482 dpy, "XRequest", msg.c_str(), "Unknown", request_str, | 1467 dpy, "XRequest", msg.c_str(), "Unknown", request_str, |
| 1483 sizeof(request_str)); | 1468 sizeof(request_str)); |
| 1484 break; | 1469 break; |
| 1485 } | 1470 } |
| 1486 } | 1471 } |
| 1487 XFreeExtensionList(ext_list); | |
| 1488 } | 1472 } |
| 1489 | 1473 |
| 1490 LOG(WARNING) | 1474 LOG(WARNING) |
| 1491 << "X error received: " | 1475 << "X error received: " |
| 1492 << "serial " << error_event.serial << ", " | 1476 << "serial " << error_event.serial << ", " |
| 1493 << "error_code " << static_cast<int>(error_event.error_code) | 1477 << "error_code " << static_cast<int>(error_event.error_code) |
| 1494 << " (" << error_str << "), " | 1478 << " (" << error_str << "), " |
| 1495 << "request_code " << static_cast<int>(error_event.request_code) << ", " | 1479 << "request_code " << static_cast<int>(error_event.request_code) << ", " |
| 1496 << "minor_code " << static_cast<int>(error_event.minor_code) | 1480 << "minor_code " << static_cast<int>(error_event.minor_code) |
| 1497 << " (" << request_str << ")"; | 1481 << " (" << request_str << ")"; |
| 1498 } | 1482 } |
| 1499 | 1483 |
| 1500 // ---------------------------------------------------------------------------- | 1484 // ---------------------------------------------------------------------------- |
| 1501 // End of x11_util_internal.h | 1485 // End of x11_util_internal.h |
| 1502 | 1486 |
| 1503 | 1487 |
| 1504 } // namespace ui | 1488 } // namespace ui |
| OLD | NEW |