| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 669 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 680 return false; | 680 return false; |
| 681 | 681 |
| 682 gdk_error_trap_push(); | 682 gdk_error_trap_push(); |
| 683 result = GetStringProperty( | 683 result = GetStringProperty( |
| 684 static_cast<XID>(wm_window), "_NET_WM_NAME", wm_name); | 684 static_cast<XID>(wm_window), "_NET_WM_NAME", wm_name); |
| 685 gdk_flush(); | 685 gdk_flush(); |
| 686 got_error = gdk_error_trap_pop(); | 686 got_error = gdk_error_trap_pop(); |
| 687 return !got_error && result; | 687 return !got_error && result; |
| 688 } | 688 } |
| 689 | 689 |
| 690 static cairo_status_t SnapshotCallback( | |
| 691 void *closure, const unsigned char *data, unsigned int length) { | |
| 692 std::vector<unsigned char>* png_representation = | |
| 693 static_cast<std::vector<unsigned char>*>(closure); | |
| 694 | |
| 695 size_t old_size = png_representation->size(); | |
| 696 png_representation->resize(old_size + length); | |
| 697 memcpy(&(*png_representation)[old_size], data, length); | |
| 698 return CAIRO_STATUS_SUCCESS; | |
| 699 } | |
| 700 | |
| 701 void GrabWindowSnapshot(GtkWindow* gtk_window, | |
| 702 std::vector<unsigned char>* png_representation) { | |
| 703 GdkWindow* gdk_window = GTK_WIDGET(gtk_window)->window; | |
| 704 Display* display = GDK_WINDOW_XDISPLAY(gdk_window); | |
| 705 XID win = GDK_WINDOW_XID(gdk_window); | |
| 706 XWindowAttributes attr; | |
| 707 if (XGetWindowAttributes(display, win, &attr) == 0) { | |
| 708 LOG(ERROR) << "Couldn't get window attributes"; | |
| 709 return; | |
| 710 } | |
| 711 XImage* image = XGetImage( | |
| 712 display, win, 0, 0, attr.width, attr.height, AllPlanes, ZPixmap); | |
| 713 if (!image) { | |
| 714 LOG(ERROR) << "Couldn't get image"; | |
| 715 return; | |
| 716 } | |
| 717 if (image->depth != 24) { | |
| 718 LOG(ERROR)<< "Unsupported image depth " << image->depth; | |
| 719 return; | |
| 720 } | |
| 721 cairo_surface_t* surface = | |
| 722 cairo_image_surface_create_for_data( | |
| 723 reinterpret_cast<unsigned char*>(image->data), | |
| 724 CAIRO_FORMAT_RGB24, | |
| 725 image->width, | |
| 726 image->height, | |
| 727 image->bytes_per_line); | |
| 728 | |
| 729 if (!surface) { | |
| 730 LOG(ERROR) << "Unable to create Cairo surface from XImage data"; | |
| 731 return; | |
| 732 } | |
| 733 cairo_surface_write_to_png_stream( | |
| 734 surface, SnapshotCallback, png_representation); | |
| 735 cairo_surface_destroy(surface); | |
| 736 } | |
| 737 | |
| 738 bool ChangeWindowDesktop(XID window, XID destination) { | 690 bool ChangeWindowDesktop(XID window, XID destination) { |
| 739 int desktop; | 691 int desktop; |
| 740 if (!GetWindowDesktop(destination, &desktop)) | 692 if (!GetWindowDesktop(destination, &desktop)) |
| 741 return false; | 693 return false; |
| 742 | 694 |
| 743 // If |window| is sticky, use the current desktop. | 695 // If |window| is sticky, use the current desktop. |
| 744 if (desktop == kAllDesktops && | 696 if (desktop == kAllDesktops && |
| 745 !GetCurrentDesktop(&desktop)) | 697 !GetCurrentDesktop(&desktop)) |
| 746 return false; | 698 return false; |
| 747 | 699 |
| (...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 910 "X Error detected: serial %lu, error_code %u (%s), " | 862 "X Error detected: serial %lu, error_code %u (%s), " |
| 911 "request_code %u minor_code %u (%s)", | 863 "request_code %u minor_code %u (%s)", |
| 912 error_event->serial, error_event->error_code, error_str, | 864 error_event->serial, error_event->error_code, error_str, |
| 913 error_event->request_code, error_event->minor_code, request_str); | 865 error_event->request_code, error_event->minor_code, request_str); |
| 914 } | 866 } |
| 915 // ---------------------------------------------------------------------------- | 867 // ---------------------------------------------------------------------------- |
| 916 // End of x11_util_internal.h | 868 // End of x11_util_internal.h |
| 917 | 869 |
| 918 | 870 |
| 919 } // namespace ui | 871 } // namespace ui |
| OLD | NEW |