15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef UI_BASE_X_X11_UTIL_H_
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define UI_BASE_X_X11_UTIL_H_
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file declares utility functions for X11 (Linux only).
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)//
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These functions do not require the Xlib headers to be included (which is why
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// we use a void* for Visual*). The Xlib headers are highly polluting so we try
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// hard to limit their spread into the rest of the code.
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <string>
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include <vector>
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/event_types.h"
19eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch#include "base/memory/ref_counted_memory.h"
205d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/base/ui_base_export.h"
21d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/event_constants.h"
22d0247b1b59f9c528cb6df88b4f2b9afaf80d181eTorne (Richard Coles)#include "ui/events/keycodes/keyboard_codes.h"
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ui/gfx/point.h"
2468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)#include "ui/gfx/x/x11_types.h"
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned long XSharedMemoryId;  // ShmSeg in the X headers.
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef unsigned long Cursor;
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct _XcursorImage XcursorImage;
29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)typedef union _XEvent XEvent;
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx {
323551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class Canvas;
333551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)class Point;
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class Rect;
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class SkBitmap;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace ui {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// These functions use the default display and this /must/ be called from
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the UI thread. Thus, they don't support multiple displays.
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These functions cache their results ---------------------------------
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Returns true if the system supports XINPUT2.
465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool IsXInput2Available();
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// X shared memory comes in three flavors:
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 1) No SHM support,
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 2) SHM putimage,
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// 3) SHM pixmaps + putimage.
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum SharedMemorySupport {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHARED_MEMORY_NONE,
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHARED_MEMORY_PUTIMAGE,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHARED_MEMORY_PIXMAP
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return the shared memory type of our X connection.
585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT SharedMemorySupport QuerySharedMemorySupport(XDisplay* dpy);
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
60010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)// Return true iff the display supports Xrender
61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)UI_BASE_EXPORT bool QueryRenderSupport(XDisplay* dpy);
62010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns an X11 Cursor, sharable across the process.
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |cursor_shape| is an X font cursor shape, see XCreateFontCursor().
655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT ::Cursor GetXCursor(int cursor_shape);
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates a custom X cursor from the image. This takes ownership of image. The
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// caller must not free/modify the image. The refcount of the newly created
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// cursor is set to 1.
705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT ::Cursor CreateReffedCustomXCursor(XcursorImage* image);
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Increases the refcount of the custom cursor.
735d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT void RefCustomXCursor(::Cursor cursor);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Decreases the refcount of the custom cursor, and destroys it if it reaches 0.
765d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT void UnrefCustomXCursor(::Cursor cursor);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Creates a XcursorImage and copies the SkBitmap |bitmap| on it. |bitmap|
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// should be non-null. Caller owns the returned object.
805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT XcursorImage* SkBitmapToXcursorImage(const SkBitmap* bitmap,
815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                                    const gfx::Point& hotspot);
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Coalesce all pending motion events (touch or mouse) that are at the top of
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the queue, and return the number eliminated, storing the last one in
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// |last_event|.
865d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT int CoalescePendingMotionEvents(const XEvent* xev,
875d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                               XEvent* last_event);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Hides the host cursor.
905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT void HideHostCursor();
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns an invisible cursor.
935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT ::Cursor CreateInvisibleCursor();
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)// Sets whether |window| should use the OS window frame.
96f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)UI_BASE_EXPORT void SetUseOSWindowFrame(XID window, bool use_os_window_frame);
97f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These functions do not cache their results --------------------------
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
100cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Returns true if the shape extension is supported.
101cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)UI_BASE_EXPORT bool IsShapeExtensionAvailable();
102cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the X window id for the default root window
1045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT XID GetX11RootWindow();
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the user's current desktop.
10746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)UI_BASE_EXPORT bool GetCurrentDesktop(int* desktop);
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum HideTitlebarWhenMaximized {
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SHOW_TITLEBAR_WHEN_MAXIMIZED = 0,
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  HIDE_TITLEBAR_WHEN_MAXIMIZED = 1,
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Sets _GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED on |window|.
1145d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT void SetHideTitlebarWhenMaximizedProperty(
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    XID window,
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    HideTitlebarWhenMaximized property);
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Clears all regions of X11's default root window by filling black pixels.
1195d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT void ClearX11DefaultRootWindow();
1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if |window| is visible.
1225d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool IsWindowVisible(XID window);
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns the bounds of |window|.
1255d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool GetWindowRect(XID window, gfx::Rect* rect);
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns true if |window| contains the point |screen_loc|.
1285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool WindowContainsPoint(XID window, gfx::Point screen_loc);
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Return true if |window| has any property with |property_name|.
1315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool PropertyExists(XID window,
1325d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   const std::string& property_name);
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
134eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Returns the raw bytes from a property with minimal
135eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// interpretation. |out_data| should be freed by XFree() after use.
1365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool GetRawBytesOfProperty(
137eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    XID window,
138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    XAtom property,
139eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    scoped_refptr<base::RefCountedMemory>* out_data,
140eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch    size_t* out_data_items,
141116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch    XAtom* out_type);
142eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Get the value of an int, int array, atom array or string property.  On
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// success, true is returned and the value is stored in |value|.
145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)//
146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// TODO(erg): Once we remove the gtk port and are 100% aura, all of these
147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch// should accept an XAtom instead of a string.
1485d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool GetIntProperty(XID window,
1495d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   const std::string& property_name,
1505d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   int* value);
1515d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool GetXIDProperty(XID window,
1525d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   const std::string& property_name,
1535d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   XID* value);
1545d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool GetIntArrayProperty(XID window,
1555d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        const std::string& property_name,
1565d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        std::vector<int>* value);
1575d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool GetAtomArrayProperty(XID window,
1585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         const std::string& property_name,
159116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                         std::vector<XAtom>* value);
1605d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool GetStringProperty(XID window,
1615d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      const std::string& property_name,
1625d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                      std::string* value);
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
164eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// These setters all make round trips.
1655d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool SetIntProperty(XID window,
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& name,
1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   const std::string& type,
1685d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                   int value);
1695d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool SetIntArrayProperty(XID window,
1705d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        const std::string& name,
1715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        const std::string& type,
1725d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        const std::vector<int>& value);
173f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)UI_BASE_EXPORT bool SetAtomProperty(XID window,
174f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                    const std::string& name,
175f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                                    const std::string& type,
176116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                    XAtom value);
1775d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool SetAtomArrayProperty(XID window,
1785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         const std::string& name,
1795d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                         const std::string& type,
180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                         const std::vector<XAtom>& value);
181effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochUI_BASE_EXPORT bool SetStringProperty(XID window,
182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      XAtom property,
183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch                                      XAtom type,
184effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch                                      const std::string& value);
1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Gets the X atom for default display corresponding to atom_name.
187116680a4aac90f2aa7413d9095a592090648e557Ben MurdochUI_BASE_EXPORT XAtom GetAtom(const char* atom_name);
1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
18958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)// Sets the WM_CLASS attribute for a given X11 window.
1905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT void SetWindowClassHint(XDisplay* display,
1915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       XID window,
1925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       const std::string& res_name,
1935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                       const std::string& res_class);
194f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)
195f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Sets the WM_WINDOW_ROLE attribute for a given X11 window.
1965d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT void SetWindowRole(XDisplay* display,
1975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  XID window,
1985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                  const std::string& role);
19958537e28ecd584eab876aee8be7156509866d23aTorne (Richard Coles)
200a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// Determine whether we should default to native decorations or the custom
201a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)// frame based on the currently-running window manager.
202a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)UI_BASE_EXPORT bool GetCustomFramePrefDefault();
203a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)
2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const int kAllDesktops = -1;
2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Queries the desktop |window| is on, kAllDesktops if sticky. Returns false if
2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// property not found.
2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool GetWindowDesktop(XID window, int* desktop);
2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Translates an X11 error code into a printable string.
2105d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT std::string GetX11ErrorString(XDisplay* display, int err);
2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Implementers of this interface receive a notification for every X window of
2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the main display.
2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class EnumerateWindowsDelegate {
2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // |xid| is the X Window ID of the enumerated window.  Return true to stop
2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // further iteration.
2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual bool ShouldStopIterating(XID xid) = 0;
2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  virtual ~EnumerateWindowsDelegate() {}
2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Enumerates all windows in the current display.  Will recurse into child
2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// windows up to a depth of |max_depth|.
2265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool EnumerateAllWindows(EnumerateWindowsDelegate* delegate,
2275d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                        int max_depth);
2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Enumerates the top-level windows of the current display.
2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT void EnumerateTopLevelWindows(
2315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)    ui::EnumerateWindowsDelegate* delegate);
2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Returns all children windows of a given window in top-to-bottom stacking
2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// order.
2355d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool GetXWindowStack(XID window, std::vector<XID>* windows);
2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2373551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// Copies |source_bounds| from |drawable| to |canvas| at offset |dest_offset|.
2383551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// |source_bounds| is in physical pixels, while |dest_offset| is relative to
2393551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// the canvas's scale. Note that this function is slow since it uses
2403551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// XGetImage() to copy the data from the X server to this process before
2413551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)// copying it to |canvas|.
2425d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool CopyAreaToCanvas(XID drawable,
2435d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     gfx::Rect source_bounds,
2445d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     gfx::Point dest_offset,
2455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)                                     gfx::Canvas* canvas);
2463551c9c881056c480085172ff9840cab31610854Torne (Richard Coles)
2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)enum WindowManagerName {
2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WM_UNKNOWN,
2491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WM_AWESOME,
2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WM_BLACKBOX,
2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WM_COMPIZ,
2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WM_ENLIGHTENMENT,
2541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WM_I3,
2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WM_ICE_WM,
2561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WM_ION3,
2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WM_KWIN,
2581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WM_MATCHBOX,
2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WM_METACITY,
2602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  WM_MUFFIN,
2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WM_MUTTER,
2621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WM_NOTION,
2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WM_OPENBOX,
2641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WM_QTILE,
2651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WM_RATPOISON,
2661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  WM_STUMPWM,
2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  WM_XFWM4,
2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Attempts to guess the window maager. Returns WM_UNKNOWN if we can't
2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// determine it for one reason or another.
2715d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT WindowManagerName GuessWindowManager();
2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
2731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// The same as GuessWindowManager(), but returns the raw string.  If we
2741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci// can't determine it, return "Unknown".
2751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciUI_BASE_EXPORT std::string GuessWindowManagerName();
2761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Enable the default X error handlers. These will log the error and abort
2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// the process if called. Use SetX11ErrorHandlers() from x11_util_internal.h
2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// to set your own error handlers.
2805d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT void SetDefaultX11ErrorHandlers();
2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28246d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Returns true if a given window is in full-screen mode.
2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)UI_BASE_EXPORT bool IsX11WindowFullScreen(XID window);
2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
28546d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)// Returns true if the window manager supports the given hint.
286116680a4aac90f2aa7413d9095a592090648e557Ben MurdochUI_BASE_EXPORT bool WmSupportsHint(XAtom atom);
28746d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles)
288eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// Manages a piece of X11 allocated memory as a RefCountedMemory segment. This
289eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// object takes ownership over the passed in memory and will free it with the
290eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch// X11 allocator when done.
2915d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT XRefcountedMemory : public base::RefCountedMemory {
292eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch public:
293eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  XRefcountedMemory(unsigned char* x11_data, size_t length)
2945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)      : x11_data_(length ? x11_data : NULL), length_(length) {}
295eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
296eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  // Overridden from RefCountedMemory:
297eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual const unsigned char* front() const OVERRIDE;
298eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual size_t size() const OVERRIDE;
299eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
300eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch private:
301eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  virtual ~XRefcountedMemory();
302eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
303eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  unsigned char* x11_data_;
304eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  size_t length_;
305eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
306eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  DISALLOW_COPY_AND_ASSIGN(XRefcountedMemory);
307eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch};
308eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch
3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Keeps track of a string returned by an X function (e.g. XGetAtomName) and
3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// makes sure it's XFree'd.
3115d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT XScopedString {
3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit XScopedString(char* str) : string_(str) {}
3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~XScopedString();
3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const char* string() const { return string_; }
3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  char* string_;
3205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(XScopedString);
3225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Keeps track of an image returned by an X function (e.g. XGetImage) and
3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// makes sure it's XDestroyImage'd.
3265d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT XScopedImage {
3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  explicit XScopedImage(XImage* image) : image_(image) {}
3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~XScopedImage();
3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3315d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  XImage* get() const { return image_; }
3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3335d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)  XImage* operator->() const { return image_; }
3345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void reset(XImage* image);
3365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  XImage* image_;
3395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(XScopedImage);
3415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Keeps track of a cursor returned by an X function and makes sure it's
3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// XFreeCursor'd.
3455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class UI_BASE_EXPORT XScopedCursor {
3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public:
3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // Keeps track of |cursor| created with |display|.
34868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  XScopedCursor(::Cursor cursor, XDisplay* display);
3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ~XScopedCursor();
3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::Cursor get() const;
3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void reset(::Cursor cursor);
3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  ::Cursor cursor_;
35668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)  XDisplay* display_;
3575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  DISALLOW_COPY_AND_ASSIGN(XScopedCursor);
3595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
3605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
361cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace test {
362cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Resets the cache used by GetXCursor(). Only useful for tests that may delete
363cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// the display.
364cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)UI_BASE_EXPORT void ResetXCursorCache();
365cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
366cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)// Returns the cached XcursorImage for |cursor|.
367cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)UI_BASE_EXPORT const XcursorImage* GetCachedXcursorImage(::Cursor cursor);
368cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
369cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}  // namespace test
370cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace ui
3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  // UI_BASE_X_X11_UTIL_H_
374