mutter/src/window.h

459 lines
16 KiB
C
Raw Normal View History

2001-05-30 15:36:31 +00:00
/* Metacity X managed windows */
/*
* Copyright (C) 2001 Havoc Pennington
* Copyright (C) 2002 Red Hat, Inc.
2001-05-30 15:36:31 +00:00
*
* 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
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_WINDOW_H
#define META_WINDOW_H
#include <config.h>
2001-05-30 15:36:31 +00:00
#include "screen.h"
2001-05-31 06:42:58 +00:00
#include "util.h"
2001-06-10 07:52:35 +00:00
#include "stack.h"
#include "iconcache.h"
2001-06-02 04:14:18 +00:00
#include <X11/Xutil.h>
2001-06-24 03:18:10 +00:00
#include <gdk-pixbuf/gdk-pixbuf.h>
2001-05-30 15:36:31 +00:00
typedef struct _MetaGroup MetaGroup;
on unminimize, queue calc_showing on all transients 2002-05-05 Havoc Pennington <hp@pobox.com> * src/window.c (meta_window_unminimize): on unminimize, queue calc_showing on all transients (meta_window_activate): on activate, unminimize all a window's ancestors, not just the window itself. * src/workspace.c (set_work_area_hint): don't increment "tmp" by 16 unsigned long, increment by 4 * src/window.c (meta_window_free): if a window isn't minimized, restore its WM_STATE to NormalState instead of IconicState, since IconicState on initial window map means that the window should be minimized. * src/workspace.c (meta_workspace_invalidate_work_area): queue an idle to recompute the work area hint. (set_work_area_hint): we need 4*num_workspaces ints, not just num_workspaces. * src/screen.c (meta_screen_new): add work_area_idle field, handle it on screen shutdown * src/common.h (META_PRIORITY_PREFS_NOTIFY, META_PRIORITY_WORK_AREA_HINT): define some idle priorities * src/window.c (meta_window_calc_showing): hide windows if their parent window is minimized (meta_window_minimize): also queue_calc_showing on all transients of the window being minimized * src/place.c (constrain_placement): function to apply placement-time-only constraints, such as "not off the left of the screen" (meta_window_place): put dialogs down a bit over their parent, not right at the top. (meta_window_place): when centering a dialog, center it on the current xinerama screen, rather than the entire screen. * src/screen.c (meta_screen_get_current_xinerama): new function, but not implemented
2002-05-05 05:41:13 +00:00
typedef void (*MetaWindowForeachFunc) (MetaWindow *window,
void *data);
typedef enum
{
META_WINDOW_NORMAL,
META_WINDOW_DESKTOP,
META_WINDOW_DOCK,
META_WINDOW_DIALOG,
META_WINDOW_MODAL_DIALOG,
META_WINDOW_TOOLBAR,
META_WINDOW_MENU,
META_WINDOW_UTILITY,
META_WINDOW_SPLASHSCREEN
} MetaWindowType;
2001-05-30 15:36:31 +00:00
struct _MetaWindow
{
2001-05-31 06:42:58 +00:00
MetaDisplay *display;
2001-05-30 15:36:31 +00:00
MetaScreen *screen;
2001-06-06 04:47:37 +00:00
GList *workspaces;
2001-05-30 15:36:31 +00:00
Window xwindow;
2001-05-31 06:42:58 +00:00
/* may be NULL! not all windows get decorated */
MetaFrame *frame;
int depth;
Visual *xvisual;
Colormap colormap;
2001-06-02 04:14:18 +00:00
char *desc; /* used in debug spew */
2001-06-01 03:00:01 +00:00
char *title;
2001-06-04 06:17:52 +00:00
2001-06-24 03:18:10 +00:00
char *icon_name;
GdkPixbuf *icon;
GdkPixbuf *mini_icon;
MetaIconCache icon_cache;
Pixmap wm_hints_pixmap;
Pixmap wm_hints_mask;
2001-06-24 03:18:10 +00:00
2001-06-10 03:17:15 +00:00
MetaWindowType type;
Atom type_atom;
/* NOTE these five are not in UTF-8, we just treat them as random
2001-06-09 21:58:30 +00:00
* binary data
*/
char *res_class;
char *res_name;
char *role;
char *sm_client_id;
char *wm_client_machine;
lengthen to 15 seconds 2002-11-30 Havoc Pennington <hp@pobox.com> * src/screen.c (STARTUP_TIMEOUT): lengthen to 15 seconds * src/util.c (utf8_fputs): hmm, return a value * src/screen.c (meta_screen_apply_startup_properties): new function to apply initial workspace based on startup sequence. * src/window.c (meta_window_new): load _NET_STARTUP_ID (meta_window_get_startup_id): new function * src/window-props.c (meta_display_init_window_prop_hooks): add hooks for _NET_STARTUP_ID * src/display.c (event_callback): send property events to groups. * src/xprops.c (meta_prop_get_values): make a type of INVALID mean to ignore that property (don't fetch its value). * src/group.c (meta_group_property_notify): new function * src/screen.c (set_supported_hint): support _NET_STARTUP_ID * src/display.c (meta_display_open): add _NET_STARTUP_ID to atoms we initialize * src/group-private.h: private header shared between group-props.c, group.c * src/group-props.h, src/group-props.c: new files to contain functions for retrieving group properties * src/window.c (meta_window_same_application): change this a bit to work with new definition of group * src/group.c (meta_window_get_group): always create a group for every window, using the window's own ID as group leader if required. * src/window.c (update_wm_hints): handle changes to group leader * src/group.c (meta_window_group_leader_changed): new function * src/display.h (struct _MetaDisplay): _NET_WM_WINDOW_TYPE_SPLASH, not SPLASHSCREEN. Reported by Gregory Merchan and Matthias Clasen. * src/screen.c (startup_sequence_timeout): when timing out a startup sequence, send a remove message, don't just time it out locally.
2002-12-01 03:58:04 +00:00
char *startup_id;
int net_wm_pid;
2001-06-24 03:18:10 +00:00
2001-06-09 21:58:30 +00:00
Window xtransient_for;
Window xgroup_leader;
Window xclient_leader;
2001-06-13 00:56:08 +00:00
/* Initial workspace property */
int initial_workspace;
2001-06-07 05:18:10 +00:00
/* Whether we're maximized */
2001-06-08 02:17:48 +00:00
guint maximized : 1;
/* Whether we're shaded */
guint shaded : 1;
2001-06-10 03:17:15 +00:00
/* Whether we're fullscreen */
guint fullscreen : 1;
2001-06-10 03:17:15 +00:00
/* 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;
2001-06-08 02:17:48 +00:00
2001-06-04 06:17:52 +00:00
/* Minimize is the state controlled by the minimize button */
guint minimized : 1;
2001-06-08 02:17:48 +00:00
2001-06-11 03:24:20 +00:00
/* Whether the window is mapped; actual server-side state
* see also unmaps_pending
*/
guint mapped : 1;
2001-06-04 06:17:52 +00:00
/* Iconic is the state in WM_STATE; happens for workspaces/shading
* in addition to minimize
*/
2001-06-02 04:14:18 +00:00
guint iconic : 1;
2001-06-04 06:17:52 +00:00
/* initially_iconic is the WM_HINTS setting when we first manage
2001-06-06 04:47:37 +00:00
* the window. It's taken to mean initially minimized.
2001-06-04 06:17:52 +00:00
*/
guint initially_iconic : 1;
2001-06-24 06:47:54 +00:00
/* whether an initial workspace was explicitly set */
guint initial_workspace_set : 1;
2001-06-04 06:17:52 +00:00
/* These are the flags from WM_PROTOCOLS */
2001-06-02 04:14:18 +00:00
guint take_focus : 1;
guint delete_window : 1;
guint net_wm_ping : 1;
2001-06-04 04:58:22 +00:00
/* Globally active / No input */
guint input : 1;
2001-06-23 18:30:27 +00:00
/* MWM hints about features of window */
guint mwm_decorated : 1;
guint mwm_border_only : 1;
2001-06-23 18:30:27 +00:00
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 */
2001-06-08 06:39:38 +00:00
guint decorated : 1;
guint border_only : 1;
guint always_sticky : 1;
2001-06-08 06:39:38 +00:00
guint has_close_func : 1;
guint has_minimize_func : 1;
guint has_maximize_func : 1;
2001-06-23 06:50:37 +00:00
guint has_shade_func : 1;
2001-06-23 18:30:27 +00:00
guint has_move_func : 1;
guint has_resize_func : 1;
guint has_fullscreen_func : 1;
2001-06-23 06:50:37 +00:00
2001-06-10 03:17:15 +00:00
/* Weird "_NET_WM_STATE_MODAL" flag */
guint wm_state_modal : 1;
/* TRUE if the client forced these on */
2001-06-11 05:47:51 +00:00
guint wm_state_skip_taskbar : 1;
guint wm_state_skip_pager : 1;
/* Computed whether to skip taskbar or not */
guint skip_taskbar : 1;
guint skip_pager : 1;
/* TRUE if client set these */
guint wm_state_above : 1;
guint wm_state_below : 1;
2001-06-10 03:17:15 +00:00
2001-06-04 04:58:22 +00:00
/* this flag tracks receipt of focus_in focus_out and
* determines whether we draw the focus
*/
guint has_focus : 1;
2001-06-11 05:47:51 +00:00
2001-06-11 03:24:20 +00:00
/* Track whether the user has ever manually modified
* the window; if so, we can use the saved user size/pos
2001-06-11 03:24:20 +00:00
*/
guint user_has_move_resized : 1;
2001-06-22 03:20:21 +00:00
/* Have we placed this window? */
guint placed : 1;
/* Are we in meta_window_free()? */
guint unmanaging : 1;
/* Are we in the calc_showing queue? */
guint calc_showing_queued : 1;
2001-06-23 05:49:35 +00:00
/* Are we in the move_resize queue? */
guint move_resize_queued : 1;
2001-06-23 05:49:35 +00:00
/* Used by keybindings.c */
2001-07-11 06:22:00 +00:00
guint keys_grabbed : 1; /* normal keybindings grabbed */
guint grab_on_frame : 1; /* grabs are on the frame */
guint all_keys_grabbed : 1; /* AnyKey grabbed */
2001-06-23 18:30:27 +00:00
/* Set if the reason for unmanaging the window is that
* it was withdrawn
*/
guint withdrawn : 1;
2001-06-24 08:09:10 +00:00
/* TRUE if constrain_position should calc placement.
* only relevant if !window->placed
*/
guint calc_placement : 1;
/* Has nonzero struts */
guint has_struts : 1;
/* Struts are from the _WIN_HINTS do not cover deal */
guint do_not_cover : 1;
/* Transient parent is a root window */
guint transient_parent_is_root_window : 1;
/* Info on which props we got our attributes from */
guint using_net_wm_name : 1; /* vs. plain wm_name */
guint using_net_wm_icon_name : 1; /* vs. plain wm_icon_name */
/* has a shape mask */
guint has_shape : 1;
#ifdef HAVE_XSYNC
/* XSync update counter */
XSyncCounter update_counter;
#endif
2001-06-12 04:38:24 +00:00
2001-06-11 03:24:20 +00:00
/* 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;
2001-06-07 05:18:10 +00:00
/* 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
* or the root window as appropriate.
*/
2001-06-02 04:14:18 +00:00
MetaRectangle rect;
2001-06-07 05:18:10 +00:00
/* 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.
*/
MetaRectangle saved_rect;
/* This is the geometry the window had after the last user-initiated
* move/resize operations. We use this whenever we are moving the
* implicitly (for example, if we move to avoid a panel, we
* can snap back to this position if the panel moves again)
*
* Position valid if user_has_moved, size valid if user_has_resized
*
* Position always in root coords, unlike window->rect
*/
MetaRectangle user_rect;
2001-06-02 04:14:18 +00:00
/* Requested geometry */
int border_width;
/* x/y/w/h here get filled with ConfigureRequest values */
XSizeHints size_hints;
2001-06-10 07:27:11 +00:00
/* struts */
int left_strut;
int right_strut;
int top_strut;
int bottom_strut;
2001-06-10 07:27:11 +00:00
/* Managed by stack.c */
MetaStackLayer layer;
int stack_position; /* see comment in stack.h */
/* Current dialog open for this window */
int dialog_pid;
int dialog_pipe;
/* maintained by group.c */
MetaGroup *cached_group;
2001-05-30 15:36:31 +00:00
};
#define META_WINDOW_ALLOWS_MOVE(w) ((w)->has_move_func && !(w)->maximized && !(w)->fullscreen)
#define META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS(w) ((w)->has_resize_func && !(w)->maximized && !(w)->fullscreen && !(w)->shaded)
#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)
2001-06-06 04:47:37 +00:00
MetaWindow* meta_window_new (MetaDisplay *display,
2001-06-11 05:47:51 +00:00
Window xwindow,
gboolean must_be_viewable);
2001-06-06 04:47:37 +00:00
void meta_window_free (MetaWindow *window);
void meta_window_calc_showing (MetaWindow *window);
void meta_window_queue_calc_showing (MetaWindow *window);
void meta_window_minimize (MetaWindow *window);
void meta_window_unminimize (MetaWindow *window);
2001-06-07 05:18:10 +00:00
void meta_window_maximize (MetaWindow *window);
void meta_window_unmaximize (MetaWindow *window);
2001-06-08 02:17:48 +00:00
void meta_window_shade (MetaWindow *window);
void meta_window_unshade (MetaWindow *window);
2001-06-09 05:14:43 +00:00
void meta_window_change_workspace (MetaWindow *window,
MetaWorkspace *workspace);
2001-06-10 03:17:15 +00:00
void meta_window_stick (MetaWindow *window);
void meta_window_unstick (MetaWindow *window);
2001-06-06 04:47:37 +00:00
void meta_window_activate (MetaWindow *window,
guint32 current_time);
void meta_window_make_fullscreen (MetaWindow *window);
void meta_window_unmake_fullscreen (MetaWindow *window);
2001-06-06 04:47:37 +00:00
/* args to move are window pos, not frame pos */
void meta_window_move (MetaWindow *window,
gboolean user_op,
2001-06-06 04:47:37 +00:00
int root_x_nw,
int root_y_nw);
2001-06-08 02:17:48 +00:00
void meta_window_resize (MetaWindow *window,
gboolean user_op,
2001-06-08 02:17:48 +00:00
int w,
int h);
void meta_window_move_resize (MetaWindow *window,
gboolean user_op,
2001-06-08 02:17:48 +00:00
int root_x_nw,
int root_y_nw,
int w,
int h);
void meta_window_resize_with_gravity (MetaWindow *window,
gboolean user_op,
2001-06-30 23:17:52 +00:00
int w,
int h,
int gravity);
void meta_window_fill_horizontal (MetaWindow *window);
void meta_window_fill_vertical (MetaWindow *window);
2001-06-09 21:58:30 +00:00
/* This recalcs the window/frame size, and recalcs the frame
* size/contents as well.
*/
void meta_window_queue_move_resize (MetaWindow *window);
/* this gets root coords */
void meta_window_get_position (MetaWindow *window,
int *x,
int *y);
void meta_window_get_user_position (MetaWindow *window,
int *x,
int *y);
2001-07-07 18:43:19 +00:00
/* 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,
int *x,
int *y);
2001-07-28 06:35:19 +00:00
/* 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);
2001-07-12 05:53:56 +00:00
void meta_window_get_outer_rect (MetaWindow *window,
MetaRectangle *rect);
2001-06-06 04:47:37 +00:00
void meta_window_delete (MetaWindow *window,
Time timestamp);
void meta_window_kill (MetaWindow *window);
2001-06-06 04:47:37 +00:00
void meta_window_focus (MetaWindow *window,
Time timestamp);
void meta_window_raise (MetaWindow *window);
void meta_window_lower (MetaWindow *window);
2001-06-06 04:47:37 +00:00
void meta_window_update_unfocused_button_grabs (MetaWindow *window);
2001-06-04 04:58:22 +00:00
/* Sends a client message */
void meta_window_send_icccm_message (MetaWindow *window,
Atom atom,
Time timestamp);
2001-06-03 01:33:27 +00:00
gboolean meta_window_configure_request (MetaWindow *window,
XEvent *event);
gboolean meta_window_property_notify (MetaWindow *window,
XEvent *event);
2001-06-09 06:08:44 +00:00
gboolean meta_window_client_message (MetaWindow *window,
XEvent *event);
2001-06-23 05:49:35 +00:00
gboolean meta_window_notify_focus (MetaWindow *window,
XEvent *event);
2001-06-10 03:17:15 +00:00
void meta_window_set_current_workspace_hint (MetaWindow *window);
2001-06-21 06:08:35 +00:00
unsigned long meta_window_get_net_wm_desktop (MetaWindow *window);
2001-06-23 05:49:35 +00:00
void meta_window_show_menu (MetaWindow *window,
int root_x,
int root_y,
int button,
Time timestamp);
2001-06-24 08:09:10 +00:00
gboolean meta_window_shares_some_workspace (MetaWindow *window,
MetaWindow *with);
2001-06-30 23:17:52 +00:00
void meta_window_set_gravity (MetaWindow *window,
int gravity);
2001-07-26 03:14:45 +00:00
void meta_window_handle_mouse_grab_op_event (MetaWindow *window,
XEvent *event);
gboolean meta_window_visible_on_workspace (MetaWindow *window,
MetaWorkspace *workspace);
/* Get minimum work area for all workspaces we're on */
void meta_window_get_work_area (MetaWindow *window,
gboolean for_current_xinerama,
MetaRectangle *area);
gboolean meta_window_same_application (MetaWindow *window,
MetaWindow *other_window);
#define META_WINDOW_IN_NORMAL_TAB_CHAIN_TYPE(w) \
((w)->type != META_WINDOW_DOCK && (w)->type != META_WINDOW_DESKTOP)
#define META_WINDOW_IN_NORMAL_TAB_CHAIN(w) \
(((w)->input || (w)->take_focus) && META_WINDOW_IN_NORMAL_TAB_CHAIN_TYPE (w))
#define META_WINDOW_IN_DOCK_TAB_CHAIN(w) \
(((w)->input || (w)->take_focus) && ! META_WINDOW_IN_NORMAL_TAB_CHAIN_TYPE (w))
void meta_window_refresh_resize_popup (MetaWindow *window);
void meta_window_free_delete_dialog (MetaWindow *window);
on unminimize, queue calc_showing on all transients 2002-05-05 Havoc Pennington <hp@pobox.com> * src/window.c (meta_window_unminimize): on unminimize, queue calc_showing on all transients (meta_window_activate): on activate, unminimize all a window's ancestors, not just the window itself. * src/workspace.c (set_work_area_hint): don't increment "tmp" by 16 unsigned long, increment by 4 * src/window.c (meta_window_free): if a window isn't minimized, restore its WM_STATE to NormalState instead of IconicState, since IconicState on initial window map means that the window should be minimized. * src/workspace.c (meta_workspace_invalidate_work_area): queue an idle to recompute the work area hint. (set_work_area_hint): we need 4*num_workspaces ints, not just num_workspaces. * src/screen.c (meta_screen_new): add work_area_idle field, handle it on screen shutdown * src/common.h (META_PRIORITY_PREFS_NOTIFY, META_PRIORITY_WORK_AREA_HINT): define some idle priorities * src/window.c (meta_window_calc_showing): hide windows if their parent window is minimized (meta_window_minimize): also queue_calc_showing on all transients of the window being minimized * src/place.c (constrain_placement): function to apply placement-time-only constraints, such as "not off the left of the screen" (meta_window_place): put dialogs down a bit over their parent, not right at the top. (meta_window_place): when centering a dialog, center it on the current xinerama screen, rather than the entire screen. * src/screen.c (meta_screen_get_current_xinerama): new function, but not implemented
2002-05-05 05:41:13 +00:00
void meta_window_foreach_transient (MetaWindow *window,
MetaWindowForeachFunc func,
void *data);
gboolean meta_window_is_ancestor_of_transient (MetaWindow *window,
MetaWindow *transient);
gboolean meta_window_warp_pointer (MetaWindow *window,
MetaGrabOp grab_op);
void meta_window_begin_grab_op (MetaWindow *window,
MetaGrabOp op,
Time timestamp);
void meta_window_update_resize_grab_op (MetaWindow *window,
gboolean update_cursor);
void meta_window_update_layer (MetaWindow *window);
gboolean meta_window_get_icon_geometry (MetaWindow *window,
MetaRectangle *rect);
lengthen to 15 seconds 2002-11-30 Havoc Pennington <hp@pobox.com> * src/screen.c (STARTUP_TIMEOUT): lengthen to 15 seconds * src/util.c (utf8_fputs): hmm, return a value * src/screen.c (meta_screen_apply_startup_properties): new function to apply initial workspace based on startup sequence. * src/window.c (meta_window_new): load _NET_STARTUP_ID (meta_window_get_startup_id): new function * src/window-props.c (meta_display_init_window_prop_hooks): add hooks for _NET_STARTUP_ID * src/display.c (event_callback): send property events to groups. * src/xprops.c (meta_prop_get_values): make a type of INVALID mean to ignore that property (don't fetch its value). * src/group.c (meta_group_property_notify): new function * src/screen.c (set_supported_hint): support _NET_STARTUP_ID * src/display.c (meta_display_open): add _NET_STARTUP_ID to atoms we initialize * src/group-private.h: private header shared between group-props.c, group.c * src/group-props.h, src/group-props.c: new files to contain functions for retrieving group properties * src/window.c (meta_window_same_application): change this a bit to work with new definition of group * src/group.c (meta_window_get_group): always create a group for every window, using the window's own ID as group leader if required. * src/window.c (update_wm_hints): handle changes to group leader * src/group.c (meta_window_group_leader_changed): new function * src/display.h (struct _MetaDisplay): _NET_WM_WINDOW_TYPE_SPLASH, not SPLASHSCREEN. Reported by Gregory Merchan and Matthias Clasen. * src/screen.c (startup_sequence_timeout): when timing out a startup sequence, send a remove message, don't just time it out locally.
2002-12-01 03:58:04 +00:00
const char* meta_window_get_startup_id (MetaWindow *window);
2001-05-30 15:36:31 +00:00
#endif