Compare commits
	
		
			17 Commits
		
	
	
		
			wip/garnac
			...
			gnome-3-12
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | ed7680c2f8 | ||
|   | 9f9d08c21e | ||
|   | 9d071443c7 | ||
|   | 31afdd4deb | ||
|   | 170ff5e2e8 | ||
|   | f72f431a99 | ||
|   | e1841f722d | ||
|   | b850a8075f | ||
|   | db0383d19f | ||
|   | a175b3c947 | ||
|   | 554be56639 | ||
|   | b4de2458ab | ||
|   | 49952bdc69 | ||
|   | b2fd24a098 | ||
|   | fe9d2570d0 | ||
|   | b16ac1ba8c | ||
|   | 330ce648d3 | 
							
								
								
									
										35
									
								
								.cvsignore
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								.cvsignore
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,35 @@ | ||||
| Makefile | ||||
| Makefile.in | ||||
| aclocal.m4 | ||||
| confdefs.h | ||||
| config.cache | ||||
| config.guess | ||||
| config.h | ||||
| config.log | ||||
| config.status | ||||
| config.sub | ||||
| configure | ||||
| configure.scan | ||||
| libtool | ||||
| ltconfig | ||||
| ltmain.sh | ||||
| stamp-h | ||||
| stamp-h.in | ||||
| stamp-h1 | ||||
| stamp.h | ||||
| version.h | ||||
| config.h.in | ||||
| install-sh | ||||
| missing | ||||
| mkinstalldirs | ||||
| INSTALL | ||||
| intl | ||||
| ABOUT-NLS | ||||
| COPYING | ||||
| intltool-* | ||||
| metacity.spec | ||||
| autom4te.cache | ||||
| compile | ||||
| depcomp | ||||
| omf.make | ||||
| xmldocs.make | ||||
							
								
								
									
										65
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										65
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -3,7 +3,6 @@ Makefile.in | ||||
| Makefile.in.in | ||||
| aclocal.m4 | ||||
| autom4te.cache | ||||
| build-aux | ||||
| compile | ||||
| config.guess | ||||
| config.h | ||||
| @@ -20,11 +19,11 @@ libtool | ||||
| ltmain.sh | ||||
| missing | ||||
| .deps | ||||
| 50-mutter-navigation.xml | ||||
| 50-mutter-system.xml | ||||
| 50-mutter-windows.xml | ||||
| mutter.desktop | ||||
| mutter-wayland.desktop | ||||
| src/50-mutter-navigation.xml | ||||
| src/50-mutter-system.xml | ||||
| src/50-mutter-windows.xml | ||||
| src/mutter-wm.desktop | ||||
| src/mutter.desktop | ||||
| *.o | ||||
| *.a | ||||
| *.lo | ||||
| @@ -33,6 +32,10 @@ mutter-wayland.desktop | ||||
| *.swp | ||||
| *.gir | ||||
| *.typelib | ||||
| tidy-enum-types.[ch] | ||||
| tidy-marshal.[ch] | ||||
| stamp-tidy-enum-types.h | ||||
| stamp-tidy-marshal.h | ||||
| stamp-h1 | ||||
| *.gmo | ||||
| *.make | ||||
| @@ -41,36 +44,40 @@ stamp-it | ||||
| .intltool-merge-cache | ||||
| POTFILES | ||||
| po/*.pot | ||||
| 50-metacity-desktop-key.xml | ||||
| 50-metacity-key.xml | ||||
| libmutter.pc | ||||
| mutter | ||||
| mutter-restart-helper | ||||
| mutter-test-client | ||||
| mutter-test-runner | ||||
| mutter-all.test | ||||
| mutter-theme-viewer | ||||
| mutter.desktop | ||||
| org.gnome.mutter.gschema.valid | ||||
| org.gnome.mutter.gschema.xml | ||||
| org.gnome.mutter.wayland.gschema.valid | ||||
| org.gnome.mutter.wayland.gschema.xml | ||||
| testasyncgetprop | ||||
| testboxes | ||||
| testgradient | ||||
| m4/* | ||||
| mutter-grayscale | ||||
| mutter-mag | ||||
| mutter-message | ||||
| mutter-window-demo | ||||
| focus-window | ||||
| test-attached | ||||
| test-focus | ||||
| test-gravity | ||||
| test-resizing | ||||
| test-size-hints | ||||
| # We can't say just "wm-tester" here or it will ignore the directory | ||||
| # rather than the binary | ||||
| src/wm-tester/wm-tester | ||||
| INSTALL | ||||
| mkinstalldirs | ||||
| meta-enum-types.[ch] | ||||
| src/stamp-meta-enum-types.h | ||||
| src/meta-dbus-display-config.[ch] | ||||
| src/mutter-enum-types.[ch] | ||||
| src/stamp-mutter-enum-types.h | ||||
| src/mutter-marshal.[ch] | ||||
| src/stamp-mutter-marshal.h | ||||
| src/meta-dbus-xrandr.[ch] | ||||
| src/meta-dbus-idle-monitor.[ch] | ||||
| src/meta-dbus-login1.[ch] | ||||
| src/gtk-shell-protocol.c | ||||
| src/gtk-shell-server-protocol.h | ||||
| src/xdg-shell-protocol.c | ||||
| src/xdg-shell-server-protocol.h | ||||
| src/pointer-gestures-protocol.c | ||||
| src/pointer-gestures-server-protocol.h | ||||
| src/xserver-protocol.c | ||||
| src/xserver-server-protocol.h | ||||
| src/meta/meta-version.h | ||||
| src/mutter-plugins.pc | ||||
| doc/reference/*.args | ||||
| doc/reference/*.bak | ||||
| doc/reference/*.hierarchy | ||||
| @@ -88,11 +95,3 @@ doc/reference/meta-undocumented.txt | ||||
| doc/reference/meta-unused.txt | ||||
| doc/reference/meta-docs.sgml | ||||
| doc/reference/meta.types | ||||
| gtk-doc.m4 | ||||
| intltool.m4 | ||||
| libtool.m4 | ||||
| ltoptions.m4 | ||||
| ltsugar.m4 | ||||
| ltversion.m4 | ||||
| lt~obsolete.m4 | ||||
| .dirstamp | ||||
|   | ||||
							
								
								
									
										159
									
								
								COMPLIANCE
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										159
									
								
								COMPLIANCE
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,159 @@ | ||||
| Metacity Standards Compliance | ||||
| ============================= | ||||
| $Id$ | ||||
|  | ||||
| 1) Introduction | ||||
| 2) EWMH Compliance | ||||
|   a. Root Window Properties | ||||
|   b. Root Window Messages | ||||
|   c. Application Window Properties | ||||
|   d. Window Manager Protocols | ||||
| 3) ICCCM Compliance | ||||
|  | ||||
| 1) Introduction | ||||
| --------------- | ||||
|  | ||||
| This document details metacity compliance with the relevent standards. | ||||
| The format of this document is as follows: | ||||
|  | ||||
| [-/+?] Hint Name/Feature Name (Version number) | ||||
|        Errata/Comments | ||||
|  | ||||
| The first character indicates the level of compliance as follows: | ||||
|     -   none | ||||
|     /   partial | ||||
|     +   complete | ||||
|     ?   unknown | ||||
|  | ||||
| The title indicates a feature or a hint in the specification, and the | ||||
| version number indicates the minimum version of the specification | ||||
| supported by metacity.  Later versions may be supported if no | ||||
| incompatible changes have been made in the specification. | ||||
|  | ||||
| 2) EWMH Compliance | ||||
| ------------------ | ||||
|  | ||||
| The EWMH, or Extended Window Manager Hints is a freedesktop.org- | ||||
| developed standard to support a number of conventions for | ||||
| communication between the window manager and clients.  It builds on | ||||
| and extends the ICCCM (See Section 3).  A copy of the current EWMH | ||||
| standard is available at http://freedesktop.org/Standards/wm-spec/ | ||||
|  | ||||
|   a. Root Window Properties | ||||
|   ------------------------- | ||||
|  | ||||
| + _NET_SUPPORTED (1.3) | ||||
|  | ||||
| + _NET_CLIENT_LIST (1.3) | ||||
|  | ||||
| + _NET_NUMBER_OF_DESKTOPS (1.3) | ||||
|  | ||||
| + _NET_DESKTOP_GEOMETRY (1.3) | ||||
|   Metacity does not implement large desktops, so this is kept set to | ||||
|   the screen size. | ||||
|  | ||||
| + _NET_DESKTOP_VIEWPORT (1.3) | ||||
|   Metacity does not implement viewports, so this is a constant (0,0). | ||||
|  | ||||
| + _NET_CURRENT_DESKTOP (1.3) | ||||
|  | ||||
| + _NET_DESKTOP_NAMES (1.3) | ||||
|  | ||||
| + _NET_ACTIVE_WINDOW (1.3) | ||||
|  | ||||
| + _NET_WORKAREA (1.3) | ||||
|  | ||||
| + _NET_SUPPORTING_WM_CHECK (1.3) | ||||
|  | ||||
| + _NET_VIRTUAL_ROOTS (1.3) | ||||
|   Metacity does not read or set this property, but it does not use | ||||
|   virtual roots to implement virtual desktops, so it complies with the | ||||
|   specification. | ||||
|  | ||||
| + _NET_DESKTOP_LAYOUT (1.3) | ||||
|  | ||||
| + _NET_SHOWING_DESKTOP (1.3) | ||||
|  | ||||
|   b. Root Window Messages | ||||
|   ----------------------- | ||||
|  | ||||
| + _NET_CLOSE_WINDOW (1.3) | ||||
|  | ||||
| - _NET_MOVERESIZE_WINDOW (1.3) | ||||
|   Metacity supports this message, but the specification is unclear on | ||||
|   the layout of the detail value, and as such it is #if 0'd in the code | ||||
|  | ||||
| + _NET_WM_MOVERESIZE (1.3) | ||||
|  | ||||
| - _NET_RESTACK_WINDOW (1.3) | ||||
|   Metacity will raise or lower windows in response to this message, | ||||
|   but the sibling restack modes are not supported, and it is currently | ||||
|   #if 0'd in the code. | ||||
|  | ||||
| + _NET_REQUEST_FRAME_EXTENTS (1.3)   | ||||
|  | ||||
|   c. Application Window Properties | ||||
|   -------------------------------- | ||||
|  | ||||
| + _NET_WM_NAME (1.3) | ||||
|  | ||||
| + _NET_WM_VISIBLE_NAME (1.3) | ||||
|   Metacity does not set this property, but metacity will never display | ||||
|   a name different from _NET_WM_NAME | ||||
|  | ||||
| + _NET_WM_ICON_NAME (1.3) | ||||
|  | ||||
| + _NET_WM_VISIBLE_ICON_NAME (1.3) | ||||
|   Metacity does not set this property, but metacity will never display | ||||
|   a name different from _NET_WM_NAME | ||||
|  | ||||
| + _NET_WM_DESKTOP (1.3) | ||||
|  | ||||
| + _NET_WM_WINDOW_TYPE (1.3) | ||||
|  | ||||
| / _NET_WM_STATE (1.3) | ||||
|   This property is read and updated according to the specification, | ||||
|   but see caveat below. | ||||
|   Metacity does not recognize separate vertical and horizontal | ||||
|   maximization states.  Currently metacity will do a two-dimensional | ||||
|   maximization if either property is set. | ||||
|   See: http://bugzilla.gnome.org/show_bug.cgi?id=113601 | ||||
|   Metacity doesn't implement viewports so _NET_WM_STATE_STICKY is | ||||
|   unimplemented. | ||||
|  | ||||
| + _NET_WM_ALLOWED_ACTIONS (1.3) | ||||
|   Metacity keeps this hint up to date.  The code is somewhat crufty | ||||
|   and should be rewritten, though it is functional. | ||||
|   See: http://bugzilla.gnome.org/show_bug.cgi?id=90420 | ||||
|  | ||||
| + _NET_WM_STRUT (1.3) | ||||
|  | ||||
| + _NET_WM_STRUT_PARTIAL (1.3) | ||||
|  | ||||
| + _NET_WM_ICON_GEOMETRY (1.3) | ||||
|   Metacity uses this property to draw minimize/restore animations | ||||
|  | ||||
| + _NET_WM_ICON (1.3) | ||||
|  | ||||
| + _NET_WM_PID (1.3) | ||||
|  | ||||
| + _NET_WM_HANDLED_ICONS (1.3) | ||||
|   Metacity does not read or set this property.  However, metacity | ||||
|   never manages iconified windows, and so has no need to do so. | ||||
|  | ||||
| + _NET_WM_USER_TIME (1.3) | ||||
|   Metacity uses this property to prevent applications from stealing | ||||
|   focus if supported by the toolkit. | ||||
|  | ||||
| + _NET_FRAME_EXTENTS (1.3) | ||||
|   If set in response to a _NET_REQUEST_FRAME_EXTENTS message received | ||||
|   prior to the window being mapped, this may be an estimate.  This is, | ||||
|   however, expressly allowed by the specification. | ||||
|  | ||||
|   d. Window Manager Protocols | ||||
|   --------------------------- | ||||
| + _NET_WM_PING (1.3) | ||||
|  | ||||
| 3) ICCCM Compliance | ||||
| ------------------- | ||||
| TODO | ||||
							
								
								
									
										298
									
								
								HACKING
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										298
									
								
								HACKING
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,298 @@ | ||||
| Intro... | ||||
|  | ||||
| Window managers have a few ways in which they are significantly different | ||||
| from other applications.  This file, combined with the code overview in | ||||
| doc/code-overview.txt, should hopefully provide a series of relatively | ||||
| quick pointers (hopefully only a few minutes each) to some of the places | ||||
| one can look to orient themselves and get started.  Some of this will be | ||||
| general to window managers on X, much will be specific to Metacity, and | ||||
| there's probably some information that's common to programs in general but | ||||
| is nonetheless useful. | ||||
|  | ||||
| Overview | ||||
|   Administrative issues | ||||
|   Minimal Building/Testing Environment | ||||
|   Relevant standards and X properties | ||||
|   Debugging and testing | ||||
|     Debugging logs | ||||
|     Adding information to the log | ||||
|     Valgrind | ||||
|     Testing Utilities | ||||
|   Technical gotchas to keep in mind | ||||
|   Other important reading | ||||
|     Extra reading | ||||
|     Ideas for tasks to work on | ||||
|  | ||||
|  | ||||
| Administrative issues | ||||
|   Don't commit substantive code in here without asking hp@redhat.com. | ||||
|   Adding translations, no-brainer typo fixes, etc. is fine. | ||||
|  | ||||
|   The code could use cleanup in a lot of places, feel free to do so. | ||||
|  | ||||
|   See http://developer.gnome.org/dotplan/for_maintainers.html for | ||||
|   information on how to make a release.  The only difference from those | ||||
|   instructions is that the minor version number of a Metacity release | ||||
|   should always be a number from the Fibonacci sequence. | ||||
|  | ||||
| Minimal Building/Testing Environment | ||||
|   You do not need to _install_ a development version of Metacity to | ||||
|   build, run and test it; you can run it from some temporary | ||||
|   directory.  Also, you do not need to build all of Gnome in order to | ||||
|   build a development version of Metacity -- odds are, you may be able | ||||
|   to build metacity from CVS without building any other modules. | ||||
|  | ||||
|   As long as you have gtk+ >= 3.0 and GIO >= 2.25.10 with your distro | ||||
|   (gtk+ >= 2.6 if you manually revert the change from bug 348633), you | ||||
|   should be able to install your distro's development packages | ||||
|   (e.g. gtk2-devel, glib-devel, startup-notification-devel on | ||||
|   Fedora; also, remember to install the gnome-common package which is | ||||
|   needed for building cvs versions of Gnome modules like Metacity) as | ||||
|   well as the standard development tools (gcc, autoconf, automake, | ||||
|   pkg-config, intltool, and libtool) and be ready to build and test | ||||
|   Metacity.  Steps to do so: | ||||
|  | ||||
|   $ svn checkout http://svn.gnome.org/svn/metacity/trunk metacity | ||||
|   $ cd metacity | ||||
|   $ ./autogen.sh --prefix /usr | ||||
|   $ make | ||||
|   $ ./src/metacity --replace | ||||
|  | ||||
|   Again, note that you do not need to run 'make install'. | ||||
|  | ||||
| Relevant standards and X properties | ||||
|   There are two documents that describe some basics about how window | ||||
|   managers should behave: the ICCCM (Inter-Client Communication Conventions | ||||
|   Manual) and EWMH (Extended Window Manager Hints).  You can find these at | ||||
|   the following locations: | ||||
|     ICCCM - http://tronche.com/gui/x/icccm/ | ||||
|     EWMH  - :pserver:anoncvs@pdx.freedesktop.org:/cvs | ||||
|   The ICCCM is usually available in RPM or DEB format as well.  There is | ||||
|   actually an online version of the EWMH, but it is almost always woefully | ||||
|   out of date.  Just get it from cvs with these commands (the backslash | ||||
|   means include the stuff from the next line): | ||||
|     cvs -d :pserver:anoncvs@cvs.freedesktop.org:/cvs/icccm-extensions login | ||||
|     cvs -d :pserver:anoncvs@cvs.freedesktop.org:/cvs/icccm-extensions \ | ||||
|       checkout wm-spec | ||||
|  | ||||
|   DO NOT GO AND READ THOSE THINGS.  THEY ARE REALLY, REALLY BORING. | ||||
|  | ||||
|   If you do, you'll probably end up catching up on your sleep instead of | ||||
|   hacking on Metacity. ;-)  Instead, just look at the table of contents and | ||||
|   glance at a page or two to get an idea of what's in there.  Then only | ||||
|   refer to it if you see something weird in the code and you don't know | ||||
|   what it is but has some funny looking name like you see in one of those | ||||
|   two documents. | ||||
|  | ||||
|   You can refer to the COMPLIANCE file for additional information on these | ||||
|   specifications and Metacity's compliance therewith. | ||||
|  | ||||
|   One of the major things those documents cover that are useful to learn | ||||
|   about immediately are X properties.  The right way to learn about those, | ||||
|   though, is through hand on experimentation with the xprop command (and | ||||
|   then look up things you find from xprop in those two manuals if you're | ||||
|   curious enough).  First, try running | ||||
|     xprop | ||||
|   in a terminal and click on one of the windows on your screen.  That gives | ||||
|   you the x properties for that window.  Look through them and get a basic | ||||
|   idea of what's there for kicks.  Note that you can get rid of some of the | ||||
|   verboseness by grepping out the _NET_WM_ICON stuff, i.e. | ||||
|     xprop | grep -v _NET_WM_ICON | ||||
|   Next, try running | ||||
|     xprop -root | ||||
|   in a terminal.  There's all the properties of the root window (which you | ||||
|   can think of as the "main" Xserver window).  You can also manually | ||||
|   specify individual windows that you want the properties of with | ||||
|     xprop -id <id> | ||||
|   if you know the id of the window in question.  You can get the id of a | ||||
|   given window by either running xwininfo, e.g. | ||||
|     xwininfo | grep "Window id" | cut -f 4 -d ' ' | ||||
|   or by looking at the _NET_CLIENT_STACKING property of the root | ||||
|   window.  Finally, it can also be useful to add "-spy" (without the | ||||
|   quotes) to the xprop command to get it to continually monitor that | ||||
|   window and report any changes to you. | ||||
|  | ||||
| Debugging information | ||||
|   Trying to run a window manager under a typical debugger, such as gdb, | ||||
|   unfortunately just doesn't work very well.  So, we have to resort to | ||||
|   other methods. | ||||
|  | ||||
|   Debugging logs | ||||
|  | ||||
|   First, note that you can start a new version of metacity to replace the | ||||
|   existing one by running | ||||
|     metacity --replace | ||||
|   (which also comes in handy in the form "./src/metacity --replace" when | ||||
|   trying to quickly test a small change while hacking on metacity without | ||||
|   doing a full "make install", though I'm going off topic...)  This will | ||||
|   allow you to see any warnings printed at the terminal.  Sometimes it's | ||||
|   useful to have these directed to a logfile instead, which you can do by | ||||
|   running | ||||
|     METACITY_USE_LOGFILE=1 metacity --replace | ||||
|   The logfile it uses will be printed in the terminal.  Sometimes, it's | ||||
|   useful to get more information than just warnings.  You can set | ||||
|   METACITY_VERBOSE to do that, like so: | ||||
|     METACITY_VERBOSE=1 METACITY_USE_LOGFILE=1 metacity --replace | ||||
|   (note that METACITY_VERBOSE=1 can be problematic without | ||||
|   METACITY_USE_LOGFILE=1; avoid it unless running in from something that | ||||
|   won't be managed by the new Metacity--see bug 305091 for more details). | ||||
|   There are also other flags, such as METACITY_DEBUG, most of which I | ||||
|   haven't tried and don't know what they do.  Go to the source code | ||||
|   directory and run | ||||
|     grep "METACITY_" * | grep getenv | ||||
|   to find out what the other ones are. | ||||
|  | ||||
|   Adding information to the log | ||||
|  | ||||
|   Since we can't single step with a debugger, we often have to fall back to | ||||
|   the primitive method of getting information we want to know: adding | ||||
|   "print" statements.  Metacity has a fairly structured way to do this, | ||||
|   using the functions meta_warning, meta_topic, and meta_verbose.  All | ||||
|   three have the same basic format as printf, except that meta_topic also | ||||
|   takes a leading enumeration parameter to specify the type of message | ||||
|   being shown (makes it easier for grepping in a verbose log).  You'll find | ||||
|   tons of examples in the source code if you need them; just do a quick | ||||
|   grep or look in most any file.  Note that meta_topic and meta_verbose | ||||
|   messages only appear if verbosity is turned on.  I tend to frequently add | ||||
|   temporary meta_warning statements (or switch meta_topic or meta_verbose | ||||
|   ones to meta_warning ones) and then undo the changes once I've learned | ||||
|   the info that I needed. | ||||
|  | ||||
|   There is also a meta_print_backtrace (which again is only active if | ||||
|   verbosity is turned on) that can also be useful if you want to learn how | ||||
|   a particular line of code gets called.  And, of course, there's always | ||||
|   g_assert if you want to make sure some section isn't executed (or isn't | ||||
|   executed under certain conditions). | ||||
|  | ||||
|   Valgrind | ||||
|  | ||||
|   Valgrind is awesome for finding memory leaks or corruption and | ||||
|   uninitialized variables.  But I also tend to use it in a non-traditional | ||||
|   way as a partial substitute for a normal debugger: it can provide me with | ||||
|   a stack trace of where metacity is crashing if I made a change that | ||||
|   caused it to do so, which is one of the major uses of debuggers.  (And, | ||||
|   what makes it cooler than a debugger is that there will also often be | ||||
|   warnings pinpointing the cause of the crash from either some kind of | ||||
|   simple memory corruption or an uninitialized variable).  Sometimes, when | ||||
|   I merely want to know what is calling a particular function I'll just | ||||
|   throw in an "int i; printf("%d\n", i);" just because valgrind will give | ||||
|   me a full stacktrace whenever it sees that uninitialized variable being | ||||
|   used (yes, I could use meta_print_backtrace, but that means I have to | ||||
|   turn verbosity on). | ||||
|  | ||||
|   To run metacity under valgrind, use options typical for any Gnome | ||||
|   program, such as | ||||
|     valgrind --log-file=metacity.log --tool=memcheck --num-callers=48 \ | ||||
|     --leak-check=yes --leak-resolution=high --show-reachable=yes     \ | ||||
|     ./src/metacity --replace | ||||
|   where, again, the backslashes mean to join all the stuff on the following | ||||
|   line with the previous one. | ||||
|  | ||||
|   However, there is a downside.  Things run a little bit slowly, and it | ||||
|   appears that you'll need about 1.5GB of ram, which unfortunately prevents | ||||
|   most people from trying this. | ||||
|  | ||||
|   Testing Utilities | ||||
|  | ||||
|   src/run-metacity.sh | ||||
|     The script src/run-metacity.sh is useful to hack on the window manager.  | ||||
|     It runs metacity in an Xnest. e.g.: | ||||
|       CLIENTS=3 ./run-metacity.sh | ||||
|     or  | ||||
|       DEBUG=memprof ./run-metacity.sh | ||||
|     or | ||||
|       DEBUG_TEST=1 ./run-metacity-sh | ||||
|     or whatever. | ||||
|  | ||||
|   metacity-message | ||||
|     The tool metacity-message can be used as follows: | ||||
|       metacity-message reload-theme | ||||
|       metacity-message restart | ||||
|       metacity-message enable-keybindings | ||||
|       metacity-message disable-keybindings | ||||
|     The first of these is useful for testing themes, the second is just | ||||
|     another way (besides the --restart flag to metacity itself) of | ||||
|     restarting metacity, and the third is useful for testing Metacity when | ||||
|     running it under an Xnest (typically, the Metacity under the Xnest | ||||
|     wouldn't get keybinding notifications--making keyboard navigation not | ||||
|     work--but if you disable the keybindings for the global Metacity then | ||||
|     the Metacity under the Xnest can then get those keybinding notifications). | ||||
|  | ||||
|   metacity-window-demo | ||||
|     metacity-window-demo is good for trying behavior of various kinds | ||||
|     of window without launching a full desktop. | ||||
|  | ||||
| Technical gotchas to keep in mind | ||||
|   Files that include gdk.h or gtk.h are not supposed to include | ||||
|   display.h or window.h or other core files.  Files in the core | ||||
|   (display.[hc], window.[hc]) are not supposed to include gdk.h or | ||||
|   gtk.h.  Reasons: | ||||
|  | ||||
|     "Basically you don't want GDK most of the time. It adds | ||||
|     abstractions that cause problems, because they aren't designed to | ||||
|     be used in a WM where we do weird stuff (display grabs, and just | ||||
|     being the WM). At best GDK adds inefficiency, at worst it breaks | ||||
|     things in weird ways where you have to be a GDK guru to figure | ||||
|     them out. Owen also told me that they didn't want to start adding | ||||
|     a lot of hacks to GDK to let a WM use it; we both agreed back in | ||||
|     the mists of time that metacity would only use it for the "UI" | ||||
|     bits as it does. | ||||
|  | ||||
|     Having the split in the source code contains and makes very clear | ||||
|     the interface between the WM and GDK/GTK. This keeps people from | ||||
|     introducing extra GDK/GTK usage when it isn't needed or | ||||
|     appropriate. Also, it speeds up the compilation a bit, though this | ||||
|     was perhaps more relevant 5 years ago than it is now. | ||||
|  | ||||
|     There was also a very old worry that the GDK stuff might have to | ||||
|     be in a separate process to work right; that turned out to be | ||||
|     untrue. Though who knows what issues the CM will introduce." | ||||
|  | ||||
|   Remember that strings stored in X properties are not in UTF-8, and they | ||||
|   have to end up in UTF-8 before we try putting them through Pango. | ||||
|  | ||||
|   If you make any X request involving a client window, you have to | ||||
|   meta_error_trap_push() around the call; this is not necessary for X | ||||
|   requests on the frame windows. | ||||
|  | ||||
|   Remember that not all windows have frames, and window->frame can be NULL. | ||||
|  | ||||
| Other important reading & where to get started | ||||
|   Extra reading | ||||
|  | ||||
|   There are some other important things to read to get oriented as well. | ||||
|   These are: | ||||
|     http://pobox.com/~hp/features.html | ||||
|     rationales.txt | ||||
|     doc/code-overview.txt | ||||
|  | ||||
|   It pays to read http://pobox.com/~hp/features.html in order | ||||
|   to understand the philosophy of Metacity. | ||||
|  | ||||
|   The rationales.txt file has two things: (1) a list of design choices with | ||||
|   links in the form of bugzilla bugs that discuss the issue, and (2) a list | ||||
|   outstanding bug categories, each of which is tracked by a particular | ||||
|   tracker bug in bugzilla from which you can find several closely related | ||||
|   bug reports. | ||||
|  | ||||
|   doc/code-overview.txt provides a fairly good overview of the code, | ||||
|   including coverage of the function of the various files, the main | ||||
|   structures and their relationships, and places to start looking in the | ||||
|   code tailored to general categories of tasks. | ||||
|  | ||||
|   Ideas for tasks to work on | ||||
|  | ||||
|   There are a variety of things you could work on in the code.  You may | ||||
|   have ideas of your own, but in case you don't, let me provide a list of | ||||
|   ideas you could choose from: | ||||
|  | ||||
|   If you're ambitious, there's a list of things Havoc made that he'd really | ||||
|   like to see tackled, which you can find at | ||||
|   http://log.ometer.com/2004-05.html.  Be sure to double check with someone | ||||
|   to make sure the item is still relevant if you're interested in one of | ||||
|   these.  Another place to look for ideas, of course, is bugzilla.  One can | ||||
|   just do queries and look for things that look fixable. | ||||
|  | ||||
|   However, perhaps the best way of getting ideas of related tasks to work | ||||
|   on, is to look at the second half of the rationales.txt file, which tries | ||||
|   to group bugs by type. | ||||
							
								
								
									
										8
									
								
								MAINTAINERS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								MAINTAINERS
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| Tomas Frydrych | ||||
| Email: tf linux intel com | ||||
| Userid: tomasf | ||||
|  | ||||
| Owen Taylor | ||||
| Email: otaylor redhat com | ||||
| Userid: otaylor | ||||
|  | ||||
							
								
								
									
										43
									
								
								METACITY_MAINTAINERS
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								METACITY_MAINTAINERS
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | ||||
| Currently active maintainers | ||||
| -------------------------------- | ||||
|  | ||||
| Elijah Newren | ||||
| Email: newren gmail com | ||||
| Userid: newren | ||||
|  | ||||
|   - Usually won't touch the theme bugs (isn't interested) or the | ||||
|     compositor (until open source nvidia drivers are up to snuff). | ||||
|     Tends to be most interested in libwnck/gtk interactions, focus | ||||
|     issues, constraints problems, and raising/stacking, but works on | ||||
|     just about anything other than themes and the compositor. | ||||
|  | ||||
| Thomas Thurman | ||||
| Email: thomas thurman org uk | ||||
| Userid: tthurman | ||||
|  | ||||
|   - Responsible for all theme bugs and the compositor (thank goodness | ||||
|     Thomas got involved, eh?).  I'm sure he'll replace this sentence | ||||
|     with his interests when he reads it.  ;-) | ||||
|  | ||||
|  | ||||
| Semi-active maintainers | ||||
| -------------------------------- | ||||
|  | ||||
| Havoc Pennington | ||||
| Email: hp  redhat com | ||||
| Userid: hp | ||||
|   - Original author.  Doesn't patch metacity anymore, but is active in | ||||
|     answering questions, responding to bugs, providing very helpful | ||||
|     suggestions and insight, and even assisting with debugging. | ||||
|  | ||||
|  | ||||
| Important historical figureheads | ||||
| -------------------------------- | ||||
|  | ||||
| Rob Adams (readams  readams net) | ||||
|   - Was the main maintainer of metacity for a while; particular areas | ||||
|     of focus included xinerama, placement, and an older version of the | ||||
|     constraints code.  Still responds to bugs every once in a while. | ||||
|  | ||||
| Søren Sandmann (sandmann  redhat com) | ||||
|   - Wrote most of the current compositing manager code + libcm | ||||
							
								
								
									
										15
									
								
								Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										15
									
								
								Makefile.am
									
									
									
									
									
								
							| @@ -1,11 +1,12 @@ | ||||
|  | ||||
| SUBDIRS = data src po doc | ||||
| SUBDIRS=src po doc | ||||
|  | ||||
| ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} | ||||
|  | ||||
| DISTCLEANFILES = \ | ||||
| 	intltool-extract \ | ||||
| 	intltool-merge \ | ||||
| 	intltool-update \ | ||||
| 	po/stamp-it \ | ||||
| 	po/.intltool-merge-cache | ||||
| EXTRA_DIST = HACKING MAINTAINERS rationales.txt | ||||
|  | ||||
| DISTCLEANFILES = intltool-extract intltool-merge intltool-update po/stamp-it po/.intltool-merge-cache | ||||
|  | ||||
| DISTCHECK_CONFIGURE_FLAGS = --enable-gtk-doc | ||||
|  | ||||
| ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS} | ||||
|   | ||||
							
								
								
									
										602
									
								
								NEWS
									
									
									
									
									
								
							
							
						
						
									
										602
									
								
								NEWS
									
									
									
									
									
								
							| @@ -1,460 +1,46 @@ | ||||
| 3.18.1 | ||||
| 3.12.2 | ||||
| ====== | ||||
| * Misc. crash fixes [Jonas, Rui, Carlos, Owen, Florian; #755096, #754979, | ||||
|   #755490, #754357, #745785, #756642] | ||||
| * Improve HiDPI support on wayland [Jonas; #755097] | ||||
| * Fix doubly-scaled cursor on XWayland HiDPI [Jonas; #755099] | ||||
| * Stop hiding titlebar buttons in dialogs [Florian; #641630] | ||||
| * Add support for fullscreen/unfullscreen animations [Cosimo; #707248] | ||||
| * Misc. bug fixes [Rui, Colin, Florian; #743339, #752047, #756074, #756649] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Cosimo Cecchi, Carlos Garnacho, Rui Matos, Florian Müllner, | ||||
|   Jasper St. Pierre, Colin Walters, Owen W. Taylor | ||||
|  | ||||
| 3.18.0 | ||||
| ====== | ||||
| * Misc. fixes [Florian, Jonas; #753434] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Florian Müllner | ||||
|  | ||||
| Translations: | ||||
|   Rūdolfs Mazurs [lv] | ||||
|  | ||||
| 3.17.92 | ||||
| ======= | ||||
| * Don't omit the background color for backgrounds that don't fill the screen | ||||
|   [Ray; #754476] | ||||
| * Fix up key state on FocusIn when running nested [Owen; #753948] | ||||
| * Find the right DRM device instead of hardcoding card0 [Marek; #753434] | ||||
| * Scale cursor on HiDPI screens [Jonas; #744932] | ||||
| * Misc. fixes and cleanups [Lan, Jonas, Javier, Olivier; #754545, #754215, | ||||
|   #754621, #754715] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Marek Chalupa, Olivier Fourdan, Javier Jardón, Ting-Wei Lan, | ||||
|   Ray Strode, Owen W. Taylor | ||||
|  | ||||
| 3.17.91 | ||||
| ======= | ||||
| * Send error on pointer-gesture protocol version mismatch [Jonas; #753855] | ||||
| * Misc. cleanups [Jonas; #744932] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl | ||||
|  | ||||
| Translations: | ||||
|   Chao-Hsiung Liao [zh_TW], Piotr Drąg [pl] | ||||
|  | ||||
| 3.17.90 | ||||
| ======= | ||||
| * Fix glitch with some fullscreen apps [Rui; #753020] | ||||
| * Fix screen update issue with NVidia driver [Aaron, Rui; #728464] | ||||
| * Only call frame callbacks for surfaces that get drawn [Adel; #739163] | ||||
| * Misc. bug fixes and cleanups [Jonas, Rui, Ting-Wei; #753222, #752753, #753237, | ||||
|   #753380, #744104, #744932] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Adel Gadllah, Carlos Garnacho, Ting-Wei Lan, Rui Matos, | ||||
|   Florian Müllner, Aaron Plattner, Jasper St. Pierre | ||||
|  | ||||
| Translations: | ||||
|   Akom Chotiphantawanon [th] | ||||
|  | ||||
| 3.17.4 | ||||
| ====== | ||||
| * nested: Allow basic configuration of dummy outputs [Jonas; #747089] | ||||
| * Send wl_surface.enter and wl_surface.leave on output changes [Jonas; #744453] | ||||
| * Improve HiDPI handling on wayland [Jonas; #745655, #744934] | ||||
| * Implement compositor-side animated cursors [Carlos; #752342] | ||||
| * Misc. bug fixes [Peter, Marek, Carlos, Matthias, Rui; #750816, #751884, | ||||
|   #752248, #752551, #752552, #752673, #752674] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Marek Chalupa, Matthias Clasen, Carlos Garnacho, Peter Hutterer, | ||||
|   Rui Matos, Florian Müllner, Jasper St. Pierre | ||||
|  | ||||
| 3.17.3 | ||||
| ====== | ||||
| * Add X11/wayland clipboard interaction [Carlos; #738312] | ||||
| * Support VM monitor layout hints on wayland [Thomas; #750363] | ||||
| * Misc. bug fixes [Rui, Jonas, Olivier, Carlos, Ting-Wei, Peter, Florian; | ||||
|   #749994, #750256, #749716, #748705, #750552, #751036, #750007, #751136, | ||||
|   #750552, #751471, #751715, #750680] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Dave Airlie, Cosimo Cecchi, Olivier Fourdan, Carlos Garnacho, | ||||
|   Thomas Hellstrom, Peter Hutterer, Ting-Wei Lan, Jasper Lievisse Adriaanse, | ||||
|   Rui Matos, Florian Müllner, Jasper St. Pierre | ||||
|  | ||||
| Translations: | ||||
|   Marek Černocký [cs], Christian Kirbach [de], Pedro Albuquerque [pt] | ||||
|  | ||||
| 3.17.2 | ||||
| ====== | ||||
| * Honor default value for click method setting [Rui; #746290] | ||||
| * Add X11/wayland clipboard interoperation [Carlos; #738312] | ||||
| * Misc. bug fixes [Rui; #749076, #749711] | ||||
|  | ||||
| Contributors: | ||||
|   Carlos Garnacho, Rui Matos, Jasper St. Pierre | ||||
|  | ||||
| 3.17.1 | ||||
| ====== | ||||
| * Add public method to get neighboring monitor [Florian; #633994] | ||||
| * Apply the right settings to the right input devices [Carlos; #747886] | ||||
| * Fix scroll button setting [Ondrej; #747967] | ||||
| * Add support for modal hint on wayland [Jonas; #745720] | ||||
| * Don't reset idle time for non-hardware events [Rui; #748541] | ||||
| * Misc. bug fixes [Ray, Rui; #748380, #748478] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Carlos Garnacho, Ondrej Holy, Rui Matos, Florian Müllner, | ||||
|   Jasper St. Pierre, Ray Strode, Tomeu Vizoso | ||||
|  | ||||
| 3.16.1 | ||||
| ====== | ||||
| * Add function to refresh all background instances [Rui; #739178] | ||||
| * Fix swapped scroll methods on wayland [Ondrej; #746870] | ||||
| * Manually activate stage to fix accessibility on wayland [Ray, Rui; #746670] | ||||
| * Center pointer on primary monitor on startup [Carlos; #746896] | ||||
| * wayland: Reword synchronized state application semantics [Jonas; #743617] | ||||
| * Ensure input settings are applied on startup [Rui; #747434] | ||||
| * Misc. bug fixes [Jonas, Giovanni, Calvin, Ray, Rui; #744932, #746509, #746692, | ||||
|   #746510, #746545, #747263] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Giovanni Campagna, Carlos Garnacho, Ondrej Holy, Rui Matos, | ||||
|   Jasper St. Pierre, Ray Strode, Calvin Walton | ||||
|  | ||||
| Translations: | ||||
|   Khaled Hosny [ar], Marek Černocký [cs] | ||||
|  | ||||
| 3.16.0 | ||||
| ====== | ||||
| * wayland: Don't skip notifying about initial maximized state [Jonas; #745303] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl | ||||
|  | ||||
| Translations: | ||||
|   Kjartan Maraas [nb], Jiri Grönroos [fi], Andika Triwidada [id], | ||||
|   Inaki Larranaga Murgoitio [eu], Ask H. Larsen [da], Muhammet Kara [tr] | ||||
|  | ||||
| 3.15.92 | ||||
| ======= | ||||
| * Ensure pointer visibility on monitor changes [Rui, Marek; #745121, #745752] | ||||
| * Fix geometry of shaded windows [Florian; #746145] | ||||
| * Take over cursor visibility handling from gsd [Carlos; #712775] | ||||
| * Fix touch interaction on window decorations [Carlos; #745335] | ||||
| * Add options for libinput_config_click_method [Carlos; #746290] | ||||
| * Scale window decorations on HiDPI displays [Florian; #744354] | ||||
| * Misc. bug fixes [Carlos, Ray, Rui; #745163, #746295, #746098, #745734] | ||||
|  | ||||
| Contributors: | ||||
|   Marek Chalupa, Carlos Garnacho, Rui Matos, Florian Müllner, | ||||
|   Jasper St. Pierre, Ray Strode | ||||
|  | ||||
| Translations: | ||||
|   Piotr Drąg [pl], Milo Casagrande [it], Changwoo Ryu [ko], | ||||
|   Daniel Korostil [uk], Baurzhan Muftakhidinov [kk], Trần Ngọc Quân [vi], | ||||
|   Alexander Shopov [bg], Jordi Mas [ca], Samir Ribic [bs], A S Alam [pa], | ||||
|   Matej Urbančič [sl] | ||||
|  | ||||
| 3.15.91 | ||||
| ======= | ||||
| * wayland: Fix nested compositor mode [Jonas; #745401] | ||||
| * wayland: Fix pointer constraining [Marek; #727337] | ||||
| * wayland: Fix input region on HiDPI [Jonas; #744933] | ||||
| * Allow themes to style buttons differently based on function [Horst; #745108] | ||||
| * Misc. bug fixes and cleanups [Ray, Rui, Alban; #745141, #745118, #745476, | ||||
|   #745442] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Alban Browaeys, Marek Chalupa, Horst, Rui Matos, | ||||
|   Jasper St. Pierre, Ray Strode | ||||
|  | ||||
| Translations: | ||||
|   Chao-Hsiung Liao [zh_TW], Efstathios Iosifidis [el], Dušan Kazik [sk], | ||||
|   Balázs Úr [hu], Daniel Mustieles [es], Claude Paroz [fr], Stas Solovey [ru], | ||||
|   Yosef Or Boczko [he], Rafael Ferreira [pt_BR], Aurimas Černius [lt], | ||||
|   Fran Dieguez [gl], Anders Jonsson [sv], Мирослав Николић [sr, sr@latin] | ||||
|  | ||||
| 3.15.90 | ||||
| ======= | ||||
| * Initialize MetaOutput even when we can't get the EDID [Rui; #743412] | ||||
| * Expose MetaMonitorManager to introspection [Rui; #743745] | ||||
| * Fix flash on unredirection [Chris; #743858] | ||||
| * Update xdg-shell implementation to v5 [Jonas; #744452] | ||||
| * Do not try to use seat devices that aren't (yet) present [Ray; #744640] | ||||
| * Add keybindings for switching to VT8-VT12 [Ray; #744800] | ||||
| * Misc bug fixes [Jonas, Cosimo; #743678, #744500] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Cosimo Cecchi, Carlos Garnacho, Rui Matos, Jasper St. Pierre, | ||||
|   Ray Strode, Chris Wilson | ||||
|  | ||||
| Translations: | ||||
|   Yosef Or Boczko [he], Yuri Myasoedov [ru], Kristjan SCHMIDT [eo], | ||||
|   Matej Urbančič [sl], Dušan Kazik [sk] | ||||
|  | ||||
| 3.15.4 | ||||
| ====== | ||||
| * Use GTK+ theme for window decorations instead of metacity [Florian; #741917] | ||||
| * Export the same EDID information on X11 and wayland [Carlos; #742882] | ||||
| * Apply input device configuration on wayland [Carlos; #739397] | ||||
| * Implement pointer barriers on wayland [Jonas; #706655] | ||||
| * Misc. bug fixes (Ting-Wei, Rui, Ikey, Florian, Marek, Jonas; #741829, | ||||
|   #738630, #737463, #698995, #727893, #742825, #742824, #742841, #743173, | ||||
|   #743189, #743217, #743254] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Giovanni Campagna, Marek Chalupa, Ikey Doherty, Adel Gadllah, | ||||
|   Carlos Garnacho, Ting-Wei Lan, Rui Matos, Florian Müllner, Jasper St. Pierre, | ||||
|   Rico Tzschichholz | ||||
|  | ||||
| Translations: | ||||
|   Matej Urbančič [sl], Balázs Úr [hu], Marek Černocký [cs], | ||||
|   Inaki Larranaga Murgoitio [eu], Rafael Ferreira [pt_BR], | ||||
|   Daniel Mustieles [es], Fran Dieguez [gl] | ||||
|  | ||||
| 3.15.3 | ||||
| ====== | ||||
| * Don't leave left-over frames queued [Owen; #738686] | ||||
| * Set CRTC configuration even if it might be redundant [Rui; #740838] | ||||
|  | ||||
| Contributors: | ||||
|   Rui Matos, Jasper St. Pierre, Rico Tzschichholz, Owen W. Taylor | ||||
|  | ||||
| Translations: | ||||
|   Trần Ngọc Quân [vi], Muhammet Kara [tr] | ||||
|  | ||||
| 3.15.2 | ||||
| ====== | ||||
| * Don't enable hiDPI on monitors with broken EDID [Bastien; #734839] | ||||
| * Prevent crash applying monitor config for a closed lid [Rui; #739450] | ||||
| * Fix "flicker" during startup transition [Ray; #740377] | ||||
| * Misc. bug fixes [Lan, Florian, Carlos; #731521, #740133, #738890] | ||||
|  | ||||
| Contributors: | ||||
|   Emmanuele Bassi, Carlos Garnacho, Jonathon Jongsma, Ting-Wei Lan, Rui Matos, | ||||
|   Florian Müllner, Bastien Nocera, Jasper St. Pierre, Ray Strode | ||||
|  | ||||
| Translations: | ||||
|   Kjartan Maraas [nb] | ||||
|  | ||||
| 3.15.1 | ||||
| ====== | ||||
| * Use GResources for theme loading [Cosimo; #736936] | ||||
| * Fix headerbar drag getting stuck on xwayland [Carlos; #738411] | ||||
| * Fix wayland hiDPI regressions [Adel; #739161] | ||||
| * Misc bug fixes and cleanups [Jasper, Rui, Carlos; #662962, #738630, #738888, | ||||
|   #738890] | ||||
|  | ||||
| Contributors: | ||||
|   Cosimo Cecchi, Adel Gadllah, Carlos Garnacho, Rui Matos, Florian Müllner, | ||||
|   Jasper St. Pierre | ||||
|  | ||||
| 3.14.1 | ||||
| ====== | ||||
| * Fix move-titlebar-onscreen function [Florian; #736915] | ||||
| * Fix stacking of the guard window [Owen; #737233] | ||||
| * Fix keycode lookup for non-default layouts [Rui; #737134] | ||||
| * Fix workspaces-only-on-primary handling [Florian; #737178] | ||||
| * Don't unstick sticky windows on workspace removal [Florian; #737625] | ||||
| * Do not auto-minimize fullscreen windows [Jasper; #705177] | ||||
| * Upload keymap to newly added keyboard devices [Rui; #737673] | ||||
| * Apply keyboard repeat settings [Rui; #728055] | ||||
| * Don't send pressed keys on enter [Rui; #727178] | ||||
| * Fix build without wayland/native [Rico; #738225] | ||||
| * Send modifiers after the key event [Rui; #738238] | ||||
| * Fix unredirect heuristic [Adel; #738271] | ||||
| * Do not show system chrome over fullscreen windows [Florian; #693991] | ||||
| * Misc. bug fixes [Florian, Adel, Tom; #737135, #737581, #738146, #738384] | ||||
|  | ||||
| Contributors: | ||||
|   Tom Beckmann, Adel Gadllah, Carlos Garnacho, Rui Matos, Florian Müllner, | ||||
|   Jasper St. Pierre, Rico Tzschichholz, Owen W. Taylor | ||||
|  | ||||
| Translations: | ||||
|   Krishnababu Krothapalli [te], Мирослав Николић [sr, sr@latin], | ||||
|   Alexander Shopov [bg], Saibal Ray [bn_IN], Milo Casagrande [it], | ||||
|   Rūdolfs Mazurs [lv] | ||||
|  | ||||
| 3.14.0 | ||||
| ====== | ||||
| * Fix placement of popup windows on wayland [Jasper; #736812] | ||||
| * Only increment serial once per event [Jasper; #736840] | ||||
| * Fix window positioning regression with non-GTK+ toolkits [Owen; #736719] | ||||
|  | ||||
| Contributors: | ||||
|   Jasper St. Pierre, Owen W. Taylor | ||||
|  | ||||
| Translations: | ||||
|   Saibal Ray [bn_IN], Dušan Kazik [sk], Manoj Kumar Giri [or], | ||||
|   Christian Kirbach [de], Ask H. Larsen [da], YunQiang Su [zh_CN], | ||||
|   Bernd Homuth [de], Shankar Prasad [kn], Petr Kovar [cs], Rajesh Ranjan [hi] | ||||
|  | ||||
| 3.13.92 | ||||
| ======= | ||||
| * Rewrite background code [Owen; #735637, #736568] | ||||
| * Fix size in nested mode [Owen; #736279] | ||||
| * Fix destroy animation of background windows [Florian; #735927] | ||||
| * Wire keymap changes up to the wayland frontend [Rui; #736433] | ||||
| * Add a test framework and stacking tests [Owen; #736505] | ||||
| * Simplify handling of the merged X and wayland stack [Owen; #736559] | ||||
| * Fix cursor size on HiDPI [Adel; #729337] | ||||
| * Misc. bug fixes [Owen; #735632, #736589, #736694] | ||||
|  | ||||
| Contributors: | ||||
|   Adel Gadllah, Rui Matos, Florian Müllner, Jasper St. Pierre, Owen W. Taylor | ||||
|  | ||||
| Translations: | ||||
|   Andika Triwidada [id], Piotr Drąg [pl], Changwoo Ryu [ko], | ||||
|   Kjartan Maraas [nb], Ville-Pekka Vainio [fi], Yuri Myasoedov [ru], | ||||
|   Aurimas Černius [lt], Balázs Úr [hu], Sweta Kothari [gu], A S Alam [pa], | ||||
|   Sandeep Sheshrao Shedmake [mr], Shantha kumar [ta], Gil Forcada [ca], | ||||
|   Carles Ferrando [ca@valencia], Mattias Eriksson [sv] | ||||
|  | ||||
| 3.13.91 | ||||
| ======= | ||||
| * Misc. bug fixes [Carlos; #735452] | ||||
|  | ||||
| Contributors: | ||||
|   Adel Gadllah, Carlos Garnacho, Rui Matos, Jasper St. Pierre, | ||||
|   Rico Tzschichholz | ||||
|  | ||||
| Translations: | ||||
|   Chao-Hsiung Liao po/zh_HK, zh_TW.po, Enrico Nicoletto [pt_BR], | ||||
|   Kjartan Maraas [nb], Fran Diéguez [gl], Yosef Or Boczko [he], | ||||
|   Maria  Mavridou [el], Claude Paroz [fr] | ||||
|  | ||||
| 3.13.90 | ||||
| ======= | ||||
| * Only call XSync() once per frame [Rui; #728464] | ||||
| * Update capabilities on device list changes [Carlos; #733563] | ||||
| * Make use of GLSL optional [Adel; #733623] | ||||
| * Handle gestures and touch events on wayland [Carlos; #733631] | ||||
| * Add support for unminimize compositor effects [Cosimo; #733789] | ||||
| * Always set the frame background to None [Giovanni; #734054] | ||||
| * Add backend methods to handle keymaps [Rui; #734301] | ||||
| * Actually mark revalidated MetaTextureTower levels as valid [Owen; #734400] | ||||
| * Rely on explicit -backward switcher keybindings instead of <shift>-magic | ||||
|   [Christophe; #732295, #732385] | ||||
| * Misc. bug fixes and cleanups [Rui, Adel, Christophe; #727178, #734852, | ||||
|   #734960] | ||||
|  | ||||
| Contributors: | ||||
|   Emmanuele Bassi, Giovanni Campagna, Cosimo Cecchi, Piotr Drąg, | ||||
|   Christophe Fergeau, Adel Gadllah, Carlos Garnacho, Rui Matos, | ||||
|   Florian Müllner, Jasper St. Pierre, Rico Tzschichholz, Olav Vitters, | ||||
|   Owen W. Taylor | ||||
|  | ||||
| Translations: | ||||
|   Kjartan Maraas [nb], Inaki Larranaga Murgoitio [eu], Lasse Liehu [fi], | ||||
|   ngoswami [as], Daniel Mustieles [es] | ||||
|  | ||||
| 3.13.4 | ||||
| ====== | ||||
| * Fix move/resize operations for wayland clients [Marek; #731237] | ||||
| * Add ::first-frame signal to MetaWindowActor [Owen; #732343] | ||||
| * Handle keysyms without the XF86 prefix [Owen; #727993] | ||||
| * Add touch gesture support [Carlos] | ||||
| * Fix a deadlock when exiting [Owen; #733068] | ||||
| * Add framework for restarting the compositor with nice visuals | ||||
|   [Owen; #733026] | ||||
| * Toggle seat capabilities on VT switch [Carlos; #733563] | ||||
| * Misc bug fixes [Florian, Owen; #732695, #732350] | ||||
|  | ||||
| Contributors: | ||||
|   Tom Beckmann, Giovanni Campagna, Marek Chalupa, Adel Gadllah, | ||||
|   Carlos Garnacho, Florian Müllner, Jasper St. Pierre, Rico Tzschichholz, | ||||
|   Owen W. Taylor | ||||
|  | ||||
| Translations: | ||||
|   Yuri Myasoedov [ru], Fran Diéguez [gl], Aurimas Černius [lt], MarMav [el], | ||||
|   Enrico Nicoletto [pt_BR] | ||||
|  | ||||
| 3.13.3 | ||||
| ====== | ||||
| * Improve behavior of window buttons with compositor menus [Florian; #731058] | ||||
| * Implement touch support on wayland [Carlos; #724442] | ||||
| * Update window shadows [Nikita; #731866] | ||||
| * Keep windows on the preferred output [Florian; #731760] | ||||
| * Misc bug fixes [Jonas, Florian, Jasper; #729601, #730681, #731353, #731332, | ||||
|   #730527, #662962] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Nikita Churaev, Carlos Garnacho, Florian Müllner, | ||||
|   Jasper St. Pierre, Rico Tzschichholz | ||||
|  | ||||
| 3.13.2 | ||||
| ====== | ||||
| * Add basic HiDPI support on wayland [Adel; #728902] | ||||
| * Fix in-fullscreen state when moving between monitors [Florian; #728395] | ||||
| * Fix crash when monitors change during suspend [Giovanni; #725637] | ||||
| * Replace mutter-launch with logind integration [Jasper; #724604] | ||||
| * Move window menu into the compositor [Jasper; #726352] | ||||
| * Fix delayed focus-follows-mouse support [Florian; #730541] | ||||
| * Support fallback app menu in window decorations [Florian; #730752] | ||||
| * Misc. bug fixes and cleanups [Giovanni, Jonas, Jasper; #729732, #729602, | ||||
|   #726714] | ||||
| * Misc. bug fixes [Florian, Giovanni; #728423, #729732] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Giovanni Campagna, Adel Gadllah, Florian Müllner, | ||||
|   Jasper St. Pierre, Rico Tzschichholz | ||||
|   Giovanni Campagna, Florian Müllner | ||||
|  | ||||
| Translations: | ||||
|   Pau Iranzo [ca], Daniel Mustieles [es] | ||||
|   Christian Kirbach [de], Pau Iranzo [ca] | ||||
|  | ||||
| 3.13.1 | ||||
| 3.12.1 | ||||
| ====== | ||||
| * Fix opacity values from _NET_WM_WINDOW_OPACITY [Nirbheek; #727874] | ||||
| * Merge wayland branch [Jasper, Giovanni, Robert B., Neil, Adel, Rui, Jonas, | ||||
|   Lionel, Tim, Owen, Florian, Colin W., Cosimo, Ray, Kalev, Pavel, Robert A., | ||||
|   Magdalen, Marek, Matthias, Alban, Seán, Daniel, Stefano, Carlos, Colin G., | ||||
|   Andreas, Alexander, Ryan, Marc-André, Asad, Alberto, Bastien, Hans, | ||||
|   Debarshi, Sindhu, Andika, Rico, Olav] | ||||
| * Don't prevent workspace switches for present_with_time() [Florian; #728018] | ||||
| * Add shortcuts for switching to the last workspace [Elad; #659288] | ||||
| * Make move/resize menu items behave like the keybindings [Jasper; #728617] | ||||
| * Misc. bug fixes and cleanups  [Jasper, Bastien, Florian, Adel; #720631, | ||||
|   #727979, #728423, #728395, #729044] | ||||
| * Misc. cleanups [Jasper; #720631] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Elad Alfassa, Robert Ancell, Magdalen Berns, Robert Bragg, | ||||
|   Giovanni Campagna, Cosimo Cecchi, Marek Chalupa, Nirbheek Chauhan, | ||||
|   Matthias Clasen, Alban Crequy, Seán de Búrca, Daniel Drake, Jason Ekstrand, | ||||
|   Stefano Facchini, Adel Gadllah, Carlos Garnacho, Colin Guthrie, | ||||
|   Andreas Heider, Lionel Landwerlin, Alexander Larsson, Kalev Lember, | ||||
|   Ryan Lortie, Tim Lunn, Marc-André Lureau, Rui Matos, Asad Mehmood, | ||||
|   Alberto Milone, Florian Müllner, Bastien Nocera, Hans Petter Jansson, | ||||
|   Debarshi Ray, Neil Roberts, Sindhu S, Jasper St. Pierre, Ray Strode, | ||||
|   Andika Triwidada, Rico Tzschichholz, Pavel Vasin, Olav Vitters, | ||||
|   Colin Walters, A. Walton, Owen W. Taylor | ||||
|   Nirbheek Chauhan, Jasper St. Pierre | ||||
|  | ||||
| Translations: | ||||
|   Inaki Larranaga Murgoitio [eu], marablack3 [el], Daniel Mustieles [es], | ||||
|   Fran Diéguez [gl], Yosef Or Boczko [he], Dirgita [id] | ||||
|   Inaki Larranaga Murgoitio [eu], marablack3 [el] | ||||
|  | ||||
| 3.12.0 | ||||
| ====== | ||||
| * Fix grab issue with SSD xwayland windows [Rui; #726123] | ||||
| * Misc. bug fixes [Jasper, Ray, Rui, Florian; #727011] | ||||
|  | ||||
| Contributors: | ||||
|   Rui Matos, Florian Müllner, Jasper St. Pierre, Ray Strode | ||||
| Translations: | ||||
|   Ask H. Larsen [da], Мирослав Николић [sr, sr@latin], Andika Triwidada [id], | ||||
|   Daniel Korostil [uk], Petr Kovar [cs] | ||||
|  | ||||
| 3.11.92 | ||||
| ======= | ||||
| * Fix identification of CSD windows [Owen; #723029] | ||||
| * Update keyboard state unconditionally [Rui; #722847] | ||||
| * Misc bug fixes and cleanups [Owen, Rui, Giovanni, Matthias, Adel, Ryan, | ||||
|   Jasper, Marek, Florian; #723580, #726123, #726683] | ||||
| * Add minimal handling of touch events [Carlos; #723552] | ||||
| * Misc bug fixes and cleanups [Owen, Adel, Jasper; #723580, #726352] | ||||
|  | ||||
| Contributors: | ||||
|   Giovanni Campagna, Marek Chalupa, Matthias Clasen, Adel Gadllah, Ryan Lortie, | ||||
|   Rui Matos, Florian Müllner, Jasper St. Pierre, Owen W. Taylor | ||||
|   Adel Gadllah, Carlos Garnacho, Rui Matos, Jasper St. Pierre, Owen W. Taylor | ||||
|  | ||||
| Translations: | ||||
|   Changwoo Ryu [ko], Rūdolfs Mazurs [lv], Wylmer Wang [zh_CN], | ||||
|   Chao-Hsiung Liao [zh_HK, zh_TW], Yuri Myasoedov [ru], Tiagosdot [pt], | ||||
|   Claude Paroz [fr], Duarte Loreto [pt], A S Alam [pa] | ||||
|  | ||||
| 3.11.91 | ||||
| ======= | ||||
| @@ -463,104 +49,125 @@ Contributors: | ||||
| * Improve keybinding lookups [Rui; #725588] | ||||
| * Fix dynamic updates of titlebar style properties [Owen; #725751] | ||||
| * Fix positioning of manually positioned windows [Owen; #724049] | ||||
| * Misc bug fixes and cleanups [Jasper, Carlos, Adel, Giovanni, Florian; #720631, | ||||
|   #724969, #725216, #724402, #722266, #725338, #725525] | ||||
| * Misc. bug fixes [Carlos, Giovanni, Florian, Jasper; #724969, #724402, #722266, | ||||
|   #725338] | ||||
|  | ||||
| Contributors: | ||||
|   Giovanni Campagna, Adel Gadllah, Carlos Garnacho, Rui Matos, Florian Müllner, | ||||
|   Jasper St. Pierre, Owen W. Taylor | ||||
|   Jasper St. Pierre | ||||
|  | ||||
| Translations: | ||||
|   Aurimas Černius [lt], Milo Casagrande [it], Balázs Úr [hu], | ||||
|   Matej Urbančič [sl], Enrico Nicoletto [pt_BR], Yosef Or Boczko [he], | ||||
|   Piotr Drąg [pl], Fran Diéguez [gl] | ||||
|  | ||||
| 3.11.90 | ||||
| ======= | ||||
| * Use correct output property for backlight control [Robert; #723606] | ||||
| * Fix double-scaling on high DPI resolutions [Adel; #723931] | ||||
| * Make tile previews a compositor effect [Stefano, Florian; #665758] | ||||
| * Misc. bug fixes and cleanups [Ryan, Giovanni, Jasper, Adel; #722530, #724257, | ||||
|   #724258, #720631, #724364, #724472] | ||||
| * Misc. bug fixes and cleanups [Ryan, Giovanni, Jasper; #722530, #724257, | ||||
|   #724258, #724364, #720631, #707851, #707897] | ||||
|  | ||||
| Contributors: | ||||
|   Giovanni Campagna, Marek Chalupa, Stefano Facchini, Adel Gadllah, | ||||
|   Robert Ancell, Giovanni Campagna, Stefano Facchini, Adel Gadllah, | ||||
|   Ryan Lortie, Florian Müllner, Jasper St. Pierre, Rico Tzschichholz | ||||
|  | ||||
| Translations: | ||||
|   Shankar Prasad [kn], Khaled Hosny [ar], Marek Černocký [cs], | ||||
|   Kjartan Maraas [nb], Daniel Korostil [uk] | ||||
|  | ||||
| 3.11.5 | ||||
| ====== | ||||
| * Fix CSD titlebars being placed off-screen [Jasper; #719772] | ||||
| * Add support for subsurfaces [Jonas; #705502] | ||||
| * Expose MetaWindow:skip-taskbar property [Florian; #723307] | ||||
| * Fix legacy tray icons showing up blank [Adel; #721596] | ||||
| * Fix configuration of cloned monitors [Adel; #710610] | ||||
| * Misc bug fixes and cleanups [Jasper, Adel, Marek, Jonas; #720631, #723468, | ||||
|   #720818, #723563, #723564] | ||||
| * Misc bug fixes and cleanups [Jasper, Adel, Jonas; #720631, #723468, #723563] | ||||
|  | ||||
| Contributors: | ||||
|   Jonas Ådahl, Marek Ch, Adel Gadllah, Florian Müllner, Jasper St. Pierre | ||||
|  | ||||
| Translations: | ||||
|   Rafael Ferreira [pt_BR], Enrico Nicoletto [pt_BR], Fran Diéguez [gl], | ||||
|   Chao-Hsiung Liao [zh_HK, zh_TW] | ||||
|  | ||||
| 3.11.4 | ||||
| ====== | ||||
| * Don't leave focus on windows that are being unmanaged [Owen; #711618] | ||||
| * Reduce server grabs [Daniel Drake; #721345, #721709] | ||||
| * Improve heuristic to determine display output name [Cosimo Cecchi; #721674] | ||||
| * Atomically unmaximize both directions [Jasper; #722108] | ||||
| * Misc bug fixes [Debarshi, Andika, Florian; #721517, #721674, #722347] | ||||
| * Misc bug fixes [Debarshi, Andika; #721517, #721674] | ||||
|  | ||||
| Contributors: | ||||
|   Cosimo Cecchi, Daniel Drake, Florian Müllner, Debarshi Ray, Jasper St. Pierre, | ||||
|   Cosimo Cecchi, Daniel Drake, Debarshi Ray, Jasper St. Pierre, | ||||
|   Andika Triwidada, Owen W. Taylor | ||||
|  | ||||
| Translations: | ||||
|   Rafael Ferreira [pt_BR], Dimitris Spingos [el], Daniel Mustieles [es], | ||||
|   Milo Casagrande [it], Yosef Or Boczko [he] | ||||
|  | ||||
| 3.11.3 | ||||
| ====== | ||||
| * Fix focus issues with external OSKs[Jasper; #715030] | ||||
| * xrandr: Use "hotplug_mode_update" property [Marc-André; #711216] | ||||
| * Fix position of attached dialogs for CSD windows [Giovanni, Owen; #707194] | ||||
| * Fix focus issues with external OSKs [Jasper; #715030] | ||||
| * Add a MetaCullable interface [Jasper; #714706] | ||||
| * Fix window keybindings [Rui; #719724] | ||||
| * Fix settings keyboard/pointer focus for new clients [Rui; #719725] | ||||
| * Fix window group paint volume [Owen; #719669] | ||||
| * Fix frame extents problems [Owen; #714707] | ||||
| * Add shortcut to move windows between monitors [Florian; #671054] | ||||
| * Fix problems with focus tracking [Owen; #720558] | ||||
| * Misc. bug fixes and cleanups: [Rui, Colin, Lionel, Jasper, Owen; #712833, | ||||
|   #719557, #719695, #719833, #678989, #720417, #720630] | ||||
| * Misc. bug fixes and cleanups [Rui, Jasper, Owen; #712833, #678989, #720106, | ||||
|   #720417, #720630] | ||||
|  | ||||
| Contributors: | ||||
|   Lionel Landwerlin, Rui Matos, Alberto Milone, Florian Müllner, | ||||
|   Jasper St. Pierre, Rico Tzschichholz, Owen W. Taylor, Colin Walters | ||||
|   Robert Bragg, Giovanni Campagna, Marc-André Lureau, Rui Matos, Alberto Milone, | ||||
|   Florian Müllner, Sindhu S, Jasper St. Pierre, Rico Tzschichholz, | ||||
|   Owen W. Taylor | ||||
|  | ||||
| Translations: | ||||
|   甘露(Gan  Lu) [zh_CN], Khaled Hosny [ar] | ||||
|  | ||||
| 3.11.2 | ||||
| ====== | ||||
| * Support setting a NULL opaque region [Andreas; #711518] | ||||
| * Sync keymap from X to wayland [Giovanni; #707446] | ||||
| * Implement support for subsurfaces [Jonas; #705502] | ||||
| * Don't focus the no-focus-window for globally active windows [Jasper; #710296] | ||||
| * Support "hotplug_mode_update" property [Marc-André; #711216] | ||||
| * Fix resize operations using mouse-button-modifier [Lionel; #710251] | ||||
| * Fix position of attached modals for CSD windows [Giovanni, Owen; #707194] | ||||
| * Misc. bug fixes [Rui, Jasper, Neil, Florian; #712247, #711731] | ||||
| * Misc. fixes and cleanups [Jasper, Rico, Florian; #711731] | ||||
|  | ||||
| Contributors: | ||||
|   Giovanni Campagna, Andreas Heider, Lionel Landwerlin, Marc-André Lureau, | ||||
|   Rui Matos, Florian Müllner, Neil Roberts, Sindhu S, Jasper St. Pierre, | ||||
|   Rico Tzschichholz, Owen W. Taylor, Jonas Ådahl | ||||
|   Lionel Landwerlin, Florian Müllner, Jasper St. Pierre, Rico Tzschichholz | ||||
|  | ||||
| 3.11.1 | ||||
| ====== | ||||
| * Fix tile previews getting stuck on right click during drags [Lionel; #704759] | ||||
| * Don't require at least one output device to be connected [Giovanni; #709009] | ||||
| * Name the guard window [Andrew; #710346] | ||||
| * Use new UPower API [Bastien] | ||||
| * Set hot spot when cursor set from wl_buffer [Jonas; #709593] | ||||
| * Expose min-backlight-step [Asad; #710380] | ||||
| * Misc. bug fixes and cleanups [Jasper, Olav, Magdalen; #709776] | ||||
| * Don't focus the no-focus-window for globally active windows [Jasper; #710296] | ||||
| * Misc. fixes and cleanups [Jasper, Rico, Olav, Magdalen; #709776] | ||||
|  | ||||
| Contributors: | ||||
|   Magdalen Berns, Lionel Landwerlin, Asad Mehmood, Bastien Nocera, | ||||
|   Jasper St. Pierre, Olav Vitters, Jonas Ådahl | ||||
|   Magdalen Berns, Giovanni Campagna, Asad Mehmood, Bastien Nocera, | ||||
|   Jasper St. Pierre, Rico Tzschichholz, Olav Vitters, Andrew Walton | ||||
|  | ||||
| Translations: | ||||
|   Reinout van Schouwen [nl] | ||||
|  | ||||
| 3.10.1 | ||||
| ====== | ||||
| * Don't apply fullscreen workarounds to CSD windows [Giovanni; #708718] | ||||
| * Fix hangs during DND operations [Adel; #709340] | ||||
| * Misc bug fixes [Dan, Giovanni, Jasper; #708813, #708420] | ||||
| * Use nearest-pixel interpolation when possible [Hans; #708389] | ||||
| * Fix tile previews getting stuck on right click during drags [Lionel; #704759] | ||||
| * Misc bug fixes [Giovanni, Jasper; #708420] | ||||
|  | ||||
| Contributors: | ||||
|   Giovanni Campagna, Adel Gadllah, Dan Horák, Hans Petter Jansson, | ||||
|   Giovanni Campagna, Adel Gadllah, Lionel Landwerlin, Hans Petter Jansson, | ||||
|   Jasper St. Pierre | ||||
|  | ||||
| Translations: | ||||
|   Khaled Hosny [ar], Reinout van Schouwen [nl], Carles Ferrando [ca@valencia] | ||||
|  | ||||
| 3.10.0.1 | ||||
| ======== | ||||
| * Fix bug when a window changed size twice in a single frame - this | ||||
| @@ -571,32 +178,24 @@ Contributors: | ||||
|  | ||||
| 3.10.0 | ||||
| ====== | ||||
| * Update dependencies [Giovanni; #708210] | ||||
|  | ||||
| Translations: | ||||
|   Ask H. Larsen [da], Gabor Kelemen [hu], Duarte Loreto [pt], | ||||
|   Yosef Or Boczko [he] | ||||
|  | ||||
| 3.9.92 | ||||
| ====== | ||||
| * Constrain the pointer position onto visible monitors [Giovanni; #706655] | ||||
| * Fix keyboard state handling in face of event compression [Giovanni; #706963] | ||||
| * Extend the MetaCursorTracker API with query pointer and cursor visibility [Giovanni; #707474] | ||||
| * Be stricter in checking and exposing the wayland protocol version [#707851] | ||||
| * Don't require plugins to pass event to Clutter [Giovanni; #707482] | ||||
| * Move the --wayland option from the binary to the library [Giovanni; #707897] | ||||
| * Implement running from gnome-session (environment variable setting, process group | ||||
|   handling, Clutter backend variables) [Giovanni; #706421] | ||||
| * Add support for more cursor types [Giovanni; #707919] | ||||
| * Drop man pages for removed utilities [Kalev; #706579] | ||||
| * Implement monitor configuration on KMS [Giovanni; #706308] | ||||
| * Implement HW cursors [Giovanni; #707573] | ||||
| * Implement minimal support for resizing and maximizing wayland clients [Giovanni; #707401] | ||||
| * Implement transient hints for wayland clients [Giovanni; #707401] | ||||
| * Implement popup menu surfaces and grabs [Giovanni; #707863] | ||||
| * Immediately fire idle watches that are already expired [Giovanni; #707302] | ||||
| * Don't create a dummy texture for the texture pipeline template [Neil; #707458] | ||||
| * Remove holes generated by disabling the laptop lid [Giovanni; #707473] | ||||
| * Misc bug fixes [Giovanni, Pavel, Adel; #707649, #706124, #707584, #707851, #707929, | ||||
|   #708070] | ||||
| * https://bugzilla.gnome.org/show_bug.cgi?id=707474 [Giovanni; #707474] | ||||
| * Don't require plugins to pass event to Clutter [Giovanni; #707482] | ||||
| * Add support for more cursor types [Giovanni; #707919] | ||||
| * Immediately fire idle watches that are already expired [Giovanni; #707302] | ||||
| * Misc bug fixes [Giovanni, Colin, Pavel; #707649, #707563, #708070] | ||||
|  | ||||
| Contributors: | ||||
|   Adel Gadllah, Giovanni Campagna, Kalev Lember, Pavel Vasin | ||||
|   Giovanni Campagna, Adel Gadllah, Colin Guthrie, Neil Roberts, | ||||
|   Jasper St. Pierre, Ray Strode, Pavel Vasin | ||||
|  | ||||
| Translations: | ||||
|   Мирослав Николић po/sr, sr@latin.po, Мирослав Николић [sr, sr@latin], | ||||
| @@ -609,30 +208,19 @@ Translations: | ||||
| 3.9.91 | ||||
| ====== | ||||
| * Drop man pages for removed utilities [Kalev; #706579] | ||||
| * Add support for idle tracking [Giovanni, Cosimo; #706005, #707250] | ||||
| * Add support for idle tracking [Giovanni; #706005] | ||||
| * Skip CRTC reconfigurations that have no effect [Giovanni; #706672] | ||||
| * Ignore skip-taskbar hints on parentless dialogs [Giovanni; #673399] | ||||
| * Don't save pixbuf data in user data [Tim; #706777] | ||||
| * Don't queue redraws for obscured regions [Adel; #703332] | ||||
| * Suppor the opaque region hints for wayland clients [Jasper; #707019] | ||||
| * Turn blending off when drawing entirely opaque regions [Jasper; #707019] | ||||
| * Turn blending off when drawing entirely opaque regions [Jasper; #706930] | ||||
| * Check event timestamps before reconfiguring [Giovanni; #706735] | ||||
| * Merge the DBus API for display configuration in the wayland branch [Giovanni] | ||||
| * Install an X IO error handler for XWayland [Giovanni; #706962] | ||||
| * Use the clutter xkbcommon integration for the wayland keyboard [Giovanni; #705862] | ||||
| * Add a setuid helper for running on KMS+evdev [Giovanni, Colin; #705861] | ||||
| * Add keybindings for switching VT [Giovanni; #705861] | ||||
| * Implement plugin modality when running as a wayland compositor [Giovanni; #705917] | ||||
| * Add support for the application menu for wayland clients [Giovanni; #707128] | ||||
| * Several Coverity spotted fixes [Jasper] | ||||
| * Don't create a dummy texture for the texture template [Neil; #707458] | ||||
| * Use a more conservative paint volume for obscured windows [Adel] | ||||
| * Misc bug fixes [Giovanni, Colin, Seán, Jasper, Cosimo; #706582, #706598, | ||||
|   #706787, #706729, #706825, #707081, #707090, #707267, #706982, #706289] | ||||
|   #706787, #706729, #706825, #707081, #707090, #707250, #707267] | ||||
|  | ||||
| Contributors: | ||||
|   Giovanni Campagna, Cosimo Cecchi, Adel Gadllah, Colin Guthrie, Kalev Lember, | ||||
|   Tim Lunn, Jasper St. Pierre, Neil Roberts, Rico Tzschichholz, Seán de Búrca | ||||
|   Tim Lunn, Jasper St. Pierre, Rico Tzschichholz, Seán de Búrca | ||||
|  | ||||
| Translations: | ||||
|   Piotr Drąg [pl], Alexandre Franke [fr], Kjartan Maraas [nb], | ||||
| @@ -641,8 +229,6 @@ Translations: | ||||
|  | ||||
| 3.9.90 | ||||
| ====== | ||||
| * First release from the wayland branch, includes basic support for running | ||||
|   as a wayland compositor [Robert, Neil, Giovanni] | ||||
| * Add support for _GTK_FRAME_EXTENTS [Jasper; #705766] | ||||
| * Fix quick consecutive <super> presses breaking keyboard input [Alban; #666101] | ||||
| * Work towards running as wayland compositor [Giovanni] | ||||
| @@ -657,8 +243,8 @@ Translations: | ||||
|  | ||||
| Contributors: | ||||
|   Robert Bragg, Giovanni Campagna, Alban Crequy, Adel Gadllah, | ||||
|   Alexander Larsson, Florian Müllner, Jasper St. Pierre, Neil Roberts, | ||||
|   Rico Tzschichholz, Colin Walters | ||||
|   Alexander Larsson, Florian Müllner, Jasper St. Pierre, Rico Tzschichholz, | ||||
|   Colin Walters | ||||
|  | ||||
| Translations: | ||||
|   Jiro Matsuzawa [ja], Kjartan Maraas [nb], Matej Urbančič [sl], | ||||
|   | ||||
							
								
								
									
										416
									
								
								README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										416
									
								
								README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,416 @@ | ||||
| The original codebase named "Metacity" is not a meta-City as in an | ||||
| urban center, but rather Meta-ness as in the state of being | ||||
| meta. i.e. metacity : meta as opacity : opaque. Also it may have | ||||
| something to do with the Meta key on UNIX keyboards. | ||||
|  | ||||
| Since then, it has been renamed mutter after a rebase on top of | ||||
| clutter as a compositing manager. | ||||
|  | ||||
| COMPILING MUTTER | ||||
| === | ||||
|  | ||||
| You need GTK+ 2.2.  For startup notification to work you need | ||||
| libstartup-notification at | ||||
| http://www.freedesktop.org/software/startup-notification/ or on the | ||||
| GNOME ftp site. | ||||
| You need Clutter 1.0. You need gobject-introspection 0.6.3. | ||||
|  | ||||
| REPORTING BUGS AND SUBMITTING PATCHES | ||||
| === | ||||
|  | ||||
| Report new bugs on http://bugzilla.gnome.org. Please check for | ||||
| duplicates, *especially* if you are reporting a feature request.  | ||||
|  | ||||
| Please do *not* add "me too!" or "yes I really want this!" comments to | ||||
| feature requests in bugzilla. Please read | ||||
| http://pobox.com/~hp/features.html prior to adding any kind of flame | ||||
| about missing features or misfeatures. | ||||
|  | ||||
| Feel free to send patches too; Metacity is relatively small and | ||||
| simple, so if you find a bug or want to add a feature it should be | ||||
| pretty easy.  Send me mail, or put the patch in bugzilla. | ||||
|  | ||||
| See the HACKING file for some notes on hacking Mutter. | ||||
|  | ||||
| MUTTER FEATURES | ||||
| === | ||||
|  | ||||
|  - Uses GTK+ 2.0 for drawing window frames. This means colors, fonts,  | ||||
|    etc. come from GTK+ theme. | ||||
|  | ||||
|  - Does not expose the concept of "window manager" to the user.  Some | ||||
|    of the features in the GNOME control panel and other parts of the | ||||
|    desktop happen to be implemented in metacity, such as changing your | ||||
|    window border theme, or changing your window navigation shortcuts, | ||||
|    but the user doesn't need to know this. | ||||
|  | ||||
|  - Includes only the window manager; does not try to be a desktop | ||||
|    environment. The pager, configuration, etc. are all separate and | ||||
|    modular. The "libwnck" library (which I also wrote) is available | ||||
|    for writing metacity extensions, pagers, and so on. (But libwnck | ||||
|    isn't metacity specific, or GNOME-dependent; it requires only GTK, | ||||
|    and should work with KWin, fvwm2, and other EWMH-compliant WMs.) | ||||
|  | ||||
|  - Has a simple theme system and a couple of extra themes come with it. | ||||
|    Change themes via gsettings: | ||||
|      gsettings set org.gnome.desktop.wm.preferences theme Crux | ||||
|      gsettings set org.gnome.desktop.wm.preferences theme Gorilla | ||||
|      gsettings set org.gnome.desktop.wm.preferences theme Atlanta | ||||
|      gsettings set org.gnome.desktop.wm.preferences theme Bright | ||||
|  | ||||
|    See theme-format.txt for docs on the theme format. Use  | ||||
|    metacity-theme-viewer to preview themes. | ||||
|  | ||||
|  - Change number of workspaces via gsettings: | ||||
|      gsettings set org.gnome.desktop.wm.preferences num-workspaces 5 | ||||
|  | ||||
|    Can also change workspaces from GNOME 2 pager. | ||||
|  | ||||
|  - Change focus mode: | ||||
|      gsettings set org.gnome.desktop.wm.preferences focus-mode mouse | ||||
|      gsettings set org.gnome.desktop.wm.preferences focus-mode sloppy | ||||
|      gsettings set org.gnome.desktop.wm.preferences focus-mode click | ||||
|  | ||||
|  - Global keybinding defaults include:    | ||||
|  | ||||
|     Alt-Tab                forward cycle window focus | ||||
|     Alt-Shift-Tab          backward cycle focus | ||||
|     Alt-Ctrl-Tab           forward cycle focus among panels | ||||
|     Alt-Ctrl-Shift-Tab     backward cycle focus among panels | ||||
|     Alt-Escape             cycle window focus without a popup thingy | ||||
|     Ctrl-Alt-Left Arrow    previous workspace | ||||
|     Ctrl-Alt-Right Arrow   next workspace | ||||
|     Ctrl-Alt-D             minimize/unminimize all, to show desktop | ||||
|  | ||||
|    Change keybindings for example: | ||||
|  | ||||
|      gsettings set org.gnome.desktop.wm.keybindings switch-to-workspace-1 '[<Alt>F1]' | ||||
|     | ||||
|    Also try the GNOME keyboard shortcuts control panel. | ||||
|  | ||||
|  - Window keybindings: | ||||
|  | ||||
|     Alt-space         window menu | ||||
|  | ||||
|     Mnemonics work in the menu. That is, Alt-space then underlined | ||||
|     letter in the menu item works. | ||||
|  | ||||
|     Choose Move from menu, and arrow keys to move the window. | ||||
|  | ||||
|     While moving, hold down Control to move slower, and  | ||||
|       Shift to snap to edges. | ||||
|  | ||||
|     Choose Resize from menu, and nothing happens yet, but  | ||||
|       eventually I might implement something. | ||||
|  | ||||
|     Keybindings for things like maximize window, vertical maximize, | ||||
|     etc. can be bound, but may not all exist by default. See | ||||
|     metacity.schemas. | ||||
|  | ||||
|  - Window mouse bindings: | ||||
|  | ||||
|     Clicking anywhere on frame with button 1 will raise/focus window | ||||
|      | ||||
|     If you click a window control, such as the close button, then the  | ||||
|      control will activate on button release if you are still over it | ||||
|      on release (as with most GUI toolkits) | ||||
|  | ||||
|     If you click and drag borders with button 1 it resizes the window | ||||
|      | ||||
|     If you click and drag the titlebar with button 1 it moves the  | ||||
|      window. | ||||
|  | ||||
|     If you click anywhere on the frame with button 2 it lowers the  | ||||
|      window. | ||||
|  | ||||
|     If you click anywhere on the frame with button 3 it shows the  | ||||
|      window menu. | ||||
|  | ||||
|     If you hold down Super (windows key) and click inside a window, it | ||||
|      will move the window (buttons 1 and 2) or show menu (button 3). | ||||
|      Or you can configure a different modifier for this. | ||||
|  | ||||
|     If you pick up a window with button 1 and then switch workspaces | ||||
|      the window will come with you to the new workspace, this is  | ||||
|      a feature copied from Enlightenment. | ||||
|  | ||||
|     If you hold down Shift while moving a window, the window snaps | ||||
|      to edges of other windows and the screen. | ||||
|  | ||||
|  - Session management: | ||||
|  | ||||
|     Mutter connects to the session manager and will set itself up to | ||||
|      be respawned. It theoretically restores sizes/positions/workspace | ||||
|      for session-aware applications. | ||||
|  | ||||
|  - Mutter implements much of the EWMH window manager specification | ||||
|    from freedesktop.org, as well as the older ICCCM.  Please refer to | ||||
|    the COMPLIANCE file for information on mutter compliance with | ||||
|    these standards. | ||||
|  | ||||
|  - Uses Pango to render text, so has cool i18n capabilities.  | ||||
|    Supports UTF-8 window titles and such. | ||||
|  | ||||
|  - There are simple animations for actions such as minimization,  | ||||
|    to help users see what is happening. Should probably  | ||||
|    have a few more of these and make them nicer. | ||||
|  | ||||
|  - if you have the proper X setup, set the GDK_USE_XFT=1  | ||||
|    environment variable to get antialiased window titles. | ||||
|  | ||||
|  - considers the panel when placing windows and maximizing | ||||
|    them. | ||||
|  | ||||
|  - handles the window manager selection from the ICCCM. Will exit if | ||||
|    another WM claims it, and can claim it from another WM if you pass | ||||
|    the --replace argument. So if you're running another | ||||
|    ICCCM-compliant WM, you can run "mutter --replace" to replace it | ||||
|    with Metacity. | ||||
|  | ||||
|  - does basic colormap handling | ||||
|  | ||||
|  - and much more! well, maybe not a lot more. | ||||
|  | ||||
| HOW TO ADD EXTERNAL FEATURES | ||||
| === | ||||
|  | ||||
| You can write a mutter "plugin" such as a pager, window list, icon | ||||
| box, task menu, or even things like "window matching" using the | ||||
| Extended Window Manager Hints. See http://www.freedesktop.org for the | ||||
| EWMH specification. An easy-to-use library called "libwnck" is | ||||
| available that uses the EWMH and is specifically designed for writing | ||||
| WM accessories. | ||||
|  | ||||
| You might be interested in existing accessories such as "Devil's Pie" | ||||
| by Ross Burton, which add features to Mutter (or other | ||||
| EWMH-compliant WMs). | ||||
|  | ||||
| MUTTER BUGS, NON-FEATURES, AND CAVEATS | ||||
| === | ||||
|  | ||||
| See bugzilla: http://bugzilla.gnome.org/query.cgi | ||||
|  | ||||
| FAQ | ||||
| === | ||||
|  | ||||
| Q: Will you add my feature? | ||||
|  | ||||
| A: If it makes sense to turn on unconditionally, or is genuinely a | ||||
|    harmless preference that I would not be embarrassed to put in a | ||||
|    simple, uncluttered, user-friendly configuration dialog. | ||||
|  | ||||
|    If the only rationale for your feature is that other window | ||||
|    managers have it, or that you are personally used to it, or | ||||
|    something like that, then I will not be impressed. Metacity is | ||||
|    firmly in the "choose good defaults" camp rather than the "offer 6 | ||||
|    equally broken ways to do it, and let the user pick one" camp. | ||||
|  | ||||
|    This is part of a "no crackrock" policy, despite some exceptions | ||||
|    I'm mildly embarrassed about. For example, multiple workspaces | ||||
|    probably constitute crackrock, they confuse most users and really | ||||
|    are not that useful if you have a decent tasklist and so on. But I | ||||
|    am too used to them to turn them off.  Or alternatively | ||||
|    iconification/tasklist is crack, and workspaces/pager are good. But | ||||
|    having both is certainly a bit wrong.  Sloppy focus is probably | ||||
|    crackrock too. | ||||
|  | ||||
|    But don't think unlimited crack is OK just because I slipped up a | ||||
|    little. No slippery slope here. | ||||
|  | ||||
|    Don't let this discourage patches and fixes - I love those. ;-) | ||||
|    Just be prepared to hear the above objections if your patch adds | ||||
|    some crack-ridden configuration option. | ||||
|  | ||||
|    http://pobox.com/~hp/free-software-ui.html | ||||
|    http://pobox.com/~hp/features.html    | ||||
|  | ||||
| Q: Will Mutter be part of GNOME? | ||||
|  | ||||
| A: It is not officially part of GNOME as of GNOME 2.27. We are | ||||
|    hoping to have mutter officially included as of GNOME 2.28.  | ||||
|  | ||||
| Q: Why does Mutter remember the workspace/position of some apps  | ||||
|    but not others across logout/login? | ||||
|  | ||||
| A: Mutter only stores sizes/positions for apps that are session | ||||
|    managed. As far as I can determine, there is no way to attempt to | ||||
|    remember workspace/position for non-session-aware apps without | ||||
|    causing a lot of weird effects. | ||||
|  | ||||
|    The reason is that you don't know which non-SM-aware apps were | ||||
|    launched by the session. When you initially log in, Metacity sees a | ||||
|    bunch of new windows appear. But it can't distinguish between | ||||
|    windows that were stored in your session, or windows you just | ||||
|    launched after logging in. If Metacity tried to guess that a window | ||||
|    was from the session, it could e.g. end up maximizing a dialog, or | ||||
|    put a window you just launched on another desktop or in a weird | ||||
|    place. And in fact I see a lot of bugs like this in window managers | ||||
|    that try to handle non-session-aware apps. | ||||
|  | ||||
|    However, for session-aware apps, Mutter can tell that the | ||||
|    application instance is from the session and thus restore it | ||||
|    reliably, assuming the app properly restores the windows it had  | ||||
|    open on session save. | ||||
|     | ||||
|    So the correct way to fix the situation is to make apps | ||||
|    session-aware. libSM has come with X for years, it's very | ||||
|    standardized, it's shared by GNOME and KDE - even twm is | ||||
|    session-aware. So anyone who won't take a patch to add SM is more | ||||
|    archaic than twm - and you should flame them. ;-) | ||||
|  | ||||
|    Docs on session management: | ||||
|     http://www.fifi.org/doc/xspecs/xsmp.txt.gz | ||||
|     http://www.fifi.org/doc/xspecs/SMlib.txt.gz | ||||
|  | ||||
|    See also the ICCCM section on SM. For GNOME apps, use the | ||||
|    GnomeClient object. For a simple example of using libSM directly, | ||||
|    twm/session.c in the twm source code is pretty easy to understand. | ||||
|  | ||||
| Q: How about adding viewports in addition to workspaces? | ||||
|  | ||||
| A: I could conceivably be convinced to use viewports _instead_ of | ||||
|    workspaces, though currently I'm not thinking that. But I don't | ||||
|    think it makes any sense to have both; it's just confusing. They | ||||
|    are functionally equivalent. | ||||
|  | ||||
|    You may think this means that you won't have certain keybindings,  | ||||
|    or something like that. This is a misconception. The only  | ||||
|    _fundamental_ difference between viewports and workspaces is that  | ||||
|    with viewports, windows can "overlap" and appear partially on  | ||||
|    one and partially on another. All other differences that | ||||
|    traditionally exist in other window managers are accidental -  | ||||
|    the features commonly associated with viewports can be implemented | ||||
|    for workspaces, and vice versa. | ||||
|  | ||||
|    So I don't want to have two kinds of | ||||
|    workspace/desktop/viewport/whatever, but I'm willing to add | ||||
|    features traditionally associated with either kind if those | ||||
|    features make sense. | ||||
|  | ||||
| Q: Why is the panel always on top? | ||||
|  | ||||
| A: Because it's a better user interface, and until we made this not | ||||
|    configurable a bunch of apps were not getting fixed (the app | ||||
|    authors were just saying "put your panel on the bottom" instead of | ||||
|    properly supporting fullscreen mode, and such). | ||||
|  | ||||
|    rationales.txt has the bugzilla URL for some flamefesting on this, | ||||
|    if you want to go back and relive the glory. | ||||
|    Read these and the bugzilla stuff before asking/commenting: | ||||
|      http://pobox.com/~hp/free-software-ui.html | ||||
|      http://pobox.com/~hp/features.html    | ||||
|  | ||||
| Q: Why is there no edge flipping? | ||||
|  | ||||
| A: This one is also in rationales.txt. Because "ouija board" UI, where | ||||
|    you just move the mouse around and the computer guesses what you | ||||
|    mean, has a lot of issues. This includes mouse focus, shade-hover | ||||
|    mode, edge flipping, autoraise, etc. Metacity has mouse focus and | ||||
|    autoraise as a compromise, but these features are all confusing for | ||||
|    many users, and cause problems with accessibility, fitt's law, and | ||||
|    so on. | ||||
|  | ||||
|    Read these and the bugzilla stuff before asking/commenting: | ||||
|      http://pobox.com/~hp/free-software-ui.html | ||||
|      http://pobox.com/~hp/features.html    | ||||
|  | ||||
| Q: Why does wireframe move/resize suck? | ||||
|  | ||||
| A: You can turn it on with the reduced_resources setting. | ||||
|  | ||||
|    But: it has low usability, and is a pain | ||||
|    to implement, and there's no reason opaque move/resize should be a | ||||
|    problem on any setup that can run a modern desktop worth a darn to | ||||
|    begin with. | ||||
|  | ||||
|    Read these and the bugzilla stuff before asking/commenting: | ||||
|      http://pobox.com/~hp/free-software-ui.html | ||||
|      http://pobox.com/~hp/features.html    | ||||
|  | ||||
|    The reason we had to add wireframe anyway was broken  | ||||
|    proprietary apps that can't handle lots of resize events. | ||||
|  | ||||
| Q: Why no XYZ? | ||||
|  | ||||
| A: You are probably getting the idea by now - check rationales.txt, | ||||
|    query/search bugzilla, and read http://pobox.com/~hp/features.html | ||||
|    and http://pobox.com/~hp/free-software-ui.html | ||||
|  | ||||
|    Then sit down and answer the question for yourself.  Is the feature | ||||
|    good? What's the rationale for it? Answer "why" not just "why not." | ||||
|    Justify in terms of users as a whole, not just users like | ||||
|    yourself. How else can you solve the same problem? etc. If that | ||||
|    leads you to a strong opinion, then please, post the rationale for | ||||
|    discussion to an appropriate bugzilla bug, or to | ||||
|    usability@gnome.org. | ||||
|  | ||||
|    Please don't just "me too!" on bugzilla bugs, please don't think | ||||
|    flames will get you anywhere, and please don't repeat rationale | ||||
|    that's already been offered. | ||||
|  | ||||
| Q: Your dumb web pages you made me read talk about solving problems in | ||||
|    fundamental ways instead of adding preferences or workarounds. | ||||
|    What are some examples where metacity has done this? | ||||
|  | ||||
| A: There are quite a few, though many opportunities remain.  Sometimes | ||||
|    the real fix involves application changes. The metacity approach is | ||||
|    that it's OK to require apps to change, though there are also | ||||
|    plenty of workarounds in metacity for battles considered too hard | ||||
|    to fight. | ||||
|  | ||||
|    Here are some examples: | ||||
|  | ||||
|    - fullscreen mode was introduced to allow position constraints, | ||||
|      panel-on-top, and other such things to apply to normal windows | ||||
|      while still allowing video players etc. to "just work" | ||||
|  | ||||
|    - "whether to include minimized windows in Alt+Tab" was solved  | ||||
|      by putting minimized windows at the *end* of the tab order.  | ||||
|  | ||||
|    - Whether to pop up a feedback display during Alt+Tab was solved by | ||||
|      having both Alt+Tab and Alt+Esc | ||||
|  | ||||
|    - Whether to have a "kill" feature was solved by automatically | ||||
|      detecting and offering to kill stuck apps. Better, metacity | ||||
|      actually does "kill -9" on the process, it doesn't just | ||||
|      disconnect the process from the X server. You'll appreciate this | ||||
|      if you ever did a "kill" on Netscape 4, and watched it keep | ||||
|      eating 100% CPU even though the X server had booted it. | ||||
|  | ||||
|    - The workspaces vs. viewports mess was avoided by adding | ||||
|      directional navigation and such to workspaces, see discussion | ||||
|      earlier in this file. | ||||
|  | ||||
|    - Instead of configurable placement algorithms, there's just one  | ||||
|      that works fairly well most of the time. | ||||
|  | ||||
|    - To avoid excess CPU use during opaque move/resize, we rate limit | ||||
|      the updates to the application window's size. | ||||
|  | ||||
|    - Instead of configurable "show size of window while resizing," | ||||
|      it's only shown for windows where it matters, such as terminals. | ||||
|      (Only use-case given for all windows is for web designers | ||||
|      choosing their web browser size, but there are web sites and | ||||
|      desktop backgrounds that do this for you.) | ||||
|  | ||||
|    - Using startup notification, applications open on the workspace | ||||
|      where you launched them, not the active workspace when their | ||||
|      window is opened. | ||||
|  | ||||
|    - and much more. | ||||
|  | ||||
| Q: I think mutter sucks. | ||||
|  | ||||
| A: Feel free to use any WM you like. The reason metacity follows the | ||||
|    ICCCM and EWMH specifications is that it makes metacity a modular, | ||||
|    interchangeable part in the desktop. libwnck-based apps such as the | ||||
|    GNOME window list will work just fine with any EWMH-compliant WM. | ||||
|  | ||||
| Q: Did you spend a lot of time on this? | ||||
|  | ||||
| A: Originally the answer was no. Sadly the answer is now yes. | ||||
|  | ||||
| Q: How can you claim that you are anti-crack, while still  | ||||
|    writing a window manager? | ||||
|  | ||||
| A: I have no comment on that. | ||||
| @@ -4,7 +4,8 @@ | ||||
| srcdir=`dirname $0` | ||||
| test -z "$srcdir" && srcdir=. | ||||
|  | ||||
| REQUIRED_AUTOMAKE_VERSION=1.11 | ||||
| PKG_NAME="mutter" | ||||
| REQUIRED_AUTOMAKE_VERSION=1.10 | ||||
|  | ||||
| (test -f $srcdir/configure.ac \ | ||||
|   && test -d $srcdir/src) || { | ||||
| @@ -18,4 +19,4 @@ which gnome-autogen.sh || { | ||||
|     echo "your distribution's package manager)." | ||||
|     exit 1 | ||||
| } | ||||
| . gnome-autogen.sh | ||||
| USE_GNOME2_MACROS=1 USE_COMMON_DOC_BUILD=yes . gnome-autogen.sh | ||||
|   | ||||
							
								
								
									
										212
									
								
								configure.ac
									
									
									
									
									
								
							
							
						
						
									
										212
									
								
								configure.ac
									
									
									
									
									
								
							| @@ -1,8 +1,9 @@ | ||||
| AC_PREREQ(2.62) | ||||
| AC_PREREQ(2.50) | ||||
| AC_CONFIG_MACRO_DIR([m4]) | ||||
|  | ||||
| m4_define([mutter_major_version], [3]) | ||||
| m4_define([mutter_minor_version], [18]) | ||||
| m4_define([mutter_micro_version], [1]) | ||||
| m4_define([mutter_minor_version], [12]) | ||||
| m4_define([mutter_micro_version], [2]) | ||||
|  | ||||
| m4_define([mutter_version], | ||||
|           [mutter_major_version.mutter_minor_version.mutter_micro_version]) | ||||
| @@ -13,11 +14,10 @@ AC_INIT([mutter], [mutter_version], | ||||
|         [http://bugzilla.gnome.org/enter_bug.cgi?product=mutter]) | ||||
|  | ||||
| AC_CONFIG_MACRO_DIR([m4]) | ||||
| AC_CONFIG_AUX_DIR([build-aux]) | ||||
| AC_CONFIG_SRCDIR(src/core/display.c) | ||||
| AC_CONFIG_HEADERS(config.h) | ||||
|  | ||||
| AM_INIT_AUTOMAKE([1.11 foreign no-dist-gzip dist-xz tar-ustar subdir-objects]) | ||||
| AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz tar-ustar]) | ||||
| m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])],) | ||||
| AM_MAINTAINER_MODE([enable]) | ||||
|  | ||||
| @@ -40,18 +40,29 @@ GETTEXT_PACKAGE=mutter | ||||
| AC_SUBST(GETTEXT_PACKAGE) | ||||
| AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE,"$GETTEXT_PACKAGE",[Name of default gettext domain]) | ||||
|  | ||||
| LT_PREREQ([2.2.6]) | ||||
| LT_INIT([disable-static]) | ||||
| IT_PROG_INTLTOOL([0.41]) | ||||
| IT_PROG_INTLTOOL([0.34.90]) | ||||
| AC_PROG_CC | ||||
| AC_PROG_CC_C_O | ||||
| AC_PROG_INSTALL | ||||
| AC_ISC_POSIX | ||||
| AC_HEADER_STDC | ||||
| PKG_PROG_PKG_CONFIG([0.21]) | ||||
| AC_LIBTOOL_WIN32_DLL | ||||
| AM_PROG_LIBTOOL | ||||
|  | ||||
| # Sets GLIB_GENMARSHAL and GLIB_MKENUMS | ||||
| AM_PATH_GLIB_2_0() | ||||
|  | ||||
| #### Integer sizes | ||||
|  | ||||
| AC_CHECK_SIZEOF(char) | ||||
| AC_CHECK_SIZEOF(short) | ||||
| AC_CHECK_SIZEOF(long) | ||||
| AC_CHECK_SIZEOF(int) | ||||
| AC_CHECK_SIZEOF(void *) | ||||
| AC_CHECK_SIZEOF(long long) | ||||
| AC_CHECK_SIZEOF(__int64) | ||||
|  | ||||
| ## byte order | ||||
| AC_C_BIGENDIAN | ||||
|  | ||||
| CANBERRA_GTK=libcanberra-gtk3 | ||||
| CANBERRA_GTK_VERSION=0.26 | ||||
|  | ||||
| @@ -59,27 +70,15 @@ CLUTTER_PACKAGE=clutter-1.0 | ||||
|  | ||||
| MUTTER_PC_MODULES=" | ||||
|    gtk+-3.0 >= 3.9.11 | ||||
|    gio-unix-2.0 >= 2.35.1 | ||||
|    gio-2.0 >= 2.25.10 | ||||
|    pango >= 1.2.0 | ||||
|    cairo >= 1.10.0 | ||||
|    gsettings-desktop-schemas >= 3.15.92 | ||||
|    $CLUTTER_PACKAGE >= 1.23.4 | ||||
|    gsettings-desktop-schemas >= 3.7.3 | ||||
|    xcomposite >= 0.2 xfixes xrender xdamage xi >= 1.6.0 | ||||
|    $CLUTTER_PACKAGE >= 1.15.90 | ||||
|    cogl-1.0 >= 1.17.1 | ||||
|    upower-glib >= 0.99.0 | ||||
|    gnome-desktop-3.0 | ||||
|    xcomposite >= 0.2 | ||||
|    xcursor | ||||
|    xdamage | ||||
|    xext | ||||
|    xfixes | ||||
|    xi >= 1.6.0 | ||||
|    xkbfile | ||||
|    xkeyboard-config | ||||
|    xkbcommon >= 0.4.3 | ||||
|    xkbcommon-x11 | ||||
|    xrender | ||||
|    x11-xcb | ||||
|    xcb-randr | ||||
| " | ||||
|  | ||||
| GLIB_GSETTINGS | ||||
| @@ -108,18 +107,21 @@ AC_ARG_WITH(libcanberra, | ||||
|                  [disable the use of libcanberra for playing sounds]),, | ||||
|   with_libcanberra=auto) | ||||
|  | ||||
| AC_ARG_WITH([xwayland-path], | ||||
|             [AS_HELP_STRING([--with-xwayland-path], [Absolute path for an X Wayland server])], | ||||
|             [XWAYLAND_PATH="$withval"], | ||||
|             [XWAYLAND_PATH="$bindir/Xwayland"]) | ||||
| AC_ARG_ENABLE(xsync, | ||||
|   AC_HELP_STRING([--disable-xsync], | ||||
|                  [disable mutter's use of the XSync extension]),, | ||||
|   enable_xsync=auto) | ||||
|  | ||||
| AC_ARG_ENABLE(installed_tests, | ||||
|               AS_HELP_STRING([--enable-installed-tests], | ||||
|                              [Install test programs (default: no)]),, | ||||
|               [enable_installed_tests=no]) | ||||
| AM_CONDITIONAL(BUILDOPT_INSTALL_TESTS, test x$enable_installed_tests = xyes) | ||||
| AC_ARG_ENABLE(shape, | ||||
|   AC_HELP_STRING([--disable-shape], | ||||
|                  [disable mutter's use of the shaped window extension]),, | ||||
|   enable_shape=auto) | ||||
|  | ||||
| AM_GLIB_GNU_GETTEXT | ||||
|  | ||||
| ## here we get the flags we'll actually use | ||||
| # GRegex requires Glib-2.14.0 | ||||
| PKG_CHECK_MODULES(ALL, glib-2.0 >= 2.14.0) | ||||
|  | ||||
| # Unconditionally use this dir to avoid a circular dep with gnomecc | ||||
| GNOME_KEYBINDINGS_KEYSDIR="${datadir}/gnome-control-center/keybindings" | ||||
| @@ -184,44 +186,22 @@ if test x$found_introspection != xno; then | ||||
|   AC_SUBST(META_GIR) | ||||
| fi | ||||
|  | ||||
| AC_SUBST(XWAYLAND_PATH) | ||||
| AC_MSG_CHECKING([Xcursor]) | ||||
| if $PKG_CONFIG xcursor; then | ||||
|      have_xcursor=yes | ||||
|   else | ||||
|      have_xcursor=no | ||||
|   fi | ||||
|   AC_MSG_RESULT($have_xcursor) | ||||
|  | ||||
| if test x$have_xcursor = xyes; then | ||||
|   echo "Building with Xcursor" | ||||
|   MUTTER_PC_MODULES="$MUTTER_PC_MODULES xcursor" | ||||
|   AC_DEFINE(HAVE_XCURSOR, , [Building with Xcursor support]) | ||||
| fi | ||||
|  | ||||
| PKG_CHECK_MODULES(MUTTER, $MUTTER_PC_MODULES) | ||||
|  | ||||
| MUTTER_NATIVE_BACKEND_MODULES="clutter-egl-1.0 libdrm libsystemd libinput gudev-1.0 gbm >= 10.3" | ||||
|  | ||||
| AC_ARG_ENABLE(native-backend, | ||||
|   AS_HELP_STRING([--disable-native-backend], [disable mutter native (KMS) backend]),, | ||||
|   enable_native_backend=auto | ||||
| ) | ||||
| AS_IF([test "$enable_native_backend" = "yes"], [have_native_backend=yes], | ||||
|       [test "$enable_native_backend" = "auto"], PKG_CHECK_EXISTS([$MUTTER_NATIVE_BACKEND_MODULES], [have_native_backend=yes])) | ||||
|  | ||||
| AS_IF([test "$have_native_backend" = "yes"], [ | ||||
|   PKG_CHECK_MODULES([MUTTER_NATIVE_BACKEND], [$MUTTER_NATIVE_BACKEND_MODULES]) | ||||
|   AC_DEFINE([HAVE_NATIVE_BACKEND],[1], [Define if you want to enable the native (KMS) backend based on systemd]) | ||||
| ]) | ||||
| AM_CONDITIONAL([HAVE_NATIVE_BACKEND],[test "$have_native_backend" = "yes"]) | ||||
|  | ||||
| MUTTER_WAYLAND_MODULES="clutter-wayland-1.0 clutter-wayland-compositor-1.0 wayland-server >= 1.6.90" | ||||
|  | ||||
| AC_ARG_ENABLE(wayland, | ||||
|   AS_HELP_STRING([--disable-wayland], [disable mutter on wayland support]),, | ||||
|   enable_wayland=auto | ||||
| ) | ||||
| AS_IF([test "$enable_wayland" = "yes"], [have_wayland=yes], | ||||
|       [test "$enable_wayland" = "auto"], PKG_CHECK_EXISTS([$MUTTER_WAYLAND_MODULES], [have_wayland=yes])) | ||||
|  | ||||
| AS_IF([test "$have_wayland" = "yes"], [ | ||||
|   PKG_CHECK_MODULES([MUTTER_WAYLAND], [$MUTTER_WAYLAND_MODULES]) | ||||
|   AC_PATH_PROG([WAYLAND_SCANNER],[wayland-scanner],[no]) | ||||
|   AS_IF([test $WAYLAND_SCANNER = "no"], | ||||
|     [AC_MSG_ERROR([Could not find wayland-scanner in your PATH, required for parsing wayland extension protocols])]) | ||||
|   AC_SUBST([WAYLAND_SCANNER]) | ||||
|   AC_DEFINE([HAVE_WAYLAND],[1],[Define if you want to enable Wayland support]) | ||||
| ]) | ||||
| AM_CONDITIONAL([HAVE_WAYLAND],[test "$have_wayland" = "yes"]) | ||||
|  | ||||
| PKG_CHECK_EXISTS([xi >= 1.6.99.1], | ||||
|                  AC_DEFINE([HAVE_XI23],[1],[Define if you have support for XInput 2.3 or greater])) | ||||
|  | ||||
| @@ -258,8 +238,38 @@ if test x$have_xinerama = xno; then | ||||
|    AC_MSG_ERROR([Xinerama extension was not found]) | ||||
| fi | ||||
|  | ||||
| AC_DEFINE_UNQUOTED([XKB_BASE], ["`$PKG_CONFIG --variable xkb_base xkeyboard-config`"], | ||||
|                                [XKB base dir]) | ||||
| SHAPE_LIBS= | ||||
| found_shape=no | ||||
| AC_CHECK_LIB(Xext, XShapeQueryExtension, | ||||
|                [AC_CHECK_HEADER(X11/extensions/shape.h, | ||||
|                                 SHAPE_LIBS=-lXext found_shape=yes)], | ||||
|                , $ALL_X_LIBS) | ||||
|  | ||||
| if test x$enable_shape = xno; then | ||||
|    found_shape=no | ||||
| fi | ||||
|  | ||||
| if test x$enable_shape = xyes; then | ||||
|    if test "$found_shape" = "no"; then | ||||
|       AC_MSG_ERROR([--enable-shape forced and Shape not found]) | ||||
|       exit 1 | ||||
|    fi | ||||
| fi | ||||
|  | ||||
| if test "x$found_shape" = "xyes"; then | ||||
|    AC_DEFINE(HAVE_SHAPE, , [Have the shape extension library]) | ||||
| fi | ||||
|  | ||||
| found_xkb=no | ||||
| AC_CHECK_LIB(X11, XkbQueryExtension, | ||||
|                [AC_CHECK_HEADER(X11/XKBlib.h, | ||||
|                                 found_xkb=yes)], | ||||
| 	, $ALL_X_LIBS) | ||||
|  | ||||
| if test "x$found_xkb" = "xyes"; then | ||||
|    AC_DEFINE(HAVE_XKB, , [Have keyboard extension library]) | ||||
| fi | ||||
|  | ||||
|  | ||||
| RANDR_LIBS= | ||||
| found_randr=no | ||||
| @@ -267,15 +277,37 @@ AC_CHECK_LIB(Xrandr, XRRUpdateConfiguration, | ||||
|                [AC_CHECK_HEADER(X11/extensions/Xrandr.h, | ||||
|                                 RANDR_LIBS=-lXrandr found_randr=yes,, | ||||
| 				[#include <X11/Xlib.h>])], | ||||
|                , -lXext $ALL_X_LIBS) | ||||
|                , -lXrender -lXext $ALL_X_LIBS) | ||||
|  | ||||
| if test "x$found_randr" = "xyes"; then | ||||
|    AC_DEFINE(HAVE_RANDR, , [Have the Xrandr extension library]) | ||||
|    PKG_CHECK_EXISTS([xrandr >= 1.5.0], | ||||
|                  AC_DEFINE([HAVE_XRANDR15],[1],[Define if you have support for XRandR 1.5 or greater])) | ||||
| fi | ||||
|  | ||||
| MUTTER_LIBS="$MUTTER_LIBS $RANDR_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm" | ||||
| XSYNC_LIBS= | ||||
| found_xsync=no | ||||
| AC_CHECK_LIB(Xext, XSyncQueryExtension, | ||||
|                [AC_CHECK_HEADER(X11/extensions/sync.h, | ||||
|                                 found_xsync=yes,, | ||||
| 				[#include <X11/Xlib.h>])], | ||||
|                , $ALL_X_LIBS) | ||||
|  | ||||
| if test x$enable_xsync = xno; then | ||||
|    found_xsync=no | ||||
| fi | ||||
|  | ||||
| if test x$enable_xsync = xyes; then | ||||
|    if test "$found_xsync" = "no"; then | ||||
|       AC_MSG_ERROR([--enable-xsync forced and XSync not found]) | ||||
|       exit 1 | ||||
|    fi | ||||
| fi | ||||
|  | ||||
| if test "x$found_xsync" = "xyes"; then | ||||
|    XSYNC_LIBS=-lXext | ||||
|    AC_DEFINE(HAVE_XSYNC, , [Have the Xsync extension library]) | ||||
| fi | ||||
|  | ||||
| MUTTER_LIBS="$MUTTER_LIBS $XSYNC_LIBS $RANDR_LIBS $SHAPE_LIBS $X_LIBS $X_PRE_LIBS -lX11 $X_EXTRA_LIBS -lm" | ||||
|  | ||||
| found_sm=no | ||||
| case "$MUTTER_LIBS" in | ||||
| @@ -307,6 +339,17 @@ fi | ||||
|  | ||||
| AM_CONDITIONAL(HAVE_SM, test "$found_sm" = "yes") | ||||
|  | ||||
| HOST_ALIAS=$host_alias | ||||
| AC_SUBST(HOST_ALIAS) | ||||
|  | ||||
| AC_PATH_PROG(GDK_PIXBUF_CSOURCE, gdk-pixbuf-csource, no) | ||||
|  | ||||
| if test x"$GDK_PIXBUF_CSOURCE" = xno; then | ||||
|   AC_MSG_ERROR([gdk-pixbuf-csource executable not found in your path - should be installed with GTK]) | ||||
| fi | ||||
|  | ||||
| AC_SUBST(GDK_PIXBUF_CSOURCE) | ||||
|  | ||||
| AC_PATH_PROG(ZENITY, zenity, no) | ||||
| if test x"$ZENITY" = xno; then | ||||
|   AC_MSG_ERROR([zenity not found in your path - needed for dialogs]) | ||||
| @@ -319,10 +362,7 @@ if test "x$enable_debug" = "xyes"; then | ||||
| 	CFLAGS="$CFLAGS -g -O" | ||||
| fi | ||||
|  | ||||
| AC_CHECK_DECL([GL_EXT_x11_sync_object], | ||||
|               [], | ||||
|               [AC_MSG_ERROR([GL_EXT_x11_sync_object definition not found, please update your GL headers])], | ||||
|               [#include <GL/glx.h>]) | ||||
| GTK_DOC_CHECK([1.15], [--flavour no-tmpl]) | ||||
|  | ||||
| #### Warnings (last since -Werror can disturb other tests) | ||||
|  | ||||
| @@ -392,13 +432,14 @@ changequote([,])dnl | ||||
|  | ||||
| AC_CONFIG_FILES([ | ||||
| Makefile | ||||
| data/Makefile | ||||
| doc/Makefile | ||||
| doc/man/Makefile | ||||
| doc/reference/Makefile | ||||
| doc/reference/meta-docs.sgml | ||||
| src/Makefile | ||||
| src/libmutter.pc | ||||
| src/mutter-plugins.pc | ||||
| src/compositor/plugins/Makefile | ||||
| src/meta/meta-version.h | ||||
| po/Makefile.in | ||||
| ]) | ||||
|  | ||||
| @@ -424,8 +465,9 @@ mutter-$VERSION | ||||
| 	libcanberra:              ${have_libcanberra} | ||||
| 	Introspection:            ${found_introspection} | ||||
| 	Session management:       ${found_sm} | ||||
| 	Wayland:                  ${have_wayland} | ||||
| 	Native (KMS) backend:     ${have_native_backend} | ||||
| 	Shape extension:          ${found_shape} | ||||
| 	Xsync:                    ${found_xsync} | ||||
| 	Xcursor:                  ${have_xcursor} | ||||
| " | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -1,36 +0,0 @@ | ||||
| desktopfiles_in_files = \ | ||||
| 	mutter.desktop.in \ | ||||
| 	mutter-wayland.desktop.in | ||||
| desktopfilesdir = $(datadir)/applications | ||||
| desktopfiles_DATA = $(desktopfiles_in_files:.desktop.in=.desktop) | ||||
|  | ||||
| @INTLTOOL_DESKTOP_RULE@ | ||||
|  | ||||
| xml_in_files = \ | ||||
|         50-mutter-navigation.xml.in \ | ||||
|         50-mutter-system.xml.in \ | ||||
|         50-mutter-windows.xml.in | ||||
| xmldir = $(GNOME_KEYBINDINGS_KEYSDIR) | ||||
| xml_DATA = $(xml_in_files:.xml.in=.xml) | ||||
|  | ||||
| gschema_in_files = \ | ||||
| 	org.gnome.mutter.gschema.xml.in	\ | ||||
| 	org.gnome.mutter.wayland.gschema.xml.in | ||||
| gsettings_SCHEMAS = $(gschema_in_files:.xml.in=.xml) | ||||
|  | ||||
| @INTLTOOL_XML_NOMERGE_RULE@ | ||||
| @GSETTINGS_RULES@ | ||||
|  | ||||
| convertdir = $(datadir)/GConf/gsettings | ||||
| convert_DATA = mutter-schemas.convert | ||||
|  | ||||
| CLEANFILES = \ | ||||
| 	$(desktopfiles_DATA) \ | ||||
| 	$(gsettings_SCHEMAS) \ | ||||
| 	$(xml_DATA) | ||||
|  | ||||
| EXTRA_DIST = \ | ||||
| 	$(convert_DATA) \ | ||||
| 	$(desktopfiles_in_files) \ | ||||
| 	$(gschema_in_files) \ | ||||
| 	$(xml_in_files) | ||||
| @@ -1,53 +0,0 @@ | ||||
| <schemalist> | ||||
|   <schema id="org.gnome.mutter.wayland.keybindings" path="/org/gnome/mutter/wayland/keybindings/" | ||||
| 	  gettext-domain="@GETTEXT_DOMAIN@"> | ||||
|     <key name="switch-to-session-1" type="as"> | ||||
|       <default><![CDATA[['<Primary><Alt>F1']]]></default> | ||||
|       <_summary>Switch to VT 1</_summary> | ||||
|     </key> | ||||
|     <key name="switch-to-session-2" type="as"> | ||||
|       <default><![CDATA[['<Primary><Alt>F2']]]></default> | ||||
|       <_summary>Switch to VT 2</_summary> | ||||
|     </key> | ||||
|     <key name="switch-to-session-3" type="as"> | ||||
|       <default><![CDATA[['<Primary><Alt>F3']]]></default> | ||||
|       <_summary>Switch to VT 3</_summary> | ||||
|     </key> | ||||
|     <key name="switch-to-session-4" type="as"> | ||||
|       <default><![CDATA[['<Primary><Alt>F4']]]></default> | ||||
|       <_summary>Switch to VT 4</_summary> | ||||
|     </key> | ||||
|     <key name="switch-to-session-5" type="as"> | ||||
|       <default><![CDATA[['<Primary><Alt>F5']]]></default> | ||||
|       <_summary>Switch to VT 5</_summary> | ||||
|     </key> | ||||
|     <key name="switch-to-session-6" type="as"> | ||||
|       <default><![CDATA[['<Primary><Alt>F6']]]></default> | ||||
|       <_summary>Switch to VT 6</_summary> | ||||
|     </key> | ||||
|     <key name="switch-to-session-7" type="as"> | ||||
|       <default><![CDATA[['<Primary><Alt>F7']]]></default> | ||||
|       <_summary>Switch to VT 7</_summary> | ||||
|     </key> | ||||
|     <key name="switch-to-session-8" type="as"> | ||||
|       <default><![CDATA[['<Primary><Alt>F8']]]></default> | ||||
|       <_summary>Switch to VT 8</_summary> | ||||
|     </key> | ||||
|     <key name="switch-to-session-9" type="as"> | ||||
|       <default><![CDATA[['<Primary><Alt>F9']]]></default> | ||||
|       <_summary>Switch to VT 9</_summary> | ||||
|     </key> | ||||
|     <key name="switch-to-session-10" type="as"> | ||||
|       <default><![CDATA[['<Primary><Alt>F10']]]></default> | ||||
|       <_summary>Switch to VT 10</_summary> | ||||
|     </key> | ||||
|     <key name="switch-to-session-11" type="as"> | ||||
|       <default><![CDATA[['<Primary><Alt>F11']]]></default> | ||||
|       <_summary>Switch to VT 11</_summary> | ||||
|     </key> | ||||
|     <key name="switch-to-session-12" type="as"> | ||||
|       <default><![CDATA[['<Primary><Alt>F12']]]></default> | ||||
|       <_summary>Switch to VT 12</_summary> | ||||
|     </key> | ||||
|   </schema> | ||||
| </schemalist> | ||||
| @@ -1,4 +1,4 @@ | ||||
| SUBDIRS = man | ||||
| SUBDIRS = man reference | ||||
|  | ||||
| EXTRA_DIST = dialogs.txt code-overview.txt \ | ||||
| 	how-to-get-focus-right.txt rationales.txt | ||||
| EXTRA_DIST=theme-format.txt dialogs.txt code-overview.txt \ | ||||
| 	how-to-get-focus-right.txt | ||||
|   | ||||
							
								
								
									
										166
									
								
								doc/reference/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										166
									
								
								doc/reference/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,166 @@ | ||||
| ## Process this file with automake to produce Makefile.in | ||||
|  | ||||
| # We require automake 1.6 at least. | ||||
| AUTOMAKE_OPTIONS = 1.6 | ||||
|  | ||||
| # This is a blank Makefile.am for using gtk-doc. | ||||
| # Copy this to your project's API docs directory and modify the variables to | ||||
| # suit your project. See the GTK+ Makefiles in gtk+/docs/reference for examples | ||||
| # of using the various options. | ||||
|  | ||||
| # The name of the module, e.g. 'glib'. | ||||
| DOC_MODULE=meta | ||||
|  | ||||
| # Uncomment for versioned docs and specify the version of the module, e.g. '2'. | ||||
| #DOC_MODULE_VERSION=2 | ||||
|  | ||||
|  | ||||
| # The top-level SGML file. You can change this if you want to. | ||||
| DOC_MAIN_SGML_FILE=$(DOC_MODULE)-docs.sgml | ||||
|  | ||||
| # Directories containing the source code, relative to $(srcdir). | ||||
| # gtk-doc will search all .c and .h files beneath these paths | ||||
| # for inline comments documenting functions and macros. | ||||
| # e.g. DOC_SOURCE_DIR=../../../gtk ../../../gdk | ||||
| DOC_SOURCE_DIR=../../src/ | ||||
|  | ||||
| # Extra options to pass to gtkdoc-scangobj. Not normally needed. | ||||
| SCANGOBJ_OPTIONS= | ||||
|  | ||||
| # Extra options to supply to gtkdoc-scan. | ||||
| # e.g. SCAN_OPTIONS=--deprecated-guards="GTK_DISABLE_DEPRECATED" | ||||
| SCAN_OPTIONS=--rebuild-types | ||||
|  | ||||
| # Extra options to supply to gtkdoc-mkdb. | ||||
| # e.g. MKDB_OPTIONS=--xml-mode --output-format=xml | ||||
| MKDB_OPTIONS=--xml-mode --output-format=xml | ||||
|  | ||||
| # Extra options to supply to gtkdoc-mktmpl | ||||
| # e.g. MKTMPL_OPTIONS=--only-section-tmpl | ||||
| MKTMPL_OPTIONS= | ||||
|  | ||||
| # Extra options to supply to gtkdoc-mkhtml | ||||
| MKHTML_OPTIONS= | ||||
|  | ||||
| # Extra options to supply to gtkdoc-fixref. Not normally needed. | ||||
| # e.g. FIXXREF_OPTIONS=--extra-dir=../gdk-pixbuf/html --extra-dir=../gdk/html | ||||
| FIXXREF_OPTIONS= | ||||
|  | ||||
| # Used for dependencies. The docs will be rebuilt if any of these change. | ||||
| # e.g. HFILE_GLOB=$(top_srcdir)/gtk/*.h | ||||
| # e.g. CFILE_GLOB=$(top_srcdir)/gtk/*.c | ||||
| HFILE_GLOB=$(top_srcdir)/src/*/*.h | ||||
| CFILE_GLOB=$(top_srcdir)/src/*/*.c | ||||
|  | ||||
| # Extra header to include when scanning, which are not under DOC_SOURCE_DIR | ||||
| # e.g. EXTRA_HFILES=$(top_srcdir}/contrib/extra.h | ||||
| EXTRA_HFILES= | ||||
|  | ||||
| # Header files or dirs to ignore when scanning. Use base file/dir names | ||||
| # e.g. IGNORE_HFILES=gtkdebug.h gtkintl.h private_code | ||||
| IGNORE_HFILES= \ | ||||
| 	async-getprop.h \ | ||||
| 	atoms.h \ | ||||
| 	bell.h \ | ||||
| 	boxes-private.h \ | ||||
| 	clutter-utils.h \ | ||||
| 	cogl-utils.h \ | ||||
| 	compositor-private.h \ | ||||
| 	constraints.h \ | ||||
| 	core.h \ | ||||
| 	display-private.h \ | ||||
| 	draw-workspace.h \ | ||||
| 	edge-resistance.h \ | ||||
| 	eventqueue.h \ | ||||
| 	frame.h \ | ||||
| 	frames.h \ | ||||
| 	group-private.h \ | ||||
| 	group-props.h \ | ||||
| 	iconcache.h \ | ||||
| 	inlinepixbufs.h \ | ||||
| 	keybindings-private.h \ | ||||
| 	menu.h \ | ||||
| 	metaaccellabel.h \ | ||||
| 	meta-background-actor-private.h \ | ||||
| 	meta-background-group-private.h \ | ||||
| 	meta-module.h \ | ||||
| 	meta-plugin-manager.h \ | ||||
| 	meta-shadow-factory-private.h \ | ||||
| 	meta-texture-rectangle.h \ | ||||
| 	meta-texture-tower.h \ | ||||
| 	meta-window-actor-private.h \ | ||||
| 	meta-window-group.h \ | ||||
| 	meta-window-shape.h \ | ||||
| 	mutter-enum-types.h \ | ||||
| 	mutter-Xatomtype.h \ | ||||
| 	place.h \ | ||||
| 	preview-widget.h \ | ||||
| 	region-utils.h \ | ||||
| 	resizepopup.h \ | ||||
| 	screen-private.h \ | ||||
| 	session.h \ | ||||
| 	stack.h \ | ||||
| 	stack-tracker.h \ | ||||
| 	stamp-mutter-enum-types.h \ | ||||
| 	tabpopup.h \ | ||||
| 	theme.h \ | ||||
| 	theme-private.h \ | ||||
| 	tile-preview.h \ | ||||
| 	ui.h \ | ||||
| 	window-private.h \ | ||||
| 	window-props.h \ | ||||
| 	workspace-private.h \ | ||||
| 	xprops.h \ | ||||
| 	$(NULL) | ||||
|  | ||||
| MKDB_OPTIONS+=--ignore-files="$(IGNORE_HFILES)" | ||||
|  | ||||
| # Images to copy into HTML directory. | ||||
| # e.g. HTML_IMAGES=$(top_srcdir)/gtk/stock-icons/stock_about_24.png | ||||
| HTML_IMAGES= | ||||
|  | ||||
| # Extra SGML files that are included by $(DOC_MAIN_SGML_FILE). | ||||
| # e.g. content_files=running.sgml building.sgml changes-2.0.sgml | ||||
| content_files= \ | ||||
| 	mutter-overview.xml \ | ||||
| 	running-mutter.xml \ | ||||
| 	$(NULL) | ||||
|  | ||||
| # SGML files where gtk-doc abbrevations (#GtkWidget) are expanded | ||||
| # These files must be listed here *and* in content_files | ||||
| # e.g. expand_content_files=running.sgml | ||||
| expand_content_files= \ | ||||
| 	mutter-overview.xml \ | ||||
| 	running-mutter.xml \ | ||||
| 	$(NULL) | ||||
|  | ||||
| # CFLAGS and LDFLAGS for compiling gtkdoc-scangobj with your library. | ||||
| # Only needed if you are using gtkdoc-scangobj to dynamically query widget | ||||
| # signals and properties. | ||||
| # e.g. GTKDOC_CFLAGS=-I$(top_srcdir) -I$(top_builddir) $(GTK_DEBUG_FLAGS) | ||||
| # e.g. GTKDOC_LIBS=$(top_builddir)/gtk/$(gtktargetlib) | ||||
| GTKDOC_CFLAGS=$(MUTTER_CFLAGS) | ||||
| GTKDOC_LIBS=$(MUTTER_LIBS) $(top_builddir)/src/libmutter.la | ||||
|  | ||||
| # This includes the standard gtk-doc make rules, copied by gtkdocize. | ||||
| include $(top_srcdir)/gtk-doc.make | ||||
|  | ||||
| # Other files to distribute | ||||
| # e.g. EXTRA_DIST += version.xml.in | ||||
| EXTRA_DIST += | ||||
|  | ||||
| # Files not to distribute | ||||
| # for --rebuild-types in $(SCAN_OPTIONS), e.g. $(DOC_MODULE).types | ||||
| # for --rebuild-sections in $(SCAN_OPTIONS) e.g. $(DOC_MODULE)-sections.txt | ||||
| DISTCLEANFILES = $(DOC_MODULES).types | ||||
|  | ||||
| # Comment this out if you want 'make check' to test you doc status | ||||
| # and run some sanity checks | ||||
| if ENABLE_GTK_DOC | ||||
| TESTS_ENVIRONMENT = cd $(srcdir) && \ | ||||
|   DOC_MODULE=$(DOC_MODULE) DOC_MAIN_SGML_FILE=$(DOC_MAIN_SGML_FILE) \ | ||||
|   SRCDIR=$(abs_srcdir) BUILDDIR=$(abs_builddir) | ||||
| #TESTS = $(GTKDOC_CHECK) | ||||
| endif | ||||
|  | ||||
| -include $(top_srcdir)/git.mk | ||||
							
								
								
									
										59
									
								
								doc/reference/meta-docs.sgml.in
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										59
									
								
								doc/reference/meta-docs.sgml.in
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,59 @@ | ||||
| <?xml version="1.0"?> | ||||
| <!DOCTYPE book PUBLIC "-//OASIS//DTD DocBook XML V4.3//EN" | ||||
|                "http://www.oasis-open.org/docbook/xml/4.3/docbookx.dtd" | ||||
| [ | ||||
|   <!ENTITY % local.common.attrib "xmlns:xi  CDATA  #FIXED 'http://www.w3.org/2003/XInclude'"> | ||||
|   <!ENTITY version "@VERSION@"> | ||||
| ]> | ||||
| <book id="index"> | ||||
|   <bookinfo> | ||||
|     <title>Mutter Reference Manual</title> | ||||
|     <releaseinfo> | ||||
|       This document is for Mutter &version;. | ||||
|       The latest version of this documentation can be found on-line at | ||||
|       <ulink role="online-location" url="http://developer.gnome.org/meta/">http://developer.gnome.org/meta/</ulink>. | ||||
|     </releaseinfo> | ||||
|   </bookinfo> | ||||
|  | ||||
|   <xi:include href="xml/mutter-overview.xml"/> | ||||
|   <xi:include href="xml/running-mutter.xml"/> | ||||
|  | ||||
|   <part id="core-reference"> | ||||
|     <title>Mutter Core Reference</title> | ||||
|     <xi:include href="xml/main.xml"/> | ||||
|     <xi:include href="xml/common.xml"/> | ||||
|     <xi:include href="xml/gradient.xml"/> | ||||
|     <xi:include href="xml/prefs.xml"/> | ||||
|     <xi:include href="xml/util.xml"/> | ||||
|     <xi:include href="xml/errors.xml"/> | ||||
|     <xi:include href="xml/meta-plugin.xml"/> | ||||
|     <xi:include href="xml/barrier.xml"/> | ||||
|     <xi:include href="xml/boxes.xml"/> | ||||
|     <xi:include href="xml/compositor.xml"/> | ||||
|     <xi:include href="xml/display.xml"/> | ||||
|     <xi:include href="xml/group.xml"/> | ||||
|     <xi:include href="xml/keybindings.xml"/> | ||||
|     <xi:include href="xml/meta-background-actor.xml"/> | ||||
|     <xi:include href="xml/meta-shadow-factory.xml"/> | ||||
|     <xi:include href="xml/meta-shaped-texture.xml"/> | ||||
|     <xi:include href="xml/meta-window-actor.xml"/> | ||||
|     <xi:include href="xml/screen.xml"/> | ||||
|     <xi:include href="xml/window.xml"/> | ||||
|     <xi:include href="xml/workspace.xml"/> | ||||
|   </part> | ||||
|  | ||||
|   <chapter id="object-tree"> | ||||
|     <title>Object Hierarchy</title> | ||||
|      <xi:include href="xml/tree_index.sgml"/> | ||||
|   </chapter> | ||||
|   <index id="api-index-full"> | ||||
|     <title>API Index</title> | ||||
|     <xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include> | ||||
|   </index> | ||||
|   <index id="deprecated-api-index" role="deprecated"> | ||||
|     <title>Index of deprecated API</title> | ||||
|     <xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include> | ||||
|   </index> | ||||
|  | ||||
|   <xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include> | ||||
| </book> | ||||
							
								
								
									
										683
									
								
								doc/reference/meta-sections.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										683
									
								
								doc/reference/meta-sections.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,683 @@ | ||||
| <SECTION> | ||||
| <FILE>barrier</FILE> | ||||
| <TITLE>MetaBarrier</TITLE> | ||||
| MetaBarrier | ||||
| MetaBarrierClass | ||||
| meta_barrier_is_active | ||||
| meta_barrier_destroy | ||||
| meta_barrier_release | ||||
| MetaBarrierDirection | ||||
| MetaBarrierEvent | ||||
| <SUBSECTION Standard> | ||||
| META_BARRIER | ||||
| META_BARRIER_CLASS | ||||
| META_BARRIER_GET_CLASS | ||||
| META_IS_BARRIER | ||||
| META_IS_BARRIER_CLASS | ||||
| META_TYPE_BARRIER | ||||
| META_TYPE_BARRIER_EVENT | ||||
| MetaBarrierPrivate | ||||
| meta_barrier_event_get_type | ||||
| meta_barrier_get_type | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>boxes</FILE> | ||||
| MetaRectangle | ||||
| MetaStrut | ||||
| MetaEdgeType | ||||
| MetaEdge | ||||
| meta_rectangle_copy | ||||
| meta_rectangle_free | ||||
| meta_rect | ||||
| meta_rectangle_area | ||||
| meta_rectangle_intersect | ||||
| meta_rectangle_equal | ||||
| meta_rectangle_union | ||||
| meta_rectangle_overlap | ||||
| meta_rectangle_vert_overlap | ||||
| meta_rectangle_horiz_overlap | ||||
| meta_rectangle_could_fit_rect | ||||
| meta_rectangle_contains_rect | ||||
| <SUBSECTION Standard> | ||||
| META_TYPE_RECTANGLE | ||||
| meta_rectangle_get_type | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>common</FILE> | ||||
| META_VIRTUAL_CORE_POINTER_ID | ||||
| META_VIRTUAL_CORE_KEYBOARD_ID | ||||
| MetaFrameFlags | ||||
| MetaMenuOp | ||||
| MetaWindowMenuFunc | ||||
| MetaGrabOp | ||||
| MetaCursor | ||||
| MetaFrameType | ||||
| MetaVirtualModifier | ||||
| MetaDirection | ||||
| MetaMotionDirection | ||||
| MetaSide | ||||
| MetaButtonFunction | ||||
| MAX_BUTTONS_PER_CORNER | ||||
| MetaButtonLayout | ||||
| MetaFrameBorders | ||||
| meta_frame_borders_clear | ||||
| META_ICON_WIDTH | ||||
| META_ICON_HEIGHT | ||||
| META_MINI_ICON_WIDTH | ||||
| META_MINI_ICON_HEIGHT | ||||
| META_DEFAULT_ICON_NAME | ||||
| META_PRIORITY_RESIZE | ||||
| META_PRIORITY_BEFORE_REDRAW | ||||
| META_PRIORITY_REDRAW | ||||
| META_PRIORITY_PREFS_NOTIFY | ||||
| POINT_IN_RECT | ||||
| MetaStackLayer | ||||
| MetaWindowMenu | ||||
| MetaResizePopup | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>compositor</FILE> | ||||
| MetaCompEffect | ||||
| MetaCompositor | ||||
| meta_compositor_new | ||||
| meta_compositor_destroy | ||||
| meta_compositor_manage_screen | ||||
| meta_compositor_unmanage_screen | ||||
| meta_compositor_window_shape_changed | ||||
| meta_compositor_process_event | ||||
| meta_compositor_filter_keybinding | ||||
| meta_compositor_add_window | ||||
| meta_compositor_remove_window | ||||
| meta_compositor_show_window | ||||
| meta_compositor_hide_window | ||||
| meta_compositor_switch_workspace | ||||
| meta_compositor_maximize_window | ||||
| meta_compositor_unmaximize_window | ||||
| meta_compositor_sync_window_geometry | ||||
| meta_compositor_set_updates_frozen | ||||
| meta_compositor_queue_frame_drawn | ||||
| meta_compositor_sync_stack | ||||
| meta_compositor_sync_screen_size | ||||
| meta_compositor_flash_screen | ||||
| meta_get_stage_for_screen | ||||
| meta_get_overlay_group_for_screen | ||||
| meta_get_overlay_window | ||||
| meta_get_window_actors | ||||
| meta_get_window_group_for_screen | ||||
| meta_get_top_window_group_for_screen | ||||
| meta_disable_unredirect_for_screen | ||||
| meta_enable_unredirect_for_screen | ||||
| meta_set_stage_input_region | ||||
| meta_empty_stage_input_region | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>display</FILE> | ||||
| MetaTabList | ||||
| MetaTabShowType | ||||
| meta_XFree | ||||
| meta_display_get_compositor_version | ||||
| meta_display_get_xinput_opcode | ||||
| meta_display_supports_extended_barriers | ||||
| meta_display_get_xdisplay | ||||
| meta_display_get_compositor | ||||
| meta_display_get_screens | ||||
| meta_display_has_shape | ||||
| meta_display_screen_for_root | ||||
| meta_display_get_focus_window | ||||
| meta_display_xwindow_is_a_no_focus_window | ||||
| meta_display_get_damage_event_base | ||||
| meta_display_get_shape_event_base | ||||
| meta_display_xserver_time_is_before | ||||
| meta_display_get_last_user_time | ||||
| meta_display_get_current_time | ||||
| meta_display_get_current_time_roundtrip | ||||
| meta_display_get_ignored_modifier_mask | ||||
| meta_display_get_tab_list | ||||
| meta_display_get_tab_next | ||||
| meta_display_get_tab_current | ||||
| meta_display_begin_grab_op | ||||
| meta_display_end_grab_op | ||||
| meta_display_get_grab_op | ||||
| meta_display_add_keybinding | ||||
| meta_display_remove_keybinding | ||||
| meta_display_get_keybinding_action | ||||
| meta_display_set_input_focus_window | ||||
| meta_display_focus_the_no_focus_window | ||||
| meta_display_sort_windows_by_stacking | ||||
| meta_display_get_leader_window | ||||
| meta_display_add_ignored_crossing_serial | ||||
| meta_display_unmanage_screen | ||||
| meta_display_clear_mouse_mode | ||||
| MetaDisplay | ||||
| MetaDisplayClass | ||||
| <SUBSECTION Standard> | ||||
| META_DISPLAY | ||||
| META_DISPLAY_CLASS | ||||
| META_DISPLAY_GET_CLASS | ||||
| META_IS_DISPLAY | ||||
| META_IS_DISPLAY_CLASS | ||||
| META_TYPE_DISPLAY | ||||
| meta_display_get_type | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>errors</FILE> | ||||
| meta_error_trap_push | ||||
| meta_error_trap_pop | ||||
| meta_error_trap_push_with_return | ||||
| meta_error_trap_pop_with_return | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>gradient</FILE> | ||||
| MetaGradientType | ||||
| meta_gradient_create_simple | ||||
| meta_gradient_create_multi | ||||
| meta_gradient_create_interwoven | ||||
| meta_gradient_add_alpha | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>group</FILE> | ||||
| MetaGroup | ||||
| meta_window_get_group | ||||
| meta_window_compute_group | ||||
| meta_window_shutdown_group | ||||
| meta_window_group_leader_changed | ||||
| meta_display_lookup_group | ||||
| meta_group_list_windows | ||||
| meta_group_update_layers | ||||
| meta_group_get_startup_id | ||||
| meta_group_get_size | ||||
| meta_group_property_notify | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>keybindings</FILE> | ||||
| MetaKeyBinding | ||||
| META_TYPE_KEY_BINDING | ||||
| meta_key_binding_get_name | ||||
| meta_key_binding_get_modifiers | ||||
| meta_key_binding_get_mask | ||||
| meta_key_binding_is_builtin | ||||
| meta_keybindings_set_custom_handler | ||||
| meta_screen_ungrab_all_keys | ||||
| meta_screen_grab_all_keys | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>main</FILE> | ||||
| meta_get_option_context | ||||
| meta_init | ||||
| meta_run | ||||
| meta_get_replace_current_wm | ||||
| meta_set_wm_name | ||||
| meta_set_gnome_wm_keybindings | ||||
| MetaExitCode | ||||
| meta_exit | ||||
| meta_quit | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>meta-background</FILE> | ||||
| <TITLE>MetaBackground</TITLE> | ||||
| MetaBackgroundEffects | ||||
| MetaBackground | ||||
| MetaBackgroundClass | ||||
| meta_background_new | ||||
| meta_background_copy | ||||
| meta_background_load_gradient | ||||
| meta_background_load_color | ||||
| meta_background_load_still_frame | ||||
| meta_background_load_file_async | ||||
| meta_background_load_file_finish | ||||
| meta_background_get_filename | ||||
| meta_background_get_style | ||||
| meta_background_get_shading | ||||
| meta_background_get_color | ||||
| meta_background_get_second_color | ||||
| <SUBSECTION Standard> | ||||
| META_BACKGROUND | ||||
| META_BACKGROUND_CLASS | ||||
| META_BACKGROUND_GET_CLASS | ||||
| META_IS_BACKGROUND | ||||
| META_IS_BACKGROUND_CLASS | ||||
| META_TYPE_BACKGROUND | ||||
| MetaBackgroundPrivate | ||||
| meta_background_get_type | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>meta-background-actor</FILE> | ||||
| <TITLE>MetaBackgroundActor</TITLE> | ||||
| MetaBackgroundActor | ||||
| MetaBackgroundActorClass | ||||
| meta_background_actor_new_for_screen | ||||
| MetaSnippetHook | ||||
| meta_background_actor_add_glsl_snippet | ||||
| meta_background_actor_set_uniform_float | ||||
| <SUBSECTION Standard> | ||||
| META_BACKGROUND_ACTOR | ||||
| META_BACKGROUND_ACTOR_CLASS | ||||
| META_BACKGROUND_ACTOR_GET_CLASS | ||||
| META_IS_BACKGROUND_ACTOR | ||||
| META_IS_BACKGROUND_ACTOR_CLASS | ||||
| META_TYPE_BACKGROUND_ACTOR | ||||
| MetaBackgroundActorPrivate | ||||
| meta_background_actor_get_type | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>meta-background-group</FILE> | ||||
| <TITLE>MetaBackgroundGroup</TITLE> | ||||
| MetaBackgroundGroupClass | ||||
| meta_background_group_new | ||||
| <SUBSECTION Standard> | ||||
| META_BACKGROUND_GROUP | ||||
| META_BACKGROUND_GROUP_CLASS | ||||
| META_BACKGROUND_GROUP_GET_CLASS | ||||
| META_IS_BACKGROUND_GROUP | ||||
| META_IS_BACKGROUND_GROUP_CLASS | ||||
| META_TYPE_BACKGROUND_GROUP | ||||
| MetaBackgroundGroupPrivate | ||||
| meta_background_group_get_type | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>meta-plugin</FILE> | ||||
| <TITLE>MetaPlugin</TITLE> | ||||
| MetaPlugin | ||||
| MetaPluginClass | ||||
| MetaPluginInfo | ||||
| meta_plugin_running | ||||
| meta_plugin_debug_mode | ||||
| meta_plugin_get_info | ||||
| MetaPluginVersion | ||||
| META_PLUGIN_DECLARE | ||||
| meta_plugin_switch_workspace_completed | ||||
| meta_plugin_minimize_completed | ||||
| meta_plugin_maximize_completed | ||||
| meta_plugin_unmaximize_completed | ||||
| meta_plugin_map_completed | ||||
| meta_plugin_destroy_completed | ||||
| MetaModalOptions | ||||
| meta_plugin_begin_modal | ||||
| meta_plugin_end_modal | ||||
| meta_plugin_get_screen | ||||
| meta_plugin_manager_set_plugin_type | ||||
| <SUBSECTION Standard> | ||||
| META_IS_PLUGIN | ||||
| META_IS_PLUGIN_CLASS | ||||
| META_PLUGIN | ||||
| META_PLUGIN_CLASS | ||||
| META_PLUGIN_GET_CLASS | ||||
| META_TYPE_PLUGIN | ||||
| MetaPluginPrivate | ||||
| meta_plugin_get_type | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>meta-shadow-factory</FILE> | ||||
| MetaShadowParams | ||||
| meta_shadow_factory_get_default | ||||
| meta_shadow_factory_set_params | ||||
| meta_shadow_factory_get_params | ||||
| MetaShadowFactory | ||||
| MetaShadowFactoryClass | ||||
| <SUBSECTION Standard> | ||||
| META_IS_SHADOW_FACTORY | ||||
| META_IS_SHADOW_FACTORY_CLASS | ||||
| META_SHADOW_FACTORY | ||||
| META_SHADOW_FACTORY_CLASS | ||||
| META_SHADOW_FACTORY_GET_CLASS | ||||
| META_TYPE_SHADOW_FACTORY | ||||
| meta_shadow_factory_get_type | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>meta-shaped-texture</FILE> | ||||
| <TITLE>MetaShapedTexture</TITLE> | ||||
| MetaShapedTexture | ||||
| MetaShapedTextureClass | ||||
| meta_shaped_texture_new | ||||
| meta_shaped_texture_set_create_mipmaps | ||||
| meta_shaped_texture_update_area | ||||
| meta_shaped_texture_set_pixmap | ||||
| meta_shaped_texture_get_texture | ||||
| meta_shaped_texture_set_mask_texture | ||||
| meta_shaped_texture_set_clip_region | ||||
| meta_shaped_texture_get_image | ||||
| <SUBSECTION Standard> | ||||
| META_IS_SHAPED_TEXTURE | ||||
| META_IS_SHAPED_TEXTURE_CLASS | ||||
| META_SHAPED_TEXTURE | ||||
| META_SHAPED_TEXTURE_CLASS | ||||
| META_SHAPED_TEXTURE_GET_CLASS | ||||
| META_TYPE_SHAPED_TEXTURE | ||||
| MetaShapedTexturePrivate | ||||
| meta_shaped_texture_get_type | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>meta-window-actor</FILE> | ||||
| <TITLE>MetaWindowActor</TITLE> | ||||
| MetaWindowActor | ||||
| MetaWindowActorClass | ||||
| meta_window_actor_get_x_window | ||||
| meta_window_actor_get_workspace | ||||
| meta_window_actor_get_meta_window | ||||
| meta_window_actor_get_texture | ||||
| meta_window_actor_is_override_redirect | ||||
| meta_window_actor_get_description | ||||
| meta_window_actor_showing_on_its_workspace | ||||
| meta_window_actor_is_destroyed | ||||
| <SUBSECTION Standard> | ||||
| META_IS_WINDOW_ACTOR | ||||
| META_IS_WINDOW_ACTOR_CLASS | ||||
| META_TYPE_WINDOW_ACTOR | ||||
| META_WINDOW_ACTOR | ||||
| META_WINDOW_ACTOR_CLASS | ||||
| META_WINDOW_ACTOR_GET_CLASS | ||||
| MetaWindowActorPrivate | ||||
| meta_window_actor_get_type | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>meta-cullable</FILE> | ||||
| <TITLE>MetaCullable</TITLE> | ||||
| MetaCullable | ||||
| MetaCullableInterface | ||||
| meta_cullable_cull_out | ||||
| meta_cullable_reset_culling | ||||
| meta_cullable_cull_out_children | ||||
| meta_cullable_reset_culling_children | ||||
| <SUBSECTION Standard> | ||||
| META_TYPE_CULLABLE | ||||
| META_CULLABLE | ||||
| META_IS_CULLABLE | ||||
| META_CULLABLE_GET_IFACE | ||||
| meta_cullable_get_type | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>prefs</FILE> | ||||
| MetaPreference | ||||
| MetaPrefsChangedFunc | ||||
| meta_prefs_add_listener | ||||
| meta_prefs_remove_listener | ||||
| meta_prefs_init | ||||
| meta_prefs_override_preference_schema | ||||
| meta_preference_to_string | ||||
| meta_prefs_get_mouse_button_mods | ||||
| meta_prefs_get_mouse_button_resize | ||||
| meta_prefs_get_mouse_button_menu | ||||
| meta_prefs_get_focus_mode | ||||
| meta_prefs_get_focus_new_windows | ||||
| meta_prefs_get_attach_modal_dialogs | ||||
| meta_prefs_get_raise_on_click | ||||
| meta_prefs_get_theme | ||||
| meta_prefs_get_titlebar_font | ||||
| meta_prefs_get_num_workspaces | ||||
| meta_prefs_get_dynamic_workspaces | ||||
| meta_prefs_get_disable_workarounds | ||||
| meta_prefs_get_auto_raise | ||||
| meta_prefs_get_auto_raise_delay | ||||
| meta_prefs_get_focus_change_on_pointer_rest | ||||
| meta_prefs_get_gnome_accessibility | ||||
| meta_prefs_get_gnome_animations | ||||
| meta_prefs_get_edge_tiling | ||||
| meta_prefs_get_auto_maximize | ||||
| meta_prefs_get_button_layout | ||||
| meta_prefs_get_action_double_click_titlebar | ||||
| meta_prefs_get_action_middle_click_titlebar | ||||
| meta_prefs_get_action_right_click_titlebar | ||||
| meta_prefs_set_num_workspaces | ||||
| meta_prefs_get_workspace_name | ||||
| meta_prefs_change_workspace_name | ||||
| meta_prefs_get_cursor_theme | ||||
| meta_prefs_get_cursor_size | ||||
| meta_prefs_get_compositing_manager | ||||
| meta_prefs_get_force_fullscreen | ||||
| meta_prefs_set_force_fullscreen | ||||
| meta_prefs_get_workspaces_only_on_primary | ||||
| meta_prefs_get_no_tab_popup | ||||
| meta_prefs_set_no_tab_popup | ||||
| meta_prefs_get_draggable_border_width | ||||
| meta_prefs_get_ignore_request_hide_titlebar | ||||
| meta_prefs_set_ignore_request_hide_titlebar | ||||
| MetaKeyBindingAction | ||||
| MetaKeyBindingFlags | ||||
| MetaKeyCombo | ||||
| MetaKeyHandlerFunc | ||||
| meta_prefs_get_keybindings | ||||
| meta_prefs_get_keybinding_action | ||||
| meta_prefs_get_window_binding | ||||
| meta_prefs_get_overlay_binding | ||||
| meta_prefs_get_visual_bell | ||||
| meta_prefs_bell_is_audible | ||||
| meta_prefs_get_visual_bell_type | ||||
| MetaKeyHandler | ||||
| <SUBSECTION Standard> | ||||
| meta_key_binding_get_type | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>screen</FILE> | ||||
| MetaScreen | ||||
| MetaScreenClass | ||||
| meta_screen_get_screen_number | ||||
| meta_screen_get_display | ||||
| meta_screen_get_xroot | ||||
| meta_screen_get_size | ||||
| meta_screen_get_compositor_data | ||||
| meta_screen_set_compositor_data | ||||
| meta_screen_for_x_screen | ||||
| meta_screen_set_cm_selection | ||||
| meta_screen_unset_cm_selection | ||||
| meta_screen_get_startup_sequences | ||||
| meta_screen_get_workspaces | ||||
| meta_screen_get_n_workspaces | ||||
| meta_screen_get_workspace_by_index | ||||
| meta_screen_remove_workspace | ||||
| meta_screen_append_new_workspace | ||||
| meta_screen_get_active_workspace_index | ||||
| meta_screen_get_active_workspace | ||||
| meta_screen_get_n_monitors | ||||
| meta_screen_get_primary_monitor | ||||
| meta_screen_get_current_monitor | ||||
| meta_screen_get_monitor_geometry | ||||
| meta_screen_get_monitor_index_for_rect | ||||
| meta_screen_focus_default_window | ||||
| MetaScreenCorner | ||||
| meta_screen_override_workspace_layout | ||||
| <SUBSECTION Standard> | ||||
| META_IS_SCREEN | ||||
| META_IS_SCREEN_CLASS | ||||
| META_SCREEN | ||||
| META_SCREEN_CLASS | ||||
| META_SCREEN_GET_CLASS | ||||
| META_TYPE_SCREEN | ||||
| meta_screen_get_type | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>util</FILE> | ||||
| meta_is_verbose | ||||
| meta_set_verbose | ||||
| meta_is_debugging | ||||
| meta_set_debugging | ||||
| meta_is_syncing | ||||
| meta_set_syncing | ||||
| meta_set_replace_current_wm | ||||
| meta_debug_spew_real | ||||
| meta_verbose_real | ||||
| meta_bug | ||||
| meta_warning | ||||
| meta_fatal | ||||
| MetaDebugTopic | ||||
| meta_topic_real | ||||
| meta_add_verbose_topic | ||||
| meta_remove_verbose_topic | ||||
| meta_push_no_msg_prefix | ||||
| meta_pop_no_msg_prefix | ||||
| meta_unsigned_long_equal | ||||
| meta_unsigned_long_hash | ||||
| meta_frame_type_to_string | ||||
| meta_gravity_to_string | ||||
| _ | ||||
| N_ | ||||
| meta_g_utf8_strndup | ||||
| meta_free_gslist_and_elements | ||||
| meta_show_dialog | ||||
| meta_debug_spew | ||||
| meta_verbose | ||||
| meta_topic | ||||
| MetaLaterType | ||||
| meta_later_add | ||||
| meta_later_remove | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>window</FILE> | ||||
| MetaWindow | ||||
| MetaWindowClass | ||||
| MetaWindowType | ||||
| MetaMaximizeFlags | ||||
| meta_window_get_frame | ||||
| meta_window_has_focus | ||||
| meta_window_appears_focused | ||||
| meta_window_is_shaded | ||||
| meta_window_is_monitor_sized | ||||
| meta_window_is_override_redirect | ||||
| meta_window_is_skip_taskbar | ||||
| meta_window_get_rect | ||||
| meta_window_get_input_rect | ||||
| meta_window_get_frame_rect | ||||
| meta_window_get_outer_rect | ||||
| meta_window_client_rect_to_frame_rect | ||||
| meta_window_frame_rect_to_client_rect | ||||
| meta_window_get_screen | ||||
| meta_window_get_display | ||||
| meta_window_get_xwindow | ||||
| meta_window_get_window_type | ||||
| meta_window_get_window_type_atom | ||||
| meta_window_get_workspace | ||||
| meta_window_get_monitor | ||||
| meta_window_is_on_all_workspaces | ||||
| meta_window_located_on_workspace | ||||
| meta_window_is_hidden | ||||
| meta_window_activate | ||||
| meta_window_activate_with_workspace | ||||
| meta_window_get_description | ||||
| meta_window_get_wm_class | ||||
| meta_window_get_wm_class_instance | ||||
| meta_window_showing_on_its_workspace | ||||
| meta_window_get_gtk_application_id | ||||
| meta_window_get_gtk_unique_bus_name | ||||
| meta_window_get_gtk_application_object_path | ||||
| meta_window_get_gtk_window_object_path | ||||
| meta_window_get_gtk_app_menu_object_path | ||||
| meta_window_get_gtk_menubar_object_path | ||||
| meta_window_move | ||||
| meta_window_move_frame | ||||
| meta_window_move_resize_frame | ||||
| meta_window_move_to_monitor | ||||
| meta_window_resize | ||||
| meta_window_set_demands_attention | ||||
| meta_window_unset_demands_attention | ||||
| meta_window_get_startup_id | ||||
| meta_window_change_workspace_by_index | ||||
| meta_window_change_workspace | ||||
| meta_window_get_compositor_private | ||||
| meta_window_set_compositor_private | ||||
| meta_window_configure_notify | ||||
| meta_window_get_role | ||||
| meta_window_get_layer | ||||
| meta_window_find_root_ancestor | ||||
| meta_window_is_ancestor_of_transient | ||||
| MetaWindowForeachFunc | ||||
| meta_window_foreach_transient | ||||
| meta_window_foreach_ancestor | ||||
| meta_window_get_maximized | ||||
| meta_window_is_fullscreen | ||||
| meta_window_is_on_primary_monitor | ||||
| meta_window_requested_bypass_compositor | ||||
| meta_window_requested_dont_bypass_compositor | ||||
| meta_window_is_mapped | ||||
| meta_window_toplevel_is_mapped | ||||
| meta_window_get_icon_geometry | ||||
| meta_window_set_icon_geometry | ||||
| meta_window_maximize | ||||
| meta_window_unmaximize | ||||
| meta_window_minimize | ||||
| meta_window_unminimize | ||||
| meta_window_raise | ||||
| meta_window_lower | ||||
| meta_window_get_title | ||||
| meta_window_get_transient_for | ||||
| meta_window_get_transient_for_as_xid | ||||
| meta_window_delete | ||||
| meta_window_get_stable_sequence | ||||
| meta_window_get_user_time | ||||
| meta_window_get_pid | ||||
| meta_window_get_client_machine | ||||
| meta_window_is_remote | ||||
| meta_window_is_modal | ||||
| meta_window_is_attached_dialog | ||||
| meta_window_get_mutter_hints | ||||
| meta_window_get_frame_type | ||||
| meta_window_get_frame_bounds | ||||
| meta_window_get_tile_match | ||||
| meta_window_make_fullscreen | ||||
| meta_window_unmake_fullscreen | ||||
| meta_window_make_above | ||||
| meta_window_unmake_above | ||||
| meta_window_shade | ||||
| meta_window_unshade | ||||
| meta_window_stick | ||||
| meta_window_unstick | ||||
| meta_window_kill | ||||
| meta_window_focus | ||||
| meta_window_check_alive | ||||
| meta_window_get_work_area_current_monitor | ||||
| meta_window_get_work_area_for_monitor | ||||
| meta_window_get_work_area_all_monitors | ||||
| meta_window_begin_grab_op | ||||
| <SUBSECTION Standard> | ||||
| META_IS_WINDOW | ||||
| META_IS_WINDOW_CLASS | ||||
| META_TYPE_WINDOW | ||||
| META_WINDOW | ||||
| META_WINDOW_CLASS | ||||
| META_WINDOW_GET_CLASS | ||||
| meta_window_get_type | ||||
| </SECTION> | ||||
|  | ||||
| <SECTION> | ||||
| <FILE>workspace</FILE> | ||||
| MetaWorkspace | ||||
| MetaWorkspaceClass | ||||
| meta_workspace_index | ||||
| meta_workspace_get_screen | ||||
| meta_workspace_list_windows | ||||
| meta_workspace_get_work_area_for_monitor | ||||
| meta_workspace_get_work_area_all_monitors | ||||
| meta_workspace_activate | ||||
| meta_workspace_activate_with_focus | ||||
| meta_workspace_update_window_hints | ||||
| meta_workspace_set_builtin_struts | ||||
| meta_workspace_get_neighbor | ||||
| <SUBSECTION Standard> | ||||
| META_IS_WORKSPACE | ||||
| META_IS_WORKSPACE_CLASS | ||||
| META_TYPE_WORKSPACE | ||||
| META_WORKSPACE | ||||
| META_WORKSPACE_CLASS | ||||
| META_WORKSPACE_GET_CLASS | ||||
| meta_workspace_get_type | ||||
| </SECTION> | ||||
|  | ||||
							
								
								
									
										15
									
								
								doc/reference/mutter-overview.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								doc/reference/mutter-overview.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| <part id="mutter-overview"> | ||||
|  | ||||
|   <title>Overview</title> | ||||
|  | ||||
|   <partintro> | ||||
|  | ||||
|     <para>Mutter is a GObject-based library for creating compositing window managers.</para> | ||||
|  | ||||
|     <para>Compositors that wish to use Mutter must implement a subclass of #MetaPlugin and register it with meta_plugin_manager_set_plugin_type() before calling meta_init() but after g_type_init().</para> | ||||
|  | ||||
|     <para>#MetaPlugin provides virtual functions that allow to override default behavior in the window management code, such as the effect to perform when a window is created or when switching workspaces.</para> | ||||
|  | ||||
|   </partintro> | ||||
|  | ||||
| </part> | ||||
							
								
								
									
										100
									
								
								doc/reference/running-mutter.xml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								doc/reference/running-mutter.xml
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | ||||
| <part id="running-mutter"> | ||||
|  | ||||
|   <title>Running Mutter</title> | ||||
|  | ||||
|   <partintro> | ||||
|  | ||||
|     <section id="environment-variables"> | ||||
|       <title>Environment Variables</title> | ||||
|  | ||||
|       <para> | ||||
|         Mutter automatically checks environment variables during | ||||
|         its initialization. These environment variables are meant | ||||
|         as debug tools or overrides for default behaviours: | ||||
|       </para> | ||||
|  | ||||
|       <variablelist> | ||||
|         <varlistentry> | ||||
|           <term>MUTTER_VERBOSE</term> | ||||
|           <listitem> | ||||
|             <para>Enable verbose mode, in which more information is printed to the console. Mutter needs to be built with the --enable-verbose-mode option (enabled by default). For more fine-grained control of the output, see meta_add_verbose_topic().</para> | ||||
|           </listitem> | ||||
|         </varlistentry> | ||||
|         <varlistentry> | ||||
|           <term>MUTTER_DEBUG</term> | ||||
|           <listitem> | ||||
|             <para>Traps and prints X errors to the console.</para> | ||||
|           </listitem> | ||||
|         </varlistentry> | ||||
|         <varlistentry> | ||||
|           <term>MUTTER_G_FATAL_WARNINGS</term> | ||||
|           <listitem> | ||||
|             <para>Causes any logging from the domains Mutter, Gtk, Gdk, Pango or GLib to terminate the process (only when using the log functions in GLib).</para> | ||||
|           </listitem> | ||||
|         </varlistentry> | ||||
|         <varlistentry> | ||||
|           <term>MUTTER_USE_LOGFILE</term> | ||||
|           <listitem> | ||||
|             <para>Log all messages to a temporary file.</para> | ||||
|           </listitem> | ||||
|         </varlistentry> | ||||
|         <varlistentry> | ||||
|           <term>MUTTER_DEBUG_XINERAMA</term> | ||||
|           <listitem> | ||||
|             <para>Log extra information about support of the XINERAMA extension.</para> | ||||
|           </listitem> | ||||
|         </varlistentry> | ||||
|         <varlistentry> | ||||
|           <term>MUTTER_DEBUG_SM</term> | ||||
|           <listitem> | ||||
|             <para>Log extra information about session management.</para> | ||||
|           </listitem> | ||||
|         </varlistentry> | ||||
|         <varlistentry> | ||||
|           <term>MUTTER_DEBUG_BUTTON_GRABS</term> | ||||
|           <listitem> | ||||
|             <para>Log extra information about button grabs.</para> | ||||
|           </listitem> | ||||
|         </varlistentry> | ||||
|         <varlistentry> | ||||
|           <term>MUTTER_SYNC</term> | ||||
|           <listitem> | ||||
|             <para>Call XSync after each X call.</para> | ||||
|           </listitem> | ||||
|         </varlistentry> | ||||
|         <varlistentry> | ||||
|           <term>MUTTER_DISPLAY</term> | ||||
|           <listitem> | ||||
|             <para>Name of the X11 display to use.</para> | ||||
|           </listitem> | ||||
|         </varlistentry> | ||||
|         <varlistentry> | ||||
|           <term>META_DISABLE_MIPMAPS</term> | ||||
|           <listitem> | ||||
|             <para>Disable use of mipmaps for the textures that back window pixmaps.</para> | ||||
|           </listitem> | ||||
|         </varlistentry> | ||||
|         <varlistentry> | ||||
|           <term>MUTTER_USE_STATIC_GRAVITY</term> | ||||
|           <listitem> | ||||
|             <para>Enable support for clients with static bit-gravity.</para> | ||||
|           </listitem> | ||||
|         </varlistentry> | ||||
|         <varlistentry> | ||||
|           <term>MUTTER_WM_CLASS_FILTER</term> | ||||
|           <listitem> | ||||
|             <para>Comma-separated list of WM_CLASS names to which to restrict Mutter to.</para> | ||||
|           </listitem> | ||||
|         </varlistentry> | ||||
|         <varlistentry> | ||||
|           <term>MUTTER_DISABLE_FALLBACK_COLOR</term> | ||||
|           <listitem> | ||||
|             <para>Disable fallback for themed colors, for easier detection of typographical errors.</para> | ||||
|           </listitem> | ||||
|         </varlistentry> | ||||
|       </variablelist> | ||||
|  | ||||
|     </section> | ||||
|  | ||||
|   </partintro> | ||||
| </part> | ||||
							
								
								
									
										396
									
								
								doc/theme-format.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										396
									
								
								doc/theme-format.txt
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,396 @@ | ||||
| Themes are in a simple XML-subset format. There are multiple versions | ||||
| of the theme format, and a given theme can support more than one format. | ||||
|  | ||||
| Version 1:     THEMEDIR/metacity-1/metacity-theme-1.xml | ||||
|   (original metacity format) | ||||
| Version 2:     THEMEDIR/metacity-1/metacity-theme-2.xml | ||||
| Version 3:     THEMEDIR/metacity-1/metacity-theme-3.xml | ||||
|  | ||||
| The subdirectory name is "metacity-1" in all versions. | ||||
|  | ||||
| As you might expect, older versions of metacity will not understand | ||||
| newer theme formats. However, newer versions will use old themes. | ||||
| Metacity will always use the newest theme format it understands that | ||||
| the X server supports. Some format versions are only supported if you | ||||
| have the right X server features. | ||||
|  | ||||
| Each format *requires* the corresponding filename. If you put version | ||||
| 2 format features in the metacity-1/metacity-theme-1.xml file, then | ||||
| metacity will get angry. | ||||
|  | ||||
| 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.4 | ||||
| ======================================== | ||||
|  | ||||
| An additional color type is added to pick up custom colors defined | ||||
| in the GTK+ theme's CSS: | ||||
|  | ||||
|   gtk:custom(name,fallback) | ||||
|  | ||||
| where <name> refers to a custom color defined with @define-color in | ||||
| the GTK+ theme, and <fallback> provides an alternative color definition | ||||
| in case the color referenced by <name> is not found. | ||||
|  | ||||
| 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 | ||||
| ======================================== | ||||
|  | ||||
| A new window type 'attached' is added for modal dialogs which are | ||||
| attached to their parent window. (When the attach_modal_dialogs preference | ||||
| is turned on.) If no style is defined for the 'attached' window type, | ||||
| the 'border' window type will be used instead. | ||||
|  | ||||
| New Features in Theme Format Version 3.1 | ||||
| ======================================== | ||||
|  | ||||
| Additional predefined variables are added for positioning expressions: | ||||
|  | ||||
|  frame_x_center: the X center of the entire frame, with respect to the | ||||
|      piece currently being drawn. | ||||
|  frame_y_center: the Y center of the entire frame, with respect to the | ||||
|      piece currently being drawn. | ||||
|  | ||||
| The <title/> element now supports an "ellipsize_width" attribute. When | ||||
| specified, this gives a width at which to ellipsize the title. If not | ||||
| specified, the title will simply be clipped to the title area. | ||||
|  | ||||
| New Features in Theme Format Version 3 | ||||
| ====================================== | ||||
|  | ||||
| Format version 3 has exactly one new feature; any element in the file | ||||
| can now have a version attribute: | ||||
|  | ||||
|   version="[<|<=|=>|>] MAJOR.MINOR" | ||||
|  | ||||
| (< and > should be to be entity escaped as < and >). If this | ||||
| version check is not met, then the element and its children will be | ||||
| ignored. This allows having alternate sections of the theme file for | ||||
| older and newer version of the Metacity theme format. | ||||
|  | ||||
| When placed on the toplevel <metacity_theme> element, an unsatisfied | ||||
| version check will not just cause the contents of the file to be | ||||
| ignored, it will also cause the lookup of a theme file to proceed on | ||||
| and look for an older format 2 or format 1 file. This allows making a | ||||
| metacity-theme-3.xml file that is only used the format version 3.2 or | ||||
| newer is supported, and using metacity-theme-1.xml for older window | ||||
| managers. | ||||
|  | ||||
| New Features in Theme Format Version 2 | ||||
| ====================================== | ||||
|  | ||||
| The optional attributes rounded_top_left, rounded_top_right, | ||||
| rounded_bottom_left and rounded_bottom_right on <frame_geometry> | ||||
| should now be the radius of the corner in pixels. You may still use | ||||
| the values "false" for 0 and "true" for 5, which means v1 values will | ||||
| still work just fine. | ||||
|  | ||||
| <frame_geometry> has a new optional attribute, hide_buttons. If this | ||||
| is true, no buttons will be displayed on the titlebar. | ||||
|  | ||||
| Anywhere you can use a positive integer, you can use an integer constant. | ||||
|  | ||||
| As well as constant integers and reals, you may define constant colours, | ||||
| thus: | ||||
|   <constant name="RevoltingPink" value="#FF00FF"/> | ||||
|   <constant name="Background" value="gtk:bg[NORMAL]"/> | ||||
|  | ||||
| <frame_style> has two new optional attributes, background and alpha. | ||||
| If you specify alpha, you must specify background. background is a | ||||
| colour used for the background of the frame. alpha is the transparency | ||||
| as a real between 0.0 and 1.0. If the current X server does not support | ||||
| alpha channels, the value is ignored. | ||||
|  | ||||
| The filename attribute of <image> may begin with "theme:". If so, the | ||||
| rest of the string is the name of a theme icon. The 64x64 version of the | ||||
| icon is used, except for fallback mini_icons, which use the 16x16 version. | ||||
| This does not affect ordinary resizing. For example: | ||||
|   <button function="close" state="normal"> | ||||
|     <draw_ops> | ||||
|       <include name="active_button"/> | ||||
|       <image filename="theme:gnome-logout" x="2" y="2" | ||||
|           width="width-4" height="height-4"/> | ||||
|       <!-- Note: not "theme:gnome-logout.png" or similar. --> | ||||
|     </draw_ops> | ||||
|   </button> | ||||
|  | ||||
| <menu_icon>s are parsed but ignored. | ||||
|  | ||||
| Fallback icons can be specified using <fallback>. There are two | ||||
| optional arguments, icon and mini_icon. The values of these arguments | ||||
| are identical to that of the filename attribute of <image>. Fallback | ||||
| icons are used when a window does not supply its own icon. If a fallback | ||||
| icon is not specified with <fallback>, Metacity will use a built-in | ||||
| icon, as in metacity-theme-1. | ||||
|  | ||||
| The <arc> element, as well as the original start_angle and end_angle | ||||
| attributes, may be given from and to attributes. The values of these | ||||
| attributes are given in degrees clockwise, with 0 being straight up. | ||||
| For example: | ||||
|   <arc from="0.0" to="90.0" filled="true" color="#FF00FF" | ||||
|       x="0" y="5" width="15" height="15"/> | ||||
|  | ||||
| <frame state="shaded"> may now take an optional resize attribute, with | ||||
| the same interpretation as the resize attribute on <frame state="normal">. | ||||
| If this attribute is omitted for state="shaded", it defaults to "both". | ||||
| (If it is omitted for state="normal", it remains an error.) | ||||
|  | ||||
| In addition to the four <button> functions which are required in | ||||
| metacity-theme-1, there are six new functions in metacity-theme-2: | ||||
| shade, unshade, above, unabove, stick and unstick. | ||||
|        | ||||
| Overview of Theme Format Version 1 | ||||
| ================================== | ||||
|  | ||||
| <?xml version="1.0"?> | ||||
| <metacity_theme> | ||||
| <!-- Only one info section is allowed --> | ||||
| <info> | ||||
|   <name>Foo</name> | ||||
|   <author>Foo P. Bar</author> | ||||
|   <copyright>whoever, 2002</copyright> | ||||
|   <date>Jan 31 2005</date> | ||||
|   <description>A sentence about the theme.</description> | ||||
| </info> | ||||
|  | ||||
| <!-- define a frame geometry to be referenced later --> | ||||
| <!-- frame_geometry has an optional has_title attribute which  | ||||
|      determines whether the title text height is included in the  | ||||
|      height calculation. if not specified, defaults to true. | ||||
|      It also has an optional text_size="medium" attribute | ||||
|      (same sizes as with Pango markup, xx-small thru medium thru | ||||
|      xx-large)  | ||||
|  | ||||
|      Finally it has optional args rounded_top_left=true,  | ||||
|      rounded_top_right=true, rounded_bottom_left=true, | ||||
|      rounded_bottom_right=true. | ||||
|  | ||||
|      --> | ||||
| <frame_geometry name="normal" has_title="true" title_scale="medium"> | ||||
|   <distance name="left_width" value="6"/> | ||||
|   <distance name="right_width" value="6"/> | ||||
|   <distance name="bottom_height" value="7"/> | ||||
|   <distance name="left_titlebar_edge" value="6"/> | ||||
|   <distance name="right_titlebar_edge" value="6"/> | ||||
|   <distance name="button_width" value="17"/> | ||||
|   <distance name="button_height" value="17"/> | ||||
|   <!-- alternative to button_width button_height distances --> | ||||
|   <aspect_ratio name="button" value="1.0"/> | ||||
|   <distance name="title_vertical_pad" value="4"/> | ||||
|   <border name="title_border" left="3" right="12" top="4" bottom="3"/> | ||||
|   <border name="button_border" left="0" right="0" top="1" bottom="1"/> | ||||
| </frame_geometry> | ||||
|  | ||||
| <!-- inheritance is allowed; simply overwrites values from parent --> | ||||
| <frame_geometry name="borderless" parent="normal"> | ||||
|   <distance name="left_width" value="0"/> | ||||
|   <distance name="right_width" value="0"/> | ||||
|   <distance name="bottom_height" value="0"/> | ||||
|   <distance name="left_titlebar_edge" value="0"/> | ||||
|   <distance name="right_titlebar_edge" value="0"/> | ||||
| </frame_geometry> | ||||
|  | ||||
| <!-- define a constant to use in positions/sizes of draw operations; | ||||
|      constant names must start with a capital letter. | ||||
|   --> | ||||
| <constant name="LineOffset" value="3"/> | ||||
|  | ||||
| <!-- define drawing operations to be referenced later;  | ||||
|      these draw-op lists can also be placed inline.  | ||||
|  | ||||
|      Positions/lengths are given as expressions. | ||||
|      Operators are: +,-,*,/,%,`max`,`min` | ||||
|      All operators are infix including `max` and `min`,  | ||||
|       i.e. "2 `max` 5" | ||||
|       | ||||
|      Some variables are predefined, and constants can also  | ||||
|      be used. Variables are: | ||||
|  | ||||
|        width - width of target area | ||||
|        height - height of target area | ||||
|        object_width - natural width of object being drawn | ||||
|        object_height - natural height of object being drawn | ||||
|        left_width - distance from left of frame to client window | ||||
|        right_width - distance from right of frame to client window | ||||
|        top_height - distance from top of frame to client window | ||||
|        bottom_height - distance from bottom of frame to client window | ||||
|        mini_icon_width - width of mini icon for window | ||||
|        mini_icon_height - height of mini icon | ||||
|        icon_width - width of large icon | ||||
|        icon_height - height of large icon | ||||
|        title_width - width of title text | ||||
|        title_height - height of title text | ||||
|  | ||||
|     All these are always defined, except object_width/object_height  | ||||
|     which only exists for <image> right now. | ||||
|  | ||||
|   --> | ||||
|  | ||||
| <draw_ops name="demo_all_ops"> | ||||
|   <line color="#00FF00" x1="LineOffset" y1="0" x2="0" y2="height"/> | ||||
|   <line color="gtk:fg[NORMAL]"  | ||||
|         x1="width - 1" y1="0" x2="width - 1" y2="height"  | ||||
|         width="3" dash_on_length="2" dash_off_length="3"/> | ||||
|   <rectangle color="blend/gtk:fg[NORMAL]/gtk:bg[NORMAL]/0.7" | ||||
|              x="0" y="0" width="width - 1" height="height - 1" filled="true"/> | ||||
|   <arc color="dark gray" x="0" y="0" width="width - 1" height="height - 1"  | ||||
|        filled="false" start_angle="30" extent_angle="180"/> | ||||
|   <tint color="orange" alpha="0.5" x="0" y="0" width="width" height="height"/> | ||||
|  <!-- may be vertical, horizontal, diagonal --> | ||||
|   <gradient type="diagonal"  | ||||
|             x="10" y="30" width="width / 3" height="height / 4"> | ||||
|     <!-- any number of colors allowed here. A color can be  | ||||
|          a color name like "blue" (look at gcolorsel), a hex color | ||||
|          as in HTML (#FFBB99), or a color from the gtk theme  | ||||
|          given as "gtk:base[NORMAL]", "gtk:fg[ACTIVE]", etc. | ||||
|        --> | ||||
|     <color value="gtk:fg[SELECTED]"/> | ||||
|     <!-- color obtained by a 0.5 alpha composite of the second color onto the first --> | ||||
|     <color value="blend/gtk:bg[SELECTED]/gtk:fg[SELECTED]/0.5"/> | ||||
|   </gradient> | ||||
|   <!-- image has an optional colorize="#color" attribute to give the | ||||
|        image a certain color --> | ||||
|   <image filename="foo.png" alpha="0.7" | ||||
|          x="10" y="30" width="width / 3" height="height / 4"/> | ||||
|   <gtk_arrow state="normal" shadow="in" arrow="up" | ||||
|              filled="true" | ||||
|              x="2" y="2" width="width - 4" height="height - 4"/> | ||||
|   <gtk_box state="normal" shadow="out" | ||||
|            x="2" y="2" width="width - 4" height="height - 4"/> | ||||
|   <gtk_vline state="normal" x="2" y1="0" y2="height"/> | ||||
|   <!-- window's icon --> | ||||
|   <icon alpha="0.7" | ||||
|         x="10" y="30" width="width / 3" height="height / 4"/> | ||||
|   <!-- window's title --> | ||||
|   <title color="gtk:text[NORMAL]" x="20" y="30"/> | ||||
|   <!-- include another draw ops list; has optional x/y/width/height attrs --> | ||||
|   <include name="some_other_draw_ops"/> | ||||
|   <!-- tile another draw ops list; has optional | ||||
|        x/y/width/height/tile_xoffset/tile_yoffset --> | ||||
|   <tile name="some_other_draw_ops" tile_width="10" tile_height="10"/> | ||||
| </draw_ops> | ||||
|  | ||||
| <frame_style name="normal" geometry="normal"> | ||||
|   <!-- How to draw each piece of the frame. | ||||
|        For each piece, a draw_ops can be given inline or referenced  | ||||
|        by name. If a piece is omitted, then nothing will be drawn  | ||||
|        for that piece. | ||||
|  | ||||
|        For each piece, the "width" and "height" variables in  | ||||
|        coordinate expressions refers to the dimensions of the piece,  | ||||
|        the origin is at the top left of the piece. | ||||
|    | ||||
|        So <rectangle x="0" y="0" width="width-1" height="height-1"/> | ||||
|        will outline a piece. | ||||
|     --> | ||||
|  | ||||
|   <piece position="entire_background" draw_ops="demo_all_ops"/> | ||||
|   <piece position="left_titlebar_edge"> | ||||
|     <draw_ops> | ||||
|       <line color="#00FF00" x1="0" y1="0" x2="0" y2="height"/> | ||||
|     </draw_ops> | ||||
|   </piece> | ||||
|  | ||||
|   <!-- The complete list of frame pieces: | ||||
|  | ||||
|        entire_background: whole frame | ||||
|        titlebar: entire area above the app's window  | ||||
|        titlebar_middle: area of titlebar_background not considered | ||||
|                         part of an edge | ||||
|        left_titlebar_edge: left side of titlebar background | ||||
|        right_titlebar_edge: right side of titlebar background | ||||
|        top_titlebar_edge: top side of titlebar background | ||||
|        bottom_titlebar_edge: bottom side of titlebar background  | ||||
|        title: the title area (doesn't include buttons) | ||||
|        left_edge: left edge of the frame | ||||
|        right_edge: right edge of the frame | ||||
|        bottom_edge: bottom edge of the frame | ||||
|        overlay: same area as entire_background, but drawn after  | ||||
|                 drawing all sub-pieces instead of before | ||||
|  | ||||
|    --> | ||||
|  | ||||
|   <!-- For buttons, drawing methods have to be provided for  | ||||
|        each of three states:  | ||||
|           normal, pressed, prelight | ||||
|        and the button function or position must be provided: | ||||
|           close, maximize, minimize, menu,  | ||||
|           left_left_background, left_middle_background, | ||||
|           left_right_background, right_left_background,  | ||||
|           right_middle_background, right_right_background | ||||
|        So a working theme needs 3*4 = 12 button declarations | ||||
|        and a theme may have up to 3*10 = 30 button declarations | ||||
|        in order to handle button-rearrangement preferences. | ||||
|   | ||||
|        (The name "function" for the attribute is from before the  | ||||
|         background values existed.) | ||||
|     --> | ||||
|  | ||||
|   <button function="close" state="normal" draw_ops="previously_named"/> | ||||
|   <button function="menu" state="normal"> | ||||
|     <draw_ops> | ||||
|       <icon alpha="0.7" | ||||
|             x="0" y="0" width="object_width" height="object_height"/> | ||||
|     </draw_ops> | ||||
|   </button> | ||||
|  | ||||
| </frame_style> | ||||
|  | ||||
| <!-- styles can inherit from each other with the parent="" attribute.  | ||||
|      In a subclass anything can be re-specified to override  | ||||
|      the parent style. --> | ||||
| <frame_style name="focused" parent="normal"> | ||||
|   <piece position="title"> | ||||
|     <draw_ops> | ||||
|       <rectangle color="gtk:bg[SELECTED]" | ||||
|                  x="0" y="0" width="width-1" height="height-1"/> | ||||
|       <title color="gtk:fg[SELECTED]" x="(width - title_width) / 2" | ||||
|                                       y="(height - title_height) / 2"/> | ||||
|     </draw_ops> | ||||
|   </piece> | ||||
| </frame_style> | ||||
|  | ||||
| <!-- Maps styles to states of frame.  | ||||
|  | ||||
|      Focus: yes (focused), no (not focused) | ||||
|      Window states: normal, maximized, shaded, maximized_and_shaded | ||||
|      Window resizability: none, vertical, horizontal, both | ||||
|  | ||||
|      Everything unspecified just does the same as | ||||
|      unfocused/normal/both. | ||||
|  | ||||
|      only state="normal" needs a resize="" attribute. | ||||
|  --> | ||||
| <frame_style_set name="normal"> | ||||
| <frame focus="yes" state="normal" resize="both" style="focused"/> | ||||
| <frame focus="no" state="normal" resize="both" style="normal"/> | ||||
| </frame_style_set> | ||||
|  | ||||
| <!-- Each window type needs a style set  | ||||
|      Types: normal, dialog, modal_dialog, menu, utility, border | ||||
|   --> | ||||
| <window type="normal" style_set="normal"/> | ||||
|  | ||||
|  | ||||
| <!-- For menu icons, drawing methods are needed for the same  | ||||
|      four types as the buttons, and GTK states | ||||
|      (insensitive,prelight,normal,etc.) | ||||
|   --> | ||||
|  | ||||
| <menu_icon function="close" state="normal" draw_ops="previously_named"/> | ||||
|  | ||||
|  | ||||
| </metacity_theme> | ||||
|  | ||||
|  | ||||
| @@ -21,10 +21,10 @@ environment.</description> | ||||
|   --> | ||||
|   <mailing-list rdf:resource="http://mail.gnome.org/mailman/listinfo/gnome-shell-list" /> | ||||
|   <download-page rdf:resource="http://download.gnome.org/sources/mutter/" /> | ||||
|   <download-page rdf:resource="http://download.gnome.org/sources/mutter-wayland/" /> | ||||
|   <bug-database rdf:resource="http://bugzilla.gnome.org/browse.cgi?product=mutter" /> | ||||
|  | ||||
|   <category rdf:resource="http://api.gnome.org/doap-extensions#core" /> | ||||
|   <programming-language>C</programming-language> | ||||
|   <category rdf:resource="http://api.gnome.org/doap-extensions#desktop" /> | ||||
|  | ||||
|   <maintainer> | ||||
|     <foaf:Person> | ||||
|   | ||||
| @@ -1,12 +1,8 @@ | ||||
| # List of source files containing translatable strings. | ||||
| # Please keep this file sorted alphabetically. | ||||
| data/50-mutter-navigation.xml.in | ||||
| data/50-mutter-system.xml.in | ||||
| data/50-mutter-windows.xml.in | ||||
| data/mutter.desktop.in | ||||
| data/org.gnome.mutter.gschema.xml.in | ||||
| data/org.gnome.mutter.wayland.gschema.xml.in | ||||
| src/backends/meta-monitor-manager.c | ||||
| src/50-mutter-navigation.xml.in | ||||
| src/50-mutter-system.xml.in | ||||
| src/50-mutter-windows.xml.in | ||||
| src/compositor/compositor.c | ||||
| src/compositor/meta-background.c | ||||
| src/core/bell.c | ||||
| @@ -16,13 +12,21 @@ src/core/display.c | ||||
| src/core/errors.c | ||||
| src/core/keybindings.c | ||||
| src/core/main.c | ||||
| src/core/monitor.c | ||||
| src/core/mutter.c | ||||
| src/core/prefs.c | ||||
| src/core/screen.c | ||||
| src/core/session.c | ||||
| src/core/util.c | ||||
| src/core/window.c | ||||
| src/core/window-props.c | ||||
| src/core/xprops.c | ||||
| src/mutter.desktop.in | ||||
| src/mutter-wm.desktop.in | ||||
| src/org.gnome.mutter.gschema.xml.in | ||||
| src/ui/frames.c | ||||
| src/ui/menu.c | ||||
| src/ui/metaaccellabel.c | ||||
| src/ui/resizepopup.c | ||||
| src/ui/theme.c | ||||
| src/x11/session.c | ||||
| src/x11/window-props.c | ||||
| src/x11/xprops.c | ||||
| src/ui/theme-parser.c | ||||
|   | ||||
| @@ -1 +1,2 @@ | ||||
| data/mutter-wayland.desktop.in | ||||
| src/metacity.schemas.in | ||||
|  | ||||
|   | ||||
							
								
								
									
										2681
									
								
								po/bn_IN.po
									
									
									
									
									
								
							
							
						
						
									
										2681
									
								
								po/bn_IN.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1275
									
								
								po/ca@valencia.po
									
									
									
									
									
								
							
							
						
						
									
										1275
									
								
								po/ca@valencia.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2458
									
								
								po/pt_BR.po
									
									
									
									
									
								
							
							
						
						
									
										2458
									
								
								po/pt_BR.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2394
									
								
								po/sr@latin.po
									
									
									
									
									
								
							
							
						
						
									
										2394
									
								
								po/sr@latin.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1240
									
								
								po/zh_CN.po
									
									
									
									
									
								
							
							
						
						
									
										1240
									
								
								po/zh_CN.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										1193
									
								
								po/zh_HK.po
									
									
									
									
									
								
							
							
						
						
									
										1193
									
								
								po/zh_HK.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										2241
									
								
								po/zh_TW.po
									
									
									
									
									
								
							
							
						
						
									
										2241
									
								
								po/zh_TW.po
									
									
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -17,9 +17,6 @@ | ||||
| 	<KeyListEntry name="move-to-workspace-4" | ||||
| 	              _description="Move window to workspace 4" /> | ||||
| 
 | ||||
|         <KeyListEntry name="move-to-workspace-last" | ||||
|                       _description="Move window to last workspace" /> | ||||
| 
 | ||||
| 	<KeyListEntry name="move-to-workspace-left" | ||||
| 	              _description="Move window one workspace to the left" /> | ||||
| 
 | ||||
| @@ -45,68 +42,26 @@ | ||||
| 	              _description="Move window one monitor down" /> | ||||
| 
 | ||||
| 	<KeyListEntry name="switch-applications" | ||||
| 	              reverse-entry="switch-applications-backward" | ||||
| 	              _description="Switch applications"/> | ||||
| 
 | ||||
| 	<KeyListEntry name="switch-applications-backward" | ||||
| 	              reverse-entry="switch-applications" | ||||
| 	              hidden="true" | ||||
| 	              _description="Switch to previous application"/> | ||||
| 
 | ||||
| 	<KeyListEntry name="switch-windows" | ||||
| 	              reverse-entry="switch-windows-backward" | ||||
| 	              _description="Switch windows"/> | ||||
| 
 | ||||
| 	<KeyListEntry name="switch-windows-backward" | ||||
| 	              reverse-entry="switch-windows" | ||||
| 	              hidden="true" | ||||
| 	              _description="Switch to previous window"/> | ||||
| 
 | ||||
| 	<KeyListEntry name="switch-group" | ||||
| 	              reverse-entry="switch-group-backward" | ||||
| 	              _description="Switch windows of an application"/> | ||||
| 
 | ||||
| 	<KeyListEntry name="switch-group-backward" | ||||
| 	              reverse-entry="switch-group" | ||||
| 	              hidden="true" | ||||
| 	              _description="Switch to previous window of an application"/> | ||||
| 
 | ||||
| 	<KeyListEntry name="switch-panels" | ||||
| 	              reverse-entry="switch-panels-backward" | ||||
| 	              _description="Switch system controls"/> | ||||
| 
 | ||||
| 	<KeyListEntry name="switch-panels-backward" | ||||
| 	              reverse-entry="switch-panels" | ||||
| 	              hidden="true" | ||||
| 	              _description="Switch to previous system control"/> | ||||
| 
 | ||||
| 	<KeyListEntry name="cycle-windows" | ||||
| 	              reverse-entry="cycle-windows-backward" | ||||
| 	              _description="Switch windows directly"/> | ||||
| 
 | ||||
| 	<KeyListEntry name="cycle-windows-backward" | ||||
| 	              reverse-entry="cycle-windows" | ||||
| 	              hidden="true" | ||||
| 	              _description="Switch directly to previous window"/> | ||||
| 
 | ||||
| 	<KeyListEntry name="cycle-group" | ||||
| 	              reverse-entry="cycle-group-backward" | ||||
| 	              _description="Switch windows of an app directly"/> | ||||
| 
 | ||||
| 	<KeyListEntry name="cycle-group-backward" | ||||
| 	              reverse-entry="cycle-group" | ||||
| 	              hidden="true" | ||||
| 	              _description="Switch directly to previous window of an app"/> | ||||
| 
 | ||||
| 	<KeyListEntry name="cycle-panels" | ||||
| 	              reverse-entry="cycle-panels-backward" | ||||
| 	              _description="Switch system controls directly"/> | ||||
| 
 | ||||
| 	<KeyListEntry name="cycle-panels-backward" | ||||
| 	              reverse-entry="cycle-panels" | ||||
| 	              hidden="true" | ||||
| 	              _description="Switch directly to previous system control"/> | ||||
| 
 | ||||
| 	<KeyListEntry name="show-desktop" | ||||
| 	              _description="Hide all normal windows"/> | ||||
| 
 | ||||
| @@ -122,9 +77,6 @@ | ||||
| 	<KeyListEntry name="switch-to-workspace-4" | ||||
| 	              _description="Switch to workspace 4" /> | ||||
| 
 | ||||
| 	<KeyListEntry name="switch-to-workspace-last" | ||||
| 	              _description="Switch to last workspace" /> | ||||
| 
 | ||||
| 	<KeyListEntry name="switch-to-workspace-left" | ||||
| 	              _description="Move to workspace left" /> | ||||
| 
 | ||||
| @@ -1,46 +0,0 @@ | ||||
| # A framework for running scripted tests | ||||
|  | ||||
| if HAVE_WAYLAND | ||||
|  | ||||
| if BUILDOPT_INSTALL_TESTS | ||||
| stackingdir = $(pkgdatadir)/tests/stacking | ||||
| dist_stacking_DATA =				\ | ||||
| 	tests/stacking/basic-x11.metatest	\ | ||||
| 	tests/stacking/basic-wayland.metatest	\ | ||||
| 	tests/stacking/minimized.metatest   	\ | ||||
| 	tests/stacking/mixed-windows.metatest   \ | ||||
| 	tests/stacking/override-redirect.metatest | ||||
|  | ||||
| mutter-all.test: tests/mutter-all.test.in | ||||
| 	$(AM_V_GEN) sed  -e "s|@libexecdir[@]|$(libexecdir)|g"  $< > $@.tmp && mv $@.tmp $@ | ||||
|  | ||||
| installedtestsdir = $(datadir)/installed-tests/mutter | ||||
| installedtests_DATA = mutter-all.test | ||||
|  | ||||
| installedtestsbindir = $(libexecdir)/installed-tests/mutter | ||||
| installedtestsbin_PROGRAMS = mutter-test-client mutter-test-runner | ||||
| else | ||||
| noinst_PROGRAMS += mutter-test-client mutter-test-runner | ||||
| endif | ||||
|  | ||||
| EXTRA_DIST += tests/mutter-all.test.in | ||||
|  | ||||
| mutter_test_client_SOURCES = tests/test-client.c | ||||
| mutter_test_client_LDADD = $(MUTTER_LIBS) libmutter.la | ||||
|  | ||||
| mutter_test_runner_SOURCES = tests/test-runner.c | ||||
| mutter_test_runner_LDADD = $(MUTTER_LIBS) libmutter.la | ||||
|  | ||||
| .PHONY: run-tests | ||||
|  | ||||
| run-tests: mutter-test-client mutter-test-runner | ||||
| 	./mutter-test-runner $(dist_stacking_DATA) | ||||
|  | ||||
| endif | ||||
|  | ||||
| # Some random test programs for bits of the code | ||||
|  | ||||
| testboxes_SOURCES = core/testboxes.c | ||||
| testboxes_LDADD = $(MUTTER_LIBS) libmutter.la | ||||
|  | ||||
| noinst_PROGRAMS += testboxes | ||||
							
								
								
									
										411
									
								
								src/Makefile.am
									
									
									
									
									
								
							
							
						
						
									
										411
									
								
								src/Makefile.am
									
									
									
									
									
								
							| @@ -5,107 +5,40 @@ lib_LTLIBRARIES = libmutter.la | ||||
|  | ||||
| SUBDIRS=compositor/plugins | ||||
|  | ||||
| EXTRA_DIST = | ||||
| NULL = | ||||
|  | ||||
| AM_CPPFLAGS = \ | ||||
| 	-DCLUTTER_ENABLE_COMPOSITOR_API					\ | ||||
| INCLUDES=								\ | ||||
| 	-DCLUTTER_ENABLE_EXPERIMENTAL_API				\ | ||||
| 	-DCOGL_ENABLE_EXPERIMENTAL_API					\ | ||||
| 	-DCOGL_ENABLE_EXPERIMENTAL_2_0_API                              \ | ||||
| 	-DCLUTTER_DISABLE_DEPRECATION_WARNINGS				\ | ||||
| 	-DCOGL_DISABLE_DEPRECATION_WARNINGS				\ | ||||
| 	$(MUTTER_CFLAGS)						\ | ||||
| 	$(MUTTER_NATIVE_BACKEND_CFLAGS)					\ | ||||
| 	-I$(builddir)							\ | ||||
| 	-I$(srcdir)							\ | ||||
| 	-I$(srcdir)/backends						\ | ||||
| 	-I$(srcdir)/core						\ | ||||
| 	-I$(srcdir)/ui							\ | ||||
| 	-I$(srcdir)/compositor						\ | ||||
| 	-DMUTTER_LIBEXECDIR=\"$(libexecdir)\"				\ | ||||
| 	-DMUTTER_LOCALEDIR=\"$(localedir)\"				\ | ||||
| 	-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)\"			\ | ||||
| 	-DXWAYLAND_PATH=\"$(XWAYLAND_PATH)\"				\ | ||||
| 	$(NULL) | ||||
| 	-DMUTTER_PLUGIN_DIR=\"@MUTTER_PLUGIN_DIR@\"			\ | ||||
| 	-DGETTEXT_PACKAGE=\"$(GETTEXT_PACKAGE)\" | ||||
|  | ||||
| mutter_built_sources = \ | ||||
| 	$(dbus_idle_built_sources)		\ | ||||
| 	$(dbus_display_config_built_sources)	\ | ||||
| 	$(dbus_login1_built_sources)		\ | ||||
| 	meta/meta-enum-types.h			\ | ||||
| 	meta-enum-types.c			\ | ||||
| 	$(NULL) | ||||
|  | ||||
| if HAVE_WAYLAND | ||||
| mutter_built_sources += \ | ||||
| 	pointer-gestures-protocol.c		\ | ||||
| 	pointer-gestures-server-protocol.h	\ | ||||
| 	gtk-shell-protocol.c			\ | ||||
| 	gtk-shell-server-protocol.h		\ | ||||
| 	xdg-shell-protocol.c			\ | ||||
| 	xdg-shell-server-protocol.h		\ | ||||
| 	$(NULL) | ||||
| endif | ||||
|  | ||||
| wayland_protocols =				\ | ||||
| 	wayland/protocol/pointer-gestures.xml	\ | ||||
| 	wayland/protocol/gtk-shell.xml		\ | ||||
| 	wayland/protocol/xdg-shell.xml		\ | ||||
| 	$(NULL) | ||||
| 	$(dbus_idle_built_sources)	\ | ||||
| 	$(dbus_xrandr_built_sources)	\ | ||||
| 	mutter-enum-types.h		\ | ||||
| 	mutter-enum-types.c | ||||
|  | ||||
| libmutter_la_SOURCES =				\ | ||||
| 	backends/meta-backend.c			\ | ||||
| 	meta/meta-backend.h			\ | ||||
| 	backends/meta-backend-private.h		\ | ||||
| 	backends/meta-barrier.c			\ | ||||
| 	backends/meta-barrier-private.h		\ | ||||
| 	backends/meta-cursor.c			\ | ||||
| 	backends/meta-cursor.h			\ | ||||
| 	backends/meta-cursor-tracker.c		\ | ||||
| 	backends/meta-cursor-tracker-private.h	\ | ||||
| 	backends/meta-cursor-renderer.c		\ | ||||
| 	backends/meta-cursor-renderer.h		\ | ||||
| 	backends/meta-display-config-shared.h	\ | ||||
| 	backends/meta-idle-monitor.c		\ | ||||
| 	backends/meta-idle-monitor-private.h	\ | ||||
| 	backends/meta-idle-monitor-dbus.c	\ | ||||
| 	backends/meta-idle-monitor-dbus.h	\ | ||||
| 	backends/meta-input-settings.c		\ | ||||
| 	backends/meta-input-settings-private.h	\ | ||||
| 	backends/meta-monitor-config.c		\ | ||||
| 	backends/meta-monitor-config.h		\ | ||||
| 	backends/meta-monitor-manager.c		\ | ||||
| 	meta/meta-monitor-manager.h		\ | ||||
| 	backends/meta-monitor-manager-private.h	\ | ||||
| 	backends/meta-monitor-manager-dummy.c	\ | ||||
| 	backends/meta-monitor-manager-dummy.h	\ | ||||
| 	backends/meta-stage.h			\ | ||||
| 	backends/meta-stage.c			\ | ||||
| 	backends/edid-parse.c			\ | ||||
| 	backends/edid.h				\ | ||||
| 	backends/x11/meta-backend-x11.c			\ | ||||
| 	backends/x11/meta-backend-x11.h			\ | ||||
| 	backends/x11/meta-barrier-x11.c			\ | ||||
| 	backends/x11/meta-barrier-x11.h			\ | ||||
| 	backends/x11/meta-cursor-renderer-x11.c		\ | ||||
| 	backends/x11/meta-cursor-renderer-x11.h		\ | ||||
| 	backends/x11/nested/meta-cursor-renderer-x11-nested.c		\ | ||||
| 	backends/x11/nested/meta-cursor-renderer-x11-nested.h		\ | ||||
| 	backends/x11/meta-idle-monitor-xsync.c		\ | ||||
| 	backends/x11/meta-idle-monitor-xsync.h		\ | ||||
| 	backends/x11/meta-input-settings-x11.c		\ | ||||
| 	backends/x11/meta-input-settings-x11.h		\ | ||||
| 	backends/x11/meta-monitor-manager-xrandr.c	\ | ||||
| 	backends/x11/meta-monitor-manager-xrandr.h	\ | ||||
| 	core/meta-accel-parse.c			\ | ||||
| 	core/meta-accel-parse.h			\ | ||||
| 	core/async-getprop.c			\ | ||||
| 	core/async-getprop.h			\ | ||||
| 	core/barrier.c				\ | ||||
| 	meta/barrier.h				\ | ||||
| 	core/bell.c				\ | ||||
| 	core/bell.h				\ | ||||
| @@ -119,31 +52,20 @@ libmutter_la_SOURCES =				\ | ||||
| 	compositor/compositor.c			\ | ||||
| 	compositor/compositor-private.h		\ | ||||
| 	compositor/meta-background.c		\ | ||||
| 	compositor/meta-background-private.h	\ | ||||
| 	compositor/meta-background-actor.c	\ | ||||
| 	compositor/meta-background-actor-private.h	\ | ||||
| 	compositor/meta-background-image.c	\ | ||||
| 	compositor/meta-background-group.c	\ | ||||
| 	compositor/meta-cullable.c		\ | ||||
| 	compositor/meta-cullable.h		\ | ||||
| 	compositor/meta-dnd-actor.c		\ | ||||
| 	compositor/meta-dnd-actor-private.h	\ | ||||
| 	compositor/meta-feedback-actor.c	\ | ||||
| 	compositor/meta-feedback-actor-private.h	\ | ||||
| 	compositor/meta-module.c		\ | ||||
| 	compositor/meta-module.h		\ | ||||
| 	compositor/meta-plugin.c		\ | ||||
| 	compositor/meta-plugin-manager.c	\ | ||||
| 	compositor/meta-plugin-manager.h	\ | ||||
| 	compositor/meta-shadow-factory.c	\ | ||||
| 	compositor/meta-shadow-factory-private.h	\ | ||||
| 	compositor/meta-shaped-texture.c	\ | ||||
| 	compositor/meta-shaped-texture-private.h 	\ | ||||
| 	compositor/meta-surface-actor.c		\ | ||||
| 	compositor/meta-surface-actor.h		\ | ||||
| 	compositor/meta-surface-actor-x11.c	\ | ||||
| 	compositor/meta-surface-actor-x11.h	\ | ||||
| 	compositor/meta-sync-ring.c		\ | ||||
| 	compositor/meta-sync-ring.h		\ | ||||
| 	compositor/meta-shaped-texture-private.h	\ | ||||
| 	compositor/meta-texture-rectangle.c	\ | ||||
| 	compositor/meta-texture-rectangle.h	\ | ||||
| 	compositor/meta-texture-tower.c		\ | ||||
| @@ -153,18 +75,18 @@ libmutter_la_SOURCES =				\ | ||||
| 	compositor/meta-window-group.c		\ | ||||
| 	compositor/meta-window-group.h		\ | ||||
| 	compositor/meta-window-shape.c		\ | ||||
| 	compositor/meta-window-shape.h		\ | ||||
| 	compositor/region-utils.c		\ | ||||
| 	compositor/region-utils.h		\ | ||||
| 	meta/compositor.h			\ | ||||
| 	meta/meta-background.h			\ | ||||
| 	meta/meta-background-actor.h		\ | ||||
| 	meta/meta-background-image.h		\ | ||||
| 	meta/meta-background-group.h		\ | ||||
| 	meta/meta-plugin.h			\ | ||||
| 	meta/meta-shadow-factory.h		\ | ||||
| 	meta/meta-window-actor.h		\ | ||||
| 	meta/meta-window-shape.h		\ | ||||
| 	meta/compositor-mutter.h 		\ | ||||
| 	core/above-tab-keycode.c		\ | ||||
| 	core/constraints.c			\ | ||||
| 	core/constraints.h			\ | ||||
| 	core/core.c				\ | ||||
| @@ -174,17 +96,34 @@ libmutter_la_SOURCES =				\ | ||||
| 	meta/display.h				\ | ||||
| 	core/edge-resistance.c			\ | ||||
| 	core/edge-resistance.h			\ | ||||
| 	core/events.c				\ | ||||
| 	core/events.h				\ | ||||
| 	core/edid-parse.c			\ | ||||
| 	core/edid.h				\ | ||||
| 	core/errors.c				\ | ||||
| 	meta/errors.h				\ | ||||
| 	core/frame.c				\ | ||||
| 	core/frame.h				\ | ||||
| 	core/meta-gesture-tracker.c		\ | ||||
| 	core/meta-gesture-tracker-private.h	\ | ||||
| 	ui/gradient.c				\ | ||||
| 	meta/gradient.h				\ | ||||
| 	core/group-private.h			\ | ||||
| 	core/group-props.c			\ | ||||
| 	core/group-props.h			\ | ||||
| 	core/group.c				\ | ||||
| 	meta/group.h				\ | ||||
| 	core/iconcache.c			\ | ||||
| 	core/iconcache.h			\ | ||||
| 	core/keybindings.c			\ | ||||
| 	core/keybindings-private.h		\ | ||||
| 	core/main.c				\ | ||||
| 	core/meta-cursor-tracker.c		\ | ||||
| 	core/meta-cursor-tracker-private.h	\ | ||||
| 	core/meta-idle-monitor.c		\ | ||||
| 	core/meta-idle-monitor-private.h	\ | ||||
| 	core/meta-xrandr-shared.h		\ | ||||
| 	core/monitor.c				\ | ||||
| 	core/monitor-config.c			\ | ||||
| 	core/monitor-private.h			\ | ||||
| 	core/monitor-xrandr.c			\ | ||||
| 	core/mutter-Xatomtype.h			\ | ||||
| 	core/place.c				\ | ||||
| 	core/place.h				\ | ||||
| 	core/prefs.c				\ | ||||
| @@ -193,7 +132,8 @@ libmutter_la_SOURCES =				\ | ||||
| 	core/screen-private.h			\ | ||||
| 	meta/screen.h				\ | ||||
| 	meta/types.h				\ | ||||
| 	core/restart.c				\ | ||||
| 	core/session.c				\ | ||||
| 	core/session.h				\ | ||||
| 	core/stack.c				\ | ||||
| 	core/stack.h				\ | ||||
| 	core/stack-tracker.c			\ | ||||
| @@ -201,118 +141,41 @@ libmutter_la_SOURCES =				\ | ||||
| 	core/util.c				\ | ||||
| 	meta/util.h				\ | ||||
| 	core/util-private.h			\ | ||||
| 	core/window-props.c			\ | ||||
| 	core/window-props.h			\ | ||||
| 	core/window.c				\ | ||||
| 	core/window-private.h			\ | ||||
| 	meta/window.h				\ | ||||
| 	core/workspace.c			\ | ||||
| 	core/workspace-private.h		\ | ||||
| 	core/xprops.c				\ | ||||
| 	core/xprops.h				\ | ||||
| 	meta/common.h				\ | ||||
| 	core/core.h				\ | ||||
| 	ui/ui.h					\ | ||||
| 	ui/frames.c				\ | ||||
| 	ui/frames.h				\ | ||||
| 	ui/menu.c				\ | ||||
| 	ui/menu.h				\ | ||||
| 	ui/metaaccellabel.c			\ | ||||
| 	ui/metaaccellabel.h			\ | ||||
| 	ui/resizepopup.c			\ | ||||
| 	ui/resizepopup.h			\ | ||||
| 	ui/theme-parser.c			\ | ||||
| 	ui/theme.c				\ | ||||
| 	meta/theme.h				\ | ||||
| 	ui/theme-private.h			\ | ||||
| 	ui/ui.c					\ | ||||
| 	x11/atomnames.h				\ | ||||
| 	x11/events.c				\ | ||||
| 	x11/events.h				\ | ||||
| 	x11/group-private.h			\ | ||||
| 	x11/group-props.c			\ | ||||
| 	x11/group-props.h			\ | ||||
| 	x11/group.c				\ | ||||
| 	meta/group.h				\ | ||||
| 	x11/iconcache.c				\ | ||||
| 	x11/iconcache.h				\ | ||||
| 	x11/session.c				\ | ||||
| 	x11/session.h				\ | ||||
| 	x11/window-props.c			\ | ||||
| 	x11/window-props.h			\ | ||||
| 	x11/window-x11.c			\ | ||||
| 	x11/window-x11.h			\ | ||||
| 	x11/window-x11-private.h		\ | ||||
| 	x11/xprops.c				\ | ||||
| 	x11/xprops.h				\ | ||||
| 	x11/mutter-Xatomtype.h			\ | ||||
| 	$(NULL) | ||||
| 	ui/ui.c | ||||
|  | ||||
| if HAVE_WAYLAND | ||||
| libmutter_la_SOURCES +=				\ | ||||
| 	compositor/meta-surface-actor-wayland.c	\ | ||||
| 	compositor/meta-surface-actor-wayland.h	\ | ||||
| 	wayland/meta-wayland.c			\ | ||||
| 	wayland/meta-wayland.h			\ | ||||
| 	wayland/meta-wayland-private.h		\ | ||||
| 	wayland/meta-xwayland.c			\ | ||||
| 	wayland/meta-xwayland.h			\ | ||||
| 	wayland/meta-xwayland-selection.c	\ | ||||
| 	wayland/meta-xwayland-selection-private.h	\ | ||||
| 	wayland/meta-xwayland-private.h		\ | ||||
| 	wayland/meta-wayland-buffer.c      	\ | ||||
| 	wayland/meta-wayland-buffer.h      	\ | ||||
| 	wayland/meta-wayland-region.c      	\ | ||||
| 	wayland/meta-wayland-region.h      	\ | ||||
| 	wayland/meta-wayland-data-device.c      \ | ||||
| 	wayland/meta-wayland-data-device.h      \ | ||||
| 	wayland/meta-wayland-data-device-private.h	\ | ||||
| 	wayland/meta-wayland-pointer-gestures.c	\ | ||||
| 	wayland/meta-wayland-pointer-gestures.h	\ | ||||
| 	wayland/meta-wayland-pointer-gesture-swipe.c	\ | ||||
| 	wayland/meta-wayland-pointer-gesture-swipe.h	\ | ||||
| 	wayland/meta-wayland-pointer-gesture-pinch.c	\ | ||||
| 	wayland/meta-wayland-pointer-gesture-pinch.h	\ | ||||
| 	wayland/meta-wayland-keyboard.c		\ | ||||
| 	wayland/meta-wayland-keyboard.h		\ | ||||
| 	wayland/meta-wayland-pointer.c		\ | ||||
| 	wayland/meta-wayland-pointer.h		\ | ||||
| 	wayland/meta-wayland-popup.c		\ | ||||
| 	wayland/meta-wayland-popup.h		\ | ||||
| 	wayland/meta-wayland-seat.c		\ | ||||
| 	wayland/meta-wayland-seat.h		\ | ||||
| 	wayland/meta-wayland-touch.c		\ | ||||
| 	wayland/meta-wayland-touch.h		\ | ||||
| 	wayland/meta-wayland-surface.c		\ | ||||
| 	wayland/meta-wayland-surface.h		\ | ||||
| 	wayland/meta-wayland-types.h		\ | ||||
| 	wayland/meta-wayland-versions.h		\ | ||||
| 	wayland/meta-wayland-outputs.c		\ | ||||
| 	wayland/meta-wayland-outputs.h		\ | ||||
| 	wayland/meta-window-wayland.c		\ | ||||
| 	wayland/meta-window-wayland.h		\ | ||||
| 	$(NULL) | ||||
| endif | ||||
| nodist_libmutter_la_SOURCES =			\ | ||||
| 	$(mutter_built_sources) | ||||
|  | ||||
| if HAVE_NATIVE_BACKEND | ||||
| libmutter_la_SOURCES +=					\ | ||||
| 	backends/native/meta-backend-native.c		\ | ||||
| 	backends/native/meta-backend-native.h		\ | ||||
| 	backends/native/meta-backend-native-private.h	\ | ||||
| 	backends/native/meta-barrier-native.c		\ | ||||
| 	backends/native/meta-barrier-native.h		\ | ||||
| 	backends/native/meta-cursor-renderer-native.c	\ | ||||
| 	backends/native/meta-cursor-renderer-native.h	\ | ||||
| 	backends/native/meta-idle-monitor-native.c	\ | ||||
| 	backends/native/meta-idle-monitor-native.h	\ | ||||
| 	backends/native/meta-input-settings-native.c	\ | ||||
| 	backends/native/meta-input-settings-native.h	\ | ||||
| 	backends/native/meta-monitor-manager-kms.c	\ | ||||
| 	backends/native/meta-monitor-manager-kms.h	\ | ||||
| 	backends/native/meta-launcher.c			\ | ||||
| 	backends/native/meta-launcher.h			\ | ||||
| 	backends/native/dbus-utils.c			\ | ||||
| 	backends/native/dbus-utils.h			\ | ||||
| 	$(NULL) | ||||
| endif | ||||
|  | ||||
| nodist_libmutter_la_SOURCES = $(mutter_built_sources) | ||||
|  | ||||
| libmutter_la_LDFLAGS = -no-undefined -export-symbols-regex "^(meta|ag)_.*" | ||||
| libmutter_la_LIBADD  = $(MUTTER_LIBS) $(MUTTER_NATIVE_BACKEND_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_headers =			\ | ||||
| libmutterinclude_base_headers =		\ | ||||
| 	meta/barrier.h				\ | ||||
| 	meta/boxes.h				\ | ||||
| 	meta/common.h				\ | ||||
| @@ -320,60 +183,43 @@ libmutterinclude_headers =			\ | ||||
| 	meta/compositor.h			\ | ||||
| 	meta/display.h				\ | ||||
| 	meta/errors.h				\ | ||||
| 	meta/gradient.h				\ | ||||
| 	meta/group.h				\ | ||||
| 	meta/keybindings.h			\ | ||||
| 	meta/main.h				\ | ||||
| 	meta/meta-backend.h			\ | ||||
| 	meta/meta-background.h			\ | ||||
| 	meta/meta-background-actor.h		\ | ||||
| 	meta/meta-background-image.h		\ | ||||
| 	meta/meta-background-group.h		\ | ||||
| 	meta/meta-background.h			\ | ||||
| 	meta/meta-cursor-tracker.h		\ | ||||
| 	meta/meta-idle-monitor.h		\ | ||||
| 	meta/meta-plugin.h			\ | ||||
| 	meta/meta-monitor-manager.h		\ | ||||
| 	meta/meta-shaped-texture.h		\ | ||||
| 	meta/meta-shadow-factory.h		\ | ||||
| 	meta/meta-window-actor.h		\ | ||||
| 	meta/meta-window-shape.h		\ | ||||
| 	meta/prefs.h				\ | ||||
| 	meta/screen.h				\ | ||||
| 	meta/theme.h				\ | ||||
| 	meta/types.h				\ | ||||
| 	meta/util.h				\ | ||||
| 	meta/window.h				\ | ||||
| 	meta/workspace.h			\ | ||||
| 	$(NULL) | ||||
| 	meta/workspace.h | ||||
|  | ||||
| libmutterinclude_built_headers =		\ | ||||
| 	meta/meta-version.h			\ | ||||
| 	meta/meta-enum-types.h			\ | ||||
| 	$(NULL) | ||||
|  | ||||
| libmutterinclude_base_headers =			\ | ||||
| 	$(libmutterinclude_headers)		\ | ||||
| 	$(libmutterinclude_built_headers) | ||||
| # Excluded from scanning for introspection but installed | ||||
| # atomnames.h: macros cause problems for scanning process | ||||
| libmutterinclude_extra_headers =		\ | ||||
| 	meta/atomnames.h | ||||
|  | ||||
| libmutterincludedir = $(includedir)/mutter/meta | ||||
|  | ||||
| libmutterinclude_HEADERS =			\ | ||||
| 	$(libmutterinclude_headers) | ||||
|  | ||||
| nodist_libmutterinclude_HEADERS =		\ | ||||
| 	$(libmutterinclude_built_headers) | ||||
| 	$(libmutterinclude_base_headers)	\ | ||||
| 	$(libmutterinclude_extra_headers) | ||||
|  | ||||
| bin_PROGRAMS=mutter | ||||
| noinst_PROGRAMS= | ||||
|  | ||||
| mutter_SOURCES = core/mutter.c | ||||
| mutter_LDADD = $(MUTTER_LIBS) libmutter.la | ||||
|  | ||||
| libexec_PROGRAMS = mutter-restart-helper | ||||
| mutter_restart_helper_SOURCES = core/restart-helper.c | ||||
| mutter_restart_helper_LDADD = $(MUTTER_LIBS) | ||||
|  | ||||
| include Makefile-tests.am | ||||
|  | ||||
| if HAVE_INTROSPECTION | ||||
| include $(INTROSPECTION_MAKEFILE) | ||||
|  | ||||
| @@ -397,91 +243,118 @@ INTROSPECTION_GIRS = Meta-$(api_version).gir | ||||
| Meta-$(api_version).gir: libmutter.la | ||||
| @META_GIR@_INCLUDES = GObject-2.0 GDesktopEnums-3.0 Gdk-3.0 Gtk-3.0 Clutter-1.0 xlib-2.0 xfixes-4.0 Cogl-1.0 | ||||
| @META_GIR@_EXPORT_PACKAGES = libmutter | ||||
| @META_GIR@_CFLAGS = $(AM_CPPFLAGS) | ||||
| @META_GIR@_CFLAGS = $(INCLUDES) | ||||
| @META_GIR@_LIBS = libmutter.la | ||||
| @META_GIR@_FILES =				\ | ||||
| 	mutter-enum-types.h			\ | ||||
| 	$(libmutterinclude_base_headers)	\ | ||||
| 	$(filter %.c,$(libmutter_la_SOURCES) $(nodist_libmutter_la_SOURCES)) | ||||
| @META_GIR@_SCANNERFLAGS = --warn-all --warn-error | ||||
|  | ||||
| endif | ||||
|  | ||||
| dbus_idle_built_sources = meta-dbus-idle-monitor.c meta-dbus-idle-monitor.h | ||||
| testboxes_SOURCES = core/testboxes.c | ||||
| testgradient_SOURCES = ui/testgradient.c | ||||
| testasyncgetprop_SOURCES = core/testasyncgetprop.c | ||||
|  | ||||
| noinst_PROGRAMS=testboxes testgradient testasyncgetprop | ||||
|  | ||||
| testboxes_LDADD = $(MUTTER_LIBS) libmutter.la | ||||
| testgradient_LDADD = $(MUTTER_LIBS) libmutter.la | ||||
| testasyncgetprop_LDADD = $(MUTTER_LIBS) libmutter.la | ||||
|  | ||||
| @INTLTOOL_DESKTOP_RULE@ | ||||
|  | ||||
| desktopfilesdir=$(datadir)/applications | ||||
| desktopfiles_in_files=mutter.desktop.in | ||||
| desktopfiles_files=$(desktopfiles_in_files:.desktop.in=.desktop) | ||||
| desktopfiles_DATA = $(desktopfiles_files) | ||||
|  | ||||
| wmpropertiesdir=$(datadir)/gnome/wm-properties | ||||
| wmproperties_in_files=mutter-wm.desktop.in | ||||
| wmproperties_files=$(wmproperties_in_files:.desktop.in=.desktop) | ||||
| wmproperties_DATA = $(wmproperties_files) | ||||
|  | ||||
| xmldir       = @GNOME_KEYBINDINGS_KEYSDIR@ | ||||
| xml_in_files = \ | ||||
|         50-mutter-navigation.xml.in	\ | ||||
|         50-mutter-system.xml.in		\ | ||||
|         50-mutter-windows.xml.in | ||||
| xml_DATA     = $(xml_in_files:.xml.in=.xml) | ||||
|  | ||||
| gsettings_SCHEMAS = org.gnome.mutter.gschema.xml | ||||
| @INTLTOOL_XML_NOMERGE_RULE@ | ||||
| @GSETTINGS_RULES@ | ||||
|  | ||||
| convertdir = $(datadir)/GConf/gsettings | ||||
| convert_DATA = mutter-schemas.convert | ||||
|  | ||||
| CLEANFILES =					\ | ||||
| 	mutter.desktop				\ | ||||
| 	mutter-wm.desktop			\ | ||||
| 	org.gnome.mutter.gschema.xml		\ | ||||
| 	$(xml_DATA)				\ | ||||
| 	$(mutter_built_sources)			\ | ||||
| 	$(typelib_DATA)				\ | ||||
| 	$(gir_DATA) | ||||
|  | ||||
| DISTCLEANFILES = 				\ | ||||
| 	$(libmutterinclude_built_headers) | ||||
|  | ||||
| pkgconfigdir = $(libdir)/pkgconfig | ||||
| pkgconfig_DATA = libmutter.pc | ||||
|  | ||||
| EXTRA_DIST +=					\ | ||||
| 	$(wayland_protocols)			\ | ||||
| 	libmutter.pc.in				\ | ||||
| 	meta-enum-types.h.in			\ | ||||
| 	meta-enum-types.c.in			\ | ||||
| 	org.freedesktop.login1.xml		\ | ||||
| 	org.gnome.Mutter.DisplayConfig.xml	\ | ||||
| 	org.gnome.Mutter.IdleMonitor.xml	\ | ||||
| 	$(NULL) | ||||
| pkgconfig_DATA = libmutter.pc mutter-plugins.pc | ||||
|  | ||||
| BUILT_SOURCES =					\ | ||||
| 	$(mutter_built_sources)			\ | ||||
| 	$(libmutterinclude_built_headers) | ||||
| EXTRA_DIST=$(desktopfiles_files) 	\ | ||||
| 	$(wmproperties_files)		\ | ||||
| 	$(IMAGES) 			\ | ||||
| 	$(desktopfiles_in_files)	\ | ||||
| 	$(wmproperties_in_files)	\ | ||||
| 	$(xml_in_files)			\ | ||||
| 	org.gnome.mutter.gschema.xml.in \ | ||||
| 	idle-monitor.xml \ | ||||
| 	xrandr.xml \ | ||||
| 	mutter-schemas.convert \ | ||||
| 	libmutter.pc.in \ | ||||
| 	mutter-plugins.pc.in  \ | ||||
| 	mutter-enum-types.h.in \ | ||||
| 	mutter-enum-types.c.in | ||||
|  | ||||
| MUTTER_STAMP_FILES = stamp-meta-enum-types.h | ||||
| BUILT_SOURCES = $(mutter_built_sources) | ||||
| MUTTER_STAMP_FILES = stamp-mutter-enum-types.h | ||||
| CLEANFILES += $(MUTTER_STAMP_FILES) | ||||
|  | ||||
| meta/meta-enum-types.h: stamp-meta-enum-types.h Makefile | ||||
| mutter-enum-types.h: stamp-mutter-enum-types.h Makefile | ||||
| 	@true | ||||
| stamp-meta-enum-types.h: $(libmutterinclude_headers) meta-enum-types.h.in | ||||
| stamp-mutter-enum-types.h: $(libmutterinclude_base_headers) mutter-enum-types.h.in | ||||
| 	$(AM_V_GEN) ( cd $(srcdir) && \ | ||||
| 	  $(GLIB_MKENUMS) \ | ||||
| 	    --template meta-enum-types.h.in \ | ||||
| 	    --template mutter-enum-types.h.in \ | ||||
| 	  $(libmutterinclude_base_headers) ) >> xgen-teth && \ | ||||
| 	(cmp -s xgen-teth meta/meta-enum-types.h || cp xgen-teth meta/meta-enum-types.h) && \ | ||||
| 	(cmp -s xgen-teth mutter-enum-types.h || cp xgen-teth mutter-enum-types.h) && \ | ||||
| 	rm -f xgen-teth && \ | ||||
| 	echo timestamp > $(@F) | ||||
|  | ||||
| meta-enum-types.c: stamp-meta-enum-types.h meta-enum-types.c.in | ||||
| mutter-enum-types.c: stamp-mutter-enum-types.h mutter-enum-types.c.in | ||||
| 	  $(AM_V_GEN) ( cd $(srcdir) && \ | ||||
| 	  $(GLIB_MKENUMS) \ | ||||
| 	    --template meta-enum-types.c.in \ | ||||
| 	    --template mutter-enum-types.c.in \ | ||||
| 	  $(libmutterinclude_base_headers) ) >> xgen-tetc && \ | ||||
| 	cp xgen-tetc meta-enum-types.c && \ | ||||
| 	cp xgen-tetc mutter-enum-types.c && \ | ||||
| 	rm -f xgen-tetc | ||||
|  | ||||
| dbus_display_config_built_sources = meta-dbus-display-config.c meta-dbus-display-config.h | ||||
| dbus_xrandr_built_sources = meta-dbus-xrandr.c meta-dbus-xrandr.h | ||||
|  | ||||
| $(dbus_display_config_built_sources) : Makefile.am org.gnome.Mutter.DisplayConfig.xml | ||||
| $(dbus_xrandr_built_sources) : Makefile.am xrandr.xml | ||||
| 	$(AM_V_GEN)gdbus-codegen							\ | ||||
| 		--interface-prefix org.gnome.Mutter					\ | ||||
| 		--c-namespace MetaDBus							\ | ||||
| 		--generate-c-code meta-dbus-display-config				\ | ||||
| 		$(srcdir)/org.gnome.Mutter.DisplayConfig.xml | ||||
| 		--generate-c-code meta-dbus-xrandr					\ | ||||
| 		$(srcdir)/xrandr.xml | ||||
|  | ||||
| $(dbus_idle_built_sources) : Makefile.am org.gnome.Mutter.IdleMonitor.xml | ||||
| dbus_idle_built_sources = meta-dbus-idle-monitor.c meta-dbus-idle-monitor.h | ||||
|  | ||||
| $(dbus_idle_built_sources) : Makefile.am idle-monitor.xml | ||||
| 	$(AM_V_GEN)gdbus-codegen							\ | ||||
| 		--interface-prefix org.gnome.Mutter					\ | ||||
| 		--c-namespace MetaDBus							\ | ||||
| 		--generate-c-code meta-dbus-idle-monitor				\ | ||||
| 		--c-generate-object-manager						\ | ||||
| 		$(srcdir)/org.gnome.Mutter.IdleMonitor.xml | ||||
|  | ||||
| dbus_login1_built_sources = meta-dbus-login1.c meta-dbus-login1.h | ||||
|  | ||||
| $(dbus_login1_built_sources) : Makefile.am org.freedesktop.login1.xml | ||||
| 	$(AM_V_GEN)gdbus-codegen							\ | ||||
| 		--interface-prefix org.freedesktop.login1				\ | ||||
| 		--c-namespace Login1							\ | ||||
| 		--generate-c-code meta-dbus-login1					\ | ||||
| 		$(srcdir)/org.freedesktop.login1.xml | ||||
|  | ||||
| %-protocol.c : $(srcdir)/wayland/protocol/%.xml | ||||
| 	$(AM_V_GEN)$(WAYLAND_SCANNER) code < $< > $@ | ||||
| %-server-protocol.h : $(srcdir)/wayland/protocol/%.xml | ||||
| 	$(AM_V_GEN)$(WAYLAND_SCANNER) server-header < $< > $@ | ||||
| 		$(srcdir)/idle-monitor.xml | ||||
|   | ||||
| @@ -1,113 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2014 Red Hat | ||||
|  * | ||||
|  * 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. | ||||
|  * | ||||
|  * Written by: | ||||
|  *     Jasper St. Pierre <jstpierre@mecheye.net> | ||||
|  */ | ||||
|  | ||||
|  | ||||
| #ifndef META_BACKEND_PRIVATE_H | ||||
| #define META_BACKEND_PRIVATE_H | ||||
|  | ||||
| #include <glib-object.h> | ||||
|  | ||||
| #include <xkbcommon/xkbcommon.h> | ||||
|  | ||||
| #include <meta/meta-backend.h> | ||||
| #include <meta/meta-idle-monitor.h> | ||||
| #include "meta-cursor-renderer.h" | ||||
| #include "meta-monitor-manager-private.h" | ||||
|  | ||||
| #define DEFAULT_XKB_RULES_FILE "evdev" | ||||
| #define DEFAULT_XKB_MODEL "pc105+inet" | ||||
|  | ||||
| #define META_TYPE_BACKEND             (meta_backend_get_type ()) | ||||
| #define META_BACKEND(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_BACKEND, MetaBackend)) | ||||
| #define META_BACKEND_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass),  META_TYPE_BACKEND, MetaBackendClass)) | ||||
| #define META_IS_BACKEND(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_BACKEND)) | ||||
| #define META_IS_BACKEND_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass),  META_TYPE_BACKEND)) | ||||
| #define META_BACKEND_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj),  META_TYPE_BACKEND, MetaBackendClass)) | ||||
|  | ||||
| struct _MetaBackend | ||||
| { | ||||
|   GObject parent; | ||||
|  | ||||
|   GHashTable *device_monitors; | ||||
|   gint current_device_id; | ||||
| }; | ||||
|  | ||||
| struct _MetaBackendClass | ||||
| { | ||||
|   GObjectClass parent_class; | ||||
|  | ||||
|   void (* post_init) (MetaBackend *backend); | ||||
|  | ||||
|   MetaIdleMonitor * (* create_idle_monitor) (MetaBackend *backend, | ||||
|                                              int          device_id); | ||||
|   MetaMonitorManager * (* create_monitor_manager) (MetaBackend *backend); | ||||
|   MetaCursorRenderer * (* create_cursor_renderer) (MetaBackend *backend); | ||||
|  | ||||
|   gboolean (* grab_device) (MetaBackend *backend, | ||||
|                             int          device_id, | ||||
|                             uint32_t     timestamp); | ||||
|   gboolean (* ungrab_device) (MetaBackend *backend, | ||||
|                               int          device_id, | ||||
|                               uint32_t     timestamp); | ||||
|  | ||||
|   void (* warp_pointer) (MetaBackend *backend, | ||||
|                          int          x, | ||||
|                          int          y); | ||||
|  | ||||
|   void (* set_keymap) (MetaBackend *backend, | ||||
|                        const char  *layouts, | ||||
|                        const char  *variants, | ||||
|                        const char  *options); | ||||
|  | ||||
|   struct xkb_keymap * (* get_keymap) (MetaBackend *backend); | ||||
|  | ||||
|   void (* lock_layout_group) (MetaBackend *backend, | ||||
|                               guint        idx); | ||||
|  | ||||
|   void (* update_screen_size) (MetaBackend *backend, int width, int height); | ||||
|   void (* select_stage_events) (MetaBackend *backend); | ||||
| }; | ||||
|  | ||||
| MetaIdleMonitor * meta_backend_get_idle_monitor (MetaBackend *backend, | ||||
|                                                  int          device_id); | ||||
| MetaMonitorManager * meta_backend_get_monitor_manager (MetaBackend *backend); | ||||
| MetaCursorRenderer * meta_backend_get_cursor_renderer (MetaBackend *backend); | ||||
|  | ||||
| gboolean meta_backend_grab_device (MetaBackend *backend, | ||||
|                                    int          device_id, | ||||
|                                    uint32_t     timestamp); | ||||
| gboolean meta_backend_ungrab_device (MetaBackend *backend, | ||||
|                                      int          device_id, | ||||
|                                      uint32_t     timestamp); | ||||
|  | ||||
| void meta_backend_warp_pointer (MetaBackend *backend, | ||||
|                                 int          x, | ||||
|                                 int          y); | ||||
|  | ||||
| struct xkb_keymap * meta_backend_get_keymap (MetaBackend *backend); | ||||
|  | ||||
| void meta_backend_update_last_device (MetaBackend *backend, | ||||
|                                       int          device_id); | ||||
|  | ||||
| #endif /* META_BACKEND_PRIVATE_H */ | ||||
| @@ -1,643 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2014 Red Hat | ||||
|  * | ||||
|  * 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. | ||||
|  * | ||||
|  * Written by: | ||||
|  *     Jasper St. Pierre <jstpierre@mecheye.net> | ||||
|  */ | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| #include <meta/meta-backend.h> | ||||
| #include "meta-backend-private.h" | ||||
| #include "meta-input-settings-private.h" | ||||
|  | ||||
| #include "backends/x11/meta-backend-x11.h" | ||||
| #include "meta-cursor-tracker-private.h" | ||||
| #include "meta-stage.h" | ||||
|  | ||||
| #ifdef HAVE_NATIVE_BACKEND | ||||
| #include "backends/native/meta-backend-native.h" | ||||
| #endif | ||||
|  | ||||
| #include "backends/meta-idle-monitor-private.h" | ||||
|  | ||||
| #include "backends/meta-monitor-manager-dummy.h" | ||||
|  | ||||
| static MetaBackend *_backend; | ||||
|  | ||||
| /** | ||||
|  * meta_get_backend: | ||||
|  * | ||||
|  * Accessor for the singleton MetaBackend. | ||||
|  * | ||||
|  * Returns: (transfer none): The only #MetaBackend there is. | ||||
|  */ | ||||
| MetaBackend * | ||||
| meta_get_backend (void) | ||||
| { | ||||
|   return _backend; | ||||
| } | ||||
|  | ||||
| struct _MetaBackendPrivate | ||||
| { | ||||
|   MetaMonitorManager *monitor_manager; | ||||
|   MetaCursorRenderer *cursor_renderer; | ||||
|   MetaInputSettings *input_settings; | ||||
|  | ||||
|   ClutterActor *stage; | ||||
| }; | ||||
| typedef struct _MetaBackendPrivate MetaBackendPrivate; | ||||
|  | ||||
| G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (MetaBackend, meta_backend, G_TYPE_OBJECT); | ||||
|  | ||||
| static void | ||||
| meta_backend_finalize (GObject *object) | ||||
| { | ||||
|   MetaBackend *backend = META_BACKEND (object); | ||||
|   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); | ||||
|  | ||||
|   g_clear_object (&priv->monitor_manager); | ||||
|   g_clear_object (&priv->input_settings); | ||||
|  | ||||
|   g_hash_table_destroy (backend->device_monitors); | ||||
|  | ||||
|   G_OBJECT_CLASS (meta_backend_parent_class)->finalize (object); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_sync_screen_size (MetaBackend *backend) | ||||
| { | ||||
|   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); | ||||
|   int width, height; | ||||
|  | ||||
|   meta_monitor_manager_get_screen_size (priv->monitor_manager, &width, &height); | ||||
|  | ||||
|   META_BACKEND_GET_CLASS (backend)->update_screen_size (backend, width, height); | ||||
| } | ||||
|  | ||||
| static void | ||||
| center_pointer (MetaBackend *backend) | ||||
| { | ||||
|   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); | ||||
|   MetaMonitorInfo *monitors, *primary; | ||||
|   guint n_monitors; | ||||
|  | ||||
|   monitors = meta_monitor_manager_get_monitor_infos (priv->monitor_manager, &n_monitors); | ||||
|   primary = &monitors[meta_monitor_manager_get_primary_index (priv->monitor_manager)]; | ||||
|   meta_backend_warp_pointer (backend, | ||||
|                              primary->rect.x + primary->rect.width / 2, | ||||
|                              primary->rect.y + primary->rect.height / 2); | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_monitors_changed (MetaMonitorManager *monitors, | ||||
|                      gpointer user_data) | ||||
| { | ||||
|   MetaBackend *backend = META_BACKEND (user_data); | ||||
|   ClutterDeviceManager *manager = clutter_device_manager_get_default (); | ||||
|   ClutterInputDevice *device = clutter_device_manager_get_core_device (manager, CLUTTER_POINTER_DEVICE); | ||||
|   ClutterPoint point; | ||||
|  | ||||
|   meta_backend_sync_screen_size (backend); | ||||
|  | ||||
|   if (clutter_input_device_get_coords (device, NULL, &point)) | ||||
|     { | ||||
|       /* If we're outside all monitors, warp the pointer back inside */ | ||||
|       if (meta_monitor_manager_get_monitor_at_point (monitors, point.x, point.y) < 0) | ||||
|         center_pointer (backend); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static MetaIdleMonitor * | ||||
| meta_backend_create_idle_monitor (MetaBackend *backend, | ||||
|                                   int          device_id) | ||||
| { | ||||
|   return META_BACKEND_GET_CLASS (backend)->create_idle_monitor (backend, device_id); | ||||
| } | ||||
|  | ||||
| static void | ||||
| create_device_monitor (MetaBackend *backend, | ||||
|                        int          device_id) | ||||
| { | ||||
|   MetaIdleMonitor *idle_monitor; | ||||
|  | ||||
|   g_assert (g_hash_table_lookup (backend->device_monitors, &device_id) == NULL); | ||||
|  | ||||
|   idle_monitor = meta_backend_create_idle_monitor (backend, device_id); | ||||
|   g_hash_table_insert (backend->device_monitors, &idle_monitor->device_id, idle_monitor); | ||||
| } | ||||
|  | ||||
| static void | ||||
| destroy_device_monitor (MetaBackend *backend, | ||||
|                         int          device_id) | ||||
| { | ||||
|   g_hash_table_remove (backend->device_monitors, &device_id); | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_device_added (ClutterDeviceManager *device_manager, | ||||
|                  ClutterInputDevice   *device, | ||||
|                  gpointer              user_data) | ||||
| { | ||||
|   MetaBackend *backend = META_BACKEND (user_data); | ||||
|   int device_id = clutter_input_device_get_device_id (device); | ||||
|  | ||||
|   create_device_monitor (backend, device_id); | ||||
| } | ||||
|  | ||||
| static inline gboolean | ||||
| device_is_slave_touchscreen (ClutterInputDevice *device) | ||||
| { | ||||
|   return (clutter_input_device_get_device_mode (device) != CLUTTER_INPUT_MODE_MASTER && | ||||
|           clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE); | ||||
| } | ||||
|  | ||||
| static inline gboolean | ||||
| check_has_pointing_device (ClutterDeviceManager *manager) | ||||
| { | ||||
|   const GSList *devices; | ||||
|  | ||||
|   devices = clutter_device_manager_peek_devices (manager); | ||||
|  | ||||
|   for (; devices; devices = devices->next) | ||||
|     { | ||||
|       ClutterInputDevice *device = devices->data; | ||||
|  | ||||
|       if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER) | ||||
|         continue; | ||||
|       if (clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE || | ||||
|           clutter_input_device_get_device_type (device) == CLUTTER_KEYBOARD_DEVICE) | ||||
|         continue; | ||||
|  | ||||
|       return TRUE; | ||||
|     } | ||||
|  | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| static inline gboolean | ||||
| check_has_slave_touchscreen (ClutterDeviceManager *manager) | ||||
| { | ||||
|   const GSList *devices; | ||||
|  | ||||
|   devices = clutter_device_manager_peek_devices (manager); | ||||
|  | ||||
|   for (; devices; devices = devices->next) | ||||
|     { | ||||
|       ClutterInputDevice *device = devices->data; | ||||
|  | ||||
|       if (clutter_input_device_get_device_mode (device) != CLUTTER_INPUT_MODE_MASTER && | ||||
|           clutter_input_device_get_device_type (device) == CLUTTER_TOUCHSCREEN_DEVICE) | ||||
|         return TRUE; | ||||
|     } | ||||
|  | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_device_removed (ClutterDeviceManager *device_manager, | ||||
|                    ClutterInputDevice   *device, | ||||
|                    gpointer              user_data) | ||||
| { | ||||
|   MetaBackend *backend = META_BACKEND (user_data); | ||||
|   int device_id = clutter_input_device_get_device_id (device); | ||||
|  | ||||
|   destroy_device_monitor (backend, device_id); | ||||
|  | ||||
|   /* If the device the user last interacted goes away, check again pointer | ||||
|    * visibility. | ||||
|    */ | ||||
|   if (backend->current_device_id == device_id) | ||||
|     { | ||||
|       MetaCursorTracker *cursor_tracker = meta_cursor_tracker_get_for_screen (NULL); | ||||
|       gboolean has_touchscreen, has_pointing_device; | ||||
|       ClutterInputDeviceType device_type; | ||||
|  | ||||
|       device_type = clutter_input_device_get_device_type (device); | ||||
|       has_touchscreen = check_has_slave_touchscreen (device_manager); | ||||
|  | ||||
|       if (device_type == CLUTTER_TOUCHSCREEN_DEVICE && has_touchscreen) | ||||
|         { | ||||
|           /* There's more touchscreens left, keep the pointer hidden */ | ||||
|           meta_cursor_tracker_set_pointer_visible (cursor_tracker, FALSE); | ||||
|         } | ||||
|       else if (device_type != CLUTTER_KEYBOARD_DEVICE) | ||||
|         { | ||||
|           has_pointing_device = check_has_pointing_device (device_manager); | ||||
|           meta_cursor_tracker_set_pointer_visible (cursor_tracker, | ||||
|                                                    has_pointing_device && | ||||
|                                                    !has_touchscreen); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| static MetaMonitorManager * | ||||
| create_monitor_manager (MetaBackend *backend) | ||||
| { | ||||
|   if (g_getenv ("META_DUMMY_MONITORS")) | ||||
|     return g_object_new (META_TYPE_MONITOR_MANAGER_DUMMY, NULL); | ||||
|  | ||||
|   return META_BACKEND_GET_CLASS (backend)->create_monitor_manager (backend); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_real_post_init (MetaBackend *backend) | ||||
| { | ||||
|   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); | ||||
|  | ||||
|   priv->stage = meta_stage_new (); | ||||
|   clutter_actor_realize (priv->stage); | ||||
|   META_BACKEND_GET_CLASS (backend)->select_stage_events (backend); | ||||
|  | ||||
|   priv->monitor_manager = create_monitor_manager (backend); | ||||
|  | ||||
|   g_signal_connect (priv->monitor_manager, "monitors-changed", | ||||
|                     G_CALLBACK (on_monitors_changed), backend); | ||||
|   meta_backend_sync_screen_size (backend); | ||||
|  | ||||
|   priv->cursor_renderer = META_BACKEND_GET_CLASS (backend)->create_cursor_renderer (backend); | ||||
|  | ||||
|   backend->device_monitors = g_hash_table_new_full (g_int_hash, g_int_equal, | ||||
|                                                     NULL, (GDestroyNotify) g_object_unref); | ||||
|  | ||||
|   { | ||||
|     MetaCursorTracker *cursor_tracker; | ||||
|     ClutterDeviceManager *manager; | ||||
|     gboolean has_touchscreen = FALSE; | ||||
|     GSList *devices, *l; | ||||
|  | ||||
|     /* Create the core device monitor. */ | ||||
|     create_device_monitor (backend, 0); | ||||
|  | ||||
|     manager = clutter_device_manager_get_default (); | ||||
|     g_signal_connect_object (manager, "device-added", | ||||
|                              G_CALLBACK (on_device_added), backend, 0); | ||||
|     g_signal_connect_object (manager, "device-removed", | ||||
|                              G_CALLBACK (on_device_removed), backend, 0); | ||||
|  | ||||
|     devices = clutter_device_manager_list_devices (manager); | ||||
|  | ||||
|     for (l = devices; l != NULL; l = l->next) | ||||
|       { | ||||
|         ClutterInputDevice *device = l->data; | ||||
|         on_device_added (manager, device, backend); | ||||
|         has_touchscreen |= device_is_slave_touchscreen (device); | ||||
|       } | ||||
|  | ||||
|     cursor_tracker = meta_cursor_tracker_get_for_screen (NULL); | ||||
|     meta_cursor_tracker_set_pointer_visible (cursor_tracker, !has_touchscreen); | ||||
|  | ||||
|     g_slist_free (devices); | ||||
|   } | ||||
|  | ||||
|   priv->input_settings = meta_input_settings_create (); | ||||
|  | ||||
|   center_pointer (backend); | ||||
| } | ||||
|  | ||||
| static MetaCursorRenderer * | ||||
| meta_backend_real_create_cursor_renderer (MetaBackend *backend) | ||||
| { | ||||
|   return meta_cursor_renderer_new (); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| meta_backend_real_grab_device (MetaBackend *backend, | ||||
|                                int          device_id, | ||||
|                                uint32_t     timestamp) | ||||
| { | ||||
|   /* Do nothing */ | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| meta_backend_real_ungrab_device (MetaBackend *backend, | ||||
|                                  int          device_id, | ||||
|                                  uint32_t     timestamp) | ||||
| { | ||||
|   /* Do nothing */ | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_real_update_screen_size (MetaBackend *backend, | ||||
|                                       int width, int height) | ||||
| { | ||||
|   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); | ||||
|  | ||||
|   clutter_actor_set_size (priv->stage, width, height); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_real_select_stage_events (MetaBackend *backend) | ||||
| { | ||||
|   /* Do nothing */ | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_class_init (MetaBackendClass *klass) | ||||
| { | ||||
|   GObjectClass *object_class = G_OBJECT_CLASS (klass); | ||||
|  | ||||
|   object_class->finalize = meta_backend_finalize; | ||||
|  | ||||
|   klass->post_init = meta_backend_real_post_init; | ||||
|   klass->create_cursor_renderer = meta_backend_real_create_cursor_renderer; | ||||
|   klass->grab_device = meta_backend_real_grab_device; | ||||
|   klass->ungrab_device = meta_backend_real_ungrab_device; | ||||
|   klass->update_screen_size = meta_backend_real_update_screen_size; | ||||
|   klass->select_stage_events = meta_backend_real_select_stage_events; | ||||
|  | ||||
|   g_signal_new ("keymap-changed", | ||||
|                 G_TYPE_FROM_CLASS (object_class), | ||||
|                 G_SIGNAL_RUN_LAST, | ||||
|                 0, | ||||
|                 NULL, NULL, NULL, | ||||
|                 G_TYPE_NONE, 0); | ||||
|   g_signal_new ("keymap-layout-group-changed", | ||||
|                 G_TYPE_FROM_CLASS (object_class), | ||||
|                 G_SIGNAL_RUN_LAST, | ||||
|                 0, | ||||
|                 NULL, NULL, NULL, | ||||
|                 G_TYPE_NONE, 1, G_TYPE_UINT); | ||||
|   g_signal_new ("last-device-changed", | ||||
|                 G_TYPE_FROM_CLASS (object_class), | ||||
|                 G_SIGNAL_RUN_LAST, | ||||
|                 0, | ||||
|                 NULL, NULL, NULL, | ||||
|                 G_TYPE_NONE, 1, G_TYPE_INT); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_init (MetaBackend *backend) | ||||
| { | ||||
|   _backend = backend; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_backend_post_init (MetaBackend *backend) | ||||
| { | ||||
|   META_BACKEND_GET_CLASS (backend)->post_init (backend); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_backend_get_idle_monitor: (skip) | ||||
|  */ | ||||
| MetaIdleMonitor * | ||||
| meta_backend_get_idle_monitor (MetaBackend *backend, | ||||
|                                int          device_id) | ||||
| { | ||||
|   return g_hash_table_lookup (backend->device_monitors, &device_id); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_backend_get_monitor_manager: (skip) | ||||
|  */ | ||||
| MetaMonitorManager * | ||||
| meta_backend_get_monitor_manager (MetaBackend *backend) | ||||
| { | ||||
|   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); | ||||
|  | ||||
|   return priv->monitor_manager; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_backend_get_cursor_renderer: (skip) | ||||
|  */ | ||||
| MetaCursorRenderer * | ||||
| meta_backend_get_cursor_renderer (MetaBackend *backend) | ||||
| { | ||||
|   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); | ||||
|  | ||||
|   return priv->cursor_renderer; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_backend_grab_device: (skip) | ||||
|  */ | ||||
| gboolean | ||||
| meta_backend_grab_device (MetaBackend *backend, | ||||
|                           int          device_id, | ||||
|                           uint32_t     timestamp) | ||||
| { | ||||
|   return META_BACKEND_GET_CLASS (backend)->grab_device (backend, device_id, timestamp); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_backend_ungrab_device: (skip) | ||||
|  */ | ||||
| gboolean | ||||
| meta_backend_ungrab_device (MetaBackend *backend, | ||||
|                             int          device_id, | ||||
|                             uint32_t     timestamp) | ||||
| { | ||||
|   return META_BACKEND_GET_CLASS (backend)->ungrab_device (backend, device_id, timestamp); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_backend_warp_pointer: (skip) | ||||
|  */ | ||||
| void | ||||
| meta_backend_warp_pointer (MetaBackend *backend, | ||||
|                            int          x, | ||||
|                            int          y) | ||||
| { | ||||
|   META_BACKEND_GET_CLASS (backend)->warp_pointer (backend, x, y); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_backend_set_keymap (MetaBackend *backend, | ||||
|                          const char  *layouts, | ||||
|                          const char  *variants, | ||||
|                          const char  *options) | ||||
| { | ||||
|   META_BACKEND_GET_CLASS (backend)->set_keymap (backend, layouts, variants, options); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_backend_get_keymap: (skip) | ||||
|  */ | ||||
| struct xkb_keymap * | ||||
| meta_backend_get_keymap (MetaBackend *backend) | ||||
|  | ||||
| { | ||||
|   return META_BACKEND_GET_CLASS (backend)->get_keymap (backend); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_backend_lock_layout_group (MetaBackend *backend, | ||||
|                                 guint idx) | ||||
| { | ||||
|   META_BACKEND_GET_CLASS (backend)->lock_layout_group (backend, idx); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_backend_get_stage: | ||||
|  * @backend: A #MetaBackend | ||||
|  * | ||||
|  * Gets the global #ClutterStage that's managed by this backend. | ||||
|  * | ||||
|  * Returns: (transfer none): the #ClutterStage | ||||
|  */ | ||||
| ClutterActor * | ||||
| meta_backend_get_stage (MetaBackend *backend) | ||||
| { | ||||
|   MetaBackendPrivate *priv = meta_backend_get_instance_private (backend); | ||||
|   return priv->stage; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_backend_update_last_device (MetaBackend *backend, | ||||
|                                  int          device_id) | ||||
| { | ||||
|   ClutterInputDeviceType device_type; | ||||
|   MetaCursorTracker *cursor_tracker; | ||||
|   ClutterDeviceManager *manager; | ||||
|   ClutterInputDevice *device; | ||||
|  | ||||
|   if (backend->current_device_id == device_id) | ||||
|     return; | ||||
|  | ||||
|   manager = clutter_device_manager_get_default (); | ||||
|   device = clutter_device_manager_get_device (manager, device_id); | ||||
|  | ||||
|   if (!device || | ||||
|       clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER) | ||||
|     return; | ||||
|  | ||||
|   device_type = clutter_input_device_get_device_type (device); | ||||
|  | ||||
|   cursor_tracker = meta_cursor_tracker_get_for_screen (NULL); | ||||
|   backend->current_device_id = device_id; | ||||
|   g_signal_emit_by_name (backend, "last-device-changed", device_id); | ||||
|  | ||||
|   if (device_type == CLUTTER_KEYBOARD_DEVICE) | ||||
|     return; | ||||
|  | ||||
|   switch (device_type) | ||||
|     { | ||||
|     case CLUTTER_TOUCHSCREEN_DEVICE: | ||||
|       meta_cursor_tracker_set_pointer_visible (cursor_tracker, FALSE); | ||||
|       break; | ||||
|     default: | ||||
|       meta_cursor_tracker_set_pointer_visible (cursor_tracker, TRUE); | ||||
|       break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static GType | ||||
| get_backend_type (void) | ||||
| { | ||||
| #if defined(CLUTTER_WINDOWING_X11) | ||||
|   if (clutter_check_windowing_backend (CLUTTER_WINDOWING_X11)) | ||||
|     return META_TYPE_BACKEND_X11; | ||||
| #endif | ||||
|  | ||||
| #if defined(CLUTTER_WINDOWING_EGL) && defined(HAVE_NATIVE_BACKEND) | ||||
|   if (clutter_check_windowing_backend (CLUTTER_WINDOWING_EGL)) | ||||
|     return META_TYPE_BACKEND_NATIVE; | ||||
| #endif | ||||
|  | ||||
|   g_assert_not_reached (); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_create_backend (void) | ||||
| { | ||||
|   /* meta_backend_init() above install the backend globally so | ||||
|    * so meta_get_backend() works even during initialization. */ | ||||
|   g_object_new (get_backend_type (), NULL); | ||||
| } | ||||
|  | ||||
| /* Mutter is responsible for pulling events off the X queue, so Clutter | ||||
|  * doesn't need (and shouldn't) run its normal event source which polls | ||||
|  * the X fd, but we do have to deal with dispatching events that accumulate | ||||
|  * in the clutter queue. This happens, for example, when clutter generate | ||||
|  * enter/leave events on mouse motion - several events are queued in the | ||||
|  * clutter queue but only one dispatched. It could also happen because of | ||||
|  * explicit calls to clutter_event_put(). We add a very simple custom | ||||
|  * event loop source which is simply responsible for pulling events off | ||||
|  * of the queue and dispatching them before we block for new events. | ||||
|  */ | ||||
|  | ||||
| static gboolean | ||||
| event_prepare (GSource    *source, | ||||
|                gint       *timeout_) | ||||
| { | ||||
|   *timeout_ = -1; | ||||
|  | ||||
|   return clutter_events_pending (); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| event_check (GSource *source) | ||||
| { | ||||
|   return clutter_events_pending (); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| event_dispatch (GSource    *source, | ||||
|                 GSourceFunc callback, | ||||
|                 gpointer    user_data) | ||||
| { | ||||
|   ClutterEvent *event = clutter_event_get (); | ||||
|  | ||||
|   if (event) | ||||
|     { | ||||
|       clutter_do_event (event); | ||||
|       clutter_event_free (event); | ||||
|     } | ||||
|  | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| static GSourceFuncs event_funcs = { | ||||
|   event_prepare, | ||||
|   event_check, | ||||
|   event_dispatch | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * meta_clutter_init: (skip) | ||||
|  */ | ||||
| void | ||||
| meta_clutter_init (void) | ||||
| { | ||||
|   ClutterSettings *clutter_settings; | ||||
|   GSource *source; | ||||
|  | ||||
|   meta_create_backend (); | ||||
|  | ||||
|   if (clutter_init (NULL, NULL) != CLUTTER_INIT_SUCCESS) | ||||
|     g_error ("Unable to initialize Clutter.\n"); | ||||
|  | ||||
|   /* | ||||
|    * XXX: We cannot handle high dpi scaling yet, so fix the scale to 1 | ||||
|    * for now. | ||||
|    */ | ||||
|   clutter_settings = clutter_settings_get_default (); | ||||
|   g_object_set (clutter_settings, "window-scaling-factor", 1, NULL); | ||||
|  | ||||
|   source = g_source_new (&event_funcs, sizeof (GSource)); | ||||
|   g_source_attach (source, NULL); | ||||
|   g_source_unref (source); | ||||
|  | ||||
|   meta_backend_post_init (_backend); | ||||
| } | ||||
| @@ -1,81 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2014-2015 Red Hat | ||||
|  * | ||||
|  * 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. | ||||
|  * | ||||
|  * Written by: | ||||
|  *     Jasper St. Pierre <jstpierre@mecheye.net> | ||||
|  *     Jonas Ådahl <jadahl@gmail.com> | ||||
|  */ | ||||
|  | ||||
| #ifndef META_BARRIER_PRIVATE_H | ||||
| #define META_BARRIER_PRIVATE_H | ||||
|  | ||||
| G_BEGIN_DECLS | ||||
|  | ||||
| #define META_TYPE_BARRIER_IMPL            (meta_barrier_impl_get_type ()) | ||||
| #define META_BARRIER_IMPL(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_BARRIER_IMPL, MetaBarrierImpl)) | ||||
| #define META_BARRIER_IMPL_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  META_TYPE_BARRIER_IMPL, MetaBarrierImplClass)) | ||||
| #define META_IS_BARRIER_IMPL(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_BARRIER_IMPL)) | ||||
| #define META_IS_BARRIER_IMPL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  META_TYPE_BARRIER_IMPL)) | ||||
| #define META_BARRIER_IMPL_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  META_TYPE_BARRIER_IMPL, MetaBarrierImplClass)) | ||||
|  | ||||
| typedef struct _MetaBarrierImpl        MetaBarrierImpl; | ||||
| typedef struct _MetaBarrierImplClass   MetaBarrierImplClass; | ||||
|  | ||||
| struct _MetaBarrierImpl | ||||
| { | ||||
|   GObject parent; | ||||
| }; | ||||
|  | ||||
| struct _MetaBarrierImplClass | ||||
| { | ||||
|   GObjectClass parent_class; | ||||
|  | ||||
|   gboolean (*is_active) (MetaBarrierImpl *barrier); | ||||
|   void (*release) (MetaBarrierImpl  *barrier, | ||||
|                    MetaBarrierEvent *event); | ||||
|   void (*destroy) (MetaBarrierImpl *barrier); | ||||
| }; | ||||
|  | ||||
| GType meta_barrier_impl_get_type (void) G_GNUC_CONST; | ||||
|  | ||||
| void _meta_barrier_emit_hit_signal (MetaBarrier      *barrier, | ||||
|                                     MetaBarrierEvent *event); | ||||
| void _meta_barrier_emit_left_signal (MetaBarrier      *barrier, | ||||
|                                      MetaBarrierEvent *event); | ||||
|  | ||||
| void meta_barrier_event_unref (MetaBarrierEvent *event); | ||||
|  | ||||
| G_END_DECLS | ||||
|  | ||||
| struct _MetaBarrierPrivate | ||||
| { | ||||
|   MetaDisplay *display; | ||||
|  | ||||
|   int x1; | ||||
|   int y1; | ||||
|   int x2; | ||||
|   int y2; | ||||
|  | ||||
|   MetaBarrierDirection directions; | ||||
|  | ||||
|   MetaBarrierImpl *impl; | ||||
| }; | ||||
|  | ||||
| #endif /* META_BARRIER_PRIVATE_H */ | ||||
| @@ -1,221 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2014 Red Hat | ||||
|  * | ||||
|  * 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. | ||||
|  * | ||||
|  * Written by: | ||||
|  *     Jasper St. Pierre <jstpierre@mecheye.net> | ||||
|  */ | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| #include "meta-cursor-renderer.h" | ||||
|  | ||||
| #include <meta/meta-backend.h> | ||||
| #include <meta/util.h> | ||||
|  | ||||
| #include <cogl/cogl.h> | ||||
| #include <clutter/clutter.h> | ||||
|  | ||||
| #include "meta-stage.h" | ||||
|  | ||||
| struct _MetaCursorRendererPrivate | ||||
| { | ||||
|   int current_x, current_y; | ||||
|  | ||||
|   MetaCursorSprite *displayed_cursor; | ||||
|   gboolean handled_by_backend; | ||||
| }; | ||||
| typedef struct _MetaCursorRendererPrivate MetaCursorRendererPrivate; | ||||
|  | ||||
| G_DEFINE_TYPE_WITH_PRIVATE (MetaCursorRenderer, meta_cursor_renderer, G_TYPE_OBJECT); | ||||
|  | ||||
| static void | ||||
| queue_redraw (MetaCursorRenderer *renderer, | ||||
|               MetaCursorSprite   *cursor_sprite) | ||||
| { | ||||
|   MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer); | ||||
|   MetaBackend *backend = meta_get_backend (); | ||||
|   ClutterActor *stage = meta_backend_get_stage (backend); | ||||
|   CoglTexture *texture; | ||||
|   MetaRectangle rect = { 0 }; | ||||
|  | ||||
|   if (cursor_sprite) | ||||
|     rect = meta_cursor_renderer_calculate_rect (renderer, cursor_sprite); | ||||
|  | ||||
|   /* During early initialization, we can have no stage */ | ||||
|   if (!stage) | ||||
|     return; | ||||
|  | ||||
|   if (cursor_sprite && !priv->handled_by_backend) | ||||
|     texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite); | ||||
|   else | ||||
|     texture = NULL; | ||||
|  | ||||
|   meta_stage_set_cursor (META_STAGE (stage), texture, &rect); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| meta_cursor_renderer_real_update_cursor (MetaCursorRenderer *renderer, | ||||
|                                          MetaCursorSprite   *cursor_sprite) | ||||
| { | ||||
|   return FALSE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_cursor_renderer_class_init (MetaCursorRendererClass *klass) | ||||
| { | ||||
|   klass->update_cursor = meta_cursor_renderer_real_update_cursor; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_cursor_renderer_init (MetaCursorRenderer *renderer) | ||||
| { | ||||
| } | ||||
|  | ||||
| MetaRectangle | ||||
| meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer, | ||||
|                                      MetaCursorSprite   *cursor_sprite) | ||||
| { | ||||
|   MetaCursorRendererPrivate *priv = | ||||
|     meta_cursor_renderer_get_instance_private (renderer); | ||||
|   CoglTexture *texture; | ||||
|   int hot_x, hot_y; | ||||
|   int width, height; | ||||
|   float texture_scale; | ||||
|  | ||||
|   texture = meta_cursor_sprite_get_cogl_texture (cursor_sprite); | ||||
|   if (!texture) | ||||
|     return (MetaRectangle) { 0 }; | ||||
|  | ||||
|   meta_cursor_sprite_get_hotspot (cursor_sprite, &hot_x, &hot_y); | ||||
|   texture_scale = meta_cursor_sprite_get_texture_scale (cursor_sprite); | ||||
|   width = cogl_texture_get_width (texture); | ||||
|   height = cogl_texture_get_height (texture); | ||||
|  | ||||
|   return (MetaRectangle) { | ||||
|     .x = (int)roundf (priv->current_x - (hot_x * texture_scale)), | ||||
|     .y = (int)roundf (priv->current_y - (hot_y * texture_scale)), | ||||
|     .width = (int)roundf (width * texture_scale), | ||||
|     .height = (int)roundf (height * texture_scale), | ||||
|   }; | ||||
| } | ||||
|  | ||||
| static void | ||||
| update_cursor (MetaCursorRenderer *renderer, | ||||
|                MetaCursorSprite   *cursor_sprite) | ||||
| { | ||||
|   MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer); | ||||
|   gboolean handled_by_backend; | ||||
|   gboolean should_redraw = FALSE; | ||||
|  | ||||
|   if (cursor_sprite) | ||||
|     meta_cursor_sprite_prepare_at (cursor_sprite, | ||||
|                                    priv->current_x, | ||||
|                                    priv->current_y); | ||||
|  | ||||
|   handled_by_backend = | ||||
|     META_CURSOR_RENDERER_GET_CLASS (renderer)->update_cursor (renderer, | ||||
|                                                               cursor_sprite); | ||||
|   if (handled_by_backend != priv->handled_by_backend) | ||||
|     { | ||||
|       priv->handled_by_backend = handled_by_backend; | ||||
|       should_redraw = TRUE; | ||||
|     } | ||||
|  | ||||
|   if (!handled_by_backend) | ||||
|     should_redraw = TRUE; | ||||
|  | ||||
|   if (should_redraw) | ||||
|     queue_redraw (renderer, cursor_sprite); | ||||
| } | ||||
|  | ||||
| MetaCursorRenderer * | ||||
| meta_cursor_renderer_new (void) | ||||
| { | ||||
|   return g_object_new (META_TYPE_CURSOR_RENDERER, NULL); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer, | ||||
|                                  MetaCursorSprite   *cursor_sprite) | ||||
| { | ||||
|   MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer); | ||||
|  | ||||
|   if (priv->displayed_cursor == cursor_sprite) | ||||
|     return; | ||||
|   priv->displayed_cursor = cursor_sprite; | ||||
|  | ||||
|   update_cursor (renderer, cursor_sprite); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_cursor_renderer_force_update (MetaCursorRenderer *renderer) | ||||
| { | ||||
|   MetaCursorRendererPrivate *priv = | ||||
|     meta_cursor_renderer_get_instance_private (renderer); | ||||
|  | ||||
|   update_cursor (renderer, priv->displayed_cursor); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_cursor_renderer_set_position (MetaCursorRenderer *renderer, | ||||
|                                    int x, int y) | ||||
| { | ||||
|   MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer); | ||||
|  | ||||
|   g_assert (meta_is_wayland_compositor ()); | ||||
|  | ||||
|   priv->current_x = x; | ||||
|   priv->current_y = y; | ||||
|  | ||||
|   update_cursor (renderer, priv->displayed_cursor); | ||||
| } | ||||
|  | ||||
| MetaCursorSprite * | ||||
| meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer) | ||||
| { | ||||
|   MetaCursorRendererPrivate *priv = meta_cursor_renderer_get_instance_private (renderer); | ||||
|  | ||||
|   return priv->displayed_cursor; | ||||
| } | ||||
|  | ||||
| #ifdef HAVE_WAYLAND | ||||
| void | ||||
| meta_cursor_renderer_realize_cursor_from_wl_buffer (MetaCursorRenderer *renderer, | ||||
|                                                     MetaCursorSprite   *cursor_sprite, | ||||
|                                                     struct wl_resource *buffer) | ||||
| { | ||||
|  | ||||
|   MetaCursorRendererClass *renderer_class = META_CURSOR_RENDERER_GET_CLASS (renderer); | ||||
|  | ||||
|   if (renderer_class->realize_cursor_from_wl_buffer) | ||||
|     renderer_class->realize_cursor_from_wl_buffer (renderer, cursor_sprite, buffer); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| void | ||||
| meta_cursor_renderer_realize_cursor_from_xcursor (MetaCursorRenderer *renderer, | ||||
|                                                   MetaCursorSprite   *cursor_sprite, | ||||
|                                                   XcursorImage       *xc_image) | ||||
| { | ||||
|   MetaCursorRendererClass *renderer_class = META_CURSOR_RENDERER_GET_CLASS (renderer); | ||||
|  | ||||
|   if (renderer_class->realize_cursor_from_xcursor) | ||||
|     renderer_class->realize_cursor_from_xcursor (renderer, cursor_sprite, xc_image); | ||||
| } | ||||
| @@ -1,81 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2014 Red Hat | ||||
|  * | ||||
|  * 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. | ||||
|  * | ||||
|  * Written by: | ||||
|  *     Jasper St. Pierre <jstpierre@mecheye.net> | ||||
|  */ | ||||
|  | ||||
| #ifndef META_CURSOR_RENDERER_H | ||||
| #define META_CURSOR_RENDERER_H | ||||
|  | ||||
| #include <glib-object.h> | ||||
| #include <X11/Xcursor/Xcursor.h> | ||||
| #ifdef HAVE_WAYLAND | ||||
| #include <wayland-server.h> | ||||
| #endif | ||||
|  | ||||
| #include <meta/screen.h> | ||||
| #include "meta-cursor.h" | ||||
|  | ||||
| #define META_TYPE_CURSOR_RENDERER (meta_cursor_renderer_get_type ()) | ||||
| G_DECLARE_DERIVABLE_TYPE (MetaCursorRenderer, meta_cursor_renderer, | ||||
|                           META, CURSOR_RENDERER, GObject); | ||||
|  | ||||
| struct _MetaCursorRendererClass | ||||
| { | ||||
|   GObjectClass parent_class; | ||||
|  | ||||
|   gboolean (* update_cursor) (MetaCursorRenderer *renderer, | ||||
|                               MetaCursorSprite   *cursor_sprite); | ||||
| #ifdef HAVE_WAYLAND | ||||
|   void (* realize_cursor_from_wl_buffer) (MetaCursorRenderer *renderer, | ||||
|                                           MetaCursorSprite *cursor_sprite, | ||||
|                                           struct wl_resource *buffer); | ||||
| #endif | ||||
|   void (* realize_cursor_from_xcursor) (MetaCursorRenderer *renderer, | ||||
|                                         MetaCursorSprite *cursor_sprite, | ||||
|                                         XcursorImage *xc_image); | ||||
| }; | ||||
|  | ||||
| MetaCursorRenderer * meta_cursor_renderer_new (void); | ||||
|  | ||||
| void meta_cursor_renderer_set_cursor (MetaCursorRenderer *renderer, | ||||
|                                       MetaCursorSprite   *cursor_sprite); | ||||
|  | ||||
| void meta_cursor_renderer_set_position (MetaCursorRenderer *renderer, | ||||
|                                         int x, int y); | ||||
| void meta_cursor_renderer_force_update (MetaCursorRenderer *renderer); | ||||
|  | ||||
| MetaCursorSprite * meta_cursor_renderer_get_cursor (MetaCursorRenderer *renderer); | ||||
|  | ||||
| MetaRectangle meta_cursor_renderer_calculate_rect (MetaCursorRenderer *renderer, | ||||
|                                                    MetaCursorSprite   *cursor_sprite); | ||||
|  | ||||
| #ifdef HAVE_WAYLAND | ||||
| void meta_cursor_renderer_realize_cursor_from_wl_buffer (MetaCursorRenderer *renderer, | ||||
|                                                          MetaCursorSprite   *cursor_sprite, | ||||
|                                                          struct wl_resource *buffer); | ||||
| #endif | ||||
|  | ||||
| void meta_cursor_renderer_realize_cursor_from_xcursor (MetaCursorRenderer *renderer, | ||||
|                                                        MetaCursorSprite   *cursor_sprite, | ||||
|                                                        XcursorImage       *xc_image); | ||||
|  | ||||
| #endif /* META_CURSOR_RENDERER_H */ | ||||
| @@ -1,72 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright 2013 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, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * Author: Giovanni Campagna <gcampagn@redhat.com> | ||||
|  */ | ||||
|  | ||||
| #ifndef META_CURSOR_TRACKER_PRIVATE_H | ||||
| #define META_CURSOR_TRACKER_PRIVATE_H | ||||
|  | ||||
| #include <meta/meta-cursor-tracker.h> | ||||
|  | ||||
| #include "meta-cursor.h" | ||||
| #include "meta-cursor-renderer.h" | ||||
|  | ||||
| struct _MetaCursorTracker { | ||||
|   GObject parent_instance; | ||||
|  | ||||
|   MetaCursorRenderer *renderer; | ||||
|  | ||||
|   gboolean is_showing; | ||||
|  | ||||
|   MetaCursorSprite *displayed_cursor; | ||||
|  | ||||
|   /* Wayland clients can set a NULL buffer as their cursor | ||||
|    * explicitly, which means that we shouldn't display anything. | ||||
|    * So, we can't simply store a NULL in window_cursor to | ||||
|    * determine an unset window cursor; we need an extra boolean. | ||||
|    */ | ||||
|   gboolean has_window_cursor; | ||||
|   MetaCursorSprite *window_cursor; | ||||
|  | ||||
|   MetaCursorSprite *root_cursor; | ||||
|  | ||||
|   /* The cursor from the X11 server. */ | ||||
|   MetaCursorSprite *xfixes_cursor; | ||||
| }; | ||||
|  | ||||
| struct _MetaCursorTrackerClass { | ||||
|   GObjectClass parent_class; | ||||
| }; | ||||
|  | ||||
| gboolean meta_cursor_tracker_handle_xevent (MetaCursorTracker *tracker, | ||||
| 					    XEvent            *xevent); | ||||
|  | ||||
| void     meta_cursor_tracker_set_window_cursor   (MetaCursorTracker *tracker, | ||||
|                                                   MetaCursorSprite  *cursor_sprite); | ||||
| void     meta_cursor_tracker_unset_window_cursor (MetaCursorTracker *tracker); | ||||
| void     meta_cursor_tracker_set_root_cursor     (MetaCursorTracker *tracker, | ||||
|                                                   MetaCursorSprite  *cursor_sprite); | ||||
|  | ||||
| void     meta_cursor_tracker_update_position (MetaCursorTracker *tracker, | ||||
| 					      int                new_x, | ||||
| 					      int                new_y); | ||||
|  | ||||
| MetaCursorSprite * meta_cursor_tracker_get_displayed_cursor (MetaCursorTracker *tracker); | ||||
|  | ||||
| #endif | ||||
| @@ -1,358 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright 2013 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, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * Author: Giovanni Campagna <gcampagn@redhat.com> | ||||
|  */ | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| #include "meta-cursor.h" | ||||
|  | ||||
| #include <meta/errors.h> | ||||
|  | ||||
| #include "display-private.h" | ||||
| #include "screen-private.h" | ||||
| #include "meta-backend-private.h" | ||||
|  | ||||
| #include <string.h> | ||||
|  | ||||
| #include <X11/cursorfont.h> | ||||
| #include <X11/extensions/Xfixes.h> | ||||
| #include <X11/Xcursor/Xcursor.h> | ||||
|  | ||||
| enum { | ||||
|   PREPARE_AT, | ||||
|  | ||||
|   LAST_SIGNAL | ||||
| }; | ||||
|  | ||||
| static guint signals[LAST_SIGNAL]; | ||||
|  | ||||
| struct _MetaCursorSprite | ||||
| { | ||||
|   GObject parent; | ||||
|  | ||||
|   MetaCursor cursor; | ||||
|  | ||||
|   CoglTexture2D *texture; | ||||
|   float texture_scale; | ||||
|   int hot_x, hot_y; | ||||
|  | ||||
|   int current_frame; | ||||
|   XcursorImages *xcursor_images; | ||||
|  | ||||
|   int theme_scale; | ||||
|   gboolean theme_dirty; | ||||
| }; | ||||
|  | ||||
| G_DEFINE_TYPE (MetaCursorSprite, meta_cursor_sprite, G_TYPE_OBJECT) | ||||
|  | ||||
| static const char * | ||||
| translate_meta_cursor (MetaCursor cursor) | ||||
| { | ||||
|   switch (cursor) | ||||
|     { | ||||
|     case META_CURSOR_DEFAULT: | ||||
|       return "left_ptr"; | ||||
|     case META_CURSOR_NORTH_RESIZE: | ||||
|       return "top_side"; | ||||
|     case META_CURSOR_SOUTH_RESIZE: | ||||
|       return "bottom_side"; | ||||
|     case META_CURSOR_WEST_RESIZE: | ||||
|       return "left_side"; | ||||
|     case META_CURSOR_EAST_RESIZE: | ||||
|       return "right_side"; | ||||
|     case META_CURSOR_SE_RESIZE: | ||||
|       return "bottom_right_corner"; | ||||
|     case META_CURSOR_SW_RESIZE: | ||||
|       return "bottom_left_corner"; | ||||
|     case META_CURSOR_NE_RESIZE: | ||||
|       return "top_right_corner"; | ||||
|     case META_CURSOR_NW_RESIZE: | ||||
|       return "top_left_corner"; | ||||
|     case META_CURSOR_MOVE_OR_RESIZE_WINDOW: | ||||
|       return "fleur"; | ||||
|     case META_CURSOR_BUSY: | ||||
|       return "watch"; | ||||
|     case META_CURSOR_DND_IN_DRAG: | ||||
|       return "dnd-none"; | ||||
|     case META_CURSOR_DND_MOVE: | ||||
|       return "dnd-move"; | ||||
|     case META_CURSOR_DND_COPY: | ||||
|       return "dnd-copy"; | ||||
|     case META_CURSOR_DND_UNSUPPORTED_TARGET: | ||||
|       return "dnd-none"; | ||||
|     case META_CURSOR_POINTING_HAND: | ||||
|       return "hand2"; | ||||
|     case META_CURSOR_CROSSHAIR: | ||||
|       return "crosshair"; | ||||
|     case META_CURSOR_IBEAM: | ||||
|       return "xterm"; | ||||
|     default: | ||||
|       break; | ||||
|     } | ||||
|  | ||||
|   g_assert_not_reached (); | ||||
| } | ||||
|  | ||||
| Cursor | ||||
| meta_cursor_create_x_cursor (Display    *xdisplay, | ||||
|                              MetaCursor  cursor) | ||||
| { | ||||
|   return XcursorLibraryLoadCursor (xdisplay, translate_meta_cursor (cursor)); | ||||
| } | ||||
|  | ||||
| static XcursorImages * | ||||
| load_cursor_on_client (MetaCursor cursor, int scale) | ||||
| { | ||||
|   return XcursorLibraryLoadImages (translate_meta_cursor (cursor), | ||||
|                                    meta_prefs_get_cursor_theme (), | ||||
|                                    meta_prefs_get_cursor_size () * scale); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_cursor_sprite_load_from_xcursor_image (MetaCursorSprite *self, | ||||
|                                             XcursorImage     *xc_image) | ||||
| { | ||||
|   MetaBackend *meta_backend = meta_get_backend (); | ||||
|   MetaCursorRenderer *renderer = meta_backend_get_cursor_renderer (meta_backend); | ||||
|   uint width, height, rowstride; | ||||
|   CoglPixelFormat cogl_format; | ||||
|   ClutterBackend *clutter_backend; | ||||
|   CoglContext *cogl_context; | ||||
|   CoglTexture *texture; | ||||
|  | ||||
|   g_assert (self->texture == NULL); | ||||
|  | ||||
|   width           = xc_image->width; | ||||
|   height          = xc_image->height; | ||||
|   rowstride       = width * 4; | ||||
|  | ||||
| #if G_BYTE_ORDER == G_LITTLE_ENDIAN | ||||
|   cogl_format = COGL_PIXEL_FORMAT_BGRA_8888; | ||||
| #else | ||||
|   cogl_format = COGL_PIXEL_FORMAT_ARGB_8888; | ||||
| #endif | ||||
|  | ||||
|   clutter_backend = clutter_get_default_backend (); | ||||
|   cogl_context = clutter_backend_get_cogl_context (clutter_backend); | ||||
|   texture = cogl_texture_2d_new_from_data (cogl_context, | ||||
|                                            width, height, | ||||
|                                            cogl_format, | ||||
|                                            rowstride, | ||||
|                                            (uint8_t *) xc_image->pixels, | ||||
|                                            NULL); | ||||
|   meta_cursor_sprite_set_texture (self, texture, | ||||
|                                   xc_image->xhot, xc_image->yhot); | ||||
|   cogl_object_unref (texture); | ||||
|  | ||||
|   meta_cursor_renderer_realize_cursor_from_xcursor (renderer, self, xc_image); | ||||
| } | ||||
|  | ||||
| static XcursorImage * | ||||
| meta_cursor_sprite_get_current_frame_image (MetaCursorSprite *self) | ||||
| { | ||||
|   return self->xcursor_images->images[self->current_frame]; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_cursor_sprite_tick_frame (MetaCursorSprite *self) | ||||
| { | ||||
|   XcursorImage *image; | ||||
|  | ||||
|   if (!meta_cursor_sprite_is_animated (self)) | ||||
|     return; | ||||
|  | ||||
|   self->current_frame++; | ||||
|  | ||||
|   if (self->current_frame >= self->xcursor_images->nimage) | ||||
|     self->current_frame = 0; | ||||
|  | ||||
|   image = meta_cursor_sprite_get_current_frame_image (self); | ||||
|  | ||||
|   g_clear_pointer (&self->texture, cogl_object_unref); | ||||
|   meta_cursor_sprite_load_from_xcursor_image (self, image); | ||||
| } | ||||
|  | ||||
| guint | ||||
| meta_cursor_sprite_get_current_frame_time (MetaCursorSprite *self) | ||||
| { | ||||
|   if (!meta_cursor_sprite_is_animated (self)) | ||||
|     return 0; | ||||
|  | ||||
|   return self->xcursor_images->images[self->current_frame]->delay; | ||||
| } | ||||
|  | ||||
| gboolean | ||||
| meta_cursor_sprite_is_animated (MetaCursorSprite *self) | ||||
| { | ||||
|   return (self->xcursor_images && | ||||
|           self->xcursor_images->nimage > 1); | ||||
| } | ||||
|  | ||||
| MetaCursorSprite * | ||||
| meta_cursor_sprite_new (void) | ||||
| { | ||||
|   return g_object_new (META_TYPE_CURSOR_SPRITE, NULL); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_cursor_sprite_load_from_theme (MetaCursorSprite *self) | ||||
| { | ||||
|   XcursorImage *image; | ||||
|  | ||||
|   g_assert (self->cursor != META_CURSOR_NONE); | ||||
|  | ||||
|   /* We might be reloading with a different scale. If so clear the old data. */ | ||||
|   if (self->xcursor_images) | ||||
|     { | ||||
|       g_clear_pointer (&self->texture, cogl_object_unref); | ||||
|       XcursorImagesDestroy (self->xcursor_images); | ||||
|     } | ||||
|  | ||||
|   self->current_frame = 0; | ||||
|   self->xcursor_images = load_cursor_on_client (self->cursor, | ||||
|                                                 self->theme_scale); | ||||
|   if (!self->xcursor_images) | ||||
|     meta_fatal ("Could not find cursor. Perhaps set XCURSOR_PATH?"); | ||||
|  | ||||
|   image = meta_cursor_sprite_get_current_frame_image (self); | ||||
|   meta_cursor_sprite_load_from_xcursor_image (self, image); | ||||
|  | ||||
|   self->theme_dirty = FALSE; | ||||
| } | ||||
|  | ||||
| MetaCursorSprite * | ||||
| meta_cursor_sprite_from_theme (MetaCursor cursor) | ||||
| { | ||||
|   MetaCursorSprite *self; | ||||
|  | ||||
|   self = meta_cursor_sprite_new (); | ||||
|  | ||||
|   self->cursor = cursor; | ||||
|   self->theme_dirty = TRUE; | ||||
|  | ||||
|   return self; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_cursor_sprite_set_texture (MetaCursorSprite *self, | ||||
|                                 CoglTexture      *texture, | ||||
|                                 int               hot_x, | ||||
|                                 int               hot_y) | ||||
| { | ||||
|   g_clear_pointer (&self->texture, cogl_object_unref); | ||||
|   if (texture) | ||||
|     self->texture = cogl_object_ref (texture); | ||||
|   self->hot_x = hot_x; | ||||
|   self->hot_y = hot_y; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_cursor_sprite_set_texture_scale (MetaCursorSprite *self, | ||||
|                                       float             scale) | ||||
| { | ||||
|   self->texture_scale = scale; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_cursor_sprite_set_theme_scale (MetaCursorSprite *self, | ||||
|                                     int               theme_scale) | ||||
| { | ||||
|   if (self->theme_scale != theme_scale) | ||||
|     self->theme_dirty = TRUE; | ||||
|   self->theme_scale = theme_scale; | ||||
| } | ||||
|  | ||||
| CoglTexture * | ||||
| meta_cursor_sprite_get_cogl_texture (MetaCursorSprite *self) | ||||
| { | ||||
|   return COGL_TEXTURE (self->texture); | ||||
| } | ||||
|  | ||||
| MetaCursor | ||||
| meta_cursor_sprite_get_meta_cursor (MetaCursorSprite *self) | ||||
| { | ||||
|   return self->cursor; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_cursor_sprite_get_hotspot (MetaCursorSprite *self, | ||||
|                                 int              *hot_x, | ||||
|                                 int              *hot_y) | ||||
| { | ||||
|   *hot_x = self->hot_x; | ||||
|   *hot_y = self->hot_y; | ||||
| } | ||||
|  | ||||
| float | ||||
| meta_cursor_sprite_get_texture_scale (MetaCursorSprite *self) | ||||
| { | ||||
|   return self->texture_scale; | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_cursor_sprite_prepare_at (MetaCursorSprite *self, | ||||
|                                int               x, | ||||
|                                int               y) | ||||
| { | ||||
|   g_signal_emit (self, signals[PREPARE_AT], 0, x, y); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_cursor_sprite_realize_texture (MetaCursorSprite *self) | ||||
| { | ||||
|   if (self->theme_dirty) | ||||
|     meta_cursor_sprite_load_from_theme (self); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_cursor_sprite_init (MetaCursorSprite *self) | ||||
| { | ||||
|   self->texture_scale = 1.0f; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_cursor_sprite_finalize (GObject *object) | ||||
| { | ||||
|   MetaCursorSprite *self = META_CURSOR_SPRITE (object); | ||||
|  | ||||
|   if (self->xcursor_images) | ||||
|     XcursorImagesDestroy (self->xcursor_images); | ||||
|  | ||||
|   g_clear_pointer (&self->texture, cogl_object_unref); | ||||
|  | ||||
|   G_OBJECT_CLASS (meta_cursor_sprite_parent_class)->finalize (object); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_cursor_sprite_class_init (MetaCursorSpriteClass *klass) | ||||
| { | ||||
|   GObjectClass *object_class = G_OBJECT_CLASS (klass); | ||||
|  | ||||
|   object_class->finalize = meta_cursor_sprite_finalize; | ||||
|  | ||||
|   signals[PREPARE_AT] = g_signal_new ("prepare-at", | ||||
|                                       G_TYPE_FROM_CLASS (object_class), | ||||
|                                       G_SIGNAL_RUN_LAST, | ||||
|                                       0, | ||||
|                                       NULL, NULL, NULL, | ||||
|                                       G_TYPE_NONE, 2, | ||||
|                                       G_TYPE_INT, | ||||
|                                       G_TYPE_INT); | ||||
| } | ||||
| @@ -1,75 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright 2013 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, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * Author: Giovanni Campagna <gcampagn@redhat.com> | ||||
|  */ | ||||
|  | ||||
| #ifndef META_CURSOR_H | ||||
| #define META_CURSOR_H | ||||
|  | ||||
| #include <meta/common.h> | ||||
| #include <meta/boxes.h> | ||||
|  | ||||
| typedef struct _MetaCursorSprite MetaCursorSprite; | ||||
|  | ||||
| #define META_TYPE_CURSOR_SPRITE (meta_cursor_sprite_get_type ()) | ||||
| G_DECLARE_FINAL_TYPE (MetaCursorSprite, | ||||
|                       meta_cursor_sprite, | ||||
|                       META, CURSOR_SPRITE, | ||||
|                       GObject); | ||||
|  | ||||
| MetaCursorSprite * meta_cursor_sprite_new (void); | ||||
|  | ||||
| MetaCursorSprite * meta_cursor_sprite_from_theme  (MetaCursor cursor); | ||||
|  | ||||
|  | ||||
| void meta_cursor_sprite_set_theme_scale (MetaCursorSprite *self, | ||||
|                                          int               scale); | ||||
|  | ||||
| MetaCursor meta_cursor_sprite_get_meta_cursor (MetaCursorSprite *self); | ||||
|  | ||||
| Cursor meta_cursor_create_x_cursor (Display    *xdisplay, | ||||
|                                     MetaCursor  cursor); | ||||
|  | ||||
| void meta_cursor_sprite_prepare_at (MetaCursorSprite *self, | ||||
|                                     int               x, | ||||
|                                     int               y); | ||||
|  | ||||
| void meta_cursor_sprite_realize_texture (MetaCursorSprite *self); | ||||
|  | ||||
| void meta_cursor_sprite_set_texture (MetaCursorSprite *self, | ||||
|                                      CoglTexture      *texture, | ||||
|                                      int               hot_x, | ||||
|                                      int               hot_y); | ||||
|  | ||||
| void meta_cursor_sprite_set_texture_scale (MetaCursorSprite *self, | ||||
|                                            float             scale); | ||||
|  | ||||
| CoglTexture *meta_cursor_sprite_get_cogl_texture (MetaCursorSprite *self); | ||||
|  | ||||
| void meta_cursor_sprite_get_hotspot (MetaCursorSprite *self, | ||||
|                                      int              *hot_x, | ||||
|                                      int              *hot_y); | ||||
|  | ||||
| float meta_cursor_sprite_get_texture_scale (MetaCursorSprite *self); | ||||
|  | ||||
| gboolean meta_cursor_sprite_is_animated            (MetaCursorSprite *self); | ||||
| void     meta_cursor_sprite_tick_frame             (MetaCursorSprite *self); | ||||
| guint    meta_cursor_sprite_get_current_frame_time (MetaCursorSprite *self); | ||||
|  | ||||
| #endif /* META_CURSOR_H */ | ||||
| @@ -1,289 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright 2013 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, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * Adapted from gnome-session/gnome-session/gs-idle-monitor.c and | ||||
|  *         from gnome-desktop/libgnome-desktop/gnome-idle-monitor.c | ||||
|  */ | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| #include "meta-idle-monitor-dbus.h" | ||||
| #include <meta/meta-idle-monitor.h> | ||||
| #include "meta-dbus-idle-monitor.h" | ||||
|  | ||||
| #include <clutter/clutter.h> | ||||
| #include <meta/util.h> | ||||
| #include <meta/main.h> /* for meta_get_replace_current_wm () */ | ||||
|  | ||||
| static gboolean | ||||
| handle_get_idletime (MetaDBusIdleMonitor   *skeleton, | ||||
|                      GDBusMethodInvocation *invocation, | ||||
|                      MetaIdleMonitor       *monitor) | ||||
| { | ||||
|   guint64 idletime; | ||||
|  | ||||
|   idletime = meta_idle_monitor_get_idletime (monitor); | ||||
|   meta_dbus_idle_monitor_complete_get_idletime (skeleton, invocation, idletime); | ||||
|  | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| typedef struct { | ||||
|   MetaDBusIdleMonitor *dbus_monitor; | ||||
|   MetaIdleMonitor *monitor; | ||||
|   char *dbus_name; | ||||
|   guint watch_id; | ||||
|   guint name_watcher_id; | ||||
| } DBusWatch; | ||||
|  | ||||
| static void | ||||
| destroy_dbus_watch (gpointer data) | ||||
| { | ||||
|   DBusWatch *watch = data; | ||||
|  | ||||
|   g_object_unref (watch->dbus_monitor); | ||||
|   g_object_unref (watch->monitor); | ||||
|   g_free (watch->dbus_name); | ||||
|   g_bus_unwatch_name (watch->name_watcher_id); | ||||
|  | ||||
|   g_slice_free (DBusWatch, watch); | ||||
| } | ||||
|  | ||||
| static void | ||||
| dbus_idle_callback (MetaIdleMonitor *monitor, | ||||
|                     guint            watch_id, | ||||
|                     gpointer         user_data) | ||||
| { | ||||
|   DBusWatch *watch = user_data; | ||||
|   GDBusInterfaceSkeleton *skeleton = G_DBUS_INTERFACE_SKELETON (watch->dbus_monitor); | ||||
|  | ||||
|   g_dbus_connection_emit_signal (g_dbus_interface_skeleton_get_connection (skeleton), | ||||
|                                  watch->dbus_name, | ||||
|                                  g_dbus_interface_skeleton_get_object_path (skeleton), | ||||
|                                  "org.gnome.Mutter.IdleMonitor", | ||||
|                                  "WatchFired", | ||||
|                                  g_variant_new ("(u)", watch_id), | ||||
|                                  NULL); | ||||
| } | ||||
|  | ||||
| static void | ||||
| name_vanished_callback (GDBusConnection *connection, | ||||
|                         const char      *name, | ||||
|                         gpointer         user_data) | ||||
| { | ||||
|   DBusWatch *watch = user_data; | ||||
|  | ||||
|   meta_idle_monitor_remove_watch (watch->monitor, watch->watch_id); | ||||
| } | ||||
|  | ||||
| static DBusWatch * | ||||
| make_dbus_watch (MetaDBusIdleMonitor   *skeleton, | ||||
|                  GDBusMethodInvocation *invocation, | ||||
|                  MetaIdleMonitor       *monitor) | ||||
| { | ||||
|   DBusWatch *watch; | ||||
|  | ||||
|   watch = g_slice_new (DBusWatch); | ||||
|   watch->dbus_monitor = g_object_ref (skeleton); | ||||
|   watch->monitor = g_object_ref (monitor); | ||||
|   watch->dbus_name = g_strdup (g_dbus_method_invocation_get_sender (invocation)); | ||||
|   watch->name_watcher_id = g_bus_watch_name_on_connection (g_dbus_method_invocation_get_connection (invocation), | ||||
|                                                            watch->dbus_name, | ||||
|                                                            G_BUS_NAME_WATCHER_FLAGS_NONE, | ||||
|                                                            NULL, /* appeared */ | ||||
|                                                            name_vanished_callback, | ||||
|                                                            watch, NULL); | ||||
|  | ||||
|   return watch; | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| handle_add_idle_watch (MetaDBusIdleMonitor   *skeleton, | ||||
|                        GDBusMethodInvocation *invocation, | ||||
|                        guint64                interval, | ||||
|                        MetaIdleMonitor       *monitor) | ||||
| { | ||||
|   DBusWatch *watch; | ||||
|  | ||||
|   watch = make_dbus_watch (skeleton, invocation, monitor); | ||||
|   watch->watch_id = meta_idle_monitor_add_idle_watch (monitor, interval, | ||||
|                                                       dbus_idle_callback, watch, destroy_dbus_watch); | ||||
|  | ||||
|   meta_dbus_idle_monitor_complete_add_idle_watch (skeleton, invocation, watch->watch_id); | ||||
|  | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| handle_add_user_active_watch (MetaDBusIdleMonitor   *skeleton, | ||||
|                               GDBusMethodInvocation *invocation, | ||||
|                               MetaIdleMonitor       *monitor) | ||||
| { | ||||
|   DBusWatch *watch; | ||||
|  | ||||
|   watch = make_dbus_watch (skeleton, invocation, monitor); | ||||
|   watch->watch_id = meta_idle_monitor_add_user_active_watch (monitor, | ||||
|                                                              dbus_idle_callback, watch, | ||||
|                                                              destroy_dbus_watch); | ||||
|  | ||||
|   meta_dbus_idle_monitor_complete_add_user_active_watch (skeleton, invocation, watch->watch_id); | ||||
|  | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| handle_remove_watch (MetaDBusIdleMonitor   *skeleton, | ||||
|                      GDBusMethodInvocation *invocation, | ||||
|                      guint                  id, | ||||
|                      MetaIdleMonitor       *monitor) | ||||
| { | ||||
|   meta_idle_monitor_remove_watch (monitor, id); | ||||
|   meta_dbus_idle_monitor_complete_remove_watch (skeleton, invocation); | ||||
|  | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| create_monitor_skeleton (GDBusObjectManagerServer *manager, | ||||
|                          MetaIdleMonitor          *monitor, | ||||
|                          const char               *path) | ||||
| { | ||||
|   MetaDBusIdleMonitor *skeleton; | ||||
|   MetaDBusObjectSkeleton *object; | ||||
|  | ||||
|   skeleton = meta_dbus_idle_monitor_skeleton_new (); | ||||
|   g_signal_connect_object (skeleton, "handle-add-idle-watch", | ||||
|                            G_CALLBACK (handle_add_idle_watch), monitor, 0); | ||||
|   g_signal_connect_object (skeleton, "handle-add-user-active-watch", | ||||
|                            G_CALLBACK (handle_add_user_active_watch), monitor, 0); | ||||
|   g_signal_connect_object (skeleton, "handle-remove-watch", | ||||
|                            G_CALLBACK (handle_remove_watch), monitor, 0); | ||||
|   g_signal_connect_object (skeleton, "handle-get-idletime", | ||||
|                            G_CALLBACK (handle_get_idletime), monitor, 0); | ||||
|  | ||||
|   object = meta_dbus_object_skeleton_new (path); | ||||
|   meta_dbus_object_skeleton_set_idle_monitor (object, skeleton); | ||||
|  | ||||
|   g_dbus_object_manager_server_export (manager, G_DBUS_OBJECT_SKELETON (object)); | ||||
|  | ||||
|   g_object_unref (skeleton); | ||||
|   g_object_unref (object); | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_device_added (ClutterDeviceManager     *device_manager, | ||||
|                  ClutterInputDevice       *device, | ||||
|                  GDBusObjectManagerServer *manager) | ||||
| { | ||||
|  | ||||
|   MetaIdleMonitor *monitor; | ||||
|   int device_id; | ||||
|   char *path; | ||||
|  | ||||
|   device_id = clutter_input_device_get_device_id (device); | ||||
|   monitor = meta_idle_monitor_get_for_device (device_id); | ||||
|   path = g_strdup_printf ("/org/gnome/Mutter/IdleMonitor/Device%d", device_id); | ||||
|  | ||||
|   create_monitor_skeleton (manager, monitor, path); | ||||
|   g_free (path); | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_device_removed (ClutterDeviceManager     *device_manager, | ||||
|                    ClutterInputDevice       *device, | ||||
|                    GDBusObjectManagerServer *manager) | ||||
| { | ||||
|   int device_id; | ||||
|   char *path; | ||||
|  | ||||
|   device_id = clutter_input_device_get_device_id (device); | ||||
|   path = g_strdup_printf ("/org/gnome/Mutter/IdleMonitor/Device%d", device_id); | ||||
|   g_dbus_object_manager_server_unexport (manager, path); | ||||
|   g_free (path); | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_bus_acquired (GDBusConnection *connection, | ||||
|                  const char      *name, | ||||
|                  gpointer         user_data) | ||||
| { | ||||
|   GDBusObjectManagerServer *manager; | ||||
|   ClutterDeviceManager *device_manager; | ||||
|   MetaIdleMonitor *monitor; | ||||
|   GSList *devices, *iter; | ||||
|   char *path; | ||||
|  | ||||
|   manager = g_dbus_object_manager_server_new ("/org/gnome/Mutter/IdleMonitor"); | ||||
|  | ||||
|   /* We never clear the core monitor, as that's supposed to cumulate idle times from | ||||
|      all devices */ | ||||
|   monitor = meta_idle_monitor_get_core (); | ||||
|   path = g_strdup ("/org/gnome/Mutter/IdleMonitor/Core"); | ||||
|   create_monitor_skeleton (manager, monitor, path); | ||||
|   g_free (path); | ||||
|  | ||||
|   device_manager = clutter_device_manager_get_default (); | ||||
|   devices = clutter_device_manager_list_devices (device_manager); | ||||
|  | ||||
|   for (iter = devices; iter; iter = iter->next) | ||||
|     on_device_added (device_manager, iter->data, manager); | ||||
|  | ||||
|   g_slist_free (devices); | ||||
|  | ||||
|   g_signal_connect_object (device_manager, "device-added", | ||||
|                            G_CALLBACK (on_device_added), manager, 0); | ||||
|   g_signal_connect_object (device_manager, "device-removed", | ||||
|                            G_CALLBACK (on_device_removed), manager, 0); | ||||
|  | ||||
|   g_dbus_object_manager_server_set_connection (manager, connection); | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_name_acquired (GDBusConnection *connection, | ||||
|                   const char      *name, | ||||
|                   gpointer         user_data) | ||||
| { | ||||
|   meta_verbose ("Acquired name %s\n", name); | ||||
| } | ||||
|  | ||||
| static void | ||||
| on_name_lost (GDBusConnection *connection, | ||||
|               const char      *name, | ||||
|               gpointer         user_data) | ||||
| { | ||||
|   meta_verbose ("Lost or failed to acquire name %s\n", name); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_idle_monitor_init_dbus (void) | ||||
| { | ||||
|   static int dbus_name_id; | ||||
|  | ||||
|   if (dbus_name_id > 0) | ||||
|     return; | ||||
|  | ||||
|   dbus_name_id = g_bus_own_name (G_BUS_TYPE_SESSION, | ||||
|                                  "org.gnome.Mutter.IdleMonitor", | ||||
|                                  G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT | | ||||
|                                  (meta_get_replace_current_wm () ? | ||||
|                                   G_BUS_NAME_OWNER_FLAGS_REPLACE : 0), | ||||
|                                  on_bus_acquired, | ||||
|                                  on_name_acquired, | ||||
|                                  on_name_lost, | ||||
|                                  NULL, NULL); | ||||
| } | ||||
| @@ -1,65 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright 2013 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, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * Adapted from gnome-session/gnome-session/gs-idle-monitor.c and | ||||
|  *         from gnome-desktop/libgnome-desktop/gnome-idle-monitor.c | ||||
|  */ | ||||
|  | ||||
| #ifndef META_IDLE_MONITOR_PRIVATE_H | ||||
| #define META_IDLE_MONITOR_PRIVATE_H | ||||
|  | ||||
| #include <meta/meta-idle-monitor.h> | ||||
| #include "display-private.h" | ||||
|  | ||||
| #include <X11/Xlib.h> | ||||
| #include <X11/extensions/sync.h> | ||||
|  | ||||
| typedef struct | ||||
| { | ||||
|   MetaIdleMonitor          *monitor; | ||||
|   guint	                    id; | ||||
|   MetaIdleMonitorWatchFunc  callback; | ||||
|   gpointer		    user_data; | ||||
|   GDestroyNotify            notify; | ||||
|   guint64                   timeout_msec; | ||||
|   int                       idle_source_id; | ||||
| } MetaIdleMonitorWatch; | ||||
|  | ||||
| struct _MetaIdleMonitor | ||||
| { | ||||
|   GObject parent_instance; | ||||
|  | ||||
|   GHashTable *watches; | ||||
|   int device_id; | ||||
| }; | ||||
|  | ||||
| struct _MetaIdleMonitorClass | ||||
| { | ||||
|   GObjectClass parent_class; | ||||
|  | ||||
|   gint64 (*get_idletime) (MetaIdleMonitor *monitor); | ||||
|   MetaIdleMonitorWatch * (*make_watch) (MetaIdleMonitor           *monitor, | ||||
|                                         guint64                    timeout_msec, | ||||
|                                         MetaIdleMonitorWatchFunc   callback, | ||||
|                                         gpointer                   user_data, | ||||
|                                         GDestroyNotify             notify); | ||||
| }; | ||||
|  | ||||
| void _meta_idle_monitor_watch_fire (MetaIdleMonitorWatch *watch); | ||||
|  | ||||
| #endif /* META_IDLE_MONITOR_PRIVATE_H */ | ||||
| @@ -1,318 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright 2013 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, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * Adapted from gnome-session/gnome-session/gs-idle-monitor.c and | ||||
|  *         from gnome-desktop/libgnome-desktop/gnome-idle-monitor.c | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * SECTION:idle-monitor | ||||
|  * @title: MetaIdleMonitor | ||||
|  * @short_description: Mutter idle counter (similar to X's IDLETIME) | ||||
|  */ | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| #include <string.h> | ||||
| #include <clutter/clutter.h> | ||||
| #include <X11/Xlib.h> | ||||
| #include <X11/extensions/sync.h> | ||||
|  | ||||
| #include <meta/util.h> | ||||
| #include <meta/main.h> | ||||
| #include <meta/meta-idle-monitor.h> | ||||
| #include "meta-idle-monitor-private.h" | ||||
| #include "meta-idle-monitor-dbus.h" | ||||
| #include "meta-backend-private.h" | ||||
|  | ||||
| G_STATIC_ASSERT(sizeof(unsigned long) == sizeof(gpointer)); | ||||
|  | ||||
| enum | ||||
| { | ||||
|   PROP_0, | ||||
|   PROP_DEVICE_ID, | ||||
|   PROP_LAST, | ||||
| }; | ||||
|  | ||||
| static GParamSpec *obj_props[PROP_LAST]; | ||||
|  | ||||
| G_DEFINE_TYPE (MetaIdleMonitor, meta_idle_monitor, G_TYPE_OBJECT) | ||||
|  | ||||
| void | ||||
| _meta_idle_monitor_watch_fire (MetaIdleMonitorWatch *watch) | ||||
| { | ||||
|   MetaIdleMonitor *monitor; | ||||
|   guint id; | ||||
|   gboolean is_user_active_watch; | ||||
|  | ||||
|   monitor = watch->monitor; | ||||
|   g_object_ref (monitor); | ||||
|  | ||||
|   if (watch->idle_source_id) | ||||
|     { | ||||
|       g_source_remove (watch->idle_source_id); | ||||
|       watch->idle_source_id = 0; | ||||
|     } | ||||
|  | ||||
|   id = watch->id; | ||||
|   is_user_active_watch = (watch->timeout_msec == 0); | ||||
|  | ||||
|   if (watch->callback) | ||||
|     watch->callback (monitor, id, watch->user_data); | ||||
|  | ||||
|   if (is_user_active_watch) | ||||
|     meta_idle_monitor_remove_watch (monitor, id); | ||||
|  | ||||
|   g_object_unref (monitor); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_idle_monitor_dispose (GObject *object) | ||||
| { | ||||
|   MetaIdleMonitor *monitor = META_IDLE_MONITOR (object); | ||||
|  | ||||
|   g_clear_pointer (&monitor->watches, g_hash_table_destroy); | ||||
|  | ||||
|   G_OBJECT_CLASS (meta_idle_monitor_parent_class)->dispose (object); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_idle_monitor_get_property (GObject    *object, | ||||
|                                 guint       prop_id, | ||||
|                                 GValue     *value, | ||||
|                                 GParamSpec *pspec) | ||||
| { | ||||
|   MetaIdleMonitor *monitor = META_IDLE_MONITOR (object); | ||||
|  | ||||
|   switch (prop_id) | ||||
|     { | ||||
|     case PROP_DEVICE_ID: | ||||
|       g_value_set_int (value, monitor->device_id); | ||||
|       break; | ||||
|     default: | ||||
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||
|       break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_idle_monitor_set_property (GObject      *object, | ||||
|                                 guint         prop_id, | ||||
|                                 const GValue *value, | ||||
|                                 GParamSpec   *pspec) | ||||
| { | ||||
|   MetaIdleMonitor *monitor = META_IDLE_MONITOR (object); | ||||
|   switch (prop_id) | ||||
|     { | ||||
|     case PROP_DEVICE_ID: | ||||
|       monitor->device_id = g_value_get_int (value); | ||||
|       break; | ||||
|     default: | ||||
|       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); | ||||
|       break; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_idle_monitor_class_init (MetaIdleMonitorClass *klass) | ||||
| { | ||||
|   GObjectClass *object_class = G_OBJECT_CLASS (klass); | ||||
|  | ||||
|   object_class->dispose = meta_idle_monitor_dispose; | ||||
|   object_class->get_property = meta_idle_monitor_get_property; | ||||
|   object_class->set_property = meta_idle_monitor_set_property; | ||||
|  | ||||
|   /** | ||||
|    * MetaIdleMonitor:device_id: | ||||
|    * | ||||
|    * The device to listen to idletime on. | ||||
|    */ | ||||
|   obj_props[PROP_DEVICE_ID] = | ||||
|     g_param_spec_int ("device-id", | ||||
|                       "Device ID", | ||||
|                       "The device to listen to idletime on", | ||||
|                       0, 255, 0, | ||||
|                       G_PARAM_STATIC_STRINGS | G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY); | ||||
|   g_object_class_install_property (object_class, PROP_DEVICE_ID, obj_props[PROP_DEVICE_ID]); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_idle_monitor_init (MetaIdleMonitor *monitor) | ||||
| { | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_idle_monitor_get_core: | ||||
|  * | ||||
|  * Returns: (transfer none): the #MetaIdleMonitor that tracks the server-global | ||||
|  * idletime for all devices. To track device-specific idletime, | ||||
|  * use meta_idle_monitor_get_for_device(). | ||||
|  */ | ||||
| MetaIdleMonitor * | ||||
| meta_idle_monitor_get_core (void) | ||||
| { | ||||
|   MetaBackend *backend = meta_get_backend (); | ||||
|   return meta_backend_get_idle_monitor (backend, 0); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_idle_monitor_get_for_device: | ||||
|  * @device_id: the device to get the idle time for. | ||||
|  * | ||||
|  * Returns: (transfer none): a new #MetaIdleMonitor that tracks the | ||||
|  * device-specific idletime for @device. To track server-global idletime | ||||
|  * for all devices, use meta_idle_monitor_get_core(). | ||||
|  */ | ||||
| MetaIdleMonitor * | ||||
| meta_idle_monitor_get_for_device (int device_id) | ||||
| { | ||||
|   MetaBackend *backend = meta_get_backend (); | ||||
|   return meta_backend_get_idle_monitor (backend, device_id); | ||||
| } | ||||
|  | ||||
| static MetaIdleMonitorWatch * | ||||
| make_watch (MetaIdleMonitor           *monitor, | ||||
|             guint64                    timeout_msec, | ||||
|             MetaIdleMonitorWatchFunc   callback, | ||||
|             gpointer                   user_data, | ||||
|             GDestroyNotify             notify) | ||||
| { | ||||
|   MetaIdleMonitorWatch *watch; | ||||
|  | ||||
|   watch = META_IDLE_MONITOR_GET_CLASS (monitor)->make_watch (monitor, | ||||
|                                                              timeout_msec, | ||||
|                                                              callback, | ||||
|                                                              user_data, | ||||
|                                                              notify); | ||||
|  | ||||
|   g_hash_table_insert (monitor->watches, | ||||
|                        GUINT_TO_POINTER (watch->id), | ||||
|                        watch); | ||||
|   return watch; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_idle_monitor_add_idle_watch: | ||||
|  * @monitor: A #MetaIdleMonitor | ||||
|  * @interval_msec: The idletime interval, in milliseconds | ||||
|  * @callback: (nullable): The callback to call when the user has | ||||
|  *     accumulated @interval_msec milliseconds of idle time. | ||||
|  * @user_data: (nullable): The user data to pass to the callback | ||||
|  * @notify: A #GDestroyNotify | ||||
|  * | ||||
|  * Returns: a watch id | ||||
|  * | ||||
|  * Adds a watch for a specific idle time. The callback will be called | ||||
|  * when the user has accumulated @interval_msec milliseconds of idle time. | ||||
|  * This function will return an ID that can either be passed to | ||||
|  * meta_idle_monitor_remove_watch(), or can be used to tell idle time | ||||
|  * watches apart if you have more than one. | ||||
|  * | ||||
|  * Also note that this function will only care about positive transitions | ||||
|  * (user's idle time exceeding a certain time). If you want to know about | ||||
|  * when the user has become active, use | ||||
|  * meta_idle_monitor_add_user_active_watch(). | ||||
|  */ | ||||
| guint | ||||
| meta_idle_monitor_add_idle_watch (MetaIdleMonitor	       *monitor, | ||||
|                                   guint64	                interval_msec, | ||||
|                                   MetaIdleMonitorWatchFunc      callback, | ||||
|                                   gpointer			user_data, | ||||
|                                   GDestroyNotify		notify) | ||||
| { | ||||
|   MetaIdleMonitorWatch *watch; | ||||
|  | ||||
|   g_return_val_if_fail (META_IS_IDLE_MONITOR (monitor), 0); | ||||
|   g_return_val_if_fail (interval_msec > 0, 0); | ||||
|  | ||||
|   watch = make_watch (monitor, | ||||
|                       interval_msec, | ||||
|                       callback, | ||||
|                       user_data, | ||||
|                       notify); | ||||
|  | ||||
|   return watch->id; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_idle_monitor_add_user_active_watch: | ||||
|  * @monitor: A #MetaIdleMonitor | ||||
|  * @callback: (nullable): The callback to call when the user is | ||||
|  *     active again. | ||||
|  * @user_data: (nullable): The user data to pass to the callback | ||||
|  * @notify: A #GDestroyNotify | ||||
|  * | ||||
|  * Returns: a watch id | ||||
|  * | ||||
|  * Add a one-time watch to know when the user is active again. | ||||
|  * Note that this watch is one-time and will de-activate after the | ||||
|  * function is called, for efficiency purposes. It's most convenient | ||||
|  * to call this when an idle watch, as added by | ||||
|  * meta_idle_monitor_add_idle_watch(), has triggered. | ||||
|  */ | ||||
| guint | ||||
| meta_idle_monitor_add_user_active_watch (MetaIdleMonitor          *monitor, | ||||
|                                          MetaIdleMonitorWatchFunc  callback, | ||||
|                                          gpointer		   user_data, | ||||
|                                          GDestroyNotify	           notify) | ||||
| { | ||||
|   MetaIdleMonitorWatch *watch; | ||||
|  | ||||
|   g_return_val_if_fail (META_IS_IDLE_MONITOR (monitor), 0); | ||||
|  | ||||
|   watch = make_watch (monitor, | ||||
|                       0, | ||||
|                       callback, | ||||
|                       user_data, | ||||
|                       notify); | ||||
|  | ||||
|   return watch->id; | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_idle_monitor_remove_watch: | ||||
|  * @monitor: A #MetaIdleMonitor | ||||
|  * @id: A watch ID | ||||
|  * | ||||
|  * Removes an idle time watcher, previously added by | ||||
|  * meta_idle_monitor_add_idle_watch() or | ||||
|  * meta_idle_monitor_add_user_active_watch(). | ||||
|  */ | ||||
| void | ||||
| meta_idle_monitor_remove_watch (MetaIdleMonitor *monitor, | ||||
|                                 guint	         id) | ||||
| { | ||||
|   g_return_if_fail (META_IS_IDLE_MONITOR (monitor)); | ||||
|  | ||||
|   g_object_ref (monitor); | ||||
|   g_hash_table_remove (monitor->watches, | ||||
|                        GUINT_TO_POINTER (id)); | ||||
|   g_object_unref (monitor); | ||||
| } | ||||
|  | ||||
| /** | ||||
|  * meta_idle_monitor_get_idletime: | ||||
|  * @monitor: A #MetaIdleMonitor | ||||
|  * | ||||
|  * Returns: The current idle time, in milliseconds, or -1 for not supported | ||||
|  */ | ||||
| gint64 | ||||
| meta_idle_monitor_get_idletime (MetaIdleMonitor *monitor) | ||||
| { | ||||
|   return META_IDLE_MONITOR_GET_CLASS (monitor)->get_idletime (monitor); | ||||
| } | ||||
| @@ -1,87 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright 2014 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, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * Author: Carlos Garnacho <carlosg@gnome.org> | ||||
|  */ | ||||
|  | ||||
| #ifndef META_INPUT_SETTINGS_PRIVATE_H | ||||
| #define META_INPUT_SETTINGS_PRIVATE_H | ||||
|  | ||||
| #include "display-private.h" | ||||
|  | ||||
| #include <clutter/clutter.h> | ||||
|  | ||||
| #define META_TYPE_INPUT_SETTINGS             (meta_input_settings_get_type ()) | ||||
| #define META_INPUT_SETTINGS(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_INPUT_SETTINGS, MetaInputSettings)) | ||||
| #define META_INPUT_SETTINGS_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass),  META_TYPE_INPUT_SETTINGS, MetaInputSettingsClass)) | ||||
| #define META_IS_INPUT_SETTINGS(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_INPUT_SETTINGS)) | ||||
| #define META_IS_INPUT_SETTINGS_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass),  META_TYPE_INPUT_SETTINGS)) | ||||
| #define META_INPUT_SETTINGS_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj),  META_TYPE_INPUT_SETTINGS, MetaInputSettingsClass)) | ||||
|  | ||||
| typedef struct _MetaInputSettings MetaInputSettings; | ||||
| typedef struct _MetaInputSettingsClass MetaInputSettingsClass; | ||||
|  | ||||
| struct _MetaInputSettings | ||||
| { | ||||
|   GObject parent_instance; | ||||
| }; | ||||
|  | ||||
| struct _MetaInputSettingsClass | ||||
| { | ||||
|   GObjectClass parent_class; | ||||
|  | ||||
|   void (* set_send_events)   (MetaInputSettings        *settings, | ||||
|                               ClutterInputDevice       *device, | ||||
|                               GDesktopDeviceSendEvents  mode); | ||||
|   void (* set_matrix)        (MetaInputSettings  *settings, | ||||
|                               ClutterInputDevice *device, | ||||
|                               gfloat              matrix[6]); | ||||
|   void (* set_speed)         (MetaInputSettings  *settings, | ||||
|                               ClutterInputDevice *device, | ||||
|                               gdouble             speed); | ||||
|   void (* set_left_handed)   (MetaInputSettings  *settings, | ||||
|                               ClutterInputDevice *device, | ||||
|                               gboolean            enabled); | ||||
|   void (* set_tap_enabled)   (MetaInputSettings  *settings, | ||||
|                               ClutterInputDevice *device, | ||||
|                               gboolean            enabled); | ||||
|   void (* set_invert_scroll) (MetaInputSettings  *settings, | ||||
|                               ClutterInputDevice *device, | ||||
|                               gboolean            inverted); | ||||
|   void (* set_scroll_method) (MetaInputSettings            *settings, | ||||
|                               ClutterInputDevice           *device, | ||||
|                               GDesktopTouchpadScrollMethod  mode); | ||||
|   void (* set_scroll_button) (MetaInputSettings  *settings, | ||||
|                               ClutterInputDevice *device, | ||||
|                               guint               button); | ||||
|  | ||||
|   void (* set_click_method)  (MetaInputSettings            *settings, | ||||
|                               ClutterInputDevice           *device, | ||||
|                               GDesktopTouchpadClickMethod   mode); | ||||
|  | ||||
|   void (* set_keyboard_repeat) (MetaInputSettings *settings, | ||||
|                                 gboolean           repeat, | ||||
|                                 guint              delay, | ||||
|                                 guint              interval); | ||||
| }; | ||||
|  | ||||
| GType meta_input_settings_get_type (void) G_GNUC_CONST; | ||||
|  | ||||
| MetaInputSettings * meta_input_settings_create (void); | ||||
|  | ||||
| #endif /* META_INPUT_SETTINGS_PRIVATE_H */ | ||||
| @@ -1,893 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright 2014 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, see <http://www.gnu.org/licenses/>. | ||||
|  * | ||||
|  * Author: Carlos Garnacho <carlosg@gnome.org> | ||||
|  */ | ||||
|  | ||||
| /** | ||||
|  * SECTION:input-settings | ||||
|  * @title: MetaInputSettings | ||||
|  * @short_description: Mutter input device configuration | ||||
|  */ | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| #include <string.h> | ||||
|  | ||||
| #include "meta-backend-private.h" | ||||
| #include "meta-input-settings-private.h" | ||||
| #include "x11/meta-input-settings-x11.h" | ||||
|  | ||||
| #ifdef HAVE_NATIVE_BACKEND | ||||
| #include "native/meta-backend-native.h" | ||||
| #include "native/meta-input-settings-native.h" | ||||
| #endif | ||||
|  | ||||
| #include <meta/util.h> | ||||
|  | ||||
| typedef struct _MetaInputSettingsPrivate MetaInputSettingsPrivate; | ||||
| typedef struct _DeviceMappingInfo DeviceMappingInfo; | ||||
|  | ||||
| struct _DeviceMappingInfo | ||||
| { | ||||
|   MetaInputSettings *input_settings; | ||||
|   ClutterInputDevice *device; | ||||
|   GSettings *settings; | ||||
| }; | ||||
|  | ||||
| struct _MetaInputSettingsPrivate | ||||
| { | ||||
|   ClutterDeviceManager *device_manager; | ||||
|   MetaMonitorManager *monitor_manager; | ||||
|   guint monitors_changed_id; | ||||
|  | ||||
|   GSettings *mouse_settings; | ||||
|   GSettings *touchpad_settings; | ||||
|   GSettings *trackball_settings; | ||||
|   GSettings *keyboard_settings; | ||||
|  | ||||
|   GHashTable *mappable_devices; | ||||
| }; | ||||
|  | ||||
| typedef void (*ConfigBoolFunc)   (MetaInputSettings  *input_settings, | ||||
|                                   ClutterInputDevice *device, | ||||
|                                   gboolean            setting); | ||||
| typedef void (*ConfigDoubleFunc) (MetaInputSettings  *input_settings, | ||||
|                                   ClutterInputDevice *device, | ||||
|                                   gdouble             value); | ||||
| typedef void (*ConfigUintFunc)   (MetaInputSettings  *input_settings, | ||||
|                                   ClutterInputDevice *device, | ||||
|                                   guint               value); | ||||
|  | ||||
| G_DEFINE_TYPE_WITH_PRIVATE (MetaInputSettings, meta_input_settings, G_TYPE_OBJECT) | ||||
|  | ||||
| static GSList * | ||||
| meta_input_settings_get_devices (MetaInputSettings      *settings, | ||||
|                                  ClutterInputDeviceType  type) | ||||
| { | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|   const GSList *devices; | ||||
|   GSList *list = NULL; | ||||
|  | ||||
|   priv = meta_input_settings_get_instance_private (settings); | ||||
|   devices = clutter_device_manager_peek_devices (priv->device_manager); | ||||
|  | ||||
|   while (devices) | ||||
|     { | ||||
|       ClutterInputDevice *device = devices->data; | ||||
|  | ||||
|       if (clutter_input_device_get_device_type (device) == type && | ||||
|           clutter_input_device_get_device_mode (device) != CLUTTER_INPUT_MODE_MASTER) | ||||
|         list = g_slist_prepend (list, device); | ||||
|  | ||||
|       devices = devices->next; | ||||
|     } | ||||
|  | ||||
|   return list; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_input_settings_dispose (GObject *object) | ||||
| { | ||||
|   MetaInputSettings *settings = META_INPUT_SETTINGS (object); | ||||
|   MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (settings); | ||||
|  | ||||
|   g_clear_object (&priv->mouse_settings); | ||||
|   g_clear_object (&priv->touchpad_settings); | ||||
|   g_clear_object (&priv->trackball_settings); | ||||
|   g_clear_object (&priv->keyboard_settings); | ||||
|   g_clear_pointer (&priv->mappable_devices, g_hash_table_unref); | ||||
|  | ||||
|   if (priv->monitors_changed_id && priv->monitor_manager) | ||||
|     { | ||||
|       g_signal_handler_disconnect (priv->monitor_manager, | ||||
|                                    priv->monitors_changed_id); | ||||
|       priv->monitors_changed_id = 0; | ||||
|     } | ||||
|  | ||||
|   g_clear_object (&priv->monitor_manager); | ||||
|  | ||||
|   G_OBJECT_CLASS (meta_input_settings_parent_class)->dispose (object); | ||||
| } | ||||
|  | ||||
| static void | ||||
| settings_device_set_bool_setting (MetaInputSettings  *input_settings, | ||||
|                                   ClutterInputDevice *device, | ||||
|                                   ConfigBoolFunc      func, | ||||
|                                   gboolean            enabled) | ||||
| { | ||||
|   func (input_settings, device, enabled); | ||||
| } | ||||
|  | ||||
| static void | ||||
| settings_set_bool_setting (MetaInputSettings      *input_settings, | ||||
|                            ClutterInputDeviceType  type, | ||||
|                            ConfigBoolFunc          func, | ||||
|                            gboolean                enabled) | ||||
| { | ||||
|   GSList *devices, *d; | ||||
|  | ||||
|   devices = meta_input_settings_get_devices (input_settings, type); | ||||
|  | ||||
|   for (d = devices; d; d = d->next) | ||||
|     settings_device_set_bool_setting (input_settings, d->data, func, enabled); | ||||
|  | ||||
|   g_slist_free (devices); | ||||
| } | ||||
|  | ||||
| static void | ||||
| settings_device_set_double_setting (MetaInputSettings  *input_settings, | ||||
|                                     ClutterInputDevice *device, | ||||
|                                     ConfigDoubleFunc    func, | ||||
|                                     gdouble             value) | ||||
| { | ||||
|   func (input_settings, device, value); | ||||
| } | ||||
|  | ||||
| static void | ||||
| settings_set_double_setting (MetaInputSettings      *input_settings, | ||||
|                              ClutterInputDeviceType  type, | ||||
|                              ConfigDoubleFunc        func, | ||||
|                              gdouble                 value) | ||||
| { | ||||
|   GSList *devices, *d; | ||||
|  | ||||
|   devices = meta_input_settings_get_devices (input_settings, type); | ||||
|  | ||||
|   for (d = devices; d; d = d->next) | ||||
|     settings_device_set_double_setting (input_settings, d->data, func, value); | ||||
|  | ||||
|   g_slist_free (devices); | ||||
| } | ||||
|  | ||||
| static void | ||||
| settings_device_set_uint_setting (MetaInputSettings  *input_settings, | ||||
|                                   ClutterInputDevice *device, | ||||
|                                   ConfigUintFunc      func, | ||||
|                                   guint               value) | ||||
| { | ||||
|   (func) (input_settings, device, value); | ||||
| } | ||||
|  | ||||
| static void | ||||
| settings_set_uint_setting (MetaInputSettings      *input_settings, | ||||
|                            ClutterInputDeviceType  type, | ||||
|                            ConfigUintFunc          func, | ||||
|                            guint                   value) | ||||
| { | ||||
|   GSList *devices, *d; | ||||
|  | ||||
|   devices = meta_input_settings_get_devices (input_settings, type); | ||||
|  | ||||
|   for (d = devices; d; d = d->next) | ||||
|     settings_device_set_uint_setting (input_settings, d->data, func, value); | ||||
|  | ||||
|   g_slist_free (devices); | ||||
| } | ||||
|  | ||||
| static void | ||||
| update_touchpad_left_handed (MetaInputSettings  *input_settings, | ||||
|                              ClutterInputDevice *device) | ||||
| { | ||||
|   MetaInputSettingsClass *input_settings_class; | ||||
|   GDesktopTouchpadHandedness handedness; | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|   gboolean enabled = FALSE; | ||||
|  | ||||
|   if (device && | ||||
|       clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE) | ||||
|     return; | ||||
|  | ||||
|   priv = meta_input_settings_get_instance_private (input_settings); | ||||
|   input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings); | ||||
|   handedness = g_settings_get_enum (priv->touchpad_settings, "left-handed"); | ||||
|  | ||||
|   switch (handedness) | ||||
|     { | ||||
|     case G_DESKTOP_TOUCHPAD_HANDEDNESS_RIGHT: | ||||
|       enabled = FALSE; | ||||
|       break; | ||||
|     case G_DESKTOP_TOUCHPAD_HANDEDNESS_LEFT: | ||||
|       enabled = TRUE; | ||||
|       break; | ||||
|     case G_DESKTOP_TOUCHPAD_HANDEDNESS_MOUSE: | ||||
|       enabled = g_settings_get_boolean (priv->mouse_settings, "left-handed"); | ||||
|       break; | ||||
|     default: | ||||
|       g_assert_not_reached (); | ||||
|     } | ||||
|  | ||||
|   if (device) | ||||
|     { | ||||
|       settings_device_set_bool_setting (input_settings, device, | ||||
|                                         input_settings_class->set_left_handed, | ||||
|                                         enabled); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, | ||||
|                                  input_settings_class->set_left_handed, | ||||
|                                  enabled); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| update_mouse_left_handed (MetaInputSettings  *input_settings, | ||||
|                           ClutterInputDevice *device) | ||||
| { | ||||
|   MetaInputSettingsClass *input_settings_class; | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|   gboolean enabled; | ||||
|  | ||||
|   if (device && | ||||
|       clutter_input_device_get_device_type (device) != CLUTTER_POINTER_DEVICE) | ||||
|     return; | ||||
|  | ||||
|   priv = meta_input_settings_get_instance_private (input_settings); | ||||
|   input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings); | ||||
|   enabled = g_settings_get_boolean (priv->mouse_settings, "left-handed"); | ||||
|  | ||||
|   if (device) | ||||
|     { | ||||
|       settings_device_set_bool_setting (input_settings, device, | ||||
|                                         input_settings_class->set_left_handed, | ||||
|                                         enabled); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       GDesktopTouchpadHandedness touchpad_handedness; | ||||
|  | ||||
|       settings_set_bool_setting (input_settings, CLUTTER_POINTER_DEVICE, | ||||
|                                  input_settings_class->set_left_handed, | ||||
|                                  enabled); | ||||
|  | ||||
|       touchpad_handedness = g_settings_get_enum (priv->touchpad_settings, | ||||
|                                                  "left-handed"); | ||||
|  | ||||
|       /* Also update touchpads if they're following mouse settings */ | ||||
|       if (touchpad_handedness == G_DESKTOP_TOUCHPAD_HANDEDNESS_MOUSE) | ||||
|         update_touchpad_left_handed (input_settings, NULL); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static GSettings * | ||||
| get_settings_for_device_type (MetaInputSettings      *input_settings, | ||||
|                               ClutterInputDeviceType  type) | ||||
| { | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|   priv = meta_input_settings_get_instance_private (input_settings); | ||||
|   switch (type) | ||||
|     { | ||||
|     case CLUTTER_POINTER_DEVICE: | ||||
|       return priv->mouse_settings; | ||||
|     case CLUTTER_TOUCHPAD_DEVICE: | ||||
|       return priv->touchpad_settings; | ||||
|     default: | ||||
|       return NULL; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| update_device_speed (MetaInputSettings      *input_settings, | ||||
|                      ClutterInputDevice     *device) | ||||
| { | ||||
|   GSettings *settings; | ||||
|   ConfigDoubleFunc func; | ||||
|   const gchar *key = "speed"; | ||||
|  | ||||
|   func = META_INPUT_SETTINGS_GET_CLASS (input_settings)->set_speed; | ||||
|  | ||||
|   if (device) | ||||
|     { | ||||
|       settings = get_settings_for_device_type (input_settings, | ||||
|                                                clutter_input_device_get_device_type (device)); | ||||
|       if (!settings) | ||||
|         return; | ||||
|  | ||||
|       settings_device_set_double_setting (input_settings, device, func, | ||||
|                                           g_settings_get_double (settings, key)); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       settings = get_settings_for_device_type (input_settings, CLUTTER_POINTER_DEVICE); | ||||
|       settings_set_double_setting (input_settings, CLUTTER_POINTER_DEVICE, func, | ||||
|                                    g_settings_get_double (settings, key)); | ||||
|       settings = get_settings_for_device_type (input_settings, CLUTTER_TOUCHPAD_DEVICE); | ||||
|       settings_set_double_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, func, | ||||
|                                    g_settings_get_double (settings, key)); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| update_device_natural_scroll (MetaInputSettings      *input_settings, | ||||
|                               ClutterInputDevice     *device) | ||||
| { | ||||
|   GSettings *settings; | ||||
|   ConfigBoolFunc func; | ||||
|   const gchar *key = "natural-scroll"; | ||||
|  | ||||
|   func = META_INPUT_SETTINGS_GET_CLASS (input_settings)->set_invert_scroll; | ||||
|  | ||||
|   if (device) | ||||
|     { | ||||
|       settings = get_settings_for_device_type (input_settings, | ||||
|                                                clutter_input_device_get_device_type (device)); | ||||
|       if (!settings) | ||||
|         return; | ||||
|  | ||||
|       settings_device_set_bool_setting (input_settings, device, func, | ||||
|                                         g_settings_get_boolean (settings, key)); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       settings = get_settings_for_device_type (input_settings, CLUTTER_POINTER_DEVICE); | ||||
|       settings_set_bool_setting (input_settings, CLUTTER_POINTER_DEVICE, func, | ||||
|                                  g_settings_get_boolean (settings, key)); | ||||
|       settings = get_settings_for_device_type (input_settings, CLUTTER_TOUCHPAD_DEVICE); | ||||
|       settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, func, | ||||
|                                  g_settings_get_boolean (settings, key)); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| update_touchpad_tap_enabled (MetaInputSettings  *input_settings, | ||||
|                              ClutterInputDevice *device) | ||||
| { | ||||
|   MetaInputSettingsClass *input_settings_class; | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|   gboolean enabled; | ||||
|  | ||||
|   if (device && | ||||
|       clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE) | ||||
|     return; | ||||
|  | ||||
|   priv = meta_input_settings_get_instance_private (input_settings); | ||||
|   input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings); | ||||
|   enabled = g_settings_get_boolean (priv->touchpad_settings, "tap-to-click"); | ||||
|  | ||||
|   if (device) | ||||
|     { | ||||
|       settings_device_set_bool_setting (input_settings, device, | ||||
|                                         input_settings_class->set_tap_enabled, | ||||
|                                         enabled); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       settings_set_bool_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, | ||||
|                                  input_settings_class->set_tap_enabled, | ||||
|                                  enabled); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| update_touchpad_scroll_method (MetaInputSettings *input_settings, | ||||
|                                ClutterInputDevice *device) | ||||
| { | ||||
|   MetaInputSettingsClass *input_settings_class; | ||||
|   GDesktopTouchpadScrollMethod method; | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|  | ||||
|   if (device && | ||||
|       clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE) | ||||
|     return; | ||||
|  | ||||
|   priv = meta_input_settings_get_instance_private (input_settings); | ||||
|   input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings); | ||||
|   method = g_settings_get_enum (priv->touchpad_settings, "scroll-method"); | ||||
|  | ||||
|   if (device) | ||||
|     { | ||||
|       settings_device_set_uint_setting (input_settings, device, | ||||
|                                         input_settings_class->set_scroll_method, | ||||
|                                         method); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       settings_set_uint_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, | ||||
|                                  (ConfigUintFunc) input_settings_class->set_scroll_method, | ||||
|                                  method); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| update_touchpad_click_method (MetaInputSettings *input_settings, | ||||
|                               ClutterInputDevice *device) | ||||
| { | ||||
|   MetaInputSettingsClass *input_settings_class; | ||||
|   GDesktopTouchpadScrollMethod method; | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|  | ||||
|   if (device && | ||||
|       clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE) | ||||
|     return; | ||||
|  | ||||
|   priv = meta_input_settings_get_instance_private (input_settings); | ||||
|   input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings); | ||||
|   method = g_settings_get_enum (priv->touchpad_settings, "click-method"); | ||||
|  | ||||
|   if (device) | ||||
|     { | ||||
|       settings_device_set_uint_setting (input_settings, device, | ||||
|                                         input_settings_class->set_click_method, | ||||
|                                         method); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       settings_set_uint_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, | ||||
|                                  (ConfigUintFunc) input_settings_class->set_click_method, | ||||
|                                  method); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| update_touchpad_send_events (MetaInputSettings  *input_settings, | ||||
|                              ClutterInputDevice *device) | ||||
| { | ||||
|   MetaInputSettingsClass *input_settings_class; | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|   GDesktopDeviceSendEvents mode; | ||||
|  | ||||
|   if (device && | ||||
|       clutter_input_device_get_device_type (device) != CLUTTER_TOUCHPAD_DEVICE) | ||||
|     return; | ||||
|  | ||||
|   priv = meta_input_settings_get_instance_private (input_settings); | ||||
|   input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings); | ||||
|   mode = g_settings_get_enum (priv->touchpad_settings, "send-events"); | ||||
|  | ||||
|   if (device) | ||||
|     { | ||||
|       settings_device_set_uint_setting (input_settings, device, | ||||
|                                         input_settings_class->set_send_events, | ||||
|                                         mode); | ||||
|     } | ||||
|   else | ||||
|     { | ||||
|       settings_set_uint_setting (input_settings, CLUTTER_TOUCHPAD_DEVICE, | ||||
|                                  input_settings_class->set_send_events, | ||||
|                                  mode); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| device_is_trackball (ClutterInputDevice *device) | ||||
| { | ||||
|   gboolean is_trackball; | ||||
|   char *name; | ||||
|  | ||||
|   if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER) | ||||
|     return FALSE; | ||||
|  | ||||
|   name = g_ascii_strdown (clutter_input_device_get_device_name (device), -1); | ||||
|   is_trackball = strstr (name, "trackball") != NULL; | ||||
|   g_free (name); | ||||
|  | ||||
|   return is_trackball; | ||||
| } | ||||
|  | ||||
| static void | ||||
| update_trackball_scroll_button (MetaInputSettings  *input_settings, | ||||
|                                 ClutterInputDevice *device) | ||||
| { | ||||
|   MetaInputSettingsClass *input_settings_class; | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|   guint button; | ||||
|  | ||||
|   if (device && !device_is_trackball (device)) | ||||
|     return; | ||||
|  | ||||
|   priv = meta_input_settings_get_instance_private (input_settings); | ||||
|   input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings); | ||||
|   /* This key is 'i' in the schema but it also specifies a minimum | ||||
|    * range of 0 so the cast here is safe. */ | ||||
|   button = (guint) g_settings_get_int (priv->trackball_settings, "scroll-wheel-emulation-button"); | ||||
|  | ||||
|   if (device) | ||||
|     { | ||||
|       input_settings_class->set_scroll_button (input_settings, device, button); | ||||
|     } | ||||
|   else if (!device) | ||||
|     { | ||||
|       const GSList *devices; | ||||
|  | ||||
|       devices = clutter_device_manager_peek_devices (priv->device_manager); | ||||
|  | ||||
|       while (devices) | ||||
|         { | ||||
|           device = devices->data; | ||||
|  | ||||
|           if (device_is_trackball (device)) | ||||
|             input_settings_class->set_scroll_button (input_settings, device, button); | ||||
|  | ||||
|           devices = devices->next; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| update_keyboard_repeat (MetaInputSettings *input_settings) | ||||
| { | ||||
|   MetaInputSettingsClass *input_settings_class; | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|   guint delay, interval; | ||||
|   gboolean repeat; | ||||
|  | ||||
|   priv = meta_input_settings_get_instance_private (input_settings); | ||||
|   repeat = g_settings_get_boolean (priv->keyboard_settings, "repeat"); | ||||
|   delay = g_settings_get_uint (priv->keyboard_settings, "delay"); | ||||
|   interval = g_settings_get_uint (priv->keyboard_settings, "repeat-interval"); | ||||
|  | ||||
|   input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings); | ||||
|   input_settings_class->set_keyboard_repeat (input_settings, | ||||
|                                              repeat, delay, interval); | ||||
| } | ||||
|  | ||||
| static MetaOutput * | ||||
| meta_input_settings_find_output (MetaInputSettings  *input_settings, | ||||
|                                  GSettings          *settings, | ||||
|                                  ClutterInputDevice *device) | ||||
| { | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|   guint n_values, n_outputs, i; | ||||
|   MetaOutput *outputs; | ||||
|   gchar **edid; | ||||
|  | ||||
|   priv = meta_input_settings_get_instance_private (input_settings); | ||||
|   edid = g_settings_get_strv (settings, "display"); | ||||
|   n_values = g_strv_length (edid); | ||||
|  | ||||
|   if (n_values != 3) | ||||
|     { | ||||
|       g_warning ("EDID configuration for device '%s' " | ||||
|                  "is incorrect, must have 3 values", | ||||
|                  clutter_input_device_get_device_name (device)); | ||||
|       return NULL; | ||||
|     } | ||||
|  | ||||
|   if (!*edid[0] && !*edid[1] && !*edid[2]) | ||||
|     return NULL; | ||||
|  | ||||
|   outputs = meta_monitor_manager_get_outputs (priv->monitor_manager, | ||||
|                                               &n_outputs); | ||||
|   for (i = 0; i < n_outputs; i++) | ||||
|     { | ||||
|       if (g_strcmp0 (outputs[i].vendor, edid[0]) == 0 && | ||||
|           g_strcmp0 (outputs[i].product, edid[1]) == 0 && | ||||
|           g_strcmp0 (outputs[i].serial, edid[2]) == 0) | ||||
|         return &outputs[i]; | ||||
|     } | ||||
|  | ||||
|   return NULL; | ||||
| } | ||||
|  | ||||
| static void | ||||
| update_device_display (MetaInputSettings  *input_settings, | ||||
|                        GSettings          *settings, | ||||
|                        ClutterInputDevice *device) | ||||
| { | ||||
|   MetaInputSettingsClass *input_settings_class; | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|   gfloat matrix[6] = { 1, 0, 0, 0, 1, 0 }; | ||||
|   MetaOutput *output; | ||||
|  | ||||
|   priv = meta_input_settings_get_instance_private (input_settings); | ||||
|   input_settings_class = META_INPUT_SETTINGS_GET_CLASS (input_settings); | ||||
|   output = meta_input_settings_find_output (input_settings, settings, device); | ||||
|  | ||||
|   if (output) | ||||
|     meta_monitor_manager_get_monitor_matrix (priv->monitor_manager, | ||||
|                                              output, matrix); | ||||
|  | ||||
|   input_settings_class->set_matrix (input_settings, device, matrix); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_input_settings_changed_cb (GSettings  *settings, | ||||
|                                 const char *key, | ||||
|                                 gpointer    user_data) | ||||
| { | ||||
|   MetaInputSettings *input_settings = META_INPUT_SETTINGS (user_data); | ||||
|   MetaInputSettingsPrivate *priv = meta_input_settings_get_instance_private (input_settings); | ||||
|  | ||||
|   if (settings == priv->mouse_settings) | ||||
|     { | ||||
|       if (strcmp (key, "left-handed") == 0) | ||||
|         update_mouse_left_handed (input_settings, NULL); | ||||
|       else if (strcmp (key, "speed") == 0) | ||||
|         update_device_speed (input_settings, NULL); | ||||
|       else if (strcmp (key, "natural-scroll") == 0) | ||||
|         update_device_natural_scroll (input_settings, NULL); | ||||
|     } | ||||
|   else if (settings == priv->touchpad_settings) | ||||
|     { | ||||
|       if (strcmp (key, "left-handed") == 0) | ||||
|         update_touchpad_left_handed (input_settings, NULL); | ||||
|       else if (strcmp (key, "speed") == 0) | ||||
|         update_device_speed (input_settings, NULL); | ||||
|       else if (strcmp (key, "natural-scroll") == 0) | ||||
|         update_device_natural_scroll (input_settings, NULL); | ||||
|       else if (strcmp (key, "tap-to-click") == 0) | ||||
|         update_touchpad_tap_enabled (input_settings, NULL); | ||||
|       else if (strcmp (key, "send-events") == 0) | ||||
|         update_touchpad_send_events (input_settings, NULL); | ||||
|       else if (strcmp (key, "scroll-method") == 0) | ||||
|         update_touchpad_scroll_method (input_settings, NULL); | ||||
|       else if (strcmp (key, "click-method") == 0) | ||||
|         update_touchpad_click_method (input_settings, NULL); | ||||
|     } | ||||
|   else if (settings == priv->trackball_settings) | ||||
|     { | ||||
|       if (strcmp (key, "scroll-wheel-emulation-button") == 0) | ||||
|         update_trackball_scroll_button (input_settings, NULL); | ||||
|     } | ||||
|   else if (settings == priv->keyboard_settings) | ||||
|     { | ||||
|       if (strcmp (key, "repeat") == 0 || | ||||
|           strcmp (key, "repeat-interval") == 0 || | ||||
|           strcmp (key, "delay") == 0) | ||||
|         update_keyboard_repeat (input_settings); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| mapped_device_changed_cb (GSettings         *settings, | ||||
|                           const gchar       *key, | ||||
|                           DeviceMappingInfo *info) | ||||
| { | ||||
|   if (strcmp (key, "display") == 0) | ||||
|     update_device_display (info->input_settings, settings, info->device); | ||||
| } | ||||
|  | ||||
| static GSettings * | ||||
| lookup_device_settings (ClutterInputDevice *device) | ||||
| { | ||||
|   const gchar *group, *schema, *vendor, *product; | ||||
|   ClutterInputDeviceType type; | ||||
|   GSettings *settings; | ||||
|   gchar *path; | ||||
|  | ||||
|   type = clutter_input_device_get_device_type (device); | ||||
|  | ||||
|   if (type == CLUTTER_TOUCHSCREEN_DEVICE) | ||||
|     { | ||||
|       group = "touchscreens"; | ||||
|       schema = "org.gnome.desktop.peripherals.touchscreen"; | ||||
|     } | ||||
|   else if (type == CLUTTER_TABLET_DEVICE || | ||||
|            type == CLUTTER_PEN_DEVICE || | ||||
|            type == CLUTTER_ERASER_DEVICE || | ||||
|            type == CLUTTER_CURSOR_DEVICE) | ||||
|     { | ||||
|       group = "tablets"; | ||||
|       schema = "org.gnome.desktop.peripherals.tablet"; | ||||
|     } | ||||
|   else | ||||
|     return NULL; | ||||
|  | ||||
|   vendor = clutter_input_device_get_vendor_id (device); | ||||
|   product = clutter_input_device_get_product_id (device); | ||||
|   path = g_strdup_printf ("/org/gnome/desktop/peripherals/%s/%s:%s/", | ||||
|                           group, vendor, product); | ||||
|  | ||||
|   settings = g_settings_new_with_path (schema, path); | ||||
|   g_free (path); | ||||
|  | ||||
|   return settings; | ||||
| } | ||||
|  | ||||
| static void | ||||
| monitors_changed_cb (MetaMonitorManager *monitor_manager, | ||||
|                      MetaInputSettings  *input_settings) | ||||
| { | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|   ClutterInputDevice *device; | ||||
|   GSettings *settings; | ||||
|   GHashTableIter iter; | ||||
|  | ||||
|   priv = meta_input_settings_get_instance_private (input_settings); | ||||
|   g_hash_table_iter_init (&iter, priv->mappable_devices); | ||||
|  | ||||
|   while (g_hash_table_iter_next (&iter, (gpointer *) &device, | ||||
|                                  (gpointer *) &settings)) | ||||
|     update_device_display (input_settings, settings, device); | ||||
| } | ||||
|  | ||||
| static gboolean | ||||
| check_add_mappable_device (MetaInputSettings  *input_settings, | ||||
|                            ClutterInputDevice *device) | ||||
| { | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|   DeviceMappingInfo *info; | ||||
|   GSettings *settings; | ||||
|  | ||||
|   settings = lookup_device_settings (device); | ||||
|  | ||||
|   if (!settings) | ||||
|     return FALSE; | ||||
|  | ||||
|   priv = meta_input_settings_get_instance_private (input_settings); | ||||
|  | ||||
|   info = g_new0 (DeviceMappingInfo, 1); | ||||
|   info->input_settings = input_settings; | ||||
|   info->device = device; | ||||
|   info->settings = settings; | ||||
|  | ||||
|   g_signal_connect_data (settings, "changed", | ||||
|                          G_CALLBACK (mapped_device_changed_cb), | ||||
|                          info, (GClosureNotify) g_free, 0); | ||||
|  | ||||
|   g_hash_table_insert (priv->mappable_devices, device, settings); | ||||
|  | ||||
|   update_device_display (input_settings, settings, device); | ||||
|  | ||||
|   return TRUE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| apply_device_settings (MetaInputSettings  *input_settings, | ||||
|                        ClutterInputDevice *device) | ||||
| { | ||||
|   update_mouse_left_handed (input_settings, device); | ||||
|   update_device_speed (input_settings, device); | ||||
|   update_device_natural_scroll (input_settings, device); | ||||
|  | ||||
|   update_touchpad_left_handed (input_settings, device); | ||||
|   update_device_speed (input_settings, device); | ||||
|   update_device_natural_scroll (input_settings, device); | ||||
|   update_touchpad_tap_enabled (input_settings, device); | ||||
|   update_touchpad_send_events (input_settings, device); | ||||
|   update_touchpad_scroll_method (input_settings, device); | ||||
|   update_touchpad_click_method (input_settings, device); | ||||
|  | ||||
|   update_trackball_scroll_button (input_settings, device); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_input_settings_device_added (ClutterDeviceManager *device_manager, | ||||
|                                   ClutterInputDevice   *device, | ||||
|                                   MetaInputSettings    *input_settings) | ||||
| { | ||||
|   if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER) | ||||
|     return; | ||||
|  | ||||
|   apply_device_settings (input_settings, device); | ||||
|   check_add_mappable_device (input_settings, device); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_input_settings_device_removed (ClutterDeviceManager *device_manager, | ||||
|                                     ClutterInputDevice   *device, | ||||
|                                     MetaInputSettings    *input_settings) | ||||
| { | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|  | ||||
|   priv = meta_input_settings_get_instance_private (input_settings); | ||||
|   g_hash_table_remove (priv->mappable_devices, device); | ||||
| } | ||||
|  | ||||
| static void | ||||
| check_mappable_devices (MetaInputSettings *input_settings) | ||||
| { | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|   const GSList *devices, *l; | ||||
|  | ||||
|   priv = meta_input_settings_get_instance_private (input_settings); | ||||
|   devices = clutter_device_manager_peek_devices (priv->device_manager); | ||||
|  | ||||
|   for (l = devices; l; l = l->next) | ||||
|     { | ||||
|       ClutterInputDevice *device = l->data; | ||||
|  | ||||
|       if (clutter_input_device_get_device_mode (device) == CLUTTER_INPUT_MODE_MASTER) | ||||
|         continue; | ||||
|  | ||||
|       check_add_mappable_device (input_settings, device); | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_input_settings_constructed (GObject *object) | ||||
| { | ||||
|   MetaInputSettings *input_settings = META_INPUT_SETTINGS (object); | ||||
|  | ||||
|   apply_device_settings (input_settings, NULL); | ||||
|   update_keyboard_repeat (input_settings); | ||||
|   check_mappable_devices (input_settings); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_input_settings_class_init (MetaInputSettingsClass *klass) | ||||
| { | ||||
|   GObjectClass *object_class = G_OBJECT_CLASS (klass); | ||||
|  | ||||
|   object_class->dispose = meta_input_settings_dispose; | ||||
|   object_class->constructed = meta_input_settings_constructed; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_input_settings_init (MetaInputSettings *settings) | ||||
| { | ||||
|   MetaInputSettingsPrivate *priv; | ||||
|  | ||||
|   priv = meta_input_settings_get_instance_private (settings); | ||||
|   priv->device_manager = clutter_device_manager_get_default (); | ||||
|   g_signal_connect (priv->device_manager, "device-added", | ||||
|                     G_CALLBACK (meta_input_settings_device_added), settings); | ||||
|   g_signal_connect (priv->device_manager, "device-removed", | ||||
|                     G_CALLBACK (meta_input_settings_device_removed), settings); | ||||
|  | ||||
|   priv->mouse_settings = g_settings_new ("org.gnome.desktop.peripherals.mouse"); | ||||
|   g_signal_connect (priv->mouse_settings, "changed", | ||||
|                     G_CALLBACK (meta_input_settings_changed_cb), settings); | ||||
|  | ||||
|   priv->touchpad_settings = g_settings_new ("org.gnome.desktop.peripherals.touchpad"); | ||||
|   g_signal_connect (priv->touchpad_settings, "changed", | ||||
|                     G_CALLBACK (meta_input_settings_changed_cb), settings); | ||||
|  | ||||
|   priv->trackball_settings = g_settings_new ("org.gnome.desktop.peripherals.trackball"); | ||||
|   g_signal_connect (priv->trackball_settings, "changed", | ||||
|                     G_CALLBACK (meta_input_settings_changed_cb), settings); | ||||
|  | ||||
|   priv->keyboard_settings = g_settings_new ("org.gnome.desktop.peripherals.keyboard"); | ||||
|   g_signal_connect (priv->keyboard_settings, "changed", | ||||
|                     G_CALLBACK (meta_input_settings_changed_cb), settings); | ||||
|  | ||||
|   priv->mappable_devices = | ||||
|     g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) g_object_unref); | ||||
|  | ||||
|   priv->monitor_manager = g_object_ref (meta_monitor_manager_get ()); | ||||
|   g_signal_connect (priv->monitor_manager, "monitors-changed", | ||||
|                     G_CALLBACK (monitors_changed_cb), settings); | ||||
| } | ||||
|  | ||||
| MetaInputSettings * | ||||
| meta_input_settings_create (void) | ||||
| { | ||||
| #ifdef HAVE_NATIVE_BACKEND | ||||
|   MetaBackend *backend; | ||||
|  | ||||
|   backend = meta_get_backend (); | ||||
|  | ||||
|   if (META_IS_BACKEND_NATIVE (backend)) | ||||
|     return g_object_new (META_TYPE_INPUT_SETTINGS_NATIVE, NULL); | ||||
| #endif | ||||
|   if (!meta_is_wayland_compositor ()) | ||||
|     return g_object_new (META_TYPE_INPUT_SETTINGS_X11, NULL); | ||||
|  | ||||
|   return NULL; | ||||
| } | ||||
| @@ -1,52 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2001 Havoc Pennington | ||||
|  * Copyright (C) 2003 Rob Adams | ||||
|  * Copyright (C) 2004-2006 Elijah Newren | ||||
|  * Copyright (C) 2013 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, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #ifndef META_MONITOR_CONFIG_H | ||||
| #define META_MONITOR_CONFIG_H | ||||
|  | ||||
| #include "meta-monitor-manager-private.h" | ||||
|  | ||||
| #define META_TYPE_MONITOR_CONFIG            (meta_monitor_config_get_type ()) | ||||
| #define META_MONITOR_CONFIG(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_CONFIG, MetaMonitorConfig)) | ||||
| #define META_MONITOR_CONFIG_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  META_TYPE_MONITOR_CONFIG, MetaMonitorConfigClass)) | ||||
| #define META_IS_MONITOR_CONFIG(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_MONITOR_CONFIG)) | ||||
| #define META_IS_MONITOR_CONFIG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  META_TYPE_MONITOR_CONFIG)) | ||||
| #define META_MONITOR_CONFIG_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  META_TYPE_MONITOR_CONFIG, MetaMonitorConfigClass)) | ||||
|  | ||||
| GType meta_monitor_config_get_type (void) G_GNUC_CONST; | ||||
|  | ||||
| MetaMonitorConfig *meta_monitor_config_new (void); | ||||
|  | ||||
| gboolean           meta_monitor_config_apply_stored (MetaMonitorConfig  *config, | ||||
|                                                      MetaMonitorManager *manager); | ||||
|  | ||||
| void               meta_monitor_config_make_default (MetaMonitorConfig  *config, | ||||
|                                                      MetaMonitorManager *manager); | ||||
|  | ||||
| void               meta_monitor_config_update_current (MetaMonitorConfig  *config, | ||||
|                                                        MetaMonitorManager *manager); | ||||
| void               meta_monitor_config_make_persistent (MetaMonitorConfig *config); | ||||
|  | ||||
| void               meta_monitor_config_restore_previous (MetaMonitorConfig  *config, | ||||
|                                                          MetaMonitorManager *manager); | ||||
|  | ||||
| #endif /* META_MONITOR_CONFIG_H */ | ||||
| @@ -1,298 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2001, 2002 Havoc Pennington | ||||
|  * Copyright (C) 2002, 2003 Red Hat Inc. | ||||
|  * Some ICCCM manager selection code derived from fvwm2, | ||||
|  * Copyright (C) 2001 Dominik Vogt, Matthias Clasen, and fvwm2 team | ||||
|  * Copyright (C) 2003 Rob Adams | ||||
|  * Copyright (C) 2004-2006 Elijah Newren | ||||
|  * Copyright (C) 2013 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, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #include "config.h" | ||||
|  | ||||
| #include "meta-monitor-manager-dummy.h" | ||||
|  | ||||
| #include <stdlib.h> | ||||
|  | ||||
| #include <meta/util.h> | ||||
|  | ||||
| #define ALL_TRANSFORMS ((1 << (META_MONITOR_TRANSFORM_FLIPPED_270 + 1)) - 1) | ||||
|  | ||||
| struct _MetaMonitorManagerDummy | ||||
| { | ||||
|   MetaMonitorManager parent_instance; | ||||
| }; | ||||
|  | ||||
| struct _MetaMonitorManagerDummyClass | ||||
| { | ||||
|   MetaMonitorManagerClass parent_class; | ||||
| }; | ||||
|  | ||||
| G_DEFINE_TYPE (MetaMonitorManagerDummy, meta_monitor_manager_dummy, META_TYPE_MONITOR_MANAGER); | ||||
|  | ||||
| static void | ||||
| meta_monitor_manager_dummy_read_current (MetaMonitorManager *manager) | ||||
| { | ||||
|   unsigned int num_monitors = 1; | ||||
|   int *monitor_scales = NULL; | ||||
|   const char *num_monitors_str; | ||||
|   const char *monitor_scales_str; | ||||
|   unsigned int i; | ||||
|   int current_x = 0; | ||||
|  | ||||
|   /* To control what monitor configuration is generated, there are two available | ||||
|    * environmental variables that can be used: | ||||
|    * | ||||
|    * MUTTER_DEBUG_NUM_DUMMY_MONITORS | ||||
|    * | ||||
|    * Specifies the number of dummy monitors to include in the stage. Every | ||||
|    * monitor is 1024x786 pixels and they are placed on a horizontal row. | ||||
|    * | ||||
|    * MUTTER_DEBUG_DUMMY_MONITOR_SCALES | ||||
|    * | ||||
|    * A comma separated list that specifies the scales of the dummy monitors. | ||||
|    * | ||||
|    * For example the following configuration results in two monitors, where the | ||||
|    * first one has the monitor scale 1, and the other the monitor scale 2. | ||||
|    * | ||||
|    * MUTTER_DEBUG_NUM_DUMMY_MONITORS=2 | ||||
|    * MUTTER_DEBUG_DUMMY_MONITOR_SCALES=1,2 | ||||
|    */ | ||||
|   num_monitors_str = getenv ("MUTTER_DEBUG_NUM_DUMMY_MONITORS"); | ||||
|   if (num_monitors_str) | ||||
|     { | ||||
|       num_monitors = g_ascii_strtoll (num_monitors_str, NULL, 10); | ||||
|       if (num_monitors <= 0) | ||||
|         { | ||||
|           meta_warning ("Invalid number of dummy monitors"); | ||||
|           num_monitors = 1; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   monitor_scales = g_newa (int, num_monitors); | ||||
|   for (i = 0; i < num_monitors; i++) | ||||
|     monitor_scales[i] = 1; | ||||
|  | ||||
|   monitor_scales_str = getenv ("MUTTER_DEBUG_DUMMY_MONITOR_SCALES"); | ||||
|   if (monitor_scales_str) | ||||
|     { | ||||
|       gchar **scales_str_list; | ||||
|  | ||||
|       scales_str_list = g_strsplit (monitor_scales_str, ",", -1); | ||||
|       if (g_strv_length (scales_str_list) != num_monitors) | ||||
|         meta_warning ("Number of specified monitor scales differ from number " | ||||
|                       "of monitors (defaults to 1).\n"); | ||||
|       for (i = 0; i < num_monitors && scales_str_list[i]; i++) | ||||
|         { | ||||
|           int scale = g_ascii_strtoll (scales_str_list[i], NULL, 10); | ||||
|           if (scale == 1 || scale == 2) | ||||
|             monitor_scales[i] = scale; | ||||
|           else | ||||
|             meta_warning ("Invalid dummy monitor scale"); | ||||
|         } | ||||
|       g_strfreev (scales_str_list); | ||||
|     } | ||||
|  | ||||
|   manager->max_screen_width = 65535; | ||||
|   manager->max_screen_height = 65535; | ||||
|   manager->screen_width = 1024 * num_monitors; | ||||
|   manager->screen_height = 768; | ||||
|  | ||||
|   manager->modes = g_new0 (MetaMonitorMode, 1); | ||||
|   manager->n_modes = 1; | ||||
|  | ||||
|   manager->modes[0].mode_id = 0; | ||||
|   manager->modes[0].width = 1024; | ||||
|   manager->modes[0].height = 768; | ||||
|   manager->modes[0].refresh_rate = 60.0; | ||||
|  | ||||
|   manager->crtcs = g_new0 (MetaCRTC, num_monitors); | ||||
|   manager->n_crtcs = num_monitors; | ||||
|   manager->outputs = g_new0 (MetaOutput, num_monitors); | ||||
|   manager->n_outputs = num_monitors; | ||||
|  | ||||
|   for (i = 0; i < num_monitors; i++) | ||||
|     { | ||||
|       manager->crtcs[i].crtc_id = i + 1; | ||||
|       manager->crtcs[i].rect.x = current_x; | ||||
|       manager->crtcs[i].rect.y = 0; | ||||
|       manager->crtcs[i].rect.width = manager->modes[0].width; | ||||
|       manager->crtcs[i].rect.height = manager->modes[0].height; | ||||
|       manager->crtcs[i].current_mode = &manager->modes[0]; | ||||
|       manager->crtcs[i].transform = META_MONITOR_TRANSFORM_NORMAL; | ||||
|       manager->crtcs[i].all_transforms = ALL_TRANSFORMS; | ||||
|       manager->crtcs[i].is_dirty = FALSE; | ||||
|       manager->crtcs[i].logical_monitor = NULL; | ||||
|  | ||||
|       current_x += manager->crtcs[i].rect.width; | ||||
|  | ||||
|       manager->outputs[i].crtc = &manager->crtcs[i]; | ||||
|       manager->outputs[i].winsys_id = i + 1; | ||||
|       manager->outputs[i].name = g_strdup_printf ("LVDS%d", i + 1); | ||||
|       manager->outputs[i].vendor = g_strdup ("MetaProducts Inc."); | ||||
|       manager->outputs[i].product = g_strdup ("unknown"); | ||||
|       manager->outputs[i].serial = g_strdup ("0xC0FFEE"); | ||||
|       manager->outputs[i].suggested_x = -1; | ||||
|       manager->outputs[i].suggested_y = -1; | ||||
|       manager->outputs[i].width_mm = 222; | ||||
|       manager->outputs[i].height_mm = 125; | ||||
|       manager->outputs[i].subpixel_order = COGL_SUBPIXEL_ORDER_UNKNOWN; | ||||
|       manager->outputs[i].preferred_mode = &manager->modes[0]; | ||||
|       manager->outputs[i].n_modes = 1; | ||||
|       manager->outputs[i].modes = g_new0 (MetaMonitorMode *, 1); | ||||
|       manager->outputs[i].modes[0] = &manager->modes[0]; | ||||
|       manager->outputs[i].n_possible_crtcs = 1; | ||||
|       manager->outputs[i].possible_crtcs = g_new0 (MetaCRTC *, 1); | ||||
|       manager->outputs[i].possible_crtcs[0] = &manager->crtcs[i]; | ||||
|       manager->outputs[i].n_possible_clones = 0; | ||||
|       manager->outputs[i].possible_clones = g_new0 (MetaOutput *, 0); | ||||
|       manager->outputs[i].backlight = -1; | ||||
|       manager->outputs[i].backlight_min = 0; | ||||
|       manager->outputs[i].backlight_max = 0; | ||||
|       manager->outputs[i].connector_type = META_CONNECTOR_TYPE_LVDS; | ||||
|       manager->outputs[i].scale = monitor_scales[i]; | ||||
|     } | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_monitor_manager_dummy_apply_config (MetaMonitorManager *manager, | ||||
|                                          MetaCRTCInfo       **crtcs, | ||||
|                                          unsigned int         n_crtcs, | ||||
|                                          MetaOutputInfo     **outputs, | ||||
|                                          unsigned int         n_outputs) | ||||
| { | ||||
|     unsigned i; | ||||
|     int screen_width = 0, screen_height = 0; | ||||
|  | ||||
|   for (i = 0; i < n_crtcs; i++) | ||||
|     { | ||||
|       MetaCRTCInfo *crtc_info = crtcs[i]; | ||||
|       MetaCRTC *crtc = crtc_info->crtc; | ||||
|       crtc->is_dirty = TRUE; | ||||
|  | ||||
|       if (crtc_info->mode == NULL) | ||||
|         { | ||||
|           crtc->rect.x = 0; | ||||
|           crtc->rect.y = 0; | ||||
|           crtc->rect.width = 0; | ||||
|           crtc->rect.height = 0; | ||||
|           crtc->current_mode = NULL; | ||||
|         } | ||||
|       else | ||||
|         { | ||||
|           MetaMonitorMode *mode; | ||||
|           MetaOutput *output; | ||||
|           unsigned int j; | ||||
|           int width, height; | ||||
|  | ||||
|           mode = crtc_info->mode; | ||||
|  | ||||
|           if (meta_monitor_transform_is_rotated (crtc_info->transform)) | ||||
|             { | ||||
|               width = mode->height; | ||||
|               height = mode->width; | ||||
|             } | ||||
|           else | ||||
|             { | ||||
|               width = mode->width; | ||||
|               height = mode->height; | ||||
|             } | ||||
|  | ||||
|           crtc->rect.x = crtc_info->x; | ||||
|           crtc->rect.y = crtc_info->y; | ||||
|           crtc->rect.width = width; | ||||
|           crtc->rect.height = height; | ||||
|           crtc->current_mode = mode; | ||||
|           crtc->transform = crtc_info->transform; | ||||
|  | ||||
|           screen_width = MAX (screen_width, crtc_info->x + width); | ||||
|           screen_height = MAX (screen_height, crtc_info->y + height); | ||||
|  | ||||
|           for (j = 0; j < crtc_info->outputs->len; j++) | ||||
|             { | ||||
|               output = ((MetaOutput**)crtc_info->outputs->pdata)[j]; | ||||
|  | ||||
|               output->is_dirty = TRUE; | ||||
|               output->crtc = crtc; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   for (i = 0; i < n_outputs; i++) | ||||
|     { | ||||
|       MetaOutputInfo *output_info = outputs[i]; | ||||
|       MetaOutput *output = output_info->output; | ||||
|  | ||||
|       output->is_primary = output_info->is_primary; | ||||
|       output->is_presentation = output_info->is_presentation; | ||||
|     } | ||||
|  | ||||
|   /* Disable CRTCs not mentioned in the list */ | ||||
|   for (i = 0; i < manager->n_crtcs; i++) | ||||
|     { | ||||
|       MetaCRTC *crtc = &manager->crtcs[i]; | ||||
|  | ||||
|       crtc->logical_monitor = NULL; | ||||
|  | ||||
|       if (crtc->is_dirty) | ||||
|         { | ||||
|           crtc->is_dirty = FALSE; | ||||
|           continue; | ||||
|         } | ||||
|  | ||||
|       crtc->rect.x = 0; | ||||
|       crtc->rect.y = 0; | ||||
|       crtc->rect.width = 0; | ||||
|       crtc->rect.height = 0; | ||||
|       crtc->current_mode = NULL; | ||||
|     } | ||||
|  | ||||
|   /* Disable outputs not mentioned in the list */ | ||||
|   for (i = 0; i < manager->n_outputs; i++) | ||||
|     { | ||||
|       MetaOutput *output = &manager->outputs[i]; | ||||
|  | ||||
|       if (output->is_dirty) | ||||
|         { | ||||
|           output->is_dirty = FALSE; | ||||
|           continue; | ||||
|         } | ||||
|  | ||||
|       output->crtc = NULL; | ||||
|       output->is_primary = FALSE; | ||||
|     } | ||||
|  | ||||
|   manager->screen_width = screen_width; | ||||
|   manager->screen_height = screen_height; | ||||
|  | ||||
|   meta_monitor_manager_rebuild_derived (manager); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_monitor_manager_dummy_class_init (MetaMonitorManagerDummyClass *klass) | ||||
| { | ||||
|   MetaMonitorManagerClass *manager_class = META_MONITOR_MANAGER_CLASS (klass); | ||||
|  | ||||
|   manager_class->read_current = meta_monitor_manager_dummy_read_current; | ||||
|   manager_class->apply_configuration = meta_monitor_manager_dummy_apply_config; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_monitor_manager_dummy_init (MetaMonitorManagerDummy *manager) | ||||
| { | ||||
| } | ||||
| @@ -1,40 +0,0 @@ | ||||
| /* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ | ||||
|  | ||||
| /* | ||||
|  * Copyright (C) 2001 Havoc Pennington | ||||
|  * Copyright (C) 2003 Rob Adams | ||||
|  * Copyright (C) 2004-2006 Elijah Newren | ||||
|  * Copyright (C) 2013 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, see <http://www.gnu.org/licenses/>. | ||||
|  */ | ||||
|  | ||||
| #ifndef META_MONITOR_MANAGER_DUMMY_H | ||||
| #define META_MONITOR_MANAGER_DUMMY_H | ||||
|  | ||||
| #include "meta-monitor-manager-private.h" | ||||
|  | ||||
| #define META_TYPE_MONITOR_MANAGER_DUMMY            (meta_monitor_manager_dummy_get_type ()) | ||||
| #define META_MONITOR_MANAGER_DUMMY(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_MONITOR_MANAGER_DUMMY, MetaMonitorManagerDummy)) | ||||
| #define META_MONITOR_MANAGER_DUMMY_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  META_TYPE_MONITOR_MANAGER_DUMMY, MetaMonitorManagerDummyClass)) | ||||
| #define META_IS_MONITOR_MANAGER_DUMMY(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), META_TYPE_MONITOR_MANAGER_DUMMY)) | ||||
| #define META_IS_MONITOR_MANAGER_DUMMY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  META_TYPE_MONITOR_MANAGER_DUMMY)) | ||||
| #define META_MONITOR_MANAGER_DUMMY_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  META_TYPE_MONITOR_MANAGER_DUMMY, MetaMonitorManagerDummyClass)) | ||||
|  | ||||
| typedef struct _MetaMonitorManagerDummyClass    MetaMonitorManagerDummyClass; | ||||
| typedef struct _MetaMonitorManagerDummy         MetaMonitorManagerDummy; | ||||
|  | ||||
| GType meta_monitor_manager_dummy_get_type (void); | ||||
|  | ||||
| #endif /* META_MONITOR_MANAGER_DUMMY_H */ | ||||
| @@ -1,263 +0,0 @@ | ||||
| /* | ||||
|  * Copyright (C) 2014 Red Hat | ||||
|  * | ||||
|  * 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. | ||||
|  * | ||||
|  * Written by: | ||||
|  *     Jasper St. Pierre <jstpierre@mecheye.net> | ||||
|  */ | ||||
|  | ||||
| #include <config.h> | ||||
|  | ||||
| #include "meta-stage.h" | ||||
|  | ||||
| #include <meta/meta-backend.h> | ||||
| #include <meta/util.h> | ||||
|  | ||||
| typedef struct { | ||||
|   gboolean enabled; | ||||
|  | ||||
|   CoglPipeline *pipeline; | ||||
|   CoglTexture *texture; | ||||
|  | ||||
|   MetaRectangle current_rect; | ||||
|   MetaRectangle previous_rect; | ||||
|   gboolean previous_is_valid; | ||||
| } MetaOverlay; | ||||
|  | ||||
| struct _MetaStagePrivate { | ||||
|   MetaOverlay cursor_overlay; | ||||
|   gboolean is_active; | ||||
| }; | ||||
| typedef struct _MetaStagePrivate MetaStagePrivate; | ||||
|  | ||||
| G_DEFINE_TYPE_WITH_PRIVATE (MetaStage, meta_stage, CLUTTER_TYPE_STAGE); | ||||
|  | ||||
| static void | ||||
| meta_overlay_init (MetaOverlay *overlay) | ||||
| { | ||||
|   CoglContext *ctx = clutter_backend_get_cogl_context (clutter_get_default_backend ()); | ||||
|  | ||||
|   overlay->pipeline = cogl_pipeline_new (ctx); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_overlay_free (MetaOverlay *overlay) | ||||
| { | ||||
|   if (overlay->pipeline) | ||||
|     cogl_object_unref (overlay->pipeline); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_overlay_set (MetaOverlay   *overlay, | ||||
|                   CoglTexture   *texture, | ||||
|                   MetaRectangle *rect) | ||||
| { | ||||
|   if (overlay->texture != texture) | ||||
|     { | ||||
|       overlay->texture = texture; | ||||
|  | ||||
|       if (texture) | ||||
|         { | ||||
|           cogl_pipeline_set_layer_texture (overlay->pipeline, 0, texture); | ||||
|           overlay->enabled = TRUE; | ||||
|         } | ||||
|       else | ||||
|         { | ||||
|           cogl_pipeline_set_layer_texture (overlay->pipeline, 0, NULL); | ||||
|           overlay->enabled = FALSE; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|   overlay->current_rect = *rect; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_overlay_paint (MetaOverlay *overlay) | ||||
| { | ||||
|   if (!overlay->enabled) | ||||
|     return; | ||||
|  | ||||
|   g_assert (meta_is_wayland_compositor ()); | ||||
|  | ||||
|   cogl_framebuffer_draw_rectangle (cogl_get_draw_framebuffer (), | ||||
|                                    overlay->pipeline, | ||||
|                                    overlay->current_rect.x, | ||||
|                                    overlay->current_rect.y, | ||||
|                                    overlay->current_rect.x + | ||||
|                                    overlay->current_rect.width, | ||||
|                                    overlay->current_rect.y + | ||||
|                                    overlay->current_rect.height); | ||||
|  | ||||
|   overlay->previous_rect = overlay->current_rect; | ||||
|   overlay->previous_is_valid = TRUE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_stage_finalize (GObject *object) | ||||
| { | ||||
|   MetaStage *stage = META_STAGE (object); | ||||
|   MetaStagePrivate *priv = meta_stage_get_instance_private (stage); | ||||
|  | ||||
|   meta_overlay_free (&priv->cursor_overlay); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_stage_paint (ClutterActor *actor) | ||||
| { | ||||
|   MetaStage *stage = META_STAGE (actor); | ||||
|   MetaStagePrivate *priv = meta_stage_get_instance_private (stage); | ||||
|  | ||||
|   CLUTTER_ACTOR_CLASS (meta_stage_parent_class)->paint (actor); | ||||
|  | ||||
|   meta_overlay_paint (&priv->cursor_overlay); | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_stage_activate (ClutterStage *actor) | ||||
| { | ||||
|   MetaStage *stage = META_STAGE (actor); | ||||
|   MetaStagePrivate *priv = meta_stage_get_instance_private (stage); | ||||
|  | ||||
|   CLUTTER_STAGE_CLASS (meta_stage_parent_class)->activate (actor); | ||||
|  | ||||
|   priv->is_active = TRUE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_stage_deactivate (ClutterStage *actor) | ||||
| { | ||||
|   MetaStage *stage = META_STAGE (actor); | ||||
|   MetaStagePrivate *priv = meta_stage_get_instance_private (stage); | ||||
|  | ||||
|   CLUTTER_STAGE_CLASS (meta_stage_parent_class)->deactivate (actor); | ||||
|  | ||||
|   priv->is_active = FALSE; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_stage_class_init (MetaStageClass *klass) | ||||
| { | ||||
|   ClutterStageClass *stage_class = (ClutterStageClass *) klass; | ||||
|   ClutterActorClass *actor_class = (ClutterActorClass *) klass; | ||||
|   GObjectClass *object_class = (GObjectClass *) klass; | ||||
|  | ||||
|   object_class->finalize = meta_stage_finalize; | ||||
|  | ||||
|   actor_class->paint = meta_stage_paint; | ||||
|  | ||||
|   stage_class->activate = meta_stage_activate; | ||||
|   stage_class->deactivate = meta_stage_deactivate; | ||||
| } | ||||
|  | ||||
| static void | ||||
| meta_stage_init (MetaStage *stage) | ||||
| { | ||||
|   MetaStagePrivate *priv = meta_stage_get_instance_private (stage); | ||||
|  | ||||
|   meta_overlay_init (&priv->cursor_overlay); | ||||
|  | ||||
|   clutter_stage_set_user_resizable (CLUTTER_STAGE (stage), FALSE); | ||||
| } | ||||
|  | ||||
| ClutterActor * | ||||
| meta_stage_new (void) | ||||
| { | ||||
|   return g_object_new (META_TYPE_STAGE, | ||||
|                        "cursor-visible", FALSE, | ||||
|                        NULL); | ||||
| } | ||||
|  | ||||
| static void | ||||
| queue_redraw_for_overlay (MetaStage   *stage, | ||||
|                           MetaOverlay *overlay) | ||||
| { | ||||
|   cairo_rectangle_int_t clip; | ||||
|  | ||||
|   /* Clear the location the overlay was at before, if we need to. */ | ||||
|   if (overlay->previous_is_valid) | ||||
|     { | ||||
|       clip.x = overlay->previous_rect.x; | ||||
|       clip.y = overlay->previous_rect.y; | ||||
|       clip.width = overlay->previous_rect.width; | ||||
|       clip.height = overlay->previous_rect.height; | ||||
|       clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stage), &clip); | ||||
|       overlay->previous_is_valid = FALSE; | ||||
|     } | ||||
|  | ||||
|   /* Draw the overlay at the new position */ | ||||
|   if (overlay->enabled) | ||||
|     { | ||||
|       clip.x = overlay->current_rect.x; | ||||
|       clip.y = overlay->current_rect.y; | ||||
|       clip.width = overlay->current_rect.width; | ||||
|       clip.height = overlay->current_rect.height; | ||||
|       clutter_actor_queue_redraw_with_clip (CLUTTER_ACTOR (stage), &clip); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_stage_set_cursor (MetaStage     *stage, | ||||
|                        CoglTexture   *texture, | ||||
|                        MetaRectangle *rect) | ||||
| { | ||||
|   MetaStagePrivate *priv = meta_stage_get_instance_private (stage); | ||||
|  | ||||
|   g_assert (meta_is_wayland_compositor () || texture == NULL); | ||||
|  | ||||
|   meta_overlay_set (&priv->cursor_overlay, texture, rect); | ||||
|   queue_redraw_for_overlay (stage, &priv->cursor_overlay); | ||||
| } | ||||
|  | ||||
| void | ||||
| meta_stage_set_active (MetaStage *stage, | ||||
|                        gboolean   is_active) | ||||
| { | ||||
|   MetaStagePrivate *priv = meta_stage_get_instance_private (stage); | ||||
|   ClutterEvent event = { 0 }; | ||||
|  | ||||
|   /* Used by the native backend to inform accessibility technologies | ||||
|    * about when the stage loses and gains input focus. | ||||
|    * | ||||
|    * For the X11 backend, clutter transparently takes care of this | ||||
|    * for us. | ||||
|    */ | ||||
|  | ||||
|   if (priv->is_active == is_active) | ||||
|     return; | ||||
|  | ||||
|   event.type = CLUTTER_STAGE_STATE; | ||||
|   clutter_event_set_stage (&event, CLUTTER_STAGE (stage)); | ||||
|   event.stage_state.changed_mask = CLUTTER_STAGE_STATE_ACTIVATED; | ||||
|  | ||||
|   if (is_active) | ||||
|     event.stage_state.new_state = CLUTTER_STAGE_STATE_ACTIVATED; | ||||
|  | ||||
|   /* Emitting this StageState event will result in the stage getting | ||||
|    * activated or deactivated (with the activated or deactivated signal | ||||
|    * getting emitted from the stage) | ||||
|    * | ||||
|    * FIXME: This won't update ClutterStage's own notion of its | ||||
|    * activeness. For that we would need to somehow trigger a | ||||
|    * _clutter_stage_update_state call, which will probably | ||||
|    * require new API in clutter. In practice, nothing relies | ||||
|    * on the ClutterStage's own notion of activeness when using | ||||
|    * the EGL backend. | ||||
|    * | ||||
|    * See http://bugzilla.gnome.org/746670 | ||||
|    */ | ||||
|   clutter_stage_event (CLUTTER_STAGE (stage), &event); | ||||
| } | ||||
Some files were not shown because too many files have changed in this diff Show More
		Reference in New Issue
	
	Block a user