window-private.h 27.6 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 12 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
rhp's avatar
...  
rhp committed
17 18 19 20 21 22 23 24 25 26 27 28
 * 
 * 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.
 * 
 * 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"
Havoc Pennington's avatar
Havoc Pennington committed
41
#include "iconcache.h"
rhp's avatar
...  
rhp committed
42
#include <X11/Xutil.h>
43
#include <cairo.h>
rhp's avatar
...  
rhp committed
44
#include <gdk-pixbuf/gdk-pixbuf.h>
45
#include <clutter/clutter.h>
46
#include "meta-wayland-types.h"
rhp's avatar
...  
rhp committed
47

48
typedef struct _MetaWindowQueue MetaWindowQueue;
49

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

57 58 59 60 61 62 63 64
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

65 66 67 68 69 70 71

typedef enum {
  _NET_WM_BYPASS_COMPOSITOR_HINT_AUTO = 0,
  _NET_WM_BYPASS_COMPOSITOR_HINT_ON = 1,
  _NET_WM_BYPASS_COMPOSITOR_HINT_OFF = 2,
} MetaBypassCompositorHintValue;

72

rhp's avatar
...  
rhp committed
73 74
struct _MetaWindow
{
Owen Taylor's avatar
Owen Taylor committed
75 76
  GObject parent_instance;
  
rhp's avatar
...  
rhp committed
77
  MetaDisplay *display;
rhp's avatar
...  
rhp committed
78
  MetaScreen *screen;
79
  const MetaMonitorInfo *monitor;
80
  MetaWorkspace *workspace;
81 82 83 84
  MetaWindowClientType client_type;
#ifdef HAVE_WAYLAND
  MetaWaylandSurface *surface;
#endif
rhp's avatar
...  
rhp committed
85
  Window xwindow;
rhp's avatar
...  
rhp committed
86 87 88 89
  /* may be NULL! not all windows get decorated */
  MetaFrame *frame;
  int depth;
  Visual *xvisual;
90
  Colormap colormap;
rhp's avatar
...  
rhp committed
91
  char *desc; /* used in debug spew */
rhp's avatar
...  
rhp committed
92
  char *title;
rhp's avatar
...  
rhp committed
93

rhp's avatar
...  
rhp committed
94 95
  char *icon_name;
  GdkPixbuf *icon;
96
  GdkPixbuf *mini_icon;
Havoc Pennington's avatar
Havoc Pennington committed
97 98 99
  MetaIconCache icon_cache;
  Pixmap wm_hints_pixmap;
  Pixmap wm_hints_mask;
rhp's avatar
...  
rhp committed
100
  
rhp's avatar
...  
rhp committed
101 102
  MetaWindowType type;
  Atom type_atom;
103

104
  /* NOTE these five are not in UTF-8, we just treat them as random
rhp's avatar
...  
rhp committed
105 106 107 108 109 110
   * binary data
   */
  char *res_class;
  char *res_name;
  char *role;
  char *sm_client_id;
111
  char *wm_client_machine;
112

Havoc Pennington's avatar
Havoc Pennington committed
113
  char *startup_id;
Tomas Frydrych's avatar
Tomas Frydrych committed
114
  char *mutter_hints;
115
  char *gtk_theme_variant;
116 117 118 119 120 121
  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;
122

123
  int hide_titlebar_when_maximized;
124
  int net_wm_pid;
rhp's avatar
...  
rhp committed
125
  
rhp's avatar
...  
rhp committed
126 127 128
  Window xtransient_for;
  Window xgroup_leader;
  Window xclient_leader;
129
  MetaWindow *transient_for;
rhp's avatar
...  
rhp committed
130 131

  /* Initial workspace property */
Havoc Pennington's avatar
Havoc Pennington committed
132 133
  int initial_workspace;  
  
134
  /* Initial timestamp property */
135
  guint32 initial_timestamp;  
136
  
137 138 139
  /* Whether this is an override redirect window or not */
  guint override_redirect : 1;

rhp's avatar
...  
rhp committed
140
  /* Whether we're maximized */
141 142
  guint maximized_horizontally : 1;
  guint maximized_vertically : 1;
143 144

  /* Whether we have to maximize/minimize after placement */
145 146
  guint maximize_horizontally_after_placement : 1;
  guint maximize_vertically_after_placement : 1;
147
  guint minimize_after_placement : 1;
rhp's avatar
...  
rhp committed
148

149 150 151 152
  /* 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;
153 154 155
  /* 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;
156
  int tile_monitor_number;
157

rhp's avatar
...  
rhp committed
158 159
  /* Whether we're shaded */
  guint shaded : 1;
rhp's avatar
...  
rhp committed
160

161 162
  /* Whether we're fullscreen */
  guint fullscreen : 1;
163

164 165 166
  /* Whether the urgent flag of WM_HINTS is set */
  guint wm_hints_urgent : 1;

167 168 169
  /* Whether we have to fullscreen after placement */
  guint fullscreen_after_placement : 1;

170 171 172 173
  /* 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. */
174
  gint fullscreen_monitors[4];
175
  
176 177 178
  /* Whether we're trying to constrain the window to be fully onscreen */
  guint require_fully_onscreen : 1;

179 180
  /* Whether we're trying to constrain the window to be on a single monitor */
  guint require_on_single_monitor : 1;
181

182 183 184
  /* Whether we're trying to constrain the window's titlebar to be onscreen */
  guint require_titlebar_visible : 1;

rhp's avatar
...  
rhp committed
185 186 187 188 189
  /* 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
190

191 192 193 194 195
  /* 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
196 197
  /* Minimize is the state controlled by the minimize button */
  guint minimized : 1;
198
  guint tab_unminimized : 1;
rhp's avatar
...  
rhp committed
199

rhp's avatar
...  
rhp committed
200 201 202 203 204
  /* Whether the window is mapped; actual server-side state
   * see also unmaps_pending
   */
  guint mapped : 1;
  
205 206 207 208 209
  /* Whether window has been hidden from view by lowering it to the bottom
   * of window stack.
   */
  guint hidden : 1;

210 211 212 213 214 215 216 217 218
  /* Whether the compositor thinks the window is visible
   */
  guint visible_to_compositor : 1;

  /* 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
219 220 221
  /* Iconic is the state in WM_STATE; happens for workspaces/shading
   * in addition to minimize
   */
rhp's avatar
...  
rhp committed
222
  guint iconic : 1;
rhp's avatar
...  
rhp committed
223
  /* initially_iconic is the WM_HINTS setting when we first manage
rhp's avatar
...  
rhp committed
224
   * the window. It's taken to mean initially minimized.
rhp's avatar
...  
rhp committed
225 226
   */
  guint initially_iconic : 1;
rhp's avatar
...  
rhp committed
227 228 229

  /* whether an initial workspace was explicitly set */
  guint initial_workspace_set : 1;
rhp's avatar
...  
rhp committed
230
  
231 232 233 234 235
  /* whether an initial timestamp was explicitly set */
  guint initial_timestamp_set : 1;
  
  /* whether net_wm_user_time has been set yet */
  guint net_wm_user_time_set : 1;
236 237 238

  /* whether net_wm_icon_geometry has been set */
  guint icon_geometry_set : 1;
239
  
240
  /* These are the flags from WM_PROTOCOLS */
rhp's avatar
...  
rhp committed
241 242
  guint take_focus : 1;
  guint delete_window : 1;
243
  guint net_wm_ping : 1;
rhp's avatar
...  
rhp committed
244 245
  /* Globally active / No input */
  guint input : 1;
246
  
rhp's avatar
...  
rhp committed
247 248
  /* MWM hints about features of window */
  guint mwm_decorated : 1;
249
  guint mwm_border_only : 1;
rhp's avatar
...  
rhp committed
250 251 252 253 254 255 256
  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;
  
  /* Computed features of window */
rhp's avatar
...  
rhp committed
257
  guint decorated : 1;
258
  guint border_only : 1;
259
  guint always_sticky : 1;
rhp's avatar
...  
rhp committed
260 261 262
  guint has_close_func : 1;
  guint has_minimize_func : 1;
  guint has_maximize_func : 1;
rhp's avatar
...  
rhp committed
263
  guint has_shade_func : 1;
rhp's avatar
...  
rhp committed
264 265
  guint has_move_func : 1;
  guint has_resize_func : 1;
266
  guint has_fullscreen_func : 1;
rhp's avatar
...  
rhp committed
267
  
rhp's avatar
...  
rhp committed
268 269
  /* Weird "_NET_WM_STATE_MODAL" flag */
  guint wm_state_modal : 1;
270 271

  /* TRUE if the client forced these on */
rhp's avatar
...  
rhp committed
272 273
  guint wm_state_skip_taskbar : 1;
  guint wm_state_skip_pager : 1;
274 275 276 277

  /* Computed whether to skip taskbar or not */
  guint skip_taskbar : 1;
  guint skip_pager : 1;
Havoc Pennington's avatar
Havoc Pennington committed
278 279 280 281

  /* TRUE if client set these */
  guint wm_state_above : 1;
  guint wm_state_below : 1;
282 283 284

  /* EWHH demands attention flag */
  guint wm_state_demands_attention : 1;
rhp's avatar
...  
rhp committed
285
  
286
  /* TRUE iff window == window->display->focus_window */
rhp's avatar
...  
rhp committed
287
  guint has_focus : 1;
288

rhp's avatar
...  
rhp committed
289 290 291
  /* Have we placed this window? */
  guint placed : 1;

292 293 294
  /* Must we force_save_user_window_placement? */
  guint force_save_user_rect : 1;

295 296 297
  /* Is this not a transient of the focus window which is being denied focus? */
  guint denied_focus_and_not_transient : 1;

298 299 300
  /* Has this window not ever been shown yet? */
  guint showing_for_first_time : 1;

Owen Taylor's avatar
Owen Taylor committed
301
  /* Are we in meta_window_unmanage()? */
rhp's avatar
...  
rhp committed
302 303
  guint unmanaging : 1;

304 305 306
  /* Are we in meta_window_new()? */
  guint constructing : 1;
  
307 308 309
  /* Are we in the various queues? (Bitfield: see META_WINDOW_IS_IN_QUEUE) */
  guint is_in_queues : NUMBER_OF_QUEUES;
 
rhp's avatar
...  
rhp committed
310
  /* Used by keybindings.c */
rhp's avatar
...  
rhp committed
311 312 313 314
  guint keys_grabbed : 1;     /* normal keybindings grabbed */
  guint grab_on_frame : 1;    /* grabs are on the frame */
  guint all_keys_grabbed : 1; /* AnyKey grabbed */
  
rhp's avatar
...  
rhp committed
315 316 317 318
  /* Set if the reason for unmanaging the window is that
   * it was withdrawn
   */
  guint withdrawn : 1;
rhp's avatar
...  
rhp committed
319 320 321 322 323

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

325 326
  /* Transient parent is a root window */
  guint transient_parent_is_root_window : 1;
327 328

  /* Info on which props we got our attributes from */
329 330 331 332
  guint using_net_wm_name              : 1; /* vs. plain wm_name */
  guint using_net_wm_visible_name      : 1; /* tracked so we can clear it */
  guint using_net_wm_icon_name         : 1; /* vs. plain wm_icon_name */
  guint using_net_wm_visible_icon_name : 1; /* tracked so we can clear it */
333

334 335
  /* icon props have changed */
  guint need_reread_icon : 1;
336
  
337 338 339
  /* if TRUE, window was maximized at start of current grab op */
  guint shaken_loose : 1;

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

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

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

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

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

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

359 360 361
  /* if non-NULL, the bounding shape region of the window */
  cairo_region_t *shape_region;

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

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

368 369 370
  /* _NET_WM_WINDOW_OPACITY */
  guint opacity;

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

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

378 379
#ifdef HAVE_XSYNC
  /* XSync update counter */
380
  XSyncCounter sync_request_counter;
381
  gint64 sync_request_serial;
382
  gint64 sync_request_wait_serial;
383
  guint sync_request_timeout_id;
384 385
  /* alarm monitoring client's _NET_WM_SYNC_REQUEST_COUNTER */
  XSyncAlarm sync_request_alarm;
386
#endif
rhp's avatar
...  
rhp committed
387
  
rhp's avatar
...  
rhp committed
388 389 390 391 392
  /* 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;
393

394 395 396
  /* See docs for meta_window_get_stable_sequence() */
  guint32 stable_sequence;

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

  /* window that gets updated net_wm_user_time values */
  Window user_time_window;
Havoc Pennington's avatar
Havoc Pennington committed
403
  
rhp's avatar
...  
rhp committed
404 405 406
  /* The size we set the window to last (i.e. what we believe
   * to be its actual size on the server). The x, y are
   * the actual server-side x,y so are relative to the frame
407 408 409
   * (meaning that they just hold the frame width and height) 
   * or the root window (meaning they specify the location
   * of the top left of the inner window) as appropriate.
rhp's avatar
...  
rhp committed
410
   */
rhp's avatar
...  
rhp committed
411
  MetaRectangle rect;
rhp's avatar
...  
rhp committed
412

413 414 415 416 417 418
  /* The size and position we want the window to be (i.e. what we last asked
   * the client to configure).
   * This is only used for wayland clients.
   */
  MetaRectangle expected_rect;

Jasper St. Pierre's avatar
Jasper St. Pierre committed
419 420 421
  gboolean has_custom_frame_extents;
  GtkBorder custom_frame_extents;

422 423 424 425
  /* The geometry to restore when we unmaximize.  The position is in
   * root window coords, even if there's a frame, which contrasts with
   * window->rect above.  Note that this gives the position and size
   * of the client window (i.e. ignoring the frame).
rhp's avatar
...  
rhp committed
426 427
   */
  MetaRectangle saved_rect;
Havoc Pennington's avatar
Havoc Pennington committed
428 429 430

  /* This is the geometry the window had after the last user-initiated
   * move/resize operations. We use this whenever we are moving the
431 432 433 434
   * implicitly (for example, if we move to avoid a panel, we can snap
   * back to this position if the panel moves again).  Note that this
   * gives the position and size of the client window (i.e. ignoring
   * the frame).
Havoc Pennington's avatar
Havoc Pennington committed
435 436 437
   *
   * Position valid if user_has_moved, size valid if user_has_resized
   *
438
   * Position always in root coords, unlike window->rect.
Havoc Pennington's avatar
Havoc Pennington committed
439 440
   */
  MetaRectangle user_rect;
rhp's avatar
...  
rhp committed
441
  
442 443 444
  /* Cached net_wm_icon_geometry */
  MetaRectangle icon_geometry;

rhp's avatar
...  
rhp committed
445 446 447 448
  /* Requested geometry */
  int border_width;
  /* x/y/w/h here get filled with ConfigureRequest values */
  XSizeHints size_hints;
rhp's avatar
...  
rhp committed
449 450 451

  /* Managed by stack.c */
  MetaStackLayer layer;
452 453
  int stack_position; /* see comment in stack.h */
  
454 455
  /* Current dialog open for this window */
  int dialog_pid;
456 457

  /* maintained by group.c */
458
  MetaGroup *group;
459

460
  GObject *compositor_private;
461 462 463

  /* Focused window that is (directly or indirectly) attached to this one */
  MetaWindow *attached_focus_window;
464 465 466

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

  /* Bypass compositor hints */
469
  guint bypass_compositor;
470 471

  GSList *pending_pings;
rhp's avatar
...  
rhp committed
472 473
};

Owen Taylor's avatar
Owen Taylor committed
474 475 476
struct _MetaWindowClass
{
  GObjectClass parent_class;
477 478

  void (*workspace_changed) (MetaWindow *window, int  old_workspace);
Tomas Frydrych's avatar
Tomas Frydrych committed
479
  void (*focus)             (MetaWindow *window);
Tomas Frydrych's avatar
Tomas Frydrych committed
480
  void (*raised)            (MetaWindow *window);
481
  void (*unmanaged)         (MetaWindow *window);
Owen Taylor's avatar
Owen Taylor committed
482 483
};

484 485 486 487
/* These differ from window->has_foo_func in that they consider
 * the dynamic window state such as "maximized", not just the
 * window's type
 */
488 489
#define META_WINDOW_MAXIMIZED(w)       ((w)->maximized_horizontally && \
                                        (w)->maximized_vertically)
490 491
#define META_WINDOW_MAXIMIZED_VERTICALLY(w)    ((w)->maximized_vertically)
#define META_WINDOW_MAXIMIZED_HORIZONTALLY(w)  ((w)->maximized_horizontally)
492 493 494
#define META_WINDOW_TILED_SIDE_BY_SIDE(w)      ((w)->maximized_vertically && \
                                                !(w)->maximized_horizontally && \
                                                 (w)->tile_mode != META_TILE_NONE)
495 496 497 498
#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)
499 500
#define META_WINDOW_TILED_MAXIMIZED(w)(META_WINDOW_MAXIMIZED(w) && \
                                       (w)->tile_mode == META_TILE_MAXIMIZED)
501
#define META_WINDOW_ALLOWS_MOVE(w)     ((w)->has_move_func && !(w)->fullscreen)
502
#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)
503 504 505 506 507 508
#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)

rhp's avatar
...  
rhp committed
509
MetaWindow* meta_window_new                (MetaDisplay *display,
rhp's avatar
...  
rhp committed
510
                                            Window       xwindow,
511 512
                                            gboolean     must_be_viewable,
                                            MetaCompEffect     effect);
513 514
MetaWindow *meta_window_new_for_wayland    (MetaDisplay        *display,
                                            MetaWaylandSurface *surface);
Owen Taylor's avatar
Owen Taylor committed
515
void        meta_window_unmanage           (MetaWindow  *window,
516
                                            guint32      timestamp);
rhp's avatar
...  
rhp committed
517
void        meta_window_calc_showing       (MetaWindow  *window);
518 519
void        meta_window_queue              (MetaWindow  *window,
                                            guint queuebits);
520
void        meta_window_tile               (MetaWindow        *window);
521 522 523
void        meta_window_maximize_internal  (MetaWindow        *window,
                                            MetaMaximizeFlags  directions,
                                            MetaRectangle     *saved_rect);
524 525 526 527 528
void        meta_window_unmaximize_with_gravity (MetaWindow        *window,
                                                 MetaMaximizeFlags  directions,
                                                 int                new_width,
                                                 int                new_height,
                                                 int                gravity);
rhp's avatar
...  
rhp committed
529

530
void        meta_window_make_fullscreen_internal (MetaWindow    *window);
531 532 533 534 535
void        meta_window_update_fullscreen_monitors (MetaWindow    *window,
                                                    unsigned long  top,
                                                    unsigned long  bottom,
                                                    unsigned long  left,
                                                    unsigned long  right);
536

Owen W. Taylor's avatar
Owen W. Taylor committed
537

rhp's avatar
...  
rhp committed
538 539
/* args to move are window pos, not frame pos */
void        meta_window_move               (MetaWindow  *window,
Havoc Pennington's avatar
Havoc Pennington committed
540
                                            gboolean     user_op,
rhp's avatar
...  
rhp committed
541 542
                                            int          root_x_nw,
                                            int          root_y_nw);
rhp's avatar
...  
rhp committed
543
void        meta_window_resize             (MetaWindow  *window,
Havoc Pennington's avatar
Havoc Pennington committed
544
                                            gboolean     user_op,
rhp's avatar
...  
rhp committed
545 546 547
                                            int          w,
                                            int          h);
void        meta_window_move_resize        (MetaWindow  *window,
Havoc Pennington's avatar
Havoc Pennington committed
548
                                            gboolean     user_op,
rhp's avatar
...  
rhp committed
549 550 551 552
                                            int          root_x_nw,
                                            int          root_y_nw,
                                            int          w,
                                            int          h);
Havoc Pennington's avatar
Havoc Pennington committed
553 554
void        meta_window_resize_with_gravity (MetaWindow  *window,
                                             gboolean     user_op,
rhp's avatar
...  
rhp committed
555 556 557
                                             int          w,
                                             int          h,
                                             int          gravity);
558 559
void        meta_window_change_workspace   (MetaWindow  *window,
                                            MetaWorkspace *workspace);
560

561 562
/* Return whether the window should be currently mapped */
gboolean    meta_window_should_be_showing   (MetaWindow  *window);
563 564 565

/* See warning in window.c about this function */
gboolean    __window_is_terminal (MetaWindow *window);
566

567 568
void        meta_window_update_struts      (MetaWindow  *window);

rhp's avatar
...  
rhp committed
569 570 571 572
/* this gets root coords */
void        meta_window_get_position       (MetaWindow  *window,
                                            int         *x,
                                            int         *y);
573 574 575 576 577 578 579

/* Gets root coords for x, y, width & height of client window; uses
 * meta_window_get_position for x & y.
 */
void        meta_window_get_client_root_coords (MetaWindow    *window,
                                                MetaRectangle *rect);

rhp's avatar
...  
rhp committed
580 581 582 583 584 585
/* 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,
586
                                              int          gravity,
rhp's avatar
...  
rhp committed
587 588
                                              int         *x,
                                              int         *y);
rhp's avatar
...  
rhp committed
589 590 591 592 593 594 595 596
/* Get geometry for saving in the session; x/y are gravity
 * position, and w/h are in resize inc above the base size.
 */
void        meta_window_get_geometry         (MetaWindow  *window,
                                              int         *x,
                                              int         *y,
                                              int         *width,
                                              int         *height);
597

598
void        meta_window_update_unfocused_button_grabs (MetaWindow *window);
rhp's avatar
...  
rhp committed
599 600 601 602

/* Sends a client message */
void meta_window_send_icccm_message (MetaWindow *window,
                                     Atom        atom,
603
                                     guint32     timestamp);
rhp's avatar
...  
rhp committed
604

rhp's avatar
...  
rhp committed
605

606 607 608 609 610 611 612
void     meta_window_move_resize_request(MetaWindow *window,
                                         guint       value_mask,
                                         int         gravity,
                                         int         x,
                                         int         y,
                                         int         width,
                                         int         height);
613 614 615 616 617
void     meta_window_move_resize_wayland (MetaWindow *window,
                                          int         width,
                                          int         height,
                                          int         dx,
                                          int         dy);
618 619
void     meta_window_set_focused_internal (MetaWindow *window,
                                           gboolean    focused);
rhp's avatar
...  
rhp committed
620

621
void     meta_window_set_current_workspace_hint (MetaWindow *window);
rhp's avatar
...  
rhp committed
622 623

unsigned long meta_window_get_net_wm_desktop (MetaWindow *window);
rhp's avatar
...  
rhp committed
624 625 626 627 628

void meta_window_show_menu (MetaWindow *window,
                            int         root_x,
                            int         root_y,
                            int         button,
629
                            guint32     timestamp);
rhp's avatar
...  
rhp committed
630

631 632 633
gboolean meta_window_titlebar_is_onscreen    (MetaWindow *window);
void     meta_window_shove_titlebar_onscreen (MetaWindow *window);

rhp's avatar
...  
rhp committed
634 635 636
void meta_window_set_gravity (MetaWindow *window,
                              int         gravity);

637 638
#ifdef HAVE_XSYNC
void meta_window_update_sync_request_counter (MetaWindow *window,
639
                                              gint64      new_counter_value);
640 641
#endif /* HAVE_XSYNC */

642 643 644 645
void meta_window_handle_mouse_grab_op_event  (MetaWindow         *window,
                                              const ClutterEvent *event);
void meta_window_handle_mouse_grab_op_xevent (MetaWindow         *window,
                                              XIDeviceEvent      *xevent);
rhp's avatar
...  
rhp committed
646

647 648
GList* meta_window_get_workspaces (MetaWindow *window);

649 650 651
void meta_window_get_current_tile_area         (MetaWindow    *window,
                                                MetaRectangle *tile_area);

652

653 654 655
gboolean meta_window_same_application (MetaWindow *window,
                                       MetaWindow *other_window);

656
#define META_WINDOW_IN_NORMAL_TAB_CHAIN_TYPE(w) \
Havoc Pennington's avatar
Havoc Pennington committed
657
  ((w)->type != META_WINDOW_DOCK && (w)->type != META_WINDOW_DESKTOP)
658
#define META_WINDOW_IN_NORMAL_TAB_CHAIN(w) \
659
  (((w)->input || (w)->take_focus ) && META_WINDOW_IN_NORMAL_TAB_CHAIN_TYPE (w) && (!(w)->skip_taskbar))
Havoc Pennington's avatar
Havoc Pennington committed
660
#define META_WINDOW_IN_DOCK_TAB_CHAIN(w) \
661
  (((w)->input || (w)->take_focus) && (! META_WINDOW_IN_NORMAL_TAB_CHAIN_TYPE (w) || (w)->skip_taskbar))
662 663
#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
664

665 666
void meta_window_refresh_resize_popup (MetaWindow *window);

667 668
void meta_window_free_delete_dialog (MetaWindow *window);

669 670
void meta_window_create_sync_request_alarm  (MetaWindow *window);
void meta_window_destroy_sync_request_alarm (MetaWindow *window);
671

672 673 674
void meta_window_update_keyboard_resize (MetaWindow *window,
                                         gboolean    update_cursor);
void meta_window_update_keyboard_move   (MetaWindow *window);
675

Havoc Pennington's avatar
Havoc Pennington committed
676 677
void meta_window_update_layer (MetaWindow *window);

678
void meta_window_recalc_features    (MetaWindow *window);
679

680
/* recalc_window_type is x11 only, wayland does its thing and then calls type_changed */
681
void meta_window_recalc_window_type (MetaWindow *window);
682
void meta_window_type_changed       (MetaWindow *window);
683

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

686 687
void meta_window_stack_just_below (MetaWindow *window,
                                   MetaWindow *below_this_one);
688

689
void meta_window_set_user_time (MetaWindow *window,
690
                                guint32     timestamp);
691

692 693
void meta_window_update_icon_now (MetaWindow *window);

694
void meta_window_update_for_monitors_changed (MetaWindow *window);
695
void meta_window_update_on_all_workspaces (MetaWindow *window);
696

697 698 699
void meta_window_propagate_focus_appearance (MetaWindow *window,
                                             gboolean    focused);

700
gboolean meta_window_should_attach_to_parent (MetaWindow *window);
701
gboolean meta_window_can_tile_side_by_side   (MetaWindow *window);
702

703 704
void meta_window_compute_tile_match (MetaWindow *window);

705 706
gboolean meta_window_updates_are_frozen (MetaWindow *window);

707 708 709 710 711 712 713 714 715 716 717 718 719
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);

720 721 722
void meta_window_set_transient_for        (MetaWindow *window,
                                           MetaWindow *parent);

723 724 725
void meta_window_set_opacity              (MetaWindow *window,
                                           guint       opacity);

726 727 728 729 730
void meta_window_handle_enter (MetaWindow  *window,
                               guint32      timestamp,
                               guint        root_x,
                               guint        root_y);

731 732 733
void meta_window_set_surface_mapped (MetaWindow *window,
                                     gboolean    surface_mapped);

734 735 736 737 738 739 740 741 742 743 744
typedef void (* MetaWindowPingFunc) (MetaWindow  *window,
				     guint32      timestamp,
				     gpointer     user_data);

void meta_window_ping (MetaWindow         *window,
                       guint32             timestamp,
                       MetaWindowPingFunc  ping_reply_func,
                       MetaWindowPingFunc  ping_timeout_func,
                       void               *user_data);
void meta_window_pong (MetaWindow *window,
                       guint32     timestamp);
745
Window meta_window_get_toplevel_xwindow (MetaWindow *window);
746

747 748 749 750 751
void meta_window_activate_full (MetaWindow     *window,
                                guint32         timestamp,
                                MetaClientType  source_indication,
                                MetaWorkspace  *workspace);

752
#endif