Compare commits

...

215 Commits

Author SHA1 Message Date
Owen W. Taylor
31e6cdf345 Bump version to 3.0.2
Update NEWS
2011-05-25 14:40:58 -04:00
Adam Jackson
c8aaa5e33e Fix crash in meta_display_get_above_tab_keycode
https://bugzilla.gnome.org/show_bug.cgi?id=647777
2011-05-25 14:22:57 -04:00
Dan Winship
65aa3e3927 window: don't allow side-by-side tiling of non-maximizable windows
If a window is not maximizable, then that probably means it looks dumb
at very large sizes. Even if its hints would allow you to manually
resize it to a large size, don't allow automatically tiling it to half
the screen.

https://bugzilla.gnome.org/show_bug.cgi?id=647901
2011-05-23 23:50:14 -04:00
Owen W. Taylor
b192771b93 Filter mirrored monitors from the monitors list
For the purposes of window placement or arranging window manager or
plugin controls, screens that are just mirrors of other screens should
be ignored, so filter them out of the monitors list.

https://bugzilla.gnome.org/show_bug.cgi?id=649299
2011-05-23 23:49:58 -04:00
Colin Walters
c1977b6532 region-utils.c: Squash a memory leak
"chunk" was an allocated but unused variable.

https://bugzilla.gnome.org/show_bug.cgi?id=649504
2011-05-23 23:49:33 -04:00
Colin Walters
50d1b53267 theme.c: Squash memory leak
When converting a token to a different type, we need to free its
string.

https://bugzilla.gnome.org/show_bug.cgi?id=649500
2011-05-23 23:49:10 -04:00
Owen W. Taylor
cbec96a62f Make _NET_WM_WINDOW_OPACITY orthogonal to window actor opacity
Using MetaWindowActor.opacity for _NET_WM_WINDOW_OPACITY makes it
difficult to implement effects like fading a window in on map.
Instead, set the opacity on the MetaShadedTexture child and use
it when drawing the shadow.

Since the check MetaWindowGroup does on meta_actor_get_paint_opacity()
no longer covers this, we need to handle the opacity in
meta_window_actor_get_obscured_region() explicitly.

https://bugzilla.gnome.org/show_bug.cgi?id=648613
2011-05-23 23:48:48 -04:00
Abduxukur Abdurixit
a28a5749db Added UG translation 2011-05-02 18:48:56 +02:00
Owen W. Taylor
5eb8aa655b Bump version to 3.0.1
Update NEWS
2011-04-25 17:21:55 -04:00
Florian Müllner
3543782f39 edge-tiling: Fix cancelling maximize tiling
If a window can not be tiled, e.g. due to its minimum size hints,
dragging away from the top after activating the maximize tile preview
does not cancel the maximization request, the only way to do so is by
hitting Escape.
To fix, reset the tiling state in the maximize-tile code path as
well if necessary.

https://bugzilla.gnome.org/show_bug.cgi?id=646149
2011-04-25 23:12:05 +02:00
Colin Walters
4ff4ebebb6 meta_window_is_remote: If WM_CLIENT_MACHINE not set, don't assume remote
Apparently the "fox" toolkit doesn't set WM_CLIENT_MACHINE; while we
could do gymnastics to attempt to figure this out (talk to the X
server?), better to just default to FALSE.

https://bugzilla.gnome.org/show_bug.cgi?id=647662
2011-04-25 16:43:09 -04:00
Muhammet Kara
a3c96c12d6 Updated Turkish translation 2011-04-23 02:08:10 +03:00
Dan Winship
eb0e658c99 window: fix a case of appears-focused getting stuck
Since appears-focus only propagates up from modal dialogs, if an
application removed the modal hint from a dialog before destroying it,
then its parent would be left with a stray reference to it in
attached_focus_window, causing it to be permanently appears-focused.

The obvious fix, calling meta_window_propagate_focus_appearance() when
the modal hint is removed, tends to cause noticeable flashing, because
the window will get drawn unfocused and then focused again.

So instead we just change meta_window_propagate_focus_appearance() to
check the window type only when focusing in, not when focusing out.

This would also cause flashing, but in this case we can avoid it by
not notifying the change in appears-focus on the parent window if it
is the expected_focus_window (which it will be by this point). (This
does mean though that if something weird happens and the window
doesn't end up becoming the focus window, it won't get redrawn
unfocused until something else forces it to.)

https://bugzilla.gnome.org/show_bug.cgi?id=647613
2011-04-20 14:40:47 -04:00
Kristjan SCHMIDT
4d069650ae Add Esperanto translation 2011-04-19 18:48:55 +02:00
Amitakhya Phukan
d176755926 Updated Assamese translations 2011-04-05 12:00:38 +05:30
Owen W. Taylor
eb2a6946b2 Bump version to 3.0.0 2011-04-04 13:23:45 -04:00
Owen W. Taylor
d067ba4431 Add old NEWS
Add text from previews release announcements to NEWS
2011-04-04 13:22:40 -04:00
Jordi Serratosa
fdf11f10fb [l10n]Fixes on Catalan translation 2011-04-03 23:45:55 +02:00
Petr Kovar
8fd1835d1a Update Czech translation 2011-04-03 17:12:10 +02:00
Ask H. Larsen
c77075833a Updated Danish translation 2011-04-02 22:38:08 +02:00
Shankar Prasad
b2a7ab270c Updated kn translations 2011-04-02 21:00:21 +05:30
Dan Winship
7503d4812c window: don't crash on spurious calls to idle_calc_showing()
If idle_calc_showing() gets called when its queue is empty (which
shouldn't happen), just return rather than crashing.

https://bugzilla.gnome.org/show_bug.cgi?id=642957
2011-04-02 07:34:39 -04:00
Changwoo Ryu
1fd8b0b4c5 Updated Korean translation 2011-04-02 20:10:55 +09:00
Nguyễn Thái Ngọc Duy
8615cf88ab Updated Vietnamese translation 2011-04-02 12:49:13 +07:00
Nguyễn Thái Ngọc Duy
f73a13dc4a po/vi.po: import from Damned Lies 2011-04-02 12:47:56 +07:00
Dr.T.Vasudevan
f973e2effa Updated Tamil translation 2011-04-01 20:49:02 +05:30
Gabor Kelemen
f9fed16608 Updated Hungarian translation 2011-04-01 14:53:23 +02:00
Rodrigo Padula de Oliveira
0578ed0c86 Updated Brazilian Portuguese translation. Reviewed by Antonio Fernandes C. Neto <fernandes@pelivre.org> 2011-04-01 09:18:33 -03:00
Inaki Larranaga Murgoitio
61520f5bd6 Updated Basque language 2011-04-01 13:25:55 +02:00
Inaki Larranaga Murgoitio
be853ec931 Updated Basque language 2011-04-01 13:23:09 +02:00
Joan Duran
440b92adf0 [l10n]Updated Catalan translation 2011-03-30 21:20:29 +02:00
Bruce Cowan
8fa4d22937 Updated British English translation 2011-03-30 15:35:46 +01:00
Chao-Hsiung Liao
397ae90d5c Updated Traditional Chinese translation(Hong Kong and Taiwan) 2011-03-30 21:32:14 +08:00
Wouter Bolsterlee
7f97d0bdc5 Updated Dutch translation by Wouter Bolsterlee 2011-03-29 23:29:27 +02:00
Dirgita
14956abb6e Updated Indonesian translation 2011-03-29 22:16:32 +07:00
Duarte Loreto
61cea18ff0 Updated Portuguese translation 2011-03-29 00:26:27 +01:00
Owen W. Taylor
83a449df95 Bump version to 2.91.93 2011-03-28 18:42:26 -04:00
Christian Kirbach
9c683aaea9 [l10n] Updated German translation 2011-03-29 00:38:27 +02:00
Alexander Larsson
634b76b82c Don't move all window to active workspace if monitors change
https://bugzilla.gnome.org/show_bug.cgi?id=645408
2011-03-28 18:19:25 -04:00
Jasper St. Pierre
a3ea43da52 display: Fix crash with cycle_group
Commit e3ebcc004d introduced an unsafe
access for 'window', which could cause a segfault.

https://bugzilla.gnome.org/show_bug.cgi?id=645843
2011-03-28 17:38:07 -04:00
Dan Winship
f464b85ffc window: add an appears-focused property, redraw shadows when it changes
We need to redraw a window's shadow any time the value of
meta_window_appears_focused() changes. So make that into a property so
we can get notifications on it.

https://bugzilla.gnome.org/show_bug.cgi?id=636904
2011-03-28 12:09:10 -04:00
Rudolfs Mazurs
db055c6029 Updated Latvian translation. 2011-03-28 00:49:45 +03:00
Abduxukur Abdurixit
eedc74943b Added UG translation 2011-03-27 21:38:17 +02:00
Yuri Myasoedov
82b134ed46 Updated Russian translation 2011-03-26 22:13:25 +03:00
A S Alam
cc1de7e7d0 update tranlation for Punjabi by A S Alam 2011-03-26 23:50:11 +05:30
Yaron Shahrabani
a199d74069 Updated Hebrew translation. 2011-03-26 00:36:10 +02:00
Aron Xu
7a23d3024a Update Simplified Chinese translation. 2011-03-24 17:18:27 +00:00
Daniel Nylander
734888406c Updated Swedish translation 2011-03-24 16:14:10 +01:00
Olav Vitters
e0ce24b3f5 Add description to DOAP file 2011-03-24 13:59:56 +01:00
Colin Walters
c13e62f72c Export meta_get_replace_current_wm()
This is necessary for gnome-shell to know whether it should try to
replace the org.gnome.Shell DBus name.

Note: We can't just #include <meta/util.h> because it #defines '_'
at least which obviously conflicts with core gettext.  We should
un-export util.h or fix it.

https://bugzilla.gnome.org/show_bug.cgi?id=645590
2011-03-23 16:08:51 -04:00
Alexander Shopov
3d958de33e Updated Bulgarian translation 2011-03-23 21:39:14 +02:00
Daniel Korostil
4689688af3 Uploaded Ukranian 2011-03-23 15:53:06 +02:00
Owen W. Taylor
d402a68c73 Bump version to 2.91.92 2011-03-22 18:20:53 -04:00
Luca Ferretti
66d1dd3679 Updated Italian translation 2011-03-22 22:54:24 +01:00
Matej Urbančič
43e48fc962 Updated Slovenian translation 2011-03-22 22:05:24 +01:00
Kjartan Maraas
1fea2a5101 Updated Norwegian bokmål translation 2011-03-22 11:13:39 +01:00
Florian Müllner
92e317ec2a Adjust the position of attached dialogs to fit on-screen
As the position of attached modal dialogs is determined entirely
by the position of the parent window, the dialog may end up
partially off-screen (especially if the dialog is wider than the
parent). In this case, diverge from the calculated position and
try to fit the dialog on-screen.

https://bugzilla.gnome.org/show_bug.cgi?id=631308
2011-03-22 02:56:51 +01:00
Florian Müllner
c5d1d2db62 Add and export meta_window_move_to_monitor
This is useful for DnD to another monitor in gnome-shell.
In addition to a normal move it corrects the saved rect for
maximized and fullscreened windows.

https://bugzilla.gnome.org/show_bug.cgi?id=645032
2011-03-22 00:55:37 +01:00
Fran Diéguez
b1725bc18c Updated Galician translations 2011-03-22 00:54:24 +01:00
Florian Müllner
5500c2b3a8 window: Allow resizing of attached modal dialogs
Currently attached modal dialogs are not resizable, but we don't
communicate this to GTK+, so the dialog may end up with resize
grips anyway. As a fix, allow resizing, but account for the dialog
being centered to its parent.

https://bugzilla.gnome.org/show_bug.cgi?id=643597
2011-03-22 00:27:10 +01:00
Owen W. Taylor
82db52aaf4 iconcache: don't crash on a non-alpha mask pixmap
We assume when applying a mask that it is a depth-1 pixmap that
cairo interprets as alpha. So ignore a non-depth-1 mask.

https://bugzilla.gnome.org/show_bug.cgi?id=641975
2011-03-21 18:51:14 -04:00
Owen W. Taylor
654d966e6c iconcache: Correctly interpret monochrome icons
Getting the contents of a depth-1 pixmap through cairo gives us
an alpha pixmap. We need to convert to a monochrome pixmap
as is expected by the ICCCM definition of WM_HINTS.

https://bugzilla.gnome.org/show_bug.cgi?id=641975
2011-03-21 18:47:52 -04:00
Jasper St. Pierre
92663c81f5 iconcache: Fix apply_mask
apply_mask made some wrong assumptions that became untrue
after rendering_cleanup landed, such as the number of channels
in the pixmap, causing corruption.

https://bugzilla.gnome.org/show_bug.cgi?id=641975
2011-03-21 18:15:47 -04:00
Ron
e3ebcc004d display: Grab attached dialogs' parent
Currently, attached modal dialog can be grabbed (either by the
title bar, or using Alt+Button1), though they won't move when
dragged. To address this, grab the parent in that case, which
allows to move both the parent and the attached dialog.

https://bugzilla.gnome.org/show_bug.cgi?id=638674
2011-03-21 22:46:23 +01:00
Florian Müllner
26e41bc24a tiling: Fix dragging windows free from edge-tiling
Commit 96c43866 changed the tiling behavior to prefer edge tiling
over maximization in corner cases (well, quite literally). As a
side effect, it only allows untiling of edge-tiled windows by
dragging the window towards the correct edge.
This patch restores the old behavior for untiling, while keeping
the new behavior for untiled windows.

https://bugzilla.gnome.org/show_bug.cgi?id=645455
2011-03-21 22:00:54 +01:00
Florian Müllner
c9e9412540 window: Remove unnecessary checks
For tiling, we check whether the pointer is near the edges of
the monitor where the pointer is located, so checking that the
pointer is within the bounds of the monitor is unnecessary and
confusing.
2011-03-21 22:00:54 +01:00
Bruno Brouard
14d6d63ad0 Updated French translation 2011-03-21 21:30:17 +01:00
Jorge González
2134213f92 Updated Spanish translation 2011-03-21 20:49:11 +01:00
Piotr Drąg
1935e508f7 Updated Polish translation 2011-03-21 20:40:11 +01:00
Owen W. Taylor
83b6ec7899 Fix description for workspaces_only_on_primary key
The description was a bit corrupted and didn't make sense. Fix.

https://bugzilla.gnome.org/show_bug.cgi?id=645224
2011-03-21 15:30:28 -04:00
Yuri Myasoedov
9c0ffc26c1 Updated Russian translation 2011-03-21 21:50:56 +03:00
Duarte Loreto
39b28a7e42 Updated Portuguese translation 2011-03-20 23:56:52 +00:00
Fran Diéguez
09799c6617 Updated Galician translations 2011-03-20 19:00:40 +01:00
Giovanni Campagna
9fad2246ae Fix previous commit
It is actually caller-allocates, not callee (the object is provided
by the binding, not by the function)
2011-03-19 20:56:18 +01:00
Giovanni Campagna
585da56118 Add introspection annotations for (out) arguments.
Mark that the the third argument to meta_rectangle_union and
meta_rectangle_intersect is an (out) argument that should be created
by the language binding.

https://bugzilla.gnome.org/show_bug.cgi?id=645247
2011-03-19 20:21:35 +01:00
Rudolfs Mazurs
cccb482cd9 Updated Latvian translation. 2011-03-19 20:34:04 +02:00
Piotr Drąg
eb79c75266 Updated Polish translation 2011-03-19 16:16:23 +01:00
Dirgita
19171122ca Updated Indonesian translation 2011-03-19 22:07:36 +07:00
Wouter Bolsterlee
a4665b1a14 Updated Dutch translation by Wouter Bolsterlee 2011-03-19 16:03:51 +01:00
Changwoo Ryu
829f9ac61f Updated Korean translation 2011-03-19 23:39:12 +09:00
Jorge González
24b846328f Updated Spanish translation 2011-03-19 14:59:33 +01:00
Owen W. Taylor
96c43866b1 Make entire side of screen edge-tiling not maximization
If dragging the title bar to the edge of the screen to side-tile,
it's easy to end up above the workarea and end up maximized instead.
Make the entire side of the screen act as edge-tiling.

https://bugzilla.gnome.org/show_bug.cgi?id=644961
2011-03-18 14:55:52 -04:00
Owen W. Taylor
9043191927 Add MUTTER_WM_CLASS_FILTER environment variable
In a performance or regression testing environment, we may want to
only manage windows from a particular test program, and ignore all
other windows. The MUTTER_WM_CLASS_FILTER environment variable is a
list of WM_CLASS values that should be managed; other windows will
be unmapped and ignored.

https://bugzilla.gnome.org/show_bug.cgi?id=644252
2011-03-18 14:55:52 -04:00
Dan Winship
6e6ed81c19 .gitignore: update 2011-03-18 13:54:18 -04:00
Dan Winship
3597035f67 bell: add a composited flash-screen function
The old bell_flash_screen() has no effect when compositing. Add
meta_compositor_flash_screen(), and use that instead.

https://bugzilla.gnome.org/show_bug.cgi?id=639765
2011-03-18 13:53:53 -04:00
Dan Winship
9f39a18fc5 Update meta_show_dialog for gtk's removal of --screen
gtk3 no longer has the --screen command-line argument, which mutter
was passing to zenity. Use --display (with an explicitly-specified
screen number) instead.

https://bugzilla.gnome.org/show_bug.cgi?id=643683
2011-03-18 13:53:53 -04:00
Gabor Kelemen
ab2de9dccd Updated Hungarian translation 2011-03-18 18:04:22 +01:00
Bruno Brouard
d66c6cf55e Updated French translation 2011-03-17 20:32:46 +01:00
Matej Urbančič
4f24f7e5fc Updated Slovenian translation 2011-03-17 19:54:20 +01:00
Colin Walters
3cd0e86bdd session: Don't set XSMP restart
This made sense back in the day of stateless window managers,
but gnome-shell isn't.  gnome-session will handle gnome-shell
crashing, since it's a required component.

https://bugzilla.gnome.org/show_bug.cgi?id=644529
2011-03-17 13:52:54 -04:00
Daniel Korostil
4d230daf09 Uploaded Ukranian 2011-03-17 18:24:47 +02:00
Frédéric Péters
9dd642f4af Go with a single libmutter library
https://bugzilla.gnome.org/show_bug.cgi?id=644565
2011-03-17 15:31:53 +01:00
Mario Blättermann
a9f9176ba5 [l10n] Updated German translation 2011-03-17 15:12:11 +01:00
Alexander Larsson
637cce0f91 Only show workspace and stick/unstick in menu item for primary monitor
If workspaces_only_on_primary then it makes no sense to have these
menu items on the monitors where workspaces don't take any effect.

https://bugzilla.gnome.org/show_bug.cgi?id=609258
2011-03-17 13:48:54 +01:00
Alexander Larsson
74b97dcd14 Add signals for when windows change monitors
This is useful in order to track e.g. which windows are on the primary
monitor.

https://bugzilla.gnome.org/show_bug.cgi?id=609258
2011-03-17 13:48:54 +01:00
Alexander Larsson
4e28a4d654 Add workspaces_only_on_primary preferences (default FALSE)
This adds a preference that when enabled makes all windows not on
the primary monitor be visible on all workspaces (i.e. not part of the
workspace switching handling).

https://bugzilla.gnome.org/show_bug.cgi?id=609258
2011-03-17 13:48:54 +01:00
Alexander Larsson
9d62d13f88 Split out on_all_workspaces and on_all_workspaces_requested
Sometimes on_all_workspaces is requested by the client/user, and sometimes
its calculated implicitly due to internal state. We split this up so that
we know when the user has explicitly asked for sticky window, when e.g.
setting wmspec properties or storing session info.

on_all_workspaces means this window is visible on all workspaces.

on_all_workspaces_requested, means the user explicitly made the window
sticky somehow (via imported session, _NET_WM_STATE from another wm,
toggled in the window menu, etc). It always implies on_all_workspaces is
TRUE.

Right now the only time we set on_all_workspaces is for override-redirect
windows, but later we can add a "windows on non-primary monitor are not
part of the workspace switching" feature.

https://bugzilla.gnome.org/show_bug.cgi?id=609258
2011-03-17 13:48:54 +01:00
Alexander Larsson
eeca838778 Add meta_window_is_on_primary_monitor function
This is useful in a couple of places to avoid opencoding it.

https://bugzilla.gnome.org/show_bug.cgi?id=609258
2011-03-17 13:48:54 +01:00
Alexander Larsson
d6f0d2c64c Add API to get the monitor of a window
https://bugzilla.gnome.org/show_bug.cgi?id=609258
2011-03-17 13:48:54 +01:00
Alexander Larsson
44cfceba00 Track the monitor for each window
https://bugzilla.gnome.org/show_bug.cgi?id=609258
2011-03-17 13:48:54 +01:00
Owen W. Taylor
349fb7c297 MetaWindowActor: keep a reference to the MetaWindow
Until the actor is destroyed, we need to have access to the
MetaWindow to access some fields used for painting. Keep a strong
reference to the window rather than just hoping the window will
not be freed.

https://bugzilla.gnome.org/show_bug.cgi?id=642787
2011-03-16 15:36:55 -04:00
Alexander Larsson
f9b5cdfeb1 Add api to get the primary monitor of the screen
We don't actually use the full xrandr to get the primary monitor, we
just rely on the xrandr xinerama compat code to return the primary
monitor first. This lets us avoid adding unnecessary xrandr code and
avoids issues with _NET_WM_FULLSCREEN_MONITORS monitor indexes being
defined wrt xinerama monitor index order.

https://bugzilla.gnome.org/show_bug.cgi?id=609258
2011-03-16 20:28:33 +01:00
Bruce Cowan
de8eb1f8ee Updated British English translation 2011-03-16 17:53:15 +00:00
Alexander Larsson
0ff602be06 Add MetaScreen::monitors-changed signal
https://bugzilla.gnome.org/show_bug.cgi?id=609258
2011-03-16 10:31:31 +01:00
Fran Diéguez
7246d0ede2 Updated Galician translations 2011-03-15 16:01:35 +01:00
Gabor Kelemen
50468b6563 Updated Hungarian translation 2011-03-15 15:21:17 +01:00
Lucian Adrian Grijincu
6793236642 Updated Romanian translation 2011-03-14 13:42:28 +01:00
Adi Roiban
d8ccc7896f Updated Romanian translation 2011-03-14 12:59:27 +01:00
Duarte Loreto
defd9aed32 Updated Portuguese translation 2011-03-12 01:54:12 +00:00
Daniel Korostil
6ee1d4348d Uploaded Ukranian 2011-03-11 19:37:45 +02:00
Daniel Korostil
27dbd12d7b Uploaded Ukranian 2011-03-11 19:34:17 +02:00
Khaled Hosny
93fc5c5561 Updated Arabic translation 2011-03-11 15:15:37 +02:00
Piotr Drąg
b48d290064 Updated Polish translation 2011-03-11 09:05:14 +01:00
Luca Ferretti
6bdb3cf115 Updated Italian translation 2011-03-11 02:11:04 +01:00
Yaron Shahrabani
3b39026ba2 Updated Hebrew translation. 2011-03-10 18:31:45 +02:00
Jeffery Olson
70ffb564ff expose MetaWindow .move(), resize() and add/expose .move_frame()
The latter move method will place the window by the origin of the
enclosing window decoration/frame, while the former will place by the
origin of the inner window, itself.

(Also moved meta_window_showing_on_its_workspace comment into
 gtk-doc)

https://bugzilla.gnome.org/show_bug.cgi?id=642355
2011-03-09 13:49:54 -05:00
Daniel Mustieles
4760d043d3 Updated Spanish translation 2011-03-09 19:43:15 +01:00
Matej Urbančič
8405e75931 Updated Slovenian translation 2011-03-09 17:41:13 +01:00
Dan Winship
6c4a283b4c Fix initial setting of _NET_WM_STATE on new windows
When reload_net_wm_state() is called at startup to read the initial
value of _NET_WM_STATE, it was calling recalc_window_type(), but not
recalc_features(), which meant that, eg, meta->skip_taskbar would
never get initialized from meta->wm_state_skip_taskbar, which meant
that next time mutter went to update the window's _NET_WM_STATE, it
would overwrite the app-specified initial values. Fix that.

(In metacity, this bug is masked by the fact that recalc_features()
gets called when reading the intial value of WM_NORMAL_HINTS, which
comes after _NET_WM_STATE in metacity's prop_hooks_table. In mutter,
the table got reordered at some point, exposing the bug.)

https://bugzilla.gnome.org/show_bug.cgi?id=624360
2011-03-09 10:21:56 -05:00
Ivar Smolin
7c6b55e79e [l10n] Updated Estonian translation 2011-03-09 14:36:55 +02:00
David Planella
d8c4b22b88 Updated Catalan translation 2011-03-08 20:41:45 +01:00
Rico Tzschichholz
bbd98e7b86 Fix ld failure caused by several incomplete LDADD statements
https://bugzilla.gnome.org/show_bug.cgi?id=644188
2011-03-08 11:23:30 -05:00
Kjartan Maraas
0536438317 Updated Norwegian bokmål translation 2011-03-08 15:32:29 +01:00
Owen W. Taylor
e2151a5fd7 Bump version to 2.91.91 2011-03-07 21:17:35 -05:00
Dan Winship
c84da3ce1b Move the installed includes to a subdir
If mutter is going to be a "real" library, then it should install its
includes so that users can do

    #include <meta/display.h>

rather than

    #include <display.h>

So rename the includedir accordingly, move src/include to src/meta,
and fix up all internal references.

There were a handful of header files in src/include that were not
installed; this appears to have been part of a plan to keep core/,
ui/, and compositor/ from looking at each others' private includes,
but that wasn't really working anyway. So move all non-installed
headers back into core/ or ui/.

https://bugzilla.gnome.org/show_bug.cgi?id=643959
2011-03-07 18:19:53 -05:00
Dan Winship
bb50f65532 Allow mutter to be used as a library
Move all of the mutter code into a new libmutter-wm.so, split its
main() method into meta_get_option_context(), meta_init() and
meta_run(), add methods for using in-process plugins, and add
libmutter-wm.pc pointing to the new library.

The mutter binary is now just a tiny program that links against
libmutter-wm. The --version and --mutter-plugins options are handled
at the mutter level, not in libmutter-wm, and a few strange unused
command-line options (--no-force-fullscreen and --no-tab-popup) have
been removed.

https://bugzilla.gnome.org/show_bug.cgi?id=643959
2011-03-07 18:19:53 -05:00
Dan Winship
28752718c5 Remove meta_restart() / "mutter-message restart"
meta_restart() was broken, in that it restarted mutter with what was
left of argv after GOption and Clutter had possibly modified it.
Rather than try to fix this, just remove it.

https://bugzilla.gnome.org/show_bug.cgi?id=643959
2011-03-07 18:03:43 -05:00
Dan Winship
4c76791d4c Remove some unused plugin functionality
Revert the early_initialize changes (which get in the way in the
"libmutter-wm" paradigm), remove the GConf key for setting plugins,
and remove plugin "params", which weren't being used. Also remove all
the logic for unloading and reloading plugins, since the list never
changes after startup now.

https://bugzilla.gnome.org/show_bug.cgi?id=643959
2011-03-07 10:01:37 -05:00
Dan Winship
a66ae4ad55 Use standard introspection configure/Makefile bits
This changes the introspection configure flag from
--with/--without-introspection to --enable/--disable-introspection,
and changes it so that trying to enable introspection when g-i is not
installed results in an error, rather than being silently ignored.

https://bugzilla.gnome.org/show_bug.cgi?id=643959
2011-03-06 13:04:58 -05:00
Daniel Korostil
7841e80496 Uploaded Ukranian 2011-03-06 16:25:28 +02:00
Jani Monoses
27626d14b7 Fix non-GLX build.
Include clutter-x11.h when not building for GLX.
2011-03-02 15:55:51 +02:00
Jeff Olson
f75e96cd3c introspection: Annotate meta_window_get_rect()
g-ir-scanner assumes (transfer full) for boxeds, and doesn't
warn on missing annotations here.

https://bugzilla.gnome.org/show_bug.cgi?id=643194
2011-02-28 14:08:40 -05:00
Colin Walters
9bc1521615 Don't exit on XSMP request
It looks amazingly lame if we simply call exit() during logout.  While
it's true that for applications that use XSMP, gnome-session will
close them before us, that doesn't do anything for non-XSMP apps,
which we really hope is the common case.

Instead, we just go away when the X server does.

https://bugzilla.gnome.org/show_bug.cgi?id=643437
2011-02-28 14:01:08 -05:00
Colin Walters
f2158218be plugins: Add early_initialize vfunc
For GNOME Shell, we need to grab our DBus names *before* we talk XSMP.
gnome-session takes our XSMP connection as "I'm ready", and starts
running all the other random crud that people dropped in as autostart
files.  But for example, we need to have claimed
org.freedesktop.Notifications before a lot of said crud starts.

This requires a plugin API version bump.

Misc: Move handling of --version way earlier in main() where
it should be; no point having it wedged after plugin handling.
2011-02-25 14:38:04 -05:00
Kjartan Maraas
183190d089 Added Norwegian bokmål translation 2011-02-24 11:29:10 +01:00
Bruno Brouard
ebc3775f19 Updated French translation 2011-02-23 14:37:30 +01:00
Owen W. Taylor
97d7e84a04 Bump version to 2.91.90 2011-02-22 22:04:10 -05:00
Jorge González
2b2b728b64 Updated Spanish translation 2011-02-20 15:35:19 +01:00
Sweta Kothari
46fa843b0e Updated Gujarati Translations 2011-02-18 14:16:51 +05:30
Owen W. Taylor
e7d336ab0e Don't pass handled key events to GTK+
If we handle a key event then passing it to GTK+ as well can only
cause confusion. Normally GTK+ would do nothing with a key event for
some window it doesn't know about, but plugins might be doing more
things with the GTK+ event queue.

https://bugzilla.gnome.org/show_bug.cgi?id=642426
2011-02-17 11:40:23 -05:00
Rui Matos
6e23b0af3b all-keybindings.h: change <Alt>Above_Tab from cycle_group to switch_group
and revert cycle_group back to <Alt>F6 as in GNOME 2.30

https://bugzilla.gnome.org/show_bug.cgi?id=639341
2011-02-15 13:34:32 -05:00
Owen W. Taylor
735c33bd9f MetaBackgroundActor: Handle paint opacity
We were ignoring the opacity set on the background actor, causing problems,
e.g., when fading out the workspace thumbnails in GNOME Shell.

https://bugzilla.gnome.org/show_bug.cgi?id=641979
2011-02-12 18:27:09 -05:00
Changwoo Ryu
47626a17d7 Update Korean translation 2011-02-13 07:53:47 +09:00
Nguyễn Thái Ngọc Duy
ce86d3f230 Updated Vietnamese translation 2011-02-12 00:31:15 +07:00
Nguyễn Thái Ngọc Duy
31878239c3 po/vi.po: update-po 2011-02-12 00:10:27 +07:00
Colin Walters
1133a4ff9c Make plugin loading failure fatal
If a plugin was explicitly specified, falling back to the default
silently is bad; a manager component like gnome-session can
do a better job of handling this scenario.

An example we've hit in gnome-shell is where SpiderMonkey changes
without gjs being rebuilt, and loading the plugin fails due to
unresolved symbols.

But there are obviously others, like the file being missing or
corrupt.

https://bugzilla.gnome.org/show_bug.cgi?id=641384
2011-02-03 14:23:03 -05:00
Luca Ferretti
5822443b20 Updated Italian translation 2011-02-03 18:17:16 +01:00
Mattias Põldaru
cf05167c55 [l10n] Updated Estonian translation 2011-02-03 09:44:07 +02:00
Owen W. Taylor
a9504f1495 MetaWindowActor: Add a 'position-changed' signal
Similar to the recently added 'size-changed' signal, we may want to do
something in response to a window being repositioned without waiting for
notify::allocation. (Especially since what we can do in notify::allocation
is severely limited by Clutter forbidding queueing an allocation at that
point.)

https://bugzilla.gnome.org/show_bug.cgi?id=641310
2011-02-02 23:55:47 -05:00
Owen W. Taylor
3716c30264 When live_hidden_previews is set, force placement for hidden windows
If we are previewing hidden windows, we might be previewing them in a context
like a thumbnail view of a workspace where we care about positioning. So, instead
of waiting until the window is first actually shown to place it, if
live_hidden_previews is set, place the window window when we first compute its
visibility, even if we don't end up showing it.

https://bugzilla.gnome.org/show_bug.cgi?id=641309
2011-02-02 19:19:50 -05:00
Owen W. Taylor
c1bf1ec718 Bump version to 2.91.6 2011-02-01 12:25:14 -05:00
Owen W. Taylor
8b220079d0 Add ability to override workspace layout
A plugin that does workspace management on its on may want to set the
workspace layout without having to deal with putting a property
on the root window to be read back and parsed.

Add meta_screen_override_window_layout() that allows the same types
of layouts as _NET_DESKTOP_LAYOUT but without setting a property.

https://bugzilla.gnome.org/show_bug.cgi?id=640552
2011-02-01 11:34:56 -05:00
A S Alam
2df95970d9 update Punjabi Translation by A S Alam 2011-01-29 07:49:59 +05:30
Petr Kovar
a4569974a1 Update Czech translation 2011-01-28 20:36:04 +01:00
Fran Diéguez
c9d3ab772c QA of Galician translations 2011-01-27 03:18:07 +01:00
Owen W. Taylor
1a276a2ee5 Don't constantly restack hidden windows
A logic bug was resulting in the bottom hidden window (hidden means means
minimized or on a different workspace) continually being stacked above
the other hidden windows.

https://bugzilla.gnome.org/show_bug.cgi?id=640679
2011-01-26 17:02:17 -05:00
Owen W. Taylor
4c4c720dc1 Update _NET_CURRENT_DESKTOP on workspace removal
When we delete a workspace before the active workspace, we need
to upate the _NET_CURRENT_DESKTOP since the active workspace index
changes. To do this workspace.c:set_active_space_hint() is moved
to screen.c:meta_screen_set_active_workspace_hint() so that it
can be shared.

https://bugzilla.gnome.org/show_bug.cgi?id=640581
2011-01-26 17:02:17 -05:00
Florian Müllner
ad707be01e window-actor: Add "size-changed" signal
Emit a signal when the window size changes. While it is already
possible to connect to notify::allocation (or width/height), the
new signal is emitted outside a clutter allocation cycle, which
makes it more convenient when adjusting an actor's size/position
in response.
2011-01-25 21:32:20 +01:00
Owen W. Taylor
19d1f97600 Use G_GNUC_UNUSED to suppress warning
On gcc-4.4 (void)<expr> doesn't suppress warnings from
__attribute__((warn_unused_result)), so use
G_GNUC_UNUSED (which expands to __attribute__((unused))) instead
of removing a dummy variable.

https://bugzilla.gnome.org/show_bug.cgi?id=640508
2011-01-25 08:39:20 -05:00
Owen W. Taylor
4f079affea Fix set but not used variables
GCC 4.6 warns about variables that are set but never subsequently
used; fix all such instances.

https://bugzilla.gnome.org/show_bug.cgi?id=640469
2011-01-24 16:26:57 -05:00
Jasper St. Pierre
b4888103a6 display: Don't crash on Alt-Escape.
Fix a crash caused by 286160646b, where
we don't get a window when called from do_choose_window.

https://bugzilla.gnome.org/show_bug.cgi?id=640229
2011-01-24 19:38:55 +01:00
Daniel Nylander
e2364b82ef Updated Swedish translation 2011-01-23 10:23:31 +01:00
Kjartan Maraas
ba92645044 Updated Norwegian bokmål translation 2011-01-20 19:20:25 +01:00
Florian Müllner
2eb8b09b1a Restore the original tile state when a drag is cancelled
If a drag operation is cancelled, the dragged window should be
restored to its previous state/position. Implement this for tiled
states.

https://bugzilla.gnome.org/show_bug.cgi?id=639988
2011-01-20 18:49:48 +01:00
Florian Müllner
bca610ed50 Hide tile preview when cancelling a drag with Escape
As the tile preview is shown or hidden when a window is dragged
around, it may stick around if the drag operation is cancelled.
Make sure that the preview is hidden in this case.

https://bugzilla.gnome.org/show_bug.cgi?id=639988
2011-01-20 18:49:48 +01:00
Florian Müllner
53d6938b55 screen: Add a method to hide the tile preview unconditionally
Add meta_screen_tile_preview_hide() to hide the tile preview
independent from the tile state of the dragged window.

https://bugzilla.gnome.org/show_bug.cgi?id=639988
2011-01-20 18:49:48 +01:00
Florian Müllner
286160646b display: Keep track of the original tile state during drag
Drag operations may be cancelled, in which case the dragged window
should be restored to the position/state it had when the drag was
initialized. In order to do this for tiled states, the original
state has to be saved during the operation.

https://bugzilla.gnome.org/show_bug.cgi?id=639988
2011-01-20 18:49:48 +01:00
Florian Müllner
58068260a5 window: Make meta_window_tile() semi-public
The previous tiling state of a grabbed window should be restored
if the drag operation is cancelled (by hitting the Escape key).
This might involve to meta_window_tile(), so export the function
in window-private.h.

https://bugzilla.gnome.org/show_bug.cgi?id=639988
2011-01-20 18:49:48 +01:00
Chao-Hsiung Liao
57e8ce0d42 Updated Traditional Chinese translation(Hong Kong and Taiwan) 2011-01-20 22:41:41 +08:00
Marios Zindilis
4ed1e8b3e2 Updated Greek translation 2011-01-19 18:12:00 +02:00
Adel Gadllah
8181454af5 MetaWindowActor: Add meta_window_actor_is_destroyed
Add a meta_window_actor_is_destroyed method which gets
whether the X window that the actor was displaying has been destroyed.

https://bugzilla.gnome.org/show_bug.cgi?id=639853
2011-01-18 19:35:41 +01:00
Gabor Kelemen
aa482e6d4f Updated Hungarian translation 2011-01-18 15:56:29 +01:00
Gabor Kelemen
0c9b2c6757 Fix a word repetition 2011-01-18 15:55:09 +01:00
Rui Matos
bbfc435a5c Teach meta_display_get_keybinding_action() about "Above_Tab" pseudo-keysym
https://bugzilla.gnome.org/show_bug.cgi?id=639532
2011-01-16 13:55:41 -05:00
Jasper St. Pierre
7e53094044 default plugin: Clean up unused n_workspaces variable.
n_workspaces is unused, which may cause compilation
errors under certain environments.

https://bugzilla.gnome.org/show_bug.cgi?id=639458
2011-01-16 13:54:31 -05:00
Florian Müllner
565f002bc4 ui: Port to GtkStyleContext
GtkStyle has been deprecated in favor of GtkStyleContext. A full
port would involve replacing GdkColor with GdkRGBA - leave this
out for the time being.

Bump the required version of GTK+.

https://bugzilla.gnome.org/show_bug.cgi?id=637761
2011-01-13 18:55:39 +01:00
Alexander Shopov
42fdd4f4d8 Updated Bulgarian translation 2011-01-12 23:45:34 +02:00
Khaled Hosny
217aa2898e Updated Arabic translation 2011-01-12 11:33:42 +02:00
Khaled Hosny
02e7c1bb2b Updated Arabic translation 2011-01-12 11:32:02 +02:00
Owen W. Taylor
bb57a8b6f3 Bump version to 2.91.5 2011-01-11 14:55:19 -05:00
Ivar Smolin
65d0f1a213 [l10n] Updated Estonian translation 2011-01-09 20:42:28 +02:00
Ivar Smolin
4344b7ba69 [l10n] Updated Estonian translation 2011-01-07 10:17:03 +02:00
Mattias Põldaru
b0072add05 [l10n] Updated Estonian translation 2011-01-06 19:25:30 +02:00
Owen W. Taylor
4ea00e102b Add an "Above_Tab" pseudo-keysym
We want switching between the windows of an application to be an easily
accessible operation. The convenient and memorable keybinding is the
key above the tab key - but the keysym for that key isn't consistent
across different keyboard layouts.

Add code that figures out the key from the XKB geometry and a magic
keysym name "Above_Tab" that refers to this key and switch
the default binding for cycle_group to <Alt>Above_Tab. (This will
have no effect for the normal case of getting the key binding from
GConf until this patch is applied to Metacity as well.)

https://bugzilla.gnome.org/show_bug.cgi?id=635569
2011-01-05 18:58:11 -05:00
Florian Müllner
ed99d12e8b theme: Add tiled_left/tiled_right frame states
It may be desirable for theme authors to treat side-by-side tiled
windows differently, for instance to give the edge-touching border
a width of 0, so add additional frame states for tiled windows.

https://bugzilla.gnome.org/show_bug.cgi?id=637330
2011-01-05 01:49:58 +01:00
Florian Müllner
0a2bb1b71c theme: Add background functions for single buttons
With the existing background functions, single buttons can not be
styled separately - on the left side, the style of the left button
is picked, and the right button's style on the right side.

As theme authors may want to add rounded corners to button groups
as a whole, it makes sense to treat the case of a single button in
a group differently.

https://bugzilla.gnome.org/show_bug.cgi?id=635683
2011-01-05 01:49:49 +01:00
Florian Müllner
4bc8c70c75 theme-parser: Use peek_required_version() for validation
When validating button functions and frame styles, the required
format version of the features used in the theme was compared to
the major version number of the supported format, limiting additions
to major theme format bumps.
Use peek_required_version() instead, so the minor version number
of the supported theme format is taken into account.

https://bugzilla.gnome.org/show_bug.cgi?id=635683
2011-01-04 21:40:38 +01:00
Florian Müllner
9f2581318a buttons: Fix background functions for non-default layouts
While the configured layout is taken into account for positioning
the buttons, the mapping from button function states to button
position states just assumed the default button layout in LTR
locales.
Do a proper mapping depending on the actual layout instead.

https://bugzilla.gnome.org/show_bug.cgi?id=635686
2011-01-04 19:00:30 +01:00
Nickolas Lloyd
48b9807c86 Remove option to turn compositing off
This patch removes the ability to disable compositing in mutter.  As
clutter compositing was the reason for the fork from metacity, turning
compositing off does not make sense.

https://bugzilla.gnome.org/show_bug.cgi?id=626875
2011-01-04 11:55:05 -05:00
Owen W. Taylor
0a821d2341 Update window->visible_to_compositor before calling into compositor
To deal with reentrancy from compositor plugins doing things like
moving windows between workspaces in an effect callback, update
the visible_to_compositor flag before calling into the compositor.

https://bugzilla.gnome.org/show_bug.cgi?id=613124
2011-01-04 11:46:44 -05:00
Owen W. Taylor
78092a404f If enabling a compositor with existing windows, set them visible as necessary
When a compositor is present, we keep the visibility state of the
compositor windows in sync with window->visible_to_compositor. We need
to do the same when enabling the compositor.

https://bugzilla.gnome.org/show_bug.cgi?id=613124
2011-01-04 11:40:41 -05:00
Andreas Mueller
d3df33ecdb Fix errors building for gles-systems (clutter-eglx)
* GL_TEXTURE_RECTANGLE_ARB not avaliable
* clutter_glx_texture_pixmap_using_extension / CLUTTER_GLX_TEXTURE_PIXMAP not avaliable

Signed-off-by: Andreas Mueller <schnitzeltony@gmx.de>
2011-01-04 11:27:16 -05:00
Adel Gadllah
1160744830 ui: Make sure we use the correct atom
We have to use gdk_x11_xatom_to_atom for display to make
it consistent with the surrounding code.
2010-12-24 18:07:03 +01:00
Owen W. Taylor
e884fc784e Bump GTK+ required version to 2.91.7 2010-12-23 17:22:16 -05:00
Gheyret T.Kenji
c16788f481 Added UG translation 2010-12-23 19:28:34 +01:00
Colin Walters
a1790fb6a8 configure: Increment version
This must have been unpushed after the release.
2010-12-23 11:58:43 -05:00
Florian Müllner
cbce4fd39d ui: Adapt to GDK API changes
Some API which was only meaningful on X11 was moved to the X11
backend and renamed accordingly, so adapt to those changes.

https://bugzilla.gnome.org/show_bug.cgi?id=637802
2010-12-22 13:39:36 -05:00
Nguyễn Thái Ngọc Duy
93c0620151 po/vi.po: merge translation updates from metacity 2010-12-19 17:58:05 +07:00
Emmanuele Bassi
2faf56947b Use GdkDeviceManager to get the core pointer
Commit 2c8c1c6df49 in gtk+ removed gdk_display_get_core_pointer().

The equivalent functionality can be achieved by using the
GdkDeviceManager to retrieve the client pointer device.
2010-12-17 17:12:01 +00:00
Florian Müllner
53777b133b ui: Disable multidevice support in GDK
GDK now uses XI2 by default, which conflicts with the X calls done
in mutter. Enforce the previous behavior.
2010-12-15 18:11:13 +01:00
Florian Müllner
594a69317a tiling: Reset maximized tile mode when unmaximizing
Maximized tiled windows end up with an inconsistent tile mode when
unmaximized by other means than dragging the window free (e.g.
using the unmaximize button or double clicking the title bar), so
reset the tile mode when unmaximizing.

This is not a problem for side-by-side tiling, as there are no
alternatives to dragging the window free.
2010-12-10 17:30:18 +01:00
Owen W. Taylor
3f9c375f1c MetaRegionIterator: avoid reading off end of rectangles array
Fix an off-by-one error in the check for "can we peek ahead to the next
rectangle".

https://bugzilla.gnome.org/show_bug.cgi?id=636491
2010-12-06 12:00:30 -05:00
Colin Walters
544c8edd9e theme: Handle new GTK+ states 2010-12-04 17:33:01 -05:00
Florian Müllner
654bd15319 tiling: Do not restore maximized tile state when unmaximizing
When a tiled window is maximized (e.g. by clicking the title bar
button), unmaximizing the window restores the tiled state. While
this is reasonable for side-by-side tiling, it is confusing for
"maximize" tiled windows, as unmaximization has no visible effect.

Change unmaximize to only restore the tiled state of side-by-side
tiled windows.
2010-12-04 21:35:15 +01:00
Florian Müllner
b85171007e window: Add a missing break
When adding maximize tiling, the cleaning of the tiled flag was
refactored to use a switch statement - a break was missed in the
process.
2010-12-04 21:35:15 +01:00
Matej Urbančič
f6ec33fa0c Updated Slovenian translation 2010-12-03 20:19:53 +01:00
Florian Müllner
7d0ff87cbe tiling: Fix "maximize" tile with no chrome at the top
The original patch triggered "maximize" when the window was dragged
to the top, so that the pointer was below or on the monitor edge and
above the work area's top.

If there's no chrome at the top of the monitor, so that monitor edge
and work area top fall together, the pointer cannot be moved above
the work area's top, so tiling was not triggered.
2010-12-03 02:45:41 +01:00
Benjamin Otte
8994e621f7 Replace some GDK X11 calls with future-proof ones
GTK is about to clean up its code and remove duplicate macros and
GdkDrawable usage. To prepare for that landing, we use the future-safe
versions of the same calls.

https://bugzilla.gnome.org/show_bug.cgi?id=636302
2010-12-03 00:17:42 +01:00
Benjamin Otte
d746591894 ui: Port testgradient example to GTK3
https://bugzilla.gnome.org/show_bug.cgi?id=636301
2010-12-03 00:17:42 +01:00
Florian Müllner
161c1088f9 tiling: disable "shake loose" feature when edge tiling
The old behavior of being able to shake loose a maximized window
overlaps with and is for the most part superceded by top edge tiling.

This commit changes the code to only enable shake loose behavior
when edge tiling is disabled.

https://bugzilla.gnome.org/show_bug.cgi?id=630548
2010-12-02 17:42:14 -05:00
Ray Strode
07c0471902 tiling: Add new "maximized" tile
In addition to the existing side-by-side tiling modes, this commit
adds a new "maximize" tiling mode.  It allows the user to maximize
their windows (in other words, tile with the edge panels) by dragging
their window to the top edge of the monitor.

https://bugzilla.gnome.org/show_bug.cgi?id=630548
2010-12-02 17:11:11 -05:00
Ray Strode
5f4ee1b6e7 tiling: use META_WINDOW_TILED_SIDE_BY_SIDE in state check
The meta_window_handle_mouse_grab_op_event function ensures
the tile_mode variable is in a consistent state after a drag
op is finished.

The way this is current done is:

if (!window->maximized_vertically &&
    window->tile_mode != META_TILE_NONE)
  window->tile_mode = META_TILE_NONE;

While valid, it doesn't "read" as well as using the
META_WINDOW_TILED_SIDE_BY_SIDE macro, since the macro is specifically
about side-by-side tiling.

This commit just changes things to use the macro and to not bother
checking the tile mode (since if we just reset it anyway, then it doesn't
matter if the value is right or wrong to begin with).

https://bugzilla.gnome.org/show_bug.cgi?id=630548
2010-12-02 16:35:23 -05:00
Ray Strode
aa3a4a48e4 tiling: add side_by_side suffix to tile code
The meta_window_can_tile function and META_WINDOW_TILED
macro are pretty side-by-side tiling specific, so
rename them.

https://bugzilla.gnome.org/show_bug.cgi?id=630548
2010-12-02 16:35:23 -05:00
Ray Strode
0d27c9600f tiling: rename side-by-side tiling to edge tiling
Currently, the new tiling feature, supports side-by-side, horizontal
tiling when dragging windows to one of the vertical edges of a monitor.

Other types of tiling (on other monitor edges) are potentially useful,
though.

This commit renames the preference from side_by_side_tiling to
edge_tiling.

https://bugzilla.gnome.org/show_bug.cgi?id=630548
2010-12-02 16:35:23 -05:00
Milan Bouchet-Valat
1986b20499 Add (out) annotation and documentation to meta_window_get_outer_rectangle()
GObject introspection cannot detect that rect is an (out) parameter.
Also add a meaningful documentation for humans like us.
2010-12-02 00:06:42 +01:00
160 changed files with 43051 additions and 48856 deletions

2
.gitignore vendored
View File

@@ -43,7 +43,7 @@ POTFILES
50-metacity-desktop-key.xml
50-metacity-key.xml
inlinepixbufs.h
libmutter-private.pc
libmutter.pc
mutter
mutter-theme-viewer
mutter.desktop

769
NEWS
View File

@@ -1,3 +1,772 @@
3.0.2
=====
* Fix a crash when running without XKB support [Adam]
https://bugzilla.gnome.org/show_bug.cgi?id=647777
* Fix smallish memory leaks [Colin]
https://bugzilla.gnome.org/show_bug.cgi?id=649500
https://bugzilla.gnome.org/show_bug.cgi?id=649504
* Ignore mirrored monitors when listing monitors, fixing
drag-and-drop problems in GNOME Shell [Owen]
https://bugzilla.gnome.org/show_bug.cgi?id=649299
* Don't allow side-by-side tiling of non-maximizable windows
like dialogs and utility windows [Dan]
* Fix interaction of _NET_WM_WINDOW_OPACITY with window effects,
making it work again with GNOME Shell
https://bugzilla.gnome.org/show_bug.cgi?id=648613
Contributors:
Adam Jackson, Colin Walters, Dan Winship
Translations:
Abduxukur Abdurixit [ug]
3.0.1
=====
* If WM_CLIENT_MACHINE isn't set, don't assume a window is remote;
fixes behavior of Fox toolkit applications under GNOME Shell.
https://bugzilla.gnome.org/show_bug.cgi?id=647662 [Colin]
* Fix cases where windows could get stuck drawing as focused after
an attached modal dialog was closed. [Dan]
https://bugzilla.gnome.org/show_bug.cgi?id=647613
* Fix a bug where a window that is too big to be tiled side-by-side
would behave strangely when using the gesture of dragging to
the top to maximize. [Florian]
Contributors:
Florian Müllner, Colin Walters, Dan Winship
Translations:
Amitakhya Phukan [as], Kristjan Schmidt [eo], Muhammet Kara [tr]
3.0.0
=====
* Avoid crashing when you have a single window and try to move it between
workspaces. [Dan]
https://bugzilla.gnome.org/show_bug.cgi?id=642957
Contributors:
Dan Winship
Translations:
Jordi Serratosa [ca], Petr Kovar [cz], Ask H. Larsen [da], Bruce Cowan [en_GB],
Inaki Larranaga Murgoitio [eu], Gabor Kelemen [hu], Dirgita [id], Shankar Prasad [kn],
Changwoo Ryu [ko], Wouter Bolsterlee [nl], Duarte Loreto [pt],
Antonio Fernandes C. Neto, Rodrigo Padula de Oliveira [pt_BR], T. Vasudevan [ta],
Nguyễn Thái Ngọc Duy [vi], Chao-Hsiung Liao [zh_HK, zh_TW]
2.91.93
=======
* Fix bug where, when a monitor was hot-plugged, all workspaces
would collapse to a single workspace. (There are still issues
when a secondary monitor is hot-plugged to the left of the
primary monitor.) [Alex]
https://bugzilla.gnome.org/show_bug.cgi?id=645408)
* Fix a crash for the cycle_group action [Jasper]
https://bugzilla.gnome.org/show_bug.cgi?id=645843
* Fix misdrawing of window shadows on some focus changes [Dan]
https://bugzilla.gnome.org/show_bug.cgi?id=636904
* Export meta_get_replace_current_wm() to allow fixing a
GNOME Shell bug with --replace [Colin]
https://bugzilla.gnome.org/show_bug.cgi?id=645590
Contributors:
Alexander Larsson, Jasper St. Pierre, Colin Walters, Dan Winship
Translations:
Alexander Shopov [bg], Christian Kirbach [de], Yaron Shahrabani [he],
Rudolfs Mazurs [lv], A S Alam [pa], Yuri Myasoedov [ru], Daniel Nylander [se],
Abduxukur Abdurixit [ug], Daniel Korostil [uj], Aron Xu [zh_CN]
2.91.92
=======
* Add a workspaces_only_on_primary preferences. When set, this makes
workspaces switching only apply to windows on the primary monitor,
while windows on other monitors are unaffected.
* Export API for monitor handling [Alex]
MetaScreen::monitors-changed signal
meta_screen_get_primary_monitor()
meta_window_is_on_primary_monitor()
meta_window_get_monitor()
MetaWindow::window-entered-monitor, <etaWindow::window-left-monitor
meta_window_move_to_monitor() [Florian]
* Behavior improvemnts for attached modal dialogs:
- Allow dragging dragging on the titlebar to move the parent ["Ron"]
- Allow resizing [Florian]
- Constrain to be on the current monitor [Florian]
* Don't turn on XSMP autorestart [Colin]
* Combine libmutter-wm and libmutter-private into a single libmutter
[Frédéric]
* Export methods to move and resize windows [Jeffery]
meta_window_move(), meta_window_resize(), meta_window_move_frame()
* Add a MUTTER_WM_CLASS_FILTER environment variable to allow existing
windows to be ignored when performance testing. [Owen]
* Add a new compositor-based flash for visual bell [Dan]
* Fix bug where application specified values for properties like
"skip taskbar" were sometimes ignored [Dan]
* Bug fixes [Dan, Florian, Giovanni, Jasper, Owen]
* Build fixes [Rico]
Contributors:
Giovanni Campagna, Florian Müllner, Alexander Larsson, Jeffery Olson,
Frédéric Péters, Owen Taylor, Jasper St. Pierre, Rico Tzschichholz,
"Ron", Colin Walters, Dan Winship
Translations:
Khaled Hosny [ar], David Planella [ca], Mario Blättermann [de],
Bruce Cowan [en_GB], Jorge González, Daniel Mustieles [es], Ivar Smolin [et],
Bruno Brouard [fr], Fran Diéguez [gl], Yaron Shahrabani [he],
Gabor Kelemen [hu], Luca Ferretti [it], Kjartan Maraas [nb], Piotr Drąg [pl],
Duarte Loreto [pt], Lucian Adrian Grijincu, Adi Roiban [ro],
Yuri Myasoedov [ru], Matej Urbančič [sl], Daniel Korostil [uk]
Bugs fixed:
624360 window shows up in when pressing alt+tab, but skip_taskbar_hint is set to True
631308 Dialogs attached to parent sometimes extend out of the screen
638674 [PATCH] Allow moving attached dialogs
639765 a11y: visual alert only works per-window, not screen
641975 Pre-_NET_WM_ICONs look corrupted
642355 patch to expose MetaWindow.move(), .resize() and add/expose .move_frame() to javascript
642787 MetaWindowActor has a dangling reference to its MetaWindow
643597 Attached dialogs not resizable, even by app request
644188 Broken build of 2.91.91
644252 Add MUTTER_WM_CLASS_FILTER environment variable
644529 session: Change XSMP restart style to Never
644565 Kill libmutter-private ?
644961 auto-tiling makes moving already-tiled windows hard
645224 Translation message doesn't make much sense
645247 Methods of Meta.Rectangle are missing annotations.
645455 tiling: Fix dragging windows free from edge-tiling
2.91.91
=======
* Build a libmutter-wm that contains all of the logic and that
can be linked to to create custom executables. The mutter executable
becomes a small stub linked to this library [Dan]
* Move installed headers files into a meta/ subdirectory instead
of polluting the toplevel namespace [Dan]
* Remove various unused complications: [Dan]
- Ability to set the set of plugins via GConf
- Plugin 'params'
- meta_restart() and "mutter-message restart"
* Don't exit when we are requested to exit via XSMP, assume we'll be
killed along with the X server; this avoids visual artifacts from
unmanaging windows when logging out [Colin]
* Build fixes [Dan, Jani, Jeff]
Contributors:
Jani Monoses, Jeff Olson, Colin Walters, Dan Winship
Translations:
Bruno Brouard [fr], Kjartan Maraas [nb], Daniel Korostil [uk]
Bugs fixed:
643194 patch: expose new meta_window_get_window_rect
643437 Don't exit on XSMP request
643959 Make mutter into a library
2.91.90
=======
* Change <Alt>Above_Tab from being a cycle_group binding to
a switch_group binding [Rui]
* Make plugin-loading failure fatal [Colin]
* Add 'position-changed' signal to MetaWindowActor [Owen]
* When 'live_hidden_previews' is enabled, position hidden windows
to allow the creation of workspace previews [Owen]
* Fix bug with opacity of MetaBackgroundActor
Contributors:
Rui Matos, Owen Taylor, Colin Walters
Translations:
Jorge González [es], Mattias Põldaru [et], Sweta Kothari [gu], Luca Ferretti [it],
Changwoo Ryu [ko], Nguyễn Thái Ngọc Duy [vi]
Bugs fixed:
641309 When live_hidden_previews is set, force placement for hidden windows
641310 MetaWindowActor: Add a 'positioned-changed' signal
641979 Visual glitch on workspace selector closing overview mode
641384 Make plugin loading failure fatal
642426 Don't pass handled key events to GTK+
2.91.6
======
* Add meta_screen_override_window_layout() to let a plugin set the workspace
layout [Owen]
* Add a 'size-changed' signal to MetaWindowActor [Florian]
* Add meta_window_actor_is_destroyed() [Adel]
* Fix problems with window tile previews when cancelling a move [Florian]
* Port theme elements that use GTK+ drawing to use GtkStyleContext instead
of the deprecated GtkStyle. [Florian]
* Fix compiler warnings that were causing compilation failures [Jasper, Owen]
* Misc bug fixes [Gabor, Jasper, Owen, Rui]
Contributors:
Adel Gadllah, Gabor Kelemen, Rui Matos, Florian Müllner, Jasper St. Pierre,
Owen Taylor
Translations:
Khaled Hosny [ar], Alexander Shopov [bg], Petr Kovar [cz], Fran Diéguez [gl],
Marios Zindilis [gr], Gabor Kelemen [hu], Kjartan Maraas [nb], A S Alam [pa],
Daniel Nylander [se], Chao-Hsiung Liao [zh_HK, zh_TW]
2.91.5
======
* Add a Above_Tab key symbol that can be used in key bindings to mean
the key above the Tab key. This is now the default binding for
cycle_group in both Mutter and Metacity. [Owen]
* Add new frame states for tiled-on-the-left and tiled-on-the-right [Florian]
* Add new background drawing functions that can be defined in a theme
for single buttons. [Florian]
* Draw the right button backgrounds for all custom button layouts [Florian]
* Remove vestigal --composite/--no-composite command line options [Nickolas]
* Fix building on GLES [Andreas]
* Code cleanups [Adel, Owen]
Contributors:
Adel Gadllah, Nickolas Lloyd, Andreas Mueller, Florian Müllner, Owen Taylor
Translations:
Mattias Põldaru, Ivar Smolin [et], Gheyret T. Kenji [ug]
Bugs fixed:
613124 Invalid visibility-related asserts in MutterWindow
626875 Fix handling of --composite and --no-composite command line options
629282 [PATCH] Fix errors building for gles-systems (clutter-eglx)
635569 Add an "Above_Tab" pseudo-keysym
635683 add specific button background for single button (per side) case
635686 button backgrounds broken with rtl locales
637330 [PATCH] theme: Add tiled_left/tiled_right frame states
2.91.4
======
* Update for GTK+ 3 changes [Benjamin, Colin, Emmanuele, Florian]
* Support maximizing a window by dragging to the top of the screen
in the same way you can tile by dragging to the edge of the screen.
[Ray, Florian]
* Misc bug fixes [Milan, Owen]
Contributors:
Emmanuele Bassi, Milan Bouchet-Valat, Florian Müllner, Benjamin Otte,
Ray Strode, Owen Taylor, Colin Walters
Translations:
Matej Urbančič [sl], Nguyễn Thái Ngọc Duy [vi]
Bugs fixed:
630548 gnome-shell could auto-maximize windows when dragged to top edge of screen
636083 workspace: Consider text direction when switching
636301 Port testgradient example to GTK3
636302 Replace some GDK X11 calls with future-proof ones
636491 valgrind: meta_window_shape_new (meta-window-shape.c:79)
637802 ui: Adapt to GDK API changes
2.91.3
======
* Better shadows: [Owen]
- Shadows can be different for different window types and focus states
- Shadows are larger by default, especially for the currently active
window
- Shadows for attached modal dialogs and menus are drawn not to
overlap the attachment point.
- Shadows follow the shape of shaped windows
* Optimization: [Owen]
- Avoid repainting in situations when windows are potentially restacked
but aren't actually restacked.
- Pay attention to partial stage repaints in obscured window calculations
- Better optimization of painting obscured shadows; turn off shadows
for maximized windows.
- Move background repainting into Mutter; doing it here rather than
in plugins allows not painting obscured parts of the background.
* A new frame type 'attached' is added for attached modal dialogs
and can be referenced in theme files with a theme version of 3.2.
* Fix updating key bindings when the keyboard layout changes
[Derek, Owen, Thomas]
* Bug fixes [Adel, Florian]
* Build fixes [Dan Williams, Diego, Javier, Owen]
Contributors:
Adel Gadllah, Javier Jardón, Florian Müllner, Derek Poon, Owen Taylor,
Thomas Thurman, Diego Escalante Urrelo, Dan Williams
Translations:
Khaled Hosny [ar], Jorge González [es], Fran Diéguez [gl],
Yaron Shahrabani [he], Kjartan Maraas [nb], Gheyret T. Kenji [ug]
Bugs fixed:
634779 MetaWindowGroup: further optimize paints by using current scissor
634833 Draw the root window background
592382 improve shadow effect
628199 Add antialising to arc and line drawing operations
633002 meta-actor-window: Use G_UNLIKELY for TFP check
634771 MetaStackTracker: Avoid queueing resync for obvious no-ops
635421 Fix crash in check_needs_shadow
635493 configure.in: it's git, not Subversion
635528 configure.ac: move call to AM_GNU_GLIB_GETTEXT above cflags modification
635575 meta-window-actor: remove unused meta_window_actor_get_shadow_bounds
636083 workspace: Consider text direction when switching
2.91.2
======
* Remove support for GTK+ 2 [Florian]
* Adapt to deprecation of size_request deprecation in GTK+ [Matthias]
* Include change from Metacity to fix confusion of mouse
tracking when double-clicking on title bar [Owen]
* Fix bug with the the window menu getting stuck when you alt-Tab [Owen]
Contributors:
Matthias Clasen, Florian Müllner, Owen Taylor
Translations:
Petr Kovar [cz]
Bugs fixed:
633133 Remove compatibility for GTK+-2.0
633352 prepare for the demise of size_request
633398 Fix check for events on UI widgets
633401 Fix warning from synthesized events with GdkDevice
2.91.1
======
* Default build is now GTK+ 3 build
* Mutter namespace prefix is removed, in favor of consistent
meta_ namespace prefixing [Owen]. Naming changes:
MutterWindow => MetaWindowActor
mutter_get_windows => meta_get_window_actors
mutter_plugin_get_windows => meta_plugin_get_window_actors
* Add missing values in MetaKeyBindingAction - this fixes a problem where
key binding lookup wasn't working properly for some key bindings. [Dan]
* Remove keysym parameter to meta_display_get_keybinding_action() - the
function expected the default keysym for the keycode to always be passed [Dan]
* Clean up installed header files - in particular, theme-parser.h is merged
into a new public-only theme.h and private internals are moved to
theme-private.h.
* Fix problems with antialiased rendering of themes [Brandon, Owen, Nickolas]
* Fix problem with parsing color constants in themes [Jon, Owen]
* Build fixes [Colin]
* Miscellaneous bug fixes [Giovanni, Rico]
Contributors:
Giovanni Campagna, Nickolas Lloyd, William Jon McCann, Owen Taylor,
Rico Tzschichholz, Colin Walters, Dan Winship, Brandon Wright
Translations:
Fran Diéguez [gl], Yinghua Wang [zh_CN]
Fixed bugs:
628401 tint and line draw ops rendering issues
628520 unfortunate namespacing
631487 Fix drawing of <arc> theme elements
632116 don't clobber gerrors
632149 Fill in missing MetaKeyBindingAction values
632155 meta_display_get_keybinding_action: remove keysym parameter
632474 Remove MetaRegion
632494 introspection: remove --allow-unprefixed
2.91.0
======
* Enable side-by-side tiling via a gesture of dragging to the left or right
edge of the screen. (enabled with an off-by-default GConf key) [Florian]
* Allow breaking out of maximization/tiling using a alt-middle-button window
resize [Owen, Florian]
* Add the ability to have modal dialogs attached to their parent window
(enabled with an off-by-default GConf key) [Maxim]
* Draw with Cairo rather than GDK [Florian, Benjamin]
* Add compatibility for changes in GTK+ 3
[Benjamin, Alban, Florian, Jasper, Matthias, Owen, Thierry]
- libmutter-private is now only installed for GTK+ 3 builds
- Theme parts of libmutter-private API are changed to take cairo_t
rather than GdkDrawable
* Update introspection build and annotations for new behavior of
g-ir-scanner [Colin]
* Fix bug that caused window menu options not to work [Owen]
* Fix misbehavior of Wine windows [Owen, Alban]
* Fix crashes from missing error traps [Adel]
* Build fixes [Colin, Florian, Owen, Rob, Tomas]
* Misc bug fixes [Adel, Jon, Owen, Nickolas, Tomas]
* Cleanups [Adel, Benjamin, Florian]
Contributors:
Alban Browaeys, Matthias Clasen, Maxim Ermilov, Tomas Frydrych, Adel Gadllah,
Nickolas Lloyd, William Jon McCann, Florian Muellner, Benjamin Otte,
Thierry Reding, Rob Staudinger, Jasper St. Pierre, Owen Taylor, Colin Walters
Translations:
Alexander Shopov [bg], Mario Blättermann [de], Ask H. Larsen [dk],
Michael Kotsarinis [el], Philip Withnall [en_UK], Jorge González [es],
Fran Diéguez [gl], Bruno Brouard, Claude Paroz [fr], Yaron Shahrabani [he],
Gabor Kelemen [hu], Luca Ferretti [it], Nils-Christoph Fiedler [nds],
Kjartan Maraas [nb], A S Alam [pa], Piotr Drąg [pl], Duarte Loreto [pt],
Antonio Fernandes C. Neto [pt_BR], Matej Urbančič [sl],
Miloš Popović [sr, sr@latin], Tirumurti Vasudevan [ta], Aron Xu [zh_CN],
Chao-Hsiung Liao [zh_HK, zh_TW]
Fixed Bugs:
597763 With >2 workspaces, Window menu "Move to Another Workspace" menu doesn't work
598603 displays window size when moving terminal window
606158 "Always on top" triggers Window manager warning:
Log level 8: meta_window_set_user_time: assertion `!window->override_redirect' failed
610575 make meta_screen_set_cursor public
613126 Do not cancel Alt+Tab grab due to Shift key events
623235 BadDamage error from XSubtractDamage
624757 Check for TFP usage after actually setting the pixmap
625712 [mutter-shaped-texture] Remove material_workaround
626583 Replace Gdk drawing API with cairo
627087 Mipmap emulation not working
627210 Crash with X error
628544 introspection: Build with --warn-fatal, drop fix-meta-rectangle.py hack
629127 build problem with recent gtk3
629232 Multiple syntax errors in file mutter-message.c when building Mutter for
GNOME Shell dependencies
629350 [mutter-shaped-texture] Use a base material for all instances
629931 Allow breaking out from maximization/tiling during a mouse resize
630195 Use GDK error trapping straight-up
630203 Prepare mutter code for GTK3 rendering-cleanup
630671 prepare mutter for the demise of GtkObject
630843 gtk_window_set_visual was replaced by gtk_widget_set_visua
631147 Adapt to GTK API changes
631175 Mutter error compiling Gnome Shell
2.31.5
======
* Support building with GTK+ 3.0 [Florian]
* Remove deprecated usages for compatibility with GTK+ 3.0
[Claudio, Florian, Nickolas]
* Export a boxed type for MetaRectangle [Owen]
* Allow disabling -Werror with --enable-compile-warnings=yes [Nickolas]
* Build fixes [Andreas, Florian, Owen]
Contributors:
Nickolas Lloyd, Andreas Mueller, Florian Müllner, Claudio Saavedra,
Owen Taylor
Translations:
Petr Kovar [cz], Jorge González [es], Fran Diéguez [gl],
Yaron Shahrabani [he], Matej Urbančič [sl]
Fixed Bugs:
587991 - Remove deprecated GTK+ symbols
616275 - -Werror should not be enabled by default (or should be possible to disable)
622303 - Allow building with Gtk+-3.0
622800 - Make mutter more gtk+ 3.0 friendly
623335 - Make MetaRectangle a boxed type
623639 - Work around g-ir-scanner problem with Gdk.Rectangle
624166 - src/core/util.c: Fix warning in case WITH_VERBOSE_MODE is not set
2.31.4
======
* Clean up MutterPlugin effect interface [Maxim]
* Track damage as the bounding box, a significant optimizations
for rapidly drawing clients [Robert]
* Add meta_window_is_remote() [Colin]
* Add meta_add_debug_topic() for turning on logging of
specific topics [Colin]
* Fix bug with window unmaximization [Owen]
Contributors:
Robert Bragg, Maxim Ermilov, Owen Taylor, Colin Walters
Translations:
Yaron Shahrabani (he), Fran Diéguez (gl), Kjartan Maraas (nb), A S Alam (pa)
Fixed Bugs:
611838 - expose sub-stage redraws by streaming raw updates to ClutterX11TexturePixmap
620585 - Add meta_window_is_remote
620860 - function meta_display_open
621082 - MutterPluginManager should call plugin->switch_workspace,
when screen doesn't have any window. Or function should be renamed.
621413 - Maximize/Unmaximize not behaving properly for some non-gnome based programs
2.31.2
======
* Theme enhancements [Owen]
- Add a flexible version mechanism for themes -
metacity-theme-3.xml is now supported, and can include
version="> 3.2" type attributes on the root element or
any subelement.
- Add frame_x_center/frame_y_center variables
- Allow a theme to turn on title ellipsization
* Performance enhancements:
- Stream raw damage updates to ClutterX11TexturePixmap
to enable partial stage updates when windos change [Robert]
- Don't trap XErrors in meta_compositor_process_event [Adel]
* Add meta_prefs_override_preference_location(); this allows
a plugin like GNOME Shell to redirect preferences to a
plugin-specific location. [Owen]
* Support a _MUTTER_HINTS window property; this is a string
property holding key-value pairs with plugin-specific
interpretation [Tomas]
* Build with GSEAL_ENABLE [Florian, Javier]
* Add meta_display_get_leader_window() [Tomas]
* Add meta_display_sort_windows_by_stacking [Colin]
* Export
meta_display_get_last_user_time()
meta_display_xserver_time_is_before()
meta_window_foreach_ancestor(),
meta_window_foreach_transient()
meta_window_lower()
meta_window_raise()
meta_window_set_demands_attention()
meta_window_unset_demands_attention() [Colin]
* Bug fixes [Dan, Edward, Owen, Tomas]
* Build fixes [Owen, Dominique, Vincent]
Contributors:
Robert Bragg, Adel Gadllah, Tomas Frydrych, Javier Jardón,
Dominique Leuenberger, Florian Müllner, Edward Sheldrake,
Owen Taylor, Vincent Untz, Colin Walters, Dan Winship
Translations:
Xandru Armesto Fernandez (ast), Khaled Hosny (ar), Petr Kovar (cz),
Mario Blättermann, (de), Jorge González (es),
Inaki Larranaga Murgoitio [eu), Claude Paroz (fr), Luca Ferretti (it),
Gintautas Miliauskas (lt), Pavol Šimo (sk), Matej Urbančič (sl)
Fixed Bugs:
591842 - ellipsize titles when oversize
592503 - Add a flexible version mechanism
595496 - Use accessor functions instead direct access (use GSEAL GnomeGoal)
596659 - Fix handling of grabbed key events
613123 - Framework for plugin-specific per-window hint
613125 - Add meta_display_get_leader_window()
613127 - Keep num_workspaces key in sync with the actual workspace number
613136 - remove over-restrictive assert from meta_prefs_get_workspace_name()
613398 - Don't trap XErrors in meta_compositor_process_event
615586 - Allow redirecting preferences to a different GConf key
615672 - cant' compile mutter error: dereferencing pointer p does break
strict-aliasing rules
616050 - alt-tab infrastructure patches
616274 - mutter from git fails with gcc 4.5 (on new warning)
616546 - On dual screen maximized windows dragged to the second screen no
longer update their contents
618138 - Work around COGL bug causing flash for new windows
618613 - Fix crash with --sync option
2.29.1
======
* Support and require Clutter 1.2 (Owen)
* Add meta_display_get_keybinding_action() (Colin, Dan)
* Add meta_window_get_wm_class_instance() (Tomas)
* Remove workaround for bug fixed in intel driver Q2/2009 release (Robert)
* Build fixes (Owen, Brian, Nguyễn Thái Ngọc Duy)
Contributors:
Robert Bragg, Brian Cameron, Tomas Frydrych, Nguyễn Thái Ngọc Duy,
Owen Taylor, Colin Walters, Dan Winship
Translations:
Alexander Shopov (bg), Mario Blättermann (de), Bruno Brouard (fr),
Nils-Christoph Fiedler (nds), Piotr Drąg (pl), Aron Xu (zh_CN)
Fixed Bugs:
610862 Support and require Clutter 1.1
612506 mutter 2.29.0 fails to compile on Solaris
613100 [MetaDisplay] Expose meta_display_get_keybinding_action
613121 Remove workaround for multitexturing with old intel drivers
613128 [MetaWindow] Accessor for the instance part of WM_CLASS property
613278 meta_display_get_keybinding_action: strip out uninteresting modifiers
2.29.0
======
* Improve appearance of scaled down windows using mipmap emulation (Owen)
* Added signals: MetaDisplay::window-created, MetaDisplay::window-marked-urgent,
MetaDisplay::window-demands-attention, MetaWindow::unmanaged (Colin, Tomas)
* Added properties: MetaWindow:demands-attention, MetaWindow:urgent,
MetaWindow:maximized-horizontally, MetaWindow:maximized-vertically (Florian, Tomas)
* Fix nasty crash when workspace "struts" changed during a window move (Jon, Owen)
* Bug fixes (Dan, Maxim, Neil, Owen, Tomas)
* Build fixes (Colin, Emmanuele, Nickolas, Owen, Richard)
* Merge Metacity changes since 2.26. Includes themable sound support
via libcanberra (Owen)
Contributors
Emmanuele Bassi, Maxim Ermilov, Tomas Frydrych, Richard Hughes, Nickolas Lloyd,
Florian Müllner, Jon Nettleton, Neil Roberts, Owen Taylor, Colin Walters,
Dan Winship
Additional Metacity contributors:
Thomas Hindoe Paaboel Andersen, Peter Bloomfield, Matthias Clasen,
Matt Kraai, Claude Paroz, Lennart Poettering, Ray Strode, Thomas Thurman,
Vincent Untz, Tomislav Vujec, Tomeu Vizoso, Travis Watkins, 'alexisdm59'
Translations:
Khaled Hosny (ar), Petr Kovar (cz), Kjartan Maraas (nb), Djavan Fagundes (pt_BR),
Nils-Christoph Fiedler (nds), Matej Urbančič (sl), Vincent Untz
Fixed Bugs:
588065 Adds demands-attention signal to the window class
591913 Fails to skip current window on alt+tab when another window is asking for attention
592567 Dereferencing NULL in mutter_window_get_workspace()
597052 Add signal to MetaDisplay so we know when a window has demanded-attention
598289 Add "window-created" signal to MetaDisplay, "unmanaged" signal for MetaWindow
598473 "XXX specified twice for this theme" messages not in sync with metacity.
598600 "Visual Bell" option in Metacity causes Mutter to crash
600068 notifications for window urgency hint
601228 rdesktop does not get keypress signals
602349 [PATCH] trivial - fix compilation warning in mutter
602740 Remove XOR gc only used in removed reduced-resources mode
602870 Fix compilation with older libGL
604200 Compile issue: Use of deprecated clutter functions
606388 mutter fails to build when using ld with --no-add-needed
607125 Fails to build with latest introspection data
607398 Do not use CGL_* symbols
607746 reduce gconf roundtrips at startup
608800 alt-dragging gimp windows crashes gnome-shell
609350 Mutter does not support the COGL_DEBUG environment variable
609546 meta_workspace_set_builtin_struts(): optimize out non-changes
609585 Merge libcanberra usage from Metacity
609657 Use cogl multitexture API when drawing MutterShapedTexture
609665 Bug fixes from Fedora RPM
609710 screencast recording broke
610391 Fix crash on startup with list bindings
2.28.0
======
* New exported API:
meta_window_get_stable_sequence() [Colin]
meta_window_get_transient_for_as_xid() [Tomas]
MutterScreen::workareas-changed signal [Tomas]
* Fix a problem where changes processed from a Clutter event
callback wouldn't get handled before the screen was next
repainted, causing flashing [Owen]
* Remove MetaAltTabHandler as no longer needed [Dan]
* Bug fixes [Colin, Owen]
Contributors:
Tomas Frydrych, Owen Taylor, Colin Walters, Dan Winship
Translations:
Christian Kirbach (de), Claude Paroz (fr)
2.27.5
======
* Fix bug in GConf schemas where the overview activation key was specified as
'<Super_L>' not 'Super_L'.
Contributors:
Colin Walters
Translation:
Denis Arnaud (br)
2.27.4
======
* Big code cleanup: when talking about multiple monitors, call them
"monitors", not "xineramas". [Dan]
* Accessors added or made public:
meta_screen_get_n_monitors(), meta_screen_get_monitor_geometry()
meta_window_get_user_time() and MetaWindow:user-time property.
[Colin, Dan]
* Set _GNOME_WM_KEYBINDINGS=Metacity,Mutter on the _NET_SUPPORTING_WM_CHECK
window so that gnome-keybinding-properties can figure out to show the
Metacity keybindings when Mutter is running. [Owen]
* Bug and build fixes [Colin, Owen]
Contributors:
Owen Taylor, Colin Walters, Dan Winship
Translation:
Jorge González (es), Inaki Larranaga Murgoitio (eu), Gabor Kelemen (hu)
Bugs fixed:
592393 - Clicking on a minimized window in the overview doesn't focus the window
593399 - Add meta_display_get_grab_op()
593404 - Make MUTTER_DEBUG_XINERAMA override active Xinerama
593407 - Add 'skip-taskbar' accessor to MetaWindow.
593686 - Add meta_screen_get_monitors()
594067 - Export a _GNOME_WM_KEYBINDINGS property
2.27.3
======
* Key handling improvements:
- enforce that every key is handled no more than once.
- mutter_plugin_begin_modal() and mutter_plugin_begin_modal() allow
putting a plugin into a "modal" state where it has exclusive access
to key and pointer events.
- Add "tab_popup_select", "tab_pop_cancel" pseudo-keypress-handlers
that plugins can use to get notification when Alt-Tab ends
[Owen]
* Accessors added or made public:
meta_window_is_override_redirect(), meta_window_is_mapped(),
meta_display_xwindow_is_a_no_focus_window(),
meta_display_get_grab_op(), meta_window_is_skip_taskbar(),
meta_window_is_modal(), all of errors.h
[Colin, Owen, Michael, Steve, Tomas]
* Fix for various GTK+ deprecations [Javier]
* Bug fixes [Colin, Frédéric, Owen, Thomas, Tomas, Volker]
Contributors:
Javier Jardón, Steve Frécinaux, Tomas Frydrych, Michael Meeks,
Frédéric Péters, Volker Sobek, Owen Taylor, Thomas Thurman,
Colin Walters
Translation:
Fran Dieguez (gl), Gabor Kelemen (hu), Daniel Nylander (se)
Bugs fixed:
589457 - Fix up window property notification for "title"
590911 - Do not run plugin effects on WM startup
590978 - API to query whether window is in modal state
591367 - Be silent by default
591566 - install errors.h header ...
591788 - Add meta_window_is_override_redirect
591836 - mutter mishandles opacity
591913 - Fails to skip current window on alt+tab when another window is asking for attention
592393 - Clicking on a minimized window in the overview doesn't focus the window
592699 - Remove deprecated Encoding key from desktop files
592742 - Avoid accessing freed memory when being replaced
593399 - Add meta_display_get_grab_op()
593404 - Make MUTTER_DEBUG_XINERAMA override active Xinerama
593407 - Add 'skip-taskbar' accessor to MetaWindow.
----------------------------- Older Metacity News -----------------------------
2.26.0
======

View File

@@ -1,8 +1,8 @@
AC_PREREQ(2.50)
m4_define([mutter_major_version], [2])
m4_define([mutter_minor_version], [91])
m4_define([mutter_micro_version], [3])
m4_define([mutter_major_version], [3])
m4_define([mutter_minor_version], [0])
m4_define([mutter_micro_version], [2])
m4_define([mutter_version],
[mutter_major_version.mutter_minor_version.mutter_micro_version])
@@ -61,7 +61,7 @@ AC_CHECK_SIZEOF(__int64)
## byte order
AC_C_BIGENDIAN
GTK_MIN_VERSION=2.90.7
GTK_MIN_VERSION=2.91.7
CANBERRA_GTK=libcanberra-gtk3
CANBERRA_GTK_VERSION=0.26
@@ -96,11 +96,6 @@ AC_ARG_ENABLE(startup-notification,
[disable mutter's startup notification support, for embedded/size-sensitive custom non-GNOME builds]),,
enable_startup_notification=auto)
AC_ARG_WITH(introspection,
AC_HELP_STRING([--without-introspection],
[disable the use of GObject introspection]),,
with_introspection=auto)
AC_ARG_WITH(libcanberra,
AC_HELP_STRING([--without-libcanberra],
[disable the use of libcanberra for playing sounds]),,
@@ -214,24 +209,15 @@ else
AC_MSG_ERROR([no. Mutter requires Clutter version $CLUTTER_VERSION.])
fi
if test x$with_introspection != xno; then
PKG_CHECK_MODULES(INTROSPECTION, gobject-introspection-1.0 >= 0.9.5, have_introspection=yes, have_introspection=no)
if test x$have_introspection=xyes; then
MUTTER_PC_MODULES="$MUTTER_PC_MODULES gobject-introspection-1.0"
AC_DEFINE(HAVE_INTROSPECTION, 1, [Define if GObject introspection is available])
G_IR_SCANNER=`$PKG_CONFIG --variable=g_ir_scanner gobject-introspection-1.0`
AC_SUBST(G_IR_SCANNER)
G_IR_COMPILER=`$PKG_CONFIG --variable=g_ir_compiler gobject-introspection-1.0`
AC_SUBST(G_IR_COMPILER)
G_IR_GENERATE=`$PKG_CONFIG --variable=g_ir_generate gobject-introspection-1.0`
AC_SUBST(G_IR_GENERATE)
GIRDIR=`$PKG_CONFIG --variable=girdir gobject-introspection-1.0`
AC_SUBST(GIRDIR)
TYPELIBDIR="$($PKG_CONFIG --variable=typelibdir gobject-introspection-1.0)"
AC_SUBST(TYPELIBDIR)
fi
INTROSPECTION_VERSION=0.9.5
GOBJECT_INTROSPECTION_CHECK([$INTROSPECTION_VERSION])
if test x$found_introspection != xno; then
AC_DEFINE(HAVE_INTROSPECTION, 1, [Define if GObject introspection is available])
MUTTER_PC_MODULES="$MUTTER_PC_MODULES gobject-introspection-1.0"
META_GIR=[Meta_]mutter_major_version[_]mutter_minor_version[_gir]
AC_SUBST(META_GIR)
fi
AM_CONDITIONAL(WITH_INTROSPECTION, test "$have_introspection" = "yes")
AC_MSG_CHECKING([Xcursor])
if $PKG_CONFIG xcursor; then
@@ -524,7 +510,7 @@ doc/Makefile
doc/man/Makefile
src/Makefile
src/wm-tester/Makefile
src/libmutter-private.pc
src/libmutter.pc
src/mutter-plugins.pc
src/tools/Makefile
src/compositor/plugins/Makefile
@@ -561,7 +547,7 @@ mutter-$VERSION
Solaris Xinerama: ${use_solaris_xinerama}
Startup notification: ${have_startup_notification}
libcanberra: ${have_libcanberra}
Introspection: ${have_introspection}
Introspection: ${found_introspection}
Session management: ${found_sm}
Shape extension: ${found_shape}
Xsync: ${found_xsync}

View File

@@ -22,6 +22,16 @@ This document has separate sections for each format version. You may
want to read the document in reverse order, since the base features
are discussed under version 1.
New Features in Theme Format Version 3.3
========================================
Add two additional button background functions - left_single_background and
right_single_background - for button groups with just a single button.
There are now additional frame states to style left/right tiled windows
differently ("tiled_left", "tiled_right", "tiled_left_and_shaded",
"tiled_right_and_shaded").
New Features in Theme Format Version 3.2
========================================

View File

@@ -6,6 +6,16 @@
<name xml:lang="en">mutter</name>
<shortdesc xml:lang="en">Window and compositing manager based on Clutter</shortdesc>
<description>Mutter is a window and compositing manager that displays and
manages your desktop via OpenGL. Mutter combines a sophisticated display engine
using the Clutter toolkit with solid window-management logic inherited from the
Metacity window manager.
While Mutter can be used stand-alone, it is primarily intended to be used as
the display core of a larger system such as GNOME Shell. For this reason,
Mutter is very extensible via plugins, which are used both to add fancy visual
effects and to rework the window management behaviors to meet the needs of the
environment.</description>
<!--
<homepage rdf:resource="http://www.gnome.org/" />
-->

View File

@@ -22,6 +22,7 @@ dz
el
en_CA
en_GB
eo
es
et
eu

View File

@@ -1,5 +1,6 @@
# List of source files containing translatable strings.
# Please keep this file sorted alphabetically.
src/core/all-keybindings.h
src/core/bell.c
src/core/core.c
src/core/delete.c
@@ -7,6 +8,7 @@ src/core/display.c
src/core/errors.c
src/core/keybindings.c
src/core/main.c
src/core/mutter.c
src/core/prefs.c
src/core/screen.c
src/core/session.c
@@ -14,7 +16,6 @@ src/core/util.c
src/core/window.c
src/core/window-props.c
src/core/xprops.c
src/include/all-keybindings.h
src/mutter.desktop.in
src/mutter-wm.desktop.in
src/mutter.schemas.in

2759
po/ar.po

File diff suppressed because it is too large Load Diff

2175
po/as.po

File diff suppressed because it is too large Load Diff

1274
po/bg.po

File diff suppressed because it is too large Load Diff

3128
po/ca.po

File diff suppressed because it is too large Load Diff

1205
po/cs.po

File diff suppressed because it is too large Load Diff

1314
po/da.po

File diff suppressed because it is too large Load Diff

3180
po/de.po

File diff suppressed because it is too large Load Diff

598
po/el.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

1826
po/eo.po Normal file

File diff suppressed because it is too large Load Diff

1175
po/es.po

File diff suppressed because it is too large Load Diff

2956
po/et.po

File diff suppressed because it is too large Load Diff

1418
po/eu.po

File diff suppressed because it is too large Load Diff

1264
po/fr.po

File diff suppressed because it is too large Load Diff

1220
po/gl.po

File diff suppressed because it is too large Load Diff

1536
po/gu.po

File diff suppressed because it is too large Load Diff

1164
po/he.po

File diff suppressed because it is too large Load Diff

1312
po/hu.po

File diff suppressed because it is too large Load Diff

4965
po/id.po

File diff suppressed because it is too large Load Diff

1378
po/it.po

File diff suppressed because it is too large Load Diff

5596
po/kn.po

File diff suppressed because it is too large Load Diff

3278
po/ko.po

File diff suppressed because it is too large Load Diff

2772
po/lv.po

File diff suppressed because it is too large Load Diff

1127
po/nb.po

File diff suppressed because it is too large Load Diff

2073
po/nl.po

File diff suppressed because it is too large Load Diff

1416
po/pa.po

File diff suppressed because it is too large Load Diff

1253
po/pl.po

File diff suppressed because it is too large Load Diff

1329
po/pt.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

2853
po/ro.po

File diff suppressed because it is too large Load Diff

3650
po/ru.po

File diff suppressed because it is too large Load Diff

1351
po/sl.po

File diff suppressed because it is too large Load Diff

1580
po/sv.po

File diff suppressed because it is too large Load Diff

1263
po/ta.po

File diff suppressed because it is too large Load Diff

2597
po/tr.po

File diff suppressed because it is too large Load Diff

1473
po/ug.po

File diff suppressed because it is too large Load Diff

6177
po/uk.po

File diff suppressed because it is too large Load Diff

4122
po/vi.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@@ -1,11 +1,30 @@
# Flag build for parallelism; see https://savannah.gnu.org/patch/?6905
.AUTOPARALLEL:
lib_LTLIBRARIES = libmutter-private.la
lib_LTLIBRARIES = libmutter.la
SUBDIRS=wm-tester tools compositor/plugins
INCLUDES=@MUTTER_CFLAGS@ -I $(srcdir)/include -I$(srcdir)/compositor -DMUTTER_LIBEXECDIR=\"$(libexecdir)\" -DHOST_ALIAS=\"@HOST_ALIAS@\" -DMUTTER_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" -DMUTTER_PKGDATADIR=\"$(pkgdatadir)\" -DMUTTER_DATADIR=\"$(datadir)\" -DG_LOG_DOMAIN=\"mutter\" -DSN_API_NOT_YET_FROZEN=1 -DMUTTER_MAJOR_VERSION=$(MUTTER_MAJOR_VERSION) -DMUTTER_MINOR_VERSION=$(MUTTER_MINOR_VERSION) -DMUTTER_MICRO_VERSION=$(MUTTER_MICRO_VERSION) -DMUTTER_PLUGIN_API_VERSION=$(MUTTER_PLUGIN_API_VERSION) -DMUTTER_PKGLIBDIR=\"$(pkglibdir)\" -DMUTTER_PLUGIN_DIR=\"@MUTTER_PLUGIN_DIR@\"
INCLUDES= \
$(MUTTER_CFLAGS) \
-I$(srcdir) \
-I$(srcdir)/core \
-I$(srcdir)/ui \
-I$(srcdir)/compositor \
-DMUTTER_LIBEXECDIR=\"$(libexecdir)\" \
-DHOST_ALIAS=\"@HOST_ALIAS@\" \
-DMUTTER_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" \
-DMUTTER_PKGDATADIR=\"$(pkgdatadir)\" \
-DMUTTER_DATADIR=\"$(datadir)\" \
-DG_LOG_DOMAIN=\"mutter\" \
-DSN_API_NOT_YET_FROZEN=1 \
-DMUTTER_MAJOR_VERSION=$(MUTTER_MAJOR_VERSION) \
-DMUTTER_MINOR_VERSION=$(MUTTER_MINOR_VERSION) \
-DMUTTER_MICRO_VERSION=$(MUTTER_MICRO_VERSION) \
-DMUTTER_PLUGIN_API_VERSION=$(MUTTER_PLUGIN_API_VERSION) \
-DMUTTER_PKGLIBDIR=\"$(pkglibdir)\" \
-DMUTTER_PLUGIN_DIR=\"@MUTTER_PLUGIN_DIR@\" \
-DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\"
mutter_built_sources = \
mutter-marshal.h \
@@ -13,14 +32,14 @@ mutter_built_sources = \
mutter-enum-types.h \
mutter-enum-types.c
mutter_SOURCES= \
libmutter_la_SOURCES = \
core/async-getprop.c \
core/async-getprop.h \
core/bell.c \
core/bell.h \
core/boxes.c \
core/boxes-private.h \
include/boxes.h \
meta/boxes.h \
compositor/cogl-utils.c \
compositor/cogl-utils.h \
compositor/compositor.c \
@@ -46,36 +65,36 @@ mutter_SOURCES= \
compositor/meta-window-shape.h \
compositor/region-utils.c \
compositor/region-utils.h \
include/compositor.h \
include/meta-plugin.h \
include/meta-shadow-factory.h \
include/meta-window-actor.h \
include/compositor-mutter.h \
meta/compositor.h \
meta/meta-plugin.h \
meta/meta-shadow-factory.h \
meta/meta-window-actor.h \
meta/compositor-mutter.h \
core/above-tab-keycode.c \
core/constraints.c \
core/constraints.h \
core/core.c \
core/delete.c \
core/display.c \
core/display-private.h \
include/display.h \
meta/display.h \
ui/draw-workspace.c \
ui/draw-workspace.h \
core/edge-resistance.c \
core/edge-resistance.h \
core/errors.c \
include/errors.h \
meta/errors.h \
core/eventqueue.c \
core/eventqueue.h \
core/frame.c \
core/frame-private.h \
include/frame.h \
core/frame.h \
ui/gradient.c \
ui/gradient.h \
meta/gradient.h \
core/group-private.h \
core/group-props.c \
core/group-props.h \
core/group.c \
include/group.h \
meta/group.h \
core/iconcache.c \
core/iconcache.h \
core/keybindings.c \
@@ -85,11 +104,11 @@ mutter_SOURCES= \
core/place.c \
core/place.h \
core/prefs.c \
include/prefs.h \
meta/prefs.h \
core/screen.c \
core/screen-private.h \
include/screen.h \
include/types.h \
meta/screen.h \
meta/types.h \
core/session.c \
core/session.h \
core/stack.c \
@@ -97,19 +116,19 @@ mutter_SOURCES= \
core/stack-tracker.c \
core/stack-tracker.h \
core/util.c \
include/util.h \
meta/util.h \
core/window-props.c \
core/window-props.h \
core/window.c \
core/window-private.h \
include/window.h \
meta/window.h \
core/workspace.c \
core/workspace-private.h \
core/xprops.c \
include/xprops.h \
include/common.h \
include/core.h \
include/ui.h \
core/xprops.h \
meta/common.h \
core/core.h \
ui/ui.h \
inlinepixbufs.h \
ui/fixedtip.c \
ui/fixedtip.h \
@@ -120,71 +139,55 @@ mutter_SOURCES= \
ui/metaaccellabel.c \
ui/metaaccellabel.h \
ui/resizepopup.c \
include/resizepopup.h \
ui/resizepopup.h \
ui/tabpopup.c \
include/tabpopup.h \
ui/tabpopup.h \
ui/tile-preview.c \
include/tile-preview.h \
ui/tile-preview.h \
ui/theme-parser.c \
ui/theme.c \
ui/theme.h \
meta/theme.h \
ui/theme-private.h \
ui/ui.c \
include/all-keybindings.h \
core/all-keybindings.h \
meta/preview-widget.h \
ui/preview-widget.c \
$(mutter_built_sources)
# by setting libmutter_private_la_CFLAGS, the files shared with
# mutter proper will be compiled with different names.
libmutter_private_la_CFLAGS =
libmutter_private_la_SOURCES= \
core/boxes.c \
include/boxes.h \
ui/gradient.c \
ui/gradient.h \
core/util.c \
include/util.h \
include/common.h \
ui/preview-widget.c \
ui/preview-widget.h \
ui/theme-parser.c \
ui/theme.c \
ui/theme.h
libmutter_private_la_LDFLAGS = -no-undefined
libmutter_private_la_LIBADD = @MUTTER_LIBS@
libmutter_la_LDFLAGS = -no-undefined
libmutter_la_LIBADD = $(MUTTER_LIBS)
# Headers installed for plugins; introspected information will
# be extracted into Mutter-<version>.gir
libmutterinclude_base_headers = \
include/boxes.h \
ui/gradient.h \
include/main.h \
include/util.h \
include/common.h \
ui/theme.h \
include/prefs.h \
include/window.h \
include/workspace.h \
include/compositor.h \
include/compositor-mutter.h \
include/types.h \
include/errors.h \
include/screen.h \
include/display.h \
include/group.h \
include/keybindings.h \
include/meta-plugin.h \
include/meta-shadow-factory.h \
include/meta-window-actor.h
meta/boxes.h \
meta/common.h \
meta/compositor-mutter.h \
meta/compositor.h \
meta/display.h \
meta/errors.h \
meta/gradient.h \
meta/group.h \
meta/keybindings.h \
meta/main.h \
meta/meta-plugin.h \
meta/meta-shadow-factory.h \
meta/meta-window-actor.h \
meta/prefs.h \
meta/screen.h \
meta/theme.h \
meta/types.h \
meta/util.h \
meta/window.h \
meta/workspace.h
# Excluded from scanning for introspection but installed
# preview-widget.h: only part of libmutter-private
# atomnames.h: macros cause problems for scanning process
libmutterinclude_extra_headers = \
ui/preview-widget.h \
include/atomnames.h
meta/preview-widget.h \
meta/atomnames.h
libmutterincludedir = $(includedir)/mutter/mutter-private
libmutterincludedir = $(includedir)/mutter/meta
libmutterinclude_HEADERS = \
$(libmutterinclude_base_headers) \
@@ -195,9 +198,14 @@ mutter_theme_viewer_SOURCES= \
bin_PROGRAMS=mutter mutter-theme-viewer
mutter_SOURCES = core/mutter.c
mutter_LDADD = $(MUTTER_LIBS) libmutter.la
if HAVE_INTROSPECTION
include $(INTROSPECTION_MAKEFILE)
api_version = $(MUTTER_MAJOR_VERSION).$(MUTTER_MINOR_VERSION)
if WITH_INTROSPECTION
# These files are in package-private directories, even though they may be used
# by plugins. If you're writing a plugin, use g-ir-compiler --add-include-path
# and g-ir-compiler --includedir.
@@ -207,50 +215,32 @@ gir_DATA = Meta-$(api_version).gir
typelibdir = $(pkglibdir)
typelib_DATA = Meta-$(api_version).typelib
# We need to strip out the attribute that would point back to libmutter-introspect
# so that libgirepository looks for symbols in the executable instead
Meta-$(api_version).gir: $(G_IR_SCANNER) mutter $(libmutterinclude_HEADERS) $(mutter_SOURCES) Makefile
$(AM_V_GEN) pwd=`pwd` ; \
cd $(srcdir) && \
$(G_IR_SCANNER) \
--namespace=Meta \
--nsversion=$(api_version) \
--warn-all \
--warn-error \
--include=GObject-2.0 \
--include=Gdk-3.0 \
--include=Gtk-3.0 \
--include=Clutter-1.0 \
--pkg=clutter-1.0 \
--pkg=gtk+-3.0 \
--include=xlib-2.0 \
--include=xfixes-4.0 \
--program=$$pwd/mutter \
mutter-enum-types.h \
$(filter %.c,$(mutter_SOURCES)) \
$(libmutterinclude_base_headers) \
$(INCLUDES) \
-o $$pwd/$@
INTROSPECTION_GIRS = Meta-$(api_version).gir
Meta-$(api_version).gir: libmutter.la
@META_GIR@_INCLUDES = GObject-2.0 Gdk-3.0 Gtk-3.0 Clutter-1.0 xlib-2.0 xfixes-4.0
@META_GIR@_PACKAGES = clutter-1.0 gtk+-3.0
@META_GIR@_CFLAGS = $(INCLUDES)
@META_GIR@_LIBS = libmutter.la
@META_GIR@_FILES = \
mutter-enum-types.h \
$(libmutterinclude_base_headers) \
$(filter %.c,$(libmutter_la_SOURCES))
@META_GIR@_SCANNERFLAGS = --warn-all --warn-error
Meta-$(api_version).typelib: $(G_IR_COMPILER) Meta-$(api_version).gir
$(AM_V_GEN) LD_LIBRARY_PATH=$${LD_LIBRARY_PATH:+$$LD_LIBRARY_PATH:}. $(G_IR_COMPILER) Meta-$(api_version).gir -o $@
endif
EFENCE=
mutter_LDADD=@MUTTER_LIBS@ $(EFENCE)
mutter_LDFLAGS=-export-dynamic
mutter_theme_viewer_LDADD= $(MUTTER_LIBS) libmutter.la
mutter_theme_viewer_LDADD= @MUTTER_LIBS@ libmutter-private.la
testboxes_SOURCES=include/util.h core/util.c include/boxes.h core/boxes.c core/testboxes.c
testgradient_SOURCES=ui/gradient.h ui/gradient.c ui/testgradient.c
testasyncgetprop_SOURCES=core/async-getprop.h core/async-getprop.c core/testasyncgetprop.c
testboxes_SOURCES = core/testboxes.c
testgradient_SOURCES = ui/testgradient.c
testasyncgetprop_SOURCES = core/testasyncgetprop.c
noinst_PROGRAMS=testboxes testgradient testasyncgetprop
testboxes_LDADD= @MUTTER_LIBS@
testgradient_LDADD= @MUTTER_LIBS@
testasyncgetprop_LDADD= @MUTTER_LIBS@
testboxes_LDADD = $(MUTTER_LIBS) libmutter.la
testgradient_LDADD = $(MUTTER_LIBS) libmutter.la
testasyncgetprop_LDADD = $(MUTTER_LIBS) libmutter.la
@INTLTOOL_DESKTOP_RULE@
@@ -264,7 +254,7 @@ wmproperties_in_files=mutter-wm.desktop.in
wmproperties_files=$(wmproperties_in_files:.desktop.in=.desktop)
wmproperties_DATA = $(wmproperties_files)
schemadir = @GCONF_SCHEMA_FILE_DIR@
schemadir = $(GCONF_SCHEMA_FILE_DIR)
schema_in_files = mutter.schemas.in
schema_DATA = $(schema_in_files:.schemas.in=.schemas)
@@ -299,7 +289,7 @@ inlinepixbufs.h: $(IMAGES)
pkgconfigdir = $(libdir)/pkgconfig
pkgconfig_DATA = libmutter-private.pc mutter-plugins.pc
pkgconfig_DATA = libmutter.pc mutter-plugins.pc
EXTRA_DIST=$(desktopfiles_files) \
$(wmproperties_files) \
@@ -307,7 +297,7 @@ EXTRA_DIST=$(desktopfiles_files) \
$(desktopfiles_in_files) \
$(wmproperties_in_files) \
$(schema_in_files) \
libmutter-private.pc.in \
libmutter.pc.in \
mutter-plugins.pc.in \
mutter-enum-types.h.in \
mutter-enum-types.c.in \

View File

@@ -5,8 +5,8 @@
#include <X11/extensions/Xfixes.h>
#include "compositor.h"
#include "display.h"
#include <meta/compositor.h>
#include <meta/display.h>
#include "meta-plugin-manager.h"
#include <clutter/clutter.h>

View File

@@ -4,19 +4,19 @@
#include <clutter/x11/clutter-x11.h>
#include "screen.h"
#include "errors.h"
#include "window.h"
#include <meta/screen.h>
#include <meta/errors.h>
#include <meta/window.h>
#include "compositor-private.h"
#include "compositor-mutter.h"
#include <meta/compositor-mutter.h>
#include "xprops.h"
#include "prefs.h"
#include "meta-shadow-factory.h"
#include <meta/prefs.h>
#include <meta/meta-shadow-factory.h>
#include "meta-window-actor-private.h"
#include "meta-window-group.h"
#include "meta-background-actor.h"
#include "../core/window-private.h" /* to check window->hidden */
#include "../core/display-private.h" /* for meta_display_lookup_x_window() */
#include "window-private.h" /* to check window->hidden */
#include "display-private.h" /* for meta_display_lookup_x_window() */
#include <X11/extensions/shape.h>
#include <X11/extensions/Xcomposite.h>
@@ -550,18 +550,7 @@ meta_compositor_manage_screen (MetaCompositor *compositor,
info->plugin_mgr =
meta_plugin_manager_get (screen);
if (info->plugin_mgr != meta_plugin_manager_get_default ())
{
/* The default plugin manager has been initialized during
* global preferences load.
*/
if (!meta_plugin_manager_load (info->plugin_mgr))
g_critical ("failed to load plugins");
}
if (!meta_plugin_manager_initialize (info->plugin_mgr))
g_critical ("failed to initialize plugins");
meta_plugin_manager_initialize (info->plugin_mgr);
/*
* Delay the creation of the overlay window as long as we can, to avoid
@@ -974,7 +963,10 @@ meta_compositor_sync_stack (MetaCompositor *compositor,
if (old_window->hidden &&
!meta_window_actor_effect_in_progress (old_actor))
old_stack = g_list_delete_link (old_stack, old_stack);
{
old_stack = g_list_delete_link (old_stack, old_stack);
old_actor = NULL;
}
else
break;
}
@@ -1195,3 +1187,47 @@ meta_get_overlay_window (MetaScreen *screen)
return info->output;
}
#define FLASH_TIME_MS 50
static void
flash_out_completed (ClutterAnimation *animation,
ClutterActor *flash)
{
clutter_actor_destroy (flash);
}
static void
flash_in_completed (ClutterAnimation *animation,
ClutterActor *flash)
{
clutter_actor_animate (flash, CLUTTER_EASE_IN_QUAD,
FLASH_TIME_MS,
"opacity", 0,
"signal-after::completed", flash_out_completed, flash,
NULL);
}
void
meta_compositor_flash_screen (MetaCompositor *compositor,
MetaScreen *screen)
{
ClutterActor *stage;
ClutterActor *flash;
ClutterColor black = { 0, 0, 0, 255 };
gfloat width, height;
stage = meta_get_stage_for_screen (screen);
clutter_actor_get_size (stage, &width, &height);
flash = clutter_rectangle_new_with_color (&black);
clutter_actor_set_size (flash, width, height);
clutter_actor_set_opacity (flash, 0);
clutter_container_add_actor (CLUTTER_CONTAINER (stage), flash);
clutter_actor_animate (flash, CLUTTER_EASE_OUT_QUAD,
FLASH_TIME_MS,
"opacity", 192,
"signal-after::completed", flash_in_completed, flash,
NULL);
}

View File

@@ -32,7 +32,7 @@
#include "cogl-utils.h"
#include "compositor-private.h"
#include "errors.h"
#include <meta/errors.h>
#include "meta-background-actor.h"
struct _MetaBackgroundActorClass
@@ -190,10 +190,14 @@ static void
meta_background_actor_paint (ClutterActor *actor)
{
MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
guchar opacity = clutter_actor_get_paint_opacity (actor);
int width, height;
meta_screen_get_size (self->screen, &width, &height);
cogl_material_set_color4ub (self->material,
opacity, opacity, opacity, opacity);
cogl_set_source (self->material);
if (self->visible_region)

View File

@@ -25,7 +25,7 @@
#include <clutter/clutter.h>
#include "screen.h"
#include <meta/screen.h>
/**
* MetaBackgroundActor:

View File

@@ -21,7 +21,7 @@
* 02111-1307, USA.
*/
#include "meta-plugin.h"
#include <meta/meta-plugin.h>
#include "meta-module.h"
#include <gmodule.h>

View File

@@ -24,20 +24,18 @@
#include "config.h"
#include "compositor-private.h"
#include "meta-plugin-manager.h"
#include "prefs.h"
#include "errors.h"
#include "workspace.h"
#include <meta/prefs.h>
#include <meta/errors.h>
#include <meta/workspace.h>
#include "meta-module.h"
#include "../core/window-private.h"
#include "window-private.h"
#include <string.h>
#include <stdlib.h>
#include <clutter/x11/clutter-x11.h>
/*
* There is only one instace of each module per the process.
*/
static GHashTable *plugin_modules = NULL;
static GSList *plugin_types;
/*
* We have one "default plugin manager" that acts for the first screen,
@@ -45,270 +43,79 @@ static GHashTable *plugin_modules = NULL;
* plugin managers for each screen. (This is ugly. Probably we should
* have one plugin manager and only make the plugins per-screen.)
*/
static MetaPluginManager *default_plugin_manager;
static gboolean meta_plugin_manager_reload (MetaPluginManager *plugin_mgr);
struct MetaPluginManager
{
MetaScreen *screen;
GList /* MetaPlugin */ *plugins; /* TODO -- maybe use hash table */
GList *unload; /* Plugins that are disabled and pending unload */
guint idle_unload_id;
GList /* MetaPlugin */ *plugins; /* TODO -- maybe use hash table */
};
/*
* Checks that the plugin is compatible with the WM and sets up the plugin
* struct.
* Loads the given plugin.
*/
static MetaPlugin *
meta_plugin_load (MetaPluginManager *mgr,
MetaModule *module,
const gchar *params)
{
MetaPlugin *plugin = NULL;
GType plugin_type = meta_module_get_plugin_type (module);
if (!plugin_type)
{
g_warning ("Plugin type not registered !!!");
return NULL;
}
plugin = g_object_new (plugin_type,
"params", params,
NULL);
return plugin;
}
/*
* Attempst to unload a plugin; returns FALSE if plugin cannot be unloaded at
* present (e.g., and effect is in progress) and should be scheduled for
* removal later.
*/
static gboolean
meta_plugin_unload (MetaPlugin *plugin)
{
if (meta_plugin_running (plugin))
{
g_object_set (plugin, "disabled", TRUE, NULL);
return FALSE;
}
g_object_unref (plugin);
return TRUE;
}
/*
* Iddle callback to remove plugins that could not be removed directly and are
* pending for removal.
*/
static gboolean
meta_plugin_manager_idle_unload (MetaPluginManager *plugin_mgr)
{
GList *l = plugin_mgr->unload;
gboolean dont_remove = TRUE;
while (l)
{
MetaPlugin *plugin = l->data;
if (meta_plugin_unload (plugin))
{
/* Remove from list */
GList *p = l->prev;
GList *n = l->next;
if (!p)
plugin_mgr->unload = n;
else
p->next = n;
if (n)
n->prev = p;
g_list_free_1 (l);
l = n;
}
else
l = l->next;
}
if (!plugin_mgr->unload)
{
/* If no more unloads are pending, remove the handler as well */
dont_remove = FALSE;
plugin_mgr->idle_unload_id = 0;
}
return dont_remove;
}
/*
* Unloads all plugins
*/
static void
meta_plugin_manager_unload (MetaPluginManager *plugin_mgr)
{
GList *plugins = plugin_mgr->plugins;
while (plugins)
{
MetaPlugin *plugin = plugins->data;
/* If the plugin could not be removed, move it to the unload list */
if (!meta_plugin_unload (plugin))
{
plugin_mgr->unload = g_list_prepend (plugin_mgr->unload, plugin);
if (!plugin_mgr->idle_unload_id)
{
plugin_mgr->idle_unload_id = g_idle_add ((GSourceFunc)
meta_plugin_manager_idle_unload,
plugin_mgr);
}
}
plugins = plugins->next;
}
g_list_free (plugin_mgr->plugins);
plugin_mgr->plugins = NULL;
}
static void
prefs_changed_callback (MetaPreference pref,
void *data)
{
MetaPluginManager *plugin_mgr = data;
if (pref == META_PREF_CLUTTER_PLUGINS)
{
meta_plugin_manager_reload (plugin_mgr);
}
}
static MetaModule *
meta_plugin_manager_get_module (const gchar *path)
{
MetaModule *module = g_hash_table_lookup (plugin_modules, path);
if (!module &&
(module = g_object_new (META_TYPE_MODULE, "path", path, NULL)))
{
g_hash_table_insert (plugin_modules, g_strdup (path), module);
}
return module;
}
/*
* Loads all plugins listed in gconf registry.
*/
gboolean
meta_plugin_manager_load (MetaPluginManager *plugin_mgr)
void
meta_plugin_manager_load (MetaPluginManager *plugin_mgr,
const gchar *plugin_name)
{
const gchar *dpath = MUTTER_PLUGIN_DIR "/";
GSList *plugins, *fallback = NULL;
gchar *path;
MetaModule *module;
GType plugin_type;
plugins = meta_prefs_get_clutter_plugins ();
if (g_path_is_absolute (plugin_name))
path = g_strdup (plugin_name);
else
path = g_strconcat (dpath, plugin_name, ".so", NULL);
if (!plugins)
module = g_object_new (META_TYPE_MODULE, "path", path, NULL);
if (!module || !g_type_module_use (G_TYPE_MODULE (module)))
{
/*
* If no plugins are specified, try to load the default plugin.
/* This is fatal under the assumption that a monitoring
* process like gnome-session will take over and handle
* our untimely exit.
*/
fallback = g_slist_append (fallback, "default");
plugins = fallback;
g_printerr ("Unable to load plugin module [%s]: %s",
path, g_module_error());
exit (1);
}
while (plugins)
{
gchar *plugin_string;
gchar *params;
plugin_type = meta_module_get_plugin_type (module);
meta_plugin_manager_register (plugin_mgr, plugin_type);
plugin_string = g_strdup (plugins->data);
if (plugin_string)
{
MetaModule *module;
gchar *path;
params = strchr (plugin_string, ':');
if (params)
{
*params = 0;
++params;
}
if (g_path_is_absolute (plugin_string))
path = g_strdup (plugin_string);
else
path = g_strconcat (dpath, plugin_string, ".so", NULL);
module = meta_plugin_manager_get_module (path);
if (module)
{
gboolean use_succeeded;
/*
* This dlopens the module and registers the plugin type with the
* GType system, if the module is not already loaded. When we
* create a plugin, the type system also calls g_type_module_use()
* to guarantee the module will not be unloaded during the plugin
* life time. Consequently we can unuse() the module again.
*/
use_succeeded = g_type_module_use (G_TYPE_MODULE (module));
if (use_succeeded)
{
MetaPlugin *plugin = meta_plugin_load (plugin_mgr, module, params);
if (plugin)
plugin_mgr->plugins = g_list_prepend (plugin_mgr->plugins, plugin);
else
g_warning ("Plugin load for [%s] failed", path);
g_type_module_unuse (G_TYPE_MODULE (module));
}
}
else
g_warning ("Unable to load plugin module [%s]: %s",
path, g_module_error());
g_free (path);
g_free (plugin_string);
}
plugins = plugins->next;
}
if (fallback)
g_slist_free (fallback);
if (plugin_mgr->plugins != NULL)
{
meta_prefs_add_listener (prefs_changed_callback, plugin_mgr);
return TRUE;
}
return FALSE;
g_type_module_unuse (G_TYPE_MODULE (module));
g_free (path);
}
gboolean
/*
* Registers the given plugin type
*/
void
meta_plugin_manager_register (MetaPluginManager *plugin_mgr,
GType plugin_type)
{
MetaPlugin *plugin;
plugin_types = g_slist_prepend (plugin_types, GSIZE_TO_POINTER (plugin_type));
plugin = g_object_new (plugin_type, NULL);
plugin_mgr->plugins = g_list_prepend (plugin_mgr->plugins, plugin);
}
void
meta_plugin_manager_initialize (MetaPluginManager *plugin_mgr)
{
GList *iter;
if (!plugin_mgr->plugins)
{
/*
* If no plugins are specified, load the default plugin.
*/
meta_plugin_manager_load (plugin_mgr, "default");
}
for (iter = plugin_mgr->plugins; iter; iter = iter->next)
{
MetaPlugin *plugin = (MetaPlugin*) iter->data;
@@ -321,26 +128,6 @@ meta_plugin_manager_initialize (MetaPluginManager *plugin_mgr)
if (klass->start)
klass->start (plugin);
}
return TRUE;
}
/*
* Reloads all plugins
*/
static gboolean
meta_plugin_manager_reload (MetaPluginManager *plugin_mgr)
{
/* TODO -- brute force; should we build a list of plugins to load and list of
* plugins to unload? We are probably not going to have large numbers of
* plugins loaded at the same time, so it might not be worth it.
*/
/* Prevent stale grabs on unloaded plugins */
meta_check_end_modal (plugin_mgr->screen);
meta_plugin_manager_unload (plugin_mgr);
return meta_plugin_manager_load (plugin_mgr);
}
static MetaPluginManager *
@@ -348,15 +135,8 @@ meta_plugin_manager_new (MetaScreen *screen)
{
MetaPluginManager *plugin_mgr;
if (!plugin_modules)
{
plugin_modules = g_hash_table_new_full (g_str_hash, g_str_equal, g_free,
NULL);
}
plugin_mgr = g_new0 (MetaPluginManager, 1);
plugin_mgr->screen = screen;
plugin_mgr->screen = screen;
if (screen)
g_object_set_data (G_OBJECT (screen), "meta-plugin-manager", plugin_mgr);
@@ -397,7 +177,20 @@ meta_plugin_manager_get (MetaScreen *screen)
}
else
{
return meta_plugin_manager_new (screen);
GSList *iter;
GType plugin_type;
MetaPlugin *plugin;
plugin_mgr = meta_plugin_manager_new (screen);
for (iter = plugin_types; iter; iter = iter->next)
{
plugin_type = (GType)GPOINTER_TO_SIZE (iter->data);
plugin = g_object_new (plugin_type, "screen", screen, NULL);
plugin_mgr->plugins = g_list_prepend (plugin_mgr->plugins, plugin);
}
return plugin_mgr;
}
}

View File

@@ -24,11 +24,11 @@
#ifndef META_PLUGIN_MANAGER_H_
#define META_PLUGIN_MANAGER_H_
#include "types.h"
#include "screen.h"
#include <meta/types.h>
#include <meta/screen.h>
#define META_PLUGIN_FROM_MANAGER_
#include "meta-plugin.h"
#include <meta/meta-plugin.h>
#undef META_PLUGIN_FROM_MANAGER_
#define META_PLUGIN_MINIMIZE (1<<0)
@@ -49,8 +49,12 @@ typedef struct MetaPluginManager MetaPluginManager;
MetaPluginManager * meta_plugin_manager_get (MetaScreen *screen);
MetaPluginManager * meta_plugin_manager_get_default (void);
gboolean meta_plugin_manager_load (MetaPluginManager *mgr);
gboolean meta_plugin_manager_initialize (MetaPluginManager *plugin_mgr);
void meta_plugin_manager_load (MetaPluginManager *mgr,
const gchar *plugin_name);
void meta_plugin_manager_register (MetaPluginManager *mgr,
GType plugin_type);
void meta_plugin_manager_initialize (MetaPluginManager *mgr);
gboolean meta_plugin_manager_event_simple (MetaPluginManager *mgr,
MetaWindowActor *actor,
unsigned long event);

View File

@@ -21,9 +21,10 @@
* 02111-1307, USA.
*/
#include "meta-plugin.h"
#include "screen.h"
#include "display.h"
#include <meta/meta-plugin.h>
#include "meta-plugin-manager.h"
#include <meta/screen.h>
#include <meta/display.h>
#include <string.h>
#include <X11/Xlib.h>
@@ -43,7 +44,6 @@ enum
{
PROP_0,
PROP_SCREEN,
PROP_PARAMS,
PROP_FEATURES,
PROP_DISABLED,
PROP_DEBUG_MODE,
@@ -52,7 +52,6 @@ enum
struct _MetaPluginPrivate
{
MetaScreen *screen;
gchar *params;
gulong features;
gint running;
@@ -61,6 +60,46 @@ struct _MetaPluginPrivate
gboolean debug : 1;
};
static void
meta_plugin_set_features (MetaPlugin *plugin)
{
MetaPluginPrivate *priv = plugin->priv;
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
priv->features = 0;
/*
* Feature flags: identify events that the plugin can handle; a plugin can
* handle one or more events.
*/
if (klass->minimize)
priv->features |= META_PLUGIN_MINIMIZE;
if (klass->maximize)
priv->features |= META_PLUGIN_MAXIMIZE;
if (klass->unmaximize)
priv->features |= META_PLUGIN_UNMAXIMIZE;
if (klass->map)
priv->features |= META_PLUGIN_MAP;
if (klass->destroy)
priv->features |= META_PLUGIN_DESTROY;
if (klass->switch_workspace)
priv->features |= META_PLUGIN_SWITCH_WORKSPACE;
}
static void
meta_plugin_constructed (GObject *object)
{
meta_plugin_set_features (META_PLUGIN (object));
if (G_OBJECT_CLASS (meta_plugin_parent_class)->constructed)
G_OBJECT_CLASS (meta_plugin_parent_class)->constructed (object);
}
static void
meta_plugin_dispose (GObject *object)
{
@@ -70,97 +109,9 @@ meta_plugin_dispose (GObject *object)
static void
meta_plugin_finalize (GObject *object)
{
MetaPluginPrivate *priv = META_PLUGIN (object)->priv;
g_free (priv->params);
priv->params = NULL;
G_OBJECT_CLASS (meta_plugin_parent_class)->finalize (object);
}
static void
meta_plugin_parse_params (MetaPlugin *plugin)
{
char *p;
gulong features = 0;
MetaPluginPrivate *priv = plugin->priv;
MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin);
/*
* Feature flags: identify events that the plugin can handle; a plugin can
* handle one or more events.
*/
if (klass->minimize)
features |= META_PLUGIN_MINIMIZE;
if (klass->maximize)
features |= META_PLUGIN_MAXIMIZE;
if (klass->unmaximize)
features |= META_PLUGIN_UNMAXIMIZE;
if (klass->map)
features |= META_PLUGIN_MAP;
if (klass->destroy)
features |= META_PLUGIN_DESTROY;
if (klass->switch_workspace)
features |= META_PLUGIN_SWITCH_WORKSPACE;
if (priv->params)
{
gboolean debug = FALSE;
if ((p = strstr (priv->params, "disable:")))
{
gchar *d = g_strdup (p+8);
p = strchr (d, ';');
if (p)
*p = 0;
if (strstr (d, "minimize"))
features &= ~ META_PLUGIN_MINIMIZE;
if (strstr (d, "maximize"))
features &= ~ META_PLUGIN_MAXIMIZE;
if (strstr (d, "unmaximize"))
features &= ~ META_PLUGIN_UNMAXIMIZE;
if (strstr (d, "map"))
features &= ~ META_PLUGIN_MAP;
if (strstr (d, "destroy"))
features &= ~ META_PLUGIN_DESTROY;
if (strstr (d, "switch-workspace"))
features &= ~META_PLUGIN_SWITCH_WORKSPACE;
g_free (d);
}
if (strstr (priv->params, "debug"))
debug = TRUE;
if (debug != priv->debug)
{
priv->debug = debug;
g_object_notify (G_OBJECT (plugin), "debug-mode");
}
}
if (features != priv->features)
{
priv->features = features;
g_object_notify (G_OBJECT (plugin), "features");
}
}
static void
meta_plugin_set_property (GObject *object,
guint prop_id,
@@ -174,10 +125,6 @@ meta_plugin_set_property (GObject *object,
case PROP_SCREEN:
priv->screen = g_value_get_object (value);
break;
case PROP_PARAMS:
priv->params = g_value_dup_string (value);
meta_plugin_parse_params (META_PLUGIN (object));
break;
case PROP_DISABLED:
priv->disabled = g_value_get_boolean (value);
break;
@@ -203,9 +150,6 @@ meta_plugin_get_property (GObject *object,
case PROP_SCREEN:
g_value_set_object (value, priv->screen);
break;
case PROP_PARAMS:
g_value_set_string (value, priv->params);
break;
case PROP_DISABLED:
g_value_set_boolean (value, priv->disabled);
break;
@@ -227,6 +171,7 @@ meta_plugin_class_init (MetaPluginClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
gobject_class->constructed = meta_plugin_constructed;
gobject_class->finalize = meta_plugin_finalize;
gobject_class->dispose = meta_plugin_dispose;
gobject_class->set_property = meta_plugin_set_property;
@@ -240,15 +185,6 @@ meta_plugin_class_init (MetaPluginClass *klass)
META_TYPE_SCREEN,
G_PARAM_READWRITE));
g_object_class_install_property (gobject_class,
PROP_PARAMS,
g_param_spec_string ("params",
"Parameters",
"Plugin Parameters",
NULL,
G_PARAM_READWRITE |
G_PARAM_CONSTRUCT));
g_object_class_install_property (gobject_class,
PROP_FEATURES,
g_param_spec_ulong ("features",
@@ -613,3 +549,18 @@ meta_plugin_get_screen (MetaPlugin *plugin)
return priv->screen;
}
/**
* meta_plugin_type_register:
* @plugin_type: a #MetaPlugin type
*
* Register @plugin_type as a compositor plugin type to be used.
* You must call this before calling meta_init().
*/
void
meta_plugin_type_register (GType plugin_type)
{
MetaPluginManager *plugin_manager;
plugin_manager = meta_plugin_manager_get_default ();
meta_plugin_manager_register (plugin_manager, plugin_type);
}

View File

@@ -28,7 +28,7 @@
#include <cairo.h>
#include <clutter/clutter.h>
#include "meta-window-shape.h"
#include "meta-shadow-factory.h"
#include <meta/meta-shadow-factory.h>
/**
* MetaShadow:

View File

@@ -187,8 +187,10 @@ meta_shaped_texture_dirty_mask (MetaShapedTexture *stex)
cogl_texture_get_gl_texture (priv->mask_texture,
&mask_gl_tex, &mask_gl_target);
#ifdef GL_TEXTURE_RECTANGLE_ARB
if (mask_gl_target == GL_TEXTURE_RECTANGLE_ARB)
glDeleteTextures (1, &mask_gl_tex);
#endif
cogl_handle_unref (priv->mask_texture);
priv->mask_texture = COGL_INVALID_HANDLE;
@@ -253,6 +255,7 @@ meta_shaped_texture_ensure_mask (MetaShapedTexture *stex)
cogl_texture_get_gl_texture (paint_tex, NULL, &paint_gl_target);
#ifdef GL_TEXTURE_RECTANGLE_ARB
if (paint_gl_target == GL_TEXTURE_RECTANGLE_ARB)
{
GLuint tex;
@@ -275,6 +278,7 @@ meta_shaped_texture_ensure_mask (MetaShapedTexture *stex)
COGL_PIXEL_FORMAT_A_8);
}
else
#endif /* GL_TEXTURE_RECTANGLE_ARB */
priv->mask_texture = cogl_texture_new_from_data (tex_width, tex_height,
COGL_TEXTURE_NONE,
COGL_PIXEL_FORMAT_A_8,

View File

@@ -31,6 +31,8 @@
#include <clutter/clutter.h>
#ifdef HAVE_GLX_TEXTURE_PIXMAP
#include <clutter/glx/clutter-glx.h>
#else
#include <clutter/x11/clutter-x11.h>
#endif /* HAVE_GLX_TEXTURE_PIXMAP */
G_BEGIN_DECLS

View File

@@ -97,6 +97,7 @@ meta_texture_tower_free (MetaTextureTower *tower)
g_slice_free (MetaTextureTower, tower);
}
#ifdef GL_TEXTURE_RECTANGLE_ARB
static gboolean
texture_is_rectangle (CoglHandle texture)
{
@@ -106,10 +107,12 @@ texture_is_rectangle (CoglHandle texture)
cogl_texture_get_gl_texture (texture, &gl_tex, &gl_target);
return gl_target == GL_TEXTURE_RECTANGLE_ARB;
}
#endif /* GL_TEXTURE_RECTANGLE_ARB */
static void
free_texture (CoglHandle texture)
{
#ifdef GL_TEXTURE_RECTANGLE_ARB
GLuint gl_tex;
GLenum gl_target;
@@ -117,6 +120,7 @@ free_texture (CoglHandle texture)
if (gl_target == GL_TEXTURE_RECTANGLE_ARB)
glDeleteTextures (1, &gl_tex);
#endif /* GL_TEXTURE_RECTANGLE_ARB */
cogl_handle_unref (texture);
}
@@ -362,11 +366,13 @@ get_paint_level (int width, int height)
return (int)(0.5 + lambda);
}
#ifdef GL_TEXTURE_RECTANGLE_ARB
static gboolean
is_power_of_two (int x)
{
return (x & (x - 1)) == 0;
}
#endif /* GL_TEXTURE_RECTANGLE_ARB */
static void
texture_tower_create_texture (MetaTextureTower *tower,
@@ -374,6 +380,7 @@ texture_tower_create_texture (MetaTextureTower *tower,
int width,
int height)
{
#ifdef GL_TEXTURE_RECTANGLE_ARB
if ((!is_power_of_two (width) || !is_power_of_two (height)) &&
texture_is_rectangle (tower->textures[level - 1]))
{
@@ -396,6 +403,7 @@ texture_tower_create_texture (MetaTextureTower *tower,
TEXTURE_FORMAT);
}
else
#endif /* GL_TEXTURE_RECTANGLE_ARB */
{
tower->textures[level] = cogl_texture_new_with_size (width, height,
COGL_TEXTURE_NO_AUTO_MIPMAP,

View File

@@ -6,7 +6,7 @@
#include <config.h>
#include <X11/extensions/Xdamage.h>
#include "compositor-mutter.h"
#include <meta/compositor-mutter.h>
MetaWindowActor *meta_window_actor_new (MetaWindow *window);

View File

@@ -1,5 +1,7 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#include <config.h>
#define _ISOC99_SOURCE /* for roundf */
#include <math.h>
@@ -11,10 +13,10 @@
#include <clutter/x11/clutter-x11.h>
#include <gdk/gdk.h> /* for gdk_rectangle_union() */
#include "display.h"
#include "errors.h"
#include <meta/display.h>
#include <meta/errors.h>
#include "frame.h"
#include "window.h"
#include <meta/window.h>
#include "xprops.h"
#include "compositor-private.h"
@@ -22,6 +24,15 @@
#include "meta-shaped-texture.h"
#include "meta-window-actor-private.h"
enum {
POSITION_CHANGED,
SIZE_CHANGED,
LAST_SIGNAL
};
static guint signals[LAST_SIGNAL] = {0};
struct _MetaWindowActorPrivate
{
XWindowAttributes attrs;
@@ -273,6 +284,21 @@ meta_window_actor_class_init (MetaWindowActorClass *klass)
g_object_class_install_property (object_class,
PROP_SHADOW_CLASS,
pspec);
signals[POSITION_CHANGED] =
g_signal_new ("position-changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
signals[SIZE_CHANGED] =
g_signal_new ("size-changed",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0, NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
}
static void
@@ -299,7 +325,6 @@ window_decorated_notify (MetaWindow *mw,
MetaDisplay *display = meta_screen_get_display (screen);
Display *xdisplay = meta_display_get_xdisplay (display);
Window new_xwindow;
MetaCompScreen *info;
XWindowAttributes attrs;
/*
@@ -315,8 +340,6 @@ window_decorated_notify (MetaWindow *mw,
meta_window_actor_detach (self);
info = meta_screen_get_compositor_data (screen);
/*
* First of all, clean up any resources we are currently using and will
* be replacing.
@@ -350,6 +373,14 @@ window_decorated_notify (MetaWindow *mw,
meta_window_actor_constructed (G_OBJECT (self));
}
static void
window_appears_focused_notify (MetaWindow *mw,
GParamSpec *arg1,
gpointer data)
{
clutter_actor_queue_redraw (CLUTTER_ACTOR (data));
}
static void
meta_window_actor_constructed (GObject *object)
{
@@ -360,9 +391,6 @@ meta_window_actor_constructed (GObject *object)
Window xwindow = priv->xwindow;
Display *xdisplay = meta_display_get_xdisplay (display);
XRenderPictFormat *format;
MetaCompositor *compositor;
compositor = meta_display_get_compositor (display);
#ifdef HAVE_SHAPE
/* Listen for ShapeNotify events on the window */
@@ -383,8 +411,6 @@ meta_window_actor_constructed (GObject *object)
if (format && format->type == PictTypeDirect && format->direct.alphaMask)
priv->argb32 = TRUE;
meta_window_actor_update_opacity (self);
if (!priv->actor)
{
priv->actor = meta_shaped_texture_new ();
@@ -402,6 +428,8 @@ meta_window_actor_constructed (GObject *object)
g_signal_connect (priv->window, "notify::decorated",
G_CALLBACK (window_decorated_notify), self);
g_signal_connect (priv->window, "notify::appears-focused",
G_CALLBACK (window_appears_focused_notify), self);
}
else
{
@@ -412,7 +440,7 @@ meta_window_actor_constructed (GObject *object)
clutter_actor_raise_top (priv->actor);
}
meta_window_actor_update_opacity (self);
meta_window_actor_update_shape (self, priv->shaped);
}
@@ -477,6 +505,12 @@ meta_window_actor_dispose (GObject *object)
info->windows = g_list_remove (info->windows, (gconstpointer) self);
if (priv->window)
{
g_object_unref (priv->window);
priv->window = NULL;
}
/*
* Release the extra reference we took on the actor.
*/
@@ -509,7 +543,11 @@ meta_window_actor_set_property (GObject *object,
switch (prop_id)
{
case PROP_META_WINDOW:
priv->window = g_value_get_object (value);
{
if (priv->window)
g_object_unref (priv->window);
priv->window = g_value_dup_object (value);
}
break;
case PROP_META_SCREEN:
priv->screen = g_value_get_pointer (value);
@@ -685,7 +723,7 @@ meta_window_actor_paint (ClutterActor *actor)
params.y_offset + shape_bounds.y,
shape_bounds.width,
shape_bounds.height,
(clutter_actor_get_paint_opacity (actor) * params.opacity) / 255,
(clutter_actor_get_paint_opacity (actor) * params.opacity * priv->opacity) / (255 * 255),
priv->shadow_clip);
}
@@ -881,6 +919,19 @@ meta_window_actor_get_texture (MetaWindowActor *self)
return self->priv->actor;
}
/**
* meta_window_actor_is_destroyed:
*
* Gets whether the X window that the actor was displaying has been destroyed
*
* Return value: %TRUE when the window is destroyed, otherwise %FALSE
*/
gboolean
meta_window_actor_is_destroyed (MetaWindowActor *self)
{
return self->priv->disposed;
}
gboolean
meta_window_actor_is_override_redirect (MetaWindowActor *self)
{
@@ -1307,6 +1358,8 @@ meta_window_actor_sync_actor_position (MetaWindowActor *self)
window_rect.x, window_rect.y);
clutter_actor_set_size (CLUTTER_ACTOR (self),
window_rect.width, window_rect.height);
g_signal_emit (self, signals[POSITION_CHANGED], 0);
}
void
@@ -1598,6 +1651,8 @@ meta_window_actor_update_bounding_region (MetaWindowActor *self,
*/
if (!priv->shaped)
meta_window_actor_invalidate_shadow (self);
g_signal_emit (self, signals[SIZE_CHANGED], 0);
}
static void
@@ -1633,7 +1688,7 @@ meta_window_actor_get_obscured_region (MetaWindowActor *self)
{
MetaWindowActorPrivate *priv = self->priv;
if (!priv->argb32 && priv->back_pixmap)
if (!priv->argb32 && priv->opacity == 0xff && priv->back_pixmap)
{
if (priv->shaped)
return priv->shape_region;
@@ -1762,7 +1817,6 @@ check_needs_pixmap (MetaWindowActor *self)
MetaCompScreen *info = meta_screen_get_compositor_data (screen);
MetaCompositor *compositor;
Window xwindow = priv->xwindow;
gboolean full = FALSE;
if (!priv->needs_pixmap)
return;
@@ -1823,9 +1877,11 @@ check_needs_pixmap (MetaWindowActor *self)
* do it here.
* See: http://bugzilla.clutter-project.org/show_bug.cgi?id=2236
*/
#ifdef HAVE_GLX_TEXTURE_PIXMAP
if (G_UNLIKELY (!clutter_glx_texture_pixmap_using_extension (
CLUTTER_GLX_TEXTURE_PIXMAP (priv->actor))))
g_warning ("NOTE: Not using GLX TFP!\n");
#endif
g_object_get (priv->actor,
"pixmap-width", &pxm_width,
@@ -1833,8 +1889,6 @@ check_needs_pixmap (MetaWindowActor *self)
NULL);
meta_window_actor_update_bounding_region (self, pxm_width, pxm_height);
full = TRUE;
}
meta_error_trap_pop (display);
@@ -2091,5 +2145,5 @@ meta_window_actor_update_opacity (MetaWindowActor *self)
opacity = 255;
self->priv->opacity = opacity;
clutter_actor_set_opacity (CLUTTER_ACTOR (self), opacity);
clutter_actor_set_opacity (self->priv->actor, opacity);
}

View File

@@ -5,7 +5,7 @@
#include <clutter/clutter.h>
#include "screen.h"
#include <meta/screen.h>
/**
* MetaWindowGroup:

View File

@@ -1,7 +1,7 @@
pkglibdir=@MUTTER_PLUGIN_DIR@
INCLUDES=@MUTTER_CFLAGS@ -I $(top_srcdir)/src/include -DMUTTER_LIBEXECDIR=\"$(libexecdir)\" -DHOST_ALIAS=\"@HOST_ALIAS@\" -DMUTTER_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" -DMUTTER_PKGDATADIR=\"$(pkgdatadir)\" -DMUTTER_DATADIR=\"$(datadir)\" -DG_LOG_DOMAIN=\"mutter\" -DSN_API_NOT_YET_FROZEN=1 -DMUTTER_MAJOR_VERSION=$(MUTTER_MAJOR_VERSION) -DMUTTER_MINOR_VERSION=$(MUTTER_MINOR_VERSION) -DMUTTER_MICRO_VERSION=$(MUTTER_MICRO_VERSION) -DMUTTER_PLUGIN_API_VERSION=$(MUTTER_PLUGIN_API_VERSION) -DMUTTER_PLUGIN_DIR=\"@MUTTER_PLUGIN_DIR@\"
INCLUDES=@MUTTER_CFLAGS@ -I $(top_srcdir)/src -DMUTTER_LIBEXECDIR=\"$(libexecdir)\" -DHOST_ALIAS=\"@HOST_ALIAS@\" -DMUTTER_LOCALEDIR=\"$(prefix)/@DATADIRNAME@/locale\" -DMUTTER_PKGDATADIR=\"$(pkgdatadir)\" -DMUTTER_DATADIR=\"$(datadir)\" -DG_LOG_DOMAIN=\"mutter\" -DSN_API_NOT_YET_FROZEN=1 -DMUTTER_MAJOR_VERSION=$(MUTTER_MAJOR_VERSION) -DMUTTER_MINOR_VERSION=$(MUTTER_MINOR_VERSION) -DMUTTER_MICRO_VERSION=$(MUTTER_MICRO_VERSION) -DMUTTER_PLUGIN_API_VERSION=$(MUTTER_PLUGIN_API_VERSION) -DMUTTER_PLUGIN_DIR=\"@MUTTER_PLUGIN_DIR@\"
default_la_CFLAGS = -fPIC
default_la_SOURCES = default.c

View File

@@ -1,41 +0,0 @@
Plugins implement effects associated with WM events, such as window map,
minimizing, maximizing, unmaximizing, destruction and workspace switching. The
plugin API is documented in src/include/compositor-clutter-plugin.h; in
addition the simple plugin can be used as a reference implementation.
The API is intended to be generic, exposing no implementation details of the WM
to the plugins; this will facilitate reuse without modification with another WM
(there are plans to use the same plugin API with Matchbox 2).
Multiple plugins can implement the same effect and be loaded at the same time;
however, stacking arbitrary effects in this way might not work as expected;
this is particularly true of more complex effects, such as those for workspace
switching.
Plugins are installed in ${prefix}/lib/metacity/plugins/clutter; from there the
WM will load plugins listed in the clutter_plugins key in the Metacity gconf
general preferences group. Each entry in preferences has the format
'name: optional parameters'
where 'name' is the name of the library without the .so suffix.
As noted above, additional parameters can be passed to the plugin via the
preference key. In such case, the plugin name is immediately followed by a
colon, separating it from the parameters. Two common parameters should be
handled by all plugins:
'debug' indicates that the plugin is run in a debug mode (what exactly that
means is left to the plugin to determine).
'disable' parameter indicates which effects within the plugin should be
disabled; the format of the disable parameter is
'disable: effect1[, effect2];'
where effect1, etc., matches the effects listed in the
compositor-clutter-plugin.h file (currently one of 'map', 'destroy',
'maximize', 'unmaximize', 'switch-workspace'). Example 'disable:
minimize, maximize;'.

View File

@@ -21,8 +21,8 @@
* 02111-1307, USA.
*/
#include "meta-plugin.h"
#include "window.h"
#include <meta/meta-plugin.h>
#include <meta/window.h>
#include <libintl.h>
#define _(x) dgettext (GETTEXT_PACKAGE, x)
@@ -319,12 +319,10 @@ switch_workspace (MetaPlugin *plugin,
{
MetaDefaultPluginPrivate *priv = META_DEFAULT_PLUGIN (plugin)->priv;
GList *l;
gint n_workspaces;
ClutterActor *workspace0 = clutter_group_new ();
ClutterActor *workspace1 = clutter_group_new ();
ClutterActor *stage;
int screen_width, screen_height;
MetaScreen *screen = meta_plugin_get_screen (plugin);
ClutterAnimation *animation;
stage = meta_plugin_get_stage (plugin);
@@ -350,8 +348,6 @@ switch_workspace (MetaPlugin *plugin,
return;
}
n_workspaces = meta_screen_get_n_workspaces (screen);
l = g_list_last (meta_plugin_get_window_actors (plugin));
while (l)

View File

@@ -180,7 +180,7 @@ meta_region_iterator_next (MetaRegionIterator *iter)
iter->rectangle = iter->next_rectangle;
iter->line_start = iter->line_end;
if (iter->i < iter->n_rectangles)
if (iter->i + 1 < iter->n_rectangles)
{
cairo_region_get_rectangle (iter->region, iter->i + 1, &iter->next_rectangle);
iter->line_end = iter->next_rectangle.y != iter->rectangle.y;
@@ -248,7 +248,6 @@ expand_region_inverse (cairo_region_t *region,
MetaRegionBuilder builder;
MetaRegionIterator iter;
cairo_rectangle_int_t extents;
cairo_region_t *chunk;
int last_x;
@@ -268,16 +267,11 @@ expand_region_inverse (cairo_region_t *region,
extents.x, extents.y + extents.height, extents.width, 1,
x_amount, y_amount, flip);
chunk = NULL;
last_x = extents.x;
for (meta_region_iterator_init (&iter, region);
!meta_region_iterator_at_end (&iter);
meta_region_iterator_next (&iter))
{
if (chunk == NULL)
chunk = cairo_region_create ();
if (iter.rectangle.x > last_x)
add_expanded_rect (&builder,
last_x, iter.rectangle.y,

View File

@@ -0,0 +1,243 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/* Find the keycode for the key above the tab key */
/*
* Copyright 2010 Red Hat, Inc.
*
* 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.
*/
/* The standard cycle-windows keybinding should be the key above the
* tab key. This will have a different keysym on different keyboards -
* it's the ` (grave) key on US keyboards but something else on many
* other national layouts. So we need to figure out the keycode for
* this key without reference to key symbol.
*
* The "correct" way to do this is to get the XKB geometry from the
* X server, find the Tab key, find the key above the Tab key in the
* same section and use the keycode for that key. This is what I
* implemented here, but unfortunately, fetching the geometry is rather
* slow (It could take 20ms or more.)
*
* If you looking for a way to optimize Mutter startup performance:
* On all Linux systems using evdev the key above TAB will have
* keycode 49. (KEY_GRAVE=41 + the 8 code point offset between
* evdev keysyms and X keysyms.) So a configure option
* --with-above-tab-keycode=49 could be added that bypassed this
* code. It wouldn't work right for displaying Mutter remotely
* to a non-Linux X server, but that is pretty rare.
*/
#include <config.h>
#include <string.h>
#include "display-private.h"
#include <X11/keysym.h>
#ifdef HAVE_XKB
#include <X11/XKBlib.h>
#include <X11/extensions/XKBgeom.h>
static guint
compute_above_tab_keycode (Display *xdisplay)
{
XkbDescPtr keyboard;
XkbGeometryPtr geometry;
int i, j, k;
int tab_keycode;
char *tab_name;
XkbSectionPtr tab_section;
XkbBoundsRec tab_bounds;
XkbKeyPtr best_key = NULL;
guint best_keycode = (guint)-1;
int best_x_dist = G_MAXINT;
int best_y_dist = G_MAXINT;
/* We need only the Names and the Geometry, but asking for these results
* in the Keyboard information retrieval failing for unknown reasons.
* (Testing with xorg-1.9.1.) So we ask for a part that we don't need
* as well.
*/
keyboard = XkbGetKeyboard (xdisplay,
XkbGBN_ClientSymbolsMask | XkbGBN_KeyNamesMask | XkbGBN_GeometryMask,
XkbUseCoreKbd);
if (!keyboard)
return best_keycode;
geometry = keyboard->geom;
/* There could potentially be multiple keys with the Tab keysym on the keyboard;
* but XKeysymToKeycode() returns us the one that the alt-Tab binding will
* use which is good enough
*/
tab_keycode = XKeysymToKeycode (xdisplay, XK_Tab);
if (tab_keycode == 0 || tab_keycode < keyboard->min_key_code || tab_keycode > keyboard->max_key_code)
goto out;
/* The keyboard geometry is stored by key "name" rather than keycode.
* (Key names are 4-character strings like like TAB or AE01.) We use the
* 'names' part of the keyboard description to map keycode to key name.
*
* XKB has a "key aliases" feature where a single keyboard key can have
* multiple names (with separate sets of aliases in the 'names' part and
* in the 'geometry' part), but I don't really understand it or how it is used,
* so I'm ignoring it here.
*/
tab_name = keyboard->names->keys[tab_keycode].name; /* Not NULL terminated! */
/* First, iterate through the keyboard geometry to find the tab key; the keyboard
* geometry has a three-level heirarchy of section > row > key
*/
for (i = 0; i < geometry->num_sections; i++)
{
XkbSectionPtr section = &geometry->sections[i];
for (j = 0; j < section->num_rows; j++)
{
int x = 0;
int y = 0;
XkbRowPtr row = &section->rows[j];
for (k = 0; k < row->num_keys; k++)
{
XkbKeyPtr key = &row->keys[k];
XkbShapePtr shape = XkbKeyShape (geometry, key);
if (row->vertical)
y += key->gap;
else
x += key->gap;
if (strncmp (key->name.name, tab_name, XkbKeyNameLength) == 0)
{
tab_section = section;
tab_bounds = shape->bounds;
tab_bounds.x1 += row->left + x;
tab_bounds.x2 += row->left + x;
tab_bounds.y1 += row->top + y;
tab_bounds.y2 += row->top + y;
goto found_tab;
}
if (row->vertical)
y += (shape->bounds.y2 - shape->bounds.y1);
else
x += (shape->bounds.x2 - shape->bounds.x1);
}
}
}
/* No tab key found */
goto out;
found_tab:
/* Now find the key that:
* - Is in the same section as the Tab key
* - Has a horizontal center in the Tab key's horizonal bounds
* - Is above the Tab key at a distance closer than any other key
* - In case of ties, has its horizontal center as close as possible
* to the Tab key's horizontal center
*/
for (j = 0; j < tab_section->num_rows; j++)
{
int x = 0;
int y = 0;
XkbRowPtr row = &tab_section->rows[j];
for (k = 0; k < row->num_keys; k++)
{
XkbKeyPtr key = &row->keys[k];
XkbShapePtr shape = XkbKeyShape(geometry, key);
XkbBoundsRec bounds = shape->bounds;
int x_center;
int x_dist, y_dist;
if (row->vertical)
y += key->gap;
else
x += key->gap;
bounds.x1 += row->left + x;
bounds.x2 += row->left + x;
bounds.y1 += row->top + y;
bounds.y2 += row->top + y;
y_dist = tab_bounds.y1 - bounds.y2;
if (y_dist < 0)
continue;
x_center = (bounds.x1 + bounds.x2) / 2;
if (x_center < tab_bounds.x1 || x_center > tab_bounds.x2)
continue;
x_dist = ABS (x_center - (tab_bounds.x1 + tab_bounds.x2) / 2);
if (y_dist < best_y_dist ||
(y_dist == best_y_dist && x_dist < best_x_dist))
{
best_key = key;
best_x_dist = x_dist;
best_y_dist = y_dist;
}
if (row->vertical)
y += (shape->bounds.y2 - shape->bounds.y1);
else
x += (shape->bounds.x2 - shape->bounds.x1);
}
}
if (best_key == NULL)
goto out;
/* Now we need to resolve the name of the best key back to a keycode */
for (i = keyboard->min_key_code; i < keyboard->max_key_code; i++)
{
if (strncmp (best_key->name.name, keyboard->names->keys[i].name, XkbKeyNameLength) == 0)
{
best_keycode = i;
break;
}
}
out:
XkbFreeKeyboard (keyboard, 0, True);
return best_keycode;
}
#else /* !HAVE_XKB */
static guint
compute_above_tab_keycode (Display *xdisplay)
{
return XKeysymToKeycode (xdisplay, XK_grave);
}
#endif /* HAVE_XKB */
guint
meta_display_get_above_tab_keycode (MetaDisplay *display)
{
if (display->above_tab_keycode == 0) /* not yet computed */
display->above_tab_keycode = compute_above_tab_keycode (display->xdisplay);
if (display->above_tab_keycode == (guint)-1) /* failed to compute */
return 0;
else
return display->above_tab_keycode;
}

View File

@@ -146,7 +146,7 @@ keybind (switch_to_workspace_down, handle_switch_to_workspace,
*/
keybind (switch_group, handle_switch, META_TAB_LIST_GROUP,
BINDING_REVERSES, NULL,
BINDING_REVERSES, "<Alt>Above_Tab",
_("Move between windows of an application, using a popup window"))
keybind (switch_group_backward, handle_switch, META_TAB_LIST_GROUP,
REVERSES_AND_REVERSED, NULL,
@@ -167,7 +167,7 @@ keybind (switch_panels_backward, handle_switch, META_TAB_LIST_DOCKS,
"using a popup window"))
keybind (cycle_group, handle_cycle, META_TAB_LIST_GROUP,
BINDING_REVERSES, "<Alt>grave",
BINDING_REVERSES, "<Alt>F6",
_("Move between windows of an application immediately"))
keybind (cycle_group_backward, handle_cycle, META_TAB_LIST_GROUP,
REVERSES_AND_REVERSED, NULL,

View File

@@ -51,7 +51,7 @@
#include <config.h>
#include "bell.h"
#include "screen-private.h"
#include "prefs.h"
#include <meta/prefs.h>
#ifdef HAVE_LIBCANBERRA
#include <canberra-gtk.h>
#endif
@@ -149,7 +149,7 @@ bell_flash_screen (MetaDisplay *display,
#ifdef HAVE_XKB
static void
bell_flash_fullscreen (MetaDisplay *display,
XkbAnyEvent *xkb_ev)
XkbAnyEvent *xkb_ev)
{
XkbBellNotifyEvent *xkb_bell_ev = (XkbBellNotifyEvent *) xkb_ev;
MetaScreen *screen;
@@ -159,7 +159,12 @@ bell_flash_fullscreen (MetaDisplay *display,
{
screen = meta_display_screen_for_xwindow (display, xkb_bell_ev->window);
if (screen)
bell_flash_screen (display, screen);
{
if (display->compositor)
meta_compositor_flash_screen (display->compositor, screen);
else
bell_flash_screen (display, screen);
}
}
else
{
@@ -167,7 +172,10 @@ bell_flash_fullscreen (MetaDisplay *display,
while (screen_list)
{
screen = (MetaScreen *) screen_list->data;
bell_flash_screen (display, screen);
if (display->compositor)
meta_compositor_flash_screen (display->compositor, screen);
else
bell_flash_screen (display, screen);
screen_list = screen_list->next;
}
}

View File

@@ -36,7 +36,7 @@
#include <X11/XKBlib.h>
#endif
#include "display-private.h"
#include "frame-private.h"
#include "frame.h"
#ifdef HAVE_XKB
/**

View File

@@ -25,8 +25,8 @@
#define META_BOXES_PRIVATE_H
#include <glib-object.h>
#include "common.h"
#include "boxes.h"
#include <meta/common.h>
#include <meta/boxes.h>
#define BOX_LEFT(box) ((box).x) /* Leftmost pixel of rect */
#define BOX_RIGHT(box) ((box).x + (box).width) /* One pixel past right */

View File

@@ -27,7 +27,7 @@
*/
#include "boxes-private.h"
#include "util.h"
#include <meta/util.h>
#include <X11/Xutil.h> /* Just for the definition of the various gravities */
/* It would make sense to use GSlice here, but until we clean up the
@@ -179,6 +179,16 @@ meta_rectangle_area (const MetaRectangle *rect)
return rect->width * rect->height;
}
/**
* meta_rectangle_intersect:
* @src1: a #MetaRectangle
* @src2: another #MetaRectangle
* @dest: (out caller-allocates): an empty #MetaRectangle, to be filled
* with the coordinates of the intersection.
*
* Returns: TRUE is some intersection exists and is not degenerate, FALSE
* otherwise.
*/
gboolean
meta_rectangle_intersect (const MetaRectangle *src1,
const MetaRectangle *src2,
@@ -226,6 +236,13 @@ meta_rectangle_equal (const MetaRectangle *src1,
(src1->height == src2->height));
}
/**
* meta_rectangle_union:
* @rect1: a #MetaRectangle
* @rect2: another #MetaRectangle
* @dest: (out caller-allocates): an empty #MetaRectangle, to be filled
* with the coordinates of the bounding box.
*/
void
meta_rectangle_union (const MetaRectangle *rect1,
const MetaRectangle *rect2,
@@ -340,7 +357,6 @@ meta_rectangle_resize_with_gravity (const MetaRectangle *old_rect,
*/
/* First, the x direction */
int adjust = 0;
switch (gravity)
{
case NorthWestGravity:
@@ -373,7 +389,6 @@ meta_rectangle_resize_with_gravity (const MetaRectangle *old_rect,
rect->width = new_width;
/* Next, the y direction */
adjust = 0;
switch (gravity)
{
case NorthWestGravity:

View File

@@ -28,7 +28,7 @@
#include "constraints.h"
#include "workspace-private.h"
#include "place.h"
#include "prefs.h"
#include <meta/prefs.h>
#include <stdlib.h>
#include <math.h>
@@ -142,6 +142,11 @@ typedef struct
GList *usable_screen_region;
GList *usable_monitor_region;
} ConstraintInfo;
static gboolean do_screen_and_monitor_relative_constraints (MetaWindow *window,
GList *region_spanning_rectangles,
ConstraintInfo *info,
gboolean check_only);
static gboolean constrain_modal_dialog (MetaWindow *window,
ConstraintInfo *info,
ConstraintPriority priority,
@@ -776,7 +781,12 @@ constrain_modal_dialog (MetaWindow *window,
info->current.y = y;
info->current.x = x;
return TRUE;
/* The calculated position above may need adjustment to make sure the
* dialog does not end up partially off-screen */
return do_screen_and_monitor_relative_constraints (window,
info->usable_screen_region,
info,
check_only);
}
static gboolean
@@ -796,7 +806,7 @@ constrain_maximization (MetaWindow *window,
/* Determine whether constraint applies; exit if it doesn't */
if ((!window->maximized_horizontally && !window->maximized_vertically) ||
META_WINDOW_TILED (window))
META_WINDOW_TILED_SIDE_BY_SIDE (window))
return TRUE;
/* Calculate target_size = maximized size of (window + frame) */
@@ -880,7 +890,7 @@ constrain_tiling (MetaWindow *window,
return TRUE;
/* Determine whether constraint applies; exit if it doesn't */
if (!META_WINDOW_TILED (window))
if (!META_WINDOW_TILED_SIDE_BY_SIDE (window))
return TRUE;
/* Calculate target_size - as the tile previews need this as well, we
@@ -968,7 +978,8 @@ constrain_size_increments (MetaWindow *window,
/* Determine whether constraint applies; exit if it doesn't */
if (META_WINDOW_MAXIMIZED (window) || window->fullscreen ||
META_WINDOW_TILED (window) || info->action_type == ACTION_MOVE)
META_WINDOW_TILED_SIDE_BY_SIDE (window) ||
info->action_type == ACTION_MOVE)
return TRUE;
/* Determine whether constraint is already satisfied; exit if it is */
@@ -1099,7 +1110,8 @@ constrain_aspect_ratio (MetaWindow *window,
constraints_are_inconsistent = minr > maxr;
if (constraints_are_inconsistent ||
META_WINDOW_MAXIMIZED (window) || window->fullscreen ||
META_WINDOW_TILED (window) || info->action_type == ACTION_MOVE)
META_WINDOW_TILED_SIDE_BY_SIDE (window) ||
info->action_type == ACTION_MOVE)
return TRUE;
/* Determine whether constraint is already satisfied; exit if it is. We

View File

@@ -25,9 +25,9 @@
#ifndef META_CONSTRAINTS_H
#define META_CONSTRAINTS_H
#include "util.h"
#include <meta/util.h>
#include "window-private.h"
#include "frame-private.h"
#include "frame.h"
typedef enum
{

View File

@@ -25,10 +25,10 @@
#include <config.h>
#include "core.h"
#include "frame-private.h"
#include "frame.h"
#include "workspace-private.h"
#include "prefs.h"
#include "errors.h"
#include <meta/prefs.h>
#include <meta/errors.h>
/* Looks up the MetaWindow representing the frame of the given X window.
* Used as a helper function by a bunch of the functions below.

View File

@@ -27,7 +27,7 @@
/* Don't include core headers here */
#include <gdk/gdkx.h>
#include "common.h"
#include <meta/common.h>
typedef enum
{

View File

@@ -25,10 +25,10 @@
#define _XOPEN_SOURCE /* for kill() */
#include <config.h>
#include "util.h"
#include <meta/util.h>
#include "window-private.h"
#include "errors.h"
#include "workspace.h"
#include <meta/errors.h>
#include <meta/workspace.h>
#include <sys/types.h>
#include <sys/wait.h>
@@ -103,8 +103,8 @@ delete_ping_timeout_func (MetaDisplay *display,
dialog_pid =
meta_show_dialog ("--question",
window_content, 0,
window->screen->number,
window_content, NULL,
window->screen->screen_name,
_("_Wait"), _("_Force Quit"), window->xwindow,
NULL, NULL);

View File

@@ -34,11 +34,11 @@
#include <glib.h>
#include <X11/Xlib.h>
#include "eventqueue.h"
#include "common.h"
#include "boxes.h"
#include "display.h"
#include <meta/common.h>
#include <meta/boxes.h>
#include <meta/display.h>
#include "keybindings-private.h"
#include "prefs.h"
#include <meta/prefs.h>
#ifdef HAVE_STARTUP_NOTIFICATION
#include <libsn/sn.h>
@@ -77,6 +77,13 @@ typedef enum {
*/
#define N_IGNORED_SERIALS 4
typedef enum {
META_TILE_NONE,
META_TILE_LEFT,
META_TILE_RIGHT,
META_TILE_MAXIMIZED
} MetaTileMode;
struct _MetaDisplay
{
GObject parent_instance;
@@ -92,7 +99,7 @@ struct _MetaDisplay
* class is constructed.
*/
#define item(x) Atom atom_##x;
#include "atomnames.h"
#include <meta/atomnames.h>
#undef item
/* This is the actual window from focus events,
@@ -179,6 +186,7 @@ struct _MetaDisplay
int grab_anchor_root_x;
int grab_anchor_root_y;
MetaRectangle grab_anchor_window_pos;
MetaTileMode grab_tile_mode;
int grab_latest_motion_x;
int grab_latest_motion_y;
gulong grab_mask;
@@ -221,6 +229,7 @@ struct _MetaDisplay
KeySym *keymap;
int keysyms_per_keycode;
XModifierKeymap *modmap;
unsigned int above_tab_keycode;
unsigned int ignored_modifier_mask;
unsigned int num_lock_mask;
unsigned int scroll_lock_mask;
@@ -433,4 +442,7 @@ void meta_display_remove_autoraise_callback (MetaDisplay *display);
void meta_display_overlay_key_activate (MetaDisplay *display);
/* In above-tab-keycode.c */
guint meta_display_get_above_tab_keycode (MetaDisplay *display);
#endif

View File

@@ -34,21 +34,21 @@
#include <config.h>
#include "display-private.h"
#include "util.h"
#include "main.h"
#include <meta/util.h>
#include <meta/main.h>
#include "screen-private.h"
#include "window-private.h"
#include "window-props.h"
#include "group-props.h"
#include "frame-private.h"
#include "errors.h"
#include "frame.h"
#include <meta/errors.h>
#include "keybindings-private.h"
#include "prefs.h"
#include <meta/prefs.h>
#include "resizepopup.h"
#include "xprops.h"
#include "workspace-private.h"
#include "bell.h"
#include "compositor.h"
#include <meta/compositor.h>
#include <X11/Xatom.h>
#include <X11/cursorfont.h>
#ifdef HAVE_SOLARIS_XINERAMA
@@ -387,26 +387,6 @@ enable_compositor (MetaDisplay *display,
}
}
static void
disable_compositor (MetaDisplay *display)
{
GSList *list;
if (!display->compositor)
return;
for (list = display->screens; list != NULL; list = list->next)
{
MetaScreen *screen = list->data;
meta_compositor_unmanage_screen (screen->display->compositor,
screen);
}
meta_compositor_destroy (display->compositor);
display->compositor = NULL;
}
static void
meta_display_init (MetaDisplay *disp)
{
@@ -437,7 +417,7 @@ meta_display_open (void)
/* A list of all atom names, so that we can intern them in one go. */
char *atom_names[] = {
#define item(x) #x,
#include "atomnames.h"
#include <meta/atomnames.h>
#undef item
};
Atom atoms[G_N_ELEMENTS(atom_names)];
@@ -510,7 +490,7 @@ meta_display_open (void)
{
int i = 0;
#define item(x) the_display->atom_##x = atoms[i++];
#include "atomnames.h"
#include <meta/atomnames.h>
#undef item
}
@@ -573,6 +553,7 @@ meta_display_open (void)
the_display->grab_window = NULL;
the_display->grab_screen = NULL;
the_display->grab_resize_popup = NULL;
the_display->grab_tile_mode = META_TILE_NONE;
the_display->grab_edge_resistance_data = NULL;
@@ -839,8 +820,7 @@ meta_display_open (void)
/* We don't composite the windows here because they will be composited
faster with the call to meta_screen_manage_all_windows further down
the code */
if (1) /* meta_prefs_get_compositing_manager ()) FIXME */
enable_compositor (the_display, FALSE);
enable_compositor (the_display, FALSE);
meta_display_grab (the_display);
@@ -1766,9 +1746,10 @@ event_callback (XEvent *event,
* we can get into a confused state. So if a keybinding is
* handled (because it's one of our hot-keys, or because we are
* in a keyboard-grabbed mode like moving a window, we don't
* want to pass the key event to the compositor at all.
* want to pass the key event to the compositor or GTK+ at all.
*/
bypass_compositor = meta_display_process_key_event (display, window, event);
if (meta_display_process_key_event (display, window, event))
filter_out_event = bypass_compositor = TRUE;
break;
case ButtonPress:
if (display->grab_op == META_GRAB_OP_COMPOSITOR)
@@ -2543,12 +2524,6 @@ event_callback (XEvent *event,
meta_workspace_focus_default_window (screen->active_workspace, NULL, timestamp);
}
}
else if (event->xclient.message_type ==
display->atom__MUTTER_RESTART_MESSAGE)
{
meta_verbose ("Received restart request\n");
meta_restart ();
}
else if (event->xclient.message_type ==
display->atom__MUTTER_RELOAD_THEME_MESSAGE)
{
@@ -3519,6 +3494,7 @@ meta_display_begin_grab_op (MetaDisplay *display,
int root_x,
int root_y)
{
MetaWindow *grab_window = NULL;
Window grab_xwindow;
meta_topic (META_DEBUG_WINDOW_OPS,
@@ -3548,14 +3524,25 @@ meta_display_begin_grab_op (MetaDisplay *display,
}
}
/* If window is a modal dialog attached to its parent,
* grab the parent instead for moving.
*/
if (meta_prefs_get_attach_modal_dialogs () &&
window && window->type == META_WINDOW_MODAL_DIALOG &&
meta_grab_op_is_moving (op))
grab_window = meta_window_get_transient_for (window);
if (grab_window == NULL)
grab_window = window;
/* FIXME:
* If we have no MetaWindow we do our best
* and try to do the grab on the RootWindow.
* This will fail if anyone else has any
* key grab on the RootWindow.
*/
if (window)
grab_xwindow = window->frame ? window->frame->xwindow : window->xwindow;
if (grab_window)
grab_xwindow = grab_window->frame ? grab_window->frame->xwindow : grab_window->xwindow;
else
grab_xwindow = screen->xroot;
@@ -3577,9 +3564,9 @@ meta_display_begin_grab_op (MetaDisplay *display,
/* Grab keys for keyboard ops and mouse move/resizes; see #126497 */
if (grab_op_is_keyboard (op) || grab_op_is_mouse_only (op))
{
if (window)
if (grab_window)
display->grab_have_keyboard =
meta_window_grab_all_keys (window, timestamp);
meta_window_grab_all_keys (grab_window, timestamp);
else
display->grab_have_keyboard =
@@ -3596,11 +3583,15 @@ meta_display_begin_grab_op (MetaDisplay *display,
}
display->grab_op = op;
display->grab_window = window;
display->grab_window = grab_window;
display->grab_screen = screen;
display->grab_xwindow = grab_xwindow;
display->grab_button = button;
display->grab_mask = modmask;
if (window)
display->grab_tile_mode = window->tile_mode;
else
display->grab_tile_mode = META_TILE_NONE;
display->grab_anchor_root_x = root_x;
display->grab_anchor_root_y = root_y;
display->grab_latest_motion_x = root_x;
@@ -3797,6 +3788,7 @@ meta_display_end_grab_op (MetaDisplay *display,
display->grab_window = NULL;
display->grab_screen = NULL;
display->grab_xwindow = None;
display->grab_tile_mode = META_TILE_NONE;
display->grab_op = META_GRAB_OP_NONE;
if (display->grab_resize_popup)
@@ -5188,15 +5180,6 @@ prefs_changed_callback (MetaPreference pref,
{
meta_bell_set_audible (display, meta_prefs_bell_is_audible ());
}
else if (pref == META_PREF_COMPOSITING_MANAGER)
{
gboolean cm = meta_prefs_get_compositing_manager ();
if (cm)
enable_compositor (display, TRUE);
else
disable_compositor (display);
}
else if (pref == META_PREF_ATTACH_MODAL_DIALOGS)
{
MetaDisplay *display = data;

View File

@@ -23,7 +23,7 @@
*/
#include <config.h>
#include "errors.h"
#include <meta/errors.h>
#include "display-private.h"
#include <errno.h>
#include <stdlib.h>

View File

@@ -24,9 +24,9 @@
*/
#include <config.h>
#include "frame-private.h"
#include "frame.h"
#include "bell.h"
#include "errors.h"
#include <meta/errors.h>
#include "keybindings-private.h"
#include <X11/extensions/Xrender.h>
@@ -282,7 +282,7 @@ meta_frame_get_flags (MetaFrame *frame)
if (frame->window->shaded)
flags |= META_FRAME_SHADED;
if (frame->window->on_all_workspaces)
if (frame->window->on_all_workspaces_requested)
flags |= META_FRAME_STUCK;
/* FIXME: Should we have some kind of UI for windows that are just vertically
@@ -291,6 +291,12 @@ meta_frame_get_flags (MetaFrame *frame)
if (META_WINDOW_MAXIMIZED (frame->window))
flags |= META_FRAME_MAXIMIZED;
if (META_WINDOW_TILED_LEFT (frame->window))
flags |= META_FRAME_TILED_LEFT;
if (META_WINDOW_TILED_RIGHT (frame->window))
flags |= META_FRAME_TILED_RIGHT;
if (frame->window->fullscreen)
flags |= META_FRAME_FULLSCREEN;

View File

@@ -24,7 +24,6 @@
#ifndef META_FRAME_PRIVATE_H
#define META_FRAME_PRIVATE_H
#include "frame.h"
#include "window-private.h"
typedef struct _MetaFrameGeometry MetaFrameGeometry;
@@ -68,7 +67,8 @@ void meta_window_ensure_frame (MetaWindow *window);
void meta_window_destroy_frame (MetaWindow *window);
void meta_frame_queue_draw (MetaFrame *frame);
MetaFrameFlags meta_frame_get_flags (MetaFrame *frame);
MetaFrameFlags meta_frame_get_flags (MetaFrame *frame);
Window meta_frame_get_xwindow (MetaFrame *frame);
/* These should ONLY be called from meta_window_move_resize_internal */
void meta_frame_calc_geometry (MetaFrame *frame,

View File

@@ -24,7 +24,7 @@
#ifndef META_GROUP_PRIVATE_H
#define META_GROUP_PRIVATE_H
#include "group.h"
#include <meta/group.h>
struct _MetaGroup
{

View File

@@ -24,7 +24,7 @@
#ifndef META_GROUP_PROPS_H
#define META_GROUP_PROPS_H
#include "group.h"
#include <meta/group.h>
#include "window-private.h"
void meta_group_reload_property (MetaGroup *group,

View File

@@ -23,11 +23,11 @@
*/
#include <config.h>
#include "util.h"
#include <meta/util.h>
#include "group-private.h"
#include "group-props.h"
#include "window-private.h"
#include "window.h"
#include <meta/window.h>
static MetaGroup*
meta_group_new (MetaDisplay *display,

View File

@@ -24,7 +24,7 @@
#include <config.h>
#include "iconcache.h"
#include "ui.h"
#include "errors.h"
#include <meta/errors.h>
#include <X11/Xatom.h>
@@ -323,6 +323,40 @@ get_pixmap_geometry (MetaDisplay *display,
*d = depth;
}
static void
apply_foreground_background (GdkPixbuf *pixbuf)
{
int w, h;
int i, j;
guchar *pixels;
int stride;
w = gdk_pixbuf_get_width (pixbuf);
h = gdk_pixbuf_get_height (pixbuf);
pixels = gdk_pixbuf_get_pixels (pixbuf);
stride = gdk_pixbuf_get_rowstride (pixbuf);
i = 0;
while (i < h)
{
j = 0;
while (j < w)
{
guchar *p = pixels + i * stride + j * 4;
if (p[3] == 0)
p[0] = p[1] = p[2] = 0xff; /* white background */
else
p[0] = p[1] = p[2] = 0x00; /* black foreground */
p[3] = 0xff;
++j;
}
++i;
}
}
static GdkPixbuf*
apply_mask (GdkPixbuf *pixbuf,
GdkPixbuf *mask)
@@ -352,16 +386,10 @@ apply_mask (GdkPixbuf *pixbuf,
j = 0;
while (j < w)
{
guchar *s = src + i * src_stride + j * 3;
guchar *s = src + i * src_stride + j * 4;
guchar *d = dest + i * dest_stride + j * 4;
/* s[0] == s[1] == s[2], they are 255 if the bit was set, 0
* otherwise
*/
if (s[0] == 0)
d[3] = 0; /* transparent */
else
d[3] = 255; /* opaque */
d[3] = s[3];
++j;
}
@@ -385,25 +413,32 @@ try_pixmap_and_mask (MetaDisplay *display,
{
GdkPixbuf *unscaled = NULL;
GdkPixbuf *mask = NULL;
int w, h;
int w, h, d;
if (src_pixmap == None)
return FALSE;
meta_error_trap_push (display);
get_pixmap_geometry (display, src_pixmap, &w, &h, NULL);
get_pixmap_geometry (display, src_pixmap, &w, &h, &d);
unscaled = meta_gdk_pixbuf_get_from_pixmap (src_pixmap,
0, 0,
w, h);
/* A depth 1 pixmap has 0 background, and 1 foreground, but
* cairo and meta_gdk_pixbuf_get_from_pixmap consider it
* to be 0 transparent, 1 opaque */
if (d == 1)
apply_foreground_background (unscaled);
if (unscaled && src_mask != None)
{
get_pixmap_geometry (display, src_mask, &w, &h, NULL);
mask = meta_gdk_pixbuf_get_from_pixmap (src_mask,
0, 0,
w, h);
get_pixmap_geometry (display, src_mask, &w, &h, &d);
if (d == 1)
mask = meta_gdk_pixbuf_get_from_pixmap (src_mask,
0, 0,
w, h);
}
meta_error_trap_pop (display);

View File

@@ -29,7 +29,7 @@
#ifndef META_KEYBINDINGS_PRIVATE_H
#define META_KEYBINDINGS_PRIVATE_H
#include "keybindings.h"
#include <meta/keybindings.h>
void meta_display_init_keys (MetaDisplay *display);
void meta_display_shutdown_keys (MetaDisplay *display);

View File

@@ -29,13 +29,13 @@
#include <config.h>
#include "keybindings-private.h"
#include "workspace-private.h"
#include "errors.h"
#include <meta/errors.h>
#include "edge-resistance.h"
#include "ui.h"
#include "frame-private.h"
#include "frame.h"
#include "place.h"
#include "prefs.h"
#include "util.h"
#include <meta/prefs.h>
#include <meta/util.h>
#include <X11/keysym.h>
#include <string.h>
@@ -117,6 +117,10 @@ reload_keymap (MetaDisplay *display)
if (display->keymap)
meta_XFree (display->keymap);
/* This is expensive to compute, so we'll lazily load if and when we first
* need it */
display->above_tab_keycode = 0;
display->keymap = XGetKeyboardMapping (display->xdisplay,
display->min_keycode,
display->max_keycode -
@@ -228,6 +232,16 @@ reload_modmap (MetaDisplay *display)
display->meta_mask);
}
static guint
keysym_to_keycode (MetaDisplay *display,
guint keysym)
{
if (keysym == META_KEY_ABOVE_TAB)
return meta_display_get_above_tab_keycode (display);
else
return XKeysymToKeycode (display->xdisplay, keysym);
}
static void
reload_keycodes (MetaDisplay *display)
{
@@ -236,8 +250,8 @@ reload_keycodes (MetaDisplay *display)
if (display->overlay_key_combo.keysym != 0)
{
display->overlay_key_combo.keycode = XKeysymToKeycode (
display->xdisplay, display->overlay_key_combo.keysym);
display->overlay_key_combo.keycode =
keysym_to_keycode (display, display->overlay_key_combo.keysym);
}
if (display->key_bindings)
@@ -249,8 +263,8 @@ reload_keycodes (MetaDisplay *display)
{
if (display->key_bindings[i].keysym != 0)
{
display->key_bindings[i].keycode = XKeysymToKeycode (
display->xdisplay, display->key_bindings[i].keysym);
display->key_bindings[i].keycode =
keysym_to_keycode (display, display->key_bindings[i].keysym);
}
++i;
@@ -521,6 +535,9 @@ meta_display_get_keybinding_action (MetaDisplay *display,
mask = mask & 0xff & ~display->ignored_modifier_mask;
binding = display_get_keybinding (display, keysym, keycode, mask);
if (!binding && keycode == meta_display_get_above_tab_keycode (display))
binding = display_get_keybinding (display, META_KEY_ABOVE_TAB, keycode, mask);
if (binding)
return meta_prefs_get_keybinding_action (binding->name);
else
@@ -1534,15 +1551,24 @@ process_mouse_move_resize_grab (MetaDisplay *display,
if (keysym == XK_Escape)
{
/* Hide the tiling preview if necessary */
if (window->tile_mode != META_TILE_NONE)
meta_screen_tile_preview_hide (screen);
/* Restore the original tile mode */
window->tile_mode = display->grab_tile_mode;
/* End move or resize and restore to original state. If the
* window was a maximized window that had been "shaken loose" we
* need to remaximize it. In normal cases, we need to do a
* moveresize now to get the position back to the original.
*/
if (window->shaken_loose)
if (window->shaken_loose || window->tile_mode == META_TILE_MAXIMIZED)
meta_window_maximize (window,
META_MAXIMIZE_HORIZONTAL |
META_MAXIMIZE_VERTICAL);
else if (window->tile_mode != META_TILE_NONE)
meta_window_tile (window);
else
meta_window_move_resize (display->grab_window,
TRUE,
@@ -2418,7 +2444,7 @@ static void
error_on_command (int command_index,
const char *command,
const char *message,
int screen_number,
MetaScreen *screen,
guint32 timestamp)
{
if (command_index < 0)
@@ -2447,7 +2473,7 @@ error_on_command (int command_index,
meta_show_dialog ("--error",
text,
NULL,
screen_number,
screen->screen_name,
NULL, NULL, 0,
NULL, NULL);
@@ -2459,7 +2485,7 @@ error_on_command (int command_index,
meta_show_dialog ("--error",
message,
NULL,
screen_number,
screen->screen_name,
NULL, NULL, 0,
NULL, NULL);
}
@@ -2531,7 +2557,7 @@ handle_run_command (MetaDisplay *display,
s = g_strdup_printf (_("No command %d has been defined.\n"),
which + 1);
error_on_command (which, NULL, s, screen->number, event->xkey.time);
error_on_command (which, NULL, s, screen, event->xkey.time);
g_free (s);
return;
@@ -2540,7 +2566,7 @@ handle_run_command (MetaDisplay *display,
err = NULL;
if (!meta_spawn_command_line_async_on_screen (command, screen, &err))
{
error_on_command (which, command, err->message, screen->number, event->xkey.time);
error_on_command (which, command, err->message, screen, event->xkey.time);
g_error_free (err);
}
@@ -3315,7 +3341,7 @@ handle_toggle_on_all_workspaces (MetaDisplay *display,
MetaKeyBinding *binding,
gpointer dummy)
{
if (window->on_all_workspaces)
if (window->on_all_workspaces_requested)
meta_window_unstick (window);
else
meta_window_stick (window);
@@ -3542,7 +3568,7 @@ handle_run_terminal (MetaDisplay *display,
"keybinding press\n");
s = g_strdup_printf (_("No terminal command has been defined.\n"));
error_on_command (-1, NULL, s, screen->number, event->xkey.time);
error_on_command (-1, NULL, s, screen, event->xkey.time);
g_free (s);
return;
@@ -3551,7 +3577,7 @@ handle_run_terminal (MetaDisplay *display,
err = NULL;
if (!meta_spawn_command_line_async_on_screen (command, screen, &err))
{
error_on_command (-1, command, err->message, screen->number,
error_on_command (-1, command, err->message, screen,
event->xkey.time);
g_error_free (err);

View File

@@ -45,14 +45,14 @@
#define _SVID_SOURCE /* for putenv() and some signal-related functions */
#include <config.h>
#include "main.h"
#include "util.h"
#include <meta/main.h>
#include <meta/util.h>
#include "display-private.h"
#include "errors.h"
#include <meta/errors.h>
#include "ui.h"
#include "session.h"
#include "prefs.h"
#include "compositor.h"
#include <meta/prefs.h>
#include <meta/compositor.h>
#include <glib-object.h>
#include <gdk/gdkx.h>
@@ -75,7 +75,6 @@
#ifdef HAVE_INTROSPECTION
#include <girepository.h>
#include "compositor/meta-plugin-manager.h"
#endif
/**
@@ -89,12 +88,6 @@ static MetaExitCode meta_exit_code = META_EXIT_SUCCESS;
*/
static GMainLoop *meta_main_loop = NULL;
/**
* If set, Mutter will spawn an identical copy of itself immediately
* before quitting.
*/
static gboolean meta_restart_after_quit = FALSE;
static void prefs_changed_callback (MetaPreference pref,
gpointer data);
@@ -118,23 +111,6 @@ log_handler (const gchar *log_domain,
meta_print_backtrace ();
}
/**
* Prints the version notice. This is shown when Mutter is called
* with the --version switch.
*/
static void
version (void)
{
const int latest_year = 2010;
g_print (_("mutter %s\n"
"Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
"This is free software; see the source for copying conditions.\n"
"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"),
VERSION, latest_year);
exit (0);
}
/**
* Prints a list of which configure script options were used to
* build this copy of Mutter. This is actually always called
@@ -214,143 +190,72 @@ meta_print_self_identity (void)
/**
* The set of possible options that can be set on Mutter's
* command line. This type exists so that meta_parse_options() can
* write to an instance of it.
* command line.
*/
typedef struct
{
gchar *save_file;
gchar *display_name;
gchar *client_id;
gchar *mutter_plugins;
gboolean replace_wm;
gboolean disable_sm;
gboolean print_version;
gboolean sync;
gboolean composite;
gboolean no_composite;
gboolean no_force_fullscreen;
gboolean no_tab_popup;
gchar *introspect;
} MetaArguments;
static gchar *opt_save_file;
static gchar *opt_display_name;
static gchar *opt_client_id;
static gboolean opt_replace_wm;
static gboolean opt_disable_sm;
static gboolean opt_sync;
#define COMPOSITE_OPTS_FLAGS 0
static GOptionEntry meta_options[] = {
{
"sm-disable", 0, 0, G_OPTION_ARG_NONE,
&opt_disable_sm,
N_("Disable connection to session manager"),
NULL
},
{
"replace", 0, 0, G_OPTION_ARG_NONE,
&opt_replace_wm,
N_("Replace the running window manager"),
NULL
},
{
"sm-client-id", 0, 0, G_OPTION_ARG_STRING,
&opt_client_id,
N_("Specify session management ID"),
"ID"
},
{
"display", 'd', 0, G_OPTION_ARG_STRING,
&opt_display_name, N_("X Display to use"),
"DISPLAY"
},
{
"sm-save-file", 0, 0, G_OPTION_ARG_FILENAME,
&opt_save_file,
N_("Initialize session from savefile"),
"FILE"
},
{
"sync", 0, 0, G_OPTION_ARG_NONE,
&opt_sync,
N_("Make X calls synchronous"),
NULL
},
{NULL}
};
/**
* Parses argc and argv and returns the
* arguments that Mutter understands in meta_args.
* meta_get_option_context: (skip)
*
* The strange call signature has to be written like it is so
* that g_option_context_parse() gets a chance to modify argc and
* argv.
* Returns a #GOptionContext initialized with mutter-related options.
* Parse the command-line args with this before calling meta_init().
*
* \param argc Pointer to the number of arguments Mutter was given
* \param argv Pointer to the array of arguments Mutter was given
* \param meta_args The result of parsing the arguments.
**/
static GOptionContext *
meta_parse_options (int *argc, char ***argv,
MetaArguments *meta_args)
* Return value: the #GOptionContext
*/
GOptionContext *
meta_get_option_context (void)
{
MetaArguments my_args = {NULL, NULL, NULL, NULL,
FALSE, FALSE, FALSE, FALSE, FALSE};
GOptionEntry options[] = {
{
"sm-disable", 0, 0, G_OPTION_ARG_NONE,
&my_args.disable_sm,
N_("Disable connection to session manager"),
NULL
},
{
"replace", 0, 0, G_OPTION_ARG_NONE,
&my_args.replace_wm,
N_("Replace the running window manager with Mutter"),
NULL
},
{
"sm-client-id", 0, 0, G_OPTION_ARG_STRING,
&my_args.client_id,
N_("Specify session management ID"),
"ID"
},
{
"display", 'd', 0, G_OPTION_ARG_STRING,
&my_args.display_name, N_("X Display to use"),
"DISPLAY"
},
{
"sm-save-file", 0, 0, G_OPTION_ARG_FILENAME,
&my_args.save_file,
N_("Initialize session from savefile"),
"FILE"
},
{
"version", 0, 0, G_OPTION_ARG_NONE,
&my_args.print_version,
N_("Print version"),
NULL
},
{
"sync", 0, 0, G_OPTION_ARG_NONE,
&my_args.sync,
N_("Make X calls synchronous"),
NULL
},
{
"composite", 'c', COMPOSITE_OPTS_FLAGS, G_OPTION_ARG_NONE,
&my_args.composite,
N_("Turn compositing on"),
NULL
},
{
"no-composite", 0, COMPOSITE_OPTS_FLAGS, G_OPTION_ARG_NONE,
&my_args.no_composite,
N_("Turn compositing off"),
NULL
},
{
"no-force-fullscreen", 0, COMPOSITE_OPTS_FLAGS, G_OPTION_ARG_NONE,
&my_args.no_force_fullscreen,
N_("Don't make fullscreen windows that are maximized and have no decorations"),
NULL
},
{
"mutter-plugins", 0, 0, G_OPTION_ARG_STRING,
&my_args.mutter_plugins,
N_("Comma-separated list of compositor plugins"),
"PLUGINS"
},
{
"no-tab-popup", 0, 0, G_OPTION_ARG_NONE,
&my_args.no_tab_popup,
N_("Whether window popup/frame should be shown when cycling windows."),
NULL
},
#ifdef HAVE_INTROSPECTION
{
"introspect-dump", 0, 0, G_OPTION_ARG_STRING,
&my_args.introspect,
N_("Internal argument for GObject introspection"), "INTROSPECT"
},
#endif
{NULL}
};
GOptionContext *ctx;
GError *error = NULL;
ctx = g_option_context_new (NULL);
g_option_context_add_main_entries (ctx, options, "mutter");
g_option_context_add_main_entries (ctx, meta_options, GETTEXT_PACKAGE);
g_option_context_add_group (ctx, clutter_get_option_group_without_init ());
g_option_context_add_group (ctx, cogl_get_option_group ());
if (!g_option_context_parse (ctx, argc, argv, &error))
{
g_print ("mutter: %s\n", error->message);
exit(1);
}
/* Return the parsed options through the meta_args param. */
*meta_args = my_args;
return ctx;
}
@@ -399,12 +304,12 @@ static GSourceFuncs event_funcs = {
};
static void
meta_clutter_init (GOptionContext *ctx, int *argc, char ***argv)
meta_clutter_init (void)
{
clutter_x11_set_display (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()));
clutter_x11_disable_event_retrieval ();
if (CLUTTER_INIT_SUCCESS == clutter_init (argc, argv))
if (CLUTTER_INIT_SUCCESS == clutter_init (NULL, NULL))
{
GSource *source = g_source_new (&event_funcs, sizeof (GSource));
g_source_attach (source, NULL);
@@ -443,8 +348,6 @@ meta_finalize (void)
if (display)
meta_display_close (display,
CurrentTime); /* I doubt correct timestamps matter here */
meta_session_shutdown ();
}
static int sigterm_pipe_fds[2] = { -1, -1 };
@@ -454,7 +357,7 @@ sigterm_handler (int signum)
{
if (sigterm_pipe_fds[1] >= 0)
{
int dummy;
int G_GNUC_UNUSED dummy;
dummy = write (sigterm_pipe_fds[1], "", 1);
close (sigterm_pipe_fds[1]);
@@ -470,33 +373,18 @@ on_sigterm (void)
}
/**
* This is where the story begins. It parses commandline options and
* environment variables, sets up the screen, hands control off to
* GTK, and cleans up afterwards.
* meta_init: (skip)
*
* \param argc Number of arguments (as usual)
* \param argv Array of arguments (as usual)
*
* \bug It's a bit long. It would be good to split it out into separate
* functions.
* Initialize mutter. Call this after meta_get_option_context() and
* meta_plugin_type_register(), and before meta_run().
*/
int
main (int argc, char **argv)
void
meta_init (void)
{
struct sigaction act;
sigset_t empty_mask;
MetaArguments meta_args;
const gchar *log_domains[] = {
NULL, G_LOG_DOMAIN, "Gtk", "Gdk", "GLib",
"Pango", "GLib-GObject", "GThread"
};
guint i;
GIOChannel *channel;
GOptionContext *ctx;
if (!g_thread_supported ())
g_thread_init (NULL);
if (setlocale (LC_ALL, "") == NULL)
meta_warning ("Locale not understood by C library, internationalization will not work\n");
@@ -540,103 +428,61 @@ main (int argc, char **argv)
meta_warning ("Could not change to home directory %s.\n",
g_get_home_dir ());
g_type_init ();
meta_print_self_identity ();
bindtextdomain (GETTEXT_PACKAGE, MUTTER_LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
textdomain (GETTEXT_PACKAGE);
/* Parse command line arguments.*/
ctx = meta_parse_options (&argc, &argv, &meta_args);
/* This must come before the introspect below, so we load all the plugins
* in order to get their get_type functions.
*/
if (meta_args.mutter_plugins)
{
char **plugins = g_strsplit (meta_args.mutter_plugins, ",", -1);
char **plugin;
GSList *plugins_list = NULL;
for (plugin = plugins; *plugin; plugin++)
{
g_strstrip (*plugin);
plugins_list = g_slist_prepend (plugins_list, *plugin);
}
plugins_list = g_slist_reverse (plugins_list);
meta_prefs_override_clutter_plugins (plugins_list);
g_slist_free(plugins_list);
g_strfreev (plugins);
}
#ifdef HAVE_INTROSPECTION
g_irepository_prepend_search_path (MUTTER_PKGLIBDIR);
if (meta_args.introspect)
{
GError *error = NULL;
if (meta_args.mutter_plugins)
{
/* We need to load all plugins so that we can call their
* get_type functions. We do not call
* mutter_plugin_manager_initialize because almost nothing else
* is initialized at this point, and we don't plan to run any real
* plugin code.
*/
MetaPluginManager *mgr = meta_plugin_manager_get_default ();
if (!meta_plugin_manager_load (mgr))
g_critical ("failed to load plugins");
}
if (!g_irepository_dump (meta_args.introspect, &error))
{
g_printerr ("failed to dump: %s\n", error->message);
return 1;
}
return 0;
}
#endif
meta_set_syncing (meta_args.sync || (g_getenv ("MUTTER_SYNC") != NULL));
meta_set_syncing (opt_sync || (g_getenv ("MUTTER_SYNC") != NULL));
if (meta_args.print_version)
version ();
meta_select_display (meta_args.display_name);
meta_select_display (opt_display_name);
if (meta_args.replace_wm)
if (opt_replace_wm)
meta_set_replace_current_wm (TRUE);
if (meta_args.save_file && meta_args.client_id)
if (opt_save_file && opt_client_id)
meta_fatal ("Can't specify both SM save file and SM client id\n");
meta_main_loop = g_main_loop_new (NULL, FALSE);
meta_ui_init (&argc, &argv);
meta_ui_init ();
/*
* Clutter can only be initialized after the UI.
*/
meta_clutter_init (ctx, &argc, &argv);
meta_clutter_init ();
}
g_option_context_free (ctx);
/**
* meta_run: (skip)
*
* Runs mutter. Call this after completing your own initialization.
*
* Return value: mutter's exit status
*/
int
meta_run (void)
{
const gchar *log_domains[] = {
NULL, G_LOG_DOMAIN, "Gtk", "Gdk", "GLib",
"Pango", "GLib-GObject", "GThread"
};
guint i;
/* Load prefs */
meta_prefs_init ();
meta_prefs_add_listener (prefs_changed_callback, NULL);
#if 1
for (i=0; i<G_N_ELEMENTS(log_domains); i++)
g_log_set_handler (log_domains[i],
G_LOG_LEVEL_MASK | G_LOG_FLAG_FATAL | G_LOG_FLAG_RECURSION,
log_handler, NULL);
#endif
if (g_getenv ("MUTTER_G_FATAL_WARNINGS") != NULL)
g_log_set_always_fatal (G_LOG_LEVEL_MASK);
@@ -680,41 +526,30 @@ main (int argc, char **argv)
* or we might try to manage a window before we have the session
* info
*/
if (!meta_args.disable_sm)
if (!opt_disable_sm)
{
if (meta_args.client_id == NULL)
if (opt_client_id == NULL)
{
const gchar *desktop_autostart_id;
desktop_autostart_id = g_getenv ("DESKTOP_AUTOSTART_ID");
if (desktop_autostart_id != NULL)
meta_args.client_id = g_strdup (desktop_autostart_id);
opt_client_id = g_strdup (desktop_autostart_id);
}
/* Unset DESKTOP_AUTOSTART_ID in order to avoid child processes to
* use the same client id. */
g_unsetenv ("DESKTOP_AUTOSTART_ID");
meta_session_init (meta_args.client_id, meta_args.save_file);
meta_session_init (opt_client_id, opt_save_file);
}
/* Free memory possibly allocated by the argument parsing which are
* no longer needed.
*/
g_free (meta_args.save_file);
g_free (meta_args.display_name);
g_free (meta_args.client_id);
if (meta_args.composite || meta_args.no_composite)
meta_prefs_set_compositing_manager (meta_args.composite);
if (meta_args.no_force_fullscreen)
meta_prefs_set_force_fullscreen (FALSE);
if (meta_args.no_tab_popup)
{
meta_prefs_override_no_tab_popup (TRUE);
}
g_free (opt_save_file);
g_free (opt_display_name);
g_free (opt_client_id);
if (!meta_display_open ())
meta_exit (META_EXIT_ERROR);
@@ -723,36 +558,15 @@ main (int argc, char **argv)
meta_finalize ();
if (meta_restart_after_quit)
{
GError *err;
err = NULL;
if (!g_spawn_async (NULL,
argv,
NULL,
G_SPAWN_SEARCH_PATH,
NULL,
NULL,
NULL,
&err))
{
meta_fatal (_("Failed to restart: %s\n"),
err->message);
g_error_free (err); /* not reached anyhow */
meta_exit_code = META_EXIT_ERROR;
}
}
return meta_exit_code;
}
/**
* Stops Mutter. This tells the event loop to stop processing; it is rather
* dangerous to use this rather than meta_restart() because this will leave
* the user with no window manager. We generally do this only if, for example,
* the session manager asks us to; we assume the session manager knows what
* it's talking about.
* Stops Mutter. This tells the event loop to stop processing; it is
* rather dangerous to use this because this will leave the user with
* no window manager. We generally do this only if, for example, the
* session manager asks us to; we assume the session manager knows
* what it's talking about.
*
* \param code The success or failure code to return to the calling process.
*/
@@ -765,19 +579,6 @@ meta_quit (MetaExitCode code)
g_main_loop_quit (meta_main_loop);
}
/**
* Restarts Mutter. In practice, this tells the event loop to stop
* processing, having first set the meta_restart_after_quit flag which
* tells Mutter to spawn an identical copy of itself before quitting.
* This happens on receipt of a _MUTTER_RESTART_MESSAGE client event.
*/
void
meta_restart (void)
{
meta_restart_after_quit = TRUE;
meta_quit (META_EXIT_SUCCESS);
}
/**
* Called on pref changes. (One of several functions of its kind and purpose.)
*

99
src/core/mutter.c Normal file
View File

@@ -0,0 +1,99 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
/*
* Copyright 2011 Red Hat, Inc.
*
* 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.
*/
#include "config.h"
#include <stdlib.h>
#include <meta/main.h>
#include <meta/util.h>
#ifdef HAVE_INTROSPECTION
#include "meta-plugin-manager.h"
#endif
#include <glib.h>
static gboolean
print_version (const gchar *option_name,
const gchar *value,
gpointer data,
GError **error)
{
const int latest_year = 2011;
g_print (_("mutter %s\n"
"Copyright (C) 2001-%d Havoc Pennington, Red Hat, Inc., and others\n"
"This is free software; see the source for copying conditions.\n"
"There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n"),
VERSION, latest_year);
exit (0);
}
static gchar *mutter_plugins;
GOptionEntry mutter_options[] = {
{
"version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
print_version,
N_("Print version"),
NULL
},
{
"mutter-plugins", 0, 0, G_OPTION_ARG_STRING,
&mutter_plugins,
N_("Comma-separated list of compositor plugins"),
"PLUGINS"
},
{ NULL }
};
int
main (int argc, char **argv)
{
GOptionContext *ctx;
GError *error = NULL;
ctx = meta_get_option_context ();
g_option_context_add_main_entries (ctx, mutter_options, GETTEXT_PACKAGE);
if (!g_option_context_parse (ctx, &argc, &argv, &error))
{
g_printerr ("mutter: %s\n", error->message);
exit (1);
}
if (mutter_plugins)
{
MetaPluginManager *mgr;
char **plugins = g_strsplit (mutter_plugins, ",", -1);
char **plugin;
mgr = meta_plugin_manager_get_default ();
for (plugin = plugins; *plugin; plugin++)
{
g_strstrip (*plugin);
meta_plugin_manager_load (mgr, *plugin);
}
g_strfreev (plugins);
}
meta_init ();
return meta_run ();
}

View File

@@ -28,8 +28,8 @@
#include "boxes-private.h"
#include "place.h"
#include "workspace.h"
#include "prefs.h"
#include <meta/workspace.h>
#include <meta/prefs.h>
#include <gdk/gdk.h>
#include <math.h>
#include <stdlib.h>

View File

@@ -25,7 +25,7 @@
#define META_PLACE_H
#include "window-private.h"
#include "frame-private.h"
#include "frame.h"
void meta_window_place (MetaWindow *window,
MetaFrameGeometry *fgeom,

View File

@@ -24,10 +24,10 @@
*/
#include <config.h>
#include "prefs.h"
#include <meta/prefs.h>
#include "ui.h"
#include "util.h"
#include "compositor/meta-plugin-manager.h"
#include <meta/util.h>
#include "meta-plugin-manager.h"
#ifdef HAVE_GCONF
#include <gconf/gconf-client.h>
#endif
@@ -50,7 +50,6 @@
*/
#define KEY_TITLEBAR_FONT "/apps/metacity/general/titlebar_font"
#define KEY_NUM_WORKSPACES "/apps/metacity/general/num_workspaces"
#define KEY_COMPOSITOR "/apps/metacity/general/compositing_manager"
#define KEY_GNOME_ACCESSIBILITY "/desktop/gnome/interface/accessibility"
#define KEY_COMMAND_DIRECTORY "/apps/metacity/keybinding_commands"
@@ -67,9 +66,8 @@
#define KEY_WORKSPACE_NAME_DIRECTORY "/apps/metacity/workspace_names"
#define KEY_WORKSPACE_NAME_PREFIX "/apps/metacity/workspace_names/name_"
#define KEY_CLUTTER_PLUGINS "/apps/mutter/general/clutter_plugins"
#define KEY_LIVE_HIDDEN_WINDOWS "/apps/mutter/general/live_hidden_windows"
#define KEY_WORKSPACES_ONLY_ON_PRIMARY "/apps/mutter/general/workspaces_only_on_primary"
#define KEY_NO_TAB_POPUP "/apps/metacity/general/no_tab_popup"
@@ -102,9 +100,8 @@ static gboolean gnome_accessibility = FALSE;
static gboolean gnome_animations = TRUE;
static char *cursor_theme = NULL;
static int cursor_size = 24;
static gboolean compositing_manager = FALSE;
static gboolean resize_with_right_button = FALSE;
static gboolean side_by_side_tiling = FALSE;
static gboolean edge_tiling = FALSE;
static gboolean force_fullscreen = TRUE;
static MetaVisualBellType visual_bell_type = META_VISUAL_BELL_FULLSCREEN_FLASH;
@@ -117,10 +114,8 @@ static char *terminal_command = NULL;
static char *workspace_names[MAX_REASONABLE_WORKSPACES] = { NULL, };
static gboolean clutter_plugins_overridden = FALSE;
static GSList *clutter_plugins = NULL;
static gboolean live_hidden_windows = FALSE;
static gboolean workspaces_only_on_primary = FALSE;
static gboolean no_tab_popup = FALSE;
@@ -413,19 +408,14 @@ static MetaBoolPreference preferences_bool[] =
&gnome_animations,
TRUE,
},
{ "/apps/metacity/general/compositing_manager",
META_PREF_COMPOSITING_MANAGER,
&compositing_manager,
FALSE,
},
{ "/apps/metacity/general/resize_with_right_button",
META_PREF_RESIZE_WITH_RIGHT_BUTTON,
&resize_with_right_button,
FALSE,
},
{ "/apps/metacity/general/side_by_side_tiling",
META_PREF_SIDE_BY_SIDE_TILING,
&side_by_side_tiling,
{ "/apps/metacity/general/edge_tiling",
META_PREF_EDGE_TILING,
&edge_tiling,
FALSE,
},
{ "/apps/mutter/general/live_hidden_windows",
@@ -433,6 +423,11 @@ static MetaBoolPreference preferences_bool[] =
&live_hidden_windows,
FALSE,
},
{ "/apps/mutter/general/workspaces_only_on_primary",
META_PREF_WORKSPACES_ONLY_ON_PRIMARY,
&workspaces_only_on_primary,
FALSE,
},
{ "/apps/metacity/general/no_tab_popup",
META_PREF_NO_TAB_POPUP,
&no_tab_popup,
@@ -1058,7 +1053,6 @@ meta_prefs_init (void)
#ifdef HAVE_GCONF
GError *err = NULL;
gchar **gconf_dir_cursor;
MetaPluginManager *plugin_manager;
if (default_client != NULL)
return;
@@ -1077,19 +1071,6 @@ meta_prefs_init (void)
cleanup_error (&err);
}
/* The plugin list is special and needs to be handled first */
if (!clutter_plugins_overridden)
clutter_plugins = gconf_client_get_list (default_client, KEY_CLUTTER_PLUGINS,
GCONF_VALUE_STRING, &err);
cleanup_error (&err);
/* We now initialize plugins so that they can override any preference locations */
plugin_manager = meta_plugin_manager_get_default ();
meta_plugin_manager_load (plugin_manager);
/* Pick up initial values. */
handle_preference_init_enum ();
@@ -1403,23 +1384,6 @@ change_notify (GConfClient *client,
{
queue_changed (META_PREF_KEYBINDINGS);
}
else if (g_str_equal (key, KEY_CLUTTER_PLUGINS) && !clutter_plugins_overridden)
{
GError *err = NULL;
GSList *l;
l = gconf_client_get_list (default_client, KEY_CLUTTER_PLUGINS,
GCONF_VALUE_STRING, &err);
if (!l)
{
cleanup_error (&err);
goto out;
}
clutter_plugins = l;
queue_changed (META_PREF_CLUTTER_PLUGINS);
}
else
{
meta_topic (META_DEBUG_PREFS, "Key %s doesn't mean anything to Mutter\n",
@@ -2004,24 +1968,21 @@ meta_preference_to_string (MetaPreference pref)
case META_PREF_CURSOR_SIZE:
return "CURSOR_SIZE";
case META_PREF_COMPOSITING_MANAGER:
return "COMPOSITING_MANAGER";
case META_PREF_RESIZE_WITH_RIGHT_BUTTON:
return "RESIZE_WITH_RIGHT_BUTTON";
case META_PREF_SIDE_BY_SIDE_TILING:
return "SIDE_BY_SIDE_TILING";
case META_PREF_EDGE_TILING:
return "EDGE_TILING";
case META_PREF_FORCE_FULLSCREEN:
return "FORCE_FULLSCREEN";
case META_PREF_CLUTTER_PLUGINS:
return "CLUTTER_PLUGINS";
case META_PREF_LIVE_HIDDEN_WINDOWS:
return "LIVE_HIDDEN_WINDOWS";
case META_PREF_WORKSPACES_ONLY_ON_PRIMARY:
return "WORKSPACES_ONLY_ON_PRIMARY";
case META_PREF_NO_TAB_POPUP:
return "NO_TAB_POPUP";
}
@@ -2926,9 +2887,9 @@ meta_prefs_get_gnome_animations ()
}
gboolean
meta_prefs_get_side_by_side_tiling ()
meta_prefs_get_edge_tiling ()
{
return side_by_side_tiling;
return edge_tiling;
}
MetaKeyBindingAction
@@ -2992,12 +2953,6 @@ meta_prefs_get_window_binding (const char *name,
g_assert_not_reached ();
}
gboolean
meta_prefs_get_compositing_manager (void)
{
return compositing_manager;
}
guint
meta_prefs_get_mouse_button_resize (void)
{
@@ -3016,74 +2971,6 @@ meta_prefs_get_force_fullscreen (void)
return force_fullscreen;
}
void
meta_prefs_set_compositing_manager (gboolean whether)
{
#ifdef HAVE_GCONF
GError *err = NULL;
gconf_client_set_bool (default_client,
KEY_COMPOSITOR,
whether,
&err);
if (err)
{
meta_warning (_("Error setting compositor status: %s\n"),
err->message);
g_error_free (err);
}
#else
compositing_manager = whether;
#endif
}
/**
* meta_prefs_get_clutter_plugins:
*
* Returns: (transfer none) (element-type utf8): Plugin names to load
*/
GSList *
meta_prefs_get_clutter_plugins (void)
{
return clutter_plugins;
}
void
meta_prefs_set_clutter_plugins (GSList *list)
{
#ifdef HAVE_GCONF
GError *err = NULL;
gconf_client_set_list (default_client,
KEY_CLUTTER_PLUGINS,
GCONF_VALUE_STRING,
list,
&err);
if (err)
{
meta_warning (_("Error setting clutter plugin list: %s\n"),
err->message);
g_error_free (err);
}
#endif
}
void
meta_prefs_override_clutter_plugins (GSList *list)
{
GSList *l;
clutter_plugins_overridden = TRUE;
clutter_plugins = NULL;
for (l = list; l; l = l->next)
clutter_plugins = g_slist_prepend (clutter_plugins, g_strdup(l->data));
clutter_plugins = g_slist_reverse (clutter_plugins);
}
gboolean
meta_prefs_get_live_hidden_windows (void)
{
@@ -3116,6 +3003,13 @@ meta_prefs_set_live_hidden_windows (gboolean whether)
#endif
}
gboolean
meta_prefs_get_workspaces_only_on_primary (void)
{
return workspaces_only_on_primary;
}
gboolean
meta_prefs_get_no_tab_popup (void)
{
@@ -3144,12 +3038,6 @@ meta_prefs_set_no_tab_popup (gboolean whether)
#endif
}
void
meta_prefs_override_no_tab_popup (gboolean whether)
{
no_tab_popup = whether;
}
#ifndef HAVE_GCONF
static void
init_button_layout(void)

View File

@@ -34,7 +34,7 @@
#define META_SCREEN_PRIVATE_H
#include "display-private.h"
#include "screen.h"
#include <meta/screen.h>
#include <X11/Xutil.h>
#include "stack-tracker.h"
#include "ui.h"
@@ -50,14 +50,6 @@ struct _MetaMonitorInfo
typedef void (* MetaScreenWindowFunc) (MetaScreen *screen, MetaWindow *window,
gpointer user_data);
typedef enum
{
META_SCREEN_TOPLEFT,
META_SCREEN_TOPRIGHT,
META_SCREEN_BOTTOMLEFT,
META_SCREEN_BOTTOMRIGHT
} MetaScreenCorner;
typedef enum
{
META_SCREEN_UP,
@@ -107,6 +99,7 @@ struct _MetaScreen
guint32 wm_sn_timestamp;
MetaMonitorInfo *monitor_infos;
int primary_monitor_index;
int n_monitor_infos;
/* Cache the current monitor */
@@ -127,6 +120,7 @@ struct _MetaScreen
int columns_of_workspaces;
MetaScreenCorner starting_corner;
guint vertical_workspaces : 1;
guint workspace_layout_overridden : 1;
guint keys_grabbed : 1;
guint all_keys_grabbed : 1;
@@ -148,6 +142,7 @@ struct _MetaScreenClass
void (*restacked) (MetaScreen *);
void (*workareas_changed) (MetaScreen *);
void (*monitors_changed) (MetaScreen *);
};
MetaScreen* meta_screen_new (MetaDisplay *display,
@@ -184,6 +179,7 @@ void meta_screen_workspace_popup_destroy (MetaScreen *screen);
void meta_screen_tile_preview_update (MetaScreen *screen,
gboolean delay);
void meta_screen_tile_preview_hide (MetaScreen *screen);
MetaWindow* meta_screen_get_mouse_window (MetaScreen *screen,
MetaWindow *not_this_one);
@@ -254,4 +250,6 @@ void meta_screen_workspace_switched (MetaScreen *screen,
int to,
MetaMotionDirection direction);
void meta_screen_set_active_workspace_hint (MetaScreen *screen);
#endif

View File

@@ -28,16 +28,17 @@
#include <config.h>
#include "screen-private.h"
#include "util.h"
#include "errors.h"
#include <meta/main.h>
#include <meta/util.h>
#include <meta/errors.h>
#include "window-private.h"
#include "frame-private.h"
#include "prefs.h"
#include "frame.h"
#include <meta/prefs.h>
#include "workspace-private.h"
#include "keybindings-private.h"
#include "stack.h"
#include "xprops.h"
#include "compositor.h"
#include <meta/compositor.h>
#include "mutter-marshal.h"
#include "mutter-enum-types.h"
@@ -84,8 +85,11 @@ enum
WORKSPACE_ADDED,
WORKSPACE_REMOVED,
WORKSPACE_SWITCHED,
WINDOW_ENTERED_MONITOR,
WINDOW_LEFT_MONITOR,
STARTUP_SEQUENCE_CHANGED,
WORKAREAS_CHANGED,
MONITORS_CHANGED,
LAST_SIGNAL
};
@@ -200,6 +204,28 @@ meta_screen_class_init (MetaScreenClass *klass)
G_TYPE_INT,
MUTTER_TYPE_MOTION_DIRECTION);
screen_signals[WINDOW_ENTERED_MONITOR] =
g_signal_new ("window-entered-monitor",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
_mutter_marshal_VOID__INT_OBJECT,
G_TYPE_NONE, 2,
G_TYPE_INT,
META_TYPE_WINDOW);
screen_signals[WINDOW_LEFT_MONITOR] =
g_signal_new ("window-left-monitor",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
0,
NULL, NULL,
_mutter_marshal_VOID__INT_OBJECT,
G_TYPE_NONE, 2,
G_TYPE_INT,
META_TYPE_WINDOW);
screen_signals[STARTUP_SEQUENCE_CHANGED] =
g_signal_new ("startup-sequence-changed",
G_TYPE_FROM_CLASS (klass),
@@ -227,6 +253,15 @@ meta_screen_class_init (MetaScreenClass *klass)
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
screen_signals[MONITORS_CHANGED] =
g_signal_new ("monitors-changed",
G_TYPE_FROM_CLASS (object_class),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (MetaScreenClass, monitors_changed),
NULL, NULL,
g_cclosure_marshal_VOID__VOID,
G_TYPE_NONE, 0);
g_object_class_install_property (object_class,
PROP_N_WORKSPACES,
pspec);
@@ -277,7 +312,7 @@ set_supported_hint (MetaScreen *screen)
Atom atoms[] = {
#define EWMH_ATOMS_ONLY
#define item(x) screen->display->atom_##x,
#include "atomnames.h"
#include <meta/atomnames.h>
#undef item
#undef EWMH_ATOMS_ONLY
};
@@ -314,6 +349,43 @@ set_wm_icon_size_hint (MetaScreen *screen)
#undef N_VALS
}
/* The list of monitors reported by the windowing system might include
* mirrored monitors with identical bounds. Since mirrored monitors
* shouldn't be treated as separate monitors for most purposes, we
* filter them out here. (We ignore the possibility of partially
* overlapping monitors because they are rare and it's hard to come
* up with any sensible interpretation.)
*/
static void
filter_mirrored_monitors (MetaScreen *screen)
{
int i, j;
/* Currently always true and simplifies things */
g_assert (screen->primary_monitor_index == 0);
for (i = 1; i < screen->n_monitor_infos; i++)
{
/* In case we've filtered previous monitors */
screen->monitor_infos[i].number = i;
for (j = 0; j < i; j++)
{
if (meta_rectangle_equal (&screen->monitor_infos[i].rect,
&screen->monitor_infos[j].rect))
{
memmove (&screen->monitor_infos[i],
&screen->monitor_infos[i + 1],
(screen->n_monitor_infos - i - 1) * sizeof (MetaMonitorInfo));
screen->n_monitor_infos--;
i--;
continue;
}
}
}
}
static void
reload_monitor_infos (MetaScreen *screen)
{
@@ -342,6 +414,18 @@ reload_monitor_infos (MetaScreen *screen)
screen->n_monitor_infos = 0;
screen->last_monitor_index = 0;
/* Xinerama doesn't have a concept of primary monitor, however XRandR
* does. However, the XRandR xinerama compat code always sorts the
* primary output first, so we rely on that here. We could use the
* native XRandR calls instead of xinerama, but that would be
* slightly problematic for _NET_WM_FULLSCREEN_MONITORS support, as
* that is defined in terms of xinerama monitor indexes.
* So, since we don't need anything in xrandr except the primary
* we can keep using xinerama and use the first monitor as the
* primary.
*/
screen->primary_monitor_index = 0;
screen->display->monitor_cache_invalidated = TRUE;
if (g_getenv ("MUTTER_DEBUG_XINERAMA"))
@@ -491,6 +575,8 @@ reload_monitor_infos (MetaScreen *screen)
screen->monitor_infos[0].rect = screen->rect;
}
filter_mirrored_monitors (screen);
g_assert (screen->n_monitor_infos > 0);
g_assert (screen->monitor_infos != NULL);
}
@@ -951,11 +1037,10 @@ meta_screen_manage_all_windows (MetaScreen *screen)
for (list = windows; list != NULL; list = list->next)
{
WindowInfo *info = list->data;
MetaWindow *window;
window = meta_window_new_with_attrs (screen->display, info->xwindow, TRUE,
META_COMP_EFFECT_NONE,
&info->attrs);
meta_window_new_with_attrs (screen->display, info->xwindow, TRUE,
META_COMP_EFFECT_NONE,
&info->attrs);
}
meta_stack_thaw (screen->stack);
@@ -978,7 +1063,15 @@ meta_screen_composite_all_windows (MetaScreen *screen)
windows = meta_display_list_windows (display,
META_LIST_INCLUDE_OVERRIDE_REDIRECT);
for (tmp = windows; tmp != NULL; tmp = tmp->next)
meta_compositor_add_window (display->compositor, tmp->data);
{
MetaWindow *window = tmp->data;
meta_compositor_add_window (display->compositor, window);
if (window->visible_to_compositor)
meta_compositor_show_window (display->compositor, window,
META_COMP_EFFECT_NONE);
}
g_slist_free (windows);
/* initialize the compositor's view of the stacking order */
@@ -1276,6 +1369,7 @@ meta_screen_remove_workspace (MetaScreen *screen, MetaWorkspace *workspace,
MetaWorkspace *neighbour = NULL;
GList *next = NULL;
int index;
gboolean active_index_changed;
int new_num;
l = screen->workspaces;
@@ -1314,6 +1408,7 @@ meta_screen_remove_workspace (MetaScreen *screen, MetaWorkspace *workspace,
/* To emit the signal after removing the workspace */
index = meta_workspace_index (workspace);
active_index_changed = index < meta_screen_get_active_workspace_index (screen);
/* This also removes the workspace from the screens list */
meta_workspace_remove (workspace);
@@ -1323,6 +1418,11 @@ meta_screen_remove_workspace (MetaScreen *screen, MetaWorkspace *workspace,
set_number_of_spaces_hint (screen, new_num);
meta_prefs_set_num_workspaces (new_num);
/* If deleting a workspace before the current workspace, the active
* workspace index changes, so we need to update that hint */
if (active_index_changed)
meta_screen_set_active_workspace_hint (workspace->screen);
l = next;
while (l)
{
@@ -1758,6 +1858,7 @@ meta_screen_tile_preview_update_timeout (gpointer data)
MetaScreen *screen = data;
MetaWindow *window = screen->display->grab_window;
gboolean composited = screen->display->compositor != NULL;
gboolean needs_preview = FALSE;
screen->tile_preview_timeout_id = 0;
@@ -1775,9 +1876,28 @@ meta_screen_tile_preview_update_timeout (gpointer data)
create_serial);
}
if (window
&& !META_WINDOW_TILED (window)
&& window->tile_mode != META_TILE_NONE)
if (window)
{
switch (window->tile_mode)
{
case META_TILE_LEFT:
case META_TILE_RIGHT:
if (!META_WINDOW_TILED_SIDE_BY_SIDE (window))
needs_preview = TRUE;
break;
case META_TILE_MAXIMIZED:
if (!META_WINDOW_MAXIMIZED (window))
needs_preview = TRUE;
break;
default:
needs_preview = FALSE;
break;
}
}
if (needs_preview)
{
MetaRectangle tile_rect;
@@ -1815,6 +1935,16 @@ meta_screen_tile_preview_update (MetaScreen *screen,
}
}
void
meta_screen_tile_preview_hide (MetaScreen *screen)
{
if (screen->tile_preview_timeout_id > 0)
g_source_remove (screen->tile_preview_timeout_id);
if (screen->tile_preview)
meta_tile_preview_hide (screen->tile_preview);
}
MetaWindow*
meta_screen_get_mouse_window (MetaScreen *screen,
MetaWindow *not_this_one)
@@ -2086,6 +2216,22 @@ meta_screen_get_n_monitors (MetaScreen *screen)
return screen->n_monitor_infos;
}
/**
* meta_screen_get_primary_monitor:
* @screen: a #MetaScreen
*
* Gets the index of the primary monitor on this @screen.
*
* Return value: a monitor index
*/
int
meta_screen_get_primary_monitor (MetaScreen *screen)
{
g_return_val_if_fail (META_IS_SCREEN (screen), 0);
return screen->primary_monitor_index;
}
/**
* meta_screen_get_monitor_geometry:
* @screen: a #MetaScreen
@@ -2119,6 +2265,9 @@ meta_screen_update_workspace_layout (MetaScreen *screen)
{
gulong *list;
int n_items;
if (screen->workspace_layout_overridden)
return;
list = NULL;
n_items = 0;
@@ -2205,6 +2354,43 @@ meta_screen_update_workspace_layout (MetaScreen *screen)
screen->starting_corner);
}
/**
* meta_screen_override_workspace_layout:
* @screen: a #MetaScreen
* @starting_corner: the corner at which the first workspace is found
* @vertical_layout: if %TRUE the workspaces are laid out in columns rather than rows
* @n_rows: number of rows of workspaces, or -1 to determine the number of rows from
* @n_columns and the total number of workspaces
* @n_columns: number of columns of workspaces, or -1 to determine the number of columns from
* @n_rows and the total number of workspaces
*
* Explicitly set the layout of workspaces. Once this has been called, the contents of the
* _NET_DESKTOP_LAYOUT property on the root window are completely ignored.
*/
void
meta_screen_override_workspace_layout (MetaScreen *screen,
MetaScreenCorner starting_corner,
gboolean vertical_layout,
int n_rows,
int n_columns)
{
g_return_if_fail (META_IS_SCREEN (screen));
g_return_if_fail (n_rows > 0 || n_columns > 0);
g_return_if_fail (n_rows != 0 && n_columns != 0);
screen->workspace_layout_overridden = TRUE;
screen->vertical_workspaces = vertical_layout != FALSE;
screen->starting_corner = starting_corner;
screen->rows_of_workspaces = n_rows;
screen->columns_of_workspaces = n_columns;
/* In theory we should remove _NET_DESKTOP_LAYOUT from _NET_SUPPORTED at this
* point, but it's unlikely that anybody checks that, and it's unlikely that
* anybody who checks that handles changes, so we'd probably just create
* a race condition. And it's hard to implement with the code in set_supported_hint()
*/
}
static void
set_workspace_names (MetaScreen *screen)
{
@@ -2694,10 +2880,27 @@ void
meta_screen_resize (MetaScreen *screen,
int width,
int height)
{
{
GSList *windows, *tmp;
screen->rect.width = width;
screen->rect.height = height;
/* Clear monitor for all windows on this screen, as it will become
* invalid. */
windows = meta_display_list_windows (screen->display,
META_LIST_INCLUDE_OVERRIDE_REDIRECT);
for (tmp = windows; tmp != NULL; tmp = tmp->next)
{
MetaWindow *window = tmp->data;
if (window->screen == screen)
{
g_signal_emit_by_name (screen, "window-left-monitor", window->monitor->number, window);
window->monitor = NULL;
}
}
reload_monitor_infos (screen);
set_desktop_geometry_hint (screen);
@@ -2707,6 +2910,21 @@ meta_screen_resize (MetaScreen *screen,
/* Queue a resize on all the windows */
meta_screen_foreach_window (screen, meta_screen_resize_func, 0);
/* Fix up monitor for all windows on this screen */
windows = meta_display_list_windows (screen->display,
META_LIST_INCLUDE_OVERRIDE_REDIRECT);
for (tmp = windows; tmp != NULL; tmp = tmp->next)
{
MetaWindow *window = tmp->data;
if (window->screen == screen)
meta_window_update_monitor (window);
}
g_slist_free (windows);
g_signal_emit (screen, screen_signals[MONITORS_CHANGED], 0, index);
}
void
@@ -3308,3 +3526,29 @@ meta_screen_workspace_switched (MetaScreen *screen,
from, to, direction);
}
void
meta_screen_set_active_workspace_hint (MetaScreen *screen)
{
unsigned long data[1];
/* this is because we destroy the spaces in order,
* so we always end up setting a current desktop of
* 0 when closing a screen, so lose the current desktop
* on restart. By doing this we keep the current
* desktop on restart.
*/
if (screen->closing > 0)
return;
data[0] = meta_workspace_index (screen->active_workspace);
meta_verbose ("Setting _NET_CURRENT_DESKTOP to %lu\n", data[0]);
meta_error_trap_push (screen->display);
XChangeProperty (screen->display->xdisplay, screen->xroot,
screen->display->atom__NET_CURRENT_DESKTOP,
XA_CARDINAL,
32, PropModeReplace, (guchar*) data, 1);
meta_error_trap_pop (screen->display);
}

View File

@@ -39,12 +39,6 @@ meta_session_init (const char *client_id,
meta_topic (META_DEBUG_SM, "Compiled without session management support\n");
}
void
meta_session_shutdown (void)
{
/* nothing */
}
const MetaWindowSessionInfo*
meta_window_lookup_saved_state (MetaWindow *window)
{
@@ -69,10 +63,10 @@ meta_window_release_saved_state (const MetaWindowSessionInfo *info)
#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include "main.h"
#include "util.h"
#include <meta/main.h>
#include <meta/util.h>
#include "display-private.h"
#include "workspace.h"
#include <meta/workspace.h>
static void ice_io_error_handler (IceConn connection);
@@ -307,7 +301,12 @@ meta_session_init (const char *previous_client_id,
SmProp prop1, prop2, prop3, prop4, prop5, prop6, *props[6];
SmPropValue prop1val, prop2val, prop3val, prop4val, prop5val, prop6val;
char pid[32];
char hint = SmRestartImmediately;
/* Historically, this was SmRestartImmediately, which made sense
* for a stateless window manager, but we don't really control
* what embedders do, and it's all around better if gnome-session
* handles this.
*/
char hint = SmRestartIfRunning;
char priority = 20; /* low to run before other apps */
prop1.name = SmProgram;
@@ -371,31 +370,6 @@ meta_session_init (const char *previous_client_id,
g_free (saved_client_id);
}
void
meta_session_shutdown (void)
{
/* Change our restart mode to IfRunning */
SmProp prop1;
SmPropValue prop1val;
SmProp *props[1];
char hint = SmRestartIfRunning;
if (session_connection == NULL)
return;
prop1.name = SmRestartStyleHint;
prop1.type = SmCARD8;
prop1.num_vals = 1;
prop1.vals = &prop1val;
prop1val.value = &hint;
prop1val.length = 1;
props[0] = &prop1;
SmcSetProperties (session_connection, 1, props);
}
static void
disconnect (void)
{
@@ -544,9 +518,16 @@ save_yourself_callback (SmcConn smc_conn,
static void
die_callback (SmcConn smc_conn, SmPointer client_data)
{
meta_topic (META_DEBUG_SM, "Exiting at request of session manager\n");
meta_topic (META_DEBUG_SM, "Disconnecting from session manager");
disconnect ();
meta_quit (META_EXIT_SUCCESS);
/* We don't actually exit here - we will simply go away with the X
* server on logout, when we lose the X connection and libx11 kills
* us. It looks like *crap* on logout if the user sees their
* windows lose the decorations, etc.
*
* Anything that wants us to go away outside of session management
* can use kill().
*/
}
static void
@@ -952,7 +933,7 @@ save_state (void)
g_free (title);
/* Sticky */
if (window->on_all_workspaces)
if (window->on_all_workspaces_requested)
fputs (" <sticky/>\n", outfile);
/* Minimized */
@@ -1823,7 +1804,7 @@ warn_about_lame_clients_and_finish_interact (gboolean shutdown)
"and will have to be restarted manually next time "
"you log in."),
"240",
meta_screen_get_screen_number (meta_get_display()->active_screen),
meta_get_display()->active_screen->screen_name,
NULL, NULL,
None,
columns,

View File

@@ -23,12 +23,12 @@
#include <string.h>
#include "frame-private.h"
#include "frame.h"
#include "screen-private.h"
#include "stack-tracker.h"
#include "util.h"
#include <meta/util.h>
#include "compositor.h"
#include <meta/compositor.h>
/* The complexity here comes from resolving two competing factors:
*

View File

@@ -36,7 +36,7 @@
#ifndef META_STACK_TRACKER_H
#define META_STACK_TRACKER_H
#include "screen.h"
#include <meta/screen.h>
typedef struct _MetaStackTracker MetaStackTracker;

Some files were not shown because too many files have changed in this diff Show More