Compare commits
306 Commits
METACITY_2
...
METACITY_2
Author | SHA1 | Date | |
---|---|---|---|
![]() |
c8d135b353 | ||
![]() |
8e5425a86f | ||
![]() |
0ea8552531 | ||
![]() |
dcec11274a | ||
![]() |
6f318f1a75 | ||
![]() |
5568f75cb0 | ||
![]() |
e272295976 | ||
![]() |
a556a7334a | ||
![]() |
af14d9d2a1 | ||
![]() |
32d4bd6b63 | ||
![]() |
4c10722262 | ||
![]() |
cc790655f2 | ||
![]() |
1bce2c55fe | ||
![]() |
5f9a097d2c | ||
![]() |
24976318b5 | ||
![]() |
59d7d891db | ||
![]() |
8638300708 | ||
![]() |
a42d6647b5 | ||
![]() |
0a815fb8f8 | ||
![]() |
4dd216f5a8 | ||
![]() |
4d868c1ddc | ||
![]() |
97981e4322 | ||
![]() |
35dae65862 | ||
![]() |
fac7010411 | ||
![]() |
d552ca35f6 | ||
![]() |
9fdd3d165d | ||
![]() |
ef792fc1f7 | ||
![]() |
50bcc976bc | ||
![]() |
def12b85b8 | ||
![]() |
5a652acf88 | ||
![]() |
efe25a80ed | ||
![]() |
f9d11c0be6 | ||
![]() |
fea6191473 | ||
![]() |
0eab7bd14c | ||
![]() |
9ec589b3b8 | ||
![]() |
d0b1dab993 | ||
![]() |
4689944194 | ||
![]() |
1f6dbf75fa | ||
![]() |
51b8c402d8 | ||
![]() |
f0322ee76c | ||
![]() |
5913b8c5ab | ||
![]() |
52df880f32 | ||
![]() |
f6270596de | ||
![]() |
a4d1c6fd61 | ||
![]() |
0f8add8b37 | ||
![]() |
8c5b6c875a | ||
![]() |
ae52d731be | ||
![]() |
d884f9ce8a | ||
![]() |
ee54debd6a | ||
![]() |
24cfed8cf0 | ||
![]() |
008a811e10 | ||
![]() |
de65967b62 | ||
![]() |
35532d14cb | ||
![]() |
9516694385 | ||
![]() |
9eb56f151c | ||
![]() |
e3ff2316fe | ||
![]() |
ab0ba52f89 | ||
![]() |
339948fcf2 | ||
![]() |
ebd0c7e9a6 | ||
![]() |
d530c3e405 | ||
![]() |
be86740b3d | ||
![]() |
d4771cd9cf | ||
![]() |
a59f14adbc | ||
![]() |
703f58cdf7 | ||
![]() |
5e9f20e94c | ||
![]() |
a710235e86 | ||
![]() |
53cba6ed37 | ||
![]() |
7e821f37fd | ||
![]() |
830baad257 | ||
![]() |
6a9242b192 | ||
![]() |
013c8b82db | ||
![]() |
37fb0af742 | ||
![]() |
12193322a8 | ||
![]() |
d9721257d2 | ||
![]() |
c08a660368 | ||
![]() |
77b148afdc | ||
![]() |
b4635f2143 | ||
![]() |
b3f465c727 | ||
![]() |
616d778f6b | ||
![]() |
6fa00967a5 | ||
![]() |
35925d1cf1 | ||
![]() |
d74b0ce151 | ||
![]() |
ca6991d4a8 | ||
![]() |
ca2fe384bc | ||
![]() |
65168cf8c9 | ||
![]() |
b03d82661f | ||
![]() |
20e6b8d2f8 | ||
![]() |
3426844ad5 | ||
![]() |
a3902fb922 | ||
![]() |
0fdbdbd236 | ||
![]() |
9641bc5ee7 | ||
![]() |
d1da3438d4 | ||
![]() |
f9a4aea0cf | ||
![]() |
0ac220aecd | ||
![]() |
075d6d34db | ||
![]() |
dfbec3a4c3 | ||
![]() |
466ce4a936 | ||
![]() |
c78a98e066 | ||
![]() |
a5165ee24d | ||
![]() |
a7201d27d1 | ||
![]() |
cfb3bd081a | ||
![]() |
d0095e947f | ||
![]() |
ef486d855c | ||
![]() |
2e10145b33 | ||
![]() |
6677b55cd5 | ||
![]() |
7c1aa16c3b | ||
![]() |
e2e2c6401b | ||
![]() |
4752ef55c7 | ||
![]() |
55f62585d0 | ||
![]() |
a11e758b4b | ||
![]() |
828d2ca01e | ||
![]() |
064303e98e | ||
![]() |
094449d097 | ||
![]() |
ddd1d6616d | ||
![]() |
f2acdda740 | ||
![]() |
7c70749ae8 | ||
![]() |
37ced4cc32 | ||
![]() |
0bf176de5b | ||
![]() |
f4a587f05e | ||
![]() |
27b0a5e0b0 | ||
![]() |
62fb5e6eb4 | ||
![]() |
9292fe606a | ||
![]() |
7ef871f73a | ||
![]() |
29e38a2f53 | ||
![]() |
3e77dd1ace | ||
![]() |
5b28d889fa | ||
![]() |
fcf89cc2fa | ||
![]() |
0a13bf3270 | ||
![]() |
4aaf6e3eb4 | ||
![]() |
12daca5cb1 | ||
![]() |
1a8c2aa027 | ||
![]() |
26dbf9856b | ||
![]() |
ea4cd88285 | ||
![]() |
47f1a8634b | ||
![]() |
c3624745ae | ||
![]() |
2aee817a56 | ||
![]() |
ef5299ee92 | ||
![]() |
fcba59e685 | ||
![]() |
662da0ec3c | ||
![]() |
66c5548061 | ||
![]() |
9503b4ba21 | ||
![]() |
72c5649bc3 | ||
![]() |
43d72674e9 | ||
![]() |
943f4f66fb | ||
![]() |
997b5dcccf | ||
![]() |
94da2b94d7 | ||
![]() |
c502053ffc | ||
![]() |
213833f333 | ||
![]() |
9136686aa4 | ||
![]() |
8eed998780 | ||
![]() |
0d1c28948d | ||
![]() |
d02dc0e89a | ||
![]() |
b4f123c332 | ||
![]() |
422ee61608 | ||
![]() |
06df0d64ad | ||
![]() |
4c96a68427 | ||
![]() |
86bbde337c | ||
![]() |
809a1c173f | ||
![]() |
735188fd2b | ||
![]() |
6bb6566b86 | ||
![]() |
304a05b9a3 | ||
![]() |
7f90738dba | ||
![]() |
909de04b89 | ||
![]() |
b751ceb159 | ||
![]() |
feebb2f42e | ||
![]() |
2139d4e25e | ||
![]() |
3ed91c8e14 | ||
![]() |
02d6e62aec | ||
![]() |
8126d0953d | ||
![]() |
fc6dbd84b9 | ||
![]() |
e16863f783 | ||
![]() |
96c238bbc6 | ||
![]() |
2df2e18a9b | ||
![]() |
5305e17392 | ||
![]() |
cb19fdc3ce | ||
![]() |
7d1e1b042f | ||
![]() |
4b4d6cac42 | ||
![]() |
905a92a20a | ||
![]() |
f1bcb6b51a | ||
![]() |
a39cb116c7 | ||
![]() |
87f613fbbe | ||
![]() |
f38e760506 | ||
![]() |
05dcc58174 | ||
![]() |
ce42492db4 | ||
![]() |
893fadf7d6 | ||
![]() |
a182b353ce | ||
![]() |
f335b0c381 | ||
![]() |
2972ab6df6 | ||
![]() |
8e927fd300 | ||
![]() |
c50c8e6f7d | ||
![]() |
d8a1b9750b | ||
![]() |
1b2e5e56a8 | ||
![]() |
7a9be72bdf | ||
![]() |
d5705ef576 | ||
![]() |
20b7ee18ef | ||
![]() |
7311386172 | ||
![]() |
91e594863c | ||
![]() |
455dbdf67a | ||
![]() |
7f1fd68952 | ||
![]() |
9c97fd2b9b | ||
![]() |
266f78d9a8 | ||
![]() |
c25b8ec616 | ||
![]() |
c64bda776b | ||
![]() |
ef5c3f976a | ||
![]() |
7e2a44039f | ||
![]() |
225407f3b3 | ||
![]() |
845a7fe554 | ||
![]() |
969a4ab3ef | ||
![]() |
10ea37ec4a | ||
![]() |
b102891467 | ||
![]() |
4c143b3635 | ||
![]() |
eb04fe1ec7 | ||
![]() |
2126caf511 | ||
![]() |
b6fa0deff3 | ||
![]() |
10ee3e89dc | ||
![]() |
364b402e8d | ||
![]() |
65e2f2ba4b | ||
![]() |
4c7dc0bbb4 | ||
![]() |
1b52fa05e6 | ||
![]() |
3f214dd33d | ||
![]() |
b54ff6be9f | ||
![]() |
c62efca089 | ||
![]() |
6c023bfef7 | ||
![]() |
020736a42f | ||
![]() |
c635ac51cb | ||
![]() |
053c1b9d19 | ||
![]() |
241a44e69c | ||
![]() |
b22e85f81a | ||
![]() |
7bda73a415 | ||
![]() |
0e956c674f | ||
![]() |
d09fb9f806 | ||
![]() |
61c6519798 | ||
![]() |
786af7ea61 | ||
![]() |
8ce054b21b | ||
![]() |
7335b44d3e | ||
![]() |
e4bd174a7b | ||
![]() |
3a6a4966e2 | ||
![]() |
14d54719d7 | ||
![]() |
bd56f4ec07 | ||
![]() |
3b6f14fa6f | ||
![]() |
947e45d27d | ||
![]() |
a85aea8b18 | ||
![]() |
c35bc07c74 | ||
![]() |
4f98706852 | ||
![]() |
b5b0255e4c | ||
![]() |
e003ba87d1 | ||
![]() |
064a86e620 | ||
![]() |
1ff193b819 | ||
![]() |
3fdf721286 | ||
![]() |
90dc2116ad | ||
![]() |
d5eaa386dd | ||
![]() |
14b8de3727 | ||
![]() |
1799ef6006 | ||
![]() |
be49961944 | ||
![]() |
7b416a0a2d | ||
![]() |
2e0d27d0f1 | ||
![]() |
e1891161d0 | ||
![]() |
eb46b01e97 | ||
![]() |
b71671f94f | ||
![]() |
5f23d91c39 | ||
![]() |
54f2bb3648 | ||
![]() |
4223bc53f8 | ||
![]() |
7b1f4e8a8b | ||
![]() |
18f7f5f76d | ||
![]() |
9c4d95d9c8 | ||
![]() |
6f5fedcc7c | ||
![]() |
da578b2e4a | ||
![]() |
030ad7c7fc | ||
![]() |
2876a8ea4d | ||
![]() |
a11aaf96c7 | ||
![]() |
b49c0ec888 | ||
![]() |
1ba71ab9ff | ||
![]() |
82c8ca4588 | ||
![]() |
7d9d9f52cd | ||
![]() |
9cb157caf8 | ||
![]() |
8eb38bb871 | ||
![]() |
2b86f5d870 | ||
![]() |
0a7bbc9b06 | ||
![]() |
16012cb7f2 | ||
![]() |
c9592c587e | ||
![]() |
c48b52456b | ||
![]() |
48fa3d5fcb | ||
![]() |
5b2061b520 | ||
![]() |
c16108aba3 | ||
![]() |
de4ab5cede | ||
![]() |
1a9d5ef701 | ||
![]() |
4fd7ed876d | ||
![]() |
8c2b7c174c | ||
![]() |
c56b7d8334 | ||
![]() |
c897d3f17c | ||
![]() |
f58cf15ac2 | ||
![]() |
e881c2dbda | ||
![]() |
73b36aa64d | ||
![]() |
3b00d7a6a8 | ||
![]() |
c7ebe972e6 | ||
![]() |
fae2f68f24 | ||
![]() |
63d8f5faf6 | ||
![]() |
bea407e309 | ||
![]() |
6375bee8a2 | ||
![]() |
3c1a7cc190 | ||
![]() |
ebae340a1e | ||
![]() |
8ac94e45b5 | ||
![]() |
3a0277561a | ||
![]() |
15e8482635 | ||
![]() |
882432372a | ||
![]() |
0df4e194d3 |
@@ -15,6 +15,7 @@ ltconfig
|
||||
ltmain.sh
|
||||
stamp-h
|
||||
stamp-h.in
|
||||
stamp-h1
|
||||
stamp.h
|
||||
version.h
|
||||
config.h.in
|
||||
|
30
HACKING
30
HACKING
@@ -69,16 +69,22 @@ Relevant standards and X properties
|
||||
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
|
||||
idea of what's there for kicks. Note that you can get rid of some of the
|
||||
verboseness by grepping out the _NET_WM_ICON stuff, i.e.
|
||||
xprop | grep -v _NET_WM_ICON
|
||||
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
|
||||
can think of as the "main" Xserver 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.
|
||||
if you know the id of the window in question. You can get the id of a
|
||||
given window by either running xwininfo, e.g.
|
||||
xwininfo | grep "Window id" | cut -f 4 -d ' '
|
||||
or by looking at 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.
|
||||
|
||||
Debugging information
|
||||
Trying to run a window manager under a typical debugger, such as gdb,
|
||||
@@ -101,6 +107,9 @@ Debugging information
|
||||
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
|
||||
(note that METACITY_VERBOSE=1 can be problematic without
|
||||
METACITY_USE_LOGFILE=1; avoid it unless running in from something that
|
||||
won't be managed by the new Metacity--see bug 305091 for more details).
|
||||
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
|
||||
@@ -175,6 +184,13 @@ Debugging information
|
||||
metacity-message restart
|
||||
metacity-message enable-keybindings
|
||||
metacity-message disable-keybindings
|
||||
The first of these is useful for testing themes, the second is just
|
||||
another way (besides the --restart flag to metacity itself) of
|
||||
restarting metacity, and the third is useful for testing Metacity when
|
||||
running it under an Xnest (typically, the Metacity under the Xnest
|
||||
wouldn't get keybinding notifications--making keyboard navigation not
|
||||
work--but if you disable the keybindings for the global Metacity then
|
||||
the Metacity under the Xnest can then get those keybinding notifications).
|
||||
|
||||
metacity-window-demo
|
||||
metacity-window-demo is good for trying behavior of various kinds
|
||||
|
520
NEWS
520
NEWS
@@ -1,3 +1,523 @@
|
||||
2.13.34
|
||||
==
|
||||
|
||||
Thanks to Damien Carbery, Havoc Pennington, S<>ren Sandmann,
|
||||
Bj<EFBFBD>rn Lindqvist, Kjartan Maraas, Elijah Newren for improvements in
|
||||
this release.
|
||||
|
||||
- manually define HOST_NAME_MAX if not already defined to fix Solaris
|
||||
compilation issue (Damien, Havoc) [#326745]
|
||||
- compositor improvements: port to changes in libcm, do it again, fix
|
||||
unrefing, make minimize animation update again (all done by S<>ren)
|
||||
- make sure an outline border is shown even if a window decoration's
|
||||
width is 0 (Bj<42>rn) [#98340]
|
||||
- correctly handle window alt-tab outlines in showing desktop mode
|
||||
(Bj<42>rn) [#98340]
|
||||
- fix lots of tiny issues spotted by the intel compiler (Kjartan)
|
||||
[#321439]
|
||||
- prevent rapidly repeated visual bells from hanging metacity
|
||||
(Elijah) [#322032]
|
||||
- more careful error handling of values returned by GConf (Elijah)
|
||||
[#326615]
|
||||
- fix various initialization and default issues, especially for
|
||||
running with --disable-gconf. Make --disable-gconf actually work.
|
||||
(Elijah) [#326661]
|
||||
- fix some reading-from-free'd-data errors (S<>ren) [#327575]
|
||||
- fix an unitialized value problem when in raise-on-click mode
|
||||
(S<>ren) [#327572]
|
||||
- avoid flashing original-sized window when closing a maximized
|
||||
window (Elijah) [#317254]
|
||||
- prevent windows from sometimes getting shoved and smashed by
|
||||
sliding (and possibly auto-hiding) panels (Elijah) [#327822]
|
||||
|
||||
Translations
|
||||
Ilkka Tuohela (fi), Ignacio Casal Quinteiro (gl), Tino Meinen (nl),
|
||||
Funda Wang (zh_CN)
|
||||
|
||||
2.13.21
|
||||
==
|
||||
|
||||
Thanks to Damien Carbery, Ray Strode, S<>ren Sandmann, Elijah
|
||||
Newren, Jens Granseuer, and Kyle Ambroff for improvements in this
|
||||
release.
|
||||
|
||||
- Fix Solaris compilation issues (Ray, Damien) [#326281, #326746]
|
||||
- Merge compositor work from branches to get the beginnings of an openGL
|
||||
based compositor. Still not ready and thus disabled by default.
|
||||
(S<>ren)
|
||||
- Composite fixes: Only update composite on damage events (S<>ren), get
|
||||
non-composite compilation working again (Elijah), Really turn off
|
||||
draw-in-a-loop (S<>ren)
|
||||
- Don't dereference a NULL string (Elijah) [#327013]
|
||||
- GCC 2.95 fix; remove more C99 style variable initiailizations (Jens)
|
||||
[#327050]
|
||||
- Fix accidental overzealous focus holding by the terminal (introduced in
|
||||
last release) so that windows launched from panel icons, the panel
|
||||
menu, or global keybindings should get focus now. (Elijah) [#326159]
|
||||
- If no valid window is found in the MRU list, then set focus to the
|
||||
desktop window. (Kyle) [#317405]
|
||||
|
||||
Translations
|
||||
Adam Weinberger (en_CA), Francisco Javier F. Serrador (es), Ankit
|
||||
Patel (gu), Takeshi AIHANA (ja), Theppitak Karoonboonyanan (th),
|
||||
Clytie Siddall (vi)
|
||||
|
||||
2.13.13
|
||||
==
|
||||
|
||||
Thanks to Jens Granseuer, Bj<42>rn Lindqvist, and Elijah Newren for
|
||||
improvements in this release.
|
||||
|
||||
- Remove C99 style variable initiailization (Jens) [#322622]
|
||||
- Fix a logic error (Bj<42>rn) [#322149]
|
||||
- Plug a few leaks (Elijah) [#309178]
|
||||
- Allow edge resistance at both sides of a window and also when edges
|
||||
don't overlap but are a single pixel away from doing so (Elijah)
|
||||
[part of #321905]
|
||||
- Remove the timeout resistance at screen/xinerama edges (Elijah)
|
||||
[part of #321905]
|
||||
- Revert to the old edge resistance behavior for keyboard
|
||||
movement/resizing based resistance (Elijah) [part of #321905]
|
||||
- Remove the "pull-away" edge resistance (Elijah) [part of #321905]
|
||||
- Avoid crashing when visual bell is in use and focus window is
|
||||
closed (Elijah) [#322031]
|
||||
- Be more strict about what is considered a valid region with partial
|
||||
struts (Elijah) [#322070]
|
||||
- Fix reduced resources resize handling for windows with sizing or
|
||||
resizing constraints (Elijah) [#325774]
|
||||
- Fix window outline for minimized windows when using alt-esc
|
||||
(Elijah) [#325092]
|
||||
- Make the taskbar less flash happy and fix up some related stacking
|
||||
issues (Elijah) [#326035]
|
||||
- More thorough handling of source indication (Elijah) [part of #326041]
|
||||
- Don't "steal" focus from terminal windows for new window mappings
|
||||
as the difference in usage between terminals and other apps seems
|
||||
to suggest this difference in treatment. See bug #326159 for
|
||||
details, feedback welcome (Elijah) [#326159]
|
||||
- Add a raise on click option, basically only because all the major
|
||||
distros are patching it in anyway (though each and every one of
|
||||
them has bugs in their implementations). (Elijah) [#326156]
|
||||
|
||||
Translations
|
||||
Kjartan Maraas (nb), Kjartan Maraas (no)
|
||||
|
||||
2.13.8
|
||||
==
|
||||
|
||||
Thanks to Kang Jeong-Hee and Elijah Newren for improvements in this
|
||||
release.
|
||||
|
||||
- Fix some compilation warnings and issues (Kang)
|
||||
- Escape the title since it is going to be treated as Markup (Elijah)
|
||||
[#324846]
|
||||
- Make the workspace switcher work with dual-head (non-xinerama)
|
||||
setups (Elijah) [#319423]
|
||||
|
||||
Translations
|
||||
Ilkka Tuohela (fi), Ankit Patel (gu), Kang Joeng-Hee (ko)
|
||||
|
||||
2.13.5
|
||||
==
|
||||
|
||||
Thanks to Davyd Madeley, Kjartan Maraas, and Bj<42>rn Lindqvist for
|
||||
improvements in this release.
|
||||
|
||||
- Make a debugging message actually correspond to the code (Bj<42>rn)
|
||||
[#322051]
|
||||
- Make the wireframe a bit slimmer (Kjartan) [#320051]
|
||||
- Display hostname in titlebar for remote X clients (Davyd) [#322202]
|
||||
|
||||
Translations
|
||||
Miloslav Trmac (cs), Adam Weinberger (en_CA), Ankit Patel (gu),
|
||||
Kjartan Maraas (nb), Kjartan Maraas (no), Marcel Telka (sk)
|
||||
|
||||
2.13.3
|
||||
==
|
||||
|
||||
This is a special edition release just for gicmo, code-named 'elijah,
|
||||
please do a release so magic seb can bring it to me'. It fixes a
|
||||
number of issues due to the major constraints changes found since the
|
||||
last release.
|
||||
|
||||
Thanks to Davyd Madeley and Elijah Newren for improvements in this release.
|
||||
|
||||
- Differentiate between movement towards an edge and movement away from
|
||||
one for edge-resistance. Pick smaller constants for movement away from
|
||||
an edge (Elijah)
|
||||
- Use GPOINTER_TO_INT() macro instead of cast to allow compilation on
|
||||
64-bit architectures without warning (Davyd)
|
||||
- compute the frame geometry due to maximization only after actually
|
||||
maximizing (Elijah) [#321902]
|
||||
- add some developer documentation on updating struts, workareas, regions,
|
||||
and edges (Elijah)
|
||||
- When updating the xinerama due to placement, update which
|
||||
maximal/spanning rect set to use as well (Elijah) [#322068]
|
||||
- Relax the partially onscreen constraint to allow the titlebar to touch
|
||||
the bottom panel in order to make the new constraints code function the
|
||||
same as the old version (Elijah) [#322071]
|
||||
- Don't allow removing a window from maximized or fullscreened state to
|
||||
place the titlebar under the top panel (Elijah) [#322075]
|
||||
|
||||
Translations
|
||||
Vladimir Petkov (bg), Francisco Javier F. Serrador (es), Ignacio Casal
|
||||
Quinteiro (gl), Takeshi AIHANA (ja), Theppitak Karoonboonyanan (th)
|
||||
|
||||
2.13.2
|
||||
==
|
||||
|
||||
This release just contains a merge of all the changes on the
|
||||
constraints_experiments branch.
|
||||
|
||||
Thanks to Havoc Pennington for reviewing the gargantuan patch and
|
||||
suggesting lots of little fixes for making it better, to Rob Adams and
|
||||
Soeren Sandmann for grilling me on how some of the difficult internals work
|
||||
-- allowing me to improve the documentation, to Olav Vitters for finding an
|
||||
easy-to-fix crasher bug in early testing and for repeatedly extending my
|
||||
deadline for switching from working on Metacity to Bugzilla, to Ray Strode
|
||||
for finding two crashers and fixing one of them in early testing, to Bryan
|
||||
Clark for usability advice, to Davyd Madeley and Christian Kellner for
|
||||
testing Xinerama stuff, to Sebastien Bacher for packaging an early version
|
||||
and finding some obscure bugs (that I unfortunately still can't duplicate
|
||||
and will probably still need to fix once I can),
|
||||
|
||||
Bugs fixed:
|
||||
unfiled - constraints.c is overly complicated[1]
|
||||
unfiled - constraints.c is not robust when all constraints cannot
|
||||
simultaneously be met (constraints need to be prioritized)
|
||||
unfiled - keep-titlebar-onscreen constraint is decoration unaware (since
|
||||
get_outermost_onscreen_positions() forgets to include
|
||||
decorations)
|
||||
unfiled - keyboard snap-moving and snap-resizing snap to hidden edges
|
||||
86644 - resize should have a shift option like move does
|
||||
109553 - gravity w/ simultaneous move & resize doesn't work
|
||||
113601 - maximize vertical and horizontal should toggle and be
|
||||
constrained
|
||||
122196 - windows show up under vertical panels
|
||||
122670 - jerky/random resizing of window via keyboard[2]
|
||||
124582 - keyboard and mouse snap-resizing and snap-moving erroneously
|
||||
moves the window multidimensionally
|
||||
136307 - don't allow apps to resize themselves off the screen (*cough*
|
||||
filechooser *cough*)
|
||||
142016, 143784 - windows should not span multiple xineramas unless
|
||||
placed there by the user
|
||||
143145 - clamp new windows to screensize and force them onscreen, if
|
||||
they'll fit
|
||||
144126 - Handle pathological strut lists sanely[3]
|
||||
149867 - fixed aspect ratio windows are difficult to resize[4]
|
||||
152898 - make screen edges consistent; allow easy slamming of windows
|
||||
into the left, right, and bottom edges of the screen too.
|
||||
154706 - bouncing weirdness at screen edge with keyboard moving or
|
||||
resizing
|
||||
156699 - avoid struts when placing windows, if possible (nasty a11y
|
||||
blocker)
|
||||
302456 - dragging offscreen too restrictive
|
||||
304857 - wireframe moving off the top of the screen is misleading
|
||||
308521 - make uni-directional resizing easier with alt-middle-drag and
|
||||
prevent the occasional super annoying resize-the-wrong-side(s)
|
||||
behavior
|
||||
312007 - snap-resize moves windows with a minimum size constraint
|
||||
312104 - resizing the top of a window can cause the bottom to grow
|
||||
319351 - don't instantly snap on mouse-move-snapping, remove
|
||||
braindeadedness of having order of releasing shift and
|
||||
releasing button press matter so much
|
||||
|
||||
[1] fixed in my opinion, anyway.
|
||||
[2] Actually, it's not totally fixed--it's just annoying
|
||||
instead of almost completely unusable. Matthias had a
|
||||
suggestion that may fix the remainder of the problems (see
|
||||
http://tinyurl.com/bwzuu).
|
||||
[3] This bug was originally about not-quite-so-pathological
|
||||
cases but was left open for the worse cases. The code from
|
||||
the branch handles the remainder of the cases mentioned in
|
||||
this bug.
|
||||
[4] Actually, although it's far better there's still some minor
|
||||
issues left: a slight drift that's only noticeable after
|
||||
lots of resizing, and potential problems with partially
|
||||
onscreen constraints due to not clearing any
|
||||
fixed_directions flags (aspect ratio windows get resized in
|
||||
both directions and thus aren't fixed in one of them)
|
||||
|
||||
New feature:
|
||||
81704 - edge resistance for user move and resize operations; in
|
||||
particular 3 different kinds of resistance are implemented:
|
||||
Pixel-Distance: window movement is resisted when it aligns with an
|
||||
edge unless the movement is greater than a threshold number of
|
||||
pixels
|
||||
Timeout: window movement past an edge is prevented until a certain
|
||||
amount of time has elapsed during the operation since the first
|
||||
request to move it past that edge
|
||||
Keyboard-Buildup: when moving or resizing with the keyboard, once a
|
||||
window is aligned with a certain edge it cannot move past until the
|
||||
correct direction has been pressed enough times (e.g. 2 or 3 times)
|
||||
|
||||
Major code changes:
|
||||
- constraints.c has been rewritten; very few lines of code from the old
|
||||
version remain. There is a comment near the top of the function
|
||||
explaining the basics of how the new framework works. A more detailed
|
||||
explanation can be found in doc/how-constraints-works.txt
|
||||
- edge-resistance.[ch] are new files implementing edge-resistance.
|
||||
- boxes.[ch] are new files containing low-level error-prone functions
|
||||
used heavily in constraints.c and edge-resistance.c, among various
|
||||
places throughout the code. testboxes.c contains a thorough testsuite
|
||||
for the boxes.[ch] functions compiled into a program, testboxes.
|
||||
- meta_window_move_resize_internal() *must* be told the gravity of the
|
||||
associated operation (if it's just a move operation, the gravity will
|
||||
be ignored, but for resize and move+resize the correct value is needed)
|
||||
- the craziness of different values that
|
||||
meta_window_move_resize_internal() accepts has been documented in a
|
||||
large comment at the beginning of the function. It may be possible to
|
||||
clean this up some, but until then things will remain as they were
|
||||
before--caller beware.
|
||||
- screen and xinerama usable areas (i.e. places not covered by
|
||||
e.g. panels) are cached in the workspace now, as are the screen and
|
||||
xinerama edges. These get updated with the workarea in
|
||||
src/workspace.c:ensure_work_areas_validated()
|
||||
|
||||
Translation
|
||||
Michiel Sikkes (nl)
|
||||
|
||||
2.13.1
|
||||
==
|
||||
|
||||
Thanks to Philip O'Brien, Kjartan Maraas, and Aidan Delaney for
|
||||
improvements in this release.
|
||||
|
||||
- add handling for META_PREF_CURSOR_THEME and META_PREF_CURSOR_SIZE
|
||||
for more complete debug info (Philip) [#318976]
|
||||
- Remove possible g_source leak in #ifdef'd out code, in case anyone uses
|
||||
it in the future (Kjartan) [#320050]
|
||||
- Changed the 'minimized' field of the MetaTabEntry struct to 'hidden'
|
||||
(Aidan) [#168455]
|
||||
|
||||
Translations
|
||||
Miloslav Trmac (cs), Francisco Javier F. Serrador (es), Takeshi AIHANA (ja),
|
||||
Erdal Ronahi (ku), Theppitak Karoonboonyanan (th)
|
||||
|
||||
2.13.0
|
||||
==
|
||||
|
||||
Thanks to Bj<42>rn Lindqvist, Kjartan Maraas, S<>ren Sandmann,
|
||||
Elijah Newren, Ross Cohen, and Muktha for improvements in this release
|
||||
since 2.12.1.
|
||||
|
||||
- Mave ancestors come along with the transient when moving the window from
|
||||
one workspace to another (Bj<42>rn) [#314977]
|
||||
- Fix the workspace switcher tabpopup to display the right windows and to
|
||||
fix the pick-a-new-window-to-focus algorithm in order to not select
|
||||
windows that aren't showing (Bj<42>rn) [#170475]
|
||||
- Fix a couple memory leaks (Kjartan, S<>ren, Elijah) [#313030]
|
||||
- Make alt-esc (the "switch between windows immediately" keybinding)
|
||||
actually show minimized windows too (Ross) [#107072]
|
||||
- Make alt-esc consistent with alt-tab by leaving stacking of unselected
|
||||
windows unchanged (Ross) [#314285]
|
||||
- Clarify the meaning of the auto_raise preference (Elijah) [#312421]
|
||||
- Fix a crash that occurs when removing some virtual desktops and windows
|
||||
happen to be on those desktops (Elijah) [#318306]
|
||||
- Make the unfocussed Simple window border visible with high contrast
|
||||
inverse theme (Muktha) [#121361]
|
||||
- Fix edge snapping for multi-screen (non-xinerama) setups (Elijah)
|
||||
[#319425]
|
||||
|
||||
Translations
|
||||
Vladimir Petkov (bg), Kostas Papadimas (el), Adam Weinberger (en_CA),
|
||||
Ivar Smolin (et), Michiel Sikkes (nl), Marcel Telka (sk), Funda
|
||||
Wang (zh_CN)
|
||||
|
||||
2.12.1
|
||||
==
|
||||
|
||||
Thanks to Ray Strode, Havoc Pennington, and Elijah Newren for
|
||||
improvements in this release.
|
||||
|
||||
- Truncate ridiculously long titles to avoid crashing or letting the
|
||||
pager crash (Ray, Havoc, Elijah) [#315070]
|
||||
- Get the tabbing window outline to work with gtk+ 2.8.4 again
|
||||
(Elijah) [#317528]
|
||||
|
||||
Translations
|
||||
Mahay Alam Khan (bn), Francisco Javier F. Serrador (es), Ivar Smolin (et),
|
||||
I<>aki Larra<72>aga Murgoitio (eu), Luca Ferretti (it), Christian Rose (sv),
|
||||
Clytie Siddall (vi), Funda Wang (zh_CN)
|
||||
|
||||
2.12.0
|
||||
==
|
||||
|
||||
Thanks to Brent Smith for finding the crasher in the release candidate!
|
||||
|
||||
- Fix an uninitialized variable problem causing crashes (Brent) [#315000]
|
||||
|
||||
Translations
|
||||
Bryn Salisbury (cy), Hendrik Richter (de), Christophe Merlet (RedFox) (fr),
|
||||
Ignacio Casal Quinteiro (gl), Norayr Chilingaryan (hy), Young-Ho Cha (ko),
|
||||
<20>ygimantas Berucka (lt), Michiel Sikkes (nl), Leonid Kanter (ru), Danilo
|
||||
<1B>egan(sr), Baris Cicek (tr)
|
||||
|
||||
2.11.3
|
||||
==
|
||||
|
||||
Thanks to Bj<42>rn Lindqvist and Elijah Newren for improvements in
|
||||
this release.
|
||||
|
||||
- Check for the right versions of glib and gtk+ (Bj<42>rn) [#314116]
|
||||
- Avoid obscuring centered-on-desktop windows which are denied focus
|
||||
(Elijah) [#313234]
|
||||
|
||||
Translations
|
||||
Vladimir Petkov (bg), Jordi Mallach (ca), Kostas Papadimas (el),
|
||||
Ivar Smolin (et), Gabor Kelemen (hu), Mohammad DAMT (id), Duarte
|
||||
Loreto (pt), Mugurel Tudor (ro), Laurent Dhima (sq), Maxim
|
||||
Dziumanenko (uk)
|
||||
|
||||
2.11.2
|
||||
==
|
||||
|
||||
Thanks to Elijah Newren, Jaap Haitsma, Ray Strode, and Brent Smith for
|
||||
improvements in this release.
|
||||
|
||||
- Fix an easy to trigger crasher in 2.11.1 caused by unneeded
|
||||
debugging spew (Elijah) [#311819]
|
||||
- Make sure that Metacity dialogs have icons (Jaap) [#309876]
|
||||
- Fix an infinite restacking flicker loop in sloppy and mouse focus
|
||||
with fullscreen windows (Elijah) [#311400]
|
||||
- Change default theme from Simple to Clearlooks (Elijah)
|
||||
- Vastly improve the behavior of keyboard move/resize and edge
|
||||
snapping (Ray) [#310888]
|
||||
- Remove a duplicate string (Brent) [#309774]
|
||||
|
||||
Translations
|
||||
Yuval Tanny (he), Gnome PL Team (pl), Raphael Higino (pt_BR),
|
||||
Chao-Hsiung Liao (zh_TW)
|
||||
|
||||
2.11.1
|
||||
==
|
||||
|
||||
Thanks to Elijah Newren, Ken Harris, Matthias Clasen, Christian
|
||||
Persch, and Billy Biggs for improvements in this release.
|
||||
|
||||
- Fix a miscoloring of parts of the titlebar introduced in the last
|
||||
unstable release (Elijah) [follow-up to #169982]
|
||||
- Provide a more lenient threshold for drawing rounded corners (Ken)
|
||||
[#122065]
|
||||
- Make the Xcursor changes in the last unstable release effective
|
||||
(Matthias) [follow-up to #308106]
|
||||
- Revert the _NET_ACTIVE_WINDOW behavior change made in the 2.9.x
|
||||
unstable series; activation includes changing a window to the
|
||||
current workspace again (Elijah) [reversion of #128380]
|
||||
- Restore original window size if the window was maximized upon
|
||||
withdrawing it (Elijah, Christian) [#137185]
|
||||
- Fix a raising bug with a window that has more than one child window
|
||||
(Elijah, Billy) [part of #307875]
|
||||
- Try to place windows denied focus near the focus window and fix a
|
||||
xinerama bug with the placement (Elijah) [part of #307875]
|
||||
- Avoid modal dialogs being obscured in somewhat pathologically
|
||||
strange circumstances that Eclipse seems to be good at triggering
|
||||
(Elijah) [part of #307875]
|
||||
|
||||
Translations
|
||||
Miloslav Trmac (cs), Kostas Papadimas (el), Adam Weinberger (en_CA),
|
||||
Francisco Javier F. Serrador (es), Ilkka Tuohela (fi), Christophe
|
||||
Merlet (RedFox) (fr), Ignacio Casal Quinteiro (gl), Ankit
|
||||
Patel (gu), Yair Hershkovitz (he), Takeshi AIHANA (ja), Kjartan
|
||||
Maraas (nb), Kjartan Maraas (no), Marcel Telka (sk), Theppitak
|
||||
Karoonboonyanan (th), Clytie Siddall (vi), Funda Wang (zh_CN)
|
||||
|
||||
2.11.0
|
||||
==
|
||||
|
||||
This release contains all fixes up to Metacity 2.10.2 plus some new goodies.
|
||||
|
||||
Thanks to Matthias Clasen, Aivars Kalvans, Bj<42>rn Lindqvist, and
|
||||
Andrew Johnson for improvements in this release.
|
||||
|
||||
- React to cursor theme changes (Matthias) [#308106]
|
||||
- Plug a small leak with xinerama information (Aivars) [#307884]
|
||||
- Split up main() into more manageable chunks and make use of GOpt
|
||||
(Bj<42>rn) [#305331]
|
||||
- Speed up vertical gradients (Andrew) [#169982]
|
||||
|
||||
Translations
|
||||
Hendrik Richter (de), Ivar Smolin (et), Ignacio Casal
|
||||
Quinteiro (gl), Clytie Siddall (vi)
|
||||
|
||||
2.10.2
|
||||
==
|
||||
|
||||
Thanks to Billy Biggs, Greg Hudson, Elijah Newren, Ray Strode, Ryan
|
||||
Lortie, and Soeren Sandmann for improvements in this release.
|
||||
|
||||
- Makes metacity a bit faster when dragging windows around (Soeren) [#141813]
|
||||
- Fix simple memory error, using the address of a local variable as a
|
||||
hash key (Ryan) [#307209]
|
||||
- Fix a small leak in the case of a SYNC_COUNTER property value and
|
||||
HAVE_XSYNC not defined (Ryan) [#307214]
|
||||
- Cleanup font data when done with it (Ray) [#306720]
|
||||
- If the window has a modal transient which is being unmanaged, don't
|
||||
focus it (Elijah) [#305362]
|
||||
- Make sure window position is calculated correctly for reconfigure
|
||||
requests when part of the XWindowChanges structure is uninitialized
|
||||
(Greg) [#305257]
|
||||
- Add a resize popup when resizing constrained windows (Ray) [#305564]
|
||||
- Don't accidentally treat maximize vertically as maximize in both
|
||||
directions (Elijah) [#302204]
|
||||
- Put all transients of the new window, if any exist, in the
|
||||
calc_showing queue (Elijah, Billy) [#303284]
|
||||
|
||||
Translations
|
||||
Kostas Papadimas (el), Priit Laes (et), Pauli Virtanen (fi), Ignacio
|
||||
Casal Quinteiro (gl), Theppitak Karoonboonyanan (th), Canonical
|
||||
Ltd (xh), Woodman Tuen (zh_TW)
|
||||
|
||||
2.10.1
|
||||
==
|
||||
|
||||
This is a stable release to coincide with the release of Gnome 2.10.0.
|
||||
|
||||
Thanks to Dan Winship and Lex Hider for fixes in this release.
|
||||
|
||||
- Make sure the "Close" button has the focus in the
|
||||
buggy-session-management-applications-warning dialog instead of the
|
||||
table (Dan) [#172703]
|
||||
- add doc/code-overview.txt and doc/how-to-get-focus-right.txt to the
|
||||
distributed files (Lex) [#170519]
|
||||
|
||||
Translations
|
||||
Adam Weinberger (en_CA), Christopher Orr (en_GB), Elnaz Sarbar (fa),
|
||||
Gabor Kelemen (hu), Jyotsna Shrestha (ne), Steve Murphy (rw),
|
||||
Baris Cicek (tr), Canonical Ltd (xh)
|
||||
|
||||
2.10.0
|
||||
==
|
||||
|
||||
This is a stable release to coincide with the release of Gnome 2.10.0.
|
||||
The only difference between this version and 2.9.34 is some
|
||||
translation updates.
|
||||
|
||||
Translations
|
||||
Vladimir Petkov (bg), Gabor Kelemen (hu), <20>ygimantas Berucka (lt),
|
||||
Reinout van Schouwen (nl), Mugurel Tudor (ro), Danilo <20>egan (sr),
|
||||
Woodman Tuen (zh_TW)
|
||||
|
||||
2.9.34
|
||||
==
|
||||
|
||||
This is an unstable release to coincide with the release of Gnome
|
||||
2.10.0 release candidate 1 (2.9.92).
|
||||
|
||||
Thanks to Aidan Delaney, Elijah Newren, and Joe Marcus Clarke for
|
||||
fixes in this release.
|
||||
|
||||
- Fix crash that occurs when stupid apps claim that a window is its
|
||||
own parent (Elijah, Joe) [#168207]
|
||||
- Prevent the visual bell from changing the focus window (Elijah)
|
||||
[#123366]
|
||||
- Make sure that icons in the alt-tab popup are dimmed for all hidden
|
||||
windows, not just minimized ones (Aidan) [#168455]
|
||||
|
||||
Translations
|
||||
Elnaz Sarbar (fa), Ankit Patel (gu), Luca Ferretti (it),
|
||||
Reinout van Schouwen (nl), Gnome PL Team (pl),
|
||||
Alexandre Folle de Menezes (pt_BR)
|
||||
|
||||
2.9.21
|
||||
==
|
||||
|
||||
|
5
README
5
README
@@ -6,9 +6,10 @@ 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.[01], 2.8.1.x, 2.8.5-, 2.10.x,
|
||||
2.12.x.
|
||||
|
||||
Unstable branches are 2.3.x, 2.5.x, 2.8.2-4, 2.9.x)
|
||||
Unstable branches are 2.3.x, 2.5.x, 2.8.2-4, 2.9.x, 2.11.x, 2.13.x
|
||||
|
||||
COMPILING METACITY
|
||||
===
|
||||
|
33
configure.in
33
configure.in
@@ -2,7 +2,7 @@ AC_PREREQ(2.50)
|
||||
|
||||
# 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.21],
|
||||
AC_INIT([metacity], [2.13.34],
|
||||
[http://bugzilla.gnome.org/enter_bug.cgi?product=metacity])
|
||||
|
||||
AC_CONFIG_SRCDIR(src/display.c)
|
||||
@@ -155,12 +155,15 @@ AC_ARG_ENABLE(shape,
|
||||
## try definining HAVE_BACKTRACE
|
||||
AC_CHECK_HEADERS(execinfo.h, [AC_CHECK_FUNCS(backtrace)])
|
||||
|
||||
ALL_LINGUAS="am ar az be bg bn bs ca cs cy da de el en_CA en_GB es et eu fa fi fr ga gl gu he hi hr hu id is it ja ko lt lv mk ml mn ms nb nl nn no or pa pl pt pt_BR ro ru sl sk sq sr sr@Latn sv ta th tk tr uk vi wa zh_CN zh_TW"
|
||||
ALL_LINGUAS="am ar az be bg bn bs ca cs cy da de el en_CA en_GB es et eu fa fi fr ga gl gu he hi hr hu hy id is it ja ko ku lt lv mk ml mn ms nb ne nl nn no or pa pl pt pt_BR ro ru rw sl sk sq sr sr@Latn sv ta th tk tr uk vi wa xh zh_CN zh_TW"
|
||||
AM_GLIB_GNU_GETTEXT
|
||||
|
||||
## here we get the flags we'll actually use
|
||||
PKG_CHECK_MODULES(METACITY_MESSAGE, gtk+-2.0 >= 2.2.0)
|
||||
PKG_CHECK_MODULES(METACITY_WINDOW_DEMO, gtk+-2.0 >= 2.2.0)
|
||||
# GOptionEntry requires glib-2.6.0
|
||||
PKG_CHECK_MODULES(ALL, glib-2.0 >= 2.6.0)
|
||||
# gtk_window_set_icon_name requires gtk2+-2.60
|
||||
PKG_CHECK_MODULES(METACITY_MESSAGE, gtk+-2.0 >= 2.6.0)
|
||||
PKG_CHECK_MODULES(METACITY_WINDOW_DEMO, gtk+-2.0 >= 2.6.0)
|
||||
|
||||
if $PKG_CONFIG --atleast-version 1.2.0 pangoxft; then
|
||||
echo "pangoxft found"
|
||||
@@ -219,7 +222,7 @@ fi
|
||||
|
||||
if test x$have_xcomposite = xyes; then
|
||||
echo "Building with CompositeExt"
|
||||
METACITY_PC_MODULES="$METACITY_PC_MODULES xcomposite >= $XCOMPOSITE_VERSION xfixes xrender xdamage"
|
||||
METACITY_PC_MODULES="$METACITY_PC_MODULES xcomposite >= $XCOMPOSITE_VERSION xfixes xrender xdamage cm"
|
||||
AC_DEFINE(HAVE_COMPOSITE_EXTENSIONS, , [Building with compositing manager support])
|
||||
|
||||
## force on render also
|
||||
@@ -258,6 +261,20 @@ if test x$have_xrender = xyes; then
|
||||
AC_DEFINE(HAVE_RENDER, , [Building with Render extension support])
|
||||
fi
|
||||
|
||||
AC_MSG_CHECKING([Xcursor])
|
||||
if $PKG_CONFIG xcursor; then
|
||||
have_xcursor=yes
|
||||
else
|
||||
have_xcursor=no
|
||||
fi
|
||||
AC_MSG_RESULT($have_xcursor)
|
||||
|
||||
if test x$have_xcursor = xyes; then
|
||||
echo "Building with Xcursor"
|
||||
METACITY_PC_MODULES="$METACITY_PC_MODULES xcursor"
|
||||
AC_DEFINE(HAVE_XCURSOR, , [Building with Xcursor support])
|
||||
fi
|
||||
|
||||
PKG_CHECK_MODULES(METACITY, $METACITY_PC_MODULES)
|
||||
|
||||
AC_PATH_XTRA
|
||||
@@ -446,6 +463,9 @@ if test x$enable_gconf = xyes; then
|
||||
fi
|
||||
|
||||
AM_GCONF_SOURCE_2
|
||||
else
|
||||
GCONF_SCHEMAS_INSTALL_TRUE='#'
|
||||
GCONF_SCHEMAS_INSTALL_FALSE=
|
||||
fi
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
@@ -498,6 +518,7 @@ metacity-$VERSION:
|
||||
Resize-and-rotate: ${found_randr}
|
||||
Xsync: ${found_xsync}
|
||||
Render: ${have_xrender}
|
||||
Xcursor: ${have_xcursor}
|
||||
"
|
||||
echo "This is the UNSTABLE branch of metacity"
|
||||
echo "Use 2.8.x (where x > 5) for stable (gnome-2-8 branch in CVS)"
|
||||
echo "Use 2.12.x for stable (gnome-2-12 branch in CVS)"
|
||||
|
@@ -1,3 +1,4 @@
|
||||
SUBDIRS = man
|
||||
|
||||
EXTRA_DIST=theme-format.txt metacity-theme.dtd dialogs.txt
|
||||
EXTRA_DIST=theme-format.txt metacity-theme.dtd dialogs.txt code-overview.txt \
|
||||
how-to-get-focus-right.txt
|
||||
|
283
doc/how-constraints-works.txt
Normal file
283
doc/how-constraints-works.txt
Normal file
@@ -0,0 +1,283 @@
|
||||
File contents:
|
||||
Basic Ideas
|
||||
Important points to remember
|
||||
Explanation of fields in the ConstraintInfo struct
|
||||
Gory details of resize_gravity vs. fixed_directions
|
||||
|
||||
IMPORTANT NOTE: There's a big comment at the top of constraints.c
|
||||
explaining how to add extra constraints or tweak others. Read it. I put
|
||||
that information there because it may be enough information by itself for
|
||||
people to hack on constraints.c. I won't duplicate that information in
|
||||
this file; this file is for deeper details.
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
Basic Ideas
|
||||
---------------------------------------------------------------------------
|
||||
There are a couple basic ideas behind how this constraints.c code works and
|
||||
why it works that way:
|
||||
|
||||
1) Split the low-level error-prone operations into a special file
|
||||
2) Add robustness by prioritizing constraints
|
||||
3) Make use of a minimal spanning set of rectangles for the
|
||||
"onscreen region" (screen minus struts).
|
||||
4) Constraints can be user-action vs app-action oriented
|
||||
5) Avoid over-complification ;-)
|
||||
|
||||
Some more details explaining these basic ideas:
|
||||
|
||||
1) Split tedious operations out
|
||||
|
||||
boxes.[ch] have been added which contain many common, tedious, and
|
||||
error-prone operations. I find that this separation helps a lot for
|
||||
managing the complexity and ensuring that things work correctly.
|
||||
Also, note that testboxes.c thoroughly tests all functionality in
|
||||
boxes.[ch] and a testboxes program is automatically compiled.
|
||||
|
||||
Note that functions have also been added to this file to handle some
|
||||
of the tedium necessary for edge resistance as well.
|
||||
|
||||
2) Prioritize constraints
|
||||
|
||||
In the old code, if each and every constraint could not be
|
||||
simultaneously satisfied, then it would result in some
|
||||
difficult-to-predict set of constraints being violated. This was
|
||||
because constraints were applied in order, with the possibility for
|
||||
each making changes that violated previous constraints, with no
|
||||
checking done at the end.
|
||||
|
||||
Now, all constraints have an associated priority, defined in the
|
||||
ConstraintPriority enum near the top of constraints.c. The
|
||||
constraints are all applied, and then are all checked; if not all are
|
||||
satisfied then the least important constraints are dropped and the
|
||||
process is repeated. This ensures that the most important constraints
|
||||
are satisfied.
|
||||
|
||||
A special note to make here is that if any one given constraint is
|
||||
impossible to satisfy even individually (e.g. if minimum size hints
|
||||
specify a larger window than the screen size, making the
|
||||
fully-onscreen constraint impossible to satisfy) then we treat the
|
||||
constraint as being satisfied. This sounds counter-intuitive, but the
|
||||
idea is that we want to satisfy as many constraints as possible and if
|
||||
we treat it as a violation then all constraints with a lesser priority
|
||||
also get dropped along with the impossible to satisfy one.
|
||||
|
||||
3) Using maximal/spanning rectangles
|
||||
|
||||
The constraints rely heavily on something I call spanning rectangles
|
||||
(which Soeren referred to as maximal rectangles, a name which I think
|
||||
I like better but I don't want to go change all the code now). These
|
||||
spanning rectangles have the property that a window will fit on the
|
||||
screen if and only if it fits within at least one of the rectangles.
|
||||
Soeren had an alternative way of describing these rectangles, namely
|
||||
that they were rectangles with the property that if you made any of
|
||||
them larger in any direction, they would overlap with struts or be
|
||||
offscreen (with the implicit assumption that there are enough of these
|
||||
rectangles that combined they cover all relevant parts of the screen).
|
||||
Note that, by necessity, these spanning/maximal rectangles will often
|
||||
overlap each other.
|
||||
|
||||
Such a list makes it relatively easy to define operations like
|
||||
window-is-onscreen or clamp-window-to-region or
|
||||
shove-window-into-region. Since we have a on-single-xinerama
|
||||
constraint in addition to the onscreen constraint(s), we cache
|
||||
number_xineramas + 1 of these lists in the workspace. These lists
|
||||
then only need to be updated whenever the workarea is (e.g. when strut
|
||||
list change or screen or xinerama size changes).
|
||||
|
||||
4) Constraints can be user-action vs app-action oriented
|
||||
|
||||
Such differentiation requires special care for the constraints to be
|
||||
consistent; e.g. if the user does something and one constraint
|
||||
applies, then the app does something you have to be careful that the
|
||||
constraint on the app action doesn't result in some jarring motion.
|
||||
|
||||
In particular, the constraints currently allow offscreen movement or
|
||||
resizing for user actions only. The way consistency is handled is
|
||||
that at the end of the constraints, update_onscreen_requirements()
|
||||
checks to see if the window is offscreen or split across xineramas and
|
||||
updates window->require_fully_onscreen and
|
||||
window->require_on_single_xinerama appropriately.
|
||||
|
||||
5) Avoid over-complification
|
||||
|
||||
The previous code tried to reform the constraints into terms of a
|
||||
single variable. This made the code rather difficult to
|
||||
understand. ("This is a rather complicated fix for an obscure bug
|
||||
that happened when resizing a window and encountering a constraint
|
||||
such as the top edge of the screen.") It also failed, even on the
|
||||
very example for which it used as justification for the complexity
|
||||
(bug 312104 -- when keyboard resizing the top of the window,
|
||||
Metacity extends the bottom once the titlebar hits the top panel),
|
||||
though the reason why it failed is somewhat mysterious as it should
|
||||
have worked. Further, it didn't really reform the constraints in
|
||||
terms of a single variable -- there was both an x_move_delta and an
|
||||
x_resize_delta, and the existence of both caused bug 109553
|
||||
(gravity with simultaneous move and resize doesn't work)
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
Important points to remember
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
- Inner vs Outer window
|
||||
|
||||
Note that because of how configure requests work and
|
||||
meta_window_move_resize_internal() and friends are set up, that the
|
||||
rectangles passed to meta_window_constrain() are with respect to inner
|
||||
window positions instead of outer window positions (meaning that window
|
||||
manager decorations are not included in the position/size). For the
|
||||
constraints that need to be enforced with respect to outer window
|
||||
positions, you'll need to make use of the extend_by_frame() and
|
||||
unextend_by_frame() functions.
|
||||
|
||||
- meta_window_move_resize_internal() accepts a really hairy set of
|
||||
inputs. See the huge comment at the beginning of that function.
|
||||
constraints gets screwed up if that function can't sanitize the input,
|
||||
so be very careful about that. It used to be pretty busted.
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
Explanation of fields in the ConstraintInfo strut
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
As of the time of this writing, ConstraintInfo had the following fields:
|
||||
orig
|
||||
current
|
||||
fgeom
|
||||
action_type
|
||||
is_user_action
|
||||
resize_gravity
|
||||
fixed_directions
|
||||
work_area_xinerama
|
||||
entire_xinerama
|
||||
usable_screen_region
|
||||
usable_xinerama_region
|
||||
|
||||
A brief description of each and/or pointers to more information are found
|
||||
below:
|
||||
orig
|
||||
The previous position and size of the window, ignoring any window
|
||||
decorations
|
||||
current
|
||||
The requested position and size of the window, ignoring any window
|
||||
decorations. This rectangle gets modified by the various constraints
|
||||
to specify the allowed position closest to the requested position.
|
||||
fgeom
|
||||
The geometry of the window frame (i.e. "decorations"), if it exists.
|
||||
Otherwise, it's a dummy 0-size frame for convenience (i.e. this pointer
|
||||
is guaranteed to be non-NULL so you don't have to do the stupid check).
|
||||
action_type
|
||||
Whether the action being constrained is a move, resize, or a combined
|
||||
move and resize. Some constraints can run faster with this information
|
||||
(e.g. constraining size increment hints or min size hints don't need to
|
||||
do anything for pure move operations). This may also be used for
|
||||
providing slightly different behavior (e.g. clip-to-region instead of
|
||||
shove-into-region for resize vs. moving operations), but doesn't
|
||||
currently have a lot of use for this.
|
||||
is_user_action
|
||||
Used to determine whether the action being constrained is a user
|
||||
action. If so, certain parts of the constraint may be relaxed. Note
|
||||
that this requires care to get right; see item 4 of the basic ideas
|
||||
section for more details.
|
||||
resize_gravity
|
||||
The gravity used in the resize operation, used in order to make sure
|
||||
windows are resized correctly if constraints specify that their size
|
||||
must be modified. Explained further in the resize_gravity
|
||||
vs. fixed_directions section.
|
||||
fixed_directions
|
||||
There may be multiple solutions to shoving a window back onscreen.
|
||||
Typically, the shortest distance used is the solution picked, but if
|
||||
e.g. an application only moved its window in a single direction, it's
|
||||
more desirable that the window is shoved back in that direction than in
|
||||
a different one. fixed_directions facilitates that. Explained further
|
||||
in the resize_gravity vs. fixed_directions section.
|
||||
work_area_xinerama
|
||||
This region is defined in the workspace and just cached here for
|
||||
convenience. It is basically the area obtained by taking the current
|
||||
xinerama, treating all partial struts as full struts, and then
|
||||
subtracting all struts from the current xinerama region. Useful
|
||||
e.g. for enforcing maximization constraints.
|
||||
entire_xinerama
|
||||
Just a cache of the rectangle corresponding to the entire current
|
||||
xinerama, including struts. Useful e.g. for enforcing fullscreen
|
||||
constraints.
|
||||
usable_screen_region
|
||||
The set of maximal/spanning rectangles for the entire screen; this
|
||||
region doesn't overlap with any struts and helps to enforce
|
||||
e.g. onscreen constraints.
|
||||
usable_xinerama_region
|
||||
The set of maximal/spanning rectangles for the current xinerama; this
|
||||
region doesn't overlap with any struts on the xinerama and helps to
|
||||
enforce e.g. the on-single-xinerama constraint.
|
||||
|
||||
|
||||
---------------------------------------------------------------------------
|
||||
Gory details of resize_gravity vs. fixed_directions
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
Note that although resize_gravity and fixed_directions look similar, they
|
||||
are used for different purposes:
|
||||
|
||||
- resize_gravity is only for resize operations and is used for
|
||||
constraints unrelated to keeping a window within a certain region
|
||||
- fixed_directions is for both move and resize operations and is
|
||||
specifically for keeping a window within a specified region.
|
||||
|
||||
Examples of where each are used:
|
||||
|
||||
- If a window is simultaneously moved and resized to the southeast corner
|
||||
with SouthEastGravity, but it turns out that the window was sized to
|
||||
something smaller than the minimum size hint, then the size_hints
|
||||
constraint should resize the window using the resize_gravity to ensure
|
||||
that the southeast corner doesn't move.
|
||||
- If an application resizes itself so that it grows downward only (which
|
||||
I note could be using any of three different gravities, most likely
|
||||
NorthWest), and happens to put the southeast part of the window under a
|
||||
partial strut, then the window needs to be forced back on screen.
|
||||
(Yes, shoved onscreen and not clipped; see bug 136307). It may be the
|
||||
case that moving the window to the left results in less movement of the
|
||||
window than moving the window up, which, in the absence of fixed
|
||||
directions would cause us to chose moving to the left. But since the
|
||||
user knows that only the height of the window is changing, they would
|
||||
find moving to the left weird (especially if this were a dialog that
|
||||
had been centered on its parent). It'd be better to shove the window
|
||||
upwards so we make sure to keep the left and right sides fixed in this
|
||||
case. Note that moving the window upwards (or leftwards) is probably
|
||||
totally against the gravity in this case; but that's okay because
|
||||
gravity typically assumes there's more than enough onscreen space for
|
||||
the resize and we only override the gravity when that assumption is
|
||||
wrong.
|
||||
|
||||
For the paranoid, a fixed directions might give an impossible to fulfill
|
||||
constraint (I don't think that's true currently in the code, but I haven't
|
||||
thought it through in a while). If this ever becomes a problem, it should
|
||||
be relatively simple to throw out the fixed directions when this happens
|
||||
and rerun the constraint. Of course, it might be better to rethink things
|
||||
to just avoid such a problem.
|
||||
|
||||
The nitty gritty of what gets fixed:
|
||||
User move:
|
||||
in x direction - y direction fixed
|
||||
in y direction - x direction fixed
|
||||
in both dirs. - neither direction fixed
|
||||
User resize: (note that for clipping, only 1 side ever changed)
|
||||
in x direction - y direction fixed (technically opposite x side fixed too)
|
||||
in y direction - x direction fixed (technically opposite y side fixed too)
|
||||
in both dirs. - neither direction fixed
|
||||
App move:
|
||||
in x direction - y direction fixed
|
||||
in y direction - x direction fixed
|
||||
in both dirs. - neither direction fixed
|
||||
App resize
|
||||
in x direction - y direction fixed
|
||||
in y direction - x direction fixed
|
||||
in 2 parallel directions (center side gravity) - other dir. fixed
|
||||
in 2 orthogonal directions (corner gravity) - neither dir. fixed
|
||||
in 3 or 4 directions (a center-like gravity) - neither dir. fixed
|
||||
Move & resize
|
||||
Treat like resize case though this will usually mean all four sides
|
||||
change and result in neither direction being fixed
|
||||
Note that in all cases, if neither direction moves it is likely do to a
|
||||
change in struts and thus neither direction should be fixed despite the
|
||||
lack of movement.
|
54
doc/strut-and-related-updating.txt
Normal file
54
doc/strut-and-related-updating.txt
Normal file
@@ -0,0 +1,54 @@
|
||||
How updates happen for struts, workareas, and screen/xinerama regions/edges:
|
||||
One of three things causes meta_window_update_struts to be called
|
||||
(a) initial window map (window.c:meta_window_new_with_attrs())
|
||||
(b) update of _net_wm_strut* properties (window.c:process_property_notify())
|
||||
(c) screen resizes (e.g. via xrandr; from screen.c:meta_screen_resize_func())
|
||||
meta_window_update_struts (MetaWindow *window)
|
||||
- Gets new list of struts from window properties
|
||||
- Makes sure window doesn't single-handedly fill the screen
|
||||
- records new struts if different and calls invalidate_work_areas()
|
||||
invalidate_work_areas ()
|
||||
- Calls meta_workspace_invalidate_work_area() for each workspace it's on
|
||||
meta_workspace_invalidate_work_area()
|
||||
- Cleans out all strut lists
|
||||
- queues all windows for resizing
|
||||
- Calls meta_screen_queue_workarea_recalc (workspace->screen);
|
||||
meta_screen_queue_workarea_recalc()
|
||||
- Adds set_work_area_idle_func() as an idle handler
|
||||
|
||||
set_work_area_idle_func()
|
||||
- Calls set_work_area_hint()
|
||||
set_work_area_hint()
|
||||
- Calls meta_workspace_get_work_area_all_xineramas()
|
||||
- Sets _NET_WORKAREA property
|
||||
meta_workspace_get_work_area_all_xineramas()
|
||||
- Calls ensure_work_areas_validated()
|
||||
ensure_work_areas_validated()
|
||||
- Loops over xineramas
|
||||
- Loops over windows, then struts:
|
||||
- Adds struts to list first time through xinerama loop
|
||||
- Find the amount of the strut on the given xinerama for <dir>_strut
|
||||
- Just max the amount of the strut with the all_<dir>_strut
|
||||
- Makes sure there's a non-empty xinerama workarea
|
||||
- Record the xinerama workarea
|
||||
- Make sure there's a non-empty screen workarea
|
||||
- Record the screen workarea
|
||||
- Cache the spanning rects for the screen and xinerama regions
|
||||
- Cache the screen and xinerama edges
|
||||
|
||||
Alternatively to all the above, if the idle function for the screen
|
||||
has not yet fired, constraints.c:setup_constraint_info() can call
|
||||
either workspace.c:meta_workspace_get_onscreen_region() or
|
||||
workspace.c:meta_workspace_get_onxinerama_region() which in turn
|
||||
call workspace.c:ensure_work_areas_validated().
|
||||
|
||||
Meaning of related functions that might be difficult to tell apart:
|
||||
screen.c:meta_screen_get_current_xinerama ()
|
||||
- Finds out which xinerama the mouse is on with an XQueryPointer
|
||||
window.c:meta_window_get_work_area_current_xinerama()
|
||||
window.c:meta_window_get_work_area_for_xinerama()
|
||||
window.c:meta_window_get_work_area_all_xineramas ()
|
||||
- All three are for finding the intersection of workareas across
|
||||
multiple workspaces so that placement of windows can be
|
||||
determined in such a way that they remain in the workarea for
|
||||
all workspaces that they are on.
|
526
po/ChangeLog
526
po/ChangeLog
@@ -1,3 +1,529 @@
|
||||
2006-01-21 Ignacio Casal Quinteiro <nacho.resa@gmail.com>
|
||||
|
||||
* gl.po: Updated Galician Translation.
|
||||
|
||||
2006-01-20 Vincent van Adrighem <adrighem@gnome.org>
|
||||
|
||||
* nl.po: Translation updated by Tino Meinen.
|
||||
|
||||
2006-01-18 Funda Wang <fundawang@linux.net.cn>
|
||||
|
||||
* zh_CN.po: Updated Simplified Chinese translation.
|
||||
|
||||
2006-01-17 Ignacio Casal Quinteiro <nacho.resa@gmail.com>
|
||||
|
||||
* gl.po: Updated Galician Translation.
|
||||
|
||||
2006-01-16 Ilkka Tuohela <hile@iki.fi>
|
||||
|
||||
* fi.po: Updated Finnish translation.
|
||||
|
||||
2006-01-15 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
|
||||
|
||||
* es.po: Updated Spanish translation.
|
||||
|
||||
2006-01-15 Takeshi AIHANA <takeshi.aihana@gmail.com>
|
||||
|
||||
* ja.po: Updated Japanese translation.
|
||||
|
||||
2006-01-11 Adam Weinberger <adamw@gnome.org>
|
||||
|
||||
* en_CA.po: Updated Canadian English translation.
|
||||
|
||||
2006-01-11 Theppitak Karoonboonyanan <thep@linux.thai.net>
|
||||
|
||||
* th.po: Updated Thai translation.
|
||||
|
||||
2006-01-11 Ankit Patel <ankit644@yahoo.com>
|
||||
|
||||
* gu.po: Updated Gujarati Translation.
|
||||
|
||||
2006-01-11 Clytie Siddall <clytie@riverland.net.au>
|
||||
|
||||
* vi.po: Updated Vietnamese translation.
|
||||
|
||||
2005-12-30 Clytie Siddall <clytie@riverland.net.au>
|
||||
|
||||
* vi.po: Updated Vietnamese translation.
|
||||
|
||||
2006-01-06 Kjartan Maraas <kmaraas@gnome.org>
|
||||
|
||||
* nb.po: Updated Norwegian bokmål translation.
|
||||
* no.po: Same
|
||||
|
||||
2005-12-31 Ilkka Tuohela <hile@iki.fi>
|
||||
|
||||
* fi.po: Updated Finnish translation.
|
||||
|
||||
2005-12-25 Kang Jeong-Hee <Keizi@mail.co.kr>
|
||||
|
||||
* ko.po: Updated Korean translation.
|
||||
|
||||
2005-12-11 Miloslav Trmac <mitr@volny.cz>
|
||||
|
||||
* cs.po: Updated Czech translation.
|
||||
|
||||
2005-12-11 Ankit Patel <ankit644@yahoo.com>
|
||||
|
||||
* gu.po: Updated Gujarati Translation.
|
||||
|
||||
2005-12-03 Adam Weinberger <adamw@gnome.org>
|
||||
|
||||
* en_CA.po: Updated Canadian English translation.
|
||||
|
||||
2005-12-03 Kjartan Maraas <kmaraas@gnome.org>
|
||||
|
||||
* nb.po: Updated Norwegian bokmål translation.
|
||||
* no.po: Same
|
||||
|
||||
2005-11-22 Marcel Telka <marcel@telka.sk>
|
||||
|
||||
* sk.po: Updated Slovak translation.
|
||||
|
||||
2005-11-22 Alexander Shopov <ash@contact.bg>
|
||||
|
||||
* bg.po: Updated Bulgarian translation by
|
||||
Alexander Shopov <ash@contact.bg>
|
||||
|
||||
2005-11-22 Theppitak Karoonboonyanan <thep@linux.thai.net>
|
||||
|
||||
* th.po: Updated Thai translation.
|
||||
|
||||
2005-11-21 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
|
||||
|
||||
* es.po: Updated Spanish translation.
|
||||
|
||||
2005-11-20 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
|
||||
|
||||
* es.po: Updated Spanish translation.
|
||||
|
||||
2005-11-20 Ignacio Casal Quinteiro <nacho.resa@gmail.com>
|
||||
|
||||
* gl.po: Updated Galician Translation.
|
||||
|
||||
2005-11-20 Takeshi AIHANA <aihana@gnome.gr.jp>
|
||||
|
||||
* ja.po: Updated Japanese translation.
|
||||
|
||||
2005-11-17 Vincent van Adrighem <adrighem@gnome.org>
|
||||
|
||||
* nl.po: Translation updated by Wouter Bolsterlee.
|
||||
|
||||
2005-11-13 Theppitak Karoonboonyanan <thep@linux.thai.net>
|
||||
|
||||
* th.po: Updated Thai translation.
|
||||
|
||||
2005-11-03 Miloslav Trmac <mitr@volny.cz>
|
||||
|
||||
* cs.po: Updated Czech translation.
|
||||
|
||||
2005-10-28 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
|
||||
|
||||
* es.po: Updated Spanish translation.
|
||||
|
||||
2005-10-28 Takeshi AIHANA <aihana@gnome.gr.jp>
|
||||
|
||||
* ja.po: Updated Japanese translation.
|
||||
|
||||
2005-10-27 Erdal Ronahi <erdal.ronahi@gmail.com>
|
||||
|
||||
* ku.po: Added Kurdish translation.
|
||||
|
||||
2005-10-17 Marcel Telka <marcel@telka.sk>
|
||||
|
||||
* sk.po: Updated Slovak translation.
|
||||
|
||||
2005-10-15 Vincent van Adrighem <adrighem@gnome.org>
|
||||
|
||||
* nl.po: Translation updated.
|
||||
|
||||
2005-10-14 Vincent van Adrighem <adrighem@gnome.org>
|
||||
|
||||
* nl.po: Translation updated.
|
||||
|
||||
2005-10-14 Kostas Papadimas <pkst@gnome.org>
|
||||
|
||||
* el.po: Updated Greek translation.
|
||||
|
||||
2005-10-10 Priit Laes <plaes@cvs.gnome.org>
|
||||
|
||||
* et.po: Translation updated by Ivar Smolin.
|
||||
|
||||
2005-10-04 Alexander Shopov <ash@contact.bg>
|
||||
|
||||
* bg.po: Updated Bulgarian translation by
|
||||
Alexander Shopov <ash@contact.bg>
|
||||
|
||||
2005-10-04 Funda Wang <fundawang@linux.net.cn>
|
||||
|
||||
* zh_CN.po: Updated Simplified Chinese translation.
|
||||
|
||||
2005-10-04 Adam Weinberger <adamw@gnome.org>
|
||||
|
||||
* en_CA.po: Updated Canadian English translation.
|
||||
|
||||
2005-10-03 Runa Bhattacharjee <runa@bengalinux.org>
|
||||
* bn.po: Updated Bengali Translation by Mahay Alam Khan <makl10n@yahoo.com>
|
||||
|
||||
2005-10-02 Christian Rose <menthos@menthos.com>
|
||||
|
||||
* sv.po: Reverted unauthorized changes made by
|
||||
user 'kloczek'.
|
||||
|
||||
2005-09-26 Alessio Frusciante <algol@firenze.linux.it>
|
||||
|
||||
* it.po: Updated Italian translation by
|
||||
Luca Ferretti <elle.uca@infinito.it>.
|
||||
|
||||
2005-09-24 Funda Wang <fundawang@linux.net.cn>
|
||||
|
||||
* zh_CN.po: Updated Simplified Chinese translation.
|
||||
|
||||
2005-09-21 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
|
||||
|
||||
* es.po: Updated Spanish translation.
|
||||
|
||||
2005-09-20 Christian Rose <menthos@menthos.com>
|
||||
|
||||
* sv.po: Updated Swedish translation.
|
||||
|
||||
2005-09-16 Clytie Siddall <clytie@riverland.net.au>
|
||||
|
||||
* vi.po: Updated Vietnamese translation.
|
||||
|
||||
2005-09-08 Inaki Larranaga <dooteo@euskalgnu.org>
|
||||
|
||||
* eu.po: Updated Basque translation.
|
||||
|
||||
2005-09-07 Priit Laes <plaes@cvs.gnome.org>
|
||||
|
||||
* et.po: Translation updated by Ivar Smolin.
|
||||
|
||||
2005-09-04 Danilo Šegan <danilo@gnome.org>
|
||||
|
||||
* hy.po: Added Armenian translation by Norayr Chilingaryan
|
||||
<asprayama@yahoo.com>.
|
||||
|
||||
2005-09-04 Ignacio Casal Quinteiro <nacho.resa@gmail.com>
|
||||
|
||||
* gl.po: Updated Galician Translation.
|
||||
|
||||
2005-09-03 Danilo Šegan <danilo@gnome.org>
|
||||
|
||||
* sr.po, sr@Latn.po: Updated.
|
||||
|
||||
2005-09-02 Leonid Kanter <leon@asplinux.ru>
|
||||
|
||||
* ru.po: Updated Russian translation
|
||||
|
||||
2005-09-01 Baris Cicek <baris@teamforce.name.tr>
|
||||
|
||||
* tr.po: Updated Turkish Translation
|
||||
|
||||
2005-08-31 Žygimantas Beručka <zygis@gnome.org>
|
||||
|
||||
* lt.po: Updated Lithuanian translation.
|
||||
|
||||
2005-08-30 Hendrik Richter <hendi@gnome-de.org>
|
||||
|
||||
* de.po: Updated German translation.
|
||||
|
||||
2005-08-30 Changwoo Ryu <cwryu@debian.org>
|
||||
|
||||
* ko.po: Updated Korean translation by Young-Ho Cha.
|
||||
|
||||
2005-08-29 Telsa Gwynne <hobbit@aloss.ukuu.org.uk>
|
||||
|
||||
* cy.po: Updated Welsh translation.
|
||||
|
||||
2005-08-28 Christophe Merlet <redfox@redfoxcenter.org>
|
||||
|
||||
* fr.po: Updated French translation.
|
||||
|
||||
2005-08-25 Vincent van Adrighem <adrighem@gnome.org>
|
||||
|
||||
* nl.po: Translation updated by Michiel Sikkes.
|
||||
|
||||
2005-08-20 Josep Puigdemont i Casamajó <josep.puigdemont@gmail.com>
|
||||
|
||||
* ca.po: Updated Catalan translation.
|
||||
|
||||
2005-08-19 Priit Laes <plaes@cvs.gnome.org>
|
||||
|
||||
* et.po: Translation updated by Ivar Smolin.
|
||||
|
||||
2005-08-17 Laurent Dhima <laurenti@alblinux.net>
|
||||
|
||||
* sq.po: Updated Albanian translation.
|
||||
|
||||
2005-08-15 Maxim Dziumanenko <mvd@mylinux.ua>
|
||||
|
||||
* uk.po: Updated Ukrainian translation.
|
||||
|
||||
2005-08-15 Gabor Kelemen <kelemeng@gnome.hu>
|
||||
|
||||
* hu.po: Hungarian translation updated.
|
||||
|
||||
2005-08-15 Mugurel Tudor <mugurelu@gnome.ro>
|
||||
|
||||
* ro.po: Updated Romanian translation
|
||||
|
||||
2005-08-14 Mohammad DAMT <mdamt@gnome.org>
|
||||
|
||||
* id.po: Updated Indonesian translation
|
||||
|
||||
2005-08-13 Kostas Papadimas <pkst@gnome.org>
|
||||
|
||||
* el.po: Updated Greek translation.
|
||||
|
||||
2005-08-11 Duarte Loreto <happyguy_pt@hotmail.com>
|
||||
|
||||
* pt.po: Updated Portuguese translation.
|
||||
|
||||
2005-08-10 Alexander Shopov <ash@contact.bg>
|
||||
|
||||
* bg.po: Updated Bulgarian translation by
|
||||
Rostislav Raykov <zbrox@i-space.org>
|
||||
|
||||
2005-08-02 Chao-Hsiung Liao <j_h_liau@yahoo.com.tw>
|
||||
|
||||
* zh_TW.po: Updated Traditional Chinese translation.
|
||||
|
||||
2005-07-31 Yair Hershkovitz <yairhr@gmail.com>
|
||||
|
||||
* he.po: Updated Hebrew translation by Yuval Tanai.
|
||||
|
||||
2005-07-28 Artur Flinta <aflinta@cvs.gnome.org>
|
||||
|
||||
* pl.po: Updated Polish translation by GNOME PL Team.
|
||||
|
||||
2005-07-26 Raphael Higino <raphaelh@cvs.gnome.org>
|
||||
|
||||
* pt_BR.po: Converted to UTF-8.
|
||||
|
||||
2005-07-26 Raphael Higino <raphaelh@cvs.gnome.org>
|
||||
|
||||
* pt_BR.po: Updated Brazilian Portuguese translation.
|
||||
|
||||
2005-07-24 Ilkka Tuohela <hile@iki.fi>
|
||||
|
||||
* fi.po: Updated Finnish translation.
|
||||
|
||||
2005-07-24 Kjartan Maraas <kmaraas@gnome.org>
|
||||
|
||||
* nb.po: Updated Norwegian bokmål translation.
|
||||
* no.po: Same
|
||||
|
||||
2005-07-23 Clytie Siddall <clytie@riverland.net.au>
|
||||
|
||||
* vi.po: Updated Vietnamese translation.
|
||||
|
||||
2005-07-23 Funda Wang <fundawang@linux.net.cn>
|
||||
|
||||
* zh_CN.po: Updated Simplified Chinese translation.
|
||||
|
||||
2005-07-21 Ankit Patel <ankit644@yahoo.com>
|
||||
|
||||
* gu.po: Updated Gujarati Translation.
|
||||
|
||||
2005-07-20 Marcel Telka <marcel@telka.sk>
|
||||
|
||||
* sk.po: Updated Slovak translation.
|
||||
|
||||
2005-07-18 Adam Weinberger <adamw@gnome.org>
|
||||
|
||||
* en_CA.po: Updated Canadian English translation.
|
||||
|
||||
2005-07-17 Christophe Merlet <redfox@redfoxcenter.org>
|
||||
|
||||
* fr.po: Updated French translation.
|
||||
|
||||
2005-07-17 Francisco Javier F. Serrador <serrador@cvs.gnome.org>
|
||||
|
||||
* es.po: Updated Spanish translation.
|
||||
|
||||
2005-07-17 Theppitak Karoonboonyanan <thep@linux.thai.net>
|
||||
|
||||
* th.po: Updated Thai translation.
|
||||
|
||||
2005-07-17 Nikos Charonitakis <charosn@her.forthenet.gr>
|
||||
|
||||
* el.po: Updated Greek translation.
|
||||
|
||||
2005-07-16 Takeshi AIHANA <aihana@gnome.gr.jp>
|
||||
|
||||
* ja.po: Updated Japanese translation.
|
||||
|
||||
2005-07-15 Ignacio Casal Quinteiro <nacho.resa@gmail.com>
|
||||
|
||||
* gl.po: Updated Galician Translation.
|
||||
|
||||
2005-07-14 Yair Hershkovitz <yairhr@gmail.com>
|
||||
|
||||
* he.po: Updated Hebrew translation.
|
||||
|
||||
2005-07-14 Miloslav Trmac <mitr@volny.cz>
|
||||
|
||||
* cs.po: Updated Czech translation.
|
||||
|
||||
2005-07-13 Marcel Telka <marcel@telka.sk>
|
||||
|
||||
* sk.po: Updated Slovak translation.
|
||||
|
||||
2005-07-12 Priit Laes <plaes@cvs.gnome.org>
|
||||
|
||||
* et.po: Translation updated by Ivar Smolin.
|
||||
|
||||
2005-07-08 Clytie Siddall <clytie@riverland.net.au>
|
||||
|
||||
* vi.po: Updated Vietnamese translation.
|
||||
|
||||
2004-07-06 Christian Rose <menthos@menthos.com>
|
||||
|
||||
* gl.po: Updated Galician translation by
|
||||
Ignacio Casal Quinteiro <nacho.resa@gmail.com>.
|
||||
|
||||
2005-07-04 Hendrik Richter <hendi@gnome-de.org>
|
||||
|
||||
* de.po: Fixed German translation by
|
||||
Jens Seidel <jensseidel@users.sf.net>.
|
||||
|
||||
2005-06-23 Ignacio Casal Quinteiro <nacho.resa@gmail.com>
|
||||
|
||||
* gl.po: Updated Galician translation.
|
||||
|
||||
2005-06-22 Abel Cheung <maddog@linuxhall.org>
|
||||
|
||||
* zh_TW.po: Fix language team reference.
|
||||
|
||||
2005-06-05 Theppitak Karoonboonyanan <thep@linux.thai.net>
|
||||
|
||||
* th.po: Updated Thai translation.
|
||||
|
||||
2005-06-01 Priit Laes <plaes@cvs.gnome.org>
|
||||
|
||||
* et.po: Translation updated.
|
||||
|
||||
2005-05-19 Nikos Charonitakis <charosn@her.forthnet.gr>
|
||||
|
||||
* el.po: Updated Greek translation.
|
||||
|
||||
2005-05-11 Kostas Papadimas <pkst@gnome.org>
|
||||
|
||||
* el.po: Updated Greek Translation.
|
||||
|
||||
2005-05-10 Adi Attar <aattar@cvs.gnome.org>
|
||||
|
||||
* xh.po: Updated Xhosa translation.
|
||||
|
||||
2005-04-28 Kostas Papadimas <pkst@gnome.org>
|
||||
|
||||
* el.po: Updated Greek translation
|
||||
|
||||
2005-04-25 Priit Laes <plaes@cvs.gnome.org>
|
||||
|
||||
* et.po: Translation updated by Ivar Smolin.
|
||||
|
||||
2005-04-17 Pauli Virtanen <pauli.virtanen@hut.fi>
|
||||
|
||||
* fi.po: Fix a small mistranslation.
|
||||
|
||||
2005-04-09 Christopher Orr <chris@protactin.co.uk>
|
||||
|
||||
* en_GB.po: Updated British English translation.
|
||||
|
||||
2005-04-06 Roozbeh Pournader <roozbeh@farsiweb.info>
|
||||
|
||||
* fa.po: Updated Persian translation by
|
||||
Elnaz Sarbar <elnaz@farsiweb.info>.
|
||||
|
||||
2005-04-05 Pawan Chitrakar <pawan@nplinux.org>
|
||||
|
||||
* ne.po: Added Nepali Translation.
|
||||
|
||||
2005-04-03 Gabor Kelemen <kelemeng@gnome.hu>
|
||||
|
||||
* hu.po: Hungarian translation updated.
|
||||
|
||||
2005-03-31 Steve Murphy <murf@e-tools.com>
|
||||
|
||||
* rw.po: Added Kinyarwanda translation.
|
||||
|
||||
2005-03-29 Adi Attar <aattar@cvs.gnome.org>
|
||||
|
||||
* xh.po: Updated Xhosa translation.
|
||||
|
||||
2005-03-17 Adam Weinberger <adamw@gnome.org>
|
||||
|
||||
* en_CA.po: Updated Canadian English translation.
|
||||
|
||||
2005-03-12 Baris Cicek <baris@teamforce.name.tr>
|
||||
|
||||
* tr.po: Updated Turkish Translation
|
||||
|
||||
2005-03-10 Adi Attar <aattar@cvs.gnome.org>
|
||||
|
||||
* xh.po: Added Xhosa translation.
|
||||
|
||||
2005-03-07 Vincent van Adrighem <adrighem@gnome.org>
|
||||
|
||||
* nl.po: Translation updated by Reinout van Schouwen.
|
||||
|
||||
2005-03-07 Mugurel Tudor <mugurelu@go.ro>
|
||||
|
||||
* ro.po: Updated Romanian translation.
|
||||
|
||||
2005-03-04 Laszlo Dvornik <dvornik@gnome.hu>
|
||||
|
||||
* hu.po: Hungarian translation updated by Gabor Kelemen.
|
||||
|
||||
2005-03-03 Alexander Shopov <ash@contact.bg>
|
||||
|
||||
* bg.po: Updated Bulgarian translation by
|
||||
Vladimir Petkov <vpetkov@i-space.org>
|
||||
|
||||
2005-03-03 Žygimantas Beručka <uid0@akl.lt>
|
||||
|
||||
* lt.po: Updated Lithuanian translation.
|
||||
|
||||
2005-03-02 Danilo Šegan <dsegan@gmx.net>
|
||||
|
||||
* sr.po, sr@Latn.po: Updated Serbian translation.
|
||||
|
||||
2005-03-02 Abel Cheung <maddog@linuxhall.org>
|
||||
|
||||
* zh_TW.po: Updated traditional Chinese translation from GNOME HK Team
|
||||
|
||||
2005-02-28 Vincent van Adrighem <adrighem@gnome.org>
|
||||
|
||||
* nl.po: Translation updated by Reinout van Schouwen.
|
||||
|
||||
2005-02-27 Alessio Frusciante <algol@firenze.linux.it>
|
||||
|
||||
* it.po: Updated Italian translation by
|
||||
Luca Ferretti <elle.uca@infinito.it>.
|
||||
|
||||
2005-02-24 Artur Flinta <aflinta@cvs.gnome.org>
|
||||
|
||||
* pl.po: Updated Polish translation by GNOME PL Team.
|
||||
|
||||
2005-02-24 Ankit Patel <ankit644@yahoo.com>
|
||||
|
||||
* gu.po: Updated Gujarati Translation.
|
||||
|
||||
2005-02-23 Vincent van Adrighem <adrighem@gnome.org>
|
||||
|
||||
* nl.po: Translation updated by Michiel Sikkes.
|
||||
|
||||
2004-02-22 Roozbeh Pournader <roozbeh@farsiweb.info>
|
||||
|
||||
* fa.po: Updated Persian translation by
|
||||
Elnaz Sarbar <elnaz@farsiweb.info>.
|
||||
|
||||
2005-02-22 Raphael Higino <raphaelh@cvs.gnome.org>
|
||||
|
||||
* pt_BR.po: Updated Brazilian Portuguese translation.
|
||||
|
||||
2005-02-21 Christophe Merlet <redfox@redfoxcenter.org>
|
||||
|
||||
* fr.po: Updated French translation.
|
||||
|
230
po/de.po
230
po/de.po
@@ -2,15 +2,15 @@
|
||||
# Copyright (C) 2002-2004 Free Software Foundation, Inc.
|
||||
# Matthias Warkus <mawarkus@gnome.org>, 2002.
|
||||
# Christian Neumair <chris@gnome-de.org>, 2002-2004.
|
||||
#
|
||||
# Hendrik Richter <hendi@gnome-de.org>, 2005.
|
||||
#
|
||||
msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: Metacity\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2005-02-05 20:59+0100\n"
|
||||
"PO-Revision-Date: 2005-02-05 20:58+0100\n"
|
||||
"Last-Translator: Frank Arnold <frank@scirocco-5v-turbo.de>\n"
|
||||
"POT-Creation-Date: 2005-09-19 12:30+0200\n"
|
||||
"PO-Revision-Date: 2005-08-30 16:56+0200\n"
|
||||
"Last-Translator: Hendrik Richter <hendi@gnome-de.org>\n"
|
||||
"Language-Team: German <gnome-de@gnome.org>\n"
|
||||
"MIME-Version: 1.0\n"
|
||||
"Content-Type: text/plain; charset=UTF-8\n"
|
||||
@@ -63,7 +63,7 @@ msgstr ""
|
||||
msgid "Failed to get hostname: %s\n"
|
||||
msgstr "Rechnername konnte nicht ermittelt werden: %s\n"
|
||||
|
||||
#: ../src/display.c:312
|
||||
#: ../src/display.c:319
|
||||
#, c-format
|
||||
msgid "Failed to open X Window System display '%s'\n"
|
||||
msgstr "X-Window-Systemanzeige »%s« konnte nicht geöffnet werden\n"
|
||||
@@ -84,23 +84,23 @@ msgstr ""
|
||||
msgid "Fatal IO error %d (%s) on display '%s'.\n"
|
||||
msgstr "Schwerwiegender E/A-Fehler %d (%s) auf Anzeige »%s«.\n"
|
||||
|
||||
#: ../src/frames.c:1020
|
||||
#: ../src/frames.c:1125
|
||||
msgid "Close Window"
|
||||
msgstr "Fenster schließen"
|
||||
|
||||
#: ../src/frames.c:1023
|
||||
#: ../src/frames.c:1128
|
||||
msgid "Window Menu"
|
||||
msgstr "Fenstermenü"
|
||||
|
||||
#: ../src/frames.c:1026
|
||||
#: ../src/frames.c:1131
|
||||
msgid "Minimize Window"
|
||||
msgstr "Fenster minimieren"
|
||||
|
||||
#: ../src/frames.c:1029
|
||||
#: ../src/frames.c:1134
|
||||
msgid "Maximize Window"
|
||||
msgstr "Fenster maximieren"
|
||||
|
||||
#: ../src/frames.c:1032
|
||||
#: ../src/frames.c:1137
|
||||
msgid "Unmaximize Window"
|
||||
msgstr "Fenster wiederherstellen"
|
||||
|
||||
@@ -113,32 +113,24 @@ msgstr ""
|
||||
"Ein anderes Programm verwendet die Taste %s bereits mit den Umschaltern %x "
|
||||
"als Tastenkombination\n"
|
||||
|
||||
#: ../src/keybindings.c:2559
|
||||
#: ../src/keybindings.c:2620
|
||||
#, c-format
|
||||
msgid "Error launching metacity-dialog to print an error about a command: %s\n"
|
||||
msgstr ""
|
||||
"Beim Starten eines Metacity-Dialogs, der einen Fehler zu einem Befehl "
|
||||
"anzeigen sollte, ist ein Fehler aufgetreten: %s\n"
|
||||
|
||||
#: ../src/keybindings.c:2664
|
||||
#: ../src/keybindings.c:2725
|
||||
#, c-format
|
||||
msgid "No command %d has been defined.\n"
|
||||
msgstr "Es wurde kein Befehl %d festgelegt.\n"
|
||||
|
||||
#: ../src/keybindings.c:3494
|
||||
#: ../src/keybindings.c:3570
|
||||
msgid "No terminal command has been defined.\n"
|
||||
msgstr "Es wurde kein Terminal-Befehl festgelegt.\n"
|
||||
|
||||
#: ../src/main.c:69
|
||||
msgid ""
|
||||
"metacity [--sm-disable] [--sm-client-id=ID] [--sm-save-file=FILENAME] [--"
|
||||
"display=DISPLAY] [--replace] [--version]\n"
|
||||
msgstr ""
|
||||
"metacity [--sm-disable] [--sm-client-id=KENNUNG] [--sm-save-file=DATEINAME] "
|
||||
"[--display=ANZEIGE] [--replace] [--version]\n"
|
||||
|
||||
# CHECK
|
||||
#: ../src/main.c:76
|
||||
#: ../src/main.c:69
|
||||
#, c-format
|
||||
msgid ""
|
||||
"metacity %s\n"
|
||||
@@ -154,12 +146,36 @@ msgstr ""
|
||||
"Es besteht KEINE Garantie auf MARKTREIFE oder EIGNUNG für einen BESTIMMTEN "
|
||||
"ZWECK.\n"
|
||||
|
||||
#: ../src/main.c:443
|
||||
#: ../src/main.c:257
|
||||
msgid "Disable connection to session manager"
|
||||
msgstr "Verbindung zur Sitzungsverwaltung deaktivieren"
|
||||
|
||||
#: ../src/main.c:263
|
||||
msgid "Replace the running window manager with Metacity"
|
||||
msgstr "Den aktuellen Fenstermanager durch Metacity ersetzen"
|
||||
|
||||
#: ../src/main.c:269
|
||||
msgid "Specify session management ID"
|
||||
msgstr "ID der Sitzungsverwaltung angeben"
|
||||
|
||||
#: ../src/main.c:274
|
||||
msgid "X Display to use"
|
||||
msgstr "Zu verwendene X-Anzeige"
|
||||
|
||||
#: ../src/main.c:280
|
||||
msgid "Initialize session from savefile"
|
||||
msgstr "Sitzung anhand gespeicherter Datei starten"
|
||||
|
||||
#: ../src/main.c:286
|
||||
msgid "Print version"
|
||||
msgstr "Version ausgeben"
|
||||
|
||||
#: ../src/main.c:440
|
||||
#, c-format
|
||||
msgid "Failed to scan themes directory: %s\n"
|
||||
msgstr "Das Themenverzeichnis konnte nicht eingelesen werden: %s\n"
|
||||
|
||||
#: ../src/main.c:459
|
||||
#: ../src/main.c:456
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Could not find a theme! Be sure %s exists and contains the usual themes."
|
||||
@@ -167,7 +183,7 @@ msgstr ""
|
||||
"Es konnte kein Thema gefunden werden! Stellen Sie sicher, dass %s existiert "
|
||||
"und zumindest die mitgelieferten Themen enthält."
|
||||
|
||||
#: ../src/main.c:521
|
||||
#: ../src/main.c:518
|
||||
#, c-format
|
||||
msgid "Failed to restart: %s\n"
|
||||
msgstr "Neustart fehlgeschlagen: %s\n"
|
||||
@@ -234,7 +250,7 @@ msgstr "Auf Arbeitsfläche darü_ber verschieben"
|
||||
msgid "Move to Workspace _Down"
|
||||
msgstr "Auf Arbeitsfläche dar_unter verschieben"
|
||||
|
||||
#: ../src/menu.c:162 ../src/prefs.c:1996
|
||||
#: ../src/menu.c:162 ../src/prefs.c:2106
|
||||
#, c-format
|
||||
msgid "Workspace %d"
|
||||
msgstr "Arbeitsfläche %d"
|
||||
@@ -354,19 +370,19 @@ msgstr ""
|
||||
"Wenn Sie das Beenden dieser Anwendung erzwingen gehen alle ungespeicherten "
|
||||
"Änderungen verloren."
|
||||
|
||||
#: ../src/metacity-dialog.c:128
|
||||
#: ../src/metacity-dialog.c:129
|
||||
msgid "_Force Quit"
|
||||
msgstr "_Beenden erzwingen"
|
||||
|
||||
#: ../src/metacity-dialog.c:225
|
||||
#: ../src/metacity-dialog.c:226
|
||||
msgid "Title"
|
||||
msgstr "Titel"
|
||||
|
||||
#: ../src/metacity-dialog.c:237
|
||||
#: ../src/metacity-dialog.c:238
|
||||
msgid "Class"
|
||||
msgstr "Klasse"
|
||||
|
||||
#: ../src/metacity-dialog.c:262
|
||||
#: ../src/metacity-dialog.c:264
|
||||
msgid ""
|
||||
"These windows do not support \"save current setup\" and will have to be "
|
||||
"restarted manually next time you log in."
|
||||
@@ -374,7 +390,7 @@ msgstr ""
|
||||
"Diese Fenster unterstützen das Speichern der aktuellen Einstellungen nicht "
|
||||
"und müssen bei der nächsten Anmeldung manuell neu gestartet werden."
|
||||
|
||||
#: ../src/metacity-dialog.c:325
|
||||
#: ../src/metacity-dialog.c:330
|
||||
#, c-format
|
||||
msgid ""
|
||||
"There was an error running \"%s\":\n"
|
||||
@@ -556,7 +572,7 @@ msgstr ""
|
||||
"Anwendungen weitergereicht. Die Existenz dieser Einstellung ist etwas "
|
||||
"fragwürdig, jedoch besser als all die spezifischen Details der anwendungs- "
|
||||
"und fensterorientierten Modi einzeln vorzuhalten, so zum Beispiel ob Klicks "
|
||||
"durchgereicht werden. Desweiteren ist der anwendungsorientierte Modus "
|
||||
"durchgereicht werden. Des Weiteren ist der anwendungsorientierte Modus "
|
||||
"momentan in weiten Teilen nicht implementiert."
|
||||
|
||||
#: ../src/metacity.schemas.in.h:21
|
||||
@@ -862,8 +878,8 @@ msgid ""
|
||||
"currently focused window's titlebar is flashed."
|
||||
msgstr ""
|
||||
"Legt fest, wie Metacity visuell verdeutlichen soll, dass die Systemglocke "
|
||||
"ausgelöst wurde oder ein andrer »Piepser« seitens der Anwendung erfolgt ist. "
|
||||
"Zulässige Werte: »fullscreen« (Schwarz/weiß-Blinken im Vollbild) sowie "
|
||||
"ausgelöst wurde oder ein anderer »Piepser« seitens der Anwendung erfolgt "
|
||||
"ist. Zulässige Werte: »fullscreen« (Schwarz/weiß-Blinken im Vollbild) sowie "
|
||||
"»frame_flash« (Titelbar der betroffenen Anwendung blinkt). Ist die Anwendung "
|
||||
"unbekannt, die die Glocke ausgelöst hat (bei »Systempiepsern« ist dies der "
|
||||
"Normalfall), blinkt die Titelbar des momentan fokussierten Fensters."
|
||||
@@ -1232,7 +1248,7 @@ msgid ""
|
||||
"\". If you set the option to the special string \"disabled\", then there "
|
||||
"will be no keybinding for this action."
|
||||
msgstr ""
|
||||
"Die zum Verbergen aller normalen Fenster und Fokusieren des Desktops "
|
||||
"Die zum Verbergen aller normalen Fenster und Fokussieren des Desktops "
|
||||
"verwendete Tastenkombination. Das Format ist »<Control>« (für Strg.) "
|
||||
"oder »<Shift><Alt>F1«. Der Interpreter ist recht liberal und "
|
||||
"erlaubt Groß- und Kleinschreibung sowie Abkürzungen wie z.B. »<Ctl>« "
|
||||
@@ -2013,17 +2029,17 @@ msgstr "Modus des Fensterfokus"
|
||||
msgid "Window title font"
|
||||
msgstr "Schrift für Fenstertitel"
|
||||
|
||||
#: ../src/prefs.c:501 ../src/prefs.c:517 ../src/prefs.c:533 ../src/prefs.c:549
|
||||
#: ../src/prefs.c:565 ../src/prefs.c:585 ../src/prefs.c:601 ../src/prefs.c:617
|
||||
#: ../src/prefs.c:633 ../src/prefs.c:649 ../src/prefs.c:665 ../src/prefs.c:681
|
||||
#: ../src/prefs.c:697 ../src/prefs.c:714 ../src/prefs.c:730 ../src/prefs.c:746
|
||||
#: ../src/prefs.c:762 ../src/prefs.c:778 ../src/prefs.c:793 ../src/prefs.c:808
|
||||
#: ../src/prefs.c:823 ../src/prefs.c:839
|
||||
#: ../src/prefs.c:528 ../src/prefs.c:544 ../src/prefs.c:560 ../src/prefs.c:576
|
||||
#: ../src/prefs.c:592 ../src/prefs.c:612 ../src/prefs.c:628 ../src/prefs.c:644
|
||||
#: ../src/prefs.c:660 ../src/prefs.c:676 ../src/prefs.c:692 ../src/prefs.c:708
|
||||
#: ../src/prefs.c:724 ../src/prefs.c:741 ../src/prefs.c:757 ../src/prefs.c:773
|
||||
#: ../src/prefs.c:789 ../src/prefs.c:805 ../src/prefs.c:820 ../src/prefs.c:835
|
||||
#: ../src/prefs.c:850 ../src/prefs.c:866 ../src/prefs.c:882 ../src/prefs.c:898
|
||||
#, c-format
|
||||
msgid "GConf key \"%s\" is set to an invalid type\n"
|
||||
msgstr "Typ des GConf-Schlüssels »%s« ungültig\n"
|
||||
|
||||
#: ../src/prefs.c:884
|
||||
#: ../src/prefs.c:943
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for mouse button "
|
||||
@@ -2032,19 +2048,19 @@ msgstr ""
|
||||
"In der Konfigurationsdatenbank gefundenes »%s« ist kein zulässiger Wert für "
|
||||
"den Maustastenumschalter\n"
|
||||
|
||||
#: ../src/prefs.c:908 ../src/prefs.c:1318
|
||||
#: ../src/prefs.c:967 ../src/prefs.c:1428
|
||||
#, c-format
|
||||
msgid "GConf key '%s' is set to an invalid value\n"
|
||||
msgstr "Wert des GConf-Schlüssels »%s« unzulässig\n"
|
||||
|
||||
#: ../src/prefs.c:1035
|
||||
#: ../src/prefs.c:1145
|
||||
#, c-format
|
||||
msgid "Could not parse font description \"%s\" from GConf key %s\n"
|
||||
msgstr ""
|
||||
"Schriftbeschreibung »%s« aus GConf-Schlüssel %s konnte nicht verarbeitet "
|
||||
"werden\n"
|
||||
|
||||
#: ../src/prefs.c:1220
|
||||
#: ../src/prefs.c:1330
|
||||
#, c-format
|
||||
msgid ""
|
||||
"%d stored in GConf key %s is not a reasonable number of workspaces, current "
|
||||
@@ -2053,7 +2069,7 @@ msgstr ""
|
||||
"%d, gespeichert in GConf-Schlüssel %s ist keine sinnvolle Anzahl der "
|
||||
"Arbeitsflächen; das aktuelle Maximum ist %d\n"
|
||||
|
||||
#: ../src/prefs.c:1280
|
||||
#: ../src/prefs.c:1390
|
||||
msgid ""
|
||||
"Workarounds for broken applications disabled. Some applications may not "
|
||||
"behave properly.\n"
|
||||
@@ -2061,18 +2077,18 @@ msgstr ""
|
||||
"Provisorien (Workarounds) für defekte Anwendungen abgeschaltet. "
|
||||
"Möglicherweise funktionieren manche Anwendungen nicht richtig.\n"
|
||||
|
||||
#: ../src/prefs.c:1345
|
||||
#: ../src/prefs.c:1455
|
||||
#, c-format
|
||||
msgid "%d stored in GConf key %s is out of range 0 to %d\n"
|
||||
msgstr ""
|
||||
"%d, gespeichert in GConf-Schlüssel %s, liegt außerhalb des Bereichs 0-%d\n"
|
||||
|
||||
#: ../src/prefs.c:1479
|
||||
#: ../src/prefs.c:1589
|
||||
#, c-format
|
||||
msgid "Error setting number of workspaces to %d: %s\n"
|
||||
msgstr "Fehler beim Festlegen der Anzahl der Arbeitsflächen auf %d: %s\n"
|
||||
|
||||
#: ../src/prefs.c:1723
|
||||
#: ../src/prefs.c:1833
|
||||
#, c-format
|
||||
msgid ""
|
||||
"\"%s\" found in configuration database is not a valid value for keybinding "
|
||||
@@ -2081,7 +2097,7 @@ msgstr ""
|
||||
"In der Konfigurationsdatenbank gefundenes »%s« ist kein zulässiger Wert für "
|
||||
"die Tastenkombination »%s«\n"
|
||||
|
||||
#: ../src/prefs.c:2077
|
||||
#: ../src/prefs.c:2187
|
||||
#, c-format
|
||||
msgid "Error setting name for workspace %d to \"%s\": %s\n"
|
||||
msgstr "Fehler beim Festlegen des Namens der Arbeitsflächen %d auf »%s«: %s\n"
|
||||
@@ -2119,7 +2135,7 @@ msgstr ""
|
||||
msgid "Screen %d on display \"%s\" already has a window manager\n"
|
||||
msgstr "Bildschirm %d auf Anzeige »%s« hat bereits einen Fenstermanager\n"
|
||||
|
||||
#: ../src/screen.c:699
|
||||
#: ../src/screen.c:716
|
||||
#, c-format
|
||||
msgid "Could not release screen %d on display \"%s\"\n"
|
||||
msgstr "Bildschirm %d auf Anzeige »%s« konnte nicht freigegeben werden\n"
|
||||
@@ -2257,16 +2273,12 @@ msgstr ""
|
||||
"x-large oder xx-large sein)\n"
|
||||
|
||||
#: ../src/theme-parser.c:729 ../src/theme-parser.c:737
|
||||
#: ../src/theme-parser.c:2936 ../src/theme-parser.c:3025
|
||||
#: ../src/theme-parser.c:3032 ../src/theme-parser.c:3039
|
||||
#, c-format
|
||||
msgid "No \"%s\" attribute on element <%s>"
|
||||
msgstr "Kein »%s«-Attribut in Element <%s>"
|
||||
|
||||
#: ../src/theme-parser.c:807 ../src/theme-parser.c:897
|
||||
#: ../src/theme-parser.c:935 ../src/theme-parser.c:1012
|
||||
#: ../src/theme-parser.c:1062 ../src/theme-parser.c:1070
|
||||
#: ../src/theme-parser.c:1126 ../src/theme-parser.c:1134
|
||||
#: ../src/theme-parser.c:2936 ../src/theme-parser.c:3025
|
||||
#: ../src/theme-parser.c:3032 ../src/theme-parser.c:3039
|
||||
#, c-format
|
||||
msgid "No \"%s\" attribute on <%s> element"
|
||||
msgstr "Kein »%s«-Attribut in Element <%s>"
|
||||
@@ -2977,11 +2989,11 @@ msgstr "Das Seitenverhältnis %g für einen Knopf ergibt keinen Sinn"
|
||||
msgid "Frame geometry does not specify size of buttons"
|
||||
msgstr "Die Rahmengeometrie gibt die Abmessungen der Knöpfe nicht an"
|
||||
|
||||
#: ../src/theme.c:849
|
||||
#: ../src/theme.c:843
|
||||
msgid "Gradients should have at least two colors"
|
||||
msgstr "Farbverläufe sollten mindestens zwei Farben enthalten"
|
||||
|
||||
#: ../src/theme.c:975
|
||||
#: ../src/theme.c:969
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have the state in brackets, e.g. gtk:fg[NORMAL] "
|
||||
@@ -2990,7 +3002,7 @@ msgstr ""
|
||||
"Bei GTK-Farbangaben muss der Zustand in eckigen Klammern stehen, z.B. gtk:fg"
|
||||
"[NORMAL], wobei NORMAL der Zustand ist; »%s« konnte nicht verarbeitet werden."
|
||||
|
||||
#: ../src/theme.c:989
|
||||
#: ../src/theme.c:983
|
||||
#, c-format
|
||||
msgid ""
|
||||
"GTK color specification must have a close bracket after the state, e.g. gtk:"
|
||||
@@ -3000,17 +3012,17 @@ msgstr ""
|
||||
"enthalten, z.B. gtk:fg[NORMAL], wobei NORMAL der Zustand ist; »%s« konnte "
|
||||
"nicht verarbeitet werden"
|
||||
|
||||
#: ../src/theme.c:1000
|
||||
#: ../src/theme.c:994
|
||||
#, c-format
|
||||
msgid "Did not understand state \"%s\" in color specification"
|
||||
msgstr "Zustand »%s« in der Farbangabe konnte nicht verarbeitet werden"
|
||||
|
||||
#: ../src/theme.c:1013
|
||||
#: ../src/theme.c:1007
|
||||
#, c-format
|
||||
msgid "Did not understand color component \"%s\" in color specification"
|
||||
msgstr "Farbkomponente »%s« in der Farbangabe konnte nicht verarbeitet werden"
|
||||
|
||||
#: ../src/theme.c:1043
|
||||
#: ../src/theme.c:1037
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Blend format is \"blend/bg_color/fg_color/alpha\", \"%s\" does not fit the "
|
||||
@@ -3019,18 +3031,18 @@ msgstr ""
|
||||
"Das Blendformat ist »Blend/Hintergrundfarbe/Vordergrundfarbe/Alpha«; »%s« "
|
||||
"passt nicht auf dieses Format"
|
||||
|
||||
#: ../src/theme.c:1054
|
||||
#: ../src/theme.c:1048
|
||||
#, c-format
|
||||
msgid "Could not parse alpha value \"%s\" in blended color"
|
||||
msgstr "Der Alphawert »%s« in einer Mischfarbe konnte nicht verarbeitet werden"
|
||||
|
||||
#: ../src/theme.c:1064
|
||||
#: ../src/theme.c:1058
|
||||
#, c-format
|
||||
msgid "Alpha value \"%s\" in blended color is not between 0.0 and 1.0"
|
||||
msgstr ""
|
||||
"Der Alphawert »%s« in einer Mischfarbe liegt nicht zwischen 0.0 und 1.0"
|
||||
|
||||
#: ../src/theme.c:1111
|
||||
#: ../src/theme.c:1105
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Shade format is \"shade/base_color/factor\", \"%s\" does not fit the format"
|
||||
@@ -3038,28 +3050,28 @@ msgstr ""
|
||||
"Das Mischformat ist »Mischen/Basisfarbe/Faktor«; »%s« passt nicht auf dieses "
|
||||
"Format"
|
||||
|
||||
#: ../src/theme.c:1122
|
||||
#: ../src/theme.c:1116
|
||||
#, c-format
|
||||
msgid "Could not parse shade factor \"%s\" in shaded color"
|
||||
msgstr ""
|
||||
"Der Mischfaktor »%s« in einer Mischfarbe konnte nicht verarbeitet werden"
|
||||
|
||||
#: ../src/theme.c:1132
|
||||
#: ../src/theme.c:1126
|
||||
#, c-format
|
||||
msgid "Shade factor \"%s\" in shaded color is negative"
|
||||
msgstr "Der Mischfaktor »%s« in einer Mischfarbe ist negativ"
|
||||
|
||||
#: ../src/theme.c:1161
|
||||
#: ../src/theme.c:1155
|
||||
#, c-format
|
||||
msgid "Could not parse color \"%s\""
|
||||
msgstr "Die Farbe »%s« konnte nicht verarbeitet werden"
|
||||
|
||||
#: ../src/theme.c:1423
|
||||
#: ../src/theme.c:1417
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains character '%s' which is not allowed"
|
||||
msgstr "Der Koordinatenausdruck enthält das unerlaubte Zeichen »%s«"
|
||||
|
||||
#: ../src/theme.c:1450
|
||||
#: ../src/theme.c:1444
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contains floating point number '%s' which could not be "
|
||||
@@ -3068,14 +3080,14 @@ msgstr ""
|
||||
"Der Koordinatenausdruck enthält die Gleitkommazahl »%s«, die nicht "
|
||||
"verarbeitet werden konnte"
|
||||
|
||||
#: ../src/theme.c:1464
|
||||
#: ../src/theme.c:1458
|
||||
#, c-format
|
||||
msgid "Coordinate expression contains integer '%s' which could not be parsed"
|
||||
msgstr ""
|
||||
"Der Koordinatenausdruck enthält die Ganzzahl »%s«, die nicht verarbeitet "
|
||||
"werden konnte"
|
||||
|
||||
#: ../src/theme.c:1531
|
||||
#: ../src/theme.c:1525
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression contained unknown operator at the start of this text: "
|
||||
@@ -3084,22 +3096,22 @@ msgstr ""
|
||||
"Der Koordinatenausdruck enthält einen unbekannten Operator am Anfang dieses "
|
||||
"Texts: »%s«"
|
||||
|
||||
#: ../src/theme.c:1588
|
||||
#: ../src/theme.c:1582
|
||||
msgid "Coordinate expression was empty or not understood"
|
||||
msgstr "Der Koordinatenausdruck war leer oder unverständlich"
|
||||
|
||||
#: ../src/theme.c:1731 ../src/theme.c:1741 ../src/theme.c:1775
|
||||
#: ../src/theme.c:1725 ../src/theme.c:1735 ../src/theme.c:1769
|
||||
msgid "Coordinate expression results in division by zero"
|
||||
msgstr "Der Koordinatenausdruck führt zu einer Division durch Null"
|
||||
|
||||
#: ../src/theme.c:1783
|
||||
#: ../src/theme.c:1777
|
||||
msgid ""
|
||||
"Coordinate expression tries to use mod operator on a floating-point number"
|
||||
msgstr ""
|
||||
"Der Koordinatenausdruck versucht, den Modulo-Operator auf eine "
|
||||
"Gleitkommazahl anzuwenden"
|
||||
|
||||
#: ../src/theme.c:1840
|
||||
#: ../src/theme.c:1834
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has an operator \"%s\" where an operand was expected"
|
||||
@@ -3107,17 +3119,17 @@ msgstr ""
|
||||
"Der Koordinatenausdruck enthält den Operator »%s«, wo ein Operand stehen "
|
||||
"müsste"
|
||||
|
||||
#: ../src/theme.c:1849
|
||||
#: ../src/theme.c:1843
|
||||
msgid "Coordinate expression had an operand where an operator was expected"
|
||||
msgstr ""
|
||||
"Der Koordinatenausdruck enthält einen Operanden, wo ein Operator stehen "
|
||||
"müsste"
|
||||
|
||||
#: ../src/theme.c:1857
|
||||
#: ../src/theme.c:1851
|
||||
msgid "Coordinate expression ended with an operator instead of an operand"
|
||||
msgstr "Der Koordinatenausdruck endet mit einem Operator statt einem Operanden"
|
||||
|
||||
#: ../src/theme.c:1867
|
||||
#: ../src/theme.c:1861
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Coordinate expression has operator \"%c\" following operator \"%c\" with no "
|
||||
@@ -3126,7 +3138,7 @@ msgstr ""
|
||||
"Der Koordinatenausdruck enthält die beiden Operatoren »%c« und »%c«, jedoch "
|
||||
"keinen Operanden dazwischen"
|
||||
|
||||
#: ../src/theme.c:1986
|
||||
#: ../src/theme.c:1980
|
||||
msgid ""
|
||||
"Coordinate expression parser overflowed its buffer, this is really a "
|
||||
"Metacity bug, but are you sure you need a huge expression like that?"
|
||||
@@ -3135,35 +3147,35 @@ msgstr ""
|
||||
"Dies ist ein Fehler in Metacity; Sind Sie sicher, dass sie so einen riesigen "
|
||||
"Ausdruck benötigen?"
|
||||
|
||||
#: ../src/theme.c:2015
|
||||
#: ../src/theme.c:2009
|
||||
msgid "Coordinate expression had a close parenthesis with no open parenthesis"
|
||||
msgstr ""
|
||||
"Der Koordinatenausdruck enthält eine schließende Klammer, jedoch keine "
|
||||
"Öffnende"
|
||||
|
||||
#: ../src/theme.c:2078
|
||||
#: ../src/theme.c:2072
|
||||
#, c-format
|
||||
msgid "Coordinate expression had unknown variable or constant \"%s\""
|
||||
msgstr ""
|
||||
"Der Koordinatenausdruck enthält die unbekannte Variable oder Konstante »%s«"
|
||||
|
||||
#: ../src/theme.c:2135
|
||||
#: ../src/theme.c:2129
|
||||
msgid "Coordinate expression had an open parenthesis with no close parenthesis"
|
||||
msgstr ""
|
||||
"Der Koordinatenausdruck enthält eine öffnende Klammer, jedoch keine "
|
||||
"Schließende"
|
||||
|
||||
#: ../src/theme.c:2146
|
||||
#: ../src/theme.c:2140
|
||||
msgid "Coordinate expression doesn't seem to have any operators or operands"
|
||||
msgstr ""
|
||||
"Der Koordinatenausdruck scheint weder Operatoren noch Operanden zu enthalten"
|
||||
|
||||
#: ../src/theme.c:2390 ../src/theme.c:2412 ../src/theme.c:2433
|
||||
#: ../src/theme.c:2384 ../src/theme.c:2406 ../src/theme.c:2427
|
||||
#, c-format
|
||||
msgid "Theme contained an expression \"%s\" that resulted in an error: %s\n"
|
||||
msgstr "Thema enthält den Ausdruck »%s«, der zu folgendem Fehler führte: %s\n"
|
||||
|
||||
#: ../src/theme.c:3919
|
||||
#: ../src/theme.c:3913
|
||||
#, c-format
|
||||
msgid ""
|
||||
"<button function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||
@@ -3172,25 +3184,25 @@ msgstr ""
|
||||
"Für diesen Rahmenstil muss <button function=\"%s\" state=\"%s\" draw_ops="
|
||||
"\"irgendwas\"/> angegeben werden"
|
||||
|
||||
#: ../src/theme.c:4369 ../src/theme.c:4401
|
||||
#: ../src/theme.c:4363 ../src/theme.c:4395
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Missing <frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"whatever\"/>"
|
||||
msgstr ""
|
||||
"<frame state=\"%s\" resize=\"%s\" focus=\"%s\" style=\"irgendwas\"/> fehlt"
|
||||
|
||||
#: ../src/theme.c:4452
|
||||
#: ../src/theme.c:4446
|
||||
#, c-format
|
||||
msgid "Failed to load theme \"%s\": %s\n"
|
||||
msgstr "Thema »%s« konnte nicht geladen werden: %s\n"
|
||||
|
||||
#: ../src/theme.c:4598 ../src/theme.c:4605 ../src/theme.c:4612
|
||||
#: ../src/theme.c:4619 ../src/theme.c:4626
|
||||
#: ../src/theme.c:4592 ../src/theme.c:4599 ../src/theme.c:4606
|
||||
#: ../src/theme.c:4613 ../src/theme.c:4620
|
||||
#, c-format
|
||||
msgid "No <%s> set for theme \"%s\""
|
||||
msgstr "Kein <%s> für Thema »%s« festgelegt"
|
||||
|
||||
#: ../src/theme.c:4636
|
||||
#: ../src/theme.c:4630
|
||||
#, c-format
|
||||
msgid ""
|
||||
"No frame style set for window type \"%s\" in theme \"%s\", add a <window "
|
||||
@@ -3199,7 +3211,7 @@ msgstr ""
|
||||
"Kein Rahmenstil für Fenstertyp »%s« in Thema »%s« angegeben; fügen Sie ein "
|
||||
"Element <window type=\"%s\" style_set=\"irgendwas\"/> hinzu"
|
||||
|
||||
#: ../src/theme.c:4658
|
||||
#: ../src/theme.c:4652
|
||||
#, c-format
|
||||
msgid ""
|
||||
"<menu_icon function=\"%s\" state=\"%s\" draw_ops=\"whatever\"/> must be "
|
||||
@@ -3208,7 +3220,7 @@ msgstr ""
|
||||
"Für dieses Thema muss <menu_icon function=\"%s\" state=\"%s\" draw_ops="
|
||||
"\"irgendwas\"/> angegeben werden"
|
||||
|
||||
#: ../src/theme.c:5047 ../src/theme.c:5109
|
||||
#: ../src/theme.c:5041 ../src/theme.c:5103
|
||||
#, c-format
|
||||
msgid ""
|
||||
"User-defined constants must begin with a capital letter; \"%s\" does not"
|
||||
@@ -3216,7 +3228,7 @@ msgstr ""
|
||||
"Benutzerdefinierte Konstanten müssen mit einem Großbuchstaben beginnen; »%s« "
|
||||
"tut das nicht"
|
||||
|
||||
#: ../src/theme.c:5055 ../src/theme.c:5117
|
||||
#: ../src/theme.c:5049 ../src/theme.c:5111
|
||||
#, c-format
|
||||
msgid "Constant \"%s\" has already been defined"
|
||||
msgstr "Konstante »%s« wurde bereits definiert"
|
||||
@@ -3258,7 +3270,7 @@ msgid "Application set a bogus _NET_WM_PID %ld\n"
|
||||
msgstr "Application hat eine unsinnige _NET_WM_PID %ld angegeben\n"
|
||||
|
||||
#. first time through
|
||||
#: ../src/window.c:4912
|
||||
#: ../src/window.c:5205
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets SM_CLIENT_ID on itself, instead of on the WM_CLIENT_LEADER "
|
||||
@@ -3280,7 +3292,7 @@ msgstr ""
|
||||
#. * MWM but not WM_NORMAL_HINTS are basically broken. We complain
|
||||
#. * about these apps but make them work.
|
||||
#.
|
||||
#: ../src/window.c:5583
|
||||
#: ../src/window.c:5876
|
||||
#, c-format
|
||||
msgid ""
|
||||
"Window %s sets an MWM hint indicating it isn't resizable, but sets min size %"
|
||||
@@ -3318,27 +3330,3 @@ msgid ""
|
||||
msgstr ""
|
||||
"Eigenschaft %s auf Fenster 0x%lx enthielt ungültiges UTF-8 für Objekt %d in "
|
||||
"der Liste\n"
|
||||
|
||||
#~ msgid "Put on _All Workspaces"
|
||||
#~ msgstr "Auf _alle Arbeitsflächen legen"
|
||||
|
||||
#~ msgid "Select how to give focus to windows"
|
||||
#~ msgstr "Festlegen, wie der Fokus zwischen Fenstern durchgereicht wird"
|
||||
|
||||
#~ msgid "Window Focus"
|
||||
#~ msgstr "Fensterfokus"
|
||||
|
||||
#~ msgid "Clic_k to give focus"
|
||||
#~ msgstr "_Klicken, um den Fokus zu übergeben"
|
||||
|
||||
#~ msgid "Focus behavior:"
|
||||
#~ msgstr "Fokusverhalten:"
|
||||
|
||||
#~ msgid "Window Focus Preferences"
|
||||
#~ msgstr "Fensterfokus-Einstellungen"
|
||||
|
||||
#~ msgid "_Point to give focus"
|
||||
#~ msgstr "_Zeigen, um den Fokus zu übergeben"
|
||||
|
||||
#~ msgid "_Raise window on focus"
|
||||
#~ msgstr "Fenster beim Fokussieren _anheben"
|
||||
|
1085
po/en_CA.po
1085
po/en_CA.po
File diff suppressed because it is too large
Load Diff
2699
po/en_GB.po
2699
po/en_GB.po
File diff suppressed because it is too large
Load Diff
1489
po/pt_BR.po
1489
po/pt_BR.po
File diff suppressed because it is too large
Load Diff
1095
po/sr@Latn.po
1095
po/sr@Latn.po
File diff suppressed because it is too large
Load Diff
1086
po/zh_CN.po
1086
po/zh_CN.po
File diff suppressed because it is too large
Load Diff
1252
po/zh_TW.po
1252
po/zh_TW.po
File diff suppressed because it is too large
Load Diff
@@ -60,3 +60,5 @@ 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
|
||||
multi-head sans xinerama: http://bugzilla.gnome.org/show_bug.cgi?id=324772
|
||||
xinerama: http://bugzilla.gnome.org/show_bug.cgi?id=324773
|
||||
|
@@ -5,6 +5,7 @@ Makefile
|
||||
metacity
|
||||
metacity-theme-viewer
|
||||
metacity-dialog
|
||||
testboxes
|
||||
testgradient
|
||||
inlinepixbufs.h
|
||||
metacity.desktop
|
||||
|
@@ -13,6 +13,8 @@ metacity_SOURCES= \
|
||||
async-getprop.h \
|
||||
bell.h \
|
||||
bell.c \
|
||||
boxes.h \
|
||||
boxes.c \
|
||||
common.h \
|
||||
compositor.c \
|
||||
compositor.h \
|
||||
@@ -25,6 +27,8 @@ metacity_SOURCES= \
|
||||
display.h \
|
||||
draw-workspace.c \
|
||||
draw-workspace.h \
|
||||
edge-resistance.c \
|
||||
edge-resistance.h \
|
||||
effects.c \
|
||||
effects.h \
|
||||
errors.c \
|
||||
@@ -133,11 +137,13 @@ metacity_LDADD=@METACITY_LIBS@ $(EFENCE)
|
||||
metacity_theme_viewer_LDADD= @METACITY_LIBS@ libmetacity-private.la
|
||||
metacity_dialog_LDADD=@METACITY_LIBS@
|
||||
|
||||
testboxes_SOURCES=util.h util.c boxes.h boxes.c testboxes.c
|
||||
testgradient_SOURCES=gradient.h gradient.c testgradient.c
|
||||
testasyncgetprop_SOURCES=async-getprop.h async-getprop.c testasyncgetprop.c
|
||||
|
||||
noinst_PROGRAMS=testgradient testasyncgetprop
|
||||
noinst_PROGRAMS=testboxes testgradient testasyncgetprop
|
||||
|
||||
testboxes_LDADD= @METACITY_LIBS@
|
||||
testgradient_LDADD= @METACITY_LIBS@
|
||||
testasyncgetprop_LDADD= @METACITY_LIBS@
|
||||
|
||||
|
@@ -522,7 +522,6 @@ ag_task_create (Display *dpy,
|
||||
{
|
||||
AgGetPropertyTask *task;
|
||||
xGetPropertyReq *req;
|
||||
xError error;
|
||||
AgPerDisplayData *dd;
|
||||
|
||||
/* Fire up our request */
|
||||
@@ -543,8 +542,6 @@ ag_task_create (Display *dpy,
|
||||
req->longOffset = offset;
|
||||
req->longLength = length;
|
||||
|
||||
error.sequenceNumber = dpy->request;
|
||||
|
||||
/* Queue up our async task */
|
||||
task = Xcalloc (1, sizeof (AgGetPropertyTask));
|
||||
if (task == NULL)
|
||||
|
12
src/bell.c
12
src/bell.c
@@ -2,6 +2,7 @@
|
||||
|
||||
/*
|
||||
* Copyright (C) 2002 Sun Microsystems Inc.
|
||||
* Copyright (C) 2005, 2006 Elijah Newren
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
@@ -29,8 +30,8 @@ meta_bell_flash_screen (MetaDisplay *display,
|
||||
MetaScreen *screen)
|
||||
{
|
||||
Window root = screen->xroot;
|
||||
int width = screen->width;
|
||||
int height = screen->height;
|
||||
int width = screen->rect.width;
|
||||
int height = screen->rect.height;
|
||||
|
||||
if (screen->flash_window == None)
|
||||
{
|
||||
@@ -77,7 +78,12 @@ meta_bell_flash_screen (MetaDisplay *display,
|
||||
XFlush (display->xdisplay);
|
||||
XSync (display->xdisplay, False);
|
||||
XUnmapWindow (display->xdisplay, screen->flash_window);
|
||||
XFreeGC (display->xdisplay, gc);
|
||||
}
|
||||
|
||||
if (meta_prefs_get_focus_mode () != META_FOCUS_MODE_CLICK &&
|
||||
!display->mouse_mode)
|
||||
meta_display_increment_focus_sentinel (display);
|
||||
XFlush (display->xdisplay);
|
||||
}
|
||||
|
||||
@@ -246,5 +252,5 @@ void
|
||||
meta_bell_notify_frame_destroy (MetaFrame *frame)
|
||||
{
|
||||
if (frame->is_flashing)
|
||||
g_idle_remove_by_data (frame);
|
||||
g_source_remove_by_funcs_user_data (&g_timeout_funcs, frame);
|
||||
}
|
||||
|
1812
src/boxes.c
Normal file
1812
src/boxes.c
Normal file
File diff suppressed because it is too large
Load Diff
263
src/boxes.h
Normal file
263
src/boxes.h
Normal file
@@ -0,0 +1,263 @@
|
||||
/* Simple box operations */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2005, 2006 Elijah Newren
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef META_BOXES_H
|
||||
#define META_BOXES_H
|
||||
|
||||
#include <glib.h>
|
||||
#include "common.h"
|
||||
|
||||
typedef struct _MetaRectangle MetaRectangle;
|
||||
|
||||
struct _MetaRectangle
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
int width;
|
||||
int height;
|
||||
};
|
||||
|
||||
#define BOX_LEFT(box) ((box).x) /* Leftmost pixel of rect */
|
||||
#define BOX_RIGHT(box) ((box).x + (box).width) /* One pixel past right */
|
||||
#define BOX_TOP(box) ((box).y) /* Topmost pixel of rect */
|
||||
#define BOX_BOTTOM(box) ((box).y + (box).height) /* One pixel past bottom */
|
||||
|
||||
typedef enum
|
||||
{
|
||||
FIXED_DIRECTION_X = 1 << 0,
|
||||
FIXED_DIRECTION_Y = 1 << 1,
|
||||
} FixedDirections;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
META_EDGE_WINDOW,
|
||||
META_EDGE_XINERAMA,
|
||||
META_EDGE_SCREEN
|
||||
} MetaEdgeType;
|
||||
|
||||
typedef struct _MetaEdge MetaEdge;
|
||||
struct _MetaEdge
|
||||
{
|
||||
MetaRectangle rect; /* width or height should be 1 */
|
||||
MetaDirection side_type; /* should only have 1 of the 4 directions set */
|
||||
MetaEdgeType edge_type;
|
||||
};
|
||||
|
||||
/* Output functions -- note that the output buffer had better be big enough:
|
||||
* rect_to_string: RECT_LENGTH
|
||||
* region_to_string: (RECT_LENGTH+strlen(separator_string)) *
|
||||
* g_list_length (region)
|
||||
* edge_to_string: EDGE_LENGTH
|
||||
* edge_list_to_...: (EDGE_LENGTH+strlen(separator_string)) *
|
||||
* g_list_length (edge_list)
|
||||
*/
|
||||
#define RECT_LENGTH 27
|
||||
#define EDGE_LENGTH 37
|
||||
char* meta_rectangle_to_string (const MetaRectangle *rect,
|
||||
char *output);
|
||||
char* meta_rectangle_region_to_string (GList *region,
|
||||
const char *separator_string,
|
||||
char *output);
|
||||
char* meta_rectangle_edge_to_string (const MetaEdge *edge,
|
||||
char *output);
|
||||
char* meta_rectangle_edge_list_to_string (
|
||||
GList *edge_list,
|
||||
const char *separator_string,
|
||||
char *output);
|
||||
|
||||
/* Function to make initializing a rect with a single line of code easy */
|
||||
MetaRectangle meta_rect (int x, int y, int width, int height);
|
||||
|
||||
/* Basic comparison functions */
|
||||
int meta_rectangle_area (const MetaRectangle *rect);
|
||||
gboolean meta_rectangle_intersect (const MetaRectangle *src1,
|
||||
const MetaRectangle *src2,
|
||||
MetaRectangle *dest);
|
||||
gboolean meta_rectangle_equal (const MetaRectangle *src1,
|
||||
const MetaRectangle *src2);
|
||||
|
||||
/* overlap is similar to intersect but doesn't provide location of
|
||||
* intersection information.
|
||||
*/
|
||||
gboolean meta_rectangle_overlap (const MetaRectangle *rect1,
|
||||
const MetaRectangle *rect2);
|
||||
|
||||
/* vert_overlap means ignore the horizontal location and ask if the
|
||||
* vertical parts overlap. An alternate way to think of it is "Does there
|
||||
* exist a way to shift either rect horizontally so that the two rects
|
||||
* overlap?" horiz_overlap is similar.
|
||||
*/
|
||||
gboolean meta_rectangle_vert_overlap (const MetaRectangle *rect1,
|
||||
const MetaRectangle *rect2);
|
||||
gboolean meta_rectangle_horiz_overlap (const MetaRectangle *rect1,
|
||||
const MetaRectangle *rect2);
|
||||
|
||||
/* could_fit_rect determines whether "outer_rect" is big enough to contain
|
||||
* inner_rect. contains_rect checks whether it actually contains it.
|
||||
*/
|
||||
gboolean meta_rectangle_could_fit_rect (const MetaRectangle *outer_rect,
|
||||
const MetaRectangle *inner_rect);
|
||||
gboolean meta_rectangle_contains_rect (const MetaRectangle *outer_rect,
|
||||
const MetaRectangle *inner_rect);
|
||||
|
||||
/* Resize old_rect to the given new_width and new_height, but store the
|
||||
* result in rect. NOTE THAT THIS IS RESIZE ONLY SO IT CANNOT BE USED FOR
|
||||
* A MOVERESIZE OPERATION (that simplies the routine a little bit as it
|
||||
* means there's no difference between NorthWestGravity and StaticGravity.
|
||||
* Also, I lied a little bit--technically, you could use it in a MoveResize
|
||||
* operation if you muck with old_rect just right).
|
||||
*/
|
||||
void meta_rectangle_resize_with_gravity (const MetaRectangle *old_rect,
|
||||
MetaRectangle *rect,
|
||||
int gravity,
|
||||
int new_width,
|
||||
int new_height);
|
||||
|
||||
/* find a list of rectangles with the property that a window is contained
|
||||
* in the given region if and only if it is contained in one of the
|
||||
* rectangles in the list.
|
||||
*
|
||||
* In this case, the region is given by taking basic_rect, removing from
|
||||
* it the intersections with all the rectangles in the all_struts list,
|
||||
* then expanding all the rectangles in the resulting list by the given
|
||||
* amounts on each side.
|
||||
*
|
||||
* See boxes.c for more details.
|
||||
*/
|
||||
GList* meta_rectangle_get_minimal_spanning_set_for_region (
|
||||
const MetaRectangle *basic_rect,
|
||||
const GSList *all_struts);
|
||||
|
||||
/* Expand all rectangles in region by the given amount on each side */
|
||||
GList* meta_rectangle_expand_region (GList *region,
|
||||
const int left_expand,
|
||||
const int right_expand,
|
||||
const int top_expand,
|
||||
const int bottom_expand);
|
||||
/* Same as for meta_rectangle_expand_region except that rectangles not at
|
||||
* least min_x or min_y in size are not expanded in that direction
|
||||
*/
|
||||
GList* meta_rectangle_expand_region_conditionally (
|
||||
GList *region,
|
||||
const int left_expand,
|
||||
const int right_expand,
|
||||
const int top_expand,
|
||||
const int bottom_expand,
|
||||
const int min_x,
|
||||
const int min_y);
|
||||
|
||||
/* Free the list created by
|
||||
* meta_rectangle_get_minimal_spanning_set_for_region()
|
||||
* or
|
||||
* meta_rectangle_find_onscreen_edges ()
|
||||
* or
|
||||
* meta_rectangle_find_nonintersected_xinerama_edges()
|
||||
*/
|
||||
void meta_rectangle_free_list_and_elements (GList *filled_list);
|
||||
|
||||
/* could_fit_in_region determines whether one of the spanning_rects is
|
||||
* big enough to contain rect. contained_in_region checks whether one
|
||||
* actually contains it.
|
||||
*/
|
||||
gboolean meta_rectangle_could_fit_in_region (
|
||||
const GList *spanning_rects,
|
||||
const MetaRectangle *rect);
|
||||
gboolean meta_rectangle_contained_in_region (
|
||||
const GList *spanning_rects,
|
||||
const MetaRectangle *rect);
|
||||
|
||||
/* Make the rectangle small enough to fit into one of the spanning_rects,
|
||||
* but make it no smaller than min_size.
|
||||
*/
|
||||
void meta_rectangle_clamp_to_fit_into_region (
|
||||
const GList *spanning_rects,
|
||||
FixedDirections fixed_directions,
|
||||
MetaRectangle *rect,
|
||||
const MetaRectangle *min_size);
|
||||
|
||||
/* Clip the rectangle so that it fits into one of the spanning_rects, assuming
|
||||
* it overlaps with at least one of them
|
||||
*/
|
||||
void meta_rectangle_clip_to_region (const GList *spanning_rects,
|
||||
FixedDirections fixed_directions,
|
||||
MetaRectangle *rect);
|
||||
|
||||
/* Shove the rectangle into one of the spanning_rects, assuming it fits in
|
||||
* one of them.
|
||||
*/
|
||||
void meta_rectangle_shove_into_region(
|
||||
const GList *spanning_rects,
|
||||
FixedDirections fixed_directions,
|
||||
MetaRectangle *rect);
|
||||
|
||||
/* Finds the point on the line connecting (x1,y1) to (x2,y2) which is closest
|
||||
* to (px, py). Useful for finding an optimal rectangle size when given a
|
||||
* range between two sizes that are all candidates.
|
||||
*/
|
||||
void meta_rectangle_find_linepoint_closest_to_point (double x1, double y1,
|
||||
double x2, double y2,
|
||||
double px, double py,
|
||||
double *valx, double *valy);
|
||||
|
||||
/***************************************************************************/
|
||||
/* */
|
||||
/* Switching gears to code for edges instead of just rectangles */
|
||||
/* */
|
||||
/***************************************************************************/
|
||||
|
||||
/* Return whether an edge overlaps or is adjacent to the rectangle in the
|
||||
* nonzero-width dimension of the edge.
|
||||
*/
|
||||
gboolean meta_rectangle_edge_aligns (const MetaRectangle *rect,
|
||||
const MetaEdge *edge);
|
||||
|
||||
/* Compare two edges, so that sorting functions can put a list of edges in
|
||||
* canonical order.
|
||||
*/
|
||||
gint meta_rectangle_edge_cmp (gconstpointer a, gconstpointer b);
|
||||
|
||||
/* Compare two edges, so that sorting functions can put a list of edges in
|
||||
* order. This function doesn't separate left edges first, then right edges,
|
||||
* etc., but rather compares only upon location.
|
||||
*/
|
||||
gint meta_rectangle_edge_cmp_ignore_type (gconstpointer a, gconstpointer b);
|
||||
|
||||
/* Removes an parts of edges in the given list that intersect any box in the
|
||||
* given rectangle list. Returns the result.
|
||||
*/
|
||||
GList* meta_rectangle_remove_intersections_with_boxes_from_edges (
|
||||
GList *edges,
|
||||
const GSList *rectangles);
|
||||
|
||||
/* Finds all the edges of an onscreen region, returning a GList* of
|
||||
* MetaEdgeRect's.
|
||||
*/
|
||||
GList* meta_rectangle_find_onscreen_edges (const MetaRectangle *basic_rect,
|
||||
const GSList *all_struts);
|
||||
|
||||
/* Finds edges between adjacent xineramas which are not covered by the given
|
||||
* struts.
|
||||
*/
|
||||
GList* meta_rectangle_find_nonintersected_xinerama_edges (
|
||||
const GList *xinerama_rects,
|
||||
const GSList *all_struts);
|
||||
|
||||
#endif /* META_BOXES_H */
|
24
src/common.h
24
src/common.h
@@ -2,6 +2,7 @@
|
||||
|
||||
/*
|
||||
* Copyright (C) 2001 Havoc Pennington
|
||||
* Copyright (C) 2005 Elijah Newren
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
@@ -64,7 +65,8 @@ typedef enum
|
||||
META_MENU_OP_MOVE_LEFT = 1 << 13,
|
||||
META_MENU_OP_MOVE_RIGHT = 1 << 14,
|
||||
META_MENU_OP_MOVE_UP = 1 << 15,
|
||||
META_MENU_OP_MOVE_DOWN = 1 << 16
|
||||
META_MENU_OP_MOVE_DOWN = 1 << 16,
|
||||
META_MENU_OP_RECOVER = 1 << 17
|
||||
} MetaMenuOp;
|
||||
|
||||
typedef struct _MetaWindowMenu MetaWindowMenu;
|
||||
@@ -184,6 +186,22 @@ typedef enum
|
||||
META_VIRTUAL_MOD5_MASK = 1 << 14
|
||||
} MetaVirtualModifier;
|
||||
|
||||
/* Relative directions or sides seem to come up all over the place... */
|
||||
/* FIXME: Replace
|
||||
* place.[ch]:MetaWindowEdgePosition,
|
||||
* screen.[ch]:MetaScreenDirection,
|
||||
* workspace.[ch]:MetaMotionDirection,
|
||||
* with the use of MetaDirection.
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
META_DIRECTION_LEFT = 1 << 0,
|
||||
META_DIRECTION_RIGHT = 1 << 1,
|
||||
META_DIRECTION_TOP = 1 << 2,
|
||||
META_DIRECTION_BOTTOM = 1 << 3,
|
||||
META_DIRECTION_UP = 1 << 2, /* Alternate name for TOP */
|
||||
META_DIRECTION_DOWN = 1 << 3 /* Alternate name for BOTTOM */
|
||||
} MetaDirection;
|
||||
|
||||
/* Function a window button can have. Note, you can't add stuff here
|
||||
* without extending the theme format to draw a new function and
|
||||
@@ -226,7 +244,3 @@ struct _MetaButtonLayout
|
||||
(ycoord) < ((rect).y + (rect).height))
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
|
1500
src/compositor.c
1500
src/compositor.c
File diff suppressed because it is too large
Load Diff
@@ -25,6 +25,8 @@
|
||||
#include "util.h"
|
||||
#include "display.h"
|
||||
|
||||
typedef void (* MetaMinimizeFinishedFunc) (gpointer data);
|
||||
|
||||
MetaCompositor* meta_compositor_new (MetaDisplay *display);
|
||||
void meta_compositor_unref (MetaCompositor *compositor);
|
||||
void meta_compositor_process_event (MetaCompositor *compositor,
|
||||
@@ -35,22 +37,21 @@ void meta_compositor_add_window (MetaCompositor *compositor,
|
||||
XWindowAttributes *attrs);
|
||||
void meta_compositor_remove_window (MetaCompositor *compositor,
|
||||
Window xwindow);
|
||||
void meta_compositor_set_debug_updates (MetaCompositor *compositor,
|
||||
gboolean debug_updates);
|
||||
|
||||
void meta_compositor_manage_screen (MetaCompositor *compositor,
|
||||
MetaScreen *screen);
|
||||
void meta_compositor_unmanage_screen (MetaCompositor *compositor,
|
||||
MetaScreen *screen);
|
||||
|
||||
void meta_compositor_damage_window (MetaCompositor *compositor,
|
||||
MetaWindow *window);
|
||||
void meta_compositor_minimize (MetaCompositor *compositor,
|
||||
MetaWindow *window,
|
||||
int x,
|
||||
int y,
|
||||
int width,
|
||||
int height,
|
||||
MetaMinimizeFinishedFunc finished_cb,
|
||||
gpointer finished_data);
|
||||
|
||||
#endif /* META_COMPOSITOR_H */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
2489
src/constraints.c
2489
src/constraints.c
File diff suppressed because it is too large
Load Diff
@@ -2,6 +2,7 @@
|
||||
|
||||
/*
|
||||
* Copyright (C) 2002 Red Hat, Inc.
|
||||
* Copyright (C) 2005 Elijah Newren
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
@@ -28,32 +29,18 @@
|
||||
|
||||
typedef enum
|
||||
{
|
||||
META_RESIZE_LEFT_OR_TOP,
|
||||
META_RESIZE_CENTER,
|
||||
META_RESIZE_RIGHT_OR_BOTTOM
|
||||
} MetaResizeDirection;
|
||||
META_IS_CONFIGURE_REQUEST = 1 << 0,
|
||||
META_DO_GRAVITY_ADJUST = 1 << 1,
|
||||
META_IS_USER_ACTION = 1 << 2,
|
||||
META_IS_MOVE_ACTION = 1 << 3,
|
||||
META_IS_RESIZE_ACTION = 1 << 4
|
||||
} MetaMoveResizeFlags;
|
||||
|
||||
void meta_window_constrain (MetaWindow *window,
|
||||
MetaFrameGeometry *fgeom,
|
||||
MetaFrameGeometry *orig_fgeom,
|
||||
MetaMoveResizeFlags flags,
|
||||
int resize_gravity,
|
||||
const MetaRectangle *orig,
|
||||
int x_move_delta,
|
||||
int y_move_delta,
|
||||
MetaResizeDirection x_direction,
|
||||
int x_delta,
|
||||
MetaResizeDirection y_direction,
|
||||
int y_delta,
|
||||
MetaRectangle *new);
|
||||
|
||||
MetaResizeDirection meta_x_direction_from_gravity (int gravity);
|
||||
MetaResizeDirection meta_y_direction_from_gravity (int gravity);
|
||||
|
||||
#endif /* META_CONSTRAINTS_H */
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
45
src/core.c
45
src/core.c
@@ -3,6 +3,7 @@
|
||||
/*
|
||||
* Copyright (C) 2001 Havoc Pennington
|
||||
* Copyright (C) 2003 Rob Adams
|
||||
* Copyright (C) 2004-2006 Elijah Newren
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
@@ -47,6 +48,23 @@ meta_core_get_client_size (Display *xdisplay,
|
||||
*height = window->rect.height;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_core_titlebar_is_onscreen (Display *xdisplay,
|
||||
Window frame_xwindow)
|
||||
{
|
||||
MetaDisplay *display;
|
||||
MetaWindow *window;
|
||||
|
||||
display = meta_display_for_x_display (xdisplay);
|
||||
window = meta_display_lookup_x_window (display, frame_xwindow);
|
||||
|
||||
if (window == NULL || window->frame == NULL)
|
||||
meta_bug ("No such frame window 0x%lx!\n", frame_xwindow);
|
||||
|
||||
return meta_window_titlebar_is_onscreen (window);
|
||||
}
|
||||
|
||||
|
||||
Window
|
||||
meta_core_get_client_xwindow (Display *xdisplay,
|
||||
Window frame_xwindow)
|
||||
@@ -251,7 +269,8 @@ meta_core_user_lower_and_unfocus (Display *xdisplay,
|
||||
|
||||
meta_window_lower (window);
|
||||
|
||||
if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK)
|
||||
if (meta_prefs_get_focus_mode () == META_FOCUS_MODE_CLICK &&
|
||||
meta_prefs_get_raise_on_click ())
|
||||
{
|
||||
/* Move window to the back of the focusing workspace's MRU list.
|
||||
* Do extra sanity checks to avoid possible race conditions.
|
||||
@@ -370,7 +389,8 @@ meta_core_maximize (Display *xdisplay,
|
||||
if (window == NULL || window->frame == NULL)
|
||||
meta_bug ("No such frame window 0x%lx!\n", frame_xwindow);
|
||||
|
||||
meta_window_maximize (window);
|
||||
meta_window_maximize (window,
|
||||
META_MAXIMIZE_HORIZONTAL | META_MAXIMIZE_VERTICAL);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -386,10 +406,12 @@ meta_core_toggle_maximize (Display *xdisplay,
|
||||
if (window == NULL || window->frame == NULL)
|
||||
meta_bug ("No such frame window 0x%lx!\n", frame_xwindow);
|
||||
|
||||
if (window->maximized)
|
||||
meta_window_unmaximize (window);
|
||||
if (META_WINDOW_MAXIMIZED (window))
|
||||
meta_window_unmaximize (window,
|
||||
META_MAXIMIZE_HORIZONTAL | META_MAXIMIZE_VERTICAL);
|
||||
else
|
||||
meta_window_maximize (window);
|
||||
meta_window_maximize (window,
|
||||
META_MAXIMIZE_HORIZONTAL | META_MAXIMIZE_VERTICAL);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -405,7 +427,8 @@ meta_core_unmaximize (Display *xdisplay,
|
||||
if (window == NULL || window->frame == NULL)
|
||||
meta_bug ("No such frame window 0x%lx!\n", frame_xwindow);
|
||||
|
||||
meta_window_unmaximize (window);
|
||||
meta_window_unmaximize (window,
|
||||
META_MAXIMIZE_HORIZONTAL | META_MAXIMIZE_VERTICAL);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -589,7 +612,8 @@ meta_core_show_window_menu (Display *xdisplay,
|
||||
if (window == NULL || window->frame == NULL)
|
||||
meta_bug ("No such frame window 0x%lx!\n", frame_xwindow);
|
||||
|
||||
meta_window_raise (window);
|
||||
if (meta_prefs_get_raise_on_click ())
|
||||
meta_window_raise (window);
|
||||
meta_window_focus (window, timestamp);
|
||||
|
||||
meta_window_show_menu (window, root_x, root_y, button, timestamp);
|
||||
@@ -690,6 +714,9 @@ meta_core_get_menu_accelerator (MetaMenuOp menu_op,
|
||||
case META_MENU_OP_MOVE_DOWN:
|
||||
name = META_KEYBINDING_MOVE_WORKSPACE_DOWN;
|
||||
break;
|
||||
case META_MENU_OP_RECOVER:
|
||||
/* No keybinding for this one */
|
||||
break;
|
||||
}
|
||||
|
||||
if (name)
|
||||
@@ -851,9 +878,9 @@ meta_core_get_screen_size (Display *xdisplay,
|
||||
meta_bug ("No such frame window 0x%lx!\n", frame_on_screen);
|
||||
|
||||
if (width)
|
||||
*width = window->screen->width;
|
||||
*width = window->screen->rect.width;
|
||||
if (height)
|
||||
*height = window->screen->height;
|
||||
*height = window->screen->rect.height;
|
||||
}
|
||||
|
||||
void
|
||||
|
@@ -2,6 +2,7 @@
|
||||
|
||||
/*
|
||||
* Copyright (C) 2001 Havoc Pennington
|
||||
* Copyright (C) 2005 Elijah Newren
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
@@ -31,6 +32,9 @@ void meta_core_get_client_size (Display *xdisplay,
|
||||
int *width,
|
||||
int *height);
|
||||
|
||||
gboolean meta_core_titlebar_is_onscreen (Display *xdisplay,
|
||||
Window frame_xwindow);
|
||||
|
||||
Window meta_core_get_client_xwindow (Display *xdisplay,
|
||||
Window frame_xwindow);
|
||||
|
||||
|
@@ -2,6 +2,7 @@
|
||||
|
||||
/*
|
||||
* Copyright (C) 2001, 2002 Havoc Pennington
|
||||
* Copyright (C) 2004 Elijah Newren
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
@@ -247,7 +248,7 @@ io_from_ping_dialog (GIOChannel *channel,
|
||||
if (condition & G_IO_IN)
|
||||
{
|
||||
char *str;
|
||||
int len;
|
||||
unsigned int len;
|
||||
GError *err;
|
||||
|
||||
/* Go ahead and block for all data from child */
|
||||
|
499
src/display.c
499
src/display.c
@@ -4,6 +4,7 @@
|
||||
* Copyright (C) 2001 Havoc Pennington
|
||||
* Copyright (C) 2002, 2003, 2004 Red Hat, Inc.
|
||||
* Copyright (C) 2003, 2004 Rob Adams
|
||||
* Copyright (C) 2004-2006 Elijah Newren
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
@@ -59,6 +60,9 @@
|
||||
#ifdef HAVE_XKB
|
||||
#include <X11/XKBlib.h>
|
||||
#endif
|
||||
#ifdef HAVE_XCURSOR
|
||||
#include <X11/Xcursor/Xcursor.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
||||
#define USE_GDK_DISPLAY
|
||||
@@ -118,20 +122,6 @@ static void prefs_changed_callback (MetaPreference pref,
|
||||
static void sanity_check_timestamps (MetaDisplay *display,
|
||||
Time known_good_timestamp);
|
||||
|
||||
static void
|
||||
set_utf8_string_hint (MetaDisplay *display,
|
||||
Window xwindow,
|
||||
Atom atom,
|
||||
const char *val)
|
||||
{
|
||||
meta_error_trap_push (display);
|
||||
XChangeProperty (display->xdisplay,
|
||||
xwindow, atom,
|
||||
display->atom_utf8_string,
|
||||
8, PropModeReplace, (guchar*) val, strlen (val));
|
||||
meta_error_trap_pop (display, FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
ping_data_free (MetaPingData *ping_data)
|
||||
{
|
||||
@@ -299,7 +289,9 @@ meta_display_open (const char *name)
|
||||
"_NET_MOVERESIZE_WINDOW",
|
||||
"_NET_DESKTOP_GEOMETRY",
|
||||
"_NET_DESKTOP_VIEWPORT",
|
||||
"_METACITY_VERSION"
|
||||
"_METACITY_VERSION",
|
||||
"_NET_WM_VISIBLE_NAME",
|
||||
"_NET_WM_VISIBLE_ICON_NAME"
|
||||
};
|
||||
Atom atoms[G_N_ELEMENTS(atom_names)];
|
||||
|
||||
@@ -344,6 +336,8 @@ meta_display_open (const char *name)
|
||||
display->grab_old_window_stacking = NULL;
|
||||
|
||||
display->mouse_mode = TRUE; /* Only relevant for mouse or sloppy focus */
|
||||
display->allow_terminal_deactivation = TRUE; /* Only relevant for when a
|
||||
terminal has the focus */
|
||||
|
||||
#ifdef HAVE_XSYNC
|
||||
display->grab_sync_request_alarm = None;
|
||||
@@ -457,6 +451,8 @@ meta_display_open (const char *name)
|
||||
display->atom_net_desktop_geometry = atoms[89];
|
||||
display->atom_net_desktop_viewport = atoms[90];
|
||||
display->atom_metacity_version = atoms[91];
|
||||
display->atom_net_wm_visible_name = atoms[92];
|
||||
display->atom_net_wm_visible_icon_name = atoms[93];
|
||||
|
||||
display->prop_hooks = NULL;
|
||||
meta_display_init_window_prop_hooks (display);
|
||||
@@ -467,7 +463,6 @@ meta_display_open (const char *name)
|
||||
* created in screen_new
|
||||
*/
|
||||
display->leader_window = None;
|
||||
display->no_focus_window = None;
|
||||
|
||||
display->xinerama_cache_invalidated = TRUE;
|
||||
|
||||
@@ -519,12 +514,16 @@ meta_display_open (const char *name)
|
||||
display->grab_resize_timeout_id = 0;
|
||||
display->grab_have_keyboard = FALSE;
|
||||
|
||||
display->last_bell_time = 0;
|
||||
|
||||
display->grab_op = META_GRAB_OP_NONE;
|
||||
display->grab_wireframe_active = FALSE;
|
||||
display->grab_window = NULL;
|
||||
display->grab_screen = NULL;
|
||||
display->grab_resize_popup = NULL;
|
||||
|
||||
display->grab_edge_resistance_data = NULL;
|
||||
|
||||
#ifdef HAVE_XSYNC
|
||||
{
|
||||
int major, minor;
|
||||
@@ -609,31 +608,36 @@ meta_display_open (const char *name)
|
||||
#else /* HAVE_RENDER */
|
||||
meta_verbose ("Not compiled with Render support\n");
|
||||
#endif /* !HAVE_RENDER */
|
||||
|
||||
|
||||
#ifdef HAVE_XCURSOR
|
||||
{
|
||||
XcursorSetTheme (display->xdisplay, meta_prefs_get_cursor_theme ());
|
||||
XcursorSetDefaultSize (display->xdisplay, meta_prefs_get_cursor_size ());
|
||||
}
|
||||
#else /* HAVE_XCURSOR */
|
||||
meta_verbose ("Not compiled with Xcursor support\n");
|
||||
#endif /* !HAVE_XCURSOR */
|
||||
|
||||
/* Create the leader window here. Set its properties and
|
||||
* use the timestamp from one of the PropertyNotify events
|
||||
* that will follow.
|
||||
*/
|
||||
{
|
||||
XSetWindowAttributes attrs;
|
||||
gulong data[1];
|
||||
XEvent event;
|
||||
|
||||
attrs.event_mask = PropertyChangeMask;
|
||||
attrs.override_redirect = True;
|
||||
|
||||
display->leader_window = meta_create_offscreen_window (display->xdisplay,
|
||||
DefaultRootWindow (display->xdisplay));
|
||||
|
||||
set_utf8_string_hint (display,
|
||||
display->leader_window,
|
||||
display->atom_net_wm_name,
|
||||
"Metacity");
|
||||
meta_prop_set_utf8_string_hint (display,
|
||||
display->leader_window,
|
||||
display->atom_net_wm_name,
|
||||
"Metacity");
|
||||
|
||||
set_utf8_string_hint (display,
|
||||
display->leader_window,
|
||||
display->atom_metacity_version,
|
||||
VERSION);
|
||||
meta_prop_set_utf8_string_hint (display,
|
||||
display->leader_window,
|
||||
display->atom_metacity_version,
|
||||
VERSION);
|
||||
|
||||
data[0] = display->leader_window;
|
||||
XChangeProperty (display->xdisplay,
|
||||
@@ -685,7 +689,22 @@ meta_display_open (const char *name)
|
||||
tmp = display->screens;
|
||||
while (tmp != NULL)
|
||||
{
|
||||
meta_screen_manage_all_windows (tmp->data);
|
||||
MetaScreen *screen = tmp->data;
|
||||
|
||||
/* The compositing manager opens its own connection to the X server
|
||||
* and uses the XTest extension to ignore grabs. However, it also
|
||||
* uses GL which opens yet another connection to the X server. With
|
||||
* this ungrab/grab we would block indefinitely in XOpenDisplay().
|
||||
*/
|
||||
meta_display_ungrab (display);
|
||||
|
||||
meta_compositor_manage_screen (screen->display->compositor,
|
||||
screen);
|
||||
|
||||
meta_display_grab (display);
|
||||
|
||||
meta_screen_manage_all_windows (screen);
|
||||
|
||||
tmp = tmp->next;
|
||||
}
|
||||
|
||||
@@ -707,7 +726,10 @@ meta_display_open (const char *name)
|
||||
* as it is the most recent timestamp.
|
||||
*/
|
||||
if (focus == None || focus == PointerRoot)
|
||||
meta_display_focus_the_no_focus_window (display, timestamp);
|
||||
/* Just focus the no_focus_window on the first screen */
|
||||
meta_display_focus_the_no_focus_window (display,
|
||||
display->screens->data,
|
||||
timestamp);
|
||||
else
|
||||
{
|
||||
MetaWindow * window;
|
||||
@@ -715,7 +737,10 @@ meta_display_open (const char *name)
|
||||
if (window)
|
||||
meta_display_set_input_focus_window (display, window, FALSE, timestamp);
|
||||
else
|
||||
meta_display_focus_the_no_focus_window (display, timestamp);
|
||||
/* Just focus the no_focus_window on the first screen */
|
||||
meta_display_focus_the_no_focus_window (display,
|
||||
display->screens->data,
|
||||
timestamp);
|
||||
}
|
||||
|
||||
meta_error_trap_pop (display, FALSE);
|
||||
@@ -801,7 +826,7 @@ void
|
||||
meta_display_close (MetaDisplay *display)
|
||||
{
|
||||
GSList *tmp;
|
||||
|
||||
|
||||
if (display->error_traps > 0)
|
||||
meta_bug ("Display closed with error traps pending\n");
|
||||
|
||||
@@ -1040,7 +1065,6 @@ grab_op_is_mouse (MetaGrabOp op)
|
||||
case META_GRAB_OP_KEYBOARD_RESIZING_NW:
|
||||
case META_GRAB_OP_KEYBOARD_MOVING:
|
||||
return TRUE;
|
||||
break;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
@@ -1068,7 +1092,6 @@ grab_op_is_keyboard (MetaGrabOp op)
|
||||
case META_GRAB_OP_KEYBOARD_ESCAPING_DOCK:
|
||||
case META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING:
|
||||
return TRUE;
|
||||
break;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
@@ -1098,7 +1121,6 @@ meta_grab_op_is_resizing (MetaGrabOp op)
|
||||
case META_GRAB_OP_KEYBOARD_RESIZING_SW:
|
||||
case META_GRAB_OP_KEYBOARD_RESIZING_NW:
|
||||
return TRUE;
|
||||
break;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
@@ -1113,7 +1135,6 @@ meta_grab_op_is_moving (MetaGrabOp op)
|
||||
case META_GRAB_OP_MOVING:
|
||||
case META_GRAB_OP_KEYBOARD_MOVING:
|
||||
return TRUE;
|
||||
break;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
@@ -1240,6 +1261,7 @@ window_raise_with_delay_callback (void *data)
|
||||
Window root, child;
|
||||
unsigned int mask;
|
||||
gboolean same_screen;
|
||||
gboolean point_in_window;
|
||||
|
||||
meta_error_trap_push (window->display);
|
||||
same_screen = XQueryPointer (window->display->xdisplay,
|
||||
@@ -1248,8 +1270,10 @@ window_raise_with_delay_callback (void *data)
|
||||
&root_x, &root_y, &x, &y, &mask);
|
||||
meta_error_trap_pop (window->display, TRUE);
|
||||
|
||||
if ((window->frame && POINT_IN_RECT (root_x, root_y, window->frame->rect)) ||
|
||||
(window->frame == NULL && POINT_IN_RECT (root_x, root_y, window->rect)))
|
||||
point_in_window =
|
||||
(window->frame && POINT_IN_RECT (root_x, root_y, window->frame->rect)) ||
|
||||
(window->frame == NULL && POINT_IN_RECT (root_x, root_y, window->rect));
|
||||
if (same_screen && point_in_window)
|
||||
meta_window_raise (window);
|
||||
else
|
||||
meta_topic (META_DEBUG_FOCUS,
|
||||
@@ -1333,6 +1357,13 @@ handle_net_moveresize_window (MetaDisplay* display,
|
||||
|
||||
if (window)
|
||||
{
|
||||
/* FIXME!!!! This function is _wrong_ except for the resize-only
|
||||
* case. Even then, it sucks to special case the code instead of
|
||||
* factoring out common functionality with the configure reqest
|
||||
* handling, especially since the EWMH says this message should be
|
||||
* treated identically to a configure request with the exception of
|
||||
* having a special gravity specified.
|
||||
*/
|
||||
meta_window_get_gravity_position (window, &x, &y);
|
||||
width = window->rect.width;
|
||||
height = window->rect.height;
|
||||
@@ -1355,20 +1386,20 @@ handle_net_moveresize_window (MetaDisplay* display,
|
||||
{
|
||||
if (gravity)
|
||||
meta_window_resize_with_gravity (window,
|
||||
TRUE,
|
||||
FALSE,
|
||||
width,
|
||||
height,
|
||||
gravity);
|
||||
else
|
||||
meta_window_resize (window,
|
||||
TRUE,
|
||||
FALSE,
|
||||
width,
|
||||
height);
|
||||
}
|
||||
else
|
||||
{
|
||||
meta_window_move_resize (window,
|
||||
TRUE,
|
||||
FALSE,
|
||||
x,
|
||||
y,
|
||||
width,
|
||||
@@ -1388,10 +1419,14 @@ handle_net_restack_window (MetaDisplay* display,
|
||||
|
||||
if (window)
|
||||
{
|
||||
/*
|
||||
* The EWMH includes a sibling for the restack request, but we
|
||||
* don't currently support these types of raises.
|
||||
/* FIXME: The EWMH includes a sibling for the restack request, but we
|
||||
* (stupidly) don't currently support these types of raises.
|
||||
*
|
||||
* Also, unconditionally following these is REALLY stupid--we should
|
||||
* combine this code with the stuff in
|
||||
* meta_window_configure_request() which is smart about whether to
|
||||
* follow the request or do something else (though not smart enough
|
||||
* and is also too stupid to handle the sibling stuff).
|
||||
*/
|
||||
switch (event->xclient.data.l[2])
|
||||
{
|
||||
@@ -1591,7 +1626,7 @@ event_callback (XEvent *event,
|
||||
grab_op_is_keyboard (display->grab_op))
|
||||
{
|
||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||
"Ending grab op %d on window %s due to button press\n",
|
||||
"Ending grab op %u on window %s due to button press\n",
|
||||
display->grab_op,
|
||||
(display->grab_window ?
|
||||
display->grab_window->desc :
|
||||
@@ -1635,15 +1670,11 @@ event_callback (XEvent *event,
|
||||
*/
|
||||
if (!frame_was_receiver)
|
||||
{
|
||||
/* 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 */)
|
||||
if (meta_prefs_get_raise_on_click ())
|
||||
meta_window_raise (window);
|
||||
else
|
||||
meta_topic (META_DEBUG_FOCUS,
|
||||
"Not raising window on click due to mouse/sloppy focus mode\n");
|
||||
"Not raising window on click due to don't-raise-on-click option\n");
|
||||
|
||||
/* Don't focus panels--they must explicitly request focus.
|
||||
* See bug 160470
|
||||
@@ -1651,10 +1682,15 @@ event_callback (XEvent *event,
|
||||
if (window->type != META_WINDOW_DOCK)
|
||||
{
|
||||
meta_topic (META_DEBUG_FOCUS,
|
||||
"Focusing %s due to unmodified button %d press (display.c)\n",
|
||||
"Focusing %s due to unmodified button %u press (display.c)\n",
|
||||
window->desc, event->xbutton.button);
|
||||
meta_window_focus (window, event->xbutton.time);
|
||||
}
|
||||
else
|
||||
/* However, do allow terminals to lose focus due to new
|
||||
* window mappings after the user clicks on a panel.
|
||||
*/
|
||||
display->allow_terminal_deactivation = TRUE;
|
||||
}
|
||||
|
||||
/* you can move on alt-click but not on
|
||||
@@ -1667,40 +1703,55 @@ event_callback (XEvent *event,
|
||||
{
|
||||
if (window->has_resize_func)
|
||||
{
|
||||
gboolean north;
|
||||
gboolean west;
|
||||
gboolean north, south;
|
||||
gboolean west, east;
|
||||
int root_x, root_y;
|
||||
MetaGrabOp op;
|
||||
|
||||
meta_window_get_position (window, &root_x, &root_y);
|
||||
|
||||
west = event->xbutton.x_root < (root_x + window->rect.width / 2);
|
||||
north = event->xbutton.y_root < (root_y + window->rect.height / 2);
|
||||
west = event->xbutton.x_root < (root_x + 1 * window->rect.width / 3);
|
||||
east = event->xbutton.x_root > (root_x + 2 * window->rect.width / 3);
|
||||
north = event->xbutton.y_root < (root_y + 1 * window->rect.height / 3);
|
||||
south = event->xbutton.y_root > (root_y + 2 * window->rect.height / 3);
|
||||
|
||||
if (west && north)
|
||||
if (north && west)
|
||||
op = META_GRAB_OP_RESIZING_NW;
|
||||
else if (west)
|
||||
op = META_GRAB_OP_RESIZING_SW;
|
||||
else if (north)
|
||||
else if (north && east)
|
||||
op = META_GRAB_OP_RESIZING_NE;
|
||||
else
|
||||
else if (south && west)
|
||||
op = META_GRAB_OP_RESIZING_SW;
|
||||
else if (south && east)
|
||||
op = META_GRAB_OP_RESIZING_SE;
|
||||
else if (north)
|
||||
op = META_GRAB_OP_RESIZING_N;
|
||||
else if (west)
|
||||
op = META_GRAB_OP_RESIZING_W;
|
||||
else if (east)
|
||||
op = META_GRAB_OP_RESIZING_E;
|
||||
else if (south)
|
||||
op = META_GRAB_OP_RESIZING_S;
|
||||
else /* Middle region is no-op to avoid user triggering wrong action */
|
||||
op = META_GRAB_OP_NONE;
|
||||
|
||||
meta_display_begin_grab_op (display,
|
||||
window->screen,
|
||||
window,
|
||||
op,
|
||||
TRUE,
|
||||
event->xbutton.serial,
|
||||
event->xbutton.button,
|
||||
0,
|
||||
event->xbutton.time,
|
||||
event->xbutton.x_root,
|
||||
event->xbutton.y_root);
|
||||
if (op != META_GRAB_OP_NONE)
|
||||
meta_display_begin_grab_op (display,
|
||||
window->screen,
|
||||
window,
|
||||
op,
|
||||
TRUE,
|
||||
event->xbutton.serial,
|
||||
event->xbutton.button,
|
||||
0,
|
||||
event->xbutton.time,
|
||||
event->xbutton.x_root,
|
||||
event->xbutton.y_root);
|
||||
}
|
||||
}
|
||||
else if (event->xbutton.button == 3)
|
||||
{
|
||||
if (meta_prefs_get_raise_on_click ())
|
||||
meta_window_raise (window);
|
||||
meta_window_show_menu (window,
|
||||
event->xbutton.x_root,
|
||||
event->xbutton.y_root,
|
||||
@@ -1830,9 +1881,10 @@ event_callback (XEvent *event,
|
||||
{
|
||||
case META_FOCUS_MODE_MOUSE:
|
||||
if ((window->frame == NULL || frame_was_receiver) &&
|
||||
event->xcrossing.mode != NotifyGrab &&
|
||||
event->xcrossing.mode != NotifyUngrab &&
|
||||
event->xcrossing.detail != NotifyInferior)
|
||||
event->xcrossing.mode != NotifyGrab &&
|
||||
event->xcrossing.mode != NotifyUngrab &&
|
||||
event->xcrossing.detail != NotifyInferior &&
|
||||
meta_display_focus_sentinel_clear (display))
|
||||
{
|
||||
if (window == display->expected_focus_window)
|
||||
{
|
||||
@@ -1840,6 +1892,7 @@ event_callback (XEvent *event,
|
||||
"Unsetting focus from %s due to LeaveNotify\n",
|
||||
window->desc);
|
||||
meta_display_focus_the_no_focus_window (display,
|
||||
window->screen,
|
||||
event->xcrossing.time);
|
||||
}
|
||||
if (window->type != META_WINDOW_DOCK &&
|
||||
@@ -1871,7 +1924,8 @@ event_callback (XEvent *event,
|
||||
{
|
||||
meta_window_notify_focus (window, event);
|
||||
}
|
||||
else if (event->xany.window == display->no_focus_window)
|
||||
else if (meta_display_xwindow_is_a_no_focus_window (display,
|
||||
event->xany.window))
|
||||
{
|
||||
meta_topic (META_DEBUG_FOCUS,
|
||||
"Focus %s event received on no_focus_window 0x%lx "
|
||||
@@ -2143,7 +2197,6 @@ event_callback (XEvent *event,
|
||||
* closing the display... so return right away.
|
||||
*/
|
||||
return FALSE;
|
||||
break;
|
||||
case SelectionRequest:
|
||||
process_selection_request (display, event);
|
||||
break;
|
||||
@@ -2315,7 +2368,12 @@ event_callback (XEvent *event,
|
||||
switch (xkb_ev->xkb_type)
|
||||
{
|
||||
case XkbBellNotify:
|
||||
meta_bell_notify (display, xkb_ev);
|
||||
if (XSERVER_TIME_IS_BEFORE(display->last_bell_time,
|
||||
xkb_ev->time - 1000))
|
||||
{
|
||||
display->last_bell_time = xkb_ev->time;
|
||||
meta_bell_notify (display, xkb_ev);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -2642,7 +2700,7 @@ meta_spew_event (MetaDisplay *display,
|
||||
break;
|
||||
case ButtonPress:
|
||||
name = "ButtonPress";
|
||||
extra = g_strdup_printf ("button %d state 0x%x x %d y %d root 0x%lx same_screen %d",
|
||||
extra = g_strdup_printf ("button %u state 0x%x x %d y %d root 0x%lx same_screen %d",
|
||||
event->xbutton.button,
|
||||
event->xbutton.state,
|
||||
event->xbutton.x,
|
||||
@@ -2652,7 +2710,7 @@ meta_spew_event (MetaDisplay *display,
|
||||
break;
|
||||
case ButtonRelease:
|
||||
name = "ButtonRelease";
|
||||
extra = g_strdup_printf ("button %d state 0x%x x %d y %d root 0x%lx same_screen %d",
|
||||
extra = g_strdup_printf ("button %u state 0x%x x %d y %d root 0x%lx same_screen %d",
|
||||
event->xbutton.button,
|
||||
event->xbutton.state,
|
||||
event->xbutton.x,
|
||||
@@ -2894,7 +2952,7 @@ meta_spew_event (MetaDisplay *display,
|
||||
|
||||
extra =
|
||||
g_strdup_printf ("kind: %s "
|
||||
"x: %d y: %d w: %d h: %d "
|
||||
"x: %d y: %d w: %u h: %u "
|
||||
"shaped: %d",
|
||||
sev->kind == ShapeBounding ?
|
||||
"ShapeBounding" :
|
||||
@@ -2961,6 +3019,24 @@ meta_display_unregister_x_window (MetaDisplay *display,
|
||||
remove_pending_pings_for_window (display, xwindow);
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_display_xwindow_is_a_no_focus_window (MetaDisplay *display,
|
||||
Window xwindow)
|
||||
{
|
||||
gboolean is_a_no_focus_window = FALSE;
|
||||
GSList *temp = display->screens;
|
||||
while (temp != NULL) {
|
||||
MetaScreen *screen = temp->data;
|
||||
if (screen->no_focus_window == xwindow) {
|
||||
is_a_no_focus_window = TRUE;
|
||||
break;
|
||||
}
|
||||
temp = temp->next;
|
||||
}
|
||||
|
||||
return is_a_no_focus_window;
|
||||
}
|
||||
|
||||
Cursor
|
||||
meta_display_create_x_cursor (MetaDisplay *display,
|
||||
MetaCursor cursor)
|
||||
@@ -3160,18 +3236,31 @@ meta_display_begin_grab_op (MetaDisplay *display,
|
||||
Window grab_xwindow;
|
||||
|
||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||
"Doing grab op %d on window %s button %d pointer already grabbed: %d pointer pos %d,%d\n",
|
||||
"Doing grab op %u on window %s button %d pointer already grabbed: %d pointer pos %d,%d\n",
|
||||
op, window ? window->desc : "none", button, pointer_already_grabbed,
|
||||
root_x, root_y);
|
||||
|
||||
if (display->grab_op != META_GRAB_OP_NONE)
|
||||
{
|
||||
meta_warning ("Attempt to perform window operation %d on window %s when operation %d on %s already in effect\n",
|
||||
meta_warning ("Attempt to perform window operation %u on window %s when operation %u on %s already in effect\n",
|
||||
op, window ? window->desc : "none", display->grab_op,
|
||||
display->grab_window ? display->grab_window->desc : "none");
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (window &&
|
||||
(meta_grab_op_is_moving (op) || meta_grab_op_is_resizing (op)))
|
||||
{
|
||||
if (meta_prefs_get_raise_on_click ())
|
||||
meta_window_raise (window);
|
||||
else
|
||||
{
|
||||
display->grab_initial_x = root_x;
|
||||
display->grab_initial_y = root_y;
|
||||
display->grab_threshold_movement_reached = FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
/* We'll ignore any events < this serial. */
|
||||
if (pointer_already_grabbed)
|
||||
display->grab_start_serial = event_serial;
|
||||
@@ -3240,6 +3329,7 @@ meta_display_begin_grab_op (MetaDisplay *display,
|
||||
display->grab_old_window_stacking = NULL;
|
||||
#ifdef HAVE_XSYNC
|
||||
display->grab_sync_request_alarm = None;
|
||||
display->grab_last_user_action_was_snap = FALSE;
|
||||
#endif
|
||||
display->grab_was_cancelled = FALSE;
|
||||
|
||||
@@ -3264,23 +3354,8 @@ meta_display_begin_grab_op (MetaDisplay *display,
|
||||
|
||||
if (display->grab_wireframe_active)
|
||||
{
|
||||
MetaRectangle xor_rect;
|
||||
|
||||
display->grab_wireframe_rect = window->rect;
|
||||
if (window->frame)
|
||||
{
|
||||
display->grab_wireframe_rect.x += window->frame->rect.x;
|
||||
display->grab_wireframe_rect.y += window->frame->rect.y;
|
||||
}
|
||||
|
||||
meta_window_calc_showing (display->grab_window);
|
||||
|
||||
meta_window_get_xor_rect (window, &display->grab_wireframe_rect,
|
||||
&xor_rect);
|
||||
|
||||
meta_effects_begin_wireframe (display->grab_window->screen,
|
||||
&xor_rect);
|
||||
display->grab_wireframe_last_xor_rect = xor_rect;
|
||||
meta_window_begin_wireframe (window);
|
||||
}
|
||||
|
||||
#ifdef HAVE_XSYNC
|
||||
@@ -3340,12 +3415,24 @@ meta_display_begin_grab_op (MetaDisplay *display,
|
||||
}
|
||||
|
||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||
"Grab op %d on window %s successful\n",
|
||||
"Grab op %u on window %s successful\n",
|
||||
display->grab_op, window ? window->desc : "(null)");
|
||||
|
||||
g_assert (display->grab_window != NULL || display->grab_screen != NULL);
|
||||
g_assert (display->grab_op != META_GRAB_OP_NONE);
|
||||
|
||||
/* If this is a move or resize, cache the window edges for
|
||||
* resistance/snapping
|
||||
*/
|
||||
if (meta_grab_op_is_resizing (display->grab_op) ||
|
||||
meta_grab_op_is_moving (display->grab_op))
|
||||
{
|
||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||
"Computing edges to resist-movement or snap-to for %s.\n",
|
||||
window->desc);
|
||||
meta_display_compute_resistance_and_snapping_edges (display);
|
||||
}
|
||||
|
||||
/* Save the old stacking */
|
||||
if (GRAB_OP_IS_WINDOW_SWITCH (display->grab_op))
|
||||
{
|
||||
@@ -3360,15 +3447,25 @@ meta_display_begin_grab_op (MetaDisplay *display,
|
||||
switch (op)
|
||||
{
|
||||
case META_GRAB_OP_KEYBOARD_TABBING_NORMAL:
|
||||
meta_screen_ensure_tab_popup (screen,
|
||||
META_TAB_LIST_NORMAL,
|
||||
META_TAB_SHOW_ICON);
|
||||
break;
|
||||
case META_GRAB_OP_KEYBOARD_ESCAPING_NORMAL:
|
||||
meta_screen_ensure_tab_popup (screen,
|
||||
META_TAB_LIST_NORMAL);
|
||||
META_TAB_LIST_NORMAL,
|
||||
META_TAB_SHOW_INSTANTLY);
|
||||
break;
|
||||
|
||||
case META_GRAB_OP_KEYBOARD_TABBING_DOCK:
|
||||
meta_screen_ensure_tab_popup (screen,
|
||||
META_TAB_LIST_DOCKS,
|
||||
META_TAB_SHOW_ICON);
|
||||
break;
|
||||
case META_GRAB_OP_KEYBOARD_ESCAPING_DOCK:
|
||||
meta_screen_ensure_tab_popup (screen,
|
||||
META_TAB_LIST_DOCKS);
|
||||
META_TAB_LIST_DOCKS,
|
||||
META_TAB_SHOW_INSTANTLY);
|
||||
break;
|
||||
|
||||
case META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING:
|
||||
@@ -3382,12 +3479,6 @@ meta_display_begin_grab_op (MetaDisplay *display,
|
||||
if (display->grab_window)
|
||||
{
|
||||
meta_window_refresh_resize_popup (display->grab_window);
|
||||
|
||||
/* repaint window in case we draw it differently
|
||||
* when grabbed
|
||||
*/
|
||||
meta_compositor_damage_window (display->compositor,
|
||||
display->grab_window);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
@@ -3398,7 +3489,7 @@ meta_display_end_grab_op (MetaDisplay *display,
|
||||
Time timestamp)
|
||||
{
|
||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||
"Ending grab op %d at time %lu\n", display->grab_op,
|
||||
"Ending grab op %u at time %lu\n", display->grab_op,
|
||||
(unsigned long) timestamp);
|
||||
|
||||
if (display->grab_op == META_GRAB_OP_NONE)
|
||||
@@ -3407,6 +3498,21 @@ meta_display_end_grab_op (MetaDisplay *display,
|
||||
if (display->grab_window != NULL)
|
||||
display->grab_window->shaken_loose = FALSE;
|
||||
|
||||
if (display->grab_window != NULL &&
|
||||
!meta_prefs_get_raise_on_click () &&
|
||||
(meta_grab_op_is_moving (display->grab_op) ||
|
||||
meta_grab_op_is_resizing (display->grab_op)))
|
||||
{
|
||||
/* Only raise the window in orthogonal raise
|
||||
* ('do-not-raise-on-click') mode if the user didn't try to move
|
||||
* or resize the given window by at least a threshold amount.
|
||||
* For raise on click mode, the window was raised at the
|
||||
* beginning of the grab_op.
|
||||
*/
|
||||
if (!display->grab_threshold_movement_reached)
|
||||
meta_window_raise (display->grab_window);
|
||||
}
|
||||
|
||||
if (GRAB_OP_IS_WINDOW_SWITCH (display->grab_op) ||
|
||||
display->grab_op == META_GRAB_OP_KEYBOARD_WORKSPACE_SWITCHING)
|
||||
{
|
||||
@@ -3419,6 +3525,15 @@ meta_display_end_grab_op (MetaDisplay *display,
|
||||
display->ungrab_should_not_cause_focus_window = display->grab_xwindow;
|
||||
}
|
||||
|
||||
/* If this was a move or resize clear out the edge cache */
|
||||
if (meta_grab_op_is_resizing (display->grab_op) ||
|
||||
meta_grab_op_is_moving (display->grab_op))
|
||||
{
|
||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||
"Clearing out the edges for resistance/snapping");
|
||||
meta_display_cleanup_edges (display);
|
||||
}
|
||||
|
||||
if (display->grab_old_window_stacking != NULL)
|
||||
{
|
||||
meta_topic (META_DEBUG_WINDOW_OPS,
|
||||
@@ -3431,15 +3546,22 @@ meta_display_end_grab_op (MetaDisplay *display,
|
||||
if (display->grab_wireframe_active)
|
||||
{
|
||||
display->grab_wireframe_active = FALSE;
|
||||
meta_effects_end_wireframe (display->grab_window->screen,
|
||||
&display->grab_wireframe_last_xor_rect);
|
||||
meta_window_end_wireframe (display->grab_window);
|
||||
|
||||
if (!display->grab_was_cancelled)
|
||||
meta_window_move_resize (display->grab_window,
|
||||
TRUE,
|
||||
display->grab_wireframe_rect.x,
|
||||
display->grab_wireframe_rect.y,
|
||||
display->grab_wireframe_rect.width,
|
||||
display->grab_wireframe_rect.height);
|
||||
{
|
||||
if (meta_grab_op_is_moving (display->grab_op))
|
||||
meta_window_move (display->grab_window,
|
||||
TRUE,
|
||||
display->grab_wireframe_rect.x,
|
||||
display->grab_wireframe_rect.y);
|
||||
if (meta_grab_op_is_resizing (display->grab_op))
|
||||
meta_window_resize_with_gravity (display->grab_window,
|
||||
TRUE,
|
||||
display->grab_wireframe_rect.width,
|
||||
display->grab_wireframe_rect.height,
|
||||
meta_resize_gravity_from_grab_op (display->grab_op));
|
||||
}
|
||||
meta_window_calc_showing (display->grab_window);
|
||||
}
|
||||
|
||||
@@ -3469,13 +3591,6 @@ meta_display_end_grab_op (MetaDisplay *display,
|
||||
display->grab_sync_request_alarm = None;
|
||||
}
|
||||
#endif /* HAVE_XSYNC */
|
||||
|
||||
/* repaint window in case the grab op drew it in a
|
||||
* nonstandard way such as transparent or wireframe
|
||||
*/
|
||||
if (display->grab_window != NULL)
|
||||
meta_compositor_damage_window (display->compositor,
|
||||
display->grab_window);
|
||||
|
||||
display->grab_window = NULL;
|
||||
display->grab_screen = NULL;
|
||||
@@ -3495,6 +3610,21 @@ meta_display_end_grab_op (MetaDisplay *display,
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_display_check_threshold_reached (MetaDisplay *display,
|
||||
int x,
|
||||
int y)
|
||||
{
|
||||
/* Don't bother doing the check again if we've already reached the threshold */
|
||||
if (display->grab_threshold_movement_reached ||
|
||||
meta_prefs_get_raise_on_click ())
|
||||
return;
|
||||
|
||||
if (ABS (display->grab_initial_x - x) >= 8 ||
|
||||
ABS (display->grab_initial_y - y) >= 8)
|
||||
display->grab_threshold_movement_reached = TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
meta_change_button_grab (MetaDisplay *display,
|
||||
Window xwindow,
|
||||
@@ -3776,6 +3906,36 @@ meta_display_retheme_all (void)
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_display_set_cursor_theme (const char *theme,
|
||||
int size)
|
||||
{
|
||||
#ifdef HAVE_XCURSOR
|
||||
GSList *tmp, *tmp2;
|
||||
|
||||
tmp = meta_displays_list ();
|
||||
while (tmp != NULL)
|
||||
{
|
||||
MetaDisplay *display = tmp->data;
|
||||
|
||||
XcursorSetTheme (display->xdisplay, theme);
|
||||
XcursorSetDefaultSize (display->xdisplay, size);
|
||||
|
||||
tmp2 = display->screens;
|
||||
while (tmp2 != NULL)
|
||||
{
|
||||
MetaScreen *screen = tmp2->data;
|
||||
|
||||
meta_screen_update_cursor (screen);
|
||||
|
||||
tmp2 = tmp2->next;
|
||||
}
|
||||
|
||||
tmp = tmp->next;
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
static gboolean is_syncing = FALSE;
|
||||
|
||||
gboolean
|
||||
@@ -3929,7 +4089,7 @@ process_request_frame_extents (MetaDisplay *display,
|
||||
|
||||
meta_topic (META_DEBUG_GEOMETRY,
|
||||
"Setting _NET_FRAME_EXTENTS on unmanaged window 0x%lx "
|
||||
"to top = %ld, left = %ld, bottom = %ld, right = %ld\n",
|
||||
"to top = %lu, left = %lu, bottom = %lu, right = %lu\n",
|
||||
xwindow, data[0], data[1], data[2], data[3]);
|
||||
|
||||
meta_error_trap_push (display);
|
||||
@@ -4151,6 +4311,7 @@ meta_display_get_tab_next (MetaDisplay *display,
|
||||
{
|
||||
gboolean skip;
|
||||
GList *tab_list;
|
||||
MetaWindow *ret;
|
||||
tab_list = meta_display_get_tab_list(display,
|
||||
type,
|
||||
screen,
|
||||
@@ -4164,27 +4325,30 @@ meta_display_get_tab_next (MetaDisplay *display,
|
||||
g_assert (window->display == display);
|
||||
|
||||
if (backward)
|
||||
return find_tab_backward (display, type, screen, workspace,
|
||||
g_list_find (tab_list,
|
||||
window),
|
||||
TRUE);
|
||||
else
|
||||
return find_tab_forward (display, type, screen, workspace,
|
||||
ret = find_tab_backward (display, type, screen, workspace,
|
||||
g_list_find (tab_list,
|
||||
window),
|
||||
TRUE);
|
||||
else
|
||||
ret = find_tab_forward (display, type, screen, workspace,
|
||||
g_list_find (tab_list,
|
||||
window),
|
||||
TRUE);
|
||||
}
|
||||
else
|
||||
{
|
||||
skip = display->focus_window != NULL &&
|
||||
IN_TAB_CHAIN (display->focus_window, type);
|
||||
if (backward)
|
||||
ret = find_tab_backward (display, type, screen, workspace,
|
||||
tab_list, skip);
|
||||
else
|
||||
ret = find_tab_forward (display, type, screen, workspace,
|
||||
tab_list, skip);
|
||||
}
|
||||
|
||||
skip = display->focus_window != NULL &&
|
||||
IN_TAB_CHAIN (display->focus_window, type);
|
||||
if (backward)
|
||||
return find_tab_backward (display, type, screen, workspace,
|
||||
tab_list, skip);
|
||||
else
|
||||
return find_tab_forward (display, type, screen, workspace,
|
||||
tab_list, skip);
|
||||
|
||||
g_list_free (tab_list);
|
||||
return ret;
|
||||
}
|
||||
|
||||
MetaWindow*
|
||||
@@ -4257,53 +4421,6 @@ meta_resize_gravity_from_grab_op (MetaGrabOp op)
|
||||
return gravity;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_rectangle_intersect (MetaRectangle *src1,
|
||||
MetaRectangle *src2,
|
||||
MetaRectangle *dest)
|
||||
{
|
||||
int dest_x, dest_y;
|
||||
int dest_w, dest_h;
|
||||
int return_val;
|
||||
|
||||
g_return_val_if_fail (src1 != NULL, FALSE);
|
||||
g_return_val_if_fail (src2 != NULL, FALSE);
|
||||
g_return_val_if_fail (dest != NULL, FALSE);
|
||||
|
||||
return_val = FALSE;
|
||||
|
||||
dest_x = MAX (src1->x, src2->x);
|
||||
dest_y = MAX (src1->y, src2->y);
|
||||
dest_w = MIN (src1->x + src1->width, src2->x + src2->width) - dest_x;
|
||||
dest_h = MIN (src1->y + src1->height, src2->y + src2->height) - dest_y;
|
||||
|
||||
if (dest_w > 0 && dest_h > 0)
|
||||
{
|
||||
dest->x = dest_x;
|
||||
dest->y = dest_y;
|
||||
dest->width = dest_w;
|
||||
dest->height = dest_h;
|
||||
return_val = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
dest->width = 0;
|
||||
dest->height = 0;
|
||||
}
|
||||
|
||||
return return_val;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_rectangle_equal (const MetaRectangle *src1,
|
||||
const MetaRectangle *src2)
|
||||
{
|
||||
return ((src1->x == src2->x) &&
|
||||
(src1->y == src2->y) &&
|
||||
(src1->width == src2->width) &&
|
||||
(src1->height == src2->height));
|
||||
}
|
||||
|
||||
static MetaScreen*
|
||||
find_screen_for_selection (MetaDisplay *display,
|
||||
Window owner,
|
||||
@@ -4735,9 +4852,6 @@ timestamp_too_old (MetaDisplay *display,
|
||||
* timestamp_too_old_or_in_future).
|
||||
*/
|
||||
|
||||
MetaWindow *focus_window;
|
||||
focus_window = display->focus_window;
|
||||
|
||||
if (*timestamp == CurrentTime)
|
||||
{
|
||||
meta_warning ("Got a request to focus %s with a timestamp of 0. This "
|
||||
@@ -4801,13 +4915,14 @@ meta_display_set_input_focus_window (MetaDisplay *display,
|
||||
|
||||
void
|
||||
meta_display_focus_the_no_focus_window (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
Time timestamp)
|
||||
{
|
||||
if (timestamp_too_old (display, NULL, ×tamp))
|
||||
return;
|
||||
|
||||
XSetInputFocus (display->xdisplay,
|
||||
display->no_focus_window,
|
||||
screen->no_focus_window,
|
||||
RevertToPointerRoot,
|
||||
timestamp);
|
||||
display->expected_focus_window = NULL;
|
||||
|
@@ -4,6 +4,7 @@
|
||||
* Copyright (C) 2001 Havoc Pennington
|
||||
* Copyright (C) 2002 Red Hat, Inc.
|
||||
* Copyright (C) 2003 Rob Adams
|
||||
* Copyright (C) 2004-2006 Elijah Newren
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
@@ -32,6 +33,7 @@
|
||||
#include <X11/Xlib.h>
|
||||
#include "eventqueue.h"
|
||||
#include "common.h"
|
||||
#include "boxes.h"
|
||||
|
||||
#ifdef HAVE_STARTUP_NOTIFICATION
|
||||
#include <libsn/sn.h>
|
||||
@@ -43,17 +45,6 @@
|
||||
|
||||
#define meta_XFree(p) do { if ((p)) XFree ((p)); } while (0)
|
||||
|
||||
/* this doesn't really belong here, oh well. */
|
||||
typedef struct _MetaRectangle MetaRectangle;
|
||||
|
||||
struct _MetaRectangle
|
||||
{
|
||||
int x;
|
||||
int y;
|
||||
int width;
|
||||
int height;
|
||||
};
|
||||
|
||||
typedef struct MetaCompositor MetaCompositor;
|
||||
typedef struct _MetaDisplay MetaDisplay;
|
||||
typedef struct _MetaFrame MetaFrame;
|
||||
@@ -67,6 +58,8 @@ typedef struct _MetaWorkspace MetaWorkspace;
|
||||
typedef struct _MetaWindowPropHooks MetaWindowPropHooks;
|
||||
typedef struct _MetaGroupPropHooks MetaGroupPropHooks;
|
||||
|
||||
typedef struct MetaEdgeResistanceData MetaEdgeResistanceData;
|
||||
|
||||
typedef void (* MetaWindowPingFunc) (MetaDisplay *display,
|
||||
Window xwindow,
|
||||
Time timestamp,
|
||||
@@ -183,6 +176,8 @@ struct _MetaDisplay
|
||||
Atom atom_net_desktop_geometry;
|
||||
Atom atom_net_desktop_viewport;
|
||||
Atom atom_metacity_version;
|
||||
Atom atom_net_wm_visible_name;
|
||||
Atom atom_net_wm_visible_icon_name;
|
||||
|
||||
/* This is the actual window from focus events,
|
||||
* not the one we last set
|
||||
@@ -209,6 +204,14 @@ struct _MetaDisplay
|
||||
*/
|
||||
guint mouse_mode : 1;
|
||||
|
||||
/* Helper var for strict focus for terminals; only relevant if the focus
|
||||
* window is a terminal. Typically, we don't allow new windows to take
|
||||
* focus away from a terminal, but if the user explicitly did something
|
||||
* that should allow a different window to gain focus (e.g. global
|
||||
* keybinding or clicking on a dock), then we will allow the transfer.
|
||||
*/
|
||||
guint allow_terminal_deactivation : 1;
|
||||
|
||||
guint static_gravity_works : 1;
|
||||
|
||||
/*< private-ish >*/
|
||||
@@ -221,11 +224,6 @@ struct _MetaDisplay
|
||||
XErrorEvent *error);
|
||||
int server_grab_count;
|
||||
|
||||
/* This window holds the focus when we don't want to focus
|
||||
* any actual clients
|
||||
*/
|
||||
Window no_focus_window;
|
||||
|
||||
/* for double click */
|
||||
Time last_button_time;
|
||||
Window last_button_xwindow;
|
||||
@@ -271,10 +269,15 @@ struct _MetaDisplay
|
||||
MetaRectangle grab_wireframe_rect;
|
||||
MetaRectangle grab_wireframe_last_xor_rect;
|
||||
MetaRectangle grab_initial_window_pos;
|
||||
int grab_initial_x, grab_initial_y; /* These are only relevant for */
|
||||
gboolean grab_threshold_movement_reached; /* raise_on_click == FALSE. */
|
||||
MetaResizePopup *grab_resize_popup;
|
||||
GTimeVal grab_last_moveresize_time;
|
||||
Time grab_motion_notify_time;
|
||||
int grab_wireframe_last_display_width;
|
||||
int grab_wireframe_last_display_height;
|
||||
GList* grab_old_window_stacking;
|
||||
MetaEdgeResistanceData *grab_edge_resistance_data;
|
||||
|
||||
/* we use property updates as sentinels for certain window focus events
|
||||
* to avoid some race conditions on EnterNotify events
|
||||
@@ -283,6 +286,7 @@ struct _MetaDisplay
|
||||
|
||||
#ifdef HAVE_XKB
|
||||
int xkb_base_event_type;
|
||||
Time last_bell_time;
|
||||
#endif
|
||||
#ifdef HAVE_XSYNC
|
||||
/* alarm monitoring client's _NET_WM_SYNC_REQUEST_COUNTER */
|
||||
@@ -345,6 +349,7 @@ struct _MetaDisplay
|
||||
int render_error_base;
|
||||
#endif
|
||||
#ifdef HAVE_XSYNC
|
||||
unsigned int grab_last_user_action_was_snap;
|
||||
unsigned int have_xsync : 1;
|
||||
#define META_DISPLAY_HAS_XSYNC(display) ((display)->have_xsync)
|
||||
#else
|
||||
@@ -377,13 +382,13 @@ struct _MetaDisplay
|
||||
* the result.
|
||||
*/
|
||||
#define XSERVER_TIME_IS_BEFORE_ASSUMING_REAL_TIMESTAMPS(time1, time2) \
|
||||
( (( time1 < time2 ) && ( time2 - time1 < ((guint32)-1)/2 )) || \
|
||||
(( time1 > time2 ) && ( time1 - time2 > ((guint32)-1)/2 )) \
|
||||
( (( (time1) < (time2) ) && ( (time2) - (time1) < ((guint32)-1)/2 )) || \
|
||||
(( (time1) > (time2) ) && ( (time1) - (time2) > ((guint32)-1)/2 )) \
|
||||
)
|
||||
#define XSERVER_TIME_IS_BEFORE(time1, time2) \
|
||||
( time1 == 0 || \
|
||||
( (time1) == 0 || \
|
||||
(XSERVER_TIME_IS_BEFORE_ASSUMING_REAL_TIMESTAMPS(time1, time2) && \
|
||||
time2 != 0) \
|
||||
(time2) != 0) \
|
||||
)
|
||||
|
||||
gboolean meta_display_open (const char *name);
|
||||
@@ -414,6 +419,9 @@ void meta_display_register_x_window (MetaDisplay *display,
|
||||
MetaWindow *window);
|
||||
void meta_display_unregister_x_window (MetaDisplay *display,
|
||||
Window xwindow);
|
||||
/* Return whether the xwindow is a no focus window for any of the screens */
|
||||
gboolean meta_display_xwindow_is_a_no_focus_window (MetaDisplay *display,
|
||||
Window xwindow);
|
||||
|
||||
GSList* meta_display_list_windows (MetaDisplay *display);
|
||||
|
||||
@@ -444,6 +452,9 @@ gboolean meta_display_begin_grab_op (MetaDisplay *display,
|
||||
void meta_display_end_grab_op (MetaDisplay *display,
|
||||
Time timestamp);
|
||||
|
||||
void meta_display_check_threshold_reached (MetaDisplay *display,
|
||||
int x,
|
||||
int y);
|
||||
void meta_display_grab_window_buttons (MetaDisplay *display,
|
||||
Window xwindow);
|
||||
void meta_display_ungrab_window_buttons (MetaDisplay *display,
|
||||
@@ -454,6 +465,10 @@ void meta_display_grab_focus_window_button (MetaDisplay *display,
|
||||
void meta_display_ungrab_focus_window_button (MetaDisplay *display,
|
||||
MetaWindow *window);
|
||||
|
||||
/* Next two functions are defined in edge-resistance.c */
|
||||
void meta_display_compute_resistance_and_snapping_edges (MetaDisplay *display);
|
||||
void meta_display_cleanup_edges (MetaDisplay *display);
|
||||
|
||||
/* make a request to ensure the event serial has changed */
|
||||
void meta_display_increment_event_serial (MetaDisplay *display);
|
||||
|
||||
@@ -469,6 +484,9 @@ const char* meta_event_detail_to_string (int d);
|
||||
void meta_display_queue_retheme_all_windows (MetaDisplay *display);
|
||||
void meta_display_retheme_all (void);
|
||||
|
||||
void meta_display_set_cursor_theme (const char *theme,
|
||||
int size);
|
||||
|
||||
void meta_display_ping_window (MetaDisplay *display,
|
||||
MetaWindow *window,
|
||||
Time timestamp,
|
||||
@@ -482,10 +500,14 @@ typedef enum
|
||||
{
|
||||
META_TAB_LIST_NORMAL,
|
||||
META_TAB_LIST_DOCKS
|
||||
|
||||
|
||||
} MetaTabList;
|
||||
|
||||
typedef enum
|
||||
{
|
||||
META_TAB_SHOW_ICON, /* Alt-Tab mode */
|
||||
META_TAB_SHOW_INSTANTLY /* Alt-Esc mode */
|
||||
} MetaTabShowType;
|
||||
|
||||
GList* meta_display_get_tab_list (MetaDisplay *display,
|
||||
MetaTabList type,
|
||||
MetaScreen *screen,
|
||||
@@ -508,12 +530,6 @@ int meta_resize_gravity_from_grab_op (MetaGrabOp op);
|
||||
gboolean meta_grab_op_is_moving (MetaGrabOp op);
|
||||
gboolean meta_grab_op_is_resizing (MetaGrabOp op);
|
||||
|
||||
gboolean meta_rectangle_intersect (MetaRectangle *src1,
|
||||
MetaRectangle *src2,
|
||||
MetaRectangle *dest);
|
||||
gboolean meta_rectangle_equal (const MetaRectangle *src1,
|
||||
const MetaRectangle *src2);
|
||||
|
||||
void meta_display_devirtualize_modifiers (MetaDisplay *display,
|
||||
MetaVirtualModifier modifiers,
|
||||
unsigned int *mask);
|
||||
@@ -541,6 +557,7 @@ void meta_display_set_input_focus_window (MetaDisplay *display,
|
||||
* same as meta_display_set_input_focus_window
|
||||
*/
|
||||
void meta_display_focus_the_no_focus_window (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
Time timestamp);
|
||||
|
||||
void meta_display_queue_autoraise_callback (MetaDisplay *display,
|
||||
|
1217
src/edge-resistance.c
Normal file
1217
src/edge-resistance.c
Normal file
File diff suppressed because it is too large
Load Diff
46
src/edge-resistance.h
Normal file
46
src/edge-resistance.h
Normal file
@@ -0,0 +1,46 @@
|
||||
/* Edge resistance for move/resize operations */
|
||||
|
||||
/*
|
||||
* Copyright (C) 2005 Elijah Newren
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU General Public License as
|
||||
* published by the Free Software Foundation; either version 2 of the
|
||||
* License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but
|
||||
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
|
||||
* 02111-1307, USA.
|
||||
*/
|
||||
|
||||
#ifndef META_EDGE_RESISTANCE_H
|
||||
#define META_EDGE_RESISTANCE_H
|
||||
|
||||
#include "window.h"
|
||||
|
||||
void meta_window_edge_resistance_for_move (MetaWindow *window,
|
||||
int old_x,
|
||||
int old_y,
|
||||
int *new_x,
|
||||
int *new_y,
|
||||
GSourceFunc timeout_func,
|
||||
gboolean snap,
|
||||
gboolean is_keyboard_op);
|
||||
void meta_window_edge_resistance_for_resize (MetaWindow *window,
|
||||
int old_width,
|
||||
int old_height,
|
||||
int *new_width,
|
||||
int *new_height,
|
||||
int gravity,
|
||||
GSourceFunc timeout_func,
|
||||
gboolean snap,
|
||||
gboolean is_keyboard_op);
|
||||
|
||||
#endif /* META_EDGE_RESISTANCE_H */
|
||||
|
136
src/effects.c
136
src/effects.c
@@ -28,6 +28,8 @@
|
||||
#include <X11/extensions/shape.h>
|
||||
#endif
|
||||
|
||||
#include <string.h>
|
||||
|
||||
typedef enum
|
||||
{
|
||||
META_ANIMATION_DRAW_ROOT,
|
||||
@@ -429,56 +431,138 @@ meta_effects_draw_box_animation (MetaScreen *screen,
|
||||
|
||||
void
|
||||
meta_effects_begin_wireframe (MetaScreen *screen,
|
||||
const MetaRectangle *rect)
|
||||
const MetaRectangle *rect,
|
||||
int width,
|
||||
int height)
|
||||
{
|
||||
/* Grab the X server to avoid screen dirt */
|
||||
meta_display_grab (screen->display);
|
||||
meta_ui_push_delay_exposes (screen->ui);
|
||||
|
||||
meta_effects_update_wireframe (screen, NULL, rect);
|
||||
meta_effects_update_wireframe (screen,
|
||||
NULL, -1, -1,
|
||||
rect, width, height);
|
||||
}
|
||||
|
||||
static void
|
||||
draw_xor_rect (MetaScreen *screen,
|
||||
const MetaRectangle *rect)
|
||||
const MetaRectangle *rect,
|
||||
int width,
|
||||
int height)
|
||||
{
|
||||
/* The lines in the center can't overlap the rectangle or each
|
||||
* other, or the XOR gets reversed. So we have to draw things
|
||||
* a bit oddly.
|
||||
*/
|
||||
XSegment segments[8];
|
||||
MetaRectangle shrunk_rect;
|
||||
int i;
|
||||
|
||||
#define LINE_WIDTH META_WIREFRAME_XOR_LINE_WIDTH
|
||||
|
||||
|
||||
/* We don't want the wireframe going outside the window area.
|
||||
* It makes it harder for the user to position windows and it exposes other
|
||||
* annoying bugs.
|
||||
*/
|
||||
shrunk_rect = *rect;
|
||||
|
||||
shrunk_rect.x += LINE_WIDTH / 2 + LINE_WIDTH % 2;
|
||||
shrunk_rect.y += LINE_WIDTH / 2 + LINE_WIDTH % 2;
|
||||
shrunk_rect.width -= LINE_WIDTH + 2 * (LINE_WIDTH % 2);
|
||||
shrunk_rect.height -= LINE_WIDTH + 2 * (LINE_WIDTH % 2);
|
||||
|
||||
XDrawRectangle (screen->display->xdisplay,
|
||||
screen->xroot,
|
||||
screen->root_xor_gc,
|
||||
rect->x, rect->y,
|
||||
rect->width, rect->height);
|
||||
shrunk_rect.x, shrunk_rect.y,
|
||||
shrunk_rect.width, shrunk_rect.height);
|
||||
|
||||
/* Don't put lines inside small rectangles where they won't fit */
|
||||
if (rect->width < (LINE_WIDTH * 4) ||
|
||||
rect->height < (LINE_WIDTH * 4))
|
||||
if (shrunk_rect.width < (LINE_WIDTH * 4) ||
|
||||
shrunk_rect.height < (LINE_WIDTH * 4))
|
||||
return;
|
||||
|
||||
|
||||
if ((width >= 0) && (height >= 0))
|
||||
{
|
||||
XGCValues gc_values = { 0 };
|
||||
|
||||
if (XGetGCValues (screen->display->xdisplay,
|
||||
screen->root_xor_gc,
|
||||
GCFont, &gc_values))
|
||||
{
|
||||
char *text;
|
||||
int text_length;
|
||||
|
||||
XFontStruct *font_struct;
|
||||
int text_width, text_height;
|
||||
int box_x, box_y;
|
||||
int box_width, box_height;
|
||||
|
||||
font_struct = XQueryFont (screen->display->xdisplay,
|
||||
gc_values.font);
|
||||
|
||||
if (font_struct != NULL)
|
||||
{
|
||||
text = g_strdup_printf ("%d x %d", width, height);
|
||||
text_length = strlen (text);
|
||||
|
||||
text_width = text_length * font_struct->max_bounds.width;
|
||||
text_height = font_struct->max_bounds.descent +
|
||||
font_struct->max_bounds.ascent;
|
||||
|
||||
box_width = text_width + 2 * LINE_WIDTH;
|
||||
box_height = text_height + 2 * LINE_WIDTH;
|
||||
|
||||
|
||||
box_x = shrunk_rect.x + (shrunk_rect.width - box_width) / 2;
|
||||
box_y = shrunk_rect.y + (shrunk_rect.height - box_height) / 2;
|
||||
|
||||
if ((box_width < shrunk_rect.width) &&
|
||||
(box_height < shrunk_rect.height))
|
||||
{
|
||||
XFillRectangle (screen->display->xdisplay,
|
||||
screen->xroot,
|
||||
screen->root_xor_gc,
|
||||
box_x, box_y,
|
||||
box_width, box_height);
|
||||
XDrawString (screen->display->xdisplay,
|
||||
screen->xroot,
|
||||
screen->root_xor_gc,
|
||||
box_x + LINE_WIDTH,
|
||||
box_y + LINE_WIDTH + font_struct->max_bounds.ascent,
|
||||
text, text_length);
|
||||
}
|
||||
|
||||
g_free (text);
|
||||
|
||||
XFreeFontInfo (NULL, font_struct, 1);
|
||||
|
||||
if ((box_width + LINE_WIDTH) >= (shrunk_rect.width / 3))
|
||||
return;
|
||||
|
||||
if ((box_height + LINE_WIDTH) >= (shrunk_rect.height / 3))
|
||||
return;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Two vertical lines at 1/3 and 2/3 */
|
||||
segments[0].x1 = rect->x + rect->width / 3;
|
||||
segments[0].y1 = rect->y + LINE_WIDTH / 2 + LINE_WIDTH % 2;
|
||||
segments[0].x1 = shrunk_rect.x + shrunk_rect.width / 3;
|
||||
segments[0].y1 = shrunk_rect.y + LINE_WIDTH / 2 + LINE_WIDTH % 2;
|
||||
segments[0].x2 = segments[0].x1;
|
||||
segments[0].y2 = rect->y + rect->height - LINE_WIDTH / 2;
|
||||
segments[0].y2 = shrunk_rect.y + shrunk_rect.height - LINE_WIDTH / 2;
|
||||
|
||||
segments[1] = segments[0];
|
||||
segments[1].x1 = rect->x + (rect->width / 3) * 2;
|
||||
segments[1].x1 = shrunk_rect.x + (shrunk_rect.width / 3) * 2;
|
||||
segments[1].x2 = segments[1].x1;
|
||||
|
||||
/* Now make two horizontal lines at 1/3 and 2/3, but not
|
||||
* overlapping the verticals
|
||||
*/
|
||||
|
||||
segments[2].x1 = rect->x + LINE_WIDTH / 2 + LINE_WIDTH % 2;
|
||||
segments[2].x1 = shrunk_rect.x + LINE_WIDTH / 2 + LINE_WIDTH % 2;
|
||||
segments[2].x2 = segments[0].x1 - LINE_WIDTH / 2;
|
||||
segments[2].y1 = rect->y + rect->height / 3;
|
||||
segments[2].y1 = shrunk_rect.y + shrunk_rect.height / 3;
|
||||
segments[2].y2 = segments[2].y1;
|
||||
|
||||
segments[3] = segments[2];
|
||||
@@ -487,7 +571,7 @@ draw_xor_rect (MetaScreen *screen,
|
||||
|
||||
segments[4] = segments[3];
|
||||
segments[4].x1 = segments[3].x2 + LINE_WIDTH;
|
||||
segments[4].x2 = rect->x + rect->width - LINE_WIDTH / 2;
|
||||
segments[4].x2 = shrunk_rect.x + shrunk_rect.width - LINE_WIDTH / 2;
|
||||
|
||||
/* Second horizontal line is just like the first, but
|
||||
* shifted down
|
||||
@@ -496,7 +580,7 @@ draw_xor_rect (MetaScreen *screen,
|
||||
while (i < 8)
|
||||
{
|
||||
segments[i] = segments[i - 3];
|
||||
segments[i].y1 = rect->y + (rect->height / 3) * 2;
|
||||
segments[i].y1 = shrunk_rect.y + (shrunk_rect.height / 3) * 2;
|
||||
segments[i].y2 = segments[i].y1;
|
||||
++i;
|
||||
}
|
||||
@@ -511,22 +595,30 @@ draw_xor_rect (MetaScreen *screen,
|
||||
void
|
||||
meta_effects_update_wireframe (MetaScreen *screen,
|
||||
const MetaRectangle *old_rect,
|
||||
const MetaRectangle *new_rect)
|
||||
int old_width,
|
||||
int old_height,
|
||||
const MetaRectangle *new_rect,
|
||||
int new_width,
|
||||
int new_height)
|
||||
{
|
||||
if (old_rect)
|
||||
draw_xor_rect (screen, old_rect);
|
||||
draw_xor_rect (screen, old_rect, old_width, old_height);
|
||||
|
||||
if (new_rect)
|
||||
draw_xor_rect (screen, new_rect);
|
||||
draw_xor_rect (screen, new_rect, new_width, new_height);
|
||||
|
||||
XFlush (screen->display->xdisplay);
|
||||
}
|
||||
|
||||
void
|
||||
meta_effects_end_wireframe (MetaScreen *screen,
|
||||
const MetaRectangle *old_rect)
|
||||
const MetaRectangle *old_rect,
|
||||
int old_width,
|
||||
int old_height)
|
||||
{
|
||||
meta_effects_update_wireframe (screen, old_rect, NULL);
|
||||
meta_effects_update_wireframe (screen,
|
||||
old_rect, old_width, old_height,
|
||||
NULL, -1, -1);
|
||||
|
||||
meta_display_ungrab (screen->display);
|
||||
meta_ui_pop_delay_exposes (screen->ui);
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user