update to upstream 2.25.1

Merge commit '49cc773eb4801fb0ee3cddeeb1d27042f4a46e2e' into clutter
This commit is contained in:
Tomas Frydrych
2008-09-03 19:48:23 +01:00
33 changed files with 7374 additions and 6259 deletions

View File

@ -234,6 +234,11 @@ static void handle_move_to_corner_se (MetaDisplay *display,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_move_to_center (MetaDisplay *display,
MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding);
static void handle_spew_mark (MetaDisplay *display,
MetaScreen *screen,
MetaWindow *window,
@ -489,6 +494,7 @@ static const MetaKeyHandler window_handlers[] = {
{ META_KEYBINDING_MOVE_TO_CORNER_NE, handle_move_to_corner_ne, NULL },
{ META_KEYBINDING_MOVE_TO_CORNER_SW, handle_move_to_corner_sw, NULL },
{ META_KEYBINDING_MOVE_TO_CORNER_SE, handle_move_to_corner_se, NULL },
{ META_KEYBINDING_MOVE_TO_CENTER, handle_move_to_center, NULL },
{ NULL, NULL, NULL }
};
@ -3037,6 +3043,36 @@ handle_move_to_side_w (MetaDisplay *display,
}
}
static void
handle_move_to_center (MetaDisplay *display,
MetaScreen *screen,
MetaWindow *window,
XEvent *event,
MetaKeyBinding *binding)
{
MetaRectangle work_area;
MetaRectangle outer;
int orig_x, orig_y;
int frame_width, frame_height;
if (!window)
return;
meta_window_get_work_area_all_xineramas (window, &work_area);
meta_window_get_outer_rect (window, &outer);
meta_window_get_position (window, &orig_x, &orig_y);
frame_width = (window->frame ? window->frame->child_x : 0);
frame_height = (window->frame ? window->frame->child_y : 0);
meta_window_move_resize (window,
TRUE,
work_area.x + (work_area.width +frame_width -outer.width )/2,
work_area.y + (work_area.height+frame_height-outer.height)/2,
window->rect.width,
window->rect.height);
}
static gboolean
process_workspace_switch_grab (MetaDisplay *display,
MetaScreen *screen,

View File

@ -1,6 +1,11 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* Metacity Keybindings */
/**
* \file keybindings.h Grab and ungrab keys, and process the key events
*
* Performs global X grabs on the keys we need to be told about, like
* the one to close a window. It also deals with incoming key events.
*/
/*
* Copyright (C) 2001 Havoc Pennington

View File

@ -23,14 +23,15 @@
*/
/**
* \file core/main.c Program startup
*
* \file
* Program startup.
* Functions which parse the command-line arguments, create the display,
* kick everything off and then close down Metacity when it's time to go.
*/
/**
* \mainpage Metacity - a boring window manager for the adult in you
* \mainpage
* Metacity - a boring window manager for the adult in you
*
* Many window managers are like Marshmallow Froot Loops; Metacity
* is like Cheerios.
@ -216,8 +217,17 @@ typedef struct
gboolean disable_sm;
gboolean print_version;
gboolean sync;
gboolean composite;
gboolean no_composite;
} MetaArguments;
#ifdef HAVE_COMPOSITE_EXTENSIONS
#define COMPOSITE_OPTS_FLAGS 0
#else /* HAVE_COMPOSITE_EXTENSIONS */
/* No compositor, so don't show the arguments in --help */
#define COMPOSITE_OPTS_FLAGS G_OPTION_FLAG_HIDDEN
#endif /* HAVE_COMPOSITE_EXTENSIONS */
/**
* Parses argc and argv and returns the
* arguments that Metacity understands in meta_args.
@ -234,7 +244,8 @@ static void
meta_parse_options (int *argc, char ***argv,
MetaArguments *meta_args)
{
MetaArguments my_args = {NULL, NULL, NULL, FALSE, FALSE, FALSE};
MetaArguments my_args = {NULL, NULL, NULL,
FALSE, FALSE, FALSE, FALSE, FALSE};
GOptionEntry options[] = {
{
"sm-disable", 0, 0, G_OPTION_ARG_NONE,
@ -255,7 +266,7 @@ meta_parse_options (int *argc, char ***argv,
"ID"
},
{
"display", 0, 0, G_OPTION_ARG_STRING,
"display", 'd', 0, G_OPTION_ARG_STRING,
&my_args.display_name, N_("X Display to use"),
"DISPLAY"
},
@ -277,6 +288,18 @@ meta_parse_options (int *argc, char ***argv,
N_("Make X calls synchronous"),
NULL
},
{
"composite", 'c', COMPOSITE_OPTS_FLAGS, G_OPTION_ARG_NONE,
&my_args.composite,
N_("Turn compositing on"),
NULL
},
{
"no-composite", 0, COMPOSITE_OPTS_FLAGS, G_OPTION_ARG_NONE,
&my_args.no_composite,
N_("Turn compositing off"),
NULL
},
{NULL}
};
GOptionContext *ctx;
@ -472,7 +495,10 @@ main (int argc, char **argv)
g_free (meta_args.save_file);
g_free (meta_args.display_name);
g_free (meta_args.client_id);
if (meta_args.composite || meta_args.no_composite)
meta_prefs_set_compositing_manager (meta_args.composite);
if (!meta_display_open ())
meta_exit (META_EXIT_ERROR);

View File

@ -1,6 +1,14 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* $Xorg: Xatomtype.h,v 1.4 2001/02/09 02:03:38 xorgcvs Exp $ */
/**
* \file metacity-Xatomtype.h Types for communicating with X about properties
*
* This files defines crock C structures for calling XGetWindowProperty and
* XChangeProperty. All fields must be longs as the semantics of property
* routines will handle conversion to and from actual 32 bit objects. If your
* compiler doesn't treat &structoflongs the same as &arrayoflongs[0], you
* will have some work to do.
*/
/***********************************************************
@ -52,14 +60,6 @@ SOFTWARE.
#ifndef _XATOMTYPE_H_
#define _XATOMTYPE_H_
/*
* This files defines crock C structures for calling XGetWindowProperty and
* XChangeProperty. All fields must be longs as the semantics of property
* routines will handle conversion to and from actual 32 bit objects. If your
* compiler doesn't treat &structoflongs the same as &arrayoflongs[0], you
* will have some work to do.
*/
#define BOOL long
#define SIGNEDINT long
#define UNSIGNEDINT unsigned long

View File

@ -49,6 +49,7 @@
*/
#define KEY_TITLEBAR_FONT "/apps/metacity/general/titlebar_font"
#define KEY_NUM_WORKSPACES "/apps/metacity/general/num_workspaces"
#define KEY_COMPOSITOR "/apps/metacity/general/compositing_manager"
#define KEY_GNOME_ACCESSIBILITY "/desktop/gnome/interface/accessibility"
#define KEY_COMMAND_PREFIX "/apps/metacity/keybinding_commands/command_"
@ -1928,6 +1929,7 @@ static MetaKeyPref window_bindings[] = {
{ META_KEYBINDING_MOVE_TO_SIDE_S, NULL, FALSE },
{ META_KEYBINDING_MOVE_TO_SIDE_E, NULL, FALSE },
{ META_KEYBINDING_MOVE_TO_SIDE_W, NULL, FALSE },
{ META_KEYBINDING_MOVE_TO_CENTER, NULL, FALSE },
{ NULL, NULL, FALSE }
};
@ -2944,6 +2946,24 @@ meta_prefs_get_compositing_manager (void)
return compositing_manager;
}
void
meta_prefs_set_compositing_manager (gboolean whether)
{
GError *err = NULL;
gconf_client_set_bool (default_client,
KEY_COMPOSITOR,
whether,
&err);
if (err)
{
meta_warning (_("Error setting compositor status: %s\n"),
err->message);
g_error_free (err);
}
}
#ifndef HAVE_GCONF
static void
init_button_layout(void)

View File

@ -1,6 +1,13 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* Metacity X screen handler */
/**
* \file screen-private.h Screens which Metacity manages
*
* Managing X screens.
* This file contains methods on this class which are available to
* routines in core but not outside it. (See screen.h for the routines
* which the rest of the world is allowed to use.)
*/
/*
* Copyright (C) 2001 Havoc Pennington

View File

@ -1,6 +1,13 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* Metacity Session Management */
/**
* \file session.h Session management
*
* Maps windows to information about their placing and state on startup.
* This is window matching, which we have a policy of leaving in general
* to programs such as Devil's Pie, but the session manager specification
* requires us to do it here.
*/
/*
* Copyright (C) 2001 Havoc Pennington

View File

@ -1,6 +1,13 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* Metacity X managed windows */
/**
* \file window-private.h Windows which Metacity manages
*
* Managing X windows.
* This file contains methods on this class which are available to
* routines in core but not outside it. (See window.h for the routines
* which the rest of the world is allowed to use.)
*/
/*
* Copyright (C) 2001 Havoc Pennington

View File

@ -1,7 +1,7 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/**
* \file window-props.c MetaWindow property handling
* \file window-props.h MetaWindow property handling
*
* A system which can inspect sets of properties of given windows
* and take appropriate action given their values.

View File

@ -75,7 +75,8 @@ static void meta_window_show (MetaWindow *window);
static void meta_window_hide (MetaWindow *window);
static void meta_window_save_rect (MetaWindow *window);
static void meta_window_save_user_rect (MetaWindow *window);
static void save_user_window_placement (MetaWindow *window);
static void force_save_user_window_placement (MetaWindow *window);
static void meta_window_move_resize_internal (MetaWindow *window,
MetaMoveResizeFlags flags,
@ -2457,11 +2458,28 @@ meta_window_save_rect (MetaWindow *window)
}
}
/**
* Save the user_rect regardless of whether the window is maximized or
* fullscreen. See save_user_window_placement() for most uses.
*
* \param window Store current position of this window for future reference
*/
static void
meta_window_save_user_rect (MetaWindow *window)
force_save_user_window_placement (MetaWindow *window)
{
meta_window_get_client_root_coords (window, &window->user_rect);
}
/**
* Save the user_rect, but only if the window is neither maximized nor
* fullscreen, otherwise the window may snap back to those dimensions
* (bug #461927).
*
* \param window Store current position of this window for future reference
*/
static void
save_user_window_placement (MetaWindow *window)
{
/* We do not save maximized or fullscreen dimensions, otherwise the
* window may snap back to those dimensions (Bug #461927). */
if (!(META_WINDOW_MAXIMIZED (window) || window->fullscreen))
{
MetaRectangle user_rect;
@ -3527,13 +3545,11 @@ meta_window_move_resize_internal (MetaWindow *window,
if (need_configure_notify)
send_configure_notify (window);
/* user_rect is the position to restore towards if strut changes occur. Thus
* we want user_rect to reflect user position/size changes OR the initial
* placement of the window.
*/
if (is_user_action || !window->placed)
meta_window_save_user_rect(window);
if (!window->placed)
force_save_user_window_placement (window);
else if (is_user_action)
save_user_window_placement (window);
if (need_move_frame || need_resize_frame ||
need_move_client || need_resize_client)
{
@ -4575,7 +4591,7 @@ meta_window_move_resize_request (MetaWindow *window,
*
* See also bug 426519.
*/
meta_window_save_user_rect(window);
save_user_window_placement (window);
}
gboolean
@ -5329,18 +5345,25 @@ process_property_notify (MetaWindow *window,
* can just call reload on the property in the event and get rid of
* this if-else chain.
*/
if (meta_is_verbose ()) /* avoid looking up the name if we don't have to */
{
char *property_name = XGetAtomName (window->display->xdisplay,
event->atom);
meta_verbose ("Property notify on %s for %s\n",
window->desc, property_name);
XFree (property_name);
}
if (event->atom == XA_WM_NAME)
{
meta_verbose ("Property notify on %s for WM_NAME\n", window->desc);
/* don't bother reloading WM_NAME if using _NET_WM_NAME already */
if (!window->using_net_wm_name)
meta_window_reload_property (window, XA_WM_NAME);
}
else if (event->atom == window->display->atom__NET_WM_NAME)
{
meta_verbose ("Property notify on %s for NET_WM_NAME\n", window->desc);
meta_window_reload_property (window, window->display->atom__NET_WM_NAME);
/* if _NET_WM_NAME was unset, reload WM_NAME */
@ -5349,15 +5372,12 @@ process_property_notify (MetaWindow *window,
}
else if (event->atom == XA_WM_ICON_NAME)
{
meta_verbose ("Property notify on %s for WM_ICON_NAME\n", window->desc);
/* don't bother reloading WM_ICON_NAME if using _NET_WM_ICON_NAME already */
if (!window->using_net_wm_icon_name)
meta_window_reload_property (window, XA_WM_ICON_NAME);
}
else if (event->atom == window->display->atom__NET_WM_ICON_NAME)
{
meta_verbose ("Property notify on %s for NET_WM_ICON_NAME\n", window->desc);
meta_window_reload_property (window, window->display->atom__NET_WM_ICON_NAME);
/* if _NET_WM_ICON_NAME was unset, reload WM_ICON_NAME */
@ -5366,8 +5386,6 @@ process_property_notify (MetaWindow *window,
}
else if (event->atom == XA_WM_NORMAL_HINTS)
{
meta_verbose ("Property notify on %s for WM_NORMAL_HINTS\n", window->desc);
meta_window_reload_property (window, XA_WM_NORMAL_HINTS);
/* See if we need to constrain current size */
@ -5375,40 +5393,28 @@ process_property_notify (MetaWindow *window,
}
else if (event->atom == window->display->atom_WM_PROTOCOLS)
{
meta_verbose ("Property notify on %s for WM_PROTOCOLS\n", window->desc);
meta_window_reload_property (window, window->display->atom_WM_PROTOCOLS);
}
else if (event->atom == XA_WM_HINTS)
{
meta_verbose ("Property notify on %s for WM_HINTS\n", window->desc);
meta_window_reload_property (window, XA_WM_HINTS);
}
else if (event->atom == window->display->atom__MOTIF_WM_HINTS)
{
meta_verbose ("Property notify on %s for MOTIF_WM_HINTS\n", window->desc);
meta_window_reload_property (window,
window->display->atom__MOTIF_WM_HINTS);
}
else if (event->atom == XA_WM_CLASS)
{
meta_verbose ("Property notify on %s for WM_CLASS\n", window->desc);
meta_window_reload_property (window, XA_WM_CLASS);
}
else if (event->atom == XA_WM_TRANSIENT_FOR)
{
meta_verbose ("Property notify on %s for WM_TRANSIENT_FOR\n", window->desc);
meta_window_reload_property (window, XA_WM_TRANSIENT_FOR);
}
else if (event->atom ==
window->display->atom_WM_WINDOW_ROLE)
{
meta_verbose ("Property notify on %s for WM_WINDOW_ROLE\n", window->desc);
update_role (window);
}
else if (event->atom ==
@ -5421,12 +5427,10 @@ process_property_notify (MetaWindow *window,
else if (event->atom ==
window->display->atom__NET_WM_WINDOW_TYPE)
{
meta_verbose ("Property notify on %s for NET_WM_WINDOW_TYPE\n", window->desc);
update_net_wm_type (window);
}
else if (event->atom == window->display->atom__NET_WM_ICON)
{
meta_verbose ("Property notify on %s for NET_WM_ICON\n", window->desc);
meta_icon_cache_property_changed (&window->icon_cache,
window->display,
event->atom);
@ -5434,8 +5438,6 @@ process_property_notify (MetaWindow *window,
}
else if (event->atom == window->display->atom__KWM_WIN_ICON)
{
meta_verbose ("Property notify on %s for KWM_WIN_ICON\n", window->desc);
meta_icon_cache_property_changed (&window->icon_cache,
window->display,
event->atom);
@ -5444,20 +5446,15 @@ process_property_notify (MetaWindow *window,
else if ((event->atom == window->display->atom__NET_WM_STRUT) ||
(event->atom == window->display->atom__NET_WM_STRUT_PARTIAL))
{
meta_verbose ("Property notify on %s for _NET_WM_STRUT\n", window->desc);
meta_window_update_struts (window);
}
else if (event->atom == window->display->atom__NET_STARTUP_ID)
{
meta_verbose ("Property notify on %s for _NET_STARTUP_ID\n", window->desc);
meta_window_reload_property (window,
window->display->atom__NET_STARTUP_ID);
}
else if (event->atom == window->display->atom__NET_WM_SYNC_REQUEST_COUNTER)
{
meta_verbose ("Property notify on %s for _NET_WM_SYNC_REQUEST_COUNTER\n", window->desc);
meta_window_reload_property (window,
window->display->atom__NET_WM_SYNC_REQUEST_COUNTER);
}
@ -5466,8 +5463,6 @@ process_property_notify (MetaWindow *window,
Window xid;
Atom atom__NET_WM_USER_TIME;
meta_verbose ("Property notify on %s for _NET_WM_USER_TIME\n", window->desc);
atom__NET_WM_USER_TIME = window->display->atom__NET_WM_USER_TIME;
if (window->user_time_window)
xid = window->user_time_window;

View File

@ -35,6 +35,9 @@ static void set_active_space_hint (MetaScreen *screen);
static void focus_ancestor_or_mru_window (MetaWorkspace *workspace,
MetaWindow *not_this_one,
guint32 timestamp);
static void free_this (gpointer candidate,
gpointer dummy);
static void workspace_free_struts (MetaWorkspace *workspace);
static void
maybe_add_to_list (MetaScreen *screen, MetaWindow *window, gpointer data)
@ -79,6 +82,29 @@ meta_workspace_new (MetaScreen *screen)
return workspace;
}
/** Foreach function for workspace_free_struts() */
static void
free_this (gpointer candidate, gpointer dummy)
{
g_free (candidate);
}
/**
* Frees the struts list of a workspace.
*
* \param workspace The workspace.
*/
static void
workspace_free_struts (MetaWorkspace *workspace)
{
if (workspace->all_struts == NULL)
return;
g_slist_foreach (workspace->all_struts, free_this, NULL);
g_slist_free (workspace->all_struts);
workspace->all_struts = NULL;
}
void
meta_workspace_free (MetaWorkspace *workspace)
{
@ -127,7 +153,7 @@ meta_workspace_free (MetaWorkspace *workspace)
if (!workspace->work_areas_invalid)
{
g_slist_free (workspace->all_struts);
workspace_free_struts (workspace);
for (i = 0; i < screen->n_xinerama_infos; i++)
meta_rectangle_free_list_and_elements (workspace->xinerama_region[i]);
g_free (workspace->xinerama_region);
@ -457,8 +483,7 @@ meta_workspace_invalidate_work_area (MetaWorkspace *workspace)
g_free (workspace->work_area_xinerama);
workspace->work_area_xinerama = NULL;
g_slist_free (workspace->all_struts);
workspace->all_struts = NULL;
workspace_free_struts (workspace);
for (i = 0; i < workspace->screen->n_xinerama_infos; i++)
meta_rectangle_free_list_and_elements (workspace->xinerama_region[i]);
@ -514,9 +539,12 @@ ensure_work_areas_validated (MetaWorkspace *workspace)
MetaWindow *win = tmp->data;
GSList *s_iter;
for (s_iter = win->struts; s_iter != NULL; s_iter = s_iter->next)
for (s_iter = win->struts; s_iter != NULL; s_iter = s_iter->next) {
MetaStrut *cpy = g_new (MetaStrut, 1);
*cpy = *((MetaStrut *)s_iter->data);
workspace->all_struts = g_slist_prepend (workspace->all_struts,
s_iter->data);
cpy);
}
}
g_list_free (windows);

View File

@ -1,6 +1,14 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* Metacity Workspaces */
/**
* \file workspace.h Workspaces
*
* A workspace is a set of windows which all live on the same
* screen. (You may also see the name "desktop" around the place,
* which is the EWMH's name for the same thing.) Only one workspace
* of a screen may be active at once; all windows on all other workspaces
* are unmapped.
*/
/*
* Copyright (C) 2001 Havoc Pennington