./ 0000755 0000041 0000041 00000000000 13241553627 011253 5 ustar www-data www-data ./man/ 0000755 0000041 0000041 00000000000 13241553602 012017 5 ustar www-data www-data ./man/unity-control-center.xml 0000644 0000041 0000041 00000033647 13241553602 016662 0 ustar www-data www-data
unity-control-centerUbuntuMaintainerBastienNocerahadess@hadess.netunity-control-center1User Commandsunity-control-centerConfigure Unity settingsunity-control-center OPTIONPANELARGDescriptionunity-control-center is a graphical
user interface to configure various aspects of Unity.When run without arguments, the shell displays the
overview, which shows all available
configuration panels. The overview allows to open individual
panels by clicking on them. It also has a search entry
to find panels by searching keywords.It is also possible to specify a panel name
as commandline argument to go directly to that panel.
Individual panels may accept further arguments to specify
which tab to open (for multi-tabbed panels) or which
item to display (for panels with lists).Note that unity-control-center
is not meant to expose each and every setting that is
available. The settings that can be found here represent
what is considered useful and commonly needed options.
For more exotic or uncommon options, you can look at
gnome-tweak-tool or the
gsettings commandline utility.PanelsThe following panel names can be specified:The background panel lets you
set your desktop background.The bluetooth panel lets you
configure your computer's Bluetooth adapter,
and pair the computer with Bluetooth keyboards,
phones, etc.The color panel can calibrate
monitors, web cams and printers for accurate
color reproduction.The datetime panel lets you
set the timezone and time format.Some operations in this panel
affect all user accounts on the computer
and require privieges.The display panel configures
the resolution and arrangement of monitors
and laptop panels. Note that monitors can be
rearranged by drag-and-drop, and you can change
which monitor is your main display by dragging
the black bar.The info panel shows a general
overview of the system configuration. It also
lets you change the default applications for
various tasks and the handling of removable
media.The keyboard panel can
change how the keyboard reacts to key
presses and lets you change keyboard
shortcuts or create custom shortcuts.You can open this panel on a
specific tab by passing
or as extra
argument.The mouse panel can change
how mice and touchpads react to user
input.The network panel provides
a view of available network devices (wired,
wireless or mobile) and their current
configuration. It also provides a way to
create new VPN connections and configure
proxy settings.The online-accounts panel
shows your configured online accounts and
lets you add or remove accounts.The power panel shows
the fill level of batteries and can
configure what happens when the computer
is idle or runs out of battery.The printers panel shows
all known printers and their status. It is
possible to inspect queued print jobs and
add new printers.Some operations in this panel require
privileges.The region panel
contains regional settings such as
the display language, formatting for
times, dates, numbers, and input sources.You can open this panel on a
specific tab by passing
,
,
or
as extra
argument.The screen panel contains
settings that control the screen brightness
and screen lock behavior.The sound panel shows
all known sound devices and their configuration,
including volume and balance settings.You can open this panel on a
specific tab by passing
,
,
,
or
as extra
argument.The universal-access panel
contains settings for accessible technologies
such as the screen reader, magnifier, screen
keyboard and AccessX options.The user-accounts panel
shows all user accounts that exist on the
computer and allows to change them in some
ways, such as changing the user name, password
or permissions. It also allows to create
or remove accounts.Some operations in this panel require
privileges.the wacom panel shows
connected Wacom graphics tablets and lets
you calibrate and configure such devices.Options, Prints a short help
text and exits.Prints the program version
and exits., Enables verbose mode., Opens the overview.Exit statusOn success 0 is returned, a non-zero failure
code otherwise.See Alsogsettings1
./man/Makefile.am 0000644 0000041 0000041 00000001036 13241553602 014053 0 ustar www-data www-data XSLTPROC_FLAGS = \
--nonet \
--stringparam man.output.quietly 1 \
--stringparam funcsynopsis.style ansi \
--stringparam man.th.extra1.suppress 1 \
--stringparam man.authors.section.enabled 0 \
--stringparam man.copyright.section.enabled 0
.xml.1:
$(AM_V_GEN) $(XSLTPROC) $(XSLTPROC_FLAGS) http://docbook.sourceforge.net/release/xsl/current/manpages/docbook.xsl $<
man_MANS = \
unity-control-center.1
xml_files = $(man_MANS:.1=.xml)
EXTRA_DIST = $(xml_files)
DISTCLEANFILES = $(man_MANS)
./NEWS 0000644 0000041 0000041 00000706043 13241553602 011755 0 ustar www-data www-data ==========================
Version 3.6.3 (2012-14-11)
==========================
- Add F1 accelerator to show help
Network:
- Make Airplane mode switch off all the radios, including Bluetooth
Bluetooth:
- Fix the master switch not following the actual adapter state
- Fix the Connection switch being in the wrong state when connecting fails
- Show a spinner when connecting to a device
- Align left hand pane with the "All Settings" button
Online Accounts:
- Don't preselect the first item when adding an account
- Align left hand pane with the "All Settings" button
Keyboard:
- Show more specific help page
Region:
- Fix possible crasher on startup
Background:
- Hide in Unity
Printers:
- Fix renaming printers with recent versions of CUPS
- Show in Unity
===========================
Version 3.6.2 (2012-22-10)
===========================
Background:
- Fix crash when exiting panel too quickly
Network:
- Fix 8021x connections
Screen:
- Avoid accessing destroyed panel
User accounts:
- Complete discover on failure
- Recognize that some kerberos domains cannot be joined
- Remove the realmd version check
- Set timeouts on all realmd interface proxies
- Don't have domains twice in the drop down
- Fix wrong sensitivity of the autologin combo
===========================
Version 3.6.1 (2012-08-10)
===========================
Shell:
- Fix entering the same panel twice
Region & Language:
- Remove the unused "Remove" button
- Reduce the number of required m17n desktop files
- Repopulate the input sources when IBus becomes available again
- Add support for inscript2 and Marathi phonetic input sources
Network:
- Fix arrow direction in RTL languages
- Don't resize the panel or the Wi-Fi list
- Top alogn the back button in the Wi-Fi panel
- Fix parenting problems when spawing a network dialogue
- Don't try to activate out-of-range connections
- Fix WPA Enterprise connections not working
- Use a regular button for "Connect to Hidden Network"
Online Accounts:
- Fix a warning on exit
Background:
- Fix multi-monitor handling
- Use a lighter texture for solid colours
Date & Time:
- Update the current time when we change the timezone
User Accounts:
- Fix the autologin icon not being recoloured
Mouse:
- Fix mouse test area not being in the correct position in some cases
Printers:
- Fix wrong icon being used in the search entry
Sound:
- Fix input level bar direction in RTL languages
===========================
Version 3.6.0 (2012-25-09)
===========================
Shell:
- Fix broken panels when launching the same one twice
Network:
- Make connecting to Enterprise WPA Wi-Fi networks work again
User Accounts:
- Don't ask for the old password when none is set
Region:
- Jump directly to the correct shortcuts section when
following the link
===========================
Version 3.5.92 (2012-17-09)
===========================
- Ensure that all sources are GPLv2+ instead
of a mix of GPLv2+ and GPLv3+
- Set blank window titles for a number of dialogues
- Fix accessible labels for switches
Bluetooth:
- Fix setting up dial-up networking for phones
Display:
- Fix mouse events not working in preview
Background:
- Use a more varied colour palette
- Fix the small size of the "changes throughout the day" emblem
Network:
- Mark all rows representing saved connections as such
- Make the 'Settings...' buttons work properly
- Handle disconnected APs better
- Show a "Connect" button for disconnected APs
- Show 'Last used' item for non-active, in-range access points.
- Improve the Wi-Fi list appearance
User Accounts:
- Use GStreamer 1.0
- Fix "enterpise" typo
Power:
- Fix a wrong use of GCancellable that could lead to crashes
Region:
- Use consistent strings for layout/engine names
- Handle empty layout sources, especially when adding a new one
- Handle input sources in the system tab
- Fix layout problem on the system tab
- Update IBus engines whitelist
Printers:
- Fix building against CUPS 1.6
Universal Access:
- Fix whitespace in the zoom options dialogue
Screen & Brightness:
- Make notification checkbox focusable
Wacom:
- Fix link to docs
===========================
Version 3.5.91 (2012-04-09)
===========================
Printers:
- Redesign the "new printer" dialogue
Date & Time:
- Make map look unsensitive when the panel is locked
Region & Language:
- Add Russian and Egyptian Arabic as common languages
- Don't use IBus in fallback mode
- Honor the 'show-all-sources' setting
- Don't block getting the IBus engines
- Expand the default list of input sources
User Accounts:
- Simplify some drawing code
- Fix login keyring password not getting updated
- Fix match icon not updating in some cases
Mouse:
- New testing area
- Remove italics from test page
- Fix left/right mouse-handedness radio buttons in RTL languages
Common:
- Fix memory leaks in language sorting
- Fix too big editable labels
Info:
- Add PolicyKit rules for hostname setting
- Set related mime types when changing preferred apps
Display:
- Fix possible warning on exit
- Make 'Mirrored Displays' string consistent with GnomeRRLabeler
Network:
- Ignore unrecognised device types
- Fix wired and mobile activations
- Don't try to activate slave connections
===========================
Version 3.5.90 (2012-21-08)
===========================
- Updated translations
Background:
- Implement new design
Mouse:
- Implement new design, including support for natural scroll
Sound:
- Remove hardware page, and offer different connectors directly
from the input and output pages
Keyboard:
- Add common keyboard layout related options to the shortcuts tab
Universal Access:
- Add zoom shader options, and reorganise zoom dialogue
Wacom:
- Add support for "switch monitor" shortcut
Shell:
- Remove animations, they were causing a number of problems,
but were a useful exercise for future developments.
User Accounts:
- UI changes for better remote accounts support
- Fix crash with incompatible versions of realmd
Online Accounts:
- Allow opening a particular account from the command-line
- Avoid spurious "No online accounts configured" overlay
- Fix crash when loading the panel a second time
Network:
- Improve the Wi-Fi page layout
Bluetooth:
- Require a newer version of gnome-bluetooth
==========================
Version 3.5.6 (2012-08-08)
==========================
- Add man page
Display:
- Fix possible error when the preferred mode is only
available on one of the two outputs in mirror mode
Wacom:
- Fix critical warning after calibration
- Only do calibration for the selected tool
Region:
- Make ibus code more robust
- Handle being opened twice gracefully
- Require ibus 1.4.99 if ibus support is requested
User accounts:
- Update for realmd 0.6
- Strip remote D-Bus errors from user-visible messages
- Fix memory leaks
Network:
- Refactoring for mobile broadband support and bug fixes
- Split the wireless panel
- Only show extra details for the active connection
- Add network strength to the details panel
- Only show the disconnect button when a device is fully activated
- Fix crash with Access Points with non UTF-8 names
- Forget the last selected wireless network when the button is clicked
- Improve hotspot dialogue
Printers:
- Add support for CUPS 1.6
- Don't restrict the PPD list to PPDs with DeviceIDs
- Cancel async operations correctly
- Move jobs to a separate dialogue
Brightness & Lock:
- Make "show notifications" available even if we don't lock
the screen automatically
Info:
- Adapt for changed API in PackageKit
- Small UI bug fixes
==========================
Version 3.5.5 (2012-07-16)
==========================
Power and User Accounts:
- Port to use GtkLevelBar
Region:
- Add support for IBus input sources
Printers:
- Allow users to change printer's PPD file
- Add "Options" dialogue with more options than available readily
Sound:
- Move input streams when the default source changes
- Add backend code to track inputs and outputs in PulseAudio 2.0
Network:
- Fix a number of crashers that occurred after the network panel was closed
- Make mobile broadband support usable
- Sort Wi-Fi access points by strength
- Fix VPN information
Brightness & Lock:
- Add a "Show Notifications" setting
Wacom:
- Apply display rotation to devices
- Destroy the display mapping dialogue on unplug
- Show a mark when calibration succeeds
Keyboard:
- Fix a memory leak
- Fix some shortcuts used by the shell not being available for capture
==========================
Version 3.5.4 (2012-06-26)
==========================
Wacom:
- Fix crasher related to display matching (Olivier Fourdan)
==========================
Version 3.5.3 (2012-06-25)
==========================
Shell:
- Fix crash when using keynav in overview
- Don't animate between overview and search pages
- Use GtkSearchEntry
- Crasher fixes
All:
- Use '&' instead of 'and', keeping the names shorter but
also keep the user focused on other words which compose the name
Background:
- Make sure background can get cancelled
- Avoid escaped wallpaper name in the UI
Network:
- Don't crash on hidden SSIDs
- Fix packing order of children in the service dialog
- Add mnemonic for a number of controls
- Sort wireless first
- Make list of Access Points more similar to the shell menu
- Stop buttons jumping when switching between devices
Online Accounts:
- Updated "Add Account" dialogue design
- Improve layout when there are no configured accounts
User accounts:
- Add support for remote Kerberos accounts
Wacom:
- Add keep aspect ratio option
- Cancel calibration if window loses focus
Power:
- Fix reference to "Screen" settings
Info:
- Add software media to "other media" dialogue
- Add title for the "other media" dialog
Brightness & Lock:
- Update slider when changing the brightness via keyboard keys
Sound:
- Add "audio" keyword
- Fix mouse scrolls and clicking behaviour on sliders
- Fix unmuting not working when dragging the event role slider
==========================
Version 3.5.2 (2012-06-04)
==========================
Shell:
- Many layout improvements (Jon McCann)
- Format search results in 3 columns (Jon)
- Animate page switches (Bastien Nocera)
- Add an app menu (Florian Muellner)
User Accounts:
- Make controls insensitive when no user selected (Michael Terry)
- Simplify generated password handling (Matthias Clasen)
- Use libpwquality for password quality checks (Matthias)
Backgrounds:
- Ignore screenshots (Bastien)
- Only show supported image types (Bastien)
Display:
- Translate the rotation drop-down again (Gabor Kelemen)
Info:
- Ignore NFS and removable mounts for disk size (Bastien Nocera)
Network:
- Allow configuring wired network devices when not connected (Richard)
Universal Access:
- Redesign for consistency and smallness (Jon)
Printers:
- Set default media sizes (Marek Kasik)
Region:
- Replace layouts tab with input sources tab (Rui Matos)
Wacom:
- Rename to "Wacom Tablet" (Bastien)
- Update ui on hotplug (Peter Hutterer)
- Disable on s390 and !linux (Bastien)
Translations:
- Arabic
- Brazilian Portuguese
- Catalan
- Crimean Tatar
- Czech
- Dutch
- French
- Galician
- Hebrew
- Italian
- Japanese
- Kannada
- Kazakh
- Norwegian bokmål
- Odia
- Persian
- Polish
- Punjabi
- Russian
- Slovenian
- Spanish
- Swedish
- Traditional Chinese
==========================
Version 3.4.0 (2012-03-26)
==========================
Network:
- Fix a crash by disconnecting idle sources (Richard Hughes)
Printers:
- Fix crash in actualize_printers_list (Marek Kasik)
Translations:
- Assamese (Nilamdyuti Goswami)
- Hindi (Chandan Kumar)
- German (Christian Kirbach)
- Arabic (Khaled Hosny)
- Czech (Marek Černocký)
- Finnish (Jiri Grönroos, Timo Jyrinki)
- Hebrew (Yaron Shahrabani)
- Japanese (Takayuki KUSANO)
- Lithuanian (Aurimas Černius)
- Norwegian bokmål (Kjartan Maraas)
- Odia Translation (ManojKumar Giri)
- Portuguese (Duarte Loreto)
- Telugu Translation (Sasi Bhushan Boddepalli, Praveen Illa)
- Vietnamese (Nguyễn Thái Ngọc Duy)
- Simplified Chinese (Automatic Mirroring)
===========================
Version 3.3.92 (2012-03-19)
===========================
Common:
- Add missing git.mk to two panels (Colin Walters)
Color:
- Do not select the device in the treeview if it changes (Richard Hughes)
- Don't allow the user to add existing profiles to devices (Richard Hughes)
- Prevent a crash when hotplugging monitors when the color panel is open (Richard Hughes)
Date Time:
- Fix broken time setting on 32-bit machines (Bastien Nocera)
Display:
- Simplify add_key() calls and function (Bastien Nocera)
- Sort resolutions by width first (Bastien Nocera)
- Use symbolic name (Bastien Nocera)
Mouse:
- Don't enable two-finger scrolling based on width (Peter Hutterer)
Region:
- Don't make the dialogue overly wide (Bastien Nocera)
- Fix possible crasher with empty layout (Bastien Nocera)
Universal Access:
- Hide zoom options when not in shell (Bastien Nocera)
User Accounts:
- Minimum of 200 width for the users list (Bastien Nocera)
Translations:
- Arabic (Ibrahim Saed, Khaled Hosny, Abderrahim Kitouni)
- Brazilian Portuguese (Enrico Nicoletto)
- British English (Bruce Cowan)
- Bulgarian (Alexander Shopov)
- Catalan (Joan Duran)
- Catalan (Valencian) (Carles Ferrando)
- Danish (Kenneth Nielsen)
- Finnish (Timo Jyrinki)
- French (Bruno Brouard)
- German (Mario Blättermann)
- Gujarati (Sweta Kothari)
- Hungarian (Gabor Kelemen)
- Japanese (Jiro Matsuzawa)
- Korean (Seong-ho, Cho)
- Latvian (Rudolfs Mazurs)
- Malayalam (Sadiq, Praveen Arimbrathodiyil)
- Norwegian bokmål (Kjartan Maraas)
- Persian (Arash Mousavi)
- Punjabi (A S Alam)
- Russian (Yuri Myasoedov)
- Serbian (Мирослав Николић)
- Slovenian (Matej Urbančič)
- Telugu (Praveen Illa)
- Traditional Chinese (Pin-hsien Li)
- Ukranian (Daniel Korostil)
- Vietnamese (Nguyễn Thái Ngọc Duy)
===========================
Version 3.3.91 (2012-03-05)
===========================
Color:
- Layout fixes
- Ensure the "Set profile system-wide" button is visible
Display:
- Fix crash when the screen setup changes and the Display
panel has been closed
Info:
- Fix updates buttons never saying "No updates"
- Fix empty dialogue when bringing up "Other media" dialog again
- Avoid empty entries in "Other types" dialogue
- Remove unused and broken icons
Network:
- Fix huge inline toolbar icons
Power:
- Fix reference to "Screen" panel, got renamed to
"Brightness & Lock"
Printers:
- Port to GDBus
Region & Language:
- Fix handling of variants in "Copy" button
Use Accounts:
- Fix sizing problems in the user list
- Fix possible crash for incomplete locales (such as Esperanto)
Wacom:
- Fix resetting display mapping
- Layout fixes
- Add touchring and touchstrips to the mapped buttons
- Fix crasher when XRandR isn't available
===========================
Version 3.3.90 (2012-02-21)
===========================
All:
- Remove use of deprecated widgets
Wacom:
- Add simple display mapping dialogue
- Add button mapping dialogue
- Switch to last used stylus automatically
- Loads of small layout fixes
Power:
- Redesigned dialogue
- Fix updating not working due to recent gnome-settings-daemon changes
Color:
- Don't print (null) for virtual printer profiles
- Don't block the UI settings the default profile
User Accounts:
- Port to GDBus
- Fix crasher on startup when compiled with Cheese avatar capture
- Use new strength bar widget from Power
Keyboard:
- Fix description not matching reality for setting shortcuts
- Refuse Shift+unmodified key shortcuts
- Fix crasher setting new custom shortcuts
Printers:
- Prevent possible crashes when level, name and color
information are parsed
Network:
- Add "Forget Network" button
- Remove unused "Unlock" button
Date & Time:
- Fix crasher when systemd is unavailable
- Respect LINGUAS for timezone translations
Shell:
- Force a pixel size for the "All Settings" button
==========================
Version 3.3.4 (2012-02-07)
==========================
Wacom:
- Calibrate tablet on the screen it's attached to
- Update and add missing stylus artwork
- Fix incorrect page numbering
- Hide cursor during calibration
- Fix Scroll Up/Down actions being inverted
- Add link to the Display Settings
- Fix 1-button stylus button mapping
- Remove use of italics for sliders
- Plenty of layout fixes
Universal access:
- Add configuration dialogue for zoom options
Date & Time:
- Use the timedated D-Bus service
Keyboard:
- Add support for new screenshot shortcuts
- Remove use of italics for sliders
Screen:
- Rename to Brightness & Lock
Brightness & Lock:
- Renamed from Screen
User accounts:
- Use cheese init functions
Sound:
- Fix wheel scrolling not working for right balance
Printers:
- Update list of print jobs in a better place
Network:
- Only show flight mode toggle when there are wireless devices
Mouse:
- Remove use of italics for sliders
Shell:
- Unblur the all-settings button icon
===========================
Version 3.3.4.1 (2012-01-18)
===========================
Bluetooth:
- Update for change in BluetoothChooser API
==========================
Version 3.3.4 (2012-01-17)
==========================
Wacom:
- Add calibration for screen tablets
- Add per-stylus configuration
Shell:
- Fix unfocused windows theming
Display:
- Port to GDBus
Users:
- Fix capturing a picture with the webcam
- Add optional systemd support for session tracking
Bluetooth:
- Remove omnipresent scrollbar and only show it when needed
Region:
- Fix "extra" layouts not appearing in italics
Printers:
- Show correct hostnames for printers
Network:
- Move the device speed up to the device header
- Move "Airplane Mode" switch to the shell header
Sound:
- Fix compile time warnings
==========================
Version 3.3.3 (2011-12-21)
==========================
Region:
- Small language chooser improvements (Cosimo Cecchi) (#664505,#664503)
Wacom:
- Many improvements that I can't really summarize here (Bastien Nocera)
- Better graphics (Jakub Steiner)
- Use libwacom for tablet information (Bastien)
- Visual improvements (Cosimo)
System Info:
- Rename to 'Details' (Rodrigo Moya) (#661696)
Display:
- Use consistent label style (Cosimo) (#665057)
Info:
- Use consistent label style (Cosimo) (#665059)
Printers:
- Unsubscribe from D-Bus signals when no longer needed (Marek Kasik)
- Don't crash because of external panel switch (Marek)
Translations:
Asturian
Burmese
Hebrew
Korean
Macedonian
Norwegian bokmål
Simplified Chinese
Spanish
Telugu
Thai
==========================
Version 3.3.2 (2011-11-22)
==========================
Common:
- Always collect locales from the directory (Bastien Nocera) (#660725)
- Do not install private libgnome-control-center (Bastien Nocera) (#655287)
- Fix handling of (Bastien Nocera) (#748444)
Background:
- Added D'n'D support for adding wallpapers (Ming Han Teh) (#655375)
- Force a toolbar style (Bastien Nocera)
Bluetooth:
- Move Bluetooth panel from gnome-bluetooth (Bastien Nocera)
Color:
- Update icon cache only on MAINTAINER_MODE (Alberto Ruiz)
- Do not allow the 'Add profile' modal dialog to be resizable (Richard Hughes)
- Improve the 'Add profile' modal dialog (Richard Hughes) (#661657)
- Don't show profile ages for EDID, test and colorspace profiles (Richard Hughes) (#661669)
- Show 'Uncalibrated' when a device has a test profile assigned (Richard Hughes)
- After removing a profile select the device so the UI is correct (Richard Hughes) (#661658)
- Fix a critical warning in the new GtkTreeIter code (Richard Hughes)
- Make toolbar buttons focusable (Bastien Nocera) (#662430)
Date & time:
- Fix showing actual clock format on panel open (Tomas Bzatek)
Info:
- Use x-content/unix-software as mime for the Software combobox (Cosimo Cecchi) (#660803)
- Add labelling relations (Matthias Clasen)
Keyboard:
- Don't load duplicate keybindings (Bastien Nocera)
- Fix ATK descriptions (Bastien Nocera) (#574073)
- Make the '+' button work all the time (Bastien Nocera) (#662253)
- Remove broken allowed_keys checks (Bastien Nocera)
- Use GtkCellRendererAccel (Bastien Nocera)
- Adjust shortcut files (Florian Müllner) (#663626)
- Rename a11y keyboard shortcuts (Bastien Nocera)
- Remove support for conditional shortcuts (Florian Müllner) (#663431)
- Stop monitoring num-workspaces (Florian Müllner)
- Port custom shortcuts to GSettings (Florian Müllner)
Mouse:
- Fix ATK descriptions (Bastien Nocera)
Network:
- Allocate nm-connection for nma-wireless-dialog (Gary Ching-Pang Lin) (#648174)
- Show wireless dialog even if there is no active AP (Gary Ching-Pang Lin) (#661526)
- Accessibility improvements (Matthias Clasen)
- Add proxy to the keywords (Bastien Nocera) (#663340)
- Make tabbing through the proxy page work (Matthias Clasen)
Online accounts:
- Add title for "Add Account" dialogue (Bastien Nocera) (#661573)
Power:
- Use the correct item in the combo boxes when sleep-when-inactive is disabled (Rodrigo Moya)
- Don't set the sleep-inactive-x GSettings keys that have been removed (Richard Hughes)
- Use "Power off" instead of "Shutdown" (Bastien Nocera) (#661559)
Printers:
- Check state of CUPS after start (Marek Kasik) (#659721)
- Fix build on systems without LC_PAPER (Bastien Nocera) (#660692)
- Don't hide address entry (Marek Kasik)
- Make +/- buttons insensitive when can not connect to CUPS (Marek Kasik)
- Set requesting-user-name when getting job info (Marek Kasik)
- Detect disconnection of printer (Marek Kasik)
- Don't allow "/" in printer name (Marek Kasik) (#661774)
Region:
- Hide system tab if no localed (Bastien Nocera)
- Simplify getting the current Locale (Bastien Nocera)
- Implement copying layouts (Bastien Nocera) (#659300)
- Fix build on systems without LC_MEASUREMENT (Bastien Nocera) (#660787)
- Align the example dates (Bastien Nocera)
- Only show locales for languages that have translations (Rodrigo Moya)
- Always add English to the list, as it should always be available (Rodrigo Moya)
Screen:
- Never set gnome-session's idle-delay to 1 (Rodrigo Moya)
Shell:
- Make sure we gtk_widget_show the search view (Rodrigo Moya)
- Avoid crash when searching if a .desktop has no comment (Vincent Untz) (#661494)
- Make Ctrl+Q work outside the overview (Bastien Nocera)
- Make Ctrl+W close panels (Bastien Nocera) (#660814)
- Give focus to the search entry when showing the overview page (Anders G. Jørgensen)
- Don't crash when loading the icon fails (Christian Persch) (#660513)
- Use icon for "All Settings" button (Bastien Nocera) (#657043)
- Add a11y label for the All Settings button (Bastien Nocera)
- Merge libgnome-control-center into main binary (Bastien Nocera)
Sound:
- Fix possible infinite loop in combo box (Bastien Nocera)
- Add a minimum height for the output list (Bastien Nocera) (#660582)
- Export sysfs path in stream properties (Bastien Nocera)
- Port audible-bell to GSettings (Bastien Nocera) (#625899)
Universal access:
- Fix ATK descriptions (Bastien Nocera)
- Avoid crashing when GConf is broken (Bastien Nocera) (#751007)
- Update for metacity GSettings port (Bastien Nocera) (#625899)
User accounts:
- Make unlock icon in tooltip match reality (Matthias Clasen)
Translations:
- ar (Abderrahim Kitouni)
- be (Ihar Hrachyshka)
- cz (Petr Kovar)
- de (Mario Blättermann, Christian Kirbach)
- el (Kostas Papadimas)
- en_GB (Bruce Cowan)
- es (Daniel Mustieles, Jorge González, Benjamín Valero Espinosa)
- fa (Arash Mousavi, Ali Akbar Najafian)
- fr (Bruno Brouard)
- ga (Seán de Búrca)
- gl (Fran Dieguez)
- he (Yaron Shahrabani)
- id (Andika Triwidada)
- ja (Jiro Matsuzawa)
- ku (Erdal Ronahi)
- lt (Aurimas Černius, Algimantas Margevičius)
- nb (Kjartan Maraas)
- nl (Rachid, Wouter Bolsterlee)
- pl (Piotr Drąg)
- sl (Andrej Žnidaršič, Matej Urbančič)
- sr (Мирослав Николић)
- sv (Daniel Nylander)
- ta (Dr.T.Vasudevan)
- te (krishnababu k)
- tr (Muhammet Kara)
- zh_CN (Aron Xu, Funda Wang, YunQiang Su)
- zh_HK (Chao-Hsiung Liao, Cheng-Chia Tseng)
- zh_TW (Chao-Hsiung Liao, Cheng-Chia Tseng)
==========================
Version 3.2.0 (2011-09-26)
==========================
System info:
- Don't crash when systemd isn't used (Bastien Nocera) (#659367)
- Don't warn if PackageKit isn't around (Bastien Nocera)
- Continue on filesystem query info (Ryan Lortie) (#654563)
Wacom:
- Show "stand-by" page when Wacom not available (Bastien Nocera) (#657424)
Translations:
- af (Friedel Wolff)
- bg (Alexander Shopov)
- ca (Joan Duran)
- ca@valencia (Carles Ferrando)
- cz (Marek Černocký)
- da (Flemming Christensen)
- de (Mario Blättermann)
- es (Daniel Mustieles)
- eu (Inaki Larranaga Murgoitio)
- fr (Bruno Brouard)
- ga (Seán de Búrca)
- gl (Fran Dieguez)
- hu (Gabor Kelemen)
- id (Andika Triwidada)
- it (Luca Ferretti)
- ja (Jiro Matsuzawa)
- ko (Changwoo Ryu)
- lv (Rudolfs Mazurs)
- nb (Kjartan Maraas)
- pa (A S Alam)
- pl (Piotr Drąg)
- pt (Duarte Loreto)
- pt_BR (Og B. Maciel)
- ru (Yuri Myasoedov)
- sk (Pavol Šimo)
- sl (Matej Urbančič)
- sv (Daniel Nylander)
- te (ipraveen)
- th (Theppitak Karoonboonyanan)
- zh_HK (Cheng-Chia Tseng, Chao-Hsiung Liao)
- zh_TW (Cheng-Chia Tseng, Chao-Hsiung Liao)
===========================
Version 3.1.92 (2011-09-19)
===========================
Color:
- Fix help links for gnome-help 3.1* (Jeremy Bicha)
- Don't assert if the user double clicks the delete profile button (Richard Hughes)
- Fix spawning of gcm-viewer (Matthias Clasen)
- Do not allow the user to choose profiles owned by other users (Richard Hughes)
- Do not allow the user to set default a profile they cannot access (Richard Hughes)
- Disable 'View details' button if gcm-viewer is not installed (Rodrigo Moya)
- Escape profile titles that have markup in the titles (Richard Hughes) (#659127)
- Pack the left and right button groups into two GtkBox containers (Cosimo Cecchi) (#659273)
Common:
- Add a way for panels to receive additional arguments (Giovanni Campagna) (#657093)
- Bump GTK+ deps (Bastien Nocera)
- Tell the actual required version for NM (Bastien Nocera)
Display:
- Remove duplicate/unused translations (Bastien Nocera)
Info:
- Don't warn when the hostname is empty (Bastien Nocera)
- Do fallback correctly when reading hostnames (Bastien Nocera)
- Split the hostname setting (Bastien Nocera)
Keyboard:
- Link directly to the layouts page (Bastien Nocera)
Network:
- Show wireless dialogs when asked (Giovanni Campagna) (#657093)
- Fix memleak when argv changes (Bastien Nocera)
- A segfault was introduced when assigning to args (Alban Browaeys) (#658670)
- Bind HTTP host entry to the 'host' setting in GSettings (Rodrigo Moya)
Printers:
- Match lower-case properly (Marek Kasik)
Region:
- Add ability to switch pages (Bastien Nocera)
- Fix display of layouts on the system tab (Matthias Clasen)
- Only offer to copy settings if they are different (Matthias Clasen)
Screen:
- Don't fill up the space (Bastien Nocera)
- Fix resulting top-padding (Bastien Nocera) (#657606)
- Remove indent on "Turn off..." label (Bastien Nocera)
Shell:
- Replace window sizing code (Bastien Nocera) (#658068)
Sound:
- Put the level bar at 0 when muting (Bastien Nocera) (#644537)
- Allow switching tabs from the command-line (Bastien Nocera)
Universal access:
- Fix sensitivity of keyboard a11y (Bastien Nocera) (#649452)
- Add context for text sizes (Bastien Nocera) (#645729)
- Set contrast combo on startup (Michael Terry) (#658990)
User accounts:
- Hide old message when enrolling (Bastien Nocera)
Wacom:
- Add a left-handed switch (Peter Hutterer) (#657810)
- Improve alignment of lines and widgets (Jakub Steiner) (#657425)
- Make string as translatable (Bastien Nocera)
Translations:
- ast (Xandru Armesto)
- be (Ihar Hrachyshka)
- bg (Ivaylo Valkov)
- de (Mario Blättermann)
- en_GB (Bruce Cowan)
- es (Jorge González, Daniel Mustieles)
- fa (Arash Mousavi)
- gl (Fran Dieguez)
- hu (Gabor Kelemen)
- id (Andika Triwidada)
- it (Luca Ferretti)
- ko (Changwoo Ryu, Seong-ho, Cho)
- lt (Aurimas Černius)
- lv (Rudolfs Mazurs)
- nb (Kjartan Maraas)
- pa (A S Alam)
- pl (Piotr Drąg)
- pt (Duarte Loreto)
- pt_BR (Djavan Fagundes)
- ru (Yuri Myasoedov)
- sr (Мирослав Николић)
- sv (Daniel Nylander)
- ta (Dr.T.Vasudevan)
- th (Theppitak Karoonboonyanan)
- vi (Nguyễn Thái Ngọc Duy)
- zh_CN (Aron Xu)
===========================
Version 3.1.91 (2011-09-05)
===========================
Color:
- Ensure the calibrate program gets run correctly (Richard Hughes)
- Use a mnemonic character on the Import button (Jiro Matsuzawa) (#658167)
- If cancelling profile import don't show the empty assign dialog (Richard Hughes) (#658180)
- Do not use a GtkSeparatorToolItem in the GtkToolbar (Richard Hughes)
Display:
- Clean up signal handling when finalized (Bastien Nocera) (#657919)
Media:
- Use new media-removable icon (Bastien Nocera) (#657801)
Network:
- Set the org.gnome.system.proxy.http 'enabled' key if the user sets a HTTP proxy (Richard Hughes)
- Explicitly unset 'use-same-proxy' as there's no UI for that (Richard Hughes) (#657235)
Power:
- Don't print a message to .xsession-errors if it's not an error (Richard Hughes)
- Use a proper icon for the panel (Jakub Steiner) (#645536)
- Update the UI to reflect the new mockup (Richard Hughes)
Screen:
- Hide brightness heading when unused (Bastien Nocera) (#657606)
Shell:
- Use symbolic name for minimum height (Bastien Nocera)
Sound:
- Add some (element-type) annotations to appease g-i master (Dan Winship)
Wacom:
- Dim the labels (grey, not black) (Peter Hutterer) (#657812)
Translations:
- be (Yuri Matsuk, Ihar Hrachyshka)
- es (Jorge González)
- fi (Timo Jyrinki)
- gl (Fran Dieguez)
- ja (Jiro Matsuzawa)
- nb (Kjartan Maraas)
- pa (A S Alam)
- ru (Yuri Myasoedov)
- sv (Daniel Nylander)
===========================
Version 3.1.90 (2011-08-30)
===========================
Background:
- Allow SVG image files as background (Rodrigo Moya) (#648764)
Color:
- Fix a crash where out internal state gets screwed up (Richard Hughes)
- Only allow the user to import custom profiles with colord >= 0.1.12 (Richard Hughes)
- Remove color managed devices if they are deleted by another process (Richard Hughes)
- Do not attempt to delete the device if it's already added (Richard Hughes)
- If there are no profiles or devices then hide the toolbar (Richard Hughes)
- Add a small italic indication when there are no color managed devices (Richard Hughes)
- Add a new 'Learn more' button to the color panel (Richard Hughes)
- If we have only a few devices and profiles expand the treeview at startup (Richard Hughes)
- Remove unneeded category (Bastien Nocera)
- When setting the default profile for a display, use the correct device (Richard Hughes)
Common:
- Simplify language display (Matthias Clasen)
- Add api for region names (Matthias Clasen)
- Add a region mode to the language chooser (Matthias Clasen)
- Tweak default user list (Bastien Nocera)
- Fix distribution of language chooser glade file (Rodrigo Moya)
Date & Time:
- Use radio buttons for 24h time (Bastien Nocera) (#640059)
Display:
- Clean up ifdef's (Bastien Nocera)
- Simplify panel code (Bastien Nocera)
- Fix the labeller not disappearing (Bastien Nocera)
- Prefer higher frequency modes (Bastien Nocera) (#655041)
Keyboard:
- Add link to the Region panel (Bastien Nocera) (#643101)
- Simplify GtkBuilder calls (Bastien Nocera)
- Use icon without a spanner (Bastien Nocera) (#657556)
Network:
- Mobile broadband bug fixes (Jiří Klimeš) (#657303)
- Fix possible double-free (Bastien Nocera)
- Fix display of IP info for some configs (Jiří Klimeš) (#657303)
- Fix updating VPN info when edited (Jiří Klimeš) (#723489)
- Show VPN type and info in panel (Jiří Klimeš)
- Clarify the VPN service type setting (Bastien Nocera)
- Rename "Options..." to "Configure..." (Bastien Nocera) (#657002)
- Fallback to GNOME as a hotspot name (Bastien Nocera)
- Use icon without a spanner (Bastien Nocera) (#657556)
Online accounts:
- Disable buttons when D-Bus service not available (Bastien Nocera) (#652572)
Power:
- Remove power and suspend buttons config (Bastien Nocera) (#652183) (#657068)
- Don't shrink the panel on desktops (Bastien Nocera)
Region:
- Avoid a crash in the absence of configured layouts (Matthias Clasen)
- Fix locale-changing code (Matthias Clasen)
- Redo the language tab (Matthias Clasen)
- Redo the formats tab (Matthias Clasen)
- Use region names on the region tab (Matthias Clasen)
- Show fewer regions (Matthias Clasen)
- Ensure the system tab is updated (Matthias Clasen)
- Add some spacing to the system tab (Matthias Clasen)
- Initial implementation of 'copy to system' (Matthias Clasen)
- Avoid crash when systemd is not available (Rodrigo Moya)
- Don't show region panel in Unity, it uses its own language selector (Rodrigo Moya)
Shell:
- Only load desktop files from our dirs (Bastien Nocera)
- Don't repeat the item title when searching (Bastien Nocera) (#657020)
- Add Ctrl+Q as a way to exit the shell (Bastien Nocera) (#653443)
Sound:
- Remove trailing spaces in strings (Bastien Nocera) (#657169)
- Track PulseAudio connection state and expose it (Giovanni Campagna) (#645708)
- Update volume-control applet for GVC API changes (Giovanni Campagna) (#645708)
- Don't warn without a sizegroup (Bastien Nocera)
- Fix sizing of sliders (Bastien Nocera)
System info:
- Always show the "Updates" button (Bastien Nocera) (#645274)
Universal access:
- Add more keywords to the desktop file (Matthias Clasen) (#657189)
- Add translator comments (Bastien Nocera) (#657167)
- Keep "text size" items a constant size (Bastien Nocera) (#657188)
- Don't crash when metacity isn't installed (Bastien Nocera)
User accounts:
- Remove some dead code (Matthias Clasen)
- Add a filter entry to the language dialog (Matthias Clasen)
- Prepopulate the language combo (Matthias Clasen)
- Remove trailing space in string (Bastien Nocera) (#657169)
- Add translator comments for split line (Bastien Nocera) (#657168)
- Prevent autologin for disabled users (Matthias Clasen) (#649816)
- Fix life-cycle issues (Matthias Clasen)
Wacom:
- Add a wacom control panel (Peter Hutterer) (#640981)
Translations:
- bg (Ivaylo Valkov)
- de (Mario Blättermann)
- es (Daniel Mustieles, Jorge González)
- gl (Fran Dieguez)
- lt (Aurimas Černius)
- nb (Kjartan Maraas)
- nl (Reinout van Schouwen)
- sr (Мирослав Николић)
- sv (Daniel Nylander)
- ta (Dr.T.Vasudevan)
- ug (Abduxukur Abdurixit)
- zh_CN (Aron Xu)
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
==========================
Version 3.1.5 (2011-08-18)
==========================
Common:
- Add some more debug when listing languages (Bastien Nocera)
Network:
- Default to g_get_host_name if pretty hostname call failed (Mathieu Trudel-Lapierre)
Printers:
- Open firewall for required connections when searching (Marek Kasik)
- Use system-config-printer's GetBestDrivers method (Marek Kasik) (#654742)
- Use system-config-printer's GroupPhysicalDevices method (Marek Kasik)
- Use system-config-printer's MissingExecutables method (Marek Kasik)
Region:
- Keep selection when moving layout up/down (Sergey Udaltsov) (#654880)
- Sort locales for format selection (Rodrigo Moya)
- Display user's input source in System tab (Rodrigo Moya)
Shell:
- Port to new gnome-menus API (Vincent Untz) (#655110)
- Do not add a trailing dash in search target when comment is empty (Vincent Untz) (#655487)
Sound:
- Update the sound theme for speaker testing (David Henningsson)
Translations:
- de (Mario Blättermann)
- es (Daniel Mustieles)
- gl (Fran Dieguez)
- he (Yaron Shahrabani)
- id (Andika Triwidada)
- nb (Kjartan Maraas)
- pa (A S Alam)
- sv (Daniel Nylander)
- uk (Daniel Korostil)
- vi (Nguyễn Thái Ngọc Duy, Ngô Chin)
- zh_CN (Yinghua Wang)
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
==========================
Version 3.1.4 (2011-07-25)
==========================
Background:
- Add "swap" button for gradients (Bastien Nocera) (#34498)
Common:
- Add safeguards for empty language (Bastien Nocera)
Date & Time:
- Restore TZ envvar as it was (Rui Matos) (#649568)
Info:
- Use the new g_format_size() glib function (Javier Jardón)
Network:
- Kill compilation warnings (Rodrigo Moya)
Power:
- Use the new gnome-settings-daemon DBus names now the power plugin has moved to
g-s-d (Richard Hughes)
- Make insensitive any sleep actions the hardware cannot do (Richard Hughes)
Printers:
- Make model label and ip address label selectable (Marek Kasik) (#651545)
- Add translation context in some places (Matthias Clasen) (#654725)
Region:
- Add weak ref for locale settings (Rodrigo Moya)
- Set LC_ specific variables, not LC_ALL (Rodrigo Moya)
- If no regional settings, use the configured language (Rodrigo Moya)
- Show measurement (Bastien Nocera)
- Don't use markup in bold labels (Bastien Nocera)
Screen:
- Avoid making lots of DBus calls to set the brightness when the slider change
too quickly (Rodrigo Moya)
Shell:
- Shrink vertically (Bastien Nocera) (#645808)
Sound:
- Make hadware page tree a little taller (Bastien Nocera)
Universal access:
- Remove unused column in model (Bastien Nocera)
User accounts:
- Improved new username format message (Robert Roth) (#647851)
- Remove unneeded markup in label (Bastien Nocera)
Translations:
- cz (Marek Černocký)
- es (Daniel Mustieles, Jorge González)
- gl (Fran Dieguez)
- he (Yaron Shahrabani)
- lv (Rudolfs Mazurs)
- nb (Kjartan Maraas)
- pa (A S Alam)
- sl (Matej Urbančič)
- sv (Daniel Nylander)
- tr (Muhammet Kara)
==========================
Version 3.1.3 (2011-07-04)
==========================
Common:
- Bump gsettings-desktop-schemas requirement for locale settings (Rodrigo Moya)
- Add Unity to OnlyShowIn fields (Michael Terry) (#653661)
Library:
- Typo preventing compilation on some platforms (Antoine Jacoutot) (#651162)
Color:
- Add new color setting panel (Richard Hughes)
Date & Time:
- Fix date sensitivity on permission changes (Florian Müllner)
Info:
- Skip test-hostnames if en_US.UTF-8 is not available (Frédéric Peters)
- Fix disk space showing free space (Bastien Nocera) (#639376)
- Fix https scheme handler app setting (Alexandre Rostovtsev) (#653211)
Keyboard:
- Force "icons" toolbar style (Bastien Nocera) (#651595)
- Change precedence for schema in KeyList parser (Florian Müllner) (#653685)
- Fix a small memory leak (Florian Müllner) (#653613)
- Support string array keybindings (Florian Müllner)
Network:
- Fix the wpad warning (Matthias Clasen)
- Avoid a possible crash (Matthias Clasen)
- Use the correct condition for the option button (Matthias Clasen)
- Refresh ui in an idle (Matthias Clasen)
- Implement network sharing (Matthias Clasen)
- Simplify security string for hotspots (Matthias Clasen)
- Add warning dialogs (Matthias Clasen)
- Disable the hotspot button when the device is off (Matthias Clasen)
- Use the 'pretty hostname' for hotspots (Matthias Clasen)
- Remove spaces before question marks (Piotr Drąg)
- Avoid uninitialised variable (Bastien Nocera)
- Fix toolbar style (Bastien Nocera) (#651595)
Online accounts:
- Add panel for gnome-online-accounts (Bastien Nocera)
Printers:
- Allow editing of printer name and location (Marek Kasik) (#649511)
- Use SNMP CUPS backend to discover printers on given address (Marek Kasik)
- Move check for availability of CUPS to better place (Marek Kasik)
- Include cups/ppd.h explicitly (Marek Kasik)
- Force icons toolbar style (Bastien Nocera) (#651599)
Region:
- Fix the labels according to the usability gurus (Sergey V. Udaltsov) (#641021)
- Fix a couple of memory leaks (Rui Matos) (#652360)
- Fix infinite loop dealing with gsettings 'changed' signal (Rui Matos) (#652361)
- Remove helper function not needed since GTK+ 3.0 (Rui Matos) (#652374)
- Trigger the layout chooser dialog response on 'row-activated' signal (RuiMatos) (#652409)
- Add 'formats' tab (Rodrigo Moya)
- Force icons only toolbar style (Bastien Nocera)
- Add 'system' tab (Rodrigo Moya)
Shell:
- Move the raised class hint to the tool item (Cosimo Cecchi)
- Don't update the visibility of the lock button (Florian Müllner) (#652299)
- Make --help-all and --help-gtk work (Bastien Nocera) (#652165)
- Use proper Unicode ellipses in the search renderer (Philip Withnall)
- Fix bad rendering of search results (Bastien Nocera) (#652709)
- Print warning for uninstantiable panels (Bastien Nocera) (#652585)
Sound:
- Fix direction of speaker test in RTL languages (Bastien Nocera) (#651273)
User accounts:
- Fix fingerprint assistant (Matthias Clasen) (#649678)
- Fix deleting users on 32-bit systems (Bastien Nocera) (#652073)
Xrandr:
- Change "Anti-Clockwise" to "Counterclockwise" (Dan Winship) (#652569)
Translations:
- ca (Pau Iranzo)
- ca@valencia (Carles Ferrando)
- de (Mario Blättermann)
- el (Kostas Papadimas)
- eo (Kristjan SCHMIDT)
- es (Daniel Mustieles, Jorge González)
- fa (Arash Mousavi)
- ga (Seán de Búrca)
- gl (Fran Diéguez)
- he (Yaron Shahrabani)
- hu (Gabor Kelemen)
- id (Andika Triwidada)
- lt (Aurimas Černius)
- nb (Kjartan Maraas)
- ru (Yuri Myasoedov)
- sl (Andrej Žnidaršič, Matej Urbančič)
- vi (Nguyễn Thái Ngọc Duy)
==========================
Version 3.0.2 (2011-05-24)
==========================
Common:
- Remove calls to AM_GNU_GETTEXT, IT_PROG_INTLTOOL should be enough (Rodrigo Moya)
Mouse:
- Update from gnome-settings-daemon (Bastien Nocera) (#695041)
Network:
- Properly select the active ap (Matthias Clasen) (#649934)
Power:
- Only show the 'When power is critically low' when there is a laptop
battery or UPS attached (Richard Hughes) (#646053)
Printers:
- Remove the subscription renewal timeout when the panel goes away (Matthias Clasen)
- Make Add button insensitive until user select a printer (Marek Kasik) (#648787)
- Improve search for PPDs for new devices (Marek Kasik)
- Check presence of new printer (Marek Kasik)
Shell:
- Add raised style to "All Settings" button (Cosimo Cecchi) (#645809)
- Kill warning in g_print call (Rodrigo Moya)
User accounts:
- Show username when no real name (Bastien Nocera) (#648348)
- Fix bug when name is changed to contain markup (Bastien Nocera)
- Don't call gtk_main_quit if AccountService is unavailable (David Benjamin) (#648969)
Translations:
- ga (Seán de Búrca)
- gl (Fran Diéguez)
- hu (Gabor Kelemen)
- nb (Kjartan Maraas)
- pl (Piotr Drąg)
- pt_BR (Rodrigo Padula de Oliveira)
- ug (Abduxukur Abdurixit)
- uk (Daniel Korostil)
- zh_CN (Funda Wang)
- zh_HK (Pin-Hsien Li)
- zh_TW (Pin-Hsien Li)
============================
Version 3.0.1.1 (2011-04-26)
============================
Shell:
- Fix initial state of 'search' icon in entry
Region:
- Add 'clear' icon in search entry (#647717)
Keyboard:
- Always add 'custom shortcuts' section (#648091)
- Make adding custom shortcuts work (#648187)
- Make unsetting custom shortcuts work
Display:
- Avoid critical warnings at startup (#648620)
Translation updates:
- Slovak
==========================
Version 3.0.1 (2011-04-26)
==========================
Shell:
- Don't exit when --help is called and the shell is
already running
- Center by default
Printers:
- Fix setting the default printer
- Fix initial state of printer list
- Make it possible to cancel adding new printers
- Set default papersize according to the locale
- Make it faster by caching PPDs for the local printer
Removable Media:
- Make "never autorun" checkbox work
User accounts:
- Try hard to not show the "root" account
- Use local documentation for "good password"
Network:
- Add support for connecting to hidden wireless networks
Background:
- Allow adding multiple images at once
Keyboard:
- Fix shortcuts disappearing when creating a new workspace
- Handle shortcut conflicts when they occur in a different section
Date & Time:
- Fix critical on startup
- Add support for all the possible TZ set on a Linux system
Info:
- Fix possible crash
- Don't block the UI when checking for free space
Sound:
- Only autostart panel applet in GNOME
- Fix clipping when sound volume is > 100%
Loads of updated translations
============================
Version 3.0.0.1 (2011-04-06)
============================
Network:
- Avoid assertions with mobile broadband devices
Background:
- Fix a compiler warning
Printers:
- Actualize printer and job lists automatically
- Avoid crash if policy is unavailable
- Don't set a reason when setting AcceptJobs
Date & Time:
- Fix test-endianess on OpenSUSE (#646780)
Translation updates: Vietnamese, Esperanto, Bengali, Persian
==========================
Version 3.0.0 (2011-04-04)
==========================
Background:
- Don't show errors when loading default bg (Bastien Nocera) (#646056)
- Don't use the GnomeBG thumbnails for the preview area (Cosimo Cecchi) (#646180)
- Don't assert() for typos in XML files (Bastien Nocera) (#646250)
Common:
- Remove API reference, as it's incomplete and going away for next cycle (Rodrigo Moya)
- Fix build on fresh checkouts (Florian Müllner)
Keyboard:
- Set repeat-interval correctly (Bastien Nocera) (#646241)
- Bump gnome-settings-daemon requirement (Bastien Nocera)
Network:
- Use symbolic icon for ad-hoc wireless connections (Cosimo Cecchi) (#646140)
- Hide the security cell renderer if there's no icon to display (Cosimo Cecchi) (#646140)
- Do not add bluetooth devices to the panel to avoid asserting the control-center (Richard Hughes)
- Fix build against NetworkManager on Debian (Matthias Clasen) (#646349)
- Reset the network name combo when disconnected (Matthias Clasen) (#646031)
- Display more detailed status for unavailable devices (Matthias Clasen) (#646027)
- Make creating vpn connections work again (Matthias Clasen)
Printers:
- Make "Print Test Page" button always sensitive (Marek Kasik)
- Do not delete browsed printers (Marek Kasik)
Region:
- Make the layout options modal (Cosimo Cecchi) (#646183)
Shell:
- Turn off spinner cursor when launched (Bastien Nocera) (#646045)
Sound:
- Make the volume icons smaller and center them properly in the bar (Cosimo Cecchi) (#646153)
- Make sound applet work again in fallback (Bastien Nocera) (#646044)
Universal Access:
- Don't incorrectly mark some hboxes as insensitive (Cosimo Cecchi) (#646240)
Translations:
- af (Friedel Wolff)
- ar (Khaled Hosny)
- bn (Jamil Ahmed)
- ca (Jordi Serratosa)
- cz (Marek Černocký)
- da (Ask H. Larsen)
- de (Wolfgang Stöggl)
- el (George Stefanakis, Simos Xenitellis)
- en_GB (Bruce Cowan)
- eu (Iñaki Larrañaga Murgoitio)
- gu (Sweta Kothari)
- hi (Rajesh Ranjan)
- hu (Gabor Kelemen)
- it (Luca Ferretti)
- ja (Jiro Matsuzawa, Takayuki KUSANO)
- kn (Shankar Prasad)
- ko (Changwoo Ryu)
- lt (Gintautas Miliauskas)
- nb (Kjartan Maraas)
- nl (Wouter Bolsterlee)
- pl (Piotr Drąg)
- pt (Duarte Loreto)
- ta (Dr.T.Vasudevan)
- te (krishnababu k)
- tr (Baris Cicek)
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
=============================
Version 2.91.93 (2011-03-28)
=============================
Common:
- Add a --verbose option to the shell
- Make sure the desktop file uses categories that show up in menus
Date & Time:
- Fix time widget ordering in RTL locales
Printing:
- Use a single privilege to unlock the entire page
- Honor disable-print-setup lockdown setting
- Use CUPS printer test page
Power:
- Use a better icon
Sound:
- Port to GSettings
- Fallback if loading a non-existent custom theme
User Accounts:
- Remove stray debugging output
- Make crop window modal
- Fix crop window background color
Universal Access:
- Bring screen reader option back
Network:
- Drop creation of custom connections for now, except for VPN
- Show a padlock icon for 'secure' access points
- Memory leak fixes
- Implement on/off switch for wired devices
- Properly track VPN connection state
- Use grids for better UI alignment
- Handle NetworkManager restarts gracefully
Region:
- Remove tooltips from layout list
Background:
- Make the window fit on small screens
Translations:
Arabic, Swedish, Galician, Estonian, Norwegian bokmål, Italian,
Slovenian, Romanian, German, Simplified Chinese, Ukrainian,
Spanish, French, Russian, Catalan, Dutch, Punjabi, Korean,
Czech, Hebrew, Vietnamese, Japanese, Uighur, Latvian, Hindi,
Brazilian Portuguese, Polish
=============================
Version 2.91.92 (2011-03-21)
=============================
Common:
- Bump GTK+ dep to 3.0.2 (Matthias Clasen) (#644182)
- Fix linking of libshortcuts against X (Frédéric Péters) (#644410)
- Improve CUPS detection (Saleem Abdulrasool) (#644064)
- Set the 'inline-toolbar' style class to toolbars which need it (Cosimo Cecchi) (#645059)
Background:
- Use new picture-uri GSettings key (Bastien Nocera) (#633983)
Date and Time:
- Change combobox when map is clicked (Bastien Nocera)
- Make 24h setting changeable without unlocking (Bastien Nocera) (#643891)
- Add missing timezone files (Frédéric Péters) (#630261)
- Add hacks to support more timezones (Bastien Nocera)
- Don't crash when the timezone is unknown (Bastien Nocera)
Display:
- Fix dragging rotated monitors (Alexander Larsson) (#641345)
Info:
- Use dim labels (William Jon McCann)
Keyboard:
- Fix crasher when num workspace changes (Bastien Nocera) (#644784)
- Mark the scales as insensitive when the checkboxes are off (Cosimo Cecchi) (#645151)
- Correct labels for blinking speed (Bastien Nocera) (#645314)
Mouse:
- Don't destroy the touchpad tab (Bastien Nocera)
- Check caps of the touchpad when added (Bastien Nocera)
- Make sure we fit within our minimum vertical size (William Jon McCann)
- Don't reset scrolling method on start (Bastien Nocera) (#642474)
Network:
- Show the wireless security currently being used (Richard Hughes)
- Do not show a provider string for mobile broadband devices when not connected (Richard Hughes)
- Do not show the IPv6 address if nm_device_get_dhcp6_config() failed (Richard Hughes)
- nm_device_wifi_get_bitrate() returns values in kb/s, not Mb/s (Richard Hughes)
- Hide UI controls that are not connected up to anything yet (Richard Hughes)
- Display the IPv6 address if one is provided for the device (Richard Hughes)
- Never show the loop device if IP4 data isn't available (Richard Hughes)
- Use an abstract device so we can get the VPN connection data (Richard Hughes)
- Show the VPN connection state in the panel header (Richard Hughes)
- A disconnected wired connection is 'Unplugged', not 'Disconnected' (Richard Hughes)
- Display a different icon if the wired ethernet device is disconnected (Richard Hughes)
- Do not show a speed of zero for any device (Richard Hughes)
- Ensure we refresh the UI if coldplug devices are changed (Richard Hughes)
- Add Option buttons (Matthias Clasen)
- Fix some alignment and focus issues (Matthias Clasen)
- Add a device off switch (Matthias Clasen)
- Implement and show on/off switch for wireless/wimax (Matthias Clasen)
- Refresh UI when active connections change (Matthias Clasen)
- Add Option buttons to allow editing connections (Matthias Clasen)
- Watch for new VPN connections being added and add them to the panel (Richard Hughes)
- Drop tooltips on the device list (Matthias Clasen) (#644964)
- Use dim-label style class for labels (Matthias Clasen) (#644964)
- Fix version compatibility warning dialog (William Jon McCann) (#644973)
- Avoid header pixel noise and inconsistent spacing (Matthias Clasen) (#644954, #644955)
Printers:
- Attach 'add printer' dialog to toplevel (Matthias Clasen) (#644213)
- Call cupsGetDevices() asynchronously (Marek Kasik) (#644212)
- Use dim-label to accentuate values (William Jon McCann)
- Set longer timeout for installation of printer driver (Marek Kasik)
- Don't sort printers by usage (Marek Kasik)
- Handle no printers situation better (Marek Kasik) (#641421)
- Show IP address of printer (Marek Kasik)
- Change text about unavailability of CUPS (Marek Kasik) (#641421)
- Fix alignment in secondary notebook pages (William Jon McCann)
- Show computer-fail icon when can not connect to CUPS (Marek Kasik) (#641421)
Region:
- Using separate window group to avoid modal shadowing (Sergey Udaltsov)
- Stop layout add dialogue from "jumping" (Bastien Nocera)
- Make drag'n'drop work (Bastien Nocera)
Screen:
- Fix the delay acrobatics (Matthias Clasen) (#644403)
- Drop converting between seconds and minutes (William Jon McCann)
- Set the label as insensitive when Lock is off (Cosimo Cecchi) (#645149)
- Honor disable-lock-screen setting (William Jon McCann)
Shell:
- Fix resizing when switching from panel to panel (Gerd Kohlberger) (#636596)
Sound:
- Fix scroll event handling of channel bars (Matthias Clasen) (#644462)
- Fix ordering of typedefs (Bastien Nocera)
- Use upstream value for amplified volume (Colin Guthrie) (#644292)
- Add introspection info for new GIcon function (Florian Müllner)
- Remove old support code for PA < 0.9.15 (Bastien Nocera)
Universal access:
- Set the name to the right hboxes (Cosimo Cecchi) (#645135)
- Use NO_SENSITIVITY flag for g_settings_bind() (Cosimo Cecchi) (#645171)
User accounts:
- Use dim-label class instead of hardcoded color (William Jon McCann)
- Update cheeese minimum requirements (Bastien Nocera)
- Nuke supervised accounts (David Zeuthen)
- Don't warn if there are no faces pixmaps (Bastien Nocera) (#645347)
Translations:
- ar (Khaled Hosny)
- cz (Ondrej Kopka)
- de (Mario Blättermann)
- en_GB (Bruce Cowan)
- es (Daniel Mustieles, Jorge González)
- et (Mattias Põldaru)
- gl (Fran Diéguez)
- he (Yaron Shahrabani)
- hu (Gabor Kelemen)
- it (Luca Ferretti)
- ja (Takayuki KUSANO)
- ko (Changwoo Ryu)
- lt (Gintautas Miliauskas)
- lv (Rudolfs Mazurs)
- nb (Kjartan Maraas)
- pa (A S Alam)
- pl (Piotr Drąg)
- pt (Duarte Loreto)
- pt_BR (Hugo Vaz Sampaio)
- sl (Andrej Žnidaršič, Matej Urbančič)
- sr (Мирослав Николић)
- sv (Daniel Nylander)
- uk (Daniel Korostil)
- zh_CN (Aron Xu)
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
=============================
Version 2.91.91 (2011-03-08)
=============================
Shell:
- Reload the list of panels when new ones are added
Date and Time:
- Use correct order for date widgets when in non-US locales
Info:
- Look for which device is being driven by the VESA driver
- Remove (tm) from GNOME logo
Keyboard:
- Add support for the magnifier zoom in/out shortcuts
- Fix loading of custom shortcuts
- Fix initial selection in the shortcut pane
- Make shortcut conflicts code actually work
- Fix warning about "editing-canceled"
- Make repeat rate and speed follow a11y guidelines
Network:
- Update for recent NetworkManager changes
Printers:
- Don't show driver version in the model name
- Add dialogue for adding new printers
Region and Language:
- Don't block the interface when loading the panel
- Do not allow adding the same keyboard layout twice
Sound:
- Fix only starting applet in fallback session
Universal Access:
- Show actual keyboard shortcuts as defined in Keyboard
- Make "on-screen keyboard" switch work
- Fix initial state of typing help
- Add "smaller text" size
=============================
Version 2.91.90 (2011-02-22)
=============================
Background:
- Remove loading of obsolete backgrounds (Bastien Nocera)
- Load initial state from GSettings (Bastien Nocera)
- Don't warn when trying to load a gradient (Bastien Nocera)
- Make loading wallpapers seem faster (Bastien Nocera)
- Show 'Adwaita' as the first in the list (Bastien Nocera) (#637384)
- Handle no-flags from saved config (Bastien Nocera)
- Set the shading for pictures (Bastien Nocera)
- Add/Remove features for panel (Bastien Nocera)
- Don't show an error if no cache dir (Bastien Nocera)
- Add arrows for the gradients (Bastien Nocera)
Date & Time:
- Don't crash when g-s-d is badly installed (Bastien Nocera) (#641232)
- Create filenames locale-independently (Christian Persch) (#641294)
- Fix crash when TZ is an alias (Bastien Nocera) (#641360)
- Fix city combobox filtering (Bastien Nocera)
Display:
- Remove support for old D-Bus interface (Bastien Nocera)
- Simplify some old GNOME 2.x code (Bastien Nocera)
Info:
- Make labels selectable (William Jon McCann)
- Add graphics info (William Jon McCann)
- Add special case for Atom(TM) (William Jon McCann)
- Add panel chooser, graphics tab (Colim Walters) (#642068)
- Add stub for default apps page (William Jon McCann)
- Clearify language in force fallback controls (William Jon McCann)
- Correctly detect the fallback session (William Jon McCann)
Keyboard:
- Change grouping of keys (William Jon McCann)
- Improve the layout of the bindings page (William Jon McCann)
- Clean up GConf handling (Bastien Nocera)
- Add support for GSettings shortcuts (Bastien Nocera)
- Pass a gettext package when loading GConf (Bastien Nocera)
- Don't resize the shell horizontally (Bastien Nocera)
- Don't expand tables vertically (William Jon McCann)
- Add Universal Access shortcuts (Bastien Nocera) (#641279)
Network:
- Wrap long dns lines (William Jon McCann)
- Select the first device after they are all loaded (William Jon McCann)
- Use the same border width as other panels (William Jon McCann)
- Use emblem-default-symbolic for the default printer (William Jon McCann)
- Disable NetworkManager when the airplane switch gets changed (Richard Hughes)
- Show the wired network subnet mask (Richard Hughes)
- Fix a crasher due to an uninitialized GVariant (Cosimo Cecchi)
- Fix linking (Richard Hughes)
- Port to the rm-userset branch of NetworkManager (Richard Hughes)
- Only add the strongest AP for each SSID to the drop down box (Richard Hughes) (#640471)
Printers:
- Right align the image (William Jon McCann)
- Use a 64px icon (William Jon McCann)
- Don't expand switch vertically (William Jon McCann)
- Fix panel width (Matthias Clasen)
- Allow location and model to span cols again (William Jon McCann)
- Add unlock button (Marek Kasik) (#640733)
- Sort printers by usage (Marek Kasik) (#641285)
- l10n fixes for jobs count (Luca Ferretti)
- Add translation context to statuses (Luca Ferretti) (#641339)
- Avoid unnecessary use of markup (Khaled Hosny)
- Check that cups is recent enough (Marek Kasik)
- Change widget showing supply levels (Marek Kasik)
- Don't show printers separator when not needed (Marek Kasik)
- Don't try to draw empty ink level (Marek Kasik)
- Replace "Idle" state by "Ready" (Marek Kasik)
- Set Options and Show buttons sensitive (Marek Kasik)
Region:
- Use consistent border spacing (William Jon McCann)
- New search-based layout addition (Sergey V. Udaltsov) (#640772)
- Minor UI tweaks in kbd layout chooser (Sergey V. Udaltsov)
- Remove annoying tooltip on a treeview (Bastien Nocera)
- Easier to understand layout switching options (Bastien Nocera) (#641021)
- Remove code to handle print button (Bastien Nocera)
- Some UI fixes for the layout chooser (Bastien Nocera)
- Make layout filtering much faster (Sergey V. Udaltsov)
- Fix overeager string splitting (Bastien Nocera)
- Fix the modality of the Preview dialog (Sergey V. Udaltsov)
Screen:
- Simplify GtkBuilder-using code (Bastien Nocera)
- Hide the brightness slider when it cannot be set (Bastien Nocera)
- Hook up screen locking (Bastien Nocera) (#637939)
- Set idle-delay to the same value as DPMS timeout (Bastien Nocera)
- Make sure the combo box is always set (Bastien Nocera)
- Fix the operation of locking (William Jon McCann)
Shell:
- Add shortcuts to focus search entry (Bastien Nocera) (#409230)
- Don't pass invalid option flags (Christian Persch) (#641290)
- Use symbolic icons in the search entry (Bastien Nocera) (#642167)
- Sort the icons alphabetically (Thomas Wood)
- Make sure the search entry doesn't appear when in a panel (Thomas Wood)
- Fix searching for anything hiding widgets (Bastien Nocera)
Sound:
- Try using symbolic icons for range widgets (William Jon McCann) (#614213)
Universal Access:
- Allow the pointer page to use less horizontal space (Thomas Wood)
- Hide options that are currently unavailable (Thomas Wood) (#639784)
- Implement the zoom setting (Thomas Wood)
- Adjust for magnifier schema changes (Florian Müllner)
- Use switches instead of radio groups (William Jon McCann)
- Show the typing assistant widgets (Bastien Nocera)
User Accounts:
- Use 0 instead of blank to clear options (William Jon McCann)
- Port to GtkStyleContext (Cosimo Cecchi)
- Hide fingerprint dialogue by default (Bastien Nocera) (#641990)
Translations:
- Arabic (Khaled Hosny)
- Basque (Inaki Larranaga Murgoitio)
- Estonian (Ivar Smolin)
- Galician (Fran Diéguez)
- Gujarati (Sweta Kothari)
- Hebrew (Yaron Shahrabani)
- Italian (Luca Ferretti)
- Korean (Changwoo Ryu)
- Norwegian bokmål (Kjartan Maraas)
- Persian (Mahyar Moghimi)
- Punjabi (A S Alam)
- Spanish (Daniel Mustieles, Jorge González)
- Swedish (Daniel Nylander)
- Traditional Chinese (Chao-Hsiung Liao)
- UG (Gheyret Kenji)
=============================
Version 2.91.6 (2011-02-01)
=============================
Info:
- Read version from gnome-version.xml (William Jon McCann)
- Don't show update button (William Jon McCann)
- Show memory, processor, OS type, storage (William Jon McCann)
- Make 64bit detection work reliably (Bastien Nocera)
- Make labels translator friendly (Luca Ferretti, #640127)
Keyboard:
- Make shortcuts tab look closer to mockup (William Jon McCann)
- Avoid duplicate entries (Matthias Clasen)
- Make custom shortcut editing work (Matthias Clasen)
- Make custom shortcut dialog non-resizable (Matthias Clasen)
- Make scales work (Matthias Clasen)
Date & Time:
- Fix splitting of region strings (Matthias Clasen)
- Prevent the panel from growing horizontally (Matthias Clasen)
- Add an unlock button (Thomas Wood)
Default applications:
- Removed (William Jon McCann)
Display:
- Hide unsupported size (Bastien Nocera)
- Rename rotation options (Bastien Nocera, #563144)
Media:
- Remove icons from non-applications (William Jon McCann, #640010)
- Use consistent capitalization (William Jon McCann)
- Make 'Other' work more than once (Matthias Clasen)
- Remove erroneous quotes (Matthias Clasen)
- Improve strings (Matthias Clasen)
Mouse:
- Change tab label to 'Mouse' (William Jon McCann, #639787)
- Remove a11y tab (William Jon McCann)
Network:
- Use a better icon (Matthias Clasen)
- Use toolbar for source list buttons (William Jon McCann)
Power:
- Make strings translator friendly (Richard Hughes, #640119)
Printers:
- New panel (Marek Kasik)
Region:
- Sort lists (Sergey V. Udaltsov)
- Fix infinite loop (Bastien Nocera, #639951)
- Remove mouse keys tab and various other cleanups (Bastien Nocera)
- Set parents on all dialogs (Bastien Nocera)
- Add a language tab (Bastien Nocera)
- Share language code with the user accounts panel (Bastien Nocera)
- Make language selection work (Bastien Nocera)
- Tweak the layout of to the layout tab (Bastien Nocera)
- Remove keyboard model selection (Bastien Nocera)
- Remove Help buttons (Bastien Nocera)
Screen:
- Use a switch widget (William Jon McCann)
- Hide unimplemented Location UI (William Jon McCann)
Sound:
- Fix an assertion (Alban Browaeys, #639280)
- Add close button to speaker test (Matthias Clasen, #636898)
Shell:
- Start in overview (Dan Winship, #639180)
- Reload icons on theme change (Bastien Nocera, #639268)
- Avoid windows with no icons (Bastien Nocera)
Universal Access:
- Make test size control work (Matthias Clasen)
- Make 'Sound Settings' button work (Matthias Clasen)
- Remove 'Show Panel Icon' checkbox (Matthias Clasen)
User Accounts:
- Sync language code with gdm (Bastien Nocera)
- Fix lifecycle issues with the language chooser (Bastien Nocera)
- Make fingerprint dialog work better with the shell (Matthias Clasen)
- Use toolbar for list buttons (William Jon McCann)
- Remove unused UI elements: email, location (William Jon McCann)
- Remove Login tab and move autologin (William Jon McCann)
- Improve dropdown arrow drawing (Matthias Clasen)
- Improve password strengh bar drawing (Matthias Clasen)
Translation updates:
Arabic
Estonian
Galician
Greek
Hebrew
Italian
Norwegian bokmål
Punjabi
Simplified Chinese
Spanish
Traditional Chinese
Ukrainian
=============================
Version 2.91.5 (2010-12-22)
=============================
Common:
- Fix 2 typos (Andre Klapper) (#637527)
- Require gnome-settings-daemon >= 2.91 (Rodrigo Moya)
- Bump libgnomekbd requirement (Rodrigo Moya)
- Adapt to new gnome-desktop API (Giovanni Campagna)
Datetime:
- Fix layout and spacing to match mockups (William Jon McCann)
- Use a switch for 24 hour time (William Jon McCann)
- Keep the time ticking while the dialog is up (William Jon McCann)
- Make dialog instant apply (William Jon McCann)
- Don't try to set timezone when initially loading model (William Jon McCann)
Sound:
- Do not build with $DISABLE_DEPRECATED (Vincent Untz)
- Don't set update policy (Benjamin Otte)
Translations:
- de (Mario Blättermann)
- es (Jorge Gonzalez)
- et (Ivar Smolin)
- gl (Fran Diéguez)
- he (Yaron Shahrabani)
- nb (Torstein Adolf Winterseth)
- pa (A S Alam)
- sl (Matej Urbančič)
- sv (Daniel Nylander)
- vi (Nguyễn Thái Ngọc Duy)
=============================
Version 2.91.3.1 (2010-12-22)
=============================
Shell:
- Fix initial window size (Matthias Clasen)
- Drop 'Internet & Network' category (Thomas Wood)
- Only show panels, not old-style capplets (Thomas)
Universal access:
- Migrate to GSettings (Rodrigo Moya)
Display:
- Use switch (Bastien Nocera)
- Fix sizing issues (Thomas)
Media:
- Use GtkAppChooserButton (Cosimo Cecchi)
Mouse:
- Detect touchpads (Bastien)
Keyboard
- Shortcuts UI improvements (Rodrigo)
Datetime:
- Multiple UI improvements (Bastien)
- Implement 12h setting (Bastien)
- Add NTP support (Bastien)
Network:
- Initial prototype (Richard Hughes)
- Remove the old proxy panel (William Jon McCann)
Background:
- Load asynchronously (Bastien)
- Support gradients (Bastien)
- Multiple UI improvements (Bastien)
System Information:
- Initial prototype (William Jon McCann)
=============================
Version 2.91.3.1 (2010-11-30)
=============================
Common:
- Add missing libraries for linking (Rodrigo Moya)
Display:
- Fix run-time warning (Bastien Nocera)
Media:
- Use the correct schema name (Cosimo Cecchi)
===========================
Version 2.91.3 (2010-11-29)
===========================
Background:
- One last old gnome_bg remnant (Yanko Kaneti)
- Load wallpapers in an idle (William Jon McCann)
Common:
- Fix build for latest gnome-desktop changes (Andreas Proschofsky) (#634859)
- Some build fixes (Rodrigo Moya)
- Update to GTK+ api changes (Matthias Clasen)
- Add keywords to desktop files (Matthias Clasen, Bastien Nocera) (#399754)
Datetime:
- Add missing libraries to libdate_time_la_LIBADD (Rodrigo Moya)
- Implement 12/24 hour preferences for the gnome-shell clock (Thomas Wood)
Default applications:
- Remove web browsers and mail readers from XML file (Rodrigo Moya)
Display:
- Remove refresh rate setting (William Jon McCann)
- Don't list the resolution in the arrangement box (William Jon McCann)
- Indicate the selected display using an outside stroke (William Jon McCann)
- Remove unhelpful Monitor: label (William Jon McCann)
- Make layout not jump around when selecting monitors (William Jon McCann)
- Remove the primary display checkbox (William Jon McCann)
- Just say no to tabs and trailing whitespace (William Jon McCann)
- Use consistent indentation and spacing (William Jon McCann)
- Identify primary display with a black top bar and clock (William Jon McCann)
- Allow dragging top bar to set primary display (William Jon McCann)
- Use a smaller top bar size (William Jon McCann)
- Ensure primary display is set in config (William Jon McCann)
- Don't allow setting primary on off displays (William Jon McCann)
- Add a save/restore to ensure the labels don't mess up top bar (William Jon McCann)
Keyboard:
- Fix possible accel blocking (Bastien Nocera)
Media:
- Initial port of Nautilus capplet code (Cosimo Cecchi)
Mouse:
- Use a smiley face instead of old ugly lightbulb to test click (William Jon McCann)
- Don't force wrapping the label at 180px (William Jon McCann)
- Remove dead a11y code (Bastien Nocera)
Network:
- Avoid run-time warnings (Bastien Nocera)
Power:
- Add the first cut of the UI of the power panel, based on a mockup by Alan Day
(Richard Hughes)
Region:
- Link against libxklavier also (Didier Roche)
Screen:
- Add screen brightness and lock panel (William Jon McCann)
- Improve label for dim checkbox (William Jon McCann)
- Connect up the brightness slider and the dim checkbox with gnome-power-manager
(Richard Hughes)
Shell:
- Subtract a hacky constant from the screen height for dialog height (William
Jon McCann)
- Don't change casedness when displaying matches (Matthias Clasen)
- Add keyword search (Matthias Clasen)
- Start in the right size (Matthias Clasen)
- Ensure the background and foreground colours are consistent (Thomas Wood)
Sound:
- Explicit link to libxml (Yanko Kaneti)
- Don't allow long profile names to resize toplevel (Bastien Nocera) (#613040)
- Replace size_request by get_preferred_width/height (Javier Jardón) (#635117)
- Avoid second warning when no theme (Bastien Nocera)
- Simplify check_rectangle() macro (Bastien Nocera)
- Make level bar descend from GtkWidget (Bastien Nocera)
- Show icons for devices (Bastien Nocera)
- Remove radio buttons (Bastien Nocera)
- Avoid initial resizing (Matthias Clasen)
- Remove theme selection (William Jon McCann)
- Remove window and button sounds checkbox (William Jon McCann)
Universal access:
- Remove relation with inexistant widget (Bastien Nocera)
- Remove an unused frame that added a few extra px of spacing (William Jon McCann)
User accounts:
- Listen for permission changes (Matthias Clasen)
- Fix a little annoyance with combo boxes (Matthias Clasen)
- Don't show parental controls for now (Matthias Clasen)
- Fix packing of the language dialog (Matthias Clasen)
- Don't allow opening non-images (Bastien Nocera)
- Add "Disable icon" menu item (Bastien Nocera)
- Link against missing libraries (Rodrigo Moya)
Translations:
- es (Jorge González)
- gl (Fran Diéguez)
- he (Yaron Shahrabani)
- nb (Kjartan Maraas)
- pa (A S Alam)
- ro (Cătălin Bălan)
- ta (Dr.T.Vasudevan)
- ug (Gheyret T.Kenji)
- zh_CN (Aron Xu)
===========================
Version 2.91.2 (2010-11-08)
===========================
Common:
- Remove typing break (William Jon McCann)
- Build against libxml where appropriate (Matthias Clasen)
- Fix parallel building (Bastien Nocera)
- Remove unnneded lines in autogen.sh (Javier Jardón)
- Use GSourceFunc() instead GtkFunction() in g_timeout_add() (Javier Jardón)
- Bump gtk3 dep to 2.91.3 for box, etc changes (William Jon McCann)
- Prepare for size_request removal in GTK3 (Matthias Clasen) (#633321)
Background:
- Make flickr background setting not segfault (Cosimo Cecchi)
- Migrate to GSettings (Rodrigo Moya)
- Last bits of new gnome_bg API porting (Tomas Bzatek) (#625899)
Datetime:
- Start implementing new UI designs (Thomas Wood)
- Move to system section (William Jon McCann)
- Link test program against common libs (Rodrigo Moya)
Default applications:
- Use URL handlers for browser and mailer applications (Rodrigo Moya)
- Remove selection of media player (Rodrigo Moya)
- Migrate to GSettings (Rodrigo Moya)
- Fix run-time warning (Bastien Nocera)
Display:
- Reorganise according to mockups (Bastien Nocera)
- Show the resolution in the canvas area (Bastien Nocera)
- Remove excess cairo_save() call (Benjamin Otte)
- Simplify the layout of the display panel (William Jon McCann)
- Readd the checkbox to set primary display (William Jon McCann)
- Remove the system-wide setting helper (William Jon McCann)
- Make the canvas background color a bit more neutral (William Jon McCann)
- Migrate to GSettings (Rodrigo Moya)
- Port FooScrollArea to GtkScrollable iface (Bastien Nocera)
- Change panel name to Displays (William Jon McCann)
- Show aspect ratios with resolutions (Kees Cook)
Keyboard:
- Rename keybindings to keyboard (William Jon McCann)
- Move general settings into keyboard panel (William Jon McCann)
Mouse:
- Use new GDK error trap API (Cosimo Cecchi)
- Require libXInput (Bastien Nocera)
- Migrate to GSettings (Rodrigo Moya)
- Add motion acceleration and threshold UI for touchpad settings (Rodrigo Moya)
- Don't expand Mouse notebook vertically (William Jon McCann)
- Enable 2-finger scrolling through emulation (Chris Bagwell) (#625163)
Network:
- Fix for GtkCombo text changes (Bastien Nocera)
- Remove 'has-separator' properties (Bastien Nocera)
- Partially migrate to GSettings (Rodrigo Moya)
Region:
- Renamed from 'Keyboard' (William Jon McCann)
- Migrate to GSettings (Sergey V. Udaltsov, Rodrigo Moya)
- Remove calls to gtk_widget_hide_all() (Bastien Nocera)
- Fix warnings with cell renderer changes (Bastien Nocera)
- Don't expand vertically on general tab (William Jon McCann)
- Remove a11y stuff (William Jon McCann)
- Several renaming fixes (Yanko Kaneti)
Shell:
- Handle GtkSizeRequest removal (Bastien Nocera)
- Make sure the shell doesn't show up in itself (Bastien Nocera)
- Make it build and work against new GApplication (Bastien Nocera)
- Fix warning in search renderer (Bastien Nocera)
- Tighten up the spacing of the category views (William Jon McCann)
- Do a better job of automatically sizing the window to fit contents (William Jon McCann)
- Don't use window before it is realized (William Jon McCann)
- Add a get_toplevel accessor to CcShell (Gerd Kohlberger) (#621940)
Sound:
- Initial import of sound panel (William Jon McCann)
Universal access:
- Use GSettings for GTK and icon theme settings (Rodrigo Moya)
- Adjust for removal of GtkComboBoxEntry (Florian Müllner)
- Move to system section (William Jon McCann)
- Tweak the design of the panel (William Jon McCann)
- Use the UI dir set in the Makefile.am (William Jon McCann)
- Dial down the font size on Seeing a bit (William Jon McCann)
User accounts:
- Add user-accounts dialog (William Jon McCann)
- Adapt for gtk_box_new() API changes (Yanko Kaneti)
- Fix endless loop in load_url_handlers (Yanko Kaneti)
Translations:
- ca@valencia (Carles Ferrando)
- es (Jorge González)
- gl (Fran Diéguez)
- he (Yaron Shahrabani)
- ja (Yasumichi Akahoshi, Takayuki KUSANO)
- ko (Changwoo Ryu)
- nb (Kjartan Maraas)
- pa (A S Alam)
- sl (Andrej Žnidaršič, Matej Urbančič)
- te (krishnababu k)
- ug (Gheyret T.Kenji)
===========================
Version 2.91.0 (2010-10-04)
===========================
Common:
- Remove unneeded dependency check for XCursor (Bastien Nocera)
- Adapt to GtkObject removal in GTK3 (Javier Jardón)
- Use gtk_widget_get_preferred_size() instead gtk_size_request_get_size() (Javier Jardón)
- Use upstream gettext insstead the Glib one (Javier Jardón)
- Update autotools configuration (Javier Jardón)
Background:
- Come up with 'Wallpapers' selected and displayed (Kalev Lember) (#630417)
Datetime:
- Add required includes to tz.h (Bastien Nocera)
- Add test application for missing TZ pixmaps (Bastien Nocera) (#630261)
- Fix automake warning (Bastien Nocera)
Default applications:
- Remove Opera from default browser choices (Bastien Nocera) (#627733)
Keyboard:
- Updated for the latest libgnomekbd API (Sergey V. Udaltsov)
Mouse:
- Rename to "Mouse and Touchpad" (Bastien Nocera)
- Remove unneeded XCursor include (Bastien Nocera)
Shell:
- Make search entry single-iconed (Bastien Nocera)
- Show settings without a panel in Other (Bastien Nocera) (#630998)
- Drop font viewer (William Jon McCann)
- Wait until the toplevel is realized before using it (William Jon McCann) (#631051)
- Update for new GTK3 drawing APIs (William Jon McCann)
- Fix .desktop file to work correctly in gnome-shell (William Jon McCann)
Universal access:
- Fix desktop file (Bastien Nocera)
Translations:
- ca (Joan Duran)
- cz (Petr Kovar)
- eu (Inaki Larranaga Murgoitio)
- ro (Lucian Adrian Grijincu)
-------------------------------------------------------------------------------
gnome-control-center 2.90.1 (2010-09-22)
- Add new background panel
Date and Time:
- Draw a label on the timezone map when clicked
- Add Region and City selection
- Fix a number of memory leaks
Display:
- Link display panel to dbus-glib
- Add label to warn that "Same image in all monitors'
may limit the resolution options"
- Don't ignore errors from pkexec when using "Make default"
Default applications:
- Fix possible crashers when themes are switched
Shell:
- Resize shell to the size of the panel when panel is opened
- Allow shrinking the shell, but use a fixed width
- Use icon names as per specification
- Free menu directory contents list
Font viewer:
- Fix font preview not working
General:
- Loads of GTK3 deprecation work
-------------------------------------------------------------------------------
gnome-control-center 2.31.5 (2010-07-12)
Date and Time:
- Add application icon (Thomas Wood, Lapo Calamandrei)
- Remove "seconds" spin button (Thomas Wood)
Display:
- Make sure the screen label is hidden when the panel is closed (Thomas Wood)
Shell:
- Fix panel activation in existing running instance (Thomas Wood)
Universal Access:
- Add size groups (Thomas Wood)
libgnome-control-center:
- Derive CcPanel from GtkBin, rather than GtkAlignment (Thomas Wood)
General:
- Don't build libwindow-settings (Thomas Wood)
- Clean up configure.ac (Thomas Wood)
- Remove capplets directory from build (Thomas Wood)
- GVariant API adjustment: byte_array -> bytestring (Ryan Lortie)
Translations:
- es (Jorge González)
- gl (Fran Diéguez)
- zh_CN (甘露(Gan Lu))
-------------------------------------------------------------------------------
gnome-control-center 2.31.4.2 (2010-06-30)
Date and Time:
- Work around a cairo bug that prevents the map being display correctly
(Thomas Wood)
- Install the UI files into the correct directory (Thomas Wood)
General:
- Make build work with GSEAL (Jonh Wendell)
- Fix compile with recent GTK versions (Richard Hughes)
Translations:
- gl (Fran Diéguez)
- he (Yaron Shahrabani)
-------------------------------------------------------------------------------
gnome-control-center 2.31.4.1 (2010-06-29)
Date and Time:
- Fix memory leak (Thomas Wood)
- Fix .desktop file Exec and use X-GNOME-Settings-Panel identifier (Thomas Wood)
- Make sure DBus is included in the cflags and linked libraries (Thomas Wood)
- Prevent crash when DBus service is not available (Thomas Wood)
-------------------------------------------------------------------------------
gnome-control-center 2.31.4 (2010-06-29)
General:
- Updated to use GTK+ 3 (Rodrigo Moya, Richard Hughes, Bastien Nocera)
Date and Time:
- New panel for configuring date and time settings (Thomas Wood)
Shell:
- Switch to using GtkApplication rather than libunique (Richard Hughes)
libgnome-control-center:
- Remove redundant properties from CcPanel (Thomas Wood)
Translations:
- de (Mario Blättermann)
- eo (Kristjan SCHMIDT)
- es (Jorge González)
- et (Ivar Smolin)
- gl (Fran Diéguez)
- hu (Gabor Kelemen)
- id (Andika Triwidada)
- nb (Kjartan Maraas)
- pa (A S Alam)
-------------------------------------------------------------------------------
gnome-control-center 2.31.3 (2010-06-07)
About Me:
- Catch error messages from passwd (#620135) (Bin Li)
Common:
- Replace deprecated GTK+ symbols. (#572325) (Andre Klapper)
Display:
- Convert to a settings panel (Thomas Wood)
Keyboard:
- Change Print layout to Show layout (Sergey V. Udaltsov)
Shell:
- Ensure padding around each embedded settings panel (Thomas Wood)
- Set the window icon and title when opening a panel (Thomas Wood)
- Improve keyboard navigation (Matthias Clasen)
Universal-Access:
- Implement a new accessibility preferences panel
(Thomas Wood, William Jon McCann)
General:
- Make desktop file naming more consistent (Thomas Wood)
- Add X-GNOME-Settings-Panel key to panel desktop files (Thomas Wood)
- Make sure the Exec line is valid in panel desktop files (Thomas Wood)
Translations:
- es (Jorge González)
- et (Ivar Smolin)
- gl (Fran Diéguez)
- he (Yaron Shahrabani)
-------------------------------------------------------------------------------
gnome-control-center 2.31.2 (2010-05-24)
About Me:
- Don't hang when new and old password are too similar (Milan Bouchet-Valat)
(#619354)
Shell:
- Add a new shell that supports embedded settings panels
(Thomas Wood, William Jon McCann)
libgnome-control-center:
- Add a new library that provides an API to create embedded settings panels for
the new shell (Thomas Wood, William Jon McCann)
Mouse:
- Convert to using the Panel API (Thomas Wood)
Keyboard:
- Convert to using the Panel API (Sergey V. Udaltsov)
Network:
- Convert to using the Panel API (Thomas Wood)
Default Applications:
- Convert to using the Panel API (Thomas Wood)
Keybindings:
- Convert to using the Panel API (Thomas Wood)
Windows:
- Disable from build (Thomas Wood)
Translations:
- sl (Andrej Žnidaršič)
- gl (Fran Diéguez)
- or (Manoj Kumar Giri)
- en@shaw (Thomas Thurman)
-------------------------------------------------------------------------------
gnome-control-center 2.31.1 (2010-05-05)
Common:
- Use only single GTK+ includes (Javier Jardón) (#615292)
- Remove GTK+ deprecated symbols (Javier Jardón) (#572325)
About me:
- Don't hang when new and old password only differ in case (Milan Bouchet-Valat)
- Minor string updates (Jens Granseuer) (#615283)
- Use changes-prevent and changes-allow icons from the icon-them instead of
the outdated lock-icons (Andreas Proschofsky) (#408585)
- Use accessor functions instead direct access (Maxim Ermilov) (#597888)
Display:
- Add a "Make Default" button in gnome-display-properties, which is used to
set up a systemwide default RANDR configuration (Federico Mena Quintero)
- Change icon name to preferences-desktop-display (Jens Granseuer) (#614912)
Keyboard:
- Added tooltips (Sergey Udaltsov) (#615521)
- Use new libgnomekbd function for default group switcher (Sergey Udaltsov)
(#603806)
- Proper response id for the help button (Sergey Udaltsov) (#616917)
Shell:
- Fix issue with g-c-c shell and YaST shell having same unique identifier (Scott Reeves)
Typing break:
- Add support for Ubuntu's app indicator (Travis B. Hartwell)
Translations:
- ar (Khaled Hosny)
- ast (Xandru Armesto)
- ca@valencia (Carles Ferrando)
- crh (Reşat SABIQ)
- de (Mario Blättermann)
- es (Jorge González)
- et (Mattias Põldaru)
- fr (Laurent Coudeur)
- gl (Fran Diéguez)
- gu (Sweta Kothari)
- he (Marios Zindilis)
- hy (Norayr Chilingaryan)
- id (Andika Triwidada)
- kn (Shankar Prasad)
- lv (Peteris Krisjanis)
- ml (Ani Peter)
- mr (Sandeep Shedmake)
- ms (Ahmed Noor Kader Mustajir Md Eusoff)
- nb (Kjartan Maraas)
- oc (Yannig Marchegay)
- or (Manoj Kumar Giri)
- sl (Matej Urbančič)
- zh_CN (Funda Wang)
-------------------------------------------------------------------------------
gnome-control-center 2.30.0 (2010-03-25)
About me:
- Fix global variable confusion (Michal Schmidt)
- Fix remembering of data between runs (Michal Schmidt)
Appearance:
- Mark a string for translation (Gabor Kelemen) (#612015)
- Fix GTK+ multi-threading (Matthias Clasen) (#610003)
Display:
- Don't show a tooltip while a monitor is being dragged (Federico Mena Quintero)
Typing break:
- Lock all the screens (Matthias Clasen) (#492974)
Translations:
- bg (Alexander Shopov)
- bn (Jamil Ahmed)
- ca (Joan Duran)
- crh (Reşat SABIQ)
- cz (Petr Kovar)
- da (Ask H. Larsen)
- de (Christian Kirbach)
- en_GB (Bruce Cowan)
- es (Jorge González)
- et (Ivar Smolin, Mattias Põldaru)
- eu (Inaki Larranaga Murgoitio)
- fi (Tommi Vainikainen)
- fr (Claude Paroz)
- gl (Fran Diéguez)
- gu (Sweta Kothari)
- he (Thanos Lefteris, Kostas Papadimas)
- hu (Gabor Kelemen)
- it (Luca Ferretti)
- ko (Changwoo Ryu)
- lt (Žygimantas Beručka)
- nn (Torstein Adolf Winterseth)
- pa (A S Alam)
- pl (Piotr Drąg)
- pt (Duarte Loreto)
- pt_BR (Og B. Maciel, Antonio Fernandes)
- ro (Adi Roiban)
- ru (Yuri Myasoedov, Юрий Козлов)
- sl (Matej Urbančič)
- sr (Miloš Popović)
- sv (Daniel Nylander)
- ta (vasudeven)
- uk (Maxim V. Dziumanenko)
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
-------------------------------------------------------------------------------
gnome-control-center 2.29.92 (2010-03-08)
Translations:
- ar (Khaled Hosny)
- en_GB (Bruce Cowan)
- eu (Iñaki Larranaga Murgoitio)
- fr (Claude Paroz)
- gl (Fran Diéguez)
- he (Liel Fridman)
- hu (Gabor Kelemen)
- ja (Takayuki KUSANO)
- ko (Changwoo Ryu)
- nb (Kjartan Maraas)
- nn (Torstein Adolf Winterseth)
- pl (Piotr Drąg)
- pt_BR (Antonio Fernandes C. Neto)
- ru (Leonid Kanter)
- sv (Daniel Nylander)
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
-------------------------------------------------------------------------------
gnome-control-center 2.29.91 (2010-02-24)
Appearance:
- Add 'span' as a style for backgrounds
Display Properties:
- Now fits in 640x480 and has a better layout overall.
- Jst use "monitors" for wording, not a mixture of "monitor",
"display", "screen".
- Make the mouse cursor indicate when you can drag a monitor
Translations:
- ar (Khaled Hosny)
- bg (Alexander Shopov)
- ca (Joan Duran)
- de (Mario Blättermann)
- es (Jorge González)
- gl (Fran Diéguez)
- hu (Gabor Kelemen)
- pl (Piotr Drąg)
- pt_BR (Vladimir Melo)
- ro (Lucian Adrian Grijincu)
- sl (Matej Urbančič)
- ta (vasudeven)
- zh_HK & zh_TW (Chao-Hsiung Liao)
-------------------------------------------------------------------------------
gnome-control-center 2.29.90 (2010-02-08)
About-me:
- Fix hangs when 'passwd' outputs unexpected answers (Milan Bouchet-Valat)
- Fix list of passwd error strings (Milan Bouchet-Valat)
- Fix fingerprint name on 2nd page (Bastien Nocera)
At-properties:
- Add AutostartCondition to gnome-at-session.desktop (Martin Pitt) (#608138)
Mouse:
- Fix mnemonics conflicts on touchpad tab (Jens Granseuer) (#608057)
Translations:
- de (Mario Blättermann)
- es (Jorge González)
- et (Ivar Smolin)
- nb (Kjartan Maraas)
- pa (A S Alam)
- pt_BR (Antonio Fernandes C. Neto)
- sl (Matej Urbančič, Andrej Žnidaršič)
-------------------------------------------------------------------------------
gnome-control-center 2.29.6 (2010-01-26)
About-me:
- Add translator comments to 'Home' string (Claude Paroz) (#605944)
Appearance:
- Use GtkInfoBar rather than a copy of GeditMessageArea (Thomas Wood)
Common:
- Don't leak file descriptors when checking for colour schemes (Jens Granseuer) (#606155)
Mouse:
- Disable tapping only for touchpads without a left mouse button (Peter Hutterer)
Translations:
- bg (Alexander Shopov)
- bn (Runa Bhattacharjee, Jamil Ahmed)
- hu (Gabor Kelemen)
- mr (Sandeep Shedmake)
- nb (Kjartan Maraas)
- sv (Daniel Nylander)
- ta (vasudeven)
- uk (Maxim V. Dziumanenko)
-------------------------------------------------------------------------------
gnome-control-center 2.29.4 (2009-12-24)
General:
- Drop obsolete check for HAL (#595832) (Jens Granseuer)
- Use external libslab when available (Vincent Untz)
- Add gthread-2.0 to common modules for linking (#600589) (Jens Granseuer)
- Enable silent build rules (Thomas Wood)
Common:
- Fix all the keybindings showing up when using compiz (#600021) (Bastien
Nocera)
- Fix leak (Jens Granseuer)
- Fix warning (Jens Granseuer)
About-me:
- Fix crash when closing the window using the window button (#592348) (Jens
Granseuer)
- Add missing PNG files (Bastien Nocera)
Appearance:
- Remove interface tab (#592756) (William Jon McCann)
- Add OnlyShowIn=GNOME to the .desktop file (#594709) (Thomas Wood)
- Update the background style option labels (#411048) (Thomas Wood)
- Fix tooltip in the background chooser (#596369) (Matthias Clasen)
- Add support for per-monitor backgrounds (#147808) (William Jon McCann)
Default applications:
- Update the exec arg when changing terminal (#597185) (Vincent Untz)
- Be sure to add the gconf directories for monitoring (#597186) (Thomas Wood)
- Return an empty string for the custom web item (Thomas Wood)
Display:
- Don't assert when the current output doesn't have a resolution set yet
(#593866) (Federico Mena Quintero)
- Automatically turn on outputs which support Mirror Screens (#590823)
(Federico Mena Quintero)
- Sensitize 'Mirror Screens' depending on whether mirror mode is actually
supported (Federico Mena Quintero)
- Desensitize the on/off radio buttons if we are in Mirror Screens mode
(Federico Mena Quintero)
- Show 'Mirror Screens' in the monitor label, not a random monitor's name
(Federico Mena Quintero)
Font Viewer:
- Use pango_language_get_sample_string for sample text (#595107) (Jens
Granseuer)
- Expand the Copyright display to get rid of unnecessary scrollbar (Jens
Granseuer)
- Don't use URI notation when installing fonts (#603732) (Jens Granseuer)
Keybindings:
- Fix broken logic in keybinding tree model (Robert Ancell)
- Fix zombie bindings appearing after deleting custom shortcuts (#596351) (Jens
Granseuer)
- Show shortcuts for the active window manager (#600531) (Wang Xin)
- Remove sleep key entry (#170175) (Bastien Nocera)
Keyboard:
- Major UI reorganization (Sergey V. Udaltsov)
- Fix mnemonic conflict in mousekeys tab (#586433) (Jens Granseuer)
Mouse:
- Disable two-finger scrolling/tapping based on touchpad capabilities. (Peter
Hutterer)
Network:
- Keep proxies in sync when "use same proxy" is selected (#589952) (Cyril
Roelandt)
Typing break:
- Increase delay for activating the postpone button to 5s (#597086) (Tim Waugh)
- Reset timer after suspend (#430797) (Jens Granseuer)
Windows:
- Don't allow Ctrl+Click as window movement modifier (#409405) (Jens Granseuer)
Translations:
- ar (Khaled Hosny)
- ca (Joan Duran)
- ca@valencia (Carles Ferrando Garcia)
- crh (Reşat SABIQ)
- de (Christian Kirbach)
- en@shaw (Thomas Thurman)
- en_GB (Bruce Cowan)
- es (Jorge González)
- et (Ivar Smolin)
- he (Yaron Shahrabani)
- id (Andika Triwidada)
- it (Luca Ferretti)
- lt (Žygimantas Beručka)
- nb (Kjartan Maraas)
- nds (Nils-Christoph Fiedler)
- pl (Tomasz Dominikowski)
- ro (Adi Roiban)
- ru (Alexandre Prokoudine)
- sl (Matej Urbančič)
- sv (Daniel Nylander)
- ta (Dr.T.Vasudevan)
- th (อาคม โชติพันธวานนท์)
- zh_CN (Tao Wei)
-------------------------------------------------------------------------------
gnome-control-center 2.28.0 (2009-09-21)
Appearance:
- Add link buttons to get more themes/backgrounds online (William Jon McCann)
(#323323)
- Add/remove buttons should be the same size (William Jon McCann) (#592510)
- Make slideshows visually distinct (Matthias Clasen) (#591375)
- Don't call gnome_wp_item_ensure_gnome_bg too early (Matthias Clasen)
- Rename some widget ids to make GtkBuilder happy (Luca Ferretti)
- Use XDG user and system data dirs to load backgrounds (William Jon McCann)
- Fix compiler warnings (Jens Granseuer)
- Make the font DPI spin button work again (Jens Granseuer) (#594342)
- Show correct default layout (Michael Terry)
- Update icon because the old one has been removed from g-i-t (Jens Granseuer)
(#594710)
- Allow a window manager to inherit keybindings from another window manager
(Owen Taylor) (#594066)
- Force cursor slide to 100 px, in order to use it without changing
the window width (Luca Ferretti)
Common:
- Drop check for libgnomeui (Jens Granseuer) (#592920)
Translations:
- ar (Khaled Hosny)
- as (Amitakhya Phukan)
- bg (Krasimir "Bfaf" Chonov, Alexander Shopov)
- bn_IN (Runa Bhattacharjee)
- br (Denis ARNAUD)
- ca (Joan Duran)
- cz (Petr Kovar)
- da (Ask H. Larsen)
- de (Wolfgang Stöggl)
- el (Kostas Papadimas)
- en_GB (Bruce Cowan)
- es (Jorge González)
- et (Ivar Smolin, Mattias Põldaru)
- eu (Inaki Larranaga Murgoitio)
- fi (Tommi Vainikainen)
- fr (Bruno Brouard, Claude Paroz)
- gl (Antón Méixome)
- gu (Sweta Kothari)
- he (Yaron Shahrabani)
- hi (Rajesh Ranjan)
- hu (Gabor Kelemen)
- it (Luca Ferretti)
- ja (Takayuki KUSANO )
- kn (Shankar Prasad)
- lt (Gintautas Miliauskas)
- ml (Ani)
- mr (Sandeep Shedmake)
- nb (Kjartan Maraas)
- or (Manoj Kumar Giri)
- pa (A S Alam )
- pl (Piotr Drąg)
- pt (Duarte Loreto)
- pt_BR (Krix Apolinário, Og Maciel, Djavan Fagundes)
- ro (Lucian Adrian Grijincu)
- sr (mpopovic)
- sv (Daniel Nylander)
- ta (ifelix)
- te (krishnababu k)
- tr (Baris Cicek)
- uk (Maxim V. Dziumanenko)
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
-------------------------------------------------------------------------------
gnome-control-center 2.27.91 (2009-08-24)
Appearance:
- Use unique widget IDs (Jens Granseuer) (#592182)
- Add workaround for glade-3 not working with vbox (William Jon McCann) (#584029)
- Fix parentless modal dialogs in theme installer (William Jon McCann) (#592354)
Common:
- Add schemas file (William Jon McCann)
- Fix distcheck (William Jon McCann)
Display:
- Fix dragging of rotate monitors (Matthias Clasen) (#578109)
Font viewer:
- Use preferences-desktop-font for the icon (Jens Granseuer) (#592642)
- Fix filename after GTKBuilder migration (Claude Paroz)
Mouse:
- Keep touchpad UI in sync with GConf (Jens Granseuer) (#592425)
Network:
- Update the ignored hosts list when the location changes (Maxim Ermilov) (#581472)
Shell:
- Updated to latest libslab (Rodrigo Moya)
Translations:
- bn (Jamil Ahmed)
- de (Christian Kirbach)
- es (Jorge González)
- et (Ivar Smolin)
- gl (Antón Méixome)
- it (Luca Ferretti)
- ko (Changwoo Ryu)
- nb (Kjartan Maraas)
- pt_BR (Henrique P. Machado)
- sv (Daniel Nylander)
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
-------------------------------------------------------------------------------
gnome-control-center 2.27.90 (2009-08-17)
About-me:
- Remove old code poking directly into the pwent (Matthias Clasen)
- Port to PolicyKit-1.0 (Matthias Clasen)
Appearance:
- Fix crash when iterating through the tree model (Jens Granseuer) (#591392)
- Make sure the underline in "Save _As..." is interpreted (Christian Hergert)
- Attributes tag is not supported in GtkButtons (Claude Paroz) (#591656)
Common:
- Change error message reference about Bonobo to DBus (Rodrigo Moya)
- Remove markup from translatable string (Claude Paroz) (#590933)
- Fix compiler warnings (Jens Granseuer)
Display:
- Don't sort the outputs before creating the labeler (Federico Mena Quintero)
- Remove dead code (Federico Mena Quintero)
- Ensure that the output labels fit inside the monitor rectangles (Federico
Mena Quintero)
Shell:
- Remove libgnomeui usage (Andreas Proschofsky) (#586527)
- Do not depend on libpanel-applet (Vincent Untz)
- Fix requires in gnome-window-settings-2.0.pc (Vincent Untz)
- Use GOption in the shell (Vincent Untz)
- Fix error message with unknown option in shell (Vincent Untz)
- Use libunique in the shell to have a single-instance shell (Vincent Untz)
- Update to latest libslab, and do not install libslab on the system (Vincent
Untz)
Translations:
- ar (Khaled Hosny)
- cs (Andre Klapper)
- de (Christian Kirbach)
- es (Jorge González)
- et (Mattias Põldaru and Ivar Smolin)
- fi (Tommi Vainikainen)
- ga (Seán de Búrca)
- gl (Antón Méixome)
- he (Mark Krapivner)
- hi (Rajesh Ranjan)
- it (Luca Ferretti)
- nb (Kjartan Maraas)
- or (Manoj Kumar Giri)
- sv (Daniel Nylander)
-------------------------------------------------------------------------------
gnome-control-center 2.27.5 (2009-07-28)
Default applications:
- Don't clear the custom browser command on startup (Jens Granseuer) (#590316)
General:
- Remove all libglade dependencies (Robert Ancell)
- Remove markup from translatable strings in GTKBuilder files (Claude Paroz)
(#599759)
Network:
- Fix unparsed mnemonics (Felix Riemann) (#590364)
Shell:
- Removed deprecated dependencies from libslab (Federico Mena Quintero, Felix Riemann)
- Adapted shell to new libslab API (Rodrigo Moya)
- Remove libgnome and libgnomeui dependencies (Rodrigo Moya)
Translations:
- ar (Khaled Hosny)
- br (Denis Arnaud)
- et (Ivar Smolin)
- fr (Claude Paroz)
- ga (Seán de Búrca)
- lt (Žygimantas Beručka)
- nb (Kjartan Maraas)
- pt_BR (Krix Apolinário)
-------------------------------------------------------------------------------
gnome-control-center 2.27.4.1 (2009-07-16)
About me:
- EXTRA_DIST fingerprint icons (Rodrigo Moya)
Common:
- Automatically generate .gitignore files with git.mk (Thomas Wood)
Network:
- Remove libglade dependency from gnome-network-properties (Felix Riemann)
Translations:
- gu (Sweta Kothari)
-------------------------------------------------------------------------------
gnome-control-center 2.27.4 (2009-07-15)
About me:
- New icons for fingerprint screen (Michael Langlie)
Appearance:
- Migrate to GtkBuilder (Thomas Wood)
- Remove custom cell renderers (Thomas Wood)
At-properties:
- Remove libglade depency from at-properties capplet (Felix Riemann)
Default applications:
- Remove libglade dep from default-applications capplet (Felix Riemann)
Display:
- Remove libglade dependency from display-properties capplet (Felix Riemann)
Keybindings:
- Remove libglade dependency from keybindings capplet (Felix Riemann)
Mouse:
- Support touchpad configuration through device properties (Peter Hutterer)
Shell:
- Fix libslab for single includes in GTK+ (Thomas Wood)
Typing break:
- Use GtkUIManager to replace GtkItemFactory (Thomas Hindoe Paaboel Andersen)
Windows:
- Strip libglade dependency from gnome-window-properties (Felix Riemann)
Translations:
- es (Jorge González)
- et (Ivar Smolin)
- gu (Sweta Kothari)
- uk (Maxim V. Dziumanenko)
-------------------------------------------------------------------------------
gnome-control-center 2.27.3 (2009-06-29)
About me:
- Initialize GThread subsystem (Vivian Zhang) (#583451)
Appearance:
- After removing an image set the cursor to the newly selected wallpaper so
that keyboard navigation works as expected (Jens Granseuer) (#575075)
- Search GTK+ icon theme search path for icon themes (Jens Granseuer) (#575906)
- Only delete the theme if the user pressed OK (Benjamin Berg) (#578694)
- Close gtkrc files after use (Jens Granseuer) (#578835)
- Fix theme engine detection on non-UNIX platform (Jens Granseuer) (#581156)
- Don't unref NULL GConf entries (Jens Granseuer)
- After removing an image set the cursor to the newly selected wallpaper (Jens
Granseuer) (#575075)
Default applications:
- Add Arora to list of browsers (Bastien Nocera)
Display:
- Pass a transient parent ID to the ApplyConfiguration callback so that it
can make its confirmation dialog a child of the parent (Federico Mena Quintero)
(#576006)
- Simplify calls to dbus-glib which cannot fail (Federico Mena Quintero)
- Ensure that there will be a backup file before committing (Federico Mena Quintero)
(#486093)
- Make the monitor heading be explicitly black (Federico Mena Quintero) (#556050)
- Fix the layout-outputs-horizontally helper (Federico Mena Quintero)
- Use the timestamp of the Apply button to change the RANDR configuration (Federico
Mena Quintero)
- Don't pop up a redundant error dialog (Federico Mena Quintero)
Font viewer:
- Safely printf strings (Christian Persch)
- Interrupt thumbnailing at 30 s instead of 30 msecs (Jens Granseuer) (#584107)
Keybindings:
- Make activating a section header row expand or collapse the section as expected
instead of crashing (Jens Granseuer) (#577474)
- Make the custom keybinding UI smoother (Matthias Clasen)
- Don't needlessly write entries back to gconf on startup (Matthias Clasen) (#581986)
Keyboard:
- Dependency on libxklavier 4.0, optional load/display of extra layouts (Sergey V.
Udaltsov)
Shell:
- Fix libslab svn:external problem (Rodrigo Moya)
Translations:
- ar (Djihed Afifi)
- ca (Gil Forcada)
- cs (Petr Kovar)
- crh (Reşat SABIQ)
- de (Jürg Billeter, Andre Klapper)
- es (Jorge Gonzalez Gonzalez)
- et (Ivar Smolin, Mattias Põldaru)
- fr (Bruno Brouard)
- gr (Marios Zindilis, Nikos Charonitakis)
- hi (Manoj Kumar Giri, Rajesh Ranjan)
- hu (Gabor Kelemen)
- it (miloc)
- ja (Takeshi AIHANA)
- kn (Shankar Prasad)
- lv (Raivis Dejus)
- nb (Kjartan Maraas)
- or (Manoj Kumar Giri)
- ru (Nickolay V. Shmyrev)
- sl (Matej Urbančič)
- sk (Marcel Telka)
- sr@Latin (Miloš Popović)
- vi (Nguyễn Thái Ngọc Duy)
- zh_CN (M Zhang, Deng Xiyue)
-------------------------------------------------------------------------------
gnome-control-center 2.26.0 (2009-03-16)
About me:
- Fix warning when selecting a finger to enroll in the combo box
(Bastien Nocera) (#574974)
Default applications:
- Fix mnemonic conflicts (Jens Granseuer)
Display:
- Make the strings of the rotation dialog appear translated (Gabor Kelemen)
(#574693)
- Fix crash when refreshing RANDR configuration (Federico Mena Quintero)
(#574865)
Font viewer:
- Stop the font thumbnailer eating all the CPU (Bastien Nocera) (#573795)
Keybindings:
- Fix mnemonics conflict on the custom shortcut window (Jens Granseuer)
Typing break:
- Revert string freeze breaker (Thomas H.P. Andersen) (#572325)
Translations:
- af (Friedel Wolff)
- as (Amitakhya Phukan)
- bg (Alexander Shopov)
- bn_IN (Runa Bhattacharjee)
- cs (Petr Kovar, Lucas Lommer)
- de (Christian Kirbach, Hendrik Richter)
- el (Jennie Petoumenou)
- en_GB (Philip Withnall)
- es (Jorge Gonzalez)
- fi (Tommi Vainikainen)
- gl (Ignacio Casal Quinteiro)
- gu (Ankitkumar Patel)
- he (Mark Krapivner, Yaron Sharabani)
- hi (Rajesh Ranjan)
- hu (Gabor Kelemen)
- it (Milo Casagrande)
- ja (Takeshi AIHANA)
- lt (Gintautas Miliauskas)
- mai (Rajesh Ranjan)
- ml (Ani Peter)
- mr (Sandeep Shedmake)
- nl (Wouter Bolsterlee)
- or (Manoj Kumar Giri)
- pl (Tomasz Dominikowski)
- pt (Duarte Loreto)
- pt_BR (Andre Gondim)
- ru (Nickolay V. Shmyrev)
- sv (Daniel Nylander)
- ta (I. Felix)
- te (Krishnababu K)
- th (Theppitak Karoonboonyanan)
- tr (Baris Cicek)
-------------------------------------------------------------------------------
gnome-control-center 2.25.92 (2009-03-02)
General:
- remove lots of deprecated GDK/GTK+ calls (Thomas H.P. Andersen) (#572325)
Appearance:
- fix message markup appearing in post-install dialog (Jens Granseuer)
(#572453)
Display:
- don't block the GUI while changing RANDR configuration
(Federico Mena Quintero)
- realign outputs after a resolution change (Federico Mena Quintero)
- use black text for enabled monitors (Federico Mena Quintero)
- change window title and menu entry to "Display"/"Display Preferences"
(Jens Granseuer) (#570907)
Keybindings:
- fix saving custom shortcut commands (Jens Granseuer) (#572501)
- always show "" for shortcuts without a description
(Jens Granseuer) (#572808)
Keyboard:
- add visual bell settings (Matthias Clasen) (#564998)
- fix initial layout preview (Matthias Clasen) (#550721)
- restore help button in layout options (Sergey Udaltsov) (#556952)
- remove non-existing icon from sound notifications button (Jens Granseuer)
(#570906)
Font Viewer:
- initialize type system to fix hang (Jonas Bonn) (#572189)
Translations:
- ast (Mikel González)
- be@latin (Ihar Hrachyshka)
- bg (Alexander Shopov)
- ca (Gil Forcada)
- da (Kenneth Nielsen)
- en_GB (Philip Withnall)
- es (Jorge Gonzalez)
- et (Priit Laes)
- eu (Inaki Larranaga Murgoitio)
- fi (Ilkka Tuohela)
- fr (Claude Paroz)
- gu (Sweta Kothari)
- he (Mark Krapivner)
- hu (Gabor Kelemen)
- it (Milo Casagrande)
- ja (Takeshi Aihana)
- ko (Changwoo Ryu)
- nb (Kjartan Maraas)
- pl (Tomasz Dominikowski)
- pt (Duarte Loreto)
- pt_BR (André Gondim, Jonh Wendell, Og Maciel)
- ro (Jani Monoses)
- sv (Daniel Nylander)
- th (Theppitak Karoonboonyanan)
- vi (Clytie Siddall)
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
-------------------------------------------------------------------------------
gnome-control-center 2.25.90 (2009-02-04)
General:
- Rename gnome-network-preferences to gnome-network-properties (Luca Ferretti)
(#554342)
- Add optional libcanberra-gtk dependency
About me:
- Build fixes
- Fix email addresses being generated by g-a-m always being saved as type
"OTHER" (Jens Granseuer) (#570113)
Appearance:
- Fix newly installed themes appearing twice in the GTK themes list if the
package contains themes for both GTK and metacity (Jens Granseuer) (#568595)
- Use "Desktop Background" instead "Wallpaper" as per GDP glossary (Luca
Ferretti) (#569382)
Common:
- Add GnomeThemeElement parameter to the ThemeChangedCallback so that the
receiver can determine what part of the theme changed (Jens Granseuer)
Default application:
- Fix the https handler never being set (Bastien Nocera) (#568408)
- Update the web entry with the correct command for the selected option instead
of always using the default (Jens Granseuer)
Display:
- Build fixes
- Add On/Off radio buttons to turn on/off a monitor (Federico Mena Quintero)
- Don't crash if we don't have an output (Jens Granseuer) (#569218)
Keybindings:
- Build fixes
- Print a warning when a key doesn't have a schema, so no description (Bastien
Nocera)
- Make Enter work as expected in the custom key shortcut edit dialogue (Bastien
Nocera)
Keyboard:
- Sort options by description (Sergey Udaltsov)
- Hide help button in Options (Sergey Udaltsov) (#556952)
- Allow setting a repeat delay of up to 2 seconds (Jens Granseuer) (#569612)
Shell:
- Use single GTK includes in slab (Magnus Boman) (#551850)
- Compile with G*_DISABLE_DEPRECATED in slab (Magnus Boman) (#551850)
Typing break:
- Play a sound when the display is locked or unlocked (Maxim Ermilov) (#169473)
Translations:
- ca (Joan Duran)
- el (nikosCharonitakis)
- es (Jorge González)
- fi (Timo Jyrinki)
- he (Mark Krapivner)
- it (Luca Ferretti)
- ko (Young-Ho Cha)
- lt (Vytautas Liuolia)
- lv (Raivis Dejus)
- mg (Thierry Randrianiriana)
- mn (Badral)
- nb (Kjartan Maraas)
- nl (Wouter Bolsterlee)
- or (Manoj Kumar Giri)
- pa (Amanpreet Singh Alam)
- pl (Tomasz Dominikowski)
- pt_BR (Henrique P Machado)
- ru (Nickolay V. Shmyrev)
- sr (Данило Шеган)
- sv (Daniel Nylander)
- uk (Maxim V. Dziumanenko)
- uz@cyrillic (Nurali Abdurahmonov)
- uz (Nurali Abdurahmonov)
- zh_CN (甘露(Gan Lu))
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
-------------------------------------------------------------------------------
gnome-control-center 2.25.3 (2008-12-18)
General:
- Remove sound capplet and documentation, it moved to gnome-media
(Bastien Nocera)
About me:
- Add support for fingerprint readers with more than one enrollment stage
(Bastien Nocera)
Display:
- Display errors when any happen (Federico Mena Quintero)
- Slight UI changes (Federico Mena Quintero)
- When a monitor is selected, update the monitor label to have the monitor's
name and colour so they know which one is being edited (Federico Mena Quintero)
- Make the monitor on which the dialogue appears the default one on startup
(Federico Mena Quintero)
- Fix monitors still overlapping when turning off "Mirror screens"
(Federico Mena Quintero)
- Remove unneeded help button (Federico Mena Quintero)
-------------------------------------------------------------------------------
gnome-control-center 2.25.2 (2008-12-02)
General:
- Only include top-level headers for glib and GTK+ (Maxim Ermilov) (#561562)
- Optionally check for PolicyKit (Bastien Nocera)
- Don't try to delete directories twice (Jens Granseuer) (#562371)
- Don't recognize "" as a valid engine for certain GTK themes (Jens Granseuer)
(#315286)
About me:
- Add support for enrolling fingerprints using the fprintd D-Bus service
(Bastien Nocera) (#561881)
Appearance:
- Don't initialize gettext and GTK twice (Jens Granseuer)
- Add missing arg to capplet_init (Kjartan Maraas)
- Use g_ascii_strcasecmp instead of the deprecated g_strcasecmp (Maxim Ermilov)
(#560424)
- Really remove the temp dir when the transfer is cancelled (Jens Granseuer)
- Fix leak (Jens Granseuer)
Font viewer:
- Remove gnome-vfs dependency (Saleem Abdulrasool) (#561319)
Keybindings:
- Respect the /desktop/gnome/keybindings/allowed_keys key (Matthias Clasen)
Network:
- Add support for network profiles (Maxim Ermilov) (#477040)
Typing break:
- Use g_object_unref instead of the deprecated gdk_window_unref (Maxim Ermilov)
(#561679)
Shell:
- Add libgnomeui dependency back (Kjartan Maraas)
- Remove eel dependency (dmacks@netscape.org) (#561944)
- Fix leak (Federico Mena Quintero)
- Use the new GtkTooltip mechanism rather than the deprecated GtkTooltips
(Federico Mena Quintero)
Translations:
- es (Jorge Gonzalez)
- it (Luca Ferretti)
-------------------------------------------------------------------------------
gnome-control-center 2.25.1 (2008-11-05)
General:
- resurrect gnome-font-viewer and gnome-thumbnail-font (Davyd Madeley)
- reduce libgnome* usage (Søren Sandmann)
- require GTK+ 2.13.1 (Jens Granseuer)
- require gnome-desktop 2.25.1 (Jens Granseuer)
- code cleanups (Jens Granseuer, Christian Persch, Kjartan Maraas, Bastien Nocera)
Common:
- use translated names for icon themes if available (Jens Granseuer) (#554272)
- fix error handling when launching help (Jens Granseuer)
Appearance:
- connect the help buttons to the most appropriate sections in the user guide
(Matthias Clasen) (#554957)
Default application:
- add Listen to the list of media players (Julien Lavergne)
Display:
- show an error dialog instead of crashing when initialization fails due to
XRandR not being available (Matt Keenan) (#553762)
- fix preview orientation when using left or right rotation (Jens Granseuer) (#555241)
- use new clone mode API in gnome-desktop (Søren Sandmann)
- XOR the old and the new regions instead of subtracting old from new (Søren
Sandmann) (#551566)
Keybindings:
- fix editability of group headings (Matthias Clasen) (#556967)
- avoid duplicate custom keybindings (Matthias Clasen) (#556977)
- add UI for adding and removing named custom shortcuts (Matthias Clasen) (#114796)
Keyboard:
- fix group sorting (Sergey Udaltsov)
- update group expander highlighting dynamically (Sergey Udaltsov)
- connect the stickykeys_two_key_off button (Jens Granseuer) (#556818)
- remember sorted list of expanders in properties (Sergey Udaltsov)
- scroll the options window when the keyboard focus moves out of the visible
part (Jens Granseuer) (#557944)
- hide/show the "Default" column depending on the "layout per window" checkbox
(Sergey Udaltsov) (#555261)
Sound:
- make the filechooser default to a sensible directory (Bastien Nocera)
Windows:
- Use the right values for the h/v maximization titlebar doubleclick action
(Matthias Clasen) (#554962)
Translations:
- ast (Esbardu)
- bg (Yavor Doganov)
- ca@valencia (Robert Millan)
- cs (Petr Kovar)
- da (Ask Hjorth Larsen)
- el (nikosCharonitakis)
- et (Priit Laes)
- fi (Timo Jyrinki)
- he (Mark Krapivner)
- hu (Gabor Kelemen)
- nb (Kjartan Maraas)
- nl (Wouter Bolsterlee)
- pt_BR (Leonardo Ferreira Fontenelle)
- sk (Pavol Šimo)
- sr (Данило Шеган)
- sv (Daniel Nylander)
- th (Theppitak Karoonboonyanan)
- uk (Maxim V. Dziumanenko)
-------------------------------------------------------------------------------
gnome-control-center 2.24.0.1 (2008-09-24)
Appearance:
- fix newly-introduced crash in theme tab (Jens Granseuer) (#553541)
-------------------------------------------------------------------------------
gnome-control-center 2.24.0 (2008-09-22)
Accessibility:
- improve tooltip wording (Wang Xin)
Appearance:
- when a hidden theme is selected, and therefore becomes visible,
create a thumbnail for it (Jens Granseuer) (#547301)
- don't fail if the destination files already exist and the user tries
to overwrite them (Jens Granseuer) (#552671)
- set GtkAdjustment page size to 0 to avoid roblems due to newly enforced
value boundaries in GTK+ 2.14. (Jens Granseuer ) (#551740)
Common:
- properly initialize the callback data (Jens Granseuer) (#550263)
Default application:
- don't advertise startup-notify. The script doesn't support it (Jens Granseuer)
(#550694)
- use a11y icon instead of searchtool (Jens Granseuer) (#550742)
Display:
- Use "Mirror Screens" instead of "Cloned Output" in the display of monitors,
to be consistent with the corresponding checkbox from the Glade file.
(Federico Mena Quintero)
- use theme colours for the background (Bruce Cowan) (#545117)
Keybindings:
- don't use the term "accelerator" in the UI (Jens Granseuer) (#547276)
Keyboard:
- chosing first variant by default (Sergey Udaltsov) (#550722)
- using the fact that latest libxklavier returns descriptions in UTF-8,
no need to convert in 8-bit locales (Sergey Udaltsov)
- set GtkAdjustment page size to 0 to avoid problems due to newly enforced
value boundaries in GTK+ 2.14. (Jens Granseuer) (#551740)
Network:
- set GtkAdjustment page size to 0 to avoid roblems due to newly enforced
value boundaries in GTK+ 2.14. (Jens Granseuer ) (#551740)
Sound:
- trying to print NULL strings crashes on Solaris (Brian Cameron) (#548586)
- add context to event sound names (Claude Paroz ) (#549489)
Translations:
- ar (Djihed Afifi)
- bg (Yavor Doganov)
- bn_IN (Runa Bhattacharjee)
- ca (Joan Duran)
- cs (Petr Kovar)
- da (Ask Hjorth Larsen)
- de (Hendrik Richter)
- dz (Dawa pemo)
- el (Kostas Papadimas)
- en_GB (David Lodge)
- es (Jorge González)
- et (Ivar Smolin)
- eu (Iñaki Larrañaga Murgoitio)
- fi (Timo Jyrinki)
- fr (Claude Paroz)
- ga (Seán de Búrca)
- gl (Ignacio Casal Quinteiro)
- gu (Sweta Kothari)
- he (Mark Krapivner)
- hr (Miroslav Sabljić)
- hu (Gabor Kelemen)
- it (Luca Ferretti)
- ja (Takeshi AIHANA)
- ko (Young-Ho Cha)
- lt (Vytautas Liuolia)
- mk (Arangel Angov)
- ml (Ashik Salahudeen)
- mr (Sandeep Shedmake)
- nb (Kjartan Maraas)
- nl (Reinout van Schouwen)
- pl (Tomasz Dominikowski)
- pt_BR (Leonardo Ferreira Fontenelle)
- pt (Duarte Loreto)
- ro (Dan Damian)
- ru (Nickolay V. Shmyrev)
- sq (Laurent Dhima)
- sr (Данило Шеган)
- sv (Daniel Nylander)
- ta (Dr.T.Vasudevan)
- th (Theppitak Karoonboonyanan)
- tr (Baris Cicek)
- vi (Clytie Siddall)
- zh_CN (Yang Zhang)
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
-------------------------------------------------------------------------------
gnome-control-center 2.23.90 (2008-08-18)
Appearance:
- Use default icon for unknown themes (Jens Granseuer)
- Remove help button (Jens Granseuer)
Common:
- Make sure we have a notification theme before trying to save it
(Jens Granseuer) (#547448)
- Keep track of hidden themes (Jens Granseuer) (#547301)
- Require gnome-desktop 2.23.90
Display:
- Draw rotated outputs rotated (Soren Sandmann)
- Don't leak the application or the GladeXML (Jens Granseuer)
- Replace all uses of g_print with g_debug (Jens Granseuer)
- Fail gracefully if we cannot get a screen (Jens Granseuer)
- Add sexy labels to identify monitors (Federico Mena Quintero)
Shell:
- Remove eel dependency from libslab (Federico Mena Quintero) (#524778)
Sound:
- Fix warning due to left-over developer code (Jens Granseuer) (#546583)
- HIG fixes and improved wording (Bastien Nocera) (#545219)
- Make the event sound preview button listen to "activate" signal so it
becomes accessible via keyboard (Matthias Clasen) (#547808)
Translations:
- ar (Khaled Hosny)
- be@latin (Ihar Hrachyshka)
- es (Jorge Gonzalez)
- et (Ivar Smolin)
- fi (Ilkka Tuohela)
- ga (Sean de Burca)
- gl (Ignacio Casal Quinteiro)
- ja (Takeshi AIHANA)
- he (Yair Hershkovitz)
- nb (Kjartan Maraas)
- pt (Duarte Loreto)
- pt_BR (Djavan Fagundes)
- th (Theppitak Karoonboonyanan)
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
-------------------------------------------------------------------------------
gnome-control-center 2.23.6 (2008-08-04)
Appearance:
- Make theme installation from GIO-supported sources work (including
drag and drop) (Jens Granseuer) (#545335)
Default Applications:
- Fix custom commands for mail default application (James Westby)
Display:
- Add a check box to turn on and off display icon (Soren Sandmann)
- Draw rotated outputs rotated (Soren Sandmann)
General:
- Move directory deletion code from appearance capplet into common
code (Bastien Nocera)
- Make the file transfer dialog work with GFiles instead of gchar
paths internally (Jens Granseuer)
- Don't set notification theme to "standard" if the metatheme loaded
doesn't define one (Jens Granseuer) (#546036)
Keybindings:
- When trying to assign a shortcut that is already in use, ask the user
whether to reassign it instead of refusing to do anything (Denis
Washington) (#133318)
Shell:
- Don't do thumbnailing, let Nautilus do it (Federico Mena Quintero)
- Fix a build warning (Cosimo Cecchi) (#544538)
Sound:
- Remove separate bell settings tab (Bastien Nocera)
- Remove libsounds dependency (Bastien Nocera)
- Add freedesktop sound theme support through libcanberra (Bastien Nocera)
- Fix property passing (Lennart Poettering)
- Plug some leaks (Jens Granseuer)
- Add some filtering for OSS devices and create more useful device
descriptions (Alexander Schwenn) (#545275)
- Added missing file to pass distcheck (Rodrigo Moya)
Translations:
- ar (Djihed Afifi)
- es (Jorge Gonzalez)
- gl (Ignacio Casal Quinteiro)
- nb (Kjartan Maraas)
- pt_BR (Leonardo Ferreira Fontenelle)
- sv (Daniel Nylander)
-------------------------------------------------------------------------------
gnome-control-center 2.23.5 (2008-07-24)
General:
- Remove VFS methods code (Rodrigo Moya)
- Intltool churn (Jens Granseuer, Soren Sandmann)
- Use standard icon names from icon naming spec (Matthias Clasen,
#539339)
Appearance Capplet:
- Don't delete ~/.icons when deleting the last icon theme
(Jens Granseuer, #543763)
- Add notification themes to the metatheme format (Matthias
Clasen, #533611)
Display Capplet:
- New RandR 1.2 based capplet with support for dual screens and stuff.
(Soren Sandmann, Federico Mena Quintero)
Default Applications:
- Use -x instead of -e as exec_flag for Terminator. (Jens
Granseuer, #544058).
- Install the default apps list in the default-apps subdirectory (Jens Granseuer)
- Make it possible for apps to install additional XML files to
extend the list of available applications (Aprotim Sanyal,
#527304).
Mouse Capplet:
- Decrease lower boundary of dwell delay to 0.2 (Gerd Kohlberger)
Translations:
- Remove pa.po from toplevel (Gerd Kohlberger)
- es (Jorge Gonzalez)
- gl (Ignacio Casal Quinteiro)
- fr (Bruno Brouard, Claude Paroz)
- he (Yair Hershkovitz)
- be@latin (Ihar Hrachyshka)
- th (Theppitak Karoonboonyanan)
- oc (Yannig Marchegay)
- nb (Kjartan Maraas)
- et (Priit Laes)
Typing Break:
- Use a modal window (Andrey Gusev, #441786)
- When postponing a break don't go right back to warn state,
but award some bonus time according to the already elapsed break time
(Andrey Gusev, #133295).
-------------------------------------------------------------------------------
gnome-control-center 2.23.4 (2008-06-16)
default applications:
- Convert to use GConfPropertyEditor and remove a lot of duplicated code in
the process (Thomas Wood)
- Provide a Tango style application icon (Jakub Steiner, Thomas Wood) (#397312)
typing break:
- When postponing a voluntary break, go back to the state before taking the
break instead of going to warn state (Andrey Gusev) (#134595)
general:
- Increased gnome-desktop requirement (Rodrigo Moya)
updated translations:
- ar (Djihed Afifi)
- es (Jorge Gonzalez)
- hu (Gabor Kelemen)
- nb (Kjartan Maraas)
- th (Theppitak Karoonboonyanan)
- zh_CN (Funda Wang)
------------------------------------------------------------------------------
gnome-control-center 2.23.3 (2008-06-04)
appearance:
- Remove the last traces of gnome-vfs (Lincoln de Sousa) (#524401)
- Fix theme deletion (Jens Granseuer)
- Update to match API changes in gnome-desktop (Soeren Sandmann)
- Fix "zoom" mode (Soeren Sandmann)
- Use URIs instead of paths for drag and drop (Soeren Sandmann)
- Delay creation of the wallaper file chooser for increased startup
performance (Thomas Wood)
default-applications:
- Major refactoring to use GConfPropertyEditor and reduce code duplication
(Thomas Wood)
keybindings:
- Don't use deprecated GTK+ symbol (William Jon McCann)
- Add support for editing custom keybindings (create/delete not yet
implemented) (Jens Granseuer)
general:
- Remove themus vfs-method (Thomas Wood)
- Minor cleanup in capplet-util and gconf-property-editor (Thomas Wood,
Jens Granseuer)
updated translations:
- ar (Djihed Afifi)
- gl (Ignacio Casal Quinteiro)
- vi (Clytie Siddall)
------------------------------------------------------------------------------
gnome-control-center 2.23.2 (2008-05-17)
about-me:
- Fix image scaling on the photo button (Ben LeMasurier) (#309629)
- Fix build on Solaris (Laszlo Peter) (#532893)
- Properly handle errors when no icon is available (Jens Granseuer)
- Fix handling of Home and Work email addresses (Jens Granseuer) (#317835)
- Close a memory leak (Jens Granseuer)
appearance:
- Convert some more parts to gio (Lincoln de Sousa, Jens Granseuer)
- Show errors for incomplete control themes (Jens Granseuer)
- Add support for installing missing GTK+ theme engines via PackageKit
(Jens Granseuer) (#511065)
keyboard:
- Don't close the Keyboard Layout Options window when the Help button is
clicked (Thomas Wood) (#529772)
- Access keyboard layouts by country or language (Sergey Udaltsov)
network;
- Drop gnome-vfs dependency (Jens Granseuer)
sound:
- Add support for OSS4 mixers (Tim-Phillip Mueller) (#529720)
general:
- libbackground is no longer needed (Soeren Sandmann)
- Remove iso-codes dependency again (Sergey Udaltsov)
- Require libxklavier 3.6 (Sergey Udaltsov)
- Port theme handling code from gnome-vfs to gio (Jens Granseuer)
updated translations:
- es (Jorge Gonzalez)
- fr (Stephane Raimbault)
- gl (Ignacio Casal Quinteiro)
- he (Yair Hershkovitz)
- hu (Gabor Kelemen)
- nb (Kjartan Maraas)
- pt_BR (Leonardo Ferreira Fontenelle)
------------------------------------------------------------------------------
gnome-control-center 2.23.1
about-me:
- Launch the error dialog with the proper parent (Jens Granseuer)
accessibility:
- Add button to launch mouse accessibility properties (Patrick Wade) (#515078)
- Don't show the "accessible login" button if gdmsetup is not available
(Matthias Clasen) (#526944)
- Open the preferred applications dialog on the a11y page (Jens Granseuer)
(#528196)
appearance:
- Allow the user to revert a font change proposed by a metatheme (Patrick
Wade) (#519065)
- Add a custom cell renderer for metatheme names to allow rounded corners
on the selection indicator (Thomas Wood) (#500276)
- Replace gnome-vfs with gio (Lincoln de Souza) (#524401)
- Show a warning message when the selected theme is incomplete (Jens Granseuer)
default applications:
- Add -p/--show-page to open the dialog on a specific page (Jens Granseuer)
(#528196)
keybindings:
- Fix mismatched modifier mapping between egg and GTK (Jens Granseuer)
- Fix Esc and Backspace being bindable when Caps Lock is on (Bastien Nocera)
(#524813)
- Get rid of unneeded sort model indirection (Jens Granseuer)
keyboard:
- Fix various string and layout issues (Jens Granseuer) (#521826)
mouse:
- Add support for starting the capplet on the appearance tab (Patrick Wade)
(#515078)
- Remove unused custom widget (Gerd Kohlberger) (#527418)
network:
- Renamce "Advanced configuration" tab to "Ignored hosts" (Denis Washington)
(#314883)
sound:
- Don't mention esd (Jens Granseuer) (#523888)
- Sort mixer devices alphabitically (Jens Granseuer) (#525530)
themus:
- Handle failed thumbnailing attempts properly (Jens Granseuer)
windows:
- Add "Maximize Vertically" and "Maximize Horizontally" to possible double-click
actions (Cosimo Cecchi) (#329503)
- Require metacity <= 2.23.1 (Cosimo Cecchi)
general:
- Figure out where GTK+ expects its theme engines and make that info available
to interested capplets (Jens Granseuer)
- Introduce dependency on iso-codes (Sergey Udaltsov)
updated translations:
- bg (Alexander Shopov)
- en_GB (Philip Withnall)
- es (Jorge Gonzalez)
- et (Priit Laes)
- he (Yair Hershkovitz)
- hu (Gabor Kelemen)
- it (Luca Ferretti)
- ka (Vladimer Sichinava)
- nb (Kjartan Maraas)
- nn (Eskild Hustvedt)
- ru (Yuri Kozlov)
- te (Sunil Mohan Adapa)
------------------------------------------------------------------------------
gnome-control-center 2.22.1
appearance:
- Don't resize the font samples vertically when the window is resized
(Jens Granseuer) (#521823)
- Fix warning when trying to drag an unselected item (Jens Granseuer)
(#523347)
- Don't try to unref URIs if the theme package is invalid (Jens Granseuer)
(#524567)
common:
- Fix a crash when schemas are not properly installed (Jens Granseuer)
(#520744)
- Fix error handling in the thumbnailer (Jens Granseuer) (#521009)
- Actually check the cursor size before changing it in GConf (Jens Granseuer)
keybindings:
- Remove debugging output (Jens Granseuer)
- Stop widget accelerators from activating while the user is entering
a new shortcut (Jens Granseuer) (#313228)
- Fix category headers not appearing properly in the treeview when using
a non-UTF-8 locale (Bastien Nocera) (#513988)
keyboard:
- Don't crash when called for a drag with no selected items (Jens Granseuer)
(#523379)
- Don't show the typing break tab if the typing monitor is not available
(Jens Granseuer) (#524034)
sound:
- Use new tango icon (Jaap A. Haitsma) (#523916)
- Don't show modems in the device chooser (Jens Granseuer) (#523888)
themus:
- Handle failed thumbnailing attempts properly (Jens Granseuer)
typing-break:
- New Tango-style icons (David Prieto) (#523965)
- Replace custom stop icon with gtk-stop stock icon (Jens Granseuer)
updated translations:
- en_GB (Philip Withnall)
- et (Priit Laes)
- he (Yair Hershkovitz)
- hu (Gabor Kelemen)
- it (Luca Ferretti)
- ja (Takeshi AIHANA)
- ru (Yuri Kozlov)
- te (Sunil Mohan Adapa)
- tr (Baris Cicek)
- vi (Nguyen Thaii Ngoc Duy)
------------------------------------------------------------------------------
gnome-control-center 2.22.0
about-me:
- Fix misspelling of "palindrome" (Jens Granseuer) (#519398)
common:
- Port to GIO (Jens Granseuer)
keyboard:
- Fix leaks and remove unnecessary casts (Jens Granseuer)
mouse:
- Make the mouse orientation radio button usable with both mouse buttons
(Denis Washington)
updated translations:
- ar (Djihed Afifi)
- as (Amitakhya Phukan)
- bn_IN (Runa Bhattacharjee)
- da (Kenneth Nielsen)
- de (Hendrik Richter)
- el (Kostas Papadimas)
- en_GB (Philip Withnall)
- es (Jorge Gonzalez)
- et (Priit Laes)
- fi (Matthias Clasen)
- fr (Stephane Raimbault)
- hi (Rajesh Ranjan)
- hu (Gabor Kelemen)
- it (Luca Ferretti)
- ja (Takeshi AIHANA)
- lt (Gintautas Miliauskas)
- mr (Rahul Bhalerao)
- pt_BR (Leonardo Ferreira Fontenelle)
- uk (Maxim Dziumanenko)
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
------------------------------------------------------------------------------
gnome-control-center 2.21.92
about-me:
- Fix widget tab order (Jens Granseuer) (bug #339936)
- Don't distribute the .desktop.in file (Jens Granseuer)
- Port to gio (Jens Granseuer)
appearance:
- always apply the current GConf settings to the initially selected wallpaper so
that we don't modify the settings if GConf state and the definition in
backgrounds.xml are not identical (Jens Granseuer) (#516746)
- don't try to set shading and options in GConf when we're dealing with a
read-only source (Jens Granseuer) (#516328)
common:
- Handle broken pipe if thumbnailer crashes (Thomas Wood) (#516413)
- Fix a small leak in the file transfer dialog (Jens Granseuer)
- Use new Metacity function to render rounded metacity borders correctly
(Thomas Wood) (#460018)
default-applications:
- use '...' syntax instead of $(...) for better portability (Willie Walker)
(#517938)
display:
- Escape strange hostnames that we want to use as GConf keys (see bug #517259
for a similar issue in gnome-settings-daemon) (Jens Granseuer)
general:
- Increase required metacity version to 2.21.21 (Thomas Wood)
- Revert removal of FONTILUS and THEMUS substitution that occurred in r8452.
Fixes distcheck. (Thomas Wood)
- remove obsolete checks (Jens Granseuer)
- add gio-2.0 to general capplet flags for now; this part needs cleaning up in
the next cycle (Jens Granseuer)
- Add check for LIBSOUNDS. (Kjartan Maraas) (#515956)
updated translations:
- be@latin (Alaksandar Navicki)
- ca (Joan Duran)
- el (NikosCharonitakis)
- eu (Iñaki Larrañaga Murgoitio)
- fi (Ilkka Tuohela)
- fr (Claude Paroz)
- gl (Ignacio Casal Quinteiro)
- it (Luca Ferretti)
- ja (Takeshi AIHANA)
- kn (Shankar Prasad)
- ko (Young-Ho Cha)
- mk (Arangel Angov)
- nb (Kjartan Maraas)
- ne (Narayan Kumar Magar)
- nl (Reinout van Schouwen)
- nn (Åsmund Skjæveland)
- oc (Yannig Marchegay (Kokoyaya))
- pl (Tomasz Dominikowski)
- pt_BR (Jonh Wendell)
- pt (Duarte Loreto)
- sk (Pavol ¿imo)
- sv (Daniel Nylander)
------------------------------------------------------------------------------
gnome-control-center 2.21.91
appearance:
- Add a comment for translators (Jens Granseuer) (#514598)
- Make sure we're done with the dialog before we destroy it (Jens Granseuer)
(#515414)
- Remove useless (with GIO-based Nautilus) 'Go to fonts folder' button
(Matthias Clasen) (#511306)
at-properties:
- Move capplet to main menu (Luca Ferretti) (#515075)
default applications:
- Support --new-tab/--new-window for Iceweasel (Sven Arvidsson) (#322795)
- Improve name and description for the visual AT autostarter (Jens Granseuer)
(#515197)
- Add support for Terminator console (Nicolas Valcarcel) (#515366)
- Add support for Konsole (Jens Granseuer) (#515386)
keybindings:
- Move Launch Calculator to Desktop group and sort all launch_app keybing
together (Luca Ferretti) (#513867)
keyboard:
- Don't mark padding strings as translatable (Jens Granseuer) (#514598)
libbackground:
- Use LIBBACKGROUND_{CFLAGS,...} instead of CAPPLET_... so we can use libbackground
in gnome-settings-daemon too (Jens Granseuer)
- Don't pass a GError to the gconf_client*() calls since we don't use it anyway
(Jens Granseuer) (#510421)
libwindow-settings:
- Expose missing metacity double-click actions (Jens Granseuer) (#416541)
mouse:
- Set up the proper scale widgets to GtkSizeGroup in both tabs (Luca Ferretti)
- Fix HIG compliance for spacing, borders, padding, alignment and sentence label
(Luca Ferretti) (#510147)
sound:
- Use the libsounds.la now that libsounds uses libtool (Jens Granseuer)
(#515252)
shell:
- Add missing full stops in the long description (Kjartan Maraas)
- Specify libtool versioning info (Federico Mena Quintero)
network:
- Don't mark padding strings as translatable (Jens Granseuer) (#514598)
themus:
- Don't leak the ATK relation set (Jens Granseuer) (#509240)
typing break:
- Add a comment for translators (Jens Granseuer) (#514598)
general:
- Remove some cruft from the configure script and give libbackground its own
settings (Jens Granseuer)
updated translations:
- ar (Djihed Afifi)
- as (Amitakhya Phukan)
- be@latin (Ihar Hrachyshka)
- es (Jorge Gonzalez)
- et (Priit Laes)
- eu (Inaki Larranaga Murgoitio)
- gl (Ignacio Casal Quinteiro)
- he (Yair Hershkovitz)
- it (Luca Ferretti)
- mk (Arangel Angov)
- nb (Kjartan Maraas)
- oc (Yannig Marchegay)
- pt (Duarte Loreto)
- pt_BR (Leonardo Ferreira Fontenelle)
- sv (Daniel Nylander)
- th (Theppitak Karoonboonyanan)
- tr (Baris Cicek)
- zh_CN (Funda Wang)
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
------------------------------------------------------------------------------
gnome-control-center 2.21.90
appearance:
- Update list model when the background changes (Soren Sandmann)
- Deal correctly with GnomeBG structs (Soren Sandmann)
help:
- Updated to reflect the changes to the mouse capplet (Denis Washington)
- Fixed XML header (Denis Washington)
keyboard:
- Don't mark stock labels as translatable (Denis Washington)
- Remove obsolete icons (Jens Granseuer)
mouse:
- Add translation context to some labels (Denis Washington) (#509417)
- Remove left-over callback that was causing the capplet to set a label
on a NULL widget (Jens Granseuer) (#510425)
- Fix HIG compliance (Luca Ferretti) (#510136)
- Add some comments for translators (Luca Ferretti)
sound:
- Set the play button to insensitive if "No Sound" is selected (THomas
Wood) (#353828)
common:
- Disabled schemas directory from the build (Rodrigo Moya)
- Determine correct Nautilus extension dir via pkg-config (Damien Carberry)
updated translations:
- cs (Petr Kovar)
- de (Andre Klapper)
- el (Kostas Papadimas)
- es (Jorge Gonzalez)
- et (Priit Laes)
- eu (Inaki Larranaga Murgoitio)
- fr (Stephane Raimbault)
- he (Yair Hershkovitz)
- it (Luca Ferretti)
- nb (Kjartan Maraas)
- oc (Yannig Marchegay)
- sv (Daniel Nylander)
- th (Theppitak Karoonboonyanan)
- tr (Gil Forcada)
------------------------------------------------------------------------------
gnome-control-center 2.21.5
appearance:
- Read WindowTitleFont and DocumentsFont from meta-theme and use to set
the value for /apps/metacity/general/titlebar_font and
/desktop/gnome/interface/document_font_name GConf keys (Luca Ferretti)
(#504250)
- Make error dialogs more compliant with the HIG (Thomas Wood) (#400968)
- Update list model when the background changes (Soren Sandmann)
at-properties:
- Spawn the a11y tab of the keyboard capplet instead of at-properties.
keyboard:
- Merge all a11y options into the keyboard capplet (Denis Washington)
- Move 'type to test settings' entry beneath to make it easily accessible
from all tabs (Denis Washington)
mouse:
- Integrate with mousetweaks (Gerd Kohlberger, Denis Washington) (#503547)
settings daemon:
- Moved to a separate SVN module (William Jon McCann)
themus/fontilus:
- Install nautilus extensions in the right spot (Matthias Clasen) (#505364)
updated translations:
- be@latin (Ihar Hrachyshka)
- es (Jorge Gonzalez)
- et (Priit Laes)
- eu (Inaki Larranaga Murgoitio)
- ga (Sean de Burca)
- it (Luca Ferretti)
- nb (Kjartan Maraas)
- nn (Eskild Hustvedt)
- oc (Yannig Marchegay)
- pt (Duarte Loreto)
- pt_BR (Leonardo Ferreira Fontenelle)
- sk (Claude Paroz)
- sv (Daniel Nylander)
- vi (Clytie Siddall)
- zh_CN (Funda Wang)
------------------------------------------------------------------------------
gnome-control-center 2.21.4
about-me:
- Add a translation hint (Jens Granseuer)
- Don't mark empty and padding strings for translation (Jens Granseuer)
(bug #502087)
- Remove non-functional Help button (Matthias Clasen) (bug #497803)
accessibility:
- Don't mark padding strings for translation and add translation comments for
the pixel order strings (Jens Granseuer) (bug #502087)
- Enable the preferred applications button (Chris Jones) (bug #499332)
appearance:
- Free metacity theme after use (Jens Granseuer)
- Don't mark padding string as translatable (Jens Granseuer) (bug #502087)
- Make "Open" the default action for the file choosers (Jens Granseuer)
(bug #500091)
- Fix .desktop to be valid (Frederic Crozat) (bug #434956)
- Fix detection of image mimetype (Frederic Crozat) (bug #498980)
- Add shortcut for /usr/share/backgrounds to background file chooser and also
consider it when setting the initial directory (Jens Granseuer) (bug #497807)
default applications:
- Add support for Midori web browser (Jakub Rusinek) (bug #500274)
- Don't list the oudated evolution versions nor the text web browsers
(Sebastien Bacher) (bug #499327)
keyboard:
- Implement layout printing (Sergey Udaltsov) (bug #502961)
- Don't mark padding strings and stock items for translation (Jens Granseuer)
(bug #502087)
mouse:
- Don't mark padding string as translatable (Jens Granseuer) (bug #502087)
network:
- Add 48x48 PNG icon version (Andreas Nilsson) (bug #503035)
settings daemon:
- Prefer beagle and tracker to gnome-search-tool (Jens Granseuer)
- Use new setting from libgnome to make toolbar icon size setting work
(Jens Granseuer) (bug #401030)
- Launch Nautilus with --no-desktop for the home key so we don't mess up the
desktop for people using something else to manage the background (Jens
Granseuer) (bug #500085)
- Move display settings here from gnome-session (Dan Winship, Lucas Rocha)
(bug #434982)
- Allow key bindings using Super and Meta combinations (Bastien Nocera) (bug #165343)
window:
- Add a comment for translators (Jens Granseuer) (bug #502087)
common:
- Don't even try to open NULL filenames, and don't leak filenames when
detecting recursions (Jens Granseuer)
- Printing NULL strings crashes on Solaris so don't do that (Brian Cameron) (bug #501391)
updated translations:
- be@latin (Ihar Hrachyshka)
- el (Kostas Papadimas)
- es (Jorge Gonzalez)
- gl (Ignacio Casal Quinteiro)
- ml (Ani Peter)
- nb (Kjartan Maraas)
- oc (Yannig Marchegay)
- ru (Nickolay V. Shmyrev)
- sl (Matej Urbancic)
- sv (Daniel Nylander)
------------------------------------------------------------------------------
gnome-control-center 2.21.2
about-me:
- Add another string to the list of recognized error returns from passwd
(Jens Granseuer)
- Don't get confused when the user does not have a password set and passwd
immediately asks for the new one (Jens Granseuer) (#336872)
appearance:
- Fix build without libXcursor (Joel Pfaff)
- Be more careful when reading background information from GConf and
make sure we don't choke on NULL values later on (Jens Granseuer)
(#492903)
keyboard:
- Fix warnings and don't use deprecated signal API from GTK (Kjartan
Maraas)
- Move layout options to separate popup (Sergey Udaltsov)
- Rename first tab to "General" (Jens Granseuer)
- Replace text entry and "Choose.." button for keyboard model with a
single chooser button (Denis Washington)
- Don't include keyboard model description in Glade file (Jens Granseuer)
localization:
- Added (very basic skeleton of) localization capplet (Rodrigo Moya,
Denis Washington)
shell:
- Remove reference to non-existing background.desktop (Scott Reeves)
settings daemon:
- Make composited media popup window sizes scale with the screen size (Jens
Granseuer)
common:
- Remove more redundant info from the theme changed callback (Jens Granseuer)
updated translations:
- be@latin (Ihar Hrachyshka)
- es (Jorge Gonzalez)
- fi (Ilkka Tuohela)
- nb (Kjartan Maraas)
- sl (Matej Urbancic)
- sv (Daniel Nylander)
------------------------------------------------------------------------------
gnome-control-center 2.21.1
appearance:
- Unify "invalid theme" error messages and be a bit more verbose
(Jens Granseuer)
- Reword the "theme engine" error message (Jens Granseuer) (#435680)
- Add support for dragging images from the background list (Jens Granseuer)
(#150544)
- Make theme sorting case insensitive (Jens Granseuer) (#481224)
- Fix crash if we fail to convert a filename to UTF-8 (Jens Granseuer)
- Use NoDisplay=true instead of OnlyShowIn=; (Jens Granseuer) (#420154)
- Return a new theme instead of munging whatever got passed in (Jens Granseuer)
- Take cursor size into account when comparing themes (Denis Washington)
- Watch cursor theme/size GConf keys for changes (Denis Washington)
- Move cursor size widget initialization to Glade, to allow the slider to
be updated properly on startup (Jens Granseuer) (#490103)
- Make the cursor themes delete button works (Jens Granseuer)
- If the parent directory is empty after deleting a theme, delete the
parent directory too (Jens Granseuer)
- Update cursor size GConf value when the theme changes (Jens Granseuer)
- Reduce number of XCURSOR ifdefs and get rid of the special treatment for
the default cursor theme (Jens Granseuer)
- Add support for live cursor theme updates (Jens Granseuer)
- Read gettext macro that accidentally got stripped (Jens Granseuer)
- Prevent lots of thumbs from being created with the color scheme of the
currently active theme (Jens Granseuer) (#460023)
- Actually remove theme data from the hash when the theme gets deleted
(Jens Granseuer)
- Fix the cursor size only being updated if the cursor theme changed too
(Denis Washington)
- Watch /usr/share/cursors/xorg-x11 for cursor themes (Denis Washington)
- Teach the installer to recognize cursor themes and icon themes with
cursors (Jens Granseuer)
- Check whether there are multiple themes to install up front (Jens Granseuer)
at-properties:
- Don't use 'Preferences' word for application name (Luca Ferretti) (#484351)
default applications:
- Make the accelerators for the A11Y tools page unique (Patrick Wade)
(#474308)
- Replace mail and multimedia icon names with Tangoified versions (Michael
Monreal) (#470386)
- Use standard xdg autostart directory instead of GNOME one (Stephane
Loeuillet) (#481740)
- Replace obsolete 'orca -m' command with new 'orca -e magnifier' (Jens
Granseuer) (#489973)
display:
- Code cleanup and fix a few leaks (Jens Granseuer)
- fix string capitalization (Jens Granseuer)
fontilus:
- Drop "GNOME" from the menu item name as recommended by the HIG (Jens
Granseuer) (#474742)
settings daemon:
- Dropped unneeded DBus server (Sergey Udaltsov)
- No more "configuration changed" warning (Sergey Udaltsov) (#358048)
- Gradually fade out the OSD when composited (Iain Holmes) (#490593)
shell:
- Remove part of the long description for cc_actions_list (Jens Granseuer)
(#426229)
general:
- Desktop file fixes (Stephane Loeuillet) (#481740)
- Add more default keybindings for otherwise unbound keys (Bastien Nocera)
(#487935)
- Remove compatibility hack for libxklavier <= 3.2 (Jens Granseuer)
- Fix Bugzilla component (Jens Granseuer)
- Add support for calculator key (Sebastien Bacher)
updated translations:
- ar (Djihed Afifi)
- be@latin (Ihar Hrachyshka)
- bg (Alexander Shopov)
- es (Jorge Gonzalez)
- et (Priit Laes)
- fi (Ilkka Tuohela)
- gl (Ignacio Casal Quinteiro)
- nb (Kjartan Maraas)
- sl (Matej Urbancic)
------------------------------------------------------------------------------
gnome-control-center 2.20.3
about-me:
- Don't get confused when the user does not have a password set and passwd
immediately asks for the new one (Jens Granseuer) (#336872)
appearance:
- Revert fix for #420154 (Jens Granseuer) (#486811)
- Use NoDisplay=true instead of OnlyShowIn=; for the theme installer desktop
file (Jens Granseuer)
- Move some more of the cursor widget initialization to Glade, to allow the
slider to be updated properly on startup (Jens Granseuer) (#490103)
- Try even harder to not let essential keys become NULL (Jens Granseuer)
(#487257)
- Make the cursor themes delete button work (Jens Granseuer)
- Fix setting cursor size when doing fuzzy matches (Jens Granseuer)
default applications:
- Replace obsolete "orca -m" command by new "orca -e magnifier" (Jens Granseuer)
(#489973)
general:
- Add more default keybindings for otherwise unbound keys (Bastien Nocera)
(#487935)
- Actually remove theme data from the hash when the theme gets deleted (Jens
Granseuer) (#484797)
updated translations:
- ar (Djihed Afifi)
- be@latin (Ihar Hrachyshka)
- et (Priit Laes)
- ga (Sean de Burca)
- gl (Ignacio Casal Quinteiro)
- pt (Duarte Loreto)
- pt_BR (Leonardo Ferreira Fontenelle)
- uz@cyrillic (Nurali Abdurahmonov)
------------------------------------------------------------------------------
gnome-control-center 2.20.1
appearance:
- Made theme sorting case-insensitive (Jens Granseuer) (#481224)
- Fixed crash when failing filename conversion to UTF-8 (Jens Granseuer)
- Don't ignore xcursor settings when updating or copying theme info
to/from GConf (Jens Granseuer) (#485709)
common:
- Fixed invalid use after free (Jens Granseuer)
- Fix typo to correctly substitute XCursor CFLAGS (Jens Granseuer)
- Default to using XF86* keysyms for the audio related keybindings
(Bastien Nocera) (#485076)
- Query and monitor the xcursor icon dir for cursor themes too (Jens
Granseuer) (#469882)
updated translations:
- bg (Alexander Shopov)
- fi (Ilkka Tuohela)
- gl (Ignacio Casal Quinteiro)
- it (Luca Ferretti)
------------------------------------------------------------------------------
gnome-control-center 2.20.0.1
at-properties:
- Make logout button sensitive whenever a11y settings have been enable or
disabled (Patrick Wade) (#476921)
common:
- Prevent lots of thumbs to be created with the color scheme of the currently
active theme (Jens Granseuer) (#460023)
sound:
- Removed mistaken patch for libsounds (Rodrigo Moya)
updated translations:
- it (Luca Ferretti)
- ko (Changwoo Ryu)
- ta (I. Felix)
------------------------------------------------------------------------------
gnome-control-center 2.20.0
appearance:
- Correct translatable property value of "Save As" (Claude Paroz) (#473810)
- Don't set a fixed width for the toolbar button color label (Jens Granseuer)
(#474317)
- Add comment for translators (Jens Granseuer) (#473379)
general:
- Fix building with Sun's Forte compiler (Darren Kenny) (#473967)
updated translations:
- ar (Djihed Afifi)
- be@latin (Ihar Hrachyshka)
- bn (Jamil Ahmed)
- ca (Gil Forcada)
- da (Kenneth Nielsen)
- de (Hendrik Richter)
- el (Kostas Papadimas)
- en_GB (David Lodge)
- es (Jorge Gonzalez)
- et (Priit Laes)
- eu (Inaki Larranaga Murgoitio)
- fi (Ilkka Tuohela)
- fr (Stephane Raimbault)
- gu (Ankit Patel)
- hu (Gabor Kelemen)
- it (Luca Ferretti)
- ja (Takeshi AIHANA)
- ka (Vladimer Sichinava)
- mk (Jovan Naumovski)
- nb (Espen Stefansen)
- nl (Vincent van Adrighem)
- pl (Artur Flinta)
- pt (Duarte Loreto)
- pt_BR (Raphael Higino)
- ru (Nickolay V. Shmyrev)
- sr (Danilo Segan)
- sr@Latn (Danilo Segan)
- sv (Daniel Nylander)
- th (Theppitak Karoonboonyanan)
- uk (Maxim Dziumanenko)
- vi (Clytie Siddall)
------------------------------------------------------------------------------
gnome-control-center 2.19.92
appearance:
- Fixed leaks (Jens Granseuer)
- Use _prepend for lists instead of _append (Jens Granseuer)
updated translations:
- bn_IN (Runa Bhattacharjee)
- de (Hendrik Richter)
- eu (Inaki Larranaga Murgoitio)
- ja (Takeshi AIHANA)
- ko (Changwoo Ryu)
- pt (Duarte Loreto)
- ta (I. Felix)
- vi (Clytie Siddall)
------------------------------------------------------------------------------
gnome-control-center 2.19.91
about-me:
- Honor mail address attributes when setting up Home and Work addresses
(Jens Granseuer)
appearance:
- Don't leak the cursor font (Jens Granseuer)
- Fix double-free and make the builtins non-static to save relocations
(Jens Granseuer) (#467522)
- Properly check all installed themes if necessary (Jens Granseuer)
- Free the metacity theme after use (Jens Granseuer) (#469531)
- Correct the item width and enable line wrapping for long theme names
(Jens Granseuer) (#466405)
- If no background image set, select "no wallpaper" (Jens Granseuer)
- Simply set the upper bound of the DPI spin button to the maximum we
consider acceptable (Jens Granseuer) (#469580)
- Don't mark gtk-delete stock id for translation (Gabor Kelemen) (#470532)
- Always generate thumbnails asynchronously (Jens Granseuer) (#469849)
default applications:
- Add browser and mail entries Iceape (Sven Arvidsson) (#467472)
- Use the new -new-tab and -new-window arguments instead of -remote for
Firefox tab and window commands (Philip Withnall) (#393204)
keyboard:
- Disable "delete" button when no layout is selected (Sergey Udaltsov)
(#466749)
- Make "Add label" string translatable (Sergey Udaltsov) (#470516)
settings daemon:
- Use a list instead of a hash table to store the settings modules (Jens
Granseuer) (#449118)
- Raise the volume when unmuting (Jens Granseuer)
- Show X keyboard settings warning dialog delayed, so that it runs properly
centered and with decorations (Rodrigo Moya)
- Initialize XKB config early so that callback would not crash (Sergey
Udaltsov) (#469192)
general:
- Hide the password in displayed URIs when transfering files (Luca Cavalli)
(#339551)
updated translations:
- ca (Josep Puigdemont i Casamajo)
- de (Hendrik Richter)
- es (Jorge Gonzalez)
- et (Priit Laes)
- fi (Ilkka Tuohela)
- gu (Ankit Patel)
- hu (Gabor Kelemen)
- ja (Satoru SATOH, Takeshi AIHANA)
- mk (Jovan Naumovski)
- ml (Ani Peter)
- nb (Kjartan Maraas)
- pl (Artur Flinta)
- pt_BR (Raphael Higino)
- sv (Daniel Nylander)
- ta (I. Felix)
- th (Theppitak Karoonboonyanan)
- zh_CN (Funda Wang)
------------------------------------------------------------------------------
gnome-control-center 2.19.90
about-me:
- Use g_get_user_special_dir() instead of hard-coding ~/Pictures (Jens
Granseuer)
appearance:
- Don't generate GTK thumbnails when we want metacity or icon (Jens Granseuer)
(#462724)
- No need for an expensive parse to initialize the colors (Jens Granseuer)
- Reduce metacity thumbnail size to 128x128 (Jens Granseuer)
- Also load the "default" cursor theme so we know the available sizes (Denis
Washington) (#462409)
- Create the icon theme representative before the GTK stock button (Jens
Granseuer)
- Various small tweaks and optimizations (Jens Granseuer)
- Add a shortcut to the user's special Pictures folder to the file chooser
and default to it (Jens Granseuer) (#461093)
- HIG capitalization fix for a checkbutton label (Dennis Cranston)
- Use thumbnail factory to store and retrieve metatheme thumbs (Jens Granseuer)
(#448968)
- Remove check for old glib version that would result in bogus code (Jens
Granseuer)
- Only add a "Default Pointer" list item if there is no such GnomeThemeCursorInfo
(Denis Washington)
- Toggle sensitivity of the cursor scale labels (Dennis Cranston) (#463442)
- Indent category contents, and other HIG spacing fixes (Dennis Cranston)
- Fix check for available symbolic colors and make buttons for unsupported
colors insensitive (Jens Granseuer) (#464081)
- Make sure the color scheme has changed before writing to GConf and
enabling the reset button (Jens Granseuer)
- Reenable theme lockdown (Jens Granseuer)
- Restrict drag'n'drop installation to the theme tab (Jens Granseuer)
- Fix double-free and use-after-free (Jens Granseuer)
- Make sure we have a selection before trying to get the data (Jens Granseuer)
(#465431)
default applications:
- Don't use '==' and improve portability with empty strings (Jens Granseuer)
keybindings:
- Make the arrows and tabs unbindable without a modifier (Bastien Nocera)
(#463433)
settings daemon:
- Use CTRL-ALT-DEL as default keybinding for 'Log out' (Rodrigo Moya)
window:
- Expose missing metacity double-click actions (Jens Granseuer) (#416541)
updated translations:
- ca (Joan Duran)
- el (Kostas Papadimas)
- es (Jorge Gonzalez)
- eu (Inaki Larranaga Murgoitio)
- fi (Ilkka Tuohela)
- gu (Ankit Patel)
- ja (Satoru SATOH, Takeshi AIHANA)
- lt (Zygimantas Berucka)
- nb (Kjartan Maraas)
- nl (Vincent van Adrighem)
- pl (Artur Flinta)
- si (Danishka Navin)
- sv (Daniel Nylander)
- ta (I. Felix)
- th (Theppitak Karoonboonyanan)
------------------------------------------------------------------------------
gnome-control-center 2.19.6
about-me:
- Add a tooltip to the image button to make it accessible (Jens Granseuer)
appearance:
- Add option to add wallpapers via the command line (Jens Granseuer) (#456337)
- Use new GTK+ convenience API for icon view tooltips (Matthias Clasen)
(#455985)
- Bump all tooltips code to GTK 2.11.6 (Jens Granseuer)
- Improve color scheme matching (Jens Granseuer)
- When reading current settings from gconf, get the color scheme from the
GTK theme if necessary to allow matching against themes retrieved via
gnome-theme-info (Jens Granseuer)
- Implement saving of the cursor theme name in metathemes and add a
'Default pointer' option to the cursor theme list (Denis Washington)
- Simplify tooltip descriptions (Dennis Cranston) (#460111)
- Really unset the gconf key when reverting colors (Jens Granseuer)
- Implement drag-and-drop theme installation (Denis Washington)
- Remove workarounds for initialization problems in early versions of the
capplet (Jens Granseuer)
- Fix cell renderer state logic to not always be on (Jens Granseuer)
- Use cairo to draw the cell renderer selection (Thomas Wood)
- Show readable_name in cursor theme list instead of name (Denis Washington)
- Fix mnemonics and customize theme window title (Thomas Wood) (#461255)
- Fix theme installation (Thomas Wood)
- Update icon cache when installing icon themes (Thomas Wood) (#355486)
- Prevent some memory leaks (Thomas Wood)
- Add controls for applying suggested backgrounds and/or fonts from
metathemes (Denis Washington)
- Only show background/font suggestions if they haven't already been
applied (Denis Washington)
- Cope with unset gconf keys and group gconf notifications (Jens Granseuer)
- Only create the custom theme entry when changes are made, and delete it
when the theme is saved (Jens Granseuer)
- Add %F to the exec line so external programs like epiphany can set the
background (Jens Granseuer) (#456337)
- Default to showing the background tab if wallpapers were given on the
command line (Jens Granseuer)
- Use our custom cell renderer for metathemes too, so the previews don't
get shaded (Jens Granseuer) (#461198)
default applications:
- Change custom command entries to be insensitive instead of
noneditable (Matthias Clasen) (#456308)
- Remove spurious desktop entries (Jens Granseuer) (#444787)
keyboard:
- Improved layout and sorting (Sergey Udaltsov) (#455353)
- Implement DND in the selected layouts list (Sergey Udaltsov) (#351936)
- Eliminate up/down buttons in the layout list (Sergey Udaltsov)
network:
- Also use new icon in the window title bar (Denis Washington)
settings daemon:
- Don't forget the Xft callback (Jens Granseuer) (#455992)
themus:
- Update to match theme callback signature (Jens Granseuer)
general:
- Fix crash when no cursor is specified in theme (Frederic Crozat) (#455952)
- General cleanup and leak-plugging (Jens Granseuer, Thomas Wood)
- Don't fail configuring if gstreamer is not available, simply skip the sound
capplet (Jens Granseuer) (#456957)
- Remove spurous AT desktop entries (Jens Granseuer) (#444787)
- Add support for custom theme names saved in metathemes (Denis Washington)
- Re-add basic support for cursor themes for X servers without the Xcursor
extension, like the one in Solaris (Denis Washington)
- When applying a metatheme, check wether to set/unser color scheme gconf
key (Jens Granseuer) (#421866)
- Fix notification of selection changed for GtkTreeView config support (Jens
Granseuer)
- Prevent cursor themes from being recognized as icon themes (Denis Washington)
- Read a cursor themes's name from its index.theme file if it has one (Denis
Washington)
- Expand check for empty metatheme color scheme to include blank color scheme
strings (Thomas Wood)
- Add tooltip foreground and background colors to the list of recognized
symbolic colors (Thomas Wood)
updated translations:
- es (Jorge Gonzalez)
- et (Priit Laes)
- fi (Ilkka Tuohela)
- gl (Ignacio Casal Quinteiro)
- gu (Ankit Patel)
- hu (Gabor Kelemen)
- ja (Takeshi AIHANA)
- lt (Zygimantas Berucka)
- nb (Kjartan Maraas)
- nl (Vincent van Adrighem)
- sv (Daniel Nylander)
- th (Theppitak Karoonboonyanan)
- zh_CN (Funda Wang)
------------------------------------------------------------------------------
gnome-control-center 2.19.5
about-me:
- Fix a small typo in the comments (Guilherme de S. Pastore)
appearance:
- Fix compiler warnings (Jens Granseuer)
- Tweak the metatheme's icon view's margin and spacings to better
fit the new thumbnails (Denis Washington)
- Modernized and brough the theme thumbnailer to the size of the
new metatheme thumbnails (Denis Washington)
- Hook up the delete buttons (Jens Granseuer)
- Listen to on-disk changes in the details tab too (Jens Granseuer)
- Use STOCK_DELETE instead of STOCK_OK in delete confirmation dialog
(Jens Granseuer)
- Implement theme saving (Jens Granseuer)
- Use the new async thumbnail generation functions (Denis Washington)
- Don't try to use uninitialized GdkPixbuf (Jens Granseuer)
- Fixed resize problems (Denis Washington)
- Use the new placeholder thumbnails for the details window's theme
lists (Denis Washington)
- Consider NULL and "" equal for color schemes (Jens Granseuer)
- Make the Custom theme always the first in the list and make its label
bold to differentiate it from other themes (Denis Washington)
- Load the metatheme thumbnails in the order they are in the list
(Denis Washington)
- Fix leaks (Jens Granseuer)
- Remove hard-coded item width (Jens Granseuer)
- Add explicit width_request to our icon views so we can use
GTK_POLICY_NEVER for horizontal scrollbars and still properly resize
the window (Jens Granseuer) (#451585)
- Add cursor theme support (Denis Washington)
- Don't allocate colors in the colormap (Jens Granseuer)
- Don't crash if we have nothing but the default cursor theme (Jens Granseuer)
- Ellipsise the 'Save As' button (Jens Granseuer)
- Change the button order in themes tab (Denis Washington)
- Add an icon to the 'Customize' button (Denis Washington)
at-properties:
- Fix typo in string (Gabor Kelemen)
default applications:
- Fix error handling, plug some memory leaks and properly handle
unset GConf keys (Jens Granseuer) (#454103)
- Fix Bugzilla info (Jens Granseuer)
display:
- Use icon theme instead of global pixmaps dir for application icon
(Michael Terry) (#450777)
- Add and use new icon by Jakub Steiner (Jens Granseuer) (#375230)
network:
- Add and use new icon by Josef Vybiral (Jens Granseuer) (#399051)
settings daemon:
- Call g_thread_init to avoid warnings and crashes (Rodrigo Moya)
- Make modules not return errors when some methods are not implemented,
these are really not errors (Rodrigo Moya)
- Fixed indexing of loadable modules (Rodrigo Moya)
- Fixed spawning of gnome-screensaver (Matthias Clasen)
- Fixed crash when changing the background (Rodrigo Moya)
- Initialize/start the modules in idle callbacks (Matthias Clasen,
Rodrigo Moya) (#430889)
- Start DBus server earlier (Matthias Clasen, Rodrigo Moya)
- Add a frame to the media popup (Jens Granseuer) (#451674)
- Fix compiler warnings (Jens Granseuer) (#438152)
- Reduce static data in GObject-based classes registration
(Jens Granseuer)
- If we don't take over the background because Nautilus is running,
don't treat that as an error (Jens Granseuer)
- Don't unmute when lowering the volume and switch to muted when the
volume reaches 0 (Grzegorz Dymarek) (#337896)
sound:
- Add new icons by Josef Vybiral (Jens Granseuer) (#397305)
- Fix target dir for icons (Jens Granseuer)
themus:
- Call g_thread_init to avoid warnings and crashes (Jens Granseuer)
typing break:
- Update icon cache on uninstall as well as install (Michael Terry) (#450777)
general:
- Make metatheme thumbnails original-sized and add check-box, radio
button (Denis Washington)
- Generate all types of thumbnails in a separate process, not just
those for metathemes (Denis Washington)
- Only look for icons in the icon theme (Michael Terry) (#450777)
- Add safeguards for NULL values (Jens Granseuer) (#441036)
- Add support for cursor themes in themes (Denis Washington)
updated translations:
- bg (Alexander Shopov)
- dz (Pema geyleg)
- es (Jorge Gonzalez)
- et (Priit Laes)
- fi (Ilkka Tuohela)
- hu (Gabor Kelemen)
- nb (Kjartan Maraas)
- pl (Artur Flinta)
- pt_BR (Wendell Silva, Leonardo Ferreira Fontenelle)
- sv (Daniel Nylander)
- th (Theppitak Karoonboonyanan)
- vi (Clytie Siddall, Nguyen Thai Ngoc Duy)
------------------------------------------------------------------------------
gnome-control-center 2.19.4
appearance:
- Fixed leaks (Jens Granseuer)
- Added a parameter to circumvent the internal thumbnail cache to the async
generator (Jens Granseuer)
- Remove caching from the thumbnailer (Jens Granseuer)
- Fix appearance windows not reacting the GTK+ theme changes (Denis Washington)
- Make it possible to skip engine information (Jens Granseuer)
- Let gnome-appearance-properties handle GTK+ theme changes manually (Denis
Washington)
- Move theme package MIME type over from the theme-manager (Jens Granseuer)
(#444336)
- Hook up more of the customization functionality (Jens Granseuer)
- Update for changes in thumbnailer API (Jens Granseuer)
- Add initial lockdown bits from theme-manager (Jens Granseuer)
- Preliminary support for reacting the metatheme changes (Jens Granseuer)
- Add all missing color schemes options (Denis Washington)
- Fix passing and parsing of command line args (Jens Granseuer)
- Disable the 'reset to defaults' button if the theme doesn't support custom
colors (Jens Granseuer)
- Listen to color scheme changes (Jens Granseuer)
- Add initial support for installing themes (Jens Granseuer)
- Add metadata tooltips in the Background tab (Jens Granseuer)
- Add --show-page option to specify the page with which to start (Jens Granseuer)
- Remove install buttons from individual details pages (Jens Granseuer)
display:
- Don't make the revert dialog transient since it's actually never on screen
at the same time as the main dialog (Jens Granseuer) (#448160)
keybindings:
- Fix GConf notification (Jens Granseuer)
settings daemon:
- Most modules converted to new loadable architecture (Rodrigo Moya)
- Force launching Nautilus in the home directory (Bastien Nocera) (#356069)
- Plugged memory leaks (Jens Granseuer)
themus:
- Update for changes in thumbnailer API (Jens Granseuer)
typing break:
- Dont use libgnome (Ross Burton) (#443554)
- Use the 2nd-accurate timers instead of the millisecond timers, in an attempt
to use less processor time (Ross Burton) (#443547)
- USe GOption to parse arguments (Christian Persch) (#444399)
general:
- Require glib >= 2.13 (Ross Burton)
updated translations:
- cs (Jakub Friedl)
- dz (Pema Geyleg)
- es (Jorge Gonzalez)
- sv (Daniel Nylander)
- zh_CN (Funda Wang)
------------------------------------------------------------------------------
gnome-control-center 2.19.3
about-me:
- Use g_file_set_contents instead of a single fwrite (Bastien Nocera)
- Set default permission of ~/.face to 0644 (Bastien Nocera)
accessibility:
- Set button images via code instead of relying on Glade, so they respect
the gtk-button-images xsetting (Jens Granseuer) (#362880)
appearance:
- New capplet to group appearance Settings (Thomas Wood, Jens Granseuer,
Denis Washington)
at-properties:
- Fix critical warning (Jens Granseuer)
- Set button images via code instead of relying on Glade, so they respect
the gtk-button-images xsetting (Jens Granseuer) (#362880)
background:
- After removing a wallpaper, select the next one in the list instead of always
going to "No Wallpaper" (Jens Granseuer) (#432514)
control center:
- Removed superfluous X-SuSE translate tag (Stanislav Brabec)
display:
- Survive XRandR returning weird results for some dual-screen setups
(Jens Granseuer) (#356520)
keybindings:
- Add a noarch pkgconfig file to allow apps to know where to add their
keybindings (Bastien Nocera) (#434591)
- Fix keysdir substitution (Bastien Nocera) (#434591)
- Added g_thread_init as required by glib (Jens Granseuer)
keyboard:
- Set button images via code instead of relying on Glade, so they respect
the gtk-button-images xsetting (Jens Granseuer)
- Added vendor list to the box, if any (Sergey Udaltsov)
- Make buildable with libxklavier 3.2 (Sergey Udaltsov)
mouse:
- Port from deprecated GtkOptionMenu to GtkComboBox (Jens Granseuer)
settings daemon:
- More refactoring of loadable modules (Rodrigo Moya)
- Use "eject -T" as the default eject command (Jens Granseuer) (#386297)
- Double-check that DBUS really passed an error (Chad Miller) (#439208)
- Sync libegg modules (Jens Granseuer) (#441042)
- Set the device property to the correct value before opening the mixer
(Jan Arne Petersen) (#441552)
sound:
- Use g_timeout_add/remove instead of deprecated GTK versions (Jens Granseuer)
- Set non-0 pulse step for the progress bar to actually make it move (Jens
Granseuer) (#441587)
theme switcher:
- Fix memory leaks (Jens Granseuer)
themus:
- Use OnlyShowIn property to not list Themus in the menu editor (Sebastien
Bacher) (#434956)
general:
- Add GConfPropertyEditor support for GtkComboBox (Jens Granseuer)
- Add support for unsetting GConf values if the conversion handlers return null
(Jens Granseuer)
- Constify a number of function arguments (Jens Granseuer)
- Add a property editor for GtkTreeView and fix crashes with all peditors if the
requested key is not available (Jens Granseuer)
- Don't call gconf_value_free with a NULL value (Jens Granseuer)
- Recognize both "gtk-color-scheme" and "gtk_color_scheme" (Jens Granseuer)
updated translations:
- bg (Alexander Shopov)
- cs (Jakub Friedl)
- en_GB (David Lodge)
- es (Jorge Gonzalez)
- et (Priit Laes)
- he (Yair Hershkovitz)
- hu (Gabor Kelemen)
- nb (Kjartan Maraas)
- sv (Daniel Nylander)
- th (Theppitak Karoonboonyanan)
- zh_CN (Funda Wang)
------------------------------------------------------------------------------
gnome-control-center 2.19.1
about-me:
- Build fixes (Bastien Nocera)
- Add image filter to file chooser (Kristof Vansant) (#424958)
- Plug memory leaks (Jens Granseuer)
at-properties:
- Don't require GNOME Glade library (Kristof Vansant)
background:
- Don't require GNOME Glade library (Kristof Vansant)
- Don't crash if the GConf schema is missing (Jens Granseuer) (#430253)
- Fix initialization of the secondary colour picker (Jens Granseuer)
- Replace deprecated GtkOptionMenu with GtkComboBox (Priit Laes) (#421199)
- Fix scaling for WPTYPE_ZOOM (Erich Schubert) (#342356)
default applications:
- Added widgets for default media player (Priit Laes) (#362578)
- Don't require GNOME Glade library (Kristof Vansant)
- Added Seamonkey as web browser and mail reader (Rodrigo Moya)
- Added widgets for default accessibility applications (George Kraft IV) (#350263)
display:
- Uppercase the rotation options (Jens Granseuer) (#410959)
- Added 720x576 (PAL) to the list of valid resolutions (Jens Granseuer) (#325548)
fonts:
- Don't require GNOME Glade library (Kristof Vansant)
keybindings:
- Fix the patch from which we'd load the keybindings (Bastien Nocera)
- Prepend the directory name before loading the files (Bastien Nocera) (#420796)
- Remove metacity keybindings definitions (Bastien Nocera)
keyboard:
- Use a radio button instead of a chackbox to indicate the default
layout (Jns Granseuer) (#389469)
- Use automatic instead of always scrollbar policy (Andreas Koehler) (#345884)
- New version of the layout chooser, comboboxentry-based (Sergey Udaltsov)
mouse:
- Use automatic instead of always scrollbar policy (Andreas Koehler) (#345884)
theme switcher:
- Add filters for theme packages to the file chooser and mark the file chooser
title for translation (Kristof Vansant) (#424960)
- Use OnlyShowIn=; to hide the theme installer from menus and menu editors
(Matthias Clasen) (#420154)
windows:
- Use GtkComboBox instead of GtkOptionMenu (Priit Laes) (#421210)
shell:
- Build libslab statically, to avoid conflicts with gnome-main-menu (Rodrigo Moya)
settings daemon:
- Added handler for media keybinding (Priit Laes) (#362578)
- Don't crash if DBus connection is not available (Jens Granseuer) (#411504)
- Don't set Emacs.mode-line.attributeBackground to avoid problems with emacs
22 (Jens Granseuer) (#416823)
- Rebuild the media window if the state of composite has changed (Jens Granseuer)
(#408035)
- Fix launch-app-in-terminal support (Priit Laes) (#362578)
- Started refactoring of modules (Rodrigo Moya)
- Also check registered directories for notification (Alexander Larsson)
- Removed all settings not related to colour (Ross Burton) (#428615)
- Try to figure out the DPI value from the X server or the user's GConf
settings (Federico Mena Quintero) (#217790 and #378338)
general:
- Rename module name to gnome-control-center (Rodrigo Moya)
updated translations:
- ar (Djihed Afifi)
- cs (Jakub Friedl)
- en_GB (David Lodge)
- et (Priit Laes)
- pt_BR (Leonardo Ferreira Fontenelle and Washington Lins)
- sv (Daniel Nylander)
- zh_CN (Funda Wang)
------------------------------------------------------------------------------
gnome-control-center 2.18.1
sound:
- Initialize threads earlier (Christian Persch) (#416239)
- Fix option context translation (Christian Persch)
- Fix button label alignment (Christian Persch) (#416238)
- Ellipsize the device combo box (Matthias Clasen) (#425650)
theme switcher:
- Disable revert button when using theme engine defaults colors
(Frederic Crozat) (#417423)
- Don't crash if the color string is mangled (Jens Granseuer)
- Close small memory leak (Jens Granseuer)
shell:
- Build libslab statically to avoid conflicts with gnome-main-menu
(Rodrigo Moya)
settings daemon:
- Fix multimedia window appearing in a different position when shown for the
first time (Jens Granseuer) (#400915)
updated translations:
- ca (Josep Puigdemont i Casamajó)
- da (Peter Bach)
- dz (Pema Geyleg)
- es (Claudio Saavedra)
- gl (Ignacio Casal Quinteiro)
- it (Alessio Dessì)
- mk (Jovan Naumovski)
- nl (Vincent van Adrighem)
- pt_BR (Leonardo Ferreira Fontenelle)
- uk (Maxim Dziumanenko)
------------------------------------------------------------------------------
gnome-control-center 2.18.0
about-me:
- Really fixed #411697 (Jens Granseuer)
- Use proper shadow type for the address fields (Jens Granseuer) (#414061)
background:
- Plug leaks (Jens Granseuer) (#396069)
display:
- Fix double free (Sandino Flores-Moreno) (#413352)
fontilus:
- Fix linker flags (Loic Minier) (#413468)
mouse:
- Add 2 popular cursor sizes to the filter (Thomas Zajic)
- Sort "Pointers" list alphabetically (Thomas Zajic)
- Fix build with gcc2 (Jens Granseuer)
theme-switcher:
- Replace deprecated function (Thomas Wood)
- Remove some bogus old code that caused the current theme to be checked
instead of the new one (Benjamin Berg)
- Set the gtk-color-scheme even if it is blank and when creating the thumbnail
(Thomas Wood)
- Search the gtkrc for the color scheme if none was found in the metatheme
file (Thomas Wood)
- Don't try and open NULL filenames (Thomas Wood)
window:
- Add missing libs to linker args (Jens Granseuer) (#413468)
settings daemon:
- Fix ref counting problems (Jens Granseuer) (#412467)
updated translations:
- cs (Jakub Friedl)
- de (Hendrik Richter, Christian Kintner)
- el (Nikos Charonitakis)
- gu (Ankit Patel)
- hu (Gabor Kelemen)
- ko (Changwoo Ryu)
- ku (Erdal Ronahi)
- lt (Gintautas Miliauskas)
- mk (Jovan Naumovski)
- nl (Vincent van Adrighem)
- pl (Artur Flinta)
- ru (Leonid Kanter)
- sl (Matic Zgur)
- sr (Goran Rakic)
- sr@Latn (Goran Rakic)
- zh_HK (Abel Cheung)
- zh_TW (Abel Cheung)
------------------------------------------------------------------------------
gnome-control-center 2.17.92
about-me:
- Change default dir for the image chooser (Jens Granseuer) (#408305)
- Dont use composite pixbuf to avoid unnecessary clipping (Diego Escalante
Urrelo) (#380315)
- Prevent child watcher from accessing already released memory (Jens
Granseuer) (#411697)
default applications:
- Really fix DATADIR (Jens Granseuer) (#407597)
- Dont try reading into invalid territory when the user set a custom command
without spaces (Jens Granseuer) (#407601)
fontilus:
- Use GOption argument parsing (Christian Persch) (#393394)
keybindings:
- Clear GConf client cache before reloading (Jens Granseuer) (#394776)
keyboard:
- Avoid crashing on NULLs (Jens Granseuer) (#398631)
settings daemon:
- Properly round volumes so that volume-up and -down act symetrically
(Jens Granseuer) (#389996)
- Dont ignore errors when X refuses to update the pointer mapping
(Jens Granseuer) (#349538)
- Dont install the same filter twice for the default root window (Jens
Granseuer) (#408643)
- Correctly pass the function address when setting up the event filter
(Jens Granseuer)
- Fix warnings (Jens Granseuer)
shell:
- Revert to old menu for 2.18 (Denis Washington)
theme switcher:
- Update selected fg color from the correct slot (Jens Granseuer) (#410764)
- Fix warnings (Jens Granseuer)
- Format guint16 values accordingly (Jens Granseuer) (#398331)
themus:
- Populate the VFS file info fields properly so that Nautilus shows, e.g.,
read-only emblems in themes:// (Jens Granseuer) (#145175)
windows:
- Remove some long-dead code (Jens Granseuer)
- Dont leak stuff on error (Jens Granseuer)
updated translations:
- ar (Djihed Afifi)
- bg (Alexander Shopov)
- ca (Josep Puigdemont i Casamajó)
- cs (Jakub Friedl)
- en_GB (David Lodge)
- et (Priit Laes)
- fi (Ilkka Tuohela)
- fr (Stéphane Raimbault)
- hu (Gabor Kelemen)
- ja (Takeshi AIHANA)
- ko (Changwoo Ryu)
- nb (Kjartan Maraas)
- pt (Duarte Loreto)
- pt_BR (Leonardo Ferreira Fontenelle)
- sv (Daniel Nylander)
- th (Theppitak Karoonboonyanan)
- uk (Maxim Dziumanenko)
- vi (Nguyen Thai Ngoc Duy)
- zh_CN (Abel Cheung)
------------------------------------------------------------------------------
gnome-control-center 2.17.91
common:
- Compilation fixes (Kjartan Maraas)
- Fixed localedir defines (Christian Persch) (#395383)
- Use standard installation paths (Christian Persch) (#395383)
- Use capplet name for G_LOG_DOMAIN (Jens Granseuer) (#380991)
- Require GTK+ <= 2.10 (Jens Granseuer) (#358106)
about me:
- Fix build with gcc 2 (Jens Granseuer)
- Fix memory leaks (Jens Granseuer)
- Fix possible crash (Jens Granseuer)
at-properties:
- Fix reference leaks and dont segfault if glade file is not available (Jens Granseuer)
default applications:
- Use specific string as app ID in gnome_program_init (Christian Persch) (#403708)
- Plug memory leaks (Jens Granseuer) (#395212)
- Fix DATADIR define (Jens Granseuer)
keybindings:
- Issue a sensible error message when trying to use unmodified keybindings
(Jens Granseuer) (#328152)
- Removed leftover call to gnome_theme_init (Jens Granseuer) (#157452)
- Support localised key names (Jens Granseuer) (#145346)
- Clean up sorting to not use an imaginary column (Jens Granseuer)
- Avoid warnings when clearing at exit (Mariano Suárez-Alvarez) (#405175)
- Added missing GConf key (Mariano Suárez-Alvarez)
mouse:
- Dont crash if the glade file is not available (Jens Granseuer)
network:
- Plug memory leaks (Jens Granseuer) (#395609)
sound:
- Polypaudio->PulseAudio renaming (Gabor Kelemen) (#394003)
- Added a11y label relations for the devices tab (Patrick Wade) (#369302)
theme switcher:
- Fix compiler warnings (Thomas Wood)
- Fixes on the suffix checks (Alberto Ruiz)
- Pass correct order of arguments to gnome_vfs_xfer (Kjartan Maraas)
- Listen for changes in the gtk-color-scheme property of GtkSettings (Thomas Wood)
(#405210)
typing break:
- Use specific string as app ID in gnome_program_init (Christian Persch) (#403708)
- Use compositing to display the typing break window when available (Christian
Persch) (#363665)
ui properties:
- Plug memory leaks (Jens Granseuer)
- Change "Editable menu accelerators" to "Editable menu shortcut keys" as per
the style guide (Jens Granseuer) (#337624)
windows:
- Plug memory leaks (Jens Granseuer)
fontilus:
- Use GOption argument parsing (Christian Persch) (#393994)
- Fixed some leaks (Christian Persch)
themus:
- Port to GOption (Jens Granseuer) (#336286)
settings daemon:
- Prevent crashes/assertion failures trying to set ridiculously high/low
volumes (Jens Granseuer) (#401376)
- Fixed property names (Jens Granseuer)
- Dont install the same window filter twice (Jens Granseuer) (#382504)
- Make sure we have a key event before treating it as such (Jens Granseuer)
(#382503)
- Fixed leaks (Jens Granseuer, Paolo Borelli) (#342672)
- Round volume instead of truncating on umute so a simple mute/unmute doesn't
lower the volume (Jens Granseuer) (#400966)
- Make the new volume overlay window follow the icon and color themes
(William Jon McCann) (#403320)
- Eat media player keys if someone is listening on the bus interface already
(Bastien Nocera) (#394313)
- Revert to the old font path if the new one could not be set (Jens Granseuer)
(#397504)
shell:
- Prevent capplets from being launched twice (Rodrigo Moya)
- Use correct GConf prefix (Rodrigo Moya)
- Added default common tasks (Rodrigo Moya)
- Respect the exit_on_close flag (Scott Reeves)
- Added a flag controlling display of GenericName's (Scott Reeves)
- Fix typo in usage string (Jens Granseuer) (#398361)
- Respect the --disable-schemas-install configure flag (Christian Persch) (#401004)
- Dump remnants of gstreamer-0.8 (Jens Granseuer)
- Use custom gnomecc.menu instead of settings.menu (Denis Washington) (#402797)
- Dont show Help menu if help is not available (Rodrigo Moya)
- Disable package management/main-menu items in the context menu (Rodrigo Moya)
- Use correct text color when highlighting (Rodney Dawes) (#398079)
- Use smaller icons by default (Scott Reeves) (#405078)
- Use G_GNUC_FUNCTION instead of non-portable __FUNCTION__ (Damien Carbery) (#383022)
updated translations:
- ar (Djihed Afifi)
- be (Ihar Hrachyshka)
- bg (Alexander Shopov)
- ca (Jordi Mas and Josep Puigdemont i Casamajó)
- cs (Jakub Friedl)
- en_GB (David Lodge)
- et (Priit Laes)
- fr (Marc Lorber, Robert-André Mauchin and Stéphane Raimbault
- he (Yair Hershkovitz)
- hu (Gabor Kelemen)
- ja (Takeshi AIHANA)
- ko (Changwoo Ryu)
- mk (Jovan Naumovski)
- nb (Kjartan Maraas)
- pl (Artur Flinta)
- pt_BR (Luiz Fernando S. Armesto)
- ru (Leonid Kanter)
- sv (Daniel Nylander)
- th (Theppitak Karoonboonyanan)
------------------------------------------------------------------------------
gnome-control-center 2.17.90
common:
- Removed non-critical g_return_if_fail (Thomas Wood) (#353620)
- Added support for saving and applying the gtk-color-scheme key (Thomas Wood)
- Replaced non-standard categories with X-GNOME... (Denis Washington)
- Check for xf86misc lib in addition to header files (Jens Granseuer) (#397905)
about-me:
- Fixed compilation on Solaris (Brian Cameron) (#356076)
- Made translatable strings more generic (Francisco Javier F. Serrador) (#376079)
a11y:
- Renamed to "Keyboard Accesiblity" in .desktop file (Thomas Wood) (#330697)
background:
- Fixed several compile warnings (David Seseño) (#326022)
default applications:
- Moved capplet from System to Personal category (Thomas Wood)
keyboard:
- Don't crash if default group is not set in GConf (Sergey Udaltsov) (#398631)
keybindings:
- Moved scrolled window calls to their correct place (Rodrigo Moya)
- Fixed leaks (Jens Granseuer) (#394824)
- Corrected .desktop category entry (Thomas Wood)
mouse:
- Fixed memory leaks (Jens Granseuer) (#395539)
sound:
- Added NULL-check (Jan Arne Petersen) (#394736)
- Fixed spacing and build the whole dialog from Glade (Christian Persch) (#394068)
- Show the sound properties view after adding it to the dialog (Christian Persch)
- Fixed label alignments bug caused by Glade-3 #396433 (Christian Persch)
- Set play button insensitive when no sound is selected ((Sylvain Defresne, Thomas
Wood) (#353828)
theme switcher:
- Fixed build with gcc 2 (Jens Granseuer) (#394707)
- Removed separate color scheme saving UI (Thomas Wood)
- Added support for gtk-color-scheme key in metatheme info (Thomas Wood)
- Added a revert button to the color schemes tab (Thomas Wood)
typing break:
- Set default icon and application name (Andreas Nilsson) (#348641)
windows:
- Fixed leak (Kjartan Maraas) (#382039)
shell:
settings daemon:
- Added missing NULL-check (Jan Arne Petersen) (#395083)
- Removed variable that was never initialized (Jens Granseuer) (#382502)
- Quit application when window is closed (Rodrigo Moya) (#394303)
- Set program name to gnome-control-center (Rodrigo Moya)
updated translations:
- ar (Djihed Afifi)
- ca (Josep Puigdemont i Casamajó)
- cs (Jakub Friedl)
- en_GB (David Lodge)
- et (Priit Laes)
- fi(Ilkka Tuohela)
- hu (Gabor Kelemen)
- lt (Zygimantas Beruèka)
- nb (Kjartan Maraas)
- sl (Matic Zgur)
- sv (Daniel Nylander)
- th (Theppitak Karoonboonyanan)
------------------------------------------------------------------------------
gnome-control-center 2.17.5
about-me:
- Fix displaying of image selected by the user (Hiroyuki Ikezoe) (#343584)
background:
- Mark message showing background image size and type for translation (Roozbeh
Pournander) (#341899)
- Switched from popt to GOptionContext (Lucas Rocha) (#336286)
- Fix memory leaks (Jens Granseuer) (#335220)
- Fix crash when changing image name (Jens Granseuer) (#388616)
- Fix ability to change settings after manual change (Jean-Christophe Jaskula)
(#339404)
- Improve management of background thumbnails (Ray Strode) (#351991)
- Fix compilation on Solaris (Brian Cameron) (#356076)
common:
- Fix leaks (Christian Persch) (#393117)
- Add support for disabling esound (Marc-Andre Lureau) (#392276)
fonts:
- Make 'Font may be too large' dialog cleare (Gabor Kelemen) (#335963)
keybindings:
- Reuse the existing tree model instead of discarding and rebuilding it
(Jens Granseuer) (#128158)
- Fix leaks (Jens Granseuer)
keyboard:
- Switch from popt to GOptionContext (Lucas Rocha) (#336286)
- Fix typo (Kjartan Maraas)
mouse:
- Switch from popt to GOptionContext (Lucas Rocha) (#336286)
network:
- Add option to use the same proxy for all protocols (Diego Escalante) (#317097)
- Add missing mnemonic (Rodrigo Moya)
sound:
- Mark sound system names translatable (Gabor Kelemen) (#393472)
- Do proper dbus/libhal error handling (Jan Arne Petersen) (#363005)
- Switch from popt to GOptionContext (Lucas Rocha) (#336286)
- Make ESD optional (Marc-Andre Lureau) (#392276)
- Add accelerators to the device tab (Gabor Kelemen) (#350572)
- Spelling fixes (Kjartan Maraas)
- Use GtkAlignment for padding, not GtkHBox+GtkFrame (Thomas Wood) (#143215)
- Make volume up/down keys affect default channel of the applet (Jan Arne Petersen)
(#173035)
theme-switcher:
- Fix crash on manually changing the icon theme name (Priit Laes) (#349471)
- Fix some HIG issues with strings (Thomas Wood)
- Fix leaks (Christian Persch, Thomas Wood) (#393117, #326337)
- Set minimun size request on the treeview rather than the entire window
(Thomas Wood) (#393236)
- Fix build with c89 compilers (Thomas Wood) (#382730)
- Avoid markup in translatable messages (Gabor Kelemen) (#360449)
- Enable a message when the current theme does not support colour schemes
(Thomas Wood)
- Add custom colour scheme saving UI (Thomas Wood)
- Add MIME type for theme packages and support in the GUI (Alberto Ruiz) (#393697)
windows:
- Avoid markup in translatable messages (Elijah Newren) (#360449)
shell:
- Fix build with c89 compilers (Thomas Wood) (#382730)
- Use categories for control center applets (Denis Washington) (#393617)
settings daemon:
- Add DBus methods for media players to grab/release the keys (Jan Arne Petersen)
(#133815)
- Add support for GConf device and track selection (Jan Arne Petersen) (#173035)
fontilus:
- Add support for specifying string and font-size to use in the thumbnailer (Rob Staudinger)
(#333557)
themus:
- Fix crash when running from command prompt (Thomas Wood) (#167063)
translations:
- ar (Djihed Afifi)
- bg (Alexander Shopov)
- cs (Jakub Friedl)
- en_GB (David Lodge)
- mk (Jovan Naumovski)
- nb (Kjartan Maraas)
- sl (Matic Zgur)
- sv (Daniel Nylander)
- th (Theppitak Karoonboonyanan)
------------------------------------------------------------------------------
gnome-control-center 2.17.4
background:
- Plug a leak (Kjartan Maraas) (#376949)
common:
- Pass NULL to gtk_label_new() to do a bit less work (Kjartan Maraas) (#376949)
default-application:
- Fix a bunch of leaks from gconf_client_get_string() (Kjartan Maraas)
(#376949)
- add support for Iceweasel and Icedove (Loïc Minier) (#379085)
- Fix Thunderbird command line parameter (Luca Cavalli) (#326808)
- add support for Claws Mail (aka Sylpheed-Claws) (Colin Leroy) (#386771)
display:
- Don't leak the resolution. Pass NULL to gtk_label_new to do less work
(Kjartan Maraas) (#376949)
localization:
- Plug some leaks. (Kjartan Maraas) (#376949)
network:
- Fix a warning about unused result from g_slist_append(). (Kjartan Maraas)
theme-switcher:
- Plug a few leaks. (Kjartan Maraas) (#376949)
- HIG fixes to the color scheme tab, from suggestions in Bug 382517
(Thomas Wood)
- Rename "Theme Details" button to "Customize (Thomas Wood)
gnome-settings-daemon
- add a new media keys window that takes advantage of
compositing when available (William Jon McCann) (#383066)
Translators:
Djihed Afifi (ar)
Francisco Javier F. Serrador (es)
Ivar Smolin (et)
Ilkka Tuohela (fi)
Ankit Patel (gu)
Raivis Dejus (lv)
Jovan Naumovski (mk)
Kjartan Maraas (nb)
Tino Meinen (nl)
Matic ´gur (sl)
Daniel Nylander (sv)
Theppitak Karoonboonyanan (th)
------------------------------------------------------------------------------
gnome-control-center 2.17.3
common:
- Clean up file transfer dialog (Thomas Wood) (319926)
keyboard:
- Updated to new libgnomekbd API (Sergey Udaltsov)
shell:
- New control-center shell (Scott Reeves, Rodrigo Moya)
theme:
- Fixed crash in D&D of themes (Thomas Wood) (352490)
- Open transfer dialog with transient parent set (Thomas Wood)
- Added a colours tab to change gtk-color scheme setting (Thomas Wood)
- Fixed leak (Thomas Thurman) (378680)
- Cleanup some of the install code (Thomas Wood) (325300)
- Allow installing a theme from a directory (Thomas Wood) (326103)
typing break:
- Fixed redefinition of GNOMELOCALEDIR (Kjartan Maraas)
- Removed use of const char * for allocated strings (Kjartan Maraas)
translations:
- es (Francisco Javier F. Serrador)
- et (Priit Laes)
- fr (Christophe Bliard)
- ja (Satoru SATOH)
- nb (Kjartan Maraas)
- sv (Daniel Nylander)
------------------------------------------------------------------------------
gnome-control-center 2.17.1
control-center:
- Don't install unused GNOME_Control_Center.server.in file (Rodrigo Moya)
default applications:
- Added support for legacy GConf key (Sven Herzberg, Luca Cavalli) (359986)
mouse:
- Reordered widgets for A11Y (Sven Herzberg) (163690)
settings daemon:
- Delay displaying of error dialogs until there is a window manager running
(Dan Winship)
themus:
- Add a install-theme command line option (Thomas Wood) (354581)
translations:
- bg (Alexander Shopov)
- bn_IN (Runa Bhattacharjee)
- cs (Jakub Friedl)
- et (Priit Laes)
- fi (Ilkka Tuohela)
- it (Luca Ferretti)
- nn (Åsmund Skjæveland)
------------------------------------------------------------------------------
gnome-control-center 2.16.2
keyboard:
- Fixed crashes when failed DBUS connection to the server (Sergey Udaltsov)
- Fixed keyboard indicator segfault (Sergey UDaltsov) (351395)
theme-switcher:
- Fixed crash when drag&dropping themes (Thomas Wood) (352490)
translations:
- ar (Djihed Afifi)
- et (Priit Laes)
- it (Luca Ferretti)
- ja (Satoru SATOH)
- pl (Marek Stepien)
------------------------------------------------------------------------------
gnome-control-center 2.16.1
about-me:
- Fixed compilation issues on Sun Studio (Matt Keenan) (349079)
display:
- Never pass negative values for the rates (Brian Cameron) (356075)
keyboard:
- Make sure 'model' is never NULL (Brian Cameron, Rodrigo Moya) (356074)
themus:
- Fixed "Open" icon on button preview (Thomas Wood) (355268)
- Allow the text in the details to ellipsize and set a minimun width for
the dialog (Thomas Wood) (355269)
translations:
- ar (Wouter Bolsterlee)
- bg (Alexander Shopov)
- bn_IN (Runa Bhattacharjee)
- en_GB (David Lodge)
- et (Priit Laes)
- gl (Ignacio Casal Quinteiro)
- nn (Åsmund Skjæveland)
------------------------------------------------------------------------------
gnome-control-center 2.16.0
background:
- avoid excess strduping (Kjartan Maraas) (#352252)
keyboard:
- avoid extra key events processing (Matthias Clasen) (#352776)
settings daemon:
- avoid grabbing all keyboard when the key code cannot be retrieved
(Andre Klapper) (#170318)
theme-switcher:
- add missing maximize button (Thomas Wood) (#331835)
Translations:
- bg (Alexander Shopov)
- bn_IN (Runa Bhattacharjee)
- el (Kostas Papadimas)
- et (Priit Laes)
- fr (Christophe Merlet)
- hi (Rajesh Ranjan)
- hu (Gabor Kelemen)
- ka (Vladimer Sichinava)
- lt (Gintautas Miliauskas)
- lv (Raivis Dejus)
- mk (Jovan Naumovski)
- ml (Ani Peter)
- mr (Rahul Bhalerao)
- or (Subhransu Behera)
- pt (Duarte Loreto)
- pt_BR (Lucas Rocha)
- ru (Leonid Kanter)
- sv (Daniel Nylander)
- ta (I. Felix)
- th (Theppitak Karoonboonyanan)
- zh_HK (Chao-Hsiung Liao, Abel Cheung)
- zh_TW (Chao-Hsiung Liao, Abel Cheung)
------------------------------------------------------------------------------
gnome-control-center 2.15.92
background:
- fix "Background dialogue resizes when shown" (Rodney Dawes) (#332830)
common:
- fix issues with the themes previews (Benjamin Otte, Thomas Wood)
(#351378, #171634)
display:
- free 'resolution' string after using it, not before
(Kjartan Maraas, Rodrigo Moya)
mouse:
- also display the default theme (though without a preview
for technical reasons) (Sven Herzberg) (#322514)
sound:
- fix memory leak (Christian Persch)(#350566)
theme-switcher:
- patches from "generate visible previews first" (Benjamin Otte) (#351521)
Translators:
Rostislav \"zbrox\" Raykov (bg)
Josep Puigdemont (ca)
Jakub Friedl (cs)
Hendrik Richter (de)
Mindu Dorji (dz)
David Lodge (en_GB)
Ivar Smolin (et)
Ilkka Tuohela (fi)
Alastair McKinstry (ga)
Ignacio Casal Quinteiro (gl)
Ankit Patel (gu)
Rajesh Ranjan (hi)
Mate ORY (hu)
Satoru SATOH (ja)
Changwoo Ryu (ko)
Jovan Naumovski (mk)
Ani Peter (ml)
Badral (mn)
Rahul Bhalerao (mr)
Kjartan Maraas (nb)
Wouter Bolsterlee (nl)
Subhransu Behera (or)
A S Alam (pa)
Evandro Fernandes Giovanini (pt_BR)
Dan Damian (ro)
Leonid Kanter (ru)
Steve Murphy (rw)
Matic ´gur (sl)
Daniel Nylander (sv)
Theppitak Karoonboonyanan (th)
Maxim V. Dziumanenko (uk)
Clytie Siddall (vi)
Funda Wang (zh_CN)
------------------------------------------------------------------------------
gnome-control-center 2.15.91
misc:
- require libebook-1.2 1.7.90 for the new API (Sebastien Bacher)
about-me:
- fixed build with the new libebook API (Sebastien Bacher) (#348821)
at-properties:
- fixed X-GNOME-Bugzilla fields in .desktop file (Rodrigo Moya) (#348832)
- use orca screenreader when available (Willie Walker) (#348630)
display:
- fix build with gcc-2.95 (Jens Granseuer) (#347611)
- fixed X-GNOME-Bugzilla fields in .desktop file (Rodrigo Moya) (#348838)
keybindings:
- don't assume defines are contiguous (Gary Coady) (#333576)
keyboard:
- fixed X-GNOME-Bugzilla fields in .desktop file (Rodrigo Moya) (#348847)
libgswitchit:
- using Unicode subscript for repeating descriptions (Sergey Udaltsov)
network:
- set "label for" and "labelled by" properties for the capplet (Willie Walker)
(#342121)
sound:
- removed unneeded header file (Klaus Pedersen) (#349254)
- only include libhal if HAL is enabled (Ali Akcaagac) (#348755)
theme-switcher:
- added support for locking down theme (Rob Bradford) (#346041)
- don't attempt to load window manager theme name from an unknown window
manager (Thomas Wood) (#333276)
typing-break:
- use GtkAboutDialog, not GtkDialog (Vincent Untz) (#348640)
- use GtkStatusIcon instead of libegg (Vincent Untz) (#348639)
ui-properties:
- fixed X-GNOME-Bugzilla fields in .desktop file (Rodrigo Moya) (#348844)
updated translations:
- bg (Alexander Shopov)
- cs (Jakub Friedl)
- es (Francisco Javier F. Serrador)
- fi (Ilkka Tuohela)
- fr (Christophe Merlet)
- gu (Ankit Patel)
- lt (Zygimantas Berucka)
- mk (Jovan Naumovski)
- nb (Kjartan Maraas)
- nl (Vincent van Adrighem)
- th (Theppitak Karoonboonyanan)
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
------------------------------------------------------------------------------
gnome-control-center 2.15.90
misc:
- add an encoding key to some .directory.in (Vincent Fretin) (#338593)
- don't use the Application category for the .desktops, use
HardwareSettings for some (Vincent Fretin) (#344321)
- made gconf-property-editor.c use GtkColorButton instead of GnomeColorPicker
(Kevin Bauder) (#171680)
mouse:
- fix the non-xcursor case for solaris (Sven Herzberg, Glynn Foster) (#319125)
- use ngettext() correctly (Sven Herzberg)
theme-switcher:
- fixed messages wording (Thomas Wood) (#167045)
- removed duplicate check for the tar utility (Thomas Wood)
updated translations:
- ca (Josep Puigdemont i Casamajó)
- cs (Jakub Friedl)
- de (endrik Richter)
- dz (Guntupalli Karunakar)
- el (Kostas Papadimas)
- es (Francisco Javier F. Serrador)
- fi (Ilkka Tuohela)
- fr (Samuel Mutel)
- gu (Ankit Patel)
- id (Ahmad Riza H Nst)
- ja (Satoru SATOH)
- ko (Changwoo Ryu)
- sv (Daniel Nylander)
- th (Theppitak Karoonboonyanan)
------------------------------------------------------------------------------
gnome-control-center 2.15.4
background:
- Removed redundant GNOMELOCALEDIR (Sergey Udaltsov) (345178)
display:
- Replaced deprecated GtkOptionMenu with GtkComboBox (Sven Herzberg) (338468)
- Added rotation support (Sven Herzberg) (324125)
keyboard:
- Massive libgswitchit API change (Sergey Udaltsov)
- Made model chooser button more verbose (Sergey Udaltsov) (335833)
sound:
- Fixed build (Sergey Udaltsov)
theme-switcher:
- Fixed strange wording (Thomas Wood) (167045)
settings daemon:
- Activation is now done via DBUS (Sergey Udaltsov)
- Added DBUS interface for keyboard indication (Sergey Udaltsov)
documentation:
- Initial Russian translation (Nickolay V. Shmyrev)
updated translations:
- bn_IN (Runa Bhattacharjee)
- cs (Jakub Friedl)
- de (Hendrik Richter)
- es (Francisco Javier F. Serrador)
- fi (Ilkka Tuohela)
- fr (Benoît Dejean)
- gu (Ankit Patel)
- he (Yair Hershkovitz)
- hi (Rajesh Ranjan)
- lv (Raivis Dejus)
- mk (Jovan Naumovski)
- nb (Kjartan Maraas)
- ru (Nickolay V. Shmyrev)
- ta (I. Felix)
- th (Theppitak Karoonboonyanan)
- sv (Daniel Nylander)
------------------------------------------------------------------------------
gnome-control-center 2.15.3
about me:
- Fixed typo (Rodrigo Moya) (324971)
- Fixed compilation issues (Rodrigo Moya) (344468)
default applications:
- Added support for Sylpheed (Luca Cavalli) (332659)
- Removed unnecessary gnome-terminal argument (Luca Cavalli) (336700)
keybindings:
- Removed brightness keybindings, now in gnome-power-manager (Bastien Nocera)
(339857)
keyboard:
- Save/restore layout preview window geometry (Sergey Udaltsov)
mouse:
- Fixed selection when no cursor font is set in GConf (Darren Kenny) (340003)
sound:
- Added sound device selection (Jürg Billeter) (329112)
- Fixed button strings (Rodrigo Moya) (324971)
theme-switcher:
- Removed drag & drop information text (Thomas Wood) (99535)
- Added Install buttons to each tab in the details window (Thomas Wood)
- Remember last browsed or installed from location (Thomas Wood) (138795)
- Don't allow invalid characters in theme names (Thomas Wood) (139692)
- Don't ask user whether to overwrite or not internal files (Thomas Wood) (317375)
- Allow saving background image for custom themes (Thomas Wood) (330302)
- Fixed UI issues in the save dialog (Thomas Wood) (100622)
settings daemon:
- Fixed libxklavier engine initialization logic (Sergey Udaltsov) (333091)
- Removed references to brightness controls (Bastien Nocera) (339857)
- Fixed leaks (Paolo Borelli) (342568, 342570)
general:
- Updated to new libxklavier API (Sergey Udaltsov)
updated translations:
- bg (Alexander Shopov)
- cs (Miloslav Trmac, Lukas Novotny, Jakub Friedl)
- dz (Pema Geyleg)
- es (Francisco Javier F. Serrador)
- fi (Ilkka Tuohela)
- gl (Ignacio Casal Quinteiro)
- gu (Ankit Patel)
- mg (Simos Xenitellis)
- nb (Kjartan Maraas)
- sq (Laurent Dhima)
- sv (Daniel Nylander)
- th (Theppitak Karoonboonyanan)
- vi (Clytie Siddall)
- zh_CN (Funda Wang)
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
------------------------------------------------------------------------------
gnome-control-center 2.14.2
about-me:
- Fixed label alignment (Sebastien Bacher) (343056)
default applications:
- Updated help section name (Daniel Holbach) (340032)
settings daemon:
- Fixed potential overrun (Ray Strode) (338254)
- Fixed 64bit crash (Joe Marcus Clarke) (338849)
updated translations:
- bg (Alexander Shopov)
- cs (Lukas Novotny)
- dz (Pema Geyleg)
- et (Priit Laes)
- eu (Iñaki Larrañaga)
- fr (Benoît Dejean)
- id (Ahmad Riza H Nst)
- sq (Laurent Dhima)
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
------------------------------------------------------------------------------
gnome-control-center 2.14.1
background:
- Fixed crash on startup (Rodney Dawes) (331486)
common:
- Use gtk_dialog_run for running modal error dialogs (Rodrigo Moya)
- Fixed leaks in CORBA activation code (Arjan Timmerman) (334153)
default applications:
- Fixed thunderbird command line parameters (Luca Cavalli) (326808)
fontilus:
- Move .directory files to $datadir/desktop-directories (Glynn Foster)
(334405)
settings daemon:
- Fixed setting of $DISPLAY environment variable (Rodrigo Moya, Arjan
Timmerman) (334153)
- Set Ctrl-Atl-l as default keybinding for screen locking (Jaap A. Haitsma)
(171833)
- Fixed evdev/left handed button mapping (Marien Zwart) (323724)
themus:
- Move .directory files to $datadir/desktop-directories (Glynn Foster)
(334405)
- Don't allow tab characters in custom theme descriptions (Wouter Bolsterlee)
(336151)
- Theme chooser main window too wide for 800x600 (Thomas Wood) (314658)
updated translations:
- be (Ales Nyakhaychyk)
- br (Jérémy Ar Floc'h)
- cs (Miloslav Trmac)
- dz (Tommi Vainikainen)
- es (Francisco Javier F. Serrador)
- et (Priit Laes)
- hu (Gabor Kelemen)
- ka (Vladimer SIchinava)
- lt (Zygimantas Berucka)
- nl (Vincent van Adrighem, Wouter Bolsterlee)
- ro (Dan Damian)
- th (Theppitak Karoonboonyanan)
- vi (Clytie Siddall)
------------------------------------------------------------------------------
gnome-control-center 2.14.0
default applications:
- Use correct text domain name (Luca Cavalli) (332833)
- Fixed response to icon theme changes (Luca Cavalli) (330154)
- Compilation fixes (Luca Cavalli) (332973)
- Don't use deprecated gtk_entry_set_editable (Luca Cavalli) (329193)
settings daemon:
- Removed spawning of esd (Rodrigo Moya)
- Register the settings daemon per DISPLAY (Michael Witrant) (94049)
sound:
- Mark missing strings for translation (Rodrigo Moya) (333125)
help:
- Pruned capplets documentation, and link to the user's guide (Joachim Noreiko)
(332184)
general:
- Fixed compilation with GStreamer 0.8 (Mathis Hasselmann) (333119)
updated translations:
- bg (Alexander Shopov)
- bn (Runa Bhattacharjee)
- ca (Josep Puigdemont i Casamajó)
- cs (Miloslav Trmac)
- cy (Rhys Jones)
- da (Ole Laursen)
- de (Hendrik Richter, Hendrik Brandt)
- el (Simos Xenitellis)
- es (Francisco Javier F. Serrador)
- et (Priit Laes)
- fa (Roozbeh Pournader)
- fi (Ilkka Tuohela)
- gl (Ignacio Casal Quinteiro)
- gu (Ankit Patel)
- hu (Gabor Kelemen)
- it (Luca Ferretti)
- ja (Satoru SATOH)
- lt (Zygimantas Berucka)
- nb (Kjartan Maraas)
- nl (Vincent van Adrighem)
- nn (Kjartan Maraas)
- no (Kjartan Maraas)
- pl (Artur Flinta)
- pt (Duarte Loreto)
- pt_BR (Lucas Rocha)
- ru (Leonid Kanter)
- sq (Laurent Dhima)
- sr (Danilo Segan)
- sr@Latn (Danilo Segan)
- sv (Daniel Nylander)
- th (Theppitak Karoonboonyanan)
- uk (Maxim Dziumanenko)
- vi (Clytie Siddall)
- zh_CN (Funda Wang)
------------------------------------------------------------------------------
gnome-control-center 2.13.93
default applications:
- Fixed hang with multiple windows opened (Luca Cavalli) (328094)
- Fixed Sylpheed claws executable name (Fryderyk Dziarmagowski) (332659)
- Fixed typos (Glynn Foster)
fontilus:
- Fixed crash when changing metacity font (Rodrigo Moya) (327021)
mouse:
- Use "milliseconds" instead of "microseconds" (Anilkumar Bacheli) (330588)
sound:
- Fixed memory leaks (Rodrigo Moya) (332530)
settings daemon:
- C89 compilation fixes (Jens Granseuer) (331168)
updated translations:
- bg (Alexander Shopov)
- ca (Josep Puigdemont i Casamajó)
- cs (Miloslav Trmac and Jakub Friedl)
- cy (Rhys Jones)
- de (Hendrik Richter)
- el (Kostas Papadimas)
- es (Francisco Javier F. Serrador)
- et (Priit Laes)
- eu (Iñaki Larrañaga)
- fi (Ilkka Tuohela)
- gl (Ignacio Casal Quinteiro)
- gu (Ankit Patel)
- hu (Gabor Kelemen)
- ja (Satoru SATOH and Takeshi AIHANA)
- ka (Alexander Didebulidze)
- lt (Zygimantas Berucka)
- nb (Kjartan Maraas)
- nl (Vincent van Adrighem)
- no (Kjartan Maraas)
- pt (Duarte Loreto)
- pt_BR (Raphael Higino)
- sr (Slobodan D. Sredojevic)
- sr@Latn (Slobodan D. Sredojevic)
- th (Theppitak Karoonboonyanan)
- vi (Clytie Siddall)
------------------------------------------------------------------------------
gnome-control-center 2.13.92
background:
- Re-added instant apply (Rodney Dawes)
default applications:
- Fixed compilation warnings (Luca Cavalli)
settings daemon:
- Only start esd when not running (Rodrigo Moya)
other:
- Removed HAL dependency added by mistake (Rodrigo Moya)
- Depend on glib >= 2.8.0 (Rodrigo Moya)
- Depend on gtk+ >= 2.8.12 for Cairo speed workaround (Rodney Dawes)
updated translations:
- ca (Josep Puigdemont i Casamajó)
- da (Ole Laursen)
- de (Hendrik Richter)
- fi (Ilkka Tuohela)
- gl (Ignacio Casal Quinteiro)
- lt (Zygimantas Berucka)
- nb (Kjartan Maraas)
- nl (Vincent van Adrighem)
- no (Kjartan Maraas)
- th (Theppitak Karoonboonyanan)
- zh_CN (Funda Wang)
------------------------------------------------------------------------------
gnome-control-center 2.13.91
build:
- enable generation of Makefile for spanish docs to fix the build.
------------------------------------------------------------------------------
gnome-control-center 2.13.90
about-me:
- Preserve tab navigation on the dialog (Diego González) (317468)
- Fixed crash (Diego González) (317315)
background:
- Added apply button (Rodney Dawes) (327335)
- Fixed glib CRITICAL warnings (Rodney Dawes) (327327)
default applications:
- Fixed Thunderbird command line parameters (Luca Cavalli) (326808)
- Update custom command entries also when predefined app is selected
(Luca Cavalli) (327749)
- Don't set entries' sensitivity, just disable input on them (Rodrigo
Moya)
- Use better description and arguments for Epiphany (chpe) (327220)
fontilus:
- Added button for document font (Christian Persch) (160454)
- Changed "monospace" to "fixed width" (Christian Persch)
- Fixed font thumbnailing endianness (Ed Catmur) (329043)
keybindings:
- Refuse to bind letter keys without a modifier (Bastien Nocera) (86956)
- Readded the keysim/keycode binding code (Rodrigo Moya)
keyboard:
- Fixed user-visible strings (Rodrigo Moya) (328748)
mouse:
- Fixed a11y problem with gnopernicus screen reader (Anilkumar Bacheli)
(154769)
network:
- Fixed mnemonic (Crispin Flowerday) (328884)
sound:
- Use correct stock icon for PLAY button (Dennis Cranston)
- Reduced size of the dialog (Rodrigo Moya)
- Fixed compilation warnings (Damien Carbery, Jens Granseuer) (328255)
settings daemon:
- Use verbs for slow/sticky keys dialogs, rather than OK/Cancel (chpe)
(325686)
help:
- Updated scrollkeeper description (Alessandro Ferrucci) (327784)
other:
- Don't use "capplet" in user-visible strings (Rodrigo Moya) (168790)
- Fixed glib CRITICAL warnings (Thomas Wood)
- Added GTK category to .desktop files (Luca Cavalli) (328028)
- Use "mouse pointer" instead of "cursor" in user-visible strings
(Scott Bronson) (318056)
updated translations:
- bg (Alexander Shopov)
- ca (Josep Puigdemont i Casamajó)
- da (Lasse Bang Mikkelsen)
- el (Kostas Papadimas)
- en_CA (Adam Weinberger)
- es (Francisco Javier F. Serrador)
- fi (Ilkka Tuohela)
- gl (Ignacio Casal Quinteiro)
- gu (Ankit Patel)
- hu (Gabor Kelemen)
- it (Luca Ferretti)
- ja (Takeshi AIHANA)
- lt (Zygimantas Berucka)
- nb (Kjartan Maraas)
- nl (Vincent van Adrighem)
- no (Kjartan Maraas)
- pt_BR (Evandro Fernandes Giovanini)
- ru (Nickolay V. Shmyrev)
- sr (Slobodan D. Sredojevic)
- sr@Latn (Slobodan D. Sredojevic)
- th (Theppitak Karoonboonyanan)
- vi (Clytie Siddall)
- zh_CN (Funda Wang)
------------------------------------------------------------------------------
gnome-control-center 2.13.5.1
default applications:
- Fixed loading of translations from XML file (Luca Cavalli)
settings daemon:
- Use g_mkdir_with_parents instead of creating all the hierarchy by hand
(Rodrigo Moya)
other:
- Fixed m4 directory missing (chpe)
updated translations:
- da (Lasse Bang Mikkelsen)
- en_CA (Adam Weinberger)
- gu (Ankit Patel)
- sr (Slobodan D. Sredojevic)
------------------------------------------------------------------------------
gnome-control-center 2.13.5
background:
- Changed main dialog to use explicit apply with OK and cancel buttons
(Rodney Dawes)
- Added zoom to scale type options (Alan Swanson)
default applications:
- New UI (Luca Cavalli)
- Build and general fixes to the new UI (Sebastian Bacher, Rodrigo Moya)
keybindings:
- Dropped the keysim/keycode binding code (Bastien Nocera) (133815)
keyboard:
- Made window a bit larger (Sergey Udaltsov) (326137)
- Fixed window title capitalization (Sergey Udaltsov) (326275)
mouse:
- Made mouse clock work with both left/right buttons (akmal) (321255)
sound:
- New UI (Scott Reeves)
- HIG fixes to the new UI (Dennis Cranston)
- Translation fixes (Rodrigo Moya) (326635)
themus:
- Fixed usage of head command (Thomas Wood) (316800)
typing break:
- Use gdk_spawn_* functions instead of egg equivalents (Rodrigo Moya) (326141)
settings daemon:
- Cleaned up messages about pmu on powerbook (Jeroen Zwartepoorte) (132655)
- Set Net/FallbackIconTheme XSetting for new versions of gnome-icon-theme
and gtk+ >= 2.8.10 (Rodney Dawes) (325546)
- Use gstreamer0.10 optionally (Saleem Abdulrasool and Tim-Philip Muller) (326257)
updated translations:
- bg (Alexander Shopov)
- ca (Josep Puigdemont i Casamajó)
- en_CA (Adam Weinberger)
- es (Francisco Javier F. Serrador)
- fi (Ilkka Tuohela)
- gl (Ignacio Casal Quinteiro)
- gu (Ankit Patel)
- hu (Gabor Kelemen)
- ja (Takeshi AIHANA)
- nb (Kjartan Maraas)
- nl (Vincent van Adrighem)
- no (Kjartan Maraas)
- sr (Slobodan D. Sredojevic)
- sr@Latn (Slobodan D. Sredojevic)
- th (Theppitak Karoonboonyanan)
- vi (Clytie Siddall)
- zh_HK (Chao-Hsiung Liao)
- zh_TW (Chao-Hsiung Liao)
------------------------------------------------------------------------------
gnome-control-center 2.13.4
default-applications:
- Added Opera to list of default browsers (pholie) (324629)
keyboard:
- Fixed leak on GtkSizeGroup's (Jaap A. Haitsma) (321549)
themus:
- Update the background for metathemes that provide a preferred
background (Guillaume Desmottes) (147665)
- Fixed typeahead searching in themes list (David Seseño)
windows behavior:
- Fixed mnemonics (Rajan Singh)
settings daemon:
- Restore prelight/active/mouse-over feedback for Tk (jenglish) (130299)
- Made Emacs xsettings mimic better GNOME's look & feel (Lukasz Stelmach)
(320727)
other:
- Compilation fixes (Jens Granseuer) (321779)
- Removed unused --enable-gconf-source option (Mark McLoughlin)
updated translations:
- ca (Josep Puigdemont i Casamajó)
- fi (Ilkka Tuohela)
- vi (Clytie Siddall)
------------------------------------------------------------------------------
gnome-control-center 2.13.3
about-me:
- Added a preview to the filechooser used for selecting an image (Mathias Clasen)
- Fixed for running in systems with no forkpty (Brian Cameron)
gnome-settings-daemon:
- Added definition of "Gtk/ShowInputMethodMenu"/"Gtk/ShowUnicodeMenu" xsettings
(Mathias Clasen) (319634)
- C89 compilation fixes (Jens Granseuer) (321778)
- Don't grab keyboard when getting invalid keycodes from GConf (Philippe
Troin) (323690)
keyboard:
- Small changes in plugin API (Sergey V. Udaltsov)
themus:
- Added removal of themes from the theme selection applet (David Seseño)
typing-break:
- Don't display a dialog when the monitor is already running (Richard Hult) (307425)
- Use stock icons from GTK rather than libgnomeui (Richard Hult) (171664)
other:
- Compilation fixes (Kjartan Maraas)
translations:
- bg (Alexander Shopov)
- cs (Miloslav Trmac)
- en_CA (Adam Weinberger)
- es (Francisco Javier F. Serrador)
- et (Priit Laes)
- gl (Ignacio Casal Quinteiro)
- gu (Ankit Patel)
- ja (Takeshi AIHANA)
- lt (Zygimantas Beruèka)
- nb (Kjartan Maraas)
- no (Kjartan Maraas)
- pt_BR (Guilherme de S. Pastore)
- sk (Marcel Telka)
- sq (Laurent Dhima)
- th (Theppitak Karoonboonyanan)
- zh_CN (Funda Wang)
------------------------------------------------------------------------------
gnome-control-center 2.13.2
background:
- Sanity check on GConf string values (Alexis Robert) (320647)
themus:
- 15-20% speedup in theme thumbnailer startup (Sebastien Bacher)
shell:
- Respond correctly to theme changes (Carlos Garnacho)
other:
- Compilation fixes (Kjartan Maraas, Rodrigo Moya)
translations:
- bg (Alexander Shopov)
- cs (Miroslav Trmac)
- en_CA (Adam Weinberger)
- es (Francisco Javier F. Serrador)
- eu (Iñaki Larrañaga)
- fa (Roozbeh Pournader)
- fi (Ilkka Tuohela)
- ja (Takeshi AIHANA)
- lt (Zygimantas Berucka )
- nl (Vincent van Adrighem)
- ro (Dan Damian)
- sk (Marcel Telka)
- th (Theppitak Karoonboonyanan)
------------------------------------------------------------------------------
gnome-control-center 2.13.1
default-applications:
- Add Sylpheed-Claws to the list of possible mailers (Colin Leroy)
mouse:
- gcc 2.95 compilation fixes (Jens Granseuer) (318746)
themus:
- Allow installation of themes with file:// URIs (Ed Catmur) (319358)
shell:
- Only show one screensaver capplet when both xscreensaver and gnome-screensaver
are installed (Rodrigo Moya) (315505)
- Fix scrollbar arrows (Carlos Garnacho)
- Calculate text widths instead of forcing them (Carlos Garnacho) (319492)
- Force canvas background to base[GTK_STATE_NORMAL] and remove the need to
repaint the background, in white (Carlos Garnacho)
typing-break:
- Fix weird spacing between systray icons (Rodrigo Moya) (318231)
other:
- Add schema for remembering NumLock state between sessions (Jürg Billeter)
(74215)
- Add check for xinput extension (Ray Strode) (314409)
- Update the desktop font in addition to the application font when
'apply font' in large print themes is selected (Muktha) (123551)
- Reduced amount of xrdb executions (Erwann Chenede) (314774)
- Don't block settings daemon while executing children processes (Rodrigo Moya)
- Lazy load the screensaver and the typing break monitor (Rodrigo Moya)
- Share a single GConfClient in the settings daemon (Rodrigo Moya)
- Execute xrdb with -nocpp switch when possible (Rodrigo Moya)
- Swap buttons on auxiliary mice for left-handed mode (Ray Strode) (314409)
translations:
- bg (Alexander Shopov)
- en_CA (Adam Weinberger)
- et (Priit Laes)
- fi (Ilkka Tuohela)
- pt_BR (Guilherme de S. Pastore)
- sv (Christian Rose)
------------------------------------------------------------------------------
gnome-control-center 2.12.1
background:
- Make sure that the filename is valid utf8 and the file exists with utf8
encoding, or fall back to filename encoding as specified by the user
with glib's environment variables (Rodney Dawes) (168604)
- Set the style property "action-area-border (Rodney Dawes) (313680)
default-applications:
- List evolution-2.4 binary (Jan de Groot) (#315871)
gnome-settings-daemon:
- Don't leak the cursor theme name (Kjartan Maraas) (#314692)
mouse:
- fix a crasher when the cursor theme has no icon (Sebastien Bacher) (#317749)
- guard against invalid values from the GtkHScale widget (Rodrigo Moya)
themus:
- fix a typo with the StartupNotify option (Vincent Fretin) (#316159)
other:
- if the xcursor extension can't be found just build without xcursor support
(Brian Cameron) (#316875)
translations:
Rostislav \"zbrox\" Raykov (bg)
Progga (bn)
Miloslav Trmac (cs)
Francisco Javier F. Serrador (es)
Ivar Smolin (et)
Iñaki Larrañaga Murgoitio (eu)
Christophe Merlet (RedFox) (fr)
Ignacio Casal Quinteiro (gl)
Erdal Ronahi (ku)
Christian Rose (sv)
Clytie Siddall (vi)
Funda Wang (zh_CN)
------------------------------------------------------------------------------
gnome-control-center 2.12.0
translations:
Jordi Mallach (ca)
Miloslav Trmac (cs)
Rhys Jones (cy)
Hendrik Richter (de)
Francisco Javier F. Serrador (es)
Vincent Untz (fr)
Gabor Kelemen (hu)
Young-Ho Cha (ko)
Reinout van Schouwen (nl)
Gnome PL Team (pl)
Evandro Fernandes Giovanini (pt_BR)
Duarte Loreto (pt)
Leonid Kanter (ru)
Marcel Telka (sk)
Elian Myftiu (sq)
Слободан Д. Средојевић (sr)
Baris Cicek (tr)
Clytie Siddall (vi)
------------------------------------------------------------------------------
gnome-control-center 2.11.92
about-me:
- typo fix (Francisco Javier F. Serrado) (#312845)
- use "wrapped" instead of "one" to handler the case where the passwd command
finds the password wrapped. Use a long delay period.
(Jaap Hatsima) (#312092)
- use integer to avoid comparison being always true due to limited range
(Olaf Heiring).
background:
- Enable/disable the style-menu, shading-menu and color-picker buttons
w.r.t gconf-keys (Veerapuram Varadhan).
- Replace the changing of some GtkDialog defaults through style properties with
calls to gtk_widget_ensure_style and gtk_container_set_border_width
(Rodney Dawes) (#313680)
- If the value for the "picture_options" key is set to "none", don't set the
optin menu for the scaling options to tiled (Rodney Dawes) (#313883).
common:
- Get the Example icon that is specified by the icon theme, if it exists,
and then fall back through a better list of icons to use (Rodney Dawes).
keyboard:
- don't use a page value, fix the different behaviour between widgets
(Sebastien Bacher) (#301470).
other:
- configure fixes (Sergey V. Udaltsov, Ray Strode, Christian Persch)
- fix a leak (Rodrigo Moya)
translations:
Jens Seidel (de)
Kostas Papadimas (el)
Francisco Javier F. Serrador (es)
Ivar Smolin (et)
Gabor Kelemen (hu)
Mohammad DAMT (id)
Takeshi AIHANA (ja)
Žygimantas Beručka (lt)
Terance Edward Sola (nb)
Terance Edward Sola (no)
Sebastian Ivan (ro)
Слободан Д. Средојевић (sr)
Baris Cicek (tr)
Maxim V. Dziumanenko (uk)
Funda Wang (zh_CN)
Woodman Tuen (zh_TW)
------------------------------------------------------------------------------
gnome-control-center 2.11.91
about-me:
- fix the crash when closing the password dialog with the windo manager button
(Diego Gonzalez) (#309736, #312580)
- change signature and handle error conditions from passwd (Diego Gonzalez)
(#312092)
- handle protocol errors from EDS. (Diego Gonzalez) (#312450)
build:
- fix the build without gstreamer and with alsa (Paul Drain) (#307368)
fontilus:
- follow symlinks when getting info (Paolo Borelli) (#309744)
mouse:
- don't crash if there is no cursor theme installed (Sebastien Bacher)
(#311599)
- update dynamically the double click label (Sebastien Bacher) (#166908)
- update of the glade file, no need to restart the session to apply
the changes with GTK 2.8 (Sebastien Bacher) (#312070)
translations:
Rostislav \"zbrox\" Raykov (bg)
Miloslav Trmac (cs)
Adam Weinberger (en_CA)
Francisco Javier F. Serrador (es)
Ivar Smolin (et)
Ilkka Tuohela (fi)
Ankit Patel (gu)
Yuval Tanny (he)
Gabor Kelemen (hu)
Takeshi AIHANA (ja)
Terance Edward Sola (nb)
Reinout van Schouwen (nl)
Terance Edward Sola (no)
Marcel Telka (sk)
Слободан Д. Средојевић (sr)
Prajasakti Localisation Team (te)
Theppitak Karoonboonyanan (th)
Clytie Siddall (vi)
Funda Wang (zh_CN)
------------------------------------------------------------------------------
gnome-control-center 2.11.90
general:
- change the way XKB GConf preferences are handled so that:
1) GConf keys are never written unless the user changes the preferences
2) If the keys are unset, the default XKB settings are used
(Mark McLoughlin) (#310513)
- remove wm-properties (Mark McLoughlin)
- switch to gnome-doc-utils (Sebastien Bacher)
- set windows' icon for the keyboard dialogs (Jaap A. Haitsma) (#305096)
- set a default icon for the capplets (Jaap A. Haitsma) (#305086)
- try to run gnome-screensaver before xscreensaver (Rodrigo Moya) (#302347)
about-me:
- change the order of the buttons to match the HIG (Denis Cranston) (#309632)
background:
- if xmlParseFile returns NULL, then just return, rather than trying to parse
the document (Rodney Dawes) (#310041)
- update menu option when scrolling with the mouse (Sebastien Bacher) (#157396)
- use GtkColorButton instead of GnomeColorPicker (Sebastien Bacher) (#171676)
ui-properties:
- show a label with the "Text beside icons" mode (Sebastien Bacher) (#308845)
translations:
Rostislav \"zbrox\" Raykov (bg)
Miloslav Trmac (cs)
Hendrik Brandt (de)
Kostas Papadimas (el)
Adam Weinberger (en_CA)
Francisco Javier F. Serrador (es)
Priit Laes (et)
Ignacio Casal Quinteiro (gl)
Ankit Patel (gu)
Takeshi AIHANA (ja)
Terance Edward Sola (nb)
Reinout van Schouwen (nl)
Terance Edward Sola (no)
Marcel Telka (sk)
Theppitak Karoonboonyanan (th)
Clytie Siddall (vi)
Funda Wang (zh_CN)
------------------------------------------------------------------------------
gnome-control-center 2.11.6
general:
- expose the cursor theme settings as xsettings (Matthias Clasen) (#308104)
- fix a typo with a .schemas name (Jan Schmidt) (#307388)
- fix the markup usage of the XKB dialog (Sebastien Bacher) (#308279)
- make the copy dialog consistent with nautilus (William Jon McCann) (#309217)
- require libxft 2.1.7 (Christian Lohmaier) (#309558)
about-me:
- fix some typo (Clytie Siddall) (#302614)
- set dialog icon (Jaap A. Haitsma) (#309342)
- HIG fixes (Dennis Cranston) (#309952)
- improve the behaviour of the capplet when using large images (Diego Gonzalez)
- commit the changes so that we don't loose any data (Diego Gonzalez) (#309737)
- fix image loading when draging an image on the image button (Diego Gonzalez)
(#309628)
- change the maxium width and height permitted on an image (Diego Gonzalez)
(#309643)
background:
- fixed some leaks (Rodney Dawes, Kjartan Maraas)
- replace GnomeIconTheme by GtkIconTheme (Rodney Dawes, Jan de Groot) (#171677)
mouse:
- new cursor theme manager for the mouse capplet
(Sven Herzberg, Matthias Clasen) (#110670)
translators:
Miloslav Trmac (cs)
Adam Weinberger (en_CA)
Francisco Javier F. Serrador (es)
Ivar Smolin (et)
Ignacio Casal Quinteiro (gl)
Terance Edward Sola (nb)
Reinout van Schouwen (nl)
Terance Edward Sola (no)
Marcel Telka (sk)
Theppitak Karoonboonyanan (th)
------------------------------------------------------------------------------
gnome-control-center 2.11.5
- new "about-me" capplet by Diego Gonzalez
translators:
Hendrik Richter (de)
Adam Weinberger (en_CA)
Ivar Smolin (et)
Meelad Zakaria (fa)
Terance Edward Sola (nb)
Reinout van Schouwen (nl)
Terance Edward Sola (no)
Marcel Telka (sk)
Elian Myftiu (sq)
Christian Rose (sv)
Theppitak Karoonboonyanan (th)
Funda Wang (zh_CN)
Woodman Tuen (zh_TW)
------------------------------------------------------------------------------
gnome-control-center 2.11.4
- fix a crasher with the clipboard manager (Sebastien Bacher)
- fix a crasher when changing the volume with the multimedia keys
(Christophe Fergeau)
- make the sticky keys and slow keys dialog HIG compliants
(Carlos Garnacho Parro)
------------------------------------------------------------------------------
gnome-control-center 2.11.3
- fix mute handling, particularly for devices without hardware mute support
or with applications that use volume=0 for mute (Ronald S. Bultje)
- clipboard manager (Anders Carlsson)
- canvas a11y support (Carlos Garnacho Parro)
- name and description to the object information (Rodrigo Moya)
translator:
Vladimir Petkov (bg)
Miloslav Trmac (cs)
Rhys Jones (cy)
Martin Willemoes Hansen (da)
Adam Weinberger (en_CA)
Alessio Dessì (it)
Takeshi AIHANA (ja)
Kjartan Maraas (nb)
Kjartan Maraas (no)
Elian Myftiu (sq)
Theppitak Karoonboonyanan (th)
------------------------------------------------------------------------------
gnome-control-center 2.11.1
- allow to configure the menubar shortcut (Sebastien Bacher)
- new shell layout code (Carlos Garnacho Parro)
- port of the font capplet to gtk_font_button and some cleanup (Paolo Borelli)
- make proxy settings HIG compliant (Jorn Baayen)
- lot of cleanups (Kjartan Maraas)
- don't list themes using the Hidden property (Shakti Sen).
- fix the theme preview crasher with xorg/composite (Colin Gibbs)
translators:
Vladimir Petkov (bg)
Miloslav Trmac (cs)
Kostas Papadimas (el)
Adam Weinberger (en_CA)
Ivar Smolin (et)
Iñaki Larrañaga Murgoitio (eu)
Gabor Kelemen (hu)
Elian Myftiu (sq)
Maxim Dziumanenko (uk)
Canonical Ltd (xh)
------------------------------------------------------------------------------
gnome-control-center 2.10.0
background:
- fix the crashes with non-UTF8 names (Rodney Dawes)
general:
- do not warn vnc users that their XKB does not work. We already know.
(Jody Goldberg)
translators:
Vladimir Petkov (bg)
Jordi Mallach (ca)
Miloslav Trmac (cs)
Martin Willemoes Hansen (da)
Frank Arnold (de)
Kostas Papadimas (el)
Adam Weinberger (en_CA)
David Lodge (en_GB)
Francisco Javier F. Serrador (es)
Priit Laes (et)
Pauli Virtanen (fi)
Simon Manlay (fr)
Ankit Patel (gu)
Gabor Kelemen (hu)
Alessio Dessì (it)
Takeshi AIHANA (ja)
Changwoo Ryu (ko)
Žygimantas Beručka (lt)
Kjartan Maraas (nb)
Reinout van Schouwen (nl)
Kjartan Maraas (no)
Gnome PL Team (pl)
Raphael Higino (pt_BR)
Duarte Loreto (pt)
Dan Damian (ro)
Leonid Kanter (ru)
Marcel Telka (sk)
Elian Myftiu (sq)
Veljko M. Stanojevic (sr)
Christian Rose (sv)
Theppitak Karoonboonyanan (th)
Maxim Dziumanenko (uk)
Woodman Tuen (zh_TW)
------------------------------------------------------------------------------
gnome-control-center 2.9.91
general:
- check for xmodmap files, and offer to load them (#143487)
- changing the default value for "handleIndicators" to false (#161343)
(Sergey V. Udaltsov)
- check for screensaver functionality in libXext.so also when deciding
to build typing-break (#155461) (Leena Gunda)
- providing ability to suppress the "x sysconfig changed" warning message
(#150435) (Sergey V. Udaltsov).
- handle the modmap settings (#143487) (Shakti Sen)
- fix number of leaks (Kjartan Maraas)
background:
- use the boolean argument to specify if we want to update gconf or not.
Always get the colors for both primary and secondary and update the thumbnail
(#166486) (Rodney Dawes)
- force using the GTK backend (#154978) (Rodney Dawes)
common:
- leak fixes, use GtkIconTheme (#166267) (Kjartan Maraas)
network:
- adding/removing the host name instantly to/from gconf (#166233) (Shakti Sen)
theme-switcher:
- new install procedure (#102216) (David Sedeño)
- some string fixes (#166550) (David Lodge)
- remove a load of leaks and make sure newly installed themes show up in the
relevant lists without having to close/open the dialog again (#166267)
(Kjartan Maraas)
- fix an infinite loop that was bringing single-CPU systems to their
knees (#160803) (Elijah Newren).
Translators:
Vladimir Petkov (bg)
Miloslav Trmac (cs)
Frank Arnold (de)
Nikos Charonitakis (el)
Adam Weinberger (en_CA)
David Lodge (en_GB)
Francisco Javier F. Serrador (es)
Ivar Smolin (et)
Pauli Virtanen (fi)
Alessio Dessì (it)
Takeshi AIHANA (ja)
Changwoo Ryu (ko)
Žygimantas Beručka (lt)
Kjartan Maraas (nb)
rajeev shrestha (ne)
Åsmund Skjæveland (nn)
Kjartan Maraas (no)
Raphael Higino (pt_BR)
Duarte Loreto (pt)
Leonid Kanter (ru)
Elian Myftiu (sq)
Christian Rose (sv)
Theppitak Karoonboonyanan (th)
Baris Cicek (tr)
Funda Wang (zh_CN)
------------------------------------------------------------------------------
gnome-control-center 2.9.4
- fix the build out of the source dir (Closes: #158333).
- don't set "close" as the default button for the differents capplets
(Closes: #98202).
- use a temporary filename to not overwrite existant files in ~/.themes
(Closes: #97180).
- theme-thumbnailer doesn't require an absolute path (Closes: #153203).
- use ~/ instead of / as working directory for programs launched with the
multimedia keys (Closes: #162069).
- fixed the "locate pointer" feature (Closes: #149383).
- load the translated descriptions in the backgrounds capplet
(Closes: # 160700)
- add a preview in the backgrounds fileselector (Closes: #139714).
- add a proxy exclusion list configuration in the network capplet
(Closes: #147666).
- some bugs and leaks fixed.
Translators:
Vladimir Petkov (bg)
Miloslav Trmac (cs)
Kostas Papadimas (el)
Adam Weinberger (en_CA)
Francisco Javier F. Serrador (es)
Takeshi AIHANA (ja)
Žygimantas Beručka (lt)
Kjartan Maraas (nb)
rajeev shrestha (ne)
Kjartan Maraas (no)
Leonid Kanter (ru)
Elian Myftiu (sq)
Christian Rose (sv)
gnome-control-center 2.9.3
- Add a button to turn off a sound event (#14272).
- Allow to use themes with the ".tgz" extension (#148895).
- Don't nuke .Xdefaults when restarting g-s-d (#127050).
- Fix the themes installation with the non GNU versions of tar (#114553).
- Mask the "Text Editor" tab since the new mime system doesn't use this
setting.
- Updated the tooltips to respect the HIG.
- Updated to use libnautilus-extensions.
- Updated the menu entries for the new gnome-menus system.
gnome-control-center 2.8.1
- Some tweaking of the available default applications
- Background capplet fixes (#154003)
- keyboard patchs (#144490) (#153866)
- Patch leak in XKB code
- update translations
------------------------------------------------------------------------------
gnome-control-center 2.8.0
Jody Goldberg
* Fixed float/int mismatch in peditor
Jonathan Blandford
* Fix docs link for at-properties capplet.
Pierre Ossman
* display the volume dialog in the correct place
Sergey V. Udaltsov
* default switchcut (Alt*2) is introduced
Translations:
* All translations updated
------------------------------------------------------------------------------
gnome-control-center 2.7.1
Translations:
* Bosnian translation added.
Frederic Crozat:
* Use themed icon for windows
Rodney Dawes:
* Add "W x H pixels" to description, and remove file size for bg capplet
Sergey:
* Fixes to keybinding capplet
Kjartan Maraas:
* text cleanup
Jeroen Zwartepoorte:
* Use the parent type in the G_DEFINE_TYPE
------------------------------------------------------------------------------
gnome-control-center 2.7.0
* No NEWS file updates this time due to time pressures. 2.7.1
should have a full change.
------------------------------------------------------------------------------
gnome-control-center 2.6.1
Jody:
* Add the ximian shell to the tarball and polish it up a bit
Michael Terry:
* Fix ui-review comments for keybinding capplet
Sergey:
* Add a hook to libgswitchit to notify when xkb is reloaded
Shailesh Mittal:
http://bugzilla.gnome.org/show_bug.cgi?id=114832
* IPV6 support in the file types capplet
Sergey V. Udaltsov:
* Merged the keyboard preview branch. The keyboard capplet got another tab.
------------------------------------------------------------------------------
gnome-control-center 2.6.1
Alex Larsson:
https://bugzilla.redhat.com/bugzilla/show_bug.cgi?id=119494
* Fix reverting a size change.
Chris Lahey:
* Fix ordering of themes in theme manager
* Fix sizing of svg backgrounds
Glynn:
* Toplevel window icons should use the icon themes
Jody:
http://bugzilla.gnome.org/show_bug.cgi?id=139190
* Fix uniqueness test for binding special keys with no name
* Fix theme manager selection when not running metacity
http://bugzilla.gnome.org/show_bug.cgi?id=139605
* Mouse buttons are not valid modifiers for keybindings
* Force libxklavier 1.0.2 so that we can work with x.org and xfree86
* Match nautilus' interpretation of icons in desktop files
Padraig O'Briain:
http://bugzilla.gnome.org/show_bug.cgi?id=131538.
------------------------------------------------------------------------------
gnome-control-center 2.6.0.3
Jody:
http://bugzilla.gnome.org/show_bug.cgi?id=138701
* Fix typo
* Fix uniqueness test for keybindings
* Merge in some build fixes for sun's forte and Irix
------------------------------------------------------------------------------
gnome-control-center 2.5.4
Dennis Cranston :
http://bugzilla.gnome.org/show_bug.cgi?id=133715
* Improve layout of display capplet
Alexander Winston :
http://bugzilla.gnome.org/show_bug.cgi?id=133214
* quote the AC_DEFUN properly
Jody :
http://bugzilla.gnome.org/show_bug.cgi?id=124064
* Add a test for ngettext
* Delete some of the unused file cluttering the tree
http://bugzilla.gnome.org/show_bug.cgi?id=134446
* Trivial string consistency adjustment
http://bugzilla.gnome.org/show_bug.cgi?id=128164
* Handle sorted trees
* Fix incorrect string in gnome-settings-daemon
Muktha Narayan :
http://bugzilla.gnome.org/show_bug.cgi?id=124032
* Do not popup the logout dialog when the close button (X)
Jan Arne Petersen :
* Move a few capplets to the new file selector
Padraig O'Briain :
* Fix the ATK relations for the file-type capplet
Julio M. Merino Vidal :
* Make fontilus and themus respect the gconf install settings
Rodney Dawes:
http://bugzilla.gnome.org/show_bug.cgi?id=134171
* Fix transtions for titles of colour pickers.
Kaushal Kumar:
http://bugzilla.gnome.org/show_bug.cgi?id=109091
* Warn before deleting a type
Richard Hult:
* Improve Dr Wright.
msuarezalvarez@arnet.com.ar :
http://bugzilla.gnome.org/show_bug.cgi?id=134699
* Another typo in the new a11y settings daemon extensions
------------------------------------------------------------------------------
gnome-control-center 2.5.1
Jody:
http://bugzilla.gnome.org/show_bug.cgi?id=125899
http://bugzilla.gnome.org/show_bug.cgi?id=125970
* Fix the build and configure on older X servers.
* Use icon themes
Sergey:
* Merge gswitchit into gnome-settings-daemon and keyboard capplet
------------------------------------------------------------------------------
gnome-control-center 2.5.0
Jody:
* Add libxklavier and prep for inclusion of gswitchit's
xkb-properties-capplet
* http://bugzilla.gnome.org/show_bug.cgi?id=120842 [HIGification broke accessx]
* http://bugzilla.gnome.org/show_bug.cgi?id=106489 [protect against gconf failure]
* http://bugzilla.gnome.org/show_bug.cgi?id=124513 [Handle TruColor Displays]
* http://bugzilla.gnome.org/show_bug.cgi?id=116710 [smarter maximum dpi]
------------------------------------------------------------------------------
gnome-control-center 2.1.6
Jody:
* gnome-keyboard-properties.c (accessibility_button_clicked) : fix
minor typo that disables the error dialog in the event of failure.
Jonathan:
* gnome-theme-info.c : Rewrite. Now working
* gnome-theme-manager : Fix lots of bugs. Use the rewrite.
gnome-control-center 2.1.0.2
Jody:
http://bugzilla.gnome.org/show_bug.cgi?id=93211
* disable edit button when selecting mime catagory
* Tidy labels and accelerators in file-type edit dialogs
Michael:
http://bugzilla.gnome.org/show_bug.cgi?id=91535
* Don't start esd just to stop it
Iain Holmes:
* Add an image size label for background capplet.
------------------------------------------------------------------------------
gnome-control-center 2.1.0.1
Jody:
* Some minor ui tweaks for accessx.
* Some aix portabiltiy patches
* fix accelerators for ui-properties capplet.
------------------------------------------------------------------------------
gnome-control-center 2.0.1
Chema:
http://bugzilla.gnome.org/show_bug.cgi?id=86018
* Only assign the filename to the label if the file is valid.
GMan:
* Fix titles to use 'preferences' rather than 'properties'
Jody:
* Clean up the handling of custom applications in mime type capplet.
* Supply some decent defaults for new mime types.
* Implement Background capplet UI recommendations.
* Implement Font capplet UI recommendations.
* Reorganize the AccessX UI.
* Fix cmd line args for file-type capplet.
http://bugzilla.gnome.org/show_bug.cgi?id=84014
* Handle Drag-n-Drop of uris with escaped characters.
------------------------------------------------------------------------------
First split version of this package
./configure.ac 0000644 0000041 0000041 00000050023 13241553627 013541 0 ustar www-data www-data m4_define([unity_control_center_version], 14.04.3)
AC_INIT([unity-control-center], [unity_control_center_version])
AC_CONFIG_SRCDIR([shell])
AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIR([m4])
AM_INIT_AUTOMAKE([1.11 no-dist-gzip dist-xz tar-ustar check-news])
AM_MAINTAINER_MODE([enable])
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
# Check for programs
AC_PROG_CC
AM_PROG_CC_C_O
AC_HEADER_STDC
# Initialize libtool
LT_PREREQ([2.2])
LT_INIT
# .so version for libunity-control-center
LIBUNITYCONTROLCENTER_CURRENT=1
LIBUNITYCONTROLCENTER_REVISION=0
LIBUNITYCONTROLCENTER_AGE=0
AC_SUBST(LIBUNITYCONTROLCENTER_CURRENT)
AC_SUBST(LIBUNITYCONTROLCENTER_REVISION)
AC_SUBST(LIBUNITYCONTROLCENTER_AGE)
# Internationalization support
IT_PROG_INTLTOOL([0.40.1])
GETTEXT_PACKAGE=unity-control-center
AC_SUBST(GETTEXT_PACKAGE)
AC_DEFINE_UNQUOTED(GETTEXT_PACKAGE, "$GETTEXT_PACKAGE", [Gettext package])
GNOME_DEBUG_CHECK
GNOME_COMPILE_WARNINGS([maximum])
AC_PATH_XTRA
x_libs="$X_PRE_LIBS $X_LIBS -lX11 $X_EXTRA_LIBS"
AC_PATH_PROG([GLIB_MKENUMS],[glib-mkenums])
AC_ARG_ENABLE(documentation,
AC_HELP_STRING([--enable-documentation],
[build documentation]),,
enable_documentation=yes)
if test x$enable_documentation = xyes; then
AC_PATH_PROG([XSLTPROC], [xsltproc])
if test x$XSLTPROC = x; then
AC_MSG_ERROR([xsltproc is required to build documentation])
fi
fi
AM_CONDITIONAL(BUILD_DOCUMENTATION, test x$enable_documentation = xyes)
dnl Region panel
savecppflags=$CPPFLAGS
CPPFLAGS="$CPPFLAGS $X_CFLAGS"
AC_CHECK_HEADERS([X11/Xlib.h])
AC_CHECK_LIB(Xxf86misc, XF86MiscQueryExtension, [
AC_CHECK_HEADERS([X11/extensions/xf86misc.h], [XF86MISC_LIBS="-lXxf86misc"],[],
[#if HAVE_X11_XLIB_H
#include
#endif
])])
AC_SUBST(XF86MISC_LIBS)
AC_CHECK_HEADERS(X11/extensions/XKB.h)
CPPFLAGS=$savecppflags
AC_CHECK_LIB(m, floor)
# IBus support
IBUS_REQUIRED_VERSION=1.4.99
AC_ARG_ENABLE(ibus,
AS_HELP_STRING([--disable-ibus],
[Disable IBus support]),
enable_ibus=$enableval,
enable_ibus=yes)
if test "x$enable_ibus" = "xyes" ; then
IBUS_MODULE="ibus-1.0 >= $IBUS_REQUIRED_VERSION"
AC_DEFINE(HAVE_IBUS, 1, [Defined if IBus support is enabled])
else
IBUS_MODULE=
fi
# Fcitx support
AC_ARG_ENABLE(fcitx,
AS_HELP_STRING([--disable-fcitx],
[Disable Fcitx support]),
enable_fcitx=$enableval,
enable_fcitx=yes)
if test "x$enable_fcitx" = "xyes" ; then
FCITX_MODULE="fcitx-config fcitx-gclient"
AC_DEFINE(HAVE_FCITX, 1, [Defined if Fcitx support is enabled])
else
FCITX_MODULE=
fi
AM_CONDITIONAL(HAVE_FCITX, test "x$enable_fcitx" == "xyes")
dnl ==============================================
dnl Check that we meet the dependencies
dnl ==============================================
GLIB_REQUIRED_VERSION=2.31.2
GTK_REQUIRED_VERSION=3.10.0
PA_REQUIRED_VERSION=2.0
CANBERRA_REQUIRED_VERSION=0.13
GDKPIXBUF_REQUIRED_VERSION=2.23.0
POLKIT_REQUIRED_VERSION=0.103
NETWORK_MANAGER_REQUIRED_VERSION=0.8.992
LIBNOTIFY_REQUIRED_VERSION=0.7.3
GNOME_DESKTOP_REQUIRED_VERSION=3.27.3
SCHEMAS_REQUIRED_VERSION=3.15.4
LIBWACOM_REQUIRED_VERSION=0.7
CLUTTER_REQUIRED_VERSION=1.11.3
GOA_REQUIRED_VERSION=3.18.0
ACCOUNTSSERVICE_REQUIRED_VERSION=0.6.30
COMMON_MODULES="gtk+-3.0 >= $GTK_REQUIRED_VERSION
glib-2.0 >= $GLIB_REQUIRED_VERSION
gthread-2.0
gio-2.0
gio-unix-2.0
gsettings-desktop-schemas >= $SCHEMAS_REQUIRED_VERSION
libnotify >= $LIBNOTIFY_REQUIRED_VERSION"
PKG_CHECK_MODULES(LIBUNITY_CONTROL_CENTER, $COMMON_MODULES)
PKG_CHECK_MODULES(LIBLANGUAGE, $COMMON_MODULES gnome-desktop-3.0 fontconfig)
PKG_CHECK_MODULES(LIBSHORTCUTS, $COMMON_MODULES x11)
PKG_CHECK_MODULES(SHELL, $COMMON_MODULES libgnome-menu-3.0 gio-unix-2.0 x11)
PKG_CHECK_MODULES(APPEARANCE_PANEL, $COMMON_MODULES libxml-2.0 gnome-desktop-3.0
gdk-pixbuf-2.0 >= $GDKPIXBUF_REQUIRED_VERSION)
PKG_CHECK_MODULES(DATETIME_PANEL, $COMMON_MODULES timezonemap geonames
polkit-gobject-1 >= $POLKIT_REQUIRED_VERSION)
PKG_CHECK_MODULES(DISPLAY_PANEL, $COMMON_MODULES libunity-settings-daemon x11)
PKG_CHECK_MODULES(INFO_PANEL, $COMMON_MODULES libgtop-2.0 gl x11
polkit-gobject-1 >= $POLKIT_REQUIRED_VERSION webkit2gtk-4.0)
PKG_CHECK_MODULES(KEYBOARD_PANEL, $COMMON_MODULES
gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED_VERSION
x11)
PKG_CHECK_MODULES(MEDIA_PANEL, $COMMON_MODULES)
PKG_CHECK_MODULES(MOUSE_PANEL, $COMMON_MODULES xi >= 1.2
unity-settings-daemon x11)
PKG_CHECK_MODULES(NETWORK_PANEL, $COMMON_MODULES)
PKG_CHECK_MODULES(POWER_PANEL, $COMMON_MODULES upower-glib >= 0.9.1
unity-settings-daemon)
PKG_CHECK_MODULES(COLOR_PANEL, $COMMON_MODULES colord >= 0.1.8)
PKG_CHECK_MODULES(PRINTERS_PANEL, $COMMON_MODULES
polkit-gobject-1 >= $POLKIT_REQUIRED_VERSION)
PKG_CHECK_MODULES(REGION_PANEL, $COMMON_MODULES
polkit-gobject-1 >= $POLKIT_REQUIRED_VERSION
gnome-desktop-3.0 >= $GNOME_DESKTOP_REQUIRED_VERSION
$IBUS_MODULE
$FCITX_MODULE
x11)
PKG_CHECK_MODULES(SCREEN_PANEL, $COMMON_MODULES)
PKG_CHECK_MODULES(SCREEN_SHARING_PANEL, $COMMON_MODULES)
PKG_CHECK_MODULES(SOUND_PANEL, $COMMON_MODULES libxml-2.0
libcanberra-gtk3 >= $CANBERRA_REQUIRED_VERSION
libpulse >= $PA_REQUIRED_VERSION
libpulse-mainloop-glib >= $PA_REQUIRED_VERSION)
PKG_CHECK_MODULES(UNIVERSAL_ACCESS_PANEL, $COMMON_MODULES)
PKG_CHECK_MODULES(USER_ACCOUNTS_PANEL, $COMMON_MODULES
polkit-gobject-1 >= $POLKIT_REQUIRED_VERSION
gnome-desktop-3.0
gdk-pixbuf-2.0 >= $GDKPIXBUF_REQUIRED_VERSION
pwquality
accountsservice >= $ACCOUNTSSERVICE_REQUIRED_VERSION)
PKG_CHECK_MODULES(BLUETOOTH_PANEL, $COMMON_MODULES)
AM_PROG_VALAC([0.20.0])
GDESKTOP_PREFIX=`$PKG_CONFIG --variable prefix gsettings-desktop-schemas`
AC_SUBST(GDESKTOP_PREFIX)
# Check for NetworkManager ~0.9
PKG_CHECK_MODULES(NETWORK_MANAGER, NetworkManager >= $NETWORK_MANAGER_REQUIRED_VERSION
libnm-glib >= $NETWORK_MANAGER_REQUIRED_VERSION
libnm-util >= $NETWORK_MANAGER_REQUIRED_VERSION
libnm-gtk >= $NETWORK_MANAGER_REQUIRED_VERSION,
[have_networkmanager=yes], have_networkmanager=no)
if test "x$have_networkmanager" = xno ; then
AC_MSG_WARN(*** Network panel will not be built (NetworkManager ~0.9 or newer not found) ***)
fi
AM_CONDITIONAL(BUILD_NETWORK, [test x$have_networkmanager = xyes])
# Check for CUPS 1.4 or newer
AC_ARG_ENABLE([cups],
AS_HELP_STRING([--disable-cups], [disable CUPS support (default: enabled)]),,
[enable_cups=yes])
if test x"$enable_cups" != x"no" ; then
AC_PROG_SED
AC_PATH_PROG(CUPS_CONFIG, cups-config)
if test x$CUPS_CONFIG = x; then
AC_MSG_ERROR([cups-config not found but CUPS support requested])
fi
CUPS_API_VERSION=`$CUPS_CONFIG --api-version`
CUPS_API_MAJOR=`echo $ECHO_N $CUPS_API_VERSION | cut -d . -f 1`
CUPS_API_MINOR=`echo $ECHO_N $CUPS_API_VERSION | cut -d . -f 2`
AC_CHECK_HEADERS([cups/cups.h cups/http.h cups/ipp.h cups/ppd.h],,
AC_MSG_ERROR([CUPS headers not found but CUPS support requested]))
if ! test $CUPS_API_MAJOR -gt 1 -o \
$CUPS_API_MAJOR -eq 1 -a $CUPS_API_MINOR -ge 4 ; then
AC_MSG_ERROR([CUPS 1.4 or newer not found, but CUPS support requested])
fi
CUPS_CFLAGS=`$CUPS_CONFIG --cflags | $SED -e 's/-O\w*//g' -e 's/-m\w*//g'`
CUPS_LIBS=`$CUPS_CONFIG --libs`
AC_SUBST(CUPS_CFLAGS)
AC_SUBST(CUPS_LIBS)
fi
AM_CONDITIONAL(BUILD_PRINTERS, [test x"$enable_cups" = x"yes"])
# Optional dependency for the user accounts panel
AC_ARG_WITH([cheese],
AS_HELP_STRING([--with-cheese], [enable cheese webcam support]),,
with_cheese=auto)
if test x"$with_cheese" != x"no" ; then
PKG_CHECK_MODULES(CHEESE, cheese-gtk >= 3.5.91 cheese clutter-gtk-1.0, [have_cheese=yes], [have_cheese=no])
if test x${have_cheese} = xyes; then
AC_DEFINE(HAVE_CHEESE, 1, [Define to 1 to enable cheese webcam support])
fi
if test x${with_cheese} = xyes && test x${have_cheese} = xno; then
AC_MSG_ERROR([Cheese configured but not found])
fi
else
have_cheese=no
fi
AM_CONDITIONAL(BUILD_CHEESE, test x${have_cheese} = xyes)
# wacom is disabled for s390/s390x and non Linux platforms (needs udev)
case $host_os in
linux*)
if test "$host_cpu" = s390 -o "$host_cpu" = s390x; then
have_wacom=no
else
PKG_CHECK_MODULES(WACOM_PANEL, $COMMON_MODULES
unity-settings-daemon
xi >= 1.2 x11 libwacom >= $LIBWACOM_REQUIRED_VERSION
libunity-settings-daemon)
AC_DEFINE(BUILD_WACOM, 1, [Define to 1 to build the Wacom panel])
have_wacom=yes
fi
;;
*)
have_wacom=no
;;
esac
AM_CONDITIONAL(BUILD_WACOM, [test x"$have_wacom" = x"yes"])
# Online accounts
AC_ARG_ENABLE(onlineaccounts, AC_HELP_STRING([--disable-onlineaccounts], [disable online-accounts panel]),
[case "${enableval}" in
yes) enable_onlineaccounts=yes ;;
no) enable_onlineaccounts=no ;;
*) AC_MSG_ERROR(bad value ${enableval} for --disable-onlineaccounts) ;;
esac],
[enable_onlineaccounts=yes]) dnl Enabled by default
if test "x$enable_onlineaccounts" = xyes; then
PKG_CHECK_MODULES(ONLINE_ACCOUNTS_PANEL, $COMMON_MODULES goa-1.0
goa-backend-1.0 >= $GOA_REQUIRED_VERSION,
[have_onlineaccounts=yes], have_onlineaccounts=no)
if test "x$have_onlineaccounts" = xno ; then
AC_MSG_ERROR(*** Gnome Online Accounts not found ***)
fi
AC_DEFINE(BUILD_ONLINE_ACCOUNTS, 1, [Define to 1 to build the online-accounts panel])
if test x${have_onlineaccounts} = xyes; then
AC_DEFINE(HAVE_ONLINE_ACCOUNTS, 1, [Define to 1 if Gnome Online Accounts is available])
fi
fi
AM_CONDITIONAL(BUILD_ONLINE_ACCOUNTS, [test x$have_onlineaccounts = xyes])
AC_SUBST(ONLINE_ACCOUNTS_CFLAGS)
AC_SUBST(ONLINE_ACCOUNTS_LIBS)
# This is a hard-dependency for the region and user-accounts panels
PKG_CHECK_MODULES(ISOCODES, iso-codes)
AC_DEFINE_UNQUOTED([ISO_CODES_PREFIX],["`$PKG_CONFIG --variable=prefix iso-codes`"],[ISO codes prefix])
ISO_CODES=iso-codes
# Kerberos kerberos support
AC_PATH_PROG(KRB5_CONFIG, krb5-config, no)
if test "$KRB5_CONFIG" = "no"; then
AC_MSG_ERROR([krb5-config executable not found in your path - should be installed with the kerberos libraries])
fi
AC_MSG_CHECKING(for krb5 libraries and flags)
KRB5_CFLAGS="`$KRB5_CONFIG --cflags`"
KRB5_LIBS="`$KRB5_CONFIG --libs`"
AC_MSG_RESULT($KRB5_CFLAGS $KRB5_LIBS)
AC_SUBST(KRB5_CFLAGS)
AC_SUBST(KRB5_LIBS)
USER_ACCOUNTS_PANEL_CFLAGS="$USER_ACCOUNTS_PANEL_CFLAGS $KRB5_CFLAGS"
USER_ACCOUNTS_PANEL_LIBS="$USER_ACCOUNTS_PANEL_LIBS $KRB5_LIBS"
dnl ==============================================
dnl End: Check that we meet the dependencies
dnl ==============================================
AC_PATH_PROG(GLIB_GENMARSHAL, glib-genmarshal, no)
if test x"$GLIB_GENMARSHAL" = xno; then
AC_MSG_ERROR([glib-genmarshal executable not found in your path - should be installed with glib])
fi
AC_SUBST(GLIB_GENMARSHAL)
dnl =======================================
dnl Panels
dnl =======================================
PANELS_DIR="${libdir}/unity-control-center-1/panels"
AC_SUBST(PANELS_DIR)
PANEL_CFLAGS="-I\$(top_srcdir)/ -DG_LOG_DOMAIN=\"\\\"\$(cappletname)-cc-panel\\\"\""
AC_SUBST(PANEL_CFLAGS)
PANEL_LIBS="\$(top_builddir)/shell/libunity-control-center.la"
AC_SUBST(PANEL_LIBS)
PANEL_LDFLAGS="-export_dynamic -avoid-version -module -no-undefined -export-symbols-regex '^g_io_module_(load|unload)'"
AC_SUBST(PANEL_LDFLAGS)
dnl ==============================================
dnl libsocialweb
dnl ==============================================
AC_MSG_CHECKING([Enable libsocialweb support])
AC_ARG_WITH([libsocialweb],
AS_HELP_STRING([--with-libsocialweb],
[enable libsocialweb support]),,
[with_libsocialweb=no])
AC_MSG_RESULT([$with_libsocialweb])
if test "x$with_libsocialweb" == "xyes"; then
PKG_CHECK_MODULES(SOCIALWEB, libsocialweb-client)
AC_DEFINE(HAVE_LIBSOCIALWEB, 1, [Defined if libsocialweb is available])
fi
AM_CONDITIONAL(WITH_LIBSOCIALWEB, test "x$with_libsocialweb" = "xyes")
dnl =======================================
dnl Update Mime Database
dnl =======================================
AC_PATH_PROG(UPDATE_MIME_DATABASE, update-mime-database, no)
AC_ARG_ENABLE(update-mimedb,
AS_HELP_STRING([--disable-update-mimedb],
[do not update mime database after installation]),,
enable_update_mimedb=yes)
AM_CONDITIONAL(ENABLE_UPDATE_MIMEDB, test x$enable_update_mimedb = xyes)
CONTROL_CENTER_VERSION=unity_control_center_version
AC_SUBST(CONTROL_CENTER_VERSION)
dnl =======================================
dnl Finish
dnl =======================================
# Turn on the additional warnings last
AC_ARG_ENABLE(more-warnings,
AS_HELP_STRING([--enable-more-warnings],
[Maximum compiler warnings]),
set_more_warnings="$enableval",[
if test -d $srcdir/.git; then
set_more_warnings=yes
else
set_more_warnings=no
fi])
AC_MSG_CHECKING(for more warnings)
if test "$GCC" = "yes" -a "$set_more_warnings" != "no"; then
AC_MSG_RESULT(yes)
CFLAGS="\
-Wall -Wclobbered -Wempty-body -Wignored-qualifiers \
-Wmissing-field-initializers -Wmissing-parameter-type \
-Wold-style-declaration -Woverride-init -Wtype-limits \
-Wuninitialized \
-Wchar-subscripts -Wmissing-declarations -Wmissing-prototypes \
-Wnested-externs -Wpointer-arith \
-Wcast-align -Wsign-compare \
$CFLAGS"
# Only add this when optimizing is enabled (default)
AC_MSG_CHECKING([whether optimization is enabled])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#if __OPTIMIZE__ == 0
#error No optimization
#endif
]], [[]])],
[has_optimization=yes],
[has_optimization=no])
if test $has_optimization = yes; then
CFLAGS="$CFLAGS -Wp,-D_FORTIFY_SOURCE=2"
fi
AC_MSG_RESULT($has_optimization)
for option in -Wno-strict-aliasing -Wno-sign-compare; do
SAVE_CFLAGS="$CFLAGS"
CFLAGS="$CFLAGS $option"
AC_MSG_CHECKING([whether gcc understands $option])
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[]])],
[has_option=yes],
[has_option=no])
if test $has_option = no; then
CFLAGS="$SAVE_CFLAGS"
fi
AC_MSG_RESULT($has_option)
unset has_option
unset SAVE_CFLAGS
done
unset option
else
AC_MSG_RESULT(no)
fi
AC_OUTPUT([
Makefile
shell/libunity-control-center.pc
panels/Makefile
panels/common/Makefile
panels/appearance/Makefile
panels/appearance/unity-appearance-panel.desktop.in
panels/bluetooth/Makefile
panels/bluetooth/gnome-bluetooth/Makefile
panels/bluetooth/gnome-bluetooth/lib/Makefile
panels/bluetooth/gnome-bluetooth/wizard/Makefile
panels/bluetooth/unity-bluetooth-panel.desktop.in
panels/datetime/Makefile
panels/datetime/unity-datetime-panel.desktop.in
panels/display/Makefile
panels/display/unity-display-panel.desktop.in
panels/keyboard/Makefile
panels/keyboard/unity-keyboard-panel.desktop.in
panels/keyboard/unity-keybindings.pc
panels/region/Makefile
panels/region/unity-region-panel.desktop.in
panels/mouse/Makefile
panels/mouse/unity-mouse-panel.desktop.in
panels/sound/Makefile
panels/sound/data/Makefile
panels/sound/data/unity-sound-panel.desktop.in
panels/sound/data/symbolic-icons/Makefile
panels/sound/data/symbolic-icons/scalable/Makefile
panels/sound/data/symbolic-icons/scalable/status/Makefile
panels/sound/data/icons/Makefile
panels/sound/data/icons/16x16/Makefile
panels/sound/data/icons/16x16/apps/Makefile
panels/sound/data/icons/16x16/devices/Makefile
panels/sound/data/icons/16x16/status/Makefile
panels/sound/data/icons/22x22/Makefile
panels/sound/data/icons/22x22/apps/Makefile
panels/sound/data/icons/22x22/status/Makefile
panels/sound/data/icons/24x24/Makefile
panels/sound/data/icons/24x24/apps/Makefile
panels/sound/data/icons/24x24/devices/Makefile
panels/sound/data/icons/24x24/status/Makefile
panels/sound/data/icons/32x32/Makefile
panels/sound/data/icons/32x32/apps/Makefile
panels/sound/data/icons/32x32/devices/Makefile
panels/sound/data/icons/32x32/status/Makefile
panels/sound/data/icons/48x48/Makefile
panels/sound/data/icons/48x48/apps/Makefile
panels/sound/data/icons/48x48/devices/Makefile
panels/sound/data/icons/256x256/Makefile
panels/sound/data/icons/256x256/apps/Makefile
panels/sound/data/icons/scalable/Makefile
panels/sound/data/icons/scalable/devices/Makefile
panels/screen/Makefile
panels/screen/unity-screen-panel.desktop.in
panels/screen-sharing/Makefile
panels/screen-sharing/unity-screen-sharing-panel.desktop.in
panels/info/Makefile
panels/info/unity-info-panel.desktop.in
panels/power/Makefile
panels/power/unity-power-panel.desktop.in
panels/power/icons/Makefile
panels/power/icons/24x24/Makefile
panels/power/icons/48x48/Makefile
panels/color/Makefile
panels/color/unity-color-panel.desktop.in
panels/color/icons/Makefile
panels/color/icons/16x16/Makefile
panels/color/icons/22x22/Makefile
panels/color/icons/24x24/Makefile
panels/color/icons/32x32/Makefile
panels/color/icons/48x48/Makefile
panels/color/icons/64x64/Makefile
panels/color/icons/256x256/Makefile
panels/color/icons/scalable/Makefile
panels/printers/Makefile
panels/printers/unity-printers-panel.desktop.in
panels/network/Makefile
panels/network/unity-network-panel.desktop.in
panels/universal-access/Makefile
panels/universal-access/unity-universal-access-panel.desktop.in
panels/user-accounts/Makefile
panels/user-accounts/data/Makefile
panels/user-accounts/data/unity-user-accounts-panel.desktop.in
panels/user-accounts/data/faces/Makefile
panels/wacom/Makefile
panels/wacom/calibrator/Makefile
panels/wacom/unity-wacom-panel.desktop.in
panels/online-accounts/Makefile
panels/online-accounts/unity-online-accounts-panel.desktop.in
panels/online-accounts/icons/Makefile
panels/online-accounts/icons/16x16/Makefile
panels/online-accounts/icons/22x22/Makefile
panels/online-accounts/icons/24x24/Makefile
panels/online-accounts/icons/32x32/Makefile
panels/online-accounts/icons/48x48/Makefile
panels/online-accounts/icons/256x256/Makefile
po/Makefile.in
shell/appdata/Makefile
shell/Makefile
shell/unity-control-center.desktop.in
man/Makefile
])
AC_MSG_NOTICE([unity-control-center was configured with the following options:])
if test "x$have_networkmanager" = "xyes"; then
AC_MSG_NOTICE([** NetworkManager (Network panel)])
else
AC_MSG_NOTICE([ Network panel disabled])
fi
if test "x$enable_cups" = "xyes"; then
AC_MSG_NOTICE([** CUPS (Printers panel)])
else
AC_MSG_NOTICE([ Printers panel disabled])
fi
if test "x$have_cheese" = "xyes"; then
AC_MSG_NOTICE([** Cheese (Users panel webcam support)])
else
AC_MSG_NOTICE([ Users panel webcam support disabled])
fi
if test "x$with_libsocialweb" = "xyes"; then
AC_MSG_NOTICE([** libsocialweb (Appearance panel Flickr support)])
else
AC_MSG_NOTICE([ Appearance panel Flickr support disabled])
fi
if test "x$have_wacom" = "xyes"; then
AC_MSG_NOTICE([** wacom (Wacom tablet panel)])
else
AC_MSG_NOTICE([ Wacom panel disabled])
fi
if test "x$enable_ibus" == "xyes"; then
AC_MSG_NOTICE([** IBus (Region panel IBus support)])
else
AC_MSG_NOTICE([ Region panel IBus support disabled])
fi
if test "x$enable_fcitx" == "xyes"; then
AC_MSG_NOTICE([** Fcitx (Region panel Fcitx support)])
else
AC_MSG_NOTICE([ Region panel Fcitx support disabled])
fi
if test "x$have_onlineaccounts" = "xyes"; then
AC_MSG_NOTICE([** Online-Accounts support (Online-Accounts panel)])
else
AC_MSG_NOTICE([ Online-Accounts support disabled])
fi
AC_MSG_NOTICE([End options])
./README 0000644 0000041 0000041 00000003111 13241553602 012120 0 ustar www-data www-data GNOME Control Center
====================
About -
The control center is GNOME's main interface for configuration of various
aspects of your desktop.
Installation -
See the file 'INSTALL'
How to report bugs -
Bugs should be reported to the GNOME bug tracking system under the product
control-center. It is available at http://bugzilla.gnome.org.
In the report please include the following information -
Operating system and version
For Linux, version of the C library
How to reproduce the bug if possible
If the bug was a crash, include the exact text that was printed out
A stacktrace where possible [see below]
How to get a stack trace -
If the crash is reproducible, it is possible to get a stack trace and
attach it to the bug report. The following steps are used to obtain a
stack trace -
Run the program in gdb [the GNU debugger] or any other debugger
ie. gdb gnome-keyboard-properties
Start the program
ie. (gdb) run
Reproduce the crash and the program will exit to the gdb prompt
Get the back trace
ie. (gdb) bt full
Once you have the backtrace, copy and paste this either into the
'Comments' field or attach a file with it included.
Patches -
Patches should be submitted to bugzilla.gnome.org or emailed to the
gnomecc-list@gnome.org list. If using bugzilla, attach
the patch to a new bug report [or preferably, check to see if there is
already a bug report that corresponds to your patch]. Bug reports
containing patches should include the 'PATCH' keyword.
Patches should be created using the unified diff form.
ie. svn diff file-to-be-patched.c > patch.diff
./COPYING 0000644 0000041 0000041 00000043255 13241553602 012310 0 ustar www-data www-data GNU GENERAL PUBLIC LICENSE
Version 2, June 1991
Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The licenses for most software are designed to take away your
freedom to share and change it. By contrast, the GNU General Public
License is intended to guarantee your freedom to share and change free
software--to make sure the software is free for all its users. This
General Public License applies to most of the Free Software
Foundation's software and to any other program whose authors commit to
using it. (Some other Free Software Foundation software is covered by
the GNU Lesser General Public License instead.) You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
this service if you wish), that you receive source code or can get it
if you want it, that you can change the software or use pieces of it
in new free programs; and that you know you can do these things.
To protect your rights, we need to make restrictions that forbid
anyone to deny you these rights or to ask you to surrender the rights.
These restrictions translate to certain responsibilities for you if you
distribute copies of the software, or if you modify it.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must give the recipients all the rights that
you have. You must make sure that they, too, receive or can get the
source code. And you must show them these terms so they know their
rights.
We protect your rights with two steps: (1) copyright the software, and
(2) offer you this license which gives you legal permission to copy,
distribute and/or modify the software.
Also, for each author's protection and ours, we want to make certain
that everyone understands that there is no warranty for this free
software. If the software is modified by someone else and passed on, we
want its recipients to know that what they have is not the original, so
that any problems introduced by others will not reflect on the original
authors' reputations.
Finally, any free program is threatened constantly by software
patents. We wish to avoid the danger that redistributors of a free
program will individually obtain patent licenses, in effect making the
program proprietary. To prevent this, we have made it clear that any
patent must be licensed for everyone's free use or not licensed at all.
The precise terms and conditions for copying, distribution and
modification follow.
GNU GENERAL PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
0. This License applies to any program or other work which contains
a notice placed by the copyright holder saying it may be distributed
under the terms of this General Public License. The "Program", below,
refers to any such program or work, and a "work based on the Program"
means either the Program or any derivative work under copyright law:
that is to say, a work containing the Program or a portion of it,
either verbatim or with modifications and/or translated into another
language. (Hereinafter, translation is included without limitation in
the term "modification".) Each licensee is addressed as "you".
Activities other than copying, distribution and modification are not
covered by this License; they are outside its scope. The act of
running the Program is not restricted, and the output from the Program
is covered only if its contents constitute a work based on the
Program (independent of having been made by running the Program).
Whether that is true depends on what the Program does.
1. You may copy and distribute verbatim copies of the Program's
source code as you receive it, in any medium, provided that you
conspicuously and appropriately publish on each copy an appropriate
copyright notice and disclaimer of warranty; keep intact all the
notices that refer to this License and to the absence of any warranty;
and give any other recipients of the Program a copy of this License
along with the Program.
You may charge a fee for the physical act of transferring a copy, and
you may at your option offer warranty protection in exchange for a fee.
2. You may modify your copy or copies of the Program or any portion
of it, thus forming a work based on the Program, and copy and
distribute such modifications or work under the terms of Section 1
above, provided that you also meet all of these conditions:
a) You must cause the modified files to carry prominent notices
stating that you changed the files and the date of any change.
b) You must cause any work that you distribute or publish, that in
whole or in part contains or is derived from the Program or any
part thereof, to be licensed as a whole at no charge to all third
parties under the terms of this License.
c) If the modified program normally reads commands interactively
when run, you must cause it, when started running for such
interactive use in the most ordinary way, to print or display an
announcement including an appropriate copyright notice and a
notice that there is no warranty (or else, saying that you provide
a warranty) and that users may redistribute the program under
these conditions, and telling the user how to view a copy of this
License. (Exception: if the Program itself is interactive but
does not normally print such an announcement, your work based on
the Program is not required to print an announcement.)
These requirements apply to the modified work as a whole. If
identifiable sections of that work are not derived from the Program,
and can be reasonably considered independent and separate works in
themselves, then this License, and its terms, do not apply to those
sections when you distribute them as separate works. But when you
distribute the same sections as part of a whole which is a work based
on the Program, the distribution of the whole must be on the terms of
this License, whose permissions for other licensees extend to the
entire whole, and thus to each and every part regardless of who wrote it.
Thus, it is not the intent of this section to claim rights or contest
your rights to work written entirely by you; rather, the intent is to
exercise the right to control the distribution of derivative or
collective works based on the Program.
In addition, mere aggregation of another work not based on the Program
with the Program (or with a work based on the Program) on a volume of
a storage or distribution medium does not bring the other work under
the scope of this License.
3. You may copy and distribute the Program (or a work based on it,
under Section 2) in object code or executable form under the terms of
Sections 1 and 2 above provided that you also do one of the following:
a) Accompany it with the complete corresponding machine-readable
source code, which must be distributed under the terms of Sections
1 and 2 above on a medium customarily used for software interchange; or,
b) Accompany it with a written offer, valid for at least three
years, to give any third party, for a charge no more than your
cost of physically performing source distribution, a complete
machine-readable copy of the corresponding source code, to be
distributed under the terms of Sections 1 and 2 above on a medium
customarily used for software interchange; or,
c) Accompany it with the information you received as to the offer
to distribute corresponding source code. (This alternative is
allowed only for noncommercial distribution and only if you
received the program in object code or executable form with such
an offer, in accord with Subsection b above.)
The source code for a work means the preferred form of the work for
making modifications to it. For an executable work, complete source
code means all the source code for all modules it contains, plus any
associated interface definition files, plus the scripts used to
control compilation and installation of the executable. However, as a
special exception, the source code distributed need not include
anything that is normally distributed (in either source or binary
form) with the major components (compiler, kernel, and so on) of the
operating system on which the executable runs, unless that component
itself accompanies the executable.
If distribution of executable or object code is made by offering
access to copy from a designated place, then offering equivalent
access to copy the source code from the same place counts as
distribution of the source code, even though third parties are not
compelled to copy the source along with the object code.
4. You may not copy, modify, sublicense, or distribute the Program
except as expressly provided under this License. Any attempt
otherwise to copy, modify, sublicense or distribute the Program is
void, and will automatically terminate your rights under this License.
However, parties who have received copies, or rights, from you under
this License will not have their licenses terminated so long as such
parties remain in full compliance.
5. You are not required to accept this License, since you have not
signed it. However, nothing else grants you permission to modify or
distribute the Program or its derivative works. These actions are
prohibited by law if you do not accept this License. Therefore, by
modifying or distributing the Program (or any work based on the
Program), you indicate your acceptance of this License to do so, and
all its terms and conditions for copying, distributing or modifying
the Program or works based on it.
6. Each time you redistribute the Program (or any work based on the
Program), the recipient automatically receives a license from the
original licensor to copy, distribute or modify the Program subject to
these terms and conditions. You may not impose any further
restrictions on the recipients' exercise of the rights granted herein.
You are not responsible for enforcing compliance by third parties to
this License.
7. If, as a consequence of a court judgment or allegation of patent
infringement or for any other reason (not limited to patent issues),
conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot
distribute so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you
may not distribute the Program at all. For example, if a patent
license would not permit royalty-free redistribution of the Program by
all those who receive copies directly or indirectly through you, then
the only way you could satisfy both it and this License would be to
refrain entirely from distribution of the Program.
If any portion of this section is held invalid or unenforceable under
any particular circumstance, the balance of the section is intended to
apply and the section as a whole is intended to apply in other
circumstances.
It is not the purpose of this section to induce you to infringe any
patents or other property right claims or to contest validity of any
such claims; this section has the sole purpose of protecting the
integrity of the free software distribution system, which is
implemented by public license practices. Many people have made
generous contributions to the wide range of software distributed
through that system in reliance on consistent application of that
system; it is up to the author/donor to decide if he or she is willing
to distribute software through any other system and a licensee cannot
impose that choice.
This section is intended to make thoroughly clear what is believed to
be a consequence of the rest of this License.
8. If the distribution and/or use of the Program is restricted in
certain countries either by patents or by copyrighted interfaces, the
original copyright holder who places the Program under this License
may add an explicit geographical distribution limitation excluding
those countries, so that distribution is permitted only in or among
countries not thus excluded. In such case, this License incorporates
the limitation as if written in the body of this License.
9. The Free Software Foundation may publish revised and/or new versions
of the General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the Program
specifies a version number of this License which applies to it and "any
later version", you have the option of following the terms and conditions
either of that version or of any later version published by the Free
Software Foundation. If the Program does not specify a version number of
this License, you may choose any version ever published by the Free Software
Foundation.
10. If you wish to incorporate parts of the Program into other free
programs whose distribution conditions are different, write to the author
to ask for permission. For software which is copyrighted by the Free
Software Foundation, write to the Free Software Foundation; we sometimes
make exceptions for this. Our decision will be guided by the two goals
of preserving the free status of all derivatives of our free software and
of promoting the sharing and reuse of software generally.
NO WARRANTY
11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS
TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE
PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
REPAIR OR CORRECTION.
12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
POSSIBILITY OF SUCH DAMAGES.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
convey the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
Copyright (C)
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.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
Also add information on how to contact you by electronic and paper mail.
If the program is interactive, make it output a short notice like this
when it starts in an interactive mode:
Gnomovision version 69, Copyright (C) year name of author
Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, the commands you use may
be called something other than `show w' and `show c'; they could even be
mouse-clicks or menu items--whatever suits your program.
You should also get your employer (if you work as a programmer) or your
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. Here is a sample; alter the names:
Yoyodyne, Inc., hereby disclaims all copyright interest in the program
`Gnomovision' (which makes passes at compilers) written by James Hacker.
, 1 April 1989
Ty Coon, President of Vice
This General Public License does not permit incorporating your program into
proprietary programs. If your program is a subroutine library, you may
consider it more useful to permit linking proprietary applications with the
library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License.
./update-from-gsd.sh 0000755 0000041 0000041 00000000621 13241553602 014600 0 ustar www-data www-data #!/bin/sh
function die() {
echo $*
exit 1
}
if test -z "$DIR"; then
echo "Must set DIR"
exit 1
fi
if test -z "$FILES"; then
echo "Must set FILES"
exit 1
fi
for FILE in $FILES; do
if cmp -s $DIR/$FILE $FILE; then
echo "File $FILE is unchanged"
else
cp $DIR/$FILE $FILE || die "Could not move $DIR/$FILE to $FILE"
echo "Updated $FILE"
git add $FILE
fi
done
./autogen.sh 0000755 0000041 0000041 00000001131 13241553602 013241 0 ustar www-data www-data #!/bin/sh
# Run this to generate all the initial makefiles, etc.
srcdir=`dirname $0`
test -z "$srcdir" && srcdir=.
PKG_NAME="control-center"
(test -f $srcdir/configure.ac \
&& test -f $srcdir/autogen.sh \
&& test -d $srcdir/shell) || {
echo -n "**Error**: Directory "\`$srcdir\'" does not look like the"
echo " top-level $PKG_NAME directory"
exit 1
}
DIE=0
rm -f .using-gnome-libs-package
if ! which gnome-autogen.sh ; then
echo "You need to install the gnome-common module and make"
echo "sure the gnome-autogen.sh script is in your \$PATH."
exit 1
fi
. gnome-autogen.sh
./ChangeLog 0000644 0000041 0000041 00000000166 13241553602 013021 0 ustar www-data www-data The ChangeLog is auto-generated when releasing. If you are seeing this, use
'git log' for a detailed list of changes.
./panels/ 0000755 0000041 0000041 00000000000 13241553627 012535 5 ustar www-data www-data ./panels/display/ 0000755 0000041 0000041 00000000000 13241553602 014173 5 ustar www-data www-data ./panels/display/scrollarea.c 0000644 0000041 0000041 00000130273 13241553602 016474 0 ustar www-data www-data /* Copyright 2006, 2007, 2008, Soren Sandmann
*
* 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 "scrollarea.h"
#include
#include "foo-marshal.h"
G_DEFINE_TYPE_WITH_CODE (FooScrollArea, foo_scroll_area, GTK_TYPE_CONTAINER,
G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE, NULL));
static GtkWidgetClass *parent_class;
typedef struct BackingStore BackingStore;
typedef struct InputPath InputPath;
typedef struct InputRegion InputRegion;
typedef struct AutoScrollInfo AutoScrollInfo;
struct InputPath
{
gboolean is_stroke;
cairo_fill_rule_t fill_rule;
double line_width;
cairo_path_t *path; /* In canvas coordinates */
FooScrollAreaEventFunc func;
gpointer data;
InputPath *next;
};
/* InputRegions are mutually disjoint */
struct InputRegion
{
/* the boundary of this area in canvas coordinates */
cairo_region_t *region;
InputPath *paths;
};
struct AutoScrollInfo
{
int dx;
int dy;
int timeout_id;
int begin_x;
int begin_y;
double res_x;
double res_y;
GTimer *timer;
};
struct FooScrollAreaPrivate
{
GdkWindow *input_window;
int width;
int height;
GtkAdjustment *hadj;
GtkAdjustment *vadj;
GtkScrollablePolicy hscroll_policy;
GtkScrollablePolicy vscroll_policy;
int x_offset;
int y_offset;
int min_width;
int min_height;
GPtrArray *input_regions;
AutoScrollInfo *auto_scroll_info;
/* During expose, this region is set to the region
* being exposed. At other times, it is NULL
*
* It is used for clipping of input areas
*/
InputRegion *current_input;
gboolean grabbed;
FooScrollAreaEventFunc grab_func;
gpointer grab_data;
cairo_surface_t *surface;
cairo_region_t *update_region; /* In canvas coordinates */
};
enum
{
VIEWPORT_CHANGED,
PAINT,
INPUT,
LAST_SIGNAL,
};
enum {
PROP_0,
PROP_VADJUSTMENT,
PROP_HADJUSTMENT,
PROP_HSCROLL_POLICY,
PROP_VSCROLL_POLICY
};
static guint signals [LAST_SIGNAL] = { 0 };
static gboolean foo_scroll_area_draw (GtkWidget *widget,
cairo_t *cr);
static void foo_scroll_area_get_preferred_width (GtkWidget *widget,
gint *minimum,
gint *natural);
static void foo_scroll_area_get_preferred_height (GtkWidget *widget,
gint *minimum,
gint *natural);
static void foo_scroll_area_size_allocate (GtkWidget *widget,
GtkAllocation *allocation);
static void foo_scroll_area_set_hadjustment (FooScrollArea *scroll_area,
GtkAdjustment *hadjustment);
static void foo_scroll_area_set_vadjustment (FooScrollArea *scroll_area,
GtkAdjustment *vadjustment);
static void foo_scroll_area_realize (GtkWidget *widget);
static void foo_scroll_area_unrealize (GtkWidget *widget);
static void foo_scroll_area_map (GtkWidget *widget);
static void foo_scroll_area_unmap (GtkWidget *widget);
static gboolean foo_scroll_area_button_press (GtkWidget *widget,
GdkEventButton *event);
static gboolean foo_scroll_area_button_release (GtkWidget *widget,
GdkEventButton *event);
static gboolean foo_scroll_area_motion (GtkWidget *widget,
GdkEventMotion *event);
static void
foo_scroll_area_map (GtkWidget *widget)
{
FooScrollArea *area = FOO_SCROLL_AREA (widget);
GTK_WIDGET_CLASS (parent_class)->map (widget);
if (area->priv->input_window)
gdk_window_show (area->priv->input_window);
}
static void
foo_scroll_area_unmap (GtkWidget *widget)
{
FooScrollArea *area = FOO_SCROLL_AREA (widget);
if (area->priv->input_window)
gdk_window_hide (area->priv->input_window);
GTK_WIDGET_CLASS (parent_class)->unmap (widget);
}
static void
foo_scroll_area_finalize (GObject *object)
{
FooScrollArea *scroll_area = FOO_SCROLL_AREA (object);
g_object_unref (scroll_area->priv->hadj);
g_object_unref (scroll_area->priv->vadj);
g_ptr_array_free (scroll_area->priv->input_regions, TRUE);
g_free (scroll_area->priv);
G_OBJECT_CLASS (foo_scroll_area_parent_class)->finalize (object);
}
static void
foo_scroll_area_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
FooScrollArea *scroll_area = FOO_SCROLL_AREA (object);
switch (property_id)
{
case PROP_VADJUSTMENT:
g_value_set_object (value, &scroll_area->priv->vadj);
break;
case PROP_HADJUSTMENT:
g_value_set_object (value, &scroll_area->priv->hadj);
break;
case PROP_HSCROLL_POLICY:
g_value_set_enum (value, scroll_area->priv->hscroll_policy);
break;
case PROP_VSCROLL_POLICY:
g_value_set_enum (value, scroll_area->priv->vscroll_policy);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
foo_scroll_area_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
FooScrollArea *scroll_area = FOO_SCROLL_AREA (object);
switch (property_id) {
case PROP_VADJUSTMENT:
foo_scroll_area_set_vadjustment (FOO_SCROLL_AREA (object), g_value_get_object (value));
break;
case PROP_HADJUSTMENT:
foo_scroll_area_set_hadjustment (FOO_SCROLL_AREA (object), g_value_get_object (value));
break;
case PROP_HSCROLL_POLICY:
scroll_area->priv->hscroll_policy = g_value_get_enum (value);
break;
case PROP_VSCROLL_POLICY:
scroll_area->priv->vscroll_policy = g_value_get_enum (value);
break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
foo_scroll_area_class_init (FooScrollAreaClass *class)
{
GObjectClass *object_class = G_OBJECT_CLASS (class);
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
object_class->finalize = foo_scroll_area_finalize;
object_class->set_property = foo_scroll_area_set_property;
object_class->get_property = foo_scroll_area_get_property;
widget_class->get_preferred_width = foo_scroll_area_get_preferred_width;
widget_class->get_preferred_height = foo_scroll_area_get_preferred_height;
widget_class->draw = foo_scroll_area_draw;
widget_class->size_allocate = foo_scroll_area_size_allocate;
widget_class->realize = foo_scroll_area_realize;
widget_class->unrealize = foo_scroll_area_unrealize;
widget_class->button_press_event = foo_scroll_area_button_press;
widget_class->button_release_event = foo_scroll_area_button_release;
widget_class->motion_notify_event = foo_scroll_area_motion;
widget_class->map = foo_scroll_area_map;
widget_class->unmap = foo_scroll_area_unmap;
parent_class = g_type_class_peek_parent (class);
/* Scrollable interface properties */
g_object_class_override_property (object_class, PROP_HADJUSTMENT, "hadjustment");
g_object_class_override_property (object_class, PROP_VADJUSTMENT, "vadjustment");
g_object_class_override_property (object_class, PROP_HSCROLL_POLICY, "hscroll-policy");
g_object_class_override_property (object_class, PROP_VSCROLL_POLICY, "vscroll-policy");
signals[VIEWPORT_CHANGED] =
g_signal_new ("viewport_changed",
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_STRUCT_OFFSET (FooScrollAreaClass,
viewport_changed),
NULL, NULL,
foo_marshal_VOID__BOXED_BOXED,
G_TYPE_NONE, 2,
GDK_TYPE_RECTANGLE,
GDK_TYPE_RECTANGLE);
signals[PAINT] =
g_signal_new ("paint",
G_OBJECT_CLASS_TYPE (object_class),
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
G_STRUCT_OFFSET (FooScrollAreaClass,
paint),
NULL, NULL,
g_cclosure_marshal_VOID__POINTER,
G_TYPE_NONE, 1,
G_TYPE_POINTER);
}
static GtkAdjustment *
new_adjustment (void)
{
return GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0));
}
static void
foo_scroll_area_init (FooScrollArea *scroll_area)
{
GtkWidget *widget;
widget = GTK_WIDGET (scroll_area);
gtk_widget_set_has_window (widget, FALSE);
gtk_widget_set_redraw_on_allocate (widget, FALSE);
scroll_area->priv = g_new0 (FooScrollAreaPrivate, 1);
scroll_area->priv->width = 0;
scroll_area->priv->height = 0;
scroll_area->priv->hadj = g_object_ref_sink (new_adjustment());
scroll_area->priv->vadj = g_object_ref_sink (new_adjustment());
scroll_area->priv->x_offset = 0.0;
scroll_area->priv->y_offset = 0.0;
scroll_area->priv->min_width = 0;
scroll_area->priv->min_height = 0;
scroll_area->priv->auto_scroll_info = NULL;
scroll_area->priv->input_regions = g_ptr_array_new ();
scroll_area->priv->surface = NULL;
scroll_area->priv->update_region = cairo_region_create ();
}
typedef void (* PathForeachFunc) (double *x,
double *y,
gpointer data);
static void
path_foreach_point (cairo_path_t *path,
PathForeachFunc func,
gpointer user_data)
{
int i;
for (i = 0; i < path->num_data; i += path->data[i].header.length)
{
cairo_path_data_t *data = &(path->data[i]);
switch (data->header.type)
{
case CAIRO_PATH_MOVE_TO:
case CAIRO_PATH_LINE_TO:
func (&(data[1].point.x), &(data[1].point.y), user_data);
break;
case CAIRO_PATH_CURVE_TO:
func (&(data[1].point.x), &(data[1].point.y), user_data);
func (&(data[2].point.x), &(data[2].point.y), user_data);
func (&(data[3].point.x), &(data[3].point.y), user_data);
break;
case CAIRO_PATH_CLOSE_PATH:
break;
}
}
}
typedef struct
{
double x1, y1, x2, y2;
} Box;
static void
input_path_free_list (InputPath *paths)
{
if (!paths)
return;
input_path_free_list (paths->next);
cairo_path_destroy (paths->path);
g_free (paths);
}
static void
input_region_free (InputRegion *region)
{
input_path_free_list (region->paths);
cairo_region_destroy (region->region);
g_free (region);
}
static void
get_viewport (FooScrollArea *scroll_area,
GdkRectangle *viewport)
{
GtkAllocation allocation;
GtkWidget *widget = GTK_WIDGET (scroll_area);
gtk_widget_get_allocation (widget, &allocation);
viewport->x = scroll_area->priv->x_offset;
viewport->y = scroll_area->priv->y_offset;
viewport->width = allocation.width;
viewport->height = allocation.height;
}
static void
allocation_to_canvas (FooScrollArea *area,
int *x,
int *y)
{
*x += area->priv->x_offset;
*y += area->priv->y_offset;
}
static void
clear_exposed_input_region (FooScrollArea *area,
cairo_region_t *exposed) /* in canvas coordinates */
{
int i;
cairo_region_t *viewport;
GdkRectangle allocation;
gtk_widget_get_allocation (GTK_WIDGET (area), &allocation);
allocation.x = 0;
allocation.y = 0;
allocation_to_canvas (area, &allocation.x, &allocation.y);
viewport = cairo_region_create_rectangle (&allocation);
cairo_region_subtract (viewport, exposed);
for (i = 0; i < area->priv->input_regions->len; ++i)
{
InputRegion *region = area->priv->input_regions->pdata[i];
cairo_region_intersect (region->region, viewport);
if (cairo_region_is_empty (region->region))
{
input_region_free (region);
g_ptr_array_remove_index_fast (area->priv->input_regions, i--);
}
}
cairo_region_destroy (viewport);
}
/* taken from mutter */
static void
setup_background_cr (GdkWindow *window, cairo_t *cr, int x_offset, int y_offset)
{
GdkWindow *parent = gdk_window_get_parent (window);
cairo_pattern_t *bg_pattern;
bg_pattern = gdk_window_get_background_pattern (window);
if (bg_pattern == NULL && parent)
{
gint window_x, window_y;
gdk_window_get_position (window, &window_x, &window_y);
setup_background_cr (parent, cr, x_offset + window_x, y_offset + window_y);
}
else if (bg_pattern)
{
cairo_translate (cr, - x_offset, - y_offset);
cairo_set_source (cr, bg_pattern);
cairo_translate (cr, x_offset, y_offset);
}
}
static void
initialize_background (GtkWidget *widget,
cairo_t *cr)
{
setup_background_cr (gtk_widget_get_window (widget), cr, 0, 0);
cairo_paint (cr);
}
static gboolean
foo_scroll_area_draw (GtkWidget *widget,
cairo_t *cr)
{
FooScrollArea *scroll_area = FOO_SCROLL_AREA (widget);
cairo_region_t *region;
GtkAllocation widget_allocation;
/* Note that this function can be called at a time
* where the adj->value is different from x_offset.
* Ie., the GtkScrolledWindow changed the adj->value
* without emitting the value_changed signal.
*
* Hence we must always use the value we got
* the last time the signal was emitted, ie.,
* priv->{x,y}_offset.
*/
/* Setup input areas */
clear_exposed_input_region (scroll_area, scroll_area->priv->update_region);
scroll_area->priv->current_input = g_new0 (InputRegion, 1);
scroll_area->priv->current_input->region = cairo_region_copy (scroll_area->priv->update_region);
scroll_area->priv->current_input->paths = NULL;
g_ptr_array_add (scroll_area->priv->input_regions,
scroll_area->priv->current_input);
region = scroll_area->priv->update_region;
scroll_area->priv->update_region = cairo_region_create ();
initialize_background (widget, cr);
g_signal_emit (widget, signals[PAINT], 0, cr);
scroll_area->priv->current_input = NULL;
gtk_widget_get_allocation (widget, &widget_allocation);
/* Finally draw the backing surface */
cairo_set_source_surface (cr, scroll_area->priv->surface,
widget_allocation.x, widget_allocation.y);
cairo_fill (cr);
cairo_region_destroy (region);
return TRUE;
}
void
foo_scroll_area_get_viewport (FooScrollArea *scroll_area,
GdkRectangle *viewport)
{
g_return_if_fail (FOO_IS_SCROLL_AREA (scroll_area));
if (!viewport)
return;
get_viewport (scroll_area, viewport);
}
static void
process_event (FooScrollArea *scroll_area,
FooScrollAreaEventType input_type,
int x,
int y);
static void
emit_viewport_changed (FooScrollArea *scroll_area,
GdkRectangle *new_viewport,
GdkRectangle *old_viewport)
{
int px, py;
g_signal_emit (scroll_area, signals[VIEWPORT_CHANGED], 0,
new_viewport, old_viewport);
if (scroll_area->priv->input_window == NULL)
return;
gdk_window_get_pointer (scroll_area->priv->input_window, &px, &py, NULL);
#if 0
g_print ("procc\n");
#endif
process_event (scroll_area, FOO_MOTION, px, py);
}
static void
clamp_adjustment (GtkAdjustment *adj)
{
if (gtk_adjustment_get_upper (adj) >= gtk_adjustment_get_page_size (adj))
gtk_adjustment_set_value (adj, CLAMP (gtk_adjustment_get_value (adj), 0.0,
gtk_adjustment_get_upper (adj)
- gtk_adjustment_get_page_size (adj)));
else
gtk_adjustment_set_value (adj, 0.0);
gtk_adjustment_changed (adj);
}
static gboolean
set_adjustment_values (FooScrollArea *scroll_area)
{
GtkAllocation allocation;
GtkAdjustment *hadj = scroll_area->priv->hadj;
GtkAdjustment *vadj = scroll_area->priv->vadj;
/* Horizontal */
gtk_widget_get_allocation (GTK_WIDGET (scroll_area), &allocation);
g_object_freeze_notify (G_OBJECT (hadj));
gtk_adjustment_set_page_size (hadj, allocation.width);
gtk_adjustment_set_step_increment (hadj, 0.1 * allocation.width);
gtk_adjustment_set_page_increment (hadj, 0.9 * allocation.width);
gtk_adjustment_set_lower (hadj, 0.0);
gtk_adjustment_set_upper (hadj, scroll_area->priv->width);
g_object_thaw_notify (G_OBJECT (hadj));
/* Vertical */
g_object_freeze_notify (G_OBJECT (vadj));
gtk_adjustment_set_page_size (vadj, allocation.height);
gtk_adjustment_set_step_increment (vadj, 0.1 * allocation.height);
gtk_adjustment_set_page_increment (vadj, 0.9 * allocation.height);
gtk_adjustment_set_lower (vadj, 0.0);
gtk_adjustment_set_upper (vadj, scroll_area->priv->height);
g_object_thaw_notify (G_OBJECT (vadj));
clamp_adjustment (hadj);
clamp_adjustment (vadj);
return TRUE;
}
static void
foo_scroll_area_realize (GtkWidget *widget)
{
FooScrollArea *area = FOO_SCROLL_AREA (widget);
GdkWindowAttr attributes;
GtkAllocation widget_allocation;
GdkWindow *window;
gint attributes_mask;
cairo_t *cr;
gtk_widget_get_allocation (widget, &widget_allocation);
gtk_widget_set_realized (widget, TRUE);
attributes.window_type = GDK_WINDOW_CHILD;
attributes.x = widget_allocation.x;
attributes.y = widget_allocation.y;
attributes.width = widget_allocation.width;
attributes.height = widget_allocation.height;
attributes.wclass = GDK_INPUT_ONLY;
attributes.event_mask = gtk_widget_get_events (widget);
attributes.event_mask |= (GDK_BUTTON_PRESS_MASK |
GDK_BUTTON_RELEASE_MASK |
GDK_BUTTON1_MOTION_MASK |
GDK_BUTTON2_MOTION_MASK |
GDK_BUTTON3_MOTION_MASK |
GDK_POINTER_MOTION_MASK |
GDK_ENTER_NOTIFY_MASK |
GDK_LEAVE_NOTIFY_MASK);
attributes_mask = GDK_WA_X | GDK_WA_Y;
window = gtk_widget_get_parent_window (widget);
gtk_widget_set_window (widget, window);
g_object_ref (window);
area->priv->input_window = gdk_window_new (window,
&attributes, attributes_mask);
cr = gdk_cairo_create (gtk_widget_get_window (widget));
area->priv->surface = cairo_surface_create_similar (cairo_get_target (cr),
CAIRO_CONTENT_COLOR,
widget_allocation.width,
widget_allocation.height);
cairo_destroy (cr);
gdk_window_set_user_data (area->priv->input_window, area);
}
static void
foo_scroll_area_unrealize (GtkWidget *widget)
{
FooScrollArea *area = FOO_SCROLL_AREA (widget);
if (area->priv->input_window)
{
gdk_window_set_user_data (area->priv->input_window, NULL);
gdk_window_destroy (area->priv->input_window);
area->priv->input_window = NULL;
}
GTK_WIDGET_CLASS (parent_class)->unrealize (widget);
}
static cairo_surface_t *
create_new_surface (GtkWidget *widget,
cairo_surface_t *old)
{
GtkAllocation widget_allocation;
cairo_surface_t *new;
cairo_t *cr;
gtk_widget_get_allocation (widget, &widget_allocation);
cr = gdk_cairo_create (gtk_widget_get_window (widget));
new = cairo_surface_create_similar (cairo_get_target (cr),
CAIRO_CONTENT_COLOR,
widget_allocation.width,
widget_allocation.height);
cairo_destroy (cr);
/* Unfortunately we don't know in which direction we were resized,
* so we just assume we were dragged from the south-east corner.
*
* Although, maybe we could get the root coordinates of the input-window?
* That might just work, actually. We need to make sure metacity uses
* static gravity for the window before this will be useful.
*/
cr = cairo_create (new);
cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
cairo_set_source_surface (cr, old, 0, 0);
cairo_paint (cr);
cairo_destroy (cr);
return new;
}
static void
allocation_to_canvas_region (FooScrollArea *area,
cairo_region_t *region)
{
cairo_region_translate (region, area->priv->x_offset, area->priv->y_offset);
}
static void
_cairo_region_xor (cairo_region_t *dst,
const cairo_region_t *src)
{
cairo_region_t *trb;
trb = cairo_region_copy (src);
cairo_region_subtract (trb, dst);
cairo_region_subtract (dst, src);
cairo_region_union (dst, trb);
cairo_region_destroy (trb);
}
static void
foo_scroll_area_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
{
FooScrollArea *scroll_area = FOO_SCROLL_AREA (widget);
GdkRectangle new_viewport;
GdkRectangle old_viewport;
cairo_region_t *old_allocation;
cairo_region_t *invalid;
GtkAllocation widget_allocation;
get_viewport (scroll_area, &old_viewport);
gtk_widget_get_allocation (widget, &widget_allocation);
old_allocation = cairo_region_create_rectangle (&widget_allocation);
cairo_region_translate (old_allocation,
-widget_allocation.x, -widget_allocation.y);
invalid = cairo_region_create_rectangle (allocation);
cairo_region_translate (invalid, -allocation->x, -allocation->y);
_cairo_region_xor (invalid, old_allocation);
allocation_to_canvas_region (scroll_area, invalid);
foo_scroll_area_invalidate_region (scroll_area, invalid);
cairo_region_destroy (old_allocation);
cairo_region_destroy (invalid);
gtk_widget_set_allocation (widget, allocation);
if (scroll_area->priv->input_window)
{
cairo_surface_t *new_surface;
gdk_window_move_resize (scroll_area->priv->input_window,
allocation->x, allocation->y,
allocation->width, allocation->height);
new_surface = create_new_surface (widget, scroll_area->priv->surface);
cairo_surface_destroy (scroll_area->priv->surface);
scroll_area->priv->surface = new_surface;
}
get_viewport (scroll_area, &new_viewport);
emit_viewport_changed (scroll_area, &new_viewport, &old_viewport);
}
static void
emit_input (FooScrollArea *scroll_area,
FooScrollAreaEventType type,
int x,
int y,
FooScrollAreaEventFunc func,
gpointer data)
{
FooScrollAreaEvent event;
if (!func)
return;
event.type = type;
event.x = x;
event.y = y;
func (scroll_area, &event, data);
}
static void
process_event (FooScrollArea *scroll_area,
FooScrollAreaEventType input_type,
int x,
int y)
{
GtkWidget *widget = GTK_WIDGET (scroll_area);
int i;
allocation_to_canvas (scroll_area, &x, &y);
if (scroll_area->priv->grabbed)
{
emit_input (scroll_area, input_type, x, y,
scroll_area->priv->grab_func,
scroll_area->priv->grab_data);
}
#if 0
g_print ("number of input regions: %d\n", scroll_area->priv->input_regions->len);
#endif
for (i = 0; i < scroll_area->priv->input_regions->len; ++i)
{
InputRegion *region = scroll_area->priv->input_regions->pdata[i];
#if 0
g_print ("region %d (looking for %d,%d) ", i, x, y);
#endif
if (cairo_region_contains_point (region->region, x, y))
{
InputPath *path;
path = region->paths;
while (path)
{
cairo_t *cr;
gboolean inside;
cr = gdk_cairo_create (gtk_widget_get_window (widget));
cairo_set_fill_rule (cr, path->fill_rule);
cairo_set_line_width (cr, path->line_width);
cairo_append_path (cr, path->path);
if (path->is_stroke)
inside = cairo_in_stroke (cr, x, y);
else
inside = cairo_in_fill (cr, x, y);
cairo_destroy (cr);
if (inside)
{
if (scroll_area->priv->grabbed)
{
emit_input (scroll_area, FOO_DRAG_HOVER,
x, y,
path->func,
path->data);
}
else
{
emit_input (scroll_area, input_type,
x, y,
path->func,
path->data);
}
return;
}
path = path->next;
}
/* Since the regions are all disjoint, no other region
* can match. Of course we could be clever and try and
* sort the regions, but so far I have been unable to
* make this loop show up on a profile.
*/
return;
}
}
}
static void
process_gdk_event (FooScrollArea *scroll_area,
int x,
int y,
GdkEvent *event)
{
FooScrollAreaEventType input_type;
if (event->type == GDK_BUTTON_PRESS)
input_type = FOO_BUTTON_PRESS;
else if (event->type == GDK_BUTTON_RELEASE)
input_type = FOO_BUTTON_RELEASE;
else if (event->type == GDK_MOTION_NOTIFY)
input_type = FOO_MOTION;
else
return;
process_event (scroll_area, input_type, x, y);
}
static gboolean
foo_scroll_area_button_press (GtkWidget *widget,
GdkEventButton *event)
{
FooScrollArea *area = FOO_SCROLL_AREA (widget);
process_gdk_event (area, event->x, event->y, (GdkEvent *)event);
return TRUE;
}
static gboolean
foo_scroll_area_button_release (GtkWidget *widget,
GdkEventButton *event)
{
FooScrollArea *area = FOO_SCROLL_AREA (widget);
process_gdk_event (area, event->x, event->y, (GdkEvent *)event);
return FALSE;
}
static gboolean
foo_scroll_area_motion (GtkWidget *widget,
GdkEventMotion *event)
{
FooScrollArea *area = FOO_SCROLL_AREA (widget);
process_gdk_event (area, event->x, event->y, (GdkEvent *)event);
return TRUE;
}
void
foo_scroll_area_set_size_fixed_y (FooScrollArea *scroll_area,
int width,
int height,
int old_y,
int new_y)
{
scroll_area->priv->width = width;
scroll_area->priv->height = height;
#if 0
g_print ("diff: %d\n", new_y - old_y);
#endif
g_object_thaw_notify (G_OBJECT (scroll_area->priv->vadj));
gtk_adjustment_set_value (scroll_area->priv->vadj, new_y);
set_adjustment_values (scroll_area);
g_object_thaw_notify (G_OBJECT (scroll_area->priv->vadj));
}
void
foo_scroll_area_set_size (FooScrollArea *scroll_area,
int width,
int height)
{
g_return_if_fail (FOO_IS_SCROLL_AREA (scroll_area));
/* FIXME: Default scroll algorithm should probably be to
* keep the same *area* outside the screen as before.
*
* For wrapper widgets that will do something roughly
* right. For widgets that don't change size, it
* will do the right thing. Except for idle-layouting
* widgets.
*
* Maybe there should be some generic support for those
* widgets. Can that even be done?
*
* Should we have a version of this function using
* fixed points?
*/
scroll_area->priv->width = width;
scroll_area->priv->height = height;
set_adjustment_values (scroll_area);
}
static void
foo_scroll_area_get_preferred_width (GtkWidget *widget,
gint *minimum,
gint *natural)
{
FooScrollArea *scroll_area = FOO_SCROLL_AREA (widget);
if (minimum != NULL) {
*minimum = scroll_area->priv->min_width;
}
if (natural != NULL) {
*natural = scroll_area->priv->min_width;
}
}
static void
foo_scroll_area_get_preferred_height (GtkWidget *widget,
gint *minimum,
gint *natural)
{
FooScrollArea *scroll_area = FOO_SCROLL_AREA (widget);
if (minimum != NULL) {
*minimum = scroll_area->priv->min_height;
}
if (natural != NULL) {
*natural = scroll_area->priv->min_height;
}
}
static void
foo_scroll_area_scroll (FooScrollArea *area,
gint dx,
gint dy)
{
GdkRectangle allocation;
GdkRectangle src_area;
GdkRectangle move_area;
cairo_region_t *invalid_region;
gtk_widget_get_allocation (GTK_WIDGET (area), &allocation);
allocation.x = 0;
allocation.y = 0;
src_area = allocation;
src_area.x -= dx;
src_area.y -= dy;
invalid_region = cairo_region_create_rectangle (&allocation);
if (gdk_rectangle_intersect (&allocation, &src_area, &move_area))
{
cairo_region_t *move_region;
cairo_t *cr;
#if 0
g_print ("scrolling %d %d %d %d (%d %d)\n",
move_area.x, move_area.y,
move_area.width, move_area.height,
dx, dy);
#endif
cr = cairo_create (area->priv->surface);
/* Cairo doesn't allow self-copies, so we do this little trick instead:
* 1) Clip so the group size is small.
* 2) Call push_group() which creates a temporary pixmap as a workaround
*/
gdk_cairo_rectangle (cr, &move_area);
cairo_clip (cr);
cairo_push_group (cr);
cairo_set_source_surface (cr, area->priv->surface, dx, dy);
gdk_cairo_rectangle (cr, &move_area);
cairo_fill (cr);
cairo_pop_group_to_source (cr);
cairo_paint (cr);
cairo_destroy (cr);
gtk_widget_queue_draw (GTK_WIDGET (area));
move_region = cairo_region_create_rectangle (&move_area);
cairo_region_translate (move_region, dx, dy);
cairo_region_subtract (invalid_region, move_region);
cairo_region_destroy (move_region);
}
allocation_to_canvas_region (area, invalid_region);
foo_scroll_area_invalidate_region (area, invalid_region);
cairo_region_destroy (invalid_region);
}
static void
foo_scrollbar_adjustment_changed (GtkAdjustment *adj,
FooScrollArea *scroll_area)
{
GtkWidget *widget = GTK_WIDGET (scroll_area);
gint dx = 0;
gint dy = 0;
GdkRectangle old_viewport, new_viewport;
get_viewport (scroll_area, &old_viewport);
if (adj == scroll_area->priv->hadj)
{
/* FIXME: do we treat the offset as int or double, and,
* if int, how do we round?
*/
dx = (int)gtk_adjustment_get_value (adj) - scroll_area->priv->x_offset;
scroll_area->priv->x_offset = gtk_adjustment_get_value (adj);
}
else if (adj == scroll_area->priv->vadj)
{
dy = (int)gtk_adjustment_get_value (adj) - scroll_area->priv->y_offset;
scroll_area->priv->y_offset = gtk_adjustment_get_value (adj);
}
else
{
g_assert_not_reached ();
}
if (gtk_widget_get_realized (widget))
{
foo_scroll_area_scroll (scroll_area, -dx, -dy);
//translate_input_regions (scroll_area, -dx, -dy);
}
get_viewport (scroll_area, &new_viewport);
emit_viewport_changed (scroll_area, &new_viewport, &old_viewport);
}
static void
set_one_adjustment (FooScrollArea *scroll_area,
GtkAdjustment *adjustment,
GtkAdjustment **location)
{
g_return_if_fail (location != NULL);
if (adjustment == *location)
return;
if (!adjustment)
adjustment = new_adjustment ();
g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment));
if (*location)
{
g_signal_handlers_disconnect_by_func (
*location, foo_scrollbar_adjustment_changed, scroll_area);
g_object_unref (*location);
}
*location = adjustment;
g_object_ref_sink (*location);
g_signal_connect (*location, "value_changed",
G_CALLBACK (foo_scrollbar_adjustment_changed),
scroll_area);
}
static void
foo_scroll_area_set_hadjustment (FooScrollArea *scroll_area,
GtkAdjustment *hadjustment)
{
set_one_adjustment (scroll_area, hadjustment, &scroll_area->priv->hadj);
set_adjustment_values (scroll_area);
}
static void
foo_scroll_area_set_vadjustment (FooScrollArea *scroll_area,
GtkAdjustment *vadjustment)
{
set_one_adjustment (scroll_area, vadjustment, &scroll_area->priv->vadj);
set_adjustment_values (scroll_area);
}
FooScrollArea *
foo_scroll_area_new (void)
{
return g_object_new (FOO_TYPE_SCROLL_AREA, NULL);
}
void
foo_scroll_area_set_min_size (FooScrollArea *scroll_area,
int min_width,
int min_height)
{
scroll_area->priv->min_width = min_width;
scroll_area->priv->min_height = min_height;
/* FIXME: think through invalidation.
*
* Goals: - no repainting everything on size_allocate(),
* - make sure input boxes are invalidated when
* needed
*/
gtk_widget_queue_resize (GTK_WIDGET (scroll_area));
}
typedef struct {
cairo_t *cr;
GtkAllocation allocation;
} user_to_device_data;
static void
user_to_device (double *x, double *y,
gpointer user_data)
{
gdouble ox, oy;
user_to_device_data* data = user_data;
/* The translations by the user */
cairo_user_to_device (data->cr, x, y);
/* The position of the widget on the window. */
*x -= data->allocation.x;
*y -= data->allocation.y;
}
static InputPath *
make_path (FooScrollArea *area,
cairo_t *cr,
gboolean is_stroke,
FooScrollAreaEventFunc func,
gpointer data)
{
user_to_device_data conversion_data;
InputPath *path = g_new0 (InputPath, 1);
conversion_data.cr = cr;
gtk_widget_get_allocation(GTK_WIDGET (area), &conversion_data.allocation);
path->is_stroke = is_stroke;
path->fill_rule = cairo_get_fill_rule (cr);
path->line_width = cairo_get_line_width (cr);
path->path = cairo_copy_path (cr);
path_foreach_point (path->path, user_to_device, &conversion_data);
path->func = func;
path->data = data;
path->next = area->priv->current_input->paths;
area->priv->current_input->paths = path;
return path;
}
/* FIXME: we probably really want a
*
* foo_scroll_area_add_input_from_fill (area, cr, ...);
* and
* foo_scroll_area_add_input_from_stroke (area, cr, ...);
* as well.
*/
void
foo_scroll_area_add_input_from_fill (FooScrollArea *scroll_area,
cairo_t *cr,
FooScrollAreaEventFunc func,
gpointer data)
{
g_return_if_fail (FOO_IS_SCROLL_AREA (scroll_area));
g_return_if_fail (cr != NULL);
g_return_if_fail (scroll_area->priv->current_input);
make_path (scroll_area, cr, FALSE, func, data);
}
void
foo_scroll_area_add_input_from_stroke (FooScrollArea *scroll_area,
cairo_t *cr,
FooScrollAreaEventFunc func,
gpointer data)
{
g_return_if_fail (FOO_IS_SCROLL_AREA (scroll_area));
g_return_if_fail (cr != NULL);
g_return_if_fail (scroll_area->priv->current_input);
make_path (scroll_area, cr, TRUE, func, data);
}
void
foo_scroll_area_invalidate (FooScrollArea *scroll_area)
{
GtkAllocation allocation;
GtkWidget *widget = GTK_WIDGET (scroll_area);
gtk_widget_get_allocation (widget, &allocation);
foo_scroll_area_invalidate_rect (scroll_area,
scroll_area->priv->x_offset, scroll_area->priv->y_offset,
allocation.width,
allocation.height);
}
static void
canvas_to_window (FooScrollArea *area,
cairo_region_t *region)
{
GtkAllocation allocation;
GtkWidget *widget = GTK_WIDGET (area);
gtk_widget_get_allocation (widget, &allocation);
cairo_region_translate (region,
-area->priv->x_offset + allocation.x,
-area->priv->y_offset + allocation.y);
}
static void
window_to_canvas (FooScrollArea *area,
cairo_region_t *region)
{
GtkAllocation allocation;
GtkWidget *widget = GTK_WIDGET (area);
gtk_widget_get_allocation (widget, &allocation);
cairo_region_translate (region,
area->priv->x_offset - allocation.x,
area->priv->y_offset - allocation.y);
}
void
foo_scroll_area_invalidate_region (FooScrollArea *area,
cairo_region_t *region)
{
GtkWidget *widget;
g_return_if_fail (FOO_IS_SCROLL_AREA (area));
widget = GTK_WIDGET (area);
cairo_region_union (area->priv->update_region, region);
if (gtk_widget_get_realized (widget))
{
canvas_to_window (area, region);
gdk_window_invalidate_region (gtk_widget_get_window (widget),
region, TRUE);
window_to_canvas (area, region);
}
}
void
foo_scroll_area_invalidate_rect (FooScrollArea *scroll_area,
int x,
int y,
int width,
int height)
{
cairo_rectangle_int_t rect = { x, y, width, height };
cairo_region_t *region;
g_return_if_fail (FOO_IS_SCROLL_AREA (scroll_area));
region = cairo_region_create_rectangle (&rect);
foo_scroll_area_invalidate_region (scroll_area, region);
cairo_region_destroy (region);
}
void
foo_scroll_area_begin_grab (FooScrollArea *scroll_area,
FooScrollAreaEventFunc func,
gpointer input_data)
{
g_return_if_fail (FOO_IS_SCROLL_AREA (scroll_area));
g_return_if_fail (!scroll_area->priv->grabbed);
scroll_area->priv->grabbed = TRUE;
scroll_area->priv->grab_func = func;
scroll_area->priv->grab_data = input_data;
/* FIXME: we should probably take a server grab */
/* Also, maybe there should be support for setting the grab cursor */
}
void
foo_scroll_area_end_grab (FooScrollArea *scroll_area,
FooScrollAreaEvent *event)
{
g_return_if_fail (FOO_IS_SCROLL_AREA (scroll_area));
scroll_area->priv->grabbed = FALSE;
scroll_area->priv->grab_func = NULL;
scroll_area->priv->grab_data = NULL;
if (event != NULL)
process_event (scroll_area, FOO_DROP, event->x, event->y);
}
gboolean
foo_scroll_area_is_grabbed (FooScrollArea *scroll_area)
{
return scroll_area->priv->grabbed;
}
void
foo_scroll_area_set_viewport_pos (FooScrollArea *scroll_area,
int x,
int y)
{
g_object_freeze_notify (G_OBJECT (scroll_area->priv->hadj));
g_object_freeze_notify (G_OBJECT (scroll_area->priv->vadj));
gtk_adjustment_set_value (scroll_area->priv->hadj, x);
gtk_adjustment_set_value (scroll_area->priv->vadj, y);
set_adjustment_values (scroll_area);
g_object_thaw_notify (G_OBJECT (scroll_area->priv->hadj));
g_object_thaw_notify (G_OBJECT (scroll_area->priv->vadj));
}
static gboolean
rect_contains (const GdkRectangle *rect, int x, int y)
{
return (x >= rect->x &&
y >= rect->y &&
x < rect->x + rect->width &&
y < rect->y + rect->height);
}
static void
stop_scrolling (FooScrollArea *area)
{
#if 0
g_print ("stop scrolling\n");
#endif
if (area->priv->auto_scroll_info)
{
g_source_remove (area->priv->auto_scroll_info->timeout_id);
g_timer_destroy (area->priv->auto_scroll_info->timer);
g_free (area->priv->auto_scroll_info);
area->priv->auto_scroll_info = NULL;
}
}
static gboolean
scroll_idle (gpointer data)
{
GdkRectangle viewport, new_viewport;
FooScrollArea *area = data;
AutoScrollInfo *info = area->priv->auto_scroll_info;
int new_x, new_y;
double elapsed;
get_viewport (area, &viewport);
#if 0
g_print ("old info: %d %d\n", info->dx, info->dy);
g_print ("timeout (%d %d)\n", dx, dy);
#endif
#if 0
g_print ("new info %d %d\n", info->dx, info->dy);
#endif
elapsed = g_timer_elapsed (info->timer, NULL);
info->res_x = elapsed * info->dx / 0.2;
info->res_y = elapsed * info->dy / 0.2;
#if 0
g_print ("%f %f\n", info->res_x, info->res_y);
#endif
new_x = viewport.x + info->res_x;
new_y = viewport.y + info->res_y;
#if 0
g_print ("%f\n", elapsed * (info->dx / 0.2));
#endif
#if 0
g_print ("new_x, new_y\n: %d %d\n", new_x, new_y);
#endif
foo_scroll_area_set_viewport_pos (area, new_x, new_y);
#if 0
viewport.x + info->dx,
viewport.y + info->dy);
#endif
get_viewport (area, &new_viewport);
if (viewport.x == new_viewport.x &&
viewport.y == new_viewport.y &&
(info->res_x > 1.0 ||
info->res_y > 1.0 ||
info->res_x < -1.0 ||
info->res_y < -1.0))
{
stop_scrolling (area);
/* stop scrolling if it didn't have an effect */
return FALSE;
}
return TRUE;
}
static void
ensure_scrolling (FooScrollArea *area,
int dx,
int dy)
{
if (!area->priv->auto_scroll_info)
{
#if 0
g_print ("start scrolling\n");
#endif
area->priv->auto_scroll_info = g_new0 (AutoScrollInfo, 1);
area->priv->auto_scroll_info->timeout_id =
g_idle_add (scroll_idle, area);
area->priv->auto_scroll_info->timer = g_timer_new ();
}
#if 0
g_print ("setting scrolling to %d %d\n", dx, dy);
#endif
#if 0
g_print ("dx, dy: %d %d\n", dx, dy);
#endif
area->priv->auto_scroll_info->dx = dx;
area->priv->auto_scroll_info->dy = dy;
}
void
foo_scroll_area_auto_scroll (FooScrollArea *scroll_area,
FooScrollAreaEvent *event)
{
GdkRectangle viewport;
get_viewport (scroll_area, &viewport);
if (rect_contains (&viewport, event->x, event->y))
{
stop_scrolling (scroll_area);
}
else
{
int dx, dy;
dx = dy = 0;
if (event->y < viewport.y)
{
dy = event->y - viewport.y;
dy = MIN (dy + 2, 0);
}
else if (event->y >= viewport.y + viewport.height)
{
dy = event->y - (viewport.y + viewport.height - 1);
dy = MAX (dy - 2, 0);
}
if (event->x < viewport.x)
{
dx = event->x - viewport.x;
dx = MIN (dx + 2, 0);
}
else if (event->x >= viewport.x + viewport.width)
{
dx = event->x - (viewport.x + viewport.width - 1);
dx = MAX (dx - 2, 0);
}
#if 0
g_print ("dx, dy: %d %d\n", dx, dy);
#endif
ensure_scrolling (scroll_area, dx, dy);
}
}
void
foo_scroll_area_begin_auto_scroll (FooScrollArea *scroll_area)
{
/* noop for now */
}
void
foo_scroll_area_end_auto_scroll (FooScrollArea *scroll_area)
{
stop_scrolling (scroll_area);
}
./panels/display/scrollarea.h 0000644 0000041 0000041 00000013613 13241553602 016477 0 ustar www-data www-data /* Copyright 2006, 2007, 2008, Soren Sandmann
*
* 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
#include
#define FOO_TYPE_SCROLL_AREA (foo_scroll_area_get_type ())
#define FOO_SCROLL_AREA(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), FOO_TYPE_SCROLL_AREA, FooScrollArea))
#define FOO_SCROLL_AREA_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), FOO_TYPE_SCROLL_AREA, FooScrollAreaClass))
#define FOO_IS_SCROLL_AREA(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FOO_TYPE_SCROLL_AREA))
#define FOO_IS_SCROLL_AREA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), FOO_TYPE_SCROLL_AREA))
#define FOO_SCROLL_AREA_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), FOO_TYPE_SCROLL_AREA, FooScrollAreaClass))
typedef struct FooScrollArea FooScrollArea;
typedef struct FooScrollAreaClass FooScrollAreaClass;
typedef struct FooScrollAreaPrivate FooScrollAreaPrivate;
typedef struct FooScrollAreaEvent FooScrollAreaEvent;
typedef enum
{
FOO_BUTTON_PRESS,
FOO_BUTTON_RELEASE,
FOO_DRAG_HOVER,
FOO_DROP,
FOO_MOTION
} FooScrollAreaEventType;
struct FooScrollAreaEvent
{
FooScrollAreaEventType type;
int x;
int y;
};
typedef void (* FooScrollAreaEventFunc) (FooScrollArea *area,
FooScrollAreaEvent *event,
gpointer data);
struct FooScrollArea
{
GtkContainer parent_instance;
FooScrollAreaPrivate *priv;
};
struct FooScrollAreaClass
{
GtkContainerClass parent_class;
void (*set_scroll_adjustments) (FooScrollArea *scroll_area,
GtkAdjustment *hadjustment,
GtkAdjustment *vadjustment);
void (*viewport_changed) (FooScrollArea *scroll_area,
GdkRectangle *old_viewport,
GdkRectangle *new_viewport);
void (*paint) (FooScrollArea *scroll_area,
cairo_t *cr,
GdkRectangle *extents,
cairo_region_t *region);
};
GType foo_scroll_area_get_type (void);
FooScrollArea *foo_scroll_area_new (void);
/* Set the requisition for the widget. */
void foo_scroll_area_set_min_size (FooScrollArea *scroll_area,
int min_width,
int min_height);
/* Set how much of the canvas can be scrolled into view */
void foo_scroll_area_set_size (FooScrollArea *scroll_area,
int width,
int height);
void foo_scroll_area_set_size_fixed_y (FooScrollArea *scroll_area,
int width,
int height,
int old_y,
int new_y);
void foo_scroll_area_set_viewport_pos (FooScrollArea *scroll_area,
int x,
int y);
void foo_scroll_area_get_viewport (FooScrollArea *scroll_area,
GdkRectangle *viewport);
void foo_scroll_area_add_input_from_stroke (FooScrollArea *scroll_area,
cairo_t *cr,
FooScrollAreaEventFunc func,
gpointer data);
void foo_scroll_area_add_input_from_fill (FooScrollArea *scroll_area,
cairo_t *cr,
FooScrollAreaEventFunc func,
gpointer data);
void foo_scroll_area_invalidate_region (FooScrollArea *area,
cairo_region_t *region);
void foo_scroll_area_invalidate (FooScrollArea *scroll_area);
void foo_scroll_area_invalidate_rect (FooScrollArea *scroll_area,
int x,
int y,
int width,
int height);
void foo_scroll_area_begin_grab (FooScrollArea *scroll_area,
FooScrollAreaEventFunc func,
gpointer input_data);
void foo_scroll_area_end_grab (FooScrollArea *scroll_area,
FooScrollAreaEvent *event);
gboolean foo_scroll_area_is_grabbed (FooScrollArea *scroll_area);
void foo_scroll_area_begin_auto_scroll (FooScrollArea *scroll_area);
void foo_scroll_area_auto_scroll (FooScrollArea *scroll_area,
FooScrollAreaEvent *event);
void foo_scroll_area_end_auto_scroll (FooScrollArea *scroll_area);
./panels/display/foo-marshal.list 0000644 0000041 0000041 00000000174 13241553602 017302 0 ustar www-data www-data VOID:OBJECT,OBJECT
VOID:UINT,UINT,UINT,UINT
VOID:UINT,UINT
VOID:BOXED,BOXED
VOID:POINTER,BOXED,POINTER
VOID:POINTER,POINTER
./panels/display/cc-display-panel.c 0000644 0000041 0000041 00000265354 13241553602 017503 0 ustar www-data www-data /*
* Copyright (C) 2007, 2008 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Author: Soren Sandmann
*
*/
#include
#include
#include
#include
#include
#include "cc-display-panel.h"
#include
#include
#include "scrollarea.h"
#include
#include
#include
#include
#include
#include
#include "cc-rr-labeler.h"
CC_PANEL_REGISTER (CcDisplayPanel, cc_display_panel)
#define DISPLAY_PANEL_PRIVATE(o) \
(G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_DISPLAY_PANEL, CcDisplayPanelPrivate))
#define WID(s) GTK_WIDGET (gtk_builder_get_object (self->priv->builder, s))
#define TOP_BAR_HEIGHT 10
#define CLOCK_SCHEMA "org.gnome.desktop.interface"
#define CLOCK_FORMAT_KEY "clock-format"
/* The minimum supported size for the panel, see:
* http://live.gnome.org/Design/SystemSettings */
#define MINIMUM_WIDTH 675
#define MINIMUM_HEIGHT 530
#define UNITY_GSETTINGS_SCHEMA "org.compiz.unityshell"
#define UNITY_GSETTINGS_PATH "/org/compiz/profiles/unity/plugins/unityshell/"
#define UNITY_LAUNCHER_ALL_MONITORS_KEY "num-launchers"
#define UNITY_STICKY_EDGE_KEY "launcher-capture-mouse"
#define UNITY_UI_GSETTINGS_SCHEMA "com.canonical.Unity.Interface"
#define UNITY_UI_SCALE_FACTOR_MONITOR "app-scale-factor-monitor"
#define UNITY_UI_SCALE_FALLBACK_TO_MAX "app-fallback-to-maximum-scale-factor"
#define UNITY2D_GSETTINGS_MAIN "com.canonical.Unity2d"
#define UNITY2D_GSETTINGS_LAUNCHER "com.canonical.Unity2d.Launcher"
#define DESKTOP_GSETTINGS_SCHEMA "com.ubuntu.user-interface"
#define UI_SCALE_MIN 4.0
#define UI_SCALE_MAX 32.0
#define UI_SCALE_STEP 1.0
#define UI_SCALE_DEFAULT 8.0
enum {
TEXT_COL,
WIDTH_COL,
HEIGHT_COL,
RATE_COL,
SORT_COL,
ROTATION_COL,
NUM_COLS
};
struct _CcDisplayPanelPrivate
{
GsdRRScreen *screen;
GsdRRConfig *current_configuration;
CcRRLabeler *labeler;
GsdRROutputInfo *current_output;
GSettings *clock_settings;
GSettings *unity_settings;
GSettings *unity_ui_settings;
GSettings *unity2d_settings_main;
GSettings *unity2d_settings_launcher;
GSettings *desktop_settings;
GtkBuilder *builder;
guint focus_id;
GtkWidget *panel;
GtkWidget *current_monitor_event_box;
GtkWidget *current_monitor_label;
GtkWidget *monitor_switch;
GtkListStore *resolution_store;
GtkWidget *resolution_combo;
GtkWidget *rotation_combo;
GtkWidget *clone_checkbox;
GtkWidget *clone_label;
GtkWidget *show_icon_checkbox;
GtkWidget *ui_scale;
double ui_prev_scale;
/* We store the event timestamp when the Apply button is clicked */
guint32 apply_button_clicked_timestamp;
GtkWidget *area;
gboolean ignore_gui_changes;
gboolean dragging_top_bar;
/* These are used while we are waiting for the ApplyConfiguration method to be executed over D-bus */
GDBusProxy *proxy;
};
typedef struct
{
int grab_x;
int grab_y;
int output_x;
int output_y;
} GrabInfo;
static void rebuild_gui (CcDisplayPanel *self);
static void on_clone_changed (GtkWidget *box, gpointer data);
static gboolean output_overlaps (GsdRROutputInfo *output, GsdRRConfig *config);
static void select_current_output_from_dialog_position (CcDisplayPanel *self);
static void monitor_switch_active_cb (GObject *object, GParamSpec *pspec, gpointer data);
static void get_geometry (GsdRROutputInfo *output, int *w, int *h);
static void apply_configuration_returned_cb (GObject *proxy, GAsyncResult *res, gpointer data);
static gboolean get_clone_size (GsdRRScreen *screen, int *width, int *height);
static gboolean output_info_supports_mode (CcDisplayPanel *self, GsdRROutputInfo *info, int width, int height);
static char *make_resolution_string (int width, int height);
static GObject *cc_display_panel_constructor (GType gtype,
guint n_properties,
GObjectConstructParam *properties);
static void on_screen_changed (GsdRRScreen *scr, gpointer data);
static void refresh_unity_launcher_placement (CcDisplayPanel *self);
static void refresh_unity_monitor_scale (CcDisplayPanel *self);
static gboolean unity_launcher_on_all_monitors (GSettings *settings);
static void
cc_display_panel_get_property (GObject *object,
guint property_id,
GValue *value,
GParamSpec *pspec)
{
switch (property_id)
{
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
cc_display_panel_set_property (GObject *object,
guint property_id,
const GValue *value,
GParamSpec *pspec)
{
switch (property_id)
{
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
}
}
static void
cc_display_panel_dispose (GObject *object)
{
G_OBJECT_CLASS (cc_display_panel_parent_class)->dispose (object);
}
static void
cc_display_panel_finalize (GObject *object)
{
CcDisplayPanel *self;
CcShell *shell;
GtkWidget *toplevel;
self = CC_DISPLAY_PANEL (object);
g_signal_handlers_disconnect_by_func (self->priv->screen, on_screen_changed, self);
g_object_unref (self->priv->screen);
g_object_unref (self->priv->builder);
if (self->priv->clock_settings != NULL)
g_object_unref (self->priv->clock_settings);
if (self->priv->unity2d_settings_main != NULL)
g_object_unref (self->priv->unity2d_settings_main);
if (self->priv->unity2d_settings_launcher != NULL)
g_object_unref (self->priv->unity2d_settings_launcher);
if (self->priv->unity_settings != NULL)
g_object_unref (self->priv->unity_settings);
if (self->priv->unity_ui_settings != NULL)
g_object_unref (self->priv->unity_ui_settings);
if (self->priv->desktop_settings != NULL)
g_object_unref (self->priv->desktop_settings);
shell = cc_panel_get_shell (CC_PANEL (self));
if (shell != NULL)
{
toplevel = cc_shell_get_toplevel (shell);
if (toplevel != NULL)
g_signal_handler_disconnect (G_OBJECT (toplevel),
self->priv->focus_id);
}
cc_rr_labeler_hide (self->priv->labeler);
g_object_unref (self->priv->labeler);
G_OBJECT_CLASS (cc_display_panel_parent_class)->finalize (object);
}
static const char *
cc_display_panel_get_help_uri (CcPanel *panel)
{
return "help:ubuntu-help/prefs-display";
}
static void
cc_display_panel_class_init (CcDisplayPanelClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
CcPanelClass *panel_class = CC_PANEL_CLASS (klass);
g_type_class_add_private (klass, sizeof (CcDisplayPanelPrivate));
panel_class->get_help_uri = cc_display_panel_get_help_uri;
object_class->constructor = cc_display_panel_constructor;
object_class->get_property = cc_display_panel_get_property;
object_class->set_property = cc_display_panel_set_property;
object_class->dispose = cc_display_panel_dispose;
object_class->finalize = cc_display_panel_finalize;
}
static void
error_message (CcDisplayPanel *self, const char *primary_text, const char *secondary_text)
{
GtkWidget *toplevel;
GtkWidget *dialog;
if (self && self->priv->panel)
toplevel = gtk_widget_get_toplevel (self->priv->panel);
else
toplevel = NULL;
dialog = gtk_message_dialog_new (GTK_WINDOW (toplevel),
GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
GTK_MESSAGE_ERROR,
GTK_BUTTONS_CLOSE,
"%s", primary_text);
if (secondary_text)
gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s", secondary_text);
gtk_dialog_run (GTK_DIALOG (dialog));
gtk_widget_destroy (dialog);
}
static gboolean
should_show_resolution (gint output_width,
gint output_height,
gint width,
gint height)
{
if (width >= MIN (output_width, MINIMUM_WIDTH) &&
height >= MIN (output_height, MINIMUM_HEIGHT))
{
return TRUE;
}
return FALSE;
}
static void
on_screen_changed (GsdRRScreen *scr,
gpointer data)
{
GsdRRConfig *current;
CcDisplayPanel *self = data;
current = gsd_rr_config_new_current (self->priv->screen, NULL);
gsd_rr_config_ensure_primary (current);
if (self->priv->current_configuration)
g_object_unref (self->priv->current_configuration);
self->priv->current_configuration = current;
self->priv->current_output = NULL;
if (self->priv->labeler) {
cc_rr_labeler_hide (self->priv->labeler);
g_object_unref (self->priv->labeler);
}
self->priv->labeler = cc_rr_labeler_new (self->priv->current_configuration);
if (gtk_widget_has_focus (self->priv->panel))
cc_rr_labeler_show (self->priv->labeler);
select_current_output_from_dialog_position (self);
refresh_unity_launcher_placement (self);
refresh_unity_monitor_scale (self);
}
static void
on_viewport_changed (FooScrollArea *scroll_area,
GdkRectangle *old_viewport,
GdkRectangle *new_viewport)
{
foo_scroll_area_set_size (scroll_area,
new_viewport->width,
new_viewport->height);
foo_scroll_area_invalidate (scroll_area);
}
static void
layout_set_font (PangoLayout *layout, const char *font)
{
PangoFontDescription *desc =
pango_font_description_from_string (font);
if (desc)
{
pango_layout_set_font_description (layout, desc);
pango_font_description_free (desc);
}
}
static void
clear_combo (GtkWidget *widget)
{
GtkComboBox *box = GTK_COMBO_BOX (widget);
GtkTreeModel *model = gtk_combo_box_get_model (box);
GtkListStore *store = GTK_LIST_STORE (model);
gtk_list_store_clear (store);
}
typedef struct
{
const char *text;
gboolean found;
GtkTreeIter iter;
} ForeachInfo;
static gboolean
foreach (GtkTreeModel *model,
GtkTreePath *path,
GtkTreeIter *iter,
gpointer data)
{
ForeachInfo *info = data;
char *text = NULL;
gtk_tree_model_get (model, iter, TEXT_COL, &text, -1);
g_assert (text != NULL);
if (strcmp (info->text, text) == 0)
{
info->found = TRUE;
info->iter = *iter;
return TRUE;
}
return FALSE;
}
static void
add_key (GtkTreeModel *model,
const char *text,
gboolean preferred,
int width, int height, int rate,
GsdRRRotation rotation)
{
ForeachInfo info;
info.text = text;
info.found = FALSE;
gtk_tree_model_foreach (model, foreach, &info);
if (!info.found)
{
GtkTreeIter iter;
g_debug ("adding %s with rate %d Hz", text, rate);
gtk_list_store_insert_with_values (GTK_LIST_STORE (model), &iter, -1,
TEXT_COL, text,
WIDTH_COL, width,
HEIGHT_COL, height,
RATE_COL, rate,
SORT_COL, width * 10000 + height,
ROTATION_COL, rotation,
-1);
return;
}
/* Look, the preferred output, replace the old one */
if (preferred)
{
g_debug ("replacing %s with rate %d Hz (preferred mode)", text, rate);
gtk_list_store_set (GTK_LIST_STORE (model), &info.iter,
RATE_COL, rate,
-1);
return;
}
{
int old_rate;
gtk_tree_model_get (model, &info.iter,
RATE_COL, &old_rate,
-1);
/* Higher refresh rate */
if (rate > old_rate)
{
g_debug ("replacing %s with rate %d Hz (old rate: %d)", text, rate, old_rate);
gtk_list_store_set (GTK_LIST_STORE (model), &info.iter,
RATE_COL, rate,
-1);
return;
}
}
g_debug ("not adding %s with rate %d Hz (higher rate already there)", text, rate);
}
static void
add_mode (CcDisplayPanel *self,
GsdRRMode *mode,
gint output_width,
gint output_height,
guint preferred_id)
{
int width, height, rate;
width = gsd_rr_mode_get_width (mode);
height = gsd_rr_mode_get_height (mode);
rate = gsd_rr_mode_get_freq (mode);
if (should_show_resolution (output_width, output_height, width, height))
{
char *text;
gboolean preferred;
preferred = (gsd_rr_mode_get_id (mode) == preferred_id);
text = make_resolution_string (width, height);
add_key (gtk_combo_box_get_model (GTK_COMBO_BOX (self->priv->resolution_combo)),
text, preferred, width, height, rate, -1);
g_free (text);
}
}
static gboolean
combo_select (GtkWidget *widget, const char *text)
{
GtkComboBox *box = GTK_COMBO_BOX (widget);
GtkTreeModel *model = gtk_combo_box_get_model (box);
ForeachInfo info;
info.text = text;
info.found = FALSE;
gtk_tree_model_foreach (model, foreach, &info);
if (!info.found)
return FALSE;
gtk_combo_box_set_active_iter (box, &info.iter);
return TRUE;
}
static GsdRRMode **
get_current_modes (CcDisplayPanel *self)
{
GsdRROutput *output;
if (gsd_rr_config_get_clone (self->priv->current_configuration))
{
return gsd_rr_screen_list_clone_modes (self->priv->screen);
}
else
{
if (!self->priv->current_output)
return NULL;
output = gsd_rr_screen_get_output_by_name (self->priv->screen,
gsd_rr_output_info_get_name (self->priv->current_output));
if (!output)
return NULL;
return gsd_rr_output_list_modes (output);
}
}
static void
rebuild_rotation_combo (CcDisplayPanel *self)
{
typedef struct
{
GsdRRRotation rotation;
const char * name;
} RotationInfo;
static const RotationInfo rotations[] = {
{ GSD_RR_ROTATION_0, NC_("display panel, rotation", "Normal") },
{ GSD_RR_ROTATION_90, NC_("display panel, rotation", "Counterclockwise") },
{ GSD_RR_ROTATION_270, NC_("display panel, rotation", "Clockwise") },
{ GSD_RR_ROTATION_180, NC_("display panel, rotation", "180 Degrees") },
};
const char *selection;
GsdRRRotation current;
int i;
clear_combo (self->priv->rotation_combo);
gtk_widget_set_sensitive (self->priv->rotation_combo,
self->priv->current_output && gsd_rr_output_info_is_active (self->priv->current_output));
if (!self->priv->current_output)
return;
current = gsd_rr_output_info_get_rotation (self->priv->current_output);
selection = NULL;
for (i = 0; i < G_N_ELEMENTS (rotations); ++i)
{
const RotationInfo *info = &(rotations[i]);
gsd_rr_output_info_set_rotation (self->priv->current_output, info->rotation);
/* NULL-GError --- FIXME: we should say why this rotation is not available! */
if (gsd_rr_config_applicable (self->priv->current_configuration, self->priv->screen, NULL))
{
add_key (gtk_combo_box_get_model (GTK_COMBO_BOX (self->priv->rotation_combo)), g_dpgettext2 (NULL, "display panel, rotation", info->name), FALSE, 0, 0, 0, info->rotation);
if (info->rotation == current)
selection = g_dpgettext2 (NULL, "display panel, rotation", info->name);
}
}
gsd_rr_output_info_set_rotation (self->priv->current_output, current);
if (!(selection && combo_select (self->priv->rotation_combo, selection)))
gtk_combo_box_set_active (GTK_COMBO_BOX (self->priv->rotation_combo), 0);
}
static GVariant*
add_dict_entry (GVariant *dict, const char *key, int value)
{
GVariantBuilder builder;
GVariantIter iter;
const gchar *k;
guint32 v;
g_variant_builder_init (&builder, G_VARIANT_TYPE ("a{si}"));
g_variant_iter_init (&iter, dict);
while (g_variant_iter_next (&iter, "{&si}", &k, &v))
{
if (!g_str_equal (k, key))
g_variant_builder_add (&builder, "{si}", k, v);
}
g_variant_builder_add (&builder, "{si}", key, value);
return g_variant_builder_end (&builder);
}
static int
get_ui_scale_from_monitor (CcDisplayPanel *self, const char *monitor_name)
{
int value;
GVariant *dict;
dict = g_settings_get_value (self->priv->desktop_settings, "scale-factor");
if (!g_variant_lookup (dict, monitor_name, "i", &value))
value = UI_SCALE_DEFAULT;
return value;
}
static int
calculate_max_ui_scale (CcDisplayPanel *self)
{
int win_max_dimension;
int output_width, output_height;
float max_scale;
GsdRROutputInfo *output = self->priv->current_output;
const char *monitor_name = gsd_rr_output_info_get_name (output);
int current_ui_scale = get_ui_scale_from_monitor (self, monitor_name);
float current_scale_factor = (float)current_ui_scale / 8.0;
float win_scale_factor = current_scale_factor > 1 ? floor (current_scale_factor) : 1;
get_geometry (output, &output_width, &output_height);
/* only the integer part of the scale-factor contributes to the window size */
win_max_dimension = MINIMUM_HEIGHT / win_scale_factor;
max_scale = (float)output_height / (float)win_max_dimension;
return (int)(max_scale * 8.0);
}
static void
rebuild_ui_scale (CcDisplayPanel *self)
{
int value;
float t;
GVariant *dict;
GVariant *new_dict;
GtkAdjustment *adj = gtk_range_get_adjustment (GTK_RANGE(self->priv->ui_scale));
const char *monitor_name = gsd_rr_output_info_get_name (self->priv->current_output);
if (!monitor_name)
{
g_warning("Failed to get monitor name.");
return;
}
gtk_adjustment_set_step_increment (adj, UI_SCALE_STEP);
gtk_adjustment_set_upper (adj, calculate_max_ui_scale(self));
gtk_adjustment_set_lower (adj, UI_SCALE_MIN);
gtk_scale_set_digits (GTK_SCALE(self->priv->ui_scale), 0);
gtk_scale_add_mark (GTK_SCALE(self->priv->ui_scale), UI_SCALE_DEFAULT, GTK_POS_TOP, NULL);
dict = g_settings_get_value (self->priv->desktop_settings, "scale-factor");
if (!g_variant_lookup (dict, monitor_name, "i", &value))
{
value = UI_SCALE_DEFAULT;
self->priv->ui_prev_scale = value;
}
new_dict = add_dict_entry (dict, monitor_name, value);
g_settings_set_value (self->priv->desktop_settings, "scale-factor", new_dict);
gtk_adjustment_set_value (adj, value);
g_variant_unref (dict);
}
static int
count_active_outputs (CcDisplayPanel *self)
{
int i, count = 0;
GsdRROutputInfo **outputs = gsd_rr_config_get_outputs (self->priv->current_configuration);
for (i = 0; outputs[i] != NULL; ++i)
{
if (gsd_rr_output_info_is_active (outputs[i]))
count++;
}
return count;
}
#if 0
static int
count_all_outputs (GsdRRConfig *config)
{
int i;
GsdRROutputInfo **outputs = gsd_rr_config_get_outputs (config);
for (i = 0; outputs[i] != NULL; i++)
;
return i;
}
#endif
/* Computes whether "Mirror displays" (clone mode) is supported based on these criteria:
*
* 1. There is an available size for cloning.
*
* 2. There are 2 or more connected outputs that support that size.
*/
static gboolean
mirror_screens_is_supported (CcDisplayPanel *self)
{
int clone_width, clone_height;
gboolean have_clone_size;
gboolean mirror_is_supported;
mirror_is_supported = FALSE;
have_clone_size = get_clone_size (self->priv->screen, &clone_width, &clone_height);
if (have_clone_size) {
int i;
int num_outputs_with_clone_size;
GsdRROutputInfo **outputs = gsd_rr_config_get_outputs (self->priv->current_configuration);
num_outputs_with_clone_size = 0;
for (i = 0; outputs[i] != NULL; i++)
{
/* We count the connected outputs that support the clone size. It
* doesn't matter if those outputs aren't actually On currently; we
* will turn them on in on_clone_changed().
*/
if (gsd_rr_output_info_is_connected (outputs[i]) && output_info_supports_mode (self, outputs[i], clone_width, clone_height))
num_outputs_with_clone_size++;
}
if (num_outputs_with_clone_size >= 2)
mirror_is_supported = TRUE;
}
return mirror_is_supported;
}
static void
rebuild_mirror_screens (CcDisplayPanel *self)
{
gboolean mirror_is_active;
gboolean mirror_is_supported;
g_signal_handlers_block_by_func (self->priv->clone_checkbox, G_CALLBACK (on_clone_changed), self);
mirror_is_active = self->priv->current_configuration && gsd_rr_config_get_clone (self->priv->current_configuration);
/* If mirror_is_active, then it *must* be possible to turn mirroring off */
mirror_is_supported = mirror_is_active || mirror_screens_is_supported (self);
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (self->priv->clone_checkbox), mirror_is_active);
gtk_widget_set_sensitive (self->priv->clone_checkbox, mirror_is_supported);
gtk_widget_set_sensitive (self->priv->clone_label, mirror_is_supported);
/* set inactive the launcher placement choice */
gtk_widget_set_sensitive (WID ("launcher_placement_combo"), !mirror_is_active);
gtk_widget_set_sensitive (WID ("stickyedge_switch"), !mirror_is_active);
gtk_widget_set_sensitive (WID ("ui_scale_monitor_combo"), !mirror_is_active);
g_signal_handlers_unblock_by_func (self->priv->clone_checkbox, G_CALLBACK (on_clone_changed), self);
}
static char *
mirror_monitor_name (void)
{
/* Keep this string in sync with gnome-desktop/libgnome-desktop/gnome-rr-labeler.c */
/* Translators: this is the feature where what you see on your laptop's
* screen is the same as your external projector. Here, "Mirrored" is being
* used as an adjective. For example, the Spanish translation could be
* "Pantallas en Espejo".
*/
return g_strdup (_("Mirrored Displays"));
}
static void
rebuild_current_monitor_label (CcDisplayPanel *self)
{
gchar *str;
GdkRGBA color;
gboolean use_color;
if (self->priv->current_output)
{
if (gsd_rr_config_get_clone (self->priv->current_configuration))
{
gchar *str = mirror_monitor_name ();
gtk_label_set_text (GTK_LABEL (self->priv->current_monitor_label), str);
g_free (str);
}
else
{
str = gsd_rr_output_info_get_display_name (self->priv->current_output);
gtk_label_set_text (GTK_LABEL (self->priv->current_monitor_label), str);
}
cc_rr_labeler_get_rgba_for_output (self->priv->labeler, self->priv->current_output, &color);
use_color = TRUE;
}
else
{
gtk_label_set_text (GTK_LABEL (self->priv->current_monitor_label), _("Monitor"));
use_color = FALSE;
}
if (use_color)
{
GdkRGBA black = { 0, 0, 0, 1.0 };
gtk_widget_override_background_color (self->priv->current_monitor_event_box,
gtk_widget_get_state_flags (self->priv->current_monitor_event_box),
&color);
/* Make the label explicitly black. We don't want it to follow the
* theme's colors, since the label is always shown against a light
* pastel background. See bgo#556050
*/
gtk_widget_override_color (self->priv->current_monitor_label,
gtk_widget_get_state_flags (self->priv->current_monitor_label),
&black);
}
else
{
/* Remove any modifications we did on the label's color */
gtk_widget_override_color (self->priv->current_monitor_label,
gtk_widget_get_state_flags (self->priv->current_monitor_label),
NULL);
}
gtk_event_box_set_visible_window (GTK_EVENT_BOX (self->priv->current_monitor_event_box), use_color);
}
static void
rebuild_on_off_radios (CcDisplayPanel *self)
{
gboolean sensitive;
gboolean on_active;
g_signal_handlers_block_by_func (self->priv->monitor_switch, G_CALLBACK (monitor_switch_active_cb), self);
sensitive = FALSE;
on_active = FALSE;
if (!gsd_rr_config_get_clone (self->priv->current_configuration) && self->priv->current_output)
{
if (count_active_outputs (self) > 1 || !gsd_rr_output_info_is_active (self->priv->current_output))
sensitive = TRUE;
else
sensitive = FALSE;
on_active = gsd_rr_output_info_is_active (self->priv->current_output);
}
gtk_widget_set_sensitive (self->priv->monitor_switch, sensitive);
gtk_switch_set_active (GTK_SWITCH (self->priv->monitor_switch), on_active);
g_signal_handlers_unblock_by_func (self->priv->monitor_switch, G_CALLBACK (monitor_switch_active_cb), self);
}
static char *
make_resolution_string (int width, int height)
{
int ratio;
const char *aspect = NULL;
if (width && height) {
if (width > height)
ratio = width * 10 / height;
else
ratio = height * 10 / width;
switch (ratio) {
case 13:
aspect = "4:3";
break;
case 16:
aspect = "16:10";
break;
case 17:
aspect = "16:9";
break;
case 23:
aspect = "21:9";
break;
case 12:
aspect = "5:4";
break;
/* This catches 1.5625 as well (1600x1024) when maybe it shouldn't. */
case 15:
aspect = "3:2";
break;
case 18:
aspect = "9:5";
break;
case 10:
aspect = "1:1";
break;
}
}
if (aspect != NULL)
return g_strdup_printf (_("%d x %d (%s)"), width, height, aspect);
else
return g_strdup_printf (_("%d x %d"), width, height);
}
static void
find_best_mode (GsdRRMode **modes, int *out_width, int *out_height)
{
int i;
*out_width = 0;
*out_height = 0;
for (i = 0; modes[i] != NULL; i++)
{
int w, h;
w = gsd_rr_mode_get_width (modes[i]);
h = gsd_rr_mode_get_height (modes[i]);
if (w * h > *out_width * *out_height)
{
*out_width = w;
*out_height = h;
}
}
}
static void
rebuild_resolution_combo (CcDisplayPanel *self)
{
int i;
GsdRRMode **modes;
GsdRRMode *mode;
char *current;
int output_width, output_height;
guint32 preferred_id;
GsdRROutput *output;
clear_combo (self->priv->resolution_combo);
if (!(modes = get_current_modes (self))
|| !self->priv->current_output
|| !gsd_rr_output_info_is_active (self->priv->current_output))
{
gtk_widget_set_sensitive (self->priv->resolution_combo, FALSE);
return;
}
g_assert (self->priv->current_output != NULL);
gsd_rr_output_info_get_geometry (self->priv->current_output, NULL, NULL, &output_width, &output_height);
g_assert (output_width != 0 && output_height != 0);
gtk_widget_set_sensitive (self->priv->resolution_combo, TRUE);
output = gsd_rr_screen_get_output_by_name (self->priv->screen,
gsd_rr_output_info_get_name (self->priv->current_output));
mode = gsd_rr_output_get_preferred_mode (output);
preferred_id = gsd_rr_mode_get_id (mode);
for (i = 0; modes[i] != NULL; ++i)
add_mode (self, modes[i], output_width, output_height, preferred_id);
/* And force the preferred mode in the drop-down (when not in clone mode)
* https://bugzilla.gnome.org/show_bug.cgi?id=680969 */
if (!gsd_rr_config_get_clone (self->priv->current_configuration))
add_mode (self, mode, output_width, output_height, preferred_id);
current = make_resolution_string (output_width, output_height);
if (!combo_select (self->priv->resolution_combo, current))
{
int best_w, best_h;
char *str;
find_best_mode (modes, &best_w, &best_h);
str = make_resolution_string (best_w, best_h);
combo_select (self->priv->resolution_combo, str);
g_free (str);
}
g_free (current);
}
static void
rebuild_gui (CcDisplayPanel *self)
{
/* We would break spectacularly if we recursed, so
* just assert if that happens
*/
g_assert (self->priv->ignore_gui_changes == FALSE);
self->priv->ignore_gui_changes = TRUE;
rebuild_mirror_screens (self);
rebuild_current_monitor_label (self);
rebuild_on_off_radios (self);
rebuild_resolution_combo (self);
rebuild_rotation_combo (self);
rebuild_ui_scale (self);
refresh_unity_launcher_placement (self);
refresh_unity_monitor_scale (self);
self->priv->ignore_gui_changes = FALSE;
}
static gboolean
get_mode (GtkWidget *widget, int *width, int *height, int *rate, GsdRRRotation *rot)
{
GtkTreeIter iter;
GtkTreeModel *model;
GtkComboBox *box = GTK_COMBO_BOX (widget);
int dummy;
if (!gtk_combo_box_get_active_iter (box, &iter))
return FALSE;
if (!width)
width = &dummy;
if (!height)
height = &dummy;
if (!rate)
rate = &dummy;
if (!rot)
rot = (GsdRRRotation *)&dummy;
model = gtk_combo_box_get_model (box);
gtk_tree_model_get (model, &iter,
WIDTH_COL, width,
HEIGHT_COL, height,
RATE_COL, rate,
ROTATION_COL, rot,
-1);
return TRUE;
}
static void
on_rotation_changed (GtkComboBox *box, gpointer data)
{
CcDisplayPanel *self = data;
GsdRRRotation rotation;
if (!self->priv->current_output)
return;
if (get_mode (self->priv->rotation_combo, NULL, NULL, NULL, &rotation))
gsd_rr_output_info_set_rotation (self->priv->current_output, rotation);
foo_scroll_area_invalidate (FOO_SCROLL_AREA (self->priv->area));
}
static gboolean
on_ui_scale_button_press (GtkWidget *ui_scale, GdkEvent *ev, gpointer data)
{
CcDisplayPanel *self = data;
self->priv->ui_prev_scale = gtk_range_get_value (GTK_RANGE(ui_scale));
return FALSE; /* gtk should still process this event */
}
static gboolean
on_ui_scale_button_release (GtkWidget *ui_scale, GdkEvent *ev, gpointer data)
{
const char *monitor_name;
CcDisplayPanel *self = data;
int value = (int)gtk_range_get_value (GTK_RANGE(ui_scale));
if (value != self->priv->ui_prev_scale)
{
GVariant *dict;
GVariant *new_dict;
monitor_name = gsd_rr_output_info_get_name (self->priv->current_output);
if (!monitor_name)
{
g_warning("Failed to get monitor name.");
return FALSE;
}
dict = g_settings_get_value (self->priv->desktop_settings, "scale-factor");
new_dict = add_dict_entry (dict, monitor_name, value);
g_settings_set_value (self->priv->desktop_settings, "scale-factor", new_dict);
g_variant_unref (dict);
}
return FALSE; /* gtk should still process this event */
}
static gchar*
on_ui_scale_format_value (GtkScale *ui_scale, gdouble value)
{
return g_strdup_printf ("%.3g", value / 8.0);
}
static void
select_resolution_for_current_output (CcDisplayPanel *self)
{
GsdRRMode **modes;
int width, height;
int x,y;
gsd_rr_output_info_get_geometry (self->priv->current_output, &x, &y, NULL, NULL);
width = gsd_rr_output_info_get_preferred_width (self->priv->current_output);
height = gsd_rr_output_info_get_preferred_height (self->priv->current_output);
if (width != 0 && height != 0)
{
gsd_rr_output_info_set_geometry (self->priv->current_output, x, y, width, height);
return;
}
modes = get_current_modes (self);
if (!modes)
return;
find_best_mode (modes, &width, &height);
gsd_rr_output_info_set_geometry (self->priv->current_output, x, y, width, height);
}
static void
monitor_switch_active_cb (GObject *object,
GParamSpec *pspec,
gpointer data)
{
CcDisplayPanel *self = data;
gboolean value;
if (!self->priv->current_output)
return;
value = gtk_switch_get_active (GTK_SWITCH (object));
if (value)
{
gsd_rr_output_info_set_active (self->priv->current_output, TRUE);
select_resolution_for_current_output (self);
}
else
{
gsd_rr_output_info_set_active (self->priv->current_output, FALSE);
gsd_rr_config_ensure_primary (self->priv->current_configuration);
}
rebuild_gui (self);
foo_scroll_area_invalidate (FOO_SCROLL_AREA (self->priv->area));
}
static void
realign_outputs_after_resolution_change (CcDisplayPanel *self, GsdRROutputInfo *output_that_changed, int old_width, int old_height)
{
/* We find the outputs that were below or to the right of the output that
* changed, and realign them; we also do that for outputs that shared the
* right/bottom edges with the output that changed. The outputs that are
* above or to the left of that output don't need to change.
*/
int i;
int old_right_edge, old_bottom_edge;
int dx, dy;
int x, y, width, height;
GsdRROutputInfo **outputs;
g_assert (self->priv->current_configuration != NULL);
gsd_rr_output_info_get_geometry (output_that_changed, &x, &y, &width, &height);
if (width == old_width && height == old_height)
return;
old_right_edge = x + old_width;
old_bottom_edge = y + old_height;
dx = width - old_width;
dy = height - old_height;
outputs = gsd_rr_config_get_outputs (self->priv->current_configuration);
for (i = 0; outputs[i] != NULL; i++)
{
int output_x, output_y;
int output_width, output_height;
if (outputs[i] == output_that_changed || !gsd_rr_output_info_is_connected (outputs[i]))
continue;
gsd_rr_output_info_get_geometry (outputs[i], &output_x, &output_y, &output_width, &output_height);
if (output_x >= old_right_edge)
output_x += dx;
else if (output_x + output_width == old_right_edge)
output_x = x + width - output_width;
if (output_y >= old_bottom_edge)
output_y += dy;
else if (output_y + output_height == old_bottom_edge)
output_y = y + height - output_height;
gsd_rr_output_info_set_geometry (outputs[i], output_x, output_y, output_width, output_height);
}
}
static void
on_resolution_changed (GtkComboBox *box, gpointer data)
{
CcDisplayPanel *self = data;
int old_width, old_height;
int x,y;
int width;
int height;
if (!self->priv->current_output)
return;
gsd_rr_output_info_get_geometry (self->priv->current_output, &x, &y, &old_width, &old_height);
if (get_mode (self->priv->resolution_combo, &width, &height, NULL, NULL))
{
gsd_rr_output_info_set_geometry (self->priv->current_output, x, y, width, height);
if (width == 0 || height == 0)
gsd_rr_output_info_set_active (self->priv->current_output, FALSE);
else
gsd_rr_output_info_set_active (self->priv->current_output, TRUE);
}
realign_outputs_after_resolution_change (self, self->priv->current_output, old_width, old_height);
rebuild_rotation_combo (self);
foo_scroll_area_invalidate (FOO_SCROLL_AREA (self->priv->area));
}
static void
lay_out_outputs_horizontally (CcDisplayPanel *self)
{
int i;
int x;
GsdRROutputInfo **outputs;
/* Lay out all the monitors horizontally when "mirror screens" is turned
* off, to avoid having all of them overlapped initially. We put the
* outputs turned off on the right-hand side.
*/
x = 0;
/* First pass, all "on" outputs */
outputs = gsd_rr_config_get_outputs (self->priv->current_configuration);
for (i = 0; outputs[i]; ++i)
{
int width, height;
if (gsd_rr_output_info_is_connected (outputs[i]) && gsd_rr_output_info_is_active (outputs[i]))
{
gsd_rr_output_info_get_geometry (outputs[i], NULL, NULL, &width, &height);
gsd_rr_output_info_set_geometry (outputs[i], x, 0, width, height);
x += width;
}
}
/* Second pass, all the black screens */
for (i = 0; outputs[i]; ++i)
{
int width, height;
if (!(gsd_rr_output_info_is_connected (outputs[i]) && gsd_rr_output_info_is_active (outputs[i])))
{
gsd_rr_output_info_get_geometry (outputs[i], NULL, NULL, &width, &height);
gsd_rr_output_info_set_geometry (outputs[i], x, 0, width, height);
x += width;
}
}
}
/* FIXME: this function is copied from gnome-settings-daemon/plugins/xrandr/gsd-xrandr-manager.c.
* Do we need to put this function in gnome-desktop for public use?
*/
static gboolean
get_clone_size (GsdRRScreen *screen, int *width, int *height)
{
GsdRRMode **modes = gsd_rr_screen_list_clone_modes (screen);
int best_w, best_h;
int i;
best_w = 0;
best_h = 0;
for (i = 0; modes[i] != NULL; ++i) {
GsdRRMode *mode = modes[i];
int w, h;
w = gsd_rr_mode_get_width (mode);
h = gsd_rr_mode_get_height (mode);
if (w * h > best_w * best_h) {
best_w = w;
best_h = h;
}
}
if (best_w > 0 && best_h > 0) {
if (width)
*width = best_w;
if (height)
*height = best_h;
return TRUE;
}
return FALSE;
}
static gboolean
output_info_supports_mode (CcDisplayPanel *self, GsdRROutputInfo *info, int width, int height)
{
GsdRROutput *output;
GsdRRMode **modes;
int i;
if (!gsd_rr_output_info_is_connected (info))
return FALSE;
output = gsd_rr_screen_get_output_by_name (self->priv->screen, gsd_rr_output_info_get_name (info));
if (!output)
return FALSE;
modes = gsd_rr_output_list_modes (output);
for (i = 0; modes[i]; i++) {
if (gsd_rr_mode_get_width (modes[i]) == width
&& gsd_rr_mode_get_height (modes[i]) == height)
return TRUE;
}
return FALSE;
}
static void
on_clone_changed (GtkWidget *box, gpointer data)
{
CcDisplayPanel *self = data;
gsd_rr_config_set_clone (self->priv->current_configuration, gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (self->priv->clone_checkbox)));
if (gsd_rr_config_get_clone (self->priv->current_configuration))
{
int i;
int width, height;
GsdRROutputInfo **outputs = gsd_rr_config_get_outputs (self->priv->current_configuration);
for (i = 0; outputs[i]; ++i)
{
if (gsd_rr_output_info_is_connected (outputs[i]))
{
self->priv->current_output = outputs[i];
break;
}
}
/* Turn on all the connected screens that support the best clone mode.
* The user may hit "Mirror displays", but he shouldn't have to turn on
* all the required outputs as well.
*/
get_clone_size (self->priv->screen, &width, &height);
for (i = 0; outputs[i]; i++) {
int x, y;
if (output_info_supports_mode (self, outputs[i], width, height)) {
gsd_rr_output_info_set_active (outputs[i], TRUE);
gsd_rr_output_info_get_geometry (outputs[i], &x, &y, NULL, NULL);
gsd_rr_output_info_set_geometry (outputs[i], x, y, width, height);
}
}
}
else
{
if (output_overlaps (self->priv->current_output, self->priv->current_configuration))
lay_out_outputs_horizontally (self);
}
rebuild_gui (self);
}
static void
apply_rotation_to_geometry (GsdRROutputInfo *output, int *w, int *h)
{
GsdRRRotation rotation;
rotation = gsd_rr_output_info_get_rotation (output);
if ((rotation & GSD_RR_ROTATION_90) || (rotation & GSD_RR_ROTATION_270))
{
int tmp;
tmp = *h;
*h = *w;
*w = tmp;
}
}
static void
get_geometry (GsdRROutputInfo *output, int *w, int *h)
{
if (gsd_rr_output_info_is_active (output))
{
gsd_rr_output_info_get_geometry (output, NULL, NULL, w, h);
}
else
{
*h = gsd_rr_output_info_get_preferred_height (output);
*w = gsd_rr_output_info_get_preferred_width (output);
}
apply_rotation_to_geometry (output, w, h);
}
#define SPACE 15
#define MARGIN 15
static GList *
list_connected_outputs (CcDisplayPanel *self, int *total_w, int *total_h)
{
int i, dummy;
GList *result = NULL;
GsdRROutputInfo **outputs;
if (!total_w)
total_w = &dummy;
if (!total_h)
total_h = &dummy;
*total_w = 0;
*total_h = 0;
outputs = gsd_rr_config_get_outputs (self->priv->current_configuration);
for (i = 0; outputs[i] != NULL; ++i)
{
if (gsd_rr_output_info_is_connected (outputs[i]))
{
int w, h;
result = g_list_prepend (result, outputs[i]);
get_geometry (outputs[i], &w, &h);
*total_w += w;
*total_h += h;
}
}
return g_list_reverse (result);
}
static int
get_n_connected (CcDisplayPanel *self)
{
GList *connected_outputs = list_connected_outputs (self, NULL, NULL);
int n = g_list_length (connected_outputs);
g_list_free (connected_outputs);
return n;
}
static double
compute_scale (CcDisplayPanel *self)
{
int available_w, available_h;
int total_w, total_h;
int n_monitors;
GdkRectangle viewport;
GList *connected_outputs;
foo_scroll_area_get_viewport (FOO_SCROLL_AREA (self->priv->area), &viewport);
connected_outputs = list_connected_outputs (self, &total_w, &total_h);
n_monitors = g_list_length (connected_outputs);
g_list_free (connected_outputs);
available_w = viewport.width - 2 * MARGIN - (n_monitors - 1) * SPACE;
available_h = viewport.height - 2 * MARGIN - (n_monitors - 1) * SPACE;
return MIN ((double)available_w / total_w, (double)available_h / total_h);
}
typedef struct Edge
{
GsdRROutputInfo *output;
int x1, y1;
int x2, y2;
} Edge;
typedef struct Snap
{
Edge *snapper; /* Edge that should be snapped */
Edge *snappee;
int dy, dx;
} Snap;
static void
add_edge (GsdRROutputInfo *output, int x1, int y1, int x2, int y2, GArray *edges)
{
Edge e;
e.x1 = x1;
e.x2 = x2;
e.y1 = y1;
e.y2 = y2;
e.output = output;
g_array_append_val (edges, e);
}
static void
list_edges_for_output (GsdRROutputInfo *output, GArray *edges)
{
int x, y, w, h;
gsd_rr_output_info_get_geometry (output, &x, &y, &w, &h);
apply_rotation_to_geometry (output, &w, &h);
/* Top, Bottom, Left, Right */
add_edge (output, x, y, x + w, y, edges);
add_edge (output, x, y + h, x + w, y + h, edges);
add_edge (output, x, y, x, y + h, edges);
add_edge (output, x + w, y, x + w, y + h, edges);
}
static void
list_edges (GsdRRConfig *config, GArray *edges)
{
int i;
GsdRROutputInfo **outputs = gsd_rr_config_get_outputs (config);
for (i = 0; outputs[i]; ++i)
{
if (gsd_rr_output_info_is_connected (outputs[i]))
list_edges_for_output (outputs[i], edges);
}
}
static gboolean
overlap (int s1, int e1, int s2, int e2)
{
return (!(e1 < s2 || s1 >= e2));
}
static gboolean
horizontal_overlap (Edge *snapper, Edge *snappee)
{
if (snapper->y1 != snapper->y2 || snappee->y1 != snappee->y2)
return FALSE;
return overlap (snapper->x1, snapper->x2, snappee->x1, snappee->x2);
}
static gboolean
vertical_overlap (Edge *snapper, Edge *snappee)
{
if (snapper->x1 != snapper->x2 || snappee->x1 != snappee->x2)
return FALSE;
return overlap (snapper->y1, snapper->y2, snappee->y1, snappee->y2);
}
static void
add_snap (GArray *snaps, Snap snap)
{
if (ABS (snap.dx) <= 200 || ABS (snap.dy) <= 200)
g_array_append_val (snaps, snap);
}
static void
add_edge_snaps (Edge *snapper, Edge *snappee, GArray *snaps)
{
Snap snap;
snap.snapper = snapper;
snap.snappee = snappee;
if (horizontal_overlap (snapper, snappee))
{
snap.dx = 0;
snap.dy = snappee->y1 - snapper->y1;
add_snap (snaps, snap);
}
else if (vertical_overlap (snapper, snappee))
{
snap.dy = 0;
snap.dx = snappee->x1 - snapper->x1;
add_snap (snaps, snap);
}
/* Corner snaps */
/* 1->1 */
snap.dx = snappee->x1 - snapper->x1;
snap.dy = snappee->y1 - snapper->y1;
add_snap (snaps, snap);
/* 1->2 */
snap.dx = snappee->x2 - snapper->x1;
snap.dy = snappee->y2 - snapper->y1;
add_snap (snaps, snap);
/* 2->2 */
snap.dx = snappee->x2 - snapper->x2;
snap.dy = snappee->y2 - snapper->y2;
add_snap (snaps, snap);
/* 2->1 */
snap.dx = snappee->x1 - snapper->x2;
snap.dy = snappee->y1 - snapper->y2;
add_snap (snaps, snap);
}
static void
list_snaps (GsdRROutputInfo *output, GArray *edges, GArray *snaps)
{
int i;
for (i = 0; i < edges->len; ++i)
{
Edge *output_edge = &(g_array_index (edges, Edge, i));
if (output_edge->output == output)
{
int j;
for (j = 0; j < edges->len; ++j)
{
Edge *edge = &(g_array_index (edges, Edge, j));
if (edge->output != output)
add_edge_snaps (output_edge, edge, snaps);
}
}
}
}
#if 0
static void
print_edge (Edge *edge)
{
g_debug ("(%d %d %d %d)", edge->x1, edge->y1, edge->x2, edge->y2);
}
#endif
static gboolean
corner_on_edge (int x, int y, Edge *e)
{
if (x == e->x1 && x == e->x2 && y >= e->y1 && y <= e->y2)
return TRUE;
if (y == e->y1 && y == e->y2 && x >= e->x1 && x <= e->x2)
return TRUE;
return FALSE;
}
static gboolean
edges_align (Edge *e1, Edge *e2)
{
if (corner_on_edge (e1->x1, e1->y1, e2))
return TRUE;
if (corner_on_edge (e2->x1, e2->y1, e1))
return TRUE;
return FALSE;
}
static gboolean
output_is_aligned (GsdRROutputInfo *output, GArray *edges)
{
gboolean result = FALSE;
int i;
for (i = 0; i < edges->len; ++i)
{
Edge *output_edge = &(g_array_index (edges, Edge, i));
if (output_edge->output == output)
{
int j;
for (j = 0; j < edges->len; ++j)
{
Edge *edge = &(g_array_index (edges, Edge, j));
/* We are aligned if an output edge matches
* an edge of another output
*/
if (edge->output != output_edge->output)
{
if (edges_align (output_edge, edge))
{
result = TRUE;
goto done;
}
}
}
}
}
done:
return result;
}
static void
get_output_rect (GsdRROutputInfo *output, GdkRectangle *rect)
{
gsd_rr_output_info_get_geometry (output, &rect->x, &rect->y, &rect->width, &rect->height);
apply_rotation_to_geometry (output, &rect->width, &rect->height);
}
static gboolean
output_overlaps (GsdRROutputInfo *output, GsdRRConfig *config)
{
int i;
GdkRectangle output_rect;
GsdRROutputInfo **outputs;
g_assert (output != NULL);
get_output_rect (output, &output_rect);
outputs = gsd_rr_config_get_outputs (config);
for (i = 0; outputs[i]; ++i)
{
if (outputs[i] != output && gsd_rr_output_info_is_connected (outputs[i]))
{
GdkRectangle other_rect;
get_output_rect (outputs[i], &other_rect);
if (gdk_rectangle_intersect (&output_rect, &other_rect, NULL))
return TRUE;
}
}
return FALSE;
}
static gboolean
gsd_rr_config_is_aligned (GsdRRConfig *config, GArray *edges)
{
int i;
gboolean result = TRUE;
GsdRROutputInfo **outputs;
outputs = gsd_rr_config_get_outputs (config);
for (i = 0; outputs[i]; ++i)
{
if (gsd_rr_output_info_is_connected (outputs[i]))
{
if (!output_is_aligned (outputs[i], edges))
return FALSE;
if (output_overlaps (outputs[i], config))
return FALSE;
}
}
return result;
}
static gboolean
is_corner_snap (const Snap *s)
{
return s->dx != 0 && s->dy != 0;
}
static int
compare_snaps (gconstpointer v1, gconstpointer v2)
{
const Snap *s1 = v1;
const Snap *s2 = v2;
int sv1 = MAX (ABS (s1->dx), ABS (s1->dy));
int sv2 = MAX (ABS (s2->dx), ABS (s2->dy));
int d;
d = sv1 - sv2;
/* This snapping algorithm is good enough for rock'n'roll, but
* this is probably a better:
*
* First do a horizontal/vertical snap, then
* with the new coordinates from that snap,
* do a corner snap.
*
* Right now, it's confusing that corner snapping
* depends on the distance in an axis that you can't actually see.
*
*/
if (d == 0)
{
if (is_corner_snap (s1) && !is_corner_snap (s2))
return -1;
else if (is_corner_snap (s2) && !is_corner_snap (s1))
return 1;
else
return 0;
}
else
{
return d;
}
}
/* Sets a mouse cursor for a widget's window. As a hack, you can pass
* GDK_BLANK_CURSOR to mean "set the cursor to NULL" (i.e. reset the widget's
* window's cursor to its default).
*/
static void
set_cursor (GtkWidget *widget, GdkCursorType type)
{
GdkCursor *cursor;
GdkWindow *window;
if (type == GDK_BLANK_CURSOR)
cursor = NULL;
else
cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget), type);
window = gtk_widget_get_window (widget);
if (window)
gdk_window_set_cursor (window, cursor);
if (cursor)
g_object_unref (cursor);
}
static void
set_top_bar_tooltip (CcDisplayPanel *self, gboolean is_dragging)
{
const char *text;
if (is_dragging)
text = NULL;
else
text = _("Drag to change primary display.");
gtk_widget_set_tooltip_text (self->priv->area, text);
}
static void
on_top_bar_event (FooScrollArea *area,
FooScrollAreaEvent *event,
CcDisplayPanel *self)
{
/* Ignore drops */
if (event->type == FOO_DROP)
return;
/* If the mouse is inside the top bar, set the cursor to "you can move me". See
* on_canvas_event() for where we reset the cursor to the default if it
* exits the outputs' area.
*/
if (!gsd_rr_config_get_clone (self->priv->current_configuration) && get_n_connected (self) > 1)
set_cursor (GTK_WIDGET (area), GDK_HAND1);
if (event->type == FOO_BUTTON_PRESS)
{
rebuild_gui (self);
set_top_bar_tooltip (self, TRUE);
if (!gsd_rr_config_get_clone (self->priv->current_configuration) && get_n_connected (self) > 1)
{
self->priv->dragging_top_bar = TRUE;
foo_scroll_area_begin_grab (area, (FooScrollAreaEventFunc) on_top_bar_event, self);
}
foo_scroll_area_invalidate (area);
}
else
{
if (foo_scroll_area_is_grabbed (area))
{
if (event->type == FOO_BUTTON_RELEASE)
{
foo_scroll_area_end_grab (area, event);
self->priv->dragging_top_bar = FALSE;
set_top_bar_tooltip (self, FALSE);
}
foo_scroll_area_invalidate (area);
}
}
}
static void
set_monitors_tooltip (CcDisplayPanel *self, gboolean is_dragging)
{
const char *text;
if (is_dragging)
text = NULL;
else
text = _("Select a monitor to change its properties; drag it to rearrange its placement.");
gtk_widget_set_tooltip_text (self->priv->area, text);
}
static void
set_primary_output (CcDisplayPanel *self,
GsdRROutputInfo *output)
{
int i;
GsdRROutputInfo **outputs;
outputs = gsd_rr_config_get_outputs (self->priv->current_configuration);
for (i = 0; outputs[i] != NULL; ++i)
gsd_rr_output_info_set_primary (outputs[i], outputs[i] == output);
gtk_widget_queue_draw (WID ("self->priv->area"));
/* refresh the combobox */
refresh_unity_launcher_placement (self);
}
static void
on_output_event (FooScrollArea *area,
FooScrollAreaEvent *event,
gpointer data)
{
GsdRROutputInfo *output = data;
CcDisplayPanel *self = g_object_get_data (G_OBJECT (area), "panel");
if (event->type == FOO_DRAG_HOVER)
{
if (gsd_rr_output_info_is_active (output) && self->priv->dragging_top_bar)
set_primary_output (self, output);
return;
}
if (event->type == FOO_DROP)
{
/* Activate new primary? */
return;
}
/* If the mouse is inside the outputs, set the cursor to "you can move me". See
* on_canvas_event() for where we reset the cursor to the default if it
* exits the outputs' area.
*/
if (!gsd_rr_config_get_clone (self->priv->current_configuration) && get_n_connected (self) > 1)
set_cursor (GTK_WIDGET (area), GDK_FLEUR);
if (event->type == FOO_BUTTON_PRESS)
{
GrabInfo *info;
self->priv->current_output = output;
rebuild_gui (self);
set_monitors_tooltip (self, TRUE);
if (!gsd_rr_config_get_clone (self->priv->current_configuration) && get_n_connected (self) > 1)
{
int output_x, output_y;
gsd_rr_output_info_get_geometry (output, &output_x, &output_y, NULL, NULL);
foo_scroll_area_begin_grab (area, on_output_event, data);
info = g_new0 (GrabInfo, 1);
info->grab_x = event->x;
info->grab_y = event->y;
info->output_x = output_x;
info->output_y = output_y;
g_object_set_data (G_OBJECT (output), "grab-info", info);
}
foo_scroll_area_invalidate (area);
}
else
{
if (foo_scroll_area_is_grabbed (area))
{
GrabInfo *info = g_object_get_data (G_OBJECT (output), "grab-info");
double scale = compute_scale (self);
int old_x, old_y;
int width, height;
int new_x, new_y;
int i;
GArray *edges, *snaps, *new_edges;
gsd_rr_output_info_get_geometry (output, &old_x, &old_y, &width, &height);
new_x = info->output_x + (event->x - info->grab_x) / scale;
new_y = info->output_y + (event->y - info->grab_y) / scale;
gsd_rr_output_info_set_geometry (output, new_x, new_y, width, height);
edges = g_array_new (TRUE, TRUE, sizeof (Edge));
snaps = g_array_new (TRUE, TRUE, sizeof (Snap));
new_edges = g_array_new (TRUE, TRUE, sizeof (Edge));
list_edges (self->priv->current_configuration, edges);
list_snaps (output, edges, snaps);
g_array_sort (snaps, compare_snaps);
gsd_rr_output_info_set_geometry (output, new_x, new_y, width, height);
for (i = 0; i < snaps->len; ++i)
{
Snap *snap = &(g_array_index (snaps, Snap, i));
GArray *new_edges = g_array_new (TRUE, TRUE, sizeof (Edge));
gsd_rr_output_info_set_geometry (output, new_x + snap->dx, new_y + snap->dy, width, height);
g_array_set_size (new_edges, 0);
list_edges (self->priv->current_configuration, new_edges);
if (gsd_rr_config_is_aligned (self->priv->current_configuration, new_edges))
{
g_array_free (new_edges, TRUE);
break;
}
else
{
gsd_rr_output_info_set_geometry (output, info->output_x, info->output_y, width, height);
}
}
g_array_free (new_edges, TRUE);
g_array_free (snaps, TRUE);
g_array_free (edges, TRUE);
if (event->type == FOO_BUTTON_RELEASE)
{
foo_scroll_area_end_grab (area, event);
set_monitors_tooltip (self, FALSE);
g_free (g_object_get_data (G_OBJECT (output), "grab-info"));
g_object_set_data (G_OBJECT (output), "grab-info", NULL);
#if 0
g_debug ("new position: %d %d %d %d", output->x, output->y, output->width, output->height);
#endif
}
foo_scroll_area_invalidate (area);
}
}
}
static void
on_canvas_event (FooScrollArea *area,
FooScrollAreaEvent *event,
gpointer data)
{
/* If the mouse exits the outputs, reset the cursor to the default. See
* on_output_event() for where we set the cursor to the movement cursor if
* it is over one of the outputs.
*/
set_cursor (GTK_WIDGET (area), GDK_BLANK_CURSOR);
}
static PangoLayout *
get_display_name (CcDisplayPanel *self,
GsdRROutputInfo *output)
{
PangoLayout *layout;
char *text;
if (gsd_rr_config_get_clone (self->priv->current_configuration))
text = mirror_monitor_name ();
else
text = g_strdup (gsd_rr_output_info_get_display_name (output));
layout = gtk_widget_create_pango_layout (GTK_WIDGET (self->priv->area), text);
g_free (text);
pango_layout_set_alignment (layout, PANGO_ALIGN_CENTER);
return layout;
}
static void
paint_background (FooScrollArea *area,
cairo_t *cr)
{
GdkRectangle viewport;
GtkWidget *widget;
GtkStyleContext *context;
GdkRGBA fg, bg;
widget = GTK_WIDGET (area);
foo_scroll_area_get_viewport (area, &viewport);
context = gtk_widget_get_style_context (widget);
gtk_style_context_get_color (context, GTK_STATE_FLAG_NORMAL, &fg);
gtk_style_context_get_background_color (context, GTK_STATE_FLAG_NORMAL, &bg);
cairo_set_source_rgba (cr,
(fg.red + bg.red) / 2,
(fg.green + bg.green) / 2,
(fg.blue + bg.blue) / 2,
(fg.alpha + bg.alpha) / 2);
cairo_rectangle (cr,
viewport.x, viewport.y,
viewport.width, viewport.height);
cairo_fill_preserve (cr);
foo_scroll_area_add_input_from_fill (area, cr, on_canvas_event, NULL);
cairo_set_source_rgba (cr,
0.7 * bg.red,
0.7 * bg.green,
0.7 * bg.blue,
0.7 * bg.alpha);
cairo_stroke (cr);
}
static void
color_shade (double *r,
double *g,
double *b,
double k)
{
double h, s, v;
gtk_rgb_to_hsv (*r, *g, *b, &h, &s, &v);
s *= k;
if (s > 1.0)
s = 1.0;
else if (s < 0.0)
s = 0.0;
v *= k;
if (v > 1.0)
v = 1.0;
else if (v < 0.0)
v = 0.0;
gtk_hsv_to_rgb (h, s, v, r, g, b);
}
static void
paint_output (CcDisplayPanel *self, cairo_t *cr, int i)
{
int w, h;
double scale = compute_scale (self);
double x, y;
int output_x, output_y;
GsdRRRotation rotation;
int total_w, total_h;
GList *connected_outputs = list_connected_outputs (self, &total_w, &total_h);
GsdRROutputInfo *output = g_list_nth (connected_outputs, i)->data;
PangoLayout *layout = get_display_name (self, output);
PangoRectangle ink_extent, log_extent;
GdkRectangle viewport;
GdkRGBA output_color;
double r, g, b;
double available_w;
double factor;
cairo_save (cr);
foo_scroll_area_get_viewport (FOO_SCROLL_AREA (self->priv->area), &viewport);
get_geometry (output, &w, &h);
#if 0
g_debug ("%s (%p) geometry %d %d %d primary=%d", output->name, output->name,
w, h, output->rate, output->primary);
#endif
viewport.height -= 2 * MARGIN;
viewport.width -= 2 * MARGIN;
gsd_rr_output_info_get_geometry (output, &output_x, &output_y, NULL, NULL);
x = output_x * scale + MARGIN + (viewport.width - total_w * scale) / 2.0;
y = output_y * scale + MARGIN + (viewport.height - total_h * scale) / 2.0;
#if 0
g_debug ("scaled: %f %f", x, y);
g_debug ("scale: %f", scale);
g_debug ("%f %f %f %f", x, y, w * scale + 0.5, h * scale + 0.5);
#endif
cairo_translate (cr,
x + (w * scale + 0.5) / 2,
y + (h * scale + 0.5) / 2);
/* rotation is already applied in get_geometry */
rotation = gsd_rr_output_info_get_rotation (output);
if (rotation & GSD_RR_REFLECT_X)
cairo_scale (cr, -1, 1);
if (rotation & GSD_RR_REFLECT_Y)
cairo_scale (cr, 1, -1);
cairo_translate (cr,
- x - (w * scale + 0.5) / 2,
- y - (h * scale + 0.5) / 2);
if (output == self->priv->current_output)
{
GtkStyleContext *context;
GdkRGBA color;
context = gtk_widget_get_style_context (self->priv->area);
gtk_style_context_get_background_color (context, GTK_STATE_FLAG_SELECTED, &color);
cairo_rectangle (cr, x - 2, y - 2, w * scale + 0.5 + 4, h * scale + 0.5 + 4);
cairo_set_line_width (cr, 4);
cairo_set_source_rgba (cr, color.red, color.green, color.blue, 0.5);
cairo_stroke (cr);
}
cairo_rectangle (cr, x, y, w * scale + 0.5, h * scale + 0.5);
cairo_clip_preserve (cr);
cc_rr_labeler_get_rgba_for_output (self->priv->labeler, output, &output_color);
r = output_color.red;
g = output_color.green;
b = output_color.blue;
if (!gsd_rr_output_info_is_active (output))
{
/* If the output is turned off, just darken the selected color */
color_shade (&r, &g, &b, 0.4);
}
cairo_set_source_rgba (cr, r, g, b, 1.0);
foo_scroll_area_add_input_from_fill (FOO_SCROLL_AREA (self->priv->area),
cr, on_output_event, output);
cairo_fill (cr);
cairo_rectangle (cr, x + 0.5, y + 0.5, w * scale + 0.5 - 1, h * scale + 0.5 - 1);
cairo_set_line_width (cr, 1);
cairo_set_source_rgba (cr, 0.0, 0.0, 0.0, 1.0);
cairo_stroke (cr);
cairo_set_line_width (cr, 2);
cairo_save (cr);
layout_set_font (layout, "Sans 10");
pango_layout_get_pixel_extents (layout, &ink_extent, &log_extent);
available_w = w * scale + 0.5 - 6; /* Same as the inner rectangle's width, minus 1 pixel of padding on each side */
if (available_w < ink_extent.width)
factor = available_w / ink_extent.width;
else
factor = 1.0;
cairo_move_to (cr,
x + ((w * scale + 0.5) - factor * log_extent.width) / 2,
y + ((h * scale + 0.5) - factor * log_extent.height) / 2);
cairo_scale (cr, factor, factor);
if (gsd_rr_output_info_is_active (output))
cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
else
cairo_set_source_rgb (cr, 1.0, 1.0, 1.0);
pango_cairo_show_layout (cr, layout);
g_object_unref (layout);
cairo_restore (cr);
/* Only display a launcher on all or primary monitor */
if (gsd_rr_output_info_is_active (output) && (unity_launcher_on_all_monitors (self->priv->unity_settings) || gsd_rr_output_info_get_primary (output)))
{
cairo_rectangle (cr, x, y, 10, h * scale + 0.5);
cairo_set_source_rgb (cr, 0, 0, 0);
foo_scroll_area_add_input_from_fill (FOO_SCROLL_AREA (self->priv->area),
cr,
(FooScrollAreaEventFunc) on_top_bar_event,
self);
cairo_fill (cr);
cairo_set_source_rgb (cr, 0.25, 0.25, 0.25);
cairo_rectangle (cr, x + 1, y + 6, 8, 8);
cairo_rectangle (cr, x + 1, y + 16, 8, 8);
cairo_rectangle (cr, x + 1, y + 26, 8, 8);
cairo_rectangle (cr, x + 1, y + 36, 8, 8);
cairo_rectangle (cr, x + 1, y + h * scale + 0.5 - 10, 8, 8);
cairo_fill (cr);
}
cairo_restore (cr);
}
static void
on_area_paint (FooScrollArea *area,
cairo_t *cr,
gpointer data)
{
CcDisplayPanel *self = data;
GList *connected_outputs = NULL;
GList *list;
paint_background (area, cr);
if (!self->priv->current_configuration)
return;
connected_outputs = list_connected_outputs (self, NULL, NULL);
for (list = connected_outputs; list != NULL; list = list->next)
{
paint_output (self, cr, g_list_position (connected_outputs, list));
if (gsd_rr_config_get_clone (self->priv->current_configuration))
break;
}
}
static void
make_text_combo (GtkWidget *widget, int sort_column)
{
GtkComboBox *box = GTK_COMBO_BOX (widget);
GtkListStore *store = gtk_list_store_new (
NUM_COLS,
G_TYPE_STRING, /* Text */
G_TYPE_INT, /* Width */
G_TYPE_INT, /* Height */
G_TYPE_INT, /* Frequency */
G_TYPE_INT, /* Width * Height */
G_TYPE_INT); /* Rotation */
GtkCellRenderer *cell;
gtk_cell_layout_clear (GTK_CELL_LAYOUT (widget));
gtk_combo_box_set_model (box, GTK_TREE_MODEL (store));
cell = gtk_cell_renderer_text_new ();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (box), cell, TRUE);
gtk_cell_layout_set_attributes (GTK_CELL_LAYOUT (box), cell,
"text", 0,
NULL);
if (sort_column != -1)
{
gtk_tree_sortable_set_sort_column_id (GTK_TREE_SORTABLE (store),
sort_column,
GTK_SORT_DESCENDING);
}
}
static void
compute_virtual_size_for_configuration (GsdRRConfig *config, int *ret_width, int *ret_height)
{
int i;
int width, height;
int output_x, output_y, output_width, output_height;
GsdRROutputInfo **outputs;
width = height = 0;
outputs = gsd_rr_config_get_outputs (config);
for (i = 0; outputs[i] != NULL; i++)
{
if (gsd_rr_output_info_is_active (outputs[i]))
{
gsd_rr_output_info_get_geometry (outputs[i], &output_x, &output_y, &output_width, &output_height);
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 (CcDisplayPanel *self)
{
int req_width, req_height;
int min_width, max_width;
int min_height, max_height;
compute_virtual_size_for_configuration (self->priv->current_configuration, &req_width, &req_height);
gsd_rr_screen_get_ranges (self->priv->screen, &min_width, &max_width, &min_height, &max_height);
#if 0
g_debug ("X Server supports:");
g_debug ("min_width = %d, max_width = %d", min_width, max_width);
g_debug ("min_height = %d, max_height = %d", min_height, max_height);
g_debug ("Requesting size of %dx%d", req_width, req_height);
#endif
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 */
#if 0
g_debug ("Your X server needs a larger Virtual size!");
#endif
}
}
static void
begin_version2_apply_configuration (CcDisplayPanel *self, GdkWindow *parent_window, guint32 timestamp)
{
XID parent_window_xid;
GError *error = NULL;
parent_window_xid = GDK_WINDOW_XID (parent_window);
self->priv->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION,
G_DBUS_PROXY_FLAGS_NONE,
NULL,
"org.gnome.SettingsDaemon",
"/org/gnome/SettingsDaemon/XRANDR",
"org.gnome.SettingsDaemon.XRANDR_2",
NULL,
&error);
if (self->priv->proxy == NULL) {
error_message (self, _("Failed to apply configuration: %s"), error->message);
g_error_free (error);
return;
}
g_dbus_proxy_call (self->priv->proxy,
"ApplyConfiguration",
g_variant_new ("(xx)", (gint64) parent_window_xid, (gint64) timestamp),
G_DBUS_CALL_FLAGS_NONE,
-1,
NULL,
apply_configuration_returned_cb,
self);
}
static void
ensure_current_configuration_is_saved (void)
{
GsdRRScreen *rr_screen;
GsdRRConfig *rr_config;
/* Normally, gsd_rr_config_save() creates a backup file based on the
* old monitors.xml. However, if *that* file didn't exist, there is
* nothing from which to create a backup. So, here we'll save the
* current/unchanged configuration and then let our caller call
* gsd_rr_config_save() again with the new/changed configuration, so
* that there *will* be a backup file in the end.
*/
rr_screen = gsd_rr_screen_new (gdk_screen_get_default (), NULL); /* NULL-GError */
if (!rr_screen)
return;
rr_config = gsd_rr_config_new_current (rr_screen, NULL);
gsd_rr_config_ensure_primary (rr_config);
gsd_rr_config_save (rr_config, NULL); /* NULL-GError */
g_object_unref (rr_config);
g_object_unref (rr_screen);
}
static void
apply_configuration_returned_cb (GObject *proxy,
GAsyncResult *res,
gpointer data)
{
CcDisplayPanel *self = data;
GVariant *result;
GError *error = NULL;
result = g_dbus_proxy_call_finish (G_DBUS_PROXY (proxy), res, &error);
if (error)
error_message (self, _("Failed to apply configuration: %s"), error->message);
g_clear_error (&error);
if (result)
g_variant_unref (result);
g_object_unref (self->priv->proxy);
self->priv->proxy = NULL;
gtk_widget_set_sensitive (self->priv->panel, TRUE);
}
static gboolean
sanitize_and_save_configuration (CcDisplayPanel *self)
{
GError *error;
gsd_rr_config_sanitize (self->priv->current_configuration);
gsd_rr_config_ensure_primary (self->priv->current_configuration);
check_required_virtual_size (self);
foo_scroll_area_invalidate (FOO_SCROLL_AREA (self->priv->area));
ensure_current_configuration_is_saved ();
error = NULL;
if (!gsd_rr_config_save (self->priv->current_configuration, &error))
{
error_message (self, _("Could not save the monitor configuration"), error->message);
g_error_free (error);
return FALSE;
}
return TRUE;
}
static void
apply (CcDisplayPanel *self)
{
GdkWindow *window;
self->priv->apply_button_clicked_timestamp = gtk_get_current_event_time ();
if (!sanitize_and_save_configuration (self))
return;
g_assert (self->priv->proxy == NULL);
gtk_widget_set_sensitive (self->priv->panel, FALSE);
window = gtk_widget_get_window (gtk_widget_get_toplevel (self->priv->panel));
begin_version2_apply_configuration (self, window,
self->priv->apply_button_clicked_timestamp);
}
#if 0
/* Returns whether the graphics driver doesn't advertise RANDR 1.2 features, and just 1.0 */
static gboolean
driver_is_randr_10 (GsdRRConfig *config)
{
/* In the Xorg code, see xserver/randr/rrinfo.c:RRScanOldConfig(). It gets
* called when the graphics driver doesn't support RANDR 1.2 yet, just 1.0.
* In that case, the X server's base code (which supports RANDR 1.2) will
* simulate having a single output called "default". For drivers that *do*
* support RANDR 1.2, the separate outputs will be named differently, we
* hope.
*
* This heuristic is courtesy of Dirk Mueller
*
* FIXME: however, we don't even check for XRRQueryVersion() returning 1.2, neither
* here nor in gnome-desktop/libgnomedesktop*.c. Do we need to check for that,
* or is gsd_rr_screen_new()'s return value sufficient?
*/
return (count_all_outputs (config) == 1 && strcmp (gsd_rr_output_info_get_name (gsd_rr_config_get_outputs (config)[0]), "default") == 0);
}
#endif
static void
on_detect_displays (GtkWidget *widget, gpointer data)
{
CcDisplayPanel *self = data;
GError *error;
error = NULL;
if (!gsd_rr_screen_refresh (self->priv->screen, &error)) {
if (error) {
error_message (self, _("Could not detect displays"), error->message);
g_error_free (error);
}
}
}
static GsdRROutputInfo *
get_nearest_output (GsdRRConfig *configuration, int x, int y)
{
int i;
int nearest_index;
int nearest_dist;
GsdRROutputInfo **outputs;
nearest_index = -1;
nearest_dist = G_MAXINT;
outputs = gsd_rr_config_get_outputs (configuration);
for (i = 0; outputs[i] != NULL; i++)
{
int dist_x, dist_y;
int output_x, output_y, output_width, output_height;
if (!(gsd_rr_output_info_is_connected (outputs[i]) && gsd_rr_output_info_is_active (outputs[i])))
continue;
gsd_rr_output_info_get_geometry (outputs[i], &output_x, &output_y, &output_width, &output_height);
if (x < output_x)
dist_x = output_x - x;
else if (x >= output_x + output_width)
dist_x = x - (output_x + output_width) + 1;
else
dist_x = 0;
if (y < output_y)
dist_y = output_y - y;
else if (y >= output_y + output_height)
dist_y = y - (output_y + output_height) + 1;
else
dist_y = 0;
if (MIN (dist_x, dist_y) < nearest_dist)
{
nearest_dist = MIN (dist_x, dist_y);
nearest_index = i;
}
}
if (nearest_index != -1)
return outputs[nearest_index];
else
return NULL;
}
/* Gets the output that contains the largest intersection with the window.
* Logic stolen from gdk_screen_get_monitor_at_window().
*/
static GsdRROutputInfo *
get_output_for_window (GsdRRConfig *configuration, GdkWindow *window)
{
GdkRectangle win_rect;
int i;
int largest_area;
int largest_index;
GsdRROutputInfo **outputs;
gdk_window_get_geometry (window, &win_rect.x, &win_rect.y, &win_rect.width, &win_rect.height);
gdk_window_get_origin (window, &win_rect.x, &win_rect.y);
largest_area = 0;
largest_index = -1;
outputs = gsd_rr_config_get_outputs (configuration);
for (i = 0; outputs[i] != NULL; i++)
{
GdkRectangle output_rect, intersection;
gsd_rr_output_info_get_geometry (outputs[i], &output_rect.x, &output_rect.y, &output_rect.width, &output_rect.height);
if (gsd_rr_output_info_is_connected (outputs[i]) && gdk_rectangle_intersect (&win_rect, &output_rect, &intersection))
{
int area;
area = intersection.width * intersection.height;
if (area > largest_area)
{
largest_area = area;
largest_index = i;
}
}
}
if (largest_index != -1)
return outputs[largest_index];
else
return get_nearest_output (configuration,
win_rect.x + win_rect.width / 2,
win_rect.y + win_rect.height / 2);
}
static void
dialog_toplevel_focus_changed (GtkWindow *window,
GParamSpec *pspec,
CcDisplayPanel *self)
{
if (self->priv->labeler == NULL)
return;
if (gtk_window_has_toplevel_focus (window))
cc_rr_labeler_show (self->priv->labeler);
else
cc_rr_labeler_hide (self->priv->labeler);
}
static void
on_toplevel_realized (GtkWidget *widget,
CcDisplayPanel *self)
{
self->priv->current_output = get_output_for_window (self->priv->current_configuration,
gtk_widget_get_window (widget));
rebuild_gui (self);
}
/* We select the current output, i.e. select the one being edited, based on
* which output is showing the configuration dialog.
*/
static void
select_current_output_from_dialog_position (CcDisplayPanel *self)
{
GtkWidget *toplevel;
toplevel = gtk_widget_get_toplevel (self->priv->panel);
if (gtk_widget_get_realized (toplevel)) {
self->priv->current_output = get_output_for_window (self->priv->current_configuration,
gtk_widget_get_window (toplevel));
rebuild_gui (self);
} else {
g_signal_connect (toplevel, "realize", G_CALLBACK (on_toplevel_realized), self);
self->priv->current_output = NULL;
}
}
/* This is a GtkWidget::map-event handler. We wait for the display-properties
* dialog to be mapped, and then we select the output which corresponds to the
* monitor on which the dialog is being shown.
*/
static gboolean
dialog_map_event_cb (GtkWidget *widget, GdkEventAny *event, gpointer data)
{
CcDisplayPanel *self = data;
select_current_output_from_dialog_position (self);
return FALSE;
}
static void
stickyedge_widget_refresh (GtkSwitch *switcher, GSettings *settings)
{
gboolean stickyedge_enabled = g_settings_get_boolean (settings, UNITY_STICKY_EDGE_KEY);
gtk_switch_set_active (switcher, stickyedge_enabled);
}
static void
ext_stickyedge_changed_callback (GSettings* settings,
guint key,
gpointer user_data)
{
stickyedge_widget_refresh (GTK_SWITCH (user_data), settings);
}
static void
on_stickyedge_changed (GtkSwitch *switcher, GParamSpec *pspec, gpointer user_data)
{
CcDisplayPanel *self = CC_DISPLAY_PANEL (user_data);
gboolean enabled = gtk_switch_get_active (GTK_SWITCH (switcher));
/* 3d */
g_settings_set_boolean (self->priv->unity_settings, UNITY_STICKY_EDGE_KEY, enabled);
/* 2d */
if (self->priv->unity2d_settings_main)
g_settings_set_boolean (self->priv->unity2d_settings_main, "sticky-edges", enabled);
}
static gboolean
unity_launcher_on_all_monitors (GSettings *settings)
{
gint value = g_settings_get_int (settings, UNITY_LAUNCHER_ALL_MONITORS_KEY);
return (value == 0);
}
static GdkPixbuf*
get_monitor_pixbuf (CcDisplayPanel *self, GsdRROutputInfo *output)
{
GdkRGBA color;
cairo_surface_t *cairo_surface;
cairo_t *cr;
int monitor_width = 30;
int monitor_height = 15;
cc_rr_labeler_get_rgba_for_output (self->priv->labeler, output, &color);
cairo_surface = cairo_image_surface_create (CAIRO_FORMAT_RGB24, monitor_width, monitor_height);
cr = cairo_create (cairo_surface);
cairo_surface_destroy (cairo_surface);
cairo_set_operator (cr, CAIRO_OPERATOR_CLEAR);
cairo_paint (cr);
cairo_set_operator (cr, CAIRO_OPERATOR_OVER);
cairo_set_source_rgb (cr, color.red, color.green, color.blue);
cairo_rectangle (cr, 0.5, 0.5, monitor_width - 1, monitor_height - 1);
cairo_fill (cr);
cairo_set_line_width (cr, 1);
cairo_set_source_rgba (cr, 0, 0, 0, 1.0);
cairo_rectangle (cr, 0.5, 0.5, monitor_width - 1, monitor_height - 1);
cairo_stroke (cr);
return gdk_pixbuf_get_from_surface (cairo_get_target (cr), 0, 0, monitor_width, monitor_height);
}
static void
refresh_unity_launcher_placement (CcDisplayPanel *self)
{
GtkWidget *launcher_placement_combo = WID ("launcher_placement_combo");
GtkListStore *liststore;
GtkTreeIter iter;
GList *connected_outputs = NULL;
GList *list;
gboolean launcher_on_all_monitors = unity_launcher_on_all_monitors (self->priv->unity_settings);
gint index_of_primary_screen = 0;
gint i;
liststore = (GtkListStore *) gtk_builder_get_object (self->priv->builder, "available_launcher_placement_store");
gtk_list_store_clear (liststore);
connected_outputs = list_connected_outputs (self, NULL, NULL);
for (list = connected_outputs, i = 0; list != NULL; list = list->next)
{
char *monitor_name;
GdkPixbuf *monitor_pixbuf;
GsdRROutputInfo *output = list->data;
if (!gsd_rr_output_info_is_active (output))
continue;
gtk_list_store_append (liststore, &iter);
monitor_name = g_strdup (gsd_rr_output_info_get_display_name (output));
monitor_pixbuf = get_monitor_pixbuf (self, output);
gtk_list_store_set (liststore, &iter, 0, monitor_pixbuf, 1, monitor_name, -1);
/* select it if primary and only one launcher */
if (gsd_rr_output_info_get_primary (output) && (!launcher_on_all_monitors))
index_of_primary_screen = i;
i++;
g_object_unref (monitor_pixbuf);
g_free (monitor_name);
}
// FIXME: check autosort?
gtk_list_store_append (liststore, &iter);
gtk_list_store_set (liststore, &iter, 0, NULL, 1, _("All displays"), -1);
if (launcher_on_all_monitors)
index_of_primary_screen = i;
gtk_combo_box_set_active (GTK_COMBO_BOX (launcher_placement_combo), index_of_primary_screen);
}
static void
refresh_unity_monitor_scale (CcDisplayPanel *self)
{
GtkWidget *ui_scale_monitor_combo = WID ("ui_scale_monitor_combo");
GtkListStore *liststore;
GtkTreeIter iter;
GList *connected_outputs = NULL;
GList *list;
gchar *target_monitor = g_settings_get_string (self->priv->unity_ui_settings, UNITY_UI_SCALE_FACTOR_MONITOR);
gint target_monitor_idx = -1;
gint i;
liststore = (GtkListStore *) gtk_builder_get_object (self->priv->builder, "available_ui_scale_monitor_store");
gtk_list_store_clear (liststore);
connected_outputs = list_connected_outputs (self, NULL, NULL);
for (list = connected_outputs, i = 0; list != NULL; list = list->next)
{
gchar *monitor_name;
GdkPixbuf *monitor_pixbuf;
GsdRROutputInfo *output = list->data;
if (!gsd_rr_output_info_is_active (output))
continue;
gtk_list_store_append (liststore, &iter);
monitor_name = g_strdup (gsd_rr_output_info_get_display_name (output));
monitor_pixbuf = get_monitor_pixbuf (self, output);
gtk_list_store_set (liststore, &iter, 0, monitor_pixbuf, 1, monitor_name, -1);
/* select it if primary and only one launcher */
if (g_strcmp0 (gsd_rr_output_info_get_name (output), target_monitor) == 0)
target_monitor_idx = i;
i++;
g_object_unref (monitor_pixbuf);
g_free (monitor_name);
}
gtk_list_store_append (liststore, &iter);
gtk_list_store_set (liststore, &iter, 0, NULL, 1, _("Display with largest controls"), -1);
gint max_idx = i++;
gtk_list_store_append (liststore, &iter);
gtk_list_store_set (liststore, &iter, 0, NULL, 1, _("Display with smallest controls"), -1);
gint min_idx = i++;
if (target_monitor_idx < 0)
{
gboolean fallback_max_scale = g_settings_get_boolean (self->priv->unity_ui_settings, UNITY_UI_SCALE_FALLBACK_TO_MAX);
target_monitor_idx = fallback_max_scale ? max_idx : min_idx;
}
gtk_combo_box_set_active (GTK_COMBO_BOX (ui_scale_monitor_combo), target_monitor_idx);
g_free (target_monitor);
}
static gboolean
switcher_set_to_launcher_on_all_monitors (CcDisplayPanel *self)
{
GtkComboBox *combo = GTK_COMBO_BOX (WID ("launcher_placement_combo"));
gint active = gtk_combo_box_get_active (combo);
gint number_items = gtk_tree_model_iter_n_children (gtk_combo_box_get_model (combo),
NULL);
return (active == number_items - 1);
}
static void
ext_launcher_placement_changed_callback (GSettings* settings,
guint key,
gpointer user_data)
{
// add some crazyness as 2d/3d are not using the same keys
CcDisplayPanel *self = CC_DISPLAY_PANEL (user_data);
gint launcher_unity_value = 0;
// two options support: all monitors (0)i or just primary desktop (hence set to 1, not any other number)
if (! switcher_set_to_launcher_on_all_monitors (self))
launcher_unity_value = 1;
if (g_settings_get_int (settings, UNITY_LAUNCHER_ALL_MONITORS_KEY) != launcher_unity_value)
refresh_unity_launcher_placement (self);
}
static void
on_launcher_placement_combo_changed (GtkComboBox *combo, CcDisplayPanel *self)
{
gint active = gtk_combo_box_get_active (combo);
gint i;
gint index_on_combo = 0;
if (active < 0)
return;
gint value = 0;
gboolean on_all_monitors = switcher_set_to_launcher_on_all_monitors (self);
if (!on_all_monitors) {
value = 1;
// set the primary output if needed
GsdRROutputInfo **outputs = gsd_rr_config_get_outputs (self->priv->current_configuration);
for (i = 0; outputs[i] != NULL; ++i)
{
GsdRROutputInfo *output = outputs[i];
if (!gsd_rr_output_info_is_active (output))
continue;
if ((active == index_on_combo) && !gsd_rr_output_info_get_primary (output))
{
set_primary_output (self, output);
break;
}
index_on_combo++;
}
}
/* 3d */
if (self->priv->unity_settings)
g_settings_set_int (self->priv->unity_settings, UNITY_LAUNCHER_ALL_MONITORS_KEY, value);
/* 2d */
if (self->priv->unity2d_settings_launcher)
g_settings_set_boolean (self->priv->unity2d_settings_launcher, "only-one-launcher", !on_all_monitors);
}
static void
on_ui_scale_monitor_combo_setting_changed (GSettings* settings,
guint key,
CcDisplayPanel *self)
{
refresh_unity_monitor_scale (self);
}
static void
on_ui_scale_monitor_combo_changed (GtkComboBox *combo, CcDisplayPanel *self)
{
gint active = gtk_combo_box_get_active (combo);
gint i;
gint index_on_combo = 0;
gchar *scale_monitor = NULL;
if (active < 0)
return;
GsdRROutputInfo **outputs = gsd_rr_config_get_outputs (self->priv->current_configuration);
for (i = 0; outputs[i] != NULL; ++i)
{
GsdRROutputInfo *output = outputs[i];
if (!gsd_rr_output_info_is_active (output))
continue;
if (active == index_on_combo)
{
scale_monitor = g_strdup (gsd_rr_output_info_get_name (output));
break;
}
index_on_combo++;
}
if (!scale_monitor)
{
scale_monitor = g_strdup("");
if (active >= index_on_combo)
{
gboolean use_max_scaled_monitor = (active == index_on_combo);
gboolean fallback_setting = g_settings_get_boolean (self->priv->unity_ui_settings, UNITY_UI_SCALE_FALLBACK_TO_MAX);
if (fallback_setting != use_max_scaled_monitor)
g_settings_set_boolean (self->priv->unity_ui_settings, UNITY_UI_SCALE_FALLBACK_TO_MAX, use_max_scaled_monitor);
}
}
gchar *current_setting = g_settings_get_string (self->priv->unity_ui_settings, UNITY_UI_SCALE_FACTOR_MONITOR);
if (g_strcmp0 (current_setting, scale_monitor) != 0)
g_settings_set_string (self->priv->unity_ui_settings, UNITY_UI_SCALE_FACTOR_MONITOR, scale_monitor);
g_free (current_setting);
g_free (scale_monitor);
}
static void
setup_unity_settings (CcDisplayPanel *self)
{
GSettingsSchema *schema;
/* Only use the unity-2d schema if it's installed */
schema = g_settings_schema_source_lookup (g_settings_schema_source_get_default (), UNITY2D_GSETTINGS_MAIN, TRUE);
if (schema)
{
self->priv->unity2d_settings_main = g_settings_new (UNITY2D_GSETTINGS_MAIN);
self->priv->unity2d_settings_launcher = g_settings_new (UNITY2D_GSETTINGS_LAUNCHER);
g_settings_schema_unref (schema);
}
schema = g_settings_schema_source_lookup (g_settings_schema_source_get_default (), UNITY_GSETTINGS_SCHEMA, TRUE);
if (schema)
{
self->priv->unity_settings = g_settings_new_with_path (UNITY_GSETTINGS_SCHEMA, UNITY_GSETTINGS_PATH);
g_settings_schema_unref (schema);
}
schema = g_settings_schema_source_lookup (g_settings_schema_source_get_default (), UNITY_UI_GSETTINGS_SCHEMA, TRUE);
if (schema)
{
self->priv->unity_ui_settings = g_settings_new (UNITY_UI_GSETTINGS_SCHEMA);
g_settings_schema_unref (schema);
}
if (!self->priv->unity_settings || !self->priv->unity_ui_settings)
return;
GtkWidget *sticky_edge_switch = WID ("stickyedge_switch");
g_signal_connect (sticky_edge_switch, "notify::active",
G_CALLBACK (on_stickyedge_changed), self);
g_signal_connect (self->priv->unity_settings, "changed::" UNITY_STICKY_EDGE_KEY,
G_CALLBACK (ext_stickyedge_changed_callback), sticky_edge_switch);
stickyedge_widget_refresh (GTK_SWITCH (sticky_edge_switch), self->priv->unity_settings);
g_signal_connect (G_OBJECT (WID ("launcher_placement_combo")), "changed",
G_CALLBACK (on_launcher_placement_combo_changed), self);
g_signal_connect (self->priv->unity_settings, "changed::" UNITY_LAUNCHER_ALL_MONITORS_KEY,
G_CALLBACK (ext_launcher_placement_changed_callback), self);
g_signal_connect (G_OBJECT (WID ("ui_scale_monitor_combo")), "changed",
G_CALLBACK (on_ui_scale_monitor_combo_changed), self);
g_signal_connect (self->priv->unity_ui_settings, "changed::" UNITY_UI_SCALE_FACTOR_MONITOR,
G_CALLBACK (on_ui_scale_monitor_combo_setting_changed), self);
g_signal_connect (self->priv->unity_ui_settings, "changed::" UNITY_UI_SCALE_FALLBACK_TO_MAX,
G_CALLBACK (on_ui_scale_monitor_combo_setting_changed), self);
}
static void
cc_display_panel_init (CcDisplayPanel *self)
{
}
static GObject *
cc_display_panel_constructor (GType gtype,
guint n_properties,
GObjectConstructParam *properties)
{
GtkBuilder *builder;
GtkWidget *align;
GError *error;
GObject *obj;
CcDisplayPanel *self;
CcShell *shell;
GtkWidget *toplevel;
gchar *objects[] = {"display-panel", "available_launcher_placement_store",
"available_ui_scale_monitor_store", NULL};
obj = G_OBJECT_CLASS (cc_display_panel_parent_class)->constructor (gtype, n_properties, properties);
self = CC_DISPLAY_PANEL (obj);
self->priv = DISPLAY_PANEL_PRIVATE (self);
error = NULL;
self->priv->builder = builder = gtk_builder_new ();
if (!gtk_builder_add_objects_from_file (builder, UIDIR "/display-capplet.ui", objects, &error))
{
g_warning ("Could not parse UI definition: %s", error->message);
g_error_free (error);
g_object_unref (builder);
return obj;
}
self->priv->screen = gsd_rr_screen_new (gdk_screen_get_default (), &error);
g_signal_connect (self->priv->screen, "changed", G_CALLBACK (on_screen_changed), self);
if (!self->priv->screen)
{
error_message (NULL, _("Could not get screen information"), error->message);
g_error_free (error);
g_object_unref (builder);
return obj;
}
self->priv->clock_settings = g_settings_new (CLOCK_SCHEMA);
self->priv->desktop_settings = g_settings_new (DESKTOP_GSETTINGS_SCHEMA);
shell = cc_panel_get_shell (CC_PANEL (self));
toplevel = cc_shell_get_toplevel (shell);
self->priv->focus_id = g_signal_connect (toplevel, "notify::has-toplevel-focus",
G_CALLBACK (dialog_toplevel_focus_changed), self);
self->priv->panel = WID ("display-panel");
g_signal_connect_after (self->priv->panel, "show",
G_CALLBACK (dialog_map_event_cb), self);
self->priv->current_monitor_event_box = WID ("current_monitor_event_box");
self->priv->current_monitor_label = WID ("current_monitor_label");
self->priv->monitor_switch = WID ("monitor_switch");
g_signal_connect (self->priv->monitor_switch, "notify::active",
G_CALLBACK (monitor_switch_active_cb), self);
self->priv->resolution_combo = WID ("resolution_combo");
g_signal_connect (self->priv->resolution_combo, "changed",
G_CALLBACK (on_resolution_changed), self);
self->priv->rotation_combo = WID ("rotation_combo");
g_signal_connect (self->priv->rotation_combo, "changed",
G_CALLBACK (on_rotation_changed), self);
self->priv->ui_scale = WID ("ui_scale");
g_signal_connect (self->priv->ui_scale, "button-press-event",
G_CALLBACK (on_ui_scale_button_press), self);
g_signal_connect (self->priv->ui_scale, "button-release-event",
G_CALLBACK (on_ui_scale_button_release), self);
g_signal_connect (self->priv->ui_scale, "format-value",
G_CALLBACK (on_ui_scale_format_value), self);
self->priv->clone_checkbox = WID ("clone_checkbox");
g_signal_connect (self->priv->clone_checkbox, "toggled",
G_CALLBACK (on_clone_changed), self);
self->priv->clone_label = WID ("clone_resolution_warning_label");
g_signal_connect (WID ("detect_displays_button"),
"clicked", G_CALLBACK (on_detect_displays), self);
make_text_combo (self->priv->resolution_combo, 4);
make_text_combo (self->priv->rotation_combo, -1);
/* Scroll Area */
self->priv->area = (GtkWidget *)foo_scroll_area_new ();
g_object_set_data (G_OBJECT (self->priv->area), "panel", self);
set_monitors_tooltip (self, FALSE);
/* FIXME: this should be computed dynamically */
foo_scroll_area_set_min_size (FOO_SCROLL_AREA (self->priv->area), 0, 200);
gtk_widget_show (self->priv->area);
g_signal_connect (self->priv->area, "paint",
G_CALLBACK (on_area_paint), self);
g_signal_connect (self->priv->area, "viewport_changed",
G_CALLBACK (on_viewport_changed), self);
align = WID ("align");
gtk_container_add (GTK_CONTAINER (align), self->priv->area);
g_signal_connect_swapped (WID ("apply_button"),
"clicked", G_CALLBACK (apply), self);
/* Unity settings */
setup_unity_settings (self);
gtk_widget_show (self->priv->panel);
gtk_container_add (GTK_CONTAINER (self), self->priv->panel);
on_screen_changed (self->priv->screen, self);
return obj;
}
void
cc_display_panel_register (GIOModule *module)
{
cc_display_panel_register_type (G_TYPE_MODULE (module));
g_io_extension_point_implement (CC_SHELL_PANEL_EXTENSION_POINT,
CC_TYPE_DISPLAY_PANEL,
"display", 0);
}
./panels/display/cc-display-panel.h 0000644 0000041 0000041 00000003740 13241553602 017475 0 ustar www-data www-data /*
* Copyright (C) 2010 Intel, Inc
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Author: Thomas Wood
*
*/
#ifndef _CC_DISPLAY_PANEL_H
#define _CC_DISPLAY_PANEL_H
#include
G_BEGIN_DECLS
#define CC_TYPE_DISPLAY_PANEL cc_display_panel_get_type()
#define CC_DISPLAY_PANEL(obj) \
(G_TYPE_CHECK_INSTANCE_CAST ((obj), \
CC_TYPE_DISPLAY_PANEL, CcDisplayPanel))
#define CC_DISPLAY_PANEL_CLASS(klass) \
(G_TYPE_CHECK_CLASS_CAST ((klass), \
CC_TYPE_DISPLAY_PANEL, CcDisplayPanelClass))
#define CC_IS_DISPLAY_PANEL(obj) \
(G_TYPE_CHECK_INSTANCE_TYPE ((obj), \
CC_TYPE_DISPLAY_PANEL))
#define CC_IS_DISPLAY_PANEL_CLASS(klass) \
(G_TYPE_CHECK_CLASS_TYPE ((klass), \
CC_TYPE_DISPLAY_PANEL))
#define CC_DISPLAY_PANEL_GET_CLASS(obj) \
(G_TYPE_INSTANCE_GET_CLASS ((obj), \
CC_TYPE_DISPLAY_PANEL, CcDisplayPanelClass))
typedef struct _CcDisplayPanel CcDisplayPanel;
typedef struct _CcDisplayPanelClass CcDisplayPanelClass;
typedef struct _CcDisplayPanelPrivate CcDisplayPanelPrivate;
struct _CcDisplayPanel
{
CcPanel parent;
CcDisplayPanelPrivate *priv;
};
struct _CcDisplayPanelClass
{
CcPanelClass parent_class;
};
GType cc_display_panel_get_type (void) G_GNUC_CONST;
void cc_display_panel_register (GIOModule *module);
G_END_DECLS
#endif /* _CC_DISPLAY_PANEL_H */
./panels/display/cc-rr-labeler.h 0000644 0000041 0000041 00000004464 13241553602 016766 0 ustar www-data www-data /* gnome-rr-labeler.h - Utility to label monitors to identify them
* while they are being configured.
*
* Copyright 2008, Novell, Inc.
*
* This file is part of the Gnome Library.
*
* The Gnome Library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* The Gnome 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with the Gnome Library; see the file COPYING.LIB. If not,
* write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* Author: Federico Mena-Quintero
*/
#ifndef CC_RR_LABELER_H
#define CC_RR_LABELER_H
#include
#define GNOME_TYPE_RR_LABELER (cc_rr_labeler_get_type ())
#define CC_RR_LABELER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), GNOME_TYPE_RR_LABELER, CcRRLabeler))
#define CC_RR_LABELER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GNOME_TYPE_RR_LABELER, CcRRLabelerClass))
#define GNOME_IS_RR_LABELER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GNOME_TYPE_RR_LABELER))
#define GNOME_IS_RR_LABELER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GNOME_TYPE_RR_LABELER))
#define CC_RR_LABELER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GNOME_TYPE_RR_LABELER, CcRRLabelerClass))
typedef struct _CcRRLabeler CcRRLabeler;
typedef struct _CcRRLabelerClass CcRRLabelerClass;
typedef struct _CcRRLabelerPrivate CcRRLabelerPrivate;
struct _CcRRLabeler {
GObject parent;
/*< private >*/
CcRRLabelerPrivate *priv;
};
struct _CcRRLabelerClass {
GObjectClass parent_class;
};
GType cc_rr_labeler_get_type (void);
CcRRLabeler *cc_rr_labeler_new (GsdRRConfig *config);
void cc_rr_labeler_show (CcRRLabeler *labeler);
void cc_rr_labeler_hide (CcRRLabeler *labeler);
void cc_rr_labeler_get_rgba_for_output (CcRRLabeler *labeler, GsdRROutputInfo *output, GdkRGBA *rgba_out);
#endif
./panels/display/icons/ 0000755 0000041 0000041 00000000000 13241553602 015306 5 ustar www-data www-data ./panels/display/icons/48x48/ 0000755 0000041 0000041 00000000000 13241553603 016106 5 ustar www-data www-data ./panels/display/icons/48x48/unity-display-panel.svg 0000644 0000041 0000041 00000015376 13241553602 022552 0 ustar www-data www-data
./panels/display/icons/24x24/ 0000755 0000041 0000041 00000000000 13241553603 016072 5 ustar www-data www-data ./panels/display/icons/24x24/unity-display-panel.svg 0000644 0000041 0000041 00000012057 13241553602 022527 0 ustar www-data www-data
./panels/display/cc-rr-labeler.c 0000644 0000041 0000041 00000040626 13241553602 016761 0 ustar www-data www-data /* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*-
*
* cc-rr-labeler.c - Utility to label monitors to identify them
* while they are being configured.
*
* Copyright 2008, Novell, Inc.
*
* This file is part of the Gnome Library.
*
* The Gnome Library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Library General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* The Gnome 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
* Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with the Gnome Library; see the file COPYING.LIB. If not,
* write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
* Boston, MA 02110-1301, USA.
*
* Author: Federico Mena-Quintero
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include "cc-rr-labeler.h"
struct _CcRRLabelerPrivate {
GsdRRConfig *config;
int num_outputs;
GdkRGBA *palette;
GtkWidget **windows;
GdkScreen *screen;
Atom workarea_atom;
};
enum {
PROP_0,
PROP_CONFIG,
PROP_LAST
};
G_DEFINE_TYPE (CcRRLabeler, cc_rr_labeler, G_TYPE_OBJECT);
static void cc_rr_labeler_finalize (GObject *object);
static void setup_from_config (CcRRLabeler *labeler);
static GdkFilterReturn
screen_xevent_filter (GdkXEvent *xevent,
GdkEvent *event,
CcRRLabeler *labeler)
{
XEvent *xev;
xev = (XEvent *) xevent;
if (xev->type == PropertyNotify &&
xev->xproperty.atom == labeler->priv->workarea_atom) {
/* update label positions */
if (labeler->priv->windows != NULL) {
cc_rr_labeler_hide (labeler);
cc_rr_labeler_show (labeler);
}
}
return GDK_FILTER_CONTINUE;
}
static void
cc_rr_labeler_init (CcRRLabeler *labeler)
{
GdkWindow *gdkwindow;
labeler->priv = G_TYPE_INSTANCE_GET_PRIVATE (labeler, GNOME_TYPE_RR_LABELER, CcRRLabelerPrivate);
labeler->priv->workarea_atom = XInternAtom (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()),
"_NET_WORKAREA",
True);
labeler->priv->screen = gdk_screen_get_default ();
/* code is not really designed to handle multiple screens so *shrug* */
gdkwindow = gdk_screen_get_root_window (labeler->priv->screen);
gdk_window_add_filter (gdkwindow, (GdkFilterFunc) screen_xevent_filter, labeler);
gdk_window_set_events (gdkwindow, gdk_window_get_events (gdkwindow) | GDK_PROPERTY_CHANGE_MASK);
}
static void
cc_rr_labeler_set_property (GObject *gobject, guint property_id, const GValue *value, GParamSpec *param_spec)
{
CcRRLabeler *self = CC_RR_LABELER (gobject);
switch (property_id) {
case PROP_CONFIG:
self->priv->config = GSD_RR_CONFIG (g_value_dup_object (value));
return;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (gobject, property_id, param_spec);
}
}
static GObject *
cc_rr_labeler_constructor (GType type, guint n_construct_properties, GObjectConstructParam *construct_properties)
{
CcRRLabeler *self = (CcRRLabeler*) G_OBJECT_CLASS (cc_rr_labeler_parent_class)->constructor (type, n_construct_properties, construct_properties);
setup_from_config (self);
return (GObject*) self;
}
static void
cc_rr_labeler_class_init (CcRRLabelerClass *klass)
{
GObjectClass *object_class;
g_type_class_add_private (klass, sizeof (CcRRLabelerPrivate));
object_class = (GObjectClass *) klass;
object_class->set_property = cc_rr_labeler_set_property;
object_class->finalize = cc_rr_labeler_finalize;
object_class->constructor = cc_rr_labeler_constructor;
g_object_class_install_property (object_class, PROP_CONFIG, g_param_spec_object ("config",
"Configuration",
"RandR configuration to label",
GSD_TYPE_RR_CONFIG,
G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY |
G_PARAM_STATIC_NICK | G_PARAM_STATIC_BLURB));
}
static void
cc_rr_labeler_finalize (GObject *object)
{
CcRRLabeler *labeler;
GdkWindow *gdkwindow;
labeler = CC_RR_LABELER (object);
gdkwindow = gdk_screen_get_root_window (labeler->priv->screen);
gdk_window_remove_filter (gdkwindow, (GdkFilterFunc) screen_xevent_filter, labeler);
if (labeler->priv->config != NULL) {
g_object_unref (labeler->priv->config);
}
if (labeler->priv->windows != NULL) {
cc_rr_labeler_hide (labeler);
g_free (labeler->priv->windows);
}
g_free (labeler->priv->palette);
G_OBJECT_CLASS (cc_rr_labeler_parent_class)->finalize (object);
}
static int
count_outputs (GsdRRConfig *config)
{
int i;
GsdRROutputInfo **outputs = gsd_rr_config_get_outputs (config);
for (i = 0; outputs[i] != NULL; i++)
;
return i;
}
static void
make_palette (CcRRLabeler *labeler)
{
/* The idea is that we go around an hue color wheel. We want to start
* at red, go around to green/etc. and stop at blue --- because magenta
* is evil. Eeeeek, no magenta, please!
*
* Purple would be nice, though. Remember that we are watered down
* (i.e. low saturation), so that would be like Like berries with cream.
* Mmmmm, berries.
*/
double start_hue;
double end_hue;
int i;
g_assert (labeler->priv->num_outputs > 0);
labeler->priv->palette = g_new (GdkRGBA, labeler->priv->num_outputs);
start_hue = 0.0; /* red */
end_hue = 2.0/3; /* blue */
for (i = 0; i < labeler->priv->num_outputs; i++) {
double h, s, v;
double r, g, b;
h = start_hue + (end_hue - start_hue) / labeler->priv->num_outputs * i;
s = 1.0 / 3;
v = 1.0;
gtk_hsv_to_rgb (h, s, v, &r, &g, &b);
labeler->priv->palette[i].red = r;
labeler->priv->palette[i].green = g;
labeler->priv->palette[i].blue = b;
labeler->priv->palette[i].alpha = 1.0;
}
}
static void
rounded_rectangle (cairo_t *cr,
gint x,
gint y,
gint width,
gint height,
gint x_radius,
gint y_radius)
{
gint x1, x2;
gint y1, y2;
gint xr1, xr2;
gint yr1, yr2;
x1 = x;
x2 = x1 + width;
y1 = y;
y2 = y1 + height;
x_radius = MIN (x_radius, width / 2.0);
y_radius = MIN (y_radius, width / 2.0);
xr1 = x_radius;
xr2 = x_radius / 2.0;
yr1 = y_radius;
yr2 = y_radius / 2.0;
cairo_move_to (cr, x1 + xr1, y1);
cairo_line_to (cr, x2 - xr1, y1);
cairo_curve_to (cr, x2 - xr2, y1, x2, y1 + yr2, x2, y1 + yr1);
cairo_line_to (cr, x2, y2 - yr1);
cairo_curve_to (cr, x2, y2 - yr2, x2 - xr2, y2, x2 - xr1, y2);
cairo_line_to (cr, x1 + xr1, y2);
cairo_curve_to (cr, x1 + xr2, y2, x1, y2 - yr2, x1, y2 - yr1);
cairo_line_to (cr, x1, y1 + yr1);
cairo_curve_to (cr, x1, y1 + yr2, x1 + xr2, y1, x1 + xr1, y1);
cairo_close_path (cr);
}
#define LABEL_WINDOW_EDGE_THICKNESS 2
#define LABEL_WINDOW_PADDING 12
/* Look for panel-corner in:
* http://git.gnome.org/browse/gnome-shell/tree/data/theme/gnome-shell.css
* to match the corner radius */
#define LABEL_CORNER_RADIUS 6 + LABEL_WINDOW_EDGE_THICKNESS
static void
label_draw_background_and_frame (GtkWidget *widget, cairo_t *cr, gboolean for_shape)
{
GdkRGBA shape_color = { 0, 0, 0, 1 };
GdkRGBA *rgba;
GtkAllocation allocation;
rgba = g_object_get_data (G_OBJECT (widget), "rgba");
gtk_widget_get_allocation (widget, &allocation);
cairo_save (cr);
cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
/* edge outline */
if (for_shape)
gdk_cairo_set_source_rgba (cr, &shape_color);
else
cairo_set_source_rgba (cr, 0, 0, 0, 0.5);
rounded_rectangle (cr,
LABEL_WINDOW_EDGE_THICKNESS / 2.0,
LABEL_WINDOW_EDGE_THICKNESS / 2.0,
allocation.width - LABEL_WINDOW_EDGE_THICKNESS,
allocation.height - LABEL_WINDOW_EDGE_THICKNESS,
LABEL_CORNER_RADIUS, LABEL_CORNER_RADIUS);
cairo_set_line_width (cr, LABEL_WINDOW_EDGE_THICKNESS);
cairo_stroke (cr);
/* fill */
if (for_shape) {
gdk_cairo_set_source_rgba (cr, &shape_color);
} else {
rgba->alpha = 0.75;
gdk_cairo_set_source_rgba (cr, rgba);
}
rounded_rectangle (cr,
LABEL_WINDOW_EDGE_THICKNESS,
LABEL_WINDOW_EDGE_THICKNESS,
allocation.width - LABEL_WINDOW_EDGE_THICKNESS * 2,
allocation.height - LABEL_WINDOW_EDGE_THICKNESS * 2,
LABEL_CORNER_RADIUS - LABEL_WINDOW_EDGE_THICKNESS / 2.0,
LABEL_CORNER_RADIUS - LABEL_WINDOW_EDGE_THICKNESS / 2.0);
cairo_fill (cr);
cairo_restore (cr);
}
static void
maybe_update_shape (GtkWidget *widget)
{
cairo_t *cr;
cairo_surface_t *surface;
cairo_region_t *region;
/* fallback to XShape only for non-composited clients */
if (gtk_widget_is_composited (widget)) {
gtk_widget_shape_combine_region (widget, NULL);
return;
}
surface = gdk_window_create_similar_surface (gtk_widget_get_window (widget),
CAIRO_CONTENT_COLOR_ALPHA,
gtk_widget_get_allocated_width (widget),
gtk_widget_get_allocated_height (widget));
cr = cairo_create (surface);
label_draw_background_and_frame (widget, cr, TRUE);
cairo_destroy (cr);
region = gdk_cairo_region_create_from_surface (surface);
gtk_widget_shape_combine_region (widget, region);
cairo_surface_destroy (surface);
cairo_region_destroy (region);
}
static gboolean
label_window_draw_event_cb (GtkWidget *widget, cairo_t *cr, gpointer data)
{
if (gtk_widget_is_composited (widget)) {
/* clear any content */
cairo_save (cr);
cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE);
cairo_set_source_rgba (cr, 0, 0, 0, 0);
cairo_paint (cr);
cairo_restore (cr);
}
maybe_update_shape (widget);
label_draw_background_and_frame (widget, cr, FALSE);
return FALSE;
}
static void
position_window (CcRRLabeler *labeler,
GtkWidget *window,
int x,
int y)
{
GdkRectangle workarea;
GdkRectangle monitor;
int monitor_num;
monitor_num = gdk_screen_get_monitor_at_point (labeler->priv->screen, x, y);
gdk_screen_get_monitor_workarea (labeler->priv->screen, monitor_num, &workarea);
gdk_screen_get_monitor_geometry (labeler->priv->screen,
monitor_num,
&monitor);
gdk_rectangle_intersect (&monitor, &workarea, &workarea);
gtk_window_move (GTK_WINDOW (window), workarea.x, workarea.y);
}
static void
label_window_realize_cb (GtkWidget *widget)
{
cairo_region_t *region;
/* make the whole window ignore events */
region = cairo_region_create ();
gtk_widget_input_shape_combine_region (widget, region);
cairo_region_destroy (region);
maybe_update_shape (widget);
}
static void
label_window_composited_changed_cb (GtkWidget *widget, CcRRLabeler *labeler)
{
if (gtk_widget_get_realized (widget))
maybe_update_shape (widget);
}
static GtkWidget *
create_label_window (CcRRLabeler *labeler, GsdRROutputInfo *output, GdkRGBA *rgba)
{
GtkWidget *window;
GtkWidget *widget;
char *str;
const char *display_name;
GdkRGBA black = { 0, 0, 0, 1.0 };
int x, y;
GdkScreen *screen;
GdkVisual *visual;
window = gtk_window_new (GTK_WINDOW_POPUP);
gtk_window_set_type_hint (GTK_WINDOW (window), GDK_WINDOW_TYPE_HINT_TOOLTIP);
gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
gtk_widget_set_app_paintable (window, TRUE);
screen = gtk_widget_get_screen (window);
visual = gdk_screen_get_rgba_visual (screen);
if (visual != NULL)
gtk_widget_set_visual (window, visual);
gtk_container_set_border_width (GTK_CONTAINER (window), LABEL_WINDOW_PADDING + LABEL_WINDOW_EDGE_THICKNESS);
/* This is semi-dangerous. The color is part of the labeler->palette
* array. Note that in cc_rr_labeler_finalize(), we are careful to
* free the palette only after we free the windows.
*/
g_object_set_data (G_OBJECT (window), "rgba", rgba);
g_signal_connect (window, "draw",
G_CALLBACK (label_window_draw_event_cb), labeler);
g_signal_connect (window, "realize",
G_CALLBACK (label_window_realize_cb), labeler);
g_signal_connect (window, "composited-changed",
G_CALLBACK (label_window_composited_changed_cb), labeler);
if (gsd_rr_config_get_clone (labeler->priv->config)) {
/* Keep this string in sync with gnome-control-center/capplets/display/xrandr-capplet.c:get_display_name() */
/* Translators: this is the feature where what you see on your
* laptop's screen is the same as your external projector.
* Here, "Mirrored" is being used as an adjective. For example,
* the Spanish translation could be "Pantallas en Espejo".
*/
display_name = _("Mirrored Displays");
} else
display_name = gsd_rr_output_info_get_display_name (output);
str = g_strdup_printf ("%s", display_name);
widget = gtk_label_new (NULL);
gtk_label_set_markup (GTK_LABEL (widget), str);
g_free (str);
/* Make the label explicitly black. We don't want it to follow the
* theme's colors, since the label is always shown against a light
* pastel background. See bgo#556050
*/
gtk_widget_override_color (widget,
gtk_widget_get_state_flags (widget),
&black);
gtk_container_add (GTK_CONTAINER (window), widget);
/* Should we center this at the top edge of the monitor, instead of using the upper-left corner? */
gsd_rr_output_info_get_geometry (output, &x, &y, NULL, NULL);
position_window (labeler, window, x, y);
gtk_widget_show_all (window);
return window;
}
static void
setup_from_config (CcRRLabeler *labeler)
{
labeler->priv->num_outputs = count_outputs (labeler->priv->config);
make_palette (labeler);
cc_rr_labeler_show (labeler);
}
/**
* cc_rr_labeler_new:
* @config: Configuration of the screens to label
*
* Create a GUI element that will display colored labels on each connected monitor.
* This is useful when users are required to identify which monitor is which, e.g. for
* for configuring multiple monitors.
* The labels will be shown by default, use cc_rr_labeler_hide to hide them.
*
* Returns: A new #CcRRLabeler
*/
CcRRLabeler *
cc_rr_labeler_new (GsdRRConfig *config)
{
g_return_val_if_fail (GSD_IS_RR_CONFIG (config), NULL);
return g_object_new (GNOME_TYPE_RR_LABELER, "config", config, NULL);
}
/**
* cc_rr_labeler_show:
* @labeler: A #CcRRLabeler
*
* Show the labels.
*/
void
cc_rr_labeler_show (CcRRLabeler *labeler)
{
int i;
gboolean created_window_for_clone;
GsdRROutputInfo **outputs;
g_return_if_fail (GNOME_IS_RR_LABELER (labeler));
if (labeler->priv->windows != NULL)
return;
labeler->priv->windows = g_new (GtkWidget *, labeler->priv->num_outputs);
created_window_for_clone = FALSE;
outputs = gsd_rr_config_get_outputs (labeler->priv->config);
for (i = 0; i < labeler->priv->num_outputs; i++) {
if (!created_window_for_clone && gsd_rr_output_info_is_active (outputs[i])) {
labeler->priv->windows[i] = create_label_window (labeler, outputs[i], labeler->priv->palette + i);
if (gsd_rr_config_get_clone (labeler->priv->config))
created_window_for_clone = TRUE;
} else
labeler->priv->windows[i] = NULL;
}
}
/**
* cc_rr_labeler_hide:
* @labeler: A #CcRRLabeler
*
* Hide ouput labels.
*/
void
cc_rr_labeler_hide (CcRRLabeler *labeler)
{
int i;
CcRRLabelerPrivate *priv;
g_return_if_fail (GNOME_IS_RR_LABELER (labeler));
priv = labeler->priv;
if (priv->windows == NULL)
return;
for (i = 0; i < priv->num_outputs; i++)
if (priv->windows[i] != NULL) {
gtk_widget_destroy (priv->windows[i]);
priv->windows[i] = NULL;
}
g_free (priv->windows);
priv->windows = NULL;
}
/**
* cc_rr_labeler_get_rgba_for_output:
* @labeler: A #CcRRLabeler
* @output: Output device (i.e. monitor) to query
* @rgba_out: (out): Color of selected monitor.
*
* Get the color used for the label on a given output (monitor).
*/
void
cc_rr_labeler_get_rgba_for_output (CcRRLabeler *labeler, GsdRROutputInfo *output, GdkRGBA *rgba_out)
{
int i;
GsdRROutputInfo **outputs;
g_return_if_fail (GNOME_IS_RR_LABELER (labeler));
g_return_if_fail (GSD_IS_RR_OUTPUT_INFO (output));
g_return_if_fail (rgba_out != NULL);
outputs = gsd_rr_config_get_outputs (labeler->priv->config);
for (i = 0; i < labeler->priv->num_outputs; i++)
if (outputs[i] == output) {
*rgba_out = labeler->priv->palette[i];
return;
}
g_warning ("trying to get the color for unknown GnomeOutputInfo %p; returning magenta!", output);
rgba_out->red = 1.0;
rgba_out->green = 0;
rgba_out->blue = 1.0;
rgba_out->alpha = 1.0;
}
./panels/display/display-capplet.ui 0000644 0000041 0000041 00000075314 13241553602 017637 0 ustar www-data www-data
./panels/display/display-module.c 0000644 0000041 0000041 00000002207 13241553602 017270 0 ustar www-data www-data /*
* Copyright (C) 2010 Intel, Inc
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
* Author: Thomas Wood
*
*/
#include
#include "cc-display-panel.h"
#include
void
g_io_module_load (GIOModule *module)
{
bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
/* register the panel */
cc_display_panel_register (module);
}
void
g_io_module_unload (GIOModule *module)
{
}
./panels/display/unity-display-panel.desktop.in.in 0000644 0000041 0000041 00000000714 13241553602 022512 0 ustar www-data www-data [Desktop Entry]
_Name=Displays
_Comment=Change resolution and position of monitors and projectors
Exec=unity-control-center display
Icon=unity-display-panel
Terminal=false
Type=Application
StartupNotify=true
Categories=GNOME;GTK;Settings;HardwareSettings;X-Unity-Settings-Panel;
OnlyShowIn=Unity7;
X-Unity-Settings-Panel=display
# Translators: those are keywords for the display control-center panel
_Keywords=Panel;Projector;xrandr;Screen;Resolution;Refresh;
./panels/display/TODO 0000644 0000041 0000041 00000063050 13241553602 014667 0 ustar www-data www-data Highlevel overview:
Tablet rotation things
only when there is a tablet attached.
Here is the OS X Display menu:
Detect Displays
Turn on mirroring
--------------------------
SyncMaster
- 1280 x 1024, 60 Hz, Millions
- 1344 x ...
--------------------------------
Color LCD
- 1024 x 1024 ...
--------------------------
Displays Preferences
Color LCD means "laptop panel".
- 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
./panels/display/Makefile.am 0000644 0000041 0000041 00000004062 13241553602 016231 0 ustar www-data www-data # This is used in PANEL_CFLAGS
cappletname = display
uidir = $(pkgdatadir)/ui
dist_ui_DATA = display-capplet.ui
MARSHALFILES = foo-marshal.c foo-marshal.h
BUILT_SOURCES = $(MARSHALFILES)
foo-marshal.c: foo-marshal.h
$(AM_V_GEN) ( $(GLIB_GENMARSHAL) --prefix=foo_marshal $(srcdir)/foo-marshal.list --header --body > foo-marshal.c )
foo-marshal.h: foo-marshal.list
$(AM_V_GEN) ( $(GLIB_GENMARSHAL) --prefix=foo_marshal $(srcdir)/foo-marshal.list --header > foo-marshal.h )
ccpanelsdir = $(PANELS_DIR)
ccpanels_LTLIBRARIES = libdisplay.la
libdisplay_la_SOURCES = \
display-module.c \
cc-display-panel.c \
cc-display-panel.h \
cc-rr-labeler.c \
cc-rr-labeler.h \
scrollarea.c \
scrollarea.h \
$(MARSHALFILES)
libdisplay_la_LIBADD = $(PANEL_LIBS) $(DISPLAY_PANEL_LIBS)
libdisplay_la_LDFLAGS = $(PANEL_LDFLAGS)
# You will need a recent intltool or the patch from this bug
# http://bugzilla.gnome.org/show_bug.cgi?id=462312
@INTLTOOL_POLICY_RULE@
@INTLTOOL_DESKTOP_RULE@
icons24dir = $(datadir)/icons/hicolor/24x24/apps
dist_icons24_DATA = icons/24x24/unity-display-panel.svg
icons48dir = $(datadir)/icons/hicolor/48x48/apps
dist_icons48_DATA = icons/48x48/unity-display-panel.svg
desktopdir = $(datadir)/applications
Desktop_in_files = unity-display-panel.desktop.in
desktop_DATA = $(Desktop_in_files:.desktop.in=.desktop)
INCLUDES = $(PANEL_CFLAGS) \
$(DISPLAY_PANEL_CFLAGS) \
-DSBINDIR="\"$(sbindir)\"" \
-DUIDIR="\"$(uidir)\"" \
-DGNOMELOCALEDIR="\"$(datadir)/locale\"" \
-DGNOMECC_DATA_DIR="\"$(pkgdatadir)\""
CLEANFILES = $(Desktop_in_files) $(desktop_DATA)
if MAINTAINER_MODE
gtk_update_icon_cache = gtk-update-icon-cache -f -t $(datadir)/icons/hicolor
install-data-hook: update-icon-cache
uninstall-hook: update-icon-cache
update-icon-cache:
@-if test -z "$(DESTDIR)"; then \
echo "Updating Gtk icon cache."; \
$(gtk_update_icon_cache); \
else \
echo "*** Icon cache not updated. After (un)install, run this:"; \
echo "*** $(gtk_update_icon_cache)"; \
fi
endif
EXTRA_DIST = foo-marshal.list
-include $(top_srcdir)/git.mk
./panels/datetime/ 0000755 0000041 0000041 00000000000 13241553603 014323 5 ustar www-data www-data ./panels/datetime/datetime-prefs.c 0000644 0000041 0000041 00000101472 13241553602 017404 0 ustar www-data www-data /* -*- Mode: C; coding: utf-8; indent-tabs-mode: nil; tab-width: 2 -*-
A dialog for setting time and date preferences.
Copyright 2011 Canonical Ltd.
Authors:
Ted Gould
Michael Terry
This program is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License version 3, as published
by the Free Software Foundation.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranties of
MERCHANTABILITY, SATISFACTORY QUALITY, 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 .
*/
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "settings-shared.h"
#include "utils.h"
#include "datetime-prefs-locations.h"
#define DATETIME_DIALOG_UI_FILE PKGDATADIR "/ui/datetime/datetime-dialog.ui"
GType indicator_datetime_panel_get_type (void);
#define INDICATOR_DATETIME_TYPE_PANEL indicator_datetime_panel_get_type()
typedef struct _IndicatorDatetimePanel IndicatorDatetimePanel;
typedef struct _IndicatorDatetimePanelPrivate IndicatorDatetimePanelPrivate;
typedef struct _IndicatorDatetimePanelClass IndicatorDatetimePanelClass;
struct _IndicatorDatetimePanel
{
CcPanel parent;
IndicatorDatetimePanelPrivate * priv;
};
struct _IndicatorDatetimePanelPrivate
{
guint name_watch_id;
GtkBuilder * builder;
GDBusProxy * proxy;
GtkWidget * auto_radio;
GtkWidget * tz_entry;
CcTimezoneMap * tzmap;
GtkWidget * time_spin;
GtkWidget * date_spin;
guint save_time_id;
gboolean user_edited_time;
gboolean changing_time;
GtkWidget * loc_dlg;
GSettings * settings;
GtkListStore * cities_model;
guint typing_timeout;
GCancellable * cancellable;
};
struct _IndicatorDatetimePanelClass
{
CcPanelClass parent_class;
};
enum
{
COL_NAME,
COL_ADMIN1,
COL_COUNTRY,
COL_ZONE
};
G_DEFINE_DYNAMIC_TYPE (IndicatorDatetimePanel, indicator_datetime_panel, CC_TYPE_PANEL)
/* Turns the boolean property into a string gsettings */
static GVariant *
bind_hours_set (const GValue * value,
const GVariantType * type G_GNUC_UNUSED,
gpointer user_data)
{
const gchar * output = NULL;
gboolean is_12hour_button = (gboolean)GPOINTER_TO_INT(user_data);
if (g_value_get_boolean(value)) {
/* Only do anything if we're setting active = true */
output = is_12hour_button ? "12-hour" : "24-hour";
} else {
return NULL;
}
return g_variant_new_string (output);
}
/* Turns a string gsettings into a boolean property */
static gboolean
bind_hours_get (GValue * value, GVariant * variant, gpointer user_data)
{
const gchar * str = g_variant_get_string(variant, NULL);
gboolean output = FALSE;
gboolean is_12hour_button = (gboolean)GPOINTER_TO_INT(user_data);
if (g_strcmp0(str, "locale-default") == 0) {
output = (is_12hour_button == is_locale_12h ());
} else if (g_strcmp0(str, "12-hour") == 0) {
output = is_12hour_button;
} else if (g_strcmp0(str, "24-hour") == 0) {
output = !is_12hour_button;
} else {
return FALSE;
}
g_value_set_boolean (value, output);
return TRUE;
}
static void
widget_dependency_cb (GtkWidget * parent, GParamSpec *pspec G_GNUC_UNUSED, GtkWidget * dependent)
{
gboolean active, sensitive;
g_object_get (G_OBJECT (parent),
"active", &active,
"sensitive", &sensitive, NULL);
gtk_widget_set_sensitive (dependent, active && sensitive);
}
static void
add_widget_dependency (GtkWidget * parent, GtkWidget * dependent)
{
g_signal_connect (parent, "notify::active", G_CALLBACK(widget_dependency_cb),
dependent);
g_signal_connect (parent, "notify::sensitive", G_CALLBACK(widget_dependency_cb),
dependent);
widget_dependency_cb (parent, NULL, dependent);
}
static void
polkit_dependency_cb (GPermission * permission, GParamSpec *pspec G_GNUC_UNUSED, GtkWidget * dependent)
{
gboolean allowed = FALSE;
g_object_get (G_OBJECT (permission),
"allowed", &allowed, NULL);
gtk_widget_set_sensitive (dependent, allowed);
}
static void
add_polkit_dependency_helper (GtkWidget * parent, GParamSpec *pspec G_GNUC_UNUSED, GtkWidget * dependent)
{
GtkLockButton * button = GTK_LOCK_BUTTON (parent);
GPermission * permission = gtk_lock_button_get_permission (button);
g_signal_connect (permission, "notify::allowed",
G_CALLBACK(polkit_dependency_cb), dependent);
polkit_dependency_cb (permission, NULL, dependent);
}
static void
add_polkit_dependency (GtkWidget * parent, GtkWidget * dependent)
{
/* polkit async hasn't finished at this point, so wait for permission to come in */
g_signal_connect (parent, "notify::permission", G_CALLBACK(add_polkit_dependency_helper),
dependent);
gtk_widget_set_sensitive (dependent, FALSE);
}
static void
polkit_perm_ready (GObject *source_object G_GNUC_UNUSED, GAsyncResult *res, gpointer user_data)
{
GError * error = NULL;
GPermission * permission = polkit_permission_new_finish (res, &error);
if (error != NULL) {
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
g_warning ("Could not get permission object: %s", error->message);
g_error_free (error);
return;
}
GtkLockButton * button = GTK_LOCK_BUTTON (user_data);
gtk_lock_button_set_permission (button, permission);
}
static void
dbus_set_answered (GObject *object, GAsyncResult *res, gpointer command)
{
GError * error = NULL;
GVariant * answers = g_dbus_proxy_call_finish (G_DBUS_PROXY (object), res, &error);
if (error != NULL) {
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
g_warning("Could not set '%s' using timedated: %s", (gchar *)command, error->message);
g_error_free(error);
return;
}
g_variant_unref (answers);
}
static void
toggle_ntp (GtkWidget * radio, GParamSpec * pspec G_GNUC_UNUSED, IndicatorDatetimePanel * self)
{
gboolean active = gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (radio));
g_dbus_proxy_call (self->priv->proxy, "SetNTP", g_variant_new ("(bb)", active, TRUE),
G_DBUS_CALL_FLAGS_NONE, -1, NULL, dbus_set_answered, "NTP");
}
static void
sync_entry (IndicatorDatetimePanel * self, const gchar * location)
{
gchar * name = get_current_zone_name (location, self->priv->settings);
gtk_entry_set_text (GTK_ENTRY (self->priv->tz_entry), name);
g_free (name);
gtk_entry_set_icon_from_icon_name (GTK_ENTRY (self->priv->tz_entry),
GTK_ENTRY_ICON_SECONDARY, NULL);
}
static void
tz_changed (CcTimezoneMap * map G_GNUC_UNUSED,
CcTimezoneLocation * location,
IndicatorDatetimePanel * self)
{
if (location == NULL)
return;
gchar * zone;
g_object_get (location, "zone", &zone, NULL);
g_dbus_proxy_call (self->priv->proxy, "SetTimezone", g_variant_new ("(sb)", zone, TRUE),
G_DBUS_CALL_FLAGS_NONE, -1, NULL, dbus_set_answered, "timezone");
sync_entry (self, zone);
g_free (zone);
}
static void
proxy_ready (GObject *object G_GNUC_UNUSED,
GAsyncResult *res,
IndicatorDatetimePanel * self)
{
GError * error = NULL;
IndicatorDatetimePanelPrivate * priv = self->priv;
GVariant *value;
self->priv->proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
if (error != NULL) {
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
g_critical("Could not grab DBus proxy for timedated: %s", error->message);
g_error_free(error);
return;
}
/* And now, do initial proxy configuration */
value = g_dbus_proxy_get_cached_property (priv->proxy, "CanNTP");
if (value != NULL)
{
if (g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN))
gtk_widget_set_sensitive (priv->auto_radio, g_variant_get_boolean (value));
g_variant_unref (value);
}
value = g_dbus_proxy_get_cached_property (priv->proxy, "NTP");
if (value != NULL)
{
if (g_variant_is_of_type (value, G_VARIANT_TYPE_BOOLEAN))
{
gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (priv->auto_radio), g_variant_get_boolean (value));
g_signal_connect (priv->auto_radio, "notify::active", G_CALLBACK (toggle_ntp), self);
}
g_variant_unref (value);
}
value = g_dbus_proxy_get_cached_property (priv->proxy, "Timezone");
if (value != NULL)
{
if (g_variant_is_of_type (value, G_VARIANT_TYPE_STRING))
{
const gchar *timezone = g_variant_get_string (value, NULL);
cc_timezone_map_set_timezone (priv->tzmap, timezone);
sync_entry (self, timezone);
g_signal_connect (priv->tzmap, "location-changed", G_CALLBACK (tz_changed), self);
}
g_variant_unref (value);
}
}
#define WIG(name) GTK_WIDGET (gtk_builder_get_object(self->priv->builder, name))
static void
set_show_clock_check_sensitive (IndicatorDatetimePanel * self,
gboolean sensitive)
{
gtk_widget_set_sensitive (WIG("showClockCheck"), sensitive);
}
static void
on_bus_name_appeared (GDBusConnection * connection G_GNUC_UNUSED,
const char * name G_GNUC_UNUSED,
const char * name_owner,
gpointer self)
{
set_show_clock_check_sensitive (self, name_owner && *name_owner);
}
static void
on_bus_name_vanished (GDBusConnection * connection G_GNUC_UNUSED,
const char * name G_GNUC_UNUSED,
gpointer self)
{
set_show_clock_check_sensitive (self, FALSE);
}
static gboolean
are_spinners_focused (IndicatorDatetimePanel * self)
{
// save_time_id means that we were in focus and haven't finished our save
// yet, so act like we are still focused.
return self->priv->save_time_id ||
gtk_widget_has_focus (self->priv->time_spin) ||
gtk_widget_has_focus (self->priv->date_spin);
}
static gboolean
save_time (IndicatorDatetimePanel * self)
{
if (self->priv->user_edited_time) {
gdouble current_value = gtk_spin_button_get_value (GTK_SPIN_BUTTON (self->priv->date_spin));
g_dbus_proxy_call (self->priv->proxy, "SetTime",
g_variant_new ("(xbb)", (gint64) (current_value * G_TIME_SPAN_SECOND), FALSE, TRUE),
G_DBUS_CALL_FLAGS_NONE, -1, NULL, dbus_set_answered, "time");
}
self->priv->user_edited_time = FALSE;
self->priv->save_time_id = 0;
return FALSE;
}
static gboolean
spin_focus_in (IndicatorDatetimePanel * self)
{
if (self->priv->save_time_id > 0) {
g_source_remove (self->priv->save_time_id);
self->priv->save_time_id = 0;
}
return FALSE;
}
static gboolean
spin_focus_out (IndicatorDatetimePanel * self)
{
/* We want to only save when both spinners are unfocused. But it's difficult
to tell who is about to get focus during a focus-out. So we set an idle
callback to save the time if we don't focus in to another spinner by that
time. */
if (self->priv->save_time_id == 0) {
self->priv->save_time_id = g_idle_add ((GSourceFunc)save_time, self);
}
return FALSE;
}
static int
input_time_text (GtkWidget * spinner, gdouble * value, IndicatorDatetimePanel * self)
{
gboolean is_time = (gboolean)GPOINTER_TO_INT (g_object_get_data (G_OBJECT (spinner), "is-time"));
const gchar * text = gtk_entry_get_text (GTK_ENTRY (spinner));
gdouble current_value = gtk_spin_button_get_value (GTK_SPIN_BUTTON (spinner));
*value = current_value;
GDateTime * now = g_date_time_new_from_unix_local (current_value);
gint year, month, day, hour, minute, second;
year = g_date_time_get_year (now);
month = g_date_time_get_month (now);
day = g_date_time_get_day_of_month (now);
hour = g_date_time_get_hour (now);
minute = g_date_time_get_minute (now);
second = g_date_time_get_second (now);
g_date_time_unref (now);
/* Parse this string as if it were in the output format */
gint scanned = 0;
gboolean passed = TRUE, skip = FALSE;
if (is_time) {
gint hour_in, minute_in, second_in;
if (is_locale_12h ()) { // TODO: make this look-at/watch gsettings?
char ampm[51];
/* coverity[secure_coding] */
scanned = sscanf (text, "%u:%u:%u %50s", &hour_in, &minute_in, &second_in, ampm);
passed = (scanned == 4);
if (passed) {
const char *pm_str = nl_langinfo (PM_STR);
if (g_ascii_strcasecmp (pm_str, ampm) == 0) {
hour_in += 12;
}
}
} else {
/* coverity[secure_coding] */
scanned = sscanf (text, "%u:%u:%u", &hour_in, &minute_in, &second_in);
passed = (scanned == 3);
}
if (passed && (hour_in > 23 || minute_in > 59 || second_in > 59)) {
passed = FALSE;
}
if (passed && hour == hour_in && minute == minute_in && second == second_in) {
skip = TRUE; // no change
} else {
hour = hour_in;
minute = minute_in;
second = second_in;
}
}
else {
gint year_in, month_in, day_in;
/* coverity[secure_coding] */
scanned = sscanf (text, "%u-%u-%u", &year_in, &month_in, &day_in);
if (scanned != 3 || year_in < 1 || year_in > 9999 ||
month_in < 1 || month_in > 12 || day_in < 1 || day_in > 31) {
passed = FALSE;
}
if (passed && year == year_in && month == month_in && day == day_in) {
skip = TRUE; // no change
} else {
year = year_in;
month = month_in;
day = day_in;
}
}
if (!passed) {
g_warning ("Could not understand %s", text);
return TRUE;
}
if (skip) {
return TRUE;
}
gboolean prev_changing = self->priv->changing_time;
self->priv->changing_time = TRUE;
GDateTime * new_time = g_date_time_new_local (year, month, day, hour, minute, second);
*value = g_date_time_to_unix (new_time);
self->priv->user_edited_time = TRUE;
g_date_time_unref (new_time);
self->priv->changing_time = prev_changing;
return TRUE;
}
static gboolean
format_time_text (GtkWidget * spinner, gpointer user_data G_GNUC_UNUSED)
{
gboolean is_time = (gboolean)GPOINTER_TO_INT (g_object_get_data (G_OBJECT (spinner), "is-time"));
const gchar * format;
if (is_time) {
if (is_locale_12h ()) { // TODO: make this look-at/watch gsettings?
format = "%I:%M:%S %p";
} else {
format = "%H:%M:%S";
}
}
else {
// This is intentionally not "%x". See https://launchpad.net/bugs/1149696
// If you are willing to do the hard work of writing a locale-sensitive
// date parser, there is an open bug: https://launchpad.net/bugs/729056
format = "%Y-%m-%d";
}
GDateTime * datetime = g_date_time_new_from_unix_local (gtk_spin_button_get_value (GTK_SPIN_BUTTON (spinner)));
gchar * formatted = g_date_time_format (datetime, format);
gtk_entry_set_text (GTK_ENTRY (spinner), formatted);
g_date_time_unref (datetime);
return TRUE;
}
static void
spin_copy_value (GtkSpinButton * spinner, IndicatorDatetimePanel * self)
{
GtkSpinButton * other = NULL;
if (GTK_WIDGET (spinner) == self->priv->date_spin)
other = GTK_SPIN_BUTTON (self->priv->time_spin);
else
other = GTK_SPIN_BUTTON (self->priv->date_spin);
if (gtk_spin_button_get_value (spinner) != gtk_spin_button_get_value (other)) {
gtk_spin_button_set_value (other, gtk_spin_button_get_value (spinner));
}
if (!self->priv->changing_time) { /* Means user pressed spin buttons */
self->priv->user_edited_time = TRUE;
}
}
static gboolean
update_spinners (IndicatorDatetimePanel * self)
{
/* Add datetime object to spinner, which will hold the real time value, rather
then using the value of the spinner itself. And don't update while user is
editing. */
if (!are_spinners_focused (self)) {
gboolean prev_changing = self->priv->changing_time;
self->priv->changing_time = TRUE;
GDateTime * now = g_date_time_new_now_local ();
gtk_spin_button_set_value (GTK_SPIN_BUTTON (self->priv->time_spin),
(gdouble)g_date_time_to_unix (now));
/* will be copied to other spin button */
g_date_time_unref (now);
self->priv->changing_time = prev_changing;
}
return TRUE;
}
static void
setup_time_spinners (IndicatorDatetimePanel * self, GtkWidget * time, GtkWidget * date)
{
g_signal_connect (time, "input", G_CALLBACK (input_time_text), self);
g_signal_connect (date, "input", G_CALLBACK (input_time_text), self);
g_signal_connect (time, "output", G_CALLBACK (format_time_text), date);
g_signal_connect (date, "output", G_CALLBACK (format_time_text), time);
g_signal_connect_swapped (time, "focus-in-event", G_CALLBACK (spin_focus_in), self);
g_signal_connect_swapped (date, "focus-in-event", G_CALLBACK (spin_focus_in), self);
g_signal_connect_swapped (time, "focus-out-event", G_CALLBACK (spin_focus_out), self);
g_signal_connect_swapped (date, "focus-out-event", G_CALLBACK (spin_focus_out), self);
g_signal_connect (time, "value-changed", G_CALLBACK (spin_copy_value), self);
g_signal_connect (date, "value-changed", G_CALLBACK (spin_copy_value), self);
g_object_set_data (G_OBJECT (time), "is-time", GINT_TO_POINTER (TRUE));
g_object_set_data (G_OBJECT (date), "is-time", GINT_TO_POINTER (FALSE));
self->priv->time_spin = time;
self->priv->date_spin = date;
guint time_id = g_timeout_add_seconds (1, (GSourceFunc)update_spinners, self);
g_signal_connect_swapped (self->priv->time_spin, "destroy",
G_CALLBACK (g_source_remove), GINT_TO_POINTER (time_id));
update_spinners (self);
}
static void
show_locations (IndicatorDatetimePanel * self)
{
if (self->priv->loc_dlg == NULL) {
self->priv->loc_dlg = datetime_setup_locations_dialog (self->priv->tzmap);
GtkWidget * dlg = gtk_widget_get_toplevel (GTK_WIDGET (self));
gtk_window_set_type_hint (GTK_WINDOW(self->priv->loc_dlg), GDK_WINDOW_TYPE_HINT_DIALOG);
gtk_window_set_transient_for (GTK_WINDOW (self->priv->loc_dlg), GTK_WINDOW (dlg));
g_signal_connect (self->priv->loc_dlg, "destroy", G_CALLBACK (gtk_widget_destroyed), &self->priv->loc_dlg);
gtk_widget_show_all (self->priv->loc_dlg);
}
else {
gtk_window_present_with_time (GTK_WINDOW (self->priv->loc_dlg), gtk_get_current_event_time ());
}
}
static gboolean
timezone_selected (GtkEntryCompletion * widget G_GNUC_UNUSED,
GtkTreeModel * model,
GtkTreeIter * iter,
IndicatorDatetimePanel * self)
{
const gchar * name, * zone;
gtk_tree_model_get (model, iter,
COL_NAME, &name,
COL_ZONE, &zone,
-1);
gchar * tz_name = g_strdup_printf ("%s %s", zone, name);
g_settings_set_string (self->priv->settings, SETTINGS_TIMEZONE_NAME_S, tz_name);
g_free (tz_name);
cc_timezone_map_set_timezone (self->priv->tzmap, zone);
return FALSE; // Do normal action too
}
static gboolean
match_city_func (GtkEntryCompletion *completion,
const gchar *key,
GtkTreeIter *iter,
gpointer user_data)
{
/* the model only ever contains cities that already match the text in
* the location entry, so it's safe to always accept matches */
return TRUE;
}
static void
cell_data_func (GtkCellLayout *cell_layout,
GtkCellRenderer *cell,
GtkTreeModel *tree_model,
GtkTreeIter *iter,
gpointer user_data)
{
gchar *name;
gchar *admin1;
gchar *country;
gchar *text;
gtk_tree_model_get (tree_model, iter,
COL_NAME, &name,
COL_ADMIN1, &admin1,
COL_COUNTRY, &country,
-1);
if (admin1[0] != '\0')
text = g_strdup_printf ("%s (%s, %s)", name, admin1, country);
else
text = g_strdup_printf ("%s (%s)", name, country);
g_object_set (cell, "markup", text, NULL);
g_free (name);
g_free (admin1);
g_free (country);
g_free (text);
}
static gboolean
entry_focus_out (GtkEntry * entry,
GdkEventFocus * event G_GNUC_UNUSED,
IndicatorDatetimePanel * self)
{
// If the name left in the entry doesn't match the current timezone name,
// show an error icon. It's always an error for the user to manually type in
// a timezone.
CcTimezoneLocation * location = cc_timezone_map_get_location (self->priv->tzmap);
if (location == NULL)
return FALSE;
gchar * zone;
g_object_get (location, "zone", &zone, NULL);
gchar * name = get_current_zone_name (zone, self->priv->settings);
gboolean correct = (g_strcmp0 (gtk_entry_get_text (entry), name) == 0);
g_free (name);
g_free (zone);
gtk_entry_set_icon_from_icon_name (entry, GTK_ENTRY_ICON_SECONDARY,
correct ? NULL : "dialog-error");
gtk_entry_set_icon_tooltip_text (entry, GTK_ENTRY_ICON_SECONDARY,
_("You need to choose a location to change the time zone."));
gtk_entry_set_icon_activatable (entry, GTK_ENTRY_ICON_SECONDARY, FALSE);
return FALSE;
}
static void
query_cities_callback (GObject *source_object,
GAsyncResult *result,
gpointer user_data)
{
IndicatorDatetimePanel *self = user_data;
gint *indices;
guint len;
guint i;
GtkEntryCompletion *completion;
gtk_list_store_clear (self->priv->cities_model);
indices = geonames_query_cities_finish (result, &len, NULL);
if (indices == NULL)
return;
for (i = 0; i < len; i++)
{
GeonamesCity *city;
GtkTreeIter iter;
city = geonames_get_city (indices[i]);
gtk_list_store_append (self->priv->cities_model, &iter);
gtk_list_store_set (self->priv->cities_model, &iter,
COL_NAME, geonames_city_get_name (city),
COL_ADMIN1, geonames_city_get_state (city),
COL_COUNTRY, geonames_city_get_country (city),
COL_ZONE, geonames_city_get_timezone (city),
-1);
geonames_city_free (city);
}
completion = gtk_entry_get_completion (GTK_ENTRY (self->priv->tz_entry));
gtk_entry_completion_complete (completion);
g_free (indices);
}
static gboolean
typing_timeout (gpointer user_data)
{
IndicatorDatetimePanel *self = user_data;
const gchar *query;
if (self->priv->cancellable)
{
g_cancellable_cancel (self->priv->cancellable);
g_object_unref (self->priv->cancellable);
}
self->priv->cancellable = g_cancellable_new ();
query = gtk_entry_get_text (GTK_ENTRY (self->priv->tz_entry));
geonames_query_cities (query, GEONAMES_QUERY_DEFAULT, self->priv->cancellable, query_cities_callback, self);
self->priv->typing_timeout = 0;
return G_SOURCE_REMOVE;
}
static void
entry_changed (GtkEntry *entry,
gpointer user_data)
{
IndicatorDatetimePanel *self = user_data;
if (self->priv->typing_timeout > 0)
g_source_remove (self->priv->typing_timeout);
self->priv->typing_timeout = g_timeout_add (100, typing_timeout, self);
}
static void
indicator_datetime_panel_init (IndicatorDatetimePanel * self)
{
GError * error;
GSettings * conf;
GtkEntryCompletion *completion;
GtkCellRenderer *renderer;
self->priv = G_TYPE_INSTANCE_GET_PRIVATE (self,
INDICATOR_DATETIME_TYPE_PANEL,
IndicatorDatetimePanelPrivate);
self->priv->settings = conf = g_settings_new (SETTINGS_INTERFACE);
self->priv->builder = gtk_builder_new ();
gtk_builder_set_translation_domain (self->priv->builder, GETTEXT_PACKAGE);
error = NULL;
gtk_builder_add_from_file (self->priv->builder, DATETIME_DIALOG_UI_FILE, &error);
if (error != NULL) {
/* We have to abort, we can't continue without the ui file */
g_error ("Could not load ui file %s: %s", DATETIME_DIALOG_UI_FILE, error->message);
g_error_free (error);
return;
}
/* Add policykit button */
GtkWidget * polkit_button = gtk_lock_button_new (NULL);
g_object_set (G_OBJECT (polkit_button),
"text-unlock", _("Unlock to change these settings"),
"text-lock", _("Lock to prevent further changes"),
NULL);
GtkWidget * alignment = gtk_alignment_new (0.0, 0.5, 0.0, 0.0);
gtk_container_add (GTK_CONTAINER (alignment), polkit_button);
gtk_box_pack_start (GTK_BOX (WIG ("timeDateBox")), alignment, FALSE, TRUE, 0);
const gchar * polkit_name = "com.canonical.controlcenter.datetime.configure";
polkit_permission_new (polkit_name, NULL, NULL, polkit_perm_ready, polkit_button);
/* Add map */
self->priv->tzmap = cc_timezone_map_new ();
gtk_container_add (GTK_CONTAINER (WIG ("mapBox")), GTK_WIDGET (self->priv->tzmap));
/* Fufill the CC by Attribution license requirements for the Geonames lookup */
cc_timezone_map_set_watermark (self->priv->tzmap, "Geonames.org");
/* And completion entry */
self->priv->cities_model = gtk_list_store_new (4, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING);
completion = gtk_entry_completion_new ();
gtk_entry_completion_set_model (completion, GTK_TREE_MODEL (self->priv->cities_model));
gtk_entry_completion_set_minimum_key_length (completion, 2);
g_object_set (G_OBJECT (completion), "text-column", COL_NAME, NULL); /* use this, because the setter adds a renderer */
gtk_entry_completion_set_match_func (completion, match_city_func, NULL, NULL);
g_signal_connect (completion, "match-selected", G_CALLBACK (timezone_selected), self);
renderer = gtk_cell_renderer_text_new ();
gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (completion), renderer, TRUE);
gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (completion), renderer, cell_data_func, NULL, NULL);
gtk_entry_set_completion (GTK_ENTRY (WIG ("timezoneEntry")), completion);
g_signal_connect (WIG ("timezoneEntry"), "changed", G_CALLBACK (entry_changed), self);
g_signal_connect (WIG ("timezoneEntry"), "focus-out-event", G_CALLBACK (entry_focus_out), self);
/* Set up settings bindings */
g_settings_bind (conf, SETTINGS_SHOW_CLOCK_S, WIG ("showClockCheck"),
"active", G_SETTINGS_BIND_DEFAULT);
g_settings_bind (conf, SETTINGS_SHOW_DAY_S, WIG ("showWeekdayCheck"),
"active", G_SETTINGS_BIND_DEFAULT);
g_settings_bind (conf, SETTINGS_SHOW_DATE_S, WIG ("showDateAndMonthCheck"),
"active", G_SETTINGS_BIND_DEFAULT);
g_settings_bind (conf, SETTINGS_SHOW_YEAR_S, WIG ("showYearCheck"),
"active", G_SETTINGS_BIND_DEFAULT);
g_settings_bind (conf, SETTINGS_SHOW_SECONDS_S, WIG ("showSecondsCheck"),
"active", G_SETTINGS_BIND_DEFAULT);
g_settings_bind_with_mapping (conf, SETTINGS_TIME_FORMAT_S,
WIG ("show12HourRadio"), "active",
G_SETTINGS_BIND_DEFAULT,
bind_hours_get, bind_hours_set,
GINT_TO_POINTER(TRUE), NULL);
g_settings_bind_with_mapping (conf, SETTINGS_TIME_FORMAT_S,
WIG ("show24HourRadio"), "active",
G_SETTINGS_BIND_DEFAULT,
bind_hours_get, bind_hours_set,
GINT_TO_POINTER(FALSE), NULL);
g_settings_bind (conf, SETTINGS_SHOW_CALENDAR_S, WIG ("showCalendarCheck"),
"active", G_SETTINGS_BIND_DEFAULT);
g_settings_bind (conf, SETTINGS_SHOW_WEEK_NUMBERS_S, WIG ("includeWeekNumbersCheck"),
"active", G_SETTINGS_BIND_DEFAULT);
g_settings_bind (conf, SETTINGS_SHOW_EVENTS_S, WIG ("showEventsCheck"),
"active", G_SETTINGS_BIND_DEFAULT);
g_settings_bind (conf, SETTINGS_SHOW_DETECTED_S, WIG ("showDetectedCheck"),
"active", G_SETTINGS_BIND_DEFAULT);
g_settings_bind (conf, SETTINGS_SHOW_LOCATIONS_S, WIG ("showLocationsCheck"),
"active", G_SETTINGS_BIND_DEFAULT);
/* Set up sensitivities */
add_widget_dependency (WIG ("showDateAndMonthCheck"), WIG ("showYearCheck"));
add_widget_dependency (WIG ("showCalendarCheck"), WIG ("calendarOptions"));
add_widget_dependency (WIG ("showClockCheck"), WIG ("clockOptions"));
add_widget_dependency (WIG ("showLocationsCheck"), WIG ("locationsButton"));
add_widget_dependency (WIG ("manualTimeRadio"), WIG ("manualOptions"));
add_polkit_dependency (polkit_button, WIG ("timeDateOptions"));
/* Hacky proxy test for whether evolution-data-server is installed */
gchar * evo_path = g_find_program_in_path ("evolution");
gtk_widget_set_sensitive (WIG ("showEventsCheck"), (evo_path != NULL));
g_free (evo_path);
setup_time_spinners (self, WIG ("timeSpinner"), WIG ("dateSpinner"));
GtkWidget * panel = WIG ("timeDatePanel");
self->priv->auto_radio = WIG ("automaticTimeRadio");
self->priv->tz_entry = WIG ("timezoneEntry");
g_signal_connect_swapped (WIG ("locationsButton"), "clicked", G_CALLBACK (show_locations), self);
/* Grab proxy for settings daemon */
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SYSTEM, G_DBUS_PROXY_FLAGS_NONE, NULL,
"org.freedesktop.timedate1",
"/org/freedesktop/timedate1",
"org.freedesktop.timedate1",
NULL, (GAsyncReadyCallback)proxy_ready, self);
/* Grab proxy for datetime service, to see if it's running. It would
actually be more ideal to see if the indicator module itself is running,
but that doesn't yet claim a name on the bus. Presumably the service
would have been started by any such indicator, so this will at least tell
us if there *was* a datetime module run this session. */
self->priv->name_watch_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
"com.canonical.indicator.datetime",
G_BUS_NAME_WATCHER_FLAGS_NONE,
on_bus_name_appeared,
on_bus_name_vanished,
self,
NULL);
#undef WIG
gtk_widget_show_all (panel);
gtk_container_add (GTK_CONTAINER (self), panel);
g_object_unref (completion);
}
static void
indicator_datetime_panel_dispose (GObject * object)
{
IndicatorDatetimePanel * self = (IndicatorDatetimePanel *) object;
IndicatorDatetimePanelPrivate * priv = self->priv;
g_clear_object (&priv->builder);
g_clear_object (&priv->proxy);
g_clear_object (&priv->settings);
if (priv->loc_dlg) {
gtk_widget_destroy (priv->loc_dlg);
priv->loc_dlg = NULL;
}
if (priv->name_watch_id != 0) {
g_bus_unwatch_name (priv->name_watch_id);
priv->name_watch_id = 0;
}
if (priv->save_time_id) {
g_source_remove (priv->save_time_id);
priv->save_time_id = 0;
}
if (priv->tz_entry) {
gtk_widget_destroy (priv->tz_entry);
priv->tz_entry = NULL;
}
if (priv->time_spin) {
gtk_widget_destroy (priv->time_spin);
priv->time_spin = NULL;
}
if (priv->date_spin) {
gtk_widget_destroy (priv->date_spin);
priv->date_spin = NULL;
}
g_clear_object (&priv->cities_model);
if (priv->typing_timeout) {
g_source_remove (priv->typing_timeout);
priv->typing_timeout = 0;
}
if (self->priv->cancellable)
{
g_cancellable_cancel (self->priv->cancellable);
g_clear_object (&self->priv->cancellable);
}
G_OBJECT_CLASS (indicator_datetime_panel_parent_class)->dispose (object);
}
static void
indicator_datetime_panel_class_finalize (IndicatorDatetimePanelClass *klass G_GNUC_UNUSED)
{
}
static const char *
indicator_datetime_panel_get_help_uri (CcPanel *panel G_GNUC_UNUSED)
{
return "help:ubuntu-help/clock";
}
static void
indicator_datetime_panel_class_init (IndicatorDatetimePanelClass *klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
CcPanelClass *panel_class = CC_PANEL_CLASS (klass);
g_type_class_add_private (klass, sizeof (IndicatorDatetimePanelPrivate));
panel_class->get_help_uri = indicator_datetime_panel_get_help_uri;
gobject_class->dispose = indicator_datetime_panel_dispose;
}
void
g_io_module_load (GIOModule *module)
{
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
indicator_datetime_panel_register_type (G_TYPE_MODULE (module));
g_io_extension_point_implement (CC_SHELL_PANEL_EXTENSION_POINT,
INDICATOR_DATETIME_TYPE_PANEL,
"datetime", 0);
}
void
g_io_module_unload (GIOModule *module G_GNUC_UNUSED)
{
}
./panels/datetime/icons/ 0000755 0000041 0000041 00000000000 13241553602 015435 5 ustar www-data www-data ./panels/datetime/icons/22x22/ 0000755 0000041 0000041 00000000000 13241553603 016215 5 ustar www-data www-data ./panels/datetime/icons/22x22/unity-datetime-panel.png 0000644 0000041 0000041 00000003141 13241553602 022760 0 ustar www-data www-data PNG
IHDR Ĵl; sBIT|d pHYs
B(x tEXtSoftware www.inkscape.org< tEXtTitle Keyboard5E tEXtAuthor Lapo Calamandreiߑ* IDAT8}[l^8468 ҋTU{^qT*iHE*Uu+Tj)(q@
! 6>zߣz^Fi:ҫ}ϼj}RG/7tR.w;Ӻ^.T*NٹK?ŀVw*ߏÁU^/U*t@\>G"`~vj(k'N:Y˰TWW[$WX\^&i'c'ccLO[,K?/~#oxv?C4XO:iH4,/pիY-o_n8cw8oHG Τ3i,!O좦:9Mx? treLuu)061cG[]n np8LKs+MGDolZ/l96|>W_>˟ߤ6Fmm-JRDT$i!Ÿur~/?PHm
"JEضMs6b(.ݻ99 .s !TBiiiiRz,%T1tCo~Μ-0={-M6!DYqBFp\b1t@x<>
JIJSx|P)2/I)!>ۈb}F*g]oaaXiZXaZSEr%B KrezG(s$W$W)ܸ27.´,+))
qӛoKkkvbphf@:i;H!XN,J?/չׯit s'^;)Zصg9=mEcx^hhhdmH2$HΥE.gzfj_{aw+=c&4]tt"o&y+}?Mn}۶5mǁbg2$)bnO_#LMNLO
m!Dln~fx,7ifzj]UFhhd`qa1<