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