3838#include <gtk/gtk.h>
3939
4040#include "cinnamon-settings-profile.h"
41+ #include "cinnamon-settings-session.h"
4142#include "csd-keyboard-manager.h"
42- #include "csd-input-helper.h"
4343#include "csd-enums.h"
4444#include "migrate-settings.h"
4545
5656
5757#define CINNAMON_DESKTOP_INTERFACE_DIR "org.cinnamon.desktop.interface"
5858
59- #define KEY_GTK_IM_MODULE "gtk-im-module"
60- #define GTK_IM_MODULE_SIMPLE "gtk-im-context-simple"
61- #define GTK_IM_MODULE_IBUS "ibus"
62-
6359#define CINNAMON_DESKTOP_INPUT_SOURCES_DIR "org.gnome.desktop.input-sources"
6460
6561#define KEY_INPUT_SOURCES "sources"
7066
7167#define DEFAULT_LAYOUT "us"
7268
73- #define CINNAMON_A11Y_APPLICATIONS_INTERFACE_DIR "org.cinnamon.desktop.a11y.applications"
74- #define KEY_OSK_ENABLED "screen-keyboard-enabled"
75-
7669struct _CsdKeyboardManager
7770{
7871 GObject parent ;
7972
8073 guint start_idle_id ;
8174 GSettings * settings ;
8275 GSettings * input_sources_settings ;
83- GSettings * a11y_settings ;
8476 GDBusProxy * localed ;
8577 GCancellable * cancellable ;
86-
87- GdkDeviceManager * device_manager ;
88- guint device_added_id ;
89- guint device_removed_id ;
9078};
9179
9280static void csd_keyboard_manager_class_init (CsdKeyboardManagerClass * klass );
9381static void csd_keyboard_manager_init (CsdKeyboardManager * keyboard_manager );
9482static void csd_keyboard_manager_finalize (GObject * object );
9583
96- static void update_gtk_im_module (CsdKeyboardManager * manager );
97-
9884G_DEFINE_TYPE (CsdKeyboardManager , csd_keyboard_manager , G_TYPE_OBJECT )
9985
10086static gpointer manager_object = NULL ;
10187
102- static gboolean
103- session_is_wayland (void )
104- {
105- static gboolean session_is_wayland = FALSE;
106- static gsize once_init = 0 ;
107-
108- if (g_once_init_enter (& once_init )) {
109- const gchar * env = g_getenv ("XDG_SESSION_TYPE" );
110- if (env && g_strcmp0 (env , "wayland" ) == 0 ) {
111- session_is_wayland = TRUE;
112- }
113-
114- g_debug ("Session is Wayland? %d" , session_is_wayland );
115-
116- g_once_init_leave (& once_init , 1 );
117- }
118-
119- return session_is_wayland ;
120- }
121-
12288static void
12389init_builder_with_sources (GVariantBuilder * builder ,
12490 GSettings * settings )
@@ -151,7 +117,7 @@ apply_bell (CsdKeyboardManager *manager)
151117 CsdBellMode bell_mode ;
152118 int click_volume ;
153119
154- if (session_is_wayland ())
120+ if (cinnamon_settings_session_is_wayland ())
155121 return ;
156122
157123 g_debug ("Applying the bell settings" );
@@ -211,121 +177,6 @@ settings_changed (GSettings *settings,
211177
212178}
213179
214- static void
215- device_added_cb (GdkDeviceManager * device_manager ,
216- GdkDevice * device ,
217- CsdKeyboardManager * manager )
218- {
219- GdkInputSource source ;
220-
221- source = gdk_device_get_source (device );
222- if (source == GDK_SOURCE_TOUCHSCREEN ) {
223- update_gtk_im_module (manager );
224- }
225- }
226-
227- static void
228- device_removed_cb (GdkDeviceManager * device_manager ,
229- GdkDevice * device ,
230- CsdKeyboardManager * manager )
231- {
232- GdkInputSource source ;
233-
234- source = gdk_device_get_source (device );
235- if (source == GDK_SOURCE_TOUCHSCREEN )
236- update_gtk_im_module (manager );
237- }
238-
239- static void
240- set_devicepresence_handler (CsdKeyboardManager * manager )
241- {
242- GdkDeviceManager * device_manager ;
243-
244- if (session_is_wayland ())
245- return ;
246-
247- device_manager = gdk_display_get_device_manager (gdk_display_get_default ());
248-
249- manager -> device_added_id = g_signal_connect (G_OBJECT (device_manager ), "device-added" ,
250- G_CALLBACK (device_added_cb ), manager );
251- manager -> device_removed_id = g_signal_connect (G_OBJECT (device_manager ), "device-removed" ,
252- G_CALLBACK (device_removed_cb ), manager );
253- manager -> device_manager = device_manager ;
254- }
255-
256- static gboolean
257- need_ibus (GVariant * sources )
258- {
259- GVariantIter iter ;
260- const gchar * type ;
261-
262- g_variant_iter_init (& iter , sources );
263- while (g_variant_iter_next (& iter , "(&s&s)" , & type , NULL ))
264- if (g_str_equal (type , INPUT_SOURCE_TYPE_IBUS ))
265- return TRUE;
266-
267- return FALSE;
268- }
269-
270- static gboolean
271- need_osk (CsdKeyboardManager * manager )
272- {
273- gboolean has_touchscreen = FALSE;
274- GList * devices ;
275- GdkSeat * seat ;
276-
277- if (g_settings_get_boolean (manager -> a11y_settings ,
278- KEY_OSK_ENABLED ))
279- return TRUE;
280-
281- seat = gdk_display_get_default_seat (gdk_display_get_default ());
282- devices = gdk_seat_get_slaves (seat , GDK_SEAT_CAPABILITY_TOUCH );
283-
284- has_touchscreen = devices != NULL ;
285-
286- g_list_free (devices );
287-
288- return has_touchscreen ;
289- }
290-
291- static void
292- set_gtk_im_module (CsdKeyboardManager * manager ,
293- GSettings * settings ,
294- GVariant * sources )
295- {
296- const gchar * new_module ;
297- gchar * current_module ;
298-
299- if (need_ibus (sources ) || need_osk (manager ))
300- new_module = GTK_IM_MODULE_IBUS ;
301- else
302- new_module = GTK_IM_MODULE_SIMPLE ;
303-
304- current_module = g_settings_get_string (settings , KEY_GTK_IM_MODULE );
305- if (!g_str_equal (current_module , new_module ))
306- g_settings_set_string (settings , KEY_GTK_IM_MODULE , new_module );
307- g_free (current_module );
308- }
309-
310- static void
311- update_gtk_im_module (CsdKeyboardManager * manager )
312- {
313- GSettings * interface_settings ;
314- GVariant * sources ;
315-
316- /* Gtk+ uses the IM module advertised in XSETTINGS so, if we
317- * have IBus input sources, we want it to load that
318- * module. Otherwise we can use the default "simple" module
319- * which is builtin gtk+
320- */
321- interface_settings = g_settings_new (CINNAMON_DESKTOP_INTERFACE_DIR );
322- sources = g_settings_get_value (manager -> input_sources_settings ,
323- KEY_INPUT_SOURCES );
324- set_gtk_im_module (manager , interface_settings , sources );
325- g_object_unref (interface_settings );
326- g_variant_unref (sources );
327- }
328-
329180static void
330181get_sources_from_xkb_config (CsdKeyboardManager * manager )
331182{
@@ -457,18 +308,7 @@ start_keyboard_idle_cb (CsdKeyboardManager *manager)
457308
458309 manager -> settings = g_settings_new (CSD_KEYBOARD_DIR );
459310
460- set_devicepresence_handler (manager );
461-
462311 manager -> input_sources_settings = g_settings_new (CINNAMON_DESKTOP_INPUT_SOURCES_DIR );
463- g_signal_connect_swapped (manager -> input_sources_settings ,
464- "changed::" KEY_INPUT_SOURCES ,
465- G_CALLBACK (update_gtk_im_module ), manager );
466-
467- manager -> a11y_settings = g_settings_new (CINNAMON_A11Y_APPLICATIONS_INTERFACE_DIR );
468- g_signal_connect_swapped (manager -> a11y_settings ,
469- "changed::" KEY_OSK_ENABLED ,
470- G_CALLBACK (update_gtk_im_module ), manager );
471- update_gtk_im_module (manager );
472312
473313 manager -> cancellable = g_cancellable_new ();
474314
@@ -482,7 +322,7 @@ start_keyboard_idle_cb (CsdKeyboardManager *manager)
482322 localed_proxy_ready ,
483323 manager );
484324
485- if (!session_is_wayland ()) {
325+ if (!cinnamon_settings_session_is_wayland ()) {
486326 /* apply current settings before we install the callback */
487327 g_debug ("Started the keyboard plugin, applying all settings" );
488328 apply_all_settings (manager );
@@ -522,14 +362,7 @@ csd_keyboard_manager_stop (CsdKeyboardManager *manager)
522362
523363 g_clear_object (& manager -> settings );
524364 g_clear_object (& manager -> input_sources_settings );
525- g_clear_object (& manager -> a11y_settings );
526365 g_clear_object (& manager -> localed );
527-
528- if (manager -> device_manager != NULL ) {
529- g_signal_handler_disconnect (manager -> device_manager , manager -> device_added_id );
530- g_signal_handler_disconnect (manager -> device_manager , manager -> device_removed_id );
531- manager -> device_manager = NULL ;
532- }
533366}
534367
535368static void
0 commit comments