mirror of
https://github.com/brl/mutter.git
synced 2024-11-28 02:50:41 -05:00
47ce823aa5
2001-08-06 Havoc Pennington <hp@pobox.com> * src/window.c (meta_window_shade): draw animation for shading too
372 lines
15 KiB
Plaintext
372 lines
15 KiB
Plaintext
Metacity is not a meta-City as in an urban center, but rather
|
|
Meta-ness as in the state of being meta. i.e. metacity : meta as
|
|
opacity : opaque. Also it may have something to do with the Meta key
|
|
on UNIX keyboards.
|
|
|
|
The first release of Metacity is version 2.3. Metacity has no need for
|
|
your petty hangups about version numbers.
|
|
|
|
COMPILING METACITY
|
|
===
|
|
|
|
You need GTK+ 1.3.x (to become 2.0). At the moment CVS HEAD is
|
|
required. Once 1.3.7 is available that will probably work. Metacity is
|
|
a fairly trivial 6000-line C program, so once you get GTK+ built it
|
|
should be no problem to build Metacity.
|
|
|
|
REPORTING BUGS AND SUBMITTING PATCHES
|
|
===
|
|
|
|
Report new bugs to hp@redhat.com for now. Will switch to Bugzilla
|
|
sometime probably.
|
|
|
|
Feel free to send patches too; Metacity is really small and simple, so
|
|
if you find a bug or want to add a feature it should be pretty easy.
|
|
|
|
See the HACKING file for some notes on hacking Metacity.
|
|
|
|
METACITY FEATURES
|
|
===
|
|
|
|
- Boring window manager for the adult in you. Many window managers
|
|
are like Marshmallow Froot Loops; Metacity is like Cheerios.
|
|
|
|
- Uses GTK+ 2.0 for drawing window frames. This means colors, fonts,
|
|
etc. come from GTK+ theme.
|
|
|
|
- There are 6 workspaces.
|
|
|
|
- Global keybindings:
|
|
Alt-F1 to Alt-F6 switch workspaces
|
|
Alt-1 to Alt-6 switch workspaces
|
|
Alt-Tab forward cycle window focus
|
|
Alt-Shift-Tab backward cycle focus
|
|
Alt-Escape focus previous window
|
|
Alt-Left Arrow previous workspace
|
|
Alt-Right Arrow next workspace
|
|
|
|
- Window keybindings:
|
|
Alt-space window menu
|
|
|
|
Mnemonics work in the menu. That is, Alt-space then underlined
|
|
letter in the menu item works.
|
|
|
|
Choose Move from menu, and arrow keys to move the window.
|
|
|
|
While moving, hold down Control to move slower, and
|
|
Shift to snap to edges.
|
|
|
|
Choose Resize from menu, and nothing happens yet, but
|
|
eventually I might implement something.
|
|
|
|
- Window mouse bindings:
|
|
|
|
Clicking anywhere on frame with button 1 will raise/focus window
|
|
|
|
If you click a window control, such as the close button, then the
|
|
control will activate on button release if you are still over it
|
|
on release (as with most GUI toolkits)
|
|
|
|
If you click and drag borders with button 1 it resizes the window
|
|
|
|
If you click and drag the titlebar with button 1 it moves the
|
|
window.
|
|
|
|
If you click anywhere on the frame with button 2 it moves the window,
|
|
without raising it.
|
|
|
|
If you click anywhere on the frame with button 3 it shows the
|
|
window menu.
|
|
|
|
If you hold down Alt and click inside a window, it will move the
|
|
window (buttons 1 and 2) or show menu (button 3).
|
|
|
|
If you pick up a window with button 1 and then switch workspaces
|
|
the window will come with you to the new workspace, this is
|
|
a feature copied from Enlightenment.
|
|
|
|
If you hold down Shift while moving a window, the window snaps
|
|
to edges of other windows and the screen.
|
|
|
|
- Session management:
|
|
|
|
Metacity connects to the session manager and will set itself up to
|
|
be respawned. It theoretically restores sizes/positions/workspace
|
|
for session-aware applications.
|
|
|
|
- Here is an example of how you can configure the Metacity
|
|
window border appearance in ~/.gtkrc-2.0:
|
|
|
|
style "metacity-style"
|
|
{
|
|
font_name = "Sans 16"
|
|
MetaFrames::title_border = { 7, 7, 7, 7 }
|
|
MetaFrames::button_width = 25
|
|
bg[NORMAL] = { 0.0, 0.0, 0.0 }
|
|
}
|
|
|
|
class "MetaFrames" style "metacity-style"
|
|
|
|
You get the idea. It is just your basic GTK+ rc file, the
|
|
window borders are a widget called MetaFrames,
|
|
look in frames.c:meta_frames_class_init() for all the style
|
|
properties that you can configure.
|
|
|
|
Metacity-specific styles can also be included in any GTK+
|
|
theme.
|
|
|
|
- Metacity implements much of the new window manager spec from
|
|
freedesktop.org, and much of the ICCCM. But then there are
|
|
parts of each that it doesn't implement, just because I haven't
|
|
yet.
|
|
|
|
- Uses Pango to render text, so has cool i18n capabilities.
|
|
Supports UTF-8 window titles and such.
|
|
|
|
- There are simple animations for actions such as minimization,
|
|
to help users see what is happening. Should probably
|
|
have a few more of these.
|
|
|
|
METACITY BUGS, NON-FEATURES, AND CAVEATS
|
|
===
|
|
|
|
- Metacity creates a big file in your home directory called
|
|
~/metacity.log with a bunch of debug spew.
|
|
|
|
- If you want a number of workspaces which is not 6, you have to
|
|
edit screen.c and recompile.
|
|
|
|
- If you want keybindings which are not the ones mentioned above
|
|
as features, you have to edit keybindings.c and recompile.
|
|
|
|
- Metacity does not have any way to unminimize a window. So
|
|
clicking the minimize button is sort of a bad idea.
|
|
(If you had a WM-spec-compliant tasklist, it would work
|
|
for unminimization.)
|
|
|
|
- Metacity uses the new window manager spec, but only random bits of
|
|
the old GNOME spec. It correctly advertises exactly which parts of
|
|
the GNOME spec it supports, but it does not support enough of it to
|
|
make the GNOME task list and desk guide happy, and they do not
|
|
support the new spec. I don't want anyone to spend time sending me
|
|
patches to support the old GNOME spec in Metacity; instead, send
|
|
patches to the task list and desk guide to support the new spec. As
|
|
far as I know, Metacity does support enough of the new spec to
|
|
allow a working tasklist and pager.
|
|
|
|
Upshot: task list and desk guide DO NOT WORK with Metacity.
|
|
|
|
- Metacity turns off its keybindings for Emacs, because I use
|
|
Alt-space in Emacs, and getting a window menu annoys me.
|
|
This is a broken feature. My planned fix is to use super/hyper
|
|
instead of Alt as the main keybinding shortcut, if super/hyper
|
|
exist, and then keyboards with a windows key can use that for
|
|
WM functions and Alt for application shortcuts.
|
|
We'd fall back to Alt if no other suitable modifier existed.
|
|
|
|
- Cycling windows with Alt-Tab is flickery, AFAIK because
|
|
Metacity passes the entire window stack to XRestackWindows()
|
|
every time you restack. Instead it should probably only restack
|
|
windows that have changed their stacking with respect to one
|
|
another. (But sometimes I don't see the flicker, so
|
|
I'm not sure.)
|
|
|
|
- I haven't even read the ICCCM section about colormaps. So if you
|
|
have an 8-bit display you are basically screwed.
|
|
|
|
- Metacity doesn't properly claim the window manager selection
|
|
as described in the ICCCM. But then, most other window managers
|
|
don't handle this correctly either.
|
|
|
|
- There are probably other ICCCM-compliance issues.
|
|
|
|
- Window placement is always cascade for now; I want to implement
|
|
"first fit, falling back to cascade if no fit."
|
|
(Configurable placement algorithms are stupid though, don't
|
|
send me patches for any bogus ones. Let's just pick a good one.)
|
|
|
|
- Maximization and movement constraints do not take the
|
|
GNOME panel into account. Most of the code already handles
|
|
this (using workspace->workarea in workspace.h), but
|
|
workspace->workarea isn't ever actually calculated.
|
|
Metacity needs to keep this area up-to-date using the hints the
|
|
panel sets.
|
|
|
|
- Should support click-to-focus as an option.
|
|
|
|
- Windows has a neat way of implementing Alt-Tab for
|
|
window cycling that I would like to copy. (The little
|
|
popup window thing.)
|
|
|
|
- Should Metacity support flipping in right-to-left locales?
|
|
I don't know what window managers look like in a right-to-left
|
|
locale. I assume the window titles should be right-justified;
|
|
should the window controls also be flipped?
|
|
|
|
- Need keyboard shortcuts for hide/show desktop (minimize/unminimize
|
|
all windows temporarily, basically, and focus desktop); also
|
|
for focusing dock windows (though since current GNOME panel has
|
|
no useful keynav, this doesn't get you far at the moment).
|
|
|
|
- Resize menu item doesn't do anything. It's intended to enter
|
|
resize-with-the-keyboard mode, similar to Move menu item.
|
|
|
|
- I haven't set up the po subdir and translations, mostly because
|
|
autotools seem to get all confused if you set these up but
|
|
don't actually have any translations. So if someone translates
|
|
something we can set it up.
|
|
|
|
- If you switch from sawfish to metacity without restarting X,
|
|
the panel often ends up buried behind the Nautilus desktop window.
|
|
|
|
What happens is that the panel detects Sawfish has gone away, and
|
|
turns on override redirect mode because no GNOME-aware WM is
|
|
running (i.e. it goes into "ignore the window manager" mode). But
|
|
the panel doesn't notice that Metacity has appeared and is
|
|
(partially) GNOME-compliant. So Metacity doesn't see the override
|
|
redirect panel, and leaves it behind the Nautilus desktop. I'm not
|
|
sure whether Metacity or the panel is to blame for this.
|
|
|
|
(To debug - use "xwininfo" on the panel, if override redirect is
|
|
"Yes" then Metacity won't have any awareness of a window and can't
|
|
properly stack it above the desktop. If override redirect is "No"
|
|
then Metacity can see the panel and handle it properly. Look at
|
|
xstuff.c:xstuff_is_compliant_wm() in the panel to get started on
|
|
how the panel deals with this.)
|
|
|
|
- If you have "put panel below other windows" turned on
|
|
in panel Global Preferences, Miscellaneous tab, you need to change
|
|
this to "Put panel on top of other windows." That's because
|
|
Metacity uses semantic categories, not the legacy layer system
|
|
in the GNOME spec. It treats things in the legacy "dock" layer
|
|
as semantic type dock, but if you have the panel set to be
|
|
in another layer, Metacity will think it's a normal window.
|
|
|
|
You can diagnose this problem because Metacity will put panels in
|
|
the wrong place, and Alt+rightclick will let you perform operations
|
|
like minimize/maximize, and Alt+leftclick will let you move the panel.
|
|
If Metacity has detected that the panel is a panel, then none of
|
|
this will be enabled.
|
|
|
|
I put a patch in the CVS version of the panel to fix this by
|
|
setting the new non-legacy type hint, but a panel with that
|
|
patch hasn't been released yet.
|
|
|
|
FAQ
|
|
===
|
|
|
|
Q: Will you add my feature?
|
|
|
|
A: If it makes sense to turn on unconditionally,
|
|
or is genuinely a harmless preference that I would not
|
|
be embarrassed to put in a simple, uncluttered, user-friendly
|
|
configuration dialog.
|
|
|
|
If the only rationale for your feature is that other window
|
|
managers have it, or that you are personally used to it, or something
|
|
like that, then I will not be impressed. Metacity is firmly in the
|
|
"choose good defaults" camp rather than the "offer 6 equally broken
|
|
ways to do it, and let the user pick one" camp.
|
|
|
|
This is part of a "no crackrock" policy, despite some exceptions
|
|
I'm mildly embarrassed about. For example, multiple workspaces
|
|
probably constitute crackrock, they confuse most users
|
|
and really are not that useful if you have a decent tasklist and
|
|
so on. But I am too used to them to turn them off.
|
|
Sloppy focus is probably crackrock too. Oh, and my Alt-1 thru Alt-6
|
|
keybindings are definitely on crack.
|
|
|
|
But don't think unlimited crack is OK just because I slipped up a
|
|
little. No slippery slope here.
|
|
|
|
Don't let this discourage patches and fixes - I love those. ;-)
|
|
Just be prepared to hear the above objections if your patch
|
|
adds some crack-ridden configuration option.
|
|
|
|
Q: How do I add a configuration option?
|
|
|
|
A: You don't, until GConf 2 is relatively easy to compile and I feel
|
|
like adding it as a dependency.
|
|
|
|
Q: Will Metacity be part of GNOME?
|
|
|
|
A: This is not the current plan, though of course I'm happy to see the
|
|
code used by anyone who's interested. Metacity may continue to suck
|
|
forever because I might get tired of working on it; or Metacity's
|
|
feature set might not make sense for GNOME. Who knows.
|
|
|
|
For now Metacity is my toy hobby project that I work on when I feel
|
|
like it.
|
|
|
|
Q: Is Metacity a Red Hat project?
|
|
|
|
A: Metacity is in no way funded, endorsed, or encouraged by Red Hat,
|
|
Inc. - I'm guessing Red Hat would not consider "insufficient number
|
|
of window managers for Linux" an urgent problem. Just a wild guess
|
|
though.
|
|
|
|
Q: Why can't I move XMMS?
|
|
|
|
A: Because XMMS is broken and is trying to move itself. Metacity
|
|
does not tolerate insolent windows who believe they can
|
|
self-manage. Use Alt-button1 to move XMMS using Metacity.
|
|
|
|
Q: Why does Metacity remember the workspace/position of some apps
|
|
but not others?
|
|
|
|
A: Metacity only stores sizes/positions for apps that are session
|
|
managed. As far as I can determine, there is no way to attempt
|
|
to remember workspace/position for non-session-aware apps without
|
|
causing a lot of weird effects.
|
|
|
|
The reason is that you don't know which non-SM-aware apps were
|
|
launched by the session. When you initially log in, Metacity sees a
|
|
bunch of new windows appear. But it can't distinguish between
|
|
windows that were stored in your session, or windows you just
|
|
launched after logging in. If Metacity tried to guess that a window
|
|
was from the session, it could e.g. end up maximizing a dialog, or
|
|
put a window you just launched on another desktop or in a weird
|
|
place. And in fact I see a lot of bugs like this in window managers
|
|
that try to handle non-session-aware apps.
|
|
|
|
However, for session-aware apps, Metacity can tell that the
|
|
application instance is from the session and thus restore it
|
|
reliably, assuming the app properly restores the windows it had
|
|
open on session save.
|
|
|
|
So the correct way to fix the situation is to make apps
|
|
session-aware. libSM has come with X for years, it's very
|
|
standardized, it's shared by GNOME and KDE - even twm is
|
|
session-aware. So anyone who won't take a patch to add SM is more
|
|
archaic than twm - and you should flame them. ;-)
|
|
|
|
Docs on session management:
|
|
ftp://ftp.x.org/pub/R6.4/xc/doc/hardcopy/SM/xsmp.PS.gz
|
|
ftp://ftp.x.org:21/pub/R6.4/xc/doc/hardcopy/SM/SMlib.PS.gz
|
|
|
|
See also the ICCCM section on SM. For GNOME apps, use the
|
|
GnomeClient object. For a simple example of using libSM directly,
|
|
twm/session.c in the twm source code is pretty easy to understand.
|
|
|
|
Q: How about adding viewports in addition to workspaces?
|
|
|
|
A: I could conceivably be convinced to use viewports _instead_ of
|
|
workspaces, though currently I'm not thinking that. But I don't
|
|
think it makes any sense to have both; it's just confusing. They
|
|
are functionally equivalent.
|
|
|
|
Q: Did you spend a lot of time on this?
|
|
|
|
A: Metacity is about 6000 lines of code, which took a few weekends and
|
|
evenings to write. If it ever becomes more polished it will
|
|
probably grow 2-3 more thousand lines of code and suck a few more
|
|
weekends of time. If I started adding all kinds of features and
|
|
crack-ridden configuration options, it might take more time than that.
|
|
|
|
Q: How can you claim that you are anti-crack, while still
|
|
writing a window manager?
|
|
|
|
A: I have no comment on that.
|
|
|
|
|