Compare commits
103 Commits
wip/media-
...
wip/classi
Author | SHA1 | Date | |
---|---|---|---|
![]() |
28585a817a | ||
![]() |
8b5d07c1a5 | ||
![]() |
6cbdb6beae | ||
![]() |
b8f9a108f9 | ||
![]() |
d517c13d7a | ||
![]() |
bb88265d78 | ||
![]() |
858694f4cc | ||
![]() |
a46321baa0 | ||
![]() |
9808e8ab0d | ||
![]() |
7bd7b53845 | ||
![]() |
056cfc9dc6 | ||
![]() |
b7b60d103e | ||
![]() |
14fd0eb73e | ||
![]() |
ca73017100 | ||
![]() |
123fb350ce | ||
![]() |
1a27d7dfc0 | ||
![]() |
b0c6d44515 | ||
![]() |
6092e01428 | ||
![]() |
e20ff5ae45 | ||
![]() |
621a0d70e2 | ||
![]() |
855b238ec5 | ||
![]() |
96f44e1959 | ||
![]() |
242dc8cddd | ||
![]() |
b8a2004872 | ||
![]() |
63f08bf2c2 | ||
![]() |
4734a9ac18 | ||
![]() |
81cd1e6c40 | ||
![]() |
0b9cdea7d2 | ||
![]() |
f63fceb2ea | ||
![]() |
f0f7165ab6 | ||
![]() |
2511f60d39 | ||
![]() |
c0f868dd56 | ||
![]() |
a112bfdaa2 | ||
![]() |
4535a70f08 | ||
![]() |
b59529e579 | ||
![]() |
393c23820a | ||
![]() |
e6a3958e45 | ||
![]() |
59a7fdd2c9 | ||
![]() |
c3cab28c9b | ||
![]() |
4c55a6f436 | ||
![]() |
c10e4c3117 | ||
![]() |
3b70094151 | ||
![]() |
a370697385 | ||
![]() |
8a7c0313f6 | ||
![]() |
00201f7e6c | ||
![]() |
5e3111bad8 | ||
![]() |
a327c10c60 | ||
![]() |
938bc07e3c | ||
![]() |
d053d45a6d | ||
![]() |
5200da6eec | ||
![]() |
b0523860d9 | ||
![]() |
1a1215527f | ||
![]() |
360c018c9e | ||
![]() |
7bed964ab2 | ||
![]() |
989d0a5682 | ||
![]() |
b121c25184 | ||
![]() |
e0d127b3e4 | ||
![]() |
a0c56c74e1 | ||
![]() |
f4b61a7f24 | ||
![]() |
b2400fb883 | ||
![]() |
f25832d1b6 | ||
![]() |
cf363171aa | ||
![]() |
38c8569d16 | ||
![]() |
9791d15f39 | ||
![]() |
80e7f5832b | ||
![]() |
6e46ddaad3 | ||
![]() |
8499e4aab2 | ||
![]() |
5eae1851a1 | ||
![]() |
c48a246ccb | ||
![]() |
f084011a61 | ||
![]() |
bd40cf194c | ||
![]() |
2434af7e8a | ||
![]() |
ced7fa9f01 | ||
![]() |
28b559e812 | ||
![]() |
76d776245b | ||
![]() |
0d9f70492e | ||
![]() |
b58f502dd6 | ||
![]() |
5f367248c5 | ||
![]() |
c2065cc3e2 | ||
![]() |
034408971d | ||
![]() |
490206b5b2 | ||
![]() |
d8540819af | ||
![]() |
d1a9aec526 | ||
![]() |
e4b681a5a5 | ||
![]() |
52036871d1 | ||
![]() |
4fc6a804f5 | ||
![]() |
08d2ca300a | ||
![]() |
dc2ec0a8f9 | ||
![]() |
2cfed952bb | ||
![]() |
a7da137778 | ||
![]() |
5ae2f87ce9 | ||
![]() |
c4f6619fbd | ||
![]() |
65edbc1424 | ||
![]() |
1f2d7fa28f | ||
![]() |
2407a0c4e2 | ||
![]() |
7f8bfcc939 | ||
![]() |
fae4cb9e56 | ||
![]() |
063bbb02f2 | ||
![]() |
15e1470c50 | ||
![]() |
f602993aa9 | ||
![]() |
271508c0a8 | ||
![]() |
50f96d1c9c | ||
![]() |
809544800b |
63
NEWS
63
NEWS
@@ -1,3 +1,66 @@
|
|||||||
|
3.7.2
|
||||||
|
=====
|
||||||
|
* Enforce RTL in he for messages that might end up as LTR [Florian; #686630]
|
||||||
|
* gdm: Move logo into the panel [Florian; #685852]
|
||||||
|
* Hide notifications when closed button is clicked [Jasper, Florian; #682237]
|
||||||
|
* Tweak screenShield animations [Rui; #686745]
|
||||||
|
* Restore Fittsability of summary items in message tray [Florian; #686474]
|
||||||
|
* Save screencasts as recent item [Ray; #680647]
|
||||||
|
* overview: Resize window captions on content change [Giovanni, Alex; #620874]
|
||||||
|
* App search: Match GenericName too [Matthias; #687121]
|
||||||
|
* runDialog: Better match style of other modal dialogs [Florian, Allan; #687127]
|
||||||
|
* Improve the button insensitive style [Stéphane; #687110]
|
||||||
|
* network: Don't use a global switch for all VPN connections [Giovanni; #682929]
|
||||||
|
* appMenu: Update on icon theme changes [Florian; #687224]
|
||||||
|
* Show 'Log out' in more situations [Matthias; #686736]
|
||||||
|
* Add a setting to force the 'Log out' menuitem [Matthias; #686057]
|
||||||
|
* overview: Improve styling of search box [Stéphane; #686479]
|
||||||
|
* Implement 'disable-user-list' in login screen [Ray; #660660]
|
||||||
|
* Fix auto-scroll to bottom in chat notifications [Sjoerd; #686571]
|
||||||
|
* Show feedback notifications when user is busy [Stéphane; #662900]
|
||||||
|
* Disable login button when there is no input [Stéphane; #687112]
|
||||||
|
* Use non-linear overview shade for background [Giovanni, Pierre-Eric; #669798]
|
||||||
|
* Reduce blocking in compositor thread [Simon, Jasper; #687465]
|
||||||
|
* network: new country-specific type to gather providers [Aleksander; #687356]
|
||||||
|
* Update man page [Matthias; #680601]
|
||||||
|
* st-entry: Change the pointer cursor on enter/leave events [Thomas; #687130]
|
||||||
|
* screenShield: Blur and desaturate the background [Giovanni, Cosimo; #682536]
|
||||||
|
* Change height of chat notifications to have more context [Carlos; #665255]
|
||||||
|
* screenShield: Account for motion velocity when hiding [Giovanni; #682537]
|
||||||
|
* screenShield: hide the cursor while the lock screen is on [Giovanni; #682535]
|
||||||
|
* Support remote search provider settings [Cosimo; #687491]
|
||||||
|
* unlockDialog: Improve label of confirmation button [Stéphane; #687656]
|
||||||
|
* userMenu: Rename "System Settings" item to "Settings" [Elad; #687738]
|
||||||
|
* messageTray: Add keybinding to focus current notification [Stéphane; #652082]
|
||||||
|
* Remove shell-screen-grabber [Neil; #685915]
|
||||||
|
* main: Stop using Metacity's keybinding files [Florian; #687672]
|
||||||
|
* Bluetooth: Remove ObexFTP functionality [Bastien; #688160]
|
||||||
|
* a11y: Also set WM theme when HighContrast is switched on [Cosimo; #688256]
|
||||||
|
* network: Rework multiple NIC support [Giovanni; #677142]
|
||||||
|
* Rework keybindings to allow selective blocking/processing [Florian; #688202]
|
||||||
|
* recorder: Show indicator on primary monitor [Adel; #688470]
|
||||||
|
* recorder: Set frame duration to fix broken video headers [Adel; #688487]
|
||||||
|
* Misc. bugfixes and cleanups [Florian, Jasper, Giovanni, Matthew, Stéphane,
|
||||||
|
Allan, Daiki, Owen, Alejandro, Jean-François, Cosimo, Sebastian, Adel, Alban;
|
||||||
|
#686484, #686728, #686805, #686574, #686763, #682428, #687132, #685239,
|
||||||
|
#687189, #687226, #658091, #670687, #687457, #687242, #687287, #687020,
|
||||||
|
#686583, #661194, #687491, #657315, #687958, #683986, #688089, #687708,
|
||||||
|
#686530, #684810, #688181, #688475, #688557, #688507, #638351]
|
||||||
|
|
||||||
|
Contributors:
|
||||||
|
Elad Alfassa, Matthew Barnes, Alban Browaeys, Giovanni Campagna,
|
||||||
|
Cosimo Cecchi, Matthias Clasen, Allan Day, Stéphane Démurget,
|
||||||
|
Jean-François Fortin Tam, Adel Gadllah, Alex Hultman, Sebastian Keller,
|
||||||
|
Rui Matos, Simon McVittie, Aleksander Morgado, Florian Müllner,
|
||||||
|
Bastien Nocera, Pierre-Eric Pelloux-Prayer, Alejandro Piñeiro, Neil Roberts,
|
||||||
|
Sjoerd Simons, Carlos Soriano Sánchez, Jasper St. Pierre, Ray Strode,
|
||||||
|
Owen Taylor, Daiki Ueno, Thomas Wood
|
||||||
|
|
||||||
|
Translations:
|
||||||
|
Dušan Kazik [sk], Pavol Klačanský [sk], Piotr Drąg [pl], Yuri Myasoedov [ru],
|
||||||
|
Marek Černocký [cs], Kjartan Maraas [nb], Wolfgang Stöggl [de],
|
||||||
|
Yaron Shahrabani [he], Fran Diéguez [gl], Mattias Põldaru [et]
|
||||||
|
|
||||||
3.7.1
|
3.7.1
|
||||||
=====
|
=====
|
||||||
* Add shortcut to open application view directly [Jeremy; #685738]
|
* Add shortcut to open application view directly [Jeremy; #685738]
|
||||||
|
12
configure.ac
12
configure.ac
@@ -1,5 +1,5 @@
|
|||||||
AC_PREREQ(2.63)
|
AC_PREREQ(2.63)
|
||||||
AC_INIT([gnome-shell],[3.7.1],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
AC_INIT([gnome-shell],[3.7.2],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||||
|
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
AC_CONFIG_SRCDIR([src/shell-global.c])
|
AC_CONFIG_SRCDIR([src/shell-global.c])
|
||||||
@@ -65,7 +65,7 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
|
|||||||
CLUTTER_MIN_VERSION=1.11.11
|
CLUTTER_MIN_VERSION=1.11.11
|
||||||
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
|
||||||
GJS_MIN_VERSION=1.33.2
|
GJS_MIN_VERSION=1.33.2
|
||||||
MUTTER_MIN_VERSION=3.7.1
|
MUTTER_MIN_VERSION=3.7.2
|
||||||
GTK_MIN_VERSION=3.3.9
|
GTK_MIN_VERSION=3.3.9
|
||||||
GIO_MIN_VERSION=2.35.0
|
GIO_MIN_VERSION=2.35.0
|
||||||
LIBECAL_MIN_VERSION=3.5.3
|
LIBECAL_MIN_VERSION=3.5.3
|
||||||
@@ -78,6 +78,7 @@ STARTUP_NOTIFICATION_MIN_VERSION=0.11
|
|||||||
GCR_MIN_VERSION=3.3.90
|
GCR_MIN_VERSION=3.3.90
|
||||||
GNOME_DESKTOP_REQUIRED_VERSION=3.7.1
|
GNOME_DESKTOP_REQUIRED_VERSION=3.7.1
|
||||||
GNOME_MENUS_REQUIRED_VERSION=3.5.3
|
GNOME_MENUS_REQUIRED_VERSION=3.5.3
|
||||||
|
NETWORKMANAGER_MIN_VERSION=0.9.7
|
||||||
|
|
||||||
# Collect more than 20 libraries for a prize!
|
# Collect more than 20 libraries for a prize!
|
||||||
PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
|
PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
|
||||||
@@ -98,8 +99,9 @@ PKG_CHECK_MODULES(GNOME_SHELL, gio-unix-2.0 >= $GIO_MIN_VERSION
|
|||||||
telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION
|
telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION
|
||||||
telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION
|
telepathy-logger-0.2 >= $TELEPATHY_LOGGER_MIN_VERSION
|
||||||
polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
|
polkit-agent-1 >= $POLKIT_MIN_VERSION xfixes
|
||||||
libnm-glib libnm-util gnome-keyring-1
|
libnm-glib libnm-util >= $NETWORKMANAGER_MIN_VERSION
|
||||||
gcr-3 >= $GCR_MIN_VERSION)
|
libnm-gtk >= $NETWORKMANAGER_MIN_VERSION
|
||||||
|
gnome-keyring-1 gcr-3 >= $GCR_MIN_VERSION)
|
||||||
|
|
||||||
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
|
PKG_CHECK_MODULES(SHELL_PERF_HELPER, gtk+-3.0 gio-2.0)
|
||||||
|
|
||||||
@@ -124,7 +126,7 @@ PKG_CHECK_MODULES(GNOME_SHELL_JS, gio-2.0 gjs-internals-1.0 >= $GJS_MIN_VERSION)
|
|||||||
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
|
PKG_CHECK_MODULES(ST, clutter-1.0 gtk+-3.0 libcroco-0.6 >= 0.6.8 x11)
|
||||||
PKG_CHECK_MODULES(TRAY, gtk+-3.0)
|
PKG_CHECK_MODULES(TRAY, gtk+-3.0)
|
||||||
PKG_CHECK_MODULES(GVC, libpulse libpulse-mainloop-glib gobject-2.0)
|
PKG_CHECK_MODULES(GVC, libpulse libpulse-mainloop-glib gobject-2.0)
|
||||||
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.5.4)
|
PKG_CHECK_MODULES(DESKTOP_SCHEMAS, gsettings-desktop-schemas >= 3.7.2)
|
||||||
|
|
||||||
AC_MSG_CHECKING([for bluetooth support])
|
AC_MSG_CHECKING([for bluetooth support])
|
||||||
PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0],
|
PKG_CHECK_EXISTS([gnome-bluetooth-1.0 >= 3.1.0],
|
||||||
|
@@ -54,7 +54,9 @@ keys_in_files = \
|
|||||||
$(NULL)
|
$(NULL)
|
||||||
keys_DATA = $(keys_in_files:.xml.in=.xml)
|
keys_DATA = $(keys_in_files:.xml.in=.xml)
|
||||||
|
|
||||||
gsettings_SCHEMAS = org.gnome.shell.gschema.xml
|
gsettings_SCHEMAS = \
|
||||||
|
org.gnome.shell.gschema.xml \
|
||||||
|
org.gnome.shell-foo.gschema.xml
|
||||||
|
|
||||||
@INTLTOOL_XML_NOMERGE_RULE@
|
@INTLTOOL_XML_NOMERGE_RULE@
|
||||||
|
|
||||||
@@ -81,7 +83,8 @@ EXTRA_DIST = \
|
|||||||
$(menu_DATA) \
|
$(menu_DATA) \
|
||||||
$(convert_DATA) \
|
$(convert_DATA) \
|
||||||
$(keys_in_files) \
|
$(keys_in_files) \
|
||||||
org.gnome.shell.gschema.xml.in.in
|
org.gnome.shell.gschema.xml.in.in \
|
||||||
|
org.gnome.shell-foo.gschema.xml.in.in
|
||||||
|
|
||||||
CLEANFILES = \
|
CLEANFILES = \
|
||||||
gnome-shell.desktop.in \
|
gnome-shell.desktop.in \
|
||||||
@@ -91,4 +94,6 @@ CLEANFILES = \
|
|||||||
$(gsettings_SCHEMAS) \
|
$(gsettings_SCHEMAS) \
|
||||||
gschemas.compiled \
|
gschemas.compiled \
|
||||||
org.gnome.shell.gschema.valid \
|
org.gnome.shell.gschema.valid \
|
||||||
org.gnome.shell.gschema.xml.in
|
org.gnome.shell.gschema.xml.in \
|
||||||
|
org.gnome.shell-foo.gschema.valid \
|
||||||
|
org.gnome.shell-foo.gschema.xml.in
|
||||||
|
13
data/org.gnome.shell-foo.gschema.xml.in.in
Normal file
13
data/org.gnome.shell-foo.gschema.xml.in.in
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
<schemalist>
|
||||||
|
<schema id="org.gnome.shell-foo.overrides" path="/org/gnome/shell-foo/overrides/"
|
||||||
|
gettext-domain="@GETTEXT_PACKAGE@">
|
||||||
|
<key name="button-layout" type="s">
|
||||||
|
<default>":minimize,close"</default>
|
||||||
|
<_summary>Arrangement of buttons on the titlebar</_summary>
|
||||||
|
<_description>
|
||||||
|
This key overrides the key in org.gnome.desktop.wm.preferences when
|
||||||
|
running GNOME Shell in Foo mode.
|
||||||
|
</_description>
|
||||||
|
</key>
|
||||||
|
</schema>
|
||||||
|
</schemalist>
|
@@ -65,6 +65,11 @@ value here is from the GsmPresenceStatus enumeration.</_summary>
|
|||||||
menuitem in single-user, single-session situations.
|
menuitem in single-user, single-session situations.
|
||||||
</_description>
|
</_description>
|
||||||
</key>
|
</key>
|
||||||
|
<key name="show-full-name" type="b">
|
||||||
|
<default>true</default>
|
||||||
|
<_summary>Show full name in the user menu</_summary>
|
||||||
|
<_description>Whether the users full name is shown in the user menu or not.</_description>
|
||||||
|
</key>
|
||||||
<child name="calendar" schema="org.gnome.shell.calendar"/>
|
<child name="calendar" schema="org.gnome.shell.calendar"/>
|
||||||
<child name="recorder" schema="org.gnome.shell.recorder"/>
|
<child name="recorder" schema="org.gnome.shell.recorder"/>
|
||||||
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
<child name="keybindings" schema="org.gnome.shell.keybindings"/>
|
||||||
|
@@ -405,11 +405,13 @@ StScrollBar StButton#vhandle:active {
|
|||||||
padding: 0 4px;
|
padding: 0 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-dialog-prompt-entry:insensitive {
|
.modal-dialog StEntry:insensitive {
|
||||||
color: rgba(0,0,0,0.7);
|
border-color: #666666;
|
||||||
border: 2px solid #565656;
|
color: #9f9f9f;
|
||||||
background-gradient-start: rgb(200,200,200);
|
border: 2px solid #9f9f9f;
|
||||||
background-gradient-end: rgb(210,210,210);
|
background-gradient-direction: none;
|
||||||
|
background-color: rgba(102, 102, 102, 0.15);
|
||||||
|
box-shadow: inset 0 0 rgba(0,0,0,1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Panel */
|
/* Panel */
|
||||||
@@ -418,6 +420,18 @@ StScrollBar StButton#vhandle:active {
|
|||||||
background-color: black;
|
background-color: black;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
height: 1.86em;
|
height: 1.86em;
|
||||||
|
transition-duration: 250;
|
||||||
|
}
|
||||||
|
|
||||||
|
#panel.lock-screen {
|
||||||
|
height: 2em;
|
||||||
|
background-color: rgba(0,0,0,0.3);
|
||||||
|
}
|
||||||
|
|
||||||
|
#panel.unlock-screen,
|
||||||
|
#panel.login-screen {
|
||||||
|
height: 2em;
|
||||||
|
background-color: transparent;
|
||||||
}
|
}
|
||||||
|
|
||||||
#panelLeft, #panelCenter {
|
#panelLeft, #panelCenter {
|
||||||
@@ -453,6 +467,13 @@ StScrollBar StButton#vhandle:active {
|
|||||||
-panel-corner-border-color: rgba(255,255,255,0.8);
|
-panel-corner-border-color: rgba(255,255,255,0.8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.panel-corner.lock-screen,
|
||||||
|
.panel-corner.unlock-screen,
|
||||||
|
.panel-corner.login-screen {
|
||||||
|
-panel-corner-background-color: transparent;
|
||||||
|
-panel-corner-border-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
#appMenu {
|
#appMenu {
|
||||||
spacing: 4px;
|
spacing: 4px;
|
||||||
}
|
}
|
||||||
@@ -485,6 +506,24 @@ StScrollBar StButton#vhandle:active {
|
|||||||
transition-duration: 100;
|
transition-duration: 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#panel.unlock-screen .panel-button,
|
||||||
|
#panel.lock-screen .panel-button,
|
||||||
|
#panel.login-screen .panel-button {
|
||||||
|
color: #e6e6e6;
|
||||||
|
}
|
||||||
|
|
||||||
|
#panel.unlock-screen .panel-button:hover,
|
||||||
|
#panel.lock-screen .panel-button:hover,
|
||||||
|
#panel.login-screen .panel-button:hover,
|
||||||
|
#panel.unlock-screen .panel-button:active,
|
||||||
|
#panel.lock-screen .panel-button:active,
|
||||||
|
#panel.login-screen .panel-button:active,
|
||||||
|
#panel.unlock-screen .panel-button:focus,
|
||||||
|
#panel.lock-screen .panel-button:focus,
|
||||||
|
#panel.login-screen .panel-button:focus {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
.panel-button:hover {
|
.panel-button:hover {
|
||||||
color: white;
|
color: white;
|
||||||
text-shadow: black 0px 2px 2px;
|
text-shadow: black 0px 2px 2px;
|
||||||
@@ -615,6 +654,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
border-radius: 8px;
|
border-radius: 8px;
|
||||||
padding: 4px 12px;
|
padding: 4px 12px;
|
||||||
-shell-caption-spacing: 12px;
|
-shell-caption-spacing: 12px;
|
||||||
|
border: 2px solid rgba(0, 0, 0, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
.window-close, .notification-close {
|
.window-close, .notification-close {
|
||||||
@@ -625,7 +665,16 @@ StScrollBar StButton#vhandle:active {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.window-close {
|
.window-close {
|
||||||
-shell-close-overlap: 20px;
|
-shell-close-overlap: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.window-caption:hover {
|
||||||
|
border: 2px solid rgba(255, 255, 255, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
.window-clone-border {
|
||||||
|
border: 4px solid rgba(255, 255, 255, 0.5);
|
||||||
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.notification-close {
|
.notification-close {
|
||||||
@@ -1222,6 +1271,12 @@ StScrollBar StButton#vhandle:active {
|
|||||||
outline: 1px solid rgba(128, 128, 128, 0.3);
|
outline: 1px solid rgba(128, 128, 128, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.no-messages-label {
|
||||||
|
font-family: cantarell, sans-serif;
|
||||||
|
font-size: 11pt;
|
||||||
|
color: #999999;
|
||||||
|
}
|
||||||
|
|
||||||
.notification {
|
.notification {
|
||||||
border-radius: 10px 10px 0px 0px;
|
border-radius: 10px 10px 0px 0px;
|
||||||
background: rgba(0,0,0,0.8);
|
background: rgba(0,0,0,0.8);
|
||||||
@@ -1255,7 +1310,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.summary-boxpointer {
|
.summary-boxpointer {
|
||||||
-arrow-border-radius: 8px;
|
-arrow-border-radius: 15px;
|
||||||
-arrow-background-color: rgba(0,0,0,0.8);
|
-arrow-background-color: rgba(0,0,0,0.8);
|
||||||
-arrow-base: 36px;
|
-arrow-base: 36px;
|
||||||
-arrow-rise: 18px;
|
-arrow-rise: 18px;
|
||||||
@@ -1276,8 +1331,8 @@ StScrollBar StButton#vhandle:active {
|
|||||||
|
|
||||||
.summary-notification-stack-scrollview {
|
.summary-notification-stack-scrollview {
|
||||||
max-height: 18em;
|
max-height: 18em;
|
||||||
padding-top: 6px;
|
padding-top: 8px;
|
||||||
padding-bottom: 6px;
|
padding-bottom: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.summary-notification-stack-scrollview:ltr {
|
.summary-notification-stack-scrollview:ltr {
|
||||||
@@ -2129,7 +2184,7 @@ StScrollBar StButton#vhandle:active {
|
|||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
text-align: left;
|
text-align: left;
|
||||||
padding-left: 15px;
|
padding-left: 15px;
|
||||||
text-shadow: black 4px 4px 3px 0px;
|
text-shadow: black 0px 4px 3px 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.login-dialog-prompt-layout {
|
.login-dialog-prompt-layout {
|
||||||
@@ -2195,6 +2250,10 @@ StScrollBar StButton#vhandle:active {
|
|||||||
height: .75em;
|
height: .75em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.login-dialog .modal-dialog-button-box {
|
||||||
|
spacing: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
.login-dialog .modal-dialog-button {
|
.login-dialog .modal-dialog-button {
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
padding: 3px 18px;
|
padding: 3px 18px;
|
||||||
@@ -2325,17 +2384,3 @@ StScrollBar StButton#vhandle:active {
|
|||||||
padding-bottom: 0px;
|
padding-bottom: 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.osd-window {
|
|
||||||
color: #ededed;
|
|
||||||
background-color: rgba(33, 37, 38, 0.80);
|
|
||||||
border-radius: 15px;
|
|
||||||
text-shadow: 0 1px rgba(0, 0, 0, 0.75);
|
|
||||||
|
|
||||||
padding: 40px;
|
|
||||||
spacing: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.osd-progress-bar {
|
|
||||||
height: 0.8em;
|
|
||||||
border: 1px solid;
|
|
||||||
}
|
|
||||||
|
@@ -100,7 +100,6 @@ nobase_dist_js_DATA = \
|
|||||||
ui/components/__init__.js \
|
ui/components/__init__.js \
|
||||||
ui/components/autorunManager.js \
|
ui/components/autorunManager.js \
|
||||||
ui/components/automountManager.js \
|
ui/components/automountManager.js \
|
||||||
ui/components/mediaKeysManager.js \
|
|
||||||
ui/components/networkAgent.js \
|
ui/components/networkAgent.js \
|
||||||
ui/components/polkitAgent.js \
|
ui/components/polkitAgent.js \
|
||||||
ui/components/recorder.js \
|
ui/components/recorder.js \
|
||||||
|
@@ -39,6 +39,7 @@ const GdmUtil = imports.gdm.util;
|
|||||||
const Lightbox = imports.ui.lightbox;
|
const Lightbox = imports.ui.lightbox;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
|
const Panel = imports.ui.panel;
|
||||||
const PanelMenu = imports.ui.panelMenu;
|
const PanelMenu = imports.ui.panelMenu;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const UserMenu = imports.ui.userMenu;
|
const UserMenu = imports.ui.userMenu;
|
||||||
@@ -48,6 +49,10 @@ const _SCROLL_ANIMATION_TIME = 0.5;
|
|||||||
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
|
const _TIMED_LOGIN_IDLE_THRESHOLD = 5.0;
|
||||||
const _LOGO_ICON_HEIGHT = 16;
|
const _LOGO_ICON_HEIGHT = 16;
|
||||||
|
|
||||||
|
const WORK_SPINNER_ICON_SIZE = 24;
|
||||||
|
const WORK_SPINNER_ANIMATION_DELAY = 1.0;
|
||||||
|
const WORK_SPINNER_ANIMATION_TIME = 0.3;
|
||||||
|
|
||||||
let _loginDialog = null;
|
let _loginDialog = null;
|
||||||
|
|
||||||
function _smoothlyResizeActor(actor, width, height) {
|
function _smoothlyResizeActor(actor, width, height) {
|
||||||
@@ -604,6 +609,14 @@ const SessionList = new Lang.Class({
|
|||||||
this.close();
|
this.close();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
updateSensitivity: function(sensitive) {
|
||||||
|
this._button.reactive = sensitive;
|
||||||
|
this._button.can_focus = sensitive;
|
||||||
|
|
||||||
|
for (let id in this._items)
|
||||||
|
this._items[id].actor.reactive = sensitive;
|
||||||
|
},
|
||||||
|
|
||||||
setActiveSession: function(sessionId) {
|
setActiveSession: function(sessionId) {
|
||||||
if (sessionId == this._activeSessionId)
|
if (sessionId == this._activeSessionId)
|
||||||
return;
|
return;
|
||||||
@@ -660,6 +673,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
this.parent({ shellReactive: true,
|
this.parent({ shellReactive: true,
|
||||||
styleClass: 'login-dialog',
|
styleClass: 'login-dialog',
|
||||||
parentActor: parentActor,
|
parentActor: parentActor,
|
||||||
|
keybindingMode: Main.KeybindingMode.LOGIN_SCREEN,
|
||||||
shouldFadeIn: false });
|
shouldFadeIn: false });
|
||||||
this.connect('destroy',
|
this.connect('destroy',
|
||||||
Lang.bind(this, this._onDestroy));
|
Lang.bind(this, this._onDestroy));
|
||||||
@@ -684,6 +698,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._userVerifier = new GdmUtil.ShellUserVerifier(this._greeterClient);
|
this._userVerifier = new GdmUtil.ShellUserVerifier(this._greeterClient);
|
||||||
this._userVerifier.connect('ask-question', Lang.bind(this, this._askQuestion));
|
this._userVerifier.connect('ask-question', Lang.bind(this, this._askQuestion));
|
||||||
this._userVerifier.connect('show-message', Lang.bind(this, this._showMessage));
|
this._userVerifier.connect('show-message', Lang.bind(this, this._showMessage));
|
||||||
|
this._userVerifier.connect('verification-failed', Lang.bind(this, this._verificationFailed));
|
||||||
this._userVerifier.connect('reset', Lang.bind(this, this._reset));
|
this._userVerifier.connect('reset', Lang.bind(this, this._reset));
|
||||||
this._userVerifier.connect('show-login-hint', Lang.bind(this, this._showLoginHint));
|
this._userVerifier.connect('show-login-hint', Lang.bind(this, this._showLoginHint));
|
||||||
this._userVerifier.connect('hide-login-hint', Lang.bind(this, this._hideLoginHint));
|
this._userVerifier.connect('hide-login-hint', Lang.bind(this, this._hideLoginHint));
|
||||||
@@ -749,6 +764,9 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._promptLoginHint.hide();
|
this._promptLoginHint.hide();
|
||||||
this._promptBox.add(this._promptLoginHint);
|
this._promptBox.add(this._promptLoginHint);
|
||||||
|
|
||||||
|
this._signInButton = null;
|
||||||
|
this._workSpinner = null;
|
||||||
|
|
||||||
this._sessionList = new SessionList();
|
this._sessionList = new SessionList();
|
||||||
this._sessionList.connect('session-activated',
|
this._sessionList.connect('session-activated',
|
||||||
Lang.bind(this, function(list, sessionId) {
|
Lang.bind(this, function(list, sessionId) {
|
||||||
@@ -828,6 +846,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_reset: function() {
|
_reset: function() {
|
||||||
|
this._updateSensitivity(true);
|
||||||
this._promptMessage.hide();
|
this._promptMessage.hide();
|
||||||
this._user = null;
|
this._user = null;
|
||||||
this._verifyingUser = false;
|
this._verifyingUser = false;
|
||||||
@@ -838,6 +857,13 @@ const LoginDialog = new Lang.Class({
|
|||||||
this._showUserList();
|
this._showUserList();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_verificationFailed: function() {
|
||||||
|
this._promptEntry.text = '';
|
||||||
|
|
||||||
|
this._updateSensitivity(true);
|
||||||
|
this._setWorking(false);
|
||||||
|
},
|
||||||
|
|
||||||
_onDefaultSessionChanged: function(client, sessionId) {
|
_onDefaultSessionChanged: function(client, sessionId) {
|
||||||
this._sessionList.setActiveSession(sessionId);
|
this._sessionList.setActiveSession(sessionId);
|
||||||
},
|
},
|
||||||
@@ -908,35 +934,12 @@ const LoginDialog = new Lang.Class({
|
|||||||
_showPrompt: function(forSecret) {
|
_showPrompt: function(forSecret) {
|
||||||
let hold = new Batch.Hold();
|
let hold = new Batch.Hold();
|
||||||
|
|
||||||
let cancelButtonInfo = { action: Lang.bind(this, this.cancel),
|
|
||||||
label: _("Cancel"),
|
|
||||||
key: Clutter.Escape };
|
|
||||||
let okButtonInfo = { action: Lang.bind(this, function() {
|
|
||||||
hold.release();
|
|
||||||
}),
|
|
||||||
label: forSecret ? C_("button", "Sign In") : _("Next"),
|
|
||||||
default: true };
|
|
||||||
let buttons = [];
|
|
||||||
if (!this._disableUserList || this._verifyingUser)
|
|
||||||
buttons.push(cancelButtonInfo);
|
|
||||||
buttons.push(okButtonInfo);
|
|
||||||
|
|
||||||
let tasks = [function() {
|
let tasks = [function() {
|
||||||
return this._fadeInPrompt();
|
return this._fadeInPrompt();
|
||||||
},
|
},
|
||||||
|
|
||||||
function() {
|
function() {
|
||||||
this.setButtons(buttons);
|
this._prepareDialog(forSecret, hold);
|
||||||
|
|
||||||
let updateOkButtonEnabled = Lang.bind(this, function() {
|
|
||||||
let sensitive = this._promptEntry.text.length > 0;
|
|
||||||
okButtonInfo.button.reactive = sensitive;
|
|
||||||
okButtonInfo.button.can_focus = sensitive;
|
|
||||||
});
|
|
||||||
|
|
||||||
updateOkButtonEnabled();
|
|
||||||
|
|
||||||
this._promptEntryTextChangedId = this._promptEntry.clutter_text.connect('text-changed', updateOkButtonEnabled);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
hold];
|
hold];
|
||||||
@@ -946,6 +949,63 @@ const LoginDialog = new Lang.Class({
|
|||||||
return batch.run();
|
return batch.run();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_prepareDialog: function(forSecret, hold) {
|
||||||
|
this._workSpinner = new Panel.AnimatedIcon('process-working.svg', WORK_SPINNER_ICON_SIZE);
|
||||||
|
this._workSpinner.actor.opacity = 0;
|
||||||
|
this._workSpinner.actor.show();
|
||||||
|
|
||||||
|
this.buttonLayout.visible = true;
|
||||||
|
this.clearButtons();
|
||||||
|
|
||||||
|
if (!this._disableUserList || this._verifyingUser)
|
||||||
|
this.addButton({ action: Lang.bind(this, this.cancel),
|
||||||
|
label: _("Cancel"),
|
||||||
|
key: Clutter.Escape },
|
||||||
|
{ expand: true,
|
||||||
|
x_fill: false,
|
||||||
|
y_fill: false,
|
||||||
|
x_align: St.Align.START,
|
||||||
|
y_align: St.Align.MIDDLE });
|
||||||
|
this.buttonLayout.add(this._workSpinner.actor,
|
||||||
|
{ expand: false,
|
||||||
|
x_fill: false,
|
||||||
|
y_fill: false,
|
||||||
|
x_align: St.Align.END,
|
||||||
|
y_align: St.Align.MIDDLE });
|
||||||
|
this._signInButton = this.addButton({ action: Lang.bind(this, function() {
|
||||||
|
hold.release();
|
||||||
|
}),
|
||||||
|
label: forSecret ? C_("button", "Sign In") : _("Next"),
|
||||||
|
default: true },
|
||||||
|
{ expand: false,
|
||||||
|
x_fill: false,
|
||||||
|
y_fill: false,
|
||||||
|
x_align: St.Align.END,
|
||||||
|
y_align: St.Align.MIDDLE });
|
||||||
|
|
||||||
|
this._updateSignInButtonSensitivity(this._promptEntry.text.length > 0);
|
||||||
|
|
||||||
|
this._promptEntryTextChangedId =
|
||||||
|
this._promptEntry.clutter_text.connect('text-changed',
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
this._updateSignInButtonSensitivity(this._promptEntry.text.length > 0);
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateSensitivity: function(sensitive) {
|
||||||
|
this._promptEntry.reactive = sensitive;
|
||||||
|
this._promptEntry.clutter_text.editable = sensitive;
|
||||||
|
this._sessionList.updateSensitivity(sensitive);
|
||||||
|
this._updateSignInButtonSensitivity(sensitive);
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateSignInButtonSensitivity: function(sensitive) {
|
||||||
|
if (this._signInButton) {
|
||||||
|
this._signInButton.reactive = sensitive;
|
||||||
|
this._signInButton.can_focus = sensitive;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
_hidePrompt: function() {
|
_hidePrompt: function() {
|
||||||
this.setButtons([]);
|
this.setButtons([]);
|
||||||
|
|
||||||
@@ -955,13 +1015,20 @@ const LoginDialog = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
let tasks = [function() {
|
let tasks = [function() {
|
||||||
|
this._setWorking(false);
|
||||||
|
|
||||||
return GdmUtil.fadeOutActor(this._promptBox);
|
return GdmUtil.fadeOutActor(this._promptBox);
|
||||||
},
|
},
|
||||||
|
|
||||||
function() {
|
function() {
|
||||||
this._promptLoginHint.hide();
|
this._promptLoginHint.hide();
|
||||||
this._promptEntry.reactive = true;
|
|
||||||
|
this._updateSensitivity(true);
|
||||||
this._promptEntry.set_text('');
|
this._promptEntry.set_text('');
|
||||||
|
|
||||||
|
this.clearButtons();
|
||||||
|
this._workSpinner = null;
|
||||||
|
this._signInButton = null;
|
||||||
}];
|
}];
|
||||||
|
|
||||||
let batch = new Batch.ConsecutiveBatch(this, tasks);
|
let batch = new Batch.ConsecutiveBatch(this, tasks);
|
||||||
@@ -969,6 +1036,31 @@ const LoginDialog = new Lang.Class({
|
|||||||
return batch.run();
|
return batch.run();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_setWorking: function(working) {
|
||||||
|
if (!this._workSpinner)
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (working) {
|
||||||
|
this._workSpinner.play();
|
||||||
|
Tweener.addTween(this._workSpinner.actor,
|
||||||
|
{ opacity: 255,
|
||||||
|
delay: WORK_SPINNER_ANIMATION_DELAY,
|
||||||
|
time: WORK_SPINNER_ANIMATION_TIME,
|
||||||
|
transition: 'linear'
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
Tweener.addTween(this._workSpinner.actor,
|
||||||
|
{ opacity: 0,
|
||||||
|
time: WORK_SPINNER_ANIMATION_TIME,
|
||||||
|
transition: 'linear',
|
||||||
|
onCompleteScope: this,
|
||||||
|
onComplete: function() {
|
||||||
|
this._workSpinner.stop();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
_askQuestion: function(verifier, serviceName, question, passwordChar) {
|
_askQuestion: function(verifier, serviceName, question, passwordChar) {
|
||||||
this._promptLabel.set_text(question);
|
this._promptLabel.set_text(question);
|
||||||
|
|
||||||
@@ -980,9 +1072,10 @@ const LoginDialog = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
function() {
|
function() {
|
||||||
let _text = this._promptEntry.get_text();
|
let text = this._promptEntry.get_text();
|
||||||
this._promptEntry.reactive = false;
|
this._updateSensitivity(false);
|
||||||
this._userVerifier.answerQuery(serviceName, _text);
|
this._setWorking(true);
|
||||||
|
this._userVerifier.answerQuery(serviceName, text);
|
||||||
}];
|
}];
|
||||||
|
|
||||||
let batch = new Batch.ConsecutiveBatch(this, tasks);
|
let batch = new Batch.ConsecutiveBatch(this, tasks);
|
||||||
@@ -1287,7 +1380,7 @@ const LoginDialog = new Lang.Class({
|
|||||||
_onOpened: function() {
|
_onOpened: function() {
|
||||||
Main.ctrlAltTabManager.addGroup(this.dialogLayout,
|
Main.ctrlAltTabManager.addGroup(this.dialogLayout,
|
||||||
_("Login Window"),
|
_("Login Window"),
|
||||||
'dialog-password',
|
'dialog-password-symbolic',
|
||||||
{ sortGroup: CtrlAltTab.SortGroup.MIDDLE });
|
{ sortGroup: CtrlAltTab.SortGroup.MIDDLE });
|
||||||
|
|
||||||
},
|
},
|
||||||
@@ -1295,6 +1388,6 @@ const LoginDialog = new Lang.Class({
|
|||||||
close: function() {
|
close: function() {
|
||||||
this.parent();
|
this.parent();
|
||||||
|
|
||||||
Main.ctrlAltTabManager.removeGroup(this._group);
|
Main.ctrlAltTabManager.removeGroup(this.dialogLayout);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -17,9 +17,6 @@ const SystemdLoginManagerIface = <interface name='org.freedesktop.login1.Manager
|
|||||||
<method name='Suspend'>
|
<method name='Suspend'>
|
||||||
<arg type='b' direction='in'/>
|
<arg type='b' direction='in'/>
|
||||||
</method>
|
</method>
|
||||||
<method name='Hibernate'>
|
|
||||||
<arg type='b' direction='in'/>
|
|
||||||
</method>
|
|
||||||
<method name='CanPowerOff'>
|
<method name='CanPowerOff'>
|
||||||
<arg type='s' direction='out'/>
|
<arg type='s' direction='out'/>
|
||||||
</method>
|
</method>
|
||||||
@@ -29,9 +26,6 @@ const SystemdLoginManagerIface = <interface name='org.freedesktop.login1.Manager
|
|||||||
<method name='CanSuspend'>
|
<method name='CanSuspend'>
|
||||||
<arg type='s' direction='out'/>
|
<arg type='s' direction='out'/>
|
||||||
</method>
|
</method>
|
||||||
<method name='CanHibernate'>
|
|
||||||
<arg type='s' direction='out'/>
|
|
||||||
</method>
|
|
||||||
</interface>;
|
</interface>;
|
||||||
|
|
||||||
const SystemdLoginSessionIface = <interface name='org.freedesktop.login1.Session'>
|
const SystemdLoginSessionIface = <interface name='org.freedesktop.login1.Session'>
|
||||||
@@ -146,15 +140,6 @@ const LoginManagerSystemd = new Lang.Class({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
canHibernate: function(asyncCallback) {
|
|
||||||
this._proxy.CanSuspendRemote(function(result, error) {
|
|
||||||
if (error)
|
|
||||||
asyncCallback(false);
|
|
||||||
else
|
|
||||||
asyncCallback(result[0] != 'no');
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
powerOff: function() {
|
powerOff: function() {
|
||||||
this._proxy.PowerOffRemote(true);
|
this._proxy.PowerOffRemote(true);
|
||||||
},
|
},
|
||||||
@@ -165,10 +150,6 @@ const LoginManagerSystemd = new Lang.Class({
|
|||||||
|
|
||||||
suspend: function() {
|
suspend: function() {
|
||||||
this._proxy.SuspendRemote(true);
|
this._proxy.SuspendRemote(true);
|
||||||
},
|
|
||||||
|
|
||||||
hibernate: function() {
|
|
||||||
this._proxy.HibernateRemote(true);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -234,13 +215,6 @@ const LoginManagerConsoleKit = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
canHibernate: function(asyncCallback) {
|
|
||||||
Mainloop.idle_add(Lang.bind(this, function() {
|
|
||||||
asyncCallback(this._upClient.get_can_hibernate());
|
|
||||||
return false;
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
powerOff: function() {
|
powerOff: function() {
|
||||||
this._proxy.StopRemote();
|
this._proxy.StopRemote();
|
||||||
},
|
},
|
||||||
@@ -251,9 +225,5 @@ const LoginManagerConsoleKit = new Lang.Class({
|
|||||||
|
|
||||||
suspend: function() {
|
suspend: function() {
|
||||||
this._upClient.suspend_sync(null);
|
this._upClient.suspend_sync(null);
|
||||||
},
|
|
||||||
|
|
||||||
hibernate: function() {
|
|
||||||
this._upClient.hibernate_sync(null);
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
108
js/misc/util.js
108
js/misc/util.js
@@ -159,86 +159,6 @@ function killall(processName) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This was ported from network-manager-applet
|
|
||||||
// Copyright 2007 - 2011 Red Hat, Inc.
|
|
||||||
// Author: Dan Williams <dcbw@redhat.com>
|
|
||||||
|
|
||||||
const _IGNORED_WORDS = [
|
|
||||||
'Semiconductor',
|
|
||||||
'Components',
|
|
||||||
'Corporation',
|
|
||||||
'Communications',
|
|
||||||
'Company',
|
|
||||||
'Corp.',
|
|
||||||
'Corp',
|
|
||||||
'Co.',
|
|
||||||
'Inc.',
|
|
||||||
'Inc',
|
|
||||||
'Incorporated',
|
|
||||||
'Ltd.',
|
|
||||||
'Limited.',
|
|
||||||
'Intel',
|
|
||||||
'chipset',
|
|
||||||
'adapter',
|
|
||||||
'[hex]',
|
|
||||||
'NDIS',
|
|
||||||
'Module'
|
|
||||||
];
|
|
||||||
|
|
||||||
const _IGNORED_PHRASES = [
|
|
||||||
'Multiprotocol MAC/baseband processor',
|
|
||||||
'Wireless LAN Controller',
|
|
||||||
'Wireless LAN Adapter',
|
|
||||||
'Wireless Adapter',
|
|
||||||
'Network Connection',
|
|
||||||
'Wireless Cardbus Adapter',
|
|
||||||
'Wireless CardBus Adapter',
|
|
||||||
'54 Mbps Wireless PC Card',
|
|
||||||
'Wireless PC Card',
|
|
||||||
'Wireless PC',
|
|
||||||
'PC Card with XJACK(r) Antenna',
|
|
||||||
'Wireless cardbus',
|
|
||||||
'Wireless LAN PC Card',
|
|
||||||
'Technology Group Ltd.',
|
|
||||||
'Communication S.p.A.',
|
|
||||||
'Business Mobile Networks BV',
|
|
||||||
'Mobile Broadband Minicard Composite Device',
|
|
||||||
'Mobile Communications AB',
|
|
||||||
'(PC-Suite Mode)'
|
|
||||||
];
|
|
||||||
|
|
||||||
function fixupPCIDescription(desc) {
|
|
||||||
desc = desc.replace(/[_,]/, ' ');
|
|
||||||
|
|
||||||
/* Attempt to shorten ID by ignoring certain phrases */
|
|
||||||
for (let i = 0; i < _IGNORED_PHRASES.length; i++) {
|
|
||||||
let item = _IGNORED_PHRASES[i];
|
|
||||||
let pos = desc.indexOf(item);
|
|
||||||
if (pos != -1) {
|
|
||||||
let before = desc.substring(0, pos);
|
|
||||||
let after = desc.substring(pos + item.length, desc.length);
|
|
||||||
desc = before + after;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Attmept to shorten ID by ignoring certain individual words */
|
|
||||||
let words = desc.split(' ');
|
|
||||||
let out = [ ];
|
|
||||||
for (let i = 0; i < words.length; i++) {
|
|
||||||
let item = words[i];
|
|
||||||
|
|
||||||
// skip empty items (that come out from consecutive spaces)
|
|
||||||
if (item.length == 0)
|
|
||||||
continue;
|
|
||||||
|
|
||||||
if (_IGNORED_WORDS.indexOf(item) == -1) {
|
|
||||||
out.push(item);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return out.join(' ');
|
|
||||||
}
|
|
||||||
|
|
||||||
// lowerBound:
|
// lowerBound:
|
||||||
// @array: an array or array-like object, already sorted
|
// @array: an array or array-like object, already sorted
|
||||||
// according to @cmp
|
// according to @cmp
|
||||||
@@ -288,31 +208,3 @@ function insertSorted(array, val, cmp) {
|
|||||||
|
|
||||||
return pos;
|
return pos;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* wrapKeybinding:
|
|
||||||
*
|
|
||||||
* Wrap a keybinding handler so that
|
|
||||||
* it ignores an invocation if the shell is modal, but
|
|
||||||
* not when the overview is active, or when global
|
|
||||||
* keybindings are allowed by session mode.
|
|
||||||
* This function is only useful for keybindings installed
|
|
||||||
* with Meta.KeybindingFlags.HANDLE_WHEN_GRABBED
|
|
||||||
*/
|
|
||||||
function wrapKeybinding(handler, onlyInOverview) {
|
|
||||||
return function() {
|
|
||||||
let handle;
|
|
||||||
|
|
||||||
if (onlyInOverview) {
|
|
||||||
handle = Main.sessionMode.allowKeybindingsWhenModal ||
|
|
||||||
Main.modalCount == (Main.overview.visible ? 1 : 0);
|
|
||||||
} else {
|
|
||||||
handle = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (handle)
|
|
||||||
return handler.apply(this, arguments);
|
|
||||||
else
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
@@ -172,7 +172,7 @@ const AltTabPopup = new Lang.Class({
|
|||||||
|
|
||||||
if (!Main.pushModal(this.actor)) {
|
if (!Main.pushModal(this.actor)) {
|
||||||
// Probably someone else has a pointer grab, try again with keyboard only
|
// Probably someone else has a pointer grab, try again with keyboard only
|
||||||
if (!Main.pushModal(this.actor, global.get_current_time(), Meta.ModalOptions.POINTER_ALREADY_GRABBED)) {
|
if (!Main.pushModal(this.actor, { options: Meta.ModalOptions.POINTER_ALREADY_GRABBED })) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -199,7 +199,7 @@ const AltTabPopup = new Lang.Class({
|
|||||||
this.actor.get_allocation_box();
|
this.actor.get_allocation_box();
|
||||||
|
|
||||||
// Make the initial selection
|
// Make the initial selection
|
||||||
if (binding == 'internal-keybinding-switch-group') {
|
if (binding == 'switch-group') {
|
||||||
if (backward) {
|
if (backward) {
|
||||||
this._select(0, this._appIcons[0].cachedWindows.length - 1);
|
this._select(0, this._appIcons[0].cachedWindows.length - 1);
|
||||||
} else {
|
} else {
|
||||||
@@ -208,9 +208,9 @@ const AltTabPopup = new Lang.Class({
|
|||||||
else
|
else
|
||||||
this._select(0, 0);
|
this._select(0, 0);
|
||||||
}
|
}
|
||||||
} else if (binding == 'internal-keybinding-switch-group-backward') {
|
} else if (binding == 'switch-group-backward') {
|
||||||
this._select(0, this._appIcons[0].cachedWindows.length - 1);
|
this._select(0, this._appIcons[0].cachedWindows.length - 1);
|
||||||
} else if (binding == 'internal-keybinding-switch-windows-backward') {
|
} else if (binding == 'switch-windows-backward') {
|
||||||
this._select(this._appIcons.length - 1);
|
this._select(this._appIcons.length - 1);
|
||||||
} else if (this._appIcons.length == 1) {
|
} else if (this._appIcons.length == 1) {
|
||||||
this._select(0);
|
this._select(0);
|
||||||
|
@@ -216,6 +216,16 @@ const ViewByCategories = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_addCategory: function(name, index, dir) {
|
_addCategory: function(name, index, dir) {
|
||||||
|
let apps;
|
||||||
|
|
||||||
|
if (dir != null) {
|
||||||
|
apps = [];
|
||||||
|
this._loadCategory(dir, apps);
|
||||||
|
|
||||||
|
if (apps.length == 0)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
let button = new St.Button({ label: GLib.markup_escape_text (name, -1),
|
let button = new St.Button({ label: GLib.markup_escape_text (name, -1),
|
||||||
style_class: 'app-filter',
|
style_class: 'app-filter',
|
||||||
x_align: St.Align.START,
|
x_align: St.Align.START,
|
||||||
@@ -225,12 +235,9 @@ const ViewByCategories = new Lang.Class({
|
|||||||
this._selectCategory(index);
|
this._selectCategory(index);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
var apps;
|
|
||||||
if (dir == null) {
|
if (dir == null) {
|
||||||
this._allCategoryButton = button;
|
this._allCategoryButton = button;
|
||||||
} else {
|
} else {
|
||||||
apps = [];
|
|
||||||
this._loadCategory(dir, apps);
|
|
||||||
this._categories.push({ apps: apps,
|
this._categories.push({ apps: apps,
|
||||||
name: name,
|
name: name,
|
||||||
button: button });
|
button: button });
|
||||||
|
@@ -1,647 +0,0 @@
|
|||||||
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
|
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
|
||||||
const Gdk = imports.gi.Gdk;
|
|
||||||
const GLib = imports.gi.GLib;
|
|
||||||
const Gio = imports.gi.Gio;
|
|
||||||
const Lang = imports.lang;
|
|
||||||
const Meta = imports.gi.Meta;
|
|
||||||
const Shell = imports.gi.Shell;
|
|
||||||
const St = imports.gi.St;
|
|
||||||
|
|
||||||
const Main = imports.ui.main;
|
|
||||||
const MessageTray = imports.ui.messageTray;
|
|
||||||
const ShellMountOperation = imports.ui.shellMountOperation;
|
|
||||||
const Tweener = imports.ui.tweener;
|
|
||||||
const Util = imports.misc.util;
|
|
||||||
|
|
||||||
const INTERFACE_SETTINGS = 'org.gnome.desktop.interface';
|
|
||||||
const POWER_SETTINGS = 'org.gnome.settings-daemon.plugins.power';
|
|
||||||
const XSETTINGS_SETTINGS = 'org.gnome.settings-daemon.plugins.xsettings';
|
|
||||||
const TOUCHPAD_SETTINGS = 'org.gnome.settings-daemon.peripherals.touchpad';
|
|
||||||
const KEYBINDING_SETTINGS = 'org.gnome.settings-daemon.plugins.media-keys';
|
|
||||||
const CUSTOM_KEYBINDING_SETTINGS = 'org.gnome.settings-daemon.plugins.media-keys.custom-keybinding';
|
|
||||||
const A11Y_SETTINGS = 'org.gnome.desktop.a11y.applications';
|
|
||||||
const MAGNIFIER_SETTINGS = 'org.gnome.desktop.a11y.magnifier';
|
|
||||||
const INPUT_SOURCE_SETTINGS = 'org.gnome.desktop.input-sources';
|
|
||||||
|
|
||||||
const MediaKeysInterface = <interface name='org.gnome.SettingsDaemon.MediaKeys'>
|
|
||||||
<method name='GrabMediaPlayerKeys'>
|
|
||||||
<arg name='application' direction='in' type='s'/>
|
|
||||||
<arg name='time' direction='in' type='u'/>
|
|
||||||
</method>
|
|
||||||
<method name='ReleaseMediaPlayerKeys'>
|
|
||||||
<arg name='application' direction='in' type='s'/>
|
|
||||||
</method>
|
|
||||||
<signal name='MediaPlayerKeyPressed'>
|
|
||||||
<arg name='application' type='s'/>
|
|
||||||
<arg name='key' type='s'/>
|
|
||||||
</signal>
|
|
||||||
</interface>;
|
|
||||||
|
|
||||||
/* [ actionName, setting, hardcodedKeysym, overviewOnly, args ] */
|
|
||||||
/* (overviewOnly means that the keybinding is handled when the shell is not
|
|
||||||
modal, or when the overview is active, but not when other modal operations
|
|
||||||
are active; otherwise the keybinding is always handled) */
|
|
||||||
const DEFAULT_KEYBINDINGS = [
|
|
||||||
[ 'doTouchpadToggle', null, 'XF86TouchpadToggle', false ],
|
|
||||||
[ 'doTouchpadSet', null, 'XF86TouchpadOn', false, [ true ] ],
|
|
||||||
[ 'doTouchpadSet', null, 'XF86TouchpadOff', false, [ false ] ],
|
|
||||||
[ 'doMute', 'volume-mute', null, false, [ false ] ],
|
|
||||||
[ 'doVolumeAdjust', 'volume-down', null, false, [ Clutter.ScrollDirection.DOWN, false ] ],
|
|
||||||
[ 'doVolumeAdjust', 'volume-up', null, false, [ Clutter.ScrollDirection.UP, false ] ],
|
|
||||||
[ 'doMute', null, '<Alt>XF86AudioMute', false, [ true ] ],
|
|
||||||
[ 'doVolumeAdjust', null, '<Alt>XF86AudioLowerVolume', false, [ Clutter.ScrollDirection.DOWN, true ] ],
|
|
||||||
[ 'doVolumeAdjust', null, '<Alt>XF86AudioRaiseVolume', false, [ Clutter.ScrollDirection.UP, true ] ],
|
|
||||||
[ 'doLogout', 'logout', null, true ],
|
|
||||||
[ 'doEject', 'eject', null, false ],
|
|
||||||
[ 'doHome', 'home', null, true ],
|
|
||||||
[ 'doLaunchMimeHandler', 'media', null, true, [ 'application/x-vorbis+ogg' ] ],
|
|
||||||
[ 'doLaunchApp', 'calculator', null, true, [ 'gcalcltool.desktop' ] ],
|
|
||||||
[ 'doLaunchApp', 'search', null, true, [ 'tracker-needle.desktop' ] ],
|
|
||||||
[ 'doLaunchMimeHandler', 'email', null, true, [ 'x-scheme-handler/mailto' ] ],
|
|
||||||
[ 'doScreensaver', 'screensaver', null, true ],
|
|
||||||
[ 'doScreensaver', null, 'XF86ScreenSaver', true ],
|
|
||||||
[ 'doLaunchApp', 'help', null, true, [ 'yelp.desktop' ] ],
|
|
||||||
[ 'doSpawn', 'screenshot', null, true, [ ['gnome-screenshot'] ] ],
|
|
||||||
[ 'doSpawn', 'window-screenshot', null, true, [ ['gnome-screenshot', '--window'] ] ],
|
|
||||||
[ 'doSpawn', 'area-screenshot', null, true, [ ['gnome-screenshot', '--area'] ] ],
|
|
||||||
[ 'doSpawn', 'screenshot-clip', null, true, [ ['gnome-screenshot', '--clipboard'] ] ],
|
|
||||||
[ 'doSpawn', 'window-screenshot-clip', null, true, [ ['gnome-screenshot', '--window', '--clipboard'] ] ],
|
|
||||||
[ 'doSpawn', 'area-screenshot-clip', null, true, [ ['gnome-screenshot', '--area', '--clipboard'] ] ],
|
|
||||||
[ 'doLaunchMimeHandler', 'www', null, true, [ 'x-scheme-handler/http' ] ],
|
|
||||||
[ 'doMediaKey', 'play', null, true, [ 'Play' ] ],
|
|
||||||
[ 'doMediaKey', 'pause', null, true, [ 'Pause' ] ],
|
|
||||||
[ 'doMediaKey', 'stop', null, true, [ 'Stop' ] ],
|
|
||||||
[ 'doMediaKey', 'previous', null, true, [ 'Previous' ] ],
|
|
||||||
[ 'doMediaKey', 'next', null, true, [ 'Next' ] ],
|
|
||||||
[ 'doMediaKey', null, 'XF86AudioRewind', true, [ 'Rewind' ] ],
|
|
||||||
[ 'doMediaKey', null, 'XF86AudioForward', true, [ 'FastForward' ] ],
|
|
||||||
[ 'doMediaKey', null, 'XF86AudioRepeat', true, [ 'Repeat' ] ],
|
|
||||||
[ 'doMediaKey', null, 'XF86AudioRandomPlay', true, [ 'Shuffle' ] ],
|
|
||||||
[ 'doXRandRAction', null, '<Super>p', false, [ 'VideoModeSwitch' ] ],
|
|
||||||
/* Key code of the XF86Display key (Fn-F7 on Thinkpads, Fn-F4 on HP machines, etc.) */
|
|
||||||
[ 'doXRandRAction', null, 'XF86Display', false, [ 'VideoModeSwitch' ] ],
|
|
||||||
/* Key code of the XF86RotateWindows key (present on some tablets) */
|
|
||||||
[ 'doXRandRAction', null, 'XF86RotateWindows', false, [ 'Rotate' ] ],
|
|
||||||
[ 'doA11yAction', 'magnifier', null, true, [ 'screen-magnifier-enabled' ] ],
|
|
||||||
[ 'doA11yAction', 'screenreader', null, true, [ 'screen-reader-enabled' ] ],
|
|
||||||
[ 'doA11yAction', 'on-screen-keyboard', null, true, [ 'screen-keyboard-enabled' ] ],
|
|
||||||
[ 'doTextSize', 'increase-text-size', null, true, [ 1 ] ],
|
|
||||||
[ 'doTextSize', 'decrease-text-size', null, true, [ -1 ] ],
|
|
||||||
[ 'doToggleContrast', 'toggle-contrast', null, true ],
|
|
||||||
[ 'doMagnifierZoom', 'magnifier-zoom-in', null, true, [ 1 ] ],
|
|
||||||
[ 'doMagnifierZoom', 'magnifier-zoom-out', null, true, [ -1 ] ],
|
|
||||||
[ 'doPowerAction', null, 'XF86PowerOff', true, [ 'button-power' ] ],
|
|
||||||
/* the kernel / Xorg names really are like this... */
|
|
||||||
[ 'doPowerAction', null, 'XF86Suspend', false, [ 'button-sleep' ] ],
|
|
||||||
[ 'doPowerAction', null, 'XF86Sleep', false, [ 'button-suspend' ] ],
|
|
||||||
[ 'doPowerAction', null, 'XF86Hibernate', false, [ 'button-hibernate' ] ],
|
|
||||||
[ 'doBrightness', null, 'XF86MonBrightnessUp', false, [ 'Screen', 'StepUp' ] ],
|
|
||||||
[ 'doBrightness', null, 'XF86MonBrightnessDown', false, [ 'Screen', 'StepDown' ] ],
|
|
||||||
[ 'doBrightness', null, 'XF86KbdBrightnessUp', false, [ 'Keyboard', 'StepUp' ] ],
|
|
||||||
[ 'doBrightness', null, 'XF86KbdBrightnessDown', false, [ 'Keyboard', 'StepDown' ] ],
|
|
||||||
[ 'doBrightnessToggle', null, 'XF86KbdLightOnOff', false, ],
|
|
||||||
[ 'doInputSource', 'switch-input-source', null, false, [ +1 ] ],
|
|
||||||
[ 'doInputSource', 'switch-input-source-backward', null, false, [ -1 ] ],
|
|
||||||
[ 'doLaunchApp', null, 'XF86Battery', true, [ 'gnome-power-statistics.desktop' ] ]
|
|
||||||
];
|
|
||||||
|
|
||||||
var osdWin;
|
|
||||||
const OSDWindow = new Lang.Class({
|
|
||||||
Name: 'OSDWindow',
|
|
||||||
|
|
||||||
FADE_TIMEOUT: 1500,
|
|
||||||
FADE_DURATION: 100,
|
|
||||||
|
|
||||||
_init: function(iconName, value) {
|
|
||||||
/* assume 130x130 on a 640x480 display and scale from there */
|
|
||||||
let monitor = Main.layoutManager.primaryMonitor;
|
|
||||||
let scalew = monitor.width / 640.0;
|
|
||||||
let scaleh = monitor.height / 480.0;
|
|
||||||
let scale = Math.min(scalew, scaleh);
|
|
||||||
let size = 130 * Math.max(1, scale);
|
|
||||||
|
|
||||||
this.actor = new St.BoxLayout({ style_class: 'osd-window',
|
|
||||||
vertical: true,
|
|
||||||
reactive: false,
|
|
||||||
visible: false,
|
|
||||||
width: size,
|
|
||||||
height: size,
|
|
||||||
});
|
|
||||||
|
|
||||||
this._icon = new St.Icon({ icon_name: iconName,
|
|
||||||
icon_size: size / 2,
|
|
||||||
});
|
|
||||||
this.actor.add(this._icon, { expand: true,
|
|
||||||
x_align: St.Align.MIDDLE,
|
|
||||||
y_align: St.Align.MIDDLE });
|
|
||||||
|
|
||||||
this._value = value;
|
|
||||||
this._progressBar = new St.DrawingArea({ style_class: 'osd-progress-bar' });
|
|
||||||
this._progressBar.connect('repaint', Lang.bind(this, this._drawProgress));
|
|
||||||
this.actor.add(this._progressBar, { expand: true, x_fill: true, y_fill: false });
|
|
||||||
this._progressBar.visible = value !== undefined;
|
|
||||||
|
|
||||||
Main.layoutManager.addChrome(this.actor);
|
|
||||||
|
|
||||||
/* Position in the middle of primary monitor */
|
|
||||||
let [width, height] = this.actor.get_size();
|
|
||||||
this.actor.x = ((monitor.width - width) / 2) + monitor.x;
|
|
||||||
this.actor.y = monitor.y + (monitor.height / 2) + (monitor.height / 2 - height) / 2;
|
|
||||||
},
|
|
||||||
|
|
||||||
show: function() {
|
|
||||||
this.actor.show();
|
|
||||||
Tweener.addTween(this.actor,
|
|
||||||
{ opacity: 255,
|
|
||||||
time: this.FADE_DURATION / 1000,
|
|
||||||
transition: 'easeInQuad' });
|
|
||||||
|
|
||||||
if (this._timeoutId)
|
|
||||||
GLib.source_remove(this._timeoutId);
|
|
||||||
|
|
||||||
this._timeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, this.FADE_TIMEOUT, Lang.bind(this, this.hide));
|
|
||||||
},
|
|
||||||
|
|
||||||
hide: function() {
|
|
||||||
Tweener.addTween(this.actor,
|
|
||||||
{ opacity: 0,
|
|
||||||
time: this.FADE_DURATION / 1000,
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onComplete: function() {
|
|
||||||
this.actor.destroy();
|
|
||||||
this.actor = null;
|
|
||||||
osdWin = null;
|
|
||||||
},
|
|
||||||
onCompleteScope: this });
|
|
||||||
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
setIcon: function(name) {
|
|
||||||
this._icon.icon_name = name;
|
|
||||||
},
|
|
||||||
|
|
||||||
setValue: function(value) {
|
|
||||||
if (value == this._value)
|
|
||||||
return;
|
|
||||||
|
|
||||||
this._value = value;
|
|
||||||
this._progressBar.visible = value !== undefined;
|
|
||||||
this._progressBar.queue_repaint();
|
|
||||||
},
|
|
||||||
|
|
||||||
_drawProgress: function(area) {
|
|
||||||
let cr = area.get_context();
|
|
||||||
|
|
||||||
let themeNode = this.actor.get_theme_node();
|
|
||||||
let color = themeNode.get_foreground_color();
|
|
||||||
Clutter.cairo_set_source_color(cr, color);
|
|
||||||
|
|
||||||
let [width, height] = area.get_surface_size();
|
|
||||||
width = width * this._value;
|
|
||||||
|
|
||||||
cr.moveTo(0,0);
|
|
||||||
cr.lineTo(width, 0);
|
|
||||||
cr.lineTo(width, height);
|
|
||||||
cr.lineTo(0, height);
|
|
||||||
cr.fill();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
function showOSD(icon, value) {
|
|
||||||
if (osdWin) {
|
|
||||||
osdWin.setIcon(icon);
|
|
||||||
osdWin.setValue(value);
|
|
||||||
} else {
|
|
||||||
osdWin = new OSDWindow(icon, value);
|
|
||||||
}
|
|
||||||
|
|
||||||
osdWin.show();
|
|
||||||
}
|
|
||||||
|
|
||||||
const MediaKeysGrabber = new Lang.Class({
|
|
||||||
Name: 'MediaKeysGrabber',
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(MediaKeysInterface, this);
|
|
||||||
this._apps = [];
|
|
||||||
},
|
|
||||||
|
|
||||||
enable: function() {
|
|
||||||
this._dbusImpl.export(Gio.DBus.session, '/org/gnome/SettingsDaemon/MediaKeys');
|
|
||||||
},
|
|
||||||
|
|
||||||
disable: function() {
|
|
||||||
this._dbusImpl.unexport();
|
|
||||||
},
|
|
||||||
|
|
||||||
GrabMediaPlayerKeysAsync: function(parameters, invocation) {
|
|
||||||
let [appName, time] = parameters;
|
|
||||||
|
|
||||||
/* I'm not sure of this code, but it is in gnome-settings-daemon
|
|
||||||
(letting alone that the introspection is wrong in glib...)
|
|
||||||
*/
|
|
||||||
if (time == Gdk.CURRENT_TIME) {
|
|
||||||
let tv = new GLib.TimeVal;
|
|
||||||
GLib.get_current_time(tv);
|
|
||||||
time = tv.tv_sec * 1000 + tv.tv_usec / 1000;
|
|
||||||
}
|
|
||||||
|
|
||||||
let pos = -1;
|
|
||||||
for (let i = 0; i < this._apps.length; i++) {
|
|
||||||
if (this._apps[i].appName == appName) {
|
|
||||||
pos = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pos != -1)
|
|
||||||
this._freeMediaPlayer(pos);
|
|
||||||
|
|
||||||
let app = {
|
|
||||||
appName: appName,
|
|
||||||
name: invocation.get_sender(),
|
|
||||||
time: time,
|
|
||||||
watchId: Gio.DBus.session.watch_name(invocation.get_sender(),
|
|
||||||
Gio.BusNameWatcherFlags.NONE,
|
|
||||||
null,
|
|
||||||
Lang.bind(this, this._onNameVanished)),
|
|
||||||
};
|
|
||||||
Util.insertSorted(this._apps, app, function(a, b) {
|
|
||||||
return b.time-a.time;
|
|
||||||
});
|
|
||||||
|
|
||||||
invocation.return_value(GLib.Variant.new('()', []));
|
|
||||||
},
|
|
||||||
|
|
||||||
ReleaseMediaPlayerAsync: function(parameters, invocation) {
|
|
||||||
let name = invocation.get_sender();
|
|
||||||
let [appName] = parameters;
|
|
||||||
|
|
||||||
let pos = -1;
|
|
||||||
for (let i = 0; i < this._apps.length; i++) {
|
|
||||||
if (this._apps[i].appName == appName) {
|
|
||||||
pos = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pos == -1) {
|
|
||||||
for (let i = 0; i < this._apps.length; i++) {
|
|
||||||
if (this._apps[i].name == name) {
|
|
||||||
pos = i;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pos != -1)
|
|
||||||
this._freeMediaPlayer(pos);
|
|
||||||
|
|
||||||
invocation.return_value(GLib.Variant.new('()', []));
|
|
||||||
},
|
|
||||||
|
|
||||||
_freeMediaPlayer: function(pos) {
|
|
||||||
let app = this._apps[pos];
|
|
||||||
Gio.bus_unwatch_name(app.watchId)
|
|
||||||
|
|
||||||
this._apps.splice(pos, 1);
|
|
||||||
},
|
|
||||||
|
|
||||||
mediaKeyPressed: function(key) {
|
|
||||||
if (this._apps.length == 0) {
|
|
||||||
showOSD('action-unavailable-symbolic');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let app = this._apps[0];
|
|
||||||
Gio.DBus.session.emit_signal(app.name,
|
|
||||||
'/org/gnome/SettingsDaemon/MediaKeys',
|
|
||||||
'org.gnome.SettingsDaemon.MediaKeys',
|
|
||||||
'MediaPlayerKeyPressed',
|
|
||||||
GLib.Variant.new('(ss)', [app.appName || '',
|
|
||||||
key]));
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const MediaKeysManager = new Lang.Class({
|
|
||||||
Name: 'MediaKeysManager',
|
|
||||||
|
|
||||||
_init: function() {
|
|
||||||
this._a11yControl = Main.panel.statusArea.a11y;
|
|
||||||
this._volumeControl = Main.panel.statusArea.volume;
|
|
||||||
this._userMenu = Main.panel.statusArea.userMenu;
|
|
||||||
this._mediaPlayerKeys = new MediaKeysGrabber();
|
|
||||||
|
|
||||||
this._keybindingSettings = new Gio.Settings({ schema: KEYBINDING_SETTINGS });
|
|
||||||
},
|
|
||||||
|
|
||||||
enable: function() {
|
|
||||||
for (let i = 0; i < DEFAULT_KEYBINDINGS.length; i++) {
|
|
||||||
let [action, setting, keyval, overviewOnly, args] = DEFAULT_KEYBINDINGS[i];
|
|
||||||
let func = this[action];
|
|
||||||
if (!func) {
|
|
||||||
log('Keybinding action %s is missing'.format(action));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
let name = setting ? setting : 'media-keys-keybindings-%d'.format(i);
|
|
||||||
let ok;
|
|
||||||
func = Util.wrapKeybinding(Lang.bind.apply(null, [this, func].concat(args)), overviewOnly);
|
|
||||||
if (setting)
|
|
||||||
ok = global.display.add_keybinding(setting, this._keybindingSettings,
|
|
||||||
Meta.KeyBindingFlags.BUILTIN |
|
|
||||||
Meta.KeyBindingFlags.IS_SINGLE |
|
|
||||||
Meta.KeyBindingFlags.HANDLE_WHEN_GRABBED, func);
|
|
||||||
else
|
|
||||||
ok = global.display.add_grabbed_key(name, keyval,
|
|
||||||
Meta.KeyBindingFlags.HANDLE_WHEN_GRABBED, func);
|
|
||||||
|
|
||||||
if (!ok)
|
|
||||||
log('Installing keybinding %s failed'.format(name));
|
|
||||||
}
|
|
||||||
|
|
||||||
this._customKeybindings = [];
|
|
||||||
this._changedId = this._keybindingSettings.connect('changed::custom-keybindings',
|
|
||||||
Lang.bind(this, this._reloadCustomKeybindings));
|
|
||||||
this._reloadCustomKeybindings();
|
|
||||||
|
|
||||||
this._mediaPlayerKeys.enable();
|
|
||||||
},
|
|
||||||
|
|
||||||
disable: function() {
|
|
||||||
for (let i = 0; i < DEFAULT_KEYBINDINGS.length; i++) {
|
|
||||||
let [action, setting, keyval, overviewOnly, args] = DEFAULT_KEYBINDINGS[i];
|
|
||||||
|
|
||||||
let name = setting ? setting : 'media-keys-keybindings-%d'.format(i);
|
|
||||||
if (setting)
|
|
||||||
global.display.remove_keybinding(setting, this._keybindingSettings);
|
|
||||||
else
|
|
||||||
global.display.remove_grabbed_key(name);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._clearCustomKeybindings();
|
|
||||||
this._keybindingSettings.disconnect(this._changedId);
|
|
||||||
|
|
||||||
this._mediaPlayerKeys.disable();
|
|
||||||
},
|
|
||||||
|
|
||||||
_clearCustomKeybindings: function() {
|
|
||||||
for (let i = 0; i < this._customKeybindings.length; i++)
|
|
||||||
global.display.remove_keybinding('binding', this._customKeybindings[i]);
|
|
||||||
|
|
||||||
this._customKeybindings = [];
|
|
||||||
},
|
|
||||||
|
|
||||||
_reloadCustomKeybindings: function() {
|
|
||||||
this._clearCustomKeybindings();
|
|
||||||
|
|
||||||
let paths = this._keybindingSettings.get_strv('custom-keybindings');
|
|
||||||
for (let i = 0; i < paths.length; i++) {
|
|
||||||
let setting = new Gio.Settings({ schema: CUSTOM_KEYBINDING_SETTINGS,
|
|
||||||
path: paths[i] });
|
|
||||||
let func = Util.wrapKeybinding(Lang.bind(this, this.doCustom, setting), true);
|
|
||||||
|
|
||||||
global.display.add_keybinding('binding', setting,
|
|
||||||
Meta.KeyBindingFlags.IS_SINGLE |
|
|
||||||
Meta.KeyBindingFlags.HANDLE_WHEN_GRABBED, func);
|
|
||||||
this._customKeybindings.push(setting);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
doCustom: function(display, screen, window, binding, settings) {
|
|
||||||
let command = settings.get_string('command');
|
|
||||||
Util.spawnCommandLine(command);
|
|
||||||
},
|
|
||||||
|
|
||||||
doTouchpadToggle: function(display, screen, window, binding) {
|
|
||||||
let settings = new Gio.Settings({ schema: TOUCHPAD_SETTINGS });
|
|
||||||
let enabled = settings.get_boolean('touchpad-enabled');
|
|
||||||
|
|
||||||
this.doTouchpadSet(display, screen, window, binding, !enabled);
|
|
||||||
settings.set_boolean(!enabled);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
doTouchpadSet: function(display, screen, window, binding, enabled) {
|
|
||||||
showOSD(enabled ? 'input-touchpad-symbolic' : 'touchpad-disabled-symbolic');
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
doMute: function(display, screen, window, binding, quiet) {
|
|
||||||
let [icon, value] = this._volumeControl.volumeMenu.toggleMute(quiet);
|
|
||||||
showOSD(icon, value);
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
doVolumeAdjust: function(display, screen, window, binding, direction, quiet) {
|
|
||||||
let [icon, value] = this._volumeControl.volumeMenu.scroll(direction, quiet);
|
|
||||||
showOSD(icon, value);
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
doLogout: function(display, screen, window, binding) {
|
|
||||||
this._userMenu.logOut();
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
doEject: function(display, screen, window, binding) {
|
|
||||||
let volumeMonitor = Gio.VolumeMonitor.get();
|
|
||||||
|
|
||||||
let drives = volumeMonitor.get_connected_drives();
|
|
||||||
let score = 0, drive;
|
|
||||||
for (let i = 0; i < drives.length; i++) {
|
|
||||||
if (!drives[i].can_eject())
|
|
||||||
continue;
|
|
||||||
if (!drives[i].is_media_removable())
|
|
||||||
continue;
|
|
||||||
if (score < 1) {
|
|
||||||
drive = drives[i];
|
|
||||||
score = 1;
|
|
||||||
}
|
|
||||||
if (!drives[i].has_media())
|
|
||||||
continue;
|
|
||||||
if (score < 2) {
|
|
||||||
drive = drives[i];
|
|
||||||
score = 2;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
showOSD('media-eject-custom-symbolic');
|
|
||||||
|
|
||||||
if (!drive)
|
|
||||||
return true;
|
|
||||||
|
|
||||||
let mountOp = new ShellMountOperation.ShellMountOperation(drive);
|
|
||||||
drive.eject_with_operation(Gio.MountUnmountFlags.FORCE,
|
|
||||||
mountOp.mountOp, null, null);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
doHome: function() {
|
|
||||||
let homeFile = Gio.file_new_for_path (GLib.get_home_dir());
|
|
||||||
let homeUri = homeFile.get_uri();
|
|
||||||
Gio.app_info_launch_default_for_uri(homeUri, null);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
doLaunchMimeHandler: function(display, screen, window, binding, mimeType) {
|
|
||||||
let gioApp = Gio.AppInfo.get_default_for_type(mimeType, false);
|
|
||||||
if (gioApp != null) {
|
|
||||||
let app = Shell.AppSystem.get_default().lookup_app(gioApp.get_id());
|
|
||||||
app.open_new_window(-1);
|
|
||||||
} else {
|
|
||||||
log('Could not find default application for \'%s\' mime-type'.format(mimeType));
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
doLaunchApp: function(display, screen, window, binding, appId) {
|
|
||||||
let app = Shell.AppSystem.get_default().lookup_app(appId);
|
|
||||||
app.open_new_window(-1);
|
|
||||||
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
doScreensaver: function() {
|
|
||||||
// FIXME: handled in house, to the screenshield!
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
doSpawn: function(display, screen, window, binding, argv) {
|
|
||||||
Util.spawn(argv);
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
doMediaKey: function(display, screen, window, binding, key) {
|
|
||||||
this._mediaPlayerKeys.mediaKeyPressed(key);
|
|
||||||
},
|
|
||||||
|
|
||||||
_onXRandRFinished: function(connection, result) {
|
|
||||||
connection.call_finish(result);
|
|
||||||
this._XRandRCancellable = null;
|
|
||||||
},
|
|
||||||
|
|
||||||
doXRandRAction: function(display, screen, window, binding, action) {
|
|
||||||
if (this._XRandRCancellable)
|
|
||||||
this._XRandRCancellable.cancel();
|
|
||||||
|
|
||||||
this._XRandRCancellable = new Gio.Cancellable();
|
|
||||||
Gio.DBus.session.call('org.gnome.SettingsDaemon',
|
|
||||||
'/org/gnome/SettingsDaemon/XRANDR',
|
|
||||||
'org.gnome.SettingsDaemon.XRANDR_2',
|
|
||||||
action,
|
|
||||||
GLib.Variant.new('(x)', [global.get_current_time()]),
|
|
||||||
null, /* reply type */
|
|
||||||
Gio.DBusCallFlags.NONE,
|
|
||||||
-1,
|
|
||||||
this._XRandRCancellable,
|
|
||||||
Lang.bind(this, this._onXRandRFinished));
|
|
||||||
},
|
|
||||||
|
|
||||||
doA11yAction: function(display, screen, window, binding, key) {
|
|
||||||
let settings = new Gio.Settings({ schema: A11Y_SETTINGS });
|
|
||||||
let enabled = settings.get_boolean(key);
|
|
||||||
settings.set_boolean(key, !enabled);
|
|
||||||
},
|
|
||||||
|
|
||||||
doTextSize: function(display, screen, window, binding, multiplier) {
|
|
||||||
// Same values used in the Seeing tab of the Universal Access panel
|
|
||||||
const FACTORS = [ 0.75, 1.0, 1.25, 1.5 ];
|
|
||||||
|
|
||||||
// Figure out the current DPI scaling factor
|
|
||||||
let settings = new Gio.Settings({ schema: INTERFACE_SETTINGS });
|
|
||||||
let factor = settings.get_double('text-scaling-factor');
|
|
||||||
factor += multiplier * 0.25;
|
|
||||||
|
|
||||||
/* Try to find a matching value */
|
|
||||||
let distance = 1e6;
|
|
||||||
let best = 1.0;
|
|
||||||
for (let i = 0; i < FACTORS.length; i++) {
|
|
||||||
let d = Math.abs(factor - FACTORS[i]);
|
|
||||||
if (d < distance) {
|
|
||||||
best = factors[i];
|
|
||||||
distance = d;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (best == 1.0)
|
|
||||||
settings.reset('text-scaling-factor');
|
|
||||||
else
|
|
||||||
settings.set_double('text-scaling-factor', best);
|
|
||||||
},
|
|
||||||
|
|
||||||
doToggleContrast: function(display, screen, window, binding) {
|
|
||||||
this._a11yControl.toggleHighContrast();
|
|
||||||
},
|
|
||||||
|
|
||||||
doMagnifierZoom: function(display, screen, window, binding, offset) {
|
|
||||||
let settings = new Gio.Settings({ schema: MAGNIFIER_SETTINGS });
|
|
||||||
|
|
||||||
let value = settings.get_value('mag-factor');
|
|
||||||
value = Math.round(value + offset);
|
|
||||||
settings.set_value('mag-factor', value);
|
|
||||||
},
|
|
||||||
|
|
||||||
doPowerAction: function(display, screen, window, binding, action) {
|
|
||||||
let settings = new Gio.Settings({ schema: POWER_SETTINGS });
|
|
||||||
switch (settings.get_string(action)) {
|
|
||||||
case 'suspend':
|
|
||||||
this._userMenu.suspend();
|
|
||||||
break;
|
|
||||||
case 'interactive':
|
|
||||||
case 'shutdown':
|
|
||||||
this._userMenu.shutdown();
|
|
||||||
break;
|
|
||||||
case 'hibernate':
|
|
||||||
this._userMenu.hibernate();
|
|
||||||
break;
|
|
||||||
case 'blank':
|
|
||||||
case 'default':
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_onBrightnessFinished: function(connection, result, kind) {
|
|
||||||
let [percentage] = connection.call_finish(result).deep_unpack();
|
|
||||||
|
|
||||||
let icon = kind == 'Keyboard' ? 'keyboard-brightness-symbolic' : 'display-brightness-symbolic';
|
|
||||||
showOSD(icon, percentage / 100);
|
|
||||||
},
|
|
||||||
|
|
||||||
doBrightness: function(display, screen, window, binding, kind, action) {
|
|
||||||
let iface = 'org.gnome.SettingsDaemon.Power.' + kind;
|
|
||||||
let objectPath = '/org/gnome/SettingsDaemon/Power';
|
|
||||||
|
|
||||||
Gio.DBus.session.call('org.gnome.SettingsDaemon',
|
|
||||||
objectPath, iface, action,
|
|
||||||
null, null, /* parameters, reply type */
|
|
||||||
Gio.DBusCallFlags.NONE, -1, null,
|
|
||||||
Lang.bind(this, this._onBrightnessFinished, kind));
|
|
||||||
},
|
|
||||||
|
|
||||||
doInputSource: function(display, screen, window, binding, offset) {
|
|
||||||
let settings = new Gio.Settings({ schema: INPUT_SOURCE_SETTINGS });
|
|
||||||
|
|
||||||
let current = settings.get_uint('current');
|
|
||||||
let max = settings.get_strv('sources').length - 1;
|
|
||||||
|
|
||||||
current += offset;
|
|
||||||
if (current < 0)
|
|
||||||
current = 0;
|
|
||||||
else if (current > max)
|
|
||||||
current = max;
|
|
||||||
|
|
||||||
settings.set_uint('current', current);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const Component = MediaKeysManager;
|
|
@@ -598,7 +598,7 @@ const NetworkAgent = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
enable: function() {
|
enable: function() {
|
||||||
this._native.register();
|
this._native.auto_register = true;
|
||||||
},
|
},
|
||||||
|
|
||||||
disable: function() {
|
disable: function() {
|
||||||
@@ -612,6 +612,7 @@ const NetworkAgent = new Lang.Class({
|
|||||||
this._vpnRequests[requestId].cancel(true);
|
this._vpnRequests[requestId].cancel(true);
|
||||||
this._vpnRequests = { };
|
this._vpnRequests = { };
|
||||||
|
|
||||||
|
this._native.auto_register = false;
|
||||||
this._native.unregister();
|
this._native.unregister();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@@ -49,7 +49,7 @@ const AuthenticationDialog = new Lang.Class({
|
|||||||
let messageBox = new St.BoxLayout({ style_class: 'prompt-dialog-message-layout',
|
let messageBox = new St.BoxLayout({ style_class: 'prompt-dialog-message-layout',
|
||||||
vertical: true });
|
vertical: true });
|
||||||
mainContentBox.add(messageBox,
|
mainContentBox.add(messageBox,
|
||||||
{ y_align: St.Align.START });
|
{ expand: true, y_align: St.Align.START });
|
||||||
|
|
||||||
this._subjectLabel = new St.Label({ style_class: 'prompt-dialog-headline',
|
this._subjectLabel = new St.Label({ style_class: 'prompt-dialog-headline',
|
||||||
text: _("Authentication Required") });
|
text: _("Authentication Required") });
|
||||||
|
@@ -1,5 +1,6 @@
|
|||||||
|
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
const Gio = imports.gi.Gio;
|
const Gio = imports.gi.Gio;
|
||||||
const Meta = imports.gi.Meta;
|
const Meta = imports.gi.Meta;
|
||||||
@@ -16,13 +17,16 @@ const Recorder = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
enable: function() {
|
enable: function() {
|
||||||
global.display.add_keybinding('toggle-recording',
|
Main.wm.addKeybinding('toggle-recording',
|
||||||
this._bindingSettings,
|
this._bindingSettings,
|
||||||
Meta.KeyBindingFlags.NONE, Lang.bind(this, this._toggleRecorder));
|
Meta.KeyBindingFlags.NONE,
|
||||||
|
Main.KeybindingMode.NORMAL |
|
||||||
|
Main.KeybindingMode.OVERVIEW,
|
||||||
|
Lang.bind(this, this._toggleRecorder));
|
||||||
},
|
},
|
||||||
|
|
||||||
disable: function() {
|
disable: function() {
|
||||||
global.display.remove_keybinding('toggle-recording');
|
Main.wm.removeKeybinding('toggle-recording');
|
||||||
},
|
},
|
||||||
|
|
||||||
_ensureRecorder: function() {
|
_ensureRecorder: function() {
|
||||||
@@ -52,8 +56,6 @@ const Recorder = new Lang.Class({
|
|||||||
Meta.disable_unredirect_for_screen(global.screen);
|
Meta.disable_unredirect_for_screen(global.screen);
|
||||||
recorder.record();
|
recorder.record();
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@@ -383,25 +383,12 @@ const TelepathyClient = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Display notification to ask user to accept/reject request */
|
/* Display notification to ask user to accept/reject request */
|
||||||
let source = this._ensureSubscriptionSource();
|
let source = this._ensureAppSource();
|
||||||
|
|
||||||
let notif = new SubscriptionRequestNotification(source, contact);
|
let notif = new SubscriptionRequestNotification(source, contact);
|
||||||
source.notify(notif);
|
source.notify(notif);
|
||||||
},
|
},
|
||||||
|
|
||||||
_ensureSubscriptionSource: function() {
|
|
||||||
if (this._subscriptionSource == null) {
|
|
||||||
this._subscriptionSource = new MessageTray.Source(_("Subscription request"),
|
|
||||||
'gtk-dialog-question');
|
|
||||||
Main.messageTray.add(this._subscriptionSource);
|
|
||||||
this._subscriptionSource.connect('destroy', Lang.bind(this, function () {
|
|
||||||
this._subscriptionSource = null;
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
return this._subscriptionSource;
|
|
||||||
},
|
|
||||||
|
|
||||||
_accountConnectionStatusNotifyCb: function(account) {
|
_accountConnectionStatusNotifyCb: function(account) {
|
||||||
let connectionError = account.connection_error;
|
let connectionError = account.connection_error;
|
||||||
|
|
||||||
@@ -415,7 +402,7 @@ const TelepathyClient = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
/* Display notification that account failed to connect */
|
/* Display notification that account failed to connect */
|
||||||
let source = this._ensureAccountSource();
|
let source = this._ensureAppSource();
|
||||||
|
|
||||||
notif = new AccountNotification(source, account, connectionError);
|
notif = new AccountNotification(source, account, connectionError);
|
||||||
this._accountNotifications[account.get_object_path()] = notif;
|
this._accountNotifications[account.get_object_path()] = notif;
|
||||||
@@ -425,17 +412,16 @@ const TelepathyClient = new Lang.Class({
|
|||||||
source.notify(notif);
|
source.notify(notif);
|
||||||
},
|
},
|
||||||
|
|
||||||
_ensureAccountSource: function() {
|
_ensureAppSource: function() {
|
||||||
if (this._accountSource == null) {
|
if (this._appSource == null) {
|
||||||
this._accountSource = new MessageTray.Source(_("Connection error"),
|
this._appSource = new MessageTray.Source(_("Chat"), 'empathy');
|
||||||
'gtk-dialog-error');
|
Main.messageTray.add(this._appSource);
|
||||||
Main.messageTray.add(this._accountSource);
|
this._appSource.connect('destroy', Lang.bind(this, function () {
|
||||||
this._accountSource.connect('destroy', Lang.bind(this, function () {
|
this._appSource = null;
|
||||||
this._accountSource = null;
|
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
return this._accountSource;
|
return this._appSource;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -744,8 +730,7 @@ const ChatSource = new Lang.Class({
|
|||||||
_ackMessages: function() {
|
_ackMessages: function() {
|
||||||
// Don't clear our messages here, tp-glib will send a
|
// Don't clear our messages here, tp-glib will send a
|
||||||
// 'pending-message-removed' for each one.
|
// 'pending-message-removed' for each one.
|
||||||
this._channel.ack_all_pending_messages_async(Lang.bind(this, function(src, result) {
|
this._channel.ack_all_pending_messages_async(null);
|
||||||
this._channel.ack_all_pending_messages_finish(result);}));
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1353,26 +1338,16 @@ const AccountNotification = new Lang.Class({
|
|||||||
this.parent(source,
|
this.parent(source,
|
||||||
/* translators: argument is the account name, like
|
/* translators: argument is the account name, like
|
||||||
* name@jabber.org for example. */
|
* name@jabber.org for example. */
|
||||||
_("Connection to %s failed").format(account.get_display_name()),
|
_("Unable to connect to %s").format(account.get_display_name()),
|
||||||
null, { customContent: true });
|
this._getMessage(connectionError));
|
||||||
|
|
||||||
this._label = new St.Label();
|
|
||||||
this.addActor(this._label);
|
|
||||||
this._updateMessage(connectionError);
|
|
||||||
|
|
||||||
this._account = account;
|
this._account = account;
|
||||||
|
|
||||||
this.addButton('reconnect', _("Reconnect"));
|
this.addButton('view', _("View account"));
|
||||||
this.addButton('edit', _("Edit account"));
|
|
||||||
|
|
||||||
this.connect('action-invoked', Lang.bind(this, function(self, action) {
|
this.connect('action-invoked', Lang.bind(this, function(self, action) {
|
||||||
switch (action) {
|
switch (action) {
|
||||||
case 'reconnect':
|
case 'view':
|
||||||
// If it fails again, a new notification should pop up with the
|
|
||||||
// new error.
|
|
||||||
account.reconnect_async(null);
|
|
||||||
break;
|
|
||||||
case 'edit':
|
|
||||||
let cmd = '/usr/bin/empathy-accounts'
|
let cmd = '/usr/bin/empathy-accounts'
|
||||||
+ ' --select-account=%s'
|
+ ' --select-account=%s'
|
||||||
.format(account.get_path_suffix());
|
.format(account.get_path_suffix());
|
||||||
@@ -1398,19 +1373,19 @@ const AccountNotification = new Lang.Class({
|
|||||||
if (status == Tp.ConnectionStatus.CONNECTED) {
|
if (status == Tp.ConnectionStatus.CONNECTED) {
|
||||||
this.destroy();
|
this.destroy();
|
||||||
} else if (status == Tp.ConnectionStatus.DISCONNECTED) {
|
} else if (status == Tp.ConnectionStatus.DISCONNECTED) {
|
||||||
this._updateMessage(account.connection_error);
|
this.update(this.title, this._getMessage(account.connection_error));
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateMessage: function(connectionError) {
|
_getMessage: function(connectionError) {
|
||||||
let message;
|
let message;
|
||||||
if (connectionError in _connectionErrorMessages) {
|
if (connectionError in _connectionErrorMessages) {
|
||||||
message = _connectionErrorMessages[connectionError];
|
message = _connectionErrorMessages[connectionError];
|
||||||
} else {
|
} else {
|
||||||
message = _("Unknown reason");
|
message = _("Unknown reason");
|
||||||
}
|
}
|
||||||
this._label.set_text(message);
|
return message;
|
||||||
},
|
},
|
||||||
|
|
||||||
destroy: function() {
|
destroy: function() {
|
||||||
|
@@ -637,8 +637,10 @@ const Dash = new Lang.Class({
|
|||||||
icon.setIconSize(this.iconSize);
|
icon.setIconSize(this.iconSize);
|
||||||
|
|
||||||
// Don't animate the icon size change when the overview
|
// Don't animate the icon size change when the overview
|
||||||
// is not visible or when initially filling the dash
|
// is transitioning, not visible or when initially filling
|
||||||
if (!Main.overview.visible || !this._shownInitially)
|
// the dash
|
||||||
|
if (!Main.overview.visible || Main.overview.animationInProgress ||
|
||||||
|
!this._shownInitially)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
let [targetWidth, targetHeight] = icon.icon.get_size();
|
let [targetWidth, targetHeight] = icon.icon.get_size();
|
||||||
@@ -762,8 +764,9 @@ const Dash = new Lang.Class({
|
|||||||
for (let i = 0; i < removedActors.length; i++) {
|
for (let i = 0; i < removedActors.length; i++) {
|
||||||
let item = removedActors[i]._delegate;
|
let item = removedActors[i]._delegate;
|
||||||
|
|
||||||
// Don't animate item removal when the overview is hidden
|
// Don't animate item removal when the overview is transitioning
|
||||||
if (Main.overview.visible)
|
// or hidden
|
||||||
|
if (Main.overview.visible && !Main.overview.animationInProgress)
|
||||||
item.animateOutAndDestroy();
|
item.animateOutAndDestroy();
|
||||||
else
|
else
|
||||||
item.destroy();
|
item.destroy();
|
||||||
@@ -778,8 +781,9 @@ const Dash = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Don't animate item addition when the overview is hidden
|
// Don't animate item addition when the overview is transitioning
|
||||||
if (!Main.overview.visible)
|
// or hidden
|
||||||
|
if (!Main.overview.visible || Main.overview.animationInProgress)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
for (let i = 0; i < addedItems.length; i++)
|
for (let i = 0; i < addedItems.length; i++)
|
||||||
|
@@ -126,11 +126,7 @@ function logExtensionError(uuid, error) {
|
|||||||
|
|
||||||
let message = '' + error;
|
let message = '' + error;
|
||||||
|
|
||||||
if (error.state)
|
|
||||||
extension.state = error.state;
|
|
||||||
else
|
|
||||||
extension.state = ExtensionState.ERROR;
|
extension.state = ExtensionState.ERROR;
|
||||||
|
|
||||||
if (!extension.errors)
|
if (!extension.errors)
|
||||||
extension.errors = [];
|
extension.errors = [];
|
||||||
|
|
||||||
@@ -145,11 +141,8 @@ function loadExtension(extension) {
|
|||||||
extension.state = ExtensionState.ERROR;
|
extension.state = ExtensionState.ERROR;
|
||||||
|
|
||||||
if (ExtensionUtils.isOutOfDate(extension)) {
|
if (ExtensionUtils.isOutOfDate(extension)) {
|
||||||
let error = new Error('extension is not compatible with current GNOME Shell and/or GJS version');
|
extension.state = ExtensionState.OUT_OF_DATE;
|
||||||
error.state = ExtensionState.OUT_OF_DATE;
|
} else {
|
||||||
throw error;
|
|
||||||
}
|
|
||||||
|
|
||||||
let enabled = enabledExtensions.indexOf(extension.uuid) != -1;
|
let enabled = enabledExtensions.indexOf(extension.uuid) != -1;
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
initExtension(extension.uuid);
|
initExtension(extension.uuid);
|
||||||
@@ -158,6 +151,7 @@ function loadExtension(extension) {
|
|||||||
} else {
|
} else {
|
||||||
extension.state = ExtensionState.INITIALIZED;
|
extension.state = ExtensionState.INITIALIZED;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_signals.emit('extension-state-changed', extension);
|
_signals.emit('extension-state-changed', extension);
|
||||||
}
|
}
|
||||||
|
@@ -23,6 +23,7 @@ function _navigateActor(actor) {
|
|||||||
|
|
||||||
// GrabHelper:
|
// GrabHelper:
|
||||||
// @owner: the actor that owns the GrabHelper
|
// @owner: the actor that owns the GrabHelper
|
||||||
|
// @params: optional parameters to pass to Main.pushModal()
|
||||||
//
|
//
|
||||||
// Creates a new GrabHelper object, for dealing with keyboard and pointer grabs
|
// Creates a new GrabHelper object, for dealing with keyboard and pointer grabs
|
||||||
// associated with a set of actors.
|
// associated with a set of actors.
|
||||||
@@ -34,8 +35,9 @@ function _navigateActor(actor) {
|
|||||||
const GrabHelper = new Lang.Class({
|
const GrabHelper = new Lang.Class({
|
||||||
Name: 'GrabHelper',
|
Name: 'GrabHelper',
|
||||||
|
|
||||||
_init: function(owner) {
|
_init: function(owner, params) {
|
||||||
this._owner = owner;
|
this._owner = owner;
|
||||||
|
this._modalParams = params;
|
||||||
|
|
||||||
this._grabStack = [];
|
this._grabStack = [];
|
||||||
|
|
||||||
@@ -165,7 +167,7 @@ const GrabHelper = new Lang.Class({
|
|||||||
_takeModalGrab: function() {
|
_takeModalGrab: function() {
|
||||||
let firstGrab = (this._modalCount == 0);
|
let firstGrab = (this._modalCount == 0);
|
||||||
if (firstGrab) {
|
if (firstGrab) {
|
||||||
if (!Main.pushModal(this._owner))
|
if (!Main.pushModal(this._owner, this._modalParams))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
|
this._capturedEventId = global.stage.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
|
||||||
|
@@ -251,7 +251,7 @@ const Keyboard = new Lang.Class({
|
|||||||
this._focusNotifyId = global.stage.connect('notify::key-focus', Lang.bind(this, this._onKeyFocusChanged));
|
this._focusNotifyId = global.stage.connect('notify::key-focus', Lang.bind(this, this._onKeyFocusChanged));
|
||||||
|
|
||||||
if (show)
|
if (show)
|
||||||
this.show();
|
this.show(Main.layoutManager.focusIndex);
|
||||||
else
|
else
|
||||||
this._createSource();
|
this._createSource();
|
||||||
},
|
},
|
||||||
@@ -375,7 +375,7 @@ const Keyboard = new Lang.Class({
|
|||||||
if (!this._enableKeyboard)
|
if (!this._enableKeyboard)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let monitor = Main.layoutManager.bottomMonitor;
|
let monitor = Main.layoutManager.keyboardMonitor;
|
||||||
let maxHeight = monitor.height / 3;
|
let maxHeight = monitor.height / 3;
|
||||||
this.actor.width = monitor.width;
|
this.actor.width = monitor.width;
|
||||||
|
|
||||||
@@ -462,9 +462,9 @@ const Keyboard = new Lang.Class({
|
|||||||
actor._extended_keys || actor.extended_key;
|
actor._extended_keys || actor.extended_key;
|
||||||
},
|
},
|
||||||
|
|
||||||
show: function () {
|
show: function (monitor) {
|
||||||
|
Main.layoutManager.keyboardIndex = monitor;
|
||||||
this._redraw();
|
this._redraw();
|
||||||
|
|
||||||
Main.layoutManager.showKeyboard();
|
Main.layoutManager.showKeyboard();
|
||||||
this._destroySource();
|
this._destroySource();
|
||||||
},
|
},
|
||||||
@@ -512,7 +512,7 @@ const Keyboard = new Lang.Class({
|
|||||||
|
|
||||||
if (timestamp != Clutter.CURRENT_TIME)
|
if (timestamp != Clutter.CURRENT_TIME)
|
||||||
this._timestamp = timestamp;
|
this._timestamp = timestamp;
|
||||||
this.show();
|
this.show(Main.layoutManager.focusIndex);
|
||||||
},
|
},
|
||||||
|
|
||||||
Hide: function(timestamp) {
|
Hide: function(timestamp) {
|
||||||
@@ -566,6 +566,7 @@ const KeyboardSource = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
open: function() {
|
open: function() {
|
||||||
this._keyboard.show();
|
// Show the OSK below the message tray
|
||||||
|
this._keyboard.show(Main.layoutManager.bottomIndex);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -103,6 +103,7 @@ const LayoutManager = new Lang.Class({
|
|||||||
this.monitors = [];
|
this.monitors = [];
|
||||||
this.primaryMonitor = null;
|
this.primaryMonitor = null;
|
||||||
this.primaryIndex = -1;
|
this.primaryIndex = -1;
|
||||||
|
this._keyboardIndex = -1;
|
||||||
this._hotCorners = [];
|
this._hotCorners = [];
|
||||||
this._background = null;
|
this._background = null;
|
||||||
this._leftPanelBarrier = 0;
|
this._leftPanelBarrier = 0;
|
||||||
@@ -240,9 +241,8 @@ const LayoutManager = new Lang.Class({
|
|||||||
this.panelBox.set_position(this.primaryMonitor.x, this.primaryMonitor.y);
|
this.panelBox.set_position(this.primaryMonitor.x, this.primaryMonitor.y);
|
||||||
this.panelBox.set_size(this.primaryMonitor.width, -1);
|
this.panelBox.set_size(this.primaryMonitor.width, -1);
|
||||||
|
|
||||||
this.keyboardBox.set_position(this.bottomMonitor.x,
|
if (this.keyboardIndex < 0)
|
||||||
this.bottomMonitor.y + this.bottomMonitor.height);
|
this.keyboardIndex = this.primaryIndex;
|
||||||
this.keyboardBox.set_size(this.bottomMonitor.width, -1);
|
|
||||||
|
|
||||||
this.trayBox.set_position(this.bottomMonitor.x,
|
this.trayBox.set_position(this.bottomMonitor.x,
|
||||||
this.bottomMonitor.y + this.bottomMonitor.height);
|
this.bottomMonitor.y + this.bottomMonitor.height);
|
||||||
@@ -305,6 +305,42 @@ const LayoutManager = new Lang.Class({
|
|||||||
return this.monitors[index];
|
return this.monitors[index];
|
||||||
},
|
},
|
||||||
|
|
||||||
|
get keyboardMonitor() {
|
||||||
|
return this.monitors[this.keyboardIndex];
|
||||||
|
},
|
||||||
|
|
||||||
|
get focusIndex() {
|
||||||
|
let i = Main.layoutManager.primaryIndex;
|
||||||
|
|
||||||
|
if (global.stage_input_mode == Shell.StageInputMode.FOCUSED ||
|
||||||
|
global.stage_input_mode == Shell.StageInputMode.FULLSCREEN) {
|
||||||
|
let focusActor = global.stage.key_focus;
|
||||||
|
if (focusActor)
|
||||||
|
i = this._chrome.findIndexForActor(focusActor);
|
||||||
|
} else {
|
||||||
|
let focusWindow = global.display.focus_window;
|
||||||
|
if (focusWindow)
|
||||||
|
i = this._chrome.findIndexForWindow(focusWindow.get_compositor_private());
|
||||||
|
}
|
||||||
|
|
||||||
|
return i;
|
||||||
|
},
|
||||||
|
|
||||||
|
get focusMonitor() {
|
||||||
|
return this.monitors[this.focusIndex];
|
||||||
|
},
|
||||||
|
|
||||||
|
set keyboardIndex(v) {
|
||||||
|
this._keyboardIndex = v;
|
||||||
|
this.keyboardBox.set_position(this.keyboardMonitor.x,
|
||||||
|
this.keyboardMonitor.y + this.keyboardMonitor.height);
|
||||||
|
this.keyboardBox.set_size(this.keyboardMonitor.width, -1);
|
||||||
|
},
|
||||||
|
|
||||||
|
get keyboardIndex() {
|
||||||
|
return this._keyboardIndex;
|
||||||
|
},
|
||||||
|
|
||||||
_startupAnimation: function() {
|
_startupAnimation: function() {
|
||||||
this.panelBox.anchor_y = this.panelBox.height;
|
this.panelBox.anchor_y = this.panelBox.height;
|
||||||
|
|
||||||
@@ -363,11 +399,14 @@ const LayoutManager = new Lang.Class({
|
|||||||
onComplete: this._showKeyboardComplete,
|
onComplete: this._showKeyboardComplete,
|
||||||
onCompleteScope: this
|
onCompleteScope: this
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (this.keyboardIndex == this.bottomIndex) {
|
||||||
Tweener.addTween(this.trayBox,
|
Tweener.addTween(this.trayBox,
|
||||||
{ anchor_y: this.keyboardBox.height,
|
{ anchor_y: this.keyboardBox.height,
|
||||||
time: KEYBOARD_ANIMATION_TIME,
|
time: KEYBOARD_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad'
|
transition: 'easeOutQuad'
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
this.emit('keyboard-visible-changed', true);
|
this.emit('keyboard-visible-changed', true);
|
||||||
},
|
},
|
||||||
@@ -379,6 +418,7 @@ const LayoutManager = new Lang.Class({
|
|||||||
|
|
||||||
this._keyboardHeightNotifyId = this.keyboardBox.connect('notify::height', Lang.bind(this, function () {
|
this._keyboardHeightNotifyId = this.keyboardBox.connect('notify::height', Lang.bind(this, function () {
|
||||||
this.keyboardBox.anchor_y = this.keyboardBox.height;
|
this.keyboardBox.anchor_y = this.keyboardBox.height;
|
||||||
|
if (this.keyboardIndex == this.bottomIndex)
|
||||||
this.trayBox.anchor_y = this.keyboardBox.height;
|
this.trayBox.anchor_y = this.keyboardBox.height;
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
@@ -395,11 +435,14 @@ const LayoutManager = new Lang.Class({
|
|||||||
onComplete: this._hideKeyboardComplete,
|
onComplete: this._hideKeyboardComplete,
|
||||||
onCompleteScope: this
|
onCompleteScope: this
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (this.keyboardIndex == this.bottomIndex) {
|
||||||
Tweener.addTween(this.trayBox,
|
Tweener.addTween(this.trayBox,
|
||||||
{ anchor_y: 0,
|
{ anchor_y: 0,
|
||||||
time: immediate ? 0 : KEYBOARD_ANIMATION_TIME,
|
time: immediate ? 0 : KEYBOARD_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad'
|
transition: 'easeOutQuad'
|
||||||
});
|
});
|
||||||
|
}
|
||||||
|
|
||||||
this.emit('keyboard-visible-changed', false);
|
this.emit('keyboard-visible-changed', false);
|
||||||
},
|
},
|
||||||
@@ -463,7 +506,7 @@ const LayoutManager = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
findMonitorForActor: function(actor) {
|
findMonitorForActor: function(actor) {
|
||||||
return this._chrome.findMonitorForActor(actor);
|
return this.monitors[this._chrome.findIndexForActor(actor)];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Signals.addSignalMethods(LayoutManager.prototype);
|
Signals.addSignalMethods(LayoutManager.prototype);
|
||||||
@@ -812,6 +855,7 @@ const Chrome = new Lang.Class({
|
|||||||
|
|
||||||
_relayout: function() {
|
_relayout: function() {
|
||||||
this._monitors = this._layoutManager.monitors;
|
this._monitors = this._layoutManager.monitors;
|
||||||
|
this._primaryIndex = this._layoutManager.primaryIndex;
|
||||||
this._primaryMonitor = this._layoutManager.primaryMonitor;
|
this._primaryMonitor = this._layoutManager.primaryMonitor;
|
||||||
|
|
||||||
this._updateFullscreen();
|
this._updateFullscreen();
|
||||||
@@ -827,32 +871,47 @@ const Chrome = new Lang.Class({
|
|||||||
let monitor = this._monitors[i];
|
let monitor = this._monitors[i];
|
||||||
if (cx >= monitor.x && cx < monitor.x + monitor.width &&
|
if (cx >= monitor.x && cx < monitor.x + monitor.width &&
|
||||||
cy >= monitor.y && cy < monitor.y + monitor.height)
|
cy >= monitor.y && cy < monitor.y + monitor.height)
|
||||||
return monitor;
|
return i;
|
||||||
}
|
}
|
||||||
// If the center is not on a monitor, return the first overlapping monitor
|
// If the center is not on a monitor, return the first overlapping monitor
|
||||||
for (let i = 0; i < this._monitors.length; i++) {
|
for (let i = 0; i < this._monitors.length; i++) {
|
||||||
let monitor = this._monitors[i];
|
let monitor = this._monitors[i];
|
||||||
if (x + w > monitor.x && x < monitor.x + monitor.width &&
|
if (x + w > monitor.x && x < monitor.x + monitor.width &&
|
||||||
y + h > monitor.y && y < monitor.y + monitor.height)
|
y + h > monitor.y && y < monitor.y + monitor.height)
|
||||||
return monitor;
|
return i;
|
||||||
}
|
}
|
||||||
// otherwise on no monitor
|
// otherwise on no monitor
|
||||||
return null;
|
return -1;
|
||||||
},
|
},
|
||||||
|
|
||||||
_findMonitorForWindow: function(window) {
|
findIndexForWindow: function(window) {
|
||||||
return this._findMonitorForRect(window.x, window.y, window.width, window.height);
|
let i = this._findMonitorForRect(window.x, window.y, window.width, window.height);
|
||||||
|
if (i >= 0)
|
||||||
|
return i;
|
||||||
|
return this._primaryIndex; // Not on any monitor, pretend its on the primary
|
||||||
},
|
},
|
||||||
|
|
||||||
// This call guarantees that we return some monitor to simplify usage of it
|
// This call guarantees that we return some monitor to simplify usage of it
|
||||||
// In practice all tracked actors should be visible on some monitor anyway
|
// In practice all tracked actors should be visible on some monitor anyway
|
||||||
findMonitorForActor: function(actor) {
|
findIndexForActor: function(actor) {
|
||||||
let [x, y] = actor.get_transformed_position();
|
let [x, y] = actor.get_transformed_position();
|
||||||
let [w, h] = actor.get_transformed_size();
|
let [w, h] = actor.get_transformed_size();
|
||||||
let monitor = this._findMonitorForRect(x, y, w, h);
|
let i = this._findMonitorForRect(x, y, w, h);
|
||||||
if (monitor)
|
if (i >= 0)
|
||||||
return monitor;
|
return i;
|
||||||
return this._primaryMonitor; // Not on any monitor, pretend its on the primary
|
return this._primaryIndex; // Not on any monitor, pretend its on the primary
|
||||||
|
},
|
||||||
|
|
||||||
|
findMonitorForWindow: function(window) {
|
||||||
|
let i = this._findMonitorForRect(window.x, window.y, window.width, window.height);
|
||||||
|
if (i >= 0)
|
||||||
|
return this._monitors[i];
|
||||||
|
else
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
|
findMonitorForActor: function(actor) {
|
||||||
|
return this._monitors[this.findIndexForActor(actor)];
|
||||||
},
|
},
|
||||||
|
|
||||||
_queueUpdateRegions: function() {
|
_queueUpdateRegions: function() {
|
||||||
@@ -900,7 +959,7 @@ const Chrome = new Lang.Class({
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (layer == Meta.StackLayer.FULLSCREEN) {
|
if (layer == Meta.StackLayer.FULLSCREEN) {
|
||||||
let monitor = this._findMonitorForWindow(window);
|
let monitor = this.findMonitorForWindow(window);
|
||||||
if (monitor)
|
if (monitor)
|
||||||
monitor.inFullscreen = true;
|
monitor.inFullscreen = true;
|
||||||
}
|
}
|
||||||
@@ -917,7 +976,7 @@ const Chrome = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Or whether it is monitor sized
|
// Or whether it is monitor sized
|
||||||
let monitor = this._findMonitorForWindow(window);
|
let monitor = this.findMonitorForWindow(window);
|
||||||
if (monitor &&
|
if (monitor &&
|
||||||
window.x <= monitor.x &&
|
window.x <= monitor.x &&
|
||||||
window.x + window.width >= monitor.x + monitor.width &&
|
window.x + window.width >= monitor.x + monitor.width &&
|
||||||
|
@@ -1129,7 +1129,7 @@ const LookingGlass = new Lang.Class({
|
|||||||
if (this._open)
|
if (this._open)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (!Main.pushModal(this._entry))
|
if (!Main.pushModal(this._entry, { keybindingMode: Main.KeybindingMode.LOOKING_GLASS }))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._notebook.selectIndex(0);
|
this._notebook.selectIndex(0);
|
||||||
|
@@ -20,6 +20,7 @@ const Keyboard = imports.ui.keyboard;
|
|||||||
const MessageTray = imports.ui.messageTray;
|
const MessageTray = imports.ui.messageTray;
|
||||||
const Overview = imports.ui.overview;
|
const Overview = imports.ui.overview;
|
||||||
const Panel = imports.ui.panel;
|
const Panel = imports.ui.panel;
|
||||||
|
const Params = imports.misc.params;
|
||||||
const RunDialog = imports.ui.runDialog;
|
const RunDialog = imports.ui.runDialog;
|
||||||
const Layout = imports.ui.layout;
|
const Layout = imports.ui.layout;
|
||||||
const LookingGlass = imports.ui.lookingGlass;
|
const LookingGlass = imports.ui.lookingGlass;
|
||||||
@@ -39,6 +40,18 @@ const Util = imports.misc.util;
|
|||||||
const OVERRIDES_SCHEMA = 'org.gnome.shell.overrides';
|
const OVERRIDES_SCHEMA = 'org.gnome.shell.overrides';
|
||||||
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
|
const DEFAULT_BACKGROUND_COLOR = Clutter.Color.from_pixel(0x2e3436ff);
|
||||||
|
|
||||||
|
const KeybindingMode = {
|
||||||
|
NONE: 0, // block all keybindings
|
||||||
|
NORMAL: 1 << 0, // window mode
|
||||||
|
OVERVIEW: 1 << 1,
|
||||||
|
LOCK_SCREEN: 1 << 2,
|
||||||
|
UNLOCK_SCREEN: 1 << 3,
|
||||||
|
LOGIN_SCREEN: 1 << 4,
|
||||||
|
MESSAGE_TRAY: 1 << 5,
|
||||||
|
SYSTEM_MODAL: 1 << 6,
|
||||||
|
LOOKING_GLASS: 1 << 7
|
||||||
|
};
|
||||||
|
|
||||||
let componentManager = null;
|
let componentManager = null;
|
||||||
let panel = null;
|
let panel = null;
|
||||||
let overview = null;
|
let overview = null;
|
||||||
@@ -55,6 +68,7 @@ let shellDBusService = null;
|
|||||||
let shellMountOpDBusService = null;
|
let shellMountOpDBusService = null;
|
||||||
let screenSaverDBus = null;
|
let screenSaverDBus = null;
|
||||||
let modalCount = 0;
|
let modalCount = 0;
|
||||||
|
let keybindingMode = KeybindingMode.NORMAL;
|
||||||
let modalActorFocusStack = [];
|
let modalActorFocusStack = [];
|
||||||
let uiGroup = null;
|
let uiGroup = null;
|
||||||
let magnifier = null;
|
let magnifier = null;
|
||||||
@@ -69,7 +83,17 @@ let _overridesSettings = null;
|
|||||||
let background = null;
|
let background = null;
|
||||||
|
|
||||||
function _sessionUpdated() {
|
function _sessionUpdated() {
|
||||||
Meta.keybindings_set_custom_handler('internal-keybinding-panel-run-dialog', sessionMode.hasRunDialog ? Util.wrapKeybinding(openRunDialog, true) : null);
|
wm.setCustomKeybindingHandler('panel-main-menu',
|
||||||
|
KeybindingMode.NORMAL |
|
||||||
|
KeybindingMode.OVERVIEW,
|
||||||
|
sessionMode.hasOverview ? Lang.bind(overview, overview.toggle) : null);
|
||||||
|
wm.allowKeybinding('overlay-key', KeybindingMode.NORMAL |
|
||||||
|
KeybindingMode.OVERVIEW);
|
||||||
|
|
||||||
|
wm.setCustomKeybindingHandler('panel-run-dialog',
|
||||||
|
KeybindingMode.NORMAL |
|
||||||
|
KeybindingMode.OVERVIEW,
|
||||||
|
sessionMode.hasRunDialog ? openRunDialog : null);
|
||||||
if (sessionMode.isGreeter)
|
if (sessionMode.isGreeter)
|
||||||
screenShield.showDialog();
|
screenShield.showDialog();
|
||||||
}
|
}
|
||||||
@@ -85,6 +109,8 @@ function start() {
|
|||||||
Gio.DesktopAppInfo.set_desktop_env('GNOME');
|
Gio.DesktopAppInfo.set_desktop_env('GNOME');
|
||||||
|
|
||||||
sessionMode = new SessionMode.SessionMode();
|
sessionMode = new SessionMode.SessionMode();
|
||||||
|
Meta.prefs_override_preference_schema(sessionMode.buttonLayout[0], sessionMode.buttonLayout[1]);
|
||||||
|
|
||||||
shellDBusService = new ShellDBus.GnomeShell();
|
shellDBusService = new ShellDBus.GnomeShell();
|
||||||
shellMountOpDBusService = new ShellMountOperation.GnomeShellMountOpHandler();
|
shellMountOpDBusService = new ShellMountOperation.GnomeShellMountOpHandler();
|
||||||
|
|
||||||
@@ -155,15 +181,7 @@ function start() {
|
|||||||
|
|
||||||
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
|
global.screen.override_workspace_layout(Meta.ScreenCorner.TOPLEFT,
|
||||||
false, -1, 1);
|
false, -1, 1);
|
||||||
Meta.keybindings_set_custom_handler('internal-keybinding-panel-main-menu', Util.wrapKeybinding(Lang.bind(overview, function() {
|
global.display.connect('overlay-key', Lang.bind(overview, overview.toggle));
|
||||||
this.toggle();
|
|
||||||
return true;
|
|
||||||
}), true));
|
|
||||||
global.display.connect('overlay-key', Util.wrapKeybinding(Lang.bind(overview, function() {
|
|
||||||
this.toggle();
|
|
||||||
return true;
|
|
||||||
}), true));
|
|
||||||
|
|
||||||
sessionMode.connect('update', _sessionUpdated);
|
sessionMode.connect('update', _sessionUpdated);
|
||||||
_sessionUpdated();
|
_sessionUpdated();
|
||||||
|
|
||||||
@@ -484,7 +502,7 @@ function isInModalStack(actor) {
|
|||||||
/**
|
/**
|
||||||
* pushModal:
|
* pushModal:
|
||||||
* @actor: #ClutterActor which will be given keyboard focus
|
* @actor: #ClutterActor which will be given keyboard focus
|
||||||
* @timestamp: optional timestamp
|
* @params: optional parameters
|
||||||
*
|
*
|
||||||
* Ensure we are in a mode where all keyboard and mouse input goes to
|
* Ensure we are in a mode where all keyboard and mouse input goes to
|
||||||
* the stage, and focus @actor. Multiple calls to this function act in
|
* the stage, and focus @actor. Multiple calls to this function act in
|
||||||
@@ -495,21 +513,27 @@ function isInModalStack(actor) {
|
|||||||
* modal stack returns to this actor, reset the focus to the actor
|
* modal stack returns to this actor, reset the focus to the actor
|
||||||
* which was focused at the time pushModal() was invoked.
|
* which was focused at the time pushModal() was invoked.
|
||||||
*
|
*
|
||||||
* @timestamp is optionally used to associate the call with a specific user
|
* @params may be used to provide the following parameters:
|
||||||
* initiated event. If not provided then the value of
|
* - timestamp: used to associate the call with a specific user initiated
|
||||||
|
* event. If not provided then the value of
|
||||||
* global.get_current_time() is assumed.
|
* global.get_current_time() is assumed.
|
||||||
*
|
*
|
||||||
* @options: optional Meta.ModalOptions flags to indicate that the
|
* - options: Meta.ModalOptions flags to indicate that the pointer is
|
||||||
* pointer is alrady grabbed
|
* already grabbed
|
||||||
|
*
|
||||||
|
* - keybindingMode: used to set the current Main.KeybindingMode to filter
|
||||||
|
* global keybindings; the default of NONE will filter
|
||||||
|
* out all keybindings
|
||||||
*
|
*
|
||||||
* Returns: true iff we successfully acquired a grab or already had one
|
* Returns: true iff we successfully acquired a grab or already had one
|
||||||
*/
|
*/
|
||||||
function pushModal(actor, timestamp, options) {
|
function pushModal(actor, params) {
|
||||||
if (timestamp == undefined)
|
params = Params.parse(params, { timestamp: global.get_current_time(),
|
||||||
timestamp = global.get_current_time();
|
options: 0,
|
||||||
|
keybindingMode: KeybindingMode.NONE });
|
||||||
|
|
||||||
if (modalCount == 0) {
|
if (modalCount == 0) {
|
||||||
if (!global.begin_modal(timestamp, options ? options : 0)) {
|
if (!global.begin_modal(params.timestamp, params.options)) {
|
||||||
log('pushModal: invocation of begin_modal failed');
|
log('pushModal: invocation of begin_modal failed');
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -536,8 +560,10 @@ function pushModal(actor, timestamp, options) {
|
|||||||
modalActorFocusStack.push({ actor: actor,
|
modalActorFocusStack.push({ actor: actor,
|
||||||
focus: curFocus,
|
focus: curFocus,
|
||||||
destroyId: actorDestroyId,
|
destroyId: actorDestroyId,
|
||||||
focusDestroyId: curFocusDestroyId });
|
focusDestroyId: curFocusDestroyId,
|
||||||
|
keybindingMode: keybindingMode });
|
||||||
|
|
||||||
|
keybindingMode = params.keybindingMode;
|
||||||
global.stage.set_key_focus(actor);
|
global.stage.set_key_focus(actor);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -564,6 +590,7 @@ function popModal(actor, timestamp) {
|
|||||||
global.stage.set_key_focus(null);
|
global.stage.set_key_focus(null);
|
||||||
global.end_modal(timestamp);
|
global.end_modal(timestamp);
|
||||||
global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
|
global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
|
||||||
|
keybindingMode = KeybindingMode.NORMAL;
|
||||||
|
|
||||||
throw new Error('incorrect pop');
|
throw new Error('incorrect pop');
|
||||||
}
|
}
|
||||||
@@ -576,6 +603,7 @@ function popModal(actor, timestamp) {
|
|||||||
if (focusIndex == modalActorFocusStack.length - 1) {
|
if (focusIndex == modalActorFocusStack.length - 1) {
|
||||||
if (record.focus)
|
if (record.focus)
|
||||||
record.focus.disconnect(record.focusDestroyId);
|
record.focus.disconnect(record.focusDestroyId);
|
||||||
|
keybindingMode = record.keybindingMode;
|
||||||
global.stage.set_key_focus(record.focus);
|
global.stage.set_key_focus(record.focus);
|
||||||
} else {
|
} else {
|
||||||
let t = modalActorFocusStack[modalActorFocusStack.length - 1];
|
let t = modalActorFocusStack[modalActorFocusStack.length - 1];
|
||||||
@@ -585,6 +613,7 @@ function popModal(actor, timestamp) {
|
|||||||
for (let i = modalActorFocusStack.length - 1; i > focusIndex; i--) {
|
for (let i = modalActorFocusStack.length - 1; i > focusIndex; i--) {
|
||||||
modalActorFocusStack[i].focus = modalActorFocusStack[i - 1].focus;
|
modalActorFocusStack[i].focus = modalActorFocusStack[i - 1].focus;
|
||||||
modalActorFocusStack[i].focusDestroyId = modalActorFocusStack[i - 1].focusDestroyId;
|
modalActorFocusStack[i].focusDestroyId = modalActorFocusStack[i - 1].focusDestroyId;
|
||||||
|
modalActorFocusStack[i].keybindingMode = modalActorFocusStack[i - 1].keybindingMode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
modalActorFocusStack.splice(focusIndex, 1);
|
modalActorFocusStack.splice(focusIndex, 1);
|
||||||
@@ -595,6 +624,7 @@ function popModal(actor, timestamp) {
|
|||||||
global.end_modal(timestamp);
|
global.end_modal(timestamp);
|
||||||
global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
|
global.set_stage_input_mode(Shell.StageInputMode.NORMAL);
|
||||||
Meta.enable_unredirect_for_screen(global.screen);
|
Meta.enable_unredirect_for_screen(global.screen);
|
||||||
|
keybindingMode = KeybindingMode.NORMAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
function createLookingGlass() {
|
function createLookingGlass() {
|
||||||
@@ -609,8 +639,6 @@ function openRunDialog() {
|
|||||||
runDialog = new RunDialog.RunDialog();
|
runDialog = new RunDialog.RunDialog();
|
||||||
}
|
}
|
||||||
runDialog.open();
|
runDialog.open();
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@@ -1453,7 +1453,8 @@ const MessageTray = new Lang.Class({
|
|||||||
|
|
||||||
this.idleMonitor = new GnomeDesktop.IdleMonitor();
|
this.idleMonitor = new GnomeDesktop.IdleMonitor();
|
||||||
|
|
||||||
this._grabHelper = new GrabHelper.GrabHelper(this.actor);
|
this._grabHelper = new GrabHelper.GrabHelper(this.actor,
|
||||||
|
{ keybindingMode: Main.KeybindingMode.MESSAGE_TRAY });
|
||||||
this._grabHelper.addActor(this._summaryBoxPointer.actor);
|
this._grabHelper.addActor(this._summaryBoxPointer.actor);
|
||||||
this._grabHelper.addActor(this.actor);
|
this._grabHelper.addActor(this.actor);
|
||||||
if (Main.panel.statusArea.activities)
|
if (Main.panel.statusArea.activities)
|
||||||
@@ -1470,6 +1471,7 @@ const MessageTray = new Lang.Class({
|
|||||||
this._pointerInTray = false;
|
this._pointerInTray = false;
|
||||||
this._pointerInKeyboard = false;
|
this._pointerInKeyboard = false;
|
||||||
this._keyboardVisible = false;
|
this._keyboardVisible = false;
|
||||||
|
this._keyboardUnderMessageTray = false;
|
||||||
this._summaryState = State.HIDDEN;
|
this._summaryState = State.HIDDEN;
|
||||||
this._pointerInSummary = false;
|
this._pointerInSummary = false;
|
||||||
this._notificationClosed = false;
|
this._notificationClosed = false;
|
||||||
@@ -1517,13 +1519,19 @@ const MessageTray = new Lang.Class({
|
|||||||
|
|
||||||
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
|
Main.sessionMode.connect('updated', Lang.bind(this, this._sessionUpdated));
|
||||||
|
|
||||||
global.display.add_keybinding('toggle-message-tray',
|
Main.wm.addKeybinding('toggle-message-tray',
|
||||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
||||||
Meta.KeyBindingFlags.NONE,
|
Meta.KeyBindingFlags.NONE,
|
||||||
|
Main.KeybindingMode.NORMAL |
|
||||||
|
Main.KeybindingMode.MESSAGE_TRAY |
|
||||||
|
Main.KeybindingMode.OVERVIEW,
|
||||||
Lang.bind(this, this.toggleAndNavigate));
|
Lang.bind(this, this.toggleAndNavigate));
|
||||||
global.display.add_keybinding('focus-active-notification',
|
Main.wm.addKeybinding('focus-active-notification',
|
||||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
||||||
Meta.KeyBindingFlags.NONE,
|
Meta.KeyBindingFlags.NONE,
|
||||||
|
Main.KeybindingMode.NORMAL |
|
||||||
|
Main.KeybindingMode.MESSAGE_TRAY |
|
||||||
|
Main.KeybindingMode.OVERVIEW,
|
||||||
Lang.bind(this, this._expandActiveNotification));
|
Lang.bind(this, this._expandActiveNotification));
|
||||||
|
|
||||||
this._summaryItems = [];
|
this._summaryItems = [];
|
||||||
@@ -1536,13 +1544,29 @@ const MessageTray = new Lang.Class({
|
|||||||
this._trayDwellUserTime = 0;
|
this._trayDwellUserTime = 0;
|
||||||
|
|
||||||
this._sessionUpdated();
|
this._sessionUpdated();
|
||||||
|
this._updateNoMessagesLabel();
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateNoMessagesLabel: function() {
|
||||||
|
if (this._summaryItems.length == 0 && !this._noMessages) {
|
||||||
|
this._noMessages = new St.Label({ text: _("No Messages"),
|
||||||
|
style_class: 'no-messages-label',
|
||||||
|
x_align: Clutter.ActorAlign.CENTER,
|
||||||
|
x_expand: true,
|
||||||
|
y_align: Clutter.ActorAlign.CENTER,
|
||||||
|
y_expand: true });
|
||||||
|
this.actor.add_actor(this._noMessages);
|
||||||
|
} else if (this._summaryItems.length > 0 && this._noMessages) {
|
||||||
|
this._noMessages.destroy();
|
||||||
|
this._noMessages = null;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_sessionUpdated: function() {
|
_sessionUpdated: function() {
|
||||||
if (Main.sessionMode.isLocked || Main.sessionMode.isGreeter)
|
if (Main.sessionMode.isLocked || Main.sessionMode.isGreeter)
|
||||||
Main.ctrlAltTabManager.removeGroup(this._summary);
|
Main.ctrlAltTabManager.removeGroup(this._summary);
|
||||||
else
|
else
|
||||||
Main.ctrlAltTabManager.addGroup(this._summary, _("Message Tray"), 'start-here-symbolic',
|
Main.ctrlAltTabManager.addGroup(this._summary, _("Message Tray"), 'user-available-symbolic',
|
||||||
{ focusCallback: Lang.bind(this, this.toggleAndNavigate),
|
{ focusCallback: Lang.bind(this, this.toggleAndNavigate),
|
||||||
sortGroup: CtrlAltTab.SortGroup.BOTTOM });
|
sortGroup: CtrlAltTab.SortGroup.BOTTOM });
|
||||||
this._updateState();
|
this._updateState();
|
||||||
@@ -1582,6 +1606,8 @@ const MessageTray = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_trayDwellTimeout: function() {
|
_trayDwellTimeout: function() {
|
||||||
|
this._trayDwellTimeoutId = 0;
|
||||||
|
|
||||||
if (Main.modalCount > 0)
|
if (Main.modalCount > 0)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -1592,8 +1618,6 @@ const MessageTray = new Lang.Class({
|
|||||||
if (currentUserTime != this._trayDwellUserTime)
|
if (currentUserTime != this._trayDwellUserTime)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
this._trayDwellTimeoutId = 0;
|
|
||||||
|
|
||||||
this._traySummoned = true;
|
this._traySummoned = true;
|
||||||
this._updateState();
|
this._updateState();
|
||||||
|
|
||||||
@@ -1680,6 +1704,8 @@ const MessageTray = new Lang.Class({
|
|||||||
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() { this._updateState(); return false; }));
|
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this, function() { this._updateState(); return false; }));
|
||||||
|
|
||||||
this.emit('summary-item-added', summaryItem);
|
this.emit('summary-item-added', summaryItem);
|
||||||
|
|
||||||
|
this._updateNoMessagesLabel();
|
||||||
},
|
},
|
||||||
|
|
||||||
getSummaryItems: function() {
|
getSummaryItems: function() {
|
||||||
@@ -1712,6 +1738,8 @@ const MessageTray = new Lang.Class({
|
|||||||
|
|
||||||
summaryItemToRemove.actor.destroy();
|
summaryItemToRemove.actor.destroy();
|
||||||
|
|
||||||
|
this._updateNoMessagesLabel();
|
||||||
|
|
||||||
if (needUpdate)
|
if (needUpdate)
|
||||||
this._updateState();
|
this._updateState();
|
||||||
},
|
},
|
||||||
@@ -1897,12 +1925,15 @@ const MessageTray = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onKeyboardVisibleChanged: function(layoutManager, keyboardVisible) {
|
_onKeyboardVisibleChanged: function(layoutManager, keyboardVisible) {
|
||||||
if (this._keyboardVisible == keyboardVisible)
|
let keyboardUnderMessageTray = layoutManager.keyboardIndex == layoutManager.bottomIndex;
|
||||||
|
if (this._keyboardVisible == keyboardVisible &&
|
||||||
|
this._keyboardUnderMesssageTray == keyboardUnderMessageTray)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this._keyboardVisible = keyboardVisible;
|
this._keyboardVisible = keyboardVisible;
|
||||||
|
this._keyboardUnderMessageTray = keyboardUnderMessageTray;
|
||||||
|
|
||||||
if (keyboardVisible)
|
if (keyboardVisible && keyboardUnderMessageTray)
|
||||||
this.actor.add_style_pseudo_class('keyboard');
|
this.actor.add_style_pseudo_class('keyboard');
|
||||||
else
|
else
|
||||||
this.actor.remove_style_pseudo_class('keyboard');
|
this.actor.remove_style_pseudo_class('keyboard');
|
||||||
@@ -2006,8 +2037,7 @@ const MessageTray = new Lang.Class({
|
|||||||
let summaryPinned = this._pointerInTray || summarySummoned || this._locked;
|
let summaryPinned = this._pointerInTray || summarySummoned || this._locked;
|
||||||
let summaryHovered = this._pointerInTray || this._pointerInSummary;
|
let summaryHovered = this._pointerInTray || this._pointerInSummary;
|
||||||
|
|
||||||
let notificationsVisible = (this._notificationState == State.SHOWING ||
|
let notificationsVisible = this._notificationState != State.HIDDEN;
|
||||||
this._notificationState == State.SHOWN);
|
|
||||||
let notificationsDone = !notificationsVisible && !notificationsPending;
|
let notificationsDone = !notificationsVisible && !notificationsPending;
|
||||||
|
|
||||||
let summaryOptionalInOverview = this._overviewVisible && !this._locked && !summaryHovered;
|
let summaryOptionalInOverview = this._overviewVisible && !this._locked && !summaryHovered;
|
||||||
@@ -2060,12 +2090,12 @@ const MessageTray = new Lang.Class({
|
|||||||
this._desktopCloneState == State.SHOWN);
|
this._desktopCloneState == State.SHOWN);
|
||||||
let desktopCloneShouldBeVisible = (trayShouldBeVisible &&
|
let desktopCloneShouldBeVisible = (trayShouldBeVisible &&
|
||||||
!this._overviewVisible &&
|
!this._overviewVisible &&
|
||||||
!this._keyboardVisible);
|
(!this._keyboardVisible || !this._keyboardUnderMessageTray));
|
||||||
|
|
||||||
if (!desktopCloneIsVisible && desktopCloneShouldBeVisible) {
|
if (!desktopCloneIsVisible && desktopCloneShouldBeVisible) {
|
||||||
this._showDesktopClone();
|
this._showDesktopClone();
|
||||||
} else if (desktopCloneIsVisible && !desktopCloneShouldBeVisible) {
|
} else if (desktopCloneIsVisible && !desktopCloneShouldBeVisible) {
|
||||||
this._hideDesktopClone (this._keyboardVisible);
|
this._hideDesktopClone (this._keyboardVisible && this._keyboardUnderMessageTray);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -2078,6 +2108,8 @@ const MessageTray = new Lang.Class({
|
|||||||
params.onCompleteScope = this;
|
params.onCompleteScope = this;
|
||||||
params.onCompleteParams = [statevar, value, onComplete, onCompleteScope, onCompleteParams];
|
params.onCompleteParams = [statevar, value, onComplete, onCompleteScope, onCompleteParams];
|
||||||
|
|
||||||
|
// Remove other tweens that could mess with the state machine
|
||||||
|
Tweener.removeTweens(actor);
|
||||||
Tweener.addTween(actor, params);
|
Tweener.addTween(actor, params);
|
||||||
|
|
||||||
let valuing = (value == State.SHOWN) ? State.SHOWING : State.HIDING;
|
let valuing = (value == State.SHOWN) ? State.SHOWING : State.HIDING;
|
||||||
@@ -2310,6 +2342,18 @@ const MessageTray = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_hideNotification: function() {
|
_hideNotification: function() {
|
||||||
|
// HACK!
|
||||||
|
// There seems to be a reentrancy issue in calling .ungrab() here,
|
||||||
|
// which causes _updateState to be called before _notificationState
|
||||||
|
// becomes HIDING. That hides the notification again, nullifying the
|
||||||
|
// object but not setting _notificationState (and that's the weird part)
|
||||||
|
// As then _notificationState is stuck into SHOWN but _notification
|
||||||
|
// is null, every new _updateState fails and the message tray is
|
||||||
|
// lost forever.
|
||||||
|
//
|
||||||
|
// See more at https://bugzilla.gnome.org/show_bug.cgi?id=683986
|
||||||
|
this._notificationState = State.HIDING;
|
||||||
|
|
||||||
this._grabHelper.ungrab({ actor: this._notification.actor });
|
this._grabHelper.ungrab({ actor: this._notification.actor });
|
||||||
|
|
||||||
if (this._idleMonitorBecameActiveId) {
|
if (this._idleMonitorBecameActiveId) {
|
||||||
@@ -2323,6 +2367,7 @@ const MessageTray = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (this._notificationRemoved) {
|
if (this._notificationRemoved) {
|
||||||
|
Tweener.removeTweens(this._notificationWidget);
|
||||||
this._notificationWidget.y = this.actor.height;
|
this._notificationWidget.y = this.actor.height;
|
||||||
this._notificationWidget.opacity = 0;
|
this._notificationWidget.opacity = 0;
|
||||||
this._notificationState = State.HIDDEN;
|
this._notificationState = State.HIDDEN;
|
||||||
@@ -2386,8 +2431,11 @@ const MessageTray = new Lang.Class({
|
|||||||
if (this._notificationWidget.y < expandedY) {
|
if (this._notificationWidget.y < expandedY) {
|
||||||
this._notificationWidget.y = expandedY;
|
this._notificationWidget.y = expandedY;
|
||||||
} else if (this._notification.y != expandedY) {
|
} else if (this._notification.y != expandedY) {
|
||||||
|
// Tween also opacity here, to override a possible tween that's
|
||||||
|
// currently hiding the notification.
|
||||||
this._tween(this._notificationWidget, '_notificationState', State.SHOWN,
|
this._tween(this._notificationWidget, '_notificationState', State.SHOWN,
|
||||||
{ y: expandedY,
|
{ y: expandedY,
|
||||||
|
opacity: 255,
|
||||||
time: ANIMATION_TIME,
|
time: ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad'
|
transition: 'easeOutQuad'
|
||||||
});
|
});
|
||||||
@@ -2446,6 +2494,7 @@ const MessageTray = new Lang.Class({
|
|||||||
this._summaryBoxPointerItem.prepareNotificationStackForShowing();
|
this._summaryBoxPointerItem.prepareNotificationStackForShowing();
|
||||||
} else if (this._clickedSummaryItemMouseButton == 3) {
|
} else if (this._clickedSummaryItemMouseButton == 3) {
|
||||||
this._summaryBoxPointer.bin.child = this._clickedSummaryItem.rightClickMenu;
|
this._summaryBoxPointer.bin.child = this._clickedSummaryItem.rightClickMenu;
|
||||||
|
this._summaryBoxPointerCloseClickedId = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
this._grabHelper.grab({ actor: this._summaryBoxPointer.bin.child,
|
this._grabHelper.grab({ actor: this._summaryBoxPointer.bin.child,
|
||||||
@@ -2552,8 +2601,10 @@ const MessageTray = new Lang.Class({
|
|||||||
this._summaryBoxPointer.bin.child = null;
|
this._summaryBoxPointer.bin.child = null;
|
||||||
this._summaryBoxPointerItem.disconnect(this._summaryBoxPointerContentUpdatedId);
|
this._summaryBoxPointerItem.disconnect(this._summaryBoxPointerContentUpdatedId);
|
||||||
this._summaryBoxPointerContentUpdatedId = 0;
|
this._summaryBoxPointerContentUpdatedId = 0;
|
||||||
|
if (this._summaryBoxPointerCloseClickedId != 0) {
|
||||||
this._summaryBoxPointerItem.closeButton.disconnect(this._summaryBoxPointerCloseClickedId);
|
this._summaryBoxPointerItem.closeButton.disconnect(this._summaryBoxPointerCloseClickedId);
|
||||||
this._summaryBoxPointerCloseClickedId = 0;
|
this._summaryBoxPointerCloseClickedId = 0;
|
||||||
|
}
|
||||||
this._summaryBoxPointerItem.source.disconnect(this._sourceDoneDisplayingId);
|
this._summaryBoxPointerItem.source.disconnect(this._sourceDoneDisplayingId);
|
||||||
this._summaryBoxPointerDoneDisplayingId = 0;
|
this._summaryBoxPointerDoneDisplayingId = 0;
|
||||||
|
|
||||||
|
@@ -37,10 +37,12 @@ const ModalDialog = new Lang.Class({
|
|||||||
params = Params.parse(params, { shellReactive: false,
|
params = Params.parse(params, { shellReactive: false,
|
||||||
styleClass: null,
|
styleClass: null,
|
||||||
parentActor: Main.uiGroup,
|
parentActor: Main.uiGroup,
|
||||||
|
keybindingMode: Main.KeybindingMode.SYSTEM_MODAL,
|
||||||
shouldFadeIn: true });
|
shouldFadeIn: true });
|
||||||
|
|
||||||
this.state = State.CLOSED;
|
this.state = State.CLOSED;
|
||||||
this._hasModal = false;
|
this._hasModal = false;
|
||||||
|
this._keybindingMode = params.keybindingMode;
|
||||||
this._shellReactive = params.shellReactive;
|
this._shellReactive = params.shellReactive;
|
||||||
this._shouldFadeIn = params.shouldFadeIn;
|
this._shouldFadeIn = params.shouldFadeIn;
|
||||||
|
|
||||||
@@ -56,7 +58,7 @@ const ModalDialog = new Lang.Class({
|
|||||||
|
|
||||||
this._group.connect('destroy', Lang.bind(this, this._onGroupDestroy));
|
this._group.connect('destroy', Lang.bind(this, this._onGroupDestroy));
|
||||||
|
|
||||||
this._actionKeys = {};
|
this._buttonKeys = {};
|
||||||
this._group.connect('key-release-event', Lang.bind(this, this._onKeyReleaseEvent));
|
this._group.connect('key-release-event', Lang.bind(this, this._onKeyReleaseEvent));
|
||||||
|
|
||||||
this._backgroundBin = new St.Bin();
|
this._backgroundBin = new St.Bin();
|
||||||
@@ -93,10 +95,10 @@ const ModalDialog = new Lang.Class({
|
|||||||
x_align: St.Align.MIDDLE,
|
x_align: St.Align.MIDDLE,
|
||||||
y_align: St.Align.START });
|
y_align: St.Align.START });
|
||||||
|
|
||||||
this._buttonLayout = new St.BoxLayout({ style_class: 'modal-dialog-button-box',
|
this.buttonLayout = new St.BoxLayout({ style_class: 'modal-dialog-button-box',
|
||||||
visible: false,
|
visible: false,
|
||||||
vertical: false });
|
vertical: false });
|
||||||
this.dialogLayout.add(this._buttonLayout,
|
this.dialogLayout.add(this.buttonLayout,
|
||||||
{ expand: true,
|
{ expand: true,
|
||||||
x_align: St.Align.MIDDLE,
|
x_align: St.Align.MIDDLE,
|
||||||
y_align: St.Align.END });
|
y_align: St.Align.END });
|
||||||
@@ -111,35 +113,17 @@ const ModalDialog = new Lang.Class({
|
|||||||
this._group.destroy();
|
this._group.destroy();
|
||||||
},
|
},
|
||||||
|
|
||||||
setActionKey: function(key, action) {
|
clearButtons: function() {
|
||||||
this._actionKeys[key] = action;
|
this.buttonLayout.destroy_all_children();
|
||||||
|
this._buttonKeys = {};
|
||||||
},
|
},
|
||||||
|
|
||||||
setButtons: function(buttons) {
|
setButtons: function(buttons) {
|
||||||
this._buttonLayout.destroy_all_children();
|
this.clearButtons();
|
||||||
this._actionKeys = {};
|
this.buttonLayout.visible = (buttons.length > 0);
|
||||||
|
|
||||||
this._buttonLayout.visible = (buttons.length > 0);
|
|
||||||
|
|
||||||
for (let i = 0; i < buttons.length; i++) {
|
for (let i = 0; i < buttons.length; i++) {
|
||||||
let buttonInfo = buttons[i];
|
let buttonInfo = buttons[i];
|
||||||
let label = buttonInfo['label'];
|
|
||||||
let action = buttonInfo['action'];
|
|
||||||
let key = buttonInfo['key'];
|
|
||||||
let isDefault = buttonInfo['default'];
|
|
||||||
|
|
||||||
if (isDefault && !key) {
|
|
||||||
this._actionKeys[Clutter.KEY_KP_Enter] = action;
|
|
||||||
this._actionKeys[Clutter.KEY_ISO_Enter] = action;
|
|
||||||
key = Clutter.KEY_Return;
|
|
||||||
}
|
|
||||||
|
|
||||||
buttonInfo.button = new St.Button({ style_class: 'modal-dialog-button',
|
|
||||||
reactive: true,
|
|
||||||
can_focus: true,
|
|
||||||
label: label });
|
|
||||||
if (isDefault)
|
|
||||||
buttonInfo.button.add_style_pseudo_class('default');
|
|
||||||
|
|
||||||
let x_alignment;
|
let x_alignment;
|
||||||
if (buttons.length == 1)
|
if (buttons.length == 1)
|
||||||
@@ -151,29 +135,62 @@ const ModalDialog = new Lang.Class({
|
|||||||
else
|
else
|
||||||
x_alignment = St.Align.MIDDLE;
|
x_alignment = St.Align.MIDDLE;
|
||||||
|
|
||||||
if (!this._initialKeyFocusDestroyId)
|
this.addButton(buttonInfo, { expand: true,
|
||||||
this._initialKeyFocus = buttonInfo.button;
|
|
||||||
this._buttonLayout.add(buttonInfo.button,
|
|
||||||
{ expand: true,
|
|
||||||
x_fill: false,
|
x_fill: false,
|
||||||
y_fill: false,
|
y_fill: false,
|
||||||
x_align: x_alignment,
|
x_align: x_alignment,
|
||||||
y_align: St.Align.MIDDLE });
|
y_align: St.Align.MIDDLE });
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
buttonInfo.button.connect('clicked', action);
|
addButton: function(buttonInfo, layoutInfo) {
|
||||||
|
let label = buttonInfo['label'];
|
||||||
|
let action = buttonInfo['action'];
|
||||||
|
let key = buttonInfo['key'];
|
||||||
|
let isDefault = buttonInfo['default'];
|
||||||
|
|
||||||
|
let keys;
|
||||||
|
|
||||||
if (key)
|
if (key)
|
||||||
this._actionKeys[key] = action;
|
keys = [key];
|
||||||
}
|
else if (isDefault)
|
||||||
|
keys = [Clutter.KEY_Return, Clutter.KEY_KP_Enter, Clutter.KEY_ISO_Enter];
|
||||||
|
else
|
||||||
|
keys = [];
|
||||||
|
|
||||||
this.emit('buttons-set');
|
let button = new St.Button({ style_class: 'modal-dialog-button',
|
||||||
|
reactive: true,
|
||||||
|
can_focus: true,
|
||||||
|
label: label });
|
||||||
|
button.connect('clicked', action);
|
||||||
|
|
||||||
|
buttonInfo['button'] = button;
|
||||||
|
|
||||||
|
if (isDefault)
|
||||||
|
button.add_style_pseudo_class('default');
|
||||||
|
|
||||||
|
if (!this._initialKeyFocusDestroyId)
|
||||||
|
this._initialKeyFocus = button;
|
||||||
|
|
||||||
|
for (let i in keys)
|
||||||
|
this._buttonKeys[keys[i]] = buttonInfo;
|
||||||
|
|
||||||
|
this.buttonLayout.add(button, layoutInfo);
|
||||||
|
|
||||||
|
return button;
|
||||||
},
|
},
|
||||||
|
|
||||||
_onKeyReleaseEvent: function(object, event) {
|
_onKeyReleaseEvent: function(object, event) {
|
||||||
let symbol = event.get_key_symbol();
|
let symbol = event.get_key_symbol();
|
||||||
let action = this._actionKeys[symbol];
|
let buttonInfo = this._buttonKeys[symbol];
|
||||||
|
|
||||||
if (action) {
|
if (!buttonInfo)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
let button = buttonInfo['button'];
|
||||||
|
let action = buttonInfo['action'];
|
||||||
|
|
||||||
|
if (action && button.reactive) {
|
||||||
action();
|
action();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -226,7 +243,7 @@ const ModalDialog = new Lang.Class({
|
|||||||
if (this.state == State.OPENED || this.state == State.OPENING)
|
if (this.state == State.OPENED || this.state == State.OPENING)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
if (!this.pushModal(timestamp))
|
if (!this.pushModal({ timestamp: timestamp }))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
this._fadeOpen(onPrimary);
|
this._fadeOpen(onPrimary);
|
||||||
@@ -276,7 +293,8 @@ const ModalDialog = new Lang.Class({
|
|||||||
pushModal: function (timestamp) {
|
pushModal: function (timestamp) {
|
||||||
if (this._hasModal)
|
if (this._hasModal)
|
||||||
return true;
|
return true;
|
||||||
if (!Main.pushModal(this._group, timestamp))
|
if (!Main.pushModal(this._group, { timestamp: timestamp,
|
||||||
|
keybindingMode: this._keybindingMode }))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
this._hasModal = true;
|
this._hasModal = true;
|
||||||
|
@@ -591,7 +591,7 @@ const Overview = new Lang.Class({
|
|||||||
if (this._shown)
|
if (this._shown)
|
||||||
return;
|
return;
|
||||||
// Do this manually instead of using _syncInputMode, to handle failure
|
// Do this manually instead of using _syncInputMode, to handle failure
|
||||||
if (!Main.pushModal(this._group))
|
if (!Main.pushModal(this._group, { keybindingMode: Main.KeybindingMode.OVERVIEW }))
|
||||||
return;
|
return;
|
||||||
this._modal = true;
|
this._modal = true;
|
||||||
this._animateVisible();
|
this._animateVisible();
|
||||||
@@ -742,7 +742,8 @@ const Overview = new Lang.Class({
|
|||||||
|
|
||||||
if (this._shown) {
|
if (this._shown) {
|
||||||
if (!this._modal) {
|
if (!this._modal) {
|
||||||
if (Main.pushModal(this._group))
|
if (Main.pushModal(this._group,
|
||||||
|
{ keybindingMode: Main.KeybindingMode.OVERVIEW }))
|
||||||
this._modal = true;
|
this._modal = true;
|
||||||
else
|
else
|
||||||
this.hide();
|
this.hide();
|
||||||
|
@@ -75,33 +75,41 @@ function _unpremultiply(color) {
|
|||||||
blue: blue, alpha: color.alpha });
|
blue: blue, alpha: color.alpha });
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const Animation = new Lang.Class({
|
||||||
|
Name: 'Animation',
|
||||||
|
|
||||||
const AnimatedIcon = new Lang.Class({
|
_init: function(filename, width, height, speed) {
|
||||||
Name: 'AnimatedIcon',
|
this.actor = new St.Bin();
|
||||||
|
|
||||||
_init: function(name, size) {
|
|
||||||
this.actor = new St.Bin({ visible: false });
|
|
||||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||||
this.actor.connect('notify::visible', Lang.bind(this, this._onVisibleNotify));
|
this._speed = speed;
|
||||||
|
|
||||||
|
this._isLoaded = false;
|
||||||
|
this._isPlaying = false;
|
||||||
this._timeoutId = 0;
|
this._timeoutId = 0;
|
||||||
this._frame = 0;
|
this._frame = 0;
|
||||||
this._animations = St.TextureCache.get_default().load_sliced_image (global.datadir + '/theme/' + name, size, size);
|
this._animations = St.TextureCache.get_default().load_sliced_image (filename, width, height,
|
||||||
|
Lang.bind(this, this._animationsLoaded));
|
||||||
this.actor.set_child(this._animations);
|
this.actor.set_child(this._animations);
|
||||||
},
|
},
|
||||||
|
|
||||||
_disconnectTimeout: function() {
|
play: function() {
|
||||||
|
if (this._isLoaded && this._timeoutId == 0) {
|
||||||
|
if (this._frame == 0)
|
||||||
|
this._showFrame(0);
|
||||||
|
|
||||||
|
this._timeoutId = Mainloop.timeout_add(this._speed, Lang.bind(this, this._update));
|
||||||
|
}
|
||||||
|
|
||||||
|
this._isPlaying = true;
|
||||||
|
},
|
||||||
|
|
||||||
|
stop: function() {
|
||||||
if (this._timeoutId > 0) {
|
if (this._timeoutId > 0) {
|
||||||
Mainloop.source_remove(this._timeoutId);
|
Mainloop.source_remove(this._timeoutId);
|
||||||
this._timeoutId = 0;
|
this._timeoutId = 0;
|
||||||
}
|
}
|
||||||
},
|
|
||||||
|
|
||||||
_onVisibleNotify: function() {
|
this._isPlaying = false;
|
||||||
if (this.actor.visible)
|
|
||||||
this._timeoutId = Mainloop.timeout_add(ANIMATED_ICON_UPDATE_TIMEOUT, Lang.bind(this, this._update));
|
|
||||||
else
|
|
||||||
this._disconnectTimeout();
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_showFrame: function(frame) {
|
_showFrame: function(frame) {
|
||||||
@@ -121,8 +129,24 @@ const AnimatedIcon = new Lang.Class({
|
|||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_animationsLoaded: function() {
|
||||||
|
this._isLoaded = true;
|
||||||
|
|
||||||
|
if (this._isPlaying)
|
||||||
|
this.play();
|
||||||
|
},
|
||||||
|
|
||||||
_onDestroy: function() {
|
_onDestroy: function() {
|
||||||
this._disconnectTimeout();
|
this.stop();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const AnimatedIcon = new Lang.Class({
|
||||||
|
Name: 'AnimatedIcon',
|
||||||
|
Extends: Animation,
|
||||||
|
|
||||||
|
_init: function(name, size) {
|
||||||
|
this.parent(global.datadir + '/theme/' + name, size, size, ANIMATED_ICON_UPDATE_TIMEOUT);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -277,6 +301,7 @@ const AppMenuButton = new Lang.Class({
|
|||||||
this._spinner = new AnimatedIcon('process-working.svg',
|
this._spinner = new AnimatedIcon('process-working.svg',
|
||||||
PANEL_ICON_SIZE);
|
PANEL_ICON_SIZE);
|
||||||
this._container.add_actor(this._spinner.actor);
|
this._container.add_actor(this._spinner.actor);
|
||||||
|
this._spinner.actor.hide();
|
||||||
this._spinner.actor.lower_bottom();
|
this._spinner.actor.lower_bottom();
|
||||||
|
|
||||||
let tracker = Shell.WindowTracker.get_default();
|
let tracker = Shell.WindowTracker.get_default();
|
||||||
@@ -367,6 +392,7 @@ const AppMenuButton = new Lang.Class({
|
|||||||
transition: "easeOutQuad",
|
transition: "easeOutQuad",
|
||||||
onCompleteScope: this,
|
onCompleteScope: this,
|
||||||
onComplete: function() {
|
onComplete: function() {
|
||||||
|
this._spinner.stop();
|
||||||
this._spinner.actor.opacity = 255;
|
this._spinner.actor.opacity = 255;
|
||||||
this._spinner.actor.hide();
|
this._spinner.actor.hide();
|
||||||
}
|
}
|
||||||
@@ -376,6 +402,7 @@ const AppMenuButton = new Lang.Class({
|
|||||||
startAnimation: function() {
|
startAnimation: function() {
|
||||||
this._stop = false;
|
this._stop = false;
|
||||||
this.actor.reactive = false;
|
this.actor.reactive = false;
|
||||||
|
this._spinner.play();
|
||||||
this._spinner.actor.show();
|
this._spinner.actor.show();
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -863,10 +890,13 @@ const PanelCorner = new Lang.Class({
|
|||||||
let backgroundColor = node.get_color('-panel-corner-background-color');
|
let backgroundColor = node.get_color('-panel-corner-background-color');
|
||||||
let borderColor = node.get_color('-panel-corner-border-color');
|
let borderColor = node.get_color('-panel-corner-border-color');
|
||||||
|
|
||||||
|
let noOverlap = borderColor.alpha == 0;
|
||||||
|
let offsetY = noOverlap ? borderWidth : 0;
|
||||||
|
|
||||||
let cr = this.actor.get_context();
|
let cr = this.actor.get_context();
|
||||||
cr.setOperator(Cairo.Operator.SOURCE);
|
cr.setOperator(Cairo.Operator.SOURCE);
|
||||||
|
|
||||||
cr.moveTo(0, 0);
|
cr.moveTo(0, offsetY);
|
||||||
if (this._side == St.Side.LEFT)
|
if (this._side == St.Side.LEFT)
|
||||||
cr.arc(cornerRadius,
|
cr.arc(cornerRadius,
|
||||||
borderWidth + cornerRadius,
|
borderWidth + cornerRadius,
|
||||||
@@ -875,7 +905,7 @@ const PanelCorner = new Lang.Class({
|
|||||||
cr.arc(0,
|
cr.arc(0,
|
||||||
borderWidth + cornerRadius,
|
borderWidth + cornerRadius,
|
||||||
cornerRadius, 3 * Math.PI / 2, 2 * Math.PI);
|
cornerRadius, 3 * Math.PI / 2, 2 * Math.PI);
|
||||||
cr.lineTo(cornerRadius, 0);
|
cr.lineTo(cornerRadius, offsetY);
|
||||||
cr.closePath();
|
cr.closePath();
|
||||||
|
|
||||||
let savedPath = cr.copyPath();
|
let savedPath = cr.copyPath();
|
||||||
@@ -885,6 +915,9 @@ const PanelCorner = new Lang.Class({
|
|||||||
Clutter.cairo_set_source_color(cr, over);
|
Clutter.cairo_set_source_color(cr, over);
|
||||||
cr.fill();
|
cr.fill();
|
||||||
|
|
||||||
|
if (noOverlap)
|
||||||
|
return;
|
||||||
|
|
||||||
let offset = borderWidth;
|
let offset = borderWidth;
|
||||||
Clutter.cairo_set_source_color(cr, backgroundColor);
|
Clutter.cairo_set_source_color(cr, backgroundColor);
|
||||||
|
|
||||||
@@ -939,14 +972,9 @@ const Panel = new Lang.Class({
|
|||||||
reactive: true });
|
reactive: true });
|
||||||
this.actor._delegate = this;
|
this.actor._delegate = this;
|
||||||
|
|
||||||
this.statusArea = {};
|
this._sessionStyle = null;
|
||||||
|
|
||||||
Main.overview.connect('shown', Lang.bind(this, function () {
|
this.statusArea = {};
|
||||||
this.actor.add_style_class_name('in-overview');
|
|
||||||
}));
|
|
||||||
Main.overview.connect('hiding', Lang.bind(this, function () {
|
|
||||||
this.actor.remove_style_class_name('in-overview');
|
|
||||||
}));
|
|
||||||
|
|
||||||
this.menuManager = new PopupMenu.PopupMenuManager(this);
|
this.menuManager = new PopupMenu.PopupMenuManager(this);
|
||||||
|
|
||||||
@@ -976,7 +1004,7 @@ const Panel = new Lang.Class({
|
|||||||
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
|
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
|
||||||
|
|
||||||
Main.layoutManager.panelBox.add(this.actor);
|
Main.layoutManager.panelBox.add(this.actor);
|
||||||
Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'start-here-symbolic',
|
Main.ctrlAltTabManager.addGroup(this.actor, _("Top Bar"), 'emblem-system-symbolic',
|
||||||
{ sortGroup: CtrlAltTab.SortGroup.TOP });
|
{ sortGroup: CtrlAltTab.SortGroup.TOP });
|
||||||
|
|
||||||
Main.sessionMode.connect('updated', Lang.bind(this, this._updatePanel));
|
Main.sessionMode.connect('updated', Lang.bind(this, this._updatePanel));
|
||||||
@@ -1133,6 +1161,13 @@ const Panel = new Lang.Class({
|
|||||||
this._updateBox(panel.left, this._leftBox);
|
this._updateBox(panel.left, this._leftBox);
|
||||||
this._updateBox(panel.center, this._centerBox);
|
this._updateBox(panel.center, this._centerBox);
|
||||||
this._updateBox(panel.right, this._rightBox);
|
this._updateBox(panel.right, this._rightBox);
|
||||||
|
|
||||||
|
if (this._sessionStyle)
|
||||||
|
this._removeStyleClassName(this._sessionStyle);
|
||||||
|
|
||||||
|
this._sessionStyle = Main.sessionMode.panelStyle;
|
||||||
|
if (this._sessionStyle)
|
||||||
|
this._addStyleClassName(this._sessionStyle);
|
||||||
},
|
},
|
||||||
|
|
||||||
_initBox: function(elements, box) {
|
_initBox: function(elements, box) {
|
||||||
@@ -1221,5 +1256,17 @@ const Panel = new Lang.Class({
|
|||||||
this.statusArea[role] = indicator;
|
this.statusArea[role] = indicator;
|
||||||
this._addToPanelBox(role, indicator, position, boxContainer);
|
this._addToPanelBox(role, indicator, position, boxContainer);
|
||||||
return indicator;
|
return indicator;
|
||||||
|
},
|
||||||
|
|
||||||
|
_addStyleClassName: function(className) {
|
||||||
|
this.actor.add_style_class_name(className);
|
||||||
|
this._rightCorner.actor.add_style_class_name(className);
|
||||||
|
this._leftCorner.actor.add_style_class_name(className);
|
||||||
|
},
|
||||||
|
|
||||||
|
_removeStyleClassName: function(className) {
|
||||||
|
this.actor.remove_style_class_name(className);
|
||||||
|
this._rightCorner.actor.remove_style_class_name(className);
|
||||||
|
this._leftCorner.actor.remove_style_class_name(className);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -31,10 +31,13 @@ const SearchProviderIface = <interface name="org.gnome.Shell.SearchProvider">
|
|||||||
|
|
||||||
var SearchProviderProxy = Gio.DBusProxy.makeProxyWrapper(SearchProviderIface);
|
var SearchProviderProxy = Gio.DBusProxy.makeProxyWrapper(SearchProviderIface);
|
||||||
|
|
||||||
|
|
||||||
function loadRemoteSearchProviders(addProviderCallback) {
|
function loadRemoteSearchProviders(addProviderCallback) {
|
||||||
|
let loadState = { loadedProviders: [],
|
||||||
|
objectPaths: {},
|
||||||
|
numLoading: 0,
|
||||||
|
addProviderCallback: addProviderCallback };
|
||||||
|
|
||||||
let dataDirs = GLib.get_system_data_dirs();
|
let dataDirs = GLib.get_system_data_dirs();
|
||||||
let loadedProviders = {};
|
|
||||||
for (let i = 0; i < dataDirs.length; i++) {
|
for (let i = 0; i < dataDirs.length; i++) {
|
||||||
let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'search-providers']);
|
let path = GLib.build_filenamev([dataDirs[i], 'gnome-shell', 'search-providers']);
|
||||||
let dir = Gio.file_new_for_path(path);
|
let dir = Gio.file_new_for_path(path);
|
||||||
@@ -52,12 +55,13 @@ function loadRemoteSearchProviders(addProviderCallback) {
|
|||||||
if (!exists)
|
if (!exists)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallback);
|
loadState.numLoading++;
|
||||||
|
loadRemoteSearchProvidersFromDir(dir, loadState);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
function loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallback) {
|
function loadRemoteSearchProvidersFromDir(dir, loadState) {
|
||||||
let dirPath = dir.get_path();
|
let dirPath = dir.get_path();
|
||||||
FileUtils.listDirAsync(dir, Lang.bind(this, function(files) {
|
FileUtils.listDirAsync(dir, Lang.bind(this, function(files) {
|
||||||
for (let i = 0; i < files.length; i++) {
|
for (let i = 0; i < files.length; i++) {
|
||||||
@@ -79,7 +83,7 @@ function loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallb
|
|||||||
let busName = keyfile.get_string(group, 'BusName');
|
let busName = keyfile.get_string(group, 'BusName');
|
||||||
let objectPath = keyfile.get_string(group, 'ObjectPath');
|
let objectPath = keyfile.get_string(group, 'ObjectPath');
|
||||||
|
|
||||||
if (loadedProviders[objectPath])
|
if (loadState.objectPaths[objectPath])
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
let appInfo = null;
|
let appInfo = null;
|
||||||
@@ -91,31 +95,82 @@ function loadRemoteSearchProvidersFromDir(dir, loadedProviders, addProviderCallb
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
remoteProvider = new RemoteSearchProvider(appInfo.get_name(),
|
remoteProvider = new RemoteSearchProvider(appInfo,
|
||||||
appInfo.get_icon(),
|
|
||||||
busName,
|
busName,
|
||||||
objectPath);
|
objectPath);
|
||||||
loadedProviders[objectPath] = remoteProvider;
|
loadState.objectPaths[objectPath] = remoteProvider;
|
||||||
|
loadState.loadedProviders.push(remoteProvider);
|
||||||
} catch(e) {
|
} catch(e) {
|
||||||
log('Failed to add search provider %s: %s'.format(path, e.toString()));
|
log('Failed to add search provider %s: %s'.format(path, e.toString()));
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
addProviderCallback(remoteProvider);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
remoteProvidersDirLoaded(loadState);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function remoteProvidersDirLoaded(loadState) {
|
||||||
|
loadState.numLoading--;
|
||||||
|
if (loadState.numLoading > 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
let searchSettings = new Gio.Settings({ schema: Search.SEARCH_PROVIDERS_SCHEMA });
|
||||||
|
let sortOrder = searchSettings.get_strv('sort-order');
|
||||||
|
let numSorted = sortOrder.length;
|
||||||
|
|
||||||
|
loadState.loadedProviders.sort(
|
||||||
|
function(providerA, providerB) {
|
||||||
|
let idxA, idxB;
|
||||||
|
let appIdA, appIdB;
|
||||||
|
|
||||||
|
appIdA = providerA.appInfo.get_id();
|
||||||
|
appIdB = providerB.appInfo.get_id();
|
||||||
|
|
||||||
|
idxA = sortOrder.indexOf(appIdA);
|
||||||
|
idxB = sortOrder.indexOf(appIdB);
|
||||||
|
|
||||||
|
// if no provider is found in the order, use alphabetical order
|
||||||
|
if ((idxA == -1) && (idxB == -1))
|
||||||
|
return GLib.utf8_collate(providerA.title, providerB.title);
|
||||||
|
|
||||||
|
if (numSorted > 1) {
|
||||||
|
// if providerA is the last, it goes after everything
|
||||||
|
if ((idxA + 1) == numSorted)
|
||||||
|
return 1;
|
||||||
|
// if providerB is the last, it goes after everything
|
||||||
|
else if ((idxB + 1) == numSorted)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if providerA isn't found, it's sorted after providerB
|
||||||
|
if (idxA == -1)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
// if providerB isn't found, it's sorted after providerA
|
||||||
|
if (idxB == -1)
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
// finally, if both providers are found, return their order in the list
|
||||||
|
return (idxA - idxB);
|
||||||
|
});
|
||||||
|
|
||||||
|
loadState.loadedProviders.forEach(
|
||||||
|
function(provider) {
|
||||||
|
loadState.addProviderCallback(provider);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
const RemoteSearchProvider = new Lang.Class({
|
const RemoteSearchProvider = new Lang.Class({
|
||||||
Name: 'RemoteSearchProvider',
|
Name: 'RemoteSearchProvider',
|
||||||
Extends: Search.SearchProvider,
|
Extends: Search.SearchProvider,
|
||||||
|
|
||||||
_init: function(title, icon, dbusName, dbusPath) {
|
_init: function(appInfo, dbusName, dbusPath) {
|
||||||
this._proxy = new SearchProviderProxy(Gio.DBus.session,
|
this._proxy = new SearchProviderProxy(Gio.DBus.session,
|
||||||
dbusName, dbusPath, Lang.bind(this, this._onProxyConstructed));
|
dbusName, dbusPath, Lang.bind(this, this._onProxyConstructed));
|
||||||
|
|
||||||
this.parent(title.toUpperCase());
|
this.parent(appInfo.get_name().toUpperCase(), appInfo, true);
|
||||||
this._cancellable = new Gio.Cancellable();
|
this._cancellable = new Gio.Cancellable();
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@@ -51,10 +51,11 @@ const SHORT_FADE_TIME = 0.3;
|
|||||||
|
|
||||||
function sample(offx, offy) {
|
function sample(offx, offy) {
|
||||||
return 'texel += texture2D (sampler, tex_coord.st + pixel_step * ' +
|
return 'texel += texture2D (sampler, tex_coord.st + pixel_step * ' +
|
||||||
'vec2 (' + offx + ',' + offy + ') * 2.0);\n'
|
'vec2 (' + offx + ',' + offy + '));\n'
|
||||||
}
|
}
|
||||||
const GLSL_BLUR_EFFECT_DECLARATIONS = ' \
|
const GLSL_BLUR_EFFECT_DECLARATIONS = ' \
|
||||||
uniform vec2 pixel_step;\n \
|
uniform vec2 pixel_step;\n \
|
||||||
|
uniform float desaturation;\n \
|
||||||
vec4 apply_blur(in sampler2D sampler, in vec2 tex_coord) {\n \
|
vec4 apply_blur(in sampler2D sampler, in vec2 tex_coord) {\n \
|
||||||
vec4 texel;\n \
|
vec4 texel;\n \
|
||||||
texel = texture2D (sampler, tex_coord.st);\n'
|
texel = texture2D (sampler, tex_coord.st);\n'
|
||||||
@@ -62,7 +63,6 @@ vec4 apply_blur(in sampler2D sampler, in vec2 tex_coord) {\n \
|
|||||||
+ sample( 0.0, -1.0)
|
+ sample( 0.0, -1.0)
|
||||||
+ sample(+1.0, -1.0)
|
+ sample(+1.0, -1.0)
|
||||||
+ sample(-1.0, 0.0)
|
+ sample(-1.0, 0.0)
|
||||||
+ sample( 0.0, 0.0)
|
|
||||||
+ sample(+1.0, 0.0)
|
+ sample(+1.0, 0.0)
|
||||||
+ sample(-1.0, +1.0)
|
+ sample(-1.0, +1.0)
|
||||||
+ sample( 0.0, +1.0)
|
+ sample( 0.0, +1.0)
|
||||||
@@ -70,7 +70,7 @@ vec4 apply_blur(in sampler2D sampler, in vec2 tex_coord) {\n \
|
|||||||
texel /= 9.0;\n \
|
texel /= 9.0;\n \
|
||||||
return texel;\n \
|
return texel;\n \
|
||||||
}\n \
|
}\n \
|
||||||
vec3 desaturate (const vec3 color, const float desaturation)\n \
|
vec3 desaturate (const vec3 color)\n \
|
||||||
{\n \
|
{\n \
|
||||||
const vec3 gray_conv = vec3 (0.299, 0.587, 0.114);\n \
|
const vec3 gray_conv = vec3 (0.299, 0.587, 0.114);\n \
|
||||||
vec3 gray = vec3 (dot (gray_conv, color));\n \
|
vec3 gray = vec3 (dot (gray_conv, color));\n \
|
||||||
@@ -78,7 +78,7 @@ vec3 desaturate (const vec3 color, const float desaturation)\n \
|
|||||||
}';
|
}';
|
||||||
const GLSL_BLUR_EFFECT_CODE = ' \
|
const GLSL_BLUR_EFFECT_CODE = ' \
|
||||||
cogl_texel = apply_blur(cogl_sampler, cogl_tex_coord.st);\n \
|
cogl_texel = apply_blur(cogl_sampler, cogl_tex_coord.st);\n \
|
||||||
cogl_texel.rgb = desaturate(cogl_texel.rgb, 0.6);\n';
|
cogl_texel.rgb = desaturate(cogl_texel.rgb);\n';
|
||||||
|
|
||||||
|
|
||||||
const Clock = new Lang.Class({
|
const Clock = new Lang.Class({
|
||||||
@@ -398,6 +398,7 @@ const ScreenShield = new Lang.Class({
|
|||||||
Lang.bind(this, this._onLockScreenKeyRelease));
|
Lang.bind(this, this._onLockScreenKeyRelease));
|
||||||
this._lockScreenGroup.connect('scroll-event',
|
this._lockScreenGroup.connect('scroll-event',
|
||||||
Lang.bind(this, this._onLockScreenScroll));
|
Lang.bind(this, this._onLockScreenScroll));
|
||||||
|
Main.ctrlAltTabManager.addGroup(this._lockScreenGroup, _("Lock"), 'changes-prevent-symbolic');
|
||||||
|
|
||||||
this._lockScreenContents = new St.Widget({ layout_manager: new Clutter.BinLayout(),
|
this._lockScreenContents = new St.Widget({ layout_manager: new Clutter.BinLayout(),
|
||||||
name: 'lockScreenContents' });
|
name: 'lockScreenContents' });
|
||||||
@@ -408,6 +409,12 @@ const ScreenShield = new Lang.Class({
|
|||||||
GLSL_BLUR_EFFECT_DECLARATIONS,
|
GLSL_BLUR_EFFECT_DECLARATIONS,
|
||||||
GLSL_BLUR_EFFECT_CODE,
|
GLSL_BLUR_EFFECT_CODE,
|
||||||
true);
|
true);
|
||||||
|
backgroundActor.set_uniform_float('desaturation',
|
||||||
|
1, 1, [0.6]);
|
||||||
|
backgroundActor.connect('notify::size', function(actor) {
|
||||||
|
actor.set_uniform_float('pixel_step', 2, 1, [1/actor.width, 1/actor.height]);
|
||||||
|
});
|
||||||
|
|
||||||
this._background = new St.Bin({ style_class: 'screen-shield-background',
|
this._background = new St.Bin({ style_class: 'screen-shield-background',
|
||||||
child: backgroundActor });
|
child: backgroundActor });
|
||||||
this._lockScreenGroup.add_actor(this._background);
|
this._lockScreenGroup.add_actor(this._background);
|
||||||
@@ -495,7 +502,7 @@ const ScreenShield = new Lang.Class({
|
|||||||
if (symbol == Clutter.KEY_Escape ||
|
if (symbol == Clutter.KEY_Escape ||
|
||||||
symbol == Clutter.KEY_Return ||
|
symbol == Clutter.KEY_Return ||
|
||||||
symbol == Clutter.KEY_KP_Enter) {
|
symbol == Clutter.KEY_KP_Enter) {
|
||||||
this._ensureUnlockDialog(true);
|
this._ensureUnlockDialog(true, true);
|
||||||
this._hideLockScreen(true, 0);
|
this._hideLockScreen(true, 0);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -518,7 +525,7 @@ const ScreenShield = new Lang.Class({
|
|||||||
|
|
||||||
// 7 standard scrolls to lift up
|
// 7 standard scrolls to lift up
|
||||||
if (this._lockScreenScrollCounter > 35) {
|
if (this._lockScreenScrollCounter > 35) {
|
||||||
this._ensureUnlockDialog(false);
|
this._ensureUnlockDialog(false, true);
|
||||||
this._hideLockScreen(true, 0);
|
this._hideLockScreen(true, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -550,7 +557,7 @@ const ScreenShield = new Lang.Class({
|
|||||||
_onDragBegin: function() {
|
_onDragBegin: function() {
|
||||||
Tweener.removeTweens(this._lockScreenGroup);
|
Tweener.removeTweens(this._lockScreenGroup);
|
||||||
this._lockScreenState = MessageTray.State.HIDING;
|
this._lockScreenState = MessageTray.State.HIDING;
|
||||||
this._ensureUnlockDialog(false);
|
this._ensureUnlockDialog(false, false);
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
@@ -572,6 +579,7 @@ const ScreenShield = new Lang.Class({
|
|||||||
// Complete motion automatically
|
// Complete motion automatically
|
||||||
let [velocity, velocityX, velocityY] = this._dragAction.get_velocity(0);
|
let [velocity, velocityX, velocityY] = this._dragAction.get_velocity(0);
|
||||||
this._hideLockScreen(true, -velocityY);
|
this._hideLockScreen(true, -velocityY);
|
||||||
|
this._ensureUnlockDialog(false, true);
|
||||||
} else {
|
} else {
|
||||||
// restore the lock screen to its original place
|
// restore the lock screen to its original place
|
||||||
// try to use the same speed as the normal animation
|
// try to use the same speed as the normal animation
|
||||||
@@ -611,7 +619,7 @@ const ScreenShield = new Lang.Class({
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (!this._isModal) {
|
if (!this._isModal) {
|
||||||
Main.pushModal(this.actor);
|
Main.pushModal(this.actor, { keybindingMode: Main.KeybindingMode.LOCK_SCREEN });
|
||||||
this._isModal = true;
|
this._isModal = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -654,7 +662,7 @@ const ScreenShield = new Lang.Class({
|
|||||||
|
|
||||||
this.actor.show();
|
this.actor.show();
|
||||||
this._isGreeter = Main.sessionMode.isGreeter;
|
this._isGreeter = Main.sessionMode.isGreeter;
|
||||||
this._ensureUnlockDialog(true);
|
this._ensureUnlockDialog(true, true);
|
||||||
this._hideLockScreen(false, 0);
|
this._hideLockScreen(false, 0);
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -710,16 +718,18 @@ const ScreenShield = new Lang.Class({
|
|||||||
Main.sessionMode.popMode('lock-screen');
|
Main.sessionMode.popMode('lock-screen');
|
||||||
},
|
},
|
||||||
|
|
||||||
_ensureUnlockDialog: function(onPrimary) {
|
_ensureUnlockDialog: function(onPrimary, allowCancel) {
|
||||||
if (!this._dialog) {
|
if (!this._dialog) {
|
||||||
let constructor = Main.sessionMode.unlockDialog;
|
let constructor = Main.sessionMode.unlockDialog;
|
||||||
this._dialog = new constructor(this._lockDialogGroup);
|
if (!constructor) {
|
||||||
if (!this._dialog) {
|
|
||||||
// This session mode has no locking capabilities
|
// This session mode has no locking capabilities
|
||||||
this.unlock();
|
this.unlock();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._dialog = new constructor(this._lockDialogGroup);
|
||||||
|
|
||||||
|
|
||||||
let time = global.get_current_time();
|
let time = global.get_current_time();
|
||||||
this._dialog.connect('loaded', Lang.bind(this, function() {
|
this._dialog.connect('loaded', Lang.bind(this, function() {
|
||||||
if (!this._dialog.open(time, onPrimary)) {
|
if (!this._dialog.open(time, onPrimary)) {
|
||||||
@@ -731,6 +741,8 @@ const ScreenShield = new Lang.Class({
|
|||||||
this._dialog.connect('failed', Lang.bind(this, this._onUnlockFailed));
|
this._dialog.connect('failed', Lang.bind(this, this._onUnlockFailed));
|
||||||
this._dialog.connect('unlocked', Lang.bind(this, this._onUnlockSucceded));
|
this._dialog.connect('unlocked', Lang.bind(this, this._onUnlockSucceded));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
this._dialog.allowCancel = allowCancel;
|
||||||
},
|
},
|
||||||
|
|
||||||
_onUnlockFailed: function() {
|
_onUnlockFailed: function() {
|
||||||
@@ -918,7 +930,7 @@ const ScreenShield = new Lang.Class({
|
|||||||
|
|
||||||
lock: function(animate) {
|
lock: function(animate) {
|
||||||
if (!this._isModal) {
|
if (!this._isModal) {
|
||||||
Main.pushModal(this.actor);
|
Main.pushModal(this.actor, { keybindingMode: Main.KeybindingMode.LOCK_SCREEN });
|
||||||
this._isModal = true;
|
this._isModal = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -10,6 +10,8 @@ const Util = imports.misc.util;
|
|||||||
const FileUtils = imports.misc.fileUtils;
|
const FileUtils = imports.misc.fileUtils;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
|
||||||
|
const SEARCH_PROVIDERS_SCHEMA = 'org.gnome.desktop.search-providers';
|
||||||
|
|
||||||
// Not currently referenced by the search API, but
|
// Not currently referenced by the search API, but
|
||||||
// this enumeration can be useful for provider
|
// this enumeration can be useful for provider
|
||||||
// implementations.
|
// implementations.
|
||||||
@@ -74,9 +76,11 @@ const SearchResultDisplay = new Lang.Class({
|
|||||||
const SearchProvider = new Lang.Class({
|
const SearchProvider = new Lang.Class({
|
||||||
Name: 'SearchProvider',
|
Name: 'SearchProvider',
|
||||||
|
|
||||||
_init: function(title) {
|
_init: function(title, appInfo, isRemoteProvider) {
|
||||||
this.title = title;
|
this.title = title;
|
||||||
|
this.appInfo = appInfo;
|
||||||
this.searchSystem = null;
|
this.searchSystem = null;
|
||||||
|
this.isRemoteProvider = !!isRemoteProvider;
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -172,12 +176,16 @@ const SearchSystem = new Lang.Class({
|
|||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this._providers = [];
|
this._providers = [];
|
||||||
|
this._remoteProviders = [];
|
||||||
this.reset();
|
this.reset();
|
||||||
},
|
},
|
||||||
|
|
||||||
registerProvider: function (provider) {
|
registerProvider: function (provider) {
|
||||||
provider.searchSystem = this;
|
provider.searchSystem = this;
|
||||||
this._providers.push(provider);
|
this._providers.push(provider);
|
||||||
|
|
||||||
|
if (provider.isRemoteProvider)
|
||||||
|
this._remoteProviders.push(provider);
|
||||||
},
|
},
|
||||||
|
|
||||||
unregisterProvider: function (provider) {
|
unregisterProvider: function (provider) {
|
||||||
@@ -186,12 +194,20 @@ const SearchSystem = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
provider.searchSystem = null;
|
provider.searchSystem = null;
|
||||||
this._providers.splice(index, 1);
|
this._providers.splice(index, 1);
|
||||||
|
|
||||||
|
let remoteIndex = this._remoteProviders.indexOf(provider);
|
||||||
|
if (remoteIndex != -1)
|
||||||
|
this._remoteProviders.splice(index, 1);
|
||||||
},
|
},
|
||||||
|
|
||||||
getProviders: function() {
|
getProviders: function() {
|
||||||
return this._providers;
|
return this._providers;
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getRemoteProviders: function() {
|
||||||
|
return this._remoteProviders;
|
||||||
|
},
|
||||||
|
|
||||||
getTerms: function() {
|
getTerms: function() {
|
||||||
return this._previousTerms;
|
return this._previousTerms;
|
||||||
},
|
},
|
||||||
|
@@ -14,7 +14,6 @@ const _modes = {
|
|||||||
showCalendarEvents: false,
|
showCalendarEvents: false,
|
||||||
allowSettings: false,
|
allowSettings: false,
|
||||||
allowExtensions: false,
|
allowExtensions: false,
|
||||||
allowKeybindingsWhenModal: false,
|
|
||||||
hasRunDialog: false,
|
hasRunDialog: false,
|
||||||
hasWorkspaces: false,
|
hasWorkspaces: false,
|
||||||
hasWindows: false,
|
hasWindows: false,
|
||||||
@@ -22,6 +21,7 @@ const _modes = {
|
|||||||
isLocked: false,
|
isLocked: false,
|
||||||
isGreeter: false,
|
isGreeter: false,
|
||||||
isPrimary: false,
|
isPrimary: false,
|
||||||
|
buttonLayout: ['button-layout', 'org.gnome.shell.overrides'],
|
||||||
unlockDialog: null,
|
unlockDialog: null,
|
||||||
components: [],
|
components: [],
|
||||||
panel: {
|
panel: {
|
||||||
@@ -29,49 +29,52 @@ const _modes = {
|
|||||||
center: [],
|
center: [],
|
||||||
right: []
|
right: []
|
||||||
},
|
},
|
||||||
|
panelStyle: null
|
||||||
},
|
},
|
||||||
|
|
||||||
'gdm': {
|
'gdm': {
|
||||||
allowKeybindingsWhenModal: true,
|
|
||||||
hasNotifications: true,
|
hasNotifications: true,
|
||||||
isGreeter: true,
|
isGreeter: true,
|
||||||
isPrimary: true,
|
isPrimary: true,
|
||||||
unlockDialog: imports.gdm.loginDialog.LoginDialog,
|
unlockDialog: imports.gdm.loginDialog.LoginDialog,
|
||||||
components: ['polkitAgent', 'mediaKeysManager'],
|
components: ['polkitAgent'],
|
||||||
panel: {
|
panel: {
|
||||||
left: ['logo'],
|
left: ['logo'],
|
||||||
center: ['dateMenu'],
|
center: ['dateMenu'],
|
||||||
right: ['a11y', 'display', 'keyboard',
|
right: ['a11y', 'display', 'keyboard',
|
||||||
'volume', 'battery', 'powerMenu']
|
'volume', 'battery', 'powerMenu']
|
||||||
}
|
},
|
||||||
|
panelStyle: 'login-screen'
|
||||||
},
|
},
|
||||||
|
|
||||||
'lock-screen': {
|
'lock-screen': {
|
||||||
isLocked: true,
|
isLocked: true,
|
||||||
isGreeter: undefined,
|
isGreeter: undefined,
|
||||||
unlockDialog: undefined,
|
unlockDialog: undefined,
|
||||||
components: ['polkitAgent', 'telepathyClient', 'mediaKeysManager'],
|
components: ['polkitAgent', 'telepathyClient'],
|
||||||
panel: {
|
panel: {
|
||||||
left: ['userMenu'],
|
left: ['userMenu'],
|
||||||
center: [],
|
center: [],
|
||||||
right: ['lockScreen']
|
right: ['lockScreen']
|
||||||
},
|
},
|
||||||
|
panelStyle: 'lock-screen'
|
||||||
},
|
},
|
||||||
|
|
||||||
'unlock-dialog': {
|
'unlock-dialog': {
|
||||||
isLocked: true,
|
isLocked: true,
|
||||||
unlockDialog: undefined,
|
unlockDialog: undefined,
|
||||||
components: ['polkitAgent', 'telepathyClient', 'mediaKeysManager'],
|
components: ['polkitAgent', 'telepathyClient'],
|
||||||
panel: {
|
panel: {
|
||||||
left: ['userMenu'],
|
left: ['userMenu'],
|
||||||
center: [],
|
center: [],
|
||||||
right: ['a11y', 'keyboard', 'lockScreen']
|
right: ['a11y', 'keyboard', 'lockScreen']
|
||||||
},
|
},
|
||||||
|
panelStyle: 'unlock-screen'
|
||||||
},
|
},
|
||||||
|
|
||||||
'initial-setup': {
|
'initial-setup': {
|
||||||
isPrimary: true,
|
isPrimary: true,
|
||||||
components: ['keyring', 'mediaKeysManager'],
|
components: ['keyring'],
|
||||||
panel: {
|
panel: {
|
||||||
left: [],
|
left: [],
|
||||||
center: ['dateMenu'],
|
center: ['dateMenu'],
|
||||||
@@ -91,9 +94,31 @@ const _modes = {
|
|||||||
isLocked: false,
|
isLocked: false,
|
||||||
isPrimary: true,
|
isPrimary: true,
|
||||||
unlockDialog: imports.ui.unlockDialog.UnlockDialog,
|
unlockDialog: imports.ui.unlockDialog.UnlockDialog,
|
||||||
components: ['networkAgent', 'polkitAgent', 'telepathyClient', 'keyring',
|
components: ['networkAgent', 'polkitAgent', 'telepathyClient',
|
||||||
'recorder', 'autorunManager', 'automountManager',
|
'keyring', 'recorder', 'autorunManager', 'automountManager'],
|
||||||
'mediaKeysManager'],
|
panel: {
|
||||||
|
left: ['activities', 'appMenu'],
|
||||||
|
center: ['dateMenu'],
|
||||||
|
right: ['a11y', 'keyboard', 'volume', 'bluetooth',
|
||||||
|
'network', 'battery', 'userMenu']
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
'foo': {
|
||||||
|
hasOverview: true,
|
||||||
|
showCalendarEvents: true,
|
||||||
|
allowSettings: true,
|
||||||
|
allowExtensions: true,
|
||||||
|
hasRunDialog: true,
|
||||||
|
hasWorkspaces: true,
|
||||||
|
hasWindows: true,
|
||||||
|
hasNotifications: true,
|
||||||
|
isLocked: false,
|
||||||
|
isPrimary: true,
|
||||||
|
buttonLayout: ['button-layout', 'org.gnome.shell-foo.overrides'],
|
||||||
|
unlockDialog: imports.ui.unlockDialog.UnlockDialog,
|
||||||
|
components: ['networkAgent', 'polkitAgent', 'telepathyClient',
|
||||||
|
'keyring', 'recorder', 'autorunManager', 'automountManager'],
|
||||||
panel: {
|
panel: {
|
||||||
left: ['activities', 'appMenu'],
|
left: ['activities', 'appMenu'],
|
||||||
center: ['dateMenu'],
|
center: ['dateMenu'],
|
||||||
|
@@ -111,7 +111,7 @@ const GnomeShell = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onScreenshotComplete: function(obj, result, area, flash, invocation) {
|
_onScreenshotComplete: function(obj, result, area, flash, invocation) {
|
||||||
if (flash) {
|
if (flash && result) {
|
||||||
let flashspot = new Flashspot.Flashspot(area);
|
let flashspot = new Flashspot.Flashspot(area);
|
||||||
flashspot.fire();
|
flashspot.fire();
|
||||||
}
|
}
|
||||||
|
@@ -27,6 +27,7 @@ const KEY_VISUAL_BELL = 'visual-bell';
|
|||||||
const DESKTOP_INTERFACE_SCHEMA = 'org.gnome.desktop.interface';
|
const DESKTOP_INTERFACE_SCHEMA = 'org.gnome.desktop.interface';
|
||||||
const KEY_GTK_THEME = 'gtk-theme';
|
const KEY_GTK_THEME = 'gtk-theme';
|
||||||
const KEY_ICON_THEME = 'icon-theme';
|
const KEY_ICON_THEME = 'icon-theme';
|
||||||
|
const KEY_WM_THEME = 'theme';
|
||||||
const KEY_TEXT_SCALING_FACTOR = 'text-scaling-factor';
|
const KEY_TEXT_SCALING_FACTOR = 'text-scaling-factor';
|
||||||
|
|
||||||
const HIGH_CONTRAST_THEME = 'HighContrast';
|
const HIGH_CONTRAST_THEME = 'HighContrast';
|
||||||
@@ -38,8 +39,8 @@ const ATIndicator = new Lang.Class({
|
|||||||
_init: function() {
|
_init: function() {
|
||||||
this.parent('preferences-desktop-accessibility-symbolic', _("Accessibility"));
|
this.parent('preferences-desktop-accessibility-symbolic', _("Accessibility"));
|
||||||
|
|
||||||
this._highContrast = this._buildHCItem();
|
let highContrast = this._buildHCItem();
|
||||||
this.menu.addMenuItem(this._highContrast);
|
this.menu.addMenuItem(highContrast);
|
||||||
|
|
||||||
let magnifier = this._buildItem(_("Zoom"), APPLICATIONS_SCHEMA,
|
let magnifier = this._buildItem(_("Zoom"), APPLICATIONS_SCHEMA,
|
||||||
'screen-magnifier-enabled');
|
'screen-magnifier-enabled');
|
||||||
@@ -101,28 +102,35 @@ const ATIndicator = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_buildHCItem: function() {
|
_buildHCItem: function() {
|
||||||
let settings = new Gio.Settings({ schema: DESKTOP_INTERFACE_SCHEMA });
|
let interfaceSettings = new Gio.Settings({ schema: DESKTOP_INTERFACE_SCHEMA });
|
||||||
let gtkTheme = settings.get_string(KEY_GTK_THEME);
|
let wmSettings = new Gio.Settings({ schema: WM_SCHEMA });
|
||||||
let iconTheme = settings.get_string(KEY_ICON_THEME);
|
let gtkTheme = interfaceSettings.get_string(KEY_GTK_THEME);
|
||||||
|
let iconTheme = interfaceSettings.get_string(KEY_ICON_THEME);
|
||||||
|
let wmTheme = wmSettings.get_string(KEY_WM_THEME);
|
||||||
let hasHC = (gtkTheme == HIGH_CONTRAST_THEME);
|
let hasHC = (gtkTheme == HIGH_CONTRAST_THEME);
|
||||||
let highContrast = this._buildItemExtended(
|
let highContrast = this._buildItemExtended(
|
||||||
_("High Contrast"),
|
_("High Contrast"),
|
||||||
hasHC,
|
hasHC,
|
||||||
settings.is_writable(KEY_GTK_THEME) && settings.is_writable(KEY_ICON_THEME),
|
interfaceSettings.is_writable(KEY_GTK_THEME) &&
|
||||||
|
interfaceSettings.is_writable(KEY_ICON_THEME) &&
|
||||||
|
wmSettings.is_writable(KEY_WM_THEME),
|
||||||
function (enabled) {
|
function (enabled) {
|
||||||
if (enabled) {
|
if (enabled) {
|
||||||
settings.set_string(KEY_GTK_THEME, HIGH_CONTRAST_THEME);
|
interfaceSettings.set_string(KEY_GTK_THEME, HIGH_CONTRAST_THEME);
|
||||||
settings.set_string(KEY_ICON_THEME, HIGH_CONTRAST_THEME);
|
interfaceSettings.set_string(KEY_ICON_THEME, HIGH_CONTRAST_THEME);
|
||||||
|
wmSettings.set_string(KEY_WM_THEME, HIGH_CONTRAST_THEME);
|
||||||
} else if(!hasHC) {
|
} else if(!hasHC) {
|
||||||
settings.set_string(KEY_GTK_THEME, gtkTheme);
|
interfaceSettings.set_string(KEY_GTK_THEME, gtkTheme);
|
||||||
settings.set_string(KEY_ICON_THEME, iconTheme);
|
interfaceSettings.set_string(KEY_ICON_THEME, iconTheme);
|
||||||
|
wmSettings.set_string(KEY_WM_THEME, wmTheme);
|
||||||
} else {
|
} else {
|
||||||
settings.reset(KEY_GTK_THEME);
|
interfaceSettings.reset(KEY_GTK_THEME);
|
||||||
settings.reset(KEY_ICON_THEME);
|
interfaceSettings.reset(KEY_ICON_THEME);
|
||||||
|
wmSettings.reset(KEY_WM_THEME);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
settings.connect('changed::' + KEY_GTK_THEME, function() {
|
interfaceSettings.connect('changed::' + KEY_GTK_THEME, function() {
|
||||||
let value = settings.get_string(KEY_GTK_THEME);
|
let value = interfaceSettings.get_string(KEY_GTK_THEME);
|
||||||
if (value == HIGH_CONTRAST_THEME) {
|
if (value == HIGH_CONTRAST_THEME) {
|
||||||
highContrast.setToggleState(true);
|
highContrast.setToggleState(true);
|
||||||
} else {
|
} else {
|
||||||
@@ -130,11 +138,16 @@ const ATIndicator = new Lang.Class({
|
|||||||
gtkTheme = value;
|
gtkTheme = value;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
settings.connect('changed::' + KEY_ICON_THEME, function() {
|
interfaceSettings.connect('changed::' + KEY_ICON_THEME, function() {
|
||||||
let value = settings.get_string(KEY_ICON_THEME);
|
let value = interfaceSettings.get_string(KEY_ICON_THEME);
|
||||||
if (value != HIGH_CONTRAST_THEME)
|
if (value != HIGH_CONTRAST_THEME)
|
||||||
iconTheme = value;
|
iconTheme = value;
|
||||||
});
|
});
|
||||||
|
wmSettings.connect('changed::' + KEY_WM_THEME, function() {
|
||||||
|
let value = wmSettings.get_string(KEY_WM_THEME);
|
||||||
|
if (value != HIGH_CONTRAST_THEME)
|
||||||
|
wmTheme = value;
|
||||||
|
});
|
||||||
return highContrast;
|
return highContrast;
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -159,9 +172,5 @@ const ATIndicator = new Lang.Class({
|
|||||||
widget.setToggleState(active);
|
widget.setToggleState(active);
|
||||||
});
|
});
|
||||||
return widget;
|
return widget;
|
||||||
},
|
}
|
||||||
|
|
||||||
toggleHighContrast: function() {
|
|
||||||
this._highContrast.toggle();
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
@@ -239,22 +239,6 @@ const Indicator = new Lang.Class({
|
|||||||
this._applet.send_to_address(device.bdaddr, device.alias);
|
this._applet.send_to_address(device.bdaddr, device.alias);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
if (device.capabilities & GnomeBluetoothApplet.Capabilities.OBEX_FILE_TRANSFER) {
|
|
||||||
item.menu.addAction(_("Browse Files..."), Lang.bind(this, function(event) {
|
|
||||||
this._applet.browse_address(device.bdaddr, event.get_time(),
|
|
||||||
Lang.bind(this, function(applet, result) {
|
|
||||||
try {
|
|
||||||
applet.browse_address_finish(result);
|
|
||||||
} catch (e) {
|
|
||||||
this._ensureSource();
|
|
||||||
this._source.notify(new MessageTray.Notification(this._source,
|
|
||||||
_("Bluetooth"),
|
|
||||||
_("Error browsing device"),
|
|
||||||
{ body: _("The requested device cannot be browsed, error is '%s'").format(e) }));
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (device.type) {
|
switch (device.type) {
|
||||||
case GnomeBluetoothApplet.Type.KEYBOARD:
|
case GnomeBluetoothApplet.Type.KEYBOARD:
|
||||||
@@ -369,6 +353,7 @@ const ConfirmNotification = new Lang.Class({
|
|||||||
_init: function(source, applet, device_path, name, long_name, pin) {
|
_init: function(source, applet, device_path, name, long_name, pin) {
|
||||||
this.parent(source,
|
this.parent(source,
|
||||||
_("Bluetooth"),
|
_("Bluetooth"),
|
||||||
|
/* Translators: argument is the device short name */
|
||||||
_("Pairing confirmation for %s").format(name),
|
_("Pairing confirmation for %s").format(name),
|
||||||
{ customContent: true });
|
{ customContent: true });
|
||||||
this.setResident(true);
|
this.setResident(true);
|
||||||
@@ -378,6 +363,7 @@ const ConfirmNotification = new Lang.Class({
|
|||||||
this.addBody(_("Device %s wants to pair with this computer").format(long_name));
|
this.addBody(_("Device %s wants to pair with this computer").format(long_name));
|
||||||
this.addBody(_("Please confirm whether the PIN '%06d' matches the one on the device.").format(pin));
|
this.addBody(_("Please confirm whether the PIN '%06d' matches the one on the device.").format(pin));
|
||||||
|
|
||||||
|
/* Translators: this is the verb, not the noun */
|
||||||
this.addButton('matches', _("Matches"));
|
this.addButton('matches', _("Matches"));
|
||||||
this.addButton('does-not-match', _("Does not match"));
|
this.addButton('does-not-match', _("Does not match"));
|
||||||
|
|
||||||
|
@@ -5,6 +5,7 @@ const Gio = imports.gi.Gio;
|
|||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const NetworkManager = imports.gi.NetworkManager;
|
const NetworkManager = imports.gi.NetworkManager;
|
||||||
const NMClient = imports.gi.NMClient;
|
const NMClient = imports.gi.NMClient;
|
||||||
|
const NMGtk = imports.gi.NMGtk;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
|
|
||||||
@@ -139,46 +140,6 @@ const NMNetworkMenuItem = new Lang.Class({
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
const NMWiredSectionTitleMenuItem = new Lang.Class({
|
|
||||||
Name: 'NMWiredSectionTitleMenuItem',
|
|
||||||
Extends: PopupMenu.PopupSwitchMenuItem,
|
|
||||||
|
|
||||||
_init: function(label, params) {
|
|
||||||
params = params || { };
|
|
||||||
params.style_class = 'popup-subtitle-menu-item';
|
|
||||||
this.parent(label, false, params);
|
|
||||||
},
|
|
||||||
|
|
||||||
updateForDevice: function(device) {
|
|
||||||
if (device) {
|
|
||||||
this._device = device;
|
|
||||||
this.setStatus(device.getStatusLabel());
|
|
||||||
this.setToggleState(device.connected);
|
|
||||||
} else
|
|
||||||
this.setStatus('');
|
|
||||||
},
|
|
||||||
|
|
||||||
activate: function(event) {
|
|
||||||
this.parent(event);
|
|
||||||
|
|
||||||
if (!this._device) {
|
|
||||||
log('Section title activated when there is more than one device, should be non reactive');
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
let newState = this._switch.state;
|
|
||||||
|
|
||||||
let ok;
|
|
||||||
if (newState)
|
|
||||||
ok = this._device.activate();
|
|
||||||
else
|
|
||||||
ok = this._device.deactivate();
|
|
||||||
|
|
||||||
if (!ok)
|
|
||||||
this._switch.setToggleState(false);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const NMWirelessSectionTitleMenuItem = new Lang.Class({
|
const NMWirelessSectionTitleMenuItem = new Lang.Class({
|
||||||
Name: 'NMWirelessSectionTitleMenuItem',
|
Name: 'NMWirelessSectionTitleMenuItem',
|
||||||
Extends: PopupMenu.PopupSwitchMenuItem,
|
Extends: PopupMenu.PopupSwitchMenuItem,
|
||||||
@@ -351,7 +312,7 @@ const NMDevice = new Lang.Class({
|
|||||||
this._autoConnectionItem = null;
|
this._autoConnectionItem = null;
|
||||||
this._overflowItem = null;
|
this._overflowItem = null;
|
||||||
|
|
||||||
this.statusItem = new PopupMenu.PopupSwitchMenuItem(this._getDescription(), this.connected, { style_class: 'popup-subtitle-menu-item' });
|
this.statusItem = new PopupMenu.PopupSwitchMenuItem('', this.connected, { style_class: 'popup-subtitle-menu-item' });
|
||||||
this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) {
|
this._statusChanged = this.statusItem.connect('toggled', Lang.bind(this, function(item, state) {
|
||||||
let ok;
|
let ok;
|
||||||
if (state)
|
if (state)
|
||||||
@@ -512,6 +473,10 @@ const NMDevice = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
syncDescription: function() {
|
||||||
|
this.statusItem.label.text = this.device._description;
|
||||||
|
},
|
||||||
|
|
||||||
// protected
|
// protected
|
||||||
_createAutomaticConnection: function() {
|
_createAutomaticConnection: function() {
|
||||||
throw new TypeError('Invoking pure virtual function NMDevice.createAutomaticConnection');
|
throw new TypeError('Invoking pure virtual function NMDevice.createAutomaticConnection');
|
||||||
@@ -639,25 +604,6 @@ const NMDevice = new Lang.Class({
|
|||||||
this.statusItem.setStatus(this.getStatusLabel());
|
this.statusItem.setStatus(this.getStatusLabel());
|
||||||
|
|
||||||
this.emit('state-changed');
|
this.emit('state-changed');
|
||||||
},
|
|
||||||
|
|
||||||
_getDescription: function() {
|
|
||||||
let dev_product = this.device.get_product();
|
|
||||||
let dev_vendor = this.device.get_vendor();
|
|
||||||
if (!dev_product || !dev_vendor)
|
|
||||||
return '';
|
|
||||||
|
|
||||||
let product = Util.fixupPCIDescription(dev_product);
|
|
||||||
let vendor = Util.fixupPCIDescription(dev_vendor);
|
|
||||||
let out = '';
|
|
||||||
|
|
||||||
// Another quick hack; if all of the fixed up vendor string
|
|
||||||
// is found in product, ignore the vendor.
|
|
||||||
if (product.indexOf(vendor) == -1)
|
|
||||||
out += vendor + ' ';
|
|
||||||
out += product;
|
|
||||||
|
|
||||||
return out;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -867,10 +813,6 @@ const NMDeviceBluetooth = new Lang.Class({
|
|||||||
this._clearSection();
|
this._clearSection();
|
||||||
this._queueCreateSection();
|
this._queueCreateSection();
|
||||||
this._updateStatusItem();
|
this._updateStatusItem();
|
||||||
},
|
|
||||||
|
|
||||||
_getDescription: function() {
|
|
||||||
return this.device.name || _("Bluetooth");
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -1651,15 +1593,14 @@ const NMApplet = new Lang.Class({
|
|||||||
this._mobileUpdateId = 0;
|
this._mobileUpdateId = 0;
|
||||||
this._mobileUpdateDevice = null;
|
this._mobileUpdateDevice = null;
|
||||||
|
|
||||||
|
this._nmDevices = [];
|
||||||
this._devices = { };
|
this._devices = { };
|
||||||
|
|
||||||
this._devices.wired = {
|
this._devices.wired = {
|
||||||
section: new PopupMenu.PopupMenuSection(),
|
section: new PopupMenu.PopupMenuSection(),
|
||||||
devices: [ ],
|
devices: [ ],
|
||||||
item: new NMWiredSectionTitleMenuItem(_("Wired"))
|
|
||||||
};
|
};
|
||||||
|
|
||||||
this._devices.wired.section.addMenuItem(this._devices.wired.item);
|
|
||||||
this._devices.wired.section.actor.hide();
|
this._devices.wired.section.actor.hide();
|
||||||
this.menu.addMenuItem(this._devices.wired.section);
|
this.menu.addMenuItem(this._devices.wired.section);
|
||||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||||
@@ -1667,7 +1608,7 @@ const NMApplet = new Lang.Class({
|
|||||||
this._devices.wireless = {
|
this._devices.wireless = {
|
||||||
section: new PopupMenu.PopupMenuSection(),
|
section: new PopupMenu.PopupMenuSection(),
|
||||||
devices: [ ],
|
devices: [ ],
|
||||||
item: this._makeToggleItem('wireless', _("Wireless"))
|
item: this._makeToggleItem('wireless', _("Wi-Fi"))
|
||||||
};
|
};
|
||||||
this._devices.wireless.section.addMenuItem(this._devices.wireless.item);
|
this._devices.wireless.section.addMenuItem(this._devices.wireless.item);
|
||||||
this._devices.wireless.section.actor.hide();
|
this._devices.wireless.section.actor.hide();
|
||||||
@@ -1677,9 +1618,7 @@ const NMApplet = new Lang.Class({
|
|||||||
this._devices.wwan = {
|
this._devices.wwan = {
|
||||||
section: new PopupMenu.PopupMenuSection(),
|
section: new PopupMenu.PopupMenuSection(),
|
||||||
devices: [ ],
|
devices: [ ],
|
||||||
item: this._makeToggleItem('wwan', _("Mobile broadband"))
|
|
||||||
};
|
};
|
||||||
this._devices.wwan.section.addMenuItem(this._devices.wwan.item);
|
|
||||||
this._devices.wwan.section.actor.hide();
|
this._devices.wwan.section.actor.hide();
|
||||||
this.menu.addMenuItem(this._devices.wwan.section);
|
this.menu.addMenuItem(this._devices.wwan.section);
|
||||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||||
@@ -1762,6 +1701,11 @@ const NMApplet = new Lang.Class({
|
|||||||
section.actor.hide();
|
section.actor.hide();
|
||||||
else {
|
else {
|
||||||
section.actor.show();
|
section.actor.show();
|
||||||
|
|
||||||
|
// Sync the relation between the section title
|
||||||
|
// item (the one with the airplane mode switch)
|
||||||
|
// and the individual device switches
|
||||||
|
if (item) {
|
||||||
if (devices.length == 1) {
|
if (devices.length == 1) {
|
||||||
let dev = devices[0];
|
let dev = devices[0];
|
||||||
dev.statusItem.actor.hide();
|
dev.statusItem.actor.hide();
|
||||||
@@ -1770,17 +1714,20 @@ const NMApplet = new Lang.Class({
|
|||||||
devices.forEach(function(dev) {
|
devices.forEach(function(dev) {
|
||||||
dev.statusItem.actor.show();
|
dev.statusItem.actor.show();
|
||||||
});
|
});
|
||||||
|
|
||||||
// remove status text from the section title item
|
// remove status text from the section title item
|
||||||
item.updateForDevice(null);
|
item.updateForDevice(null);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_readDevices: function() {
|
_readDevices: function() {
|
||||||
let devices = this._client.get_devices() || [ ];
|
let devices = this._client.get_devices() || [ ];
|
||||||
for (let i = 0; i < devices.length; ++i) {
|
for (let i = 0; i < devices.length; ++i) {
|
||||||
this._deviceAdded(this._client, devices[i]);
|
this._deviceAdded(this._client, devices[i], true);
|
||||||
}
|
}
|
||||||
|
this._syncDeviceNames();
|
||||||
},
|
},
|
||||||
|
|
||||||
_notifyForDevice: function(device, iconName, title, text, urgency) {
|
_notifyForDevice: function(device, iconName, title, text, urgency) {
|
||||||
@@ -1828,7 +1775,18 @@ const NMApplet = new Lang.Class({
|
|||||||
return wrapper;
|
return wrapper;
|
||||||
},
|
},
|
||||||
|
|
||||||
_deviceAdded: function(client, device) {
|
_syncDeviceNames: function() {
|
||||||
|
let names = NMGtk.utils_disambiguate_device_names(this._nmDevices);
|
||||||
|
for (let i = 0; i < this._nmDevices.length; i++) {
|
||||||
|
let device = this._nmDevices[i];
|
||||||
|
if (device._description != names[i]) {
|
||||||
|
device._description = names[i];
|
||||||
|
device._delegate.syncDescription();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_deviceAdded: function(client, device, skipSyncDeviceNames) {
|
||||||
if (device._delegate) {
|
if (device._delegate) {
|
||||||
// already seen, not adding again
|
// already seen, not adding again
|
||||||
return;
|
return;
|
||||||
@@ -1839,10 +1797,14 @@ const NMApplet = new Lang.Class({
|
|||||||
let section = this._devices[wrapper.category].section;
|
let section = this._devices[wrapper.category].section;
|
||||||
let devices = this._devices[wrapper.category].devices;
|
let devices = this._devices[wrapper.category].devices;
|
||||||
|
|
||||||
section.addMenuItem(wrapper.section, 1);
|
section.addMenuItem(wrapper.statusItem);
|
||||||
section.addMenuItem(wrapper.statusItem, 1);
|
section.addMenuItem(wrapper.section);
|
||||||
devices.push(wrapper);
|
devices.push(wrapper);
|
||||||
|
|
||||||
|
this._nmDevices.push(device);
|
||||||
|
if (!skipSyncDeviceNames)
|
||||||
|
this._syncDeviceNames();
|
||||||
|
|
||||||
this._syncSectionTitle(wrapper.category);
|
this._syncSectionTitle(wrapper.category);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@@ -1860,6 +1822,10 @@ const NMApplet = new Lang.Class({
|
|||||||
let pos = devices.indexOf(wrapper);
|
let pos = devices.indexOf(wrapper);
|
||||||
devices.splice(pos, 1);
|
devices.splice(pos, 1);
|
||||||
|
|
||||||
|
pos = this._nmDevices.indexOf(device);
|
||||||
|
this._nmDevices.splice(pos, 1);
|
||||||
|
this._syncDeviceNames();
|
||||||
|
|
||||||
this._syncSectionTitle(wrapper.category)
|
this._syncSectionTitle(wrapper.category)
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@@ -66,21 +66,7 @@ const VolumeMenu = new Lang.Class({
|
|||||||
this._onControlStateChanged();
|
this._onControlStateChanged();
|
||||||
},
|
},
|
||||||
|
|
||||||
toggleMute: function(quiet) {
|
scroll: function(direction) {
|
||||||
let muted = this._output.is_muted;
|
|
||||||
this._output.change_is_muted(!muted);
|
|
||||||
|
|
||||||
if (muted && !quiet)
|
|
||||||
this._notifyVolumeChange();
|
|
||||||
|
|
||||||
if (!muted)
|
|
||||||
return ['audio-volume-muted-symbolic', 0];
|
|
||||||
else
|
|
||||||
return [this._volumeToIcon(this._output.volume),
|
|
||||||
this._output.volume / this._volumeMax];
|
|
||||||
},
|
|
||||||
|
|
||||||
scroll: function(direction, quiet) {
|
|
||||||
let currentVolume = this._output.volume;
|
let currentVolume = this._output.volume;
|
||||||
|
|
||||||
if (direction == Clutter.ScrollDirection.DOWN) {
|
if (direction == Clutter.ScrollDirection.DOWN) {
|
||||||
@@ -99,14 +85,7 @@ const VolumeMenu = new Lang.Class({
|
|||||||
this._output.push_volume();
|
this._output.push_volume();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!quiet)
|
|
||||||
this._notifyVolumeChange();
|
this._notifyVolumeChange();
|
||||||
|
|
||||||
if (this._output.is_muted)
|
|
||||||
return ['audio-volume-muted-symbolic', 0];
|
|
||||||
else
|
|
||||||
return [this._volumeToIcon(this._output.volume),
|
|
||||||
this._output.volume / this._volumeMax];
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_onControlStateChanged: function() {
|
_onControlStateChanged: function() {
|
||||||
@@ -242,14 +221,14 @@ const Indicator = new Lang.Class({
|
|||||||
this.parent('audio-volume-muted-symbolic', _("Volume"));
|
this.parent('audio-volume-muted-symbolic', _("Volume"));
|
||||||
|
|
||||||
this._control = getMixerControl();
|
this._control = getMixerControl();
|
||||||
this.volumeMenu = new VolumeMenu(this._control);
|
this._volumeMenu = new VolumeMenu(this._control);
|
||||||
this.volumeMenu.connect('icon-changed', Lang.bind(this, function(menu, icon) {
|
this._volumeMenu.connect('icon-changed', Lang.bind(this, function(menu, icon) {
|
||||||
this._hasPulseAudio = (icon != null);
|
this._hasPulseAudio = (icon != null);
|
||||||
this.setIcon(icon);
|
this.setIcon(icon);
|
||||||
this._syncVisibility();
|
this._syncVisibility();
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this.menu.addMenuItem(this.volumeMenu);
|
this.menu.addMenuItem(this._volumeMenu);
|
||||||
|
|
||||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||||
this.menu.addSettingsAction(_("Sound Settings"), 'gnome-sound-panel.desktop');
|
this.menu.addSettingsAction(_("Sound Settings"), 'gnome-sound-panel.desktop');
|
||||||
@@ -263,6 +242,6 @@ const Indicator = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onScrollEvent: function(actor, event) {
|
_onScrollEvent: function(actor, event) {
|
||||||
this.volumeMenu.scroll(event.get_scroll_direction(), false);
|
this._volumeMenu.scroll(event.get_scroll_direction());
|
||||||
},
|
}
|
||||||
});
|
});
|
||||||
|
@@ -14,12 +14,14 @@ const St = imports.gi.St;
|
|||||||
|
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const ModalDialog = imports.ui.modalDialog;
|
const ModalDialog = imports.ui.modalDialog;
|
||||||
|
const Panel = imports.ui.panel;
|
||||||
const ShellEntry = imports.ui.shellEntry;
|
const ShellEntry = imports.ui.shellEntry;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const UserMenu = imports.ui.userMenu;
|
const UserMenu = imports.ui.userMenu;
|
||||||
|
|
||||||
const Batch = imports.gdm.batch;
|
const Batch = imports.gdm.batch;
|
||||||
const GdmUtil = imports.gdm.util;
|
const GdmUtil = imports.gdm.util;
|
||||||
|
const LoginDialog = imports.gdm.loginDialog;
|
||||||
|
|
||||||
// The timeout before going back automatically to the lock screen (in seconds)
|
// The timeout before going back automatically to the lock screen (in seconds)
|
||||||
const IDLE_TIMEOUT = 2 * 60;
|
const IDLE_TIMEOUT = 2 * 60;
|
||||||
@@ -113,6 +115,7 @@ const UnlockDialog = new Lang.Class({
|
|||||||
_init: function(parentActor) {
|
_init: function(parentActor) {
|
||||||
this.parent({ shellReactive: true,
|
this.parent({ shellReactive: true,
|
||||||
styleClass: 'login-dialog',
|
styleClass: 'login-dialog',
|
||||||
|
keybindingMode: Main.KeybindingMode.UNLOCK_SCREEN,
|
||||||
parentActor: parentActor
|
parentActor: parentActor
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -150,7 +153,6 @@ const UnlockDialog = new Lang.Class({
|
|||||||
this._promptEntry.clutter_text.set_password_char('\u25cf');
|
this._promptEntry.clutter_text.set_password_char('\u25cf');
|
||||||
ShellEntry.addContextMenu(this._promptEntry, { isPassword: true });
|
ShellEntry.addContextMenu(this._promptEntry, { isPassword: true });
|
||||||
this.setInitialKeyFocus(this._promptEntry);
|
this.setInitialKeyFocus(this._promptEntry);
|
||||||
this._promptEntry.clutter_text.connect('activate', Lang.bind(this, this._doUnlock));
|
|
||||||
this._promptEntry.clutter_text.connect('text-changed', Lang.bind(this, function() {
|
this._promptEntry.clutter_text.connect('text-changed', Lang.bind(this, function() {
|
||||||
this._updateOkButtonSensitivity(this._promptEntry.text.length > 0);
|
this._updateOkButtonSensitivity(this._promptEntry.text.length > 0);
|
||||||
}));
|
}));
|
||||||
@@ -168,15 +170,33 @@ const UnlockDialog = new Lang.Class({
|
|||||||
this._promptLoginHint.hide();
|
this._promptLoginHint.hide();
|
||||||
this.contentLayout.add_actor(this._promptLoginHint);
|
this.contentLayout.add_actor(this._promptLoginHint);
|
||||||
|
|
||||||
let cancelButton = { label: _("Cancel"),
|
this._workSpinner = new Panel.AnimatedIcon('process-working.svg', LoginDialog.WORK_SPINNER_ICON_SIZE);
|
||||||
action: Lang.bind(this, this._escape),
|
this._workSpinner.actor.opacity = 0;
|
||||||
key: Clutter.KEY_Escape };
|
|
||||||
this._okButton = { label: _("Unlock"),
|
|
||||||
action: Lang.bind(this, this._doUnlock),
|
|
||||||
default: true };
|
|
||||||
this.setButtons([cancelButton, this._okButton]);
|
|
||||||
|
|
||||||
this._updateSensitivity(true);
|
this.allowCancel = false;
|
||||||
|
this.buttonLayout.visible = true;
|
||||||
|
this.addButton({ label: _("Cancel"),
|
||||||
|
action: Lang.bind(this, this._escape),
|
||||||
|
key: Clutter.KEY_Escape },
|
||||||
|
{ expand: true,
|
||||||
|
x_fill: false,
|
||||||
|
y_fill: false,
|
||||||
|
x_align: St.Align.START,
|
||||||
|
y_align: St.Align.MIDDLE });
|
||||||
|
this.buttonLayout.add(this._workSpinner.actor,
|
||||||
|
{ expand: false,
|
||||||
|
x_fill: false,
|
||||||
|
y_fill: false,
|
||||||
|
x_align: St.Align.END,
|
||||||
|
y_align: St.Align.MIDDLE });
|
||||||
|
this._okButton = this.addButton({ label: _("Unlock"),
|
||||||
|
action: Lang.bind(this, this._doUnlock),
|
||||||
|
default: true },
|
||||||
|
{ expand: false,
|
||||||
|
x_fill: false,
|
||||||
|
y_fill: false,
|
||||||
|
x_align: St.Align.END,
|
||||||
|
y_align: St.Align.MIDDLE });
|
||||||
|
|
||||||
let otherUserLabel = new St.Label({ text: _("Log in as another user"),
|
let otherUserLabel = new St.Label({ text: _("Log in as another user"),
|
||||||
style_class: 'login-dialog-not-listed-label' });
|
style_class: 'login-dialog-not-listed-label' });
|
||||||
@@ -191,6 +211,8 @@ const UnlockDialog = new Lang.Class({
|
|||||||
{ x_align: St.Align.START,
|
{ x_align: St.Align.START,
|
||||||
x_fill: false });
|
x_fill: false });
|
||||||
|
|
||||||
|
this._updateSensitivity(true);
|
||||||
|
|
||||||
let batch = new Batch.Hold();
|
let batch = new Batch.Hold();
|
||||||
this._userVerifier.begin(this._userName, batch);
|
this._userVerifier.begin(this._userName, batch);
|
||||||
|
|
||||||
@@ -199,6 +221,8 @@ const UnlockDialog = new Lang.Class({
|
|||||||
return false;
|
return false;
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
Main.ctrlAltTabManager.addGroup(this.dialogLayout, _("Unlock Window"), 'dialog-password-symbolic');
|
||||||
|
|
||||||
this._idleMonitor = new GnomeDesktop.IdleMonitor();
|
this._idleMonitor = new GnomeDesktop.IdleMonitor();
|
||||||
this._idleWatchId = this._idleMonitor.add_watch(IDLE_TIMEOUT * 1000, Lang.bind(this, this._escape));
|
this._idleWatchId = this._idleMonitor.add_watch(IDLE_TIMEOUT * 1000, Lang.bind(this, this._escape));
|
||||||
},
|
},
|
||||||
@@ -207,11 +231,35 @@ const UnlockDialog = new Lang.Class({
|
|||||||
this._promptEntry.reactive = sensitive;
|
this._promptEntry.reactive = sensitive;
|
||||||
this._promptEntry.clutter_text.editable = sensitive;
|
this._promptEntry.clutter_text.editable = sensitive;
|
||||||
this._updateOkButtonSensitivity(sensitive && this._promptEntry.text.length > 0);
|
this._updateOkButtonSensitivity(sensitive && this._promptEntry.text.length > 0);
|
||||||
|
this._otherUserButton.reactive = sensitive;
|
||||||
|
this._otherUserButton.can_focus = sensitive;
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateOkButtonSensitivity: function(sensitive) {
|
_updateOkButtonSensitivity: function(sensitive) {
|
||||||
this._okButton.button.reactive = sensitive;
|
this._okButton.reactive = sensitive;
|
||||||
this._okButton.button.can_focus = sensitive;
|
this._okButton.can_focus = sensitive;
|
||||||
|
},
|
||||||
|
|
||||||
|
_setWorking: function(working) {
|
||||||
|
if (working) {
|
||||||
|
this._workSpinner.play();
|
||||||
|
Tweener.addTween(this._workSpinner.actor,
|
||||||
|
{ opacity: 255,
|
||||||
|
delay: LoginDialog.WORK_SPINNER_ANIMATION_DELAY,
|
||||||
|
time: LoginDialog.WORK_SPINNER_ANIMATION_TIME,
|
||||||
|
transition: 'linear'
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
Tweener.addTween(this._workSpinner.actor,
|
||||||
|
{ opacity: 0,
|
||||||
|
time: LoginDialog.WORK_SPINNER_ANIMATION_TIME,
|
||||||
|
transition: 'linear',
|
||||||
|
onCompleteScope: this,
|
||||||
|
onComplete: function() {
|
||||||
|
this._workSpinner.stop();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_showMessage: function(userVerifier, message, styleClass) {
|
_showMessage: function(userVerifier, message, styleClass) {
|
||||||
@@ -244,6 +292,7 @@ const UnlockDialog = new Lang.Class({
|
|||||||
|
|
||||||
this._currentQuery = serviceName;
|
this._currentQuery = serviceName;
|
||||||
this._updateSensitivity(true);
|
this._updateSensitivity(true);
|
||||||
|
this._setWorking(false);
|
||||||
},
|
},
|
||||||
|
|
||||||
_showLoginHint: function(verifier, message) {
|
_showLoginHint: function(verifier, message) {
|
||||||
@@ -262,6 +311,7 @@ const UnlockDialog = new Lang.Class({
|
|||||||
// the actual reply to GDM will be sent as soon as asked
|
// the actual reply to GDM will be sent as soon as asked
|
||||||
this._firstQuestionAnswer = this._promptEntry.text;
|
this._firstQuestionAnswer = this._promptEntry.text;
|
||||||
this._updateSensitivity(false);
|
this._updateSensitivity(false);
|
||||||
|
this._setWorking(true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,6 +322,7 @@ const UnlockDialog = new Lang.Class({
|
|||||||
this._currentQuery = null;
|
this._currentQuery = null;
|
||||||
|
|
||||||
this._updateSensitivity(false);
|
this._updateSensitivity(false);
|
||||||
|
this._setWorking(true);
|
||||||
|
|
||||||
this._userVerifier.answerQuery(query, this._promptEntry.text);
|
this._userVerifier.answerQuery(query, this._promptEntry.text);
|
||||||
},
|
},
|
||||||
@@ -294,11 +345,14 @@ const UnlockDialog = new Lang.Class({
|
|||||||
this._promptEntry.menu.isPassword = true;
|
this._promptEntry.menu.isPassword = true;
|
||||||
|
|
||||||
this._updateSensitivity(false);
|
this._updateSensitivity(false);
|
||||||
|
this._setWorking(false);
|
||||||
},
|
},
|
||||||
|
|
||||||
_escape: function() {
|
_escape: function() {
|
||||||
|
if (this.allowCancel) {
|
||||||
this._userVerifier.cancel();
|
this._userVerifier.cancel();
|
||||||
this.emit('failed');
|
this.emit('failed');
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_otherUserClicked: function(button, event) {
|
_otherUserClicked: function(button, event) {
|
||||||
|
@@ -27,6 +27,7 @@ const DISABLE_LOCK_SCREEN_KEY = 'disable-lock-screen';
|
|||||||
const DISABLE_LOG_OUT_KEY = 'disable-log-out';
|
const DISABLE_LOG_OUT_KEY = 'disable-log-out';
|
||||||
const LOCK_ENABLED_KEY = 'lock-enabled';
|
const LOCK_ENABLED_KEY = 'lock-enabled';
|
||||||
const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out';
|
const ALWAYS_SHOW_LOG_OUT_KEY = 'always-show-log-out';
|
||||||
|
const SHOW_FULL_NAME_KEY = 'show-full-name';
|
||||||
|
|
||||||
const DIALOG_ICON_SIZE = 64;
|
const DIALOG_ICON_SIZE = 64;
|
||||||
|
|
||||||
@@ -550,9 +551,12 @@ const UserMenuButton = new Lang.Class({
|
|||||||
Lang.bind(this, this._updateSwitchUser));
|
Lang.bind(this, this._updateSwitchUser));
|
||||||
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
|
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
|
||||||
Lang.bind(this, this._updateLogout));
|
Lang.bind(this, this._updateLogout));
|
||||||
|
|
||||||
this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY,
|
this._lockdownSettings.connect('changed::' + DISABLE_LOCK_SCREEN_KEY,
|
||||||
Lang.bind(this, this._updateLockScreen));
|
Lang.bind(this, this._updateLockScreen));
|
||||||
|
this._screenSaverSettings.connect('changed::' + SHOW_FULL_NAME_KEY,
|
||||||
|
Lang.bind(this, this._updateUserName));
|
||||||
|
global.settings.connect('changed::' + SHOW_FULL_NAME_KEY,
|
||||||
|
Lang.bind(this, this._updateUserName));
|
||||||
this._updateSwitchUser();
|
this._updateSwitchUser();
|
||||||
this._updateLogout();
|
this._updateLogout();
|
||||||
this._updateLockScreen();
|
this._updateLockScreen();
|
||||||
@@ -572,7 +576,6 @@ const UserMenuButton = new Lang.Class({
|
|||||||
|
|
||||||
this._updateHaveShutdown();
|
this._updateHaveShutdown();
|
||||||
this._updateHaveSuspend();
|
this._updateHaveSuspend();
|
||||||
this._updateHaveHibernate();
|
|
||||||
}));
|
}));
|
||||||
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
|
this._lockdownSettings.connect('changed::' + DISABLE_LOG_OUT_KEY,
|
||||||
Lang.bind(this, this._updateHaveShutdown));
|
Lang.bind(this, this._updateHaveShutdown));
|
||||||
@@ -598,7 +601,10 @@ const UserMenuButton = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
_updateUserName: function() {
|
_updateUserName: function() {
|
||||||
if (this._user.is_loaded)
|
let settings = global.settings;
|
||||||
|
if (Main.sessionMode.isLocked)
|
||||||
|
settings = this._screenSaverSettings;
|
||||||
|
if (this._user.is_loaded && settings.get_boolean(SHOW_FULL_NAME_KEY))
|
||||||
this._name.set_text(this._user.get_real_name());
|
this._name.set_text(this._user.get_real_name());
|
||||||
else
|
else
|
||||||
this._name.set_text("");
|
this._name.set_text("");
|
||||||
@@ -656,13 +662,6 @@ const UserMenuButton = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
_updateHaveHibernate: function() {
|
|
||||||
this._loginManager.canHibernate(Lang.bind(this,
|
|
||||||
function(result) {
|
|
||||||
this._haveHibernate = result;
|
|
||||||
}));
|
|
||||||
},
|
|
||||||
|
|
||||||
_updateSuspendOrPowerOff: function() {
|
_updateSuspendOrPowerOff: function() {
|
||||||
if (!this._suspendOrPowerOffItem)
|
if (!this._suspendOrPowerOffItem)
|
||||||
return;
|
return;
|
||||||
@@ -774,7 +773,7 @@ const UserMenuButton = new Lang.Class({
|
|||||||
this._loginScreenItem = item;
|
this._loginScreenItem = item;
|
||||||
|
|
||||||
item = new PopupMenu.PopupMenuItem(_("Log Out"));
|
item = new PopupMenu.PopupMenuItem(_("Log Out"));
|
||||||
item.connect('activate', Lang.bind(this, this.logOut));
|
item.connect('activate', Lang.bind(this, this._onQuitSessionActivate));
|
||||||
this.menu.addMenuItem(item);
|
this.menu.addMenuItem(item);
|
||||||
this._logoutItem = item;
|
this._logoutItem = item;
|
||||||
|
|
||||||
@@ -843,7 +842,7 @@ const UserMenuButton = new Lang.Class({
|
|||||||
Gdm.goto_login_session_sync(null);
|
Gdm.goto_login_session_sync(null);
|
||||||
},
|
},
|
||||||
|
|
||||||
logOut: function() {
|
_onQuitSessionActivate: function() {
|
||||||
Main.overview.hide();
|
Main.overview.hide();
|
||||||
this._session.LogoutRemote(0);
|
this._session.LogoutRemote(0);
|
||||||
},
|
},
|
||||||
@@ -855,60 +854,25 @@ const UserMenuButton = new Lang.Class({
|
|||||||
this._session.RebootRemote();
|
this._session.RebootRemote();
|
||||||
},
|
},
|
||||||
|
|
||||||
shutdown: function() {
|
|
||||||
this._session.ShutdownRemote();
|
|
||||||
},
|
|
||||||
|
|
||||||
suspend: function() {
|
|
||||||
if (!this._haveSuspend)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Ensure we only suspend after locking the screen
|
|
||||||
if (this._screenSaverSettings.get_boolean(LOCK_ENABLED_KEY)) {
|
|
||||||
let tmpId = Main.screenShield.connect('lock-screen-shown', Lang.bind(this, function() {
|
|
||||||
Main.screenShield.disconnect(tmpId);
|
|
||||||
|
|
||||||
this._loginManager.suspend();
|
|
||||||
}));
|
|
||||||
|
|
||||||
this.menu.close(BoxPointer.PopupAnimation.NONE);
|
|
||||||
Main.screenShield.lock(true);
|
|
||||||
} else {
|
|
||||||
this._loginManager.suspend();
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
hibernate: function() {
|
|
||||||
if (!this._haveHibernate)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
// Ensure we only suspend after locking the screen
|
|
||||||
if (this._screenSaverSettings.get_boolean(LOCK_ENABLED_KEY)) {
|
|
||||||
let tmpId = Main.screenShield.connect('lock-screen-shown', Lang.bind(this, function() {
|
|
||||||
Main.screenShield.disconnect(tmpId);
|
|
||||||
|
|
||||||
this._loginManager.hibernate();
|
|
||||||
}));
|
|
||||||
|
|
||||||
this.menu.close(BoxPointer.PopupAnimation.NONE);
|
|
||||||
Main.screenShield.lock(true);
|
|
||||||
} else {
|
|
||||||
this._loginManager.hibernate();
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
_onSuspendOrPowerOffActivate: function() {
|
_onSuspendOrPowerOffActivate: function() {
|
||||||
Main.overview.hide();
|
Main.overview.hide();
|
||||||
|
|
||||||
if (this._haveShutdown &&
|
if (this._haveShutdown &&
|
||||||
this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) {
|
this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) {
|
||||||
this.shutdown();
|
this._session.ShutdownRemote();
|
||||||
} else {
|
} else {
|
||||||
this.suspend();
|
if (this._screenSaverSettings.get_boolean(LOCK_ENABLED_KEY)) {
|
||||||
|
let tmpId = Main.screenShield.connect('lock-screen-shown', Lang.bind(this, function() {
|
||||||
|
Main.screenShield.disconnect(tmpId);
|
||||||
|
|
||||||
|
this._loginManager.suspend();
|
||||||
|
}));
|
||||||
|
|
||||||
|
this.menu.close(BoxPointer.PopupAnimation.NONE);
|
||||||
|
Main.screenShield.lock(true);
|
||||||
|
} else {
|
||||||
|
this._loginManager.suspend();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@@ -84,16 +84,21 @@ const ViewSelector = new Lang.Class({
|
|||||||
|
|
||||||
this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay();
|
this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay();
|
||||||
this._workspacesPage = this._addPage(this._workspacesDisplay.actor, null,
|
this._workspacesPage = this._addPage(this._workspacesDisplay.actor, null,
|
||||||
_("Windows"), 'text-x-generic-symbolic');
|
_("Windows"), 'emblem-documents-symbolic');
|
||||||
|
|
||||||
this._appDisplay = new AppDisplay.AllAppDisplay();
|
this._appDisplay = new AppDisplay.AllAppDisplay();
|
||||||
this._appsPage = this._addPage(this._appDisplay.actor, null,
|
this._appsPage = this._addPage(this._appDisplay.actor, null,
|
||||||
_("Applications"), 'system-run-symbolic');
|
_("Applications"), 'view-grid-symbolic');
|
||||||
|
|
||||||
this._searchResults = new SearchDisplay.SearchResults(this._searchSystem);
|
this._searchResults = new SearchDisplay.SearchResults(this._searchSystem);
|
||||||
this._searchPage = this._addPage(this._searchResults.actor, this._entry,
|
this._searchPage = this._addPage(this._searchResults.actor, this._entry,
|
||||||
_("Search"), 'edit-find-symbolic');
|
_("Search"), 'edit-find-symbolic');
|
||||||
|
|
||||||
|
this._searchSettings = new Gio.Settings({ schema: Search.SEARCH_PROVIDERS_SCHEMA });
|
||||||
|
this._searchSettings.connect('changed::disabled', Lang.bind(this, this._reloadRemoteProviders));
|
||||||
|
this._searchSettings.connect('changed::disable-external', Lang.bind(this, this._reloadRemoteProviders));
|
||||||
|
this._searchSettings.connect('changed::sort-order', Lang.bind(this, this._reloadRemoteProviders));
|
||||||
|
|
||||||
// Default search providers
|
// Default search providers
|
||||||
// Wanda comes obviously first
|
// Wanda comes obviously first
|
||||||
this.addSearchProvider(new Wanda.WandaSearchProvider());
|
this.addSearchProvider(new Wanda.WandaSearchProvider());
|
||||||
@@ -144,15 +149,17 @@ const ViewSelector = new Lang.Class({
|
|||||||
this.constrainHeight = new Clutter.BindConstraint({ source: this._pageArea,
|
this.constrainHeight = new Clutter.BindConstraint({ source: this._pageArea,
|
||||||
coordinate: Clutter.BindCoordinate.HEIGHT });
|
coordinate: Clutter.BindCoordinate.HEIGHT });
|
||||||
|
|
||||||
global.display.add_keybinding('toggle-application-view',
|
Main.wm.addKeybinding('toggle-application-view',
|
||||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
||||||
Meta.KeyBindingFlags.NONE,
|
Meta.KeyBindingFlags.NONE,
|
||||||
Lang.bind(this, this._showWithAppsPage));
|
Main.KeybindingMode.NORMAL |
|
||||||
|
Main.KeybindingMode.OVERVIEW,
|
||||||
|
Lang.bind(this, this._toggleAppsPage));
|
||||||
},
|
},
|
||||||
|
|
||||||
_showWithAppsPage: function() {
|
_toggleAppsPage: function() {
|
||||||
Main.overview.show();
|
Main.overview.show();
|
||||||
this._showAppsButton.set_checked(true);
|
this._showAppsButton.checked = !this._showAppsButton.checked;
|
||||||
},
|
},
|
||||||
|
|
||||||
show: function() {
|
show: function() {
|
||||||
@@ -433,7 +440,32 @@ const ViewSelector = new Lang.Class({
|
|||||||
this._showPage(this._searchPage);
|
this._showPage(this._searchPage);
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_shouldUseSearchProvider: function(provider) {
|
||||||
|
// the disable-external GSetting only affects remote providers
|
||||||
|
if (!provider.isRemoteProvider)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
if (this._searchSettings.get_boolean('disable-external'))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
let appId = provider.appInfo.get_id();
|
||||||
|
let disable = this._searchSettings.get_strv('disabled');
|
||||||
|
return disable.indexOf(appId) == -1;
|
||||||
|
},
|
||||||
|
|
||||||
|
_reloadRemoteProviders: function() {
|
||||||
|
// removeSearchProvider() modifies the provider list we iterate on,
|
||||||
|
// so make a copy first
|
||||||
|
let remoteProviders = this._searchSystem.getRemoteProviders().slice(0);
|
||||||
|
|
||||||
|
remoteProviders.forEach(Lang.bind(this, this.removeSearchProvider));
|
||||||
|
RemoteSearch.loadRemoteSearchProviders(Lang.bind(this, this.addSearchProvider));
|
||||||
|
},
|
||||||
|
|
||||||
addSearchProvider: function(provider) {
|
addSearchProvider: function(provider) {
|
||||||
|
if (!this._shouldUseSearchProvider(provider))
|
||||||
|
return;
|
||||||
|
|
||||||
this._searchSystem.registerProvider(provider);
|
this._searchSystem.registerProvider(provider);
|
||||||
this._searchResults.createProviderMeta(provider);
|
this._searchResults.createProviderMeta(provider);
|
||||||
},
|
},
|
||||||
|
@@ -9,6 +9,7 @@ const St = imports.gi.St;
|
|||||||
const IconGrid = imports.ui.iconGrid;
|
const IconGrid = imports.ui.iconGrid;
|
||||||
const Layout = imports.ui.layout;
|
const Layout = imports.ui.layout;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
const Panel = imports.ui.panel;
|
||||||
const Search = imports.ui.search;
|
const Search = imports.ui.search;
|
||||||
|
|
||||||
// we could make these gsettings
|
// we could make these gsettings
|
||||||
@@ -53,20 +54,9 @@ const WandaIcon = new Lang.Class({
|
|||||||
icon_size: iconSize });
|
icon_size: iconSize });
|
||||||
}
|
}
|
||||||
|
|
||||||
this._animations = St.TextureCache.get_default().load_sliced_image(this._imageFile, this._imgWidth, this._imgHeight);
|
this._animations = new Panel.Animation(this._imageFile, this._imgWidth, this._imgHeight, FISH_SPEED);
|
||||||
this._animations.connect('notify::mapped', Lang.bind(this, function() {
|
this._animations.play();
|
||||||
if (this._animations.mapped && !this._timeoutId) {
|
return this._animations.actor;
|
||||||
this._timeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, FISH_SPEED, Lang.bind(this, this._update));
|
|
||||||
|
|
||||||
this._i = 0;
|
|
||||||
this._update();
|
|
||||||
} else if (!this._animations.mapped && this._timeoutId) {
|
|
||||||
GLib.source_remove(this._timeoutId);
|
|
||||||
this._timeoutId = 0;
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
|
|
||||||
return this._animations;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_createIconTexture: function(size) {
|
_createIconTexture: function(size) {
|
||||||
@@ -74,20 +64,7 @@ const WandaIcon = new Lang.Class({
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this.parent(size);
|
this.parent(size);
|
||||||
},
|
|
||||||
|
|
||||||
_update: function() {
|
|
||||||
let n = this._animations.get_n_children();
|
|
||||||
if (n == 0) {
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this._animations.get_child_at_index(this._i).hide();
|
|
||||||
this._i = (this._i + 1) % n;
|
|
||||||
this._animations.get_child_at_index(this._i).show();
|
|
||||||
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
const WandaIconBin = new Lang.Class({
|
const WandaIconBin = new Lang.Class({
|
||||||
|
@@ -12,7 +12,6 @@ const AltTab = imports.ui.altTab;
|
|||||||
const WorkspaceSwitcherPopup = imports.ui.workspaceSwitcherPopup;
|
const WorkspaceSwitcherPopup = imports.ui.workspaceSwitcherPopup;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
const Util = imports.misc.util;
|
|
||||||
|
|
||||||
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
|
const SHELL_KEYBINDINGS_SCHEMA = 'org.gnome.shell.keybindings';
|
||||||
const WINDOW_ANIMATION_TIME = 0.25;
|
const WINDOW_ANIMATION_TIME = 0.25;
|
||||||
@@ -84,6 +83,8 @@ const WindowManager = new Lang.Class({
|
|||||||
|
|
||||||
this._animationBlockCount = 0;
|
this._animationBlockCount = 0;
|
||||||
|
|
||||||
|
this._allowedKeybindings = {};
|
||||||
|
|
||||||
this._switchData = null;
|
this._switchData = null;
|
||||||
this._shellwm.connect('kill-switch-workspace', Lang.bind(this, this._switchWorkspaceDone));
|
this._shellwm.connect('kill-switch-workspace', Lang.bind(this, this._switchWorkspaceDone));
|
||||||
this._shellwm.connect('kill-window-effects', Lang.bind(this, function (shellwm, actor) {
|
this._shellwm.connect('kill-window-effects', Lang.bind(this, function (shellwm, actor) {
|
||||||
@@ -100,37 +101,65 @@ const WindowManager = new Lang.Class({
|
|||||||
this._shellwm.connect('unmaximize', Lang.bind(this, this._unmaximizeWindow));
|
this._shellwm.connect('unmaximize', Lang.bind(this, this._unmaximizeWindow));
|
||||||
this._shellwm.connect('map', Lang.bind(this, this._mapWindow));
|
this._shellwm.connect('map', Lang.bind(this, this._mapWindow));
|
||||||
this._shellwm.connect('destroy', Lang.bind(this, this._destroyWindow));
|
this._shellwm.connect('destroy', Lang.bind(this, this._destroyWindow));
|
||||||
|
this._shellwm.connect('filter-keybinding', Lang.bind(this, this._filterKeybinding));
|
||||||
|
|
||||||
this._workspaceSwitcherPopup = null;
|
this._workspaceSwitcherPopup = null;
|
||||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-to-workspace-left',
|
this.setCustomKeybindingHandler('switch-to-workspace-left',
|
||||||
Util.wrapKeybinding(Lang.bind(this, this._showWorkspaceSwitcher), true));
|
Main.KeybindingMode.NORMAL |
|
||||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-to-workspace-right',
|
Main.KeybindingMode.OVERVIEW,
|
||||||
Util.wrapKeybinding(Lang.bind(this, this._showWorkspaceSwitcher), true));
|
|
||||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-to-workspace-up',
|
|
||||||
Util.wrapKeybinding(Lang.bind(this, this._showWorkspaceSwitcher), true));
|
|
||||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-to-workspace-down',
|
|
||||||
Util.wrapKeybinding(Lang.bind(this, this._showWorkspaceSwitcher), true));
|
|
||||||
Meta.keybindings_set_custom_handler('internal-keybinding-move-to-workspace-left',
|
|
||||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||||
Meta.keybindings_set_custom_handler('internal-keybinding-move-to-workspace-right',
|
this.setCustomKeybindingHandler('switch-to-workspace-right',
|
||||||
|
Main.KeybindingMode.NORMAL |
|
||||||
|
Main.KeybindingMode.OVERVIEW,
|
||||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||||
Meta.keybindings_set_custom_handler('internal-keybinding-move-to-workspace-up',
|
this.setCustomKeybindingHandler('switch-to-workspace-up',
|
||||||
|
Main.KeybindingMode.NORMAL |
|
||||||
|
Main.KeybindingMode.OVERVIEW,
|
||||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||||
Meta.keybindings_set_custom_handler('internal-keybinding-move-to-workspace-down',
|
this.setCustomKeybindingHandler('switch-to-workspace-down',
|
||||||
|
Main.KeybindingMode.NORMAL |
|
||||||
|
Main.KeybindingMode.OVERVIEW,
|
||||||
Lang.bind(this, this._showWorkspaceSwitcher));
|
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-windows',
|
this.setCustomKeybindingHandler('move-to-workspace-left',
|
||||||
|
Main.KeybindingMode.NORMAL |
|
||||||
|
Main.KeybindingMode.OVERVIEW,
|
||||||
|
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||||
|
this.setCustomKeybindingHandler('move-to-workspace-right',
|
||||||
|
Main.KeybindingMode.NORMAL |
|
||||||
|
Main.KeybindingMode.OVERVIEW,
|
||||||
|
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||||
|
this.setCustomKeybindingHandler('move-to-workspace-up',
|
||||||
|
Main.KeybindingMode.NORMAL |
|
||||||
|
Main.KeybindingMode.OVERVIEW,
|
||||||
|
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||||
|
this.setCustomKeybindingHandler('move-to-workspace-down',
|
||||||
|
Main.KeybindingMode.NORMAL |
|
||||||
|
Main.KeybindingMode.OVERVIEW,
|
||||||
|
Lang.bind(this, this._showWorkspaceSwitcher));
|
||||||
|
this.setCustomKeybindingHandler('switch-windows',
|
||||||
|
Main.KeybindingMode.NORMAL,
|
||||||
Lang.bind(this, this._startAppSwitcher));
|
Lang.bind(this, this._startAppSwitcher));
|
||||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-group',
|
this.setCustomKeybindingHandler('switch-group',
|
||||||
|
Main.KeybindingMode.NORMAL,
|
||||||
Lang.bind(this, this._startAppSwitcher));
|
Lang.bind(this, this._startAppSwitcher));
|
||||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-windows-backward',
|
this.setCustomKeybindingHandler('switch-windows-backward',
|
||||||
|
Main.KeybindingMode.NORMAL,
|
||||||
Lang.bind(this, this._startAppSwitcher));
|
Lang.bind(this, this._startAppSwitcher));
|
||||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-group-backward',
|
this.setCustomKeybindingHandler('switch-group-backward',
|
||||||
|
Main.KeybindingMode.NORMAL,
|
||||||
Lang.bind(this, this._startAppSwitcher));
|
Lang.bind(this, this._startAppSwitcher));
|
||||||
Meta.keybindings_set_custom_handler('internal-keybinding-switch-panels',
|
this.setCustomKeybindingHandler('switch-panels',
|
||||||
Util.wrapKeybinding(Lang.bind(this, this._startA11ySwitcher), true));
|
Main.KeybindingMode.NORMAL |
|
||||||
global.display.add_keybinding('open-application-menu',
|
Main.KeybindingMode.OVERVIEW |
|
||||||
|
Main.KeybindingMode.LOCK_SCREEN |
|
||||||
|
Main.KeybindingMode.UNLOCK_SCREEN |
|
||||||
|
Main.KeybindingMode.LOGIN_SCREEN,
|
||||||
|
Lang.bind(this, this._startA11ySwitcher));
|
||||||
|
|
||||||
|
this.addKeybinding('open-application-menu',
|
||||||
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
new Gio.Settings({ schema: SHELL_KEYBINDINGS_SCHEMA }),
|
||||||
Meta.KeyBindingFlags.NONE,
|
Meta.KeyBindingFlags.NONE,
|
||||||
|
Main.KeybindingMode.NORMAL,
|
||||||
Lang.bind(this, this._openAppMenu));
|
Lang.bind(this, this._openAppMenu));
|
||||||
|
|
||||||
Main.overview.connect('showing', Lang.bind(this, function() {
|
Main.overview.connect('showing', Lang.bind(this, function() {
|
||||||
@@ -143,6 +172,25 @@ const WindowManager = new Lang.Class({
|
|||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
setCustomKeybindingHandler: function(name, modes, handler) {
|
||||||
|
if (Meta.keybindings_set_custom_handler(name, handler))
|
||||||
|
this.allowKeybinding(name, modes);
|
||||||
|
},
|
||||||
|
|
||||||
|
addKeybinding: function(name, settings, flags, modes, handler) {
|
||||||
|
if (global.display.add_keybinding(name, settings, flags, handler))
|
||||||
|
this.allowKeybinding(name, modes);
|
||||||
|
},
|
||||||
|
|
||||||
|
removeKeybinding: function(name) {
|
||||||
|
if (global.display.remove_keybinding(name))
|
||||||
|
this.allowKeybinding(name, Main.KeybindingMode.NONE);
|
||||||
|
},
|
||||||
|
|
||||||
|
allowKeybinding: function(name, modes) {
|
||||||
|
this._allowedKeybindings[name] = modes;
|
||||||
|
},
|
||||||
|
|
||||||
blockAnimations: function() {
|
blockAnimations: function() {
|
||||||
this._animationBlockCount++;
|
this._animationBlockCount++;
|
||||||
},
|
},
|
||||||
@@ -425,6 +473,21 @@ const WindowManager = new Lang.Class({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_filterKeybinding: function(shellwm, binding) {
|
||||||
|
if (Main.keybindingMode == Main.KeybindingMode.NONE)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
// There's little sense in implementing a keybinding in mutter and
|
||||||
|
// not having it work in NORMAL mode; handle this case generically
|
||||||
|
// so we don't have to explicitly allow all builtin keybindings in
|
||||||
|
// NORMAL mode.
|
||||||
|
if (Main.keybindingMode == Main.KeybindingMode.NORMAL &&
|
||||||
|
binding.is_builtin())
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return !(this._allowedKeybindings[binding.get_name()] & Main.keybindingMode);
|
||||||
|
},
|
||||||
|
|
||||||
_switchWorkspace : function(shellwm, from, to, direction) {
|
_switchWorkspace : function(shellwm, from, to, direction) {
|
||||||
if (!this._shouldAnimate()) {
|
if (!this._shouldAnimate()) {
|
||||||
shellwm.completed_switch_workspace();
|
shellwm.completed_switch_workspace();
|
||||||
@@ -553,32 +616,30 @@ const WindowManager = new Lang.Class({
|
|||||||
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
|
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
|
||||||
if (!tabPopup.show(backwards, binding.get_name(), binding.get_mask()))
|
if (!tabPopup.show(backwards, binding.get_name(), binding.get_mask()))
|
||||||
tabPopup.destroy();
|
tabPopup.destroy();
|
||||||
return true;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_startA11ySwitcher : function(display, screen, window, binding) {
|
_startA11ySwitcher : function(display, screen, window, binding) {
|
||||||
let modifiers = binding.get_modifiers();
|
let modifiers = binding.get_modifiers();
|
||||||
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
|
let backwards = modifiers & Meta.VirtualModifier.SHIFT_MASK;
|
||||||
Main.ctrlAltTabManager.popup(backwards, binding.get_mask());
|
Main.ctrlAltTabManager.popup(backwards, binding.get_mask());
|
||||||
return true;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_openAppMenu : function(display, screen, window, event, binding) {
|
_openAppMenu : function(display, screen, window, event, binding) {
|
||||||
Main.panel.openAppMenu();
|
Main.panel.openAppMenu();
|
||||||
return true;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_showWorkspaceSwitcher : function(display, screen, window, binding) {
|
_showWorkspaceSwitcher : function(display, screen, window, binding) {
|
||||||
if (screen.n_workspaces == 1)
|
if (screen.n_workspaces == 1)
|
||||||
return false;
|
return;
|
||||||
|
|
||||||
let [,,action,,,direction] = binding.get_name().split('-');
|
let [action,,,direction] = binding.get_name().split('-');
|
||||||
let direction = Meta.MotionDirection[direction.toUpperCase()];
|
let direction = Meta.MotionDirection[direction.toUpperCase()];
|
||||||
let newWs;
|
let newWs;
|
||||||
|
|
||||||
|
|
||||||
if (direction != Meta.MotionDirection.UP &&
|
if (direction != Meta.MotionDirection.UP &&
|
||||||
direction != Meta.MotionDirection.DOWN)
|
direction != Meta.MotionDirection.DOWN)
|
||||||
return false;
|
return;
|
||||||
|
|
||||||
if (action == 'switch')
|
if (action == 'switch')
|
||||||
newWs = this.actionMoveWorkspace(direction);
|
newWs = this.actionMoveWorkspace(direction);
|
||||||
@@ -594,8 +655,6 @@ const WindowManager = new Lang.Class({
|
|||||||
}
|
}
|
||||||
this._workspaceSwitcherPopup.display(direction, newWs.index());
|
this._workspaceSwitcherPopup.display(direction, newWs.index());
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
actionMoveWorkspace: function(direction) {
|
actionMoveWorkspace: function(direction) {
|
||||||
|
@@ -30,9 +30,6 @@ const CLOSE_BUTTON_FADE_TIME = 0.1;
|
|||||||
|
|
||||||
const DRAGGING_WINDOW_OPACITY = 100;
|
const DRAGGING_WINDOW_OPACITY = 100;
|
||||||
|
|
||||||
const BUTTON_LAYOUT_SCHEMA = 'org.gnome.shell.overrides';
|
|
||||||
const BUTTON_LAYOUT_KEY = 'button-layout';
|
|
||||||
|
|
||||||
// When calculating a layout, we calculate the scale of windows and the percent
|
// When calculating a layout, we calculate the scale of windows and the percent
|
||||||
// of the available area the new layout uses. If the values for the new layout,
|
// of the available area the new layout uses. If the values for the new layout,
|
||||||
// when weighted with the values as below, are worse than the previous layout's,
|
// when weighted with the values as below, are worse than the previous layout's,
|
||||||
@@ -445,6 +442,9 @@ const WindowOverlay = new Lang.Class({
|
|||||||
this._parentActor = parentActor;
|
this._parentActor = parentActor;
|
||||||
this._hidden = false;
|
this._hidden = false;
|
||||||
|
|
||||||
|
this.borderSize = 0;
|
||||||
|
this.border = new St.Bin({ style_class: 'window-clone-border' });
|
||||||
|
|
||||||
let title = new St.Label({ style_class: 'window-caption',
|
let title = new St.Label({ style_class: 'window-caption',
|
||||||
text: metaWindow.title });
|
text: metaWindow.title });
|
||||||
title.clutter_text.ellipsize = Pango.EllipsizeMode.END;
|
title.clutter_text.ellipsize = Pango.EllipsizeMode.END;
|
||||||
@@ -482,11 +482,13 @@ const WindowOverlay = new Lang.Class({
|
|||||||
this.closeButton = button;
|
this.closeButton = button;
|
||||||
|
|
||||||
parentActor.add_actor(this.title);
|
parentActor.add_actor(this.title);
|
||||||
|
parentActor.add_actor(this.border);
|
||||||
parentActor.add_actor(this.closeButton);
|
parentActor.add_actor(this.closeButton);
|
||||||
title.connect('style-changed',
|
title.connect('style-changed',
|
||||||
Lang.bind(this, this._onStyleChanged));
|
Lang.bind(this, this._onStyleChanged));
|
||||||
button.connect('style-changed',
|
button.connect('style-changed',
|
||||||
Lang.bind(this, this._onStyleChanged));
|
Lang.bind(this, this._onStyleChanged));
|
||||||
|
this.border.connect('style-changed', Lang.bind(this, this._onStyleChanged));
|
||||||
// force a style change if we are already on a stage - otherwise
|
// force a style change if we are already on a stage - otherwise
|
||||||
// the signal will be emitted normally when we are added
|
// the signal will be emitted normally when we are added
|
||||||
if (parentActor.get_stage())
|
if (parentActor.get_stage())
|
||||||
@@ -495,15 +497,17 @@ const WindowOverlay = new Lang.Class({
|
|||||||
|
|
||||||
hide: function() {
|
hide: function() {
|
||||||
this._hidden = true;
|
this._hidden = true;
|
||||||
this.closeButton.hide();
|
|
||||||
this.title.hide();
|
this.title.hide();
|
||||||
|
|
||||||
|
this.hideCloseButton();
|
||||||
},
|
},
|
||||||
|
|
||||||
show: function() {
|
show: function() {
|
||||||
this._hidden = false;
|
this._hidden = false;
|
||||||
if (this._windowClone.actor.has_pointer)
|
|
||||||
this.closeButton.show();
|
|
||||||
this.title.show();
|
this.title.show();
|
||||||
|
if (this._windowClone.actor.has_pointer)
|
||||||
|
this._animateVisible();
|
||||||
},
|
},
|
||||||
|
|
||||||
fadeIn: function() {
|
fadeIn: function() {
|
||||||
@@ -520,10 +524,14 @@ const WindowOverlay = new Lang.Class({
|
|||||||
},
|
},
|
||||||
|
|
||||||
chromeHeights: function () {
|
chromeHeights: function () {
|
||||||
return [this.closeButton.height - this.closeButton._overlap,
|
return [Math.max(this.borderSize, this.closeButton.height - this.closeButton._overlap),
|
||||||
this.title.height + this.title._spacing];
|
this.title.height + this.title._spacing];
|
||||||
},
|
},
|
||||||
|
|
||||||
|
chromeWidths: function () {
|
||||||
|
return [this.borderSize, this.borderSize];
|
||||||
|
},
|
||||||
|
|
||||||
_repositionSelf: function() {
|
_repositionSelf: function() {
|
||||||
let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot;
|
let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot;
|
||||||
this.updatePositions(cloneX, cloneY, cloneWidth, cloneHeight, false);
|
this.updatePositions(cloneX, cloneY, cloneWidth, cloneHeight, false);
|
||||||
@@ -543,8 +551,8 @@ const WindowOverlay = new Lang.Class({
|
|||||||
let button = this.closeButton;
|
let button = this.closeButton;
|
||||||
let title = this.title;
|
let title = this.title;
|
||||||
|
|
||||||
let settings = new Gio.Settings({ schema: BUTTON_LAYOUT_SCHEMA });
|
let settings = new Gio.Settings({ schema: Main.sessionMode.buttonLayout[1] });
|
||||||
let layout = settings.get_string(BUTTON_LAYOUT_KEY);
|
let layout = settings.get_string(Main.sessionMode.buttonLayout[0]);
|
||||||
let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL;
|
let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL;
|
||||||
|
|
||||||
let split = layout.split(":");
|
let split = layout.split(":");
|
||||||
@@ -578,16 +586,32 @@ const WindowOverlay = new Lang.Class({
|
|||||||
title.width = titleWidth;
|
title.width = titleWidth;
|
||||||
title.set_position(Math.floor(titleX), Math.floor(titleY));
|
title.set_position(Math.floor(titleX), Math.floor(titleY));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let borderX = cloneX - this.borderSize;
|
||||||
|
let borderY = cloneY - this.borderSize;
|
||||||
|
let borderWidth = cloneWidth + 2 * this.borderSize;
|
||||||
|
let borderHeight = cloneHeight + 2 * this.borderSize;
|
||||||
|
|
||||||
|
if (animate) {
|
||||||
|
this._animateOverlayActor(this.border, borderX, borderY,
|
||||||
|
borderWidth, borderHeight);
|
||||||
|
} else {
|
||||||
|
this.border.set_position(borderX, borderY);
|
||||||
|
this.border.set_size(borderWidth, borderHeight);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_animateOverlayActor: function(actor, x, y, width) {
|
_animateOverlayActor: function(actor, x, y, width, height) {
|
||||||
Tweener.addTween(actor,
|
let params = { x: x,
|
||||||
{ x: x,
|
|
||||||
y: y,
|
y: y,
|
||||||
width: width,
|
width: width,
|
||||||
time: Overview.ANIMATION_TIME,
|
time: Overview.ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad'
|
transition: 'easeOutQuad' };
|
||||||
});
|
|
||||||
|
if (height !== undefined)
|
||||||
|
params.height = height;
|
||||||
|
|
||||||
|
Tweener.addTween(actor, params);
|
||||||
},
|
},
|
||||||
|
|
||||||
_closeWindow: function(actor) {
|
_closeWindow: function(actor) {
|
||||||
@@ -630,6 +654,43 @@ const WindowOverlay = new Lang.Class({
|
|||||||
this._windowClone.metaWindow.disconnect(this._updateCaptionId);
|
this._windowClone.metaWindow.disconnect(this._updateCaptionId);
|
||||||
this.title.destroy();
|
this.title.destroy();
|
||||||
this.closeButton.destroy();
|
this.closeButton.destroy();
|
||||||
|
this.border.destroy();
|
||||||
|
},
|
||||||
|
|
||||||
|
_animateVisible: function() {
|
||||||
|
this._parentActor.raise_top();
|
||||||
|
|
||||||
|
this.closeButton.show();
|
||||||
|
this.closeButton.opacity = 0;
|
||||||
|
Tweener.addTween(this.closeButton,
|
||||||
|
{ opacity: 255,
|
||||||
|
time: CLOSE_BUTTON_FADE_TIME,
|
||||||
|
transition: 'easeOutQuad' });
|
||||||
|
|
||||||
|
this.border.show();
|
||||||
|
this.border.opacity = 0;
|
||||||
|
Tweener.addTween(this.border,
|
||||||
|
{ opacity: 255,
|
||||||
|
time: CLOSE_BUTTON_FADE_TIME,
|
||||||
|
transition: 'easeOutQuad' });
|
||||||
|
|
||||||
|
this.title.add_style_pseudo_class('hover');
|
||||||
|
},
|
||||||
|
|
||||||
|
_animateInvisible: function() {
|
||||||
|
this.closeButton.opacity = 255;
|
||||||
|
Tweener.addTween(this.closeButton,
|
||||||
|
{ opacity: 0,
|
||||||
|
time: CLOSE_BUTTON_FADE_TIME,
|
||||||
|
transition: 'easeInQuad' });
|
||||||
|
|
||||||
|
this.border.opacity = 255;
|
||||||
|
Tweener.addTween(this.border,
|
||||||
|
{ opacity: 0,
|
||||||
|
time: CLOSE_BUTTON_FADE_TIME,
|
||||||
|
transition: 'easeInQuad' });
|
||||||
|
|
||||||
|
this.title.remove_style_pseudo_class('hover');
|
||||||
},
|
},
|
||||||
|
|
||||||
_onEnter: function() {
|
_onEnter: function() {
|
||||||
@@ -639,8 +700,8 @@ const WindowOverlay = new Lang.Class({
|
|||||||
// are shown again
|
// are shown again
|
||||||
if (this._hidden)
|
if (this._hidden)
|
||||||
return;
|
return;
|
||||||
this._parentActor.raise_top();
|
|
||||||
this.closeButton.show();
|
this._animateVisible();
|
||||||
this.emit('show-close-button');
|
this.emit('show-close-button');
|
||||||
},
|
},
|
||||||
|
|
||||||
@@ -651,9 +712,10 @@ const WindowOverlay = new Lang.Class({
|
|||||||
|
|
||||||
_idleToggleCloseButton: function() {
|
_idleToggleCloseButton: function() {
|
||||||
this._idleToggleCloseId = 0;
|
this._idleToggleCloseId = 0;
|
||||||
|
|
||||||
if (!this._windowClone.actor.has_pointer &&
|
if (!this._windowClone.actor.has_pointer &&
|
||||||
!this.closeButton.has_pointer)
|
!this.closeButton.has_pointer)
|
||||||
this.closeButton.hide();
|
this._animateInvisible();
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
@@ -664,6 +726,8 @@ const WindowOverlay = new Lang.Class({
|
|||||||
this._idleToggleCloseId = 0;
|
this._idleToggleCloseId = 0;
|
||||||
}
|
}
|
||||||
this.closeButton.hide();
|
this.closeButton.hide();
|
||||||
|
this.border.hide();
|
||||||
|
this.title.remove_style_pseudo_class('hover');
|
||||||
},
|
},
|
||||||
|
|
||||||
_onStyleChanged: function() {
|
_onStyleChanged: function() {
|
||||||
@@ -673,6 +737,9 @@ const WindowOverlay = new Lang.Class({
|
|||||||
let closeNode = this.closeButton.get_theme_node();
|
let closeNode = this.closeButton.get_theme_node();
|
||||||
this.closeButton._overlap = closeNode.get_length('-shell-close-overlap');
|
this.closeButton._overlap = closeNode.get_length('-shell-close-overlap');
|
||||||
|
|
||||||
|
let borderNode = this.border.get_theme_node();
|
||||||
|
this.borderSize = borderNode.get_border_width(St.Side.TOP);
|
||||||
|
|
||||||
this._parentActor.queue_relayout();
|
this._parentActor.queue_relayout();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -1623,20 +1690,25 @@ const Workspace = new Lang.Class({
|
|||||||
return [];
|
return [];
|
||||||
|
|
||||||
let closeButtonHeight, captionHeight;
|
let closeButtonHeight, captionHeight;
|
||||||
|
let leftBorder, rightBorder;
|
||||||
if (this._windowOverlays.length) {
|
if (this._windowOverlays.length) {
|
||||||
// All of the overlays have the same chrome sizes,
|
// All of the overlays have the same chrome sizes,
|
||||||
// so just pick the first one.
|
// so just pick the first one.
|
||||||
let overlay = this._windowOverlays[0];
|
let overlay = this._windowOverlays[0];
|
||||||
[closeButtonHeight, captionHeight] = overlay.chromeHeights();
|
[closeButtonHeight, captionHeight] = overlay.chromeHeights();
|
||||||
|
[leftBorder, rightBorder] = overlay.chromeWidths();
|
||||||
} else {
|
} else {
|
||||||
[closeButtonHeight, captionHeight] = [0, 0];
|
[closeButtonHeight, captionHeight] = [0, 0];
|
||||||
}
|
}
|
||||||
|
|
||||||
rowSpacing += captionHeight;
|
rowSpacing += captionHeight;
|
||||||
|
columnSpacing += rightBorder;
|
||||||
|
|
||||||
let area = { x: this._x, y: this._y, width: this._width, height: this._height };
|
let area = { x: this._x, y: this._y, width: this._width, height: this._height };
|
||||||
area.y += closeButtonHeight;
|
area.y += closeButtonHeight;
|
||||||
area.height -= closeButtonHeight;
|
area.height -= closeButtonHeight;
|
||||||
|
area.x += leftBorder;
|
||||||
|
area.width -= leftBorder;
|
||||||
|
|
||||||
if (!this._currentLayout)
|
if (!this._currentLayout)
|
||||||
this._currentLayout = this._computeLayout(windows, area, rowSpacing, columnSpacing, captionHeight);
|
this._currentLayout = this._computeLayout(windows, area, rowSpacing, columnSpacing, captionHeight);
|
||||||
|
@@ -128,8 +128,11 @@ const WorkspacesView = new Lang.Class({
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
let ws = new Workspace.Workspace(null, i);
|
let ws = new Workspace.Workspace(null, i);
|
||||||
ws.setGeometry(monitors[i].x, monitors[i].y,
|
let overviewSpacing = Main.overview._spacing;
|
||||||
monitors[i].width, monitors[i].height);
|
ws.setGeometry(monitors[i].x + overviewSpacing/2,
|
||||||
|
monitors[i].y + overviewSpacing/2,
|
||||||
|
monitors[i].width - overviewSpacing,
|
||||||
|
monitors[i].height - overviewSpacing);
|
||||||
global.overlay_group.add_actor(ws.actor);
|
global.overlay_group.add_actor(ws.actor);
|
||||||
this._extraWorkspaces.push(ws);
|
this._extraWorkspaces.push(ws);
|
||||||
}
|
}
|
||||||
@@ -863,8 +866,9 @@ const WorkspacesDisplay = new Lang.Class({
|
|||||||
let clipX = rtl ? x + controlsVisible : x;
|
let clipX = rtl ? x + controlsVisible : x;
|
||||||
let clipY = y + (fullHeight - clipHeight) / 2;
|
let clipY = y + (fullHeight - clipHeight) / 2;
|
||||||
|
|
||||||
|
let overviewSpacing = Main.overview._spacing;
|
||||||
let widthAdjust = this._zoomOut ? controlsNatural : controlsVisible;
|
let widthAdjust = this._zoomOut ? controlsNatural : controlsVisible;
|
||||||
widthAdjust += Main.overview._spacing;
|
widthAdjust += overviewSpacing;
|
||||||
width -= widthAdjust;
|
width -= widthAdjust;
|
||||||
if (rtl)
|
if (rtl)
|
||||||
x += widthAdjust;
|
x += widthAdjust;
|
||||||
@@ -882,10 +886,10 @@ const WorkspacesDisplay = new Lang.Class({
|
|||||||
monitors[i].y,
|
monitors[i].y,
|
||||||
monitors[i].width,
|
monitors[i].width,
|
||||||
monitors[i].height);
|
monitors[i].height);
|
||||||
this._workspacesViews[m].setGeometry(monitors[i].x,
|
this._workspacesViews[m].setGeometry(monitors[i].x + overviewSpacing/2,
|
||||||
monitors[i].y,
|
monitors[i].y + overviewSpacing/2,
|
||||||
monitors[i].width,
|
monitors[i].width - overviewSpacing,
|
||||||
monitors[i].height);
|
monitors[i].height - overviewSpacing);
|
||||||
m++;
|
m++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
158
po/et.po
158
po/et.po
@@ -13,8 +13,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: gnome-shell MASTER\n"
|
"Project-Id-Version: gnome-shell MASTER\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||||
"shell&keywords=I18N+L10N&component=general\n"
|
"shell&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2012-09-22 22:24+0000\n"
|
"POT-Creation-Date: 2012-11-16 18:27+0000\n"
|
||||||
"PO-Revision-Date: 2012-09-23 08:48+0300\n"
|
"PO-Revision-Date: 2012-11-16 20:40+0300\n"
|
||||||
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
|
"Last-Translator: Mattias Põldaru <mahfiaz@gmail.com>\n"
|
||||||
"Language-Team: Estonian <>\n"
|
"Language-Team: Estonian <>\n"
|
||||||
"Language: et\n"
|
"Language: et\n"
|
||||||
@@ -37,6 +37,15 @@ msgstr "Arvuti"
|
|||||||
msgid "Show the message tray"
|
msgid "Show the message tray"
|
||||||
msgstr "Teateala näitamine"
|
msgstr "Teateala näitamine"
|
||||||
|
|
||||||
|
msgid "Focus the active notification"
|
||||||
|
msgstr "Aktiivse märguande fokuseerimine"
|
||||||
|
|
||||||
|
msgid "Show all applications"
|
||||||
|
msgstr "Kõigi rakenduste kuvamine"
|
||||||
|
|
||||||
|
msgid "Open the application menu"
|
||||||
|
msgstr "Rakenduste menüü avamine"
|
||||||
|
|
||||||
msgid "GNOME Shell"
|
msgid "GNOME Shell"
|
||||||
msgstr "GNOME Shell"
|
msgstr "GNOME Shell"
|
||||||
|
|
||||||
@@ -116,6 +125,16 @@ msgstr ""
|
|||||||
"Kasutatakse kasutaja poolt viimati vahetult määratud kiirsuhtluse oleku "
|
"Kasutatakse kasutaja poolt viimati vahetult määratud kiirsuhtluse oleku "
|
||||||
"salvestamiseks. See väärtus pärineb GsmPresenceStatus nummerdusest."
|
"salvestamiseks. See väärtus pärineb GsmPresenceStatus nummerdusest."
|
||||||
|
|
||||||
|
msgid "Always show the 'Log out' menuitem in the user menu."
|
||||||
|
msgstr "Kasutajamenüüs näidatakse alati 'Logi välja' menüükirjet."
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
|
||||||
|
"user, single-session situations."
|
||||||
|
msgstr ""
|
||||||
|
"See võti keelab automaatse 'Logi välja' menüükirje peitmise, kui arvutis on "
|
||||||
|
"üks kasutaja ning avatud üks seanss."
|
||||||
|
|
||||||
msgid "Show the week date in the calendar"
|
msgid "Show the week date in the calendar"
|
||||||
msgstr "Kalendris näidatakse kuupäeva nädalavormingus"
|
msgstr "Kalendris näidatakse kuupäeva nädalavormingus"
|
||||||
|
|
||||||
@@ -128,12 +147,25 @@ msgstr "Rakenduste menüü avamise kiirklahv"
|
|||||||
msgid "Keybinding to open the application menu."
|
msgid "Keybinding to open the application menu."
|
||||||
msgstr "Kiirklahv rakenduste menüü avamiseks."
|
msgstr "Kiirklahv rakenduste menüü avamiseks."
|
||||||
|
|
||||||
|
msgid "Keybinding to open the \"Show Applications\" view"
|
||||||
|
msgstr "\"Rakenduste vaate\" avamise kiirklahv"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"Keybinding to open the \"Show Applications\" view of the Activities Overview."
|
||||||
|
msgstr "\"Rakenduste vaate\" avamise kiirklahv tegevuste ülevaates."
|
||||||
|
|
||||||
msgid "Keybinding to toggle the visibility of the message tray"
|
msgid "Keybinding to toggle the visibility of the message tray"
|
||||||
msgstr "Teateala nähtavuse muutmise kiirklahv"
|
msgstr "Teateala nähtavuse muutmise kiirklahv"
|
||||||
|
|
||||||
msgid "Keybinding to toggle the visibility of the message tray."
|
msgid "Keybinding to toggle the visibility of the message tray."
|
||||||
msgstr "Kiirklahv teateala nähtavuse muutmiseks."
|
msgstr "Kiirklahv teateala nähtavuse muutmiseks."
|
||||||
|
|
||||||
|
msgid "Keybinding to focus the active notification"
|
||||||
|
msgstr "Aktiivse teate fokuseerimise kiirklahv"
|
||||||
|
|
||||||
|
msgid "Keybinding to focus the active notification."
|
||||||
|
msgstr "Aktiivse teate fokuseerimise kiirklahv."
|
||||||
|
|
||||||
msgid "Keybinding to toggle the screen recorder"
|
msgid "Keybinding to toggle the screen recorder"
|
||||||
msgstr "Erkaanilindistaja lülitamise kiirklahv"
|
msgstr "Erkaanilindistaja lülitamise kiirklahv"
|
||||||
|
|
||||||
@@ -195,6 +227,34 @@ msgstr ""
|
|||||||
"konteinervormingusse salvestades tuleks ka sellele vormingule vastav laiend "
|
"konteinervormingusse salvestades tuleks ka sellele vormingule vastav laiend "
|
||||||
"määrata."
|
"määrata."
|
||||||
|
|
||||||
|
msgid "Attach modal dialog to the parent window"
|
||||||
|
msgstr "Modaaldialoog kuulub vanemakna juurde"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"This key overrides the key in org.gnome.mutter when running GNOME Shell."
|
||||||
|
msgstr ""
|
||||||
|
"See võti on ülimuslik võtme org.gnome.mutter suhtes, kui kasutatakse GNOME "
|
||||||
|
"Shelli."
|
||||||
|
|
||||||
|
msgid "Arrangement of buttons on the titlebar"
|
||||||
|
msgstr "Nuppude järjekord tiitliribal"
|
||||||
|
|
||||||
|
msgid ""
|
||||||
|
"This key overrides the key in org.gnome.desktop.wm.preferences when running "
|
||||||
|
"GNOME Shell."
|
||||||
|
msgstr ""
|
||||||
|
"See võti on ülimuslik võtme org.gnome.desktop.wm.preferences suhtes, kui "
|
||||||
|
"kasutatakse GNOME Shelli."
|
||||||
|
|
||||||
|
msgid "Enable edge tiling when dropping windows on screen edges"
|
||||||
|
msgstr "Akende lohistamisel ekraani serva lubatakse serva paigutamine"
|
||||||
|
|
||||||
|
msgid "Workspaces are managed dynamically"
|
||||||
|
msgstr "Tööalasid hallatakse dünaamiliselt"
|
||||||
|
|
||||||
|
msgid "Workspaces only on primary monitor"
|
||||||
|
msgstr "Tööalad peamisel monitoril"
|
||||||
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "There was an error loading the preferences dialog for %s:"
|
msgid "There was an error loading the preferences dialog for %s:"
|
||||||
msgstr "%s jaoks eelistuste dialoogi laadimisel esines viga:"
|
msgstr "%s jaoks eelistuste dialoogi laadimisel esines viga:"
|
||||||
@@ -225,9 +285,22 @@ msgctxt "button"
|
|||||||
msgid "Sign In"
|
msgid "Sign In"
|
||||||
msgstr "Logi sisse"
|
msgstr "Logi sisse"
|
||||||
|
|
||||||
|
msgid "Next"
|
||||||
|
msgstr "Järgmine"
|
||||||
|
|
||||||
|
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||||
|
#. is not visible here since we only care about phase2 authentication
|
||||||
|
#. (and don't even care of which one)
|
||||||
|
msgid "Username: "
|
||||||
|
msgstr "Kasutajanimi: "
|
||||||
|
|
||||||
msgid "Login Window"
|
msgid "Login Window"
|
||||||
msgstr "Sisselogimisaken"
|
msgstr "Sisselogimisaken"
|
||||||
|
|
||||||
|
#. Translators: accessible name of the power menu in the login screen
|
||||||
|
msgid "Power"
|
||||||
|
msgstr "Vool"
|
||||||
|
|
||||||
msgid "Suspend"
|
msgid "Suspend"
|
||||||
msgstr "Uinak"
|
msgstr "Uinak"
|
||||||
|
|
||||||
@@ -437,12 +510,6 @@ msgstr "Parool: "
|
|||||||
msgid "Key: "
|
msgid "Key: "
|
||||||
msgstr "Võti: "
|
msgstr "Võti: "
|
||||||
|
|
||||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
|
||||||
#. is not visible here since we only care about phase2 authentication
|
|
||||||
#. (and don't even care of which one)
|
|
||||||
msgid "Username: "
|
|
||||||
msgstr "Kasutajanimi: "
|
|
||||||
|
|
||||||
msgid "Identity: "
|
msgid "Identity: "
|
||||||
msgstr "Identiteet: "
|
msgstr "Identiteet: "
|
||||||
|
|
||||||
@@ -533,24 +600,27 @@ msgstr "Heli peale"
|
|||||||
msgid "Mute"
|
msgid "Mute"
|
||||||
msgstr "Heli maha"
|
msgstr "Heli maha"
|
||||||
|
|
||||||
#. Translators: this is a time format string followed by a date.
|
#. Translators: this is a time format string followed by the word "Yesterday". i.e. "14:30 on Yesterday"
|
||||||
#. If applicable, replace %X with a strftime format valid for your
|
|
||||||
#. locale, without seconds.
|
|
||||||
#, no-c-format
|
#, no-c-format
|
||||||
msgid "Sent at <b>%X</b> on <b>%A</b>"
|
msgid "<b>%H:%M</b> on Yesterday"
|
||||||
msgstr "Saadetud: <b>%A</b>, <b>%X</b>"
|
msgstr "Eile <b>%H:%M</b>"
|
||||||
|
|
||||||
#. Translators: this is a time format in the style of "Wednesday, May 25",
|
#. Translators: this is a time format string followed by a week day name. i.e. "14:30 on Monday
|
||||||
#. shown when you get a chat message in the same year.
|
|
||||||
#, no-c-format
|
#, no-c-format
|
||||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>"
|
msgid "<b>%H:%M</b> on <b>%A</b>"
|
||||||
msgstr "Saadeti <b>%A</b>, <b>%B %d</b>"
|
msgstr "<b>%H:%M</b>, <b>%A</b>"
|
||||||
|
|
||||||
#. Translators: this is a time format in the style of "Wednesday, May 25, 2012",
|
#. Translators: this is a time format in the style of "14:30 on Wednesday, May 25",
|
||||||
#. shown when you get a chat message in a different year.
|
#. shown when you get a chat message in the same year
|
||||||
#, no-c-format
|
#, no-c-format
|
||||||
msgid "Sent on <b>%A</b>, <b>%B %d</b>, %Y"
|
msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>"
|
||||||
msgstr "Saadeti <b>%A</b>, <b>%B %d</b>, %Y"
|
msgstr "<b>%H:%M</b>, <b>%A</b>, <b>%d. %B</b>"
|
||||||
|
|
||||||
|
#. Translators: this is a time format in the style of "14:30 on Wednesday, May 25, 2012",
|
||||||
|
#. shown when you get a chat message in a different year
|
||||||
|
#, no-c-format
|
||||||
|
msgid "<b>%H:%M</b> on <b>%A</b>, <b>%B</b> <b>%d</b>, %Y"
|
||||||
|
msgstr "<b>%H:%M</b>, <b>%A</b>, <b>%d. %B</b> %Y"
|
||||||
|
|
||||||
#. Translators: this is the other person changing their old IM name to their new
|
#. Translators: this is the other person changing their old IM name to their new
|
||||||
#. IM name.
|
#. IM name.
|
||||||
@@ -587,9 +657,6 @@ msgstr "%s tahab alustada videokõnet"
|
|||||||
msgid "Call from %s"
|
msgid "Call from %s"
|
||||||
msgstr "%s helistab"
|
msgstr "%s helistab"
|
||||||
|
|
||||||
msgid "Reject"
|
|
||||||
msgstr "Lükka tagasi"
|
|
||||||
|
|
||||||
#. translators: this is a button label (verb), not a noun
|
#. translators: this is a button label (verb), not a noun
|
||||||
msgid "Answer"
|
msgid "Answer"
|
||||||
msgstr "Vasta"
|
msgstr "Vasta"
|
||||||
@@ -897,8 +964,11 @@ msgstr "Ülemine riba"
|
|||||||
msgid "toggle-switch-us"
|
msgid "toggle-switch-us"
|
||||||
msgstr "toggle-switch-intl"
|
msgstr "toggle-switch-intl"
|
||||||
|
|
||||||
msgid "Please enter a command:"
|
msgid "Enter a Command"
|
||||||
msgstr "Palun sisesta käsk:"
|
msgstr "Palun sisesta käsk"
|
||||||
|
|
||||||
|
msgid "Close"
|
||||||
|
msgstr "Sulge"
|
||||||
|
|
||||||
#. Translators: This is a time format for a date in
|
#. Translators: This is a time format for a date in
|
||||||
#. long format
|
#. long format
|
||||||
@@ -1011,16 +1081,6 @@ msgstr "ühendumine..."
|
|||||||
msgid "Send Files..."
|
msgid "Send Files..."
|
||||||
msgstr "Failide saatmine..."
|
msgstr "Failide saatmine..."
|
||||||
|
|
||||||
msgid "Browse Files..."
|
|
||||||
msgstr "Failide sirvimine..."
|
|
||||||
|
|
||||||
msgid "Error browsing device"
|
|
||||||
msgstr "Viga seadme sirvimisel"
|
|
||||||
|
|
||||||
#, c-format
|
|
||||||
msgid "The requested device cannot be browsed, error is '%s'"
|
|
||||||
msgstr "Küsitud seadet pole võimalik sirvida, viga on '%s'"
|
|
||||||
|
|
||||||
msgid "Keyboard Settings"
|
msgid "Keyboard Settings"
|
||||||
msgstr "Klaviatuurisätted"
|
msgstr "Klaviatuurisätted"
|
||||||
|
|
||||||
@@ -1044,6 +1104,9 @@ msgstr "Luba alati"
|
|||||||
msgid "Grant this time only"
|
msgid "Grant this time only"
|
||||||
msgstr "Luba ainult seekord"
|
msgstr "Luba ainult seekord"
|
||||||
|
|
||||||
|
msgid "Reject"
|
||||||
|
msgstr "Lükka tagasi"
|
||||||
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Pairing confirmation for %s"
|
msgid "Pairing confirmation for %s"
|
||||||
msgstr "Paardumise kinnitus seadmele %s"
|
msgstr "Paardumise kinnitus seadmele %s"
|
||||||
@@ -1154,9 +1217,6 @@ msgstr "Juhtmeta"
|
|||||||
msgid "Mobile broadband"
|
msgid "Mobile broadband"
|
||||||
msgstr "Mobiiliühendus"
|
msgstr "Mobiiliühendus"
|
||||||
|
|
||||||
msgid "VPN Connections"
|
|
||||||
msgstr "VPN-ühendused"
|
|
||||||
|
|
||||||
msgid "Network Settings"
|
msgid "Network Settings"
|
||||||
msgstr "Võrgusätted"
|
msgstr "Võrgusätted"
|
||||||
|
|
||||||
@@ -1274,20 +1334,17 @@ msgstr "Eemal"
|
|||||||
msgid "Idle"
|
msgid "Idle"
|
||||||
msgstr "Jõude"
|
msgstr "Jõude"
|
||||||
|
|
||||||
msgid "Unavailable"
|
msgid "Offline"
|
||||||
msgstr "Pole saadaval"
|
msgstr "Ühendamata"
|
||||||
|
|
||||||
msgid "Switch User"
|
|
||||||
msgstr "Vaheta kasutajat"
|
|
||||||
|
|
||||||
msgid "Switch Session"
|
|
||||||
msgstr "Vaheta seanssi"
|
|
||||||
|
|
||||||
msgid "Notifications"
|
msgid "Notifications"
|
||||||
msgstr "Märguanded"
|
msgstr "Märguanded"
|
||||||
|
|
||||||
msgid "System Settings"
|
msgid "Settings"
|
||||||
msgstr "Süsteemi sätted"
|
msgstr "Sätted"
|
||||||
|
|
||||||
|
msgid "Switch User"
|
||||||
|
msgstr "Vaheta kasutajat"
|
||||||
|
|
||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "Logi välja"
|
msgstr "Logi välja"
|
||||||
@@ -1404,9 +1461,6 @@ msgstr "Kasutaja katkestas autentimisdialoogi"
|
|||||||
#~ msgid "If true, display date in the clock, in addition to time."
|
#~ msgid "If true, display date in the clock, in addition to time."
|
||||||
#~ msgstr "Kui määratud, siis kuvatakse kellaaja kõrval ka kuupäeva."
|
#~ msgstr "Kui määratud, siis kuvatakse kellaaja kõrval ka kuupäeva."
|
||||||
|
|
||||||
#~ msgid "Offline"
|
|
||||||
#~ msgstr "Ühendamata"
|
|
||||||
|
|
||||||
#~ msgid "CONTACTS"
|
#~ msgid "CONTACTS"
|
||||||
#~ msgstr "KONTAKTID"
|
#~ msgstr "KONTAKTID"
|
||||||
|
|
||||||
|
248
po/he.po
248
po/he.po
@@ -8,8 +8,8 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: gnome-shell master\n"
|
"Project-Id-Version: gnome-shell master\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2012-11-09 11:32+0200\n"
|
"POT-Creation-Date: 2012-11-23 10:13+0200\n"
|
||||||
"PO-Revision-Date: 2012-11-09 11:36+0200\n"
|
"PO-Revision-Date: 2012-11-23 10:14+0200\n"
|
||||||
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
|
"Last-Translator: Yaron Shahrabani <sh.yaron@gmail.com>\n"
|
||||||
"Language-Team: Hebrew <sh.yaron@gmail.com>\n"
|
"Language-Team: Hebrew <sh.yaron@gmail.com>\n"
|
||||||
"Language: he\n"
|
"Language: he\n"
|
||||||
@@ -244,11 +244,11 @@ msgstr "הרחבה"
|
|||||||
msgid "Select an extension to configure using the combobox above."
|
msgid "Select an extension to configure using the combobox above."
|
||||||
msgstr "יש לבחור את ההרחבה להגדרה באמצעות תיבת הבחירה המשולבת שלהלן."
|
msgstr "יש לבחור את ההרחבה להגדרה באמצעות תיבת הבחירה המשולבת שלהלן."
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:560
|
#: ../js/gdm/loginDialog.js:565
|
||||||
msgid "Session..."
|
msgid "Session..."
|
||||||
msgstr "הפעלה..."
|
msgstr "הפעלה..."
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:707
|
#: ../js/gdm/loginDialog.js:722
|
||||||
msgctxt "title"
|
msgctxt "title"
|
||||||
msgid "Sign In"
|
msgid "Sign In"
|
||||||
msgstr "כניסה"
|
msgstr "כניסה"
|
||||||
@@ -256,40 +256,40 @@ msgstr "כניסה"
|
|||||||
#. translators: this message is shown below the user list on the
|
#. translators: this message is shown below the user list on the
|
||||||
#. login screen. It can be activated to reveal an entry for
|
#. login screen. It can be activated to reveal an entry for
|
||||||
#. manually entering the username.
|
#. manually entering the username.
|
||||||
#: ../js/gdm/loginDialog.js:768
|
#: ../js/gdm/loginDialog.js:786
|
||||||
msgid "Not listed?"
|
msgid "Not listed?"
|
||||||
msgstr "לא רשום?"
|
msgstr "לא רשום?"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:912
|
#: ../js/gdm/loginDialog.js:962
|
||||||
#: ../js/ui/components/networkAgent.js:137
|
#: ../js/ui/components/networkAgent.js:137
|
||||||
#: ../js/ui/components/polkitAgent.js:162
|
#: ../js/ui/components/polkitAgent.js:162
|
||||||
#: ../js/ui/endSessionDialog.js:373
|
#: ../js/ui/endSessionDialog.js:373
|
||||||
#: ../js/ui/extensionDownloader.js:195
|
#: ../js/ui/extensionDownloader.js:195
|
||||||
#: ../js/ui/shellMountOperation.js:396
|
#: ../js/ui/shellMountOperation.js:396
|
||||||
#: ../js/ui/status/bluetooth.js:427
|
#: ../js/ui/status/bluetooth.js:413
|
||||||
#: ../js/ui/unlockDialog.js:171
|
#: ../js/ui/unlockDialog.js:179
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "ביטול"
|
msgstr "ביטול"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:917
|
#: ../js/gdm/loginDialog.js:978
|
||||||
msgctxt "button"
|
msgctxt "button"
|
||||||
msgid "Sign In"
|
msgid "Sign In"
|
||||||
msgstr "כניסה"
|
msgstr "כניסה"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:917
|
#: ../js/gdm/loginDialog.js:978
|
||||||
msgid "Next"
|
msgid "Next"
|
||||||
msgstr "הבא"
|
msgstr "הבא"
|
||||||
|
|
||||||
#. TTLS and PEAP are actually much more complicated, but this complication
|
#. TTLS and PEAP are actually much more complicated, but this complication
|
||||||
#. is not visible here since we only care about phase2 authentication
|
#. is not visible here since we only care about phase2 authentication
|
||||||
#. (and don't even care of which one)
|
#. (and don't even care of which one)
|
||||||
#: ../js/gdm/loginDialog.js:993
|
#: ../js/gdm/loginDialog.js:1086
|
||||||
#: ../js/ui/components/networkAgent.js:260
|
#: ../js/ui/components/networkAgent.js:260
|
||||||
#: ../js/ui/components/networkAgent.js:278
|
#: ../js/ui/components/networkAgent.js:278
|
||||||
msgid "Username: "
|
msgid "Username: "
|
||||||
msgstr "שם משתמש:"
|
msgstr "שם משתמש:"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:1289
|
#: ../js/gdm/loginDialog.js:1382
|
||||||
msgid "Login Window"
|
msgid "Login Window"
|
||||||
msgstr "חלון כניסה"
|
msgstr "חלון כניסה"
|
||||||
|
|
||||||
@@ -347,28 +347,28 @@ msgid "Execution of '%s' failed:"
|
|||||||
msgstr "ההרצה של '%s' נכשלה:"
|
msgstr "ההרצה של '%s' נכשלה:"
|
||||||
|
|
||||||
#. Translators: Filter to display all applications
|
#. Translators: Filter to display all applications
|
||||||
#: ../js/ui/appDisplay.js:252
|
#: ../js/ui/appDisplay.js:259
|
||||||
msgid "All"
|
msgid "All"
|
||||||
msgstr "הכול"
|
msgstr "הכול"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:310
|
#: ../js/ui/appDisplay.js:317
|
||||||
msgid "APPLICATIONS"
|
msgid "APPLICATIONS"
|
||||||
msgstr "יישומים"
|
msgstr "יישומים"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:370
|
#: ../js/ui/appDisplay.js:377
|
||||||
msgid "SETTINGS"
|
msgid "SETTINGS"
|
||||||
msgstr "הגדרות"
|
msgstr "הגדרות"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:675
|
#: ../js/ui/appDisplay.js:682
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "חלון חדש"
|
msgstr "חלון חדש"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:678
|
#: ../js/ui/appDisplay.js:685
|
||||||
#: ../js/ui/dash.js:289
|
#: ../js/ui/dash.js:289
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "הסרה מהמועדפים"
|
msgstr "הסרה מהמועדפים"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:679
|
#: ../js/ui/appDisplay.js:686
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "הוספה למועדפים"
|
msgstr "הוספה למועדפים"
|
||||||
|
|
||||||
@@ -644,7 +644,7 @@ msgid "Sorry, that didn't work. Please try again."
|
|||||||
msgstr "פעולה זו לא הצליחה, נא לנסות שוב. עמך הסליחה."
|
msgstr "פעולה זו לא הצליחה, נא לנסות שוב. עמך הסליחה."
|
||||||
|
|
||||||
#. Translators: this is a filename used for screencast recording
|
#. Translators: this is a filename used for screencast recording
|
||||||
#: ../js/ui/components/recorder.js:44
|
#: ../js/ui/components/recorder.js:48
|
||||||
#, no-c-format
|
#, no-c-format
|
||||||
msgid "Screencast from %d %t"
|
msgid "Screencast from %d %t"
|
||||||
msgstr "צילום מסך מהקובץ %d %t"
|
msgstr "צילום מסך מהקובץ %d %t"
|
||||||
@@ -1080,11 +1080,15 @@ msgstr "פתיחה"
|
|||||||
msgid "Remove"
|
msgid "Remove"
|
||||||
msgstr "הסרה"
|
msgstr "הסרה"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:1545
|
#: ../js/ui/messageTray.js:1552
|
||||||
|
msgid "No Messages"
|
||||||
|
msgstr "אין הודעות"
|
||||||
|
|
||||||
|
#: ../js/ui/messageTray.js:1569
|
||||||
msgid "Message Tray"
|
msgid "Message Tray"
|
||||||
msgstr "אזור דיווח ההודעות"
|
msgstr "אזור דיווח ההודעות"
|
||||||
|
|
||||||
#: ../js/ui/messageTray.js:2588
|
#: ../js/ui/messageTray.js:2639
|
||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "פרטי המערכת"
|
msgstr "פרטי המערכת"
|
||||||
|
|
||||||
@@ -1116,17 +1120,17 @@ msgstr "יש להקליד כדי לחפש..."
|
|||||||
msgid "Dash"
|
msgid "Dash"
|
||||||
msgstr "חלונית"
|
msgstr "חלונית"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:580
|
#: ../js/ui/panel.js:599
|
||||||
msgid "Quit"
|
msgid "Quit"
|
||||||
msgstr "יציאה"
|
msgstr "יציאה"
|
||||||
|
|
||||||
#. Translators: If there is no suitable word for "Activities"
|
#. Translators: If there is no suitable word for "Activities"
|
||||||
#. in your language, you can use the word for "Overview".
|
#. in your language, you can use the word for "Overview".
|
||||||
#: ../js/ui/panel.js:612
|
#: ../js/ui/panel.js:631
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "פעילויות"
|
msgstr "פעילויות"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:979
|
#: ../js/ui/panel.js:999
|
||||||
msgid "Top Bar"
|
msgid "Top Bar"
|
||||||
msgstr "הסרגל העליון"
|
msgstr "הסרגל העליון"
|
||||||
|
|
||||||
@@ -1169,6 +1173,11 @@ msgstr[0] "התרעה אחת"
|
|||||||
msgstr[1] "%d התרעות"
|
msgstr[1] "%d התרעות"
|
||||||
msgstr[2] "2 התרעות"
|
msgstr[2] "2 התרעות"
|
||||||
|
|
||||||
|
#: ../js/ui/screenShield.js:401
|
||||||
|
#: ../js/ui/userMenu.js:773
|
||||||
|
msgid "Lock"
|
||||||
|
msgstr "נעילה"
|
||||||
|
|
||||||
#: ../js/ui/searchDisplay.js:275
|
#: ../js/ui/searchDisplay.js:275
|
||||||
msgid "Searching..."
|
msgid "Searching..."
|
||||||
msgstr "בחיפוש..."
|
msgstr "בחיפוש..."
|
||||||
@@ -1202,66 +1211,64 @@ msgid "Remember Password"
|
|||||||
msgstr "שמירת הססמה"
|
msgstr "שמירת הססמה"
|
||||||
|
|
||||||
#: ../js/ui/shellMountOperation.js:400
|
#: ../js/ui/shellMountOperation.js:400
|
||||||
#: ../js/ui/unlockDialog.js:174
|
#: ../js/ui/unlockDialog.js:193
|
||||||
msgid "Unlock"
|
msgid "Unlock"
|
||||||
msgstr "שחרור"
|
msgstr "שחרור"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:39
|
#: ../js/ui/status/accessibility.js:40
|
||||||
msgid "Accessibility"
|
msgid "Accessibility"
|
||||||
msgstr "נגישות"
|
msgstr "נגישות"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:44
|
#: ../js/ui/status/accessibility.js:45
|
||||||
msgid "Zoom"
|
msgid "Zoom"
|
||||||
msgstr "תקריב"
|
msgstr "תקריב"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:51
|
#: ../js/ui/status/accessibility.js:52
|
||||||
msgid "Screen Reader"
|
msgid "Screen Reader"
|
||||||
msgstr "מקריא מסך"
|
msgstr "מקריא מסך"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:55
|
#: ../js/ui/status/accessibility.js:56
|
||||||
msgid "Screen Keyboard"
|
msgid "Screen Keyboard"
|
||||||
msgstr "מקלדת מסך"
|
msgstr "מקלדת מסך"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:59
|
#: ../js/ui/status/accessibility.js:60
|
||||||
msgid "Visual Alerts"
|
msgid "Visual Alerts"
|
||||||
msgstr "התראות חזותיות"
|
msgstr "התראות חזותיות"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:62
|
#: ../js/ui/status/accessibility.js:63
|
||||||
msgid "Sticky Keys"
|
msgid "Sticky Keys"
|
||||||
msgstr "מקשים דביקים"
|
msgstr "מקשים דביקים"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:65
|
#: ../js/ui/status/accessibility.js:66
|
||||||
msgid "Slow Keys"
|
msgid "Slow Keys"
|
||||||
msgstr "מקשים אטיים"
|
msgstr "מקשים אטיים"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:68
|
#: ../js/ui/status/accessibility.js:69
|
||||||
msgid "Bounce Keys"
|
msgid "Bounce Keys"
|
||||||
msgstr "מקשים קופצים"
|
msgstr "מקשים קופצים"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:71
|
#: ../js/ui/status/accessibility.js:72
|
||||||
msgid "Mouse Keys"
|
msgid "Mouse Keys"
|
||||||
msgstr "מקשי עכבר"
|
msgstr "מקשי עכבר"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:75
|
#: ../js/ui/status/accessibility.js:76
|
||||||
msgid "Universal Access Settings"
|
msgid "Universal Access Settings"
|
||||||
msgstr "הגדרות גישה אוניברסלית"
|
msgstr "הגדרות גישה אוניברסלית"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:109
|
#: ../js/ui/status/accessibility.js:112
|
||||||
msgid "High Contrast"
|
msgid "High Contrast"
|
||||||
msgstr "ניגודיות גבוהה"
|
msgstr "ניגודיות גבוהה"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:146
|
#: ../js/ui/status/accessibility.js:159
|
||||||
msgid "Large Text"
|
msgid "Large Text"
|
||||||
msgstr "טקסט גדול"
|
msgstr "טקסט גדול"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:27
|
#: ../js/ui/status/bluetooth.js:27
|
||||||
#: ../js/ui/status/bluetooth.js:31
|
#: ../js/ui/status/bluetooth.js:31
|
||||||
#: ../js/ui/status/bluetooth.js:251
|
#: ../js/ui/status/bluetooth.js:288
|
||||||
#: ../js/ui/status/bluetooth.js:304
|
#: ../js/ui/status/bluetooth.js:319
|
||||||
#: ../js/ui/status/bluetooth.js:335
|
#: ../js/ui/status/bluetooth.js:355
|
||||||
#: ../js/ui/status/bluetooth.js:371
|
#: ../js/ui/status/bluetooth.js:386
|
||||||
#: ../js/ui/status/bluetooth.js:400
|
|
||||||
#: ../js/ui/status/network.js:873
|
|
||||||
msgid "Bluetooth"
|
msgid "Bluetooth"
|
||||||
msgstr "Bluetooth"
|
msgstr "Bluetooth"
|
||||||
|
|
||||||
@@ -1283,7 +1290,7 @@ msgstr "הגדרות Bluetooth"
|
|||||||
|
|
||||||
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
|
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
|
||||||
#: ../js/ui/status/bluetooth.js:103
|
#: ../js/ui/status/bluetooth.js:103
|
||||||
#: ../js/ui/status/network.js:208
|
#: ../js/ui/status/network.js:169
|
||||||
msgid "hardware disabled"
|
msgid "hardware disabled"
|
||||||
msgstr "מנוטרל חומרתית"
|
msgstr "מנוטרל חומרתית"
|
||||||
|
|
||||||
@@ -1292,13 +1299,13 @@ msgid "Connection"
|
|||||||
msgstr "חיבור"
|
msgstr "חיבור"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:207
|
#: ../js/ui/status/bluetooth.js:207
|
||||||
#: ../js/ui/status/network.js:475
|
#: ../js/ui/status/network.js:436
|
||||||
msgid "disconnecting..."
|
msgid "disconnecting..."
|
||||||
msgstr "בהליכי ניתוק..."
|
msgstr "בהליכי ניתוק..."
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:220
|
#: ../js/ui/status/bluetooth.js:220
|
||||||
#: ../js/ui/status/network.js:481
|
#: ../js/ui/status/network.js:442
|
||||||
#: ../js/ui/status/network.js:1507
|
#: ../js/ui/status/network.js:1449
|
||||||
msgid "connecting..."
|
msgid "connecting..."
|
||||||
msgstr "בהתחברות..."
|
msgstr "בהתחברות..."
|
||||||
|
|
||||||
@@ -1306,88 +1313,77 @@ msgstr "בהתחברות..."
|
|||||||
msgid "Send Files..."
|
msgid "Send Files..."
|
||||||
msgstr "שליחת קבצים..."
|
msgstr "שליחת קבצים..."
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:243
|
#: ../js/ui/status/bluetooth.js:245
|
||||||
msgid "Browse Files..."
|
|
||||||
msgstr "עיון בקבצים..."
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:252
|
|
||||||
msgid "Error browsing device"
|
|
||||||
msgstr "שגיאה בעיון בהתקן"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:253
|
|
||||||
#, c-format
|
|
||||||
msgid "The requested device cannot be browsed, error is '%s'"
|
|
||||||
msgstr "לא ניתן לעיין בהתקן הנבחר, השגיאה היא '%s'"
|
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:261
|
|
||||||
msgid "Keyboard Settings"
|
msgid "Keyboard Settings"
|
||||||
msgstr "הגדרות מקלדת"
|
msgstr "הגדרות מקלדת"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:264
|
#: ../js/ui/status/bluetooth.js:248
|
||||||
msgid "Mouse Settings"
|
msgid "Mouse Settings"
|
||||||
msgstr "הגדרות עכבר"
|
msgstr "הגדרות עכבר"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:269
|
#: ../js/ui/status/bluetooth.js:253
|
||||||
#: ../js/ui/status/volume.js:234
|
#: ../js/ui/status/volume.js:234
|
||||||
msgid "Sound Settings"
|
msgid "Sound Settings"
|
||||||
msgstr "הגדרות שמע"
|
msgstr "הגדרות שמע"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:336
|
#: ../js/ui/status/bluetooth.js:320
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Authorization request from %s"
|
msgid "Authorization request from %s"
|
||||||
msgstr "בקשת אישור מאת %s"
|
msgstr "בקשת אישור מאת %s"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:342
|
#: ../js/ui/status/bluetooth.js:326
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Device %s wants access to the service '%s'"
|
msgid "Device %s wants access to the service '%s'"
|
||||||
msgstr "ההתקן %s מעוניין לגשת אל השירות '%s'"
|
msgstr "ההתקן %s מעוניין לגשת אל השירות '%s'"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:344
|
#: ../js/ui/status/bluetooth.js:328
|
||||||
msgid "Always grant access"
|
msgid "Always grant access"
|
||||||
msgstr "תמיד להעניק גישה"
|
msgstr "תמיד להעניק גישה"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:345
|
#: ../js/ui/status/bluetooth.js:329
|
||||||
msgid "Grant this time only"
|
msgid "Grant this time only"
|
||||||
msgstr "הענקת גישה הפעם בלבד"
|
msgstr "הענקת גישה הפעם בלבד"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:346
|
#: ../js/ui/status/bluetooth.js:330
|
||||||
msgid "Reject"
|
msgid "Reject"
|
||||||
msgstr "סירוב"
|
msgstr "סירוב"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:372
|
#. Translators: argument is the device short name
|
||||||
|
#: ../js/ui/status/bluetooth.js:357
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Pairing confirmation for %s"
|
msgid "Pairing confirmation for %s"
|
||||||
msgstr "אישור צימוד עבור %s"
|
msgstr "אישור צימוד עבור %s"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:378
|
#: ../js/ui/status/bluetooth.js:363
|
||||||
#: ../js/ui/status/bluetooth.js:408
|
#: ../js/ui/status/bluetooth.js:394
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Device %s wants to pair with this computer"
|
msgid "Device %s wants to pair with this computer"
|
||||||
msgstr "ההתקן %s מעוניין בצימוד עם מחשב זה"
|
msgstr "ההתקן %s מעוניין בצימוד עם מחשב זה"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:379
|
#: ../js/ui/status/bluetooth.js:364
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Please confirm whether the PIN '%06d' matches the one on the device."
|
msgid "Please confirm whether the PIN '%06d' matches the one on the device."
|
||||||
msgstr "נא לאשר האם קוד ה־PIN '%06d' תואם את זה שמופיע בהתקן."
|
msgstr "נא לאשר האם קוד ה־PIN '%06d' תואם את זה שמופיע בהתקן."
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:381
|
#. Translators: this is the verb, not the noun
|
||||||
|
#: ../js/ui/status/bluetooth.js:367
|
||||||
msgid "Matches"
|
msgid "Matches"
|
||||||
msgstr "התאמות"
|
msgstr "התאמות"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:382
|
#: ../js/ui/status/bluetooth.js:368
|
||||||
msgid "Does not match"
|
msgid "Does not match"
|
||||||
msgstr "אינו תואם"
|
msgstr "אינו תואם"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:401
|
#: ../js/ui/status/bluetooth.js:387
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Pairing request for %s"
|
msgid "Pairing request for %s"
|
||||||
msgstr "בקשת צימוד עבור %s"
|
msgstr "בקשת צימוד עבור %s"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:409
|
#: ../js/ui/status/bluetooth.js:395
|
||||||
msgid "Please enter the PIN mentioned on the device."
|
msgid "Please enter the PIN mentioned on the device."
|
||||||
msgstr "נא להזין את קוד ה־PIN המוזכר בהתקן."
|
msgstr "נא להזין את קוד ה־PIN המוזכר בהתקן."
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:426
|
#: ../js/ui/status/bluetooth.js:412
|
||||||
msgid "OK"
|
msgid "OK"
|
||||||
msgstr "אישור"
|
msgstr "אישור"
|
||||||
|
|
||||||
@@ -1403,122 +1399,114 @@ msgstr "הגדרות אזור ושפה"
|
|||||||
msgid "Volume, network, battery"
|
msgid "Volume, network, battery"
|
||||||
msgstr "עצמת שמע, רשת, סוללה"
|
msgstr "עצמת שמע, רשת, סוללה"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:94
|
#: ../js/ui/status/network.js:95
|
||||||
msgid "<unknown>"
|
msgid "<unknown>"
|
||||||
msgstr "<לא ידוע>"
|
msgstr "<לא ידוע>"
|
||||||
|
|
||||||
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
#. Translators: this indicates that wireless or wwan is disabled by hardware killswitch
|
||||||
#: ../js/ui/status/network.js:230
|
#: ../js/ui/status/network.js:191
|
||||||
msgid "disabled"
|
msgid "disabled"
|
||||||
msgstr "מנוטרל"
|
msgstr "מנוטרל"
|
||||||
|
|
||||||
#. Translators: this is for network devices that are physically present but are not
|
#. Translators: this is for network devices that are physically present but are not
|
||||||
#. under NetworkManager's control (and thus cannot be used in the menu)
|
#. under NetworkManager's control (and thus cannot be used in the menu)
|
||||||
#: ../js/ui/status/network.js:473
|
#: ../js/ui/status/network.js:434
|
||||||
msgid "unmanaged"
|
msgid "unmanaged"
|
||||||
msgstr "לא מנוהל"
|
msgstr "לא מנוהל"
|
||||||
|
|
||||||
#. Translators: this is for network connections that require some kind of key or password
|
#. Translators: this is for network connections that require some kind of key or password
|
||||||
#: ../js/ui/status/network.js:484
|
#: ../js/ui/status/network.js:445
|
||||||
#: ../js/ui/status/network.js:1510
|
#: ../js/ui/status/network.js:1452
|
||||||
msgid "authentication required"
|
msgid "authentication required"
|
||||||
msgstr "נדרש אימות"
|
msgstr "נדרש אימות"
|
||||||
|
|
||||||
#. Translators: this is for devices that require some kind of firmware or kernel
|
#. Translators: this is for devices that require some kind of firmware or kernel
|
||||||
#. module, which is missing
|
#. module, which is missing
|
||||||
#: ../js/ui/status/network.js:494
|
#: ../js/ui/status/network.js:455
|
||||||
msgid "firmware missing"
|
msgid "firmware missing"
|
||||||
msgstr "הקושחה חסרה"
|
msgstr "הקושחה חסרה"
|
||||||
|
|
||||||
#. Translators: this is for wired network devices that are physically disconnected
|
#. Translators: this is for wired network devices that are physically disconnected
|
||||||
#: ../js/ui/status/network.js:501
|
#: ../js/ui/status/network.js:462
|
||||||
msgid "cable unplugged"
|
msgid "cable unplugged"
|
||||||
msgstr "הכבל מנותק"
|
msgstr "הכבל מנותק"
|
||||||
|
|
||||||
#. Translators: this is for a network device that cannot be activated (for example it
|
#. Translators: this is for a network device that cannot be activated (for example it
|
||||||
#. is disabled by rfkill, or it has no coverage
|
#. is disabled by rfkill, or it has no coverage
|
||||||
#: ../js/ui/status/network.js:506
|
#: ../js/ui/status/network.js:467
|
||||||
msgid "unavailable"
|
msgid "unavailable"
|
||||||
msgstr "לא זמין"
|
msgstr "לא זמין"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:508
|
#: ../js/ui/status/network.js:469
|
||||||
#: ../js/ui/status/network.js:1512
|
#: ../js/ui/status/network.js:1454
|
||||||
msgid "connection failed"
|
msgid "connection failed"
|
||||||
msgstr "החיבור נכשל"
|
msgstr "החיבור נכשל"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:560
|
#: ../js/ui/status/network.js:525
|
||||||
#: ../js/ui/status/network.js:1446
|
#: ../js/ui/status/network.js:1388
|
||||||
#: ../js/ui/status/network.js:1588
|
#: ../js/ui/status/network.js:1530
|
||||||
msgid "More..."
|
msgid "More..."
|
||||||
msgstr "עוד..."
|
msgstr "עוד..."
|
||||||
|
|
||||||
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
||||||
#. and we cannot access its settings (including the name)
|
#. and we cannot access its settings (including the name)
|
||||||
#: ../js/ui/status/network.js:596
|
#: ../js/ui/status/network.js:561
|
||||||
#: ../js/ui/status/network.js:1376
|
#: ../js/ui/status/network.js:1318
|
||||||
msgid "Connected (private)"
|
msgid "Connected (private)"
|
||||||
msgstr "מחובר (פרטי)"
|
msgstr "מחובר (פרטי)"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:669
|
#: ../js/ui/status/network.js:615
|
||||||
msgid "Auto Ethernet"
|
msgid "Auto Ethernet"
|
||||||
msgstr "אתרנט אוטומטי"
|
msgstr "אתרנט אוטומטי"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:727
|
#: ../js/ui/status/network.js:673
|
||||||
msgid "Auto broadband"
|
msgid "Auto broadband"
|
||||||
msgstr "פס רחב אוטומטי"
|
msgstr "פס רחב אוטומטי"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:730
|
#: ../js/ui/status/network.js:676
|
||||||
msgid "Auto dial-up"
|
msgid "Auto dial-up"
|
||||||
msgstr "חיוג אוטומטי"
|
msgstr "חיוג אוטומטי"
|
||||||
|
|
||||||
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
|
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
|
||||||
#: ../js/ui/status/network.js:859
|
#: ../js/ui/status/network.js:805
|
||||||
#: ../js/ui/status/network.js:1393
|
#: ../js/ui/status/network.js:1335
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Auto %s"
|
msgid "Auto %s"
|
||||||
msgstr "%s אוטומטי"
|
msgstr "%s אוטומטי"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:861
|
#: ../js/ui/status/network.js:807
|
||||||
msgid "Auto bluetooth"
|
msgid "Auto bluetooth"
|
||||||
msgstr "Bluetooth אוטומטי"
|
msgstr "Bluetooth אוטומטי"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1395
|
#: ../js/ui/status/network.js:1337
|
||||||
msgid "Auto wireless"
|
msgid "Auto wireless"
|
||||||
msgstr "אלחוטי אוטומטי"
|
msgstr "אלחוטי אוטומטי"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1637
|
#: ../js/ui/status/network.js:1579
|
||||||
msgid "Enable networking"
|
msgid "Enable networking"
|
||||||
msgstr "הפעלת תכונת הרשת"
|
msgstr "הפעלת תכונת הרשת"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1659
|
#: ../js/ui/status/network.js:1611
|
||||||
msgid "Wired"
|
msgid "Wi-Fi"
|
||||||
msgstr "קווי"
|
msgstr "רשת אלחוטית"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1670
|
#: ../js/ui/status/network.js:1630
|
||||||
msgid "Wireless"
|
|
||||||
msgstr "אלחוטי"
|
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1680
|
|
||||||
msgid "Mobile broadband"
|
|
||||||
msgstr "פס־רחב נייד"
|
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1691
|
|
||||||
msgid "Network Settings"
|
msgid "Network Settings"
|
||||||
msgstr "הגדרות הרשת"
|
msgstr "הגדרות הרשת"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1735
|
#: ../js/ui/status/network.js:1674
|
||||||
msgid "Network Manager"
|
msgid "Network Manager"
|
||||||
msgstr "מנהל הרשתות"
|
msgstr "מנהל הרשתות"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1809
|
#: ../js/ui/status/network.js:1756
|
||||||
msgid "Connection failed"
|
msgid "Connection failed"
|
||||||
msgstr "ההתחברות נכשל"
|
msgstr "ההתחברות נכשל"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:1810
|
#: ../js/ui/status/network.js:1757
|
||||||
msgid "Activation of network connection failed"
|
msgid "Activation of network connection failed"
|
||||||
msgstr "הפעלת חיבור הרשת נכשלה"
|
msgstr "הפעלת חיבור הרשת נכשלה"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:2108
|
#: ../js/ui/status/network.js:2074
|
||||||
msgid "Networking is disabled"
|
msgid "Networking is disabled"
|
||||||
msgstr "תכונת הרשת מנוטרלת"
|
msgstr "תכונת הרשת מנוטרלת"
|
||||||
|
|
||||||
@@ -1634,10 +1622,14 @@ msgstr "עצמה"
|
|||||||
msgid "Microphone"
|
msgid "Microphone"
|
||||||
msgstr "מיקרופון"
|
msgstr "מיקרופון"
|
||||||
|
|
||||||
#: ../js/ui/unlockDialog.js:181
|
#: ../js/ui/unlockDialog.js:202
|
||||||
msgid "Log in as another user"
|
msgid "Log in as another user"
|
||||||
msgstr "כניסה בתור משתמש אחר"
|
msgstr "כניסה בתור משתמש אחר"
|
||||||
|
|
||||||
|
#: ../js/ui/unlockDialog.js:225
|
||||||
|
msgid "Unlock Window"
|
||||||
|
msgstr "שחרור החלון"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:176
|
#: ../js/ui/userMenu.js:176
|
||||||
msgid "Available"
|
msgid "Available"
|
||||||
msgstr "זמין"
|
msgstr "זמין"
|
||||||
@@ -1678,10 +1670,6 @@ msgstr "החלפת משתמש"
|
|||||||
msgid "Log Out"
|
msgid "Log Out"
|
||||||
msgstr "יציאה"
|
msgstr "יציאה"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:773
|
|
||||||
msgid "Lock"
|
|
||||||
msgstr "נעילה"
|
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:788
|
#: ../js/ui/userMenu.js:788
|
||||||
msgid "Install Updates & Restart"
|
msgid "Install Updates & Restart"
|
||||||
msgstr "התקנת עדכונים והפעלה מחדש"
|
msgstr "התקנת עדכונים והפעלה מחדש"
|
||||||
@@ -1798,6 +1786,24 @@ msgstr "בררת מחדל"
|
|||||||
msgid "Authentication dialog was dismissed by the user"
|
msgid "Authentication dialog was dismissed by the user"
|
||||||
msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
|
msgstr "המשתמש בחר להתעלם מתיבת דו־שיח האימות"
|
||||||
|
|
||||||
|
#~ msgid "Browse Files..."
|
||||||
|
#~ msgstr "עיון בקבצים..."
|
||||||
|
|
||||||
|
#~ msgid "Error browsing device"
|
||||||
|
#~ msgstr "שגיאה בעיון בהתקן"
|
||||||
|
|
||||||
|
#~ msgid "The requested device cannot be browsed, error is '%s'"
|
||||||
|
#~ msgstr "לא ניתן לעיין בהתקן הנבחר, השגיאה היא '%s'"
|
||||||
|
|
||||||
|
#~ msgid "Wired"
|
||||||
|
#~ msgstr "קווי"
|
||||||
|
|
||||||
|
#~ msgid "Wireless"
|
||||||
|
#~ msgstr "אלחוטי"
|
||||||
|
|
||||||
|
#~ msgid "Mobile broadband"
|
||||||
|
#~ msgstr "פס־רחב נייד"
|
||||||
|
|
||||||
#~ msgid "VPN Connections"
|
#~ msgid "VPN Connections"
|
||||||
#~ msgstr "חיבורי VPN"
|
#~ msgstr "חיבורי VPN"
|
||||||
|
|
||||||
|
111
po/ml.po
111
po/ml.po
@@ -11,15 +11,15 @@ msgstr ""
|
|||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
|
||||||
"cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
|
"cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
|
||||||
"POT-Creation-Date: 2012-09-20 16:11+0000\n"
|
"POT-Creation-Date: 2012-09-20 16:11+0000\n"
|
||||||
"PO-Revision-Date: 2012-09-20 22:56+0000\n"
|
"PO-Revision-Date: 2012-11-26 15:02+0530\n"
|
||||||
"Last-Translator: Ani Peter <apeter@redhat.com>\n"
|
"Last-Translator: Ani Peter <peter.ani@gmail.com>\n"
|
||||||
"Language-Team: Malayalam <discuss@lists.smc.org.in>\n"
|
"Language-Team: Malayalam <discuss@lists.smc.org.in>\n"
|
||||||
"Language: ml\n"
|
"Language: ml\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
|
||||||
"X-Generator: Lokalize 1.0\n"
|
"X-Generator: Lokalize 1.5\n"
|
||||||
"X-DamnedLies-Scope: partial\n"
|
"X-DamnedLies-Scope: partial\n"
|
||||||
|
|
||||||
#: ../data/50-gnome-shell-screenshot.xml.in.h:1
|
#: ../data/50-gnome-shell-screenshot.xml.in.h:1
|
||||||
@@ -61,7 +61,8 @@ msgstr "ഗ്നോം ഷെല് എക്സ്റ്റെന്ഷ
|
|||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:1
|
||||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Alt-F2-ല് ഡവലപ്പര്മാര്ക്കും ടെസ്റ്റേര്സിനും പ്രയോജനകരമായ ആന്തരിക പ്രയോഗങ്ങള് പ്രവര്ത്തന "
|
"Alt-F2-ല് ഡവലപ്പര്മാര്ക്കും ടെസ്റ്റേര്സിനും പ്രയോജനകരമായ ആന്തരിക "
|
||||||
|
"പ്രയോഗങ്ങള് പ്രവര്ത്തന "
|
||||||
"സജ്ജമാക്കുന്നു"
|
"സജ്ജമാക്കുന്നു"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:2
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:2
|
||||||
@@ -69,7 +70,8 @@ msgid ""
|
|||||||
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
||||||
"dialog."
|
"dialog."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Alt-F2 ഡയലോഗ് ഉപയോഗിച്ചു് ആന്തരിക ഡീബഗ്ഗിലേക്കും നീരീക്ഷണ പ്രയോഗങ്ങളിലേക്കും പ്രവേശനം "
|
"Alt-F2 ഡയലോഗ് ഉപയോഗിച്ചു് ആന്തരിക ഡീബഗ്ഗിലേക്കും നീരീക്ഷണ പ്രയോഗങ്ങളിലേക്കും "
|
||||||
|
"പ്രവേശനം "
|
||||||
"അനുവദിയ്ക്കുക."
|
"അനുവദിയ്ക്കുക."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
|
||||||
@@ -83,14 +85,19 @@ msgid ""
|
|||||||
"list. You can also manipulate this list with the EnableExtension and "
|
"list. You can also manipulate this list with the EnableExtension and "
|
||||||
"DisableExtension DBus methods on org.gnome.Shell."
|
"DisableExtension DBus methods on org.gnome.Shell."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"ഗ്നോം ഷെല് എക്സ്റ്റെന്ഷനുകള്ക്കു് ഒരു യുയുഐഡി വിശേഷതയുണ്ടു്; ലഭ്യമാക്കേണ്ട എക്സ്റ്റെന്ഷനുകള് ഈ കീ പട്ടിക "
|
"ഗ്നോം ഷെല് എക്സ്റ്റെന്ഷനുകള്ക്കു് ഒരു യുയുഐഡി വിശേഷതയുണ്ടു്; ലഭ്യമാക്കേണ്ട "
|
||||||
"ലഭ്യമാക്കുന്നു. ലഭ്യമാക്കേണ്ട ഏതു് എക്സ്റ്റെന്ഷനും ഈ പട്ടികയിലുണ്ടാവണം. org.gnome.Shell-ല് "
|
"എക്സ്റ്റെന്ഷനുകള് ഈ കീ പട്ടിക "
|
||||||
"നിങ്ങള്ക്കു് EnableExtension, DisableExtension എന്നീ ഡീബസ് രീതികളിലൂടെ ഈ പട്ടിക "
|
"ലഭ്യമാക്കുന്നു. ലഭ്യമാക്കേണ്ട ഏതു് എക്സ്റ്റെന്ഷനും ഈ പട്ടികയിലുണ്ടാവണം. "
|
||||||
|
"org.gnome.Shell-ല് "
|
||||||
|
"നിങ്ങള്ക്കു് EnableExtension, DisableExtension എന്നീ ഡീബസ് രീതികളിലൂടെ ഈ "
|
||||||
|
"പട്ടിക "
|
||||||
"കൈകാര്യം ചെയ്യുവാനും സാധിയ്ക്കുന്നു."
|
"കൈകാര്യം ചെയ്യുവാനും സാധിയ്ക്കുന്നു."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
|
||||||
msgid "Whether to collect stats about applications usage"
|
msgid "Whether to collect stats about applications usage"
|
||||||
msgstr "പ്രയോഗങ്ങളുടെ ഉപയോഗത്തെപ്പറ്റിയുള്ള സ്ഥിതിവിവരക്കണക്കുകള് ശേഖരിയ്ക്കണമോ എന്നു്"
|
msgstr ""
|
||||||
|
"പ്രയോഗങ്ങളുടെ ഉപയോഗത്തെപ്പറ്റിയുള്ള സ്ഥിതിവിവരക്കണക്കുകള് ശേഖരിയ്ക്കണമോ "
|
||||||
|
"എന്നു്"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6
|
||||||
msgid ""
|
msgid ""
|
||||||
@@ -99,9 +106,12 @@ msgid ""
|
|||||||
"want to disable this for privacy reasons. Please note that doing so won't "
|
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||||
"remove already saved data."
|
"remove already saved data."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"ഏറ്റവും കൂടുതല് തവണ ഉപയോഗിയ്ക്കുന്ന പ്രയോഗങ്ങള് ലഭ്യമാക്കുന്നതിനായി ഷെല് സാധാരണയായി സജീവമായ "
|
"ഏറ്റവും കൂടുതല് തവണ ഉപയോഗിയ്ക്കുന്ന പ്രയോഗങ്ങള് ലഭ്യമാക്കുന്നതിനായി ഷെല് "
|
||||||
"പ്രയോഗങ്ങളെ നിരീക്ഷിയ്ക്കുന്നു. (ഉദാഹരണത്തിനു്, ലോഞ്ചേര്സ്). ഈ ഡേറ്റാ സ്വകാര്യമായി "
|
"സാധാരണയായി സജീവമായ "
|
||||||
"സൂക്ഷിയ്ക്കുന്നെങ്കിലും, ചില കാരണങ്ങളാല് ഇതു് പ്രവര്ത്തന രഹിതമാക്കേണ്ടതുണ്ടു്. ഇങ്ങനെ ചെയ്യുന്നതു് "
|
"പ്രയോഗങ്ങളെ നിരീക്ഷിയ്ക്കുന്നു. (ഉദാഹരണത്തിനു്, ലോഞ്ചേര്സ്). ഈ ഡേറ്റാ "
|
||||||
|
"സ്വകാര്യമായി "
|
||||||
|
"സൂക്ഷിയ്ക്കുന്നെങ്കിലും, ചില കാരണങ്ങളാല് ഇതു് പ്രവര്ത്തന "
|
||||||
|
"രഹിതമാക്കേണ്ടതുണ്ടു്. ഇങ്ങനെ ചെയ്യുന്നതു് "
|
||||||
"നിങ്ങള് സൂക്ഷിച്ച ഡേറ്റയെ ബാധിയ്ക്കുന്നതല്ല."
|
"നിങ്ങള് സൂക്ഷിച്ച ഡേറ്റയെ ബാധിയ്ക്കുന്നതല്ല."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
|
||||||
@@ -112,7 +122,8 @@ msgstr "ഇഷ്ടമുള്ള പ്രയോഗങ്ങള്ക്
|
|||||||
msgid ""
|
msgid ""
|
||||||
"The applications corresponding to these identifiers will be displayed in the "
|
"The applications corresponding to these identifiers will be displayed in the "
|
||||||
"favorites area."
|
"favorites area."
|
||||||
msgstr "ഈ ഐഡന്റിഫയറുകള്ക്കുള്ള പ്രയോഗങ്ങള് ഉചിതമായ സ്ഥലങ്ങളില് കാണിയ്ക്കുന്നു."
|
msgstr ""
|
||||||
|
"ഈ ഐഡന്റിഫയറുകള്ക്കുള്ള പ്രയോഗങ്ങള് ഉചിതമായ സ്ഥലങ്ങളില് കാണിയ്ക്കുന്നു."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
|
||||||
msgid "History for command (Alt-F2) dialog"
|
msgid "History for command (Alt-F2) dialog"
|
||||||
@@ -127,7 +138,8 @@ msgid ""
|
|||||||
"Internally used to store the last IM presence explicitly set by the user. "
|
"Internally used to store the last IM presence explicitly set by the user. "
|
||||||
"The value here is from the TpConnectionPresenceType enumeration."
|
"The value here is from the TpConnectionPresenceType enumeration."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"ഉപയോക്താവു് സജ്ജമാക്കിയ അവസാന ഐഎം ആന്തരികമായി സൂക്ഷിയ്ക്കുന്നതിനു് ഉപയോഗിയ്ക്കുന്നു. മൂല്യം "
|
"ഉപയോക്താവു് സജ്ജമാക്കിയ അവസാന ഐഎം ആന്തരികമായി സൂക്ഷിയ്ക്കുന്നതിനു് "
|
||||||
|
"ഉപയോഗിയ്ക്കുന്നു. മൂല്യം "
|
||||||
"TpConnectionPresenceType തരത്തിലുള്ളതാകുന്നു."
|
"TpConnectionPresenceType തരത്തിലുള്ളതാകുന്നു."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
|
||||||
@@ -135,7 +147,8 @@ msgid ""
|
|||||||
"Internally used to store the last session presence status for the user. The "
|
"Internally used to store the last session presence status for the user. The "
|
||||||
"value here is from the GsmPresenceStatus enumeration."
|
"value here is from the GsmPresenceStatus enumeration."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"ഉപയോക്താവിനുള്ള അവസാന സെഷന് അവസ്ഥ ആന്തരികമായി സൂക്ഷിയ്ക്കുന്നതിനു് ഉപയോഗിയ്ക്കുന്നു. മൂല്യം "
|
"ഉപയോക്താവിനുള്ള അവസാന സെഷന് അവസ്ഥ ആന്തരികമായി സൂക്ഷിയ്ക്കുന്നതിനു് "
|
||||||
|
"ഉപയോഗിയ്ക്കുന്നു. മൂല്യം "
|
||||||
"GsmPresenceStatus തരത്തിലുള്ളതാകുന്നു."
|
"GsmPresenceStatus തരത്തിലുള്ളതാകുന്നു."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
||||||
@@ -168,7 +181,9 @@ msgstr "സ്ക്രീന് റിക്കോര്ഡര് ട
|
|||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:20
|
||||||
msgid "Keybinding to start/stop the builtin screen recorder."
|
msgid "Keybinding to start/stop the builtin screen recorder."
|
||||||
msgstr "ബിള്ട്ടിന് സ്ക്രീന് റിക്കോര്ഡര് തുടങ്ങുവാന്/നിര്ത്തുന്നതിനുള്ള കീക്കൂട്ടം."
|
msgstr ""
|
||||||
|
"ബിള്ട്ടിന് സ്ക്രീന് റിക്കോര്ഡര് തുടങ്ങുവാന്/നിര്ത്തുന്നതിനുള്ള "
|
||||||
|
"കീക്കൂട്ടം."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:21
|
||||||
msgid "Which keyboard to use"
|
msgid "Which keyboard to use"
|
||||||
@@ -187,7 +202,8 @@ msgid ""
|
|||||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||||
"screencast recorder in frames-per-second."
|
"screencast recorder in frames-per-second."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"ഗ്നോം ഷെല്ലിന്റെ സ്ക്രീന്കാസ്റ്റ് റിക്കോര്ഡര് റീക്കോര്ഡ് ചെയ്തിട്ടുള്ള സ്ക്രീന്കാസ്റ്റിന്റെ "
|
"ഗ്നോം ഷെല്ലിന്റെ സ്ക്രീന്കാസ്റ്റ് റിക്കോര്ഡര് റീക്കോര്ഡ് ചെയ്തിട്ടുള്ള "
|
||||||
|
"സ്ക്രീന്കാസ്റ്റിന്റെ "
|
||||||
"ഫ്രെയിംറേറ്റ്, ഒരു സെക്കന്ഡില് ഒരു ഫ്രെയിം."
|
"ഫ്രെയിംറേറ്റ്, ഒരു സെക്കന്ഡില് ഒരു ഫ്രെയിം."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:25
|
||||||
@@ -219,9 +235,12 @@ msgid ""
|
|||||||
"threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is "
|
"threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is "
|
||||||
"used as a placeholder for a guess at the optimal thread count on the system."
|
"used as a placeholder for a guess at the optimal thread count on the system."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"റിക്കോര്ഡിങുകള് എന്കോഡ് ചെയ്യുന്നതിനായി GStreamer പൈപ്പ് ലൈന് ഉപയോഗിയ്ക്കുന്നു. "
|
"റിക്കോര്ഡിങുകള് എന്കോഡ് ചെയ്യുന്നതിനായി GStreamer പൈപ്പ് ലൈന് "
|
||||||
"gst-launch-നുള്ള സിന്റാക്സ് ഉപയോഗിയ്ക്കുന്നു. കാലിയായി സജ്ജമാക്കുമ്പോള് കാലിയാകുന്നു."
|
"ഉപയോഗിയ്ക്കുന്നു. "
|
||||||
"ഇതു് നിലവില് 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 "
|
"gst-launch-നുള്ള സിന്റാക്സ് ഉപയോഗിയ്ക്കുന്നു. കാലിയായി സജ്ജമാക്കുമ്പോള് "
|
||||||
|
"കാലിയാകുന്നു."
|
||||||
|
"ഇതു് നിലവില് 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 "
|
||||||
|
"deadline=1000000 "
|
||||||
"threads=%T ! queue ! webmmux' ആകുന്നുസ WEBM VP8 കോഡ് ഉപയോഗിച്ചു് റിക്കോര്ഡ് "
|
"threads=%T ! queue ! webmmux' ആകുന്നുസ WEBM VP8 കോഡ് ഉപയോഗിച്ചു് റിക്കോര്ഡ് "
|
||||||
"ചെയ്യുന്നു."
|
"ചെയ്യുന്നു."
|
||||||
|
|
||||||
@@ -235,8 +254,10 @@ msgid ""
|
|||||||
"current date, and use this extension. It should be changed when recording to "
|
"current date, and use this extension. It should be changed when recording to "
|
||||||
"a different container format."
|
"a different container format."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"റിക്കോര്ഡ് ചെയ്ത സ്ക്രീന്കാസ്റ്റുകള്ക്കുള്ള ഫയല്നാമം നിലവിലുള്ള തീയതി, എക്സ്റ്റെന്ഷന് എന്നിവ "
|
"റിക്കോര്ഡ് ചെയ്ത സ്ക്രീന്കാസ്റ്റുകള്ക്കുള്ള ഫയല്നാമം നിലവിലുള്ള തീയതി, "
|
||||||
"അനുസരിച്ചാകുന്നു. മറ്റൊരു ശൈലിയിലേക്കു് റിക്കോര്ഡ് ചെയ്യുമ്പോള് ഇതു് മാറ്റണം."
|
"എക്സ്റ്റെന്ഷന് എന്നിവ "
|
||||||
|
"അനുസരിച്ചാകുന്നു. മറ്റൊരു ശൈലിയിലേക്കു് റിക്കോര്ഡ് ചെയ്യുമ്പോള് ഇതു് "
|
||||||
|
"മാറ്റണം."
|
||||||
|
|
||||||
#: ../js/extensionPrefs/main.js:124
|
#: ../js/extensionPrefs/main.js:124
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -249,7 +270,9 @@ msgstr "എക്സ്റ്റെന്ഷന്"
|
|||||||
|
|
||||||
#: ../js/extensionPrefs/main.js:188
|
#: ../js/extensionPrefs/main.js:188
|
||||||
msgid "Select an extension to configure using the combobox above."
|
msgid "Select an extension to configure using the combobox above."
|
||||||
msgstr "മുകളിലുള്ള കോമ്പോ ബോക്സ് ഉപയോഗിച്ചു് ക്രമീകരിയ്ക്കുന്നതിനുള്ളൊരു എക്സ്റ്റെന്ഷന് തെരഞ്ഞെടുക്കുക."
|
msgstr ""
|
||||||
|
"മുകളിലുള്ള കോമ്പോ ബോക്സ് ഉപയോഗിച്ചു് ക്രമീകരിയ്ക്കുന്നതിനുള്ളൊരു "
|
||||||
|
"എക്സ്റ്റെന്ഷന് തെരഞ്ഞെടുക്കുക."
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:526
|
#: ../js/gdm/loginDialog.js:526
|
||||||
msgid "Session..."
|
msgid "Session..."
|
||||||
@@ -578,7 +601,8 @@ msgid ""
|
|||||||
"Passwords or encryption keys are required to access the wireless network "
|
"Passwords or encryption keys are required to access the wireless network "
|
||||||
"'%s'."
|
"'%s'."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"വയര്ലെസ് നെറ്റ്വര്ക്ക് '%s'-ലേക്ക് പ്രവേശിക്കുന്നതിനായി രഹസ്യവാക്കുകള് അല്ലെങ്കില് എന്ക്രിപ്ഷന് കീകള് "
|
"വയര്ലെസ് നെറ്റ്വര്ക്ക് '%s'-ലേക്ക് പ്രവേശിക്കുന്നതിനായി രഹസ്യവാക്കുകള് "
|
||||||
|
"അല്ലെങ്കില് എന്ക്രിപ്ഷന് കീകള് "
|
||||||
"ആവശ്യമുണ്ടു്."
|
"ആവശ്യമുണ്ടു്."
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:314
|
#: ../js/ui/components/networkAgent.js:314
|
||||||
@@ -764,7 +788,8 @@ msgstr "%s നിങ്ങള്ക്കു് %s അയച്ചിരി
|
|||||||
#: ../js/ui/components/telepathyClient.js:1206
|
#: ../js/ui/components/telepathyClient.js:1206
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s would like permission to see when you are online"
|
msgid "%s would like permission to see when you are online"
|
||||||
msgstr "നിങ്ങള് ഓണ്ലൈന് ആകുമ്പോള് കാണുന്നതിനുള്ള അനുമതി %s-നു് ആവശ്യമുണ്ടു്"
|
msgstr ""
|
||||||
|
"നിങ്ങള് ഓണ്ലൈന് ആകുമ്പോള് കാണുന്നതിനുള്ള അനുമതി %s-നു് ആവശ്യമുണ്ടു്"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1298
|
#: ../js/ui/components/telepathyClient.js:1298
|
||||||
msgid "Network error"
|
msgid "Network error"
|
||||||
@@ -835,8 +860,11 @@ msgid "This account is already connected to the server"
|
|||||||
msgstr "ഈ അക്കൌണ്ട് നിലവില് സര്വറിലേക്കു് കണക്ട് ചെയ്തിരിയ്ക്കുന്നു"
|
msgstr "ഈ അക്കൌണ്ട് നിലവില് സര്വറിലേക്കു് കണക്ട് ചെയ്തിരിയ്ക്കുന്നു"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1332
|
#: ../js/ui/components/telepathyClient.js:1332
|
||||||
msgid "Connection has been replaced by a new connection using the same resource"
|
msgid ""
|
||||||
msgstr "അതേ ശ്രോതസ്സ് ഉപയോഗിച്ചു് ഒരു പുതിയ കണക്ഷന് ഉപയോഗിച്ചു് ഈ കണക്ഷന് മാറ്റിസ്ഥാപിയ്ക്കുന്നു"
|
"Connection has been replaced by a new connection using the same resource"
|
||||||
|
msgstr ""
|
||||||
|
"അതേ ശ്രോതസ്സ് ഉപയോഗിച്ചു് ഒരു പുതിയ കണക്ഷന് ഉപയോഗിച്ചു് ഈ കണക്ഷന് "
|
||||||
|
"മാറ്റിസ്ഥാപിയ്ക്കുന്നു"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1334
|
#: ../js/ui/components/telepathyClient.js:1334
|
||||||
msgid "The account already exists on the server"
|
msgid "The account already exists on the server"
|
||||||
@@ -851,15 +879,19 @@ msgid "Certificate has been revoked"
|
|||||||
msgstr "സമ്മതപത്രം വീണ്ടും ആവശ്യപ്പെട്ടിരിയ്ക്കുന്നു"
|
msgstr "സമ്മതപത്രം വീണ്ടും ആവശ്യപ്പെട്ടിരിയ്ക്കുന്നു"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1340
|
#: ../js/ui/components/telepathyClient.js:1340
|
||||||
msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
msgid ""
|
||||||
msgstr "സമ്മതപത്രം സുരക്ഷിതമല്ലാത്തൊരു സിഫര് ആല്ഗോരിഥം ഉപയോഗിയ്ക്കുന്നു അല്ലെങ്കില് ഉചിതമല്ല"
|
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||||
|
msgstr ""
|
||||||
|
"സമ്മതപത്രം സുരക്ഷിതമല്ലാത്തൊരു സിഫര് ആല്ഗോരിഥം ഉപയോഗിയ്ക്കുന്നു "
|
||||||
|
"അല്ലെങ്കില് ഉചിതമല്ല"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1342
|
#: ../js/ui/components/telepathyClient.js:1342
|
||||||
msgid ""
|
msgid ""
|
||||||
"The length of the server certificate, or the depth of the server certificate "
|
"The length of the server certificate, or the depth of the server certificate "
|
||||||
"chain, exceed the limits imposed by the cryptography library"
|
"chain, exceed the limits imposed by the cryptography library"
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"സര്വറിന്റെ സമ്മതപത്രത്തിന്റെ വ്യാപ്തി, അല്ലെങ്കില് സര്വര് സമ്മതപത്ര ചെയിന്റെ വ്യാപ്തി, എന്നിവ "
|
"സര്വറിന്റെ സമ്മതപത്രത്തിന്റെ വ്യാപ്തി, അല്ലെങ്കില് സര്വര് സമ്മതപത്ര "
|
||||||
|
"ചെയിന്റെ വ്യാപ്തി, എന്നിവ "
|
||||||
"പരിധിയില് കൂടുന്നു"
|
"പരിധിയില് കൂടുന്നു"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1344
|
#: ../js/ui/components/telepathyClient.js:1344
|
||||||
@@ -918,7 +950,8 @@ msgstr "പുറത്ത് കടക്കുക"
|
|||||||
#: ../js/ui/endSessionDialog.js:63
|
#: ../js/ui/endSessionDialog.js:63
|
||||||
msgid "Click Log Out to quit these applications and log out of the system."
|
msgid "Click Log Out to quit these applications and log out of the system."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"ഈ പ്രയോഗങ്ങളില് നിന്നും പുറത്തു് കടക്കുന്നതിനായി പുറത്തു കടക്കുക ക്ലിക്ക് ചെയ്തു് സിസ്റ്റത്തില് നിന്നും "
|
"ഈ പ്രയോഗങ്ങളില് നിന്നും പുറത്തു് കടക്കുന്നതിനായി പുറത്തു കടക്കുക ക്ലിക്ക് "
|
||||||
|
"ചെയ്തു് സിസ്റ്റത്തില് നിന്നും "
|
||||||
"പുറത്തു് കടക്കുക."
|
"പുറത്തു് കടക്കുക."
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:65
|
#: ../js/ui/endSessionDialog.js:65
|
||||||
@@ -952,7 +985,8 @@ msgstr "നിര്ത്തുക"
|
|||||||
#: ../js/ui/endSessionDialog.js:82
|
#: ../js/ui/endSessionDialog.js:82
|
||||||
msgid "Click Power Off to quit these applications and power off the system."
|
msgid "Click Power Off to quit these applications and power off the system."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"ഈ പ്രയോഗങ്ങളില് നിന്നും പുറത്തു് കടക്കുന്നതിനായി പവര് ഓഫ് ചെയ്യുക ക്ലിക്ക് ചെയ്തു സിസ്റ്റിന്റെ പവര് "
|
"ഈ പ്രയോഗങ്ങളില് നിന്നും പുറത്തു് കടക്കുന്നതിനായി പവര് ഓഫ് ചെയ്യുക ക്ലിക്ക് "
|
||||||
|
"ചെയ്തു സിസ്റ്റിന്റെ പവര് "
|
||||||
"ഓഫ് ചെയ്യുക."
|
"ഓഫ് ചെയ്യുക."
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:84
|
#: ../js/ui/endSessionDialog.js:84
|
||||||
@@ -983,7 +1017,8 @@ msgstr "പുനരാരംഭിക്കുക"
|
|||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:99
|
#: ../js/ui/endSessionDialog.js:99
|
||||||
msgid "Click Restart to quit these applications and restart the system."
|
msgid "Click Restart to quit these applications and restart the system."
|
||||||
msgstr "ഈ പ്രയോഗങ്ങള് നിറുത്തി സിസ്റ്റം പുനരാരംഭിക്കുവാന് പുനരാരംഭിക്കൂ അമര്ത്തുക"
|
msgstr ""
|
||||||
|
"ഈ പ്രയോഗങ്ങള് നിറുത്തി സിസ്റ്റം പുനരാരംഭിക്കുവാന് പുനരാരംഭിക്കൂ അമര്ത്തുക"
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:101
|
#: ../js/ui/endSessionDialog.js:101
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -1003,7 +1038,9 @@ msgstr "ഇന്സ്റ്റോള്"
|
|||||||
#: ../js/ui/extensionDownloader.js:204
|
#: ../js/ui/extensionDownloader.js:204
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Download and install '%s' from extensions.gnome.org?"
|
msgid "Download and install '%s' from extensions.gnome.org?"
|
||||||
msgstr "extensions.gnome.org ഇല് നിന്നും '%s' ഡൗണ്ലോട് ചെയ്ത് ഇന്സ്റ്റോള് ചെയ്യേണമോ?"
|
msgstr ""
|
||||||
|
"extensions.gnome.org ഇല് നിന്നും '%s' ഡൗണ്ലോട് ചെയ്ത് ഇന്സ്റ്റോള് "
|
||||||
|
"ചെയ്യേണമോ?"
|
||||||
|
|
||||||
#: ../js/ui/keyboard.js:327
|
#: ../js/ui/keyboard.js:327
|
||||||
msgid "tray"
|
msgid "tray"
|
||||||
@@ -1660,8 +1697,10 @@ msgid ""
|
|||||||
"Notifications are now disabled, including chat messages. Your online status "
|
"Notifications are now disabled, including chat messages. Your online status "
|
||||||
"has been adjusted to let others know that you might not see their messages."
|
"has been adjusted to let others know that you might not see their messages."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"ചാറ്റ് സന്ദേശങ്ങള് എന്ന പോലെ അറിയിപ്പുകള് പ്രവര്ത്തന രഹിതമാക്കുന്നു. മറ്റുള്ളവരുടെ ചാറ്റ് സന്ദേശങ്ങള് "
|
"ചാറ്റ് സന്ദേശങ്ങള് എന്ന പോലെ അറിയിപ്പുകള് പ്രവര്ത്തന രഹിതമാക്കുന്നു. "
|
||||||
"നിങ്ങള്ക്കു് കാണുവാന് സാധ്യമല്ല എന്നു് നിങ്ങളുടെ ഓണ്ലൈന് അവസ്ഥയില് വ്യക്തമാക്കുന്നു."
|
"മറ്റുള്ളവരുടെ ചാറ്റ് സന്ദേശങ്ങള് "
|
||||||
|
"നിങ്ങള്ക്കു് കാണുവാന് സാധ്യമല്ല എന്നു് നിങ്ങളുടെ ഓണ്ലൈന് അവസ്ഥയില് "
|
||||||
|
"വ്യക്തമാക്കുന്നു."
|
||||||
|
|
||||||
#: ../js/ui/viewSelector.js:85
|
#: ../js/ui/viewSelector.js:85
|
||||||
msgid "Windows"
|
msgid "Windows"
|
||||||
|
281
po/ru.po
281
po/ru.po
@@ -13,18 +13,16 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: gnome-shell\n"
|
"Project-Id-Version: gnome-shell\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&keywords=I18N+L10N&component=general\n"
|
||||||
"shell&keywords=I18N+L10N&component=general\n"
|
|
||||||
"POT-Creation-Date: 2012-10-31 16:48+0000\n"
|
"POT-Creation-Date: 2012-10-31 16:48+0000\n"
|
||||||
"PO-Revision-Date: 2012-11-04 20:48+0400\n"
|
"PO-Revision-Date: 2012-11-20 11:46+0300\n"
|
||||||
"Last-Translator: Yuri Myasoedov <omerta13@yandex.ru>\n"
|
"Last-Translator: Yuri Myasoedov <omerta13@yandex.ru>\n"
|
||||||
"Language-Team: русский <gnome-cyr@gnome.org>\n"
|
"Language-Team: русский <gnome-cyr@gnome.org>\n"
|
||||||
"Language: ru\n"
|
"Language: ru\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
"Content-Transfer-Encoding: 8bit\n"
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
|
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
|
||||||
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n"
|
|
||||||
"X-Generator: Lokalize 1.2\n"
|
"X-Generator: Lokalize 1.2\n"
|
||||||
|
|
||||||
#: ../data/50-gnome-shell-screenshot.xml.in.h:1
|
#: ../data/50-gnome-shell-screenshot.xml.in.h:1
|
||||||
@@ -65,55 +63,32 @@ msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
|||||||
msgstr "Включить внутренние инструменты из Alt-F2 для разработчиков и тестеров"
|
msgstr "Включить внутренние инструменты из Alt-F2 для разработчиков и тестеров"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:2
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:2
|
||||||
msgid ""
|
msgid "Allows access to internal debugging and monitoring tools using the Alt-F2 dialog."
|
||||||
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
|
msgstr "Разрешает доступ к внутренней отладке и инструментам наблюдения, используя диалог Alt-F2."
|
||||||
"dialog."
|
|
||||||
msgstr ""
|
|
||||||
"Разрешает доступ к внутренней отладке и инструментам наблюдения, используя "
|
|
||||||
"диалог Alt-F2."
|
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:3
|
||||||
msgid "Uuids of extensions to enable"
|
msgid "Uuids of extensions to enable"
|
||||||
msgstr "Uuid включенных расширений"
|
msgstr "Uuid включенных расширений"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:4
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:4
|
||||||
msgid ""
|
msgid "GNOME Shell extensions have a uuid property; this key lists extensions which should be loaded. Any extension that wants to be loaded needs to be in this list. You can also manipulate this list with the EnableExtension and DisableExtension DBus methods on org.gnome.Shell."
|
||||||
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
msgstr "У расширений GNOME Shell есть свойство uuid; в этом ключе перечислены расширения, которые должны быть загружены. Этим список также можно управлять через методы DBus EnableExtension и DisableExtension сервиса org.gnome.Shell."
|
||||||
"should be loaded. Any extension that wants to be loaded needs to be in this "
|
|
||||||
"list. You can also manipulate this list with the EnableExtension and "
|
|
||||||
"DisableExtension DBus methods on org.gnome.Shell."
|
|
||||||
msgstr ""
|
|
||||||
"У расширений GNOME Shell есть свойство uuid; в этом ключе перечислены "
|
|
||||||
"расширения, которые должны быть загружены. Этим список также можно управлять "
|
|
||||||
"через методы DBus EnableExtension и DisableExtension сервиса org.gnome.Shell."
|
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:5
|
||||||
msgid "Whether to collect stats about applications usage"
|
msgid "Whether to collect stats about applications usage"
|
||||||
msgstr "Собирать ли статистику об использовании приложений"
|
msgstr "Собирать ли статистику об использовании приложений"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:6
|
||||||
msgid ""
|
msgid "The shell normally monitors active applications in order to present the most used ones (e.g. in launchers). While this data will be kept private, you may want to disable this for privacy reasons. Please note that doing so won't remove already saved data."
|
||||||
"The shell normally monitors active applications in order to present the most "
|
msgstr "Обычно, оболочка отслеживает активные приложения, чтобы определить наиболее используемые приложения. Хотя эти данные хранятся как личные, возможно вы захотите отключить эту возможность из соображений безопасности. Это не приведёт к удалению уже сохранённых данных."
|
||||||
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
|
||||||
"want to disable this for privacy reasons. Please note that doing so won't "
|
|
||||||
"remove already saved data."
|
|
||||||
msgstr ""
|
|
||||||
"Обычно, оболочка отслеживает активные приложения, чтобы определить наиболее "
|
|
||||||
"используемые приложения. Хотя эти данные хранятся как личные, возможно вы "
|
|
||||||
"захотите отключить эту возможность из соображений безопасности. Это не "
|
|
||||||
"приведёт к удалению уже сохранённых данных."
|
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:7
|
||||||
msgid "List of desktop file IDs for favorite applications"
|
msgid "List of desktop file IDs for favorite applications"
|
||||||
msgstr "Список идентификаторов desktop-файлов для избранных приложений"
|
msgstr "Список идентификаторов desktop-файлов для избранных приложений"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:8
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:8
|
||||||
msgid ""
|
msgid "The applications corresponding to these identifiers will be displayed in the favorites area."
|
||||||
"The applications corresponding to these identifiers will be displayed in the "
|
msgstr "Приложения, соответствующие этих идентификаторам, будут показаны в области избранных приложений."
|
||||||
"favorites area."
|
|
||||||
msgstr ""
|
|
||||||
"Приложения, соответствующие этих идентификаторам, будут показаны в области "
|
|
||||||
"избранных приложений."
|
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:9
|
||||||
msgid "History for command (Alt-F2) dialog"
|
msgid "History for command (Alt-F2) dialog"
|
||||||
@@ -124,33 +99,20 @@ msgid "History for the looking glass dialog"
|
|||||||
msgstr "История просмотра прозрачного диалога"
|
msgstr "История просмотра прозрачного диалога"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:11
|
||||||
msgid ""
|
msgid "Internally used to store the last IM presence explicitly set by the user. The value here is from the TpConnectionPresenceType enumeration."
|
||||||
"Internally used to store the last IM presence explicitly set by the user. "
|
msgstr "Используется для хранения статуса о присутствии, установленного пользователем. Данное значение берётся из перечисления TpConnectionPresenceType."
|
||||||
"The value here is from the TpConnectionPresenceType enumeration."
|
|
||||||
msgstr ""
|
|
||||||
"Используется для хранения статуса о присутствии, установленного "
|
|
||||||
"пользователем. Данное значение берётся из перечисления "
|
|
||||||
"TpConnectionPresenceType."
|
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:12
|
||||||
msgid ""
|
msgid "Internally used to store the last session presence status for the user. The value here is from the GsmPresenceStatus enumeration."
|
||||||
"Internally used to store the last session presence status for the user. The "
|
msgstr "Используется для хранения статуса о присутствии для последнего сеанса. Данное значение берётся из перечисления GsmPresenceStatus."
|
||||||
"value here is from the GsmPresenceStatus enumeration."
|
|
||||||
msgstr ""
|
|
||||||
"Используется для хранения статуса о присутствии для последнего сеанса. "
|
|
||||||
"Данное значение берётся из перечисления GsmPresenceStatus."
|
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:13
|
||||||
msgid "Always show the 'Log out' menuitem in the user menu."
|
msgid "Always show the 'Log out' menuitem in the user menu."
|
||||||
msgstr "Всегда показывать в меню пункт «Завершить сеанс»."
|
msgstr "Всегда показывать в меню пункт «Завершить сеанс»."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:14
|
||||||
msgid ""
|
msgid "This key overrides the automatic hiding of the 'Log out' menuitem in single-user, single-session situations."
|
||||||
"This key overrides the automatic hiding of the 'Log out' menuitem in single-"
|
msgstr "Этот ключ переопределяет автоматическое скрытие пункта «Завершить сеанс» при использовании одиночного сеанса."
|
||||||
"user, single-session situations."
|
|
||||||
msgstr ""
|
|
||||||
"Этот ключ переопределяет автоматическое скрытие пункта «Завершить сеанс» при "
|
|
||||||
"использовании одиночного сеанса."
|
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:15
|
||||||
msgid "Show the week date in the calendar"
|
msgid "Show the week date in the calendar"
|
||||||
@@ -182,8 +144,7 @@ msgstr "Комбинация клавиш для переключения зап
|
|||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:22
|
||||||
msgid "Keybinding to start/stop the builtin screen recorder."
|
msgid "Keybinding to start/stop the builtin screen recorder."
|
||||||
msgstr ""
|
msgstr "Комбинация клавиш для запуска/остановки встроенного средства записи экрана."
|
||||||
"Комбинация клавиш для запуска/остановки встроенного средства записи экрана."
|
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:23
|
||||||
msgid "Which keyboard to use"
|
msgid "Which keyboard to use"
|
||||||
@@ -198,12 +159,8 @@ msgid "Framerate used for recording screencasts."
|
|||||||
msgstr "Частота смены кадров для записи скринкастов."
|
msgstr "Частота смены кадров для записи скринкастов."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:26
|
||||||
msgid ""
|
msgid "The framerate of the resulting screencast recordered by GNOME Shell's screencast recorder in frames-per-second."
|
||||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
msgstr "Частота смены кадров в скринкасте, записанном с помощью GNOME Shell (кадров/сек)."
|
||||||
"screencast recorder in frames-per-second."
|
|
||||||
msgstr ""
|
|
||||||
"Частота смены кадров в скринкасте, записанном с помощью GNOME Shell (кадров/"
|
|
||||||
"сек)."
|
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:27
|
||||||
msgid "The gstreamer pipeline used to encode the screencast"
|
msgid "The gstreamer pipeline used to encode the screencast"
|
||||||
@@ -211,44 +168,16 @@ msgstr "Конвейер gstreamer, используемый для кодиро
|
|||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:29
|
||||||
#, no-c-format
|
#, no-c-format
|
||||||
msgid ""
|
msgid "Sets the GStreamer pipeline used to encode recordings. It follows the syntax used for gst-launch. The pipeline should have an unconnected sink pad where the recorded video is recorded. It will normally have a unconnected source pad; output from that pad will be written into the output file. However the pipeline can also take care of its own output - this might be used to send the output to an icecast server via shout2send or similar. When unset or set to an empty value, the default pipeline will be used. This is currently 'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is used as a placeholder for a guess at the optimal thread count on the system."
|
||||||
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
|
msgstr "Устанавливает конвейер GStreamer для кодирования записей. Соответствует синтаксису, используемому для gst-launch. Конвейер должен иметь неподключенный входной коннектор, где происходит запись видео. Выход коннектора обычно отключён, выход с этого коннектора записывается в файл вывода. Однако конвейер также может позаботиться о своём выводе, что можно использовать для отправки вывода на сервер icecast через shout2send или нечто подобное. При сбросе или установке пустого значения будет использоваться конвейер по умолчанию. В данный момент это «vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! queue ! webmmux»; запись выполняется в WEBM с помощью кодека VP8. %T используется как заполнитель для определения оптимального количества потоков в системе."
|
||||||
"used for gst-launch. The pipeline should have an unconnected sink pad where "
|
|
||||||
"the recorded video is recorded. It will normally have a unconnected source "
|
|
||||||
"pad; output from that pad will be written into the output file. However the "
|
|
||||||
"pipeline can also take care of its own output - this might be used to send "
|
|
||||||
"the output to an icecast server via shout2send or similar. When unset or set "
|
|
||||||
"to an empty value, the default pipeline will be used. This is currently "
|
|
||||||
"'vp8enc min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 "
|
|
||||||
"threads=%T ! queue ! webmmux' and records to WEBM using the VP8 codec. %T is "
|
|
||||||
"used as a placeholder for a guess at the optimal thread count on the system."
|
|
||||||
msgstr ""
|
|
||||||
"Устанавливает конвейер GStreamer для кодирования записей. Соответствует "
|
|
||||||
"синтаксису, используемому для gst-launch. Конвейер должен иметь "
|
|
||||||
"неподключенный входной коннектор, где происходит запись видео. Выход "
|
|
||||||
"коннектора обычно отключён, выход с этого коннектора записывается в файл "
|
|
||||||
"вывода. Однако конвейер также может позаботиться о своём выводе, что можно "
|
|
||||||
"использовать для отправки вывода на сервер icecast через shout2send или "
|
|
||||||
"нечто подобное. При сбросе или установке пустого значения будет "
|
|
||||||
"использоваться конвейер по умолчанию. В данный момент это «vp8enc "
|
|
||||||
"min_quantizer=13 max_quantizer=13 cpu-used=5 deadline=1000000 threads=%T ! "
|
|
||||||
"queue ! webmmux»; запись выполняется в WEBM с помощью кодека VP8. %T "
|
|
||||||
"используется как заполнитель для определения оптимального количества потоков "
|
|
||||||
"в системе."
|
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:30
|
||||||
msgid "File extension used for storing the screencast"
|
msgid "File extension used for storing the screencast"
|
||||||
msgstr "Расширение файла, использующееся для хранения скринкастов"
|
msgstr "Расширение файла, использующееся для хранения скринкастов"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
#: ../data/org.gnome.shell.gschema.xml.in.in.h:31
|
||||||
msgid ""
|
msgid "The filename for recorded screencasts will be a unique filename based on the current date, and use this extension. It should be changed when recording to a different container format."
|
||||||
"The filename for recorded screencasts will be a unique filename based on the "
|
msgstr "Имя файла записанного скринкаста будет уникальным именем, основанным на текущей дате, и использует это расширение. Оно должно быть изменено, если запись выполняется в другой контейнерный формат."
|
||||||
"current date, and use this extension. It should be changed when recording to "
|
|
||||||
"a different container format."
|
|
||||||
msgstr ""
|
|
||||||
"Имя файла записанного скринкаста будет уникальным именем, основанным на "
|
|
||||||
"текущей дате, и использует это расширение. Оно должно быть изменено, если "
|
|
||||||
"запись выполняется в другой контейнерный формат."
|
|
||||||
|
|
||||||
#: ../js/extensionPrefs/main.js:124
|
#: ../js/extensionPrefs/main.js:124
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -279,10 +208,14 @@ msgstr "Вход в систему"
|
|||||||
msgid "Not listed?"
|
msgid "Not listed?"
|
||||||
msgstr "Нет в списке?"
|
msgstr "Нет в списке?"
|
||||||
|
|
||||||
#: ../js/gdm/loginDialog.js:889 ../js/ui/components/networkAgent.js:137
|
#: ../js/gdm/loginDialog.js:889
|
||||||
#: ../js/ui/components/polkitAgent.js:162 ../js/ui/endSessionDialog.js:373
|
#: ../js/ui/components/networkAgent.js:137
|
||||||
#: ../js/ui/extensionDownloader.js:195 ../js/ui/shellMountOperation.js:396
|
#: ../js/ui/components/polkitAgent.js:162
|
||||||
#: ../js/ui/status/bluetooth.js:427 ../js/ui/unlockDialog.js:167
|
#: ../js/ui/endSessionDialog.js:373
|
||||||
|
#: ../js/ui/extensionDownloader.js:195
|
||||||
|
#: ../js/ui/shellMountOperation.js:396
|
||||||
|
#: ../js/ui/status/bluetooth.js:427
|
||||||
|
#: ../js/ui/unlockDialog.js:167
|
||||||
msgid "Cancel"
|
msgid "Cancel"
|
||||||
msgstr "Отмена"
|
msgstr "Отмена"
|
||||||
|
|
||||||
@@ -300,7 +233,9 @@ msgstr "Окно входа в систему"
|
|||||||
msgid "Power"
|
msgid "Power"
|
||||||
msgstr "Питание"
|
msgstr "Питание"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:89 ../js/ui/userMenu.js:664 ../js/ui/userMenu.js:668
|
#: ../js/gdm/powerMenu.js:89
|
||||||
|
#: ../js/ui/userMenu.js:664
|
||||||
|
#: ../js/ui/userMenu.js:668
|
||||||
#: ../js/ui/userMenu.js:779
|
#: ../js/ui/userMenu.js:779
|
||||||
msgid "Suspend"
|
msgid "Suspend"
|
||||||
msgstr "Ждущий режим"
|
msgstr "Ждущий режим"
|
||||||
@@ -309,7 +244,9 @@ msgstr "Ждущий режим"
|
|||||||
msgid "Restart"
|
msgid "Restart"
|
||||||
msgstr "Перезапустить"
|
msgstr "Перезапустить"
|
||||||
|
|
||||||
#: ../js/gdm/powerMenu.js:99 ../js/ui/userMenu.js:666 ../js/ui/userMenu.js:668
|
#: ../js/gdm/powerMenu.js:99
|
||||||
|
#: ../js/ui/userMenu.js:666
|
||||||
|
#: ../js/ui/userMenu.js:668
|
||||||
#: ../js/ui/userMenu.js:778
|
#: ../js/ui/userMenu.js:778
|
||||||
msgid "Power Off"
|
msgid "Power Off"
|
||||||
msgstr "Выключить"
|
msgstr "Выключить"
|
||||||
@@ -355,13 +292,14 @@ msgstr "ПРИЛОЖЕНИЯ"
|
|||||||
|
|
||||||
#: ../js/ui/appDisplay.js:370
|
#: ../js/ui/appDisplay.js:370
|
||||||
msgid "SETTINGS"
|
msgid "SETTINGS"
|
||||||
msgstr "НАСТРОЙКИ"
|
msgstr "ПАРАМЕТРЫ"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:675
|
#: ../js/ui/appDisplay.js:675
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Новое окно"
|
msgstr "Новое окно"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:678 ../js/ui/dash.js:290
|
#: ../js/ui/appDisplay.js:678
|
||||||
|
#: ../js/ui/dash.js:290
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Удалить из избранного"
|
msgstr "Удалить из избранного"
|
||||||
|
|
||||||
@@ -538,7 +476,8 @@ msgstr "Открыть с помощью %s"
|
|||||||
msgid "Eject"
|
msgid "Eject"
|
||||||
msgstr "Извлечь"
|
msgstr "Извлечь"
|
||||||
|
|
||||||
#: ../js/ui/components/keyring.js:86 ../js/ui/components/polkitAgent.js:260
|
#: ../js/ui/components/keyring.js:86
|
||||||
|
#: ../js/ui/components/polkitAgent.js:260
|
||||||
msgid "Password:"
|
msgid "Password:"
|
||||||
msgstr "Пароль:"
|
msgstr "Пароль:"
|
||||||
|
|
||||||
@@ -590,11 +529,8 @@ msgstr "Беспроводная сеть требует подтвержден
|
|||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:310
|
#: ../js/ui/components/networkAgent.js:310
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid ""
|
msgid "Passwords or encryption keys are required to access the wireless network '%s'."
|
||||||
"Passwords or encryption keys are required to access the wireless network "
|
msgstr "Для доступа к беспроводной сети «%s» требуются пароли или ключи шифрования."
|
||||||
"'%s'."
|
|
||||||
msgstr ""
|
|
||||||
"Для доступа к беспроводной сети «%s» требуются пароли или ключи шифрования."
|
|
||||||
|
|
||||||
#: ../js/ui/components/networkAgent.js:314
|
#: ../js/ui/components/networkAgent.js:314
|
||||||
msgid "Wired 802.1X authentication"
|
msgid "Wired 802.1X authentication"
|
||||||
@@ -645,7 +581,8 @@ msgstr "Подтвердить"
|
|||||||
#. * requested authentication was not gained; this can happen
|
#. * requested authentication was not gained; this can happen
|
||||||
#. * because of an authentication error (like invalid password),
|
#. * because of an authentication error (like invalid password),
|
||||||
#. * for instance.
|
#. * for instance.
|
||||||
#: ../js/ui/components/polkitAgent.js:248 ../js/ui/shellMountOperation.js:381
|
#: ../js/ui/components/polkitAgent.js:248
|
||||||
|
#: ../js/ui/shellMountOperation.js:381
|
||||||
msgid "Sorry, that didn't work. Please try again."
|
msgid "Sorry, that didn't work. Please try again."
|
||||||
msgstr "Извините, это не сработало. Попробуйте снова."
|
msgstr "Извините, это не сработало. Попробуйте снова."
|
||||||
|
|
||||||
@@ -850,8 +787,7 @@ msgid "This account is already connected to the server"
|
|||||||
msgstr "Эта учётная запись уже подключена к серверу"
|
msgstr "Эта учётная запись уже подключена к серверу"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1334
|
#: ../js/ui/components/telepathyClient.js:1334
|
||||||
msgid ""
|
msgid "Connection has been replaced by a new connection using the same resource"
|
||||||
"Connection has been replaced by a new connection using the same resource"
|
|
||||||
msgstr "Соединение было заменено новым, используя тот же источник"
|
msgstr "Соединение было заменено новым, используя тот же источник"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1336
|
#: ../js/ui/components/telepathyClient.js:1336
|
||||||
@@ -860,27 +796,19 @@ msgstr "Учётная запись уже существует на серве
|
|||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1338
|
#: ../js/ui/components/telepathyClient.js:1338
|
||||||
msgid "Server is currently too busy to handle the connection"
|
msgid "Server is currently too busy to handle the connection"
|
||||||
msgstr ""
|
msgstr "Сервер в настоящее время сильно перегружен, чтобы обработать соединение"
|
||||||
"Сервер в настоящее время сильно перегружен, чтобы обработать соединение"
|
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1340
|
#: ../js/ui/components/telepathyClient.js:1340
|
||||||
msgid "Certificate has been revoked"
|
msgid "Certificate has been revoked"
|
||||||
msgstr "Сертификат аннулирован"
|
msgstr "Сертификат аннулирован"
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1342
|
#: ../js/ui/components/telepathyClient.js:1342
|
||||||
msgid ""
|
msgid "Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
||||||
"Certificate uses an insecure cipher algorithm or is cryptographically weak"
|
msgstr "Сертификат использует небезопасный алгоритм шифрования или он криптографически нестоек"
|
||||||
msgstr ""
|
|
||||||
"Сертификат использует небезопасный алгоритм шифрования или он "
|
|
||||||
"криптографически нестоек"
|
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1344
|
#: ../js/ui/components/telepathyClient.js:1344
|
||||||
msgid ""
|
msgid "The length of the server certificate, or the depth of the server certificate chain, exceed the limits imposed by the cryptography library"
|
||||||
"The length of the server certificate, or the depth of the server certificate "
|
msgstr "Длина сертификата сервера, или глубина цепочки сертификатов сервера, превышает пределы, установленные библиотекой криптографии"
|
||||||
"chain, exceed the limits imposed by the cryptography library"
|
|
||||||
msgstr ""
|
|
||||||
"Длина сертификата сервера, или глубина цепочки сертификатов сервера, "
|
|
||||||
"превышает пределы, установленные библиотекой криптографии"
|
|
||||||
|
|
||||||
#: ../js/ui/components/telepathyClient.js:1346
|
#: ../js/ui/components/telepathyClient.js:1346
|
||||||
msgid "Internal error"
|
msgid "Internal error"
|
||||||
@@ -905,7 +833,8 @@ msgstr "Изменить учётную запись"
|
|||||||
msgid "Unknown reason"
|
msgid "Unknown reason"
|
||||||
msgstr "Неизвестная причина"
|
msgstr "Неизвестная причина"
|
||||||
|
|
||||||
#: ../js/ui/dash.js:253 ../js/ui/dash.js:292
|
#: ../js/ui/dash.js:253
|
||||||
|
#: ../js/ui/dash.js:292
|
||||||
msgid "Show Applications"
|
msgid "Show Applications"
|
||||||
msgstr "Показать приложения"
|
msgstr "Показать приложения"
|
||||||
|
|
||||||
@@ -937,17 +866,14 @@ msgstr "Выйти из системы"
|
|||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:63
|
#: ../js/ui/endSessionDialog.js:63
|
||||||
msgid "Click Log Out to quit these applications and log out of the system."
|
msgid "Click Log Out to quit these applications and log out of the system."
|
||||||
msgstr ""
|
msgstr "Нажмите «Выйти из системы», чтобы закрыть эти приложения и выйти из системы."
|
||||||
"Нажмите «Выйти из системы», чтобы закрыть эти приложения и выйти из системы."
|
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:65
|
#: ../js/ui/endSessionDialog.js:65
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s will be logged out automatically in %d second."
|
msgid "%s will be logged out automatically in %d second."
|
||||||
msgid_plural "%s will be logged out automatically in %d seconds."
|
msgid_plural "%s will be logged out automatically in %d seconds."
|
||||||
msgstr[0] ""
|
msgstr[0] "Сеанс пользователя %s будет автоматически завершён через %d секунду."
|
||||||
"Сеанс пользователя %s будет автоматически завершён через %d секунду."
|
msgstr[1] "Сеанс пользователя %s будет автоматически завершён через %d секунды."
|
||||||
msgstr[1] ""
|
|
||||||
"Сеанс пользователя %s будет автоматически завершён через %d секунды."
|
|
||||||
msgstr[2] "Сеанс пользователя %s будет автоматически завершён через %d секунд."
|
msgstr[2] "Сеанс пользователя %s будет автоматически завершён через %d секунд."
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:70
|
#: ../js/ui/endSessionDialog.js:70
|
||||||
@@ -988,7 +914,8 @@ msgstr[2] "Система будет автоматически выключен
|
|||||||
msgid "Powering off the system."
|
msgid "Powering off the system."
|
||||||
msgstr "Выключение системы."
|
msgstr "Выключение системы."
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:90 ../js/ui/endSessionDialog.js:107
|
#: ../js/ui/endSessionDialog.js:90
|
||||||
|
#: ../js/ui/endSessionDialog.js:107
|
||||||
msgctxt "button"
|
msgctxt "button"
|
||||||
msgid "Restart"
|
msgid "Restart"
|
||||||
msgstr "Перезапустить"
|
msgstr "Перезапустить"
|
||||||
@@ -1005,9 +932,7 @@ msgstr "Перезапустить"
|
|||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:99
|
#: ../js/ui/endSessionDialog.js:99
|
||||||
msgid "Click Restart to quit these applications and restart the system."
|
msgid "Click Restart to quit these applications and restart the system."
|
||||||
msgstr ""
|
msgstr "Нажмите «Перезапустить», чтобы закрыть эти приложения и перезапустить систему."
|
||||||
"Нажмите «Перезапустить», чтобы закрыть эти приложения и перезапустить "
|
|
||||||
"систему."
|
|
||||||
|
|
||||||
#: ../js/ui/endSessionDialog.js:101
|
#: ../js/ui/endSessionDialog.js:101
|
||||||
#, c-format
|
#, c-format
|
||||||
@@ -1034,7 +959,8 @@ msgstr "Загрузить и установить расширение «%s»
|
|||||||
msgid "tray"
|
msgid "tray"
|
||||||
msgstr "лоток"
|
msgstr "лоток"
|
||||||
|
|
||||||
#: ../js/ui/keyboard.js:584 ../js/ui/status/keyboard.js:195
|
#: ../js/ui/keyboard.js:584
|
||||||
|
#: ../js/ui/status/keyboard.js:195
|
||||||
#: ../js/ui/status/power.js:205
|
#: ../js/ui/status/power.js:205
|
||||||
msgid "Keyboard"
|
msgid "Keyboard"
|
||||||
msgstr "Клавиатура"
|
msgstr "Клавиатура"
|
||||||
@@ -1053,7 +979,8 @@ msgstr "%s не сообщал о каких-либо ошибках."
|
|||||||
msgid "Hide Errors"
|
msgid "Hide Errors"
|
||||||
msgstr "Скрыть ошибки"
|
msgstr "Скрыть ошибки"
|
||||||
|
|
||||||
#: ../js/ui/lookingGlass.js:755 ../js/ui/lookingGlass.js:815
|
#: ../js/ui/lookingGlass.js:755
|
||||||
|
#: ../js/ui/lookingGlass.js:815
|
||||||
msgid "Show Errors"
|
msgid "Show Errors"
|
||||||
msgstr "Показать ошибки"
|
msgstr "Показать ошибки"
|
||||||
|
|
||||||
@@ -1063,7 +990,8 @@ msgstr "Включено"
|
|||||||
|
|
||||||
#. translators:
|
#. translators:
|
||||||
#. * The device has been disabled
|
#. * The device has been disabled
|
||||||
#: ../js/ui/lookingGlass.js:767 ../src/gvc/gvc-mixer-control.c:1082
|
#: ../js/ui/lookingGlass.js:767
|
||||||
|
#: ../src/gvc/gvc-mixer-control.c:1082
|
||||||
msgid "Disabled"
|
msgid "Disabled"
|
||||||
msgstr "Выключено"
|
msgstr "Выключено"
|
||||||
|
|
||||||
@@ -1103,7 +1031,8 @@ msgstr "Панель сообщений"
|
|||||||
msgid "System Information"
|
msgid "System Information"
|
||||||
msgstr "Системная информация"
|
msgstr "Системная информация"
|
||||||
|
|
||||||
#: ../js/ui/notificationDaemon.js:506 ../src/shell-app.c:374
|
#: ../js/ui/notificationDaemon.js:506
|
||||||
|
#: ../src/shell-app.c:374
|
||||||
msgctxt "program"
|
msgctxt "program"
|
||||||
msgid "Unknown"
|
msgid "Unknown"
|
||||||
msgstr "Неизвестно"
|
msgstr "Неизвестно"
|
||||||
@@ -1211,7 +1140,8 @@ msgstr "Пароль"
|
|||||||
msgid "Remember Password"
|
msgid "Remember Password"
|
||||||
msgstr "Запомнить пароль"
|
msgstr "Запомнить пароль"
|
||||||
|
|
||||||
#: ../js/ui/shellMountOperation.js:400 ../js/ui/unlockDialog.js:170
|
#: ../js/ui/shellMountOperation.js:400
|
||||||
|
#: ../js/ui/unlockDialog.js:170
|
||||||
msgid "Unlock"
|
msgid "Unlock"
|
||||||
msgstr "Разблокировать"
|
msgstr "Разблокировать"
|
||||||
|
|
||||||
@@ -1263,10 +1193,14 @@ msgstr "Высокая контрастность"
|
|||||||
msgid "Large Text"
|
msgid "Large Text"
|
||||||
msgstr "Крупный текст"
|
msgstr "Крупный текст"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:27 ../js/ui/status/bluetooth.js:31
|
#: ../js/ui/status/bluetooth.js:27
|
||||||
#: ../js/ui/status/bluetooth.js:251 ../js/ui/status/bluetooth.js:304
|
#: ../js/ui/status/bluetooth.js:31
|
||||||
#: ../js/ui/status/bluetooth.js:335 ../js/ui/status/bluetooth.js:371
|
#: ../js/ui/status/bluetooth.js:251
|
||||||
#: ../js/ui/status/bluetooth.js:400 ../js/ui/status/network.js:867
|
#: ../js/ui/status/bluetooth.js:304
|
||||||
|
#: ../js/ui/status/bluetooth.js:335
|
||||||
|
#: ../js/ui/status/bluetooth.js:371
|
||||||
|
#: ../js/ui/status/bluetooth.js:400
|
||||||
|
#: ../js/ui/status/network.js:867
|
||||||
msgid "Bluetooth"
|
msgid "Bluetooth"
|
||||||
msgstr "Bluetooth"
|
msgstr "Bluetooth"
|
||||||
|
|
||||||
@@ -1287,7 +1221,8 @@ msgid "Bluetooth Settings"
|
|||||||
msgstr "Настроить Bluetooth"
|
msgstr "Настроить Bluetooth"
|
||||||
|
|
||||||
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
|
#. TRANSLATORS: this means that bluetooth was disabled by hardware rfkill
|
||||||
#: ../js/ui/status/bluetooth.js:103 ../js/ui/status/network.js:208
|
#: ../js/ui/status/bluetooth.js:103
|
||||||
|
#: ../js/ui/status/network.js:208
|
||||||
msgid "hardware disabled"
|
msgid "hardware disabled"
|
||||||
msgstr "устройство выключено"
|
msgstr "устройство выключено"
|
||||||
|
|
||||||
@@ -1295,11 +1230,13 @@ msgstr "устройство выключено"
|
|||||||
msgid "Connection"
|
msgid "Connection"
|
||||||
msgstr "Соединение"
|
msgstr "Соединение"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:207 ../js/ui/status/network.js:458
|
#: ../js/ui/status/bluetooth.js:207
|
||||||
|
#: ../js/ui/status/network.js:458
|
||||||
msgid "disconnecting..."
|
msgid "disconnecting..."
|
||||||
msgstr "отключение…"
|
msgstr "отключение…"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:220 ../js/ui/status/network.js:464
|
#: ../js/ui/status/bluetooth.js:220
|
||||||
|
#: ../js/ui/status/network.js:464
|
||||||
#: ../js/ui/status/network.js:934
|
#: ../js/ui/status/network.js:934
|
||||||
msgid "connecting..."
|
msgid "connecting..."
|
||||||
msgstr "подключение…"
|
msgstr "подключение…"
|
||||||
@@ -1329,7 +1266,8 @@ msgstr "Настроить клавиатуру"
|
|||||||
msgid "Mouse Settings"
|
msgid "Mouse Settings"
|
||||||
msgstr "Настроить мышь"
|
msgstr "Настроить мышь"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:269 ../js/ui/status/volume.js:234
|
#: ../js/ui/status/bluetooth.js:269
|
||||||
|
#: ../js/ui/status/volume.js:234
|
||||||
msgid "Sound Settings"
|
msgid "Sound Settings"
|
||||||
msgstr "Настроить звук"
|
msgstr "Настроить звук"
|
||||||
|
|
||||||
@@ -1356,7 +1294,8 @@ msgstr "Предоставить единовременно"
|
|||||||
msgid "Pairing confirmation for %s"
|
msgid "Pairing confirmation for %s"
|
||||||
msgstr "Подтверждение на сопряжение с %s"
|
msgstr "Подтверждение на сопряжение с %s"
|
||||||
|
|
||||||
#: ../js/ui/status/bluetooth.js:378 ../js/ui/status/bluetooth.js:408
|
#: ../js/ui/status/bluetooth.js:378
|
||||||
|
#: ../js/ui/status/bluetooth.js:408
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Device %s wants to pair with this computer"
|
msgid "Device %s wants to pair with this computer"
|
||||||
msgstr "Устройство %s пытается выполнить сопряжение с этим компьютером"
|
msgstr "Устройство %s пытается выполнить сопряжение с этим компьютером"
|
||||||
@@ -1389,11 +1328,11 @@ msgstr "OK"
|
|||||||
|
|
||||||
#: ../js/ui/status/keyboard.js:228
|
#: ../js/ui/status/keyboard.js:228
|
||||||
msgid "Show Keyboard Layout"
|
msgid "Show Keyboard Layout"
|
||||||
msgstr "Показывать раскладку клавиатуры"
|
msgstr "Показать раскладку клавиатуры"
|
||||||
|
|
||||||
#: ../js/ui/status/keyboard.js:233
|
#: ../js/ui/status/keyboard.js:233
|
||||||
msgid "Region and Language Settings"
|
msgid "Region and Language Settings"
|
||||||
msgstr "Региональные и языковые настройки"
|
msgstr "Региональные и языковые параметры"
|
||||||
|
|
||||||
#: ../js/ui/status/lockScreenMenu.js:18
|
#: ../js/ui/status/lockScreenMenu.js:18
|
||||||
msgid "Volume, network, battery"
|
msgid "Volume, network, battery"
|
||||||
@@ -1415,7 +1354,8 @@ msgid "unmanaged"
|
|||||||
msgstr "не управляется"
|
msgstr "не управляется"
|
||||||
|
|
||||||
#. Translators: this is for network connections that require some kind of key or password
|
#. Translators: this is for network connections that require some kind of key or password
|
||||||
#: ../js/ui/status/network.js:467 ../js/ui/status/network.js:937
|
#: ../js/ui/status/network.js:467
|
||||||
|
#: ../js/ui/status/network.js:937
|
||||||
msgid "authentication required"
|
msgid "authentication required"
|
||||||
msgstr "требуется подтверждение подлинности"
|
msgstr "требуется подтверждение подлинности"
|
||||||
|
|
||||||
@@ -1436,17 +1376,20 @@ msgstr "кабель не подключен"
|
|||||||
msgid "unavailable"
|
msgid "unavailable"
|
||||||
msgstr "недоступное"
|
msgstr "недоступное"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:491 ../js/ui/status/network.js:939
|
#: ../js/ui/status/network.js:491
|
||||||
|
#: ../js/ui/status/network.js:939
|
||||||
msgid "connection failed"
|
msgid "connection failed"
|
||||||
msgstr "сбой подключения"
|
msgstr "сбой подключения"
|
||||||
|
|
||||||
#: ../js/ui/status/network.js:552 ../js/ui/status/network.js:1529
|
#: ../js/ui/status/network.js:552
|
||||||
|
#: ../js/ui/status/network.js:1529
|
||||||
msgid "More..."
|
msgid "More..."
|
||||||
msgstr "Ещё…"
|
msgstr "Ещё…"
|
||||||
|
|
||||||
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
#. TRANSLATORS: this is the indication that a connection for another logged in user is active,
|
||||||
#. and we cannot access its settings (including the name)
|
#. and we cannot access its settings (including the name)
|
||||||
#: ../js/ui/status/network.js:588 ../js/ui/status/network.js:1459
|
#: ../js/ui/status/network.js:588
|
||||||
|
#: ../js/ui/status/network.js:1459
|
||||||
msgid "Connected (private)"
|
msgid "Connected (private)"
|
||||||
msgstr "Подключено (частное)"
|
msgstr "Подключено (частное)"
|
||||||
|
|
||||||
@@ -1463,7 +1406,8 @@ msgid "Auto dial-up"
|
|||||||
msgstr "Автоматическое коммутируемое"
|
msgstr "Автоматическое коммутируемое"
|
||||||
|
|
||||||
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
|
#. TRANSLATORS: this the automatic wireless connection name (including the network name)
|
||||||
#: ../js/ui/status/network.js:853 ../js/ui/status/network.js:1476
|
#: ../js/ui/status/network.js:853
|
||||||
|
#: ../js/ui/status/network.js:1476
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Auto %s"
|
msgid "Auto %s"
|
||||||
msgstr "Автоматическое %s"
|
msgstr "Автоматическое %s"
|
||||||
@@ -1566,7 +1510,8 @@ msgstr[0] "Осталась %d минута"
|
|||||||
msgstr[1] "Осталось %d минуты"
|
msgstr[1] "Осталось %d минуты"
|
||||||
msgstr[2] "Осталось %d минут"
|
msgstr[2] "Осталось %d минут"
|
||||||
|
|
||||||
#: ../js/ui/status/power.js:112 ../js/ui/status/power.js:186
|
#: ../js/ui/status/power.js:112
|
||||||
|
#: ../js/ui/status/power.js:186
|
||||||
#, c-format
|
#, c-format
|
||||||
msgctxt "percent of battery remaining"
|
msgctxt "percent of battery remaining"
|
||||||
msgid "%d%%"
|
msgid "%d%%"
|
||||||
@@ -1618,7 +1563,8 @@ msgid "Unknown"
|
|||||||
msgstr "Неизвестно"
|
msgstr "Неизвестно"
|
||||||
|
|
||||||
#. Translators: This is the label for audio volume
|
#. Translators: This is the label for audio volume
|
||||||
#: ../js/ui/status/volume.js:47 ../js/ui/status/volume.js:221
|
#: ../js/ui/status/volume.js:47
|
||||||
|
#: ../js/ui/status/volume.js:221
|
||||||
msgid "Volume"
|
msgid "Volume"
|
||||||
msgstr "Громкость"
|
msgstr "Громкость"
|
||||||
|
|
||||||
@@ -1683,12 +1629,8 @@ msgid "Your chat status will be set to busy"
|
|||||||
msgstr "Будет установлен статус «не беспокоить»"
|
msgstr "Будет установлен статус «не беспокоить»"
|
||||||
|
|
||||||
#: ../js/ui/userMenu.js:804
|
#: ../js/ui/userMenu.js:804
|
||||||
msgid ""
|
msgid "Notifications are now disabled, including chat messages. Your online status has been adjusted to let others know that you might not see their messages."
|
||||||
"Notifications are now disabled, including chat messages. Your online status "
|
msgstr "Уведомления отключены, включая сообщения в чате. Ваш статус доступности изменён, чтобы другие знали, что вы возможно не видите их сообщения."
|
||||||
"has been adjusted to let others know that you might not see their messages."
|
|
||||||
msgstr ""
|
|
||||||
"Уведомления отключены, включая сообщения в чате. Ваш статус доступности "
|
|
||||||
"изменён, чтобы другие знали, что вы возможно не видите их сообщения."
|
|
||||||
|
|
||||||
#: ../js/ui/viewSelector.js:85
|
#: ../js/ui/viewSelector.js:85
|
||||||
msgid "Windows"
|
msgid "Windows"
|
||||||
@@ -1735,9 +1677,9 @@ msgstr "Календарь Evolution"
|
|||||||
#, c-format
|
#, c-format
|
||||||
msgid "%u Output"
|
msgid "%u Output"
|
||||||
msgid_plural "%u Outputs"
|
msgid_plural "%u Outputs"
|
||||||
msgstr[0] "%u вывод"
|
msgstr[0] "%u выход"
|
||||||
msgstr[1] "%u вывода"
|
msgstr[1] "%u выхода"
|
||||||
msgstr[2] "%u выводов"
|
msgstr[2] "%u выходов"
|
||||||
|
|
||||||
#. translators:
|
#. translators:
|
||||||
#. * The number of sound inputs on a particular device
|
#. * The number of sound inputs on a particular device
|
||||||
@@ -1763,8 +1705,7 @@ msgstr "Режим, используемый GDM для окна входа в
|
|||||||
|
|
||||||
#: ../src/main.c:344
|
#: ../src/main.c:344
|
||||||
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
msgid "Use a specific mode, e.g. \"gdm\" for login screen"
|
||||||
msgstr ""
|
msgstr "Использовать для экрана входа в систему определённый режим, например «gdm»"
|
||||||
"Использовать для экрана входа в систему определённый режим, например «gdm»"
|
|
||||||
|
|
||||||
#: ../src/main.c:350
|
#: ../src/main.c:350
|
||||||
msgid "List possible modes"
|
msgid "List possible modes"
|
||||||
|
@@ -119,7 +119,6 @@ shell_public_headers_h = \
|
|||||||
shell-network-agent.h \
|
shell-network-agent.h \
|
||||||
shell-perf-log.h \
|
shell-perf-log.h \
|
||||||
shell-screenshot.h \
|
shell-screenshot.h \
|
||||||
shell-screen-grabber.h \
|
|
||||||
shell-slicer.h \
|
shell-slicer.h \
|
||||||
shell-stack.h \
|
shell-stack.h \
|
||||||
shell-tp-client.h \
|
shell-tp-client.h \
|
||||||
@@ -167,7 +166,6 @@ libgnome_shell_la_SOURCES = \
|
|||||||
shell-polkit-authentication-agent.h \
|
shell-polkit-authentication-agent.h \
|
||||||
shell-polkit-authentication-agent.c \
|
shell-polkit-authentication-agent.c \
|
||||||
shell-screenshot.c \
|
shell-screenshot.c \
|
||||||
shell-screen-grabber.c \
|
|
||||||
shell-secure-text-buffer.c \
|
shell-secure-text-buffer.c \
|
||||||
shell-secure-text-buffer.h \
|
shell-secure-text-buffer.h \
|
||||||
shell-slicer.c \
|
shell-slicer.c \
|
||||||
@@ -232,8 +230,6 @@ test_recorder_LDADD = $(TEST_SHELL_RECORDER_LIBS)
|
|||||||
|
|
||||||
test_recorder_SOURCES = \
|
test_recorder_SOURCES = \
|
||||||
$(shell_recorder_sources) $(shell_recorder_private_sources) \
|
$(shell_recorder_sources) $(shell_recorder_private_sources) \
|
||||||
shell-screen-grabber.c \
|
|
||||||
shell-screen-grabber.h \
|
|
||||||
test-recorder.c
|
test-recorder.c
|
||||||
endif BUILD_RECORDER
|
endif BUILD_RECORDER
|
||||||
|
|
||||||
|
@@ -1035,8 +1035,6 @@ main (int argc,
|
|||||||
name_owner_id = 0;
|
name_owner_id = 0;
|
||||||
stdin_channel = NULL;
|
stdin_channel = NULL;
|
||||||
|
|
||||||
g_type_init ();
|
|
||||||
|
|
||||||
introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
|
introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL);
|
||||||
g_assert (introspection_data != NULL);
|
g_assert (introspection_data != NULL);
|
||||||
|
|
||||||
|
@@ -72,6 +72,9 @@ static void gnome_shell_plugin_kill_switch_workspace (MetaPlugin *plugin);
|
|||||||
|
|
||||||
static gboolean gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
|
static gboolean gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
|
||||||
XEvent *event);
|
XEvent *event);
|
||||||
|
|
||||||
|
static gboolean gnome_shell_plugin_keybinding_filter (MetaPlugin *plugin,
|
||||||
|
MetaKeyBinding *binding);
|
||||||
static const MetaPluginInfo *gnome_shell_plugin_plugin_info (MetaPlugin *plugin);
|
static const MetaPluginInfo *gnome_shell_plugin_plugin_info (MetaPlugin *plugin);
|
||||||
|
|
||||||
|
|
||||||
@@ -127,6 +130,7 @@ gnome_shell_plugin_class_init (GnomeShellPluginClass *klass)
|
|||||||
plugin_class->kill_switch_workspace = gnome_shell_plugin_kill_switch_workspace;
|
plugin_class->kill_switch_workspace = gnome_shell_plugin_kill_switch_workspace;
|
||||||
|
|
||||||
plugin_class->xevent_filter = gnome_shell_plugin_xevent_filter;
|
plugin_class->xevent_filter = gnome_shell_plugin_xevent_filter;
|
||||||
|
plugin_class->keybinding_filter = gnome_shell_plugin_keybinding_filter;
|
||||||
plugin_class->plugin_info = gnome_shell_plugin_plugin_info;
|
plugin_class->plugin_info = gnome_shell_plugin_plugin_info;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -337,6 +341,13 @@ gnome_shell_plugin_xevent_filter (MetaPlugin *plugin,
|
|||||||
return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE;
|
return clutter_x11_handle_event (xev) != CLUTTER_X11_FILTER_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gnome_shell_plugin_keybinding_filter (MetaPlugin *plugin,
|
||||||
|
MetaKeyBinding *binding)
|
||||||
|
{
|
||||||
|
return _shell_wm_filter_keybinding (get_shell_wm (), binding);
|
||||||
|
}
|
||||||
|
|
||||||
static const
|
static const
|
||||||
MetaPluginInfo *gnome_shell_plugin_plugin_info (MetaPlugin *plugin)
|
MetaPluginInfo *gnome_shell_plugin_plugin_info (MetaPlugin *plugin)
|
||||||
{
|
{
|
||||||
|
@@ -38,7 +38,7 @@ extern GType gnome_shell_plugin_get_type (void);
|
|||||||
#define OVERRIDES_SCHEMA "org.gnome.shell.overrides"
|
#define OVERRIDES_SCHEMA "org.gnome.shell.overrides"
|
||||||
|
|
||||||
#define WM_NAME "GNOME Shell"
|
#define WM_NAME "GNOME Shell"
|
||||||
#define GNOME_WM_KEYBINDINGS "Metacity,Mutter,GNOME Shell"
|
#define GNOME_WM_KEYBINDINGS "Mutter,GNOME Shell"
|
||||||
|
|
||||||
static gboolean is_gdm_mode = FALSE;
|
static gboolean is_gdm_mode = FALSE;
|
||||||
static char *session_mode = NULL;
|
static char *session_mode = NULL;
|
||||||
@@ -174,8 +174,6 @@ shell_prefs_init (void)
|
|||||||
OVERRIDES_SCHEMA);
|
OVERRIDES_SCHEMA);
|
||||||
meta_prefs_override_preference_schema ("workspaces-only-on-primary",
|
meta_prefs_override_preference_schema ("workspaces-only-on-primary",
|
||||||
OVERRIDES_SCHEMA);
|
OVERRIDES_SCHEMA);
|
||||||
meta_prefs_override_preference_schema ("button-layout",
|
|
||||||
OVERRIDES_SCHEMA);
|
|
||||||
meta_prefs_override_preference_schema ("edge-tiling",
|
meta_prefs_override_preference_schema ("edge-tiling",
|
||||||
OVERRIDES_SCHEMA);
|
OVERRIDES_SCHEMA);
|
||||||
meta_prefs_override_preference_schema ("focus-change-on-pointer-rest",
|
meta_prefs_override_preference_schema ("focus-change-on-pointer-rest",
|
||||||
|
@@ -14,6 +14,9 @@ struct _ShellRecorderSrc
|
|||||||
GMutex mutex_data;
|
GMutex mutex_data;
|
||||||
GMutex *mutex;
|
GMutex *mutex;
|
||||||
|
|
||||||
|
GstClock *clock;
|
||||||
|
GstClockTime last_frame_time;
|
||||||
|
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
GAsyncQueue *queue;
|
GAsyncQueue *queue;
|
||||||
gboolean closed;
|
gboolean closed;
|
||||||
@@ -41,6 +44,10 @@ static void
|
|||||||
shell_recorder_src_init (ShellRecorderSrc *src)
|
shell_recorder_src_init (ShellRecorderSrc *src)
|
||||||
{
|
{
|
||||||
gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME);
|
gst_base_src_set_format (GST_BASE_SRC (src), GST_FORMAT_TIME);
|
||||||
|
gst_base_src_set_live (GST_BASE_SRC (src), TRUE);
|
||||||
|
|
||||||
|
src->clock = gst_system_clock_obtain ();
|
||||||
|
src->last_frame_time = 0;
|
||||||
|
|
||||||
src->queue = g_async_queue_new ();
|
src->queue = g_async_queue_new ();
|
||||||
src->mutex = &src->mutex_data;
|
src->mutex = &src->mutex_data;
|
||||||
@@ -89,6 +96,10 @@ shell_recorder_src_create (GstPushSrc *push_src,
|
|||||||
return GST_FLOW_EOS;
|
return GST_FLOW_EOS;
|
||||||
|
|
||||||
buffer = g_async_queue_pop (src->queue);
|
buffer = g_async_queue_pop (src->queue);
|
||||||
|
|
||||||
|
if (src->last_frame_time == 0)
|
||||||
|
src->last_frame_time = gst_clock_get_time (GST_CLOCK (src->clock));
|
||||||
|
|
||||||
if (buffer == RECORDER_QUEUE_END)
|
if (buffer == RECORDER_QUEUE_END)
|
||||||
{
|
{
|
||||||
/* Returning UNEXPECTED here will cause a EOS message to be sent */
|
/* Returning UNEXPECTED here will cause a EOS message to be sent */
|
||||||
@@ -100,6 +111,9 @@ shell_recorder_src_create (GstPushSrc *push_src,
|
|||||||
- (int)(gst_buffer_get_size(buffer) / 1024));
|
- (int)(gst_buffer_get_size(buffer) / 1024));
|
||||||
|
|
||||||
*buffer_out = buffer;
|
*buffer_out = buffer;
|
||||||
|
GST_BUFFER_DURATION(*buffer_out) = GST_CLOCK_DIFF (src->last_frame_time, gst_clock_get_time (GST_CLOCK (src->clock)));
|
||||||
|
|
||||||
|
src->last_frame_time = gst_clock_get_time (GST_CLOCK (src->clock));
|
||||||
|
|
||||||
return GST_FLOW_OK;
|
return GST_FLOW_OK;
|
||||||
}
|
}
|
||||||
@@ -141,6 +155,8 @@ shell_recorder_src_finalize (GObject *object)
|
|||||||
|
|
||||||
g_mutex_clear (src->mutex);
|
g_mutex_clear (src->mutex);
|
||||||
|
|
||||||
|
gst_object_unref (src->clock);
|
||||||
|
|
||||||
G_OBJECT_CLASS (shell_recorder_src_parent_class)->finalize (object);
|
G_OBJECT_CLASS (shell_recorder_src_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -12,10 +12,10 @@
|
|||||||
#include <gst/gst.h>
|
#include <gst/gst.h>
|
||||||
|
|
||||||
#include <gtk/gtk.h>
|
#include <gtk/gtk.h>
|
||||||
|
#include <gdk/gdk.h>
|
||||||
|
|
||||||
#include "shell-recorder-src.h"
|
#include "shell-recorder-src.h"
|
||||||
#include "shell-recorder.h"
|
#include "shell-recorder.h"
|
||||||
#include "shell-screen-grabber.h"
|
|
||||||
|
|
||||||
#include <clutter/x11/clutter-x11.h>
|
#include <clutter/x11/clutter-x11.h>
|
||||||
#include <X11/extensions/Xfixes.h>
|
#include <X11/extensions/Xfixes.h>
|
||||||
@@ -48,7 +48,7 @@ struct _ShellRecorder {
|
|||||||
int stage_width;
|
int stage_width;
|
||||||
int stage_height;
|
int stage_height;
|
||||||
|
|
||||||
ShellScreenGrabber *grabber;
|
GdkScreen *gdk_screen;
|
||||||
|
|
||||||
gboolean have_pointer;
|
gboolean have_pointer;
|
||||||
int pointer_x;
|
int pointer_x;
|
||||||
@@ -259,11 +259,11 @@ shell_recorder_init (ShellRecorder *recorder)
|
|||||||
|
|
||||||
shell_recorder_src_register ();
|
shell_recorder_src_register ();
|
||||||
|
|
||||||
|
recorder->gdk_screen = gdk_screen_get_default ();
|
||||||
|
|
||||||
recorder->recording_icon = create_recording_icon ();
|
recorder->recording_icon = create_recording_icon ();
|
||||||
recorder->memory_target = get_memory_target();
|
recorder->memory_target = get_memory_target();
|
||||||
|
|
||||||
recorder->grabber = shell_screen_grabber_new ();
|
|
||||||
|
|
||||||
recorder->state = RECORDER_STATE_CLOSED;
|
recorder->state = RECORDER_STATE_CLOSED;
|
||||||
recorder->framerate = DEFAULT_FRAMES_PER_SECOND;
|
recorder->framerate = DEFAULT_FRAMES_PER_SECOND;
|
||||||
}
|
}
|
||||||
@@ -283,8 +283,6 @@ shell_recorder_finalize (GObject *object)
|
|||||||
recorder_set_pipeline (recorder, NULL);
|
recorder_set_pipeline (recorder, NULL);
|
||||||
recorder_set_file_template (recorder, NULL);
|
recorder_set_file_template (recorder, NULL);
|
||||||
|
|
||||||
g_object_unref (recorder->grabber);
|
|
||||||
|
|
||||||
cogl_handle_unref (recorder->recording_icon);
|
cogl_handle_unref (recorder->recording_icon);
|
||||||
|
|
||||||
G_OBJECT_CLASS (shell_recorder_parent_class)->finalize (object);
|
G_OBJECT_CLASS (shell_recorder_parent_class)->finalize (object);
|
||||||
@@ -462,6 +460,12 @@ static void
|
|||||||
recorder_draw_buffer_meter (ShellRecorder *recorder)
|
recorder_draw_buffer_meter (ShellRecorder *recorder)
|
||||||
{
|
{
|
||||||
int fill_level;
|
int fill_level;
|
||||||
|
GdkRectangle primary_monitor;
|
||||||
|
float rects[16];
|
||||||
|
|
||||||
|
gdk_screen_get_monitor_geometry (recorder->gdk_screen,
|
||||||
|
gdk_screen_get_primary_monitor (recorder->gdk_screen),
|
||||||
|
&primary_monitor);
|
||||||
|
|
||||||
recorder_update_memory_used (recorder, FALSE);
|
recorder_update_memory_used (recorder, FALSE);
|
||||||
|
|
||||||
@@ -476,14 +480,27 @@ recorder_draw_buffer_meter (ShellRecorder *recorder)
|
|||||||
fill_level = MIN (60, (recorder->memory_used * 60) / recorder->memory_target);
|
fill_level = MIN (60, (recorder->memory_used * 60) / recorder->memory_target);
|
||||||
|
|
||||||
/* A hollow rectangle filled from the left to fill_level */
|
/* A hollow rectangle filled from the left to fill_level */
|
||||||
cogl_rectangle (recorder->stage_width - 64, recorder->stage_height - 10,
|
rects[0] = primary_monitor.x + primary_monitor.width - 64;
|
||||||
recorder->stage_width - 2, recorder->stage_height - 9);
|
rects[1] = primary_monitor.y + primary_monitor.height - 10;
|
||||||
cogl_rectangle (recorder->stage_width - 64, recorder->stage_height - 9,
|
rects[2] = primary_monitor.x + primary_monitor.width - 2;
|
||||||
recorder->stage_width - (63 - fill_level), recorder->stage_height - 3);
|
rects[3] = primary_monitor.y + primary_monitor.height - 9;
|
||||||
cogl_rectangle (recorder->stage_width - 3, recorder->stage_height - 9,
|
|
||||||
recorder->stage_width - 2, recorder->stage_height - 3);
|
rects[4] = primary_monitor.x + primary_monitor.width - 64;
|
||||||
cogl_rectangle (recorder->stage_width - 64, recorder->stage_height - 3,
|
rects[5] = primary_monitor.y + primary_monitor.height - 9;
|
||||||
recorder->stage_width - 2, recorder->stage_height - 2);
|
rects[6] = primary_monitor.x + primary_monitor.width - (63 - fill_level);
|
||||||
|
rects[7] = primary_monitor.y + primary_monitor.height - 3;
|
||||||
|
|
||||||
|
rects[8] = primary_monitor.x + primary_monitor.width - 3;
|
||||||
|
rects[9] = primary_monitor.y + primary_monitor.height - 9;
|
||||||
|
rects[10] = primary_monitor.x + primary_monitor.width - 2;
|
||||||
|
rects[11] = primary_monitor.y + primary_monitor.height - 3;
|
||||||
|
|
||||||
|
rects[12] = primary_monitor.x + primary_monitor.width - 64;
|
||||||
|
rects[13] = primary_monitor.y + primary_monitor.height - 3;
|
||||||
|
rects[14] = primary_monitor.x + primary_monitor.width - 2;
|
||||||
|
rects[15] = primary_monitor.y + primary_monitor.height - 2;
|
||||||
|
|
||||||
|
cogl_rectangles (rects, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We want to time-stamp each frame based on the actual time it was
|
/* We want to time-stamp each frame based on the actual time it was
|
||||||
@@ -533,8 +550,13 @@ recorder_record_frame (ShellRecorder *recorder)
|
|||||||
|
|
||||||
size = recorder->stage_width * recorder->stage_height * 4;
|
size = recorder->stage_width * recorder->stage_height * 4;
|
||||||
|
|
||||||
data = shell_screen_grabber_grab (recorder->grabber,
|
data = g_malloc (recorder->stage_width * 4 * recorder->stage_height);
|
||||||
0, 0, recorder->stage_width, recorder->stage_height);
|
cogl_read_pixels (0, 0, /* x/y */
|
||||||
|
recorder->stage_width,
|
||||||
|
recorder->stage_height,
|
||||||
|
COGL_READ_PIXELS_COLOR_BUFFER,
|
||||||
|
CLUTTER_CAIRO_FORMAT_ARGB32,
|
||||||
|
data);
|
||||||
|
|
||||||
buffer = gst_buffer_new();
|
buffer = gst_buffer_new();
|
||||||
gst_buffer_insert_memory (buffer, -1,
|
gst_buffer_insert_memory (buffer, -1,
|
||||||
@@ -562,12 +584,17 @@ recorder_on_stage_paint (ClutterActor *actor,
|
|||||||
{
|
{
|
||||||
if (recorder->state == RECORDER_STATE_RECORDING)
|
if (recorder->state == RECORDER_STATE_RECORDING)
|
||||||
{
|
{
|
||||||
|
GdkRectangle primary_monitor;
|
||||||
|
|
||||||
|
gdk_screen_get_monitor_geometry (recorder->gdk_screen,
|
||||||
|
gdk_screen_get_primary_monitor (recorder->gdk_screen),
|
||||||
|
&primary_monitor);
|
||||||
if (!recorder->only_paint)
|
if (!recorder->only_paint)
|
||||||
recorder_record_frame (recorder);
|
recorder_record_frame (recorder);
|
||||||
|
|
||||||
cogl_set_source_texture (recorder->recording_icon);
|
cogl_set_source_texture (recorder->recording_icon);
|
||||||
cogl_rectangle (recorder->stage_width - 32, recorder->stage_height - 42,
|
cogl_rectangle (primary_monitor.x + primary_monitor.width - 32, primary_monitor.y + primary_monitor.height - 42,
|
||||||
recorder->stage_width, recorder->stage_height - 10);
|
primary_monitor.x + primary_monitor.width, primary_monitor.y + primary_monitor.height - 10);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (recorder->state == RECORDER_STATE_RECORDING || recorder->memory_used != 0)
|
if (recorder->state == RECORDER_STATE_RECORDING || recorder->memory_used != 0)
|
||||||
@@ -1703,9 +1730,6 @@ shell_recorder_close (ShellRecorder *recorder)
|
|||||||
recorder->repaint_hook_id = 0;
|
recorder->repaint_hook_id = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
recorder_remove_redraw_timeout (recorder);
|
|
||||||
recorder_close_pipeline (recorder);
|
|
||||||
|
|
||||||
recorder->state = RECORDER_STATE_CLOSED;
|
recorder->state = RECORDER_STATE_CLOSED;
|
||||||
|
|
||||||
/* Release the refcount we took when we started recording */
|
/* Release the refcount we took when we started recording */
|
||||||
|
@@ -1,210 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
|
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <clutter/clutter.h>
|
|
||||||
#include <cogl/cogl.h>
|
|
||||||
#include <GL/gl.h>
|
|
||||||
#include <GL/glx.h>
|
|
||||||
#include <GL/glext.h>
|
|
||||||
|
|
||||||
#include "shell-screen-grabber.h"
|
|
||||||
|
|
||||||
PFNGLBINDBUFFERARBPROC pf_glBindBufferARB;
|
|
||||||
PFNGLBUFFERDATAARBPROC pf_glBufferDataARB;
|
|
||||||
PFNGLDELETEBUFFERSARBPROC pf_glDeleteBuffersARB;
|
|
||||||
PFNGLGENBUFFERSARBPROC pf_glGenBuffersARB;
|
|
||||||
PFNGLMAPBUFFERARBPROC pf_glMapBufferARB;
|
|
||||||
PFNGLUNMAPBUFFERARBPROC pf_glUnmapBufferARB;
|
|
||||||
|
|
||||||
struct _ShellScreenGrabberClass
|
|
||||||
{
|
|
||||||
GObjectClass parent_class;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct _ShellScreenGrabber
|
|
||||||
{
|
|
||||||
GObject parent_instance;
|
|
||||||
|
|
||||||
int have_pixel_buffers;
|
|
||||||
int have_pack_invert;
|
|
||||||
int width, height;
|
|
||||||
GLuint pixel_buffer;
|
|
||||||
};
|
|
||||||
|
|
||||||
G_DEFINE_TYPE(ShellScreenGrabber, shell_screen_grabber, G_TYPE_OBJECT);
|
|
||||||
|
|
||||||
static void
|
|
||||||
shell_screen_grabber_finalize (GObject *gobject)
|
|
||||||
{
|
|
||||||
ShellScreenGrabber *grabber = SHELL_SCREEN_GRABBER (gobject);
|
|
||||||
|
|
||||||
if (grabber->pixel_buffer != 0)
|
|
||||||
pf_glDeleteBuffersARB (1, &grabber->pixel_buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
shell_screen_grabber_class_init (ShellScreenGrabberClass *grabber_class)
|
|
||||||
{
|
|
||||||
GObjectClass *gobject_class = G_OBJECT_CLASS (grabber_class);
|
|
||||||
|
|
||||||
gobject_class->finalize = shell_screen_grabber_finalize;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
shell_screen_grabber_init (ShellScreenGrabber *grabber)
|
|
||||||
{
|
|
||||||
grabber->have_pixel_buffers = -1;
|
|
||||||
grabber->width = -1;
|
|
||||||
grabber->height= -1;
|
|
||||||
grabber->pixel_buffer = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
ShellScreenGrabber *
|
|
||||||
shell_screen_grabber_new (void)
|
|
||||||
{
|
|
||||||
return g_object_new (SHELL_TYPE_SCREEN_GRABBER, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* shell_screen_grabber_grab:
|
|
||||||
* x: X coordinate of the rectangle to grab
|
|
||||||
* y: Y coordinate of the rectangle to grab
|
|
||||||
* width: width of the rectangle to grab
|
|
||||||
* height: heigth of the rectangle to grab
|
|
||||||
*
|
|
||||||
* Grabs pixel data from a portion of the screen.
|
|
||||||
*
|
|
||||||
* Return value: buffer holding the grabbed data. The data is stored as 32-bit
|
|
||||||
* words with native-endian xRGB pixels (i.e., the same as CAIRO_FORMAT_RGB24)
|
|
||||||
* with no padding on the rows. So, the size of the buffer is width * height * 4
|
|
||||||
* bytes. Free with g_free().
|
|
||||||
**/
|
|
||||||
guchar *
|
|
||||||
shell_screen_grabber_grab (ShellScreenGrabber *grabber,
|
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
int width,
|
|
||||||
int height)
|
|
||||||
{
|
|
||||||
guchar *data;
|
|
||||||
gsize row_bytes;
|
|
||||||
gsize data_size;
|
|
||||||
|
|
||||||
row_bytes = width * 4;
|
|
||||||
data_size = row_bytes * height;
|
|
||||||
data = g_malloc (data_size);
|
|
||||||
|
|
||||||
if (grabber->have_pixel_buffers == -1)
|
|
||||||
{
|
|
||||||
const GLubyte* extensions = glGetString (GL_EXTENSIONS);
|
|
||||||
grabber->have_pixel_buffers = strstr ((const char *)extensions, "GL_EXT_pixel_buffer_object") != NULL;
|
|
||||||
grabber->have_pack_invert = strstr ((const char *)extensions, "GL_MESA_pack_invert") != NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (grabber->have_pixel_buffers)
|
|
||||||
{
|
|
||||||
GLubyte *mapped_data;
|
|
||||||
GLint old_swap_bytes, old_lsb_first, old_row_length, old_skip_pixels, old_skip_rows, old_alignment;
|
|
||||||
GLint old_pack_invert = GL_FALSE;
|
|
||||||
GLint vp_size[4];
|
|
||||||
guchar *src_row, *dest_row;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
cogl_flush ();
|
|
||||||
|
|
||||||
if (pf_glBindBufferARB == NULL)
|
|
||||||
{
|
|
||||||
pf_glBindBufferARB = (PFNGLBINDBUFFERARBPROC) cogl_get_proc_address ("glBindBufferARB");
|
|
||||||
pf_glBufferDataARB = (PFNGLBUFFERDATAARBPROC) cogl_get_proc_address ("glBufferDataARB");
|
|
||||||
pf_glDeleteBuffersARB = (PFNGLDELETEBUFFERSARBPROC) cogl_get_proc_address ("glDeleteBuffersARB");
|
|
||||||
pf_glGenBuffersARB = (PFNGLGENBUFFERSARBPROC) cogl_get_proc_address ("glGenBuffersARB");
|
|
||||||
pf_glMapBufferARB = (PFNGLMAPBUFFERARBPROC) cogl_get_proc_address ("glMapBufferARB");
|
|
||||||
pf_glUnmapBufferARB = (PFNGLUNMAPBUFFERARBPROC) cogl_get_proc_address ("glUnmapBufferARB");
|
|
||||||
}
|
|
||||||
|
|
||||||
glGetIntegerv (GL_PACK_SWAP_BYTES, &old_swap_bytes);
|
|
||||||
glGetIntegerv (GL_PACK_LSB_FIRST, &old_lsb_first);
|
|
||||||
glGetIntegerv (GL_PACK_ROW_LENGTH, &old_row_length);
|
|
||||||
glGetIntegerv (GL_PACK_SKIP_PIXELS, &old_skip_pixels);
|
|
||||||
glGetIntegerv (GL_PACK_SKIP_ROWS, &old_skip_rows);
|
|
||||||
glGetIntegerv (GL_PACK_ALIGNMENT, &old_alignment);
|
|
||||||
|
|
||||||
glPixelStorei (GL_PACK_SWAP_BYTES, GL_FALSE);
|
|
||||||
glPixelStorei (GL_PACK_LSB_FIRST, GL_FALSE);
|
|
||||||
glPixelStorei (GL_PACK_ROW_LENGTH, 0);
|
|
||||||
glPixelStorei (GL_PACK_SKIP_PIXELS, 0);
|
|
||||||
glPixelStorei (GL_PACK_SKIP_ROWS, 0);
|
|
||||||
glPixelStorei (GL_PACK_ALIGNMENT, 1);
|
|
||||||
|
|
||||||
if (grabber->have_pack_invert)
|
|
||||||
{
|
|
||||||
glGetIntegerv (GL_PACK_INVERT_MESA, &old_pack_invert);
|
|
||||||
glPixelStorei (GL_PACK_INVERT_MESA, GL_FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (grabber->pixel_buffer != 0 &&
|
|
||||||
(grabber->width != width ||
|
|
||||||
grabber->height != height))
|
|
||||||
{
|
|
||||||
pf_glDeleteBuffersARB (1, &grabber->pixel_buffer);
|
|
||||||
grabber->pixel_buffer = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (grabber->pixel_buffer == 0)
|
|
||||||
{
|
|
||||||
pf_glGenBuffersARB (1, &grabber->pixel_buffer);
|
|
||||||
|
|
||||||
pf_glBindBufferARB (GL_PIXEL_PACK_BUFFER_ARB, grabber->pixel_buffer);
|
|
||||||
pf_glBufferDataARB (GL_PIXEL_PACK_BUFFER_ARB, data_size, 0, GL_STREAM_READ_ARB);
|
|
||||||
|
|
||||||
grabber->width = width;
|
|
||||||
grabber->height = height;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pf_glBindBufferARB (GL_PIXEL_PACK_BUFFER_ARB, grabber->pixel_buffer);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* In OpenGL, (x,y) specifies the bottom-left corner rather than the
|
|
||||||
* top-left */
|
|
||||||
glGetIntegerv (GL_VIEWPORT, vp_size);
|
|
||||||
y = vp_size[3] - (y + height);
|
|
||||||
glReadPixels (x, y, width, height, GL_BGRA, GL_UNSIGNED_BYTE, 0);
|
|
||||||
|
|
||||||
mapped_data = pf_glMapBufferARB (GL_PIXEL_PACK_BUFFER_ARB, GL_READ_ONLY_ARB);
|
|
||||||
|
|
||||||
src_row = mapped_data + (height - 1) * row_bytes;
|
|
||||||
dest_row = data;
|
|
||||||
|
|
||||||
for (i = 0; i < height; i++)
|
|
||||||
{
|
|
||||||
memcpy (dest_row, src_row, row_bytes);
|
|
||||||
src_row -= row_bytes;
|
|
||||||
dest_row += row_bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
pf_glUnmapBufferARB (GL_PIXEL_PACK_BUFFER_ARB);
|
|
||||||
pf_glBindBufferARB (GL_PIXEL_PACK_BUFFER_ARB, 0);
|
|
||||||
|
|
||||||
glPixelStorei (GL_PACK_SWAP_BYTES, old_swap_bytes);
|
|
||||||
glPixelStorei (GL_PACK_LSB_FIRST, old_lsb_first);
|
|
||||||
glPixelStorei (GL_PACK_ROW_LENGTH, old_row_length);
|
|
||||||
glPixelStorei (GL_PACK_SKIP_PIXELS, old_skip_pixels);
|
|
||||||
glPixelStorei (GL_PACK_SKIP_ROWS, old_skip_rows);
|
|
||||||
glPixelStorei (GL_PACK_ALIGNMENT, old_alignment);
|
|
||||||
|
|
||||||
if (grabber->have_pack_invert)
|
|
||||||
glPixelStorei (GL_PACK_INVERT_MESA, old_pack_invert);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
cogl_read_pixels (x, y,
|
|
||||||
width, height,
|
|
||||||
COGL_READ_PIXELS_COLOR_BUFFER,
|
|
||||||
CLUTTER_CAIRO_FORMAT_ARGB32,
|
|
||||||
data);
|
|
||||||
}
|
|
||||||
|
|
||||||
return data;
|
|
||||||
}
|
|
@@ -1,44 +0,0 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
|
||||||
#ifndef __SHELL_SCREEN_GRABBER_H__
|
|
||||||
#define __SHELL_SCREEN_GRABBER_H__
|
|
||||||
|
|
||||||
#include <glib-object.h>
|
|
||||||
|
|
||||||
G_BEGIN_DECLS
|
|
||||||
|
|
||||||
/**
|
|
||||||
* SECTION:shell-screen-grabber
|
|
||||||
* @short_description: Grab pixel data from the screen
|
|
||||||
*
|
|
||||||
* The #ShellScreenGrabber object is used to download previous drawn
|
|
||||||
* content to the screen. It internally uses pixel-buffer objects if
|
|
||||||
* available, otherwise falls back to cogl_read_pixels().
|
|
||||||
*
|
|
||||||
* If you are repeatedly grabbing images of the same size from the
|
|
||||||
* screen, it makes sense to create one #ShellScreenGrabber and keep
|
|
||||||
* it around. Otherwise, it's fine to simply create one as needed and
|
|
||||||
* then get rid of it.
|
|
||||||
*/
|
|
||||||
|
|
||||||
typedef struct _ShellScreenGrabber ShellScreenGrabber;
|
|
||||||
typedef struct _ShellScreenGrabberClass ShellScreenGrabberClass;
|
|
||||||
|
|
||||||
#define SHELL_TYPE_SCREEN_GRABBER (shell_screen_grabber_get_type ())
|
|
||||||
#define SHELL_SCREEN_GRABBER(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), SHELL_TYPE_SCREEN_GRABBER, ShellScreenGrabber))
|
|
||||||
#define SHELL_SCREEN_GRABBER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), SHELL_TYPE_SCREEN_GRABBER, ShellScreenGrabberClass))
|
|
||||||
#define SHELL_IS_SCREEN_GRABBER(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), SHELL_TYPE_SCREEN_GRABBER))
|
|
||||||
#define SHELL_IS_SCREEN_GRABBER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), SHELL_TYPE_SCREEN_GRABBER))
|
|
||||||
#define SHELL_SCREEN_GRABBER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), SHELL_TYPE_SCREEN_GRABBER, ShellScreenGrabberClass))
|
|
||||||
|
|
||||||
GType shell_screen_grabber_get_type (void) G_GNUC_CONST;
|
|
||||||
|
|
||||||
ShellScreenGrabber *shell_screen_grabber_new (void);
|
|
||||||
guchar * shell_screen_grabber_grab (ShellScreenGrabber *grabber,
|
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
int width,
|
|
||||||
int height);
|
|
||||||
|
|
||||||
G_END_DECLS
|
|
||||||
|
|
||||||
#endif /* __SHELL_SCREEN_GRABBER_H__ */
|
|
@@ -1,5 +1,8 @@
|
|||||||
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
|
||||||
|
|
||||||
|
#define COGL_ENABLE_EXPERIMENTAL_API
|
||||||
|
#define CLUTTER_ENABLE_EXPERIMENTAL_API
|
||||||
|
|
||||||
#include <X11/extensions/Xfixes.h>
|
#include <X11/extensions/Xfixes.h>
|
||||||
#include <clutter/x11/clutter-x11.h>
|
#include <clutter/x11/clutter-x11.h>
|
||||||
#include <clutter/clutter.h>
|
#include <clutter/clutter.h>
|
||||||
@@ -10,7 +13,6 @@
|
|||||||
#include <meta/meta-shaped-texture.h>
|
#include <meta/meta-shaped-texture.h>
|
||||||
|
|
||||||
#include "shell-global.h"
|
#include "shell-global.h"
|
||||||
#include "shell-screen-grabber.h"
|
|
||||||
#include "shell-screenshot.h"
|
#include "shell-screenshot.h"
|
||||||
|
|
||||||
struct _ShellScreenshotClass
|
struct _ShellScreenshotClass
|
||||||
@@ -90,18 +92,33 @@ do_grab_screenshot (_screenshot_data *screenshot_data,
|
|||||||
int width,
|
int width,
|
||||||
int height)
|
int height)
|
||||||
{
|
{
|
||||||
ShellScreenGrabber *grabber;
|
CoglBitmap *bitmap;
|
||||||
static const cairo_user_data_key_t key;
|
ClutterBackend *backend;
|
||||||
|
CoglContext *context;
|
||||||
|
int stride;
|
||||||
guchar *data;
|
guchar *data;
|
||||||
|
|
||||||
grabber = shell_screen_grabber_new ();
|
backend = clutter_get_default_backend ();
|
||||||
data = shell_screen_grabber_grab (grabber, x, y, width, height);
|
context = clutter_backend_get_cogl_context (backend);
|
||||||
g_object_unref (grabber);
|
|
||||||
|
|
||||||
screenshot_data->image = cairo_image_surface_create_for_data (data, CAIRO_FORMAT_RGB24,
|
screenshot_data->image = cairo_image_surface_create (CAIRO_FORMAT_RGB24,
|
||||||
width, height, width * 4);
|
width, height);
|
||||||
cairo_surface_set_user_data (screenshot_data->image, &key,
|
|
||||||
data, (cairo_destroy_func_t)g_free);
|
|
||||||
|
data = cairo_image_surface_get_data (screenshot_data->image);
|
||||||
|
stride = cairo_image_surface_get_stride (screenshot_data->image);
|
||||||
|
|
||||||
|
bitmap = cogl_bitmap_new_for_data (context,
|
||||||
|
width,
|
||||||
|
height,
|
||||||
|
CLUTTER_CAIRO_FORMAT_ARGB32,
|
||||||
|
stride,
|
||||||
|
data);
|
||||||
|
cogl_framebuffer_read_pixels_into_bitmap (cogl_get_draw_framebuffer (),
|
||||||
|
x, y,
|
||||||
|
COGL_READ_PIXELS_COLOR_BUFFER,
|
||||||
|
bitmap);
|
||||||
|
cogl_object_unref (bitmap);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -35,6 +35,9 @@ void _shell_wm_kill_window_effects (ShellWM *wm,
|
|||||||
MetaWindowActor *actor);
|
MetaWindowActor *actor);
|
||||||
void _shell_wm_kill_switch_workspace (ShellWM *wm);
|
void _shell_wm_kill_switch_workspace (ShellWM *wm);
|
||||||
|
|
||||||
|
gboolean _shell_wm_filter_keybinding (ShellWM *wm,
|
||||||
|
MetaKeyBinding *binding);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __SHELL_WM_PRIVATE_H__ */
|
#endif /* __SHELL_WM_PRIVATE_H__ */
|
||||||
|
@@ -26,6 +26,7 @@ enum
|
|||||||
SWITCH_WORKSPACE,
|
SWITCH_WORKSPACE,
|
||||||
KILL_SWITCH_WORKSPACE,
|
KILL_SWITCH_WORKSPACE,
|
||||||
KILL_WINDOW_EFFECTS,
|
KILL_WINDOW_EFFECTS,
|
||||||
|
FILTER_KEYBINDING,
|
||||||
|
|
||||||
LAST_SIGNAL
|
LAST_SIGNAL
|
||||||
};
|
};
|
||||||
@@ -115,6 +116,14 @@ shell_wm_class_init (ShellWMClass *klass)
|
|||||||
NULL, NULL, NULL,
|
NULL, NULL, NULL,
|
||||||
G_TYPE_NONE, 1,
|
G_TYPE_NONE, 1,
|
||||||
META_TYPE_WINDOW_ACTOR);
|
META_TYPE_WINDOW_ACTOR);
|
||||||
|
shell_wm_signals[FILTER_KEYBINDING] =
|
||||||
|
g_signal_new ("filter-keybinding",
|
||||||
|
G_TYPE_FROM_CLASS (klass),
|
||||||
|
G_SIGNAL_RUN_LAST,
|
||||||
|
0,
|
||||||
|
g_signal_accumulator_true_handled, NULL, NULL,
|
||||||
|
G_TYPE_BOOLEAN, 1,
|
||||||
|
META_TYPE_KEY_BINDING);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -267,6 +276,17 @@ _shell_wm_destroy (ShellWM *wm,
|
|||||||
g_signal_emit (wm, shell_wm_signals[DESTROY], 0, actor);
|
g_signal_emit (wm, shell_wm_signals[DESTROY], 0, actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
_shell_wm_filter_keybinding (ShellWM *wm,
|
||||||
|
MetaKeyBinding *binding)
|
||||||
|
{
|
||||||
|
gboolean rv;
|
||||||
|
|
||||||
|
g_signal_emit (wm, shell_wm_signals[FILTER_KEYBINDING], 0, binding, &rv);
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* shell_wm_new:
|
* shell_wm_new:
|
||||||
* @plugin: the #MetaPlugin
|
* @plugin: the #MetaPlugin
|
||||||
|
@@ -1073,6 +1073,8 @@ typedef struct {
|
|||||||
gchar *path;
|
gchar *path;
|
||||||
gint grid_width, grid_height;
|
gint grid_width, grid_height;
|
||||||
ClutterActor *actor;
|
ClutterActor *actor;
|
||||||
|
GFunc load_callback;
|
||||||
|
gpointer load_callback_data;
|
||||||
} AsyncImageData;
|
} AsyncImageData;
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1089,6 +1091,7 @@ on_sliced_image_loaded (GObject *source_object,
|
|||||||
GAsyncResult *res,
|
GAsyncResult *res,
|
||||||
gpointer user_data)
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
|
GObject *cache = source_object;
|
||||||
AsyncImageData *data = (AsyncImageData *)user_data;
|
AsyncImageData *data = (AsyncImageData *)user_data;
|
||||||
GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
|
GSimpleAsyncResult *simple = G_SIMPLE_ASYNC_RESULT (res);
|
||||||
GList *list;
|
GList *list;
|
||||||
@@ -1102,6 +1105,9 @@ on_sliced_image_loaded (GObject *source_object,
|
|||||||
clutter_actor_hide (actor);
|
clutter_actor_hide (actor);
|
||||||
clutter_actor_add_child (data->actor, actor);
|
clutter_actor_add_child (data->actor, actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (data->load_callback != NULL)
|
||||||
|
data->load_callback (cache, data->load_callback_data);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -1156,6 +1162,8 @@ load_sliced_image (GSimpleAsyncResult *result,
|
|||||||
* @path: Path to a filename
|
* @path: Path to a filename
|
||||||
* @grid_width: Width in pixels
|
* @grid_width: Width in pixels
|
||||||
* @grid_height: Height in pixels
|
* @grid_height: Height in pixels
|
||||||
|
* @load_callback: (scope async) (allow-none): Function called when the image is loaded, or %NULL
|
||||||
|
* @user_data: Data to pass to the load callback
|
||||||
*
|
*
|
||||||
* This function reads a single image file which contains multiple images internally.
|
* This function reads a single image file which contains multiple images internally.
|
||||||
* The image file will be divided using @grid_width and @grid_height;
|
* The image file will be divided using @grid_width and @grid_height;
|
||||||
@@ -1168,7 +1176,9 @@ ClutterActor *
|
|||||||
st_texture_cache_load_sliced_image (StTextureCache *cache,
|
st_texture_cache_load_sliced_image (StTextureCache *cache,
|
||||||
const gchar *path,
|
const gchar *path,
|
||||||
gint grid_width,
|
gint grid_width,
|
||||||
gint grid_height)
|
gint grid_height,
|
||||||
|
GFunc load_callback,
|
||||||
|
gpointer user_data)
|
||||||
{
|
{
|
||||||
AsyncImageData *data;
|
AsyncImageData *data;
|
||||||
GSimpleAsyncResult *result;
|
GSimpleAsyncResult *result;
|
||||||
@@ -1179,6 +1189,8 @@ st_texture_cache_load_sliced_image (StTextureCache *cache,
|
|||||||
data->grid_height = grid_height;
|
data->grid_height = grid_height;
|
||||||
data->path = g_strdup (path);
|
data->path = g_strdup (path);
|
||||||
data->actor = actor;
|
data->actor = actor;
|
||||||
|
data->load_callback = load_callback;
|
||||||
|
data->load_callback_data = user_data;
|
||||||
g_object_ref (G_OBJECT (actor));
|
g_object_ref (G_OBJECT (actor));
|
||||||
|
|
||||||
result = g_simple_async_result_new (G_OBJECT (cache), on_sliced_image_loaded, data, st_texture_cache_load_sliced_image);
|
result = g_simple_async_result_new (G_OBJECT (cache), on_sliced_image_loaded, data, st_texture_cache_load_sliced_image);
|
||||||
|
@@ -72,7 +72,9 @@ ClutterActor *
|
|||||||
st_texture_cache_load_sliced_image (StTextureCache *cache,
|
st_texture_cache_load_sliced_image (StTextureCache *cache,
|
||||||
const gchar *path,
|
const gchar *path,
|
||||||
gint grid_width,
|
gint grid_width,
|
||||||
gint grid_height);
|
gint grid_height,
|
||||||
|
GFunc load_callback,
|
||||||
|
gpointer user_data);
|
||||||
|
|
||||||
ClutterActor *st_texture_cache_bind_pixbuf_property (StTextureCache *cache,
|
ClutterActor *st_texture_cache_bind_pixbuf_property (StTextureCache *cache,
|
||||||
GObject *object,
|
GObject *object,
|
||||||
|
@@ -31,6 +31,9 @@ struct _StThemeContext {
|
|||||||
PangoFontDescription *font;
|
PangoFontDescription *font;
|
||||||
StThemeNode *root_node;
|
StThemeNode *root_node;
|
||||||
StTheme *theme;
|
StTheme *theme;
|
||||||
|
|
||||||
|
/* set of StThemeNode */
|
||||||
|
GHashTable *nodes;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _StThemeContextClass {
|
struct _StThemeContextClass {
|
||||||
@@ -66,6 +69,8 @@ st_theme_context_finalize (GObject *object)
|
|||||||
(gpointer) st_theme_context_changed,
|
(gpointer) st_theme_context_changed,
|
||||||
context);
|
context);
|
||||||
|
|
||||||
|
if (context->nodes)
|
||||||
|
g_hash_table_unref (context->nodes);
|
||||||
if (context->root_node)
|
if (context->root_node)
|
||||||
g_object_unref (context->root_node);
|
g_object_unref (context->root_node);
|
||||||
if (context->theme)
|
if (context->theme)
|
||||||
@@ -105,6 +110,10 @@ st_theme_context_init (StThemeContext *context)
|
|||||||
"resolution-changed",
|
"resolution-changed",
|
||||||
G_CALLBACK (st_theme_context_changed),
|
G_CALLBACK (st_theme_context_changed),
|
||||||
context);
|
context);
|
||||||
|
|
||||||
|
context->nodes = g_hash_table_new_full ((GHashFunc) st_theme_node_hash,
|
||||||
|
(GEqualFunc) st_theme_node_equal,
|
||||||
|
g_object_unref, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -146,6 +155,7 @@ st_theme_context_changed (StThemeContext *context)
|
|||||||
{
|
{
|
||||||
StThemeNode *old_root = context->root_node;
|
StThemeNode *old_root = context->root_node;
|
||||||
context->root_node = NULL;
|
context->root_node = NULL;
|
||||||
|
g_hash_table_remove_all (context->nodes);
|
||||||
|
|
||||||
emit_changed (context);
|
emit_changed (context);
|
||||||
|
|
||||||
@@ -299,3 +309,27 @@ st_theme_context_get_root_node (StThemeContext *context)
|
|||||||
|
|
||||||
return context->root_node;
|
return context->root_node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* st_theme_context_intern_node:
|
||||||
|
* @context: a #StThemeContext
|
||||||
|
* @node: a #StThemeNode
|
||||||
|
*
|
||||||
|
* Return an existing node matching @node, or if that isn't possible,
|
||||||
|
* @node itself.
|
||||||
|
*
|
||||||
|
* Return value: (transfer none): a node with the same properties as @node
|
||||||
|
*/
|
||||||
|
StThemeNode *
|
||||||
|
st_theme_context_intern_node (StThemeContext *context,
|
||||||
|
StThemeNode *node)
|
||||||
|
{
|
||||||
|
StThemeNode *mine = g_hash_table_lookup (context->nodes, node);
|
||||||
|
|
||||||
|
/* this might be node or not - it doesn't actually matter */
|
||||||
|
if (mine != NULL)
|
||||||
|
return mine;
|
||||||
|
|
||||||
|
g_hash_table_add (context->nodes, g_object_ref (node));
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
@@ -62,6 +62,9 @@ const PangoFontDescription *st_theme_context_get_font (StThemeContext
|
|||||||
|
|
||||||
StThemeNode * st_theme_context_get_root_node (StThemeContext *context);
|
StThemeNode * st_theme_context_get_root_node (StThemeContext *context);
|
||||||
|
|
||||||
|
StThemeNode * st_theme_context_intern_node (StThemeContext *context,
|
||||||
|
StThemeNode *node);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
#endif /* __ST_THEME_CONTEXT_H__ */
|
#endif /* __ST_THEME_CONTEXT_H__ */
|
||||||
|
@@ -1553,7 +1553,7 @@ st_theme_node_paint_borders (StThemeNode *node,
|
|||||||
{
|
{
|
||||||
ClutterColor effective_border;
|
ClutterColor effective_border;
|
||||||
gboolean skip_corner_1, skip_corner_2;
|
gboolean skip_corner_1, skip_corner_2;
|
||||||
float x1, y1, x2, y2;
|
float rects[16];
|
||||||
|
|
||||||
over (&border_color, &node->background_color, &effective_border);
|
over (&border_color, &node->background_color, &effective_border);
|
||||||
alpha = paint_opacity * effective_border.alpha / 255;
|
alpha = paint_opacity * effective_border.alpha / 255;
|
||||||
@@ -1569,46 +1569,44 @@ st_theme_node_paint_borders (StThemeNode *node,
|
|||||||
skip_corner_1 = border_radius[ST_CORNER_TOPLEFT] > 0;
|
skip_corner_1 = border_radius[ST_CORNER_TOPLEFT] > 0;
|
||||||
skip_corner_2 = border_radius[ST_CORNER_TOPRIGHT] > 0;
|
skip_corner_2 = border_radius[ST_CORNER_TOPRIGHT] > 0;
|
||||||
|
|
||||||
x1 = skip_corner_1 ? max_width_radius[ST_CORNER_TOPLEFT] : 0;
|
rects[0] = skip_corner_1 ? max_width_radius[ST_CORNER_TOPLEFT] : 0;
|
||||||
y1 = 0;
|
rects[1] = 0;
|
||||||
x2 = skip_corner_2 ? width - max_width_radius[ST_CORNER_TOPRIGHT] : width;
|
rects[2] = skip_corner_2 ? width - max_width_radius[ST_CORNER_TOPRIGHT] : width;
|
||||||
y2 = border_width[ST_SIDE_TOP];
|
rects[3] = border_width[ST_SIDE_TOP];
|
||||||
cogl_rectangle (x1, y1, x2, y2);
|
|
||||||
|
|
||||||
/* EAST */
|
/* EAST */
|
||||||
skip_corner_1 = border_radius[ST_CORNER_TOPRIGHT] > 0;
|
skip_corner_1 = border_radius[ST_CORNER_TOPRIGHT] > 0;
|
||||||
skip_corner_2 = border_radius[ST_CORNER_BOTTOMRIGHT] > 0;
|
skip_corner_2 = border_radius[ST_CORNER_BOTTOMRIGHT] > 0;
|
||||||
|
|
||||||
x1 = width - border_width[ST_SIDE_RIGHT];
|
rects[4] = width - border_width[ST_SIDE_RIGHT];
|
||||||
y1 = skip_corner_1 ? max_width_radius[ST_CORNER_TOPRIGHT]
|
rects[5] = skip_corner_1 ? max_width_radius[ST_CORNER_TOPRIGHT]
|
||||||
: border_width[ST_SIDE_TOP];
|
: border_width[ST_SIDE_TOP];
|
||||||
x2 = width;
|
rects[6] = width;
|
||||||
y2 = skip_corner_2 ? height - max_width_radius[ST_CORNER_BOTTOMRIGHT]
|
rects[7] = skip_corner_2 ? height - max_width_radius[ST_CORNER_BOTTOMRIGHT]
|
||||||
: height - border_width[ST_SIDE_BOTTOM];
|
: height - border_width[ST_SIDE_BOTTOM];
|
||||||
cogl_rectangle (x1, y1, x2, y2);
|
|
||||||
|
|
||||||
/* SOUTH */
|
/* SOUTH */
|
||||||
skip_corner_1 = border_radius[ST_CORNER_BOTTOMLEFT] > 0;
|
skip_corner_1 = border_radius[ST_CORNER_BOTTOMLEFT] > 0;
|
||||||
skip_corner_2 = border_radius[ST_CORNER_BOTTOMRIGHT] > 0;
|
skip_corner_2 = border_radius[ST_CORNER_BOTTOMRIGHT] > 0;
|
||||||
|
|
||||||
x1 = skip_corner_1 ? max_width_radius[ST_CORNER_BOTTOMLEFT] : 0;
|
rects[8] = skip_corner_1 ? max_width_radius[ST_CORNER_BOTTOMLEFT] : 0;
|
||||||
y1 = height - border_width[ST_SIDE_BOTTOM];
|
rects[9] = height - border_width[ST_SIDE_BOTTOM];
|
||||||
x2 = skip_corner_2 ? width - max_width_radius[ST_CORNER_BOTTOMRIGHT]
|
rects[10] = skip_corner_2 ? width - max_width_radius[ST_CORNER_BOTTOMRIGHT]
|
||||||
: width;
|
: width;
|
||||||
y2 = height;
|
rects[11] = height;
|
||||||
cogl_rectangle (x1, y1, x2, y2);
|
|
||||||
|
|
||||||
/* WEST */
|
/* WEST */
|
||||||
skip_corner_1 = border_radius[ST_CORNER_TOPLEFT] > 0;
|
skip_corner_1 = border_radius[ST_CORNER_TOPLEFT] > 0;
|
||||||
skip_corner_2 = border_radius[ST_CORNER_BOTTOMLEFT] > 0;
|
skip_corner_2 = border_radius[ST_CORNER_BOTTOMLEFT] > 0;
|
||||||
|
|
||||||
x1 = 0;
|
rects[12] = 0;
|
||||||
y1 = skip_corner_1 ? max_width_radius[ST_CORNER_TOPLEFT]
|
rects[13] = skip_corner_1 ? max_width_radius[ST_CORNER_TOPLEFT]
|
||||||
: border_width[ST_SIDE_TOP];
|
: border_width[ST_SIDE_TOP];
|
||||||
x2 = border_width[ST_SIDE_LEFT];
|
rects[14] = border_width[ST_SIDE_LEFT];
|
||||||
y2 = skip_corner_2 ? height - max_width_radius[ST_CORNER_BOTTOMLEFT]
|
rects[15] = skip_corner_2 ? height - max_width_radius[ST_CORNER_BOTTOMLEFT]
|
||||||
: height - border_width[ST_SIDE_BOTTOM];
|
: height - border_width[ST_SIDE_BOTTOM];
|
||||||
cogl_rectangle (x1, y1, x2, y2);
|
|
||||||
|
cogl_rectangles (rects, 4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1875,6 +1873,7 @@ st_theme_node_paint_outline (StThemeNode *node,
|
|||||||
{
|
{
|
||||||
float width, height;
|
float width, height;
|
||||||
int outline_width;
|
int outline_width;
|
||||||
|
float rects[16];
|
||||||
ClutterColor outline_color, effective_outline;
|
ClutterColor outline_color, effective_outline;
|
||||||
|
|
||||||
width = box->x2 - box->x1;
|
width = box->x2 - box->x1;
|
||||||
@@ -1899,20 +1898,30 @@ st_theme_node_paint_outline (StThemeNode *node,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* NORTH */
|
/* NORTH */
|
||||||
cogl_rectangle (-outline_width, -outline_width,
|
rects[0] = -outline_width;
|
||||||
width + outline_width, 0);
|
rects[1] = -outline_width;
|
||||||
|
rects[2] = width + outline_width;
|
||||||
|
rects[3] = 0;
|
||||||
|
|
||||||
/* EAST */
|
/* EAST */
|
||||||
cogl_rectangle (width, 0,
|
rects[4] = width;
|
||||||
width + outline_width, height);
|
rects[5] = 0;
|
||||||
|
rects[6] = width + outline_width;
|
||||||
|
rects[7] = height;
|
||||||
|
|
||||||
/* SOUTH */
|
/* SOUTH */
|
||||||
cogl_rectangle (-outline_width, height,
|
rects[8] = -outline_width;
|
||||||
width + outline_width, height + outline_width);
|
rects[9] = height;
|
||||||
|
rects[10] = width + outline_width;
|
||||||
|
rects[11] = height + outline_width;
|
||||||
|
|
||||||
/* WEST */
|
/* WEST */
|
||||||
cogl_rectangle (-outline_width, 0,
|
rects[12] = -outline_width;
|
||||||
0, height);
|
rects[13] = 0;
|
||||||
|
rects[14] = 0;
|
||||||
|
rects[15] = height;
|
||||||
|
|
||||||
|
cogl_rectangles (rects, 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -2060,6 +2069,9 @@ st_theme_node_copy_cached_paint_state (StThemeNode *node,
|
|||||||
g_return_if_fail (ST_IS_THEME_NODE (node));
|
g_return_if_fail (ST_IS_THEME_NODE (node));
|
||||||
g_return_if_fail (ST_IS_THEME_NODE (other));
|
g_return_if_fail (ST_IS_THEME_NODE (other));
|
||||||
|
|
||||||
|
if (node == other)
|
||||||
|
return;
|
||||||
|
|
||||||
/* Check omitted for speed: */
|
/* Check omitted for speed: */
|
||||||
/* g_return_if_fail (st_theme_node_paint_equal (node, other)); */
|
/* g_return_if_fail (st_theme_node_paint_equal (node, other)); */
|
||||||
|
|
||||||
|
@@ -77,8 +77,8 @@ struct _StThemeNode {
|
|||||||
|
|
||||||
GType element_type;
|
GType element_type;
|
||||||
char *element_id;
|
char *element_id;
|
||||||
char *element_class;
|
GStrv element_classes;
|
||||||
char *pseudo_class;
|
GStrv pseudo_classes;
|
||||||
char *inline_style;
|
char *inline_style;
|
||||||
|
|
||||||
CRDeclaration **properties;
|
CRDeclaration **properties;
|
||||||
|
@@ -41,7 +41,6 @@ struct _StThemeNodeTransitionPrivate {
|
|||||||
|
|
||||||
CoglHandle material;
|
CoglHandle material;
|
||||||
|
|
||||||
ClutterAlpha *alpha;
|
|
||||||
ClutterTimeline *timeline;
|
ClutterTimeline *timeline;
|
||||||
|
|
||||||
guint timeline_completed_id;
|
guint timeline_completed_id;
|
||||||
@@ -91,7 +90,6 @@ st_theme_node_transition_new (StThemeNode *from_node,
|
|||||||
transition->priv->old_theme_node = g_object_ref (from_node);
|
transition->priv->old_theme_node = g_object_ref (from_node);
|
||||||
transition->priv->new_theme_node = g_object_ref (to_node);
|
transition->priv->new_theme_node = g_object_ref (to_node);
|
||||||
|
|
||||||
transition->priv->alpha = clutter_alpha_new ();
|
|
||||||
transition->priv->timeline = clutter_timeline_new (duration);
|
transition->priv->timeline = clutter_timeline_new (duration);
|
||||||
|
|
||||||
transition->priv->timeline_completed_id =
|
transition->priv->timeline_completed_id =
|
||||||
@@ -101,9 +99,7 @@ st_theme_node_transition_new (StThemeNode *from_node,
|
|||||||
g_signal_connect (transition->priv->timeline, "new-frame",
|
g_signal_connect (transition->priv->timeline, "new-frame",
|
||||||
G_CALLBACK (on_timeline_new_frame), transition);
|
G_CALLBACK (on_timeline_new_frame), transition);
|
||||||
|
|
||||||
clutter_alpha_set_mode (transition->priv->alpha, CLUTTER_EASE_IN_OUT_QUAD);
|
clutter_timeline_set_progress_mode (transition->priv->timeline, CLUTTER_EASE_IN_OUT_QUAD);
|
||||||
clutter_alpha_set_timeline (transition->priv->alpha,
|
|
||||||
transition->priv->timeline);
|
|
||||||
|
|
||||||
clutter_timeline_start (transition->priv->timeline);
|
clutter_timeline_start (transition->priv->timeline);
|
||||||
|
|
||||||
@@ -334,7 +330,7 @@ st_theme_node_transition_paint (StThemeNodeTransition *transition,
|
|||||||
}
|
}
|
||||||
|
|
||||||
cogl_color_set_from_4f (&constant, 0., 0., 0.,
|
cogl_color_set_from_4f (&constant, 0., 0., 0.,
|
||||||
clutter_alpha_get_alpha (priv->alpha));
|
clutter_timeline_get_progress (priv->timeline));
|
||||||
cogl_material_set_layer_combine_constant (priv->material, 1, &constant);
|
cogl_material_set_layer_combine_constant (priv->material, 1, &constant);
|
||||||
|
|
||||||
cogl_material_set_color4ub (priv->material,
|
cogl_material_set_color4ub (priv->material,
|
||||||
@@ -412,12 +408,6 @@ st_theme_node_transition_dispose (GObject *object)
|
|||||||
priv->timeline_completed_id = 0;
|
priv->timeline_completed_id = 0;
|
||||||
priv->timeline_new_frame_id = 0;
|
priv->timeline_new_frame_id = 0;
|
||||||
|
|
||||||
if (priv->alpha)
|
|
||||||
{
|
|
||||||
g_object_unref (priv->alpha);
|
|
||||||
priv->alpha = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
G_OBJECT_CLASS (st_theme_node_transition_parent_class)->dispose (object);
|
G_OBJECT_CLASS (st_theme_node_transition_parent_class)->dispose (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -436,8 +426,6 @@ st_theme_node_transition_init (StThemeNodeTransition *transition)
|
|||||||
transition->priv->new_offscreen = NULL;
|
transition->priv->new_offscreen = NULL;
|
||||||
|
|
||||||
transition->priv->needs_setup = TRUE;
|
transition->priv->needs_setup = TRUE;
|
||||||
|
|
||||||
transition->priv->alpha = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -96,8 +96,8 @@ st_theme_node_finalize (GObject *object)
|
|||||||
StThemeNode *node = ST_THEME_NODE (object);
|
StThemeNode *node = ST_THEME_NODE (object);
|
||||||
|
|
||||||
g_free (node->element_id);
|
g_free (node->element_id);
|
||||||
g_free (node->element_class);
|
g_strfreev (node->element_classes);
|
||||||
g_free (node->pseudo_class);
|
g_strfreev (node->pseudo_classes);
|
||||||
g_free (node->inline_style);
|
g_free (node->inline_style);
|
||||||
|
|
||||||
if (node->properties)
|
if (node->properties)
|
||||||
@@ -145,6 +145,33 @@ st_theme_node_finalize (GObject *object)
|
|||||||
G_OBJECT_CLASS (st_theme_node_parent_class)->finalize (object);
|
G_OBJECT_CLASS (st_theme_node_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GStrv
|
||||||
|
split_on_whitespace (const gchar *s)
|
||||||
|
{
|
||||||
|
gchar *cur;
|
||||||
|
gchar *l;
|
||||||
|
gchar *temp;
|
||||||
|
GPtrArray *arr;
|
||||||
|
|
||||||
|
if (s == NULL)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
arr = g_ptr_array_new ();
|
||||||
|
l = g_strdup (s);
|
||||||
|
|
||||||
|
cur = strtok_r (l, " \t\f\r\n", &temp);
|
||||||
|
|
||||||
|
while (cur != NULL)
|
||||||
|
{
|
||||||
|
g_ptr_array_add (arr, g_strdup (cur));
|
||||||
|
cur = strtok_r (NULL, " \t\f\r\n", &temp);
|
||||||
|
}
|
||||||
|
|
||||||
|
g_free (l);
|
||||||
|
g_ptr_array_add (arr, NULL);
|
||||||
|
return (GStrv) g_ptr_array_free (arr, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* st_theme_node_new:
|
* st_theme_node_new:
|
||||||
* @context: the context representing global state for this themed tree
|
* @context: the context representing global state for this themed tree
|
||||||
@@ -201,8 +228,8 @@ st_theme_node_new (StThemeContext *context,
|
|||||||
|
|
||||||
node->element_type = element_type;
|
node->element_type = element_type;
|
||||||
node->element_id = g_strdup (element_id);
|
node->element_id = g_strdup (element_id);
|
||||||
node->element_class = g_strdup (element_class);
|
node->element_classes = split_on_whitespace (element_class);
|
||||||
node->pseudo_class = g_strdup (pseudo_class);
|
node->pseudo_classes = split_on_whitespace (pseudo_class);
|
||||||
node->inline_style = g_strdup (inline_style);
|
node->inline_style = g_strdup (inline_style);
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
@@ -257,20 +284,30 @@ st_theme_node_get_element_id (StThemeNode *node)
|
|||||||
return node->element_id;
|
return node->element_id;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
/**
|
||||||
st_theme_node_get_element_class (StThemeNode *node)
|
* st_theme_node_get_element_classes:
|
||||||
|
*
|
||||||
|
* Returns: (transfer none): the element's classes
|
||||||
|
*/
|
||||||
|
GStrv
|
||||||
|
st_theme_node_get_element_classes (StThemeNode *node)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (ST_IS_THEME_NODE (node), NULL);
|
g_return_val_if_fail (ST_IS_THEME_NODE (node), NULL);
|
||||||
|
|
||||||
return node->element_class;
|
return node->element_classes;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char *
|
/**
|
||||||
st_theme_node_get_pseudo_class (StThemeNode *node)
|
* st_theme_node_get_pseudo_classes:
|
||||||
|
*
|
||||||
|
* Returns: (transfer none): the element's pseudo-classes
|
||||||
|
*/
|
||||||
|
GStrv
|
||||||
|
st_theme_node_get_pseudo_classes (StThemeNode *node)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (ST_IS_THEME_NODE (node), NULL);
|
g_return_val_if_fail (ST_IS_THEME_NODE (node), NULL);
|
||||||
|
|
||||||
return node->pseudo_class;
|
return node->pseudo_classes;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -304,16 +341,91 @@ gboolean
|
|||||||
st_theme_node_equal (StThemeNode *node_a, StThemeNode *node_b)
|
st_theme_node_equal (StThemeNode *node_a, StThemeNode *node_b)
|
||||||
{
|
{
|
||||||
g_return_val_if_fail (ST_IS_THEME_NODE (node_a), FALSE);
|
g_return_val_if_fail (ST_IS_THEME_NODE (node_a), FALSE);
|
||||||
|
|
||||||
|
if (node_a == node_b)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
g_return_val_if_fail (ST_IS_THEME_NODE (node_b), FALSE);
|
g_return_val_if_fail (ST_IS_THEME_NODE (node_b), FALSE);
|
||||||
|
|
||||||
return node_a->parent_node == node_b->parent_node &&
|
if (node_a->parent_node != node_b->parent_node ||
|
||||||
node_a->context == node_b->context &&
|
node_a->context != node_b->context ||
|
||||||
node_a->theme == node_b->theme &&
|
node_a->theme != node_b->theme ||
|
||||||
node_a->element_type == node_b->element_type &&
|
node_a->element_type != node_b->element_type ||
|
||||||
!g_strcmp0 (node_a->element_id, node_b->element_id) &&
|
g_strcmp0 (node_a->element_id, node_b->element_id) ||
|
||||||
!g_strcmp0 (node_a->element_class, node_b->element_class) &&
|
g_strcmp0 (node_a->inline_style, node_b->inline_style))
|
||||||
!g_strcmp0 (node_a->pseudo_class, node_b->pseudo_class) &&
|
return FALSE;
|
||||||
!g_strcmp0 (node_a->inline_style, node_b->inline_style);
|
|
||||||
|
if ((node_a->element_classes == NULL) != (node_b->element_classes == NULL))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if ((node_a->pseudo_classes == NULL) != (node_b->pseudo_classes == NULL))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (node_a->element_classes != NULL)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; ; i++)
|
||||||
|
{
|
||||||
|
if (g_strcmp0 (node_a->element_classes[i],
|
||||||
|
node_b->element_classes[i]))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (node_a->element_classes[i] == NULL)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node_a->pseudo_classes != NULL)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; ; i++)
|
||||||
|
{
|
||||||
|
if (g_strcmp0 (node_a->pseudo_classes[i],
|
||||||
|
node_b->pseudo_classes[i]))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (node_a->pseudo_classes[i] == NULL)
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
guint
|
||||||
|
st_theme_node_hash (StThemeNode *node)
|
||||||
|
{
|
||||||
|
guint hash = GPOINTER_TO_UINT (node->parent_node);
|
||||||
|
|
||||||
|
hash = hash * 33 + GPOINTER_TO_UINT (node->context);
|
||||||
|
hash = hash * 33 + GPOINTER_TO_UINT (node->theme);
|
||||||
|
hash = hash * 33 + ((guint) node->element_type);
|
||||||
|
|
||||||
|
if (node->element_id != NULL)
|
||||||
|
hash = hash * 33 + g_str_hash (node->element_id);
|
||||||
|
|
||||||
|
if (node->inline_style != NULL)
|
||||||
|
hash = hash * 33 + g_str_hash (node->inline_style);
|
||||||
|
|
||||||
|
if (node->element_classes != NULL)
|
||||||
|
{
|
||||||
|
gchar **it;
|
||||||
|
|
||||||
|
for (it = node->element_classes; *it != NULL; it++)
|
||||||
|
hash = hash * 33 + g_str_hash (*it) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (node->pseudo_classes != NULL)
|
||||||
|
{
|
||||||
|
gchar **it;
|
||||||
|
|
||||||
|
for (it = node->pseudo_classes; *it != NULL; it++)
|
||||||
|
hash = hash * 33 + g_str_hash (*it) + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -3440,6 +3552,10 @@ st_theme_node_geometry_equal (StThemeNode *node,
|
|||||||
StSide side;
|
StSide side;
|
||||||
|
|
||||||
g_return_val_if_fail (ST_IS_THEME_NODE (node), FALSE);
|
g_return_val_if_fail (ST_IS_THEME_NODE (node), FALSE);
|
||||||
|
|
||||||
|
if (node == other)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
g_return_val_if_fail (ST_IS_THEME_NODE (other), FALSE);
|
g_return_val_if_fail (ST_IS_THEME_NODE (other), FALSE);
|
||||||
|
|
||||||
_st_theme_node_ensure_geometry (node);
|
_st_theme_node_ensure_geometry (node);
|
||||||
@@ -3484,6 +3600,10 @@ st_theme_node_paint_equal (StThemeNode *node,
|
|||||||
int i;
|
int i;
|
||||||
|
|
||||||
g_return_val_if_fail (ST_IS_THEME_NODE (node), FALSE);
|
g_return_val_if_fail (ST_IS_THEME_NODE (node), FALSE);
|
||||||
|
|
||||||
|
if (node == other)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
g_return_val_if_fail (ST_IS_THEME_NODE (other), FALSE);
|
g_return_val_if_fail (ST_IS_THEME_NODE (other), FALSE);
|
||||||
|
|
||||||
_st_theme_node_ensure_background (node);
|
_st_theme_node_ensure_background (node);
|
||||||
|
@@ -110,11 +110,12 @@ StThemeNode *st_theme_node_get_parent (StThemeNode *node);
|
|||||||
StTheme *st_theme_node_get_theme (StThemeNode *node);
|
StTheme *st_theme_node_get_theme (StThemeNode *node);
|
||||||
|
|
||||||
gboolean st_theme_node_equal (StThemeNode *node_a, StThemeNode *node_b);
|
gboolean st_theme_node_equal (StThemeNode *node_a, StThemeNode *node_b);
|
||||||
|
guint st_theme_node_hash (StThemeNode *node);
|
||||||
|
|
||||||
GType st_theme_node_get_element_type (StThemeNode *node);
|
GType st_theme_node_get_element_type (StThemeNode *node);
|
||||||
const char *st_theme_node_get_element_id (StThemeNode *node);
|
const char *st_theme_node_get_element_id (StThemeNode *node);
|
||||||
const char *st_theme_node_get_element_class (StThemeNode *node);
|
GStrv st_theme_node_get_element_classes (StThemeNode *node);
|
||||||
const char *st_theme_node_get_pseudo_class (StThemeNode *node);
|
GStrv st_theme_node_get_pseudo_classes (StThemeNode *node);
|
||||||
|
|
||||||
/* Generic getters ... these are not cached so are less efficient. The other
|
/* Generic getters ... these are not cached so are less efficient. The other
|
||||||
* reason for adding the more specific version is that we can handle the
|
* reason for adding the more specific version is that we can handle the
|
||||||
|
@@ -448,28 +448,20 @@ st_theme_new (const char *application_stylesheet,
|
|||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
string_in_list (GString *stryng,
|
string_in_list (GString *stryng,
|
||||||
const char *list)
|
GStrv list)
|
||||||
{
|
{
|
||||||
char *cur;
|
gchar **it;
|
||||||
char *l = g_strdup (list);
|
|
||||||
char *temp;
|
|
||||||
gboolean found = FALSE;
|
|
||||||
|
|
||||||
cur = strtok_r (l, " \t\f\r\n", &temp);
|
if (list == NULL)
|
||||||
while (cur != NULL)
|
return FALSE;
|
||||||
|
|
||||||
|
for (it = list; *it != NULL; it++)
|
||||||
{
|
{
|
||||||
if (!strqcmp (cur, stryng->str, stryng->len))
|
if (!strqcmp (*it, stryng->str, stryng->len))
|
||||||
{
|
return TRUE;
|
||||||
found = TRUE;
|
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cur = strtok_r (NULL, " \t\f\r\n", &temp);
|
return FALSE;
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
g_free (l);
|
|
||||||
return found;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
@@ -477,7 +469,7 @@ pseudo_class_add_sel_matches_style (StTheme *a_this,
|
|||||||
CRAdditionalSel *a_add_sel,
|
CRAdditionalSel *a_add_sel,
|
||||||
StThemeNode *a_node)
|
StThemeNode *a_node)
|
||||||
{
|
{
|
||||||
const char *node_pseudo_class;
|
GStrv node_pseudo_classes;
|
||||||
|
|
||||||
g_return_val_if_fail (a_this
|
g_return_val_if_fail (a_this
|
||||||
&& a_add_sel
|
&& a_add_sel
|
||||||
@@ -487,12 +479,10 @@ pseudo_class_add_sel_matches_style (StTheme *a_this,
|
|||||||
&& a_add_sel->content.pseudo->name->stryng->str
|
&& a_add_sel->content.pseudo->name->stryng->str
|
||||||
&& a_node, FALSE);
|
&& a_node, FALSE);
|
||||||
|
|
||||||
node_pseudo_class = st_theme_node_get_pseudo_class (a_node);
|
node_pseudo_classes = st_theme_node_get_pseudo_classes (a_node);
|
||||||
|
|
||||||
if (node_pseudo_class == NULL)
|
return string_in_list (a_add_sel->content.pseudo->name->stryng,
|
||||||
return FALSE;
|
node_pseudo_classes);
|
||||||
|
|
||||||
return string_in_list (a_add_sel->content.pseudo->name->stryng, node_pseudo_class);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -507,7 +497,7 @@ static gboolean
|
|||||||
class_add_sel_matches_style (CRAdditionalSel *a_add_sel,
|
class_add_sel_matches_style (CRAdditionalSel *a_add_sel,
|
||||||
StThemeNode *a_node)
|
StThemeNode *a_node)
|
||||||
{
|
{
|
||||||
const char *element_class;
|
GStrv element_classes;
|
||||||
|
|
||||||
g_return_val_if_fail (a_add_sel
|
g_return_val_if_fail (a_add_sel
|
||||||
&& a_add_sel->type == CLASS_ADD_SELECTOR
|
&& a_add_sel->type == CLASS_ADD_SELECTOR
|
||||||
@@ -516,11 +506,10 @@ class_add_sel_matches_style (CRAdditionalSel *a_add_sel,
|
|||||||
&& a_add_sel->content.class_name->stryng->str
|
&& a_add_sel->content.class_name->stryng->str
|
||||||
&& a_node, FALSE);
|
&& a_node, FALSE);
|
||||||
|
|
||||||
element_class = st_theme_node_get_element_class (a_node);
|
element_classes = st_theme_node_get_element_classes (a_node);
|
||||||
if (element_class == NULL)
|
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
return string_in_list (a_add_sel->content.class_name->stryng, element_class);
|
return string_in_list (a_add_sel->content.class_name->stryng,
|
||||||
|
element_classes);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -316,7 +316,6 @@ st_widget_dispose (GObject *gobject)
|
|||||||
|
|
||||||
if (priv->theme_node)
|
if (priv->theme_node)
|
||||||
{
|
{
|
||||||
g_object_run_dispose (G_OBJECT (priv->theme_node));
|
|
||||||
g_object_unref (priv->theme_node);
|
g_object_unref (priv->theme_node);
|
||||||
priv->theme_node = NULL;
|
priv->theme_node = NULL;
|
||||||
}
|
}
|
||||||
@@ -589,6 +588,8 @@ st_widget_get_theme_node (StWidget *widget)
|
|||||||
|
|
||||||
if (priv->theme_node == NULL)
|
if (priv->theme_node == NULL)
|
||||||
{
|
{
|
||||||
|
StThemeContext *context;
|
||||||
|
StThemeNode *tmp_node;
|
||||||
StThemeNode *parent_node = NULL;
|
StThemeNode *parent_node = NULL;
|
||||||
ClutterStage *stage = NULL;
|
ClutterStage *stage = NULL;
|
||||||
ClutterActor *parent;
|
ClutterActor *parent;
|
||||||
@@ -629,8 +630,8 @@ st_widget_get_theme_node (StWidget *widget)
|
|||||||
else
|
else
|
||||||
pseudo_class = direction_pseudo_class;
|
pseudo_class = direction_pseudo_class;
|
||||||
|
|
||||||
priv->theme_node = st_theme_node_new (st_theme_context_get_for_stage (stage),
|
context = st_theme_context_get_for_stage (stage);
|
||||||
parent_node, priv->theme,
|
tmp_node = st_theme_node_new (context, parent_node, priv->theme,
|
||||||
G_OBJECT_TYPE (widget),
|
G_OBJECT_TYPE (widget),
|
||||||
clutter_actor_get_name (CLUTTER_ACTOR (widget)),
|
clutter_actor_get_name (CLUTTER_ACTOR (widget)),
|
||||||
priv->style_class,
|
priv->style_class,
|
||||||
@@ -639,6 +640,10 @@ st_widget_get_theme_node (StWidget *widget)
|
|||||||
|
|
||||||
if (pseudo_class != direction_pseudo_class)
|
if (pseudo_class != direction_pseudo_class)
|
||||||
g_free (pseudo_class);
|
g_free (pseudo_class);
|
||||||
|
|
||||||
|
priv->theme_node = g_object_ref (st_theme_context_intern_node (context,
|
||||||
|
tmp_node));
|
||||||
|
g_object_unref (tmp_node);
|
||||||
}
|
}
|
||||||
|
|
||||||
return priv->theme_node;
|
return priv->theme_node;
|
||||||
@@ -1526,6 +1531,12 @@ st_widget_recompute_style (StWidget *widget,
|
|||||||
int transition_duration;
|
int transition_duration;
|
||||||
gboolean paint_equal;
|
gboolean paint_equal;
|
||||||
|
|
||||||
|
if (new_theme_node == old_theme_node)
|
||||||
|
{
|
||||||
|
widget->priv->is_style_dirty = FALSE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!old_theme_node ||
|
if (!old_theme_node ||
|
||||||
!st_theme_node_geometry_equal (old_theme_node, new_theme_node))
|
!st_theme_node_geometry_equal (old_theme_node, new_theme_node))
|
||||||
clutter_actor_queue_relayout ((ClutterActor *) widget);
|
clutter_actor_queue_relayout ((ClutterActor *) widget);
|
||||||
|
@@ -47,7 +47,7 @@ on_stage_realized (ClutterActor *stage,
|
|||||||
gpointer data)
|
gpointer data)
|
||||||
{
|
{
|
||||||
recorder = shell_recorder_new (CLUTTER_STAGE (stage));
|
recorder = shell_recorder_new (CLUTTER_STAGE (stage));
|
||||||
shell_recorder_set_file_template (recorder, "test-recorder.ogg");
|
shell_recorder_set_file_template (recorder, "test-recorder.webm");
|
||||||
shell_recorder_record (recorder);
|
shell_recorder_record (recorder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user