Welcome to mirror list, hosted at ThFree Co, Russian Federation.

GHOST_WindowX11.h « intern « ghost « intern - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: c7a6b5e735701015f424837b33beaa6a23d2fa86 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
/* SPDX-License-Identifier: GPL-2.0-or-later
 * Copyright 2001-2002 NaN Holding BV. All rights reserved. */

/** \file
 * \ingroup GHOST
 * Declaration of GHOST_WindowX11 class.
 */

#pragma once

#include "GHOST_Window.h"
#include <X11/Xlib.h>
#include <X11/Xutil.h>
// For tablets
#ifdef WITH_X11_XINPUT
#  include <X11/extensions/XInput.h>
#endif

#include "GHOST_TaskbarX11.h"

#include <map>

class GHOST_SystemX11;

#ifdef WITH_XDND
class GHOST_DropTargetX11;
#endif

/**
 * X11 implementation of GHOST_IWindow.
 * Dimensions are given in screen coordinates that are
 * relative to the upper-left corner of the screen.
 */

class GHOST_WindowX11 : public GHOST_Window {
 public:
  /**
   * Constructor.
   * Creates a new window and opens it.
   * To check if the window was created properly, use the getValid() method.
   * \param title: The text shown in the title bar of the window.
   * \param left: The coordinate of the left edge of the window.
   * \param top: The coordinate of the top edge of the window.
   * \param width: The width the window.
   * \param height: The height the window.
   * \param state: The state the window is initially opened with.
   * \param parentWindow: Parent (embedder) window.
   * \param type: The type of drawing context installed in this window.
   * \param stereoVisual: Stereo visual for quad buffered stereo.
   */
  GHOST_WindowX11(GHOST_SystemX11 *system,
                  Display *display,
                  const char *title,
                  int32_t left,
                  int32_t top,
                  uint32_t width,
                  uint32_t height,
                  GHOST_TWindowState state,
                  GHOST_WindowX11 *parentWindow,
                  GHOST_TDrawingContextType type = GHOST_kDrawingContextTypeNone,
                  const bool is_dialog = false,
                  const bool stereoVisual = false,
                  const bool exclusive = false,
                  const bool is_debug = false);

  bool getValid() const;

  void setTitle(const char *title);

  std::string getTitle() const;

  void getWindowBounds(GHOST_Rect &bounds) const;

  void getClientBounds(GHOST_Rect &bounds) const;

  bool isDialog() const;

  GHOST_TSuccess setClientWidth(uint32_t width);

  GHOST_TSuccess setClientHeight(uint32_t height);

  GHOST_TSuccess setClientSize(uint32_t width, uint32_t height);

  void screenToClient(int32_t inX, int32_t inY, int32_t &outX, int32_t &outY) const;

  void clientToScreen(int32_t inX, int32_t inY, int32_t &outX, int32_t &outY) const;

  GHOST_TWindowState getState() const;

  GHOST_TSuccess setState(GHOST_TWindowState state);

  GHOST_TSuccess setOrder(GHOST_TWindowOrder order);

  GHOST_TSuccess invalidate();

  GHOST_TSuccess setProgressBar(float progress);
  GHOST_TSuccess endProgressBar();

  /**
   * Destructor.
   * Closes the window and disposes resources allocated.
   */
  ~GHOST_WindowX11();

  /**
   * \section x11specific X11 system specific calls
   */

  /**
   * The reverse of invalidate! Tells this window
   * that all events for it have been pushed into
   * the GHOST event queue.
   */

  void validate();

  /**
   * Return a handle to the x11 window type.
   */
  Window getXWindow();

  GHOST_TabletData &GetTabletData()
  {
    return m_tabletData;
  }

#if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
  XIC getX11_XIC()
  {
    return m_xic;
  }

  bool createX11_XIC();
#endif

#ifdef WITH_X11_XINPUT
  void refreshXInputDevices();
#endif

#ifdef WITH_XDND
  GHOST_DropTargetX11 *getDropTarget()
  {
    return m_dropTarget;
  }
#endif

  /*
   * Need this in case that we want start the window
   * in FullScree or Maximized state.
   * Check GHOST_WindowX11.cpp
   */
  bool m_post_init;
  GHOST_TWindowState m_post_state;

  GHOST_TSuccess beginFullScreen() const;

  GHOST_TSuccess endFullScreen() const;

  GHOST_TSuccess setDialogHints(GHOST_WindowX11 *parentWindow);

  uint16_t getDPIHint();

 protected:
  /**
   * \param type: The type of rendering context create.
   * \return Indication of success.
   */
  GHOST_Context *newDrawingContext(GHOST_TDrawingContextType type);

  /**
   * Sets the cursor visibility on the window using
   * native window system calls.
   */
  GHOST_TSuccess setWindowCursorVisibility(bool visible);

  /**
   * Sets the cursor grab on the window using
   * native window system calls.
   */
  GHOST_TSuccess setWindowCursorGrab(GHOST_TGrabCursorMode mode);

  GHOST_TGrabCursorMode getWindowCursorGrab() const;

  /**
   * Sets the cursor shape on the window using
   * native window system calls.
   */
  GHOST_TSuccess setWindowCursorShape(GHOST_TStandardCursor shape);
  GHOST_TSuccess hasCursorShape(GHOST_TStandardCursor shape);

  /**
   * Sets the cursor shape on the window using
   * native window system calls (Arbitrary size/color).
   */
  GHOST_TSuccess setWindowCustomCursorShape(uint8_t *bitmap,
                                            uint8_t *mask,
                                            int sizex,
                                            int sizey,
                                            int hotX,
                                            int hotY,
                                            bool canInvertColor);

 private:
  /* Force use of public constructor. */

  GHOST_WindowX11();

  GHOST_WindowX11(const GHOST_WindowX11 &);

  GHOST_TSuccess getStandardCursor(GHOST_TStandardCursor g_cursor, Cursor &xcursor);

  Cursor getEmptyCursor();

  Window m_window;
  Display *m_display;
  XVisualInfo *m_visualInfo;
  void *m_fbconfig;

  GHOST_TWindowState m_normal_state;

  /** A pointer to the typed system class. */
  GHOST_SystemX11 *m_system;

  /** Used to concatenate calls to invalidate() on this window. */
  bool m_invalid_window;

  /** XCursor structure of an empty (blank) cursor */
  Cursor m_empty_cursor;

  /** XCursor structure of the custom cursor */
  Cursor m_custom_cursor;

  /** XCursor to show when cursor is visible */
  Cursor m_visible_cursor;

  /** Cache of XC_* ID's to XCursor structures */
  std::map<unsigned int, Cursor> m_standard_cursors;

  GHOST_TaskBarX11 m_taskbar;

#ifdef WITH_XDND
  GHOST_DropTargetX11 *m_dropTarget;
#endif

  GHOST_TabletData m_tabletData;

#if defined(WITH_X11_XINPUT) && defined(X_HAVE_UTF8_STRING)
  XIC m_xic;
#endif

  bool m_valid_setup;
  bool m_is_debug_context;

  void icccmSetState(int state);
  int icccmGetState() const;

  void netwmMaximized(bool set);
  bool netwmIsMaximized() const;

  void netwmFullScreen(bool set);
  bool netwmIsFullScreen() const;

  void motifFullScreen(bool set);
  bool motifIsFullScreen() const;
};