window-private.h 25.8 KB
Newer Older
1 2
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */

3
/**
4
 * \file window-private.h  Windows which Mutter manages
5 6 7 8 9 10
 *
 * Managing X windows.
 * This file contains methods on this class which are available to
 * routines in core but not outside it.  (See window.h for the routines
 * which the rest of the world is allowed to use.)
 */
rhp's avatar
...  
rhp committed
11

Jasper St. Pierre's avatar
Jasper St. Pierre committed
12
/*
rhp's avatar
...  
rhp committed
13
 * Copyright (C) 2001 Havoc Pennington
14
 * Copyright (C) 2002 Red Hat, Inc.
15
 * Copyright (C) 2003, 2004 Rob Adams
16
 * Copyright (C) 2004-2006 Elijah Newren
Jasper St. Pierre's avatar
Jasper St. Pierre committed
17
 *
rhp's avatar
...  
rhp committed
18 19 20 21 22 23 24 25 26
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License as
 * published by the Free Software Foundation; either version 2 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * General Public License for more details.
Jasper St. Pierre's avatar
Jasper St. Pierre committed
27
 *
rhp's avatar
...  
rhp committed
28
 * You should have received a copy of the GNU General Public License
29
 * along with this program; if not, see <http://www.gnu.org/licenses/>.
rhp's avatar
...  
rhp committed
30 31
 */

32 33
#ifndef META_WINDOW_PRIVATE_H
#define META_WINDOW_PRIVATE_H
rhp's avatar
...  
rhp committed
34

35
#include <config.h>
36 37
#include <meta/compositor.h>
#include <meta/window.h>
38
#include "screen-private.h"
39
#include <meta/util.h>
rhp's avatar
...  
rhp committed
40
#include "stack.h"
rhp's avatar
...  
rhp committed
41
#include <X11/Xutil.h>
42
#include <cairo.h>
rhp's avatar
...  
rhp committed
43
#include <gdk-pixbuf/gdk-pixbuf.h>
44
#include <clutter/clutter.h>
rhp's avatar
...  
rhp committed
45

46
#include "x11/group-private.h"
47

48 49
#include "wayland/meta-wayland-types.h"

50
typedef struct _MetaWindowQueue MetaWindowQueue;
51

52 53 54 55 56 57 58
typedef enum {
  META_CLIENT_TYPE_UNKNOWN = 0,
  META_CLIENT_TYPE_APPLICATION = 1,
  META_CLIENT_TYPE_PAGER = 2,
  META_CLIENT_TYPE_MAX_RECOGNIZED = 2
} MetaClientType;

59 60 61 62 63 64 65 66
typedef enum {
  META_QUEUE_CALC_SHOWING = 1 << 0,
  META_QUEUE_MOVE_RESIZE  = 1 << 1,
  META_QUEUE_UPDATE_ICON  = 1 << 2,
} MetaQueueType;

#define NUMBER_OF_QUEUES 3

67 68 69 70 71 72
typedef enum {
  _NET_WM_BYPASS_COMPOSITOR_HINT_AUTO = 0,
  _NET_WM_BYPASS_COMPOSITOR_HINT_ON = 1,
  _NET_WM_BYPASS_COMPOSITOR_HINT_OFF = 2,
} MetaBypassCompositorHintValue;

73 74 75
typedef enum
{
  META_IS_CONFIGURE_REQUEST = 1 << 0,
76 77 78 79
  META_IS_USER_ACTION       = 1 << 1,
  META_IS_MOVE_ACTION       = 1 << 2,
  META_IS_RESIZE_ACTION     = 1 << 3,
  META_IS_WAYLAND_RESIZE    = 1 << 4,
80 81 82 83 84 85 86 87
} MetaMoveResizeFlags;

typedef enum
{
  META_MOVE_RESIZE_RESULT_MOVED               = 1 << 0,
  META_MOVE_RESIZE_RESULT_RESIZED             = 1 << 1,
  META_MOVE_RESIZE_RESULT_FRAME_SHAPE_CHANGED = 1 << 2,
} MetaMoveResizeResultFlags;
88

rhp's avatar
...  
rhp committed
89 90
struct _MetaWindow
{
Owen Taylor's avatar
Owen Taylor committed
91
  GObject parent_instance;
Jasper St. Pierre's avatar
Jasper St. Pierre committed
92

rhp's avatar
...  
rhp committed
93
  MetaDisplay *display;
rhp's avatar
...  
rhp committed
94
  MetaScreen *screen;
95
  const MetaMonitorInfo *monitor;
96
  MetaWorkspace *workspace;
97 98
  MetaWindowClientType client_type;
  MetaWaylandSurface *surface;
rhp's avatar
...  
rhp committed
99
  Window xwindow;
rhp's avatar
...  
rhp committed
100 101 102 103
  /* may be NULL! not all windows get decorated */
  MetaFrame *frame;
  int depth;
  Visual *xvisual;
rhp's avatar
...  
rhp committed
104
  char *desc; /* used in debug spew */
rhp's avatar
...  
rhp committed
105
  char *title;
rhp's avatar
...  
rhp committed
106

rhp's avatar
...  
rhp committed
107
  GdkPixbuf *icon;
108
  GdkPixbuf *mini_icon;
109

rhp's avatar
...  
rhp committed
110
  MetaWindowType type;
111

112
  /* NOTE these five are not in UTF-8, we just treat them as random
rhp's avatar
...  
rhp committed
113 114 115 116 117 118
   * binary data
   */
  char *res_class;
  char *res_name;
  char *role;
  char *sm_client_id;
119
  char *wm_client_machine;
120

Havoc Pennington's avatar
Havoc Pennington committed
121
  char *startup_id;
Tomas Frydrych's avatar
Tomas Frydrych committed
122
  char *mutter_hints;
123
  char *gtk_theme_variant;
124 125 126 127 128 129
  char *gtk_application_id;
  char *gtk_unique_bus_name;
  char *gtk_application_object_path;
  char *gtk_window_object_path;
  char *gtk_app_menu_object_path;
  char *gtk_menubar_object_path;
130

131
  int hide_titlebar_when_maximized;
132
  int net_wm_pid;
Jasper St. Pierre's avatar
Jasper St. Pierre committed
133

rhp's avatar
...  
rhp committed
134 135 136
  Window xtransient_for;
  Window xgroup_leader;
  Window xclient_leader;
137
  MetaWindow *transient_for;
rhp's avatar
...  
rhp committed
138 139

  /* Initial workspace property */
Jasper St. Pierre's avatar
Jasper St. Pierre committed
140 141
  int initial_workspace;

142
  /* Initial timestamp property */
Jasper St. Pierre's avatar
Jasper St. Pierre committed
143 144
  guint32 initial_timestamp;

145 146 147
  /* Whether this is an override redirect window or not */
  guint override_redirect : 1;

rhp's avatar
...  
rhp committed
148
  /* Whether we're maximized */
149 150
  guint maximized_horizontally : 1;
  guint maximized_vertically : 1;
151 152

  /* Whether we have to maximize/minimize after placement */
153 154
  guint maximize_horizontally_after_placement : 1;
  guint maximize_vertically_after_placement : 1;
155
  guint minimize_after_placement : 1;
rhp's avatar
...  
rhp committed
156

157 158 159 160
  /* The current or requested tile mode. If maximized_vertically is true,
   * this is the current mode. If not, it is the mode which will be
   * requested after the window grab is released */
  guint tile_mode : 2;
161 162 163
  /* The last "full" maximized/unmaximized state. We need to keep track of
   * that to toggle between normal/tiled or maximized/tiled states. */
  guint saved_maximize : 1;
164
  int tile_monitor_number;
165
  int preferred_output_winsys_id;
166

rhp's avatar
...  
rhp committed
167 168
  /* Whether we're shaded */
  guint shaded : 1;
rhp's avatar
...  
rhp committed
169

170 171
  /* Whether we're fullscreen */
  guint fullscreen : 1;
172

173 174
  /* Whether the window is marked as urgent */
  guint urgent : 1;
175

176 177 178
  /* Whether we have to fullscreen after placement */
  guint fullscreen_after_placement : 1;

179 180 181 182
  /* Area to cover when in fullscreen mode.  If _NET_WM_FULLSCREEN_MONITORS has
   * been overridden (via a client message), the window will cover the union of
   * these monitors.  If not, this is the single monitor which the window's
   * origin is on. */
183
  gint fullscreen_monitors[4];
Jasper St. Pierre's avatar
Jasper St. Pierre committed
184

185 186 187
  /* Whether we're trying to constrain the window to be fully onscreen */
  guint require_fully_onscreen : 1;

188 189
  /* Whether we're trying to constrain the window to be on a single monitor */
  guint require_on_single_monitor : 1;
190

191 192 193
  /* Whether we're trying to constrain the window's titlebar to be onscreen */
  guint require_titlebar_visible : 1;

rhp's avatar
...  
rhp committed
194 195 196 197 198
  /* Whether we're sticky in the multi-workspace sense
   * (vs. the not-scroll-with-viewport sense, we don't
   * have no stupid viewports)
   */
  guint on_all_workspaces : 1;
rhp's avatar
...  
rhp committed
199

200 201 202 203 204
  /* This is true if the client requested sticky, and implies on_all_workspaces == TRUE,
   * however on_all_workspaces can be set TRUE for other internal reasons too, such as
   * being override_redirect or being on the non-primary monitor. */
  guint on_all_workspaces_requested : 1;

rhp's avatar
...  
rhp committed
205 206
  /* Minimize is the state controlled by the minimize button */
  guint minimized : 1;
207
  guint tab_unminimized : 1;
rhp's avatar
...  
rhp committed
208

rhp's avatar
...  
rhp committed
209 210 211 212
  /* Whether the window is mapped; actual server-side state
   * see also unmaps_pending
   */
  guint mapped : 1;
Jasper St. Pierre's avatar
Jasper St. Pierre committed
213

214 215 216 217 218
  /* Whether window has been hidden from view by lowering it to the bottom
   * of window stack.
   */
  guint hidden : 1;

219 220 221
  /* Whether the compositor thinks the window is visible.
   * This should match up with calls to meta_compositor_show_window /
   * meta_compositor_hide_window.
222 223 224
   */
  guint visible_to_compositor : 1;

225 226 227 228 229 230
  /* Whether the compositor knows about the window.
   * This should match up with calls to meta_compositor_add_window /
   * meta_compositor_remove_window.
   */
  guint known_to_compositor : 1;

231 232 233 234 235
  /* When we next show or hide the window, what effect we should
   * tell the compositor to perform.
   */
  guint pending_compositor_effect : 4; /* MetaCompEffect */

rhp's avatar
...  
rhp committed
236 237 238
  /* Iconic is the state in WM_STATE; happens for workspaces/shading
   * in addition to minimize
   */
rhp's avatar
...  
rhp committed
239
  guint iconic : 1;
rhp's avatar
...  
rhp committed
240
  /* initially_iconic is the WM_HINTS setting when we first manage
rhp's avatar
...  
rhp committed
241
   * the window. It's taken to mean initially minimized.
rhp's avatar
...  
rhp committed
242 243
   */
  guint initially_iconic : 1;
rhp's avatar
...  
rhp committed
244 245 246

  /* whether an initial workspace was explicitly set */
  guint initial_workspace_set : 1;
Jasper St. Pierre's avatar
Jasper St. Pierre committed
247

248 249
  /* whether an initial timestamp was explicitly set */
  guint initial_timestamp_set : 1;
Jasper St. Pierre's avatar
Jasper St. Pierre committed
250

251 252
  /* whether net_wm_user_time has been set yet */
  guint net_wm_user_time_set : 1;
253 254 255

  /* whether net_wm_icon_geometry has been set */
  guint icon_geometry_set : 1;
Jasper St. Pierre's avatar
Jasper St. Pierre committed
256

257
  /* These are the flags from WM_PROTOCOLS */
rhp's avatar
...  
rhp committed
258 259
  guint take_focus : 1;
  guint delete_window : 1;
260
  guint can_ping : 1;
rhp's avatar
...  
rhp committed
261 262
  /* Globally active / No input */
  guint input : 1;
Jasper St. Pierre's avatar
Jasper St. Pierre committed
263

rhp's avatar
...  
rhp committed
264 265
  /* MWM hints about features of window */
  guint mwm_decorated : 1;
266
  guint mwm_border_only : 1;
rhp's avatar
...  
rhp committed
267 268 269 270 271
  guint mwm_has_close_func : 1;
  guint mwm_has_minimize_func : 1;
  guint mwm_has_maximize_func : 1;
  guint mwm_has_move_func : 1;
  guint mwm_has_resize_func : 1;
Jasper St. Pierre's avatar
Jasper St. Pierre committed
272

rhp's avatar
...  
rhp committed
273
  /* Computed features of window */
rhp's avatar
...  
rhp committed
274
  guint decorated : 1;
275
  guint border_only : 1;
276
  guint always_sticky : 1;
rhp's avatar
...  
rhp committed
277 278 279
  guint has_close_func : 1;
  guint has_minimize_func : 1;
  guint has_maximize_func : 1;
rhp's avatar
...  
rhp committed
280
  guint has_shade_func : 1;
rhp's avatar
...  
rhp committed
281 282
  guint has_move_func : 1;
  guint has_resize_func : 1;
283
  guint has_fullscreen_func : 1;
284 285 286 287

  /* Computed whether to skip taskbar or not */
  guint skip_taskbar : 1;
  guint skip_pager : 1;
Havoc Pennington's avatar
Havoc Pennington committed
288 289 290 291

  /* TRUE if client set these */
  guint wm_state_above : 1;
  guint wm_state_below : 1;
292 293 294

  /* EWHH demands attention flag */
  guint wm_state_demands_attention : 1;
Jasper St. Pierre's avatar
Jasper St. Pierre committed
295

296
  /* TRUE iff window == window->display->focus_window */
rhp's avatar
...  
rhp committed
297
  guint has_focus : 1;
298

rhp's avatar
...  
rhp committed
299 300 301
  /* Have we placed this window? */
  guint placed : 1;

302 303 304
  /* Is this not a transient of the focus window which is being denied focus? */
  guint denied_focus_and_not_transient : 1;

305 306 307
  /* Has this window not ever been shown yet? */
  guint showing_for_first_time : 1;

Owen Taylor's avatar
Owen Taylor committed
308
  /* Are we in meta_window_unmanage()? */
rhp's avatar
...  
rhp committed
309 310
  guint unmanaging : 1;

311 312
  /* Are we in meta_window_new()? */
  guint constructing : 1;
Jasper St. Pierre's avatar
Jasper St. Pierre committed
313

314 315
  /* Are we in the various queues? (Bitfield: see META_WINDOW_IS_IN_QUEUE) */
  guint is_in_queues : NUMBER_OF_QUEUES;
Jasper St. Pierre's avatar
Jasper St. Pierre committed
316

rhp's avatar
...  
rhp committed
317
  /* Used by keybindings.c */
rhp's avatar
...  
rhp committed
318 319 320
  guint keys_grabbed : 1;     /* normal keybindings grabbed */
  guint grab_on_frame : 1;    /* grabs are on the frame */
  guint all_keys_grabbed : 1; /* AnyKey grabbed */
Jasper St. Pierre's avatar
Jasper St. Pierre committed
321

rhp's avatar
...  
rhp committed
322 323 324 325
  /* Set if the reason for unmanaging the window is that
   * it was withdrawn
   */
  guint withdrawn : 1;
rhp's avatar
...  
rhp committed
326 327 328 329 330

  /* TRUE if constrain_position should calc placement.
   * only relevant if !window->placed
   */
  guint calc_placement : 1;
331

332 333
  /* Transient parent is a root window */
  guint transient_parent_is_root_window : 1;
Jasper St. Pierre's avatar
Jasper St. Pierre committed
334

335 336 337
  /* if TRUE, window was maximized at start of current grab op */
  guint shaken_loose : 1;

338 339
  /* if TRUE we have a grab on the focus click buttons */
  guint have_focus_click_grab : 1;
340 341 342 343

  /* if TRUE, application is buggy and SYNC resizing is turned off */
  guint disable_sync : 1;

344 345 346
  /* if TRUE, window is attached to its parent */
  guint attached : 1;

347 348 349
  /* whether or not the window is from a program running on another machine */
  guint is_remote : 1;

350 351 352 353
  /* Used for Wayland -- surfaces can behave as if they were unmapped if
   * they have a NULL buffer attached... */
  guint surface_mapped;

354 355 356
  /* if non-NULL, the bounds of the window frame */
  cairo_region_t *frame_bounds;

357 358
  /* if non-NULL, the bounding shape region of the window. Relative to
   * the server-side client window. */
359 360
  cairo_region_t *shape_region;

361 362 363
  /* if non-NULL, the opaque region _NET_WM_OPAQUE_REGION */
  cairo_region_t *opaque_region;

364 365 366
  /* the input shape region for picking */
  cairo_region_t *input_region;

367 368
  /* _NET_WM_WINDOW_OPACITY rescaled to 0xFF */
  guint8 opacity;
369

370 371 372 373
  /* if TRUE, the we have the new form of sync request counter which
   * also handles application frames */
  guint extended_sync_request_counter : 1;

374 375 376
  /* Note: can be NULL */
  GSList *struts;

377
  /* XSync update counter */
378
  XSyncCounter sync_request_counter;
379
  gint64 sync_request_serial;
380
  gint64 sync_request_wait_serial;
381
  guint sync_request_timeout_id;
382 383
  /* alarm monitoring client's _NET_WM_SYNC_REQUEST_COUNTER */
  XSyncAlarm sync_request_alarm;
Jasper St. Pierre's avatar
Jasper St. Pierre committed
384

rhp's avatar
...  
rhp committed
385 386 387 388 389
  /* Number of UnmapNotify that are caused by us, if
   * we get UnmapNotify with none pending then the client
   * is withdrawing the window.
   */
  int unmaps_pending;
390

391 392 393
  /* See docs for meta_window_get_stable_sequence() */
  guint32 stable_sequence;

394 395
  /* set to the most recent user-interaction event timestamp that we
     know about for this window */
396
  guint32 net_wm_user_time;
397 398 399

  /* window that gets updated net_wm_user_time values */
  Window user_time_window;
Jasper St. Pierre's avatar
Jasper St. Pierre committed
400

401 402 403
  gboolean has_custom_frame_extents;
  GtkBorder custom_frame_extents;

404 405 406 407 408
  /* The rectangles here are in "frame rect" coordinates. See the
   * comment at the top of meta_window_move_resize_internal() for more
   * information. */

  /* The current window geometry of the window. */
rhp's avatar
...  
rhp committed
409
  MetaRectangle rect;
rhp's avatar
...  
rhp committed
410

411
  /* The geometry to restore when we unmaximize. */
rhp's avatar
...  
rhp committed
412
  MetaRectangle saved_rect;
Havoc Pennington's avatar
Havoc Pennington committed
413

414 415 416
  /* This is the geometry the window will have if no constraints have
   * applied. We use this whenever we are moving implicitly (for example,
   * if we move to avoid a panel, we can snap back to this position if
417
   * the panel moves again).
Havoc Pennington's avatar
Havoc Pennington committed
418
   */
419
  MetaRectangle unconstrained_rect;
420

421 422 423 424 425 426 427 428 429
  /* The rectangle of the "server-side" geometry of the buffer,
   * in root coordinates.
   *
   * For X11 windows, this matches XGetGeometry of the toplevel.
   *
   * For Wayland windows, this matches the buffer size and where
   * the surface actor is positioned. */
  MetaRectangle buffer_rect;

430 431 432
  /* Cached net_wm_icon_geometry */
  MetaRectangle icon_geometry;

rhp's avatar
...  
rhp committed
433 434
  /* x/y/w/h here get filled with ConfigureRequest values */
  XSizeHints size_hints;
rhp's avatar
...  
rhp committed
435 436 437

  /* Managed by stack.c */
  MetaStackLayer layer;
438
  int stack_position; /* see comment in stack.h */
Jasper St. Pierre's avatar
Jasper St. Pierre committed
439

Jasper St. Pierre's avatar
Jasper St. Pierre committed
440
  /* Managed by delete.c */
441
  int dialog_pid;
Jasper St. Pierre's avatar
Jasper St. Pierre committed
442
  guint is_alive : 1;
443 444

  /* maintained by group.c */
445
  MetaGroup *group;
446

447
  GObject *compositor_private;
448 449 450

  /* Focused window that is (directly or indirectly) attached to this one */
  MetaWindow *attached_focus_window;
451 452 453

  /* The currently complementary tiled window, if any */
  MetaWindow *tile_match;
Adel Gadllah's avatar
Adel Gadllah committed
454 455

  /* Bypass compositor hints */
456
  guint bypass_compositor;
rhp's avatar
...  
rhp committed
457 458
};

Owen Taylor's avatar
Owen Taylor committed
459 460 461
struct _MetaWindowClass
{
  GObjectClass parent_class;
462

463 464
  void (*manage)                 (MetaWindow *window);
  void (*unmanage)               (MetaWindow *window);
Jasper St. Pierre's avatar
Jasper St. Pierre committed
465 466
  void (*ping)                   (MetaWindow *window,
                                  guint32     serial);
467 468 469
  void (*delete)                 (MetaWindow *window,
                                  guint32     timestamp);
  void (*kill)                   (MetaWindow *window);
Jasper St. Pierre's avatar
Jasper St. Pierre committed
470 471
  void (*focus)                  (MetaWindow *window,
                                  guint32     timestamp);
472 473 474 475
  void (*grab_op_began)          (MetaWindow *window,
                                  MetaGrabOp  op);
  void (*grab_op_ended)          (MetaWindow *window,
                                  MetaGrabOp  op);
476
  void (*current_workspace_changed) (MetaWindow *window);
477 478
  void (*move_resize_internal)   (MetaWindow                *window,
                                  int                        gravity,
479
                                  MetaRectangle              unconstrained_rect,
480 481 482
                                  MetaRectangle              constrained_rect,
                                  MetaMoveResizeFlags        flags,
                                  MetaMoveResizeResultFlags *result);
483
  gboolean (*update_struts)      (MetaWindow *window);
484 485 486
  void (*get_default_skip_hints) (MetaWindow *window,
                                  gboolean   *skip_taskbar_out,
                                  gboolean   *skip_pager_out);
487 488 489
  gboolean (*update_icon)        (MetaWindow  *window,
                                  GdkPixbuf  **icon,
                                  GdkPixbuf  **mini_icon);
Owen Taylor's avatar
Owen Taylor committed
490 491
};

492 493 494 495
/* These differ from window->has_foo_func in that they consider
 * the dynamic window state such as "maximized", not just the
 * window's type
 */
496 497
#define META_WINDOW_MAXIMIZED(w)       ((w)->maximized_horizontally && \
                                        (w)->maximized_vertically)
498 499
#define META_WINDOW_MAXIMIZED_VERTICALLY(w)    ((w)->maximized_vertically)
#define META_WINDOW_MAXIMIZED_HORIZONTALLY(w)  ((w)->maximized_horizontally)
500 501 502
#define META_WINDOW_TILED_SIDE_BY_SIDE(w)      ((w)->maximized_vertically && \
                                                !(w)->maximized_horizontally && \
                                                 (w)->tile_mode != META_TILE_NONE)
503 504 505 506
#define META_WINDOW_TILED_LEFT(w)     (META_WINDOW_TILED_SIDE_BY_SIDE(w) && \
                                       (w)->tile_mode == META_TILE_LEFT)
#define META_WINDOW_TILED_RIGHT(w)    (META_WINDOW_TILED_SIDE_BY_SIDE(w) && \
                                       (w)->tile_mode == META_TILE_RIGHT)
507 508
#define META_WINDOW_TILED_MAXIMIZED(w)(META_WINDOW_MAXIMIZED(w) && \
                                       (w)->tile_mode == META_TILE_MAXIMIZED)
509
#define META_WINDOW_ALLOWS_MOVE(w)     ((w)->has_move_func && !(w)->fullscreen)
510
#define META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS(w)   ((w)->has_resize_func && !META_WINDOW_MAXIMIZED (w) && !META_WINDOW_TILED_SIDE_BY_SIDE(w) && !(w)->fullscreen && !(w)->shaded)
511 512 513 514 515 516
#define META_WINDOW_ALLOWS_RESIZE(w)   (META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS (w) &&                \
                                        (((w)->size_hints.min_width < (w)->size_hints.max_width) ||  \
                                         ((w)->size_hints.min_height < (w)->size_hints.max_height)))
#define META_WINDOW_ALLOWS_HORIZONTAL_RESIZE(w) (META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS (w) && (w)->size_hints.min_width < (w)->size_hints.max_width)
#define META_WINDOW_ALLOWS_VERTICAL_RESIZE(w)   (META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS (w) && (w)->size_hints.min_height < (w)->size_hints.max_height)

517 518 519 520 521 522 523 524 525
MetaWindow * _meta_window_shared_new       (MetaDisplay         *display,
                                            MetaScreen          *screen,
                                            MetaWindowClientType client_type,
                                            MetaWaylandSurface  *surface,
                                            Window               xwindow,
                                            gulong               existing_wm_state,
                                            MetaCompEffect       effect,
                                            XWindowAttributes   *attrs);

Owen Taylor's avatar
Owen Taylor committed
526
void        meta_window_unmanage           (MetaWindow  *window,
527
                                            guint32      timestamp);
rhp's avatar
...  
rhp committed
528
void        meta_window_calc_showing       (MetaWindow  *window);
529 530
void        meta_window_queue              (MetaWindow  *window,
                                            guint queuebits);
531
void        meta_window_tile               (MetaWindow        *window);
532 533 534
void        meta_window_maximize_internal  (MetaWindow        *window,
                                            MetaMaximizeFlags  directions,
                                            MetaRectangle     *saved_rect);
rhp's avatar
...  
rhp committed
535

536
void        meta_window_make_fullscreen_internal (MetaWindow    *window);
537 538 539 540 541
void        meta_window_update_fullscreen_monitors (MetaWindow    *window,
                                                    unsigned long  top,
                                                    unsigned long  bottom,
                                                    unsigned long  left,
                                                    unsigned long  right);
542

543 544 545 546 547 548
void        meta_window_resize_frame_with_gravity (MetaWindow  *window,
                                                   gboolean     user_op,
                                                   int          w,
                                                   int          h,
                                                   int          gravity);

549 550
void        meta_window_change_workspace   (MetaWindow  *window,
                                            MetaWorkspace *workspace);
551

552 553
/* Return whether the window should be currently mapped */
gboolean    meta_window_should_be_showing   (MetaWindow  *window);
554

555 556
void        meta_window_update_struts      (MetaWindow  *window);

rhp's avatar
...  
rhp committed
557 558 559 560 561 562
/* gets position we need to set to stay in current position,
 * assuming position will be gravity-compensated. i.e.
 * this is the position a client would send in a configure
 * request.
 */
void        meta_window_get_gravity_position (MetaWindow  *window,
563
                                              int          gravity,
rhp's avatar
...  
rhp committed
564 565
                                              int         *x,
                                              int         *y);
rhp's avatar
...  
rhp committed
566 567 568
/* Get geometry for saving in the session; x/y are gravity
 * position, and w/h are in resize inc above the base size.
 */
569
void        meta_window_get_session_geometry (MetaWindow  *window,
rhp's avatar
...  
rhp committed
570 571 572 573
                                              int         *x,
                                              int         *y,
                                              int         *width,
                                              int         *height);
574

575
void        meta_window_update_unfocused_button_grabs (MetaWindow *window);
rhp's avatar
...  
rhp committed
576

577 578
void     meta_window_set_focused_internal (MetaWindow *window,
                                           gboolean    focused);
rhp's avatar
...  
rhp committed
579

580
void     meta_window_current_workspace_changed (MetaWindow *window);
rhp's avatar
...  
rhp committed
581

582 583 584 585
void meta_window_show_menu (MetaWindow         *window,
                            MetaWindowMenuType  menu,
                            int                 x,
                            int                 y);
rhp's avatar
...  
rhp committed
586

587 588 589 590
void meta_window_show_menu_for_rect (MetaWindow         *window,
                                     MetaWindowMenuType  menu,
                                     MetaRectangle      *rect);

591 592
gboolean meta_window_handle_mouse_grab_op_event  (MetaWindow         *window,
                                                  const ClutterEvent *event);
rhp's avatar
...  
rhp committed
593

594 595
GList* meta_window_get_workspaces (MetaWindow *window);

596
int meta_window_get_current_tile_monitor_number (MetaWindow *window);
597 598 599
void meta_window_get_current_tile_area         (MetaWindow    *window,
                                                MetaRectangle *tile_area);

600

601 602 603
gboolean meta_window_same_application (MetaWindow *window,
                                       MetaWindow *other_window);

604
#define META_WINDOW_IN_NORMAL_TAB_CHAIN_TYPE(w) \
Havoc Pennington's avatar
Havoc Pennington committed
605
  ((w)->type != META_WINDOW_DOCK && (w)->type != META_WINDOW_DESKTOP)
606
#define META_WINDOW_IN_NORMAL_TAB_CHAIN(w) \
607
  (((w)->input || (w)->take_focus ) && META_WINDOW_IN_NORMAL_TAB_CHAIN_TYPE (w) && (!(w)->skip_taskbar))
Havoc Pennington's avatar
Havoc Pennington committed
608
#define META_WINDOW_IN_DOCK_TAB_CHAIN(w) \
609
  (((w)->input || (w)->take_focus) && (! META_WINDOW_IN_NORMAL_TAB_CHAIN_TYPE (w) || (w)->skip_taskbar))
610 611
#define META_WINDOW_IN_GROUP_TAB_CHAIN(w, g) \
  (((w)->input || (w)->take_focus) && (!g || meta_window_get_group(w)==g))
Havoc Pennington's avatar
Havoc Pennington committed
612

613 614
void meta_window_free_delete_dialog (MetaWindow *window);

615 616 617
void meta_window_update_keyboard_resize (MetaWindow *window,
                                         gboolean    update_cursor);
void meta_window_update_keyboard_move   (MetaWindow *window);
618

Havoc Pennington's avatar
Havoc Pennington committed
619 620
void meta_window_update_layer (MetaWindow *window);

621
void meta_window_recalc_features    (MetaWindow *window);
622

623 624
void meta_window_set_type (MetaWindow     *window,
                           MetaWindowType  type);
625

Owen W. Taylor's avatar
Owen W. Taylor committed
626 627
void meta_window_frame_size_changed (MetaWindow *window);

628 629
void meta_window_stack_just_below (MetaWindow *window,
                                   MetaWindow *below_this_one);
630

631
void meta_window_set_user_time (MetaWindow *window,
632
                                guint32     timestamp);
633

634
void meta_window_update_for_monitors_changed (MetaWindow *window);
635
void meta_window_update_on_all_workspaces (MetaWindow *window);
636

637
gboolean meta_window_should_attach_to_parent (MetaWindow *window);
638
gboolean meta_window_can_tile_side_by_side   (MetaWindow *window);
639

640 641
void meta_window_compute_tile_match (MetaWindow *window);

642 643
gboolean meta_window_updates_are_frozen (MetaWindow *window);

644 645 646 647 648 649 650 651 652 653 654 655 656
void meta_window_set_title                (MetaWindow *window,
                                           const char *title);
void meta_window_set_wm_class             (MetaWindow *window,
                                           const char *wm_class,
                                           const char *wm_instance);
void meta_window_set_gtk_dbus_properties  (MetaWindow *window,
                                           const char *application_id,
                                           const char *unique_bus_name,
                                           const char *appmenu_path,
                                           const char *menubar_path,
                                           const char *application_object_path,
                                           const char *window_object_path);

657 658 659
void meta_window_set_transient_for        (MetaWindow *window,
                                           MetaWindow *parent);

660
void meta_window_set_opacity              (MetaWindow *window,
661
                                           guint8      opacity);
662

663 664 665
void meta_window_set_custom_frame_extents (MetaWindow *window,
                                           GtkBorder  *extents);

666 667 668 669
void meta_window_handle_enter (MetaWindow  *window,
                               guint32      timestamp,
                               guint        root_x,
                               guint        root_y);
670
void meta_window_handle_leave (MetaWindow  *window);
671

672 673 674
gboolean meta_window_handle_ungrabbed_event (MetaWindow         *window,
                                             const ClutterEvent *event);

675 676 677
void meta_window_set_surface_mapped (MetaWindow *window,
                                     gboolean    surface_mapped);

678 679
void meta_window_get_client_area_rect (const MetaWindow      *window,
                                       cairo_rectangle_int_t *rect);
680 681
void meta_window_get_titlebar_rect (MetaWindow    *window,
                                    MetaRectangle *titlebar_rect);
682

683 684 685 686 687
void meta_window_activate_full (MetaWindow     *window,
                                guint32         timestamp,
                                MetaClientType  source_indication,
                                MetaWorkspace  *workspace);

688 689
void meta_window_update_monitor (MetaWindow *window,
                                 gboolean    user_op);
690

691 692 693
void meta_window_set_urgent (MetaWindow *window,
                             gboolean    urgent);

694 695 696 697 698
void meta_window_update_resize (MetaWindow *window,
                                gboolean    snap,
                                int x, int y,
                                gboolean force);

699 700 701
void meta_window_move_resize_internal (MetaWindow          *window,
                                       MetaMoveResizeFlags  flags,
                                       int                  gravity,
702
                                       MetaRectangle        frame_rect);
703

704 705 706
void meta_window_grab_op_began (MetaWindow *window, MetaGrabOp op);
void meta_window_grab_op_ended (MetaWindow *window, MetaGrabOp op);

Jasper St. Pierre's avatar
Jasper St. Pierre committed
707 708
void meta_window_set_alive (MetaWindow *window, gboolean is_alive);

709 710
gboolean meta_window_has_pointer (MetaWindow *window);

711
#endif