Compare commits
171 Commits
METACITY_2
...
METACITY_2
Author | SHA1 | Date | |
---|---|---|---|
![]() |
249c105d01 | ||
![]() |
a7116f94a6 | ||
![]() |
0aa903f0d4 | ||
![]() |
a0b192aa5e | ||
![]() |
459c6668fb | ||
![]() |
d11681e505 | ||
![]() |
114c7c0be5 | ||
![]() |
10c6e1de17 | ||
![]() |
0bde8fe275 | ||
![]() |
2b2b70e80e | ||
![]() |
6679c6cd9c | ||
![]() |
7aab9f97d9 | ||
![]() |
9057b7112e | ||
![]() |
959a997eba | ||
![]() |
84312194e8 | ||
![]() |
58b323e4cc | ||
![]() |
c39fb62e1d | ||
![]() |
e25ed00bfb | ||
![]() |
de5588c10e | ||
![]() |
03adcdac31 | ||
![]() |
36b0b6d4d5 | ||
![]() |
bb1783b999 | ||
![]() |
05928106c5 | ||
![]() |
3489defbe8 | ||
![]() |
490fe640ab | ||
![]() |
017aa0dfd5 | ||
![]() |
7961c987a7 | ||
![]() |
77854b808a | ||
![]() |
e2eb979ecd | ||
![]() |
51bbd0e1a8 | ||
![]() |
595c86f427 | ||
![]() |
a7c2bacd64 | ||
![]() |
dab5dc2c70 | ||
![]() |
5d8da70f33 | ||
![]() |
2f0f36eea0 | ||
![]() |
4e3243b122 | ||
![]() |
a1caa2ae9e | ||
![]() |
194eee175d | ||
![]() |
2aae99381f | ||
![]() |
aa2da7d82e | ||
![]() |
9221a550db | ||
![]() |
c66adff00d | ||
![]() |
7d0ef20a9c | ||
![]() |
cabf4fc359 | ||
![]() |
5389f135ce | ||
![]() |
1e580d1e52 | ||
![]() |
d93d26aaeb | ||
![]() |
0a95c706bf | ||
![]() |
b0d15aa44f | ||
![]() |
5fe06b5fff | ||
![]() |
fa5bc6ff51 | ||
![]() |
893309b372 | ||
![]() |
cf102c12f4 | ||
![]() |
ebaa77c312 | ||
![]() |
bb03725397 | ||
![]() |
49479d9b67 | ||
![]() |
ea4d4b7b3e | ||
![]() |
f388d1111f | ||
![]() |
f5984f4365 | ||
![]() |
a8347dfd2f | ||
![]() |
f31c57a049 | ||
![]() |
3afcb9c963 | ||
![]() |
640d793ce4 | ||
![]() |
b5529bc5e8 | ||
![]() |
2dcaa941b4 | ||
![]() |
145d134095 | ||
![]() |
1a5d738e68 | ||
![]() |
2d0d5e8cac | ||
![]() |
814cc4b698 | ||
![]() |
6630963a1d | ||
![]() |
667796d53b | ||
![]() |
686ce45a7b | ||
![]() |
11dc788fbe | ||
![]() |
a1cdbf6d03 | ||
![]() |
46ededed08 | ||
![]() |
47221dcce2 | ||
![]() |
48a6dd603a | ||
![]() |
89dd94bf1e | ||
![]() |
b8c8000b44 | ||
![]() |
00f7c002ba | ||
![]() |
7dce1a4b6f | ||
![]() |
2e465de233 | ||
![]() |
1830a35000 | ||
![]() |
d9e622b375 | ||
![]() |
7d747092a6 | ||
![]() |
be29c69653 | ||
![]() |
c0924402d4 | ||
![]() |
7549d1511a | ||
![]() |
7c8faf3eda | ||
![]() |
68b14b6b9a | ||
![]() |
9382d5810f | ||
![]() |
890ffe18f2 | ||
![]() |
78e54ee7ee | ||
![]() |
4e636d0951 | ||
![]() |
c74ab35c6c | ||
![]() |
0bf6bffb16 | ||
![]() |
1ce080d733 | ||
![]() |
aab8f21475 | ||
![]() |
ce8c2d9463 | ||
![]() |
d5a484479f | ||
![]() |
892cb8a8dd | ||
![]() |
e46fc46701 | ||
![]() |
f4f8699d84 | ||
![]() |
85d4c396d0 | ||
![]() |
575bbe7342 | ||
![]() |
80ced567d3 | ||
![]() |
dbbe2854fe | ||
![]() |
cf74d02ef0 | ||
![]() |
548638f0fc | ||
![]() |
cda3904b93 | ||
![]() |
e7deeb609d | ||
![]() |
d178f5e330 | ||
![]() |
d8d77bd65b | ||
![]() |
c3a607f999 | ||
![]() |
1e8fd966b7 | ||
![]() |
c654b7c502 | ||
![]() |
8235fa831f | ||
![]() |
d9f4f54b7d | ||
![]() |
28b7e937d1 | ||
![]() |
86ba6115d4 | ||
![]() |
d34fe419b7 | ||
![]() |
60789cdec4 | ||
![]() |
73d9932081 | ||
![]() |
3942bebc1e | ||
![]() |
bae7135b48 | ||
![]() |
bc9e517842 | ||
![]() |
f3743bc494 | ||
![]() |
122d6ddd35 | ||
![]() |
f45682efbd | ||
![]() |
4d936588af | ||
![]() |
bb02f83bc8 | ||
![]() |
2a5689911f | ||
![]() |
8b26849517 | ||
![]() |
6d77251c71 | ||
![]() |
ccd4414a0f | ||
![]() |
adc578e32d | ||
![]() |
c397af4896 | ||
![]() |
e84778d1eb | ||
![]() |
e6fe440612 | ||
![]() |
3c974b87b4 | ||
![]() |
b6679a65f2 | ||
![]() |
e1df22ae31 | ||
![]() |
65c7332618 | ||
![]() |
0ff5eea9d1 | ||
![]() |
05388194fc | ||
![]() |
b03558dc4d | ||
![]() |
278b5807f1 | ||
![]() |
13e0c20ab0 | ||
![]() |
81fe64991c | ||
![]() |
79b4de04fc | ||
![]() |
714fb3d539 | ||
![]() |
70e40c235c | ||
![]() |
e8877141b7 | ||
![]() |
546fe7b5b3 | ||
![]() |
16b9aff47c | ||
![]() |
7d4c302598 | ||
![]() |
5db3108815 | ||
![]() |
7b1e571919 | ||
![]() |
3b9ec3ce50 | ||
![]() |
aa63e0884d | ||
![]() |
7ee43e5a36 | ||
![]() |
43cc3b8606 | ||
![]() |
9d9c744490 | ||
![]() |
63e1624bd7 | ||
![]() |
cffe7e9566 | ||
![]() |
b8b647e346 | ||
![]() |
101a097f02 | ||
![]() |
5ac6fcad73 | ||
![]() |
a880f5d401 | ||
![]() |
4b9fe2cae7 | ||
![]() |
c188ae0954 |
286
HACKING
286
HACKING
@@ -1,109 +1,237 @@
|
||||
Making a release
|
||||
===
|
||||
Intro...
|
||||
|
||||
To make a release of metacity, do the following:
|
||||
Window managers have a few ways in which they are significantly different
|
||||
from other applications. This file, combined with the code overview in
|
||||
doc/code-overview.txt, should hopefully provide a series of relatively
|
||||
quick pointers (hopefully only a few minutes each) to some of the places
|
||||
one can look to orient themselves and get started. Some of this will be
|
||||
general to window managers on X, much will be specific to Metacity, and
|
||||
there's probably some information that's common to programs in general but
|
||||
is nonetheless useful.
|
||||
|
||||
- check out a fresh copy from CVS
|
||||
Overview
|
||||
Administrative issues
|
||||
Relevant standards and X properties
|
||||
Debugging and testing
|
||||
Debugging logs
|
||||
Adding information to the log
|
||||
Valgrind
|
||||
Testing Utilities
|
||||
Technical gotchas to keep in mind
|
||||
Other important reading
|
||||
Extra reading
|
||||
Ideas for tasks to work on
|
||||
|
||||
- increment the version number in configure.in,
|
||||
see the comment above the version for the next fibonacci number
|
||||
|
||||
- update the file NEWS based on the ChangeLog
|
||||
Administrative issues
|
||||
Don't commit substantive code in here without asking hp@redhat.com.
|
||||
Adding translations, no-brainer typo fixes, etc. is fine.
|
||||
|
||||
- add a ChangeLog entry containing the version number
|
||||
you're releasing ("Released 2.5.4" or something)
|
||||
so people can see which changes were before and after
|
||||
a given release.
|
||||
The code could use cleanup in a lot of places, feel free to do so.
|
||||
|
||||
- "make distcheck" (DO NOT just "make dist" - pass the check!)
|
||||
See http://developer.gnome.org/dotplan/for_maintainers.html for
|
||||
information on how to make a release. The only difference from those
|
||||
instructions is that the minor version number of a Metacity release
|
||||
should always be a number from the Fibonacci sequence.
|
||||
|
||||
- if make distcheck fails, fix it.
|
||||
Relevant standards and X properties
|
||||
There are two documents that describe some basics about how window
|
||||
managers should behave: the ICCCM (Inter-Client Communication Conventions
|
||||
Manual) and EWMH (Extended Window Manager Hints). You can find these at
|
||||
the following locations:
|
||||
ICCCM - http://tronche.com/gui/x/icccm/
|
||||
EWMH - :pserver:anoncvs@pdx.freedesktop.org:/cvs
|
||||
The ICCCM is usually available in RPM or DEB format as well. There is
|
||||
actually an online version of the EWMH, but it is almost always woefully
|
||||
out of date. Just get it from cvs with these commands (the backslash
|
||||
means include the stuff from the next line):
|
||||
cvs -d :pserver:anoncvs@cvs.freedesktop.org:/cvs/icccm-extensions login
|
||||
cvs -d :pserver:anoncvs@cvs.freedesktop.org:/cvs/icccm-extensions \
|
||||
checkout wm-spec
|
||||
|
||||
- once distcheck succeeds, "cvs commit"
|
||||
DO NOT GO AND READ THOSE THINGS. THEY ARE REALLY, REALLY BORING.
|
||||
|
||||
- if someone else made changes and the commit fails,
|
||||
you have to "cvs up" and run "make distcheck" again
|
||||
If you do, you'll probably end up catching up on your sleep instead of
|
||||
hacking on Metacity. ;-) Instead, just look at the table of contents and
|
||||
glance at a page or two to get an idea of what's in there. Then only
|
||||
refer to it if you see something weird in the code and you don't know
|
||||
what it is but has some funny looking name like you see in one of those
|
||||
two documents.
|
||||
|
||||
- once the commit succeeds, WITHOUT cvs updating, "cvs tag
|
||||
METACITY_X_Y_Z" where
|
||||
X_Y_Z map to version X.Y.Z
|
||||
You can refer to the COMPLIANCE file for additional information on these
|
||||
specifications and Metacity's compliance therewith.
|
||||
|
||||
- scp the tarball to master.gnome.org
|
||||
One of the major things those documents cover that are useful to learn
|
||||
about immediately are X properties. The right way to learn about those,
|
||||
though, is through hand on experimentation with the xprop command (and
|
||||
then look up things you find from xprop in those two manuals if you're
|
||||
curious enough). First, try running
|
||||
xprop
|
||||
in a terminal and click on one of the windows on your screen. That gives
|
||||
you the x properties for that window. Look through them and get a basic
|
||||
idea of what's there for kicks. Next, try running
|
||||
xprop -root
|
||||
in a terminal. There's all the properties of the root window (which you
|
||||
can think of as the "main" window). You can also manually specify
|
||||
individual windows that you want the properties of with
|
||||
xprop -id <id>
|
||||
if you know the id of the window in question (you can get this from the
|
||||
_NET_CLIENT_STACKING property of the root window). Finally, it can also
|
||||
be useful to add "-spy" (without the quotes) to the xprop command to get
|
||||
it to continually monitor that window and report any changes to you.
|
||||
|
||||
- run install-module on master.gnome.org to install the tarball
|
||||
on the ftp site
|
||||
Debugging information
|
||||
Trying to run a window manager under a typical debugger, such as gdb,
|
||||
unfortunately just doesn't work very well. So, we have to resort to
|
||||
other methods.
|
||||
|
||||
Misc stuff
|
||||
===
|
||||
Debugging logs
|
||||
|
||||
Don't commit substantive code in here without asking me,
|
||||
hp@redhat.com. Adding translations, no-brainer typo fixes, etc. is
|
||||
fine.
|
||||
First, note that you can start a new version of metacity to replace the
|
||||
existing one by running
|
||||
metacity --replace
|
||||
(which also comes in handy in the form "./src/metacity --replace" when
|
||||
trying to quickly test a small change while hacking on metacity without
|
||||
doing a full "make install", though I'm going off topic...) This will
|
||||
allow you to see any warnings printed at the terminal. Sometimes it's
|
||||
useful to have these directed to a logfile instead, which you can do by
|
||||
running
|
||||
METACITY_USE_LOGFILE=1 metacity --replace
|
||||
The logfile it uses will be printed in the terminal. Sometimes, it's
|
||||
useful to get more information than just warnings. You can set
|
||||
METACITY_VERBOSE to do that, like so:
|
||||
METACITY_VERBOSE=1 METACITY_USE_LOGFILE=1 metacity --replace
|
||||
There are also other flags, such as METACITY_DEBUG, most of which I
|
||||
haven't tried and don't know what they do. Go to the source code
|
||||
directory and run
|
||||
grep "METACITY_" * | grep getenv
|
||||
to find out what the other ones are.
|
||||
|
||||
The script src/run-metacity.sh is useful to hack on the window manager.
|
||||
It runs metacity in an Xnest. e.g.:
|
||||
CLIENTS=3 ./run-metacity.sh
|
||||
or
|
||||
DEBUG=memprof ./run-metacity.sh
|
||||
or
|
||||
DEBUG_TEST=1 ./run-metacity-sh
|
||||
or whatever.
|
||||
Adding information to the log
|
||||
|
||||
The tool metacity-message can be used as follows:
|
||||
metacity-message reload-theme
|
||||
metacity-message restart
|
||||
metacity-message enable-keybindings
|
||||
metacity-message disable-keybindings
|
||||
Since we can't single step with a debugger, we often have to fall back to
|
||||
the primitive method of getting information we want to know: adding
|
||||
"print" statements. Metacity has a fairly structured way to do this,
|
||||
using the functions meta_warning, meta_topic, and meta_verbose. All
|
||||
three have the same basic format as printf, except that meta_topic also
|
||||
takes a leading enumeration parameter to specify the type of message
|
||||
being shown (makes it easier for grepping in a verbose log). You'll find
|
||||
tons of examples in the source code if you need them; just do a quick
|
||||
grep or look in most any file. Note that meta_topic and meta_verbose
|
||||
messages only appear if verbosity is turned on. I tend to frequently add
|
||||
temporary meta_warning statements (or switch meta_topic or meta_verbose
|
||||
ones to meta_warning ones) and then undo the changes once I've learned
|
||||
the info that I needed.
|
||||
|
||||
metacity-window-demo is good for trying behavior of various kinds of window
|
||||
without launching a full desktop.
|
||||
There is also a meta_print_backtrace (which again is only active if
|
||||
verbosity is turned on) that can also be useful if you want to learn how
|
||||
a particular line of code gets called. And, of course, there's always
|
||||
g_assert if you want to make sure some section isn't executed (or isn't
|
||||
executed under certain conditions).
|
||||
|
||||
src/window.c is where all the guts of the window manager live. This is
|
||||
basically the only remotely scary file.
|
||||
Valgrind
|
||||
|
||||
src/frames.c is the GtkWidget that handles drawing window frames.
|
||||
Valgrind is awesome for finding memory leaks or corruption and
|
||||
uninitialized variables. But I also tend to use it in a non-traditional
|
||||
way as a partial substitute for a normal debugger: it can provide me with
|
||||
a stack trace of where metacity is crashing if I made a change that
|
||||
caused it to do so, which is one of the major uses of debuggers. (And,
|
||||
what makes it cooler than a debugger is that there will also often be
|
||||
warnings pinpointing the cause of the crash from either some kind of
|
||||
simple memory corruption or an uninitialized variable). Sometimes, when
|
||||
I merely want to know what is calling a particular function I'll just
|
||||
throw in an "int i; printf("%d\n", i);" just because valgrind will give
|
||||
me a full stacktrace whenever it sees that uninitialized variable being
|
||||
used (yes, I could use meta_print_backtrace, but that means I have to
|
||||
turn verbosity on).
|
||||
|
||||
src/core.h defines the interface used by the GTK portion of the window
|
||||
manager to talk to the other portions. There's some cruft in here
|
||||
that's unused, since nearly all window operations have moved out of
|
||||
this file so frameless apps can have window operations.
|
||||
To run metacity under valgrind, use options typical for any Gnome
|
||||
program, such as
|
||||
valgrind --logfile=metacity.log --tool=memcheck --num-callers=48 \
|
||||
--leak-check=yes --leak-resolution=high --show-reachable=yes \
|
||||
./src/metacity --replace
|
||||
where, again, the backslashes mean to join all the stuff on the following
|
||||
line with the previous one.
|
||||
|
||||
src/ui.h defines the interface the plain Xlib portion of the window
|
||||
manager uses to talk to the GTK portion.
|
||||
However, there is a downside. Things run a little bit slowly, and it
|
||||
appears that you'll need about 1.5GB of ram, which unfortunately prevents
|
||||
most people from trying this.
|
||||
|
||||
Files that include gdk.h or gtk.h are not supposed to include
|
||||
display.h or window.h or other core files.
|
||||
Testing Utilities
|
||||
|
||||
Files in the core (display.[hc], window.[hc]) are not supposed to
|
||||
include gdk.h or gtk.h.
|
||||
src/run-metacity.sh
|
||||
The script src/run-metacity.sh is useful to hack on the window manager.
|
||||
It runs metacity in an Xnest. e.g.:
|
||||
CLIENTS=3 ./run-metacity.sh
|
||||
or
|
||||
DEBUG=memprof ./run-metacity.sh
|
||||
or
|
||||
DEBUG_TEST=1 ./run-metacity-sh
|
||||
or whatever.
|
||||
|
||||
src/theme.c and src/theme-parser.c have the theme system; this is
|
||||
well-modularized from the rest of the code, since the theme viewer app
|
||||
links to these files in addition to the WM itself.
|
||||
metacity-message
|
||||
The tool metacity-message can be used as follows:
|
||||
metacity-message reload-theme
|
||||
metacity-message restart
|
||||
metacity-message enable-keybindings
|
||||
metacity-message disable-keybindings
|
||||
|
||||
When hacking, remember that you can have multiple screens. The code is
|
||||
also written to support multiple displays, but this is useless, since
|
||||
you can just run two copies of the WM. Also, an XKillClient() or
|
||||
shutdown on any display causes Xlib to exit the app, so it would be
|
||||
broken. So the multi-display thing is mostly just for code
|
||||
cleanliness. Multi-screen on the other hand is important for some
|
||||
people.
|
||||
metacity-window-demo
|
||||
metacity-window-demo is good for trying behavior of various kinds
|
||||
of window without launching a full desktop.
|
||||
|
||||
Remember that strings stored in X properties are not in UTF-8, and
|
||||
they have to end up in UTF-8 before we try putting them through Pango.
|
||||
Technical gotchas to keep in mind
|
||||
Files that include gdk.h or gtk.h are not supposed to include display.h
|
||||
or window.h or other core files.
|
||||
|
||||
If you make any X request involving a client window, you have to
|
||||
meta_error_trap_push() around the call; this is not necessary for
|
||||
X requests on the frame windows.
|
||||
Files in the core (display.[hc], window.[hc]) are not supposed to include
|
||||
gdk.h or gtk.h.
|
||||
|
||||
Remember that not all windows have frames, and window->frame can
|
||||
be NULL.
|
||||
Remember that strings stored in X properties are not in UTF-8, and they
|
||||
have to end up in UTF-8 before we try putting them through Pango.
|
||||
|
||||
The code could use cleanup in a lot of places, feel free to do so.
|
||||
If you make any X request involving a client window, you have to
|
||||
meta_error_trap_push() around the call; this is not necessary for X
|
||||
requests on the frame windows.
|
||||
|
||||
Metacity is ideally a fully ICCCM and EWMH-compliant window manager.
|
||||
Reading these specifications is a useful first step to understanding
|
||||
the role of a window manager on an X11 desktop and the standards and
|
||||
conventions on which X11 desktops are based. Please refer to the
|
||||
COMPLIANCE file for additional information on these specifications and
|
||||
metacity's compliance therewith.
|
||||
Remember that not all windows have frames, and window->frame can be NULL.
|
||||
|
||||
Other important reading & where to get started
|
||||
Extra reading
|
||||
|
||||
There are some other important things to read to get oriented as well.
|
||||
These are:
|
||||
http://pobox.com/~hp/features.html
|
||||
rationales.txt
|
||||
doc/code-overview.txt
|
||||
|
||||
It pays to read http://pobox.com/~hp/features.html in order
|
||||
to understand the philosophy of Metacity.
|
||||
|
||||
The rationales.txt file has two things: (1) a list of design choices with
|
||||
links in the form of bugzilla bugs that discuss the issue, and (2) a list
|
||||
outstanding bug categories, each of which is tracked by a particular
|
||||
tracker bug in bugzilla from which you can find several closely related
|
||||
bug reports.
|
||||
|
||||
doc/code-overview.txt provides a fairly good overview of the code,
|
||||
including coverage of the function of the various files, the main
|
||||
structures and their relationships, and places to start looking in the
|
||||
code tailored to general categories of tasks.
|
||||
|
||||
Ideas for tasks to work on
|
||||
|
||||
There are a variety of things you could work on in the code. You may
|
||||
have ideas of your own, but in case you don't, let me provide a list of
|
||||
ideas you could choose from:
|
||||
|
||||
If you're ambitious, there's a list of things Havoc made that he'd really
|
||||
like to see tackled, which you can find at
|
||||
http://log.ometer.com/2004-05.html. Be sure to double check with someone
|
||||
to make sure the item is still relevant if you're interested in one of
|
||||
these. Another place to look for ideas, of course, is bugzilla. One can
|
||||
just do queries and look for things that look fixable.
|
||||
|
||||
However, perhaps the best way of getting ideas of related tasks to work
|
||||
on, is to look at the second half of the rationales.txt file, which tries
|
||||
to group bugs by type.
|
||||
|
@@ -3,3 +3,5 @@ SUBDIRS=src po doc
|
||||
|
||||
EXTRA_DIST=HACKING rationales.txt \
|
||||
intltool-extract.in intltool-merge.in intltool-update.in
|
||||
|
||||
DISTCLEANFILES = intltool-extract intltool-merge intltool-update
|
||||
|
225
NEWS
225
NEWS
@@ -1,8 +1,231 @@
|
||||
2.9.13
|
||||
==
|
||||
|
||||
This is an unstable release to coincide with the release of Gnome
|
||||
2.10.0 Beta 2 (2.9.91).
|
||||
|
||||
Thanks to Elijah Newren, Balamurali Viswanathan, Stephane Loeuillet,
|
||||
Benjamin Kahn, Garrett (LeSage?), Jose Moya, Dave Ahlswede, Arvind
|
||||
Samptur, John Paul Wallington, Tim Herold, Muktha Narayan, Sinisa
|
||||
Segvic, Owen Taylor, Crispin Flowerday, "RHEL-3", KWin, and Google for
|
||||
improvements in this release.
|
||||
|
||||
- Refuse to focus a window with a modal transient, and focus the
|
||||
transient instead (Elijah) [#164716]
|
||||
- Make sure we get gconf notifications about the terminal command
|
||||
changing (Balamurali) [#160934]
|
||||
- Specify encoding of src/metacity.desktop.in (Stephane) [#151850]
|
||||
- New 48x48 default icon (Benjamin, Garrett) [#160660]
|
||||
- Add man pages for metacity-window-demo and metacity-theme-viewer
|
||||
(Jose, Dave) [#143513]
|
||||
- Fix minimized window display in workspace switcher after relogin
|
||||
with a saved session (Elijah) [#164677]
|
||||
- Ignore sticky windows for non-active workspaces (Elijah) [#165259]
|
||||
- Don't wireframe when accessibility is on, it apparently causes a
|
||||
desktop wide freeze. (Arvind) [#159538]
|
||||
- Keep tooltip on screen horizontally for xinerama (John) [#165261]
|
||||
- Stick and unstick transients with their parent automatically
|
||||
(Elijah) [#152283]
|
||||
- Shaded windows should not show up in pagers (Elijah) [#165377]
|
||||
- Treat splashscreens same as other windows for stacking (Elijah)
|
||||
[#165243]
|
||||
- Plug a pair of leaks (Elijah) [#165378]
|
||||
- Take into account the appropriate list of windows when placing a
|
||||
new one (Elijah) [#165381]
|
||||
- Correct misleading and inaccurate wording (Elijah) [#165380]
|
||||
- Handle xcomposite pkgconfig version regression (Tim) [#149368]
|
||||
- Make the warn-about-buggy-session-management-apps dialog be sticky
|
||||
(Elijah) [#164745]
|
||||
- Fix the problem with fullscreen windows on a different xinerama
|
||||
monitor not staying on top ("RHEL-3") [#156511]
|
||||
- Make the unfocussed title bar distinguishable in cases where it
|
||||
otherwise isn't for the Atlanta, Simple, and Bright themes (Muktha)
|
||||
[#125291]
|
||||
- Correct the stacking when returning from fullscreen mode (Elijah)
|
||||
[#165718]
|
||||
- Focus parents of dismissed transient windows in preference to the
|
||||
window that most recently had keyboard focus (Elijah) [#157360]
|
||||
- Make sure window->border_only is initialized so we don't get random
|
||||
windows without decorations (Elijah, Sinisa, Owen) [#145131]
|
||||
- Add period to the end of reduced_resources' description (Dave)
|
||||
[#165780]
|
||||
- If activation requests are too old, set the demands_attention hint
|
||||
instead of actually activating (Elijah, Crispin) [#166395]
|
||||
- Ignore xconfigurerequest events for stacking when it should be safe
|
||||
to do so (Elijah, Crispin, KWin, Google) [#166395]
|
||||
- Set a _METACITY_VERSION property (a utf8 string) on the WM check
|
||||
window (Elijah) [#165350]
|
||||
|
||||
Translations
|
||||
Vladimir Petkov (bg), Miloslav Trmac (cs), Frank Arnold (de),
|
||||
Adam Weinberger (en_CA), David Lodge (en_GB),
|
||||
Francisco Javier F. Serrador (es), Pauli Virtanen (fi),
|
||||
Young-Ho, Changwoo Ryu (ko), <20>ygimantas Berucka (lt),
|
||||
Kjartan Maraas (nb), Kjartan Maraas (no), Duarte Loreto (pt),
|
||||
Marcel Telka (sk), Christian Rose (sv),
|
||||
Theppitak Karoonboonyanan (th)
|
||||
|
||||
2.9.8
|
||||
==
|
||||
|
||||
This is a brown paper bag release to cover up the crash I introduced
|
||||
in version 2.9.5. Thanks to Sebastien Bacher and the bleeding edge
|
||||
Ubuntu users for quickly catching the occasional crash that my fix in
|
||||
#123576 could cause, and for verifying that the patch I made fixed
|
||||
this issue (I couldn't duplicate).
|
||||
|
||||
- Don't forget to initialize display->grab_old_window_stacking
|
||||
[#165093]
|
||||
|
||||
2.9.5
|
||||
==
|
||||
|
||||
This is an unstable release to coincide with the release of Gnome
|
||||
2.10.0 Beta 1 (2.9.90).
|
||||
|
||||
Thanks to Vincent Noel, Elijah Newren, and John Paul Wallington for
|
||||
fixes in this release.
|
||||
|
||||
- Restore original stacking when aborting an alt-esc window switch
|
||||
operation (Elijah) [#123576]
|
||||
- Fix vertical maximization for second screen (John) [#163420]
|
||||
- Show labels in bold for windows that demand attention (Vincent)
|
||||
[#164590]
|
||||
- In the tab task switcher popup, dim the window icon and put its
|
||||
name between brackets when the window is minimized (Vincent)
|
||||
[#136666]
|
||||
- Correct highlighting of windows in workspace switcher popup
|
||||
(Elijah) [#163450]
|
||||
|
||||
Translations
|
||||
zh_CN (Funda Wang), nb (Kjartan Maraas), nn (Kjartan Maraas), de
|
||||
(Frank Arnold)
|
||||
|
||||
2.9.3
|
||||
==
|
||||
|
||||
This is an unstable release to coincide with the release of Gnome 2.9.4.
|
||||
|
||||
Thanks to Leena Gunda, Thomas Fitzsimmons, and mild7 users sourceforge
|
||||
net, and Elijah Newren for fixes in this release.
|
||||
|
||||
- Don't focus the panel on click (Elijah) [#160470, and others]
|
||||
- Make sure the save session dialog appears focused (Elijah) [#162983]
|
||||
- Correctly restore size of window when double clicking the titlebar
|
||||
to unmaximize (Leena) [#161236]
|
||||
- Install schema data from builddir not srcdir (Thomas) [#161417]
|
||||
- Provide more documentation to make it easier for people to
|
||||
contribute to Metacity (Elijah) [#162646]
|
||||
- Allow users to move the window around immediately after
|
||||
double-clicking to shade (Elijah) [#90290]
|
||||
- Focus windows that manually position themselves too (Elijah) [#107347]
|
||||
- Don't show window menu if all options are invalid (Elijah) [#148915]
|
||||
- Exclude windows with skip_taskbar hint set from the alt-tab list;
|
||||
they'll appear in the ctrl-alt-tab list instead. (mild7 users
|
||||
sourceforge net) [#106249]
|
||||
- Wrap XSetInputFocus to make display->expected_focus_window more
|
||||
reliable (Elijah) [#154598]
|
||||
- Remove conflict between windows on multiple workspaces and hidden
|
||||
being a global quantity (Elijah) [#156182]
|
||||
|
||||
Translations
|
||||
es (Francisco Javier F. Serrador), sv (Christian Rose), cs (Miloslav
|
||||
Trmac), ja (Takeshi AIHANA)
|
||||
|
||||
2.9.2
|
||||
==
|
||||
|
||||
This is an unstable release to coincide with the release of Gnome 2.9.3.
|
||||
|
||||
Thanks to Alex Duggan, ash AT contact bg, Elijah Newren, and Baptiste
|
||||
Mille-Mathias for fixes in this release.
|
||||
|
||||
- Add a missing period at the end of a sentence (Baptiste) [#158210]
|
||||
- When snap-moving don't snap to hidden windows, such as transients
|
||||
of minimized windows (Elijah) [#157180]
|
||||
- Focus the desktop when showing it (Elijah) [#159257]
|
||||
- Remove deprecated capplet (Alex, ash) [#160753]
|
||||
|
||||
Translations
|
||||
da (Martin Willemoes Hansen), bg (Alexander Shopov), en_CA (Adam
|
||||
Weinberger)
|
||||
|
||||
2.9.1
|
||||
==
|
||||
|
||||
This is an unstable release heading towards Gnome 2.10, released a
|
||||
little late for Gnome 2.9.2 but there weren't many changes anyway this
|
||||
time...
|
||||
|
||||
Thanks to Benjamin Kahn, Marco Pesenti Gritti, James Henstridge, and
|
||||
Vincent Untz for fixes/features in this release.
|
||||
|
||||
- gnome-panel-screenshot was renamed to gnome-screenshot (Vincent) [#157529]
|
||||
- Update build stuff (use newer automake, etc.) (James)
|
||||
- Fix build out of src directory (Marco) [#158325]
|
||||
- Use a better default application icon (Benjamin) [#160373]
|
||||
|
||||
Translations
|
||||
da (Martin Willemoes Hansen), fr(Christophe Merlet, Baptiste
|
||||
Mille-Mathias), lt(<28>ygimantas Berucka), ja(Takeshi AIHANA)
|
||||
|
||||
2.9.0
|
||||
==
|
||||
|
||||
This is an unstable release heading towards Gnome 2.10.
|
||||
|
||||
Thanks to Rob Adams, Anders Carlsson, Elijah Newren, Soeren Sandmann,
|
||||
and Vincent Untz for fixes and features in this release.
|
||||
|
||||
- Add a keybinding to launch a terminal (Vincent) [#154232]
|
||||
- Correct the requested number of keycodes (Rob) [#155247]
|
||||
- Add tracker bugs to rationales.txt file
|
||||
- Make the "showing desktop" mode be per-workspace instead of
|
||||
per-screen. (Elijah) [#142198]
|
||||
- Don't try to use an ARGB visual at all if the depth isn't
|
||||
32-bit. This caused major slowdowns with Composite
|
||||
enabled. (Anders)
|
||||
- Fix the modifier key breakage introduced by an Xorg
|
||||
change. (Soeren) [#151554]
|
||||
- Update _NET_WM_STATE_HIDDEN so the pager on the panel will know
|
||||
whether to display windows as visible or hidden (Elijah) [#105665]
|
||||
- Fix the alt-tab order--if the most recently used window is not
|
||||
focused, start alt tabbing with that window instead of the one
|
||||
after it (Elijah) [#156251]
|
||||
- Don't lower newly mapped windows when they're denied focus if they
|
||||
are transients of the focused window. Instead, defocus the
|
||||
currently focused window (Elijah) [#151996]
|
||||
- Re-enable focus stealing prevention (Elijah)
|
||||
|
||||
Translations
|
||||
es(Francisco Javier F. Serrador), sq(Laurent Dhima), sr(Danilo <20>egan),
|
||||
cs(Miloslav Trmac), en_CA(Adam Weinberger), en_GB(David Lodge)
|
||||
|
||||
2.8.6
|
||||
==
|
||||
|
||||
This is a stable release for Gnome 2.8.1.
|
||||
|
||||
Thanks to the Ken Harris, Kjartan Maraas, and the tireless efforts of
|
||||
Elijah Newren for fixes in this release.
|
||||
|
||||
Fixes
|
||||
* Ensure the correct window is focused when minimizing (Elijah)
|
||||
* Fix keynav with mouse focus (Elijah)
|
||||
* Fix several race conditions in window focusing (Elijah)
|
||||
* Focus the top window when lowering by frame click (Ken)
|
||||
* Fix some compiler warnings (Kjartan)
|
||||
* Fix some valgrind-reported errors (Elijah)
|
||||
* Fix some potential issues with autoraising windows (Elijah)
|
||||
|
||||
Translations
|
||||
* en_CA(Adam Weinberger), it(Luca Ferretti)
|
||||
|
||||
2.8.5
|
||||
==
|
||||
|
||||
This is a stable release for Gnome 2.8. Only translations and some
|
||||
new developer documentation were added since the last unstable release.
|
||||
new developer documentation were added since the last unstable release.
|
||||
This release boasts improved standards-compliance and a number of
|
||||
bug fixes since the last stable release.
|
||||
|
||||
|
4
README
4
README
@@ -6,9 +6,9 @@ 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.0, 2.8.1, 2.8.1.x, 2.8.5
|
||||
The stable releases so far are 2.4.x, 2.6.x, 2.8.0, 2.8.1, 2.8.1.x, 2.8.5-
|
||||
|
||||
Unstable branches are 2.3.x, 2.5.x, 2.8.2-4)
|
||||
Unstable branches are 2.3.x, 2.5.x, 2.8.2-4, 2.9.x)
|
||||
|
||||
COMPILING METACITY
|
||||
===
|
||||
|
115
autogen.sh
115
autogen.sh
@@ -12,35 +12,36 @@ FILE=src/display.c
|
||||
|
||||
DIE=0
|
||||
|
||||
AUTOMAKE=automake-1.4
|
||||
ACLOCAL=aclocal-1.4
|
||||
|
||||
($AUTOMAKE --version) < /dev/null > /dev/null 2>&1 || {
|
||||
AUTOMAKE=automake
|
||||
ACLOCAL=aclocal
|
||||
}
|
||||
|
||||
(autoconf --version) < /dev/null > /dev/null 2>&1 || {
|
||||
echo
|
||||
echo "You must have autoconf installed to compile $PROJECT."
|
||||
echo "Download the appropriate package for your distribution,"
|
||||
echo "or get the source tarball at ftp://ftp.gnu.org/pub/gnu/"
|
||||
echo "or get the source tarball at http://ftp.gnu.org/gnu/autoconf/"
|
||||
DIE=1
|
||||
}
|
||||
|
||||
($AUTOMAKE --version) < /dev/null > /dev/null 2>&1 || {
|
||||
echo
|
||||
echo "You must have automake installed to compile $PROJECT."
|
||||
echo "Get ftp://sourceware.cygnus.com/pub/automake/automake-1.4.tar.gz"
|
||||
echo "(or a newer version if it is available)"
|
||||
DIE=1
|
||||
}
|
||||
if automake-1.9 --version < /dev/null > /dev/null 2>&1; then
|
||||
AUTOMAKE=automake-1.9
|
||||
ACLOCAL=aclocal-1.9
|
||||
elif automake-1.8 --version < /dev/null > /dev/null 2>&1; then
|
||||
AUTOMAKE=automake-1.8
|
||||
ACLOCAL=aclocal-1.8
|
||||
elif automake-1.7 --version < /dev/null > /dev/null 2>&1; then
|
||||
AUTOMAKE=automake-1.7
|
||||
ACLOCAL=aclocal-1.7
|
||||
else
|
||||
echo
|
||||
echo "You must have automake >= 1.7 installed to compile $PROJECT."
|
||||
echo "Get http://ftp.gnu.org/gnu/automake/automake-1.9.3.tar.bz2"
|
||||
echo "(or a newer version if it is available)"
|
||||
DIE=1
|
||||
fi
|
||||
|
||||
(grep "^AM_PROG_LIBTOOL" configure.in >/dev/null) && {
|
||||
(libtool --version) < /dev/null > /dev/null 2>&1 || {
|
||||
echo
|
||||
echo "**Error**: You must have \`libtool' installed to compile $PROJECT."
|
||||
echo "Get ftp://ftp.gnu.org/pub/gnu/libtool-1.2d.tar.gz"
|
||||
echo "Get http://ftp.gnu.org/gnu/libtool/libtool-1.5.10.tar.gz"
|
||||
echo "(or a newer version if it is available)"
|
||||
DIE=1
|
||||
}
|
||||
@@ -84,10 +85,7 @@ if test -z "$*"; then
|
||||
echo "to pass any to it, please specify them on the $0 command line."
|
||||
fi
|
||||
|
||||
case $CC in
|
||||
*xlc | *xlc\ * | *lcc | *lcc\ *) am_opt=--include-deps;;
|
||||
esac
|
||||
|
||||
topdir=`pwd`
|
||||
for coin in .
|
||||
do
|
||||
dr=`dirname $coin`
|
||||
@@ -95,51 +93,40 @@ do
|
||||
echo skipping $dr -- flagged as no auto-gen
|
||||
else
|
||||
echo processing $dr
|
||||
macrodirs=`sed -n -e 's,AM_ACLOCAL_INCLUDE(\(.*\)),\1,gp' < $coin`
|
||||
( cd $dr
|
||||
aclocalinclude="$ACLOCAL_FLAGS"
|
||||
for k in $macrodirs; do
|
||||
if test -d $k; then
|
||||
aclocalinclude="$aclocalinclude -I $k"
|
||||
##else
|
||||
## echo "**Warning**: No such directory \`$k'. Ignored."
|
||||
fi
|
||||
done
|
||||
if grep "^AM_GLIB_GNU_GETTEXT" configure.in >/dev/null; then
|
||||
if grep "sed.*POTFILES" configure.in >/dev/null; then
|
||||
: do nothing -- we still have an old unmodified configure.in
|
||||
else
|
||||
echo "Creating $dr/aclocal.m4 ..."
|
||||
test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
|
||||
echo "Running glib-gettextize... Ignore non-fatal messages."
|
||||
echo "no" | glib-gettextize --force --copy
|
||||
echo "Making $dr/aclocal.m4 writable ..."
|
||||
test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
|
||||
fi
|
||||
fi
|
||||
if grep "^AC_PROG_INTLTOOL" configure.in >/dev/null; then
|
||||
echo "Running intltoolize..."
|
||||
intltoolize --force --copy --automake
|
||||
fi
|
||||
if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then
|
||||
echo "Running libtoolize..."
|
||||
libtoolize --force --copy
|
||||
cd $dr
|
||||
if grep "^AM_GLIB_GNU_GETTEXT" configure.in >/dev/null; then
|
||||
if grep "sed.*POTFILES" configure.in >/dev/null; then
|
||||
: do nothing -- we still have an old unmodified configure.in
|
||||
else
|
||||
echo "Creating $dr/aclocal.m4 ..."
|
||||
test -r $dr/aclocal.m4 || touch $dr/aclocal.m4
|
||||
echo "Running glib-gettextize... Ignore non-fatal messages."
|
||||
echo "no" | glib-gettextize --force --copy || exit $?
|
||||
echo "Making $dr/aclocal.m4 writable ..."
|
||||
test -r $dr/aclocal.m4 && chmod u+w $dr/aclocal.m4
|
||||
fi
|
||||
fi
|
||||
if grep "^AC_PROG_INTLTOOL" configure.in >/dev/null; then
|
||||
echo "Running intltoolize..."
|
||||
intltoolize --force --copy --automake || exit $?
|
||||
fi
|
||||
if grep "^AM_PROG_LIBTOOL" configure.in >/dev/null; then
|
||||
echo "Running libtoolize..."
|
||||
libtoolize --force --copy || exit $?
|
||||
fi
|
||||
|
||||
echo "Running $ACLOCAL $aclocalinclude ..."
|
||||
$ACLOCAL $aclocalinclude
|
||||
echo "Running $ACLOCAL $ACLOCAL_FLAGS ..."
|
||||
$ACLOCAL $ACLOCAL_FLAGS || exit $?
|
||||
echo "Running autoconf ..."
|
||||
autoconf || exit $?
|
||||
if grep "^AC_CONFIG_HEADERS" configure.in >/dev/null; then
|
||||
echo "Running autoheader..."
|
||||
autoheader || exit $?
|
||||
fi
|
||||
echo "Running $AUTOMAKE..."
|
||||
$AUTOMAKE --add-missing --force --gnu || exit $?
|
||||
|
||||
if grep "^AM_CONFIG_HEADER" configure.in >/dev/null; then
|
||||
echo "Running autoheader..."
|
||||
autoheader
|
||||
fi
|
||||
|
||||
echo "Running $AUTOMAKE --gnu $am_opt ..."
|
||||
$AUTOMAKE --add-missing --gnu $am_opt
|
||||
|
||||
echo "Running autoconf ..."
|
||||
autoconf
|
||||
)
|
||||
cd $topdir
|
||||
fi
|
||||
done
|
||||
|
||||
@@ -150,7 +137,7 @@ cd "$ORIGDIR"
|
||||
if test x$NOCONFIGURE = x; then
|
||||
echo Running $srcdir/configure $conf_flags "$@" ...
|
||||
$srcdir/configure $conf_flags "$@" \
|
||||
&& echo Now type \`make\' to compile $PROJECT || exit 1
|
||||
&& echo Now type \`make\' to compile $PROJECT || exit $?
|
||||
else
|
||||
echo Skipping configure process.
|
||||
fi
|
||||
|
87
configure.in
87
configure.in
@@ -1,22 +1,23 @@
|
||||
AC_PREREQ(2.50)
|
||||
AC_INIT(src/display.c)
|
||||
|
||||
AM_CONFIG_HEADER(config.h)
|
||||
# Fibonacci sequence for micro version numbering:
|
||||
# 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987
|
||||
AC_INIT([metacity], [2.9.13],
|
||||
[http://bugzilla.gnome.org/enter_bug.cgi?product=metacity])
|
||||
|
||||
# we'll hold the 2.8.x versioning for GNOME 2.8, it was also used
|
||||
# for GNOME 2.6, then after GNOME 2.8 we'll have the numbers synced
|
||||
# with GNOME
|
||||
AM_INIT_AUTOMAKE(metacity, 2.8.5)
|
||||
AC_CONFIG_SRCDIR(src/display.c)
|
||||
AC_CONFIG_HEADERS(config.h)
|
||||
|
||||
AM_INIT_AUTOMAKE
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
# Honor aclocal flags
|
||||
ACLOCAL="$ACLOCAL $ACLOCAL_FLAGS"
|
||||
AC_SUBST(ACLOCAL_AMFLAGS, "\${ACLOCAL_FLAGS}")
|
||||
|
||||
GETTEXT_PACKAGE=metacity
|
||||
AC_SUBST(GETTEXT_PACKAGE)
|
||||
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",[Name of default gettext domain])
|
||||
|
||||
AM_MAINTAINER_MODE
|
||||
|
||||
AC_PROG_INTLTOOL([0.21])
|
||||
AC_PROG_CC
|
||||
AC_ISC_POSIX
|
||||
@@ -102,37 +103,54 @@ changequote([,])dnl
|
||||
|
||||
METACITY_PC_MODULES='gtk+-2.0 >= 2.2.0 pango >= 1.2.0'
|
||||
|
||||
AC_ARG_ENABLE(config-dialog, [ --enable-config-dialog enable the config dialog that you need with GNOME 2.0 (obsolete with GNOME 2.2)],,enable_config_dialog=no)
|
||||
|
||||
AM_CONDITIONAL(BUILD_CONFIG_DIALOG, test x$enable_config_dialog = xyes)
|
||||
if test x$enable_config_dialog = xyes; then
|
||||
AC_DEFINE(BUILD_CONFIG_DIALOG,1,[Build configuration dialog])
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(gconf, [ --disable-gconf disable gconf usage, for embedded/size-sensitive non-GNOME builds],,enable_gconf=yes)
|
||||
AC_ARG_ENABLE(gconf,
|
||||
AC_HELP_STRING([--disable-gconf],
|
||||
[disable gconf usage, for embedded/size-sensitive non-GNOME builds]),,
|
||||
enable_gconf=yes)
|
||||
|
||||
if test x$enable_gconf = xyes; then
|
||||
AC_DEFINE(HAVE_GCONF,1,[Build with gconf support])
|
||||
METACITY_PC_MODULES="$METACITY_PC_MODULES gconf-2.0 >= 1.2.0"
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(verbose-mode, [ --disable-verbose disable metacity's ability to do verbose logging, for embedded/size-sensitive custom builds],,enable_verbose_mode=yes)
|
||||
AC_ARG_ENABLE(verbose-mode,
|
||||
AC_HELP_STRING([--disable-verbose],
|
||||
[disable metacity's ability to do verbose logging, for embedded/size-sensitive custom builds]),,
|
||||
enable_verbose_mode=yes)
|
||||
|
||||
if test x$enable_verbose_mode = xyes; then
|
||||
AC_DEFINE(WITH_VERBOSE_MODE,1,[Build with verbose mode support])
|
||||
fi
|
||||
|
||||
AC_ARG_ENABLE(sm, [ --disable-sm disable metacity's session management support, for embedded/size-sensitive custom non-GNOME builds],,enable_sm=auto)
|
||||
AC_ARG_ENABLE(sm,
|
||||
AC_HELP_STRING([--disable-sm],
|
||||
[disable metacity's session management support, for embedded/size-sensitive custom non-GNOME builds]),,
|
||||
enable_sm=auto)
|
||||
|
||||
AC_ARG_ENABLE(startup-notification, [ --disable-startup-notification disable metacity's startup notification support, for embedded/size-sensitive custom non-GNOME builds],,enable_startup_notification=auto)
|
||||
AC_ARG_ENABLE(startup-notification,
|
||||
AC_HELP_STRING([--disable-startup-notification],
|
||||
[disable metacity's startup notification support, for embedded/size-sensitive custom non-GNOME builds]),,
|
||||
enable_startup_notification=auto)
|
||||
|
||||
AC_ARG_ENABLE(compositor, [ --disable-compositor disable metacity's compositing manager],,enable_compositor=auto)
|
||||
AC_ARG_ENABLE(compositor,
|
||||
AC_HELP_STRING([--disable-compositor],
|
||||
[disable metacity's compositing manager]),,
|
||||
enable_compositor=auto)
|
||||
|
||||
AC_ARG_ENABLE(xsync, [ --disable-xsync disable metacity's use of the XSync extension],,enable_xsync=auto)
|
||||
AC_ARG_ENABLE(xsync,
|
||||
AC_HELP_STRING([--disable-xsync],
|
||||
[disable metacity's use of the XSync extension]),,
|
||||
enable_xsync=auto)
|
||||
|
||||
AC_ARG_ENABLE(render, [ --disable-render disable metacity's use of the RENDER extension],,enable_render=auto)
|
||||
AC_ARG_ENABLE(render,
|
||||
AC_HELP_STRING([--disable-render],
|
||||
[disable metacity's use of the RENDER extension]),,
|
||||
enable_render=auto)
|
||||
|
||||
AC_ARG_ENABLE(shape, [ --disable-shape disable metacity's use of the shaped window extension],,enable_shape=auto)
|
||||
AC_ARG_ENABLE(shape,
|
||||
AC_HELP_STRING([--disable-shape],
|
||||
[disable metacity's use of the shaped window extension]),,
|
||||
enable_shape=auto)
|
||||
|
||||
## try definining HAVE_BACKTRACE
|
||||
AC_CHECK_HEADERS(execinfo.h, [AC_CHECK_FUNCS(backtrace)])
|
||||
@@ -144,10 +162,6 @@ AM_GLIB_GNU_GETTEXT
|
||||
PKG_CHECK_MODULES(METACITY_MESSAGE, gtk+-2.0 >= 2.2.0)
|
||||
PKG_CHECK_MODULES(METACITY_WINDOW_DEMO, gtk+-2.0 >= 2.2.0)
|
||||
|
||||
if test x$enable_config_dialog = xyes; then
|
||||
PKG_CHECK_MODULES(METACITY_PROPS, gtk+-2.0 >= 2.2.0 gconf-2.0 >= 1.1.9 libglade-2.0)
|
||||
fi
|
||||
|
||||
if $PKG_CONFIG --atleast-version 1.2.0 pangoxft; then
|
||||
echo "pangoxft found"
|
||||
else
|
||||
@@ -184,7 +198,7 @@ fi
|
||||
## or the render-specific check later
|
||||
have_xrender=no
|
||||
|
||||
XCOMPOSITE_VERSION=1.0
|
||||
XCOMPOSITE_VERSION=0.2
|
||||
AC_MSG_CHECKING([Xcomposite >= $XCOMPOSITE_VERSION])
|
||||
if $PKG_CONFIG --atleast-version $XCOMPOSITE_VERSION xcomposite; then
|
||||
have_xcomposite=yes
|
||||
@@ -254,8 +268,10 @@ ALL_X_LIBS="$X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS"
|
||||
metacity_save_cppflags="$CPPFLAGS"
|
||||
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
|
||||
|
||||
AC_ARG_ENABLE(xinerama,[ --disable-xinerama disable metacity's use of the Xinerama extension],
|
||||
try_xinerama=$enable_xinerama,try_xinerama=yes)
|
||||
AC_ARG_ENABLE(xinerama,
|
||||
AC_HELP_STRING([--disable-xinerama],
|
||||
[disable metacity's use of the Xinerama extension]),
|
||||
try_xinerama=$enable_xinerama,try_xinerama=yes)
|
||||
|
||||
use_solaris_xinerama=no
|
||||
use_xfree_xinerama=no
|
||||
@@ -432,9 +448,10 @@ if test x$enable_gconf = xyes; then
|
||||
AM_GCONF_SOURCE_2
|
||||
fi
|
||||
|
||||
AC_OUTPUT([
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
doc/Makefile
|
||||
doc/man/Makefile
|
||||
src/Makefile
|
||||
src/wm-tester/Makefile
|
||||
src/libmetacity-private.pc
|
||||
@@ -443,6 +460,8 @@ src/themes/Makefile
|
||||
po/Makefile.in
|
||||
])
|
||||
|
||||
AC_OUTPUT
|
||||
|
||||
if test x$enable_gconf = xno; then
|
||||
echo "*** WARNING WARNING WARNING WARNING WARNING"
|
||||
echo "*** Building without GConf"
|
||||
@@ -479,6 +498,6 @@ metacity-$VERSION:
|
||||
Resize-and-rotate: ${found_randr}
|
||||
Xsync: ${found_xsync}
|
||||
Render: ${have_xrender}
|
||||
Deprecated config dialog: ${enable_config_dialog}
|
||||
"
|
||||
# echo "This is the UNSTABLE branch of metacity, use 2.8.1.x for stable (gnome-2-6 branch in CVS)"
|
||||
echo "This is the UNSTABLE branch of metacity"
|
||||
echo "Use 2.8.x (where x > 5) for stable (gnome-2-8 branch in CVS)"
|
||||
|
@@ -1,2 +1,3 @@
|
||||
SUBDIRS = man
|
||||
|
||||
EXTRA_DIST=theme-format.txt metacity-theme.dtd dialogs.txt
|
||||
|
185
doc/code-overview.txt
Normal file
185
doc/code-overview.txt
Normal file
@@ -0,0 +1,185 @@
|
||||
This is not meant to be comprehensive by any means. Rather it is
|
||||
meant as just a brief overview of some of the bigger structures and
|
||||
files, with guides for a variety of task categories providing places
|
||||
to start looking in the code and things to look for.
|
||||
|
||||
Overview
|
||||
Jobs of various files
|
||||
Major data structures and their relationships
|
||||
Getting started -- where to look
|
||||
|
||||
|
||||
Jobs of various files
|
||||
src/window.c is where all the guts of the window manager live. This is
|
||||
basically the only remotely scary file.
|
||||
|
||||
src/frames.c is the GtkWidget that handles drawing window frames.
|
||||
|
||||
src/core.h defines the interface used by the GTK portion of the window
|
||||
manager to talk to the other portions. There's some cruft in here that's
|
||||
unused, since nearly all window operations have moved out of this file so
|
||||
frameless apps can have window operations.
|
||||
|
||||
src/ui.h defines the interface the plain Xlib portion of the window
|
||||
manager uses to talk to the GTK portion.
|
||||
|
||||
src/theme.c and src/theme-parser.c have the theme system; this is
|
||||
well-modularized from the rest of the code, since the theme viewer app
|
||||
links to these files in addition to the WM itself.
|
||||
|
||||
Major data structures and their relationships
|
||||
Major structs have a "Meta" prefix, thus MetaDisplay, MetaScreen,
|
||||
MetaWindow, etc. This serves as a way of namespacing in C. It also has
|
||||
the side effect of avoiding conflicts with common names that X already
|
||||
uses such as Display, Screen, Window, etc. Note that when I refer to a
|
||||
display below, I'm meaning a MetaDisplay and not a Display.
|
||||
|
||||
Don't confuse displays and screens. While Metacity can run with multiple
|
||||
displays, it is kind of useless since you might as well just run two
|
||||
copies of Metacity. However, having multiple screens per display is
|
||||
useful and increasingly common (known as "multiscreen" and "xinerama"
|
||||
setups, where users make use of more than one monitor). You should
|
||||
basically think of a display as a combination of one or more monitors
|
||||
with a single keyboard (...and usually only one mouse).
|
||||
|
||||
There is also a significant difference between multiscreen and xinerama
|
||||
as well. Basically, each MetaScreen is a root window (root node in the
|
||||
tree of windows). With Xinerama, a single root window appears to span
|
||||
multiple monitors, whereas with multiscreen a root window is confined to
|
||||
a single monitor. To re-emphasize the distinction between a display and
|
||||
a screen, the pointer and keyboard are shared between all root windows
|
||||
for a given display.
|
||||
|
||||
The display keeps track of a lot of various global quantities, but in
|
||||
particular has a compositor and a list (GList) of screens.
|
||||
|
||||
A compositor is an opaque structure (only defined in compositor.c),
|
||||
meaning that you'll only reference the API for it. It handles (or will
|
||||
handle) cool stuff with the new X extensions, such as smooth resizing and
|
||||
alpha transparency.
|
||||
|
||||
A screen keeps track of a number of quantities as well, in particular a
|
||||
stack and a list of workspaces.
|
||||
|
||||
A stack is basically a list of windows, and the depth order they have
|
||||
relative to each other (which thus determines which windows are on top
|
||||
and which are obscured).
|
||||
|
||||
A workspace mostly contains a list of windows for the workspace, but also
|
||||
has a few other quantities as well (a list of struts which are areas
|
||||
where windows should not be placed and an mru_list or "most recently used
|
||||
window list").
|
||||
|
||||
A window has a huge list of quantities for keeping track of things about
|
||||
a window on the screen. (We want to avoid making this list larger
|
||||
because the memory for all these quantities is per window.) One item in
|
||||
particular that a window has, though, is a frame.
|
||||
|
||||
A frame is the decorations that surround the window (i.e. the titlebar and
|
||||
the minimize and close buttons and the part that you can use to resize),
|
||||
and contains a handful of variables related to that, but no other major
|
||||
structures.
|
||||
|
||||
Getting started -- where to look
|
||||
Getting started on developing free software projects can often be like
|
||||
being dropped off in a town that is unknown to you and being told to make
|
||||
a map, when various road and building signs are missing or fading. To
|
||||
try to alleviate that initial difficulty in orientation, below I list a
|
||||
variety of general task categories with file, function, variable, and x
|
||||
property names that may be useful to fixing bugs or writing features that
|
||||
fall within that category.
|
||||
|
||||
First, though, it's useful to note that most event and message passing
|
||||
goes through display.c:event_callback(), so that's often a good place to
|
||||
start reading for general familiarity with the code (actually, I'd
|
||||
suggest skipping down to the first switch statement within that
|
||||
function). Of course, not all events go through that function, as there
|
||||
are a few other places that handle events too such as frames.c.
|
||||
|
||||
Anyway, without further ado, here are the categories and (hopefully)
|
||||
useful things to look at for each:
|
||||
|
||||
Focus issues (i.e. issues with which window is active):
|
||||
doc/how-to-get-focus-right.txt
|
||||
meta_workspace_focus_default_window
|
||||
_NET_ACTIVE_WINDOW
|
||||
_NET_WM_USER_TIME
|
||||
meta_window_focus
|
||||
meta_display_(set_input|focus_the_no)_focus_window
|
||||
XSetInputFocus (only for purposes of understanding how X focus/input works)
|
||||
CurrentTime (mostly, you should just think "Bad; don't use it")
|
||||
|
||||
Compositor stuff (X extension for eye candy like transparency):
|
||||
compositor.c
|
||||
The luminocity module in CVS
|
||||
|
||||
Window depth (i.e. stacking or lowering/raising) issues:
|
||||
stack.c
|
||||
_NET_CLIENT_LIST_STACKING
|
||||
transient_for
|
||||
WM_TRANSIENT_FOR
|
||||
meta_window_(raise|lower)
|
||||
_NET_WM_WINDOW_TYPE
|
||||
_NET_WM_MOUSE_ACTION/_NET_WM_TAKE_ACTIVITY? (aren't yet in EWMH)
|
||||
|
||||
Window placement issues:
|
||||
place.c
|
||||
constraints.c
|
||||
_NET_WM_STRUT
|
||||
WM_SIZE_HINTS
|
||||
|
||||
Moving and resizing issues:
|
||||
constraints.c
|
||||
update_move
|
||||
update_resize
|
||||
meta_window_handle_mouse_grab_op_event
|
||||
_NET_MOVERESIZE_WINDOW
|
||||
_NET_WM_STRUT
|
||||
|
||||
Drag and drop issues:
|
||||
the XDND protocol (see http://www.newplanetsoftware.com/xdnd/ and
|
||||
http://freedesktop.org/Standards/XDND)
|
||||
_NET_WM_MOUSE_ACTION/_NET_WM_TAKE_ACTIVITY (aren't yet in EWMH)
|
||||
A general pointer: what causes the difficulty here is that when the
|
||||
application receives a mouse click to start a drag, it does a grab
|
||||
so that the window manager doesn't get any further events; thus
|
||||
correcting things require standards so that applications and window
|
||||
managers can collaborate correctly
|
||||
|
||||
Theme issues: ???
|
||||
doc/theme-format.txt
|
||||
theme.c
|
||||
theme-parser.c
|
||||
(ui.c, core.c, frames.c, frame.c? I dunno...)
|
||||
|
||||
Session management issues: ???
|
||||
session.c
|
||||
http://www.x.org/X11R6.8.1/doc/SM/xsmp.pdf ?
|
||||
http://www.x.org/X11R6.8.1/doc/SM/SMlib.pdf ?
|
||||
meta_window_apply_session_info
|
||||
|
||||
Tasklist and Workspace switcher issues:
|
||||
window-props.c
|
||||
various functions in screen.c (especially ones using XChangeProperty)
|
||||
xprops.c
|
||||
The libwnck module in cvs
|
||||
meta_window_client_message
|
||||
Lots of the EWMH
|
||||
|
||||
Window and workspace selection/changing issues:
|
||||
tabpopup.c
|
||||
keybindings.c, functions: *_workspace*, *_tab_*
|
||||
meta_screen_ensure_*_popup
|
||||
display.c, functions: *_tab*
|
||||
|
||||
Key and mouse binding actions:
|
||||
keybindings.c
|
||||
meta_frames_button_(press|release)_event
|
||||
display.c: event_callback, but only the (Key|Button)_(Press|Release) cases
|
||||
|
||||
Xinerama and multiscreen: ???
|
||||
In general, just search for Xinerama, but in particular see
|
||||
screen.c
|
||||
window.c
|
||||
place.c
|
||||
constraints.c
|
@@ -37,6 +37,14 @@ Focus method Behavior
|
||||
mouse Focus the window containing the pointer if there is one,
|
||||
otherwise focus the designated "no_focus_window".
|
||||
|
||||
Note that "most recently used window", as used here, has a slightly
|
||||
different connotation than "most recent to have keyboard focus". This
|
||||
is because when a user activates a window that is a transient, its
|
||||
ancestor(s) should be considered to be more recently used than other
|
||||
windows that have had the keyboard focus more recently. (See bug
|
||||
157360; this may mean that the alt-tab order should also change
|
||||
simultaneously, although the current implementation does not do that.)
|
||||
|
||||
Also, sometimes a new window will be mapped (e.g. unminimizing a
|
||||
window or launching a new application). Most users want to interact
|
||||
with new windows right away, so these should typically be focused.
|
||||
@@ -76,12 +84,13 @@ and LeaveNotify events should be ignored (they can be generated
|
||||
without using the mouse, for example, by grabs).
|
||||
|
||||
Finally, windows of type WM_DOCK or WM_DESKTOP (e.g. the desktop and
|
||||
the panel) present a special case. For all focus modes, we only focus
|
||||
these windows if the user clicks on them or uses Ctrl-Alt-Tab to
|
||||
navigate to them. (Well, erm, actually they can be focused in click
|
||||
and sloppy focus modes if no other window besides these are found, but
|
||||
there shouldn't be any difference in behavior between doing this and
|
||||
focusing the designated "no_focus_window")
|
||||
the panel) present a special case, at least partially due to the lack
|
||||
of decorations. For WM_DESKTOP windows, we only focus them if the
|
||||
user explicitly requests it (e.g. clicks on the window, uses
|
||||
Ctrl-Alt-Tab to navigate to it, uses a keybinding to show the desktop,
|
||||
etc.). For WM_DOCK windows, we do not focus unless we receive a very
|
||||
explicit request (e.g. Ctrl-Alt-Tab or a _NET_ACTIVE_WINDOW message;
|
||||
not normal clicks).
|
||||
|
||||
|
||||
|
||||
@@ -97,7 +106,8 @@ To read more about the bugs that inspired these choices:
|
||||
- Ignoring EnterNotify and LeaveNotify events during keynav
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=101190
|
||||
- Not focusing panels
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=120100 (maybe a different bug?)
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=160470
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=120100
|
||||
|
||||
There were many bugs which had to be fixed to get all the above
|
||||
working; they helped form these policies and/or show the difficulties
|
||||
|
2
doc/man/.cvsignore
Normal file
2
doc/man/.cvsignore
Normal file
@@ -0,0 +1,2 @@
|
||||
Makefile
|
||||
Makefile.in
|
3
doc/man/Makefile.am
Normal file
3
doc/man/Makefile.am
Normal file
@@ -0,0 +1,3 @@
|
||||
man_MANS = metacity-theme-viewer.1 metacity-window-demo.1
|
||||
|
||||
EXTRA_DIST = $(man_MANS)
|
43
doc/man/metacity-theme-viewer.1
Normal file
43
doc/man/metacity-theme-viewer.1
Normal file
@@ -0,0 +1,43 @@
|
||||
.\" In .TH, FOO should be all caps, SECTION should be 1-8, maybe w/ subsection
|
||||
.\" other parms are allowed: see man(7), man(1)
|
||||
.\"
|
||||
.\" Based on template provided by Tom Christiansen <tchrist@jhereg.perl.com>.
|
||||
.\"
|
||||
.TH METACITY-THEME-VIEWER 1 "1 June 2004"
|
||||
.SH NAME
|
||||
metacity-theme-viewer \- view metacity themes
|
||||
.SH SYNOPSIS
|
||||
.B metacity-theme-viewer
|
||||
[
|
||||
.I THEMENAME
|
||||
]
|
||||
.SH DESCRIPTION
|
||||
.\" Putting a newline after each sentence can generate better output.
|
||||
.B metacity-theme-viewer
|
||||
allows you to preview any installed Metacity theme.
|
||||
.PP
|
||||
When designing a new Metacity theme, you can use
|
||||
.B metacity-theme-viewer
|
||||
to measure the performance of a window frame option, and to preview
|
||||
the option.
|
||||
.SH OPTIONS
|
||||
.TP
|
||||
.I THEMENAME
|
||||
Name of the theme to be shown (\fIAtlanta\fR by default).
|
||||
It is case-sensitive.
|
||||
.SH FILES
|
||||
.br
|
||||
.nf
|
||||
.TP
|
||||
.I /usr/share/themes
|
||||
system themes directory
|
||||
.TP
|
||||
.I /usr/share/themes/*/metacity-1/metacity-theme-1.xml
|
||||
theme specification file
|
||||
.SH AUTHOR
|
||||
This manual page was written by Jose M. Moya <josem@die.upm.es>, for
|
||||
the Debian GNU/Linux system (but may be used by others).
|
||||
.SH "SEE ALSO"
|
||||
.\" Always quote multiple words for .SH
|
||||
.BR metacity (1),
|
||||
.BR metacity-window-demo (1).
|
25
doc/man/metacity-window-demo.1
Normal file
25
doc/man/metacity-window-demo.1
Normal file
@@ -0,0 +1,25 @@
|
||||
.\" In .TH, FOO should be all caps, SECTION should be 1-8, maybe w/ subsection
|
||||
.\" other parms are allowed: see man(7), man(1)
|
||||
.\"
|
||||
.\" Based on template provided by Tom Christiansen <tchrist@jhereg.perl.com>.
|
||||
.\"
|
||||
.TH METACITY-WINDOW-DEMO 1 "1 June 2004"
|
||||
.SH NAME
|
||||
metacity-window-demo \- demo of window features
|
||||
.SH SYNOPSIS
|
||||
.B metacity-window-demo
|
||||
.SH DESCRIPTION
|
||||
.\" Putting a newline after each sentence can generate better output.
|
||||
This program demonstrates various kinds of windows that window
|
||||
managers and window manager themes should handle.
|
||||
.PP
|
||||
Be sure to tear off the menu and toolbar, those are also a special
|
||||
kind of window.
|
||||
.SH AUTHOR
|
||||
This manual page was written by Jose M. Moya <josem@die.upm.es>, for
|
||||
the Debian GNU/Linux system (but may be used by others).
|
||||
.SH "SEE ALSO"
|
||||
.\" Always quote multiple words for .SH
|
||||
.BR x-window-manager (1),
|
||||
.BR metacity (1),
|
||||
.BR metacity-theme-viewer (1).
|
210
po/ChangeLog
210
po/ChangeLog
@@ -1,3 +1,213 @@
|
||||
2005-02-07 David Lodge <dave@cirt.net>
|
||||
|
||||
* en_GB.po: Updated British translation.
|
||||
|
||||
2005-02-06 Adam Weinberger <adamw@gnome.org>
|
||||
|
||||
* en_CA.po: Updated Canadian English translation.
|
||||
|
||||
2005-02-06 Miloslav Trmac <mitr@volny.cz>
|
||||
|
||||
* cs.po: Updated Czech translation.
|
||||
|
||||
2005-02-06 Alexander Shopov <ash@contact.bg>
|
||||
|
||||
* bg.po: Updated Bulgarian translation by
|
||||
Vladimir Petkov <vpetkov@i-space.org>
|
||||
|
||||
2005-02-06 Pauli Virtanen <pauli.virtanen@hut.fi>
|
||||
|
||||
* fi.po: Updated Finnish translation.
|
||||
|
||||
2005-02-05 Frank Arnold <farnold@cvs.gnome.org>
|
||||
|
||||
* de.po: Updated German translation.
|
||||
|
||||
2005-02-05 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
|
||||
|
||||
* es.po: Updated Spanish translation.
|
||||
|
||||
2005-02-05 Žygimantas Beručka <uid0@akl.lt>
|
||||
|
||||
* lt.po: Updated Lithuanian translation.
|
||||
|
||||
2005-02-04 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
|
||||
|
||||
* es.po: Updated Spanish translation.
|
||||
|
||||
2005-02-04 Changwoo Ryu <cwryu@debian.org>
|
||||
|
||||
* ko.po: Updated Korean translation.
|
||||
|
||||
2005-02-02 Miloslav Trmac <mitr@volny.cz>
|
||||
|
||||
* cs.po: Updated Czech translation.
|
||||
|
||||
2005-02-02 Frank Arnold <farnold@cvs.gnome.org>
|
||||
|
||||
* de.po: Updated German translation.
|
||||
|
||||
2005-02-01 Kjartan Maraas <kmaraas@gnome.org>
|
||||
|
||||
* nb.po: Update
|
||||
* no.po: Update
|
||||
|
||||
2005-02-01 Adam Weinberger <adamw@gnome.org>
|
||||
|
||||
* en_CA.po: Updated Canadian English translation.
|
||||
|
||||
2005-02-01 Žygimantas Beručka <uid0@akl.lt>
|
||||
|
||||
* lt.po: Updated Lithuanian translation.
|
||||
|
||||
2005-01-31 Christian Rose <menthos@menthos.com>
|
||||
|
||||
* sv.po: Updated Swedish translation.
|
||||
|
||||
2005-01-31 Miloslav Trmac <mitr@volny.cz>
|
||||
|
||||
* cs.po: Updated Czech translation.
|
||||
|
||||
2005-01-31 Christian Rose <menthos@menthos.com>
|
||||
|
||||
* sv.po: Updated Swedish translation.
|
||||
|
||||
2005-01-30 Žygimantas Beručka <uid0@akl.lt>
|
||||
|
||||
* lt.po: Updated Lithuanian translation.
|
||||
|
||||
2005-01-29 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
|
||||
|
||||
* es.po: Updated Spanish translation.
|
||||
|
||||
2005-01-29 Miloslav Trmac <mitr@volny.cz>
|
||||
|
||||
* cs.po: Updated Czech translation.
|
||||
|
||||
2005-01-29 Marcel Telka <marcel@telka.sk>
|
||||
|
||||
* sk.po: Updated Slovak translation.
|
||||
|
||||
2005-01-29 Adam Weinberger <adamw@gnome.org>
|
||||
|
||||
* en_CA.po: Updated Canadian English translation.
|
||||
|
||||
2005-01-28 Kjartan Maraas <kmaraas@gnome.org>
|
||||
|
||||
* nb.po: Update
|
||||
* no.po: Update
|
||||
|
||||
2005-01-26 Adam Weinberger <adamw@gnome.org>
|
||||
|
||||
* en_CA.po: Updated Canadian English translation.
|
||||
|
||||
2005-01-26 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
|
||||
|
||||
* es.po: Updated Spanish translation.
|
||||
|
||||
2005-01-26 Duarte Loreto <happyguy_pt@hotmail.com>
|
||||
|
||||
* pt.po: Updated Portuguese translation.
|
||||
|
||||
2005-01-25 Theppitak Karoonboonyanan <thep@linux.thai.net>
|
||||
|
||||
* th.po: Updated Thai translation.
|
||||
|
||||
2005-01-23 Funda Wang <fundawang@linux.net.cn>
|
||||
|
||||
* zh_CN.po: Updated Simplified Chinese translation.
|
||||
|
||||
2005-01-21 Kjartan Maraas <kmaraas@gnome.org>
|
||||
|
||||
* nb.po: Update this too while we're at it.
|
||||
|
||||
2005-01-21 Kjartan Maraas <kmaraas@gnome.org>
|
||||
|
||||
* nn.po: Update
|
||||
|
||||
2005-01-15 Frank Arnold <farnold@cvs.gnome.org>
|
||||
|
||||
* de.po: Updated German translation.
|
||||
|
||||
2005-01-01 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
|
||||
|
||||
* es.po: Updated Spanish translation.
|
||||
|
||||
2004-12-28 Christian Rose <menthos@menthos.com>
|
||||
|
||||
* sv.po: Updated Swedish translation.
|
||||
|
||||
2004-12-25 Miloslav Trmac <mitr@volny.cz>
|
||||
|
||||
* cs.po: Updated Czech translation.
|
||||
|
||||
2004-12-21 Takeshi AIHANA <aihana@gnome.gr.jp>
|
||||
|
||||
* ja.po: Updated Japanese translation.
|
||||
|
||||
2004-12-20 Adam Weinberger <adamw@gnome.org>
|
||||
|
||||
* en_CA.po: Updated Canadian English translation.
|
||||
|
||||
2004-12-16 Alexander Shopov <ash@contact.bg>
|
||||
|
||||
* bg.po: Updated Bulgarian translation by
|
||||
Vladimir Petkov <vpetkov@i-space.org>
|
||||
|
||||
2004-12-07 Martin Willemoes Hansen <mwh@sysrq.dk>
|
||||
|
||||
* da.po: Updated Danish translation.
|
||||
|
||||
2004-11-23 Martin Willemoes Hansen <mwh@sysrq.dk>
|
||||
|
||||
* da.po: Updated Danish translation.
|
||||
|
||||
2004-11-14 Christophe Merlet <redfox@redfoxcenter.org>
|
||||
|
||||
* fr.po: Updated French translation from
|
||||
Baptiste Mille-Mathias <baptiste@mille-mathias.info>.
|
||||
|
||||
2004-11-13 Žygimantas Beručka <uid0@akl.lt>
|
||||
|
||||
* lt.po: Updated Lithuanian translation.
|
||||
|
||||
2004-11-04 Takeshi AIHANA <aihana@gnome.gr.jp>
|
||||
|
||||
* ja.po: Updated Japanese translation.
|
||||
|
||||
2004-10-30 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
|
||||
|
||||
* es.po: Updated Spanish translation.
|
||||
|
||||
2004-10-19 Laurent Dhima <laurenti@alblinux.net>
|
||||
|
||||
* sq.po: Updated Albanian translation.
|
||||
|
||||
2004-10-15 Danilo Šegan <dsegan@gmx.net>
|
||||
|
||||
* sr.po, sr@Latn.po: Updated Serbian translation.
|
||||
|
||||
2004-10-14 Miloslav Trmac <mitr@volny.cz>
|
||||
|
||||
* cs.po: Updated Czech translation.
|
||||
|
||||
2004-10-14 Adam Weinberger <adamw@gnome.org>
|
||||
|
||||
* en_CA.po: Updated Canadian English translation.
|
||||
|
||||
2004-10-13 David Lodge <dave@cirt.net>
|
||||
|
||||
* en_GB.po: Updated British English translation.
|
||||
|
||||
2004-09-26 Adam Weinberger <adamw@gnome.org>
|
||||
|
||||
* en_CA.po: Updated Canadian English translation.
|
||||
|
||||
2004-09-19 Alessio Frusciante <algol@firenze.linux.it>
|
||||
|
||||
* it.po: Updated Italian translation by
|
||||
Luca Ferretti <elle.uca@infinito.it>.
|
||||
|
||||
2004-09-14 Gora Mohanty <gmohanty@cvs.gnome.org>
|
||||
|
||||
* or.po: Updated Oriya translation.
|
||||
|
@@ -19,8 +19,6 @@ src/session.c
|
||||
src/theme-parser.c
|
||||
src/theme-viewer.c
|
||||
src/theme.c
|
||||
src/tools/metacity-properties.desktop.in
|
||||
src/tools/metacity-properties.glade
|
||||
src/util.c
|
||||
src/window-props.c
|
||||
src/window.c
|
||||
|
1109
po/en_CA.po
1109
po/en_CA.po
File diff suppressed because it is too large
Load Diff
2012
po/en_GB.po
2012
po/en_GB.po
File diff suppressed because it is too large
Load Diff
416
po/pt_BR.po
416
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
415
po/sr@Latn.po
415
po/sr@Latn.po
File diff suppressed because it is too large
Load Diff
407
po/zh_CN.po
407
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
414
po/zh_TW.po
414
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
@@ -2,14 +2,27 @@
|
||||
History
|
||||
====
|
||||
|
||||
Focus issues: see doc/how-to-get-focus-right.txt
|
||||
Focus issues:
|
||||
see doc/how-to-get-focus-right.txt
|
||||
|
||||
Keep panel always on top: http://bugzilla.gnome.org/show_bug.cgi?id=81551
|
||||
Edge flipping: http://bugzilla.gnome.org/show_bug.cgi?id=82917
|
||||
Opaque resize: http://bugzilla.gnome.org/show_bug.cgi?id=92618
|
||||
Alt+click to move/resize: http://bugzilla.gnome.org/show_bug.cgi?id=101151
|
||||
minimized windows in Alt+tab: http://bugzilla.gnome.org/show_bug.cgi?id=89416
|
||||
dialogs above entire app group: http://bugzilla.gnome.org/show_bug.cgi?id=88926
|
||||
Keep panel always on top:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=81551
|
||||
|
||||
Edge flipping:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=82917
|
||||
|
||||
Opaque resize:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=92618
|
||||
|
||||
Alt+click to move/resize:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=101151
|
||||
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=80918
|
||||
|
||||
minimized windows in Alt+tab:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=89416
|
||||
|
||||
dialogs above entire app group:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=88926
|
||||
|
||||
display window size/position:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=85213
|
||||
@@ -19,21 +32,31 @@ display window size/position:
|
||||
configure click actions, alt+click:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=83210
|
||||
|
||||
system modal dialogs: http://bugzilla.gnome.org/show_bug.cgi?id=83357
|
||||
system modal dialogs:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=83357
|
||||
|
||||
workspace wrapping: http://bugzilla.gnome.org/show_bug.cgi?id=89315
|
||||
workspace wrapping:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=89315
|
||||
|
||||
raise windows on click:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=86108
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=115072
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=115753
|
||||
|
||||
|
||||
Tracking bugs
|
||||
====
|
||||
|
||||
session management: http://bugzilla.gnome.org/show_bug.cgi?id=107063
|
||||
|
||||
revise theme format: http://bugzilla.gnome.org/show_bug.cgi?id=102547
|
||||
|
||||
bugs in focus-stealing-prevention:
|
||||
http://bugzilla.gnome.org/show_bug.cgi?id=149028
|
||||
revise theme format: http://bugzilla.gnome.org/show_bug.cgi?id=102547
|
||||
session management: http://bugzilla.gnome.org/show_bug.cgi?id=107063
|
||||
focus-stealing-prevention: http://bugzilla.gnome.org/show_bug.cgi?id=149028
|
||||
other focus bugs: http://bugzilla.gnome.org/show_bug.cgi?id=155450
|
||||
drag-and-drop: http://bugzilla.gnome.org/show_bug.cgi?id=155451
|
||||
raising/stacking: http://bugzilla.gnome.org/show_bug.cgi?id=155452
|
||||
tasklist/workspace switcher: http://bugzilla.gnome.org/show_bug.cgi?id=155453
|
||||
window/workspace selection: http://bugzilla.gnome.org/show_bug.cgi?id=155456
|
||||
key/mouse-binding actions: http://bugzilla.gnome.org/show_bug.cgi?id=155457
|
||||
moving/resizing (constraints): http://bugzilla.gnome.org/show_bug.cgi?id=155458
|
||||
window placement: http://bugzilla.gnome.org/show_bug.cgi?id=155460
|
||||
logout/system-monitor keys: http://bugzilla.gnome.org/show_bug.cgi?id=155462
|
||||
modal dialogs: http://bugzilla.gnome.org/show_bug.cgi?id=164841
|
||||
|
@@ -90,6 +90,9 @@ metacity_SOURCES= \
|
||||
xprops.h \
|
||||
$(EGGFILES)
|
||||
|
||||
# by setting libmetacity_private_la_CFLAGS, the files shared with
|
||||
# metacity proper will be compiled with different names.
|
||||
libmetacity_private_la_CFLAGS =
|
||||
libmetacity_private_la_SOURCES= \
|
||||
gradient.c \
|
||||
gradient.h \
|
||||
@@ -152,7 +155,7 @@ schema_DATA = $(schema_in_files:.schemas.in=.schemas)
|
||||
|
||||
if GCONF_SCHEMAS_INSTALL
|
||||
install-data-local:
|
||||
GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(srcdir)/$(schema_DATA)
|
||||
GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(schema_DATA)
|
||||
else
|
||||
install-data-local:
|
||||
endif
|
||||
@@ -164,7 +167,7 @@ VARIABLES=default_icon_data $(srcdir)/default_icon.png \
|
||||
stock_delete_data $(srcdir)/stock_delete.png
|
||||
|
||||
BUILT_SOURCES = inlinepixbufs.h
|
||||
CLEANFILES = inlinepixbufs.h
|
||||
CLEANFILES = inlinepixbufs.h metacity.desktop metacity.schemas
|
||||
|
||||
inlinepixbufs.h: $(IMAGES)
|
||||
$(GDK_PIXBUF_CSOURCE) --raw --build-list $(VARIABLES) >$(srcdir)/inlinepixbufs.h
|
||||
|
@@ -34,7 +34,7 @@ meta_bell_flash_screen (MetaDisplay *display,
|
||||
|
||||
if (screen->flash_window == None)
|
||||
{
|
||||
Visual *visual = CopyFromParent;
|
||||
Visual *visual = (Visual *)CopyFromParent;
|
||||
XSetWindowAttributes xswa;
|
||||
int depth = CopyFromParent;
|
||||
xswa.save_under = True;
|
||||
|
@@ -100,7 +100,7 @@ struct MetaCompositor
|
||||
guint have_composite : 1;
|
||||
guint have_damage : 1;
|
||||
guint have_fixes : 1;
|
||||
#if HAVE_NAME_WINDOW_PIXMAP
|
||||
#ifdef HAVE_NAME_WINDOW_PIXMAP
|
||||
guint have_name_window_pixmap : 1;
|
||||
#endif
|
||||
};
|
||||
|
37
src/core.c
37
src/core.c
@@ -236,8 +236,9 @@ meta_core_user_raise (Display *xdisplay,
|
||||
}
|
||||
|
||||
void
|
||||
meta_core_user_lower (Display *xdisplay,
|
||||
Window frame_xwindow)
|
||||
meta_core_user_lower_and_unfocus (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
Time timestamp)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
MetaWindow *window;
|
||||
@@ -249,6 +250,38 @@ meta_core_user_lower (Display *xdisplay,
|
||||
meta_bug ("No such frame window 0x%lx!\n", frame_xwindow);
|
||||
|
||||
meta_window_lower (window);
|
||||
|
||||
if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK)
|
||||
{
|
||||
/* Move window to the back of the focusing workspace's MRU list.
|
||||
* Do extra sanity checks to avoid possible race conditions.
|
||||
* (Borrowed from window.c.)
|
||||
*/
|
||||
if (window->screen->active_workspace &&
|
||||
meta_window_located_on_workspace (window,
|
||||
window->screen->active_workspace))
|
||||
{
|
||||
GList* link;
|
||||
link = g_list_find (window->screen->active_workspace->mru_list,
|
||||
window);
|
||||
g_assert (link);
|
||||
|
||||
window->screen->active_workspace->mru_list =
|
||||
g_list_remove_link (window->screen->active_workspace->mru_list,
|
||||
link);
|
||||
g_list_free (link);
|
||||
|
||||
window->screen->active_workspace->mru_list =
|
||||
g_list_append (window->screen->active_workspace->mru_list,
|
||||
window);
|
||||
}
|
||||
}
|
||||
|
||||
/* focus the default window, if needed */
|
||||
if (window->has_focus)
|
||||
meta_workspace_focus_default_window (window->screen->active_workspace,
|
||||
NULL,
|
||||
timestamp);
|
||||
}
|
||||
|
||||
void
|
||||
|
@@ -60,8 +60,9 @@ void meta_core_user_resize (Display *xdisplay,
|
||||
|
||||
void meta_core_user_raise (Display *xdisplay,
|
||||
Window frame_xwindow);
|
||||
void meta_core_user_lower (Display *xdisplay,
|
||||
Window frame_xwindow);
|
||||
void meta_core_user_lower_and_unfocus (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
Time timestamp);
|
||||
|
||||
void meta_core_user_focus (Display *xdisplay,
|
||||
Window frame_xwindow,
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 424 B After Width: | Height: | Size: 1.2 KiB |
356
src/display.c
356
src/display.c
@@ -63,6 +63,12 @@
|
||||
|
||||
#define USE_GDK_DISPLAY
|
||||
|
||||
#define GRAB_OP_IS_WINDOW_SWITCH(g) \
|
||||
(g == META_GRAB_OP_KEYBOARD_TABBING_NORMAL || \
|
||||
g == META_GRAB_OP_KEYBOARD_TABBING_DOCK || \
|
||||
g == META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL || \
|
||||
g == META_GRAB_OP_KEYBOARD_ESCAPING_DOCK)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
MetaDisplay *display;
|
||||
@@ -289,7 +295,8 @@ meta_display_open (const char *name)
|
||||
"_NET_RESTACK_WINDOW",
|
||||
"_NET_MOVERESIZE_WINDOW",
|
||||
"_NET_DESKTOP_GEOMETRY",
|
||||
"_NET_DESKTOP_VIEWPORT"
|
||||
"_NET_DESKTOP_VIEWPORT",
|
||||
"_METACITY_VERSION"
|
||||
};
|
||||
Atom atoms[G_N_ELEMENTS(atom_names)];
|
||||
|
||||
@@ -328,6 +335,7 @@ meta_display_open (const char *name)
|
||||
|
||||
display->pending_pings = NULL;
|
||||
display->autoraise_timeout_id = 0;
|
||||
display->autoraise_window = NULL;
|
||||
display->focus_window = NULL;
|
||||
display->expected_focus_window = NULL;
|
||||
|
||||
@@ -442,6 +450,7 @@ meta_display_open (const char *name)
|
||||
display->atom_net_moveresize_window = atoms[88];
|
||||
display->atom_net_desktop_geometry = atoms[89];
|
||||
display->atom_net_desktop_viewport = atoms[90];
|
||||
display->atom_metacity_version = atoms[91];
|
||||
|
||||
display->prop_hooks = NULL;
|
||||
meta_display_init_window_prop_hooks (display);
|
||||
@@ -500,6 +509,9 @@ meta_display_open (const char *name)
|
||||
|
||||
display->current_time = CurrentTime;
|
||||
display->sentinel_counter = 0;
|
||||
|
||||
display->grab_resize_timeout_id = 0;
|
||||
display->grab_have_keyboard = FALSE;
|
||||
|
||||
display->grab_op = META_GRAB_OP_NONE;
|
||||
display->grab_wireframe_active = FALSE;
|
||||
@@ -612,6 +624,11 @@ meta_display_open (const char *name)
|
||||
display->atom_net_wm_name,
|
||||
"Metacity");
|
||||
|
||||
set_utf8_string_hint (display,
|
||||
display->leader_window,
|
||||
display->atom_metacity_version,
|
||||
VERSION);
|
||||
|
||||
data[0] = display->leader_window;
|
||||
XChangeProperty (display->xdisplay,
|
||||
display->leader_window,
|
||||
@@ -627,6 +644,7 @@ meta_display_open (const char *name)
|
||||
timestamp = event.xproperty.time;
|
||||
}
|
||||
|
||||
display->last_focus_time = timestamp;
|
||||
display->compositor = meta_compositor_new (display);
|
||||
|
||||
screens = NULL;
|
||||
@@ -671,20 +689,28 @@ meta_display_open (const char *name)
|
||||
/* kinda bogus because GetInputFocus has no possible errors */
|
||||
meta_error_trap_push (display);
|
||||
|
||||
/* FIXME: This is totally broken; see comment 9 of bug 88194 about this */
|
||||
focus = None;
|
||||
ret_to = RevertToPointerRoot;
|
||||
XGetInputFocus (display->xdisplay, &focus, &ret_to);
|
||||
|
||||
/* Force a new FocusIn (does this work?) */
|
||||
if (focus == None || focus == PointerRoot)
|
||||
focus = display->no_focus_window;
|
||||
|
||||
/* Use the same timestamp that was passed to meta_screen_new(),
|
||||
* as it is the most recent timestamp.
|
||||
*/
|
||||
XSetInputFocus (display->xdisplay, focus, RevertToPointerRoot,
|
||||
timestamp);
|
||||
|
||||
if (focus == None || focus == PointerRoot)
|
||||
meta_display_focus_the_no_focus_window (display, timestamp);
|
||||
else
|
||||
{
|
||||
MetaWindow * window;
|
||||
window = meta_display_lookup_x_window (display, focus);
|
||||
if (window)
|
||||
meta_display_set_input_focus_window (display, window, FALSE, timestamp);
|
||||
else
|
||||
meta_display_focus_the_no_focus_window (display, timestamp);
|
||||
}
|
||||
|
||||
meta_error_trap_pop (display, FALSE);
|
||||
}
|
||||
|
||||
@@ -776,11 +802,10 @@ meta_display_close (MetaDisplay *display)
|
||||
|
||||
meta_prefs_remove_listener (prefs_changed_callback, display);
|
||||
|
||||
if (display->autoraise_timeout_id != 0)
|
||||
{
|
||||
g_source_remove (display->autoraise_timeout_id);
|
||||
display->autoraise_timeout_id = 0;
|
||||
}
|
||||
meta_display_remove_autoraise_callback (display);
|
||||
|
||||
if (display->grab_old_window_stacking)
|
||||
g_list_free (display->grab_old_window_stacking);
|
||||
|
||||
#ifdef USE_GDK_DISPLAY
|
||||
/* Stop caring about events */
|
||||
@@ -1095,6 +1120,35 @@ meta_display_get_current_time (MetaDisplay *display)
|
||||
return display->current_time;
|
||||
}
|
||||
|
||||
/* Get a timestamp, even if it means a roundtrip */
|
||||
guint32
|
||||
meta_display_get_current_time_roundtrip (MetaDisplay *display)
|
||||
{
|
||||
guint32 timestamp;
|
||||
|
||||
timestamp = meta_display_get_current_time (display);
|
||||
if (timestamp == CurrentTime)
|
||||
{
|
||||
XEvent property_event;
|
||||
|
||||
/* Using the property XA_PRIMARY because it's safe; nothing
|
||||
* would use it as a property. The type doesn't matter.
|
||||
*/
|
||||
XChangeProperty (display->xdisplay,
|
||||
display->leader_window,
|
||||
XA_PRIMARY, XA_STRING, 8,
|
||||
PropModeAppend, NULL, 0);
|
||||
XWindowEvent (display->xdisplay,
|
||||
display->leader_window,
|
||||
PropertyChangeMask,
|
||||
&property_event);
|
||||
|
||||
timestamp = property_event.xproperty.time;
|
||||
}
|
||||
|
||||
return timestamp;
|
||||
}
|
||||
|
||||
static void
|
||||
add_ignored_serial (MetaDisplay *display,
|
||||
unsigned long serial)
|
||||
@@ -1160,6 +1214,7 @@ window_raise_with_delay_callback (void *data)
|
||||
auto_raise->xwindow);
|
||||
|
||||
auto_raise->display->autoraise_timeout_id = 0;
|
||||
auto_raise->display->autoraise_window = NULL;
|
||||
|
||||
window = meta_display_lookup_x_window (auto_raise->display,
|
||||
auto_raise->xwindow);
|
||||
@@ -1196,6 +1251,33 @@ window_raise_with_delay_callback (void *data)
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
void
|
||||
meta_display_queue_autoraise_callback (MetaDisplay *display,
|
||||
MetaWindow *window)
|
||||
{
|
||||
MetaAutoRaiseData *auto_raise_data;
|
||||
|
||||
meta_topic (META_DEBUG_FOCUS,
|
||||
"Queuing an autoraise timeout for %s with delay %d\n",
|
||||
window->desc,
|
||||
meta_prefs_get_auto_raise_delay ());
|
||||
|
||||
auto_raise_data = g_new (MetaAutoRaiseData, 1);
|
||||
auto_raise_data->display = window->display;
|
||||
auto_raise_data->xwindow = window->xwindow;
|
||||
|
||||
if (display->autoraise_timeout_id != 0)
|
||||
g_source_remove (display->autoraise_timeout_id);
|
||||
|
||||
display->autoraise_timeout_id =
|
||||
g_timeout_add_full (G_PRIORITY_DEFAULT,
|
||||
meta_prefs_get_auto_raise_delay (),
|
||||
window_raise_with_delay_callback,
|
||||
auto_raise_data,
|
||||
g_free);
|
||||
display->autoraise_window = window;
|
||||
}
|
||||
|
||||
static int
|
||||
double_click_timeout_for_event (MetaDisplay *display,
|
||||
XEvent *event)
|
||||
@@ -1508,6 +1590,16 @@ event_callback (XEvent *event,
|
||||
(display->grab_window ?
|
||||
display->grab_window->desc :
|
||||
"none"));
|
||||
if (GRAB_OP_IS_WINDOW_SWITCH (display->grab_op))
|
||||
{
|
||||
MetaScreen *screen;
|
||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||
"Syncing to old stack positions.\n");
|
||||
screen =
|
||||
meta_display_screen_for_root (display, event->xany.window);
|
||||
meta_stack_set_positions (screen->stack,
|
||||
display->grab_old_window_stacking);
|
||||
}
|
||||
meta_display_end_grab_op (display,
|
||||
event->xbutton.time);
|
||||
}
|
||||
@@ -1531,32 +1623,32 @@ event_callback (XEvent *event,
|
||||
if (unmodified ||
|
||||
event->xbutton.button == 1)
|
||||
{
|
||||
/* don't focus if frame received, will be lowered in
|
||||
* frames.c or special-cased if the click was on a
|
||||
* minimize/close button.
|
||||
*/
|
||||
if (!frame_was_receiver)
|
||||
{
|
||||
/* don't focus if frame received, will be lowered in
|
||||
* frames.c or special-cased if the click was on a
|
||||
* minimize/close button.
|
||||
*/
|
||||
|
||||
/* Raise on clicking the client area always or only
|
||||
* in click to focus mode? The debate rages.
|
||||
* Feel free to change TRUE to FALSE or vice versa
|
||||
*/
|
||||
if (TRUE /* meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK */)
|
||||
meta_window_raise (window);
|
||||
else
|
||||
meta_topic (META_DEBUG_FOCUS,
|
||||
"Not raising window on click due to mouse/sloppy focus mode\n");
|
||||
|
||||
/* Don't focus panels--they must explicitly request focus.
|
||||
* See bug 160470
|
||||
*/
|
||||
if (window->type != META_WINDOW_DOCK)
|
||||
{
|
||||
meta_window_raise (window);
|
||||
|
||||
meta_topic (META_DEBUG_FOCUS,
|
||||
"Focusing %s due to unmodified button %d press (display.c)\n",
|
||||
window->desc, event->xbutton.button);
|
||||
meta_window_focus (window, event->xbutton.time);
|
||||
}
|
||||
else
|
||||
{
|
||||
meta_topic (META_DEBUG_FOCUS,
|
||||
"Not raising window on click due to mouse/sloppy focus mode\n");
|
||||
meta_window_focus (window, event->xbutton.time);
|
||||
}
|
||||
}
|
||||
|
||||
/* you can move on alt-click but not on
|
||||
@@ -1676,6 +1768,8 @@ event_callback (XEvent *event,
|
||||
meta_window_handle_mouse_grab_op_event (window, event);
|
||||
/* do this even if window->has_focus to avoid races */
|
||||
else if (window && !serial_is_ignored (display, event->xany.serial) &&
|
||||
event->xcrossing.mode != NotifyGrab &&
|
||||
event->xcrossing.mode != NotifyUngrab &&
|
||||
event->xcrossing.detail != NotifyInferior &&
|
||||
meta_display_focus_sentinel_clear (display))
|
||||
{
|
||||
@@ -1697,26 +1791,7 @@ event_callback (XEvent *event,
|
||||
|
||||
if (meta_prefs_get_auto_raise ())
|
||||
{
|
||||
MetaAutoRaiseData *auto_raise_data;
|
||||
|
||||
meta_topic (META_DEBUG_FOCUS,
|
||||
"Queuing an autoraise timeout for %s with delay %d\n",
|
||||
window->desc,
|
||||
meta_prefs_get_auto_raise_delay ());
|
||||
|
||||
auto_raise_data = g_new (MetaAutoRaiseData, 1);
|
||||
auto_raise_data->display = window->display;
|
||||
auto_raise_data->xwindow = window->xwindow;
|
||||
|
||||
if (display->autoraise_timeout_id != 0)
|
||||
g_source_remove (display->autoraise_timeout_id);
|
||||
|
||||
display->autoraise_timeout_id =
|
||||
g_timeout_add_full (G_PRIORITY_DEFAULT,
|
||||
meta_prefs_get_auto_raise_delay (),
|
||||
window_raise_with_delay_callback,
|
||||
auto_raise_data,
|
||||
g_free);
|
||||
meta_display_queue_autoraise_callback (display, window);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -1743,7 +1818,7 @@ event_callback (XEvent *event,
|
||||
switch (meta_prefs_get_focus_mode ())
|
||||
{
|
||||
case META_FOCUS_MODE_MOUSE:
|
||||
if (window->has_focus &&
|
||||
if (window == display->expected_focus_window &&
|
||||
(window->frame == NULL || frame_was_receiver) &&
|
||||
event->xcrossing.mode != NotifyGrab &&
|
||||
event->xcrossing.mode != NotifyUngrab &&
|
||||
@@ -1751,10 +1826,8 @@ event_callback (XEvent *event,
|
||||
{
|
||||
meta_verbose ("Unsetting focus from %s due to LeaveNotify\n",
|
||||
window->desc);
|
||||
XSetInputFocus (display->xdisplay,
|
||||
display->no_focus_window,
|
||||
RevertToPointerRoot,
|
||||
event->xcrossing.time);
|
||||
meta_display_focus_the_no_focus_window (display,
|
||||
event->xcrossing.time);
|
||||
}
|
||||
break;
|
||||
case META_FOCUS_MODE_SLOPPY:
|
||||
@@ -1790,6 +1863,9 @@ event_callback (XEvent *event,
|
||||
else if (meta_display_screen_for_root (display,
|
||||
event->xany.window) != NULL)
|
||||
{
|
||||
MetaScreen * screen;
|
||||
screen = meta_display_screen_for_root (display, event->xany.window);
|
||||
|
||||
meta_topic (META_DEBUG_FOCUS,
|
||||
"Focus %s event received on root window 0x%lx "
|
||||
"mode %s detail %s\n",
|
||||
@@ -1803,29 +1879,20 @@ event_callback (XEvent *event,
|
||||
if (event->type == FocusIn &&
|
||||
event->xfocus.detail == NotifyDetailNone)
|
||||
{
|
||||
XEvent property_event;
|
||||
meta_topic (META_DEBUG_FOCUS,
|
||||
"Focus got set to None, probably due to brain-damage in the X protocol (see bug 125492). Setting the default focus window.\n");
|
||||
|
||||
/* FIXME _() gettextify on HEAD */
|
||||
meta_warning ("Working around an application which called XSetInputFocus (None) or with RevertToNone instead of RevertToPointerRoot, this is a minor bug in some application. If you can figure out which application causes this please report it as a bug against that application.\n");
|
||||
|
||||
/* Fix the problem */
|
||||
/* Using the property XA_PRIMARY because it's safe;
|
||||
* nothing would use it as a property. The type
|
||||
* doesn't matter.
|
||||
*/
|
||||
XChangeProperty (display->xdisplay,
|
||||
display->leader_window,
|
||||
XA_PRIMARY, XA_STRING, 8,
|
||||
PropModeAppend, NULL, 0);
|
||||
XWindowEvent (display->xdisplay,
|
||||
display->leader_window,
|
||||
PropertyChangeMask,
|
||||
&property_event);
|
||||
XSetInputFocus (display->xdisplay,
|
||||
display->no_focus_window,
|
||||
RevertToPointerRoot,
|
||||
property_event.xproperty.time);
|
||||
meta_workspace_focus_default_window (screen->active_workspace, NULL, meta_display_get_current_time_roundtrip (display));
|
||||
}
|
||||
else if (event->type == FocusIn &&
|
||||
event->xfocus.mode == NotifyNormal &&
|
||||
event->xfocus.detail == NotifyInferior)
|
||||
{
|
||||
meta_topic (META_DEBUG_FOCUS,
|
||||
"Focus got set to root window, probably due to gnome-session logout dialog usage (see bug 153220). Setting the default focus window.\n");
|
||||
meta_workspace_focus_default_window (screen->active_workspace, NULL, meta_display_get_current_time_roundtrip (display));
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
case KeymapNotify:
|
||||
@@ -1867,7 +1934,8 @@ event_callback (XEvent *event,
|
||||
if (window)
|
||||
{
|
||||
if (display->grab_op != META_GRAB_OP_NONE &&
|
||||
display->grab_window == window)
|
||||
display->grab_window == window &&
|
||||
((window->frame == NULL) || !window->frame->mapped))
|
||||
meta_display_end_grab_op (display, CurrentTime);
|
||||
|
||||
if (!frame_was_receiver)
|
||||
@@ -1914,8 +1982,7 @@ event_callback (XEvent *event,
|
||||
if (window->minimized)
|
||||
{
|
||||
meta_window_unminimize (window);
|
||||
if (!meta_workspace_contains_window (window->screen->active_workspace,
|
||||
window))
|
||||
if (window->workspace != window->screen->active_workspace)
|
||||
{
|
||||
meta_verbose ("Changing workspace due to MapRequest mapped = %d minimized = %d\n",
|
||||
window->mapped, window->minimized);
|
||||
@@ -2094,15 +2161,7 @@ event_callback (XEvent *event,
|
||||
space);
|
||||
|
||||
if (workspace)
|
||||
{
|
||||
if (workspace != screen->active_workspace)
|
||||
{
|
||||
meta_workspace_activate (workspace);
|
||||
meta_workspace_focus_default_window (workspace, NULL);
|
||||
}
|
||||
else
|
||||
meta_verbose ("Workspace %d already active.\n", space);
|
||||
}
|
||||
meta_workspace_activate (workspace, meta_display_get_current_time_roundtrip (display));
|
||||
else
|
||||
meta_verbose ("Don't know about workspace %d\n", space);
|
||||
}
|
||||
@@ -2127,11 +2186,11 @@ event_callback (XEvent *event,
|
||||
meta_verbose ("Request to %s desktop\n", showing_desktop ? "show" : "hide");
|
||||
|
||||
if (showing_desktop)
|
||||
meta_screen_show_desktop (screen);
|
||||
meta_screen_show_desktop (screen, meta_display_get_current_time_roundtrip (display));
|
||||
else
|
||||
{
|
||||
meta_screen_unshow_desktop (screen);
|
||||
meta_workspace_focus_default_window (screen->active_workspace, NULL);
|
||||
meta_workspace_focus_default_window (screen->active_workspace, NULL, meta_display_get_current_time_roundtrip (display));
|
||||
}
|
||||
}
|
||||
else if (event->xclient.message_type ==
|
||||
@@ -3148,6 +3207,7 @@ meta_display_begin_grab_op (MetaDisplay *display,
|
||||
display->grab_last_moveresize_time.tv_sec = 0;
|
||||
display->grab_last_moveresize_time.tv_usec = 0;
|
||||
display->grab_motion_notify_time = 0;
|
||||
display->grab_old_window_stacking = NULL;
|
||||
#ifdef HAVE_XSYNC
|
||||
display->grab_sync_request_alarm = None;
|
||||
#endif
|
||||
@@ -3168,7 +3228,7 @@ meta_display_begin_grab_op (MetaDisplay *display,
|
||||
display->grab_anchor_window_pos = display->grab_initial_window_pos;
|
||||
|
||||
display->grab_wireframe_active =
|
||||
meta_prefs_get_reduced_resources () &&
|
||||
(meta_prefs_get_reduced_resources () && !meta_prefs_get_gnome_accessibility ()) &&
|
||||
(meta_grab_op_is_resizing (display->grab_op) ||
|
||||
meta_grab_op_is_moving (display->grab_op));
|
||||
|
||||
@@ -3256,6 +3316,16 @@ meta_display_begin_grab_op (MetaDisplay *display,
|
||||
g_assert (display->grab_window != NULL || display->grab_screen != NULL);
|
||||
g_assert (display->grab_op != META_GRAB_OP_NONE);
|
||||
|
||||
/* Save the old stacking */
|
||||
if (GRAB_OP_IS_WINDOW_SWITCH (display->grab_op))
|
||||
{
|
||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||
"Saving old stack positions; old pointer was %p.\n",
|
||||
display->grab_old_window_stacking);
|
||||
display->grab_old_window_stacking =
|
||||
meta_stack_get_positions (screen->stack);
|
||||
}
|
||||
|
||||
/* Do this last, after everything is set up. */
|
||||
switch (op)
|
||||
{
|
||||
@@ -3307,10 +3377,7 @@ meta_display_end_grab_op (MetaDisplay *display,
|
||||
if (display->grab_window != NULL)
|
||||
display->grab_window->shaken_loose = FALSE;
|
||||
|
||||
if (display->grab_op == META_GRAB_OP_KEYBOARD_TABBING_NORMAL ||
|
||||
display->grab_op == META_GRAB_OP_KEYBOARD_TABBING_DOCK ||
|
||||
display->grab_op == META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL ||
|
||||
display->grab_op == META_GRAB_OP_KEYBOARD_ESCAPING_DOCK ||
|
||||
if (GRAB_OP_IS_WINDOW_SWITCH (display->grab_op) ||
|
||||
display->grab_op == META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING)
|
||||
{
|
||||
meta_ui_tab_popup_free (display->grab_screen->tab_popup);
|
||||
@@ -3322,6 +3389,15 @@ meta_display_end_grab_op (MetaDisplay *display,
|
||||
display->ungrab_should_not_cause_focus_window = display->grab_xwindow;
|
||||
}
|
||||
|
||||
if (display->grab_old_window_stacking != NULL)
|
||||
{
|
||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||
"Clearing out the old stack position, which was %p.\n",
|
||||
display->grab_old_window_stacking);
|
||||
g_list_free (display->grab_old_window_stacking);
|
||||
display->grab_old_window_stacking = NULL;
|
||||
}
|
||||
|
||||
if (display->grab_wireframe_active)
|
||||
{
|
||||
display->grab_wireframe_active = FALSE;
|
||||
@@ -3902,16 +3978,20 @@ meta_display_window_has_pending_pings (MetaDisplay *display,
|
||||
static MetaWindow*
|
||||
find_tab_forward (MetaDisplay *display,
|
||||
MetaTabList type,
|
||||
MetaScreen *screen,
|
||||
MetaScreen *screen,
|
||||
MetaWorkspace *workspace,
|
||||
GList *start)
|
||||
GList *start,
|
||||
gboolean skip_first)
|
||||
{
|
||||
GList *tmp;
|
||||
|
||||
g_return_val_if_fail (start != NULL, NULL);
|
||||
g_return_val_if_fail (workspace != NULL, NULL);
|
||||
|
||||
tmp = start->next;
|
||||
tmp = start;
|
||||
if (skip_first)
|
||||
tmp = tmp->next;
|
||||
|
||||
while (tmp != NULL)
|
||||
{
|
||||
MetaWindow *window = tmp->data;
|
||||
@@ -3940,16 +4020,19 @@ find_tab_forward (MetaDisplay *display,
|
||||
static MetaWindow*
|
||||
find_tab_backward (MetaDisplay *display,
|
||||
MetaTabList type,
|
||||
MetaScreen *screen,
|
||||
MetaScreen *screen,
|
||||
MetaWorkspace *workspace,
|
||||
GList *start)
|
||||
GList *start,
|
||||
gboolean skip_last)
|
||||
{
|
||||
GList *tmp;
|
||||
|
||||
g_return_val_if_fail (start != NULL, NULL);
|
||||
g_return_val_if_fail (workspace != NULL, NULL);
|
||||
|
||||
tmp = start->prev;
|
||||
|
||||
tmp = start;
|
||||
if (skip_last)
|
||||
tmp = tmp->prev;
|
||||
while (tmp != NULL)
|
||||
{
|
||||
MetaWindow *window = tmp->data;
|
||||
@@ -4036,6 +4119,7 @@ meta_display_get_tab_next (MetaDisplay *display,
|
||||
MetaWindow *window,
|
||||
gboolean backward)
|
||||
{
|
||||
gboolean skip;
|
||||
GList *tab_list;
|
||||
tab_list = meta_display_get_tab_list(display,
|
||||
type,
|
||||
@@ -4052,19 +4136,23 @@ meta_display_get_tab_next (MetaDisplay *display,
|
||||
if (backward)
|
||||
return find_tab_backward (display, type, screen, workspace,
|
||||
g_list_find (tab_list,
|
||||
window));
|
||||
window),
|
||||
TRUE);
|
||||
else
|
||||
return find_tab_forward (display, type, screen, workspace,
|
||||
g_list_find (tab_list,
|
||||
window));
|
||||
window),
|
||||
TRUE);
|
||||
}
|
||||
|
||||
|
||||
skip = display->focus_window != NULL &&
|
||||
IN_TAB_CHAIN (display->focus_window, type);
|
||||
if (backward)
|
||||
return find_tab_backward (display, type, screen, workspace,
|
||||
tab_list);
|
||||
tab_list, skip);
|
||||
else
|
||||
return find_tab_forward (display, type, screen, workspace,
|
||||
tab_list);
|
||||
tab_list, skip);
|
||||
|
||||
g_list_free (tab_list);
|
||||
}
|
||||
@@ -4083,7 +4171,7 @@ meta_display_get_tab_current (MetaDisplay *display,
|
||||
window->screen == screen &&
|
||||
IN_TAB_CHAIN (window, type) &&
|
||||
(workspace == NULL ||
|
||||
meta_window_visible_on_workspace (window, workspace)))
|
||||
meta_window_located_on_workspace (window, workspace)))
|
||||
return window;
|
||||
else
|
||||
return NULL;
|
||||
@@ -4559,3 +4647,67 @@ meta_display_focus_sentinel_clear (MetaDisplay *display)
|
||||
{
|
||||
return (display->sentinel_counter == 0);
|
||||
}
|
||||
|
||||
void
|
||||
meta_display_set_input_focus_window (MetaDisplay *display,
|
||||
MetaWindow *window,
|
||||
gboolean focus_frame,
|
||||
Time timestamp)
|
||||
{
|
||||
if (timestamp == CurrentTime)
|
||||
{
|
||||
meta_warning ("meta_display_set_input_focus_window called with a "
|
||||
"timestamp of 0 for window %s. This shouldn't happen!\n",
|
||||
window->desc);
|
||||
meta_print_backtrace ();
|
||||
}
|
||||
else if (XSERVER_TIME_IS_BEFORE (timestamp, display->last_focus_time))
|
||||
return;
|
||||
|
||||
XSetInputFocus (display->xdisplay,
|
||||
focus_frame ? window->frame->xwindow : window->xwindow,
|
||||
RevertToPointerRoot,
|
||||
timestamp);
|
||||
display->expected_focus_window = window;
|
||||
display->last_focus_time = timestamp;
|
||||
|
||||
if (window != display->autoraise_window)
|
||||
meta_display_remove_autoraise_callback (window->display);
|
||||
}
|
||||
|
||||
void
|
||||
meta_display_focus_the_no_focus_window (MetaDisplay *display,
|
||||
Time timestamp)
|
||||
{
|
||||
if (timestamp == CurrentTime)
|
||||
{
|
||||
meta_warning ("meta_display_focus_the_no_focus_window called with a "
|
||||
"timestamp of 0. This shouldn't happen!\n");
|
||||
meta_print_backtrace ();
|
||||
}
|
||||
else if (XSERVER_TIME_IS_BEFORE (timestamp, display->last_focus_time))
|
||||
{
|
||||
meta_warning ("Ignoring focus request for no_focus_window since %lu is less than %lu.\n", timestamp, display->last_focus_time);
|
||||
return;
|
||||
}
|
||||
|
||||
XSetInputFocus (display->xdisplay,
|
||||
display->no_focus_window,
|
||||
RevertToPointerRoot,
|
||||
timestamp);
|
||||
display->expected_focus_window = NULL;
|
||||
display->last_focus_time = timestamp;
|
||||
|
||||
meta_display_remove_autoraise_callback (display);
|
||||
}
|
||||
|
||||
void
|
||||
meta_display_remove_autoraise_callback (MetaDisplay *display)
|
||||
{
|
||||
if (display->autoraise_timeout_id != 0)
|
||||
{
|
||||
g_source_remove (display->autoraise_timeout_id);
|
||||
display->autoraise_timeout_id = 0;
|
||||
display->autoraise_window = NULL;
|
||||
}
|
||||
}
|
||||
|
@@ -182,16 +182,25 @@ struct _MetaDisplay
|
||||
Atom atom_net_moveresize_window;
|
||||
Atom atom_net_desktop_geometry;
|
||||
Atom atom_net_desktop_viewport;
|
||||
Atom atom_metacity_version;
|
||||
|
||||
/* This is the actual window from focus events,
|
||||
* not the one we last set
|
||||
*/
|
||||
MetaWindow *focus_window;
|
||||
|
||||
/* window we are expecting a FocusIn event for
|
||||
/* 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.
|
||||
*/
|
||||
MetaWindow *expected_focus_window;
|
||||
|
||||
/* last timestamp that a window was focused */
|
||||
Time last_focus_time;
|
||||
|
||||
guint static_gravity_works : 1;
|
||||
|
||||
/*< private-ish >*/
|
||||
@@ -229,6 +238,7 @@ struct _MetaDisplay
|
||||
|
||||
/* Pending autoraise */
|
||||
guint autoraise_timeout_id;
|
||||
MetaWindow* autoraise_window;
|
||||
|
||||
/* Alt+click button grabs */
|
||||
unsigned int window_grab_modifiers;
|
||||
@@ -256,6 +266,7 @@ struct _MetaDisplay
|
||||
MetaResizePopup *grab_resize_popup;
|
||||
GTimeVal grab_last_moveresize_time;
|
||||
Time grab_motion_notify_time;
|
||||
GList* grab_old_window_stacking;
|
||||
|
||||
/* we use property updates as sentinels for certain window focus events
|
||||
* to avoid some race conditions on EnterNotify events
|
||||
@@ -345,6 +356,18 @@ struct _MetaDisplay
|
||||
#endif
|
||||
};
|
||||
|
||||
/* 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
|
||||
* for the fact that wraparound can occur.
|
||||
*/
|
||||
#define XSERVER_TIME_IS_BEFORE(time1, time2) \
|
||||
( (( time1 < time2 ) && ( time2 - time1 < ((guint32)-1)/2 )) || \
|
||||
(( time1 > time2 ) && ( time1 - time2 > ((guint32)-1)/2 )) \
|
||||
)
|
||||
|
||||
gboolean meta_display_open (const char *name);
|
||||
void meta_display_close (MetaDisplay *display);
|
||||
MetaScreen* meta_display_screen_for_root (MetaDisplay *display,
|
||||
@@ -418,7 +441,8 @@ void meta_display_increment_event_serial (MetaDisplay *display);
|
||||
|
||||
void meta_display_update_active_window_hint (MetaDisplay *display);
|
||||
|
||||
guint32 meta_display_get_current_time (MetaDisplay *display);
|
||||
guint32 meta_display_get_current_time (MetaDisplay *display);
|
||||
guint32 meta_display_get_current_time_roundtrip (MetaDisplay *display);
|
||||
|
||||
/* utility goo */
|
||||
const char* meta_event_mode_to_string (int m);
|
||||
@@ -480,4 +504,27 @@ void meta_display_increment_focus_sentinel (MetaDisplay *display);
|
||||
void meta_display_decrement_focus_sentinel (MetaDisplay *display);
|
||||
gboolean meta_display_focus_sentinel_clear (MetaDisplay *display);
|
||||
|
||||
/* 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
|
||||
* behavior in this circumstance (so don't do it), and (b) it uses
|
||||
* display->last_focus_time and display->expected_focus_window since
|
||||
* we don't have access to the true Xserver ones.
|
||||
*/
|
||||
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
|
||||
*/
|
||||
void meta_display_focus_the_no_focus_window (MetaDisplay *display,
|
||||
Time timestamp);
|
||||
|
||||
void meta_display_queue_autoraise_callback (MetaDisplay *display,
|
||||
MetaWindow *window);
|
||||
void meta_display_remove_autoraise_callback (MetaDisplay *display);
|
||||
|
||||
#endif
|
||||
|
@@ -382,7 +382,7 @@ meta_effects_draw_box_animation (MetaScreen *screen,
|
||||
0,
|
||||
CopyFromParent,
|
||||
CopyFromParent,
|
||||
CopyFromParent,
|
||||
(Visual *)CopyFromParent,
|
||||
CWOverrideRedirect | CWBackPixel,
|
||||
&attrs);
|
||||
|
||||
|
@@ -24,8 +24,8 @@
|
||||
|
||||
static GtkWidget *tip = NULL;
|
||||
static GtkWidget *label = NULL;
|
||||
static int screen_width = 0;
|
||||
static int screen_height = 0;
|
||||
static int screen_right_edge = 0;
|
||||
static int screen_bottom_edge = 0;
|
||||
|
||||
static gint
|
||||
expose_handler (GtkTooltips *tooltips)
|
||||
@@ -50,13 +50,17 @@ meta_fixed_tip_show (Display *xdisplay, int screen_number,
|
||||
tip = gtk_window_new (GTK_WINDOW_POPUP);
|
||||
{
|
||||
GdkScreen *gdk_screen;
|
||||
GdkRectangle monitor;
|
||||
gint mon_num;
|
||||
|
||||
gdk_screen = gdk_display_get_screen (gdk_display_get_default (),
|
||||
screen_number);
|
||||
gtk_window_set_screen (GTK_WINDOW (tip),
|
||||
gdk_screen);
|
||||
screen_width = gdk_screen_get_width (gdk_screen);
|
||||
screen_height = gdk_screen_get_height (gdk_screen);
|
||||
mon_num = gdk_screen_get_monitor_at_point (gdk_screen, root_x, root_y);
|
||||
gdk_screen_get_monitor_geometry (gdk_screen, mon_num, &monitor);
|
||||
screen_right_edge = monitor.x + monitor.width;
|
||||
screen_bottom_edge = monitor.y + monitor.height;
|
||||
}
|
||||
|
||||
gtk_widget_set_app_paintable (tip, TRUE);
|
||||
@@ -64,10 +68,8 @@ meta_fixed_tip_show (Display *xdisplay, int screen_number,
|
||||
gtk_widget_set_name (tip, "gtk-tooltips");
|
||||
gtk_container_set_border_width (GTK_CONTAINER (tip), 4);
|
||||
|
||||
gtk_signal_connect_object (GTK_OBJECT (tip),
|
||||
"expose_event",
|
||||
GTK_SIGNAL_FUNC (expose_handler),
|
||||
NULL);
|
||||
g_signal_connect_swapped (tip, "expose_event",
|
||||
G_CALLBACK (expose_handler), NULL);
|
||||
|
||||
label = gtk_label_new (NULL);
|
||||
gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
|
||||
@@ -76,20 +78,15 @@ meta_fixed_tip_show (Display *xdisplay, int screen_number,
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (tip), label);
|
||||
|
||||
gtk_signal_connect (GTK_OBJECT (tip),
|
||||
"destroy",
|
||||
GTK_SIGNAL_FUNC (gtk_widget_destroyed),
|
||||
&tip);
|
||||
g_signal_connect (tip, "destroy",
|
||||
G_CALLBACK (gtk_widget_destroyed), &tip);
|
||||
}
|
||||
|
||||
gtk_label_set_markup (GTK_LABEL (label), markup_text);
|
||||
|
||||
/* FIXME should also handle Xinerama here, just to be
|
||||
* really cool
|
||||
*/
|
||||
gtk_window_get_size (GTK_WINDOW (tip), &w, &h);
|
||||
if ((root_x + w) > screen_width)
|
||||
root_x -= (root_x + w) - screen_width;
|
||||
if ((root_x + w) > screen_right_edge)
|
||||
root_x -= (root_x + w) - screen_right_edge;
|
||||
|
||||
gtk_window_move (GTK_WINDOW (tip), root_x, root_y);
|
||||
|
||||
|
63
src/frame.c
63
src/frame.c
@@ -38,60 +38,6 @@
|
||||
EnterWindowMask | LeaveWindowMask | \
|
||||
FocusChangeMask | \
|
||||
ColormapChangeMask)
|
||||
static Visual*
|
||||
find_argb_visual (MetaDisplay *display,
|
||||
int scr)
|
||||
{
|
||||
#ifdef HAVE_RENDER
|
||||
XVisualInfo *xvi;
|
||||
XVisualInfo template;
|
||||
int nvi;
|
||||
int i;
|
||||
XRenderPictFormat *format;
|
||||
Visual *visual;
|
||||
|
||||
if (!META_DISPLAY_HAS_RENDER (display))
|
||||
return NULL;
|
||||
|
||||
template.screen = scr;
|
||||
template.depth = 32;
|
||||
template.class = TrueColor;
|
||||
xvi = XGetVisualInfo (display->xdisplay,
|
||||
VisualScreenMask |
|
||||
VisualDepthMask |
|
||||
VisualClassMask,
|
||||
&template,
|
||||
&nvi);
|
||||
if (!xvi)
|
||||
return 0;
|
||||
|
||||
visual = NULL;
|
||||
|
||||
for (i = 0; i < nvi; i++)
|
||||
{
|
||||
format = XRenderFindVisualFormat (display->xdisplay, xvi[i].visual);
|
||||
if (format->type == PictTypeDirect && format->direct.alphaMask)
|
||||
{
|
||||
visual = xvi[i].visual;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
XFree (xvi);
|
||||
|
||||
if (visual)
|
||||
meta_topic (META_DEBUG_COMPOSITOR,
|
||||
"Found ARGB visual 0x%lx\n",
|
||||
(long) visual->visualid);
|
||||
else
|
||||
meta_topic (META_DEBUG_COMPOSITOR,
|
||||
"No ARGB visual found\n");
|
||||
|
||||
return visual;
|
||||
#else /* RENDER */
|
||||
return NULL;
|
||||
#endif /* !RENDER */
|
||||
}
|
||||
|
||||
void
|
||||
meta_window_ensure_frame (MetaWindow *window)
|
||||
@@ -102,7 +48,7 @@ meta_window_ensure_frame (MetaWindow *window)
|
||||
|
||||
if (window->frame)
|
||||
return;
|
||||
|
||||
|
||||
/* See comment below for why this is required. */
|
||||
meta_display_grab (window->display);
|
||||
|
||||
@@ -142,14 +88,13 @@ meta_window_ensure_frame (MetaWindow *window)
|
||||
*/
|
||||
|
||||
/* Special case for depth 32 windows (assumed to be ARGB),
|
||||
* we use the window's visual
|
||||
* we use the window's visual. Otherwise we just use the system visual.
|
||||
*/
|
||||
if (window->depth == 32)
|
||||
visual = window->xvisual;
|
||||
else
|
||||
visual = find_argb_visual(window->display,
|
||||
window->screen->number);
|
||||
|
||||
visual = NULL;
|
||||
|
||||
frame->xwindow = meta_ui_create_frame_window (window->screen->ui,
|
||||
window->display->xdisplay,
|
||||
visual,
|
||||
|
@@ -159,7 +159,7 @@ unsigned_long_hash (gconstpointer v)
|
||||
gulong val = * (const gulong *) v;
|
||||
|
||||
/* I'm not sure this works so well. */
|
||||
#if G_SIZEOF_LONG > 4
|
||||
#if GLIB_SIZEOF_LONG > 4
|
||||
return (guint) (val ^ (val >> 32));
|
||||
#else
|
||||
return val;
|
||||
@@ -472,7 +472,6 @@ meta_frames_manage_window (MetaFrames *frames,
|
||||
GdkWindow *window)
|
||||
{
|
||||
MetaUIFrame *frame;
|
||||
GdkColor col;
|
||||
|
||||
g_assert (window);
|
||||
|
||||
@@ -853,7 +852,7 @@ meta_frames_apply_shapes (MetaFrames *frames,
|
||||
0,
|
||||
CopyFromParent,
|
||||
CopyFromParent,
|
||||
CopyFromParent,
|
||||
(Visual *)CopyFromParent,
|
||||
CWOverrideRedirect,
|
||||
&attrs);
|
||||
|
||||
@@ -1373,7 +1372,9 @@ meta_frames_button_press_event (GtkWidget *widget,
|
||||
}
|
||||
else if (event->button == 2)
|
||||
{
|
||||
meta_core_user_lower (gdk_display, frame->xwindow);
|
||||
meta_core_user_lower_and_unfocus (gdk_display,
|
||||
frame->xwindow,
|
||||
event->time);
|
||||
}
|
||||
else if (event->button == 3)
|
||||
{
|
||||
|
@@ -66,7 +66,7 @@ find_largest_sizes (gulong *data,
|
||||
w = data[0];
|
||||
h = data[1];
|
||||
|
||||
if (nitems < ((w * h) + 2))
|
||||
if (nitems < ((gulong)(w * h) + 2))
|
||||
return FALSE; /* not enough data */
|
||||
|
||||
*width = MAX (w, *width);
|
||||
@@ -122,7 +122,7 @@ find_best_size (gulong *data,
|
||||
w = data[0];
|
||||
h = data[1];
|
||||
|
||||
if (nitems < ((w * h) + 2))
|
||||
if (nitems < ((gulong)(w * h) + 2))
|
||||
break; /* not enough data */
|
||||
|
||||
if (best_start == NULL)
|
||||
|
@@ -36,6 +36,10 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef HAVE_XKB
|
||||
#include <X11/XKBlib.h>
|
||||
#endif
|
||||
|
||||
static gboolean all_bindings_disabled = FALSE;
|
||||
|
||||
typedef void (* MetaKeyHandlerFunc) (MetaDisplay *display,
|
||||
@@ -184,14 +188,13 @@ static void handle_maximize_horiz (MetaDisplay *display,
|
||||
MetaWindow *window,
|
||||
XEvent *event,
|
||||
MetaKeyBinding *binding);
|
||||
static void handle_run_terminal (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
MetaWindow *window,
|
||||
XEvent *event,
|
||||
MetaKeyBinding *binding);
|
||||
|
||||
/* debug */
|
||||
static void handle_spew_mark (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
MetaWindow *window,
|
||||
XEvent *event,
|
||||
MetaKeyBinding *binding);
|
||||
|
||||
static gboolean process_keyboard_move_grab (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
MetaWindow *window,
|
||||
@@ -357,6 +360,8 @@ static const MetaKeyHandler screen_handlers[] = {
|
||||
GINT_TO_POINTER (32) },
|
||||
{ META_KEYBINDING_COMMAND_WIN_SCREENSHOT, handle_run_command,
|
||||
GINT_TO_POINTER (33) },
|
||||
{ META_KEYBINDING_RUN_COMMAND_TERMINAL, handle_run_terminal,
|
||||
NULL },
|
||||
{ NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
@@ -422,7 +427,7 @@ reload_keymap (MetaDisplay *display)
|
||||
display->keymap = XGetKeyboardMapping (display->xdisplay,
|
||||
display->min_keycode,
|
||||
display->max_keycode -
|
||||
display->min_keycode,
|
||||
display->min_keycode + 1,
|
||||
&display->keysyms_per_keycode);
|
||||
}
|
||||
|
||||
@@ -2310,6 +2315,33 @@ process_keyboard_resize_grab (MetaDisplay *display,
|
||||
return handled;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
end_keyboard_grab (MetaDisplay *display,
|
||||
unsigned int keycode)
|
||||
{
|
||||
#ifdef HAVE_XKB
|
||||
if (display->xkb_base_event_type > 0)
|
||||
{
|
||||
unsigned int primary_modifier;
|
||||
XkbStateRec state;
|
||||
|
||||
primary_modifier = get_primary_modifier (display, display->grab_mask);
|
||||
|
||||
XkbGetState (display->xdisplay, XkbUseCoreKbd, &state);
|
||||
|
||||
if (!(primary_modifier & state.mods))
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
#endif
|
||||
{
|
||||
if (keycode_is_primary_modifier (display, keycode, display->grab_mask))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
process_tab_grab (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
@@ -2325,10 +2357,9 @@ process_tab_grab (MetaDisplay *display,
|
||||
return FALSE;
|
||||
|
||||
g_return_val_if_fail (screen->tab_popup != NULL, FALSE);
|
||||
|
||||
|
||||
if (event->type == KeyRelease &&
|
||||
keycode_is_primary_modifier (display, event->xkey.keycode,
|
||||
display->grab_mask))
|
||||
end_keyboard_grab (display, event->xkey.keycode))
|
||||
{
|
||||
/* We're done, move to the new window. */
|
||||
Window target_xwindow;
|
||||
@@ -2444,6 +2475,11 @@ process_tab_grab (MetaDisplay *display,
|
||||
/* end grab */
|
||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||
"Ending tabbing/cycling, uninteresting key pressed\n");
|
||||
|
||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||
"Syncing to old stack positions.\n");
|
||||
meta_stack_set_positions (screen->stack,
|
||||
screen->display->grab_old_window_stacking);
|
||||
}
|
||||
|
||||
return key_used;
|
||||
@@ -2474,7 +2510,7 @@ handle_activate_workspace (MetaDisplay *display,
|
||||
|
||||
if (workspace)
|
||||
{
|
||||
meta_workspace_activate (workspace);
|
||||
meta_workspace_activate (workspace, event->xkey.time);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -2483,23 +2519,17 @@ handle_activate_workspace (MetaDisplay *display,
|
||||
}
|
||||
|
||||
static void
|
||||
error_on_command (int command_index,
|
||||
const char *command,
|
||||
const char *message,
|
||||
int screen_number,
|
||||
Time timestamp)
|
||||
error_on_generic_command (const char *key,
|
||||
const char *command,
|
||||
const char *message,
|
||||
int screen_number,
|
||||
Time timestamp)
|
||||
{
|
||||
GError *err;
|
||||
char *argv[10];
|
||||
char *key;
|
||||
char numbuf[32];
|
||||
char timestampbuf[32];
|
||||
|
||||
meta_warning ("Error on command %d \"%s\": %s\n",
|
||||
command_index, command, message);
|
||||
|
||||
key = meta_prefs_get_gconf_key_for_command (command_index);
|
||||
|
||||
sprintf (numbuf, "%d", screen_number);
|
||||
sprintf (timestampbuf, "%lu", timestamp);
|
||||
|
||||
@@ -2509,7 +2539,7 @@ error_on_command (int command_index,
|
||||
argv[3] = "--timestamp";
|
||||
argv[4] = timestampbuf;
|
||||
argv[5] = "--command-failed-error";
|
||||
argv[6] = key;
|
||||
argv[6] = (char *)key;
|
||||
argv[7] = (char*) (command ? command : "");
|
||||
argv[8] = (char*) message;
|
||||
argv[9] = NULL;
|
||||
@@ -2530,10 +2560,42 @@ error_on_command (int command_index,
|
||||
err->message);
|
||||
g_error_free (err);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
error_on_command (int command_index,
|
||||
const char *command,
|
||||
const char *message,
|
||||
int screen_number,
|
||||
Time timestamp)
|
||||
{
|
||||
char *key;
|
||||
|
||||
meta_warning ("Error on command %d \"%s\": %s\n",
|
||||
command_index, command, message);
|
||||
|
||||
key = meta_prefs_get_gconf_key_for_command (command_index);
|
||||
|
||||
error_on_generic_command (key, command, message, screen_number, timestamp);
|
||||
|
||||
g_free (key);
|
||||
}
|
||||
|
||||
static void
|
||||
error_on_terminal_command (const char *command,
|
||||
const char *message,
|
||||
int screen_number,
|
||||
Time timestamp)
|
||||
{
|
||||
const char *key;
|
||||
|
||||
meta_warning ("Error on terminal command \"%s\": %s\n", command, message);
|
||||
|
||||
key = meta_prefs_get_gconf_key_for_terminal_command ();
|
||||
|
||||
error_on_generic_command (key, command, message, screen_number, timestamp);
|
||||
}
|
||||
|
||||
static void
|
||||
set_display_setup_func (void *data)
|
||||
{
|
||||
@@ -2553,7 +2615,7 @@ meta_spawn_command_line_async_on_screen (const gchar *command_line,
|
||||
GError **error)
|
||||
{
|
||||
gboolean retval;
|
||||
gchar **argv = 0;
|
||||
gchar **argv = NULL;
|
||||
|
||||
g_return_val_if_fail (command_line != NULL, FALSE);
|
||||
|
||||
@@ -2657,10 +2719,9 @@ process_workspace_switch_grab (MetaDisplay *display,
|
||||
return FALSE;
|
||||
|
||||
g_return_val_if_fail (screen->tab_popup != NULL, FALSE);
|
||||
|
||||
|
||||
if (event->type == KeyRelease &&
|
||||
keycode_is_primary_modifier (display, event->xkey.keycode,
|
||||
display->grab_mask))
|
||||
end_keyboard_grab (display, event->xkey.keycode))
|
||||
{
|
||||
/* We're done, move to the new workspace. */
|
||||
MetaWorkspace *target_workspace;
|
||||
@@ -2670,19 +2731,25 @@ process_workspace_switch_grab (MetaDisplay *display,
|
||||
|
||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||
"Ending workspace tab operation, primary modifier released\n");
|
||||
if (target_workspace)
|
||||
|
||||
if (target_workspace == screen->active_workspace)
|
||||
{
|
||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||
"Ending grab early so we can focus the target workspace\n");
|
||||
"Ending grab so we can focus on the target workspace\n");
|
||||
meta_display_end_grab_op (display, event->xkey.time);
|
||||
|
||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||
"Activating target workspace\n");
|
||||
"Focusing default window on target workspace\n");
|
||||
|
||||
meta_workspace_activate (target_workspace);
|
||||
meta_workspace_focus_default_window (target_workspace,
|
||||
NULL,
|
||||
event->xkey.time);
|
||||
|
||||
return TRUE; /* we already ended the grab */
|
||||
}
|
||||
|
||||
/* Workspace switching should have already occurred on KeyPress */
|
||||
meta_warning ("target_workspace != active_workspace. Some other event must have occurred.\n");
|
||||
|
||||
return FALSE; /* end grab */
|
||||
}
|
||||
@@ -2745,7 +2812,7 @@ process_workspace_switch_grab (MetaDisplay *display,
|
||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||
"Activating target workspace\n");
|
||||
|
||||
meta_workspace_activate (target_workspace);
|
||||
meta_workspace_activate (target_workspace, event->xkey.time);
|
||||
|
||||
return TRUE; /* we already ended the grab */
|
||||
}
|
||||
@@ -2753,7 +2820,10 @@ process_workspace_switch_grab (MetaDisplay *display,
|
||||
|
||||
/* end grab */
|
||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||
"Ending workspace tabbing, uninteresting key pressed\n");
|
||||
"Ending workspace tabbing & focusing default window; uninteresting key pressed\n");
|
||||
workspace =
|
||||
(MetaWorkspace *) meta_ui_tab_popup_get_selected (screen->tab_popup);
|
||||
meta_workspace_focus_default_window (workspace, NULL, event->xkey.time);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@@ -2764,13 +2834,15 @@ handle_toggle_desktop (MetaDisplay *display,
|
||||
XEvent *event,
|
||||
MetaKeyBinding *binding)
|
||||
{
|
||||
if (screen->showing_desktop)
|
||||
if (screen->active_workspace->showing_desktop)
|
||||
{
|
||||
meta_screen_unshow_desktop (screen);
|
||||
meta_workspace_focus_default_window (screen->active_workspace, NULL);
|
||||
meta_workspace_focus_default_window (screen->active_workspace,
|
||||
NULL,
|
||||
event->xkey.time);
|
||||
}
|
||||
else
|
||||
meta_screen_show_desktop (screen);
|
||||
meta_screen_show_desktop (screen, event->xkey.time);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -3203,7 +3275,7 @@ do_handle_move_to_workspace (MetaDisplay *display,
|
||||
/* Activate second, so the window is never unmapped */
|
||||
meta_window_change_workspace (window, workspace);
|
||||
if (flip)
|
||||
meta_workspace_activate_with_focus (workspace, window);
|
||||
meta_workspace_activate_with_focus (workspace, window, event->xkey.time);
|
||||
}
|
||||
else
|
||||
{
|
||||
@@ -3367,7 +3439,7 @@ handle_workspace_switch (MetaDisplay *display,
|
||||
meta_display_end_grab_op (display, event->xkey.time);
|
||||
}
|
||||
|
||||
meta_workspace_activate (next);
|
||||
meta_workspace_activate (next, event->xkey.time);
|
||||
|
||||
if (grabbed_before_release)
|
||||
{
|
||||
@@ -3379,6 +3451,7 @@ handle_workspace_switch (MetaDisplay *display,
|
||||
}
|
||||
}
|
||||
|
||||
#if 0
|
||||
static void
|
||||
handle_spew_mark (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
@@ -3388,6 +3461,7 @@ handle_spew_mark (MetaDisplay *display,
|
||||
{
|
||||
meta_verbose ("-- MARK MARK MARK MARK --\n");
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
meta_set_keybindings_disabled (gboolean setting)
|
||||
@@ -3396,3 +3470,40 @@ meta_set_keybindings_disabled (gboolean setting)
|
||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||
"Keybindings %s\n", all_bindings_disabled ? "disabled" : "enabled");
|
||||
}
|
||||
|
||||
static void
|
||||
handle_run_terminal (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
MetaWindow *window,
|
||||
XEvent *event,
|
||||
MetaKeyBinding *binding)
|
||||
{
|
||||
const char *command;
|
||||
GError *err;
|
||||
|
||||
command = meta_prefs_get_terminal_command ();
|
||||
|
||||
if (command == NULL)
|
||||
{
|
||||
char *s;
|
||||
|
||||
meta_topic (META_DEBUG_KEYBINDINGS,
|
||||
"No terminal command to run in response to "
|
||||
"keybinding press\n");
|
||||
|
||||
s = g_strdup_printf (_("No terminal command has been defined.\n"));
|
||||
error_on_terminal_command (NULL, s, screen->number, event->xkey.time);
|
||||
g_free (s);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
err = NULL;
|
||||
if (!meta_spawn_command_line_async_on_screen (command, screen, &err))
|
||||
{
|
||||
error_on_terminal_command (command, err->message, screen->number,
|
||||
event->xkey.time);
|
||||
|
||||
g_error_free (err);
|
||||
}
|
||||
}
|
||||
|
@@ -186,11 +186,11 @@ main (int argc, char **argv)
|
||||
act.sa_handler = SIG_IGN;
|
||||
act.sa_mask = empty_mask;
|
||||
act.sa_flags = 0;
|
||||
if (sigaction (SIGPIPE, &act, 0) < 0)
|
||||
if (sigaction (SIGPIPE, &act, NULL) < 0)
|
||||
g_printerr ("Failed to register SIGPIPE handler: %s\n",
|
||||
g_strerror (errno));
|
||||
#ifdef SIGXFSZ
|
||||
if (sigaction (SIGXFSZ, &act, 0) < 0)
|
||||
if (sigaction (SIGXFSZ, &act, NULL) < 0)
|
||||
g_printerr ("Failed to register SIGXFSZ handler: %s\n",
|
||||
g_strerror (errno));
|
||||
#endif
|
||||
|
10
src/menu.c
10
src/menu.c
@@ -63,8 +63,8 @@ static MenuItem menuitems[] = {
|
||||
{ 0, NULL, FALSE, NULL }, /* separator */
|
||||
{ META_MENU_OP_DELETE, METACITY_STOCK_DELETE, FALSE, N_("_Close") },
|
||||
{ META_MENU_OP_WORKSPACES, NULL, FALSE, NULL }, /* separator */
|
||||
{ META_MENU_OP_STICK, NULL, FALSE, N_("Put on _All Workspaces") },
|
||||
{ META_MENU_OP_UNSTICK, NULL, FALSE, N_("Only on _This Workspace") },
|
||||
{ META_MENU_OP_STICK, NULL, FALSE, N_("_Always on Visible Workspace") },
|
||||
{ META_MENU_OP_UNSTICK, NULL, FALSE, N_("_Only on This Workspace") },
|
||||
{ META_MENU_OP_MOVE_LEFT, NULL, FALSE, N_("Move to Workspace _Left") },
|
||||
{ META_MENU_OP_MOVE_RIGHT, NULL, FALSE, N_("Move to Workspace R_ight") },
|
||||
{ META_MENU_OP_MOVE_UP, NULL, FALSE, N_("Move to Workspace _Up") },
|
||||
@@ -421,10 +421,8 @@ meta_window_menu_new (MetaFrames *frames,
|
||||
else
|
||||
meta_verbose ("not creating workspace menu\n");
|
||||
|
||||
gtk_signal_connect (GTK_OBJECT (menu->menu),
|
||||
"selection_done",
|
||||
GTK_SIGNAL_FUNC (menu_closed),
|
||||
menu);
|
||||
g_signal_connect (menu->menu, "selection_done",
|
||||
G_CALLBACK (menu_closed), menu);
|
||||
|
||||
return menu;
|
||||
}
|
||||
|
@@ -296,6 +296,8 @@ warn_about_no_sm_support (char **lame_apps,
|
||||
sw,
|
||||
TRUE, TRUE, 0);
|
||||
|
||||
gtk_window_stick (GTK_WINDOW (dialog));
|
||||
|
||||
gtk_widget_realize (dialog);
|
||||
copy_of_gdk_x11_window_set_user_time (dialog->window, timestamp);
|
||||
|
||||
|
@@ -1,4 +1,5 @@
|
||||
[Desktop Entry]
|
||||
Encoding=UTF-8
|
||||
_Name=Metacity
|
||||
Exec=metacity
|
||||
# name of loadable control center module
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user