472 lines
19 KiB
Plaintext
472 lines
19 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 was version 2.3. Metacity has no need for
|
|
your petty hangups about version numbers.
|
|
|
|
The stable releases so far are 2.4.x, 2.6.x, 2.8.x
|
|
|
|
Unstable branches are 2.3.x, 2.5.x
|
|
|
|
COMPILING METACITY
|
|
===
|
|
|
|
You need GTK+ 2.2. For startup notification to work you need
|
|
libstartup-notification at
|
|
http://www.freedesktop.org/software/startup-notification/ or on the
|
|
GNOME ftp site. You also need GConf 1.2 (unless building a funky
|
|
extra-small embedded metacity with --disable-gconf, see below).
|
|
|
|
REPORTING BUGS AND SUBMITTING PATCHES
|
|
===
|
|
|
|
Report new bugs on http://bugzilla.gnome.org. Please check for
|
|
duplicates, *especially* if you are reporting a feature request.
|
|
|
|
Please do *not* add "me too!" or "yes I really want this!" comments to
|
|
feature requests in bugzilla. Please read
|
|
http://pobox.com/~hp/features.html prior to adding any kind of flame
|
|
about missing features or misfeatures.
|
|
|
|
Feel free to send patches too; Metacity is relatively small and
|
|
simple, so if you find a bug or want to add a feature it should be
|
|
pretty easy. Send me mail, or put the patch in bugzilla.
|
|
|
|
See the HACKING file for some notes on hacking Metacity.
|
|
|
|
SHRINKING METACITY
|
|
===
|
|
|
|
Not that metacity is huge, but a substantial amount of code is in
|
|
preferences handling, in static strings that aren't essential, and in
|
|
the theme engine.
|
|
|
|
You can strip about 70K from the metacity binary by compiling with
|
|
options such as:
|
|
|
|
--disable-gconf
|
|
--disable-sm
|
|
--disable-verbose
|
|
--disable-startup-notification
|
|
|
|
However the result is no good for desktop use, all prefs have to be
|
|
hardcoded in the binary, for example. If you wanted to make a really
|
|
small metacity, here's some additional stuff you might consider
|
|
implementing:
|
|
|
|
- add --disable-themes, which would replace theme.c and theme-parser.c
|
|
with a hardcoded implementation of the interface in theme.h,
|
|
should save about 80K. This should be fairly easy.
|
|
|
|
- add --disable-gtk, which would implement the interface in ui.h
|
|
without using GTK. This one is easier than you think because the
|
|
main part of the window manager doesn't use GTK directly, but is
|
|
still fairly hard to do. You would probably have to give up some
|
|
of the features, such as window menus, as menus are pretty complex
|
|
to implement well. So time may be better spent adding a GTK
|
|
configure script feature to build GTK with only a small core set of
|
|
functionality.
|
|
|
|
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.
|
|
|
|
- Does not expose the concept of "window manager" to the user. Some
|
|
of the features in the GNOME control panel and other parts of the
|
|
desktop happen to be implemented in metacity, such as changing your
|
|
window border theme, or changing your window navigation shortcuts,
|
|
but the user doesn't need to know this.
|
|
|
|
- Includes only the window manager; does not try to be a desktop
|
|
environment. The pager, configuration, etc. are all separate and
|
|
modular. The "libwnck" library (which I also wrote) is available
|
|
for writing metacity extensions, pagers, and so on. (But libwnck
|
|
isn't metacity specific, or GNOME-dependent; it requires only GTK,
|
|
and should work with KWin, fvwm2, and other EWMH-compliant WMs.)
|
|
|
|
- Has a simple theme system and a couple of extra themes come with it.
|
|
Change themes via gconf-editor or gconftool or GNOME themes control
|
|
panel:
|
|
gconftool-2 --type=string --set /apps/metacity/general/theme Crux
|
|
gconftool-2 --type=string --set /apps/metacity/general/theme Gorilla
|
|
gconftool-2 --type=string --set /apps/metacity/general/theme Atlanta
|
|
gconftool-2 --type=string --set /apps/metacity/general/theme Bright
|
|
|
|
See theme-format.txt for docs on the theme format. Use
|
|
metacity-theme-viewer to preview themes.
|
|
|
|
- Change number of workspaces via gconf-editor or gconftool:
|
|
gconftool-2 --type=int --set /apps/metacity/general/num_workspaces 5
|
|
|
|
Can also change workspaces from GNOME 2 pager.
|
|
|
|
- Change focus mode:
|
|
gconftool-2 --type=string --set /apps/metacity/general/focus_mode mouse
|
|
gconftool-2 --type=string --set /apps/metacity/general/focus_mode sloppy
|
|
gconftool-2 --type=string --set /apps/metacity/general/focus_mode click
|
|
|
|
- Global keybinding defaults include:
|
|
|
|
Alt-Tab forward cycle window focus
|
|
Alt-Shift-Tab backward cycle focus
|
|
Alt-Ctrl-Tab forward cycle focus among panels
|
|
Alt-Ctrl-Shift-Tab backward cycle focus among panels
|
|
Alt-Escape cycle window focus without a popup thingy
|
|
Ctrl-Alt-Left Arrow previous workspace
|
|
Ctrl-Alt-Right Arrow next workspace
|
|
Ctrl-Alt-D minimize/unminimize all, to show desktop
|
|
|
|
Change keybindings for example:
|
|
|
|
unst gconftool-2 --type=string --set /apps/metacity/global_keybindings/switch_to_workspace_1 '<Alt>F1'
|
|
|
|
Also try the GNOME keyboard shortcuts control panel, or
|
|
gconf-editor.
|
|
|
|
See metacity.schemas for all available bindings.
|
|
|
|
- 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.
|
|
|
|
Keybindings for things like maximize window, vertical maximize,
|
|
etc. can be bound, but may not all exist by default. See
|
|
metacity.schemas.
|
|
|
|
- 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 lowers the
|
|
window.
|
|
|
|
If you click anywhere on the frame with button 3 it shows the
|
|
window menu.
|
|
|
|
If you hold down Super (windows key) and click inside a window, it
|
|
will move the window (buttons 1 and 2) or show menu (button 3).
|
|
Or you can configure a different modifier for this.
|
|
|
|
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.
|
|
|
|
- Metacity implements much of the EWMH window manager specification
|
|
from freedesktop.org, as well as the older ICCCM. Please refer to
|
|
the COMPLIANCE file for information on metacity compliance with
|
|
these standards.
|
|
|
|
- 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 and make them nicer.
|
|
|
|
- if you have the proper X setup, set the GDK_USE_XFT=1
|
|
environment variable to get antialiased window titles.
|
|
|
|
- considers the panel when placing windows and maximizing
|
|
them.
|
|
|
|
- handles the window manager selection from the ICCCM. Will exit if
|
|
another WM claims it, and can claim it from another WM if you pass
|
|
the --replace argument. So if you're running another
|
|
ICCCM-compliant WM, you can run "metacity --replace" to replace it
|
|
with Metacity.
|
|
|
|
- does basic colormap handling
|
|
|
|
- and much more! well, maybe not a lot more.
|
|
|
|
HOW TO ADD EXTERNAL FEATURES
|
|
===
|
|
|
|
You can write a metacity "plugin" such as a pager, window list, icon
|
|
box, task menu, or even things like "window matching" using the
|
|
Extended Window Manager Hints. See http://www.freedesktop.org for the
|
|
EWMH specification. An easy-to-use library called "libwnck" is
|
|
available that uses the EWMH and is specifically designed for writing
|
|
WM accessories.
|
|
|
|
You might be interested in existing accessories such as "Devil's Pie"
|
|
by Ross Burton, which add features to Metacity (or other
|
|
EWMH-compliant WMs).
|
|
|
|
METACITY BUGS, NON-FEATURES, AND CAVEATS
|
|
===
|
|
|
|
See bugzilla: http://bugzilla.gnome.org/query.cgi
|
|
|
|
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. Or alternatively
|
|
iconification/tasklist is crack, and workspaces/pager are good. But
|
|
having both is certainly a bit wrong. Sloppy focus is probably
|
|
crackrock too.
|
|
|
|
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.
|
|
|
|
http://pobox.com/~hp/free-software-ui.html
|
|
http://pobox.com/~hp/features.html
|
|
|
|
Q: Will Metacity be part of GNOME?
|
|
|
|
A: It is officially part of GNOME as of GNOME 2.2. Prior to that,
|
|
it was unofficially shipped as the default GNOME WM by several
|
|
OS vendors.
|
|
|
|
Q: Is Metacity a Red Hat project?
|
|
|
|
A: Metacity's original creation was 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.
|
|
|
|
Now that metacity is the default WM however, Red Hat supports some
|
|
bugfixing and other work.
|
|
|
|
Q: Why does Metacity remember the workspace/position of some apps
|
|
but not others across logout/login?
|
|
|
|
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.
|
|
|
|
You may think this means that you won't have certain keybindings,
|
|
or something like that. This is a misconception. The only
|
|
_fundamental_ difference between viewports and workspaces is that
|
|
with viewports, windows can "overlap" and appear partially on
|
|
one and partially on another. All other differences that
|
|
traditionally exist in other window managers are accidental -
|
|
the features commonly associated with viewports can be implemented
|
|
for workspaces, and vice versa.
|
|
|
|
So I don't want to have two kinds of
|
|
workspace/desktop/viewport/whatever, but I'm willing to add
|
|
features traditionally associated with either kind if those
|
|
features make sense.
|
|
|
|
Q: Why is the panel always on top?
|
|
|
|
A: Because it's a better user interface, and until we made this not
|
|
configurable a bunch of apps were not getting fixed (the app
|
|
authors were just saying "put your panel on the bottom" instead of
|
|
properly supporting fullscreen mode, and such).
|
|
|
|
rationales.txt has the bugzilla URL for some flamefesting on this,
|
|
if you want to go back and relive the glory.
|
|
Read these and the bugzilla stuff before asking/commenting:
|
|
http://pobox.com/~hp/free-software-ui.html
|
|
http://pobox.com/~hp/features.html
|
|
|
|
Q: Why is there no edge flipping?
|
|
|
|
A: This one is also in rationales.txt. Because "ouija board" UI, where
|
|
you just move the mouse around and the computer guesses what you
|
|
mean, has a lot of issues. This includes mouse focus, shade-hover
|
|
mode, edge flipping, autoraise, etc. Metacity has mouse focus and
|
|
autoraise as a compromise, but these features are all confusing for
|
|
many users, and cause problems with accessibility, fitt's law, and
|
|
so on.
|
|
|
|
Read these and the bugzilla stuff before asking/commenting:
|
|
http://pobox.com/~hp/free-software-ui.html
|
|
http://pobox.com/~hp/features.html
|
|
|
|
Q: Why does wireframe move/resize suck?
|
|
|
|
A: You can turn it on with the reduced_resources setting.
|
|
|
|
But: it has low usability, and is a pain
|
|
to implement, and there's no reason opaque move/resize should be a
|
|
problem on any setup that can run a modern desktop worth a darn to
|
|
begin with.
|
|
|
|
Read these and the bugzilla stuff before asking/commenting:
|
|
http://pobox.com/~hp/free-software-ui.html
|
|
http://pobox.com/~hp/features.html
|
|
|
|
The reason we had to add wireframe anyway was broken
|
|
proprietary apps that can't handle lots of resize events.
|
|
|
|
Q: Why no XYZ?
|
|
|
|
A: You are probably getting the idea by now - check rationales.txt,
|
|
query/search bugzilla, and read http://pobox.com/~hp/features.html
|
|
and http://pobox.com/~hp/free-software-ui.html
|
|
|
|
Then sit down and answer the question for yourself. Is the feature
|
|
good? What's the rationale for it? Answer "why" not just "why not."
|
|
Justify in terms of users as a whole, not just users like
|
|
yourself. How else can you solve the same problem? etc. If that
|
|
leads you to a strong opinion, then please, post the rationale for
|
|
discussion to an appropriate bugzilla bug, or to
|
|
usability@gnome.org.
|
|
|
|
Please don't just "me too!" on bugzilla bugs, please don't think
|
|
flames will get you anywhere, and please don't repeat rationale
|
|
that's already been offered.
|
|
|
|
Q: Your dumb web pages you made me read talk about solving problems in
|
|
fundamental ways instead of adding preferences or workarounds.
|
|
What are some examples where metacity has done this?
|
|
|
|
A: There are quite a few, though many opportunities remain. Sometimes
|
|
the real fix involves application changes. The metacity approach is
|
|
that it's OK to require apps to change, though there are also
|
|
plenty of workarounds in metacity for battles considered too hard
|
|
to fight.
|
|
|
|
Here are some examples:
|
|
|
|
- fullscreen mode was introduced to allow position constraints,
|
|
panel-on-top, and other such things to apply to normal windows
|
|
while still allowing video players etc. to "just work"
|
|
|
|
- "whether to include minimized windows in Alt+Tab" was solved
|
|
by putting minimized windows at the *end* of the tab order.
|
|
|
|
- Whether to pop up a feedback display during Alt+Tab was solved by
|
|
having both Alt+Tab and Alt+Esc
|
|
|
|
- Whether to have a "kill" feature was solved by automatically
|
|
detecting and offering to kill stuck apps. Better, metacity
|
|
actually does "kill -9" on the process, it doesn't just
|
|
disconnect the process from the X server. You'll appreciate this
|
|
if you ever did a "kill" on Netscape 4, and watched it keep
|
|
eating 100% CPU even though the X server had booted it.
|
|
|
|
- The workspaces vs. viewports mess was avoided by adding
|
|
directional navigation and such to workspaces, see discussion
|
|
earlier in this file.
|
|
|
|
- Instead of configurable placement algorithms, there's just one
|
|
that works fairly well most of the time.
|
|
|
|
- To avoid excess CPU use during opaque move/resize, we rate limit
|
|
the updates to the application window's size.
|
|
|
|
- Instead of configurable "show size of window while resizing,"
|
|
it's only shown for windows where it matters, such as terminals.
|
|
(Only use-case given for all windows is for web designers
|
|
choosing their web browser size, but there are web sites and
|
|
desktop backgrounds that do this for you.)
|
|
|
|
- Using startup notification, applications open on the workspace
|
|
where you launched them, not the active workspace when their
|
|
window is opened.
|
|
|
|
- and much more.
|
|
|
|
Q: I think metacity sucks.
|
|
|
|
A: Feel free to use any WM you like. The reason metacity follows the
|
|
ICCCM and EWMH specifications is that it makes metacity a modular,
|
|
interchangeable part in the desktop. libwnck-based apps such as the
|
|
GNOME window list will work just fine with any EWMH-compliant WM.
|
|
|
|
Q: Did you spend a lot of time on this?
|
|
|
|
A: Originally the answer was no. Sadly the answer is now yes.
|
|
|
|
Q: How can you claim that you are anti-crack, while still
|
|
writing a window manager?
|
|
|
|
A: I have no comment on that.
|