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

Side by Side Diff: ui/base/x/x11_util.cc

Issue 17029020: linux_aura: Redo how memory is handled in clipboard/drag code. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fixes for sky; ptal Created 7 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « ui/base/x/x11_util.h ('k') | ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.h » ('j') | 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 // 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 745 matching lines...) Expand 10 before | Expand all | Expand 10 after
756 &type, &format, &num_items, &property); 756 &type, &format, &num_items, &property);
757 if (result != Success) 757 if (result != Success)
758 return false; 758 return false;
759 759
760 XFree(property); 760 XFree(property);
761 return num_items > 0; 761 return num_items > 0;
762 } 762 }
763 763
764 bool GetRawBytesOfProperty(XID window, 764 bool GetRawBytesOfProperty(XID window,
765 Atom property, 765 Atom property,
766 unsigned char** out_data, 766 scoped_refptr<base::RefCountedMemory>* out_data,
767 size_t* out_data_bytes, 767 size_t* out_data_bytes,
768 size_t* out_data_items, 768 size_t* out_data_items,
769 Atom* out_type) { 769 Atom* out_type) {
770 // Retrieve the data from our window. 770 // Retrieve the data from our window.
771 unsigned long nitems = 0; 771 unsigned long nitems = 0;
772 unsigned long nbytes = 0; 772 unsigned long nbytes = 0;
773 Atom prop_type = None; 773 Atom prop_type = None;
774 int prop_format = 0; 774 int prop_format = 0;
775 unsigned char* property_data = NULL; 775 unsigned char* property_data = NULL;
776 if (XGetWindowProperty(GetXDisplay(), window, property, 776 if (XGetWindowProperty(GetXDisplay(), window, property,
777 0, 0x1FFFFFFF /* MAXINT32 / 4 */, False, 777 0, 0x1FFFFFFF /* MAXINT32 / 4 */, False,
778 AnyPropertyType, &prop_type, &prop_format, 778 AnyPropertyType, &prop_type, &prop_format,
779 &nitems, &nbytes, &property_data) != Success) { 779 &nitems, &nbytes, &property_data) != Success) {
780 return false; 780 return false;
781 } 781 }
782 782
783 if (prop_type == None) 783 if (prop_type == None)
784 return false; 784 return false;
785 785
786 size_t bytes = 0;
787 // So even though we should theoretically have nbytes (and we can't
788 // pass NULL there), we need to manually calculate the byte length here
789 // because nbytes always returns zero.
790 switch (prop_format) {
791 case 8:
792 bytes = nitems;
793 break;
794 case 16:
795 bytes = sizeof(short) * nitems;
796 break;
797 case 32:
798 bytes = sizeof(long) * nitems;
799 break;
800 default:
801 NOTREACHED();
802 break;
803 }
804
805 if (out_data_bytes)
806 *out_data_bytes = bytes;
807
786 if (out_data) 808 if (out_data)
787 *out_data = property_data; 809 *out_data = new XRefcountedMemory(property_data, bytes);
788 else 810 else
789 XFree(property_data); 811 XFree(property_data);
790 812
791 if (out_data_bytes) {
792 // So even though we should theoretically have nbytes (and we can't
793 // pass NULL there), we need to manually calculate the byte length here
794 // because nbytes always returns zero.
795 switch (prop_format) {
796 case 8:
797 *out_data_bytes = nitems;
798 break;
799 case 16:
800 *out_data_bytes = sizeof(short) * nitems;
801 break;
802 case 32:
803 *out_data_bytes = sizeof(long) * nitems;
804 break;
805 default:
806 NOTREACHED();
807 break;
808 }
809 }
810
811 if (out_data_items) 813 if (out_data_items)
812 *out_data_items = nitems; 814 *out_data_items = nitems;
813 815
814 if (out_type) 816 if (out_type)
815 *out_type = prop_type; 817 *out_type = prop_type;
816 818
817 return true; 819 return true;
818 } 820 }
819 821
820 bool GetIntProperty(XID window, const std::string& property_name, int* value) { 822 bool GetIntProperty(XID window, const std::string& property_name, int* value) {
(...skipping 673 matching lines...) Expand 10 before | Expand all | Expand 10 after
1494 key_event.y = 0; 1496 key_event.y = 0;
1495 key_event.x_root = 0; 1497 key_event.x_root = 0;
1496 key_event.y_root = 0; 1498 key_event.y_root = 0;
1497 key_event.state = XKeyEventState(flags); 1499 key_event.state = XKeyEventState(flags);
1498 key_event.keycode = XKeyEventKeyCode(key_code, flags, display); 1500 key_event.keycode = XKeyEventKeyCode(key_code, flags, display);
1499 key_event.same_screen = 1; 1501 key_event.same_screen = 1;
1500 event->type = key_event.type; 1502 event->type = key_event.type;
1501 event->xkey = key_event; 1503 event->xkey = key_event;
1502 } 1504 }
1503 1505
1506 const unsigned char* XRefcountedMemory::front() const {
1507 return x11_data_;
1508 }
1509
1510 size_t XRefcountedMemory::size() const {
1511 return length_;
1512 }
1513
1514 XRefcountedMemory::~XRefcountedMemory() {
1515 XFree(x11_data_);
1516 }
1517
1504 XScopedString::~XScopedString() { 1518 XScopedString::~XScopedString() {
1505 XFree(string_); 1519 XFree(string_);
1506 } 1520 }
1507 1521
1508 XScopedImage::~XScopedImage() { 1522 XScopedImage::~XScopedImage() {
1509 reset(NULL); 1523 reset(NULL);
1510 } 1524 }
1511 1525
1512 void XScopedImage::reset(XImage* image) { 1526 void XScopedImage::reset(XImage* image) {
1513 if (image_ == image) 1527 if (image_ == image)
(...skipping 145 matching lines...) Expand 10 before | Expand all | Expand 10 after
1659 << "request_code " << static_cast<int>(error_event.request_code) << ", " 1673 << "request_code " << static_cast<int>(error_event.request_code) << ", "
1660 << "minor_code " << static_cast<int>(error_event.minor_code) 1674 << "minor_code " << static_cast<int>(error_event.minor_code)
1661 << " (" << request_str << ")"; 1675 << " (" << request_str << ")";
1662 } 1676 }
1663 1677
1664 // ---------------------------------------------------------------------------- 1678 // ----------------------------------------------------------------------------
1665 // End of x11_util_internal.h 1679 // End of x11_util_internal.h
1666 1680
1667 1681
1668 } // namespace ui 1682 } // namespace ui
OLDNEW
« no previous file with comments | « ui/base/x/x11_util.h ('k') | ui/views/widget/desktop_aura/desktop_drag_drop_client_aurax11.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698