2001-05-30 11:36:31 -04:00
|
|
|
/* Metacity X display handler */
|
|
|
|
|
|
|
|
/*
|
|
|
|
* Copyright (C) 2001 Havoc Pennington
|
2002-12-09 22:23:04 -05:00
|
|
|
* Copyright (C) 2002 Red Hat, Inc.
|
2004-02-22 20:48:29 -05:00
|
|
|
* Copyright (C) 2003 Rob Adams
|
2006-01-10 14:43:21 -05:00
|
|
|
* Copyright (C) 2004-2006 Elijah Newren
|
2001-05-30 11:36:31 -04: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_DISPLAY_H
|
|
|
|
#define META_DISPLAY_H
|
|
|
|
|
2002-10-26 23:03:32 -04:00
|
|
|
#ifndef PACKAGE
|
|
|
|
#error "config.h not included"
|
|
|
|
#endif
|
|
|
|
|
2001-05-30 11:36:31 -04:00
|
|
|
#include <glib.h>
|
2001-06-02 00:14:18 -04:00
|
|
|
#include <X11/Xlib.h>
|
2001-05-30 11:36:31 -04:00
|
|
|
#include "eventqueue.h"
|
2001-07-11 02:22:00 -04:00
|
|
|
#include "common.h"
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
#include "boxes.h"
|
2001-05-30 11:36:31 -04:00
|
|
|
|
2002-10-25 19:35:50 -04:00
|
|
|
#ifdef HAVE_STARTUP_NOTIFICATION
|
|
|
|
#include <libsn/sn.h>
|
|
|
|
#endif
|
|
|
|
|
2002-12-09 22:23:04 -05:00
|
|
|
#ifdef HAVE_XSYNC
|
|
|
|
#include <X11/extensions/sync.h>
|
|
|
|
#endif
|
|
|
|
|
2002-01-03 22:25:53 -05:00
|
|
|
#define meta_XFree(p) do { if ((p)) XFree ((p)); } while (0)
|
|
|
|
|
2003-11-20 21:32:05 -05:00
|
|
|
typedef struct MetaCompositor MetaCompositor;
|
2002-04-28 00:52:26 -04:00
|
|
|
typedef struct _MetaDisplay MetaDisplay;
|
|
|
|
typedef struct _MetaFrame MetaFrame;
|
|
|
|
typedef struct _MetaKeyBinding MetaKeyBinding;
|
|
|
|
typedef struct _MetaScreen MetaScreen;
|
|
|
|
typedef struct _MetaStack MetaStack;
|
|
|
|
typedef struct _MetaUISlave MetaUISlave;
|
|
|
|
typedef struct _MetaWindow MetaWindow;
|
|
|
|
typedef struct _MetaWorkspace MetaWorkspace;
|
2001-05-30 11:36:31 -04:00
|
|
|
|
2002-11-03 18:42:21 -05:00
|
|
|
typedef struct _MetaWindowPropHooks MetaWindowPropHooks;
|
2002-11-30 22:58:04 -05:00
|
|
|
typedef struct _MetaGroupPropHooks MetaGroupPropHooks;
|
2002-11-03 18:42:21 -05:00
|
|
|
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
typedef struct MetaEdgeResistanceData MetaEdgeResistanceData;
|
|
|
|
|
Screw around with Anders's ping patch so he'll get plenty of CVS
2002-02-26 Havoc Pennington <hp@pobox.com>
Screw around with Anders's ping patch so he'll get plenty of CVS
conflicts. ;-)
* src/display.c (meta_display_ping_window): spew warnings
if we try to call this with CurrentTime
(meta_display_ping_timeout): remove ping from the pending pings
after it times out.
* src/util.h: added PING debug category
* src/display.c (remove_pending_pings_for_window): don't remove
"tmp" just before "tmp->next", don't break out of loop after
finding the first match
(meta_display_open): no trailing comma in array init
(event_callback): move the processing of ping replies into a
separate function
* src/screen.c (set_supported_hint): add _NET_WM_PING to supported
list
* src/display.h: change gpointer to void*
2002-02-26 Anders Carlsson <andersca@gnu.org>
* src/display.c: (ping_data_free),
(remove_pending_pings_for_window), (meta_display_open),
(event_callback), (meta_display_unregister_x_window),
(meta_display_ping_timeout), (meta_display_ping_window),
(meta_display_window_has_pending_pings):
Implement meta_display_ping_window, and filter out scroll wheel
events.
* src/display.h:
Add MetaWindowPingFunc, meta_display_ping_window and
meta_display_window_has_pending_pings.
2002-02-26 21:05:39 -05:00
|
|
|
typedef void (* MetaWindowPingFunc) (MetaDisplay *display,
|
|
|
|
Window xwindow,
|
2004-08-25 20:59:12 -04:00
|
|
|
Time timestamp,
|
Screw around with Anders's ping patch so he'll get plenty of CVS
2002-02-26 Havoc Pennington <hp@pobox.com>
Screw around with Anders's ping patch so he'll get plenty of CVS
conflicts. ;-)
* src/display.c (meta_display_ping_window): spew warnings
if we try to call this with CurrentTime
(meta_display_ping_timeout): remove ping from the pending pings
after it times out.
* src/util.h: added PING debug category
* src/display.c (remove_pending_pings_for_window): don't remove
"tmp" just before "tmp->next", don't break out of loop after
finding the first match
(meta_display_open): no trailing comma in array init
(event_callback): move the processing of ping replies into a
separate function
* src/screen.c (set_supported_hint): add _NET_WM_PING to supported
list
* src/display.h: change gpointer to void*
2002-02-26 Anders Carlsson <andersca@gnu.org>
* src/display.c: (ping_data_free),
(remove_pending_pings_for_window), (meta_display_open),
(event_callback), (meta_display_unregister_x_window),
(meta_display_ping_timeout), (meta_display_ping_window),
(meta_display_window_has_pending_pings):
Implement meta_display_ping_window, and filter out scroll wheel
events.
* src/display.h:
Add MetaWindowPingFunc, meta_display_ping_window and
meta_display_window_has_pending_pings.
2002-02-26 21:05:39 -05:00
|
|
|
gpointer user_data);
|
|
|
|
|
|
|
|
|
2001-06-09 02:08:44 -04:00
|
|
|
#define _NET_WM_STATE_REMOVE 0 /* remove/unset property */
|
|
|
|
#define _NET_WM_STATE_ADD 1 /* add/set property */
|
|
|
|
#define _NET_WM_STATE_TOGGLE 2 /* toggle property */
|
|
|
|
|
2002-03-02 10:26:07 -05:00
|
|
|
/* This is basically a bogus number, just has to be large enough
|
|
|
|
* to handle the expected case of the alt+tab operation, where
|
|
|
|
* we want to ignore serials from UnmapNotify on the tab popup,
|
|
|
|
* and the LeaveNotify/EnterNotify from the pointer ungrab
|
|
|
|
*/
|
|
|
|
#define N_IGNORED_SERIALS 4
|
|
|
|
|
2001-05-30 11:36:31 -04:00
|
|
|
struct _MetaDisplay
|
|
|
|
{
|
|
|
|
char *name;
|
|
|
|
Display *xdisplay;
|
2001-05-31 23:00:01 -04:00
|
|
|
|
2001-06-09 17:58:30 -04:00
|
|
|
Window leader_window;
|
|
|
|
|
2001-06-02 00:14:18 -04:00
|
|
|
Atom atom_net_wm_name;
|
2001-06-02 21:33:27 -04:00
|
|
|
Atom atom_wm_protocols;
|
|
|
|
Atom atom_wm_take_focus;
|
|
|
|
Atom atom_wm_delete_window;
|
2001-06-06 00:47:37 -04:00
|
|
|
Atom atom_wm_state;
|
2001-06-07 01:18:10 -04:00
|
|
|
Atom atom_net_close_window;
|
2001-06-08 02:39:38 -04:00
|
|
|
Atom atom_net_wm_state;
|
|
|
|
Atom atom_motif_wm_hints;
|
|
|
|
Atom atom_net_wm_state_shaded;
|
|
|
|
Atom atom_net_wm_state_maximized_horz;
|
|
|
|
Atom atom_net_wm_state_maximized_vert;
|
2001-06-09 01:14:43 -04:00
|
|
|
Atom atom_net_wm_desktop;
|
|
|
|
Atom atom_net_number_of_desktops;
|
2001-06-09 17:58:30 -04:00
|
|
|
Atom atom_wm_change_state;
|
|
|
|
Atom atom_sm_client_id;
|
|
|
|
Atom atom_wm_client_leader;
|
|
|
|
Atom atom_wm_window_role;
|
2001-06-09 23:17:15 -04:00
|
|
|
Atom atom_net_current_desktop;
|
|
|
|
Atom atom_net_supporting_wm_check;
|
2001-08-29 00:16:30 -04:00
|
|
|
Atom atom_net_supported;
|
2001-06-09 23:17:15 -04:00
|
|
|
Atom atom_net_wm_window_type;
|
|
|
|
Atom atom_net_wm_window_type_desktop;
|
|
|
|
Atom atom_net_wm_window_type_dock;
|
|
|
|
Atom atom_net_wm_window_type_toolbar;
|
|
|
|
Atom atom_net_wm_window_type_menu;
|
|
|
|
Atom atom_net_wm_window_type_dialog;
|
|
|
|
Atom atom_net_wm_window_type_normal;
|
|
|
|
Atom atom_net_wm_state_modal;
|
2001-06-10 03:52:35 -04:00
|
|
|
Atom atom_net_client_list;
|
|
|
|
Atom atom_net_client_list_stacking;
|
2001-06-11 01:47:51 -04:00
|
|
|
Atom atom_net_wm_state_skip_taskbar;
|
|
|
|
Atom atom_net_wm_state_skip_pager;
|
2001-06-23 23:18:10 -04:00
|
|
|
Atom atom_net_wm_icon_name;
|
|
|
|
Atom atom_net_wm_icon;
|
2001-08-05 12:04:52 -04:00
|
|
|
Atom atom_net_wm_icon_geometry;
|
2001-08-07 01:52:51 -04:00
|
|
|
Atom atom_utf8_string;
|
2001-08-19 21:42:44 -04:00
|
|
|
Atom atom_wm_icon_size;
|
2001-08-22 02:01:01 -04:00
|
|
|
Atom atom_kwm_win_icon;
|
2001-08-29 00:16:30 -04:00
|
|
|
Atom atom_net_wm_moveresize;
|
2001-10-07 19:06:19 -04:00
|
|
|
Atom atom_net_active_window;
|
2001-10-15 00:14:58 -04:00
|
|
|
Atom atom_metacity_restart_message;
|
2002-01-10 01:31:31 -05:00
|
|
|
Atom atom_net_wm_strut;
|
2002-02-06 22:07:56 -05:00
|
|
|
Atom atom_metacity_reload_theme_message;
|
2002-02-08 01:01:58 -05:00
|
|
|
Atom atom_metacity_set_keybindings_message;
|
2002-02-08 23:50:58 -05:00
|
|
|
Atom atom_net_wm_state_hidden;
|
2002-02-09 01:54:44 -05:00
|
|
|
Atom atom_net_wm_window_type_utility;
|
2002-11-30 22:58:04 -05:00
|
|
|
Atom atom_net_wm_window_type_splash;
|
Screw around with Anders's ping patch so he'll get plenty of CVS
2002-02-26 Havoc Pennington <hp@pobox.com>
Screw around with Anders's ping patch so he'll get plenty of CVS
conflicts. ;-)
* src/display.c (meta_display_ping_window): spew warnings
if we try to call this with CurrentTime
(meta_display_ping_timeout): remove ping from the pending pings
after it times out.
* src/util.h: added PING debug category
* src/display.c (remove_pending_pings_for_window): don't remove
"tmp" just before "tmp->next", don't break out of loop after
finding the first match
(meta_display_open): no trailing comma in array init
(event_callback): move the processing of ping replies into a
separate function
* src/screen.c (set_supported_hint): add _NET_WM_PING to supported
list
* src/display.h: change gpointer to void*
2002-02-26 Anders Carlsson <andersca@gnu.org>
* src/display.c: (ping_data_free),
(remove_pending_pings_for_window), (meta_display_open),
(event_callback), (meta_display_unregister_x_window),
(meta_display_ping_timeout), (meta_display_ping_window),
(meta_display_window_has_pending_pings):
Implement meta_display_ping_window, and filter out scroll wheel
events.
* src/display.h:
Add MetaWindowPingFunc, meta_display_ping_window and
meta_display_window_has_pending_pings.
2002-02-26 21:05:39 -05:00
|
|
|
Atom atom_net_wm_ping;
|
|
|
|
Atom atom_net_wm_pid;
|
|
|
|
Atom atom_wm_client_machine;
|
2002-02-23 17:58:02 -05:00
|
|
|
Atom atom_net_wm_state_fullscreen;
|
2002-06-24 21:12:37 -04:00
|
|
|
Atom atom_net_workarea;
|
2002-09-23 22:04:32 -04:00
|
|
|
Atom atom_net_showing_desktop;
|
2002-05-16 00:03:36 -04:00
|
|
|
Atom atom_net_desktop_layout;
|
2002-06-08 19:55:27 -04:00
|
|
|
Atom atom_manager;
|
|
|
|
Atom atom_targets;
|
|
|
|
Atom atom_multiple;
|
|
|
|
Atom atom_timestamp;
|
|
|
|
Atom atom_version;
|
|
|
|
Atom atom_atom_pair;
|
2002-06-22 00:52:35 -04:00
|
|
|
Atom atom_net_desktop_names;
|
2002-08-01 19:52:47 -04:00
|
|
|
Atom atom_net_wm_allowed_actions;
|
|
|
|
Atom atom_net_wm_action_move;
|
|
|
|
Atom atom_net_wm_action_resize;
|
2003-11-16 19:06:58 -05:00
|
|
|
Atom atom_net_wm_action_fullscreen;
|
|
|
|
Atom atom_net_wm_action_minimize;
|
2002-08-01 19:52:47 -04:00
|
|
|
Atom atom_net_wm_action_shade;
|
|
|
|
Atom atom_net_wm_action_stick;
|
|
|
|
Atom atom_net_wm_action_maximize_horz;
|
|
|
|
Atom atom_net_wm_action_maximize_vert;
|
|
|
|
Atom atom_net_wm_action_change_desktop;
|
|
|
|
Atom atom_net_wm_action_close;
|
2002-10-01 20:47:29 -04:00
|
|
|
Atom atom_net_wm_state_above;
|
|
|
|
Atom atom_net_wm_state_below;
|
2002-11-30 22:58:04 -05:00
|
|
|
Atom atom_net_startup_id;
|
2002-12-08 14:17:17 -05:00
|
|
|
Atom atom_metacity_toggle_verbose;
|
Fix bug 143333, support for update counter spec, and 109362, schedule
Sat Jun 19 02:21:08 2004 Soeren Sandmann <sandmann@daimi.au.dk>
Fix bug 143333, support for update counter spec, and 109362,
schedule compensation events when events are ignored.
* src/display.c (meta_display_open): Add _NET_WM_SYNC_REQUEST and
_NET_WM_SYNC_REQUEST_COUNTER atoms. Remove the old
METACITY_SYNC_COUNTER stuff.
(meta_display_begin_op): Setup the sync counter
* src/xprops.c, src/xprops.h, src/window-props.c, src/display.h:
Add new atoms.
* src/window.c (send_sync_request): new function.
(meta_window_move_resize_internal): send a sync request before
resizing.
(check_move_resize_frequence): Rework logic to also check the SYNC
case. If an event is ignored return the remaining time.
(update_resize_timeout): Timeout that gets called when a
compensation event is scheduled.
(uddate_resize): schedule compensation events when an event is
ignored.
(meta_window_handle_mouse_grap_op_event): When an alarm is
received and sync was turned off, turn it back on.
* src/window.h (struct MetaWindow) Add some variables
2004-06-18 20:45:24 -04:00
|
|
|
Atom atom_net_wm_sync_request;
|
|
|
|
Atom atom_net_wm_sync_request_counter;
|
2003-02-23 21:16:09 -05:00
|
|
|
Atom atom_gnome_panel_action;
|
|
|
|
Atom atom_gnome_panel_action_main_menu;
|
|
|
|
Atom atom_gnome_panel_action_run_dialog;
|
2003-05-30 16:24:00 -04:00
|
|
|
Atom atom_metacity_sentinel;
|
2003-06-25 23:09:38 -04:00
|
|
|
Atom atom_net_wm_strut_partial;
|
2004-01-10 12:16:07 -05:00
|
|
|
Atom atom_net_frame_extents;
|
|
|
|
Atom atom_net_request_frame_extents;
|
Add support for _NET_WM_USER_TIME
2004-06-17 Elijah Newren <newren@math.utah.edu>
Add support for _NET_WM_USER_TIME
* src/display.c:
(meta_display_open): Add _NET_WM_USER_TIME to atom_names[],
(event_callback): Manually set _NET_WM_USER_TIME upon KeyPress
(doesn't work since keyboard isn't grabbed) and ButtonPress (does
work), this is just a fallback for applications that don't update
this themselves.
* src/display.h: (struct _MetaDisplay): Add atom_net_wm_user_time field
* src/screen.c: (meta_screen_apply_startup_properties): Check for
TIMESTAMP provided from startup sequence as well.
* src/stack.c:
s/meta_window_set_stack_position/meta_window_set_stack_position_no_sync/,
(meta_window_set_stack_position): New function which calls the
meta_window_set_stack_position_no_sync function followed immediately
by calling meta_stack_sync_to_server.
* src/window-props.c:
(init_net_wm_user_time), (reload_net_wm_user_time): new functions,
(reload_wm_hints): also load atom_net_wm_user_time
* src/window.c:
new XSERVER_TIME_IS_LATER macro (accounts for timestamp wraparound),
(meta_window_new_with_attrs): add timestamp attributes,
(window_takes_focus_on_map): use TIMESTAMP from startup
notification and _NET_WM_USER_TIME to decide whether to focus new
windows,
(meta_window_show): if app doesn't take focus on map, place it
just below the focused window in the stack
(process_property_notify): check for changes to _NET_WM_USRE_TIME,
(meta_window_stack_just_below): new function
* src/window.h:
(_MetaWindow struct): new fields for initial_timestamp,
initial_timestamp_set, net_wm_user_time_set, and net_wm_user_time,
(meta_window_stack_just_below): new function
2004-06-24 11:47:05 -04:00
|
|
|
Atom atom_net_wm_user_time;
|
Fix some support for EWMH hints, and fix USER_TIME support to include the
2004-07-31 Rob Adams <readams@readams.net>
Fix some support for EWMH hints, and fix USER_TIME support to
include the DEMANDS_ATTENTION hint. Also includes some code for
implementing _NET_RESTACK_WINDOW and _NET_MOVERESIZE_WINDOW, but
this is disabled pending feature thaw.
* COMPLIANCE: update with new information
* src/display.c (meta_display_open): add new hints to list
* src/display.h (_MetaDisplay): Add new atoms to struct
* src/screen.c (set_supported_hint): update the list of support
hints.
(set_desktop_viewport_hint): new function sets the viewport hint
to (0,0) as required by the spec for WMs with no viewport support.
(set_desktop_geometry_hint): new function to set the desktop size
hint to the size of the display, since we don't implement large
desktop support, as required by the spec.
(meta_screen_resize): update the geometry hint on screen resize
* src/window.c (meta_window_new_with_attrs): Initialize
demands_attention state
(set_net_wm_state): Set demands_attention hint in the window state
(meta_window_show): If we don't pop up a window because of
USER_TIME, set DEMANDS_ATTENTION on the window.
(meta_window_focus): When a window receives focus, remove
DEMANDS_ATTENTION hint
(meta_window_client_message): Allow other apps to set
DEMANDS_ATTENTION on a window. Also, if the _NET_ACTIVE_WINDOW
hint includes a timestamp, use it.
(update_net_wm_state): Read DEMANDS_ATTENTION state also
* src/window.h (_MetaWindow): add wm_state_demands_attention bit.
2004-07-31 15:56:10 -04:00
|
|
|
Atom atom_net_wm_state_demands_attention;
|
|
|
|
Atom atom_net_restack_window;
|
|
|
|
Atom atom_net_moveresize_window;
|
|
|
|
Atom atom_net_desktop_geometry;
|
|
|
|
Atom atom_net_desktop_viewport;
|
2005-02-06 23:37:35 -05:00
|
|
|
Atom atom_metacity_version;
|
2005-10-03 14:13:45 -04:00
|
|
|
Atom atom_net_wm_visible_name;
|
|
|
|
Atom atom_net_wm_visible_icon_name;
|
2004-01-10 12:16:07 -05:00
|
|
|
|
2001-06-04 00:58:22 -04:00
|
|
|
/* This is the actual window from focus events,
|
|
|
|
* not the one we last set
|
|
|
|
*/
|
|
|
|
MetaWindow *focus_window;
|
2001-06-06 00:47:37 -04:00
|
|
|
|
2004-12-23 01:44:56 -05:00
|
|
|
/* window we are expecting a FocusIn event for or the current focus
|
|
|
|
* window if we are not expecting any FocusIn/FocusOut events; not
|
|
|
|
* perfect because applications can call XSetInputFocus directly.
|
|
|
|
* (It could also be messed up if a timestamp later than current
|
|
|
|
* time is sent to meta_display_set_input_focus_window, though that
|
|
|
|
* would be a programming error). See bug 154598 for more info.
|
2002-08-08 00:45:13 -04:00
|
|
|
*/
|
|
|
|
MetaWindow *expected_focus_window;
|
|
|
|
|
Big patch to cover about 6 different issues in order to correct rare
2005-02-20 Elijah Newren <newren@gmail.com>
Big patch to cover about 6 different issues in order to correct
rare problems with timestamps (make sure window selected in
tasklist actually gets focus, sanity check timestamps to avoid
rogue apps hosing the system, correct the updating of
net_wm_user_time, correctly handle timestamps of 0 when comparing
xserver timestamps for those who have had their systems up for
over 25 days or so, add some debugging information to verbose
logs, some code cleanups). Fixes all issues listed in #167358.
* src/display.h: (struct _MetaDisplay): clarify comment on
last_focus_time, introduce a new variable--last_user_time,
(XSERVER_TIME_IS_BEFORE macro): put this functionality into a
separate macro and then introduce a new macro with this name that
uses the old one but adds additional special-case checks for
timestamps that are 0, (comment to
meta_display_set_input_focus_window): add information about how
last_user_time should be used in this function
* src/display.c (santiy_check_timestamps): new function,
(meta_display_open): intialize display->last_user_time,
(meta_display_get_current_time_roundtrip): use the timestamp,
which is known to be good, in order to sanity_check_timestamps,
(event_callback): use the new meta_window_ste_user_time() function
in order to correct problems, use the timestamp of KeyPress and
ButtonPress events, which are known to be good, in order to
sanity_check_timestamps, (timestamp_too_old): new function for
common behavior of meta_display_focus_the_no_focus_window and
meta_display_set_input_focus_window, with added checking for
display->last_user_time in addition to display->last_focus_time,
(meta_display_set_input_focus_window): replace some of the code
with a call to timestamp_too_old(),
(meta_display_focus_the_no_focus_window): replace some of th ecode
with a call to timestamp_too_old()
* src/window.h: (meta_window_set_user_time): new function to
abstract the many things that need to be done when updating the
net_wm_user_time of any window
* src/window.c: (meta_window_activate): add debugging spew, make
sure the comparison is made with last_user_time NOT
last_focus_time, use meta_window_set_user_time() function in order
to correct problems, (meta_window_client_message): add a newline
to a debugging message to make them easier to read,
(meta_window_set_user_time): new function
* src/window-props.c (reload_net_wm_user_time): use the new
meta_window_ste_user_time() function in order to correct problems
2005-02-20 12:14:16 -05:00
|
|
|
/* last timestamp passed to XSetInputFocus */
|
2004-12-23 01:44:56 -05:00
|
|
|
Time last_focus_time;
|
|
|
|
|
Big patch to cover about 6 different issues in order to correct rare
2005-02-20 Elijah Newren <newren@gmail.com>
Big patch to cover about 6 different issues in order to correct
rare problems with timestamps (make sure window selected in
tasklist actually gets focus, sanity check timestamps to avoid
rogue apps hosing the system, correct the updating of
net_wm_user_time, correctly handle timestamps of 0 when comparing
xserver timestamps for those who have had their systems up for
over 25 days or so, add some debugging information to verbose
logs, some code cleanups). Fixes all issues listed in #167358.
* src/display.h: (struct _MetaDisplay): clarify comment on
last_focus_time, introduce a new variable--last_user_time,
(XSERVER_TIME_IS_BEFORE macro): put this functionality into a
separate macro and then introduce a new macro with this name that
uses the old one but adds additional special-case checks for
timestamps that are 0, (comment to
meta_display_set_input_focus_window): add information about how
last_user_time should be used in this function
* src/display.c (santiy_check_timestamps): new function,
(meta_display_open): intialize display->last_user_time,
(meta_display_get_current_time_roundtrip): use the timestamp,
which is known to be good, in order to sanity_check_timestamps,
(event_callback): use the new meta_window_ste_user_time() function
in order to correct problems, use the timestamp of KeyPress and
ButtonPress events, which are known to be good, in order to
sanity_check_timestamps, (timestamp_too_old): new function for
common behavior of meta_display_focus_the_no_focus_window and
meta_display_set_input_focus_window, with added checking for
display->last_user_time in addition to display->last_focus_time,
(meta_display_set_input_focus_window): replace some of the code
with a call to timestamp_too_old(),
(meta_display_focus_the_no_focus_window): replace some of th ecode
with a call to timestamp_too_old()
* src/window.h: (meta_window_set_user_time): new function to
abstract the many things that need to be done when updating the
net_wm_user_time of any window
* src/window.c: (meta_window_activate): add debugging spew, make
sure the comparison is made with last_user_time NOT
last_focus_time, use meta_window_set_user_time() function in order
to correct problems, (meta_window_client_message): add a newline
to a debugging message to make them easier to read,
(meta_window_set_user_time): new function
* src/window-props.c (reload_net_wm_user_time): use the new
meta_window_ste_user_time() function in order to correct problems
2005-02-20 12:14:16 -05:00
|
|
|
/* last user interaction time in any app */
|
|
|
|
Time last_user_time;
|
|
|
|
|
2005-02-21 21:11:25 -05:00
|
|
|
/* whether we're using mousenav (only relevant for sloppy&mouse focus modes;
|
|
|
|
* !mouse_mode means "keynav mode")
|
|
|
|
*/
|
|
|
|
guint mouse_mode : 1;
|
|
|
|
|
2006-01-15 12:03:57 -05:00
|
|
|
/* Helper var for strict focus for terminals; only relevant if the focus
|
|
|
|
* window is a terminal. Typically, we don't allow new windows to take
|
|
|
|
* focus away from a terminal, but if the user explicitly did something
|
|
|
|
* that should allow a different window to gain focus (e.g. global
|
|
|
|
* keybinding or clicking on a dock), then we will allow the transfer.
|
|
|
|
*/
|
|
|
|
guint allow_terminal_deactivation : 1;
|
|
|
|
|
2002-01-19 18:59:11 -05:00
|
|
|
guint static_gravity_works : 1;
|
2001-06-02 00:14:18 -04:00
|
|
|
|
2001-05-31 23:00:01 -04:00
|
|
|
/*< private-ish >*/
|
2002-10-21 17:44:35 -04:00
|
|
|
guint error_trap_synced_at_last_pop : 1;
|
2001-05-30 11:36:31 -04:00
|
|
|
MetaEventQueue *events;
|
|
|
|
GSList *screens;
|
|
|
|
GHashTable *window_ids;
|
2002-02-24 14:58:27 -05:00
|
|
|
int error_traps;
|
|
|
|
int (* error_trap_handler) (Display *display,
|
|
|
|
XErrorEvent *error);
|
2001-05-31 02:42:58 -04:00
|
|
|
int server_grab_count;
|
2001-06-07 22:17:48 -04:00
|
|
|
|
|
|
|
/* for double click */
|
|
|
|
Time last_button_time;
|
|
|
|
Window last_button_xwindow;
|
|
|
|
int last_button_num;
|
|
|
|
guint is_double_click : 1;
|
2001-08-30 00:01:38 -04:00
|
|
|
|
2002-03-02 10:26:07 -05:00
|
|
|
/* serials of leave/unmap events that may
|
|
|
|
* correspond to an enter event we should
|
|
|
|
* ignore
|
|
|
|
*/
|
|
|
|
unsigned long ignored_serials[N_IGNORED_SERIALS];
|
|
|
|
Window ungrab_should_not_cause_focus_window;
|
|
|
|
|
2002-01-03 18:28:19 -05:00
|
|
|
guint32 current_time;
|
Screw around with Anders's ping patch so he'll get plenty of CVS
2002-02-26 Havoc Pennington <hp@pobox.com>
Screw around with Anders's ping patch so he'll get plenty of CVS
conflicts. ;-)
* src/display.c (meta_display_ping_window): spew warnings
if we try to call this with CurrentTime
(meta_display_ping_timeout): remove ping from the pending pings
after it times out.
* src/util.h: added PING debug category
* src/display.c (remove_pending_pings_for_window): don't remove
"tmp" just before "tmp->next", don't break out of loop after
finding the first match
(meta_display_open): no trailing comma in array init
(event_callback): move the processing of ping replies into a
separate function
* src/screen.c (set_supported_hint): add _NET_WM_PING to supported
list
* src/display.h: change gpointer to void*
2002-02-26 Anders Carlsson <andersca@gnu.org>
* src/display.c: (ping_data_free),
(remove_pending_pings_for_window), (meta_display_open),
(event_callback), (meta_display_unregister_x_window),
(meta_display_ping_timeout), (meta_display_ping_window),
(meta_display_window_has_pending_pings):
Implement meta_display_ping_window, and filter out scroll wheel
events.
* src/display.h:
Add MetaWindowPingFunc, meta_display_ping_window and
meta_display_window_has_pending_pings.
2002-02-26 21:05:39 -05:00
|
|
|
|
|
|
|
/* Pings which we're waiting for a reply from */
|
|
|
|
GSList *pending_pings;
|
2002-05-23 22:23:46 -04:00
|
|
|
|
|
|
|
/* Pending autoraise */
|
|
|
|
guint autoraise_timeout_id;
|
2004-10-04 17:09:08 -04:00
|
|
|
MetaWindow* autoraise_window;
|
2002-10-07 19:14:40 -04:00
|
|
|
|
|
|
|
/* Alt+click button grabs */
|
|
|
|
unsigned int window_grab_modifiers;
|
2001-07-25 23:14:45 -04:00
|
|
|
|
2001-07-11 02:22:00 -04:00
|
|
|
/* current window operation */
|
|
|
|
MetaGrabOp grab_op;
|
2002-06-27 01:08:32 -04:00
|
|
|
MetaScreen *grab_screen;
|
2001-07-11 02:22:00 -04:00
|
|
|
MetaWindow *grab_window;
|
2002-03-02 10:26:07 -05:00
|
|
|
Window grab_xwindow;
|
2003-10-12 02:25:38 -04:00
|
|
|
gulong grab_start_serial;
|
2001-07-11 02:22:00 -04:00
|
|
|
int grab_button;
|
2003-10-12 02:25:38 -04:00
|
|
|
int grab_anchor_root_x;
|
|
|
|
int grab_anchor_root_y;
|
|
|
|
MetaRectangle grab_anchor_window_pos;
|
2002-12-09 22:23:04 -05:00
|
|
|
int grab_latest_motion_x;
|
|
|
|
int grab_latest_motion_y;
|
2001-07-11 02:22:00 -04:00
|
|
|
gulong grab_mask;
|
|
|
|
guint grab_have_pointer : 1;
|
|
|
|
guint grab_have_keyboard : 1;
|
2003-10-12 02:25:38 -04:00
|
|
|
guint grab_wireframe_active : 1;
|
|
|
|
guint grab_was_cancelled : 1;
|
|
|
|
MetaRectangle grab_wireframe_rect;
|
2004-08-18 22:05:24 -04:00
|
|
|
MetaRectangle grab_wireframe_last_xor_rect;
|
2001-07-12 01:53:56 -04:00
|
|
|
MetaRectangle grab_initial_window_pos;
|
Add a raise on click option, basically only because all the major distros
2006-01-10 Elijah Newren <newren@gmail.com>
Add a raise on click option, basically only because all the major
distros are patching it in anyway. See #326156.
* src/metacity.schemas.in: add the new gconf key and explanation
* src/prefs.[ch] (#define KEY_RAISE_ON_CLICK, static gboolean
raise_on_click, update_raise_on_click, meta_prefs_init,
change_notify, meta_prefs_get_raise_on_click,
meta_preference_to_string):
Add all the normal preference handling stuff for this new
raise-on-click option.
* src/core.c (meta_core_show_window_menu):
* src/display.c (event_callback, meta_display_begin_grab_op):
* src/window.c (window_activate, meta_window_configure_request, ):
Only raise the window if in raise_on_click mode.
* src/display.c (meta_display_begin_grab_op,
meta_display_end_grab_op, meta_display_check_threshold_reached):
* src/display.h (struct MetaDisplay):
* src/window.c (meta_window_handle_mouse_grab_op_event):
if not in raise-on-click mode only raise on button release if the
click didn't start a move or resize operation; needs a few extra
MetaDisplay fields to handle this
* src/core.c (meta_core_user_lower_and_unfocus):
no need to do the MRU shuffling if not maintaining the stacking
order == MRU order invariant
* src/frames.c (meta_frames_button_press_event):
* src/window.c (meta_window_begin_grab_op):
remove an unneeded window raising that is already handled elsewhere
2006-01-10 14:35:03 -05:00
|
|
|
int grab_initial_x, grab_initial_y;
|
|
|
|
gboolean grab_threshold_movement_reached;
|
2002-03-17 12:22:23 -05:00
|
|
|
MetaResizePopup *grab_resize_popup;
|
2002-08-10 01:27:17 -04:00
|
|
|
GTimeVal grab_last_moveresize_time;
|
2003-01-21 23:54:04 -05:00
|
|
|
Time grab_motion_notify_time;
|
2005-05-26 15:58:17 -04:00
|
|
|
int grab_wireframe_last_display_width;
|
|
|
|
int grab_wireframe_last_display_height;
|
2005-01-24 00:58:30 -05:00
|
|
|
GList* grab_old_window_stacking;
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
MetaEdgeResistanceData *grab_edge_resistance_data;
|
2003-10-12 02:25:38 -04:00
|
|
|
|
2003-05-30 16:24:00 -04:00
|
|
|
/* we use property updates as sentinels for certain window focus events
|
|
|
|
* to avoid some race conditions on EnterNotify events
|
|
|
|
*/
|
|
|
|
int sentinel_counter;
|
|
|
|
|
2003-01-28 10:07:43 -05:00
|
|
|
#ifdef HAVE_XKB
|
|
|
|
int xkb_base_event_type;
|
|
|
|
#endif
|
2002-12-09 22:23:04 -05:00
|
|
|
#ifdef HAVE_XSYNC
|
Fix bug 143333, support for update counter spec, and 109362, schedule
Sat Jun 19 02:21:08 2004 Soeren Sandmann <sandmann@daimi.au.dk>
Fix bug 143333, support for update counter spec, and 109362,
schedule compensation events when events are ignored.
* src/display.c (meta_display_open): Add _NET_WM_SYNC_REQUEST and
_NET_WM_SYNC_REQUEST_COUNTER atoms. Remove the old
METACITY_SYNC_COUNTER stuff.
(meta_display_begin_op): Setup the sync counter
* src/xprops.c, src/xprops.h, src/window-props.c, src/display.h:
Add new atoms.
* src/window.c (send_sync_request): new function.
(meta_window_move_resize_internal): send a sync request before
resizing.
(check_move_resize_frequence): Rework logic to also check the SYNC
case. If an event is ignored return the remaining time.
(update_resize_timeout): Timeout that gets called when a
compensation event is scheduled.
(uddate_resize): schedule compensation events when an event is
ignored.
(meta_window_handle_mouse_grap_op_event): When an alarm is
received and sync was turned off, turn it back on.
* src/window.h (struct MetaWindow) Add some variables
2004-06-18 20:45:24 -04:00
|
|
|
/* alarm monitoring client's _NET_WM_SYNC_REQUEST_COUNTER */
|
|
|
|
XSyncAlarm grab_sync_request_alarm;
|
2002-12-09 22:23:04 -05:00
|
|
|
#endif
|
Fix bug 143333, support for update counter spec, and 109362, schedule
Sat Jun 19 02:21:08 2004 Soeren Sandmann <sandmann@daimi.au.dk>
Fix bug 143333, support for update counter spec, and 109362,
schedule compensation events when events are ignored.
* src/display.c (meta_display_open): Add _NET_WM_SYNC_REQUEST and
_NET_WM_SYNC_REQUEST_COUNTER atoms. Remove the old
METACITY_SYNC_COUNTER stuff.
(meta_display_begin_op): Setup the sync counter
* src/xprops.c, src/xprops.h, src/window-props.c, src/display.h:
Add new atoms.
* src/window.c (send_sync_request): new function.
(meta_window_move_resize_internal): send a sync request before
resizing.
(check_move_resize_frequence): Rework logic to also check the SYNC
case. If an event is ignored return the remaining time.
(update_resize_timeout): Timeout that gets called when a
compensation event is scheduled.
(uddate_resize): schedule compensation events when an event is
ignored.
(meta_window_handle_mouse_grap_op_event): When an alarm is
received and sync was turned off, turn it back on.
* src/window.h (struct MetaWindow) Add some variables
2004-06-18 20:45:24 -04:00
|
|
|
int grab_resize_timeout_id;
|
2002-04-28 00:52:26 -04:00
|
|
|
|
|
|
|
/* Keybindings stuff */
|
|
|
|
MetaKeyBinding *screen_bindings;
|
|
|
|
int n_screen_bindings;
|
|
|
|
MetaKeyBinding *window_bindings;
|
|
|
|
int n_window_bindings;
|
2003-02-22 15:31:51 -05:00
|
|
|
unsigned int min_keycode;
|
|
|
|
unsigned int max_keycode;
|
2002-04-28 00:52:26 -04:00
|
|
|
KeySym *keymap;
|
|
|
|
int keysyms_per_keycode;
|
|
|
|
XModifierKeymap *modmap;
|
|
|
|
unsigned int ignored_modifier_mask;
|
|
|
|
unsigned int num_lock_mask;
|
|
|
|
unsigned int scroll_lock_mask;
|
2002-07-13 23:16:41 -04:00
|
|
|
unsigned int hyper_mask;
|
|
|
|
unsigned int super_mask;
|
|
|
|
unsigned int meta_mask;
|
|
|
|
|
2002-06-06 23:18:46 -04:00
|
|
|
/* Xinerama cache */
|
|
|
|
unsigned int xinerama_cache_invalidated : 1;
|
2002-06-22 01:11:04 -04:00
|
|
|
|
|
|
|
/* Closing down the display */
|
|
|
|
int closing;
|
2002-08-12 17:32:13 -04:00
|
|
|
|
|
|
|
/* Managed by group.c */
|
|
|
|
GHashTable *groups_by_leader;
|
2002-10-26 23:03:32 -04:00
|
|
|
|
2002-10-28 00:35:30 -05:00
|
|
|
/* currently-active window menu if any */
|
|
|
|
MetaWindowMenu *window_menu;
|
|
|
|
MetaWindow *window_with_menu;
|
2002-11-03 18:42:21 -05:00
|
|
|
|
|
|
|
/* Managed by window-props.c */
|
|
|
|
MetaWindowPropHooks *prop_hooks;
|
2002-11-30 22:58:04 -05:00
|
|
|
|
|
|
|
/* Managed by group-props.c */
|
|
|
|
MetaGroupPropHooks *group_prop_hooks;
|
2003-11-20 21:32:05 -05:00
|
|
|
|
|
|
|
/* Managed by compositor.c */
|
|
|
|
MetaCompositor *compositor;
|
2002-10-26 23:03:32 -04:00
|
|
|
|
|
|
|
#ifdef HAVE_STARTUP_NOTIFICATION
|
|
|
|
SnDisplay *sn_display;
|
|
|
|
#endif
|
2002-12-09 22:23:04 -05:00
|
|
|
#ifdef HAVE_XSYNC
|
|
|
|
int xsync_event_base;
|
|
|
|
int xsync_error_base;
|
|
|
|
#endif
|
2003-01-05 02:51:02 -05:00
|
|
|
#ifdef HAVE_SHAPE
|
|
|
|
int shape_event_base;
|
|
|
|
int shape_error_base;
|
2004-08-26 22:17:49 -04:00
|
|
|
#endif
|
|
|
|
#ifdef HAVE_RENDER
|
|
|
|
int render_event_base;
|
|
|
|
int render_error_base;
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_XSYNC
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
unsigned int grab_last_user_action_was_snap;
|
2004-08-26 22:17:49 -04:00
|
|
|
unsigned int have_xsync : 1;
|
|
|
|
#define META_DISPLAY_HAS_XSYNC(display) ((display)->have_xsync)
|
|
|
|
#else
|
|
|
|
#define META_DISPLAY_HAS_XSYNC(display) FALSE
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_SHAPE
|
|
|
|
unsigned int have_shape : 1;
|
|
|
|
#define META_DISPLAY_HAS_SHAPE(display) ((display)->have_shape)
|
2003-01-05 02:51:02 -05:00
|
|
|
#else
|
|
|
|
#define META_DISPLAY_HAS_SHAPE(display) FALSE
|
|
|
|
#endif
|
2004-08-26 22:17:49 -04:00
|
|
|
#ifdef HAVE_RENDER
|
|
|
|
unsigned int have_render : 1;
|
|
|
|
#define META_DISPLAY_HAS_RENDER(display) ((display)->have_render)
|
|
|
|
#else
|
|
|
|
#define META_DISPLAY_HAS_RENDER(display) FALSE
|
|
|
|
#endif
|
2001-05-30 11:36:31 -04:00
|
|
|
};
|
|
|
|
|
2004-12-23 01:44:56 -05:00
|
|
|
/* Xserver time can wraparound, thus comparing two timestamps needs to take
|
|
|
|
* this into account. Here's a little macro to help out. If no wraparound
|
|
|
|
* has occurred, this is equivalent to
|
|
|
|
* time1 < time2
|
|
|
|
* Of course, the rest of the ugliness of this macro comes from accounting
|
Big patch to cover about 6 different issues in order to correct rare
2005-02-20 Elijah Newren <newren@gmail.com>
Big patch to cover about 6 different issues in order to correct
rare problems with timestamps (make sure window selected in
tasklist actually gets focus, sanity check timestamps to avoid
rogue apps hosing the system, correct the updating of
net_wm_user_time, correctly handle timestamps of 0 when comparing
xserver timestamps for those who have had their systems up for
over 25 days or so, add some debugging information to verbose
logs, some code cleanups). Fixes all issues listed in #167358.
* src/display.h: (struct _MetaDisplay): clarify comment on
last_focus_time, introduce a new variable--last_user_time,
(XSERVER_TIME_IS_BEFORE macro): put this functionality into a
separate macro and then introduce a new macro with this name that
uses the old one but adds additional special-case checks for
timestamps that are 0, (comment to
meta_display_set_input_focus_window): add information about how
last_user_time should be used in this function
* src/display.c (santiy_check_timestamps): new function,
(meta_display_open): intialize display->last_user_time,
(meta_display_get_current_time_roundtrip): use the timestamp,
which is known to be good, in order to sanity_check_timestamps,
(event_callback): use the new meta_window_ste_user_time() function
in order to correct problems, use the timestamp of KeyPress and
ButtonPress events, which are known to be good, in order to
sanity_check_timestamps, (timestamp_too_old): new function for
common behavior of meta_display_focus_the_no_focus_window and
meta_display_set_input_focus_window, with added checking for
display->last_user_time in addition to display->last_focus_time,
(meta_display_set_input_focus_window): replace some of the code
with a call to timestamp_too_old(),
(meta_display_focus_the_no_focus_window): replace some of th ecode
with a call to timestamp_too_old()
* src/window.h: (meta_window_set_user_time): new function to
abstract the many things that need to be done when updating the
net_wm_user_time of any window
* src/window.c: (meta_window_activate): add debugging spew, make
sure the comparison is made with last_user_time NOT
last_focus_time, use meta_window_set_user_time() function in order
to correct problems, (meta_window_client_message): add a newline
to a debugging message to make them easier to read,
(meta_window_set_user_time): new function
* src/window-props.c (reload_net_wm_user_time): use the new
meta_window_ste_user_time() function in order to correct problems
2005-02-20 12:14:16 -05:00
|
|
|
* for the fact that wraparound can occur and the fact that a timestamp of
|
|
|
|
* 0 must be special-cased since it means older than anything else.
|
|
|
|
*
|
|
|
|
* Note that this is NOT an equivalent for time1 <= time2; if that's what
|
|
|
|
* you need then you'll need to swap the order of the arguments and negate
|
|
|
|
* the result.
|
2004-12-23 01:44:56 -05:00
|
|
|
*/
|
Big patch to cover about 6 different issues in order to correct rare
2005-02-20 Elijah Newren <newren@gmail.com>
Big patch to cover about 6 different issues in order to correct
rare problems with timestamps (make sure window selected in
tasklist actually gets focus, sanity check timestamps to avoid
rogue apps hosing the system, correct the updating of
net_wm_user_time, correctly handle timestamps of 0 when comparing
xserver timestamps for those who have had their systems up for
over 25 days or so, add some debugging information to verbose
logs, some code cleanups). Fixes all issues listed in #167358.
* src/display.h: (struct _MetaDisplay): clarify comment on
last_focus_time, introduce a new variable--last_user_time,
(XSERVER_TIME_IS_BEFORE macro): put this functionality into a
separate macro and then introduce a new macro with this name that
uses the old one but adds additional special-case checks for
timestamps that are 0, (comment to
meta_display_set_input_focus_window): add information about how
last_user_time should be used in this function
* src/display.c (santiy_check_timestamps): new function,
(meta_display_open): intialize display->last_user_time,
(meta_display_get_current_time_roundtrip): use the timestamp,
which is known to be good, in order to sanity_check_timestamps,
(event_callback): use the new meta_window_ste_user_time() function
in order to correct problems, use the timestamp of KeyPress and
ButtonPress events, which are known to be good, in order to
sanity_check_timestamps, (timestamp_too_old): new function for
common behavior of meta_display_focus_the_no_focus_window and
meta_display_set_input_focus_window, with added checking for
display->last_user_time in addition to display->last_focus_time,
(meta_display_set_input_focus_window): replace some of the code
with a call to timestamp_too_old(),
(meta_display_focus_the_no_focus_window): replace some of th ecode
with a call to timestamp_too_old()
* src/window.h: (meta_window_set_user_time): new function to
abstract the many things that need to be done when updating the
net_wm_user_time of any window
* src/window.c: (meta_window_activate): add debugging spew, make
sure the comparison is made with last_user_time NOT
last_focus_time, use meta_window_set_user_time() function in order
to correct problems, (meta_window_client_message): add a newline
to a debugging message to make them easier to read,
(meta_window_set_user_time): new function
* src/window-props.c (reload_net_wm_user_time): use the new
meta_window_ste_user_time() function in order to correct problems
2005-02-20 12:14:16 -05:00
|
|
|
#define XSERVER_TIME_IS_BEFORE_ASSUMING_REAL_TIMESTAMPS(time1, time2) \
|
|
|
|
( (( time1 < time2 ) && ( time2 - time1 < ((guint32)-1)/2 )) || \
|
|
|
|
(( time1 > time2 ) && ( time1 - time2 > ((guint32)-1)/2 )) \
|
|
|
|
)
|
|
|
|
#define XSERVER_TIME_IS_BEFORE(time1, time2) \
|
|
|
|
( time1 == 0 || \
|
|
|
|
(XSERVER_TIME_IS_BEFORE_ASSUMING_REAL_TIMESTAMPS(time1, time2) && \
|
|
|
|
time2 != 0) \
|
2004-12-23 01:44:56 -05:00
|
|
|
)
|
|
|
|
|
2001-05-31 23:00:01 -04:00
|
|
|
gboolean meta_display_open (const char *name);
|
|
|
|
void meta_display_close (MetaDisplay *display);
|
|
|
|
MetaScreen* meta_display_screen_for_root (MetaDisplay *display,
|
|
|
|
Window xroot);
|
|
|
|
MetaScreen* meta_display_screen_for_x_screen (MetaDisplay *display,
|
|
|
|
Screen *screen);
|
2002-06-27 01:08:32 -04:00
|
|
|
MetaScreen* meta_display_screen_for_xwindow (MetaDisplay *display,
|
|
|
|
Window xindow);
|
2001-05-31 23:00:01 -04:00
|
|
|
void meta_display_grab (MetaDisplay *display);
|
|
|
|
void meta_display_ungrab (MetaDisplay *display);
|
2001-06-07 22:17:48 -04:00
|
|
|
gboolean meta_display_is_double_click (MetaDisplay *display);
|
2001-05-31 23:00:01 -04:00
|
|
|
|
2002-06-08 19:55:27 -04:00
|
|
|
void meta_display_unmanage_screen (MetaDisplay *display,
|
|
|
|
MetaScreen *screen);
|
|
|
|
|
|
|
|
void meta_display_unmanage_windows_for_screen (MetaDisplay *display,
|
|
|
|
MetaScreen *screen);
|
|
|
|
|
2001-05-31 02:42:58 -04:00
|
|
|
/* A given MetaWindow may have various X windows that "belong"
|
|
|
|
* to it, such as the frame window.
|
|
|
|
*/
|
|
|
|
MetaWindow* meta_display_lookup_x_window (MetaDisplay *display,
|
|
|
|
Window xwindow);
|
|
|
|
void meta_display_register_x_window (MetaDisplay *display,
|
|
|
|
Window *xwindowp,
|
|
|
|
MetaWindow *window);
|
|
|
|
void meta_display_unregister_x_window (MetaDisplay *display,
|
|
|
|
Window xwindow);
|
2005-12-28 01:24:30 -05:00
|
|
|
/* Return whether the xwindow is a no focus window for any of the screens */
|
|
|
|
gboolean meta_display_xwindow_is_a_no_focus_window (MetaDisplay *display,
|
|
|
|
Window xwindow);
|
2001-05-31 02:42:58 -04:00
|
|
|
|
2001-06-24 04:09:10 -04:00
|
|
|
GSList* meta_display_list_windows (MetaDisplay *display);
|
2001-05-30 11:36:31 -04:00
|
|
|
|
2001-05-30 23:30:58 -04:00
|
|
|
MetaDisplay* meta_display_for_x_display (Display *xdisplay);
|
2001-05-31 02:42:58 -04:00
|
|
|
GSList* meta_displays_list (void);
|
2001-05-30 11:36:31 -04:00
|
|
|
|
2001-07-25 23:14:45 -04:00
|
|
|
Cursor meta_display_create_x_cursor (MetaDisplay *display,
|
|
|
|
MetaCursor cursor);
|
|
|
|
|
Patch to provide extra cues to the user when using window menu move and
2002-08-08 Craig Black <blackc@speakeasy.net>
Patch to provide extra cues to the user when using
window menu move and resize, #85724.
* src/common.h: add new cursors
* src/display.c: (grab_op_is_mouse)
(meta_display_create_x_cursor), (xcursor_for_op),
(meta_display_set_grab_op_cursor),
(meta_display_begin_grab_op):
The keyboard move and resize grab ops now also use the mouse.
Allow the grab cursor to be changed during the grab op.
Hold onto the initial grab position in case of reset.
* src/display.h: save the initial grab position
* src/keybindings.c: (process_keyboard_move_grab),
(process_keyboard_resize_grab), (handle_begin_move),
(handle_begin_resize):
The keyboard move and resize grab ops now also use the mouse.
* src/window.c: (meta_window_client_message), (menu_callback),
(update_move), (update_resize),
(meta_window_handle_mouse_grab_op_event), (warp_pointer),
(meta_window_warp_pointer), (meta_window_begin_grab_op),
(meta_window_update_resize_grab_op):
When moving or resizing a window use the last grab position
in computing change increment.
Provide support for warping the mouse pointer.
* src/window.h: new warp pointer and grab op helper functions
2002-08-09 00:27:23 -04:00
|
|
|
void meta_display_set_grab_op_cursor (MetaDisplay *display,
|
2002-08-14 12:51:13 -04:00
|
|
|
MetaScreen *screen,
|
Patch to provide extra cues to the user when using window menu move and
2002-08-08 Craig Black <blackc@speakeasy.net>
Patch to provide extra cues to the user when using
window menu move and resize, #85724.
* src/common.h: add new cursors
* src/display.c: (grab_op_is_mouse)
(meta_display_create_x_cursor), (xcursor_for_op),
(meta_display_set_grab_op_cursor),
(meta_display_begin_grab_op):
The keyboard move and resize grab ops now also use the mouse.
Allow the grab cursor to be changed during the grab op.
Hold onto the initial grab position in case of reset.
* src/display.h: save the initial grab position
* src/keybindings.c: (process_keyboard_move_grab),
(process_keyboard_resize_grab), (handle_begin_move),
(handle_begin_resize):
The keyboard move and resize grab ops now also use the mouse.
* src/window.c: (meta_window_client_message), (menu_callback),
(update_move), (update_resize),
(meta_window_handle_mouse_grab_op_event), (warp_pointer),
(meta_window_warp_pointer), (meta_window_begin_grab_op),
(meta_window_update_resize_grab_op):
When moving or resizing a window use the last grab position
in computing change increment.
Provide support for warping the mouse pointer.
* src/window.h: new warp pointer and grab op helper functions
2002-08-09 00:27:23 -04:00
|
|
|
MetaGrabOp op,
|
|
|
|
gboolean change_pointer,
|
|
|
|
Window grab_xwindow,
|
|
|
|
Time timestamp);
|
|
|
|
|
2001-07-11 02:22:00 -04:00
|
|
|
gboolean meta_display_begin_grab_op (MetaDisplay *display,
|
2002-06-27 01:08:32 -04:00
|
|
|
MetaScreen *screen,
|
2001-07-11 02:22:00 -04:00
|
|
|
MetaWindow *window,
|
|
|
|
MetaGrabOp op,
|
|
|
|
gboolean pointer_already_grabbed,
|
2003-11-24 13:09:47 -05:00
|
|
|
int event_serial,
|
2001-07-11 02:22:00 -04:00
|
|
|
int button,
|
|
|
|
gulong modmask,
|
|
|
|
Time timestamp,
|
|
|
|
int root_x,
|
|
|
|
int root_y);
|
|
|
|
void meta_display_end_grab_op (MetaDisplay *display,
|
|
|
|
Time timestamp);
|
|
|
|
|
Add a raise on click option, basically only because all the major distros
2006-01-10 Elijah Newren <newren@gmail.com>
Add a raise on click option, basically only because all the major
distros are patching it in anyway. See #326156.
* src/metacity.schemas.in: add the new gconf key and explanation
* src/prefs.[ch] (#define KEY_RAISE_ON_CLICK, static gboolean
raise_on_click, update_raise_on_click, meta_prefs_init,
change_notify, meta_prefs_get_raise_on_click,
meta_preference_to_string):
Add all the normal preference handling stuff for this new
raise-on-click option.
* src/core.c (meta_core_show_window_menu):
* src/display.c (event_callback, meta_display_begin_grab_op):
* src/window.c (window_activate, meta_window_configure_request, ):
Only raise the window if in raise_on_click mode.
* src/display.c (meta_display_begin_grab_op,
meta_display_end_grab_op, meta_display_check_threshold_reached):
* src/display.h (struct MetaDisplay):
* src/window.c (meta_window_handle_mouse_grab_op_event):
if not in raise-on-click mode only raise on button release if the
click didn't start a move or resize operation; needs a few extra
MetaDisplay fields to handle this
* src/core.c (meta_core_user_lower_and_unfocus):
no need to do the MRU shuffling if not maintaining the stacking
order == MRU order invariant
* src/frames.c (meta_frames_button_press_event):
* src/window.c (meta_window_begin_grab_op):
remove an unneeded window raising that is already handled elsewhere
2006-01-10 14:35:03 -05:00
|
|
|
void meta_display_check_threshold_reached (MetaDisplay *display,
|
|
|
|
int x,
|
|
|
|
int y);
|
2001-07-25 23:14:45 -04:00
|
|
|
void meta_display_grab_window_buttons (MetaDisplay *display,
|
|
|
|
Window xwindow);
|
|
|
|
void meta_display_ungrab_window_buttons (MetaDisplay *display,
|
|
|
|
Window xwindow);
|
2001-07-11 02:22:00 -04:00
|
|
|
|
2001-12-10 23:03:58 -05:00
|
|
|
void meta_display_grab_focus_window_button (MetaDisplay *display,
|
2003-10-13 16:15:40 -04:00
|
|
|
MetaWindow *window);
|
2001-12-10 23:03:58 -05:00
|
|
|
void meta_display_ungrab_focus_window_button (MetaDisplay *display,
|
2003-10-13 16:15:40 -04:00
|
|
|
MetaWindow *window);
|
2001-12-10 02:48:21 -05:00
|
|
|
|
Merge of all the changes on the constraints_experiments branch. This is
2005-11-18 Elijah Newren <newren@gmail.com>
Merge of all the changes on the constraints_experiments branch.
This is just a summary, to get the full ChangeLog of those
changes (approx. 2000 lines):
cvs -q -z3 update -Pd -r constraints_experiments
cvs -q -z3 diff -pu -r CONSTRAINTS_EXPERIMENTS_BRANCHPOINT ChangeLog
Bugs fixed:
unfiled - constraints.c is overly complicated[1]
unfiled - constraints.c is not robust when all constraints
cannot simultaneously be met (constraints need to be
prioritized)
unfiled - keep-titlebar-onscreen constraint is decoration
unaware (since get_outermost_onscreen_positions()
forgets to include decorations)
unfiled - keyboard snap-moving and snap-resizing snap to hidden
edges
109553 - gravity w/ simultaneous move & resize doesn't work
113601 - maximize vertical and horizontal should toggle and be
constrained
122196 - windows show up under vertical panels
122670 - jerky/random resizing of window via keyboard[2]
124582 - keyboard and mouse snap-resizing and snap-moving
erroneously moves the window multidimensionally
136307 - don't allow apps to resize themselves off the screen
(*cough* filechooser *cough*)
142016, 143784 - windows should not span multiple xineramas
unless placed there by the user
143145 - clamp new windows to screensize and force them
onscreen, if they'll fit
144126 - Handle pathological strut lists sanely[3]
149867 - fixed aspect ratio windows are difficult to resize[4]
152898 - make screen edges consistent; allow easy slamming of
windows into the left, right, and bottom edges of the
screen too.
154706 - bouncing weirdness at screen edge with keyboard moving
or resizing
156699 - avoid struts when placing windows, if possible (nasty
a11y blocker)
302456 - dragging offscreen too restrictive
304857 - wireframe moving off the top of the screen is misleading
308521 - make uni-directional resizing easier with
alt-middle-drag and prevent the occasional super
annoying resize-the-wrong-side(s) behavior
312007 - snap-resize moves windows with a minimum size
constraint
312104 - resizing the top of a window can cause the bottom to
grow
319351 - don't instantly snap on mouse-move-snapping, remove
braindeadedness of having order of releasing shift and
releasing button press matter so much
[1] fixed in my opinion, anyway.
[2] Actually, it's not totally fixed--it's just annoying
instead of almost completely unusable. Matthias had a
suggestion that may fix the remainder of the problems (see
http://tinyurl.com/bwzuu).
[3] This bug was originally about not-quite-so-pathological
cases but was left open for the worse cases. The code from
the branch handles the remainder of the cases mentioned in
this bug.
[4] Actually, although it's far better there's still some minor
issues left: a slight drift that's only noticeable after
lots of resizing, and potential problems with partially
onscreen constraints due to not clearing any
fixed_directions flags (aspect ratio windows get resized in
both directions and thus aren't fixed in one of them)
New feature:
81704 - edge resistance for user move and resize operations;
in particular 3 different kinds of resistance are
implemented:
Pixel-Distance: window movement is resisted when it
aligns with an edge unless the movement is greater than
a threshold number of pixels
Timeout: window movement past an edge is prevented until
a certain amount of time has elapsed during the
operation since the first request to move it past that
edge
Keyboard-Buildup: when moving or resizing with the
keyboard, once a window is aligned with a certain edge
it cannot move past until the correct direction has
been pressed enough times (e.g. 2 or 3 times)
Major changes:
- constraints.c has been rewritten; very few lines of code from
the old version remain. There is a comment near the top of
the function explaining the basics of how the new framework
works. A more detailed explanation can be found in
doc/how-constraints-works.txt
- edge-resistance.[ch] are new files implementing edge-resistance.
- boxes.[ch] are new files containing low-level error-prone
functions used heavily in constraints.c and edge-resistance.c,
among various places throughout the code. testboxes.c
contains a thorough testsuite for the boxes.[ch] functions
compiled into a program, testboxes.
- meta_window_move_resize_internal() *must* be told the gravity
of the associated operation (if it's just a move operation,
the gravity will be ignored, but for resize and move+resize
the correct value is needed)
- the craziness of different values that
meta_window_move_resize_internal() accepts has been documented
in a large comment at the beginning of the function. It may
be possible to clean this up some, but until then things will
remain as they were before--caller beware.
- screen and xinerama usable areas (i.e. places not covered by
e.g. panels) are cached in the workspace now, as are the
screen and xinerama edges. These get updated with the
workarea in src/workspace.c:ensure_work_areas_validated()
2005-11-19 09:58:50 -05:00
|
|
|
/* Next two functions are defined in edge-resistance.c */
|
|
|
|
void meta_display_compute_resistance_and_snapping_edges (MetaDisplay *display);
|
|
|
|
void meta_display_cleanup_edges (MetaDisplay *display);
|
|
|
|
|
2001-08-30 00:01:38 -04:00
|
|
|
/* make a request to ensure the event serial has changed */
|
|
|
|
void meta_display_increment_event_serial (MetaDisplay *display);
|
2001-06-06 00:47:37 -04:00
|
|
|
|
2001-10-07 19:06:19 -04:00
|
|
|
void meta_display_update_active_window_hint (MetaDisplay *display);
|
|
|
|
|
Fix a variety of focus race conditions in all focus modes, or at least
2004-10-04 Elijah Newren <newren@math.utah.edu>
Fix a variety of focus race conditions in all focus modes, or at
least make them harder to trigger (fixes #152000)
* src/core.[ch] (meta_core_user_lower_and_unfocus): add a
timestamp parameter; pass it along to
meta_workspace_focus_default_window
* src/display.[ch] (meta_display_get_current_time_roundtrip): new
function
* src/display.c (event_callback): pass a timestamp to the
meta_workspace_activate and meta_workspace_focus_default_window
function calls
* src/frames.c (meta_frames_button_press_event): pass a timestamp
to meta_core_user_lower_and_unfocus
* src/keybindings.c (handle_activate_workspace): pass a timestamp
to meta_workspace_activate, (process_workspace_switch_grab): pass
a timestamp to meta_workspace_focus_default_window and
meta_workspace_activate, (handle_toggle_desktop): pass a timestamp
to meta_workspace_focus_default_window,
(do_handle_move_to_workspace): pass a timestamp to
meta_workspace_activate_with_focus, (handle_workspace_switch):
meta_workspace_activate
* src/screen.c (meta_screen_new): pass a timestamp to
meta_workspace_activate
* src/window.c (meta_window_free): pass a timestamp to
meta_workspace_focus_default_window, (idle_calc_showing): don't
increment the focus sentinel here, (meta_window_minimize): pass a
timestamp to meta_workspace_focus_default_window,
(meta_window_client_message), pass a timestamp to
meta_workspace_focus_default_window
* src/workspace.h (meta_workspace_activate): add timestamp
parameter, (meta_workspace_activate_with_focus): add timestamp
parameter, (meta_workspace_focus_default_window): add timestamp
parameter
* src/workspace.c (meta_workspace_focus_mru_window): make this
function take a timestamp and use it for meta_window_focus or
XSetInputFocus, (meta_workspace_activate_with_focus): make this
function take a timestamp and pass it along to meta_window_focus
and meta_workspace_focus_default_window,
(meta_workspace_activate): make this function take a timestamp and
pass it to meta_workspace_activate_with_focus),
(meta_workspace_focus_default_window): make this function take a
timestamp, warn if its 0 but try to handle that case sanely, and
pass the timestamp on to meta_window_focus or
meta_workspace_focus_mru_window or XSetInputFocus
2004-10-04 16:32:59 -04:00
|
|
|
guint32 meta_display_get_current_time (MetaDisplay *display);
|
|
|
|
guint32 meta_display_get_current_time_roundtrip (MetaDisplay *display);
|
2002-01-03 18:28:19 -05:00
|
|
|
|
2002-01-05 22:15:49 -05:00
|
|
|
/* utility goo */
|
2002-03-02 10:26:07 -05:00
|
|
|
const char* meta_event_mode_to_string (int m);
|
|
|
|
const char* meta_event_detail_to_string (int d);
|
2002-01-05 22:15:49 -05:00
|
|
|
|
2002-02-06 22:25:34 -05:00
|
|
|
void meta_display_queue_retheme_all_windows (MetaDisplay *display);
|
|
|
|
void meta_display_retheme_all (void);
|
|
|
|
|
2005-07-11 09:25:08 -04:00
|
|
|
void meta_display_set_cursor_theme (const char *theme,
|
|
|
|
int size);
|
|
|
|
|
Screw around with Anders's ping patch so he'll get plenty of CVS
2002-02-26 Havoc Pennington <hp@pobox.com>
Screw around with Anders's ping patch so he'll get plenty of CVS
conflicts. ;-)
* src/display.c (meta_display_ping_window): spew warnings
if we try to call this with CurrentTime
(meta_display_ping_timeout): remove ping from the pending pings
after it times out.
* src/util.h: added PING debug category
* src/display.c (remove_pending_pings_for_window): don't remove
"tmp" just before "tmp->next", don't break out of loop after
finding the first match
(meta_display_open): no trailing comma in array init
(event_callback): move the processing of ping replies into a
separate function
* src/screen.c (set_supported_hint): add _NET_WM_PING to supported
list
* src/display.h: change gpointer to void*
2002-02-26 Anders Carlsson <andersca@gnu.org>
* src/display.c: (ping_data_free),
(remove_pending_pings_for_window), (meta_display_open),
(event_callback), (meta_display_unregister_x_window),
(meta_display_ping_timeout), (meta_display_ping_window),
(meta_display_window_has_pending_pings):
Implement meta_display_ping_window, and filter out scroll wheel
events.
* src/display.h:
Add MetaWindowPingFunc, meta_display_ping_window and
meta_display_window_has_pending_pings.
2002-02-26 21:05:39 -05:00
|
|
|
void meta_display_ping_window (MetaDisplay *display,
|
|
|
|
MetaWindow *window,
|
|
|
|
Time timestamp,
|
|
|
|
MetaWindowPingFunc ping_reply_func,
|
|
|
|
MetaWindowPingFunc ping_timeout_func,
|
|
|
|
void *user_data);
|
|
|
|
gboolean meta_display_window_has_pending_pings (MetaDisplay *display,
|
|
|
|
MetaWindow *window);
|
|
|
|
|
2002-04-05 10:52:49 -05:00
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
META_TAB_LIST_NORMAL,
|
|
|
|
META_TAB_LIST_DOCKS
|
|
|
|
} MetaTabList;
|
|
|
|
|
2006-01-10 00:05:40 -05:00
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
META_TAB_SHOW_ICON, /* Alt-Tab mode */
|
|
|
|
META_TAB_SHOW_INSTANTLY /* Alt-Esc mode */
|
|
|
|
} MetaTabShowType;
|
|
|
|
|
2003-03-14 21:16:21 -05:00
|
|
|
GList* meta_display_get_tab_list (MetaDisplay *display,
|
|
|
|
MetaTabList type,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWorkspace *workspace);
|
2002-03-11 23:34:17 -05:00
|
|
|
|
|
|
|
MetaWindow* meta_display_get_tab_next (MetaDisplay *display,
|
2002-04-05 10:52:49 -05:00
|
|
|
MetaTabList type,
|
2002-05-11 02:59:54 -04:00
|
|
|
MetaScreen *screen,
|
2002-03-11 23:34:17 -05:00
|
|
|
MetaWorkspace *workspace,
|
|
|
|
MetaWindow *window,
|
|
|
|
gboolean backward);
|
Screw around with Anders's ping patch so he'll get plenty of CVS
2002-02-26 Havoc Pennington <hp@pobox.com>
Screw around with Anders's ping patch so he'll get plenty of CVS
conflicts. ;-)
* src/display.c (meta_display_ping_window): spew warnings
if we try to call this with CurrentTime
(meta_display_ping_timeout): remove ping from the pending pings
after it times out.
* src/util.h: added PING debug category
* src/display.c (remove_pending_pings_for_window): don't remove
"tmp" just before "tmp->next", don't break out of loop after
finding the first match
(meta_display_open): no trailing comma in array init
(event_callback): move the processing of ping replies into a
separate function
* src/screen.c (set_supported_hint): add _NET_WM_PING to supported
list
* src/display.h: change gpointer to void*
2002-02-26 Anders Carlsson <andersca@gnu.org>
* src/display.c: (ping_data_free),
(remove_pending_pings_for_window), (meta_display_open),
(event_callback), (meta_display_unregister_x_window),
(meta_display_ping_timeout), (meta_display_ping_window),
(meta_display_window_has_pending_pings):
Implement meta_display_ping_window, and filter out scroll wheel
events.
* src/display.h:
Add MetaWindowPingFunc, meta_display_ping_window and
meta_display_window_has_pending_pings.
2002-02-26 21:05:39 -05:00
|
|
|
|
2002-09-04 00:15:46 -04:00
|
|
|
MetaWindow* meta_display_get_tab_current (MetaDisplay *display,
|
|
|
|
MetaTabList type,
|
|
|
|
MetaScreen *screen,
|
|
|
|
MetaWorkspace *workspace);
|
|
|
|
|
2002-03-17 12:22:23 -05:00
|
|
|
int meta_resize_gravity_from_grab_op (MetaGrabOp op);
|
|
|
|
|
2002-12-09 22:23:04 -05:00
|
|
|
gboolean meta_grab_op_is_moving (MetaGrabOp op);
|
|
|
|
gboolean meta_grab_op_is_resizing (MetaGrabOp op);
|
|
|
|
|
2002-10-07 19:14:40 -04:00
|
|
|
void meta_display_devirtualize_modifiers (MetaDisplay *display,
|
|
|
|
MetaVirtualModifier modifiers,
|
|
|
|
unsigned int *mask);
|
|
|
|
|
2003-05-30 16:24:00 -04:00
|
|
|
void meta_display_increment_focus_sentinel (MetaDisplay *display);
|
|
|
|
void meta_display_decrement_focus_sentinel (MetaDisplay *display);
|
|
|
|
gboolean meta_display_focus_sentinel_clear (MetaDisplay *display);
|
|
|
|
|
2004-12-23 01:44:56 -05:00
|
|
|
/* meta_display_set_input_focus_window is like XSetInputFocus, except
|
|
|
|
* that (a) it can't detect timestamps later than the current time,
|
|
|
|
* since Metacity isn't part of the XServer, and thus gives erroneous
|
Big patch to cover about 6 different issues in order to correct rare
2005-02-20 Elijah Newren <newren@gmail.com>
Big patch to cover about 6 different issues in order to correct
rare problems with timestamps (make sure window selected in
tasklist actually gets focus, sanity check timestamps to avoid
rogue apps hosing the system, correct the updating of
net_wm_user_time, correctly handle timestamps of 0 when comparing
xserver timestamps for those who have had their systems up for
over 25 days or so, add some debugging information to verbose
logs, some code cleanups). Fixes all issues listed in #167358.
* src/display.h: (struct _MetaDisplay): clarify comment on
last_focus_time, introduce a new variable--last_user_time,
(XSERVER_TIME_IS_BEFORE macro): put this functionality into a
separate macro and then introduce a new macro with this name that
uses the old one but adds additional special-case checks for
timestamps that are 0, (comment to
meta_display_set_input_focus_window): add information about how
last_user_time should be used in this function
* src/display.c (santiy_check_timestamps): new function,
(meta_display_open): intialize display->last_user_time,
(meta_display_get_current_time_roundtrip): use the timestamp,
which is known to be good, in order to sanity_check_timestamps,
(event_callback): use the new meta_window_ste_user_time() function
in order to correct problems, use the timestamp of KeyPress and
ButtonPress events, which are known to be good, in order to
sanity_check_timestamps, (timestamp_too_old): new function for
common behavior of meta_display_focus_the_no_focus_window and
meta_display_set_input_focus_window, with added checking for
display->last_user_time in addition to display->last_focus_time,
(meta_display_set_input_focus_window): replace some of the code
with a call to timestamp_too_old(),
(meta_display_focus_the_no_focus_window): replace some of th ecode
with a call to timestamp_too_old()
* src/window.h: (meta_window_set_user_time): new function to
abstract the many things that need to be done when updating the
net_wm_user_time of any window
* src/window.c: (meta_window_activate): add debugging spew, make
sure the comparison is made with last_user_time NOT
last_focus_time, use meta_window_set_user_time() function in order
to correct problems, (meta_window_client_message): add a newline
to a debugging message to make them easier to read,
(meta_window_set_user_time): new function
* src/window-props.c (reload_net_wm_user_time): use the new
meta_window_ste_user_time() function in order to correct problems
2005-02-20 12:14:16 -05:00
|
|
|
* behavior in this circumstance (so don't do it), (b) it uses
|
|
|
|
* display->last_focus_time since we don't have access to the true
|
|
|
|
* Xserver one, (c) it makes use of display->user_time since checking
|
|
|
|
* whether a window should be allowed to be focused should depend
|
|
|
|
* on user_time events (see bug 167358, comment 15 in particular)
|
2004-12-23 01:44:56 -05:00
|
|
|
*/
|
|
|
|
void meta_display_set_input_focus_window (MetaDisplay *display,
|
|
|
|
MetaWindow *window,
|
|
|
|
gboolean focus_frame,
|
|
|
|
Time timestamp);
|
|
|
|
|
|
|
|
/* meta_display_focus_the_no_focus_window is called when the
|
|
|
|
* designated no_focus_window should be focused, but is otherwise the
|
|
|
|
* same as meta_display_set_input_focus_window
|
|
|
|
*/
|
2004-10-04 17:09:08 -04:00
|
|
|
void meta_display_focus_the_no_focus_window (MetaDisplay *display,
|
2005-12-28 01:24:30 -05:00
|
|
|
MetaScreen *screen,
|
2004-10-04 17:09:08 -04:00
|
|
|
Time timestamp);
|
2004-12-23 01:44:56 -05:00
|
|
|
|
2004-10-04 17:09:08 -04:00
|
|
|
void meta_display_queue_autoraise_callback (MetaDisplay *display,
|
|
|
|
MetaWindow *window);
|
|
|
|
void meta_display_remove_autoraise_callback (MetaDisplay *display);
|
|
|
|
|
2001-05-30 11:36:31 -04:00
|
|
|
#endif
|