Codebase list cinnamon-settings-daemon / upstream/3.8.0
New upstream version 3.8.0 Fabio Fantoni 6 years ago
18 changed file(s) with 557 addition(s) and 438 deletion(s). Raw diff Collapse all Expand all
0 version: 2.0
1
2 shared: &shared
3
4 steps:
5
6 - checkout
7
8 - run:
9 name: Prepare environment
10 command: apt-get update
11
12 - run:
13 name: Install dependencies
14 command: |
15 wget https://github.com/linuxmint/cinnamon-desktop/releases/download/master.${CIRCLE_JOB}/packages.tar.gz -O cinnamon-desktop.tar.gz
16 ls *.tar.gz | xargs -i tar zxvf {}
17 apt install --yes --allow-downgrades ./packages/*.deb
18 rm -rf packages
19
20 - run:
21 name: Build project
22 command: mint-build -i
23
24 - run:
25 name: Prepare packages
26 command: |
27 if [ -z $CI_PULL_REQUEST ]; then
28 mkdir /packages
29 mv /root/*.deb /packages/
30 git log > /packages/git.log
31 cd /
32 tar zcvf packages.tar.gz packages
33 fi
34
35 - run:
36 name: Deploy packages to Github
37 command: |
38 if [ -z $CI_PULL_REQUEST ]; then
39 wget https://github.com/tcnksm/ghr/releases/download/v0.5.4/ghr_v0.5.4_linux_amd64.zip
40 apt-get install --yes unzip
41 unzip ghr_v0.5.4_linux_amd64.zip
42 TAG="master".$CIRCLE_JOB
43 ./ghr -t $GITHUB_TOKEN -u $CIRCLE_PROJECT_USERNAME -r $CIRCLE_PROJECT_REPONAME -replace $TAG /packages.tar.gz
44 ./ghr -t $GITHUB_TOKEN -u $CIRCLE_PROJECT_USERNAME -r $CIRCLE_PROJECT_REPONAME -recreate -b "Latest unstable packages" $TAG /packages.tar.gz
45 fi
46
47 jobs:
48 "mint18":
49 <<: *shared
50 docker:
51 - image: linuxmintd/mint18-amd64
52
53 "mint19":
54 <<: *shared
55 docker:
56 - image: linuxmintd/mint19-amd64
57
58 "lmde3":
59 <<: *shared
60 docker:
61 - image: linuxmintd/lmde3-amd64
62
63 workflows:
64 version: 2
65 build:
66 jobs:
67 - "mint18"
68 - "mint19"
69 - "lmde3"
+0
-12
README.md less more
0 TODO:
1
2 - Remove custom keybinding code (we handle that in Cinnamon now) - do we want to handle media keys in cinnamon also? Would get around the 'no meda keys while a menu is open' issue.
3 - Switch to Gnome's keyboard layout (gsettings) handler - basically reverting Ubuntu's patch for this. This will allow us to implement ibus popups directly in Cinnamon
4 - Look into backgrounds - we should be able to eliminate the background manager in the cinnamon gnome 3.8 compat rollup, and continue to handle backgrounds as we currently do
5 - Investigate: How to keep gnome-settings-daemon from autostarting. It checks for environment=GNOME... which means Cinnamon also - is it time to have our own freedesktop.org name?
6
7 -- Update on this: Setting session name to Cinnamon works - then add to main.c in cinnamon, to set XDG_CURRENT_DESKTOP=GNOME makes sure apps keep showing up
8
9 - Multiple backgrounds on multiple monitors
10
11 - /etc/acpi/powerbtn.sh - add cinnamon-settings-daemon to script - how? postinst?
0 cinnamon-settings-daemon is a collection of plugins.
1
2 These plugins are started by cinnamon-session when you log in.
3
4 The plugins run in the background, each with their own process.
5
6 Plugins:
7 ========
8
9 Here's a description of each plugin.
10
11 a11y-keyboard
12 -------------
13
14 a11y-settings
15 -------------
16
17 automount
18 ---------
19
20 background
21 ----------
22
23 clipboard
24 ---------
25
26 Xorg features two ways of copying and pasting content. The first one is ``X-clipboard``, which is commonly used in edit menus and using ``Ctrl+C`` and ``Ctrl+V``. The second one is ``X-selection`` which is used by selecting content with the mouse and pasting it with a middle-click.
27
28 When you copy content from a window, that content is available either in ``X-clipboard`` or ``X-selection`` until the application which owns that window is terminated.
29
30 This plugin keeps the content of ``X-clipboard`` in memory, so that even if the owner application exits the content continues to be available.
31
32 color
33 -----
34
35 common
36 ------
37
38 cursor
39 ------
40
41 datetime
42 --------
43
44 dummy
45 -----
46
47 This is a dummy plugin. It doesn't do anything.
48
49 housekeeping
50 ------------
51
52 **thumbnail cache**
53
54 The thumbnail cache is cleaned up according to the settings stored in ``org.cinnamon.desktop.thumbnail-cache``.
55
56 This is done 2 minutes after login and then once a day.
57
58 **low disk space**
59
60 Every minute, the plugin checks the mounted volume to see if they have low disk space, according to the settings stored in ``org.cinnamon.settings-daemon.plugins.housekeeping``.
61
62 The plugin shows a notification when a volume is full.
63
64 keyboard
65 --------
66
67 This plugin handles the keyboard.
68
69 **keyboard settings**
70
71 It reads and listens to the ``org.cinnamon.settings-daemon.peripherals.keyboard`` settings and applies the configuration.
72
73 **numlock state**
74
75 It also listens to the state of the numlock key and saves it in the settings to ensure the state is remembered and preserved for the next session.
76
77 **keyboard layout**
78
79 The layout selection is done in cinnamon-control-center's region plugin (which is presented to the user in cinnamon-settings' keyboard module). That configuration is set directly via gkbd (libgnomekbd) and xkl (libxklavier). This plugin reads and listens to that configuration and assigns to the keyboard.
80
81 **hotplug command**
82
83 Although it isn't configured by default or used by cinnamon-settings, when a keyboard is plugged in, or removed, the plugin executes the command specified in ``org.cinnamon.settings-daemon.peripherals.input-devices hotplug-command`` with a series of argument to specify the event type, the device etc..
84
85 An example script which can be used for such a command is available in ``plugins/common/input-device-example.sh``.
86
87 media-keys
88 ----------
89
90 mouse
91 -----
92
93 This plugin handles mice and touchpads.
94
95 It reads and listens to the ``org.cinnamon.settings-daemon.peripherals.mouse`` and ``org.cinnamon.settings-daemon.peripherals.touchpad`` settings and applies the configuration in X11.
96
97 This plugin supports synaptics and libinput devices.
98
99 orientation
100 -----------
101
102 power
103 -----
104
105 print-notifications
106 -------------------
107
108 This plugin shows printer notifications.
109
110 On DBUS, it listens to events on ``org.cups.cupsd.Notifier``.
111
112 Libnotify is used to show the notifications.
113
114 screensaver-proxy
115 -----------------
116
117 smartcard
118 ---------
119
120 sound
121 -----
122
123 This plugin is use to play sound files or theme sounds via PulseAudio.
124
125 It's available via dbus at ``org.cinnamon.SettingsDaemon.Sound``.
126
127 Its configuration is ``org.cinnamon.desktop.sound``.
128
129 wacom
130 -----
131
132 This plugin handles wacom tablets.
133
134 It reads and listens to the ``org.cinnamon.settings-daemon.peripherals.wacom`` and applies the configuration in X11.
135
136 xrandr
137 ------
138
139 xsettings
140 ---------
141
142 This plugin sets the settings for GTK and Xft.
143
144 TESTING
145 =======
146
147 To test a plugin:
148
149 1. Kill the running CSD plugin
150 2. Build the project
151 3. Run the built plugin in verbose mode
152
153 For instance:
154
155 * ``killall csd-sound`` (you might have to kill it twice, if CSM tries to restart it)
156 * ``dpkg-buildpackage``
157 * ``plugins/sound/csd-sound --verbose``
158
159
160 TODO:
161 =====
162
163 - Remove custom keybinding code (we handle that in Cinnamon now) - do we want to handle media keys in cinnamon also? Would get around the 'no meda keys while a menu is open' issue.
164 - Switch to Gnome's keyboard layout (gsettings) handler - basically reverting Ubuntu's patch for this. This will allow us to implement ibus popups directly in Cinnamon
165 - Look into backgrounds - we should be able to eliminate the background manager in the cinnamon gnome 3.8 compat rollup, and continue to handle backgrounds as we currently do
166 - Investigate: How to keep gnome-settings-daemon from autostarting. It checks for environment=GNOME... which means Cinnamon also - is it time to have our own freedesktop.org name?
167
168 -- Update on this: Setting session name to Cinnamon works - then add to main.c in cinnamon, to set XDG_CURRENT_DESKTOP=GNOME makes sure apps keep showing up
169
170 - Multiple backgrounds on multiple monitors
171
172 - /etc/acpi/powerbtn.sh - add cinnamon-settings-daemon to script - how? postinst?
173
77 msgstr ""
88 "Project-Id-Version: PACKAGE VERSION\n"
99 "Report-Msgid-Bugs-To: \n"
10 "POT-Creation-Date: 2017-10-23 13:57+0100\n"
10 "POT-Creation-Date: 2018-04-17 13:13+0100\n"
1111 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
1212 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
1313 "Language-Team: LANGUAGE <LL@li.org>\n"
4141
4242 #: plugins/a11y-keyboard/csd-a11y-keyboard-manager.c:521
4343 #: plugins/a11y-keyboard/csd-a11y-keyboard-manager.c:656
44 #: plugins/mouse/csd-mouse-manager.c:1333
4544 msgid "Universal Access"
4645 msgstr ""
4746
401400 msgid "Region and Language Settings"
402401 msgstr ""
403402
404 #: plugins/mouse/csd-mouse-manager.c:1329
405 msgid "Could not enable mouse accessibility features"
406 msgstr ""
407
408 #: plugins/mouse/csd-mouse-manager.c:1331
409 msgid ""
410 "Mouse accessibility requires Mousetweaks to be installed on your system."
411 msgstr ""
412
413 #: plugins/power/csd-power-manager.c:1149
403 #: plugins/power/csd-power-manager.c:1150
414404 msgid "UPS Discharging"
415405 msgstr ""
416406
417 #: plugins/power/csd-power-manager.c:1154
407 #: plugins/power/csd-power-manager.c:1155
418408 #, c-format
419409 msgid "%s of UPS backup power remaining"
420410 msgstr ""
421411
422 #: plugins/power/csd-power-manager.c:1175
423 #: plugins/power/csd-power-manager.c:1395
424 #: plugins/power/csd-power-manager.c:1575
425 #: plugins/power/csd-power-manager.c:1724
412 #: plugins/power/csd-power-manager.c:1176
413 #: plugins/power/csd-power-manager.c:1396
414 #: plugins/power/csd-power-manager.c:1576
415 #: plugins/power/csd-power-manager.c:1725
426416 msgid "Power"
427417 msgstr ""
428418
429 #: plugins/power/csd-power-manager.c:1307
419 #: plugins/power/csd-power-manager.c:1308
430420 msgid "Battery low"
431421 msgstr ""
432422
433 #: plugins/power/csd-power-manager.c:1310
423 #: plugins/power/csd-power-manager.c:1311
434424 msgid "Laptop battery low"
435425 msgstr ""
436426
437 #: plugins/power/csd-power-manager.c:1317
427 #: plugins/power/csd-power-manager.c:1318
438428 #, c-format
439429 msgid "Approximately %s remaining (%.0f%%)"
440430 msgstr ""
441431
442 #: plugins/power/csd-power-manager.c:1322
432 #: plugins/power/csd-power-manager.c:1323
443433 msgid "UPS low"
444434 msgstr ""
445435
446 #: plugins/power/csd-power-manager.c:1328
436 #: plugins/power/csd-power-manager.c:1329
447437 #, c-format
448438 msgid "Approximately %s of remaining UPS backup power (%.0f%%)"
449439 msgstr ""
450440
451 #: plugins/power/csd-power-manager.c:1333
452 #: plugins/power/csd-power-manager.c:1498
441 #: plugins/power/csd-power-manager.c:1334
442 #: plugins/power/csd-power-manager.c:1499
453443 msgid "Mouse battery low"
454444 msgstr ""
455445
456 #: plugins/power/csd-power-manager.c:1336
446 #: plugins/power/csd-power-manager.c:1337
457447 #, c-format
458448 msgid "Wireless mouse is low in power (%.0f%%)"
459449 msgstr ""
460450
461 #: plugins/power/csd-power-manager.c:1340
462 #: plugins/power/csd-power-manager.c:1506
451 #: plugins/power/csd-power-manager.c:1341
452 #: plugins/power/csd-power-manager.c:1507
463453 msgid "Keyboard battery low"
464454 msgstr ""
465455
466 #: plugins/power/csd-power-manager.c:1343
456 #: plugins/power/csd-power-manager.c:1344
467457 #, c-format
468458 msgid "Wireless keyboard is low in power (%.0f%%)"
469459 msgstr ""
470460
471 #: plugins/power/csd-power-manager.c:1347
472 #: plugins/power/csd-power-manager.c:1515
461 #: plugins/power/csd-power-manager.c:1348
462 #: plugins/power/csd-power-manager.c:1516
473463 msgid "PDA battery low"
474464 msgstr ""
475465
476 #: plugins/power/csd-power-manager.c:1350
466 #: plugins/power/csd-power-manager.c:1351
477467 #, c-format
478468 msgid "PDA is low in power (%.0f%%)"
479469 msgstr ""
480470
481 #: plugins/power/csd-power-manager.c:1354
482 #: plugins/power/csd-power-manager.c:1525
483 #: plugins/power/csd-power-manager.c:1535
471 #: plugins/power/csd-power-manager.c:1355
472 #: plugins/power/csd-power-manager.c:1526
473 #: plugins/power/csd-power-manager.c:1536
484474 msgid "Cell phone battery low"
485475 msgstr ""
486476
487 #: plugins/power/csd-power-manager.c:1357
477 #: plugins/power/csd-power-manager.c:1358
488478 #, c-format
489479 msgid "Cell phone is low in power (%.0f%%)"
490480 msgstr ""
491481
492 #: plugins/power/csd-power-manager.c:1361
482 #: plugins/power/csd-power-manager.c:1362
493483 msgid "Media player battery low"
494484 msgstr ""
495485
496 #: plugins/power/csd-power-manager.c:1364
486 #: plugins/power/csd-power-manager.c:1365
497487 #, c-format
498488 msgid "Media player is low in power (%.0f%%)"
499489 msgstr ""
500490
501 #: plugins/power/csd-power-manager.c:1368
502 #: plugins/power/csd-power-manager.c:1544
491 #: plugins/power/csd-power-manager.c:1369
492 #: plugins/power/csd-power-manager.c:1545
503493 msgid "Tablet battery low"
504494 msgstr ""
505495
506 #: plugins/power/csd-power-manager.c:1371
496 #: plugins/power/csd-power-manager.c:1372
507497 #, c-format
508498 msgid "Tablet is low in power (%.0f%%)"
509499 msgstr ""
510500
511 #: plugins/power/csd-power-manager.c:1375
512 #: plugins/power/csd-power-manager.c:1553
501 #: plugins/power/csd-power-manager.c:1376
502 #: plugins/power/csd-power-manager.c:1554
513503 msgid "Attached computer battery low"
514504 msgstr ""
515505
516 #: plugins/power/csd-power-manager.c:1378
506 #: plugins/power/csd-power-manager.c:1379
517507 #, c-format
518508 msgid "Attached computer is low in power (%.0f%%)"
519509 msgstr ""
520510
521 #: plugins/power/csd-power-manager.c:1412
511 #: plugins/power/csd-power-manager.c:1413
522512 msgid "Battery is low"
523513 msgstr ""
524514
525 #: plugins/power/csd-power-manager.c:1454
515 #: plugins/power/csd-power-manager.c:1455
526516 msgid "Battery critically low"
527517 msgstr ""
528518
529 #: plugins/power/csd-power-manager.c:1457
530 #: plugins/power/csd-power-manager.c:1640
519 #: plugins/power/csd-power-manager.c:1458
520 #: plugins/power/csd-power-manager.c:1641
531521 msgid "Laptop battery critically low"
532522 msgstr ""
533523
534 #: plugins/power/csd-power-manager.c:1466
524 #: plugins/power/csd-power-manager.c:1467
535525 msgid "Plug in your AC adapter to avoid losing data."
536526 msgstr ""
537527
538 #: plugins/power/csd-power-manager.c:1470
528 #: plugins/power/csd-power-manager.c:1471
539529 msgid "Computer will suspend very soon unless it is plugged in."
540530 msgstr ""
541531
542 #: plugins/power/csd-power-manager.c:1474
532 #: plugins/power/csd-power-manager.c:1475
543533 msgid "Computer will hibernate very soon unless it is plugged in."
544534 msgstr ""
545535
546 #: plugins/power/csd-power-manager.c:1478
536 #: plugins/power/csd-power-manager.c:1479
547537 msgid "Computer will shutdown very soon unless it is plugged in."
548538 msgstr ""
549539
550 #: plugins/power/csd-power-manager.c:1486
551 #: plugins/power/csd-power-manager.c:1676
540 #: plugins/power/csd-power-manager.c:1487
541 #: plugins/power/csd-power-manager.c:1677
552542 msgid "UPS critically low"
553543 msgstr ""
554544
555 #: plugins/power/csd-power-manager.c:1492
545 #: plugins/power/csd-power-manager.c:1493
556546 #, c-format
557547 msgid ""
558548 "Approximately %s of remaining UPS power (%.0f%%). Restore AC power to your "
559549 "computer to avoid losing data."
560550 msgstr ""
561551
562 #: plugins/power/csd-power-manager.c:1501
552 #: plugins/power/csd-power-manager.c:1502
563553 #, c-format
564554 msgid ""
565555 "Wireless mouse is very low in power (%.0f%%). This device will soon stop "
566556 "functioning if not charged."
567557 msgstr ""
568558
569 #: plugins/power/csd-power-manager.c:1509
559 #: plugins/power/csd-power-manager.c:1510
570560 #, c-format
571561 msgid ""
572562 "Wireless keyboard is very low in power (%.0f%%). This device will soon stop "
573563 "functioning if not charged."
574564 msgstr ""
575565
576 #: plugins/power/csd-power-manager.c:1518
566 #: plugins/power/csd-power-manager.c:1519
577567 #, c-format
578568 msgid ""
579569 "PDA is very low in power (%.0f%%). This device will soon stop functioning if "
580570 "not charged."
581571 msgstr ""
582572
583 #: plugins/power/csd-power-manager.c:1528
573 #: plugins/power/csd-power-manager.c:1529
584574 #, c-format
585575 msgid ""
586576 "Cell phone is very low in power (%.0f%%). This device will soon stop "
587577 "functioning if not charged."
588578 msgstr ""
589579
590 #: plugins/power/csd-power-manager.c:1538
580 #: plugins/power/csd-power-manager.c:1539
591581 #, c-format
592582 msgid ""
593583 "Media player is very low in power (%.0f%%). This device will soon stop "
594584 "functioning if not charged."
595585 msgstr ""
596586
597 #: plugins/power/csd-power-manager.c:1547
587 #: plugins/power/csd-power-manager.c:1548
598588 #, c-format
599589 msgid ""
600590 "Tablet is very low in power (%.0f%%). This device will soon stop functioning "
601591 "if not charged."
602592 msgstr ""
603593
604 #: plugins/power/csd-power-manager.c:1556
594 #: plugins/power/csd-power-manager.c:1557
605595 #, c-format
606596 msgid ""
607597 "Attached computer is very low in power (%.0f%%). The device will soon "
608598 "shutdown if not charged."
609599 msgstr ""
610600
611 #: plugins/power/csd-power-manager.c:1593
612 #: plugins/power/csd-power-manager.c:1603
613 #: plugins/power/csd-power-manager.c:1739
601 #: plugins/power/csd-power-manager.c:1594
602 #: plugins/power/csd-power-manager.c:1604
603 #: plugins/power/csd-power-manager.c:1740
614604 msgid "Battery is critically low"
615605 msgstr ""
616606
617 #: plugins/power/csd-power-manager.c:1648
607 #: plugins/power/csd-power-manager.c:1649
618608 msgid ""
619609 "The battery is below the critical level and this computer will <b>power-off</"
620610 "b> when the battery becomes completely empty."
621611 msgstr ""
622612
623 #: plugins/power/csd-power-manager.c:1654
613 #: plugins/power/csd-power-manager.c:1655
624614 msgid ""
625615 "The battery is below the critical level and this computer is about to "
626616 "suspend.\n"
628618 "suspended state."
629619 msgstr ""
630620
631 #: plugins/power/csd-power-manager.c:1661
621 #: plugins/power/csd-power-manager.c:1662
632622 msgid ""
633623 "The battery is below the critical level and this computer is about to "
634624 "hibernate."
635625 msgstr ""
636626
637 #: plugins/power/csd-power-manager.c:1666
627 #: plugins/power/csd-power-manager.c:1667
638628 msgid ""
639629 "The battery is below the critical level and this computer is about to "
640630 "shutdown."
641631 msgstr ""
642632
643 #: plugins/power/csd-power-manager.c:1684
633 #: plugins/power/csd-power-manager.c:1685
644634 msgid ""
645635 "UPS is below the critical level and this computer will <b>power-off</b> when "
646636 "the UPS becomes completely empty."
647637 msgstr ""
648638
649 #: plugins/power/csd-power-manager.c:1690
639 #: plugins/power/csd-power-manager.c:1691
650640 msgid ""
651641 "UPS is below the critical level and this computer is about to hibernate."
652642 msgstr ""
653643
654 #: plugins/power/csd-power-manager.c:1695
644 #: plugins/power/csd-power-manager.c:1696
655645 msgid "UPS is below the critical level and this computer is about to shutdown."
656646 msgstr ""
657647
658 #: plugins/power/csd-power-manager.c:2260
648 #: plugins/power/csd-power-manager.c:2261
659649 msgid "Lid has been opened"
660650 msgstr ""
661651
662 #: plugins/power/csd-power-manager.c:2420
652 #: plugins/power/csd-power-manager.c:2421
663653 msgid "Lid has been closed"
664654 msgstr ""
665655
666 #: plugins/power/csd-power-manager.c:4227
656 #: plugins/power/csd-power-manager.c:4201
667657 msgid "Power Manager"
668658 msgstr ""
669659
00 AC_PREREQ([2.60])
11
22 AC_INIT([cinnamon-settings-daemon],
3 [3.6.2],
3 [3.8.0],
44 [https://github.com/linuxmint/cinnamon-settings-daemon/issues])
55
66 AC_CONFIG_MACRO_DIR([m4])
182182 dnl ---------------------------------------------------------------------------
183183
184184 PKG_CHECK_MODULES(BACKGROUND, x11 cinnamon-desktop >= $CINNAMON_DESKTOP_REQUIRED_VERSION)
185 AC_SEARCH_LIBS(gnome_bg_set_accountsservice_background, cinnamon-desktop, AC_DEFINE([ACCOUNTSERVICE_BG],1, [Build with accountsservice background support]))
186185
187186 dnl ---------------------------------------------------------------------------
188187 dnl - mouse
145145 This can be useful for working around systems with broken default backlight control behavior which provide
146146 multiple interfaces. If you are having problems, try setting 'raw' to a higher priority.</_description>
147147 </key>
148 <key name="inhibit-lid-switch" type="b">
149 <default>true</default>
150 <_summary>Whether or not cinnamon-settings-daemon inhibits logind's handling of lid switch</_summary>
151 <_description>This setting should be true in all distributions and for all users. Only set it to false, if you want to prevent Cinnamon from handling lid switch events. In this case, you should not rely on Cinnamon's lid actions and use the logind ones instead.</_description>
152 </key>
148153 </schema>
149154 </schemalist>
134134 {
135135 gnome_bg_load_from_preferences (manager->priv->bg,
136136 manager->priv->settings);
137 #if ACCOUNTSERVICE_BG
138 gnome_bg_set_accountsservice_background(gnome_bg_get_filename(manager->priv->bg));
139 #endif
137
138 gnome_bg_set_accountsservice_background (gnome_bg_get_filename (manager->priv->bg));
139
140140 return FALSE;
141141 }
142142
185185 watch_bg_preferences (manager);
186186 gnome_bg_load_from_preferences (manager->priv->bg,
187187 manager->priv->settings);
188
189 gnome_bg_set_accountsservice_background (gnome_bg_get_filename (manager->priv->bg));
188190 }
189191
190192 static void
179179 gdk_error_trap_pop_ignored ();
180180 }
181181
182 static int
182 static gsize
183183 clipboard_bytes_per_item (int format)
184184 {
185185 switch (format) {
190190 }
191191
192192 return 0;
193 }
194
195 static void
196 free_contents (CsdClipboardManager *manager)
197 {
198 list_foreach (manager->priv->contents, (Callback)target_data_unref, NULL);
199 list_free (manager->priv->contents);
200 manager->priv->contents = NULL;
193201 }
194202
195203 static void
365373 unsigned long length;
366374 unsigned long items;
367375 unsigned char *data;
376 gsize bytes_per_item;
368377
369378 list = list_find (manager->priv->conversions,
370379 (ListFindFunc) find_conversion_requestor, xev);
373382
374383 rdata = (IncrConversion *) list->data;
375384
385 bytes_per_item = clipboard_bytes_per_item (rdata->data->format);
386 if (bytes_per_item == 0)
387 return False;
388
376389 data = rdata->data->data + rdata->offset;
377390 length = rdata->data->length - rdata->offset;
378391 if (length > SELECTION_MAX_SIZE)
380393
381394 rdata->offset += length;
382395
383 items = length / clipboard_bytes_per_item (rdata->data->format);
396 items = length / bytes_per_item;
384397 XChangeProperty (manager->priv->display, rdata->requestor,
385398 rdata->property, rdata->data->type,
386399 rdata->data->format, PropModeAppend,
519532 (unsigned char *) targets, n_targets);
520533 free (targets);
521534 } else {
535 gsize bytes_per_item;
536
522537 /* Convert from stored CLIPBOARD data */
523538 list = list_find (manager->priv->contents,
524539 (ListFindFunc) find_content_target, (void *) rdata->target);
534549 return;
535550 }
536551
552 bytes_per_item = clipboard_bytes_per_item (tdata->format);
553 if (bytes_per_item == 0)
554 return;
555
537556 rdata->data = target_data_ref (tdata);
538 items = tdata->length / clipboard_bytes_per_item (tdata->format);
557 items = tdata->length / bytes_per_item;
539558 if (tdata->length <= SELECTION_MAX_SIZE)
540559 XChangeProperty (manager->priv->display, rdata->requestor,
541560 rdata->property,
680699 switch (xev->xany.type) {
681700 case DestroyNotify:
682701 if (xev->xdestroywindow.window == manager->priv->requestor) {
683 list_foreach (manager->priv->contents, (Callback)target_data_unref, NULL);
684 list_free (manager->priv->contents);
685 manager->priv->contents = NULL;
702 free_contents (manager);
686703
687704 clipboard_manager_watch_cb (manager,
688705 manager->priv->requestor,
706723 if (xev->xselectionclear.selection == XA_CLIPBOARD_MANAGER) {
707724 /* We lost the manager selection */
708725 if (manager->priv->contents) {
709 list_foreach (manager->priv->contents, (Callback)target_data_unref, NULL);
710 list_free (manager->priv->contents);
711 manager->priv->contents = NULL;
726 free_contents(manager);
712727
713728 XSetSelectionOwner (manager->priv->display,
714729 XA_CLIPBOARD,
719734 }
720735 if (xev->xselectionclear.selection == XA_CLIPBOARD) {
721736 /* We lost the clipboard selection */
722 list_foreach (manager->priv->contents, (Callback)target_data_unref, NULL);
723 list_free (manager->priv->contents);
724 manager->priv->contents = NULL;
737 free_contents(manager);
725738 clipboard_manager_watch_cb (manager,
726739 manager->priv->requestor,
727740 False,
780793 }
781794 else if (xev->xselection.property == None) {
782795 send_selection_notify (manager, False);
796 free_contents (manager);
783797 clipboard_manager_watch_cb (manager,
784798 manager->priv->requestor,
785799 False,
970984 }
971985
972986 if (manager->priv->contents != NULL) {
973 list_foreach (manager->priv->contents, (Callback) target_data_unref, NULL);
974 list_free (manager->priv->contents);
975 manager->priv->contents = NULL;
976 }
977 }
978
979 static GObject *
980 csd_clipboard_manager_constructor (GType type,
981 guint n_construct_properties,
982 GObjectConstructParam *construct_properties)
983 {
984 CsdClipboardManager *clipboard_manager;
985
986 clipboard_manager = CSD_CLIPBOARD_MANAGER (G_OBJECT_CLASS (csd_clipboard_manager_parent_class)->constructor (type,
987 n_construct_properties,
988 construct_properties));
989
990 return G_OBJECT (clipboard_manager);
987 free_contents (manager);
988 }
991989 }
992990
993991 static void
995993 {
996994 GObjectClass *object_class = G_OBJECT_CLASS (klass);
997995
998 object_class->constructor = csd_clipboard_manager_constructor;
999996 object_class->finalize = csd_clipboard_manager_finalize;
1000997
1001998 g_type_class_add_private (klass, sizeof (CsdClipboardManagerPrivate));
10211018 clipboard_manager = CSD_CLIPBOARD_MANAGER (object);
10221019
10231020 g_return_if_fail (clipboard_manager->priv != NULL);
1021
1022 csd_clipboard_manager_stop(clipboard_manager);
10241023
10251024 if (clipboard_manager->priv->start_idle_id !=0) {
10261025 g_source_remove (clipboard_manager->priv->start_idle_id);
168168 !IN_RANGE(key->keysym, FKEYS_RANGE_MIN, FKEYS_RANGE_MAX) &&
169169 key->keysym != GDK_KEY_Pause &&
170170 key->keysym != GDK_KEY_Print &&
171 key->keysym != GDK_KEY_Scroll_Lock &&
172 key->keysym != GDK_KEY_Break &&
171173 key->keysym != GDK_KEY_Menu) {
172174 GString *keycodes;
173175
444444 /* enough free space, nothing to do */
445445 if (free_space > free_percent_notify)
446446 return TRUE;
447
447
448448 if (((gint64) mount->buf.f_frsize * (gint64) mount->buf.f_bavail) > ((gint64) free_size_gb_no_notify * GIGABYTE))
449449 return TRUE;
450450
477477 return TRUE;
478478 else
479479 return FALSE;
480 }
480 }
481481
482482
483483 static void
599599 continue;
600600 }
601601
602 if (ldsm_mount_is_user_ignore (g_unix_mount_get_mount_path (mount))) {
602 if (ldsm_mount_is_user_ignore (path)) {
603603 ldsm_free_mount_info (mount_info);
604604 continue;
605605 }
728728
729729 if (ignore_paths != NULL) {
730730 g_slist_foreach (ignore_paths, (GFunc) g_free, NULL);
731 g_slist_free (ignore_paths);
732 ignore_paths = NULL;
731 g_clear_pointer (&ignore_paths, g_slist_free);
733732 }
734733
735734 settings_list = g_settings_get_strv (settings, SETTINGS_IGNORE_PATHS);
736735 if (settings_list != NULL) {
737 gint i;
738
739 for (i = 0; i < G_N_ELEMENTS (settings_list); i++) {
740 if (settings_list[i] != NULL)
741 ignore_paths = g_slist_append (ignore_paths, g_strdup (settings_list[i]));
742 }
736 guint i;
737
738 for (i = 0; settings_list[i] != NULL; i++)
739 ignore_paths = g_slist_prepend (ignore_paths,
740 g_strdup (settings_list[i]));
743741
744742 /* Make sure we don't leave stale entries in ldsm_notified_hash */
745743 g_hash_table_foreach_remove (ldsm_notified_hash,
774772 g_signal_connect (G_OBJECT (settings), "changed",
775773 G_CALLBACK (csd_ldsm_update_config), NULL);
776774
777 ldsm_monitor = g_unix_mount_monitor_new ();
778 g_unix_mount_monitor_set_rate_limit (ldsm_monitor, 1000);
775 ldsm_monitor = g_unix_mount_monitor_get ();
779776 g_signal_connect (ldsm_monitor, "mounts-changed",
780777 G_CALLBACK (ldsm_mounts_changed), NULL);
781778
792789 if (ldsm_timeout_id) {
793790 g_source_remove (ldsm_timeout_id);
794791 ldsm_timeout_id = 0;
795 }
796
797 if (ldsm_notified_hash)
798 g_hash_table_destroy (ldsm_notified_hash);
799 ldsm_notified_hash = NULL;
800
801 if (ldsm_monitor)
802 g_object_unref (ldsm_monitor);
803 ldsm_monitor = NULL;
804
805 if (settings != NULL) {
806 g_object_unref (settings);
807 }
808
809 if (dialog) {
810 gtk_widget_destroy (GTK_WIDGET (dialog));
811 dialog = NULL;
812 }
813
814 if (notification != NULL) {
815 notify_notification_close (notification, NULL);
816 notification = NULL;
817 }
818
819 if (ignore_paths) {
820 g_slist_foreach (ignore_paths, (GFunc) g_free, NULL);
821 g_slist_free (ignore_paths);
822 }
823 }
824
792 }
793
794 g_clear_pointer (&ldsm_notified_hash, g_hash_table_destroy);
795 g_clear_object (&ldsm_monitor);
796 g_clear_object (&settings);
797 g_clear_object (&dialog);
798 g_clear_pointer (&notification, notify_notification_close);
799 g_slist_free_full (ignore_paths, g_free);
800 ignore_paths = NULL;
801 }
802
321321 do_cleanup (manager);
322322 }
323323
324 g_object_unref (p->settings);
325 p->settings = NULL;
324 g_clear_object (&p->settings);
326325 }
327326
328327 csd_ldsm_clean ();
5757 csd_ldsm_dialog_get_checkbutton_text (CsdLdsmDialog *dialog)
5858 {
5959 g_return_val_if_fail (CSD_IS_LDSM_DIALOG (dialog), NULL);
60
60
6161 if (dialog->priv->other_partitions)
6262 return _("Don't show any warnings again for this file system");
6363 else
6868 csd_ldsm_dialog_get_primary_text (CsdLdsmDialog *dialog)
6969 {
7070 gchar *primary_text, *free_space;
71
71
7272 g_return_val_if_fail (CSD_IS_LDSM_DIALOG (dialog), NULL);
73
73
7474 free_space = g_format_size (dialog->priv->space_remaining);
75
75
7676 if (dialog->priv->other_partitions) {
7777 primary_text = g_strdup_printf (_("The volume \"%s\" has only %s disk space remaining."),
7878 dialog->priv->partition_name, free_space);
8080 primary_text = g_strdup_printf (_("This computer has only %s disk space remaining."),
8181 free_space);
8282 }
83
83
8484 g_free (free_space);
85
86 return primary_text;
85
86 return primary_text;
8787 }
8888
8989 static const gchar*
9090 csd_ldsm_dialog_get_secondary_text (CsdLdsmDialog *dialog)
9191 {
9292 g_return_val_if_fail (CSD_IS_LDSM_DIALOG (dialog), NULL);
93
93
9494 if (dialog->priv->other_usable_partitions) {
9595 if (dialog->priv->has_trash) {
9696 return _("You can free up disk space by emptying the Trash, removing " \
124124 {
125125 GSList *found;
126126 gchar *path_to_remove;
127
127
128128 found = g_slist_find_custom (*ignore_paths, mount_path, (GCompareFunc) ignore_path_compare);
129
129
130130 if (ignore && (found == NULL)) {
131131 *ignore_paths = g_slist_prepend (*ignore_paths, g_strdup (mount_path));
132132 return TRUE;
133133 }
134
134
135135 if (!ignore && (found != NULL)) {
136136 path_to_remove = found->data;
137137 *ignore_paths = g_slist_remove (*ignore_paths, path_to_remove);
138138 g_free (path_to_remove);
139139 return TRUE;
140140 }
141
141
142142 return FALSE;
143143 }
144144
192192 {
193193 GtkWidget *main_vbox, *text_vbox, *hbox;
194194 GtkWidget *image;
195
195
196196 dialog->priv = CSD_LDSM_DIALOG_GET_PRIVATE (dialog);
197
197
198198 main_vbox = gtk_dialog_get_content_area (GTK_DIALOG (dialog));
199199
200200 /* Set up all the window stuff here */
201201 gtk_window_set_title (GTK_WINDOW (dialog), _("Low Disk Space"));
202 gtk_window_set_icon_name (GTK_WINDOW (dialog),
203 GTK_STOCK_DIALOG_WARNING);
202 gtk_window_set_icon_name (GTK_WINDOW (dialog),
203 "dialog-warning");
204204 gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
205205 gtk_window_set_position (GTK_WINDOW (dialog), GTK_WIN_POS_CENTER);
206206 gtk_window_set_urgency_hint (GTK_WINDOW (dialog), TRUE);
208208 gtk_container_set_border_width (GTK_CONTAINER (dialog), 5);
209209
210210 /* Create the image */
211 image = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING, GTK_ICON_SIZE_DIALOG);
211 image = gtk_image_new_from_icon_name ("dialog-warning", GTK_ICON_SIZE_DIALOG);
212212 gtk_misc_set_alignment (GTK_MISC (image), 0.5, 0.0);
213213
214214 /* Create the labels */
215 dialog->priv->primary_label = gtk_label_new (NULL);
215 dialog->priv->primary_label = gtk_label_new (NULL);
216216 gtk_label_set_line_wrap (GTK_LABEL (dialog->priv->primary_label), TRUE);
217217 gtk_label_set_single_line_mode (GTK_LABEL (dialog->priv->primary_label), FALSE);
218218 gtk_misc_set_alignment (GTK_MISC (dialog->priv->primary_label), 0.0, 0.0);
219
219
220220 dialog->priv->secondary_label = gtk_label_new (NULL);
221221 gtk_label_set_line_wrap (GTK_LABEL (dialog->priv->secondary_label), TRUE);
222222 gtk_label_set_single_line_mode (GTK_LABEL (dialog->priv->secondary_label), FALSE);
231231 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dialog->priv->ignore_check_button), FALSE);
232232 g_signal_connect (dialog->priv->ignore_check_button, "toggled",
233233 G_CALLBACK (ignore_check_button_toggled_cb), dialog);
234
234
235235 /* Now set up the dialog's GtkBox's' */
236236 gtk_box_set_spacing (GTK_BOX (main_vbox), 14);
237
238 hbox = gtk_hbox_new (FALSE, 12);
237
238 hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
239239 gtk_container_set_border_width (GTK_CONTAINER (hbox), 5);
240
241 text_vbox = gtk_vbox_new (FALSE, 12);
242
240
241 text_vbox = gtk_box_new (GTK_ORIENTATION_VERTICAL, 12);
242
243243 gtk_box_pack_start (GTK_BOX (text_vbox), dialog->priv->primary_label, FALSE, FALSE, 0);
244244 gtk_box_pack_start (GTK_BOX (text_vbox), dialog->priv->secondary_label, TRUE, TRUE, 0);
245245 gtk_box_pack_start (GTK_BOX (text_vbox), dialog->priv->ignore_check_button, FALSE, FALSE, 0);
246246 gtk_box_pack_start (GTK_BOX (hbox), image, FALSE, FALSE, 0);
247 gtk_box_pack_start (GTK_BOX (hbox), text_vbox, TRUE, TRUE, 0);
247 gtk_box_pack_start (GTK_BOX (hbox), text_vbox, TRUE, TRUE, 0);
248248 gtk_box_pack_start (GTK_BOX (main_vbox), hbox, FALSE, FALSE, 0);
249
249
250250 /* Set up the action area */
251251 gtk_box_set_spacing (GTK_BOX (gtk_dialog_get_action_area (GTK_DIALOG (dialog))), 6);
252252 gtk_container_set_border_width (GTK_CONTAINER (gtk_dialog_get_action_area (GTK_DIALOG (dialog))), 5);
253
253
254254 gtk_widget_show_all (hbox);
255255 }
256256
258258 csd_ldsm_dialog_finalize (GObject *object)
259259 {
260260 CsdLdsmDialog *self;
261
261
262262 g_return_if_fail (object != NULL);
263263 g_return_if_fail (CSD_IS_LDSM_DIALOG (object));
264264
265265 self = CSD_LDSM_DIALOG (object);
266
266
267267 if (self->priv->partition_name)
268268 g_free (self->priv->partition_name);
269
269
270270 if (self->priv->mount_path)
271271 g_free (self->priv->mount_path);
272
272
273273 G_OBJECT_CLASS (csd_ldsm_dialog_parent_class)->finalize (object);
274274 }
275275
277277 csd_ldsm_dialog_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec)
278278 {
279279 CsdLdsmDialog *self;
280
280
281281 g_return_if_fail (CSD_IS_LDSM_DIALOG (object));
282
282
283283 self = CSD_LDSM_DIALOG (object);
284284
285285 switch (prop_id)
312312 csd_ldsm_dialog_get_property (GObject *object, guint prop_id, GValue *value, GParamSpec *pspec)
313313 {
314314 CsdLdsmDialog *self;
315
315
316316 g_return_if_fail (CSD_IS_LDSM_DIALOG (object));
317
317
318318 self = CSD_LDSM_DIALOG (object);
319319
320320 switch (prop_id)
375375 "Set to TRUE if the partition has files in it's trash folder that can be deleted",
376376 FALSE,
377377 G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
378
378
379379 g_object_class_install_property (object_class,
380380 PROP_SPACE_REMAINING,
381381 g_param_spec_int64 ("space-remaining",
383383 "Specify how much space is remaining in bytes",
384384 G_MININT64, G_MAXINT64, 0,
385385 G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
386
386
387387 g_object_class_install_property (object_class,
388388 PROP_PARTITION_NAME,
389389 g_param_spec_string ("partition-name",
391391 "Specify the name of the partition",
392392 "Unknown",
393393 G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY));
394
394
395395 g_object_class_install_property (object_class,
396396 PROP_MOUNT_PATH,
397397 g_param_spec_string ("mount-path",
417417 GtkWidget *empty_trash_image, *analyze_image, *ignore_image;
418418 gchar *primary_text, *primary_text_markup;
419419 const gchar *secondary_text, *checkbutton_text;
420
420
421421 dialog = CSD_LDSM_DIALOG (g_object_new (CSD_TYPE_LDSM_DIALOG,
422422 "other-usable-partitions", other_usable_partitions,
423423 "other-partitions", other_partitions,
426426 "partition-name", partition_name,
427427 "mount-path", mount_path,
428428 NULL));
429
429
430430 /* Add some buttons */
431431 if (dialog->priv->has_trash) {
432432 button_empty_trash = gtk_dialog_add_button (GTK_DIALOG (dialog),
433433 _("Empty Trash"),
434434 CSD_LDSM_DIALOG_RESPONSE_EMPTY_TRASH);
435 empty_trash_image = gtk_image_new_from_stock (GTK_STOCK_CLEAR, GTK_ICON_SIZE_BUTTON);
435 empty_trash_image = gtk_image_new_from_icon_name ("edit-clear", GTK_ICON_SIZE_BUTTON);
436436 gtk_button_set_image (GTK_BUTTON (button_empty_trash), empty_trash_image);
437437 }
438
438
439439 if (display_baobab) {
440440 button_analyze = gtk_dialog_add_button (GTK_DIALOG (dialog),
441441 _("Examine..."),
443443 analyze_image = gtk_image_new_from_icon_name ("baobab", GTK_ICON_SIZE_BUTTON);
444444 gtk_button_set_image (GTK_BUTTON (button_analyze), analyze_image);
445445 }
446
447 button_ignore = gtk_dialog_add_button (GTK_DIALOG (dialog),
448 _("Ignore"),
446
447 button_ignore = gtk_dialog_add_button (GTK_DIALOG (dialog),
448 _("Ignore"),
449449 GTK_RESPONSE_CANCEL);
450450 ignore_image = gtk_image_new_from_stock (GTK_STOCK_CANCEL, GTK_ICON_SIZE_BUTTON);
451451 gtk_button_set_image (GTK_BUTTON (button_ignore), ignore_image);
452
452
453453 gtk_widget_grab_default (button_ignore);
454
455 /* Set the label text */
454
455 /* Set the label text */
456456 primary_text = csd_ldsm_dialog_get_primary_text (dialog);
457457 primary_text_markup = g_markup_printf_escaped ("<big><b>%s</b></big>", primary_text);
458458 gtk_label_set_markup (GTK_LABEL (dialog->priv->primary_label), primary_text_markup);
459459
460460 secondary_text = csd_ldsm_dialog_get_secondary_text (dialog);
461461 gtk_label_set_text (GTK_LABEL (dialog->priv->secondary_label), secondary_text);
462
462
463463 checkbutton_text = csd_ldsm_dialog_get_checkbutton_text (dialog);
464464 gtk_button_set_label (GTK_BUTTON (dialog->priv->ignore_check_button), checkbutton_text);
465
465
466466 g_free (primary_text);
467467 g_free (primary_text_markup);
468
468
469469 return dialog;
470 }
470 }
115115 #define HIGH_CONTRAST "HighContrast"
116116
117117 #define VOLUME_STEP 5 /* percents for one volume button press */
118 #define MAX_VOLUME 65536.0
119118
120119 #define LOGIND_DBUS_NAME "org.freedesktop.login1"
121120 #define LOGIND_DBUS_PATH "/org/freedesktop/login1"
692691 }
693692
694693 static void
695 update_dialog (CsdMediaKeysManager *manager,
694 show_sound_osd (CsdMediaKeysManager *manager,
696695 GvcMixerStream *stream,
697696 gboolean is_mic,
698697 gint vol,
698 gint max_vol,
699699 gboolean muted,
700700 gboolean sound_changed,
701701 gboolean quiet)
702702 {
703703 const char *icon;
704 vol = CLAMP (vol, 0, 100);
704 vol = CLAMP (vol, 0, max_vol);
705705 icon = get_icon_name_for_volume (muted, vol, is_mic);
706706 show_osd (manager, icon, vol, OSD_ALL_OUTPUTS);
707707 if (quiet == FALSE && sound_changed != FALSE && muted == FALSE) {
833833 {
834834 GvcMixerStream *stream;
835835 gboolean old_muted, new_muted;
836 guint old_vol, new_vol, norm_vol_step, osd_vol;
836 guint old_vol, new_vol, norm_vol_step, osd_vol, osd_max_vol;
837837 gboolean sound_changed;
838 GSettings *settings;
838839
839840 /* Find the stream that corresponds to the device, if any */
840841 gboolean is_source_stream =
855856
856857 norm_vol_step = PA_VOLUME_NORM * VOLUME_STEP / 100;
857858
859 settings = g_settings_new ("org.cinnamon.desktop.sound");
860 osd_max_vol = PA_VOLUME_NORM * g_settings_get_int (settings, "maximum-volume") / 100;
861 g_object_unref (settings);
862
858863 /* FIXME: this is racy */
859864 new_vol = old_vol = gvc_mixer_stream_get_volume (stream);
860865 new_muted = old_muted = gvc_mixer_stream_get_is_muted (stream);
877882 new_muted = FALSE;
878883 /* When coming out of mute only increase the volume if it was 0 */
879884 if (!old_muted || old_vol == 0)
880 new_vol = MIN (old_vol + norm_vol_step, MAX_VOLUME);
885 new_vol = MIN (old_vol + norm_vol_step, osd_max_vol);
881886 break;
882887 }
883888
895900
896901 if (type == C_DESKTOP_MEDIA_KEY_VOLUME_DOWN && old_vol == 0 && old_muted)
897902 osd_vol = -1;
898 else if (type == C_DESKTOP_MEDIA_KEY_VOLUME_UP && old_vol == PA_VOLUME_NORM && !old_muted)
903 else if (type == C_DESKTOP_MEDIA_KEY_VOLUME_UP && old_vol == osd_max_vol && !old_muted)
899904 osd_vol = 101;
900905 else if (!new_muted)
901 osd_vol = (int) (100 * (double) new_vol / PA_VOLUME_NORM);
906 osd_vol = (int) (100 * (double) new_vol / osd_max_vol);
902907 else
903908 osd_vol = 0;
904 update_dialog (manager, stream, is_source_stream, osd_vol, new_muted, sound_changed, quiet);
909 show_sound_osd (manager, stream, is_source_stream, osd_vol, osd_max_vol, new_muted, sound_changed, quiet);
905910 }
906911
907912 static void
17771782 do_keyboard_brightness_action (manager, type);
17781783 break;
17791784 case C_DESKTOP_MEDIA_KEY_BATTERY:
1780 do_execute_desktop (manager, "gnome-power-statistics.desktop", timestamp);
1785 do_execute_desktop (manager, "org.gnome.PowerStats.desktop", timestamp);
17811786 break;
17821787 /* Note, no default so compiler catches missing keys */
17831788 case C_DESKTOP_MEDIA_KEY_SEPARATOR:
4141 struct CsdLocatePointerData
4242 {
4343 CsdTimeline *timeline;
44 GtkWidget *widget;
44 GtkWidget *widget;
4545 GdkWindow *window;
4646
4747 gdouble progress;
159159 {
160160 CsdLocatePointerData *data = (CsdLocatePointerData *) user_data;
161161 GdkScreen *screen;
162 GdkDeviceManager *device_manager;
162163 gint cursor_x, cursor_y;
163164
164165 if (gtk_widget_is_composited (data->widget))
175176 }
176177
177178 screen = gdk_window_get_screen (data->window);
178 gdk_window_get_pointer (gdk_screen_get_root_window (screen),
179 &cursor_x, &cursor_y, NULL);
179 device_manager = gdk_display_get_device_manager (gdk_window_get_display (data->window));
180 gdk_window_get_device_position (gdk_screen_get_root_window (screen),
181 gdk_device_manager_get_client_pointer (device_manager),
182 &cursor_x, &cursor_y, NULL);
180183 gdk_window_move (data->window,
181184 cursor_x - WINDOW_SIZE / 2,
182185 cursor_y - WINDOW_SIZE / 2);
286289 move_locate_pointer_window (CsdLocatePointerData *data,
287290 GdkScreen *screen)
288291 {
292 GdkDeviceManager *device_manager;
289293 cairo_region_t *region;
290294 gint cursor_x, cursor_y;
291295
292 gdk_window_get_pointer (gdk_screen_get_root_window (screen), &cursor_x, &cursor_y, NULL);
296 device_manager = gdk_display_get_device_manager (gdk_window_get_display (data->window));
297 gdk_window_get_device_position (gdk_screen_get_root_window (screen),
298 gdk_device_manager_get_client_pointer (device_manager),
299 &cursor_x, &cursor_y, NULL);
293300
294301 gdk_window_move_resize (data->window,
295302 cursor_x - WINDOW_SIZE / 2,
424431 {
425432 GdkKeymapKey *keys;
426433 GdkDisplay *display;
427 int n_screens;
434 GdkScreen *screen;
435 Window xroot;
428436 int n_keys;
429437 gboolean has_entries;
430438 static const guint keyvals[] = { GDK_KEY_Control_L, GDK_KEY_Control_R };
431 unsigned j;
439 unsigned i,j;
432440
433441 display = gdk_display_get_default ();
434 n_screens = gdk_display_get_n_screens (display);
442 screen = gdk_screen_get_default ();
443 xroot = gdk_x11_window_get_xid (gdk_screen_get_root_window (screen));
435444
436445 for (j = 0 ; j < G_N_ELEMENTS (keyvals) ; j++)
437446 {
441450 &n_keys);
442451 if (has_entries)
443452 {
444 gint i, k;
445453 for (i = 0; i < n_keys; i++)
446454 {
447 for (k = 0; k < n_screens; k++)
448 {
449 GdkScreen *screen;
450 Window xroot;
451
452 screen = gdk_display_get_screen (display, k);
453 xroot = gdk_x11_window_get_xid (gdk_screen_get_root_window (screen));
454
455 gdk_x11_display_error_trap_push (display);
456
457 XGrabKey (GDK_DISPLAY_XDISPLAY (display),
458 keys[i].keycode,
459 0,
460 xroot,
461 False,
462 GrabModeAsync,
463 GrabModeSync);
464 XGrabKey (GDK_DISPLAY_XDISPLAY (display),
465 keys[i].keycode,
466 LockMask,
467 xroot,
468 False,
469 GrabModeAsync,
470 GrabModeSync);
471 XGrabKey (GDK_DISPLAY_XDISPLAY (display),
472 keys[i].keycode,
473 Mod2Mask,
474 xroot,
475 False,
476 GrabModeAsync,
477 GrabModeSync);
478 XGrabKey (GDK_DISPLAY_XDISPLAY (display),
479 keys[i].keycode,
480 Mod4Mask,
481 xroot,
482 False,
483 GrabModeAsync,
484 GrabModeSync);
485
486 gdk_x11_display_error_trap_pop_ignored (display);
487 }
455 gdk_x11_display_error_trap_push (display);
456
457 XGrabKey (GDK_DISPLAY_XDISPLAY (display),
458 keys[i].keycode,
459 0,
460 xroot,
461 False,
462 GrabModeAsync,
463 GrabModeSync);
464 XGrabKey (GDK_DISPLAY_XDISPLAY (display),
465 keys[i].keycode,
466 LockMask,
467 xroot,
468 False,
469 GrabModeAsync,
470 GrabModeSync);
471 XGrabKey (GDK_DISPLAY_XDISPLAY (display),
472 keys[i].keycode,
473 Mod2Mask,
474 xroot,
475 False,
476 GrabModeAsync,
477 GrabModeSync);
478 XGrabKey (GDK_DISPLAY_XDISPLAY (display),
479 keys[i].keycode,
480 Mod4Mask,
481 xroot,
482 False,
483 GrabModeAsync,
484 GrabModeSync);
485
486 gdk_x11_display_error_trap_pop_ignored (display);
488487 }
489488
490489 g_free (keys);
491490
492 for (i = 0; i < n_screens; i++)
493 {
494 GdkScreen *screen;
495
496 screen = gdk_display_get_screen (display, i);
497 gdk_window_add_filter (gdk_screen_get_root_window (screen),
498 filter,
499 screen);
500 }
491 gdk_window_add_filter (gdk_screen_get_root_window (screen),
492 filter,
493 screen);
501494 }
502495 }
503496 }
113113
114114 static gpointer manager_object = NULL;
115115
116
117 static GObject *
118 csd_mouse_manager_constructor (GType type,
119 guint n_construct_properties,
120 GObjectConstructParam *construct_properties)
121 {
122 CsdMouseManager *mouse_manager;
123
124 mouse_manager = CSD_MOUSE_MANAGER (G_OBJECT_CLASS (csd_mouse_manager_parent_class)->constructor (type,
125 n_construct_properties,
126 construct_properties));
127
128 return G_OBJECT (mouse_manager);
129 }
130
131 static void
132 csd_mouse_manager_dispose (GObject *object)
133 {
134 G_OBJECT_CLASS (csd_mouse_manager_parent_class)->dispose (object);
135 }
136
137116 static void
138117 csd_mouse_manager_class_init (CsdMouseManagerClass *klass)
139118 {
140119 GObjectClass *object_class = G_OBJECT_CLASS (klass);
141120
142 object_class->constructor = csd_mouse_manager_constructor;
143 object_class->dispose = csd_mouse_manager_dispose;
144121 object_class->finalize = csd_mouse_manager_finalize;
145122
146123 g_type_class_add_private (klass, sizeof (CsdMouseManagerPrivate));
479456 left_handed = mouse_left_handed;
480457 }
481458
459 gdk_error_trap_push ();
482460 n_buttons = XGetDeviceButtonMapping (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xdevice,
483461 buttons,
484462 buttons_capacity);
495473
496474 configure_button_layout (buttons, n_buttons, left_handed);
497475
498 gdk_error_trap_push ();
499476 XSetDeviceButtonMapping (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xdevice, buttons, n_buttons);
500477 gdk_error_trap_pop_ignored ();
501478
605582 motion_threshold = -1;
606583 }
607584
585 gdk_error_trap_push ();
586
608587 /* Get the list of feedbacks for the device */
609588 states = XGetFeedbackControl (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), xdevice, &num_feedbacks);
610589 if (states == NULL)
633612 state = (XFeedbackState *) ((char *) state + state->length);
634613 }
635614
615 if (gdk_error_trap_pop ())
616 g_warning ("Error setting acceleration on \"%s\"",
617 gdk_device_get_name (device));
618
636619 XFreeFeedbackList (states);
637620
638621 out:
13121295
13131296 if (! g_spawn_command_line_async (comm, &error)) {
13141297 if (error->code == G_SPAWN_ERROR_NOENT && run_daemon) {
1315 GtkWidget *dialog;
1316
13171298 if (dwell_click_enabled) {
13181299 g_settings_set_boolean (manager->priv->mouse_a11y_settings,
13191300 KEY_DWELL_CLICK_ENABLED, FALSE);
13211302 g_settings_set_boolean (manager->priv->mouse_a11y_settings,
13221303 KEY_SECONDARY_CLICK_ENABLED, FALSE);
13231304 }
1324
1325 dialog = gtk_message_dialog_new (NULL, 0,
1326 GTK_MESSAGE_WARNING,
1327 GTK_BUTTONS_OK,
1328 _("Could not enable mouse accessibility features"));
1329 gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog),
1330 _("Mouse accessibility requires Mousetweaks "
1331 "to be installed on your system."));
1332 gtk_window_set_title (GTK_WINDOW (dialog), _("Universal Access"));
1333 gtk_window_set_icon_name (GTK_WINDOW (dialog),
1334 "preferences-desktop-accessibility");
1335 gtk_dialog_run (GTK_DIALOG (dialog));
1336 gtk_widget_destroy (dialog);
1305 g_warning("Error enabling mouse accessibility features (mousetweaks is not installed)");
13371306 }
13381307 g_error_free (error);
13391308 }
15011470 }
15021471 }
15031472 g_list_free (devices);
1473 }
1474
1475 /* Re-enable touchpad when any other pointing device isn't present. */
1476 static void
1477 ensure_touchpad_active (CsdMouseManager *manager)
1478 {
1479 if (mouse_is_present () == FALSE && touchscreen_is_present () == FALSE && touchpad_is_present ())
1480 g_settings_set_boolean (manager->priv->touchpad_settings, KEY_TOUCHPAD_ENABLED, TRUE);
15041481 }
15051482
15061483 static void
16071584
16081585 /* If a touchpad was to disappear... */
16091586 set_disable_w_typing (manager, g_settings_get_boolean (manager->priv->touchpad_settings, KEY_TOUCHPAD_DISABLE_W_TYPING));
1587 ensure_touchpad_active (manager);
16101588 }
16111589 }
16121590
16781656 }
16791657 g_list_free (devices);
16801658
1659 ensure_touchpad_active (manager);
1660
16811661 if (g_settings_get_boolean (manager->priv->touchpad_settings, KEY_TOUCHPAD_ENABLED)) {
16821662 devices = get_disabled_devices (manager->priv->device_manager);
1683 for (l = devices; l != NULL; l = l->next) {
1663 for (l = devices; l != NULL; l = l->next) {
16841664 int device_id;
16851665
16861666 device_id = GPOINTER_TO_INT (l->data);
17211701
17221702 g_debug ("Stopping mouse manager");
17231703
1704 if (manager->priv->start_idle_id != 0) {
1705 g_source_remove (manager->priv->start_idle_id);
1706 manager->priv->start_idle_id = 0;
1707 }
1708
17241709 if (p->device_manager != NULL) {
17251710 g_signal_handler_disconnect (p->device_manager, p->device_added_id);
17261711 g_signal_handler_disconnect (p->device_manager, p->device_removed_id);
17271712 p->device_manager = NULL;
17281713 }
17291714
1730 if (p->mouse_a11y_settings != NULL) {
1731 g_object_unref (p->mouse_a11y_settings);
1732 p->mouse_a11y_settings = NULL;
1733 }
1734
1735 if (p->mouse_settings != NULL) {
1736 g_object_unref (p->mouse_settings);
1737 p->mouse_settings = NULL;
1738 }
1739
1740 if (p->touchpad_settings != NULL) {
1741 g_object_unref (p->touchpad_settings);
1742 p->touchpad_settings = NULL;
1743 }
1715 g_clear_object (&p->mouse_a11y_settings);
1716 g_clear_object (&p->mouse_settings);
1717 g_clear_object (&p->touchpad_settings);
17441718
17451719 set_locate_pointer (manager, FALSE);
17461720 }
17571731
17581732 g_return_if_fail (mouse_manager->priv != NULL);
17591733
1760 if (mouse_manager->priv->blacklist != NULL)
1761 g_hash_table_destroy (mouse_manager->priv->blacklist);
1762
1763 if (mouse_manager->priv->start_idle_id != 0) {
1764 g_source_remove (mouse_manager->priv->start_idle_id);
1765 mouse_manager->priv->start_idle_id = 0;
1766 }
1767
1768 if (mouse_manager->priv->device_manager != NULL) {
1769 g_signal_handler_disconnect (mouse_manager->priv->device_manager, mouse_manager->priv->device_added_id);
1770 g_signal_handler_disconnect (mouse_manager->priv->device_manager, mouse_manager->priv->device_removed_id);
1771 }
1772
1773 if (mouse_manager->priv->mouse_settings != NULL)
1774 g_object_unref (mouse_manager->priv->mouse_settings);
1775
1776 if (mouse_manager->priv->mouse_a11y_settings != NULL)
1777 g_object_unref (mouse_manager->priv->mouse_a11y_settings);
1778
1779 if (mouse_manager->priv->touchpad_settings != NULL)
1780 g_object_unref (mouse_manager->priv->touchpad_settings);
1734 csd_mouse_manager_stop (mouse_manager);
17811735
17821736 G_OBJECT_CLASS (csd_mouse_manager_parent_class)->finalize (object);
17831737 }
228228
229229 /* logind stuff */
230230 GDBusProxy *logind_proxy;
231 gboolean inhibit_lid_switch_enabled;
231232 gint inhibit_lid_switch_fd;
232233 gboolean inhibit_lid_switch_taken;
233234 gint inhibit_suspend_fd;
35153516 }
35163517
35173518 static void
3518 sleep_cb_screensaver_proxy_ready_cb (GObject *source_object,
3519 GAsyncResult *res,
3520 gpointer user_data)
3521 {
3522 GError *error = NULL;
3523 CsdPowerManager *manager = CSD_POWER_MANAGER (user_data);
3524
3525 manager->priv->screensaver_proxy = g_dbus_proxy_new_for_bus_finish (res, &error);
3526 if (manager->priv->screensaver_proxy == NULL) {
3527 g_warning ("Could not connect to cinnamon-screensaver: %s",
3528 error->message);
3529 g_error_free (error);
3530 return;
3531 }
3532
3533 /* Finish the upower_notify_sleep_cb() call by locking the screen */
3534 g_debug ("cinnamon-screensaver activated, doing cinnamon-screensaver lock");
3535 g_dbus_proxy_call (manager->priv->screensaver_proxy,
3536 "Lock",
3537 g_variant_new("(s)", ""),
3538 G_DBUS_CALL_FLAGS_NONE, -1,
3539 NULL, NULL, NULL);
3540
3519 lock_screensaver (CsdPowerManager *manager)
3520 {
3521 GError *error;
3522 gboolean ret;
3523
3524 g_debug ("Locking screen before sleep/hibernate");
3525
3526 /* do this sync to ensure it's on the screen when we start suspending */
3527 error = NULL;
3528 ret = g_spawn_command_line_sync ("cinnamon-screensaver-command --lock", NULL, NULL, NULL, &error);
3529
3530 if (!ret) {
3531 g_warning ("Couldn't lock screen: %s", error->message);
3532 g_error_free (error);
3533 }
35413534 }
35423535
35433536 static void
36963689 }
36973690
36983691 static void
3699 lock_screensaver (CsdPowerManager *manager)
3700 {
3701 gboolean do_lock;
3702
3703 do_lock = g_settings_get_boolean (manager->priv->settings_screensaver,
3704 "lock-enabled");
3705 if (!do_lock)
3706 return;
3707
3708 /* connect to the screensaver first */
3709 g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
3710 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
3711 NULL,
3712 GS_DBUS_NAME,
3713 GS_DBUS_PATH,
3714 GS_DBUS_INTERFACE,
3715 NULL,
3716 sleep_cb_screensaver_proxy_ready_cb,
3717 manager);
3718 }
3719
3720 static void
37213692 idle_idletime_alarm_expired_cb (GpmIdletime *idletime,
37223693 guint alarm_id,
37233694 CsdPowerManager *manager)
38873858 static void
38883859 inhibit_lid_switch (CsdPowerManager *manager)
38893860 {
3861 if (!manager->priv->inhibit_lid_switch_enabled) {
3862 // The users asks us not to interfere with what logind does
3863 // w.r.t. handling the lid switch
3864 g_debug ("inhibiting lid-switch disabled");
3865 return;
3866 }
3867
38903868 GVariant *params;
38913869
38923870 if (manager->priv->inhibit_lid_switch_taken) {
40033981
40043982 do_lock = g_settings_get_boolean (manager->priv->settings,
40053983 "lock-on-suspend");
4006 if (do_lock)
4007 g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION,
4008 G_DBUS_PROXY_FLAGS_DO_NOT_LOAD_PROPERTIES,
4009 NULL,
4010 GS_DBUS_NAME,
4011 GS_DBUS_PATH,
4012 GS_DBUS_INTERFACE,
4013 NULL,
4014 sleep_cb_screensaver_proxy_ready_cb,
4015 manager);
3984
3985 if (do_lock) {
3986 lock_screensaver (manager);
3987 }
40163988
40173989 /* lift the delay inhibit, so logind can proceed */
40183990 uninhibit_suspend (manager);
41934165 manager->priv->settings_xrandr = g_settings_new (CSD_XRANDR_SETTINGS_SCHEMA);
41944166 manager->priv->settings_session = g_settings_new (CSD_SESSION_SETTINGS_SCHEMA);
41954167 manager->priv->use_logind = g_settings_get_boolean (manager->priv->settings_session, "settings-daemon-uses-logind");
4168 manager->priv->inhibit_lid_switch_enabled =
4169 g_settings_get_boolean (manager->priv->settings, "inhibit-lid-switch");
41964170
41974171 manager->priv->up_client = up_client_new ();
41984172 #if ! UP_CHECK_VERSION(0,99,0)
3030
3131 #include <locale.h>
3232
33 #include <glib.h>
3433 #include <glib/gi18n.h>
35 #include <gtk/gtk.h>
34 #include <gio/gio.h>
3635 #include <pulse/pulseaudio.h>
3736 #include <canberra.h>
3837
575574 }
576575 }
577576
578 static GObject *
579 csd_sound_manager_constructor (
580 GType type,
581 guint n_construct_properties,
582 GObjectConstructParam *construct_properties)
583 {
584 CsdSoundManager *m;
585
586 m = CSD_SOUND_MANAGER (G_OBJECT_CLASS (csd_sound_manager_parent_class)->constructor (
587 type,
588 n_construct_properties,
589 construct_properties));
590
591 return G_OBJECT (m);
592 }
593
594577 static void
595578 csd_sound_manager_dispose (GObject *object)
596579 {
608591 {
609592 GObjectClass *object_class = G_OBJECT_CLASS (klass);
610593
611 object_class->constructor = csd_sound_manager_constructor;
612594 object_class->dispose = csd_sound_manager_dispose;
613595 object_class->finalize = csd_sound_manager_finalize;
614596
4848
4949 #define MOUSE_SETTINGS_SCHEMA "org.cinnamon.settings-daemon.peripherals.mouse"
5050 #define INTERFACE_SETTINGS_SCHEMA "org.cinnamon.desktop.interface"
51 #define INTERFACE_WM_SETTINGS_SCHEMA "org.cinnamon.desktop.wm.preferences"
5152 #define SOUND_SETTINGS_SCHEMA "org.cinnamon.desktop.sound"
5253 #define PRIVACY_SETTINGS_SCHEMA "org.cinnamon.desktop.privacy"
5354
352353 { "org.cinnamon.desktop.interface", "gtk-timeout-initial", "Gtk/TimeoutInitial", translate_int_int },
353354 { "org.cinnamon.desktop.interface", "gtk-timeout-repeat", "Gtk/TimeoutRepeat", translate_int_int },
354355 { "org.cinnamon.desktop.interface", "gtk-color-scheme", "Gtk/ColorScheme", translate_string_string },
355 { "org.cinnamon.desktop.interface", "gtk-decoration-layout", "Gtk/DecorationLayout", translate_string_string },
356356 { "org.cinnamon.desktop.interface", "gtk-im-preedit-style", "Gtk/IMPreeditStyle", translate_string_string },
357357 { "org.cinnamon.desktop.interface", "gtk-im-status-style", "Gtk/IMStatusStyle", translate_string_string },
358358 { "org.cinnamon.desktop.interface", "gtk-im-module", "Gtk/IMModule", translate_string_string },
362362 { "org.cinnamon.desktop.interface", "menubar-accel", "Gtk/MenuBarAccel", translate_string_string },
363363 { "org.cinnamon.desktop.interface", "enable-animations", "Gtk/EnableAnimations", translate_bool_int },
364364 { "org.cinnamon.desktop.interface", "cursor-theme", "Gtk/CursorThemeName", translate_string_string },
365
365 { "org.cinnamon.desktop.wm.preferences", "button-layout", "Gtk/DecorationLayout", translate_string_string },
366 { "org.cinnamon.desktop.wm.preferences", "action-double-click-titlebar", "Gtk/TitlebarDoubleClick", translate_string_string },
367 { "org.cinnamon.desktop.wm.preferences", "action-middle-click-titlebar", "Gtk/TitlebarMiddleClick", translate_string_string },
368 { "org.cinnamon.desktop.wm.preferences", "action-right-click-titlebar", "Gtk/TitlebarRightClick", translate_string_string },
366369 { "org.cinnamon.settings-daemon.plugins.xsettings", "show-input-method-menu", "Gtk/ShowInputMethodMenu", translate_bool_int },
367370 { "org.cinnamon.settings-daemon.plugins.xsettings", "show-unicode-menu", "Gtk/ShowUnicodeMenu", translate_bool_int },
368371 { "org.cinnamon.settings-daemon.plugins.xsettings", "automatic-mnemonics", "Gtk/AutoMnemonics", translate_bool_int },
932935 g_hash_table_insert (manager->priv->settings,
933936 INTERFACE_SETTINGS_SCHEMA, g_settings_new (INTERFACE_SETTINGS_SCHEMA));
934937 g_hash_table_insert (manager->priv->settings,
938 INTERFACE_WM_SETTINGS_SCHEMA, g_settings_new (INTERFACE_WM_SETTINGS_SCHEMA));
939 g_hash_table_insert (manager->priv->settings,
935940 SOUND_SETTINGS_SCHEMA, g_settings_new (SOUND_SETTINGS_SCHEMA));
936941 g_hash_table_insert (manager->priv->settings,
937942 XSETTINGS_PLUGIN_SCHEMA, g_settings_new (XSETTINGS_PLUGIN_SCHEMA));