forked from pool/gnome-control-center
OBS-URL: https://build.opensuse.org/package/show/openSUSE:Factory/gnome-control-center?expand=0&rev=5
This commit is contained in:
parent
313281cd01
commit
609f327b8e
@ -22,6 +22,827 @@ index b75da5b..193fd65 100644
|
|||||||
gnome_display_properties_LDFLAGS = -export-dynamic
|
gnome_display_properties_LDFLAGS = -export-dynamic
|
||||||
gnome_display_properties_LDADD = \
|
gnome_display_properties_LDADD = \
|
||||||
$(DISPLAY_CAPPLET_LIBS) \
|
$(DISPLAY_CAPPLET_LIBS) \
|
||||||
|
diff --git a/capplets/display/TODO b/capplets/display/TODO
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..a1164e1
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/capplets/display/TODO
|
||||||
|
@@ -0,0 +1,815 @@
|
||||||
|
+Highlevel overview:
|
||||||
|
+
|
||||||
|
+- GTK+ work.
|
||||||
|
+
|
||||||
|
+ Allow applications to be notified whenever monitors are added
|
||||||
|
+ or removed. Allow applications to get more detailed
|
||||||
|
+ information about the connected monitors.
|
||||||
|
+
|
||||||
|
+ The main complication is that XRRGetScreenResources() is very
|
||||||
|
+ slow. We could call it only when the X server sends an event,
|
||||||
|
+ but it's not desirable to have every application freeze for
|
||||||
|
+ half a second. And certainly not desirable to have the X
|
||||||
|
+ server block for n * 0.5 seconds.
|
||||||
|
+
|
||||||
|
+ With the X server work below we should be fine just calling
|
||||||
|
+ XRRGetScreenResources on startup and in response to events.
|
||||||
|
+
|
||||||
|
+- X server work:
|
||||||
|
+
|
||||||
|
+ X server needs to poll for whether a monitor is plugged
|
||||||
|
+ in. Whenever it detects a change, it should do an EDID query,
|
||||||
|
+ and cache the resulting information. That way XRRGetScreenResources()
|
||||||
|
+ can be the speed of a normal roundtrip. It's desirable that
|
||||||
|
+ normal client requests can still be processed during the EDID
|
||||||
|
+ querying, but only a nice-to-have.
|
||||||
|
+
|
||||||
|
+ Drivers need to work reliably. There could be substantial work
|
||||||
|
+ here. For F9, possibly only the Intel driver can be made to
|
||||||
|
+ work.
|
||||||
|
+
|
||||||
|
+ Interrupts and events must be generated whenever something changes
|
||||||
|
+ about the outputs, if necessary by polling.
|
||||||
|
+
|
||||||
|
+ Events must be emitted whenever something changes, including when
|
||||||
|
+ the reason for the change is a manual change.
|
||||||
|
+
|
||||||
|
+ The maximum framebuffer must be dynamically changable.
|
||||||
|
+
|
||||||
|
+- Control panel work:
|
||||||
|
+ Capplet needs to be written. The main complications:
|
||||||
|
+
|
||||||
|
+ - It needs to pay attention to events from the X server
|
||||||
|
+ and update itself, ie., add show new monitors if they become
|
||||||
|
+ available when the applet is shown.
|
||||||
|
+
|
||||||
|
+ - It needs to store information under a key computed
|
||||||
|
+ from a monitor identifier. The complication here is that
|
||||||
|
+ it's not completely clear how to do this in GConf.
|
||||||
|
+
|
||||||
|
+ - Would probably be worthwhile to drop libgnome/libgnomeui from
|
||||||
|
+ the craplets.
|
||||||
|
+
|
||||||
|
+- Metacity work:
|
||||||
|
+ - Metacity is already Xinerama aware, but it needs to update itself
|
||||||
|
+ when monitors come and go.
|
||||||
|
+
|
||||||
|
+- GNOME panel work:
|
||||||
|
+ - Is already Xinerama aware, but needs to listen and update itself
|
||||||
|
+ when monitors change.
|
||||||
|
+
|
||||||
|
+- Evince work:
|
||||||
|
+ - Make sure it deals sensibly with multiple monitors
|
||||||
|
+
|
||||||
|
+- OpenOffice work:
|
||||||
|
+ - Make sure it deals sensibly with multiple monitors
|
||||||
|
+
|
||||||
|
+- An Xlib call to just return all the available information would be
|
||||||
|
+ useful. At the moment we have to do a bunch of roundtrips to
|
||||||
|
+ get the information. This is a would-be-nice though.
|
||||||
|
+
|
||||||
|
+- A dbus service could be written that pops up the applet whenever a
|
||||||
|
+ monitor. It should only pop up if the new monitor is unknown. This
|
||||||
|
+ is at best a nice-to-have, and low priority in my opinion.
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+******************* Metacity
|
||||||
|
+
|
||||||
|
+Havoc:
|
||||||
|
+
|
||||||
|
+> I was just talking to bryan about this and "helping" him design it ;-)
|
||||||
|
+
|
||||||
|
+> But I wanted to be sure and lobby for a fix window managers
|
||||||
|
+> need. Basically right now the WM can't tell "physical" from
|
||||||
|
+> "logical" monitors.
|
||||||
|
+
|
||||||
|
+> A "logical" monitor is a desktop; it has its own panel, windows
|
||||||
|
+> maximize to it, etc.
|
||||||
|
+
|
||||||
|
+> A "physical" monitor is a piece of hardware.
|
||||||
|
+
|
||||||
|
+> Sometimes people want to combine physical monitors into a video wall
|
||||||
|
+> or just two monitors treated as one. Or at least a couple of noisy
|
||||||
|
+> people in bugzilla want to do this.
|
||||||
|
+
|
||||||
|
+> When people talk about a "Xinerama aware" app or WM they usually
|
||||||
|
+> mean that all physical monitors are treated as logical monitors,
|
||||||
|
+> while lack of Xinerama-aware means treating the entire X screen (all
|
||||||
|
+> physical monitors) as one logical monitor.
|
||||||
|
+
|
||||||
|
+> The problem is that the setting for "ignore Xinerama" or "don't be
|
||||||
|
+> Xinerama aware" should be global to the desktop (GTK, all apps, WM)
|
||||||
|
+> and should not be a window manager setting.
|
||||||
|
+
|
||||||
|
+> Bryan thought people who wanted non-Xinerama-aware should just use
|
||||||
|
+> fvwm, which may be right, but what I'd say is that if there is any
|
||||||
|
+> setting for this, it should be desktop-global and in this monitor
|
||||||
|
+> config dialog.
|
||||||
|
+
|
||||||
|
+> It should not be a metacity or Compiz option, but in some way an X
|
||||||
|
+> option in short. The implementation could be either an X server
|
||||||
|
+> feature or an EWMH hint or whatever, but it should be controlled by
|
||||||
|
+> the monitor config dialog and used by apps, GTK, etc. in addition to
|
||||||
|
+> used by the WM.
|
||||||
|
+
|
||||||
|
+> People tend to insist this should be a WM option, but that's just
|
||||||
|
+> busted, since GTK and apps also have Xinerama-awareness features.
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+******************* EDID
|
||||||
|
+
|
||||||
|
+edid-decode enhancements:
|
||||||
|
+
|
||||||
|
+- Rejects years <= 0x0f for all versions, but this should only be done
|
||||||
|
+ for monitors claiming conformance to 1.4 (since 1.4 was released in
|
||||||
|
+ 2006). A monitor produced in 2005 should have 0x0f - it's the only
|
||||||
|
+ reasonable thing to do.
|
||||||
|
+
|
||||||
|
+- Uses 0x80 as the conformance mask for 1.4, should be 0
|
||||||
|
+
|
||||||
|
+- Should read from stdin
|
||||||
|
+
|
||||||
|
+- Should parse xrandr -verbose output more robustly
|
||||||
|
+
|
||||||
|
+- Color depth computation is wrong. It uses the formula
|
||||||
|
+
|
||||||
|
+ (edid[0x14] >> 3) + 2
|
||||||
|
+
|
||||||
|
+ The correct formula to use is
|
||||||
|
+
|
||||||
|
+ (edid[0x14] & 0x70) >> 3 + 4
|
||||||
|
+
|
||||||
|
+-
|
||||||
|
+
|
||||||
|
+-=-=-=-
|
||||||
|
+Computing a display name from EDID information:
|
||||||
|
+
|
||||||
|
+ vendor = lookup_vendor (code);
|
||||||
|
+
|
||||||
|
+ if (dsc_product && !is_gobbledigook (dsc_product))
|
||||||
|
+ {
|
||||||
|
+ if (vendor && !fuzzy_string_search (vendor, dsc_product))
|
||||||
|
+ prepend (vendor);
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ if (vendor)
|
||||||
|
+ append (vendor);
|
||||||
|
+ else
|
||||||
|
+ append ("Unknown");
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ if (has size)
|
||||||
|
+ {
|
||||||
|
+ convert_to_inches()
|
||||||
|
+
|
||||||
|
+ append (" %d\"", inches)
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+(Does this internationalize at all)?
|
||||||
|
+
|
||||||
|
+We also need the ability to get laptop names. The laptop panel may report
|
||||||
|
+a manufacturer that has nothing to do with the laptop manufacturer.
|
||||||
|
+
|
||||||
|
+Needed XRandr output properties:
|
||||||
|
+
|
||||||
|
+- Modes that the monitor supports, or enough information that the
|
||||||
|
+ client can go throught the list of modes for the relevant
|
||||||
|
+ CRTC/Outputs and filter those out that the monitor can't support.
|
||||||
|
+
|
||||||
|
+- The preferred mode, if any. Also useful if we could get a "strongly
|
||||||
|
+ preferred" indication if it's an LCD with a fixed resolution.
|
||||||
|
+
|
||||||
|
+- Sufficient information that a fairly specific identifier can be
|
||||||
|
+ computed. The algorithm the client should use is:
|
||||||
|
+
|
||||||
|
+ 1 Have we seen exactly this monitor before? If yes, use
|
||||||
|
+ settings for that.
|
||||||
|
+
|
||||||
|
+ 2 Have we seen a monitor with similar specs before? If yes,
|
||||||
|
+ use settings for that. (But don't save, unless the user
|
||||||
|
+ changes the settings).
|
||||||
|
+
|
||||||
|
+ 3 Otherwise, use some reasonable default for the monitor and
|
||||||
|
+ save it.
|
||||||
|
+
|
||||||
|
+ A setting should only be used if the CRTC/Output allows it. Ie,. if
|
||||||
|
+ a user has installed a new video card, then previously-used settings
|
||||||
|
+ may no longer apply, so this must be checked every time.
|
||||||
|
+
|
||||||
|
+ (1) Implies that we really need a globally unique identifier for
|
||||||
|
+ monitors. (2) is useful in an enterprise setting, but not absolutely
|
||||||
|
+ critical, since (3) would still handle the majority of cases.
|
||||||
|
+
|
||||||
|
+ There is a question here: Where are machine specific preferences
|
||||||
|
+ stored? Havoc mentions three possibilities here:
|
||||||
|
+
|
||||||
|
+ http://mail.gnome.org/archives/gnomecc-list/2001-October/msg00023.html
|
||||||
|
+
|
||||||
|
+ I'm not sure if any of them are implementable at this point. Also
|
||||||
|
+ (1) may mostly take care of the problem.
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ Usecases:
|
||||||
|
+
|
||||||
|
+ 1. Fixed setup with some number of monitors.
|
||||||
|
+ - They should be set to the correct mode on login.
|
||||||
|
+ Note that this involves setting the right position in the
|
||||||
|
+ framebuffer too.
|
||||||
|
+ What if someone swaps two monitors? Users are going to expect
|
||||||
|
+ that the images will switch position.
|
||||||
|
+
|
||||||
|
+ 2. Laptop being moved between home and work
|
||||||
|
+ - Setups should be detected and the correct mode set, at least on
|
||||||
|
+ login, but ideally when you put the laptop into the docking
|
||||||
|
+ station.
|
||||||
|
+
|
||||||
|
+ 3. Laptop gets projector plugged in.
|
||||||
|
+
|
||||||
|
+ Note the same model monitor can be used in two different ways. Ie.,
|
||||||
|
+ at home, it's being used at one resolution, at work the same type of
|
||||||
|
+ monitor is used at a different resolution.
|
||||||
|
+
|
||||||
|
+ Simple solution:
|
||||||
|
+
|
||||||
|
+ - The on-disk database is just a list of monitors. Each monitor has an
|
||||||
|
+ associated mode. This has these problems:
|
||||||
|
+ - If someone uses the same monitor model in two different ways.
|
||||||
|
+ - If someone swaps the monitors around
|
||||||
|
+
|
||||||
|
+ Better solution
|
||||||
|
+
|
||||||
|
+ - The on-disk database is a list of configurations, where a
|
||||||
|
+ configuration is a list of monitors and what outputs they are
|
||||||
|
+ connected to, and the position in the framebuffer.
|
||||||
|
+
|
||||||
|
+ - Picking a default configuration is then a matter of selecting the
|
||||||
|
+ closest existing configuration from the database.
|
||||||
|
+
|
||||||
|
+ - If the stored configuration is a subset of the existing,
|
||||||
|
+ then use that - then pick the best mode available for the
|
||||||
|
+ rest of the monitors
|
||||||
|
+
|
||||||
|
+ - If the stored configuration is a superset of the existing,
|
||||||
|
+ then use the projection of the configuration onto the monitors.
|
||||||
|
+
|
||||||
|
+ - Pick the configuration with the most overlap in monitors.
|
||||||
|
+ Although, if a configuration differs only in what outputs
|
||||||
|
+ they are connected to, then those outputs should probably
|
||||||
|
+ get their original modes set.
|
||||||
|
+
|
||||||
|
+ - Or maybe simply:
|
||||||
|
+
|
||||||
|
+ - If there is an exact match, use it, if not, pick a default.
|
||||||
|
+
|
||||||
|
+ - Picking a new default must never change the mode of any existing
|
||||||
|
+ output.
|
||||||
|
+
|
||||||
|
+******************* Capplet
|
||||||
|
+
|
||||||
|
+Somehow the applet will find out that a new monitor is plugged in
|
||||||
|
+(either through notification, or through a refresh button). When this
|
||||||
|
+happens, this monitor is looked up in a database and if it is found,
|
||||||
|
+some suitable mode is set.
|
||||||
|
+
|
||||||
|
+Restrictions on the modes:
|
||||||
|
+
|
||||||
|
+- Monitors that are already plugged in should not get their mode
|
||||||
|
+ changed just because a new monitor is plugged in.
|
||||||
|
+
|
||||||
|
+- If the exact configuration of monitors is known, and all the old
|
||||||
|
+ monitors have the same mode as the known configuration, then just use
|
||||||
|
+ the known configuration. Also do this, if the configuration is a
|
||||||
|
+ subset of something known.
|
||||||
|
+
|
||||||
|
+- Otherwise, if the configuration is a subset of a known configuration
|
||||||
|
+ where the only difference is that existing monitors have different
|
||||||
|
+ modes, then try and convert that mode to something we can know
|
||||||
|
+ about. Maybe configurations should be stored in terms of edges that
|
||||||
|
+ line up.
|
||||||
|
+
|
||||||
|
+- Otherwise, just pick some good default for the mode, probably based
|
||||||
|
+ on the EDID prferred mode if possible. By default cloning is
|
||||||
|
+ probably best.
|
||||||
|
+
|
||||||
|
+- How do virtual desktops interact with this?
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+g-s-d:
|
||||||
|
+
|
||||||
|
+- On startup
|
||||||
|
+
|
||||||
|
+ - It reads the configuration file into memory
|
||||||
|
+
|
||||||
|
+ capplet --configure
|
||||||
|
+
|
||||||
|
+ - It gathers the existing configuration from randr
|
||||||
|
+
|
||||||
|
+ - If the existing config is in the file, set that mode
|
||||||
|
+
|
||||||
|
+- On changes, including changes to the config file [this is crack]
|
||||||
|
+
|
||||||
|
+ - Reread configuration file
|
||||||
|
+
|
||||||
|
+ - Compare new configuration to database, if it is there, set the
|
||||||
|
+ mode as appropriate
|
||||||
|
+
|
||||||
|
+ - If a monitor was added, pop up a bubble
|
||||||
|
+
|
||||||
|
+ capplet --show-bubble
|
||||||
|
+
|
||||||
|
+ capplet --set-mode
|
||||||
|
+
|
||||||
|
+capplet
|
||||||
|
+
|
||||||
|
+- On changes
|
||||||
|
+
|
||||||
|
+ - Update GUI
|
||||||
|
+
|
||||||
|
+- When user changes something,
|
||||||
|
+
|
||||||
|
+ - Write configuration to file
|
||||||
|
+
|
||||||
|
+ - Signal gsd somehow
|
||||||
|
+
|
||||||
|
+Schemes:
|
||||||
|
+ - configuration file changes
|
||||||
|
+ - randr code will have to be shared between gcc and gsd
|
||||||
|
+
|
||||||
|
+ - binary installed by gcc
|
||||||
|
+ - something will still have to listen for changes to pop
|
||||||
|
+ up the notification bubble.
|
||||||
|
+
|
||||||
|
+Structure of capplet:
|
||||||
|
+
|
||||||
|
+- There is a database on disk with monitors and their corresponding
|
||||||
|
+ settings.
|
||||||
|
+
|
||||||
|
+- On startup, this database is read into memory. When the user accepts
|
||||||
|
+ new settings, it is written back to disk.
|
||||||
|
+
|
||||||
|
+- When something changes about the settings
|
||||||
|
+
|
||||||
|
+ - If new configuration is in the database, use that mode
|
||||||
|
+
|
||||||
|
+ - Else, find all outputs that are now connected but weren't before,
|
||||||
|
+ and set a default mode for them.
|
||||||
|
+
|
||||||
|
+ - If GUI is running, update graphics.
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+ - Notification thing:
|
||||||
|
+ - if
|
||||||
|
+
|
||||||
|
+ - if the new configuration is found in the database, use it
|
||||||
|
+
|
||||||
|
+ and added if they are not already there. Initial settings are
|
||||||
|
+ 1 what the output is already doing, if anything
|
||||||
|
+ 2 based on an existing sufficiently similar monitor, if possible
|
||||||
|
+ 3 some reasonable default.
|
||||||
|
+
|
||||||
|
+- When the user changes settings in the GUI, the corresponding monitor
|
||||||
|
+ in the database is updated.
|
||||||
|
+
|
||||||
|
+- Whenever the GUI settings change, for all displayed monitors the
|
||||||
|
+ possible modes are recomputed.
|
||||||
|
+
|
||||||
|
+- Whenever a new monitor is selected in the GUI, it first gets all its
|
||||||
|
+ possible modes computed based on the selections on other
|
||||||
|
+ outputs. Then, if the possible modes include the existing choice of
|
||||||
|
+ resolution, that is selected.
|
||||||
|
+
|
||||||
|
+ Actually,
|
||||||
|
+
|
||||||
|
+ - initially, the settings are copied from the current settings
|
||||||
|
+
|
||||||
|
+ - whenever a gui setting changes for a monitor, all the other
|
||||||
|
+ monitors get their list of choices set to whatever is possible
|
||||||
|
+ given the chocie for the current monitor. A 'desired mode' is
|
||||||
|
+ maintained, and the closest choice to that is displayed. Whenever
|
||||||
|
+ the user actively selects something, that becomes the desired mode
|
||||||
|
+ for that monitor.
|
||||||
|
+
|
||||||
|
+- Required
|
||||||
|
+
|
||||||
|
+ - Generate all outputs that are newly connected
|
||||||
|
+
|
||||||
|
+ foreach_newly_connected (Configuration *before, Configuration *after,
|
||||||
|
+ OutputFunc);
|
||||||
|
+
|
||||||
|
+ - A way to generate the best mode for a connected output
|
||||||
|
+
|
||||||
|
+ existing best_mode() can probably be used
|
||||||
|
+
|
||||||
|
+ - Given a list of modes, pick the one closest to a given mode.
|
||||||
|
+
|
||||||
|
+ (a possibility here is: pick an exact match, if that's impossible, then
|
||||||
|
+ pick the best one with the same width/height, if that's impossible, then
|
||||||
|
+ just pick the best mode on the list).
|
||||||
|
+
|
||||||
|
+ - For a configuation, fix the mode for a subset of the outputs, then list the
|
||||||
|
+ combinations for the rest of the outputs.
|
||||||
|
+
|
||||||
|
+ An obvious possibility here is to simply list all possibilities, then
|
||||||
|
+ weed out those that don't work. Is this too expensive? It might be.
|
||||||
|
+
|
||||||
|
+Structure of login time program:
|
||||||
|
+
|
||||||
|
+- The configuration database is read
|
||||||
|
+
|
||||||
|
+- The current hardware configuration is generated
|
||||||
|
+
|
||||||
|
+- If the current configuration is found in the database, that mode is set.
|
||||||
|
+
|
||||||
|
+- If it isn't found, then nothing changes.
|
||||||
|
+
|
||||||
|
+ This could just be gnome-screen-resolution-capplet --reset
|
||||||
|
+
|
||||||
|
+******************* Things that need to be done to the xrandr.patch:
|
||||||
|
+
|
||||||
|
+===
|
||||||
|
+
|
||||||
|
+XRRGetScreenResources() is a roundtrip and very slow (~0.5 s). GTK+
|
||||||
|
+needs to keep information up-to-date by tracking events rather than
|
||||||
|
+calling this function. In fact we probably can't call it at all unless
|
||||||
|
+its performance improves significantly.
|
||||||
|
+
|
||||||
|
+If EDID processing really has to be this slow, and we can't get
|
||||||
|
+interrupts when monitors are plugged in, then we have a problem,
|
||||||
|
+because we can't do anything this expensive once per second.
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+Detailed notes (but most of the patch should be rewritten):
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+=== FIXME in gdkscreen-x11.c in get_width_mm()
|
||||||
|
+
|
||||||
|
+/* monitor pixel width / screen pixel width * screen_physical width */
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+=== Check for 1.2 library
|
||||||
|
+
|
||||||
|
+The patch should check that the 1.2 version of the XRandR library is
|
||||||
|
+available before using the functions. A possibility is to not use any
|
||||||
|
+RandR unless 1.2 is available, another is to conditionalize the code.
|
||||||
|
+
|
||||||
|
+The most sane thing is probably to just require 1.2.
|
||||||
|
+
|
||||||
|
+On the other hand, installing a newer gtk+ on a system with older X is
|
||||||
|
+probably not that unusual, so maybe it's better to do the full 1.0,
|
||||||
|
+vs. 1.1 vs 1.2 check.
|
||||||
|
+
|
||||||
|
+For now it just requires 1.2.
|
||||||
|
+
|
||||||
|
+Actually, this might be fine because the only place where we make use
|
||||||
|
+of a 1.1 library is in the _gdk_x11_screen_size_changed() function,
|
||||||
|
+but there we have a fallback that just updates the variables in the
|
||||||
|
+Screen struct itself.
|
||||||
|
+
|
||||||
|
+So, only defining HAVE_RANDR if we detect 1.2 should be ok.
|
||||||
|
+
|
||||||
|
+=== Monitor information available
|
||||||
|
+
|
||||||
|
+- Subpixel information. This should be set automatically for the fonts and
|
||||||
|
+ store under the name of the monitor. If the user changes the font
|
||||||
|
+ configuration, that change should also be stored under the monitor name.
|
||||||
|
+
|
||||||
|
+- When a monitor we don't know about is plugged in, a configuration should
|
||||||
|
+ be generated:
|
||||||
|
+
|
||||||
|
+ - Screen size, computed based on the location of the screens
|
||||||
|
+
|
||||||
|
+ - RGBA information
|
||||||
|
+
|
||||||
|
+ - Whether the screen has a panel on it
|
||||||
|
+
|
||||||
|
+ - If there is a conflict between stored information and EDID,
|
||||||
|
+ the stored information wins
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+New API so far:
|
||||||
|
+
|
||||||
|
+(* monitors_changed) signal
|
||||||
|
+gdk_screen_get_monitor_width_mm()
|
||||||
|
+gdk_screen_get_monitor_height_mm()
|
||||||
|
+gdk_screen_get_monitor_name() => Note this is the output (eg. "DVI-0")
|
||||||
|
+
|
||||||
|
+We should probably also have
|
||||||
|
+get_manufacturer()
|
||||||
|
+get_serial()
|
||||||
|
+get_resolutions()
|
||||||
|
+
|
||||||
|
+etc.
|
||||||
|
+
|
||||||
|
+Should there be a GdkMonitor object that would correspond to an
|
||||||
|
+output? Or maybe GdkOutput?
|
||||||
|
+
|
||||||
|
+screen_list_monitors()
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+*************************** Issues XRandR/Xserver
|
||||||
|
+
|
||||||
|
+- We need polling in the X server, whenever something changes, X must
|
||||||
|
+ recompute the information and cache it, then send an event. Note the
|
||||||
|
+ situation where the user disconnects and reconnects a monitor within
|
||||||
|
+ the polling interval. The event could missed in that case since the polling
|
||||||
|
+ cannot do a full EDID query. Difficult to see a way around this.
|
||||||
|
+
|
||||||
|
+ Actually, DDC allows random access, so it should be possible to just
|
||||||
|
+ read theq vendor id and manufacturer codes. This can be done once a
|
||||||
|
+ second without a problem. The polling should be turned off in power
|
||||||
|
+ saving mode anyway.
|
||||||
|
+
|
||||||
|
+ - Driver work:
|
||||||
|
+
|
||||||
|
+ - Intel driver:
|
||||||
|
+
|
||||||
|
+ - EDID information is not reported for VGA when the output is not
|
||||||
|
+ turned on (i945 laptop).
|
||||||
|
+
|
||||||
|
+ - Screen size must be dynamically changable. (No xorg.conf changes
|
||||||
|
+ should be required).
|
||||||
|
+
|
||||||
|
+ - Make use of ACPI information when possible.
|
||||||
|
+
|
||||||
|
+ Adam has code on his freedesktop page.
|
||||||
|
+
|
||||||
|
+ - i830 laptop can be put in a state where XRandr reports that no
|
||||||
|
+ outputs are connected to a CRTC, but the panel is on.
|
||||||
|
+
|
||||||
|
+ - Plug in VGA
|
||||||
|
+ - xrandr --auto
|
||||||
|
+ - xrandr --output VGA --off
|
||||||
|
+ - run chk
|
||||||
|
+ - xrandr --verbose will now not report any outputs as turned on
|
||||||
|
+ - run chk again - all screens will be turned off
|
||||||
|
+
|
||||||
|
+ - Small Sun monitor - an 1152x921 mode is generated, but the
|
||||||
|
+ monitor doesn't handle that. The monitor itself only claims to
|
||||||
|
+ handle 1152x920. It doesn't look to me like there is anything
|
||||||
|
+ in the EDID information that would indicate that it could handle
|
||||||
|
+ 1152x921.
|
||||||
|
+
|
||||||
|
+ This happens with a radeon as wellso it may be a bug in the
|
||||||
|
+ generic X server EDID parsing. The X server apparently
|
||||||
|
+ interpretes the standard timing 1152x920 as 1152x921.
|
||||||
|
+
|
||||||
|
+ This happens because the X server uses
|
||||||
|
+
|
||||||
|
+ hsize * 4 / 5
|
||||||
|
+
|
||||||
|
+ which gives 921 for 1152. By using
|
||||||
|
+
|
||||||
|
+ (hsize / 5) * 4
|
||||||
|
+
|
||||||
|
+ you get 920. The 66 Hz version can bet set, the 76 Hz mode gets
|
||||||
|
+ sync out of range. (Would be interesting to find out whether the
|
||||||
|
+ 1152x920 ModeLine would allow the 76 Hz version to be set).
|
||||||
|
+
|
||||||
|
+ This is for the ATI driver as shipped in F8:
|
||||||
|
+
|
||||||
|
+ - XRRGetScreenResources() takes half a second.
|
||||||
|
+
|
||||||
|
+ - Adam has now removed a workaround that caused some of the slowdown.
|
||||||
|
+
|
||||||
|
+ - If a DVI monitor is disconnected, you get "Unknown" for connection
|
||||||
|
+ status.
|
||||||
|
+
|
||||||
|
+ - If a VGA monitor is plugged in, then EDID information is not
|
||||||
|
+ available, even after running xrandr --verbose. The monitor has
|
||||||
|
+ to be plugged in at driver startup time, apparently.
|
||||||
|
+
|
||||||
|
+ - Logging out and logging back in often results in some random mode being
|
||||||
|
+ set. We need mode selection to not be completely screwed up.
|
||||||
|
+ Currently it is.
|
||||||
|
+
|
||||||
|
+ - The set up at server startup needs to be fixed. *If* randr actually works,
|
||||||
|
+ then we might be able to do something sensible.
|
||||||
|
+
|
||||||
|
+ - We need to revisit the idea that many monitors have broken EDID data.
|
||||||
|
+ This may be less widespread than previously believed.
|
||||||
|
+
|
||||||
|
+- It may be useful to return the connector names as identifiers instead
|
||||||
|
+ of relying on UTF-8 strings. Ie., have an enum
|
||||||
|
+
|
||||||
|
+ { UNKNOWN, OTHER, DVI, VGA, HDMI, ..., }
|
||||||
|
+
|
||||||
|
+ in addition to the string. The difference between UNKNOWN and OTHER is that
|
||||||
|
+ UNKNOWN means the driver doesn't know, whereas OTHER means it is something
|
||||||
|
+ not listed in the enum (which could be listed in a later version).
|
||||||
|
+
|
||||||
|
+- Mouse cursor should be confined to the visible area. (It is already, I think)
|
||||||
|
+
|
||||||
|
+- It looks like EDID information is only available for one output
|
||||||
|
+ even though it is actually read according to the log file.
|
||||||
|
+ (nv, intel drivers)
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+*********************************
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+DONE:
|
||||||
|
+
|
||||||
|
+Server work:
|
||||||
|
+
|
||||||
|
+ - i830 laptop incorrectly reports BadMatch when you configure the
|
||||||
|
+ CRTC to drive both VGA and LVDS with the 1024x768 mode that both
|
||||||
|
+ outputs can handle. (It should return 'failed' if it can't do
|
||||||
|
+ that). Same for i945 laptop. It seems as if the same CRTC can't
|
||||||
|
+ drive more than one output at the same time on Intel.
|
||||||
|
+
|
||||||
|
+ This was a client bug, but the documentation for SetCrtcConfig
|
||||||
|
+ should say that BadMatch will be returned if the outputs aren't
|
||||||
|
+ clones.
|
||||||
|
+
|
||||||
|
+GTK+ patch is in now.
|
||||||
|
+
|
||||||
|
+=== Add helper function
|
||||||
|
+
|
||||||
|
+
|
||||||
|
++ if (screen_x11->randr12)
|
||||||
|
++ {
|
||||||
|
++ XRRScreenResources *sr;
|
||||||
|
++ XRROutputInfo *output;
|
||||||
|
++ gchar *retval;
|
||||||
|
++
|
||||||
|
++ sr = XRRGetScreenResources ( screen_x11->xdisplay,
|
||||||
|
++ screen_x11->xroot_window );
|
||||||
|
++
|
||||||
|
++ output = XRRGetOutputInfo ( screen_x11->xdisplay,
|
||||||
|
++ sr,
|
||||||
|
++ (RROutput)screen_x11->act_outputs[monitor_num]
|
||||||
|
+);
|
||||||
|
+
|
||||||
|
+ Might be worthwhile to factor this out into a
|
||||||
|
+ gdk_screen_get_output_info (screen, monitor_num)
|
||||||
|
+ helper function ?
|
||||||
|
+
|
||||||
|
+Instead of cutting and pasting all over creation
|
||||||
|
+
|
||||||
|
+* Calling XRRGetScreenResources all the time is not going to fly. It
|
||||||
|
+ takes hundreds of milliseconds ... Even if it didn't, it wouldn't
|
||||||
|
+ be acceptable to do all those roundtrips.
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+=== Some g_prints left
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+=== Version check
|
||||||
|
+
|
||||||
|
+Should be (maj > 1) || (maj == 1 && min >= 2)
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+=== Grep for TODO
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+=== Setup XRRSelectInput()
|
||||||
|
+
|
||||||
|
+ You should call XRRSelectInput() at the same place where you are
|
||||||
|
+ calling XSelectInput() right now. The right place to handle the
|
||||||
|
+ XRandr events is the huge switch in gdkevents-x11.c:gdk_event_translate
|
||||||
|
+ Check out how other extension events are handled there, like
|
||||||
|
+ XKB, or XFixes.
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+=== Lots of variable naming issues, such as act_output and noutput
|
||||||
|
+
|
||||||
|
+=== Needs to select the input, and hook it up to the signal
|
||||||
|
+
|
||||||
|
+=== Add version markers to API
|
||||||
|
+
|
||||||
|
+=== API to turn monitors on and off?
|
||||||
|
+
|
||||||
|
+- DPMS not exposed through randr, maybe should be
|
||||||
|
+
|
||||||
|
+ - DPMS is presumably a property of either an
|
||||||
|
+ output or a CRTC. Logically it's an output.
|
||||||
|
+
|
||||||
|
+- Need events when DPMS happens. Exposing the "screen saving on" on
|
||||||
|
+ dbus may not be good enough.
|
||||||
|
+
|
||||||
|
+=== Why does init_multihead_support() start by freeing monitors and
|
||||||
|
+outputs?
|
||||||
|
+
|
||||||
|
+=== Do we disable Xinerama support entirely when 1.2 is in use?
|
||||||
|
+
|
||||||
|
+=== We should expose information about what parts of the screen monitors
|
||||||
|
+are viewing.
|
||||||
|
+
|
||||||
|
+=== Make use of the EDID information?
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+-- details for X server --
|
||||||
|
+
|
||||||
|
+In nv driver SorSetOutputProperty should return TRUE for unknown
|
||||||
|
+properties. (Like the Intel driver does).
|
||||||
|
+
|
||||||
|
+Detecting plugged in
|
||||||
|
+
|
||||||
|
+- Periodically poll
|
||||||
|
+ -
|
||||||
|
+
|
||||||
|
+ - One ddc probe takes 5 ms, according to a comment in the intel
|
||||||
|
+ driver. Running this twice a second would mean spending 1% of
|
||||||
|
+ overall time doing ddc polling, which is almost certainly not
|
||||||
|
+ acceptable.
|
||||||
|
+
|
||||||
|
+ 1) Async I2C:
|
||||||
|
+
|
||||||
|
+ void I2CProbeAsync(..., callback, data);
|
||||||
|
+ Bool I2CPending()
|
||||||
|
+ void I2CUpdate()
|
||||||
|
+
|
||||||
|
+ In Dispatch, call I2CUpdate()
|
||||||
|
+ Before going idle, do
|
||||||
|
+
|
||||||
|
+ while (I2CPending())
|
||||||
|
+ I2CUpdate()
|
||||||
|
+
|
||||||
|
+ Would need
|
||||||
|
+ RegisterDispatchFunction() (Is this called Wakeup?)
|
||||||
|
+ RegisterIdleFunction()
|
||||||
|
+
|
||||||
|
+ Note the idle function should have the option of saying:
|
||||||
|
+ "check if something else happened; if not, call me again" and
|
||||||
|
+ "ok, I'm done - go idle". Otherwise, we would be blocking for
|
||||||
|
+ 5 ms whenever the X server went idle. So actually the idle
|
||||||
|
+ function should be
|
||||||
|
+
|
||||||
|
+ if (I2CPending())
|
||||||
|
+ {
|
||||||
|
+ I2CUpdate();
|
||||||
|
+ return TRUE; /* call me again */
|
||||||
|
+ }
|
||||||
|
+ else
|
||||||
|
+ {
|
||||||
|
+ return FALSE; /* I'm done */
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ What happens if another I2C requests come in while an async one
|
||||||
|
+ is pending? Most likely we simply finish whatever is going on,
|
||||||
|
+ then process the new request.
|
||||||
|
+
|
||||||
|
+ What happens if an X request takes so long that we get timeouts on
|
||||||
|
+ the i2c bus? Good question. Need to read the VESA ddc spec.
|
||||||
|
+
|
||||||
|
+ 2) Run the polling in a separate thread.
|
||||||
|
+
|
||||||
|
+ Probably crack.
|
||||||
|
+
|
||||||
|
+ 3) Run the polling less, maybe once every three seconds.
|
||||||
|
+
|
||||||
|
+-- details for control panel --
|
||||||
|
+Screen changes
|
||||||
|
+ - Currently it is polling via rw_screen_refresh(), which will always emit
|
||||||
|
+ a screen-changed event. In reponse to this event the capplet currently
|
||||||
|
+ checks whether anything changed physically about the setup. This means
|
||||||
|
+ the capplet can't react to external changes to modes. On the other hand
|
||||||
|
+ if it didn't
|
||||||
|
+Disallow combinations that would exceed the screen ranges.
|
||||||
|
+ - Note rotations
|
||||||
|
+
|
||||||
|
+Give rw objects stable positions in memory so that they can be cached
|
||||||
|
+across screen_changed events.
|
||||||
|
+
|
||||||
|
+Add Clone Mode
|
||||||
|
+
|
||||||
|
+Drag and drop for the monitors
|
||||||
|
+ - 2 dimensional layout
|
||||||
|
+
|
||||||
|
+Store make and model in monitors.xml, then if serial numbers don't
|
||||||
|
+match, fall back to a make and model match. Users with an nfs mounted
|
||||||
|
+home directory should not have to reconfigure for each new system they
|
||||||
|
+log in to.
|
||||||
|
+
|
||||||
|
+Make sure text is scaled correctly
|
||||||
|
+
|
||||||
|
+Need to sanitize naming
|
||||||
|
+ RWOutput vs Output - should probably be OutputInfo
|
||||||
|
+ rate vs. freq - decide on one
|
||||||
|
+
|
||||||
|
+Should probably reconsider the use of null terminated arrays.
|
||||||
|
+Maybe lists would be better.
|
||||||
|
+
|
||||||
|
+Pick a fixed scale, so that two 1024x768 don't look like two 6x4.
|
||||||
|
+ - An alternative would be to draw a checkerboard pattern
|
||||||
|
+ below the monitors.
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+
|
||||||
|
+done:
|
||||||
|
+
|
||||||
|
+Add rotation
|
||||||
|
+
|
||||||
|
+Disable panel checkbox for now
|
||||||
|
+
|
||||||
|
+Patch into gnome-desktop
|
||||||
|
+
|
||||||
|
+Find out how to share code between gcc and gsd
|
||||||
|
+
|
||||||
|
+Make it assign coordinates correctly
|
||||||
|
+ - including computing correct screen size
|
||||||
|
+
|
||||||
diff --git a/capplets/display/build.sh b/capplets/display/build.sh
|
diff --git a/capplets/display/build.sh b/capplets/display/build.sh
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000..4268ab7
|
index 0000000..4268ab7
|
||||||
@ -778,10 +1599,28 @@ index 0000000..59d9261
|
|||||||
+
|
+
|
||||||
diff --git a/capplets/display/scrollarea.c b/capplets/display/scrollarea.c
|
diff --git a/capplets/display/scrollarea.c b/capplets/display/scrollarea.c
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000..5368373
|
index 0000000..3d3d8b6
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/capplets/display/scrollarea.c
|
+++ b/capplets/display/scrollarea.c
|
||||||
@@ -0,0 +1,1902 @@
|
@@ -0,0 +1,1920 @@
|
||||||
|
+/* Copyright 2006, 2007, 2008, Soren Sandmann <sandmann@daimi.au.dk>
|
||||||
|
+ *
|
||||||
|
+ * This library is free software; you can redistribute it and/or
|
||||||
|
+ * modify it under the terms of the GNU Lesser General Public
|
||||||
|
+ * License as published by the Free Software Foundation; either
|
||||||
|
+ * version 2 of the License, or (at your option) any later version.
|
||||||
|
+ *
|
||||||
|
+ * This library 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
|
||||||
|
+ * Lesser General Public License for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU Lesser General Public
|
||||||
|
+ * License along with this library; if not, write to the
|
||||||
|
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
+ * Boston, MA 02111-1307, USA.
|
||||||
|
+ */
|
||||||
|
+
|
||||||
+#include <gdk/gdkprivate.h> /* For GDK_PARENT_RELATIVE_BG */
|
+#include <gdk/gdkprivate.h> /* For GDK_PARENT_RELATIVE_BG */
|
||||||
+#include "scrollarea.h"
|
+#include "scrollarea.h"
|
||||||
+#include "foo-marshal.h"
|
+#include "foo-marshal.h"
|
||||||
@ -2686,10 +3525,27 @@ index 0000000..5368373
|
|||||||
+#endif
|
+#endif
|
||||||
diff --git a/capplets/display/scrollarea.h b/capplets/display/scrollarea.h
|
diff --git a/capplets/display/scrollarea.h b/capplets/display/scrollarea.h
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000..22abc6c
|
index 0000000..f043aab
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/capplets/display/scrollarea.h
|
+++ b/capplets/display/scrollarea.h
|
||||||
@@ -0,0 +1,107 @@
|
@@ -0,0 +1,124 @@
|
||||||
|
+/* Copyright 2006, 2007, 2008, Soren Sandmann <sandmann@daimi.au.dk>
|
||||||
|
+ *
|
||||||
|
+ * This library is free software; you can redistribute it and/or
|
||||||
|
+ * modify it under the terms of the GNU Lesser General Public
|
||||||
|
+ * License as published by the Free Software Foundation; either
|
||||||
|
+ * version 2 of the License, or (at your option) any later version.
|
||||||
|
+ *
|
||||||
|
+ * This library 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
|
||||||
|
+ * Lesser General Public License for more details.
|
||||||
|
+ *
|
||||||
|
+ * You should have received a copy of the GNU Lesser General Public
|
||||||
|
+ * License along with this library; if not, write to the
|
||||||
|
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
||||||
|
+ * Boston, MA 02111-1307, USA.
|
||||||
|
+ */
|
||||||
+#include <cairo/cairo.h>
|
+#include <cairo/cairo.h>
|
||||||
+#include <gtk/gtk.h>
|
+#include <gtk/gtk.h>
|
||||||
+
|
+
|
||||||
@ -2799,10 +3655,10 @@ index 0000000..22abc6c
|
|||||||
+void foo_scroll_area_end_auto_scroll (FooScrollArea *scroll_area);
|
+void foo_scroll_area_end_auto_scroll (FooScrollArea *scroll_area);
|
||||||
diff --git a/capplets/display/xrandr-capplet.c b/capplets/display/xrandr-capplet.c
|
diff --git a/capplets/display/xrandr-capplet.c b/capplets/display/xrandr-capplet.c
|
||||||
new file mode 100644
|
new file mode 100644
|
||||||
index 0000000..e56b9c5
|
index 0000000..c003b2d
|
||||||
--- /dev/null
|
--- /dev/null
|
||||||
+++ b/capplets/display/xrandr-capplet.c
|
+++ b/capplets/display/xrandr-capplet.c
|
||||||
@@ -0,0 +1,1624 @@
|
@@ -0,0 +1,1676 @@
|
||||||
+/* Monitor Settings. A preference panel for configuring monitors
|
+/* Monitor Settings. A preference panel for configuring monitors
|
||||||
+ *
|
+ *
|
||||||
+ * Copyright (C) 2007, 2008 Red Hat, Inc.
|
+ * Copyright (C) 2007, 2008 Red Hat, Inc.
|
||||||
@ -2829,7 +3685,7 @@ index 0000000..e56b9c5
|
|||||||
+#include <string.h>
|
+#include <string.h>
|
||||||
+#include <stdlib.h>
|
+#include <stdlib.h>
|
||||||
+#include "scrollarea.h"
|
+#include "scrollarea.h"
|
||||||
+#define I_KNOW_THIS_IS_UNSTABLE_AND_ONLY_IN_FEDORA
|
+#define GNOME_DESKTOP_USE_UNSTABLE_API
|
||||||
+#include <libgnomeui/randrwrap.h>
|
+#include <libgnomeui/randrwrap.h>
|
||||||
+#include <libgnomeui/monitor-db.h>
|
+#include <libgnomeui/monitor-db.h>
|
||||||
+#include <gdk/gdkx.h>
|
+#include <gdk/gdkx.h>
|
||||||
@ -4273,12 +5129,64 @@ index 0000000..e56b9c5
|
|||||||
+}
|
+}
|
||||||
+
|
+
|
||||||
+static void
|
+static void
|
||||||
|
+compute_virtual_size_for_configuration (Configuration *config, int *ret_width, int *ret_height)
|
||||||
|
+{
|
||||||
|
+ int i;
|
||||||
|
+ int width, height;
|
||||||
|
+
|
||||||
|
+ width = height = 0;
|
||||||
|
+
|
||||||
|
+ for (i = 0; config->outputs[i] != NULL; i++)
|
||||||
|
+ {
|
||||||
|
+ Output *output;
|
||||||
|
+
|
||||||
|
+ output = config->outputs[i];
|
||||||
|
+
|
||||||
|
+ if (output->on)
|
||||||
|
+ {
|
||||||
|
+ width = MAX (width, output->x + output->width);
|
||||||
|
+ height = MAX (height, output->y + output->height);
|
||||||
|
+ }
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ *ret_width = width;
|
||||||
|
+ *ret_height = height;
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
|
+check_required_virtual_size (App *app)
|
||||||
|
+{
|
||||||
|
+ int req_width, req_height;
|
||||||
|
+ int min_width, max_width;
|
||||||
|
+ int min_height, max_height;
|
||||||
|
+
|
||||||
|
+ compute_virtual_size_for_configuration (app->current_configuration, &req_width, &req_height);
|
||||||
|
+
|
||||||
|
+ rw_screen_get_ranges (app->screen, &min_width, &max_width, &min_height, &max_height);
|
||||||
|
+
|
||||||
|
+ g_print ("X Server supports:\n");
|
||||||
|
+ g_print ("min_width = %d, max_width = %d\n", min_width, max_width);
|
||||||
|
+ g_print ("min_height = %d, max_height = %d\n", min_height, max_height);
|
||||||
|
+
|
||||||
|
+ g_print ("Requesting size of %dx%d\n", req_width, req_height);
|
||||||
|
+
|
||||||
|
+ if (!(min_width <= req_width && req_width <= max_width
|
||||||
|
+ && min_height <= req_height && req_height <= max_height))
|
||||||
|
+ {
|
||||||
|
+ /* FIXME: present a useful dialog, maybe even before the user tries to Apply */
|
||||||
|
+ g_print ("Your X server needs a larger Virtual size!\n");
|
||||||
|
+ }
|
||||||
|
+}
|
||||||
|
+
|
||||||
|
+static void
|
||||||
+apply (App *app)
|
+apply (App *app)
|
||||||
+{
|
+{
|
||||||
+ GError *err = NULL;
|
+ GError *err = NULL;
|
||||||
+
|
+
|
||||||
+ configuration_sanitize (app->current_configuration);
|
+ configuration_sanitize (app->current_configuration);
|
||||||
+
|
+
|
||||||
|
+ check_required_virtual_size (app);
|
||||||
|
+
|
||||||
+ foo_scroll_area_invalidate (FOO_SCROLL_AREA (app->area));
|
+ foo_scroll_area_invalidate (FOO_SCROLL_AREA (app->area));
|
||||||
+
|
+
|
||||||
+ if (configuration_save (app->current_configuration, &err))
|
+ if (configuration_save (app->current_configuration, &err))
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Thu May 29 20:40:32 CEST 2008 - federico@novell.com
|
||||||
|
|
||||||
|
- Updated gnome-control-center-randr-1.2.diff with the latest fixes from upstream.
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Tue May 13 11:08:27 CEST 2008 - vuntz@suse.de
|
Tue May 13 11:08:27 CEST 2008 - vuntz@suse.de
|
||||||
|
|
||||||
|
@ -19,7 +19,7 @@ Group: System/GUI/GNOME
|
|||||||
Obsoletes: fontilus themus acme
|
Obsoletes: fontilus themus acme
|
||||||
Provides: fontilus themus acme
|
Provides: fontilus themus acme
|
||||||
Version: 2.22.1
|
Version: 2.22.1
|
||||||
Release: 19
|
Release: 27
|
||||||
Summary: The GNOME Control Center
|
Summary: The GNOME Control Center
|
||||||
Source: gnome-%{_name}-%{version}.tar.bz2
|
Source: gnome-%{_name}-%{version}.tar.bz2
|
||||||
Source1: control-center-art.tar.bz2
|
Source1: control-center-art.tar.bz2
|
||||||
@ -227,6 +227,8 @@ fi
|
|||||||
%{_libdir}/pkgconfig/*.pc
|
%{_libdir}/pkgconfig/*.pc
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Thu May 29 2008 federico@novell.com
|
||||||
|
- Updated gnome-control-center-randr-1.2.diff with the latest fixes from upstream.
|
||||||
* Tue May 13 2008 vuntz@suse.de
|
* Tue May 13 2008 vuntz@suse.de
|
||||||
- Add gnome-control-center-bnc373197-layout-switch-keybinding.patch
|
- Add gnome-control-center-bnc373197-layout-switch-keybinding.patch
|
||||||
to change the default keyboard layout switching to
|
to change the default keyboard layout switching to
|
||||||
|
Loading…
x
Reference in New Issue
Block a user