Skip to content
Commits on Source (24)
include:
- remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/5888c7388134cbe4661600222fe9befb10441f6e/templates/fedora.yml'
- remote: 'https://gitlab.freedesktop.org/freedesktop/ci-templates/-/raw/80f87b3058efb75a1faae11826211375fba77e7f/templates/fedora.yml'
variables:
FDO_DISTRIBUTION_TAG: latest
FDO_DISTRIBUTION_VERSION: rawhide
FDO_DISTRIBUTION_VERSION: 36
FDO_UPSTREAM_REPO: gnome/gnome-settings-daemon
# Expiry sets fdo.expires on the image
FEDORA_IMAGE: "$CI_REGISTRY/$FDO_UPSTREAM_REPO/fedora/$FDO_DISTRIBUTION_VERSION:$FDO_DISTRIBUTION_TAG"
......@@ -31,7 +31,7 @@ variables:
libcanberra-devel
libgtop2-devel
libgudev-devel
libgweather-devel
libgweather4-devel
libnotify-devel
librsvg2-devel
libwacom-devel
......@@ -103,6 +103,7 @@ stages:
##
build:
<<: *save_untracked_files
tags: ['crun']
stage: build
script:
......@@ -129,6 +130,7 @@ build:
##
test:
<<: *save_build_logs
tags: ['crun']
stage: test
dependencies:
......@@ -156,6 +158,7 @@ test:
# Runs the coverage test.
coverage:
<<: *save_build_logs
tags: ['crun']
stage: test
# Appears to be broken on Fedora Rawhide as of 2018-02-05
allow_failure: true
......@@ -203,6 +206,7 @@ pages:
##
.sanitizer: &sanitizer
<<: *save_build_logs
tags: ['crun']
stage: manual
when: manual
script:
......@@ -215,12 +219,12 @@ pages:
- $CI_PIPELINE_SOURCE == "schedule"
- $CI_COMMIT_TITLE =~ /^Update.*translation$/
asan:
<<: *sanitizer
# ASAN requires debugging capabilities
tags: [ asan ]
variables:
BUILD_OPTS: "-Db_sanitize=address"
#asan:
# <<: *sanitizer
# # ASAN requires debugging capabilities
# tags: [ asan ]
# variables:
# BUILD_OPTS: "-Db_sanitize=address"
tsan:
<<: *sanitizer
......
=============
Version 42.rc
=============
Sharing:
- Do not manage gnome-remote-desktop, now done through
gnome-control-center and systemd services
===============
Version 42.beta
===============
- Translation updates
Datetime:
- Port to GWeather 4
Media-keys:
- Fix launching of Settings actions
- Suppress UCM generic soundcard names on volume OSDs
- Remove screenshot key handling, done now in GNOME Shell
Power:
- Improve battery warning debouncing logic
XSettings:
- Adopt x11-specific code to look up GTK IM module from
gsd-keyboard
================
Version 42.alpha
================
......
......@@ -96,41 +96,6 @@
<summary>Microphone mute/unmute</summary>
<description>Binding to mute/unmute the microphone.</description>
</key>
<key name="screenshot" type="s">
<default>'Print'</default>
<summary>Take a screenshot</summary>
<description>Binding to take a screenshot.</description>
</key>
<key name="window-screenshot" type="s">
<default>'&lt;Alt&gt;Print'</default>
<summary>Take a screenshot of a window</summary>
<description>Binding to take a screenshot of a window.</description>
</key>
<key name="area-screenshot" type="s">
<default>'&lt;Shift&gt;Print'</default>
<summary>Take a screenshot of an area</summary>
<description>Binding to take a screenshot of an area.</description>
</key>
<key name="screenshot-clip" type="s">
<default>'&lt;Ctrl&gt;Print'</default>
<summary>Copy a screenshot to clipboard</summary>
<description>Binding to copy a screenshot to clipboard.</description>
</key>
<key name="window-screenshot-clip" type="s">
<default>'&lt;Ctrl&gt;&lt;Alt&gt;Print'</default>
<summary>Copy a screenshot of a window to clipboard</summary>
<description>Binding to copy a screenshot of a window to clipboard.</description>
</key>
<key name="area-screenshot-clip" type="s">
<default>'&lt;Ctrl&gt;&lt;Shift&gt;Print'</default>
<summary>Copy a screenshot of an area to clipboard</summary>
<description>Binding to copy a screenshot of an area to clipboard.</description>
</key>
<key name="screencast" type="s">
<default>'&lt;Ctrl&gt;&lt;Shift&gt;&lt;Alt&gt;R'</default>
<summary>Record a short video of the screen</summary>
<description>Binding to record a short video of the screen</description>
</key>
<key name="www" type="s">
<default>'XF86WWW'</default>
<summary>Launch web browser</summary>
......@@ -317,41 +282,6 @@
<summary>Microphone mute/unmute</summary>
<description>Binding to mute/unmute the microphone.</description>
</key>
<key name="screenshot" type="as">
<default>['Print']</default>
<summary>Take a screenshot</summary>
<description>Binding to take a screenshot.</description>
</key>
<key name="window-screenshot" type="as">
<default>['&lt;Alt&gt;Print']</default>
<summary>Take a screenshot of a window</summary>
<description>Binding to take a screenshot of a window.</description>
</key>
<key name="area-screenshot" type="as">
<default>['&lt;Shift&gt;Print']</default>
<summary>Take a screenshot of an area</summary>
<description>Binding to take a screenshot of an area.</description>
</key>
<key name="screenshot-clip" type="as">
<default>['&lt;Ctrl&gt;Print']</default>
<summary>Copy a screenshot to clipboard</summary>
<description>Binding to copy a screenshot to clipboard.</description>
</key>
<key name="window-screenshot-clip" type="as">
<default>['&lt;Ctrl&gt;&lt;Alt&gt;Print']</default>
<summary>Copy a screenshot of a window to clipboard</summary>
<description>Binding to copy a screenshot of a window to clipboard.</description>
</key>
<key name="area-screenshot-clip" type="as">
<default>['&lt;Ctrl&gt;&lt;Shift&gt;Print']</default>
<summary>Copy a screenshot of an area to clipboard</summary>
<description>Binding to copy a screenshot of an area to clipboard.</description>
</key>
<key name="screencast" type="as">
<default>['&lt;Ctrl&gt;&lt;Shift&gt;&lt;Alt&gt;R']</default>
<summary>Record a short video of the screen</summary>
<description>Binding to record a short video of the screen</description>
</key>
<key name="www" type="as">
<default>['']</default>
<summary>Launch web browser</summary>
......@@ -740,12 +670,6 @@
<summary>Bluetooth RF kill</summary>
<description>Static binding to toggle bluetooth airplane mode.</description>
</key>
<key name="max-screencast-length" type="u">
<default>30</default>
<summary>Maximum length of screen recordings</summary>
<description>The maximum length of single screen cast recordings in seconds or 0 for unlimited</description>
</key>
</schema>
<schema gettext-domain="@GETTEXT_PACKAGE@" id="org.gnome.settings-daemon.plugins.media-keys.custom-keybinding">
......
project(
'gnome-settings-daemon', 'c',
version: '42.alpha',
version: '42.rc',
license: [ 'GPL2+', 'LGPLv2+' ],
meson_version: '>= 0.49.0'
)
......@@ -96,7 +96,7 @@ gnome_desktop_dep = dependency('gnome-desktop-3.0', version: '>= 3.37.1')
gsettings_desktop_dep = dependency('gsettings-desktop-schemas', version: '>= 42')
gtk_dep = dependency('gtk+-3.0', version: '>= 3.15.3')
gtk_x11_dep = dependency('gtk+-x11-3.0')
gweather_dep = dependency('gweather-3.0', version: '>= 40.alpha')
gweather_dep = dependency('gweather4')
lcms_dep = dependency('lcms2', version: '>= 2.2')
libcanberra_gtk_dep = dependency('libcanberra-gtk3')
libgeoclue_dep = dependency('libgeoclue-2.0', version: '>= 2.3.1')
......
......@@ -22,7 +22,6 @@
#include "weather-tz.h"
#include "tz.h"
#define GWEATHER_I_KNOW_THIS_IS_UNSTABLE
#include <libgweather/gweather.h>
static GList *
......@@ -33,7 +32,7 @@ location_get_cities (GWeatherLocation *parent_location)
while ((child = gweather_location_next_child (parent_location, child))) {
if (gweather_location_get_level (child) == GWEATHER_LOCATION_CITY) {
cities = g_list_prepend (cities, gweather_location_ref (child));
cities = g_list_prepend (cities, g_object_ref (child));
} else {
cities = g_list_concat (cities,
location_get_cities (child));
......@@ -65,6 +64,7 @@ load_timezones (GList *cities)
TzLocation *loc;
const gchar *country;
const gchar *timezone_id;
GTimeZone *tz;
gdouble latitude;
gdouble longitude;
......@@ -77,7 +77,8 @@ load_timezones (GList *cities)
}
country = gweather_location_get_country (l->data);
timezone_id = gweather_timezone_get_tzid (gweather_location_get_timezone (l->data));
tz = gweather_location_get_timezone (l->data);
timezone_id = g_time_zone_get_identifier (tz);
gweather_location_get_coords (l->data,
&latitude,
&longitude);
......
......@@ -57,10 +57,6 @@
#define GNOME_DESKTOP_INTERFACE_DIR "org.gnome.desktop.interface"
#define KEY_GTK_IM_MODULE "gtk-im-module"
#define GTK_IM_MODULE_SIMPLE "gtk-im-context-simple"
#define GTK_IM_MODULE_IBUS "ibus"
#define GNOME_DESKTOP_INPUT_SOURCES_DIR "org.gnome.desktop.input-sources"
#define KEY_INPUT_SOURCES "sources"
......@@ -71,9 +67,6 @@
#define DEFAULT_LAYOUT "us"
#define GNOME_A11Y_APPLICATIONS_INTERFACE_DIR "org.gnome.desktop.a11y.applications"
#define KEY_OSK_ENABLED "screen-keyboard-enabled"
struct _GsdKeyboardManager
{
GObject parent;
......@@ -81,21 +74,14 @@ struct _GsdKeyboardManager
guint start_idle_id;
GSettings *settings;
GSettings *input_sources_settings;
GSettings *a11y_settings;
GDBusProxy *localed;
GCancellable *cancellable;
GdkSeat *user_seat;
guint device_added_id;
guint device_removed_id;
};
static void gsd_keyboard_manager_class_init (GsdKeyboardManagerClass *klass);
static void gsd_keyboard_manager_init (GsdKeyboardManager *keyboard_manager);
static void gsd_keyboard_manager_finalize (GObject *object);
static void update_gtk_im_module (GsdKeyboardManager *manager);
G_DEFINE_TYPE (GsdKeyboardManager, gsd_keyboard_manager, G_TYPE_OBJECT)
static gpointer manager_object = NULL;
......@@ -218,121 +204,6 @@ settings_changed (GSettings *settings,
}
static void
device_added_cb (GdkSeat *user_seat,
GdkDevice *device,
GsdKeyboardManager *manager)
{
GdkInputSource source;
source = gdk_device_get_source (device);
if (source == GDK_SOURCE_TOUCHSCREEN) {
update_gtk_im_module (manager);
}
}
static void
device_removed_cb (GdkSeat *user_seat,
GdkDevice *device,
GsdKeyboardManager *manager)
{
GdkInputSource source;
source = gdk_device_get_source (device);
if (source == GDK_SOURCE_TOUCHSCREEN)
update_gtk_im_module (manager);
}
static void
set_devicepresence_handler (GsdKeyboardManager *manager)
{
GdkSeat *user_seat;
if (gnome_settings_is_wayland ())
return;
user_seat = gdk_display_get_default_seat (gdk_display_get_default ());
manager->device_added_id = g_signal_connect (G_OBJECT (user_seat), "device-added",
G_CALLBACK (device_added_cb), manager);
manager->device_removed_id = g_signal_connect (G_OBJECT (user_seat), "device-removed",
G_CALLBACK (device_removed_cb), manager);
manager->user_seat = user_seat;
}
static gboolean
need_ibus (GVariant *sources)
{
GVariantIter iter;
const gchar *type;
g_variant_iter_init (&iter, sources);
while (g_variant_iter_next (&iter, "(&s&s)", &type, NULL))
if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS))
return TRUE;
return FALSE;
}
static gboolean
need_osk (GsdKeyboardManager *manager)
{
gboolean has_touchscreen = FALSE;
GList *devices;
GdkSeat *seat;
if (g_settings_get_boolean (manager->a11y_settings,
KEY_OSK_ENABLED))
return TRUE;
seat = gdk_display_get_default_seat (gdk_display_get_default ());
devices = gdk_seat_get_slaves (seat, GDK_SEAT_CAPABILITY_TOUCH);
has_touchscreen = devices != NULL;
g_list_free (devices);
return has_touchscreen;
}
static void
set_gtk_im_module (GsdKeyboardManager *manager,
GSettings *settings,
GVariant *sources)
{
const gchar *new_module;
gchar *current_module;
if (need_ibus (sources) || need_osk (manager))
new_module = GTK_IM_MODULE_IBUS;
else
new_module = GTK_IM_MODULE_SIMPLE;
current_module = g_settings_get_string (settings, KEY_GTK_IM_MODULE);
if (!g_str_equal (current_module, new_module))
g_settings_set_string (settings, KEY_GTK_IM_MODULE, new_module);
g_free (current_module);
}
static void
update_gtk_im_module (GsdKeyboardManager *manager)
{
GSettings *interface_settings;
GVariant *sources;
/* Gtk+ uses the IM module advertised in XSETTINGS so, if we
* have IBus input sources, we want it to load that
* module. Otherwise we can use the default "simple" module
* which is builtin gtk+
*/
interface_settings = g_settings_new (GNOME_DESKTOP_INTERFACE_DIR);
sources = g_settings_get_value (manager->input_sources_settings,
KEY_INPUT_SOURCES);
set_gtk_im_module (manager, interface_settings, sources);
g_object_unref (interface_settings);
g_variant_unref (sources);
}
static void
get_sources_from_xkb_config (GsdKeyboardManager *manager)
{
......@@ -580,18 +451,7 @@ start_keyboard_idle_cb (GsdKeyboardManager *manager)
manager->settings = g_settings_new (GSD_KEYBOARD_DIR);
set_devicepresence_handler (manager);
manager->input_sources_settings = g_settings_new (GNOME_DESKTOP_INPUT_SOURCES_DIR);
g_signal_connect_swapped (manager->input_sources_settings,
"changed::" KEY_INPUT_SOURCES,
G_CALLBACK (update_gtk_im_module), manager);
manager->a11y_settings = g_settings_new (GNOME_A11Y_APPLICATIONS_INTERFACE_DIR);
g_signal_connect_swapped (manager->a11y_settings,
"changed::" KEY_OSK_ENABLED,
G_CALLBACK (update_gtk_im_module), manager);
update_gtk_im_module (manager);
manager->cancellable = g_cancellable_new ();
......@@ -645,14 +505,7 @@ gsd_keyboard_manager_stop (GsdKeyboardManager *manager)
g_clear_object (&manager->settings);
g_clear_object (&manager->input_sources_settings);
g_clear_object (&manager->a11y_settings);
g_clear_object (&manager->localed);
if (manager->user_seat != NULL) {
g_signal_handler_disconnect (manager->user_seat, manager->device_added_id);
g_signal_handler_disconnect (manager->user_seat, manager->device_removed_id);
manager->user_seat = NULL;
}
}
static void
......
......@@ -58,7 +58,6 @@
#include "shortcuts-list.h"
#include "shell-key-grabber.h"
#include "gsd-screenshot-utils.h"
#include "gsd-input-helper.h"
#include "gsd-enums.h"
#include "gsd-shell-helper.h"
......@@ -199,12 +198,6 @@ typedef struct
/* ScreenSaver stuff */
GsdScreenSaver *screen_saver_proxy;
/* Screencast stuff */
GDBusProxy *screencast_proxy;
guint screencast_timeout_id;
gboolean screencast_recording;
GCancellable *screencast_cancellable;
/* Rotation */
guint iio_sensor_watch_id;
gboolean has_accel;
......@@ -747,10 +740,6 @@ gsettings_changed_cb (GSettings *settings,
if (g_str_equal (settings_key, "custom-keybindings"))
return;
/* not needed here */
if (g_str_equal (settings_key, "max-screencast-length"))
return;
/* Find the key that was modified */
if (priv->keys == NULL)
return;
......@@ -1397,6 +1386,8 @@ show_volume_osd (GsdMediaKeysManager *manager,
port = gvc_mixer_stream_get_port (stream);
if (g_strcmp0 (gvc_mixer_stream_get_form_factor (stream), "internal") != 0 ||
(port != NULL &&
g_strcmp0 (port->port, "[OUT] Speaker") != 0 &&
g_strcmp0 (port->port, "[OUT] Handset") != 0 &&
g_strcmp0 (port->port, "analog-output-speaker") != 0 &&
g_strcmp0 (port->port, "analog-output") != 0)) {
device = gvc_mixer_control_lookup_device_from_stream (priv->volume, stream);
......@@ -2329,75 +2320,6 @@ do_rfkill_action (GsdMediaKeysManager *manager,
data->property, new_state ? "true" : "false");
}
static void
screencast_stop (GsdMediaKeysManager *manager)
{
GsdMediaKeysManagerPrivate *priv = GSD_MEDIA_KEYS_MANAGER_GET_PRIVATE (manager);
if (priv->screencast_timeout_id > 0) {
g_source_remove (priv->screencast_timeout_id);
priv->screencast_timeout_id = 0;
}
g_dbus_proxy_call (priv->screencast_proxy,
"StopScreencast", NULL,
G_DBUS_CALL_FLAGS_NONE, -1,
priv->screencast_cancellable,
NULL, NULL);
priv->screencast_recording = FALSE;
}
static gboolean
screencast_timeout (gpointer user_data)
{
GsdMediaKeysManager *manager = user_data;
screencast_stop (manager);
return G_SOURCE_REMOVE;
}
static void
screencast_start (GsdMediaKeysManager *manager)
{
GsdMediaKeysManagerPrivate *priv = GSD_MEDIA_KEYS_MANAGER_GET_PRIVATE (manager);
guint max_length;
g_dbus_proxy_call (priv->screencast_proxy,
"Screencast",
g_variant_new_parsed ("(%s, @a{sv} {})",
/* Translators: this is a filename used for screencast
* recording, where "%d" and "%t" date and time, e.g.
* "Screencast from 07-17-2013 10:00:46 PM.webm" */
/* xgettext:no-c-format */
_("Screencast from %d %t.webm")),
G_DBUS_CALL_FLAGS_NONE, -1,
priv->screencast_cancellable,
NULL, NULL);
max_length = g_settings_get_uint (priv->settings, "max-screencast-length");
if (max_length > 0) {
priv->screencast_timeout_id = g_timeout_add_seconds (max_length,
screencast_timeout,
manager);
g_source_set_name_by_id (priv->screencast_timeout_id, "[gnome-settings-daemon] screencast_timeout");
}
priv->screencast_recording = TRUE;
}
static void
do_screencast_action (GsdMediaKeysManager *manager)
{
GsdMediaKeysManagerPrivate *priv = GSD_MEDIA_KEYS_MANAGER_GET_PRIVATE (manager);
if (priv->screencast_proxy == NULL)
return;
if (!priv->screencast_recording)
screencast_start (manager);
else
screencast_stop (manager);
}
static void
do_custom_action (GsdMediaKeysManager *manager,
const gchar *device_node,
......@@ -2479,17 +2401,6 @@ do_action (GsdMediaKeysManager *manager,
case HELP_KEY:
do_url_action (manager, "ghelp", timestamp);
break;
case SCREENSHOT_KEY:
case SCREENSHOT_CLIP_KEY:
case WINDOW_SCREENSHOT_KEY:
case WINDOW_SCREENSHOT_CLIP_KEY:
case AREA_SCREENSHOT_KEY:
case AREA_SCREENSHOT_CLIP_KEY:
gsd_screenshot_take (type);
break;
case SCREENCAST_KEY:
do_screencast_action (manager);
break;
case WWW_KEY:
do_url_action (manager, "http", timestamp);
break;
......@@ -2500,7 +2411,7 @@ do_action (GsdMediaKeysManager *manager,
do_execute_desktop_or_desktop (manager, "org.gnome.Calculator.desktop", "gnome-calculator.desktop", timestamp);
break;
case CONTROL_CENTER_KEY:
do_execute_desktop_or_desktop (manager, "gnome-control-center.desktop", NULL, timestamp);
do_execute_desktop_or_desktop (manager, "org.gnome.Settings.desktop", NULL, timestamp);
break;
case PLAY_KEY:
return do_multimedia_player_action (manager, "Play");
......@@ -2843,25 +2754,6 @@ initialize_volume_handler (GsdMediaKeysManager *manager)
gnome_settings_profile_end ("gvc_mixer_control_new");
}
static void
on_screencast_proxy_ready (GObject *source,
GAsyncResult *result,
gpointer data)
{
GsdMediaKeysManager *manager = data;
GsdMediaKeysManagerPrivate *priv = GSD_MEDIA_KEYS_MANAGER_GET_PRIVATE (manager);
GError *error = NULL;
priv->screencast_proxy =
g_dbus_proxy_new_for_bus_finish (result, &error);
if (!priv->screencast_proxy) {
if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED))
g_warning ("Failed to create proxy for screencast: %s", error->message);
g_error_free (error);
}
}
static void
on_key_grabber_ready (GObject *source,
GAsyncResult *result,
......@@ -2899,7 +2791,6 @@ shell_presence_changed (GsdMediaKeysManager *manager)
g_ptr_array_set_size (priv->keys, 0);
g_clear_object (&priv->key_grabber);
g_clear_object (&priv->screencast_proxy);
if (name_owner) {
shell_key_grabber_proxy_new_for_bus (G_BUS_TYPE_SESSION,
......@@ -2990,7 +2881,6 @@ start_media_keys_idle_cb (GsdMediaKeysManager *manager)
priv->icon_theme = g_settings_get_string (priv->interface_settings, "icon-theme");
priv->grab_cancellable = g_cancellable_new ();
priv->screencast_cancellable = g_cancellable_new ();
priv->rfkill_cancellable = g_cancellable_new ();
priv->shell_proxy = gnome_settings_bus_get_shell_proxy ();
......@@ -2998,14 +2888,6 @@ start_media_keys_idle_cb (GsdMediaKeysManager *manager)
G_CALLBACK (shell_presence_changed), manager);
shell_presence_changed (manager);
g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
0, NULL,
SHELL_DBUS_NAME ".Screencast",
SHELL_DBUS_PATH "/Screencast",
SHELL_DBUS_NAME ".Screencast",
priv->screencast_cancellable,
on_screencast_proxy_ready, manager);
priv->rfkill_watch_id = g_bus_watch_name (G_BUS_TYPE_SESSION,
"org.gnome.SettingsDaemon.Rfkill",
G_BUS_NAME_WATCHER_FLAGS_NONE,
......@@ -3093,13 +2975,6 @@ migrate_keybinding_settings (void)
{ "volume-mute", "volume-mute", map_keybinding },
{ "volume-up", "volume-up", map_keybinding },
{ "mic-mute", "mic-mute", map_keybinding },
{ "screenshot", "screenshot", map_keybinding },
{ "window-screenshot", "window-screenshot", map_keybinding },
{ "area-screenshot", "area-screenshot", map_keybinding },
{ "screenshot-clip", "screenshot-clip", map_keybinding },
{ "window-screenshot-clip", "window-screenshot-clip", map_keybinding },
{ "area-screenshot-clip", "area-screenshot-clip", map_keybinding },
{ "screencast", "screencast", map_keybinding },
{ "www", "www", map_keybinding },
{ "magnifier", "magnifier", map_keybinding },
{ "screenreader", "screenreader", map_keybinding },
......@@ -3204,7 +3079,6 @@ gsd_media_keys_manager_stop (GsdMediaKeysManager *manager)
g_clear_object (&priv->power_keyboard_proxy);
g_clear_object (&priv->composite_device);
g_clear_object (&priv->mpris_controller);
g_clear_object (&priv->screencast_proxy);
g_clear_object (&priv->iio_sensor_proxy);
g_clear_pointer (&priv->chassis_type, g_free);
g_clear_object (&priv->connection);
......@@ -3245,11 +3119,6 @@ gsd_media_keys_manager_stop (GsdMediaKeysManager *manager)
g_clear_object (&priv->grab_cancellable);
}
if (priv->screencast_cancellable != NULL) {
g_cancellable_cancel (priv->screencast_cancellable);
g_clear_object (&priv->screencast_cancellable);
}
if (priv->rfkill_cancellable != NULL) {
g_cancellable_cancel (priv->rfkill_cancellable);
g_clear_object (&priv->rfkill_cancellable);
......
/* gsd-screenshot-utils.c - utilities to take screenshots
*
* Copyright (C) 2012 Red Hat, Inc.
*
* Adapted from gnome-screenshot code, which is
* Copyright (C) 2001-2006 Jonathan Blandford <jrb@alum.mit.edu>
* Copyright (C) 2006 Emmanuele Bassi <ebassi@gnome.org>
* Copyright (C) 2008-2012 Cosimo Cecchi <cosimoc@gnome.org>
*
* 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,
*/
#include <config.h>
#include <gtk/gtk.h>
#include <gio/gio.h>
#include <glib/gi18n.h>
#include <string.h>
#include <glib/gstdio.h>
#include "gsd-screenshot-utils.h"
#define SHELL_SCREENSHOT_BUS_NAME "org.gnome.Shell"
#define SHELL_SCREENSHOT_BUS_PATH "/org/gnome/Shell/Screenshot"
#define SHELL_SCREENSHOT_BUS_IFACE "org.gnome.Shell.Screenshot"
typedef enum {
SCREENSHOT_TYPE_SCREEN,
SCREENSHOT_TYPE_WINDOW,
SCREENSHOT_TYPE_AREA
} ScreenshotType;
typedef struct {
ScreenshotType type;
gboolean copy_to_clipboard;
GdkRectangle area_selection;
gchar *save_filename;
gchar *used_filename;
GDBusConnection *connection;
} ScreenshotContext;
static void
screenshot_context_free (ScreenshotContext *ctx)
{
g_free (ctx->save_filename);
g_free (ctx->used_filename);
g_clear_object (&ctx->connection);
g_slice_free (ScreenshotContext, ctx);
}
static void
screenshot_save_to_recent (ScreenshotContext *ctx)
{
GFile *file = g_file_new_for_path (ctx->used_filename);
gchar *uri = g_file_get_uri (file);
gtk_recent_manager_add_item (gtk_recent_manager_get_default (), uri);
g_free (uri);
g_object_unref (file);
}
static void
bus_call_ready_cb (GObject *source,
GAsyncResult *res,
gpointer user_data)
{
GError *error = NULL;
ScreenshotContext *ctx = user_data;
GVariant *variant;
gboolean success;
variant = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source), res, &error);
if (error != NULL)
{
g_warning ("Failed to save a screenshot: %s\n", error->message);
g_error_free (error);
screenshot_context_free (ctx);
return;
}
g_variant_get (variant, "(bs)", &success, &ctx->used_filename);
if (success)
{
if (!ctx->copy_to_clipboard)
{
screenshot_save_to_recent (ctx);
}
}
screenshot_context_free (ctx);
g_variant_unref (variant);
}
static void
screenshot_call_shell (ScreenshotContext *ctx)
{
const gchar *method_name;
GVariant *method_params;
if (ctx->type == SCREENSHOT_TYPE_SCREEN)
{
method_name = "Screenshot";
method_params = g_variant_new ("(bbs)",
FALSE, /* include pointer */
TRUE, /* flash */
ctx->save_filename);
}
else if (ctx->type == SCREENSHOT_TYPE_WINDOW)
{
method_name = "ScreenshotWindow";
method_params = g_variant_new ("(bbbs)",
TRUE, /* include border */
FALSE, /* include pointer */
TRUE, /* flash */
ctx->save_filename);
}
else
{
method_name = "ScreenshotArea";
method_params = g_variant_new ("(iiiibs)",
ctx->area_selection.x, ctx->area_selection.y,
ctx->area_selection.width, ctx->area_selection.height,
TRUE, /* flash */
ctx->save_filename);
}
g_dbus_connection_call (ctx->connection,
SHELL_SCREENSHOT_BUS_NAME,
SHELL_SCREENSHOT_BUS_PATH,
SHELL_SCREENSHOT_BUS_IFACE,
method_name,
method_params,
NULL,
G_DBUS_CALL_FLAGS_NO_AUTO_START,
-1,
NULL,
bus_call_ready_cb,
ctx);
}
static void
area_selection_ready_cb (GObject *source,
GAsyncResult *res,
gpointer user_data)
{
GdkRectangle rectangle;
ScreenshotContext *ctx = user_data;
GVariant *geometry;
geometry = g_dbus_connection_call_finish (G_DBUS_CONNECTION (source),
res, NULL);
/* cancelled by the user */
if (!geometry)
{
screenshot_context_free (ctx);
return;
}
g_variant_get (geometry, "(iiii)",
&rectangle.x, &rectangle.y,
&rectangle.width, &rectangle.height);
ctx->area_selection = rectangle;
screenshot_call_shell (ctx);
g_variant_unref (geometry);
}
static void
bus_connection_ready_cb (GObject *source,
GAsyncResult *res,
gpointer user_data)
{
GError *error = NULL;
ScreenshotContext *ctx = user_data;
ctx->connection = g_bus_get_finish (res, &error);
if (error != NULL)
{
g_warning ("Failed to save a screenshot: %s\n", error->message);
g_error_free (error);
screenshot_context_free (ctx);
return;
}
if (ctx->type == SCREENSHOT_TYPE_AREA)
g_dbus_connection_call (ctx->connection,
SHELL_SCREENSHOT_BUS_NAME,
SHELL_SCREENSHOT_BUS_PATH,
SHELL_SCREENSHOT_BUS_IFACE,
"SelectArea",
NULL,
NULL,
G_DBUS_CALL_FLAGS_NO_AUTO_START,
-1,
NULL,
area_selection_ready_cb,
ctx);
else
screenshot_call_shell (ctx);
}
static void
screenshot_take (ScreenshotContext *ctx)
{
g_bus_get (G_BUS_TYPE_SESSION, NULL, bus_connection_ready_cb, ctx);
}
static gchar *
screenshot_build_filename (void)
{
char *file_name, *origin;
GDateTime *d;
d = g_date_time_new_now_local ();
origin = g_date_time_format (d, "%Y-%m-%d %H-%M-%S");
g_date_time_unref (d);
/* translators: this is the name of the file that gets made up
* with the screenshot */
file_name = g_strdup_printf (_("Screenshot from %s"), origin);
g_free (origin);
return file_name;
}
static void
screenshot_check_name_ready (ScreenshotContext *ctx)
{
if (ctx->copy_to_clipboard)
ctx->save_filename = g_strdup ("");
else
ctx->save_filename = screenshot_build_filename ();
screenshot_take (ctx);
}
void
gsd_screenshot_take (MediaKeyType key_type)
{
ScreenshotContext *ctx = g_slice_new0 (ScreenshotContext);
ctx->copy_to_clipboard = (key_type == SCREENSHOT_CLIP_KEY ||
key_type == WINDOW_SCREENSHOT_CLIP_KEY ||
key_type == AREA_SCREENSHOT_CLIP_KEY);
switch (key_type)
{
case SCREENSHOT_KEY:
case SCREENSHOT_CLIP_KEY:
ctx->type = SCREENSHOT_TYPE_SCREEN;
break;
case WINDOW_SCREENSHOT_KEY:
case WINDOW_SCREENSHOT_CLIP_KEY:
ctx->type = SCREENSHOT_TYPE_WINDOW;
break;
case AREA_SCREENSHOT_KEY:
case AREA_SCREENSHOT_CLIP_KEY:
ctx->type = SCREENSHOT_TYPE_AREA;
break;
default:
g_assert_not_reached ();
break;
}
screenshot_check_name_ready (ctx);
}
/* gsd-screenshot-utils.h - utilities to take screenshots
*
* Copyright (C) 2012 Red Hat, Inc.
*
* Adapted from gnome-screenshot code, which is
* Copyright (C) 2001-2006 Jonathan Blandford <jrb@alum.mit.edu>
* Copyright (C) 2006 Emmanuele Bassi <ebassi@gnome.org>
* Copyright (C) 2008-2012 Cosimo Cecchi <cosimoc@gnome.org>
*
* 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,
*/
#ifndef __GSD_SCREENSHOT_UTILS_H__
#define __GSD_SCREENSHOT_UTILS_H__
#include "media-keys.h"
G_BEGIN_DECLS
void gsd_screenshot_take (MediaKeyType key_type);
G_END_DECLS
#endif /* __GSD_SCREENSHOT_UTILS_H__ */
......@@ -42,13 +42,6 @@ typedef enum {
CONTROL_CENTER_KEY,
SCREENSAVER_KEY,
HELP_KEY,
SCREENSHOT_KEY,
WINDOW_SCREENSHOT_KEY,
AREA_SCREENSHOT_KEY,
SCREENSHOT_CLIP_KEY,
WINDOW_SCREENSHOT_CLIP_KEY,
AREA_SCREENSHOT_CLIP_KEY,
SCREENCAST_KEY,
WWW_KEY,
PLAY_KEY,
PAUSE_KEY,
......
sources = files(
'bus-watch-namespace.c',
'gsd-media-keys-manager.c',
'gsd-screenshot-utils.c',
'main.c',
'mpris-controller.c'
)
......
......@@ -64,13 +64,6 @@ static struct {
{ CONTROL_CENTER_KEY, "control-center", TRUE, GSD_ACTION_MODE_LAUNCHER, META_KEY_BINDING_IGNORE_AUTOREPEAT },
{ SCREENSAVER_KEY, "screensaver", TRUE, SCREENSAVER_MODE, META_KEY_BINDING_IGNORE_AUTOREPEAT },
{ HELP_KEY, "help", FALSE, GSD_ACTION_MODE_LAUNCHER, META_KEY_BINDING_IGNORE_AUTOREPEAT },
{ SCREENSHOT_KEY, "screenshot", FALSE, NO_LOCK_MODE, META_KEY_BINDING_IGNORE_AUTOREPEAT },
{ WINDOW_SCREENSHOT_KEY, "window-screenshot", FALSE, NO_LOCK_MODE, META_KEY_BINDING_IGNORE_AUTOREPEAT },
{ AREA_SCREENSHOT_KEY, "area-screenshot", FALSE, NO_LOCK_MODE, META_KEY_BINDING_IGNORE_AUTOREPEAT },
{ SCREENSHOT_CLIP_KEY, "screenshot-clip", FALSE, SHELL_ACTION_MODE_ALL, META_KEY_BINDING_IGNORE_AUTOREPEAT },
{ WINDOW_SCREENSHOT_CLIP_KEY, "window-screenshot-clip", FALSE, SHELL_ACTION_MODE_NORMAL, META_KEY_BINDING_IGNORE_AUTOREPEAT },
{ AREA_SCREENSHOT_CLIP_KEY, "area-screenshot-clip", FALSE, SHELL_ACTION_MODE_ALL, META_KEY_BINDING_IGNORE_AUTOREPEAT },
{ SCREENCAST_KEY, "screencast", FALSE, NO_LOCK_MODE, META_KEY_BINDING_IGNORE_AUTOREPEAT },
{ WWW_KEY, "www", TRUE, GSD_ACTION_MODE_LAUNCHER, META_KEY_BINDING_IGNORE_AUTOREPEAT },
{ PLAY_KEY, "play", TRUE, SHELL_ACTION_MODE_ALL, META_KEY_BINDING_IGNORE_AUTOREPEAT },
{ PAUSE_KEY, "pause", TRUE, SHELL_ACTION_MODE_ALL, META_KEY_BINDING_IGNORE_AUTOREPEAT },
......
......@@ -484,7 +484,7 @@ engine_device_debounce_warn (GsdPowerManager *manager,
ret = FALSE;
}
if (warning != UP_DEVICE_LEVEL_UNKNOWN)
if (warning != UP_DEVICE_LEVEL_UNKNOWN && warning != UP_DEVICE_LEVEL_NONE)
g_hash_table_insert (manager->devices_notified_ht,
g_strdup (serial),
GINT_TO_POINTER (warning));
......
......@@ -76,7 +76,6 @@ if host_is_linux
)
i18n.merge_file(
policy,
input: policy_in,
output: policy,
po_dir: po_dir,
......
......@@ -38,6 +38,16 @@ from gi.repository import GLib
from gi.repository import UPowerGlib
from gi.repository import UMockdev
def tryint(s):
try:
return int(s)
except:
return s
mutter_version = subprocess.run(['mutter', '--version'], stdout=subprocess.PIPE).stdout.decode().strip()
assert mutter_version.startswith('mutter ')
mutter_version = tuple(tryint(d) for d in mutter_version[7:].split('.'))
class PowerPluginBase(gsdtestcase.GSDTestCase):
'''Test the power plugin'''
......@@ -584,7 +594,8 @@ class PowerPluginTest4(PowerPluginBase):
dbus.UInt32(gsdpowerenums.GSM_INHIBITOR_FLAG_SUSPEND),
dbus_interface='org.gnome.SessionManager')
time.sleep (gsdpowerconstants.LID_CLOSE_SAFETY_TIMEOUT)
# Wait for startup inhibition to be gone
self.check_for_lid_uninhibited(gsdpowerconstants.LID_CLOSE_SAFETY_TIMEOUT + 2)
# Close the lid
self.obj_upower.Set('org.freedesktop.UPower', 'LidIsClosed', True)
......@@ -611,7 +622,8 @@ class PowerPluginTest4(PowerPluginBase):
dbus.UInt32(gsdpowerenums.GSM_INHIBITOR_FLAG_SUSPEND),
dbus_interface='org.gnome.SessionManager')
time.sleep (gsdpowerconstants.LID_CLOSE_SAFETY_TIMEOUT)
# Wait for startup inhibition to be gone
self.check_for_lid_uninhibited(gsdpowerconstants.LID_CLOSE_SAFETY_TIMEOUT + 2)
# Close the lid
self.obj_upower.Set('org.freedesktop.UPower', 'LidIsClosed', True)
......@@ -625,6 +637,7 @@ class PowerPluginTest4(PowerPluginBase):
dbus_interface='org.gnome.SessionManager')
# At this point logind should suspend for us
@unittest.skipIf(mutter_version <= (42, 'alpha'), reason="mutter is too old and may be buggy")
def test_unblank_on_lid_open(self):
'''Check that we do unblank on lid opening, if the machine will not suspend'''
......@@ -634,7 +647,8 @@ class PowerPluginTest4(PowerPluginBase):
dbus.UInt32(gsdpowerenums.GSM_INHIBITOR_FLAG_SUSPEND),
dbus_interface='org.gnome.SessionManager')
time.sleep (gsdpowerconstants.LID_CLOSE_SAFETY_TIMEOUT)
# Wait for startup inhibition to be gone
self.check_for_lid_uninhibited(gsdpowerconstants.LID_CLOSE_SAFETY_TIMEOUT + 2)
# Close the lid
self.obj_upower.Set('org.freedesktop.UPower', 'LidIsClosed', True)
......@@ -658,9 +672,8 @@ class PowerPluginTest5(PowerPluginBase):
def test_dim(self):
'''Check that we do go to dim'''
# Wait and flush log
time.sleep (gsdpowerconstants.LID_CLOSE_SAFETY_TIMEOUT + 1)
self.plugin_log.clear()
# Wait for startup inhibition to be gone
self.check_for_lid_uninhibited(gsdpowerconstants.LID_CLOSE_SAFETY_TIMEOUT + 2)
idle_delay = math.ceil(gsdpowerconstants.MINIMUM_IDLE_DIM_DELAY / gsdpowerconstants.IDLE_DELAY_TO_IDLE_DIM_MULTIPLIER)
self.reset_idle_timer()
......@@ -707,9 +720,8 @@ class PowerPluginTest5(PowerPluginBase):
def test_lid_close_inhibition(self):
'''Check that we correctly inhibit suspend with an external monitor'''
# Wait and flush log
time.sleep (gsdpowerconstants.LID_CLOSE_SAFETY_TIMEOUT + 1)
self.plugin_log.clear()
# Wait for startup inhibition to be gone
self.check_for_lid_uninhibited(gsdpowerconstants.LID_CLOSE_SAFETY_TIMEOUT + 2)
# Add an external monitor
self.set_has_external_monitor(True)
......
......@@ -98,7 +98,6 @@ static gpointer manager_object = NULL;
static const char * const services[] = {
"rygel",
"gnome-remote-desktop",
"gnome-user-share-webdav"
};
......
......@@ -7,7 +7,6 @@ policy_in = configure_file(
)
i18n.merge_file(
policy,
input: policy_in,
output: policy,
po_dir: po_dir,
......
......@@ -57,6 +57,8 @@
#define WM_SETTINGS_SCHEMA "org.gnome.desktop.wm.preferences"
#define A11Y_SCHEMA "org.gnome.desktop.a11y"
#define A11Y_INTERFACE_SCHEMA "org.gnome.desktop.a11y.interface"
#define A11Y_APPLICATIONS_SCHEMA "org.gnome.desktop.a11y.applications"
#define INPUT_SOURCES_SCHEMA "org.gnome.desktop.input-sources"
#define CLASSIC_WM_SETTINGS_SCHEMA "org.gnome.shell.extensions.classic-overrides"
#define XSETTINGS_PLUGIN_SCHEMA "org.gnome.settings-daemon.plugins.xsettings"
......@@ -75,9 +77,18 @@
#define HIGH_CONTRAST_KEY "high-contrast"
#define INPUT_SOURCES_KEY "sources"
#define OSK_ENABLED_KEY "screen-keyboard-enabled"
#define GTK_IM_MODULE_KEY "gtk-im-module"
#define GTK_SETTINGS_DBUS_PATH "/org/gtk/Settings"
#define GTK_SETTINGS_DBUS_NAME "org.gtk.Settings"
#define INPUT_SOURCE_TYPE_IBUS "ibus"
#define GTK_IM_MODULE_SIMPLE "gtk-im-context-simple"
#define GTK_IM_MODULE_IBUS "ibus"
static const gchar introspection_xml[] =
"<node name='/org/gtk/Settings'>"
" <interface name='org.gtk.Settings'>"
......@@ -280,6 +291,11 @@ struct _GsdXSettingsManager
FcMonitor *fontconfig_monitor;
gint64 fontconfig_timestamp;
GSettings *interface_settings;
GSettings *input_sources_settings;
GSettings *a11y_settings;
GdkSeat *user_seat;
GsdXSettingsGtk *gtk;
guint introspect_properties_changed_id;
......@@ -289,6 +305,9 @@ struct _GsdXSettingsManager
guint display_config_watch_id;
guint monitors_changed_id;
guint device_added_id;
guint device_removed_id;
guint shell_name_watch_id;
gboolean have_shell;
......@@ -1323,6 +1342,112 @@ migrate_settings (void)
mouse_entries, G_N_ELEMENTS (mouse_entries));
}
static gboolean
need_ibus (GsdXSettingsManager *manager)
{
GVariant *sources;
GVariantIter iter;
const gchar *type;
gboolean needs_ibus = FALSE;
sources = g_settings_get_value (manager->input_sources_settings,
INPUT_SOURCES_KEY);
g_variant_iter_init (&iter, sources);
while (g_variant_iter_next (&iter, "(&s&s)", &type, NULL)) {
if (g_str_equal (type, INPUT_SOURCE_TYPE_IBUS)) {
needs_ibus = TRUE;
break;
}
}
g_variant_unref (sources);
return needs_ibus;
}
static gboolean
need_osk (GsdXSettingsManager *manager)
{
gboolean has_touchscreen = FALSE;
GList *devices;
GdkSeat *seat;
if (g_settings_get_boolean (manager->a11y_settings,
OSK_ENABLED_KEY))
return TRUE;
seat = gdk_display_get_default_seat (gdk_display_get_default ());
devices = gdk_seat_get_slaves (seat, GDK_SEAT_CAPABILITY_TOUCH);
has_touchscreen = devices != NULL;
g_list_free (devices);
return has_touchscreen;
}
static void
update_gtk_im_module (GsdXSettingsManager *manager)
{
const gchar *module;
gchar *setting;
setting = g_settings_get_string (manager->interface_settings,
GTK_IM_MODULE_KEY);
if (setting && *setting)
module = setting;
else if (need_ibus (manager) || need_osk (manager))
module = GTK_IM_MODULE_IBUS;
else
module = GTK_IM_MODULE_SIMPLE;
xsettings_manager_set_string (manager->manager, "Gtk/IMModule", module);
g_free (setting);
}
static void
device_added_cb (GdkSeat *user_seat,
GdkDevice *device,
GsdXSettingsManager *manager)
{
GdkInputSource source;
source = gdk_device_get_source (device);
if (source == GDK_SOURCE_TOUCHSCREEN) {
update_gtk_im_module (manager);
}
}
static void
device_removed_cb (GdkSeat *user_seat,
GdkDevice *device,
GsdXSettingsManager *manager)
{
GdkInputSource source;
source = gdk_device_get_source (device);
if (source == GDK_SOURCE_TOUCHSCREEN)
update_gtk_im_module (manager);
}
static void
set_devicepresence_handler (GsdXSettingsManager *manager)
{
GdkSeat *user_seat;
if (gnome_settings_is_wayland ())
return;
user_seat = gdk_display_get_default_seat (gdk_display_get_default ());
manager->device_added_id = g_signal_connect (G_OBJECT (user_seat), "device-added",
G_CALLBACK (device_added_cb), manager);
manager->device_removed_id = g_signal_connect (G_OBJECT (user_seat), "device-removed",
G_CALLBACK (device_removed_cb), manager);
manager->user_seat = user_seat;
}
gboolean
gsd_xsettings_manager_start (GsdXSettingsManager *manager,
GError **error)
......@@ -1344,6 +1469,23 @@ gsd_xsettings_manager_start (GsdXSettingsManager *manager,
return FALSE;
}
set_devicepresence_handler (manager);
manager->interface_settings = g_settings_new (INTERFACE_SETTINGS_SCHEMA);
g_signal_connect_swapped (manager->interface_settings,
"changed::" GTK_IM_MODULE_KEY,
G_CALLBACK (update_gtk_im_module), manager);
manager->input_sources_settings = g_settings_new (INPUT_SOURCES_SCHEMA);
g_signal_connect_swapped (manager->input_sources_settings,
"changed::" INPUT_SOURCES_KEY,
G_CALLBACK (update_gtk_im_module), manager);
manager->a11y_settings = g_settings_new (A11Y_APPLICATIONS_SCHEMA);
g_signal_connect_swapped (manager->a11y_settings,
"changed::" OSK_ENABLED_KEY,
G_CALLBACK (update_gtk_im_module), manager);
update_gtk_im_module (manager);
manager->monitors_changed_id =
g_dbus_connection_signal_subscribe (manager->dbus_connection,
"org.gnome.Mutter.DisplayConfig",
......@@ -1541,6 +1683,16 @@ gsd_xsettings_manager_stop (GsdXSettingsManager *manager)
g_object_unref (manager->gtk);
manager->gtk = NULL;
}
if (manager->user_seat != NULL) {
g_signal_handler_disconnect (manager->user_seat, manager->device_added_id);
g_signal_handler_disconnect (manager->user_seat, manager->device_removed_id);
manager->user_seat = NULL;
}
g_clear_object (&manager->a11y_settings);
g_clear_object (&manager->input_sources_settings);
g_clear_object (&manager->interface_settings);
}
static void
......
......@@ -15,7 +15,6 @@ plugins/datetime/gsd-datetime-manager.c
plugins/housekeeping/gsd-disk-space.c
plugins/keyboard/gsd-keyboard-manager.c
plugins/media-keys/gsd-media-keys-manager.c
plugins/media-keys/gsd-screenshot-utils.c
plugins/media-keys/shortcuts-list.h
plugins/power/gpm-common.c
plugins/power/gsd-power-manager.c
......
This diff is collapsed.