Merge remote branch 'origin/master' into zeitgeist

This commit is contained in:
Federico Mena Quintero 2011-03-09 18:50:07 -05:00
commit a70ea12be8
83 changed files with 7623 additions and 3740 deletions

2
.gitignore vendored
View File

@ -44,7 +44,7 @@ src/calendar-server/org.gnome.Shell.CalendarServer.service
src/gnome-shell src/gnome-shell
src/gnome-shell-calendar-server src/gnome-shell-calendar-server
src/gnome-shell-extension-tool src/gnome-shell-extension-tool
src/gnome-shell-installed src/gnome-shell-real
src/gnome-shell-jhbuild src/gnome-shell-jhbuild
src/run-js-test src/run-js-test
src/test-recorder src/test-recorder

View File

@ -1,5 +1,5 @@
AC_PREREQ(2.63) AC_PREREQ(2.63)
AC_INIT([gnome-shell],[2.91.90],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell]) AC_INIT([gnome-shell],[2.91.91],[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])
@ -63,7 +63,7 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.5.15 CLUTTER_MIN_VERSION=1.5.15
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1 GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=0.7.11 GJS_MIN_VERSION=0.7.11
MUTTER_MIN_VERSION=2.91.90 MUTTER_MIN_VERSION=2.91.91
GTK_MIN_VERSION=3.0.0 GTK_MIN_VERSION=3.0.0
GIO_MIN_VERSION=2.25.9 GIO_MIN_VERSION=2.25.9
LIBECAL_MIN_VERSION=2.32.0 LIBECAL_MIN_VERSION=2.32.0
@ -74,20 +74,20 @@ TELEPATHY_GLIB_MIN_VERSION=0.13.12
POLKIT_MIN_VERSION=0.100 POLKIT_MIN_VERSION=0.100
# Collect more than 20 libraries for a prize! # Collect more than 20 libraries for a prize!
PKG_CHECK_MODULES(MUTTER_PLUGIN, gio-2.0 >= $GIO_MIN_VERSION PKG_CHECK_MODULES(GNOME_SHELL, gio-2.0 >= $GIO_MIN_VERSION
gio-unix-2.0 dbus-glib-1 libxml-2.0 gio-unix-2.0 dbus-glib-1 libxml-2.0
gtk+-3.0 >= $GTK_MIN_VERSION gtk+-3.0 >= $GTK_MIN_VERSION
mutter-plugins >= $MUTTER_MIN_VERSION libmutter-wm >= $MUTTER_MIN_VERSION
gjs-internals-1.0 >= $GJS_MIN_VERSION gjs-internals-1.0 >= $GJS_MIN_VERSION
libgnome-menu $recorder_modules gconf-2.0 libgnome-menu $recorder_modules gconf-2.0
gdk-x11-3.0 gdk-x11-3.0
clutter-x11-1.0 >= $CLUTTER_MIN_VERSION clutter-x11-1.0 >= $CLUTTER_MIN_VERSION
clutter-glx-1.0 >= $CLUTTER_MIN_VERSION clutter-glx-1.0 >= $CLUTTER_MIN_VERSION
libstartup-notification-1.0 libstartup-notification-1.0
gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION
libcanberra libcanberra
telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION
polkit-agent-1 >= $POLKIT_MIN_VERSION) polkit-agent-1 >= $POLKIT_MIN_VERSION)
GJS_VERSION=`$PKG_CONFIG --modversion gjs-internals-1.0` GJS_VERSION=`$PKG_CONFIG --modversion gjs-internals-1.0`
AC_DEFINE_UNQUOTED([GJS_VERSION], ["$GJS_VERSION"], [The version of GJS we're linking to]) AC_DEFINE_UNQUOTED([GJS_VERSION], ["$GJS_VERSION"], [The version of GJS we're linking to])
@ -97,8 +97,8 @@ GOBJECT_INTROSPECTION_CHECK([$GOBJECT_INTROSPECTION_MIN_VERSION])
saved_CFLAGS=$CFLAGS saved_CFLAGS=$CFLAGS
saved_LIBS=$LIBS saved_LIBS=$LIBS
CFLAGS=$MUTTER_PLUGIN_CFLAGS CFLAGS=$GNOME_SHELL_CFLAGS
LIBS=$MUTTER_PLUGIN_LIBS LIBS=$GNOME_SHELL_LIBS
# sn_startup_sequence_get_application_id, we can replace with a version check later # sn_startup_sequence_get_application_id, we can replace with a version check later
AC_CHECK_FUNCS(JS_NewGlobalObject sn_startup_sequence_get_application_id) AC_CHECK_FUNCS(JS_NewGlobalObject sn_startup_sequence_get_application_id)
CFLAGS=$saved_CFLAGS CFLAGS=$saved_CFLAGS
@ -134,13 +134,10 @@ PKG_CHECK_MODULES(CALENDAR_SERVER, libecal-1.2 >= $LIBECAL_MIN_VERSION libedatas
AC_SUBST(CALENDAR_SERVER_CFLAGS) AC_SUBST(CALENDAR_SERVER_CFLAGS)
AC_SUBST(CALENDAR_SERVER_LIBS) AC_SUBST(CALENDAR_SERVER_LIBS)
MUTTER_BIN_DIR=`$PKG_CONFIG --variable=exec_prefix mutter-plugins`/bin MUTTER_GIR_DIR=`$PKG_CONFIG --variable=girdir libmutter-wm`
# FIXME: metacity-plugins.pc should point directly to its .gir file MUTTER_TYPELIB_DIR=`$PKG_CONFIG --variable=typelibdir libmutter-wm`
MUTTER_LIB_DIR=`$PKG_CONFIG --variable=libdir mutter-plugins` AC_SUBST(MUTTER_GIR_DIR)
MUTTER_PLUGIN_DIR=`$PKG_CONFIG --variable=plugindir mutter-plugins` AC_SUBST(MUTTER_TYPELIB_DIR)
AC_SUBST(MUTTER_BIN_DIR)
AC_SUBST(MUTTER_LIB_DIR)
AC_SUBST(MUTTER_PLUGIN_DIR)
GJS_CONSOLE=`$PKG_CONFIG --variable=gjs_console gjs-1.0` GJS_CONSOLE=`$PKG_CONFIG --variable=gjs_console gjs-1.0`
AC_SUBST(GJS_CONSOLE) AC_SUBST(GJS_CONSOLE)
@ -207,9 +204,6 @@ AC_ARG_ENABLE(dynamic-mozjs-hack,
ENABLE_DYNAMIC_MOZJS_HACK=$enable_dynamic_mozjs_hack ENABLE_DYNAMIC_MOZJS_HACK=$enable_dynamic_mozjs_hack
AC_SUBST(ENABLE_DYNAMIC_MOZJS_HACK) AC_SUBST(ENABLE_DYNAMIC_MOZJS_HACK)
AC_PATH_PROG(mutter, [mutter])
AC_SUBST(mutter)
AC_CONFIG_FILES([ AC_CONFIG_FILES([
Makefile Makefile
data/Makefile data/Makefile

View File

@ -26,7 +26,8 @@ dist_theme_DATA = \
theme/close.svg \ theme/close.svg \
theme/corner-ripple.png \ theme/corner-ripple.png \
theme/dash-placeholder.svg \ theme/dash-placeholder.svg \
theme/filter-selected.svg \ theme/filter-selected-ltr.svg \
theme/filter-selected-rtl.svg \
theme/gnome-shell.css \ theme/gnome-shell.css \
theme/mosaic-view-active.svg \ theme/mosaic-view-active.svg \
theme/mosaic-view.svg \ theme/mosaic-view.svg \
@ -35,7 +36,7 @@ dist_theme_DATA = \
theme/panel-button-border.svg \ theme/panel-button-border.svg \
theme/panel-button-highlight-narrow.svg \ theme/panel-button-highlight-narrow.svg \
theme/panel-button-highlight-wide.svg \ theme/panel-button-highlight-wide.svg \
theme/process-working.png \ theme/process-working.svg \
theme/running-indicator.svg \ theme/running-indicator.svg \
theme/scroll-button-down-hover.png \ theme/scroll-button-down-hover.png \
theme/scroll-button-down.png \ theme/scroll-button-down.png \

View File

@ -1,24 +1,26 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?> <?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) --> <!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
<svg <svg
xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#" xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg" xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg" xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
version="1.0" version="1.0"
id="Foreground" id="Foreground"
x="0px" x="0px"
y="0px" y="0px"
width="22" width="32"
height="22" height="32"
viewBox="0 0 16 16" viewBox="0 0 23.272727 23.272727"
enable-background="new 0 0 16 16" enable-background="new 0 0 16 16"
xml:space="preserve" xml:space="preserve"
sodipodi:version="0.32" sodipodi:version="0.32"
inkscape:version="0.46" inkscape:version="0.48+devel r10081 custom"
sodipodi:docname="close-window.svg" sodipodi:docname="close-window.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
id="metadata2399"><rdf:RDF><cc:Work id="metadata2399"><rdf:RDF><cc:Work
@ -37,11 +39,49 @@
inkscape:vp_y="0 : 1000 : 0" inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="16 : 8 : 1" inkscape:vp_z="16 : 8 : 1"
inkscape:persp3d-origin="8 : 5.3333333 : 1" inkscape:persp3d-origin="8 : 5.3333333 : 1"
id="perspective2401" /></defs><sodipodi:namedview id="perspective2401" /><filter
inkscape:window-height="999" color-interpolation-filters="sRGB"
inkscape:window-width="1680" inkscape:collect="always"
id="filter16494-4"
x="-0.20989846"
width="1.4197969"
y="-0.20903821"
height="1.4180764"><feGaussianBlur
inkscape:collect="always"
stdDeviation="1.3282637"
id="feGaussianBlur16496-8" /></filter><radialGradient
inkscape:collect="always"
xlink:href="#linearGradient16498-6"
id="radialGradient16504-1"
cx="7.6582627"
cy="5.8191104"
fx="7.6582627"
fy="5.8191104"
r="8.6928644"
gradientTransform="matrix(1.0474339,0,0,1.0517402,-0.3632615,-0.42032492)"
gradientUnits="userSpaceOnUse" /><linearGradient
inkscape:collect="always"
id="linearGradient16498-6"><stop
style="stop-color:#7b7b7b;stop-opacity:1"
offset="0"
id="stop16500-8" /><stop
style="stop-color:#101010;stop-opacity:1"
offset="1"
id="stop16502-0" /></linearGradient><filter
color-interpolation-filters="sRGB"
inkscape:collect="always"
id="filter16524-9"
x="-0.212979"
width="1.425958"
y="-0.21305652"
height="1.426113"><feGaussianBlur
inkscape:collect="always"
stdDeviation="0.71020915"
id="feGaussianBlur16526-0" /></filter></defs><sodipodi:namedview
inkscape:window-height="1114"
inkscape:window-width="1463"
inkscape:pageshadow="2" inkscape:pageshadow="2"
inkscape:pageopacity="1" inkscape:pageopacity="0"
guidetolerance="10.0" guidetolerance="10.0"
gridtolerance="10.0" gridtolerance="10.0"
objecttolerance="10.0" objecttolerance="10.0"
@ -50,27 +90,63 @@
pagecolor="#000000" pagecolor="#000000"
id="base" id="base"
showgrid="false" showgrid="false"
inkscape:zoom="25.648691" inkscape:zoom="1"
inkscape:cx="8.8097603" inkscape:cx="10.720189"
inkscape:cy="9.0472789" inkscape:cy="13.739577"
inkscape:window-x="0" inkscape:window-x="0"
inkscape:window-y="26" inkscape:window-y="26"
inkscape:current-layer="Foreground" inkscape:current-layer="Foreground"
showguides="true" showguides="true"
inkscape:guide-bbox="true" /> inkscape:guide-bbox="true"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:window-maximized="0"><inkscape:grid
type="xygrid"
id="grid11246"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" /></sodipodi:namedview>
<g <g
id="g3175"><path style="display:inline"
sodipodi:nodetypes="csssc" id="g16402-8"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.59217799;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" transform="translate(4.7533483,2.8238929)"><g
id="path2394" id="g3175-4"><path
d="M 0.83987936,8.0425327 C 0.83987936,4.0805265 4.0712155,0.86823453 8.0567103,0.86823453 C 12.042205,0.86823453 15.273542,4.0805265 15.273542,8.0425327 C 15.273542,12.004539 12.042205,15.216831 8.0567103,15.216831 C 4.0712155,15.216831 0.83987936,12.004539 0.83987936,8.0425327 z" sodipodi:type="inkscape:offset"
clip-rule="evenodd" /><g inkscape:radius="0"
id="g3172"><path inkscape:original="M 7.65625 0.125 C 3.2589349 0.125 -0.3125 3.7070002 -0.3125 8.125 C -0.3125 12.543001 3.2589349 16.125 7.65625 16.125 C 12.053566 16.125 15.625 12.543001 15.625 8.125 C 15.625 3.7070002 12.053566 0.125 7.65625 0.125 z "
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.67127273;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" xlink:href="#path2394-32"
d="M 5.4242673,5.3313047 L 10.515414,10.421272 L 10.714004,10.646491" style="opacity:0.52994014;color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.18181825;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter16494-4);enable-background:accumulate"
id="path3152" /></g></g><path id="path16480-5"
style="fill:#ffffff;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.67127273;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" inkscape:href="#path2394-32"
d="M 5.4402527,10.650392 L 10.688082,5.3573033" d="m 7.65625,0.125 c -4.3973151,0 -7.96875,3.5820002 -7.96875,8 0,4.418001 3.5714349,8 7.96875,8 4.397316,0 7.96875,-3.581999 7.96875,-8 0,-4.4179998 -3.571434,-8 -7.96875,-8 z"
id="path3154" transform="translate(0,1.028519)" /><path
sodipodi:nodetypes="cc" /></svg> clip-rule="evenodd"
d="m -0.30428257,8.1237596 c 0,-4.4179998 3.56522987,-7.9999996 7.96254497,-7.9999996 4.3973156,0 7.9625456,3.5819998 7.9625456,7.9999996 0,4.4180014 -3.56523,8.0000004 -7.9625456,8.0000004 -4.3973151,0 -7.96254497,-3.581999 -7.96254497,-8.0000004 z"
id="path2394-32"
style="color:#000000;fill:url(#radialGradient16504-1);fill-opacity:1;fill-rule:nonzero;stroke:#eeeeec;stroke-width:1.4545455;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
sodipodi:nodetypes="csssc"
inkscape:connector-curvature="0" /><g
id="g3172-6" /></g><g
transform="matrix(0.72727273,0,0,0.72727273,2.368236,2.1803254)"
style="fill:#ffffff;fill-opacity:1;display:inline"
id="g27275-6-6"
inkscape:label="window-close"><g
style="fill:#ffffff;fill-opacity:1;display:inline"
id="g27277-1-1"
transform="translate(-41,-760)"><path
sodipodi:type="inkscape:offset"
inkscape:radius="0"
inkscape:original="M 44.21875 764.1875 L 44.21875 765.1875 C 44.19684 765.46825 44.289258 765.74287 44.5 765.9375 L 46.78125 768.21875 L 44.5 770.46875 C 44.31181 770.65692 44.218747 770.92221 44.21875 771.1875 L 44.21875 772.1875 L 45.21875 772.1875 C 45.48404 772.1875 45.749336 772.09444 45.9375 771.90625 L 48.21875 769.625 L 50.5 771.90625 C 50.688164 772.0944 50.953449 772.18749 51.21875 772.1875 L 52.21875 772.1875 L 52.21875 771.1875 C 52.218742 770.9222 52.125688 770.65692 51.9375 770.46875 L 49.6875 768.21875 L 51.96875 765.9375 C 52.18441 765.73815 52.21875 765.47397 52.21875 765.1875 L 52.21875 764.1875 L 51.21875 764.1875 C 50.977922 764.1945 50.796875 764.2695 50.53125 764.5 L 48.21875 766.78125 L 45.9375 764.5 C 45.75987 764.31608 45.504951 764.1987 45.25 764.1875 C 45.23954 764.18704 45.22912 764.18738 45.21875 764.1875 L 44.21875 764.1875 z "
xlink:href="#path27279-0-5"
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78124988;marker:none;visibility:visible;display:inline;overflow:visible;filter:url(#filter16524-9);enable-background:new;font-family:Andale Mono;-inkscape-font-specification:Andale Mono"
id="path16506-5"
inkscape:href="#path27279-0-5"
d="m 44.21875,764.1875 0,1 c -0.02191,0.28075 0.07051,0.55537 0.28125,0.75 l 2.28125,2.28125 -2.28125,2.25 c -0.18819,0.18817 -0.281253,0.45346 -0.28125,0.71875 l 0,1 1,0 c 0.26529,0 0.530586,-0.0931 0.71875,-0.28125 L 48.21875,769.625 50.5,771.90625 c 0.188164,0.18815 0.453449,0.28124 0.71875,0.28125 l 1,0 0,-1 c -8e-6,-0.2653 -0.09306,-0.53058 -0.28125,-0.71875 l -2.25,-2.25 2.28125,-2.28125 c 0.21566,-0.19935 0.25,-0.46353 0.25,-0.75 l 0,-1 -1,0 c -0.240828,0.007 -0.421875,0.082 -0.6875,0.3125 l -2.3125,2.28125 L 45.9375,764.5 c -0.17763,-0.18392 -0.432549,-0.3013 -0.6875,-0.3125 -0.01046,-4.6e-4 -0.02088,-1.2e-4 -0.03125,0 l -1,0 z"
transform="translate(0,1.3535534)" /><path
sodipodi:nodetypes="ccsccccccccccccccccccccccc"
style="font-size:medium;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;text-indent:0;text-align:start;text-decoration:none;line-height:normal;letter-spacing:normal;word-spacing:normal;text-transform:none;direction:ltr;block-progression:tb;writing-mode:lr-tb;text-anchor:start;color:#bebebe;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.78124988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:new;font-family:Andale Mono;-inkscape-font-specification:Andale Mono"
id="path27279-0-5"
inkscape:connector-curvature="0"
d="m 44.226475,764.17222 1,0 c 0.01037,-1.2e-4 0.02079,-4.6e-4 0.03125,0 0.254951,0.0112 0.50987,0.12858 0.6875,0.3125 l 2.28125,2.28125 2.3125,-2.28125 c 0.265625,-0.2305 0.446672,-0.3055 0.6875,-0.3125 l 1,0 0,1 c 0,0.28647 -0.03434,0.55065 -0.25,0.75 l -2.28125,2.28125 2.25,2.25 c 0.188188,0.18817 0.281242,0.45345 0.28125,0.71875 l 0,1 -1,0 c -0.265301,-1e-5 -0.530586,-0.0931 -0.71875,-0.28125 l -2.28125,-2.28125 -2.28125,2.28125 c -0.188164,0.18819 -0.45346,0.28125 -0.71875,0.28125 l -1,0 0,-1 c -3e-6,-0.26529 0.09306,-0.53058 0.28125,-0.71875 l 2.28125,-2.25 -2.28125,-2.28125 c -0.210742,-0.19463 -0.30316,-0.46925 -0.28125,-0.75 l 0,-1 z" /></g></g></g></svg>

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

Before

Width:  |  Height:  |  Size: 2.6 KiB

After

Width:  |  Height:  |  Size: 2.6 KiB

View File

@ -0,0 +1,81 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="10"
height="20"
id="svg10003"
version="1.1"
inkscape:version="0.48.1 r9760"
sodipodi:docname="filter-selected-ltr.svg">
<defs
id="defs10005">
<inkscape:perspective
sodipodi:type="inkscape:persp3d"
inkscape:vp_x="0 : 32 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="64 : 32 : 1"
inkscape:persp3d-origin="32 : 21.333333 : 1"
id="perspective10011" />
<inkscape:perspective
id="perspective9998"
inkscape:persp3d-origin="0.5 : 0.33333333 : 1"
inkscape:vp_z="1 : 0.5 : 1"
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_x="0 : 0.5 : 1"
sodipodi:type="inkscape:persp3d" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:zoom="5.5"
inkscape:cx="32.363636"
inkscape:cy="10.181818"
inkscape:current-layer="layer1"
showgrid="true"
inkscape:document-units="px"
inkscape:grid-bbox="true"
inkscape:window-width="1440"
inkscape:window-height="839"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:window-maximized="1" />
<metadata
id="metadata10008">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
inkscape:label="Layer 1"
inkscape:groupmode="layer"
transform="translate(0,-44)">
<path
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/jimmac/src/cvs/gnome/gnome-shell-design/mockups/app-picker.png"
sodipodi:nodetypes="cccc"
inkscape:connector-curvature="0"
id="rect34320"
d="m 10.369085,54.181804 -10.55634072,10.55636 -1e-5,-21.11269 z"
style="opacity:0.21000001;color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999988;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View File

@ -195,21 +195,19 @@ StTooltip StLabel {
font-weight: bold; font-weight: bold;
} }
#panelLeft { #panelLeft:ltr {
padding-right: 4px; padding-right: 4px;
} }
#panelLeft:rtl { #panelLeft:rtl {
padding-right: 0px;
padding-left: 4px; padding-left: 4px;
} }
#panelRight { #panelRight:ltr {
padding-left: 4px; padding-left: 4px;
} }
#panelRight:rtl { #panelRight:rtl {
padding-left: 0px;
padding-right: 4px; padding-right: 4px;
} }
@ -297,6 +295,11 @@ StTooltip StLabel {
padding-left: 14px; padding-left: 14px;
} }
#legacyTray:rtl {
padding-left: 0px;
padding-right: 14px;
}
#legacyTray:compact { #legacyTray:compact {
spacing: 8px; spacing: 8px;
} }
@ -354,10 +357,13 @@ StTooltip StLabel {
.window-close { .window-close {
background-image: url("close-window.svg"); background-image: url("close-window.svg");
height: 24px; height: 34px;
width: 24px; width: 34px;
-st-background-image-shadow: -2px 2px 6px rgba(0,0,0,0.5); -shell-close-overlap: 20px;
-shell-close-overlap: 16px; }
.window-close:rtl {
-st-background-image-shadow: 2px 2px 6px rgba(0,0,0,0.5);
} }
/* Dash */ /* Dash */
@ -473,10 +479,15 @@ StTooltip StLabel {
} }
#searchResultsContent { #searchResultsContent {
padding: 0 20px 0 0; padding-right: 20px;
spacing: 36px; spacing: 36px;
} }
#searchResultsContent:rtl {
padding-right: 0px;
padding-left: 20px;
}
.search-statustext, .search-statustext,
.search-section-header { .search-section-header {
padding: 4px 12px; padding: 4px 12px;
@ -541,6 +552,11 @@ StTooltip StLabel {
spacing: 20px; spacing: 20px;
} }
.all-app:rtl {
padding-right: 16px;
padding-left: 25px;
}
.app-filter { .app-filter {
font-size: 14px; font-size: 14px;
font-weight: bold; font-weight: bold;
@ -549,12 +565,25 @@ StTooltip StLabel {
width: 200px; width: 200px;
} }
.app-filter:hover {
color: #eee;
}
.app-filter:selected { .app-filter:selected {
color: #ffffff; color: #ffffff;
background-image: url("filter-selected.svg"); background-image: url("filter-selected-ltr.svg");
background-position: 190px 10px; background-position: 190px 10px;
} }
.app-filter:selected:rtl {
background-image: url("filter-selected-rtl.svg");
background-position: 10px 10px;
}
.app-filter:focus {
outline: 1px solid #aaa;
}
.dash-item-container > .app-well-app { .dash-item-container > .app-well-app {
padding: 4px 8px; padding: 4px 8px;
} }
@ -572,7 +601,8 @@ StTooltip StLabel {
.remove-favorite > .overview-icon, .remove-favorite > .overview-icon,
.search-result-content > .overview-icon { .search-result-content > .overview-icon {
border-radius: 4px; border-radius: 4px;
padding: 4px; padding: 3px;
border: 1px rgba(0,0,0,0);
font-size: 10px; font-size: 10px;
color: white; color: white;
transition-duration: 100; transition-duration: 100;
@ -597,6 +627,11 @@ StTooltip StLabel {
transition-duration: 100; transition-duration: 100;
} }
.app-well-app:focus > .overview-icon,
.search-result-content:focus > .overview-icon {
border: 1px solid #cccccc;
}
.app-well-menu { .app-well-menu {
font-size: 12px font-size: 12px
} }
@ -765,6 +800,11 @@ StTooltip StLabel {
background-image: url("calendar-arrow-left.svg"); background-image: url("calendar-arrow-left.svg");
border-radius: 4px; border-radius: 4px;
} }
.calendar-change-month-back:rtl {
background-image: url("calendar-arrow-right.svg");
}
.calendar-change-month-back:hover { .calendar-change-month-back:hover {
background-color: #999999; background-color: #999999;
} }
@ -778,6 +818,11 @@ StTooltip StLabel {
background-image: url("calendar-arrow-right.svg"); background-image: url("calendar-arrow-right.svg");
border-radius: 4px; border-radius: 4px;
} }
.calendar-change-month-forward:rtl {
background-image: url("calendar-arrow-left.svg");
}
.calendar-change-month-forward:hover { .calendar-change-month-forward:hover {
background-color: #999999; background-color: #999999;
} }
@ -872,18 +917,31 @@ StTooltip StLabel {
padding-left: 0.3em; padding-left: 0.3em;
} }
.events-day-header:rtl {
padding-left: 0em;
padding-right: 0.3em;
}
.events-day-dayname { .events-day-dayname {
font-size: 12px; font-size: 12px;
color: rgba(153, 153, 153, 1.0); color: rgba(153, 153, 153, 1.0);
text-align: left; text-align: left;
} }
.events-day-dayname:rtl {
text-align: right;
}
.events-day-time { .events-day-time {
font-size: 12px; font-size: 12px;
color: #fff; color: #fff;
text-align: right; text-align: right;
} }
.events-day-time:rtl {
text-align: left;
}
.events-day-task { .events-day-task {
font-size: 12px; font-size: 12px;
color: rgba(153, 153, 153, 1.0); color: rgba(153, 153, 153, 1.0);
@ -898,6 +956,11 @@ StTooltip StLabel {
padding-right: 8px; padding-right: 8px;
} }
.events-time-box:rtl {
padding-right: 0px;
padding-left: 8px;
}
.events-event-box { .events-event-box {
} }
@ -928,7 +991,7 @@ StTooltip StLabel {
padding-bottom: 8px; padding-bottom: 8px;
} }
.summary-notification-boxpointer { .summary-boxpointer {
-arrow-border-radius: 9px; -arrow-border-radius: 9px;
-arrow-background-color: rgba(0,0,0,0.9); -arrow-background-color: rgba(0,0,0,0.9);
-arrow-border-width: 2px; -arrow-border-width: 2px;
@ -937,12 +1000,18 @@ StTooltip StLabel {
-arrow-rise: 15px; -arrow-rise: 15px;
} }
.summary-notification-boxpointer #notification { .summary-boxpointer #notification {
border-radius: 9px; border-radius: 9px;
background: rgba(0,0,0,0) !important; background: rgba(0,0,0,0) !important;
padding-bottom: 12px; padding-bottom: 12px;
} }
.summary-boxpointer #summary-right-click-menu {
font-size: 14px;
padding-top: 12px;
padding-bottom: 12px;
}
#notification-scrollview { #notification-scrollview {
max-height: 10em; max-height: 10em;
} }
@ -951,10 +1020,14 @@ StTooltip StLabel {
height: 1em; height: 1em;
} }
#notification-scrollview > StScrollBar { #notification-scrollview:ltr > StScrollBar {
padding-left: 6px; padding-left: 6px;
} }
#notification-scrollview:rtl > StScrollBar {
padding-right: 6px;
}
#notification-body { #notification-body {
spacing: 5px; spacing: 5px;
} }
@ -1014,6 +1087,11 @@ StTooltip StLabel {
border-radius: 4px; border-radius: 4px;
} }
.chat-received:rtl {
padding-left: 0px;
padding-right: 4px;
}
.chat-sent { .chat-sent {
background-gradient-direction: horizontal; background-gradient-direction: horizontal;
background-gradient-start: rgba(255, 255, 255, 0); background-gradient-start: rgba(255, 255, 255, 0);
@ -1023,6 +1101,11 @@ StTooltip StLabel {
border-radius: 4px; border-radius: 4px;
} }
.chat-sent:rtl {
padding-left: 0px;
padding-right: 4px;
}
.chat-meta-message { .chat-meta-message {
padding-left: 4px; padding-left: 4px;
border-radius: 4px; border-radius: 4px;
@ -1030,6 +1113,11 @@ StTooltip StLabel {
color: #bbbbbb; color: #bbbbbb;
} }
.chat-meta-message:rtl {
padding-left: 0px;
padding-right: 4px;
}
#notification StEntry { #notification StEntry {
padding: 4px; padding: 4px;
border-radius: 4px; border-radius: 4px;
@ -1066,21 +1154,39 @@ StTooltip StLabel {
height: 36px; height: 36px;
} }
.summary-source-button { #summary-mode:rtl {
padding: 2px 4px 0px 0px;
}
.summary-source-button:ltr {
padding-left: 4px; padding-left: 4px;
padding-right: 16px; padding-right: 16px;
} }
.summary-source-button:last-child { .summary-source-button:rtl {
padding-right: 4px;
padding-left: 16px;
}
.summary-source-button:last-child:ltr {
padding-right: 12px; padding-right: 12px;
} }
.summary-source-button:last-child:rtl {
padding-left: 12px;
}
.source-title { .source-title {
font-size: 12px; font-size: 12px;
font-weight: bold; font-weight: bold;
padding-left: 4px; padding-left: 4px;
} }
.source-title:rtl {
padding-left: 0px;
padding-right: 4px;
}
/* App Switcher */ /* App Switcher */
#altTabPopup { #altTabPopup {
padding: 8px; padding: 8px;
@ -1302,6 +1408,11 @@ StTooltip StLabel {
padding-bottom: 30px; padding-bottom: 30px;
} }
.end-session-dialog-subject:rtl {
padding-left: 0px;
padding-right: 17px;
}
.end-session-dialog-description { .end-session-dialog-description {
font-size: 10pt; font-size: 10pt;
color: white; color: white;
@ -1310,6 +1421,11 @@ StTooltip StLabel {
width: 16em; width: 16em;
} }
.end-session-dialog-description:rtl {
padding-right: 17px;
padding-left: 40px;
}
.end-session-dialog-logout-icon { .end-session-dialog-logout-icon {
border: 2px solid #8b8b8b; border: 2px solid #8b8b8b;
border-radius: 5px; border-radius: 5px;
@ -1331,14 +1447,27 @@ StTooltip StLabel {
padding-right: 32px; padding-right: 32px;
} }
.end-session-dialog-app-list-item { .end-session-dialog-app-list:rtl {
padding-right: 17px;
padding-left: 32px;
}
.end-session-dialog-app-list-item:ltr {
padding-right: 1em; padding-right: 1em;
} }
.end-session-dialog-app-list-item-icon { .end-session-dialog-app-list-item:rtl {
padding-left: 1em;
}
.end-session-dialog-app-list-item-icon:ltr {
padding-right: 17px; padding-right: 17px;
} }
.end-session-dialog-app-list-item-icon:rtl {
padding-left: 17px;
}
.end-session-dialog-app-list-item-name { .end-session-dialog-app-list-item-name {
font-size: 10pt; font-size: 10pt;
} }
@ -1379,10 +1508,19 @@ StTooltip StLabel {
spacing: 10px; spacing: 10px;
} }
.polkit-dialog-password-label { .polkit-dialog-user-layout:rtl {
padding-left: 0px;
padding-right: 10px;
}
.polkit-dialog-password-label:ltr {
padding-right: 0.5em; padding-right: 0.5em;
} }
.polkit-dialog-password-label:rtl {
padding-left: 0.5em;
}
.polkit-dialog-password-entry { .polkit-dialog-password-entry {
background-color: white; background-color: white;
color: black; color: black;

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -0,0 +1,261 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
id="svg5369"
version="1.1"
inkscape:version="0.48+devel r10053 custom"
width="96"
height="48"
sodipodi:docname="process-working.svg"
style="display:inline">
<metadata
id="metadata5375">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<defs
id="defs5373" />
<sodipodi:namedview
pagecolor="#808080"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1975"
inkscape:window-height="1098"
id="namedview5371"
showgrid="true"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:zoom="16"
inkscape:cx="53.997662"
inkscape:cy="22.367695"
inkscape:window-x="1600"
inkscape:window-y="33"
inkscape:window-maximized="0"
inkscape:current-layer="layer2">
<inkscape:grid
type="xygrid"
id="grid11933"
empspacing="5"
visible="true"
enabled="true"
snapvisiblegridlinesonly="true" />
</sodipodi:namedview>
<g
inkscape:groupmode="layer"
id="layer1"
inkscape:label="tiles"
style="display:none">
<rect
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect12451"
width="24"
height="24"
x="0"
y="0" />
<rect
y="24"
x="0"
height="24"
width="24"
id="rect12453"
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
y="0"
x="24"
height="24"
width="24"
id="rect12455"
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect12457"
width="24"
height="24"
x="24"
y="24" />
<rect
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect12459"
width="24"
height="24"
x="48"
y="0" />
<rect
y="24"
x="48"
height="24"
width="24"
id="rect12461"
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
y="0"
x="72"
height="24"
width="24"
id="rect12463"
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<rect
style="color:#000000;fill:#000000;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
id="rect12465"
width="24"
height="24"
x="72"
y="24" />
</g>
<g
inkscape:groupmode="layer"
id="layer2"
inkscape:label="spinner">
<g
transform="matrix(0.28240106,0,0,0.28240106,146.92015,-382.52444)"
id="g10450-5"
style="display:inline">
<path
inkscape:connector-curvature="0"
style="opacity:0.6;color:#000000;fill:none;stroke:#ffffff;stroke-width:7.08212566;stroke-linecap:round;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m -477.76072,1373.3569 0,9.4717"
id="path18768"
sodipodi:nodetypes="cc"
inkscape:transform-center-y="-4.6808838" />
<path
inkscape:connector-curvature="0"
inkscape:transform-center-y="-3.3099227"
sodipodi:nodetypes="cc"
id="path18770"
d="m -461.0171,1380.2922 -7.23427,7.3824"
style="opacity:0.7;color:#000000;fill:none;stroke:#ffffff;stroke-width:7.08212566;stroke-linecap:round;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:transform-center-x="-3.3098966" />
<path
inkscape:connector-curvature="0"
inkscape:transform-center-x="-4.6808962"
style="opacity:0.8;color:#000000;fill:none;stroke:#ffffff;stroke-width:7.08212566;stroke-linecap:round;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m -454.08163,1397.0359 -9.47165,0"
id="path18772"
sodipodi:nodetypes="cc"
inkscape:transform-center-y="-2.6596956e-05" />
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc"
id="path18774"
d="m -461.01709,1413.7796 -6.93831,-7.0864"
style="opacity:0.9;color:#000000;fill:none;stroke:#ffffff;stroke-width:7.08212566;stroke-linecap:round;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:transform-center-x="-3.3098966"
inkscape:transform-center-y="3.3098652" />
<path
inkscape:connector-curvature="0"
inkscape:transform-center-y="4.6808757"
style="color:#000000;fill:none;stroke:#ffffff;stroke-width:7.08212566;stroke-linecap:round;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m -477.76074,1420.715 9e-5,-9.4716"
id="path18776"
sodipodi:nodetypes="cc" />
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc"
id="path18778"
d="m -494.50442,1413.7796 6.79048,-6.9384"
style="opacity:0.3;color:#000000;fill:none;stroke:#ffffff;stroke-width:7.08212566;stroke-linecap:round;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:transform-center-y="3.3098769"
inkscape:transform-center-x="3.3098883" />
<path
inkscape:connector-curvature="0"
inkscape:transform-center-x="4.6808941"
style="opacity:0.4;color:#000000;fill:none;stroke:#ffffff;stroke-width:7.08212566;stroke-linecap:round;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
d="m -501.43987,1397.0359 9.47174,0"
id="path18780"
sodipodi:nodetypes="cc"
inkscape:transform-center-y="-2.6596956e-05" />
<path
inkscape:connector-curvature="0"
sodipodi:nodetypes="cc"
id="path18782"
d="m -494.5044,1380.2922 6.64243,6.9384"
style="opacity:0.5;color:#000000;fill:none;stroke:#ffffff;stroke-width:7.08212566;stroke-linecap:round;stroke-opacity:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
inkscape:transform-center-x="3.3098902"
inkscape:transform-center-y="-3.3099302" />
</g>
<use
style="display:inline"
x="0"
y="0"
xlink:href="#g10450-5"
id="use4981"
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,36,-4.9705636)"
width="400"
height="400" />
<use
style="display:inline"
x="0"
y="0"
xlink:href="#use4981"
id="use4983"
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,43.032478,-21.909695)"
width="400"
height="400" />
<use
style="display:inline"
x="0"
y="0"
xlink:href="#use4983"
id="use4985"
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,50.081986,-38.904617)"
width="400"
height="400" />
<use
style="display:inline"
x="0"
y="0"
xlink:href="#use4985"
id="use4987"
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,-38.919996,-31.872139)"
width="400"
height="400" />
<use
style="display:inline"
x="0"
y="0"
xlink:href="#use4987"
id="use4989"
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,52.986628,2.0890543)"
width="400"
height="400" />
<use
style="display:inline"
x="0"
y="0"
xlink:href="#use4989"
id="use4991"
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,60.013026,-14.912936)"
width="400"
height="400" />
<use
style="display:inline"
x="0"
y="0"
xlink:href="#use4991"
id="use4993"
transform="matrix(0.70710678,0.70710678,-0.70710678,0.70710678,67.022396,-31.859127)"
width="400"
height="400" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 9.8 KiB

View File

@ -2,22 +2,40 @@
const Lang = imports.lang; const Lang = imports.lang;
const Signals = imports.signals; const Signals = imports.signals;
const Clutter = imports.gi.Clutter;
const Params = imports.misc.params;
const DEFAULT_LIMIT = 512; const DEFAULT_LIMIT = 512;
function HistoryManager(settings_key) { function HistoryManager(params) {
this._init(settings_key); this._init(params);
} }
HistoryManager.prototype = { HistoryManager.prototype = {
_init: function(settings_key, limit) { _init: function(params) {
this._limit = limit || DEFAULT_LIMIT; params = Params.parse(params, { gsettingsKey: null,
this._key = settings_key; limit: DEFAULT_LIMIT,
this._history = global.settings.get_strv(settings_key); entry: null });
this._historyIndex = -1;
global.settings.connect('changed::' + settings_key, this._key = params.gsettingsKey;
Lang.bind(this, this._historyChanged)); this._limit = params.limit;
this._historyIndex = 0;
if (this._key) {
this._history = global.settings.get_strv(this._key);
global.settings.connect('changed::' + this._key,
Lang.bind(this, this._historyChanged));
} else {
this._history = [];
}
this._entry = params.entry;
if (this._entry) {
this._entry.connect('key-press-event',
Lang.bind(this, this._onEntryKeyPress));
}
}, },
_historyChanged: function() { _historyChanged: function() {
@ -26,18 +44,32 @@ HistoryManager.prototype = {
}, },
prevItem: function(text) { prevItem: function(text) {
this._setHistory(this._historyIndex--, text); if (this._historyIndex <= 0)
return text;
if (text)
this._history[this._historyIndex] = text;
this._historyIndex--;
return this._indexChanged(); return this._indexChanged();
}, },
nextItem: function(text) { nextItem: function(text) {
this._setHistory(this._historyIndex++, text); if (this._historyIndex >= this._history.length)
return text;
if (text)
this._history[this._historyIndex] = text;
this._historyIndex++;
return this._indexChanged(); return this._indexChanged();
}, },
lastItem: function() { lastItem: function() {
this._historyIndex = this._history.length; if (this._historyIndex != this._history.length) {
return this._indexChanged(); this._historyIndex = this._history.length;
this._indexChanged();
}
return this._historyIndex[this._history.length];
}, },
addItem: function(input) { addItem: function(input) {
@ -45,28 +77,39 @@ HistoryManager.prototype = {
this._history[this._history.length - 1] != input) { this._history[this._history.length - 1] != input) {
this._history.push(input); this._history.push(input);
this._historyIndex = this._history.length;
this._save(); this._save();
} }
}, },
_onEntryKeyPress: function(entry, event) {
let symbol = event.get_key_symbol();
if (symbol == Clutter.KEY_Up) {
this.prevItem(entry.get_text());
return true;
} else if (symbol == Clutter.KEY_Down) {
this.nextItem(entry.get_text());
return true;
}
return false;
},
_indexChanged: function() { _indexChanged: function() {
let current = this._history[this._historyIndex] || ''; let current = this._history[this._historyIndex] || '';
this.emit('changed', current); this.emit('changed', current);
if (this._entry)
this._entry.set_text(current);
return current; return current;
}, },
_setHistory: function(index, text) {
this._historyIndex = Math.max(this._historyIndex, 0);
this._historyIndex = Math.min(this._historyIndex, this._history.length);
if (text)
this._history[index] = text;
},
_save: function() { _save: function() {
if (this._history.length > this._limit) if (this._history.length > this._limit)
this._history.splice(0, this._history.length - this._key); this._history.splice(0, this._history.length - this._limit);
global.settings.set_strv(this._key, this._history);
if (this._key)
global.settings.set_strv(this._key, this._history);
} }
}; };
Signals.addSignalMethods(HistoryManager.prototype); Signals.addSignalMethods(HistoryManager.prototype);

View File

@ -87,7 +87,7 @@ AltTabPopup.prototype = {
let [childMinHeight, childNaturalHeight] = this._appSwitcher.actor.get_preferred_height(primary.width - hPadding); let [childMinHeight, childNaturalHeight] = this._appSwitcher.actor.get_preferred_height(primary.width - hPadding);
let [childMinWidth, childNaturalWidth] = this._appSwitcher.actor.get_preferred_width(childNaturalHeight); let [childMinWidth, childNaturalWidth] = this._appSwitcher.actor.get_preferred_width(childNaturalHeight);
childBox.x1 = Math.max(primary.x + leftPadding, primary.x + Math.floor((primary.width - childNaturalWidth) / 2)); childBox.x1 = Math.max(primary.x + leftPadding, primary.x + Math.floor((primary.width - childNaturalWidth) / 2));
childBox.x2 = Math.min(childBox.x1 + primary.width - hPadding, childBox.x1 + childNaturalWidth); childBox.x2 = Math.min(primary.x + primary.width - hPadding, childBox.x1 + childNaturalWidth);
childBox.y1 = primary.y + Math.floor((primary.height - childNaturalHeight) / 2); childBox.y1 = primary.y + Math.floor((primary.height - childNaturalHeight) / 2);
childBox.y2 = childBox.y1 + childNaturalHeight; childBox.y2 = childBox.y1 + childNaturalHeight;
this._appSwitcher.actor.allocate(childBox, flags); this._appSwitcher.actor.allocate(childBox, flags);

View File

@ -23,6 +23,7 @@ const Workspace = imports.ui.workspace;
const Params = imports.misc.params; const Params = imports.misc.params;
const MENU_POPUP_TIMEOUT = 600; const MENU_POPUP_TIMEOUT = 600;
const SCROLL_TIME = 0.1;
function AlphabeticalView() { function AlphabeticalView() {
this._init(); this._init();
@ -67,6 +68,7 @@ AlphabeticalView.prototype = {
let appIcon = new AppWellIcon(this._appSystem.get_app(appInfo.get_id())); let appIcon = new AppWellIcon(this._appSystem.get_app(appInfo.get_id()));
this._grid.addItem(appIcon.actor); this._grid.addItem(appIcon.actor);
appIcon.actor.connect('key-focus-in', Lang.bind(this, this._ensureIconVisible));
appIcon._appInfo = appInfo; appIcon._appInfo = appInfo;
if (this._filterApp && !this._filterApp(appInfo)) if (this._filterApp && !this._filterApp(appInfo))
@ -75,6 +77,28 @@ AlphabeticalView.prototype = {
this._apps.push(appIcon); this._apps.push(appIcon);
}, },
_ensureIconVisible: function(icon) {
let adjustment = this.actor.vscroll.adjustment;
let [value, lower, upper, stepIncrement, pageIncrement, pageSize] = adjustment.get_values();
let offset = 0;
let vfade = this.actor.get_effect("vfade");
if (vfade)
offset = vfade.fade_offset;
if (icon.y < value + offset)
value = Math.max(0, icon.y - offset);
else if (icon.y + icon.height > value + pageSize - offset)
value = Math.min(upper, icon.y + icon.height + offset - pageSize);
else
return;
Tweener.addTween(adjustment,
{ value: value,
time: SCROLL_TIME,
transition: 'easeOutQuad' });
},
setFilter: function(filter) { setFilter: function(filter) {
this._filterApp = filter; this._filterApp = filter;
for (let i = 0; i < this._apps.length; i++) for (let i = 0; i < this._apps.length; i++)
@ -128,6 +152,12 @@ ViewByCategories.prototype = {
})); }));
this._sections = []; this._sections = [];
// We need a dummy actor to catch the keyboard focus if the
// user Ctrl-Alt-Tabs here before the deferred work creates
// our real contents
this._focusDummy = new St.Bin({ can_focus: true });
this.actor.add(this._focusDummy);
}, },
_scrollFilter: function(actor, event) { _scrollFilter: function(actor, event) {
@ -166,7 +196,8 @@ ViewByCategories.prototype = {
_addFilter: function(name, num) { _addFilter: function(name, num) {
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,
can_focus: true });
this._filters.add(button, { expand: true, x_fill: true, y_fill: false }); this._filters.add(button, { expand: true, x_fill: true, y_fill: false });
button.connect('clicked', Lang.bind(this, function() { button.connect('clicked', Lang.bind(this, function() {
this._selectCategory(num); this._selectCategory(num);
@ -201,6 +232,14 @@ ViewByCategories.prototype = {
this._addFilter(sections[i], i); this._addFilter(sections[i], i);
this._selectCategory(-1); this._selectCategory(-1);
if (this._focusDummy) {
let focused = this._focusDummy.has_key_focus();
this._focusDummy.destroy();
this._focusDummy = null;
if (focused)
this.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
}
} }
}; };
@ -352,6 +391,7 @@ AppWellIcon.prototype = {
this.actor = new St.Button({ style_class: 'app-well-app', this.actor = new St.Button({ style_class: 'app-well-app',
reactive: true, reactive: true,
button_mask: St.ButtonMask.ONE | St.ButtonMask.TWO, button_mask: St.ButtonMask.ONE | St.ButtonMask.TWO,
can_focus: true,
x_fill: true, x_fill: true,
y_fill: true }); y_fill: true });
this.actor._delegate = this; this.actor._delegate = this;
@ -361,6 +401,7 @@ AppWellIcon.prototype = {
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress)); this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
this.actor.connect('clicked', Lang.bind(this, this._onClicked)); this.actor.connect('clicked', Lang.bind(this, this._onClicked));
this.actor.connect('popup-menu', Lang.bind(this, this._onKeyboardPopupMenu));
this._menu = null; this._menu = null;
this._menuManager = new PopupMenu.PopupMenuManager(this); this._menuManager = new PopupMenu.PopupMenuManager(this);
@ -437,6 +478,11 @@ AppWellIcon.prototype = {
return false; return false;
}, },
_onKeyboardPopupMenu: function() {
this.popupMenu();
this._menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
},
getId: function() { getId: function() {
return this.app.get_id(); return this.app.get_id();
}, },
@ -454,6 +500,7 @@ AppWellIcon.prototype = {
if (!isPoppedUp) if (!isPoppedUp)
this._onMenuPoppedDown(); this._onMenuPoppedDown();
})); }));
Main.overview.connect('hiding', Lang.bind(this, function () { this._menu.close(); }));
this._menuManager.addMenu(this._menu); this._menuManager.addMenu(this._menu);
} }

View File

@ -10,11 +10,18 @@ const St = imports.gi.St;
const AltTab = imports.ui.altTab; const AltTab = imports.ui.altTab;
const Main = imports.ui.main; const Main = imports.ui.main;
const Params = imports.misc.params;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const POPUP_APPICON_SIZE = 96; const POPUP_APPICON_SIZE = 96;
const POPUP_FADE_TIME = 0.1; // seconds const POPUP_FADE_TIME = 0.1; // seconds
const SortGroup = {
TOP: 0,
MIDDLE: 1,
BOTTOM: 2
};
function CtrlAltTabManager() { function CtrlAltTabManager() {
this._init(); this._init();
} }
@ -23,14 +30,18 @@ CtrlAltTabManager.prototype = {
_init: function() { _init: function() {
this._items = []; this._items = [];
this._focusManager = St.FocusManager.get_for_stage(global.stage); this._focusManager = St.FocusManager.get_for_stage(global.stage);
Main.wm.setKeybindingHandler('switch_panels', Lang.bind(this,
function (shellwm, binding, window, backwards) {
this.popup(backwards);
}));
}, },
addGroup: function(root, name, icon) { addGroup: function(root, name, icon, params) {
this._items.push({ root: root, name: name, iconName: icon }); let item = Params.parse(params, { sortGroup: SortGroup.MIDDLE,
proxy: root,
focusCallback: null });
item.root = root;
item.name = name;
item.iconName = icon;
this._items.push(item);
root.connect('destroy', Lang.bind(this, function() { this.removeGroup(root); })); root.connect('destroy', Lang.bind(this, function() { this.removeGroup(root); }));
this._focusManager.add_group(root); this._focusManager.add_group(root);
}, },
@ -45,38 +56,73 @@ CtrlAltTabManager.prototype = {
} }
}, },
focusGroup: function(root) { focusGroup: function(item) {
if (global.stage_input_mode == Shell.StageInputMode.NONREACTIVE || if (global.stage_input_mode == Shell.StageInputMode.NONREACTIVE ||
global.stage_input_mode == Shell.StageInputMode.NORMAL) global.stage_input_mode == Shell.StageInputMode.NORMAL)
global.set_stage_input_mode(Shell.StageInputMode.FOCUSED); global.set_stage_input_mode(Shell.StageInputMode.FOCUSED);
root.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
if (item.window)
Main.activateWindow(item.window);
else if (item.focusCallback)
item.focusCallback();
else
item.root.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
},
// Sort the items into a consistent order; panel first, tray last,
// and everything else in between, sorted by X coordinate, so that
// they will have the same left-to-right ordering in the
// Ctrl-Alt-Tab dialog as they do onscreen.
_sortItems: function(a, b) {
if (a.sortGroup != b.sortGroup)
return a.sortGroup - b.sortGroup;
let y;
if (a.x == undefined) {
if (a.window)
a.x = a.window.get_compositor_private().x;
else
[a.x, y] = a.proxy.get_transformed_position();
}
if (b.x == undefined) {
if (b.window)
b.x = b.window.get_compositor_private().x;
else
[b.x, y] = b.proxy.get_transformed_position();
}
return a.x - b.x;
}, },
popup: function(backwards) { popup: function(backwards) {
// Start with the set of focus groups that are currently mapped // Start with the set of focus groups that are currently mapped
let items = this._items.filter(function (item) { return item.root.mapped; }); let items = this._items.filter(function (item) { return item.proxy.mapped; });
// And add the windows metacity would show in its Ctrl-Alt-Tab list // And add the windows metacity would show in its Ctrl-Alt-Tab list
let screen = global.screen; if (!Main.overview.visible) {
let display = screen.get_display(); let screen = global.screen;
let windows = display.get_tab_list(Meta.TabList.DOCKS, screen, screen.get_active_workspace ()); let display = screen.get_display();
let windowTracker = Shell.WindowTracker.get_default(); let windows = display.get_tab_list(Meta.TabList.DOCKS, screen, screen.get_active_workspace ());
let textureCache = St.TextureCache.get_default(); let windowTracker = Shell.WindowTracker.get_default();
for (let i = 0; i < windows.length; i++) { let textureCache = St.TextureCache.get_default();
let icon; for (let i = 0; i < windows.length; i++) {
let app = windowTracker.get_window_app(windows[i]); let icon;
if (app) let app = windowTracker.get_window_app(windows[i]);
icon = app.create_icon_texture(POPUP_APPICON_SIZE); if (app)
else icon = app.create_icon_texture(POPUP_APPICON_SIZE);
icon = textureCache.bind_pixbuf_property(windows[i], 'icon'); else
items.push({ window: windows[i], icon = textureCache.bind_pixbuf_property(windows[i], 'icon');
name: windows[i].title, items.push({ window: windows[i],
iconActor: icon }); name: windows[i].title,
iconActor: icon,
sortGroup: SortGroup.MIDDLE });
}
} }
if (!items.length) if (!items.length)
return; return;
items.sort(Lang.bind(this, this._sortItems));
new CtrlAltTabPopup().show(items, backwards); new CtrlAltTabPopup().show(items, backwards);
} }
}; };
@ -91,12 +137,12 @@ function CtrlAltTabPopup() {
CtrlAltTabPopup.prototype = { CtrlAltTabPopup.prototype = {
_init : function() { _init : function() {
let primary = global.get_primary_monitor(); this.actor = new Shell.GenericContainer({ name: 'ctrlAltTabPopup',
this.actor = new St.BoxLayout({ name: 'ctrlAltTabPopup', reactive: true });
reactive: true,
x: primary.x + primary.width / 2, this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
y: primary.y + primary.height / 2, this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
anchor_gravity: Clutter.Gravity.CENTER }); this.actor.connect('allocate', Lang.bind(this, this._allocate));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
@ -106,6 +152,37 @@ CtrlAltTabPopup.prototype = {
Main.uiGroup.add_actor(this.actor); Main.uiGroup.add_actor(this.actor);
}, },
_getPreferredWidth: function (actor, forHeight, alloc) {
let primary = global.get_primary_monitor();
alloc.min_size = primary.width;
alloc.natural_size = primary.width;
},
_getPreferredHeight: function (actor, forWidth, alloc) {
let primary = global.get_primary_monitor();
alloc.min_size = primary.height;
alloc.natural_size = primary.height;
},
_allocate: function (actor, box, flags) {
let childBox = new Clutter.ActorBox();
let primary = global.get_primary_monitor();
let leftPadding = this.actor.get_theme_node().get_padding(St.Side.LEFT);
let vPadding = this.actor.get_theme_node().get_vertical_padding();
let hPadding = this.actor.get_theme_node().get_horizontal_padding();
let [childMinHeight, childNaturalHeight] = this._switcher.actor.get_preferred_height(primary.width - hPadding);
let [childMinWidth, childNaturalWidth] = this._switcher.actor.get_preferred_width(childNaturalHeight);
childBox.x1 = Math.max(primary.x + leftPadding, primary.x + Math.floor((primary.width - childNaturalWidth) / 2));
childBox.x2 = Math.min(primary.width - hPadding, childBox.x1 + childNaturalWidth);
childBox.y1 = primary.y + Math.floor((primary.height - childNaturalHeight) / 2);
childBox.y2 = childBox.y1 + childNaturalHeight;
this._switcher.actor.allocate(childBox, flags);
},
show : function(items, startBackwards) { show : function(items, startBackwards) {
if (!Main.pushModal(this.actor)) if (!Main.pushModal(this.actor))
return false; return false;
@ -180,11 +257,7 @@ CtrlAltTabPopup.prototype = {
_finish : function() { _finish : function() {
this.destroy(); this.destroy();
let item = this._items[this._selection]; Main.ctrlAltTabManager.focusGroup(this._items[this._selection]);
if (item.root)
Main.ctrlAltTabManager.focusGroup(item.root);
else
Main.activateWindow(item.window);
}, },
_popModal: function() { _popModal: function() {

View File

@ -262,11 +262,6 @@ Dash.prototype = {
clip_to_allocation: true }); clip_to_allocation: true });
this._box._delegate = this; this._box._delegate = this;
// This will eventually be automatic, see
// https://bugzilla.gnome.org/show_bug.cgi?id=584662
if (St.Widget.get_default_direction () == St.TextDirection.RTL)
this._box.add_style_pseudo_class('rtl');
this.actor = new St.Bin({ y_align: St.Align.START, child: this._box }); this.actor = new St.Bin({ y_align: St.Align.START, child: this._box });
this.actor.connect('notify::height', Lang.bind(this, this.actor.connect('notify::height', Lang.bind(this,
function() { function() {

View File

@ -90,6 +90,7 @@ DateMenuButton.prototype = {
vbox.add(item.actor, {y_align: St.Align.END, expand: true, y_fill: false}); vbox.add(item.actor, {y_align: St.Align.END, expand: true, y_fill: false});
item = new PopupMenu.PopupMenuItem(_("Date and Time Settings")); item = new PopupMenu.PopupMenuItem(_("Date and Time Settings"));
item.connect('activate', Lang.bind(this, this._onPreferencesActivate)); item.connect('activate', Lang.bind(this, this._onPreferencesActivate));
item.actor.can_focus = false;
vbox.add(item.actor); vbox.add(item.actor);
// Add vertical separator // Add vertical separator
@ -109,6 +110,7 @@ DateMenuButton.prototype = {
item = new PopupMenu.PopupMenuItem(_("Open Calendar")); item = new PopupMenu.PopupMenuItem(_("Open Calendar"));
item.connect('activate', Lang.bind(this, this._onOpenCalendarActivate)); item.connect('activate', Lang.bind(this, this._onOpenCalendarActivate));
item.actor.can_focus = false;
vbox.add(item.actor, {y_align: St.Align.END, expand: true, y_fill: false}); vbox.add(item.actor, {y_align: St.Align.END, expand: true, y_fill: false});
// Whenever the menu is opened, select today // Whenever the menu is opened, select today

View File

@ -87,6 +87,10 @@ _Draggable.prototype = {
this.actor.connect('destroy', Lang.bind(this, function() { this.actor.connect('destroy', Lang.bind(this, function() {
this._actorDestroyed = true; this._actorDestroyed = true;
// If the drag actor is destroyed and we were going to fix
// up its hover state, fix up the parent hover state instead
if (this.actor == this._firstLeaveActor)
this._firstLeaveActor = this._dragOrigParent;
if (this._dragInProgress) if (this._dragInProgress)
this._cancelDrag(global.get_current_time()); this._cancelDrag(global.get_current_time());
this.disconnectAll(); this.disconnectAll();
@ -101,6 +105,12 @@ _Draggable.prototype = {
this._dragInProgress = false; // The drag has been started, and has not been dropped or cancelled yet. this._dragInProgress = false; // The drag has been started, and has not been dropped or cancelled yet.
this._animationInProgress = false; // The drag is over and the item is in the process of animating to its original position (snapping back or reverting). this._animationInProgress = false; // The drag is over and the item is in the process of animating to its original position (snapping back or reverting).
// During the drag, we eat enter/leave events so that actors don't prelight or show
// tooltips. But we remember the actors that we first left/last entered so we can
// fix up the hover state after the drag ends.
this._firstLeaveActor = null;
this._lastEnterActor = null;
this._eventsGrabbed = false; this._eventsGrabbed = false;
}, },
@ -200,6 +210,11 @@ _Draggable.prototype = {
this._cancelDrag(event.get_time()); this._cancelDrag(event.get_time());
return true; return true;
} }
} else if (event.type() == Clutter.EventType.LEAVE) {
if (this._firstLeaveActor == null)
this._firstLeaveActor = event.get_source();
} else if (event.type() == Clutter.EventType.ENTER) {
this._lastEnterActor = event.get_source();
} }
return false; return false;
@ -465,7 +480,9 @@ _Draggable.prototype = {
let [parentX, parentY] = this._dragOrigParent.get_transformed_position(); let [parentX, parentY] = this._dragOrigParent.get_transformed_position();
let [parentWidth, parentHeight] = this._dragOrigParent.get_size(); let [parentWidth, parentHeight] = this._dragOrigParent.get_size();
let [parentScaledWidth, parentScaledHeight] = this._dragOrigParent.get_transformed_size(); let [parentScaledWidth, parentScaledHeight] = this._dragOrigParent.get_transformed_size();
let parentScale = parentScaledWidth / parentWidth; let parentScale = 1.0;
if (parentWidth != 0)
parentScale = parentScaledWidth / parentWidth;
x = parentX + parentScale * this._dragOrigX; x = parentX + parentScale * this._dragOrigX;
y = parentY + parentScale * this._dragOrigY; y = parentY + parentScale * this._dragOrigY;
@ -481,13 +498,14 @@ _Draggable.prototype = {
}, },
_cancelDrag: function(eventTime) { _cancelDrag: function(eventTime) {
this.emit('drag-cancelled', eventTime);
this._dragInProgress = false; this._dragInProgress = false;
let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation(); let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation();
if (this._actorDestroyed) { if (this._actorDestroyed) {
global.unset_cursor(); global.unset_cursor();
if (!this._buttonDown) if (!this._buttonDown)
this._ungrabEvents(); this._dragComplete();
this.emit('drag-end', eventTime, false); this.emit('drag-end', eventTime, false);
return; return;
} }
@ -544,12 +562,36 @@ _Draggable.prototype = {
this._dragComplete(); this._dragComplete();
}, },
// Actor is an actor we have entered or left during the drag; call
// st_widget_sync_hover on all StWidget ancestors
_syncHover: function(actor) {
while (actor) {
let parent = actor.get_parent();
if (actor instanceof St.Widget)
actor.sync_hover();
actor = parent;
}
},
_dragComplete: function() { _dragComplete: function() {
Shell.util_set_hidden_from_pick(this._dragActor, false); if (!this._actorDestroyed)
Shell.util_set_hidden_from_pick(this._dragActor, false);
this._ungrabEvents();
if (this._firstLeaveActor) {
this._syncHover(this._firstLeaveActor);
this._firstLeaveActor = null;
}
if (this._lastEnterActor) {
this._syncHover(this._lastEnterActor);
this._lastEnterActor = null;
}
this._dragActor = undefined; this._dragActor = undefined;
currentDraggable = null; currentDraggable = null;
this._ungrabEvents();
} }
}; };

View File

@ -28,6 +28,7 @@ var commandHeader = 'const Clutter = imports.gi.Clutter; ' +
'const Meta = imports.gi.Meta; ' + 'const Meta = imports.gi.Meta; ' +
'const Semantic = imports.misc.semantic' + 'const Semantic = imports.misc.semantic' +
'const Shell = imports.gi.Shell; ' + 'const Shell = imports.gi.Shell; ' +
'const Tp = imports.gi.TelepathyGLib; ' +
'const Main = imports.ui.main; ' + 'const Main = imports.ui.main; ' +
'const Lang = imports.lang; ' + 'const Lang = imports.lang; ' +
'const Tweener = imports.ui.tweener; ' + 'const Tweener = imports.ui.tweener; ' +
@ -779,23 +780,8 @@ LookingGlass.prototype = {
return true; return true;
})); }));
this._history = new History.HistoryManager(HISTORY_KEY); this._history = new History.HistoryManager({ gsettingsKey: HISTORY_KEY,
this._history.connect('changed', Lang.bind(this, function(history, text) { entry: this._entry.clutter_text });
this._entry.text = text;
}));
this._entry.clutter_text.connect('key-press-event', Lang.bind(this, function(o, e) {
let symbol = e.get_key_symbol();
if (symbol == Clutter.Up) {
this._history.prevItem(o.get_text());
return true;
} else if (symbol == Clutter.Down) {
this._history.nextItem(o.get_text());
return true;
} else {
return false;
}
}));
}, },
_updateFont: function() { _updateFont: function() {

View File

@ -139,6 +139,7 @@ function start() {
placesManager = new PlaceDisplay.PlacesManager(); placesManager = new PlaceDisplay.PlacesManager();
xdndHandler = new XdndHandler.XdndHandler(); xdndHandler = new XdndHandler.XdndHandler();
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
overview = new Overview.Overview(); overview = new Overview.Overview();
chrome = new Chrome.Chrome(); chrome = new Chrome.Chrome();
magnifier = new Magnifier.Magnifier(); magnifier = new Magnifier.Magnifier();
@ -153,9 +154,6 @@ function start() {
overview.init(); overview.init();
statusIconDispatcher.start(messageTray.actor); statusIconDispatcher.start(messageTray.actor);
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
ctrlAltTabManager.addGroup(panel.actor, _("Panel"), 'gnome-panel');
_startDate = new Date(); _startDate = new Date();
let recorderSettings = new Gio.Settings({ schema: 'org.gnome.shell.recorder' }); let recorderSettings = new Gio.Settings({ schema: 'org.gnome.shell.recorder' });
@ -264,12 +262,28 @@ function _checkWorkspaces() {
emptyWorkspaces.push(false); emptyWorkspaces.push(false);
} }
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
let currentWorkspaceEmpty = emptyWorkspaces[activeWorkspaceIndex];
if (currentWorkspaceEmpty) {
// "Merge" the empty workspace we are removing with the one at the end
wm.blockAnimations();
}
// Delete other empty workspaces; do it from the end to avoid index changes // Delete other empty workspaces; do it from the end to avoid index changes
for (i = emptyWorkspaces.length - 2; i >= 0; i--) { for (i = emptyWorkspaces.length - 2; i >= 0; i--) {
if (emptyWorkspaces[i]) if (emptyWorkspaces[i])
global.screen.remove_workspace(_workspaces[i], global.get_current_time()); global.screen.remove_workspace(_workspaces[i], global.get_current_time());
} }
if (currentWorkspaceEmpty) {
global.screen.get_workspace_by_index(global.screen.n_workspaces - 1).activate(global.get_current_time());
wm.unblockAnimations();
if (!overview.visible)
overview.show();
}
_checkWorkspacesId = 0; _checkWorkspacesId = 0;
return false; return false;
} }

View File

@ -15,6 +15,7 @@ const St = imports.gi.St;
const BoxPointer = imports.ui.boxpointer; const BoxPointer = imports.ui.boxpointer;
const GnomeSession = imports.misc.gnomeSession; const GnomeSession = imports.misc.gnomeSession;
const Main = imports.ui.main; const Main = imports.ui.main;
const PopupMenu = imports.ui.popupMenu;
const Params = imports.misc.params; const Params = imports.misc.params;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
const Util = imports.misc.util; const Util = imports.misc.util;
@ -517,25 +518,28 @@ Notification.prototype = {
this._updated(); this._updated();
}, },
_createScrollArea: function() {
this.actor.add_style_class_name('multi-line-notification');
this._scrollArea = new St.ScrollView({ name: 'notification-scrollview',
vscrollbar_policy: Gtk.PolicyType.AUTOMATIC,
hscrollbar_policy: Gtk.PolicyType.NEVER,
vfade: true });
this.actor.add(this._scrollArea, { row: 1, col: 1 });
this._contentArea = new St.BoxLayout({ name: 'notification-body',
vertical: true });
this._scrollArea.add_actor(this._contentArea);
// If we know the notification will be expandable, we need to add
// the banner text to the body as the first element.
this._addBannerBody();
},
// addActor: // addActor:
// @actor: actor to add to the body of the notification // @actor: actor to add to the body of the notification
// //
// Appends @actor to the notification's body // Appends @actor to the notification's body
addActor: function(actor, style) { addActor: function(actor, style) {
if (!this._scrollArea) { if (!this._scrollArea) {
this.actor.add_style_class_name('multi-line-notification'); this._createScrollArea();
this._scrollArea = new St.ScrollView({ name: 'notification-scrollview',
vscrollbar_policy: Gtk.PolicyType.AUTOMATIC,
hscrollbar_policy: Gtk.PolicyType.NEVER,
vfade: true });
this.actor.add(this._scrollArea, { row: 1,
col: 1 });
this._contentArea = new St.BoxLayout({ name: 'notification-body',
vertical: true });
this._scrollArea.add_actor(this._contentArea);
// If we know the notification will be expandable, we need to add
// the banner text to the body as the first element.
this._addBannerBody();
} }
this._contentArea.add(actor, style ? style : {}); this._contentArea.add(actor, style ? style : {});
@ -570,11 +574,6 @@ Notification.prototype = {
// //
// Scrolls the content area (if scrollable) to the indicated edge // Scrolls the content area (if scrollable) to the indicated edge
scrollTo: function(side) { scrollTo: function(side) {
// Hack to force a relayout, since the caller probably
// just added or removed something to scrollArea, and
// the adjustment needs to reflect that.
global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, 0, 0);
let adjustment = this._scrollArea.vscroll.adjustment; let adjustment = this._scrollArea.vscroll.adjustment;
if (side == St.Side.TOP) if (side == St.Side.TOP)
adjustment.value = adjustment.lower; adjustment.value = adjustment.lower;
@ -853,7 +852,7 @@ Source.prototype = {
this.notification = notification; this.notification = notification;
this._notificationClickedId = notification.connect('clicked', Lang.bind(this, this._notificationClicked)); this._notificationClickedId = notification.connect('clicked', Lang.bind(this, this.open));
this._notificationDestroyedId = notification.connect('destroy', Lang.bind(this, this._notificationDestroyedId = notification.connect('destroy', Lang.bind(this,
function () { function () {
if (this.notification == notification) { if (this.notification == notification) {
@ -881,7 +880,7 @@ Source.prototype = {
}, },
// Default implementation is to do nothing, but subclasses can override // Default implementation is to do nothing, but subclasses can override
_notificationClicked: function(notification) { open: function(notification) {
}, },
// Default implementation is to destroy this source, but subclasses can override // Default implementation is to destroy this source, but subclasses can override
@ -917,6 +916,27 @@ SummaryItem.prototype = {
this._sourceBox.add_actor(this._sourceIcon); this._sourceBox.add_actor(this._sourceIcon);
this._sourceBox.add_actor(this._sourceTitleBin, { expand: true }); this._sourceBox.add_actor(this._sourceTitleBin, { expand: true });
this.actor.child = this._sourceBox; this.actor.child = this._sourceBox;
this.rightClickMenu = new St.BoxLayout({ name: 'summary-right-click-menu',
vertical: true });
let item;
item = new PopupMenu.PopupMenuItem(_("Open"));
item.connect('activate', Lang.bind(this, function() {
source.open();
this.emit('right-click-menu-done-displaying');
}));
this.rightClickMenu.add(item.actor);
item = new PopupMenu.PopupMenuItem(_("Remove"));
item.connect('activate', Lang.bind(this, function() {
source.destroy();
this.emit('right-click-menu-done-displaying');
}));
this.rightClickMenu.add(item.actor);
let focusManager = St.FocusManager.get_for_stage(global.stage);
focusManager.add_group(this.rightClickMenu);
}, },
// getTitleNaturalWidth, getTitleWidth, and setTitleWidth include // getTitleNaturalWidth, getTitleWidth, and setTitleWidth include
@ -943,6 +963,7 @@ SummaryItem.prototype = {
this._sourceTitle.clutter_text.ellipsize = mode; this._sourceTitle.clutter_text.ellipsize = mode;
} }
}; };
Signals.addSignalMethods(SummaryItem.prototype);
function MessageTray() { function MessageTray() {
this._init(); this._init();
@ -980,17 +1001,19 @@ MessageTray.prototype = {
this._summaryMotionId = 0; this._summaryMotionId = 0;
this._summaryNotificationBoxPointer = new BoxPointer.BoxPointer(St.Side.BOTTOM, this._summaryBoxPointer = new BoxPointer.BoxPointer(St.Side.BOTTOM,
{ reactive: true, { reactive: true,
track_hover: true }); track_hover: true });
this._summaryNotificationBoxPointer.actor.style_class = 'summary-notification-boxpointer'; this._summaryBoxPointer.actor.style_class = 'summary-boxpointer';
this.actor.add_actor(this._summaryNotificationBoxPointer.actor); this.actor.add_actor(this._summaryBoxPointer.actor);
this._summaryNotificationBoxPointer.actor.lower_bottom(); this._summaryBoxPointer.actor.lower_bottom();
this._summaryNotificationBoxPointer.actor.hide(); this._summaryBoxPointer.actor.hide();
this._summaryNotification = null; this._summaryNotification = null;
this._summaryNotificationClickedId = 0; this._summaryNotificationClickedId = 0;
this._summaryRightClickMenuClickedId = 0;
this._clickedSummaryItem = null; this._clickedSummaryItem = null;
this._clickedSummaryItemMouseButton = -1;
this._clickedSummaryItemAllocationChangedId = 0; this._clickedSummaryItemAllocationChangedId = 0;
this._expandedSummaryItem = null; this._expandedSummaryItem = null;
this._summaryItemTitleWidth = 0; this._summaryItemTitleWidth = 0;
@ -1004,7 +1027,7 @@ MessageTray.prototype = {
this._focusGrabber = new FocusGrabber(); this._focusGrabber = new FocusGrabber();
this._focusGrabber.connect('focus-grabbed', Lang.bind(this, this._focusGrabber.connect('focus-grabbed', Lang.bind(this,
function() { function() {
if (this._summaryNotification) if (this._summaryBoxPointer.bin.child)
this._lock(); this._lock();
})); }));
this._focusGrabber.connect('focus-ungrabbed', Lang.bind(this, this._unlock)); this._focusGrabber.connect('focus-ungrabbed', Lang.bind(this, this._unlock));
@ -1027,7 +1050,7 @@ MessageTray.prototype = {
this._notificationState = State.HIDDEN; this._notificationState = State.HIDDEN;
this._notificationTimeoutId = 0; this._notificationTimeoutId = 0;
this._notificationExpandedId = 0; this._notificationExpandedId = 0;
this._summaryNotificationState = State.HIDDEN; this._summaryBoxPointerState = State.HIDDEN;
this._summaryNotificationTimeoutId = 0; this._summaryNotificationTimeoutId = 0;
this._summaryNotificationExpandedId = 0; this._summaryNotificationExpandedId = 0;
this._overviewVisible = Main.overview.visible; this._overviewVisible = Main.overview.visible;
@ -1037,7 +1060,7 @@ MessageTray.prototype = {
Main.chrome.addActor(this.actor, { affectsStruts: false, Main.chrome.addActor(this.actor, { affectsStruts: false,
visibleInOverview: true }); visibleInOverview: true });
Main.chrome.trackActor(this._notificationBin); Main.chrome.trackActor(this._notificationBin);
Main.chrome.trackActor(this._summaryNotificationBoxPointer.actor); Main.chrome.trackActor(this._summaryBoxPointer.actor);
global.gdk_screen.connect('monitors-changed', Lang.bind(this, this._setSizePosition)); global.gdk_screen.connect('monitors-changed', Lang.bind(this, this._setSizePosition));
@ -1138,9 +1161,9 @@ MessageTray.prototype = {
this._onSummaryItemHoverChanged(summaryItem); this._onSummaryItemHoverChanged(summaryItem);
})); }));
summaryItem.actor.connect('clicked', Lang.bind(this, summaryItem.actor.connect('button-press-event', Lang.bind(this,
function () { function (actor, event) {
this._onSummaryItemClicked(summaryItem); this._onSummaryItemClicked(summaryItem, event);
})); }));
source.connect('destroy', Lang.bind(this, this._onSourceDestroy)); source.connect('destroy', Lang.bind(this, this._onSourceDestroy));
@ -1157,7 +1180,7 @@ MessageTray.prototype = {
if (index == -1) if (index == -1)
return; return;
this._summaryItems[index].actor.destroy(); let summaryItemToRemove = this._summaryItems[index];
let newSummaryItemsIndex = this._newSummaryItems.indexOf(this._summaryItems[index]); let newSummaryItemsIndex = this._newSummaryItems.indexOf(this._summaryItems[index]);
if (newSummaryItemsIndex != -1) if (newSummaryItemsIndex != -1)
@ -1168,6 +1191,9 @@ MessageTray.prototype = {
if (source.isChat) if (source.isChat)
this._chatSummaryItemsCount--; this._chatSummaryItemsCount--;
if (this._expandedSummaryItem == summaryItemToRemove)
this._expandedSummaryItem = null;
if (this._longestSummaryItem.source == source) { if (this._longestSummaryItem.source == source) {
let newTitleWidth = 0; let newTitleWidth = 0;
this._longestSummaryItem = null; this._longestSummaryItem = null;
@ -1192,11 +1218,13 @@ MessageTray.prototype = {
this._notificationRemoved = true; this._notificationRemoved = true;
needUpdate = true; needUpdate = true;
} }
if (this._clickedSummaryItem && this._clickedSummaryItem.source == source) { if (this._clickedSummaryItem == summaryItemToRemove) {
this._unsetClickedSummaryItem(); this._unsetClickedSummaryItem();
needUpdate = true; needUpdate = true;
} }
summaryItemToRemove.actor.destroy();
if (needUpdate); if (needUpdate);
this._updateState(); this._updateState();
@ -1349,11 +1377,16 @@ MessageTray.prototype = {
this._expandedSummaryItem.setEllipsization(Pango.EllipsizeMode.END); this._expandedSummaryItem.setEllipsization(Pango.EllipsizeMode.END);
}, },
_onSummaryItemClicked: function(summaryItem) { _onSummaryItemClicked: function(summaryItem, event) {
if (!this._clickedSummaryItem || this._clickedSummaryItem != summaryItem) let clickedButton = event.get_button();
if (!this._clickedSummaryItem ||
this._clickedSummaryItem != summaryItem ||
this._clickedSummaryItemMouseButton != clickedButton) {
this._clickedSummaryItem = summaryItem; this._clickedSummaryItem = summaryItem;
else this._clickedSummaryItemMouseButton = clickedButton;
} else {
this._unsetClickedSummaryItem(); this._unsetClickedSummaryItem();
}
this._updateState(); this._updateState();
}, },
@ -1380,7 +1413,7 @@ MessageTray.prototype = {
// leaving the tray. The tray is locked when the summary notification is visible anyway, but we // leaving the tray. The tray is locked when the summary notification is visible anyway, but we
// should treat the mouse being over the summary notification as the tray being left for collapsing // should treat the mouse being over the summary notification as the tray being left for collapsing
// any expanded summary item other than the one related to the notification. // any expanded summary item other than the one related to the notification.
if (this._summaryNotificationBoxPointer.bin.hover) if (this._summaryBoxPointer.bin.hover)
return; return;
this._useLongerTrayLeftTimeout = false; this._useLongerTrayLeftTimeout = false;
@ -1538,19 +1571,23 @@ MessageTray.prototype = {
} }
// Summary notification // Summary notification
let haveSummaryNotification = this._clickedSummaryItem != null; let haveClickedSummaryItem = this._clickedSummaryItem != null;
let summaryNotificationIsMainNotification = (haveSummaryNotification && let summarySourceIsMainNotificationSource = (haveClickedSummaryItem && this._notification &&
this._clickedSummaryItem.source.notification == this._notification); this._clickedSummaryItem.source == this._notification.source);
let canShowSummaryNotification = this._summaryState == State.SHOWN; let canShowSummaryBoxPointer = this._summaryState == State.SHOWN;
let wrongSummaryNotification = (haveSummaryNotification && let wrongSummaryNotification = (this._clickedSummaryItemMouseButton == 1 &&
this._summaryNotification != this._clickedSummaryItem.source.notification); this._summaryNotification != this._clickedSummaryItem.source.notification);
let wrongSummaryRightClickMenu = (this._clickedSummaryItemMouseButton == 3 &&
this._summaryBoxPointer.bin.child != this._clickedSummaryItem.rightClickMenu);
let wrongSummaryBoxPointer = (haveClickedSummaryItem &&
(wrongSummaryNotification || wrongSummaryRightClickMenu));
if (this._summaryNotificationState == State.HIDDEN) { if (this._summaryBoxPointerState == State.HIDDEN) {
if (haveSummaryNotification && !summaryNotificationIsMainNotification && canShowSummaryNotification) if (haveClickedSummaryItem && !summarySourceIsMainNotificationSource && canShowSummaryBoxPointer)
this._showSummaryNotification(); this._showSummaryBoxPointer();
} else if (this._summaryNotificationState == State.SHOWN) { } else if (this._summaryBoxPointerState == State.SHOWN) {
if (!haveSummaryNotification || !canShowSummaryNotification || wrongSummaryNotification) if (!haveClickedSummaryItem || !canShowSummaryBoxPointer || wrongSummaryBoxPointer)
this._hideSummaryNotification(); this._hideSummaryBoxPointer();
} }
// Tray itself // Tray itself
@ -1808,44 +1845,53 @@ MessageTray.prototype = {
this._expandedSummaryItemTitleWidth = this._summaryItemTitleWidth; this._expandedSummaryItemTitleWidth = this._summaryItemTitleWidth;
}, },
_showSummaryNotification: function() { _showSummaryBoxPointer: function() {
this._summaryNotification = this._clickedSummaryItem.source.notification; if (this._clickedSummaryItemMouseButton == 1) {
this._summaryNotificationClickedId = this._summaryNotification.connect('done-displaying', let clickedSummaryItemNotification = this._clickedSummaryItem.source.notification;
Lang.bind(this, this._escapeTray)); let index = this._notificationQueue.indexOf(clickedSummaryItemNotification);
let index = this._notificationQueue.indexOf(this._summaryNotification); if (index != -1)
if (index != -1) this._notificationQueue.splice(index, 1);
this._notificationQueue.splice(index, 1);
this._summaryNotificationBoxPointer.bin.child = this._summaryNotification.actor; this._summaryNotification = clickedSummaryItemNotification;
this._focusGrabber.grabFocus(this._summaryNotification.actor); this._summaryNotificationClickedId = this._summaryNotification.connect('done-displaying',
Lang.bind(this, this._escapeTray));
this._summaryBoxPointer.bin.child = this._summaryNotification.actor;
if (!this._summaryNotificationExpandedId)
this._summaryNotificationExpandedId = this._summaryNotification.connect('expanded',
Lang.bind(this, this._onSummaryBoxPointerExpanded));
this._summaryNotification.expand(false);
} else if (this._clickedSummaryItemMouseButton == 3) {
this._summaryRightClickMenuClickedId = this._clickedSummaryItem.connect('right-click-menu-done-displaying',
Lang.bind(this, this._escapeTray));
this._summaryBoxPointer.bin.child = this._clickedSummaryItem.rightClickMenu;
}
this._focusGrabber.grabFocus(this._summaryBoxPointer.bin.child);
if (!this._summaryNotificationExpandedId)
this._summaryNotificationExpandedId = this._summaryNotification.connect('expanded', Lang.bind(this, this._onSummaryNotificationExpanded));
this._summaryNotification.expand(false);
this._clickedSummaryItemAllocationChangedId = this._clickedSummaryItemAllocationChangedId =
this._clickedSummaryItem.actor.connect('allocation-changed', this._clickedSummaryItem.actor.connect('allocation-changed',
Lang.bind(this, this._adjustNotificationBoxPointerPosition)); Lang.bind(this, this._adjustSummaryBoxPointerPosition));
// _clickedSummaryItem.actor can change absolute postiion without changing allocation // _clickedSummaryItem.actor can change absolute postiion without changing allocation
this._summaryMotionId = this._summary.connect('allocation-changed', this._summaryMotionId = this._summary.connect('allocation-changed',
Lang.bind(this, this._adjustNotificationBoxPointerPosition)); Lang.bind(this, this._adjustSummaryBoxPointerPosition));
this._summaryNotificationBoxPointer.actor.opacity = 0; this._summaryBoxPointer.actor.opacity = 0;
this._summaryNotificationBoxPointer.actor.show(); this._summaryBoxPointer.actor.show();
this._adjustNotificationBoxPointerPosition(); this._adjustSummaryBoxPointerPosition();
this._summaryNotificationState = State.SHOWING; this._summaryBoxPointerState = State.SHOWING;
this._summaryNotificationBoxPointer.show(true, Lang.bind(this, function() { this._summaryBoxPointer.show(true, Lang.bind(this, function() {
this._summaryNotificationState = State.SHOWN; this._summaryBoxPointerState = State.SHOWN;
})); }));
}, },
_adjustNotificationBoxPointerPosition: function() { _adjustSummaryBoxPointerPosition: function() {
// The position of the arrow origin should be the same as center of this._clickedSummaryItem.actor // The position of the arrow origin should be the same as center of this._clickedSummaryItem.actor
if (!this._clickedSummaryItem) if (!this._clickedSummaryItem)
return; return;
this._summaryNotificationBoxPointer.setPosition(this._clickedSummaryItem.actor, 0, 0.5); this._summaryBoxPointer.setPosition(this._clickedSummaryItem.actor, 0, 0.5);
}, },
_unsetClickedSummaryItem: function() { _unsetClickedSummaryItem: function() {
@ -1856,14 +1902,20 @@ MessageTray.prototype = {
this._summaryMotionId = 0; this._summaryMotionId = 0;
} }
if (this._summaryRightClickMenuClickedId) {
this._clickedSummaryItem.disconnect(this._summaryRightClickMenuClickedId);
this._summaryRightClickMenuClickedId = 0;
}
this._clickedSummaryItem = null; this._clickedSummaryItem = null;
this._clickedSummaryItemMouseButton = -1;
}, },
_onSummaryNotificationExpanded: function() { _onSummaryBoxPointerExpanded: function() {
this._adjustNotificationBoxPointerPosition(); this._adjustSummaryBoxPointerPosition();
}, },
_hideSummaryNotification: function() { _hideSummaryBoxPointer: function() {
if (this._summaryNotificationExpandedId) { if (this._summaryNotificationExpandedId) {
this._summaryNotification.disconnect(this._summaryNotificationExpandedId); this._summaryNotification.disconnect(this._summaryNotificationExpandedId);
this._summaryNotificationExpandedId = 0; this._summaryNotificationExpandedId = 0;
@ -1873,23 +1925,25 @@ MessageTray.prototype = {
this._unsetClickedSummaryItem(); this._unsetClickedSummaryItem();
this._focusGrabber.ungrabFocus(); this._focusGrabber.ungrabFocus();
this._summaryNotificationState = State.HIDING; this._summaryBoxPointerState = State.HIDING;
this._summaryNotificationBoxPointer.hide(true, Lang.bind(this, this._hideSummaryNotificationCompleted)); this._summaryBoxPointer.hide(true, Lang.bind(this, this._hideSummaryBoxPointerCompleted));
}, },
_hideSummaryNotificationCompleted: function() { _hideSummaryBoxPointerCompleted: function() {
this._summaryNotificationState = State.HIDDEN; this._summaryBoxPointerState = State.HIDDEN;
this._summaryNotificationBoxPointer.bin.child = null; this._summaryBoxPointer.bin.child = null;
this._summaryNotification.collapseCompleted(); if (this._summaryNotification != null) {
this._summaryNotification.disconnect(this._summaryNotificationClickedId); this._summaryNotification.collapseCompleted();
this._summaryNotificationClickedId = 0; this._summaryNotification.disconnect(this._summaryNotificationClickedId);
let summaryNotification = this._summaryNotification; this._summaryNotificationClickedId = 0;
this._summaryNotification = null; let summaryNotification = this._summaryNotification;
if (summaryNotification.isTransient && !this._reNotifyWithSummaryNotificationAfterHide) this._summaryNotification = null;
summaryNotification.destroy(NotificationDestroyedReason.EXPIRED); if (summaryNotification.isTransient && !this._reNotifyWithSummaryNotificationAfterHide)
if (this._reNotifyWithSummaryNotificationAfterHide) { summaryNotification.destroy(NotificationDestroyedReason.EXPIRED);
this._onNotify(summaryNotification.source, summaryNotification); if (this._reNotifyWithSummaryNotificationAfterHide) {
this._reNotifyWithSummaryNotificationAfterHide = false; this._onNotify(summaryNotification.source, summaryNotification);
this._reNotifyWithSummaryNotificationAfterHide = false;
}
} }
if (this._clickedSummaryItem) if (this._clickedSummaryItem)
this._updateState(); this._updateState();
@ -1915,7 +1969,7 @@ SystemNotificationSource.prototype = {
icon_size: this.ICON_SIZE }); icon_size: this.ICON_SIZE });
}, },
_notificationClicked: function() { open: function() {
this.destroy(); this.destroy();
} }
}; };

View File

@ -435,6 +435,7 @@ Source.prototype = {
MessageTray.Source.prototype._init.call(this, title); MessageTray.Source.prototype._init.call(this, title);
this._pid = pid; this._pid = pid;
this._appStateChangedId = 0;
this._setApp(); this._setApp();
if (this.app) if (this.app)
this.title = this.app.get_name(); this.title = this.app.get_name();
@ -459,6 +460,10 @@ Source.prototype = {
if (!this.app) if (!this.app)
return; return;
// We only update the app if this.app is null, so we can't disconnect the old this._appStateChangedId
// even if it were non-zero for some reason.
this._appStateChangedId = this.app.connect('notify::state', Lang.bind(this, this._appStateChanged));
// Only override the icon if we were previously using // Only override the icon if we were previously using
// notification-based icons (ie, not a trayicon) or if it was unset before // notification-based icons (ie, not a trayicon) or if it was unset before
if (!this._isTrayIcon) { if (!this._isTrayIcon) {
@ -473,7 +478,7 @@ Source.prototype = {
this._isTrayIcon = true; this._isTrayIcon = true;
}, },
_notificationClicked: function(notification) { open: function(notification) {
this.openApp(); this.openApp();
}, },
@ -482,6 +487,16 @@ Source.prototype = {
this.destroy(); this.destroy();
}, },
_appStateChanged: function() {
// Destroy notification sources when their apps exit.
// The app exiting would normally result in a tray icon being removed,
// so it should be ok to destroy the source associated with a tray icon
// here too, however we just let that happen through the code path
// associated with the tray icon being removed.
if (!this._isTrayIcon && this.app.get_state() == Shell.AppState.STOPPED)
this.destroy();
},
openApp: function() { openApp: function() {
if (this.app == null) if (this.app == null)
return; return;
@ -491,5 +506,13 @@ Source.prototype = {
let mostRecentWindow = windows[0]; let mostRecentWindow = windows[0];
Main.activateWindow(mostRecentWindow); Main.activateWindow(mostRecentWindow);
} }
},
destroy: function() {
if (this.app && this._appStateChangedId) {
this.app.disconnect(this._appStateChangedId);
this._appStateChangedId = 0;
}
MessageTray.Source.prototype.destroy.call(this);
} }
}; };

View File

@ -180,10 +180,10 @@ Overview.prototype = {
this._group.add_actor(this.viewSelector.actor); this._group.add_actor(this.viewSelector.actor);
this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay(); this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay();
this.viewSelector.addViewTab(_("Windows"), this._workspacesDisplay.actor); this.viewSelector.addViewTab(_("Windows"), this._workspacesDisplay.actor, 'text-x-generic');
let appView = new AppDisplay.AllAppDisplay(); let appView = new AppDisplay.AllAppDisplay();
this.viewSelector.addViewTab(_("Applications"), appView.actor); this.viewSelector.addViewTab(_("Applications"), appView.actor, 'system-run');
// Default search providers // Default search providers
this.viewSelector.addSearchProvider(new AppDisplay.AppSearchProvider()); this.viewSelector.addSearchProvider(new AppDisplay.AppSearchProvider());
@ -201,6 +201,10 @@ Overview.prototype = {
this.dash.actor.add_constraint(this.viewSelector.constrainY); this.dash.actor.add_constraint(this.viewSelector.constrainY);
this.dash.actor.add_constraint(this.viewSelector.constrainHeight); this.dash.actor.add_constraint(this.viewSelector.constrainHeight);
// Translators: this is the name of the dock/favorites area on
// the left of the overview
Main.ctrlAltTabManager.addGroup(this.dash.actor, _("Dash"), 'user-bookmarks');
}, },
_onDragBegin: function() { _onDragBegin: function() {
@ -481,35 +485,14 @@ Overview.prototype = {
this.emit('window-drag-begin'); this.emit('window-drag-begin');
}, },
cancelledWindowDrag: function(source) {
this.emit('window-drag-cancelled');
},
endWindowDrag: function(source) { endWindowDrag: function(source) {
this.emit('window-drag-end'); this.emit('window-drag-end');
}, },
// Returns the scale the Overview has when we just start zooming out
// to overview mode. That is, when just the active workspace is showing.
getZoomedInScale : function() {
return 1 / this.workspaces.getScale();
},
// Returns the position the Overview has when we just start zooming out
// to overview mode. That is, when just the active workspace is showing.
getZoomedInPosition : function() {
let [posX, posY] = this.workspaces.getActiveWorkspacePosition();
let scale = this.getZoomedInScale();
return [- posX * scale, - posY * scale];
},
// Returns the current scale of the Overview.
getScale : function() {
return this.workspaces.actor.scaleX;
},
// Returns the current position of the Overview.
getPosition : function() {
return [this.workspaces.actor.x, this.workspaces.actor.y];
},
// show: // show:
// //
// Animates the overview visible and grabs mouse and keyboard input // Animates the overview visible and grabs mouse and keyboard input
@ -563,30 +546,13 @@ Overview.prototype = {
}); });
} }
// Create a zoom out effect. First scale the workspaces view up and
// position it so that the active workspace fills up the whole screen,
// then transform it to its normal dimensions and position.
// The opposite transition is used in hide().
this.workspaces.actor.scaleX = this.workspaces.actor.scaleY = this.getZoomedInScale();
[this.workspaces.actor.x, this.workspaces.actor.y] = this.getZoomedInPosition();
let primary = global.get_primary_monitor();
Tweener.addTween(this.workspaces.actor,
{ x: primary.x - this._group.x,
y: primary.y - this._group.y,
scaleX: 1,
scaleY: 1,
transition: 'easeOutQuad',
time: ANIMATION_TIME,
onComplete: this._showDone,
onCompleteScope: this
});
// Make the other elements fade in.
this._group.opacity = 0; this._group.opacity = 0;
Tweener.addTween(this._group, Tweener.addTween(this._group,
{ opacity: 255, { opacity: 255,
transition: 'easeOutQuad', transition: 'easeOutQuad',
time: ANIMATION_TIME time: ANIMATION_TIME,
onComplete: this._showDone,
onCompleteScope: this
}); });
this._coverPane.raise_top(); this._coverPane.raise_top();
@ -698,27 +664,13 @@ Overview.prototype = {
this.workspaces.hide(); this.workspaces.hide();
// Create a zoom in effect by transforming the workspaces view so that
// the active workspace fills up the whole screen. The opposite
// transition is used in show().
let scale = this.getZoomedInScale();
let [posX, posY] = this.getZoomedInPosition();
Tweener.addTween(this.workspaces.actor,
{ x: posX,
y: posY,
scaleX: scale,
scaleY: scale,
transition: 'easeOutQuad',
time: ANIMATION_TIME,
onComplete: this._hideDone,
onCompleteScope: this
});
// Make other elements fade out. // Make other elements fade out.
Tweener.addTween(this._group, Tweener.addTween(this._group,
{ opacity: 0, { opacity: 0,
transition: 'easeOutQuad', transition: 'easeOutQuad',
time: ANIMATION_TIME time: ANIMATION_TIME,
onComplete: this._hideDone,
onCompleteScope: this
}); });
this._coverPane.raise_top(); this._coverPane.raise_top();

View File

@ -13,6 +13,7 @@ const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext; const _ = Gettext.gettext;
const Config = imports.misc.config; const Config = imports.misc.config;
const CtrlAltTab = imports.ui.ctrlAltTab;
const Overview = imports.ui.overview; const Overview = imports.ui.overview;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const PanelMenu = imports.ui.panelMenu; const PanelMenu = imports.ui.panelMenu;
@ -243,6 +244,10 @@ AppMenuButton.prototype = {
let bin = new St.Bin({ name: 'appMenu' }); let bin = new St.Bin({ name: 'appMenu' });
this.actor.set_child(bin); this.actor.set_child(bin);
this.actor.reactive = false;
this._targetIsCurrent = false;
this._container = new Shell.GenericContainer(); this._container = new Shell.GenericContainer();
bin.set_child(this._container); bin.set_child(this._container);
this._container.connect('get-preferred-width', Lang.bind(this, this._getContentPreferredWidth)); this._container.connect('get-preferred-width', Lang.bind(this, this._getContentPreferredWidth));
@ -275,7 +280,7 @@ AppMenuButton.prototype = {
this._clipWidth = PANEL_ICON_SIZE; this._clipWidth = PANEL_ICON_SIZE;
this._direction = SPINNER_SPEED; this._direction = SPINNER_SPEED;
this._spinner = new AnimatedIcon('process-working.png', 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.lower_bottom(); this._spinner.actor.lower_bottom();
@ -500,13 +505,6 @@ AppMenuButton.prototype = {
lastStartedApp = this._startingApps[i]; lastStartedApp = this._startingApps[i];
let focusedApp = tracker.focus_app; let focusedApp = tracker.focus_app;
let targetApp = focusedApp != null ? focusedApp : lastStartedApp;
if (targetApp == this._targetApp) {
if (targetApp && targetApp.get_state() != Shell.AppState.STARTING)
this.stopAnimation();
return;
}
this._stopAnimation();
if (!focusedApp) { if (!focusedApp) {
// If the app has just lost focus to the panel, pretend // If the app has just lost focus to the panel, pretend
@ -516,27 +514,56 @@ AppMenuButton.prototype = {
return; return;
} }
let targetApp = focusedApp != null ? focusedApp : lastStartedApp;
if (targetApp == null) {
if (!this._targetIsCurrent)
return;
this.actor.reactive = false;
this._targetIsCurrent = false;
Tweener.removeTweens(this.actor);
Tweener.addTween(this.actor, { opacity: 0,
time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad' });
return;
}
if (!this._targetIsCurrent) {
this.actor.reactive = true;
this._targetIsCurrent = true;
Tweener.removeTweens(this.actor);
Tweener.addTween(this.actor, { opacity: 255,
time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad' });
}
if (targetApp == this._targetApp) {
if (targetApp && targetApp.get_state() != Shell.AppState.STARTING)
this.stopAnimation();
return;
}
this._stopAnimation();
if (this._iconBox.child != null) if (this._iconBox.child != null)
this._iconBox.child.destroy(); this._iconBox.child.destroy();
this._iconBox.hide(); this._iconBox.hide();
this._label.setText(''); this._label.setText('');
this.actor.reactive = false;
this._targetApp = targetApp; this._targetApp = targetApp;
if (targetApp != null) { let icon = targetApp.get_faded_icon(2 * PANEL_ICON_SIZE);
let icon = targetApp.get_faded_icon(2 * PANEL_ICON_SIZE);
this._label.setText(targetApp.get_name()); this._label.setText(targetApp.get_name());
// TODO - _quit() doesn't really work on apps in state STARTING yet // TODO - _quit() doesn't really work on apps in state STARTING yet
this._quitMenu.label.set_text(_("Quit %s").format(targetApp.get_name())); this._quitMenu.label.set_text(_("Quit %s").format(targetApp.get_name()));
this.actor.reactive = true; this._iconBox.set_child(icon);
this._iconBox.set_child(icon); this._iconBox.show();
this._iconBox.show();
if (targetApp.get_state() == Shell.AppState.STARTING) if (targetApp.get_state() == Shell.AppState.STARTING)
this.startAnimation(); this.startAnimation();
}
this.emit('changed'); this.emit('changed');
} }
@ -813,13 +840,6 @@ Panel.prototype = {
this._centerBox = new St.BoxLayout({ name: 'panelCenter' }); this._centerBox = new St.BoxLayout({ name: 'panelCenter' });
this._rightBox = new St.BoxLayout({ name: 'panelRight' }); this._rightBox = new St.BoxLayout({ name: 'panelRight' });
// This will eventually be automatic, see
// https://bugzilla.gnome.org/show_bug.cgi?id=584662
if (St.Widget.get_default_direction() == St.TextDirection.RTL) {
this._leftBox.add_style_pseudo_class('rtl');
this._rightBox.add_style_pseudo_class('rtl');
}
this._leftCorner = new PanelCorner(St.Side.LEFT); this._leftCorner = new PanelCorner(St.Side.LEFT);
this._rightCorner = new PanelCorner(St.Side.RIGHT); this._rightCorner = new PanelCorner(St.Side.RIGHT);
@ -996,6 +1016,9 @@ Panel.prototype = {
Main.chrome.addActor(this._rightCorner.actor, { visibleInOverview: true, Main.chrome.addActor(this._rightCorner.actor, { visibleInOverview: true,
affectsStruts: false, affectsStruts: false,
affectsInputRegion: false }); affectsInputRegion: false });
Main.ctrlAltTabManager.addGroup(this.actor, _("Panel"), 'start-here',
{ sortGroup: CtrlAltTab.SortGroup.TOP });
}, },
_xdndShowOverview: function (actor) { _xdndShowOverview: function (actor) {

View File

@ -1,7 +1,9 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gtk = imports.gi.Gtk;
const St = imports.gi.St; const St = imports.gi.St;
const Lang = imports.lang; const Lang = imports.lang;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const Main = imports.ui.main; const Main = imports.ui.main;
@ -20,9 +22,10 @@ Button.prototype = {
track_hover: true }); track_hover: true });
this.actor._delegate = this; this.actor._delegate = this;
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress)); this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPress)); this.actor.connect('key-press-event', Lang.bind(this, this._onSourceKeyPress));
this.menu = new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, /* FIXME */ 0); this.menu = new PopupMenu.PopupMenu(this.actor, menuAlignment, St.Side.TOP, 0);
this.menu.connect('open-state-changed', Lang.bind(this, this._onOpenStateChanged)); this.menu.connect('open-state-changed', Lang.bind(this, this._onOpenStateChanged));
this.menu.actor.connect('key-press-event', Lang.bind(this, this._onMenuKeyPress));
Main.chrome.addActor(this.menu.actor, { visibleInOverview: true, Main.chrome.addActor(this.menu.actor, { visibleInOverview: true,
affectsStruts: false }); affectsStruts: false });
this.menu.actor.hide(); this.menu.actor.hide();
@ -32,20 +35,37 @@ Button.prototype = {
this.menu.toggle(); this.menu.toggle();
}, },
_onKeyPress: function(actor, event) { _onSourceKeyPress: function(actor, event) {
let symbol = event.get_key_symbol(); let symbol = event.get_key_symbol();
if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) { if (symbol == Clutter.KEY_space || symbol == Clutter.KEY_Return) {
this.menu.toggle(); this.menu.toggle();
return true; return true;
} else if (symbol == Clutter.KEY_Escape && this.menu.isOpen) {
this.menu.close();
return true;
} else if (symbol == Clutter.KEY_Down) { } else if (symbol == Clutter.KEY_Down) {
if (!this.menu.isOpen) if (!this.menu.isOpen)
this.menu.toggle(); this.menu.toggle();
this.menu.activateFirst(); this.menu.actor.navigate_focus(this.actor, Gtk.DirectionType.DOWN, false);
return true; return true;
} else } else
return false; return false;
}, },
_onMenuKeyPress: function(actor, event) {
let symbol = event.get_key_symbol();
if (symbol == Clutter.KEY_Left || symbol == Clutter.KEY_Right) {
let focusManager = St.FocusManager.get_for_stage(global.stage);
let group = focusManager.get_group(this.actor);
if (group) {
let direction = (symbol == Clutter.KEY_Left) ? Gtk.DirectionType.LEFT : Gtk.DirectionType.RIGHT;
group.navigate_focus(this.actor, direction, false);
return true;
}
}
return false;
},
_onOpenStateChanged: function(menu, open) { _onOpenStateChanged: function(menu, open) {
if (open) if (open)
this.actor.add_style_pseudo_class('active'); this.actor.add_style_pseudo_class('active');

View File

@ -54,8 +54,10 @@ PopupBaseMenuItem.prototype = {
} }
if (params.reactive && params.hover) if (params.reactive && params.hover)
this.actor.connect('notify::hover', Lang.bind(this, this._onHoverChanged)); this.actor.connect('notify::hover', Lang.bind(this, this._onHoverChanged));
if (params.reactive) if (params.reactive) {
this.actor.connect('key-focus-in', Lang.bind(this, this._onKeyFocusIn)); this.actor.connect('key-focus-in', Lang.bind(this, this._onKeyFocusIn));
this.actor.connect('key-focus-out', Lang.bind(this, this._onKeyFocusOut));
}
}, },
_onStyleChanged: function (actor) { _onStyleChanged: function (actor) {
@ -81,6 +83,10 @@ PopupBaseMenuItem.prototype = {
this.setActive(true); this.setActive(true);
}, },
_onKeyFocusOut: function (actor) {
this.setActive(false);
},
_onHoverChanged: function (actor) { _onHoverChanged: function (actor) {
this.setActive(actor.hover); this.setActive(actor.hover);
}, },
@ -684,28 +690,6 @@ PopupImageMenuItem.prototype = {
} }
}; };
function mod(a, b) {
return (a + b) % b;
}
function findNextInCycle(items, current, direction) {
let cur;
if (items.length == 0)
return current;
else if (items.length == 1)
return items[0];
if (current)
cur = items.indexOf(current);
else if (direction == 1)
cur = items.length - 1;
else
cur = 0;
return items[mod(cur + direction, items.length)];
}
function PopupMenuBase() { function PopupMenuBase() {
throw new TypeError('Trying to instantiate abstract class PopupMenuBase'); throw new TypeError('Trying to instantiate abstract class PopupMenuBase');
} }
@ -861,17 +845,6 @@ PopupMenuBase.prototype = {
} }
}, },
activateFirst: function() {
let children = this.box.get_children();
for (let i = 0; i < children.length; i++) {
let actor = children[i];
if (actor._delegate && actor._delegate instanceof PopupBaseMenuItem && actor.visible && actor.reactive) {
actor._delegate.setActive(true);
break;
}
}
},
toggle: function() { toggle: function() {
if (this.isOpen) if (this.isOpen)
this.close(true); this.close(true);
@ -909,6 +882,8 @@ PopupMenu.prototype = {
this.actor = this._boxPointer.actor; this.actor = this._boxPointer.actor;
this.actor._delegate = this; this.actor._delegate = this;
this.actor.style_class = 'popup-menu-boxpointer'; this.actor.style_class = 'popup-menu-boxpointer';
this.actor.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
this._boxWrapper = new Shell.GenericContainer(); this._boxWrapper = new Shell.GenericContainer();
this._boxWrapper.connect('get-preferred-width', Lang.bind(this, this._boxGetPreferredWidth)); this._boxWrapper.connect('get-preferred-width', Lang.bind(this, this._boxGetPreferredWidth));
this._boxWrapper.connect('get-preferred-height', Lang.bind(this, this._boxGetPreferredHeight)); this._boxWrapper.connect('get-preferred-height', Lang.bind(this, this._boxGetPreferredHeight));
@ -937,6 +912,15 @@ PopupMenu.prototype = {
this.box.allocate(box, flags); this.box.allocate(box, flags);
}, },
_onKeyPressEvent: function(actor, event) {
if (event.get_key_symbol() == Clutter.Escape) {
this.close(true);
return true;
}
return false;
},
setArrowOrigin: function(origin) { setArrowOrigin: function(origin) {
this._boxPointer.setArrowOrigin(origin); this._boxPointer.setArrowOrigin(origin);
}, },
@ -1127,11 +1111,17 @@ PopupSubMenuMenuItem.prototype = {
}, },
_onKeyPressEvent: function(actor, event) { _onKeyPressEvent: function(actor, event) {
if (event.get_key_symbol() == Clutter.KEY_Right) { let symbol = event.get_key_symbol();
if (symbol == Clutter.KEY_Right) {
this.menu.open(true); this.menu.open(true);
this.menu.activateFirst(); this.menu.actor.navigate_focus(null, Gtk.DirectionType.DOWN, false);
return true;
} else if (symbol == Clutter.KEY_Left && this.menu.isOpen) {
this.menu.close();
return true; return true;
} }
return PopupBaseMenuItem.prototype._onKeyPressEvent.call(this, actor, event); return PopupBaseMenuItem.prototype._onKeyPressEvent.call(this, actor, event);
}, },
@ -1158,12 +1148,13 @@ PopupMenuManager.prototype = {
this.grabbed = false; this.grabbed = false;
this._eventCaptureId = 0; this._eventCaptureId = 0;
this._keyPressEventId = 0;
this._enterEventId = 0; this._enterEventId = 0;
this._leaveEventId = 0; this._leaveEventId = 0;
this._keyFocusNotifyId = 0;
this._activeMenu = null; this._activeMenu = null;
this._menus = []; this._menus = [];
this._preGrabInputMode = null; this._preGrabInputMode = null;
this._grabbedFromKeynav = false;
}, },
addMenu: function(menu, position) { addMenu: function(menu, position) {
@ -1172,15 +1163,13 @@ PopupMenuManager.prototype = {
openStateChangeId: menu.connect('open-state-changed', Lang.bind(this, this._onMenuOpenState)), openStateChangeId: menu.connect('open-state-changed', Lang.bind(this, this._onMenuOpenState)),
destroyId: menu.connect('destroy', Lang.bind(this, this._onMenuDestroy)), destroyId: menu.connect('destroy', Lang.bind(this, this._onMenuDestroy)),
enterId: 0, enterId: 0,
focusInId: 0, focusInId: 0
focusOutId: 0
}; };
let source = menu.sourceActor; let source = menu.sourceActor;
if (source) { if (source) {
menudata.enterId = source.connect('enter-event', Lang.bind(this, function() { this._onMenuSourceEnter(menu); })); menudata.enterId = source.connect('enter-event', Lang.bind(this, function() { this._onMenuSourceEnter(menu); }));
menudata.focusInId = source.connect('key-focus-in', Lang.bind(this, function() { this._onMenuSourceEnter(menu); })); menudata.focusInId = source.connect('key-focus-in', Lang.bind(this, function() { this._onMenuSourceEnter(menu); }));
menudata.focusOutId = source.connect('key-focus-out', Lang.bind(this, function() { this._onKeyFocusOut(menu); }));
} }
if (position == undefined) if (position == undefined)
@ -1205,8 +1194,6 @@ PopupMenuManager.prototype = {
menu.sourceActor.disconnect(menudata.enterId); menu.sourceActor.disconnect(menudata.enterId);
if (menudata.focusInId) if (menudata.focusInId)
menu.sourceActor.disconnect(menudata.focusInId); menu.sourceActor.disconnect(menudata.focusInId);
if (menudata.focusOutId)
menu.sourceActor.disconnect(menudata.focusOutId);
this._menus.splice(position, 1); this._menus.splice(position, 1);
}, },
@ -1215,10 +1202,10 @@ PopupMenuManager.prototype = {
Main.pushModal(this._owner.actor); Main.pushModal(this._owner.actor);
this._eventCaptureId = global.stage.connect('captured-event', Lang.bind(this, this._onEventCapture)); this._eventCaptureId = global.stage.connect('captured-event', Lang.bind(this, this._onEventCapture));
this._keyPressEventId = global.stage.connect('key-press-event', Lang.bind(this, this._onKeyPressEvent));
// captured-event doesn't see enter/leave events // captured-event doesn't see enter/leave events
this._enterEventId = global.stage.connect('enter-event', Lang.bind(this, this._onEventCapture)); this._enterEventId = global.stage.connect('enter-event', Lang.bind(this, this._onEventCapture));
this._leaveEventId = global.stage.connect('leave-event', Lang.bind(this, this._onEventCapture)); this._leaveEventId = global.stage.connect('leave-event', Lang.bind(this, this._onEventCapture));
this._keyFocusNotifyId = global.stage.connect('notify::key-focus', Lang.bind(this, this._onKeyFocusChanged));
this.grabbed = true; this.grabbed = true;
}, },
@ -1226,49 +1213,47 @@ PopupMenuManager.prototype = {
_ungrab: function() { _ungrab: function() {
global.stage.disconnect(this._eventCaptureId); global.stage.disconnect(this._eventCaptureId);
this._eventCaptureId = 0; this._eventCaptureId = 0;
global.stage.disconnect(this._keyPressEventId);
this._keyPressEventId = 0;
global.stage.disconnect(this._enterEventId); global.stage.disconnect(this._enterEventId);
this._enterEventId = 0; this._enterEventId = 0;
global.stage.disconnect(this._leaveEventId); global.stage.disconnect(this._leaveEventId);
this._leaveEventId = 0; this._leaveEventId = 0;
global.stage.disconnect(this._keyFocusNotifyId);
this._keyFocusNotifyId = 0;
this.grabbed = false; this.grabbed = false;
Main.popModal(this._owner.actor); Main.popModal(this._owner.actor);
}, },
_onMenuOpenState: function(menu, open) { _onMenuOpenState: function(menu, open) {
if (open)
this._activeMenu = menu;
// Check what the focus was before calling pushModal/popModal
let focus = global.stage.key_focus;
let hadFocus = focus && this._activeMenuContains(focus);
if (open) { if (open) {
if (!this.grabbed) { if (!this.grabbed) {
this._preGrabInputMode = global.stage_input_mode; this._preGrabInputMode = global.stage_input_mode;
this._grabbedFromKeynav = hadFocus;
this._grab(); this._grab();
} }
this._activeMenu = menu;
// if the focus is not already associated with the menu, if (hadFocus)
// then focus the menu focus.grab_key_focus();
let focus = global.stage.key_focus; else
if (!this._activeMenuContains(focus)) menu.actor.grab_key_focus();
menu.sourceActor.grab_key_focus();
} else if (menu == this._activeMenu) { } else if (menu == this._activeMenu) {
let focus = global.stage.key_focus;
let fromActive = focus && this._activeMenuContains(focus);
if (this.grabbed) if (this.grabbed)
this._ungrab(); this._ungrab();
this._activeMenu = null; this._activeMenu = null;
// If keynav was in effect before we grabbed, then we need if (this._grabbedFromKeynav) {
// to properly re-establish it after we ungrab. (popModal if (this._preGrabInputMode == Shell.StageInputMode.FOCUSED)
// will have unset the focus.) If some part of the menu global.stage_input_mode = Shell.StageInputMode.FOCUSED;
// was focused at the time of the ungrab then focus its if (hadFocus && menu.sourceActor)
// sourceActor. Otherwise just reset the focus to where it
// was right before the ungrab.
if (this._preGrabInputMode == Shell.StageInputMode.FOCUSED) {
global.stage_input_mode = Shell.StageInputMode.FOCUSED;
if (fromActive)
menu.sourceActor.grab_key_focus(); menu.sourceActor.grab_key_focus();
else else if (focus)
focus.grab_key_focus(); focus.grab_key_focus();
} }
} }
@ -1296,29 +1281,20 @@ PopupMenuManager.prototype = {
return false; return false;
}, },
_onKeyFocusOut: function(menu) { _onKeyFocusChanged: function() {
if (!this.grabbed || menu != this._activeMenu) if (!this.grabbed || !this._activeMenu)
return; return;
// We want to close the menu if the focus has moved somewhere let focus = global.stage.key_focus;
// other than inside the menu or to another menu's sourceActor. if (focus) {
// Unfortunately, when key-focus-out is emitted, if (this._activeMenuContains(focus))
// stage.key_focus will be null. So we have to wait until return;
// after it emits the key-focus-in as well. if (focus._delegate && focus._delegate.menu &&
let id = global.stage.connect('notify::key-focus', Lang.bind(this, this._findMenu(focus._delegate.menu) != -1)
function () { return;
global.stage.disconnect(id); }
if (menu != this._activeMenu) this._closeMenu();
return;
let focus = global.stage.key_focus;
if (!focus || this._activeMenuContains(focus))
return;
if (focus._delegate && this._findMenu(focus._delegate.menu) != -1)
return;
menu.close(true);
}));
}, },
_onMenuDestroy: function(menu) { _onMenuDestroy: function(menu) {
@ -1354,18 +1330,6 @@ PopupMenuManager.prototype = {
return -1; return -1;
}, },
_nextMenu: function(pos, direction) {
for (let i = 1; i < this._menus.length; i++) {
let candidate = mod(pos + i * direction, this._menus.length);
let menu = this._menus[candidate].menu;
if (!menu.sourceActor || menu.sourceActor.visible)
return menu;
}
// no menu is found? this should not happen
// anyway stay on current menu
return this._menus[pos];
},
_onEventCapture: function(actor, event) { _onEventCapture: function(actor, event) {
if (!this.grabbed) if (!this.grabbed)
return false; return false;
@ -1383,8 +1347,7 @@ PopupMenuManager.prototype = {
this._closeMenu(); this._closeMenu();
return true; return true;
} }
} else if ((eventType == Clutter.EventType.BUTTON_PRESS && !activeMenuContains) } else if (eventType == Clutter.EventType.BUTTON_PRESS && !activeMenuContains) {
|| (eventType == Clutter.EventType.KEY_PRESS && event.get_key_symbol() == Clutter.Escape)) {
this._closeMenu(); this._closeMenu();
return true; return true;
} else if (activeMenuContains || this._eventIsOnAnyMenuSource(event)) { } else if (activeMenuContains || this._eventIsOnAnyMenuSource(event)) {
@ -1394,27 +1357,6 @@ PopupMenuManager.prototype = {
return true; return true;
}, },
_onKeyPressEvent: function(actor, event) {
if (!this.grabbed || !this._activeMenu)
return false;
if (!this._eventIsOnActiveMenu(event))
return false;
let symbol = event.get_key_symbol();
if (symbol == Clutter.Left || symbol == Clutter.Right) {
let direction = symbol == Clutter.Right ? 1 : -1;
let pos = this._findMenu(this._activeMenu);
let next = this._nextMenu(pos, direction);
if (next != this._activeMenu) {
this._changeMenu(next);
next.activateFirst();
}
return true;
}
return false;
},
_closeMenu: function() { _closeMenu: function() {
if (this._activeMenu != null) if (this._activeMenu != null)
this._activeMenu.close(true); this._activeMenu.close(true);

View File

@ -234,21 +234,10 @@ __proto__: ModalDialog.ModalDialog.prototype,
this._commandCompleter = new CommandCompleter(); this._commandCompleter = new CommandCompleter();
this._group.connect('notify::visible', Lang.bind(this._commandCompleter, this._commandCompleter.update)); this._group.connect('notify::visible', Lang.bind(this._commandCompleter, this._commandCompleter.update));
this._history = new History.HistoryManager(HISTORY_KEY); this._history = new History.HistoryManager({ gsettingsKey: HISTORY_KEY,
this._history.connect('changed', Lang.bind(this, function(history, text) { entry: this._entryText });
this._entryText.set_text(text);
}));
this._entryText.connect('key-press-event', Lang.bind(this, function(o, e) { this._entryText.connect('key-press-event', Lang.bind(this, function(o, e) {
let symbol = e.get_key_symbol(); let symbol = e.get_key_symbol();
if (symbol == Clutter.Down) {
this._history.nextItem(o.get_text());
return true;
}
if (symbol == Clutter.Up) {
this._history.prevItem(o.get_text());
return true;
}
if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) { if (symbol == Clutter.Return || symbol == Clutter.KP_Enter) {
if (Shell.get_event_state(e) & Clutter.ModifierType.CONTROL_MASK) if (Shell.get_event_state(e) & Clutter.ModifierType.CONTROL_MASK)
this._run(o.get_text(), true); this._run(o.get_text(), true);

View File

@ -1,6 +1,7 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Gdm = imports.gi.Gdm; const Gdm = imports.gi.Gdm;
const DBus = imports.dbus;
const GLib = imports.gi.GLib; const GLib = imports.gi.GLib;
const Lang = imports.lang; const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
@ -16,6 +17,16 @@ const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu; const PopupMenu = imports.ui.popupMenu;
const Util = imports.misc.util; const Util = imports.misc.util;
const BUS_NAME = 'org.gnome.ScreenSaver';
const OBJECT_PATH = '/org/gnome/ScreenSaver';
const ScreenSaverInterface = {
name: BUS_NAME,
methods: [ { name: 'Lock', inSignature: '' } ]
};
let ScreenSaverProxy = DBus.makeProxyClass(ScreenSaverInterface);
// Adapted from gdm/gui/user-switch-applet/applet.c // Adapted from gdm/gui/user-switch-applet/applet.c
// //
// Copyright (C) 2004-2005 James M. Cape <jcape@ignore-your.tv>. // Copyright (C) 2004-2005 James M. Cape <jcape@ignore-your.tv>.
@ -43,7 +54,7 @@ StatusMenuButton.prototype = {
this._account_mgr = Tp.AccountManager.dup() this._account_mgr = Tp.AccountManager.dup()
this._upClient = new UPowerGlib.Client(); this._upClient = new UPowerGlib.Client();
this._screenSaverProxy = new ScreenSaverProxy(DBus.session, BUS_NAME, OBJECT_PATH);
this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._iconBox = new St.Bin(); this._iconBox = new St.Bin();
@ -188,7 +199,7 @@ StatusMenuButton.prototype = {
_onLockScreenActivate: function() { _onLockScreenActivate: function() {
Main.overview.hide(); Main.overview.hide();
Util.spawn(['gnome-screensaver-command', '--lock']); this._screenSaverProxy.LockRemote();
}, },
_onLoginScreenActivate: function() { _onLoginScreenActivate: function() {
@ -207,7 +218,9 @@ StatusMenuButton.prototype = {
if (this._haveSuspend && if (this._haveSuspend &&
this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) { this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) {
this._upClient.suspend_sync(null); this._screenSaverProxy.LockRemote(Lang.bind(this, function() {
this._upClient.suspend_sync(null);
}));
} else { } else {
Util.spawn(['gnome-session-quit', '--power-off']); Util.spawn(['gnome-session-quit', '--power-off']);
} }

View File

@ -173,7 +173,7 @@ Source.prototype = {
} }
}, },
_notificationClicked: function(notification) { open: function(notification) {
let props = {}; let props = {};
props[Tp.PROP_CHANNEL_CHANNEL_TYPE] = Tp.IFACE_CHANNEL_TYPE_TEXT; props[Tp.PROP_CHANNEL_CHANNEL_TYPE] = Tp.IFACE_CHANNEL_TYPE_TEXT;
[props[Tp.PROP_CHANNEL_TARGET_HANDLE], props[Tp.PROP_CHANNEL_TARGET_HANDLE_TYPE]] = this._channel.get_handle(); [props[Tp.PROP_CHANNEL_TARGET_HANDLE], props[Tp.PROP_CHANNEL_TARGET_HANDLE_TYPE]] = this._channel.get_handle();
@ -279,6 +279,16 @@ Notification.prototype = {
this._responseEntry.clutter_text.connect('activate', Lang.bind(this, this._onEntryActivated)); this._responseEntry.clutter_text.connect('activate', Lang.bind(this, this._onEntryActivated));
this.setActionArea(this._responseEntry); this.setActionArea(this._responseEntry);
this._oldMaxScrollAdjustment = 0;
this._createScrollArea();
this._scrollArea.vscroll.adjustment.connect('changed', Lang.bind(this, function(adjustment) {
let currentValue = adjustment.value + adjustment.page_size;
if (currentValue == this._oldMaxScrollAdjustment)
this.scrollTo(St.Side.BOTTOM);
this._oldMaxScrollAdjustment = adjustment.upper;
}));
this._history = []; this._history = [];
this._timestampTimeoutId = 0; this._timestampTimeoutId = 0;
}, },
@ -305,7 +315,6 @@ Notification.prototype = {
let body = this.addBody(text); let body = this.addBody(text);
body.add_style_class_name(style); body.add_style_class_name(style);
this.scrollTo(St.Side.BOTTOM);
this._history.unshift({ actor: body, time: timestamp, realMessage: true }); this._history.unshift({ actor: body, time: timestamp, realMessage: true });

View File

@ -1,6 +1,7 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */ /* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter; const Clutter = imports.gi.Clutter;
const Gtk = imports.gi.Gtk;
const Mainloop = imports.mainloop; const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta; const Meta = imports.gi.Meta;
const Signals = imports.signals; const Signals = imports.signals;
@ -15,12 +16,12 @@ const Search = imports.ui.search;
const SearchDisplay = imports.ui.searchDisplay; const SearchDisplay = imports.ui.searchDisplay;
const Tweener = imports.ui.tweener; const Tweener = imports.ui.tweener;
function BaseTab(titleActor, pageActor) { function BaseTab(titleActor, pageActor, name, a11yIcon) {
this._init(titleActor, pageActor); this._init(titleActor, pageActor, name, a11yIcon);
} }
BaseTab.prototype = { BaseTab.prototype = {
_init: function(titleActor, pageActor) { _init: function(titleActor, pageActor, name, a11yIcon) {
this.title = titleActor; this.title = titleActor;
this.page = new St.Bin({ child: pageActor, this.page = new St.Bin({ child: pageActor,
x_align: St.Align.START, x_align: St.Align.START,
@ -29,6 +30,14 @@ BaseTab.prototype = {
y_fill: true, y_fill: true,
style_class: 'view-tab-page' }); style_class: 'view-tab-page' });
if (this.title.can_focus) {
Main.ctrlAltTabManager.addGroup(this.title, name, a11yIcon);
} else {
Main.ctrlAltTabManager.addGroup(this.page, name, a11yIcon,
{ proxy: this.title,
focusCallback: Lang.bind(this, this._a11yFocus) });
}
this.visible = false; this.visible = false;
}, },
@ -56,6 +65,11 @@ BaseTab.prototype = {
}); });
}, },
_a11yFocus: function() {
this._activate();
this.page.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
},
_activate: function() { _activate: function() {
this.emit('activated'); this.emit('activated');
} }
@ -63,19 +77,19 @@ BaseTab.prototype = {
Signals.addSignalMethods(BaseTab.prototype); Signals.addSignalMethods(BaseTab.prototype);
function ViewTab(label, pageActor) { function ViewTab(label, pageActor, a11yIcon) {
this._init(label, pageActor); this._init(label, pageActor, a11yIcon);
} }
ViewTab.prototype = { ViewTab.prototype = {
__proto__: BaseTab.prototype, __proto__: BaseTab.prototype,
_init: function(label, pageActor) { _init: function(label, pageActor, a11yIcon) {
let titleActor = new St.Button({ label: label, let titleActor = new St.Button({ label: label,
style_class: 'view-tab-title' }); style_class: 'view-tab-title' });
titleActor.connect('clicked', Lang.bind(this, this._activate)); titleActor.connect('clicked', Lang.bind(this, this._activate));
BaseTab.prototype._init.call(this, titleActor, pageActor); BaseTab.prototype._init.call(this, titleActor, pageActor, label, a11yIcon);
} }
}; };
@ -101,7 +115,8 @@ SearchTab.prototype = {
active; it should not exceed ~30 active; it should not exceed ~30
characters. */ characters. */
hint_text: _("Type to search..."), hint_text: _("Type to search..."),
track_hover: true }); track_hover: true,
can_focus: true });
this._text = this._entry.clutter_text; this._text = this._entry.clutter_text;
this._text.connect('key-press-event', Lang.bind(this, this._onKeyPress)); this._text.connect('key-press-event', Lang.bind(this, this._onKeyPress));
@ -118,7 +133,9 @@ SearchTab.prototype = {
this._searchResults = new SearchDisplay.SearchResults(this._searchSystem, this._openSearchSystem); this._searchResults = new SearchDisplay.SearchResults(this._searchSystem, this._openSearchSystem);
BaseTab.prototype._init.call(this, BaseTab.prototype._init.call(this,
this._entry, this._entry,
this._searchResults.actor); this._searchResults.actor,
_("Search"),
'edit-find');
this._text.connect('text-changed', Lang.bind(this, this._onTextChanged)); this._text.connect('text-changed', Lang.bind(this, this._onTextChanged));
this._text.connect('activate', Lang.bind(this, function (se) { this._text.connect('activate', Lang.bind(this, function (se) {
@ -366,8 +383,8 @@ ViewSelector.prototype = {
})); }));
}, },
addViewTab: function(title, pageActor) { addViewTab: function(title, pageActor, a11yIcon) {
let viewTab = new ViewTab(title, pageActor); let viewTab = new ViewTab(title, pageActor, a11yIcon);
this._tabs.push(viewTab); this._tabs.push(viewTab);
this._tabBox.add(viewTab.title); this._tabBox.add(viewTab.title);
this._addTab(viewTab); this._addTab(viewTab);

View File

@ -15,12 +15,11 @@ function WindowAttentionHandler() {
WindowAttentionHandler.prototype = { WindowAttentionHandler.prototype = {
_init : function() { _init : function() {
this._startupIds = {}; this._startupIds = {};
this._sources = {}; this._tracker = Shell.WindowTracker.get_default();
this._tracker.connect('startup-sequence-changed', Lang.bind(this, this._onStartupSequenceChanged));
let display = global.screen.get_display(); let display = global.screen.get_display();
display.connect('window-demands-attention', Lang.bind(this, this._onWindowDemandsAttention)); display.connect('window-demands-attention', Lang.bind(this, this._onWindowDemandsAttention));
let tracker = Shell.WindowTracker.get_default();
tracker.connect('startup-sequence-changed', Lang.bind(this, this._onStartupSequenceChanged));
}, },
_onStartupSequenceChanged : function(tracker) { _onStartupSequenceChanged : function(tracker) {
@ -57,28 +56,16 @@ WindowAttentionHandler.prototype = {
if (!window || window.has_focus() || window.is_skip_taskbar()) if (!window || window.has_focus() || window.is_skip_taskbar())
return; return;
let tracker = Shell.WindowTracker.get_default(); let app = this._tracker.get_window_app(window);
let app = tracker.get_window_app(window); let source = new Source(app, window);
let appId = app.get_id(); Main.messageTray.add(source);
let source = this._sources[appId];
if (source == null) {
source = new Source(app, window);
this._sources[appId] = source;
Main.messageTray.add(source);
source.connect('destroy', Lang.bind(this, function() { delete this._sources[appId]; }));
}
let notification = new MessageTray.Notification(source, this._getTitle(app, window), this._getBanner(app, window)); let notification = new MessageTray.Notification(source, this._getTitle(app, window), this._getBanner(app, window));
source.notify(notification); source.notify(notification);
window.connect('notify::title', Lang.bind(this, function(win) { source.signalIDs.push(window.connect('notify::title', Lang.bind(this, function(win) {
notification.update(this._getTitle(app, win), this._getBanner(app, win)); notification.update(this._getTitle(app, win), this._getBanner(app, win));
})); })));
window.connect('notify::demands-attention', Lang.bind(this, function() { source.destroy(); }));
window.connect('focus', Lang.bind(this, function() { source.destroy(); }));
window.connect('unmanaged', Lang.bind(this, function() { source.destroy(); }));
} }
}; };
@ -94,13 +81,27 @@ Source.prototype = {
this._window = window; this._window = window;
this._app = app; this._app = app;
this._setSummaryIcon(this.createNotificationIcon()); this._setSummaryIcon(this.createNotificationIcon());
this.signalIDs = [];
this.signalIDs.push(this._window.connect('notify::demands-attention', Lang.bind(this, function() { this.destroy(); })));
this.signalIDs.push(this._window.connect('focus', Lang.bind(this, function() { this.destroy(); })));
this.signalIDs.push(this._window.connect('unmanaged', Lang.bind(this, function() { this.destroy(); })));
this.connect('destroy', Lang.bind(this, this._onDestroy));
},
_onDestroy : function() {
for(let i = 0; i < this.signalIDs.length; i++) {
this._window.disconnect(this.signalIDs[i]);
}
this.signalIDs = [];
}, },
createNotificationIcon : function() { createNotificationIcon : function() {
return this._app.create_icon_texture(this.ICON_SIZE); return this._app.create_icon_texture(this.ICON_SIZE);
}, },
_notificationClicked : function(notification) { open : function(notification) {
Main.activateWindow(this._window); Main.activateWindow(this._window);
this.destroy(); this.destroy();
} }

View File

@ -93,6 +93,8 @@ WindowManager.prototype = {
this._dimmedWindows = []; this._dimmedWindows = [];
this._animationBlockCount = 0;
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) {
@ -117,6 +119,7 @@ WindowManager.prototype = {
this.setKeybindingHandler('switch_to_workspace_down', Lang.bind(this, this._showWorkspaceSwitcher)); this.setKeybindingHandler('switch_to_workspace_down', Lang.bind(this, this._showWorkspaceSwitcher));
this.setKeybindingHandler('switch_windows', Lang.bind(this, this._startAppSwitcher)); this.setKeybindingHandler('switch_windows', Lang.bind(this, this._startAppSwitcher));
this.setKeybindingHandler('switch_group', Lang.bind(this, this._startAppSwitcher)); this.setKeybindingHandler('switch_group', Lang.bind(this, this._startAppSwitcher));
this.setKeybindingHandler('switch_panels', Lang.bind(this, this._startA11ySwitcher));
Main.overview.connect('showing', Lang.bind(this, function() { Main.overview.connect('showing', Lang.bind(this, function() {
for (let i = 0; i < this._dimmedWindows.length; i++) for (let i = 0; i < this._dimmedWindows.length; i++)
@ -138,8 +141,16 @@ WindowManager.prototype = {
this._shellwm.connect('keybinding::' + keybinding, handler); this._shellwm.connect('keybinding::' + keybinding, handler);
}, },
blockAnimations: function() {
this._animationBlockCount++;
},
unblockAnimations: function() {
this._animationBlockCount = Math.max(0, this._animationBlockCount - 1);
},
_shouldAnimate : function(actor) { _shouldAnimate : function(actor) {
if (Main.overview.visible) if (Main.overview.visible || this._animationsBlocked > 0)
return false; return false;
if (actor && (actor.meta_window.get_window_type() != Meta.WindowType.NORMAL)) if (actor && (actor.meta_window.get_window_type() != Meta.WindowType.NORMAL))
return false; return false;
@ -525,6 +536,10 @@ WindowManager.prototype = {
tabPopup.destroy(); tabPopup.destroy();
}, },
_startA11ySwitcher : function(shellwm, binding, window, backwards) {
Main.ctrlAltTabManager.popup(backwards);
},
_showWorkspaceSwitcher : function(shellwm, binding, window, backwards) { _showWorkspaceSwitcher : function(shellwm, binding, window, backwards) {
if (global.screen.n_workspaces == 1) if (global.screen.n_workspaces == 1)
return; return;

View File

@ -125,6 +125,7 @@ WindowClone.prototype = {
dragActorMaxSize: WINDOW_DND_SIZE, dragActorMaxSize: WINDOW_DND_SIZE,
dragActorOpacity: DRAGGING_WINDOW_OPACITY }); dragActorOpacity: DRAGGING_WINDOW_OPACITY });
this._draggable.connect('drag-begin', Lang.bind(this, this._onDragBegin)); this._draggable.connect('drag-begin', Lang.bind(this, this._onDragBegin));
this._draggable.connect('drag-cancelled', Lang.bind(this, this._onDragCancelled));
this._draggable.connect('drag-end', Lang.bind(this, this._onDragEnd)); this._draggable.connect('drag-end', Lang.bind(this, this._onDragEnd));
this.inDrag = false; this.inDrag = false;
@ -288,10 +289,16 @@ WindowClone.prototype = {
}, },
_onDragBegin : function (draggable, time) { _onDragBegin : function (draggable, time) {
[this.dragOrigX, this.dragOrigY] = this.actor.get_position();
this.dragOrigScale = this.actor.scale_x;
this.inDrag = true; this.inDrag = true;
this.emit('drag-begin'); this.emit('drag-begin');
}, },
_onDragCancelled : function (draggable, time) {
this.emit('drag-cancelled');
},
_onDragEnd : function (draggable, time, snapback) { _onDragEnd : function (draggable, time, snapback) {
this.inDrag = false; this.inDrag = false;
@ -327,6 +334,7 @@ WindowOverlay.prototype = {
this._windowClone = windowClone; this._windowClone = windowClone;
this._parentActor = parentActor; this._parentActor = parentActor;
this._hidden = false;
let title = new St.Label({ style_class: 'window-caption', let title = new St.Label({ style_class: 'window-caption',
text: metaWindow.title }); text: metaWindow.title });
@ -372,11 +380,13 @@ WindowOverlay.prototype = {
}, },
hide: function() { hide: function() {
this._hidden = true;
this.closeButton.hide(); this.closeButton.hide();
this.title.hide(); this.title.hide();
}, },
show: function() { show: function() {
this._hidden = false;
let [x, y, mask] = global.get_pointer(); let [x, y, mask] = global.get_pointer();
let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE, let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE,
x, y); x, y);
@ -387,8 +397,8 @@ WindowOverlay.prototype = {
}, },
fadeIn: function() { fadeIn: function() {
this.show();
this.title.opacity = 0; this.title.opacity = 0;
this.title.show();
this._parentActor.raise_top(); this._parentActor.raise_top();
Tweener.addTween(this.title, Tweener.addTween(this.title,
{ opacity: 255, { opacity: 255,
@ -419,8 +429,13 @@ WindowOverlay.prototype = {
let button = this.closeButton; let button = this.closeButton;
let title = this.title; let title = this.title;
let buttonX = cloneX + cloneWidth - button._overlap; let buttonX;
let buttonY = cloneY - button.height + button._overlap; let buttonY = cloneY - (button.height - button._overlap);
if (St.Widget.get_default_direction() == St.TextDirection.RTL)
buttonX = cloneX - (button.width - button._overlap);
else
buttonX = cloneX + (cloneWidth - button._overlap);
button.set_position(Math.floor(buttonX), Math.floor(buttonY)); button.set_position(Math.floor(buttonX), Math.floor(buttonY));
if (!title.fullWidth) if (!title.fullWidth)
@ -475,6 +490,12 @@ WindowOverlay.prototype = {
}, },
_onEnter: function() { _onEnter: function() {
// We might get enter events on the clone while the overlay is
// hidden, e.g. during animations, we ignore these events,
// as the close button will be shown as needed when the overlays
// are shown again
if (this._hidden)
return;
this._parentActor.raise_top(); this._parentActor.raise_top();
this.closeButton.show(); this.closeButton.show();
this.emit('show-close-button'); this.emit('show-close-button');
@ -515,7 +536,7 @@ WindowOverlay.prototype = {
Signals.addSignalMethods(WindowOverlay.prototype); Signals.addSignalMethods(WindowOverlay.prototype);
const WindowPositionFlags = { const WindowPositionFlags = {
ZOOM: 1 << 0, INITIAL: 1 << 0,
ANIMATE: 1 << 1 ANIMATE: 1 << 1
}; };
@ -531,27 +552,26 @@ Workspace.prototype = {
// When dragging a window, we use this slot for reserve space. // When dragging a window, we use this slot for reserve space.
this._reservedSlot = null; this._reservedSlot = null;
this.metaWorkspace = metaWorkspace; this.metaWorkspace = metaWorkspace;
this._x = 0;
this._y = 0;
this._width = 0;
this._height = 0;
this._windowOverlaysGroup = new Clutter.Group(); this._windowOverlaysGroup = new Clutter.Group();
// Without this the drop area will be overlapped. // Without this the drop area will be overlapped.
this._windowOverlaysGroup.set_size(0, 0); this._windowOverlaysGroup.set_size(0, 0);
this.actor = new Clutter.Group(); this.actor = new Clutter.Group();
this.actor._delegate = this; this.actor.set_size(0, 0);
this._dropRect = new Clutter.Rectangle({ opacity: 0 });
this._dropRect._delegate = this;
this.actor.add_actor(this._dropRect);
this.actor.add_actor(this._windowOverlaysGroup);
this.actor.connect('destroy', Lang.bind(this, this._onDestroy)); this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
// Items in _windowOverlaysGroup should not be scaled, so we don't
// add them to this.actor, but to its parent whenever it changes
this.actor.connect('parent-set', Lang.bind(this, this._onParentSet));
// Auto-sizing is unreliable in the presence of ClutterClone, so rather than
// implicitly counting on the workspace actor to be sized to the size of the
// included desktop actor clone, set the size explicitly to the screen size.
// See http://bugzilla.openedhand.com/show_bug.cgi?id=1755
this.actor.width = global.screen_width;
this.actor.height = global.screen_height;
this.scale = 1.0;
let windows = Main.getWindowActorsForWorkspace(this.metaWorkspace.index()); let windows = Main.getWindowActorsForWorkspace(this.metaWorkspace.index());
// Create clones for windows that should be // Create clones for windows that should be
@ -574,6 +594,22 @@ Workspace.prototype = {
this.leavingOverview = false; this.leavingOverview = false;
}, },
setGeometry: function(x, y, width, height) {
this._x = x;
this._y = y;
this._width = width;
this._height = height;
// This is sometimes called during allocation, so we do this later
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
function () {
this._dropRect.set_position(x, y);
this._dropRect.set_size(width, height);
return false;
}));
},
_lookupIndex: function (metaWindow) { _lookupIndex: function (metaWindow) {
for (let i = 0; i < this._windows.length; i++) { for (let i = 0; i < this._windows.length; i++) {
if (this._windows[i].metaWindow == metaWindow) { if (this._windows[i].metaWindow == metaWindow) {
@ -583,17 +619,6 @@ Workspace.prototype = {
return -1; return -1;
}, },
_onParentSet: function(actor, old_parent) {
let new_parent = this.actor.get_parent();
if (new_parent == null)
return;
if (old_parent)
this._windowOverlaysGroup.reparent(new_parent);
else
new_parent.add_actor(this._windowOverlaysGroup);
},
containsMetaWindow: function (metaWindow) { containsMetaWindow: function (metaWindow) {
return this._lookupIndex(metaWindow) >= 0; return this._lookupIndex(metaWindow) >= 0;
}, },
@ -672,10 +697,20 @@ Workspace.prototype = {
let xDelta, yDelta, distanceSquared; let xDelta, yDelta, distanceSquared;
let actorWidth, actorHeight; let actorWidth, actorHeight;
actorWidth = actor.width * actor.scale_x; let x = actor.x;
actorHeight = actor.height * actor.scale_y; let y = actor.y;
xDelta = actor.x + actorWidth / 2.0 - xCenter * global.screen_width; let scale = actor.scale_x;
yDelta = actor.y + actorHeight / 2.0 - yCenter * global.screen_height;
if (actor._delegate.inDrag) {
x = actor._delegate.dragOrigX;
y = actor._delegate.dragOrigY;
scale = actor._delegate.dragOrigScale;
}
actorWidth = actor.width * scale;
actorHeight = actor.height * scale;
xDelta = x + actorWidth / 2.0 - xCenter * this._width - this._x;
yDelta = y + actorHeight / 2.0 - yCenter * this._height - this._y;
distanceSquared = xDelta * xDelta + yDelta * yDelta; distanceSquared = xDelta * xDelta + yDelta * yDelta;
return distanceSquared; return distanceSquared;
@ -700,6 +735,12 @@ Workspace.prototype = {
let delta = this._computeWindowMotion(cloneActor, slot); let delta = this._computeWindowMotion(cloneActor, slot);
motion += delta; motion += delta;
// Bail out early if we're already larger than the
// previous best
if (minimumMotionPermutation != null &&
motion > minimumMotion)
continue;
} }
if (minimumMotionPermutation == null || motion < minimumMotion) { if (minimumMotionPermutation == null || motion < minimumMotion) {
@ -760,38 +801,35 @@ Workspace.prototype = {
}, },
/** /**
* _getSlotRelativeGeometry: * _getSlotGeometry:
* @slot: A layout slot * @slot: A layout slot
* *
* Returns: the workspace-relative [x, y, width, height] * Returns: the screen-relative [x, y, width, height]
* of a given window layout slot. * of a given window layout slot.
*/ */
_getSlotRelativeGeometry: function(slot) { _getSlotGeometry: function(slot) {
let [xCenter, yCenter, fraction] = slot; let [xCenter, yCenter, fraction] = slot;
let width = global.screen_width * fraction; let width = this._width * fraction;
let height = global.screen_height * fraction; let height = this._height * fraction;
let x = xCenter * global.screen_width - width / 2; let x = this._x + xCenter * this._width - width / 2 ;
let y = yCenter * global.screen_height - height / 2; let y = this._y + yCenter * this._height - height / 2;
return [x, y, width, height]; return [x, y, width, height];
}, },
/** /**
* _computeWindowRelativeLayout: * _computeWindowLayout:
* @metaWindow: A #MetaWindow * @metaWindow: A #MetaWindow
* @slot: A layout slot * @slot: A layout slot
* *
* Given a window and slot to fit it in, compute its * Given a window and slot to fit it in, compute its
* workspace-relative [x, y, scale] where scale applies * screen-relative [x, y, scale] where scale applies
* to both X and Y directions. * to both X and Y directions.
*/ */
_computeWindowRelativeLayout: function(metaWindow, slot) { _computeWindowLayout: function(metaWindow, slot) {
let [xCenter, yCenter, fraction] = slot; let [x, y, width, height] = this._getSlotGeometry(slot);
let [x, y, width, height] = this._getSlotRelativeGeometry(slot);
xCenter = xCenter * global.screen_width;
let rect = metaWindow.get_outer_rect(); let rect = metaWindow.get_outer_rect();
let buttonOuterHeight, captionHeight; let buttonOuterHeight, captionHeight;
@ -799,23 +837,19 @@ Workspace.prototype = {
if (this._windowOverlays[0]) { if (this._windowOverlays[0]) {
[buttonOuterHeight, captionHeight] = this._windowOverlays[0].chromeHeights(); [buttonOuterHeight, captionHeight] = this._windowOverlays[0].chromeHeights();
buttonOuterWidth = this._windowOverlays[0].chromeWidth() / this.scale; buttonOuterWidth = this._windowOverlays[0].chromeWidth();
} else } else
[buttonOuterHeight, captionHeight] = [0, 0]; [buttonOuterHeight, captionHeight] = [0, 0];
buttonOuterHeight /= this.scale;
captionHeight /= this.scale;
let desiredWidth = global.screen_width * fraction; let scale = Math.min((width - buttonOuterWidth) / rect.width,
let desiredHeight = global.screen_height * fraction; (height - buttonOuterHeight - captionHeight) / rect.height,
let scale = Math.min((desiredWidth - buttonOuterWidth) / rect.width, 1.0);
(desiredHeight - buttonOuterHeight - captionHeight) / rect.height,
1.0 / this.scale);
x = Math.floor(xCenter - 0.5 * scale * rect.width); x = Math.floor(x + (width - scale * rect.width) / 2);
// We want to center the window in case we have just one // We want to center the window in case we have just one
if (metaWindow.get_workspace().n_windows == 1) if (metaWindow.get_workspace().n_windows == 1)
y = Math.floor(yCenter * global.screen_height - 0.5 * scale * rect.height); y = Math.floor(y + (height - scale * rect.height) / 2);
else else
y = Math.floor(y + height - rect.height * scale - captionHeight); y = Math.floor(y + height - rect.height * scale - captionHeight);
@ -841,7 +875,7 @@ Workspace.prototype = {
/** /**
* positionWindows: * positionWindows:
* @flags: * @flags:
* ZOOM - workspace is moving at the same time and we need to take that into account. * INITIAL - this is the initial positioning of the windows.
* ANIMATE - Indicates that we need animate changing position. * ANIMATE - Indicates that we need animate changing position.
*/ */
positionWindows : function(flags) { positionWindows : function(flags) {
@ -854,7 +888,7 @@ Workspace.prototype = {
if (this._reservedSlot) if (this._reservedSlot)
clones.push(this._reservedSlot); clones.push(this._reservedSlot);
let workspaceZooming = flags & WindowPositionFlags.ZOOM; let initialPositioning = flags & WindowPositionFlags.INITIAL;
let animate = flags & WindowPositionFlags.ANIMATE; let animate = flags & WindowPositionFlags.ANIMATE;
// Start the animations // Start the animations
@ -876,7 +910,7 @@ Workspace.prototype = {
if (clone.inDrag) if (clone.inDrag)
continue; continue;
let [x, y, scale] = this._computeWindowRelativeLayout(metaWindow, slot); let [x, y, scale] = this._computeWindowLayout(metaWindow, slot);
if (overlay) if (overlay)
overlay.hide(); overlay.hide();
@ -885,7 +919,7 @@ Workspace.prototype = {
/* Hidden windows should fade in and grow /* Hidden windows should fade in and grow
* therefore we need to resize them now so they * therefore we need to resize them now so they
* can be scaled up later */ * can be scaled up later */
if (workspaceZooming) { if (initialPositioning) {
clone.actor.opacity = 0; clone.actor.opacity = 0;
clone.actor.scale_x = 0; clone.actor.scale_x = 0;
clone.actor.scale_y = 0; clone.actor.scale_y = 0;
@ -906,7 +940,6 @@ Workspace.prototype = {
y: y, y: y,
scale_x: scale, scale_x: scale,
scale_y: scale, scale_y: scale,
workspace_relative: workspaceZooming ? this : null,
time: Overview.ANIMATION_TIME, time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad', transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() { onComplete: Lang.bind(this, function() {
@ -929,7 +962,7 @@ Workspace.prototype = {
let clone = clones[i]; let clone = clones[i];
let metaWindow = clone.metaWindow; let metaWindow = clone.metaWindow;
if (i == 0) { if (i == 0) {
clone.setStackAbove(null); clone.setStackAbove(this._dropRect);
} else { } else {
let previousClone = clones[i - 1]; let previousClone = clones[i - 1];
clone.setStackAbove(previousClone.actor); clone.setStackAbove(previousClone.actor);
@ -949,10 +982,8 @@ Workspace.prototype = {
// be after the workspace animation finishes. // be after the workspace animation finishes.
let [cloneX, cloneY] = clone.actor.get_position(); let [cloneX, cloneY] = clone.actor.get_position();
let [cloneWidth, cloneHeight] = clone.actor.get_size(); let [cloneWidth, cloneHeight] = clone.actor.get_size();
cloneX = this.x + this.scale * cloneX; cloneWidth = clone.actor.scale_x * cloneWidth;
cloneY = this.y + this.scale * cloneY; cloneHeight = clone.actor.scale_y * cloneHeight;
cloneWidth = this.scale * clone.actor.scale_x * cloneWidth;
cloneHeight = this.scale * clone.actor.scale_y * cloneHeight;
if (overlay) { if (overlay) {
overlay.updatePositions(cloneX, cloneY, cloneWidth, cloneHeight); overlay.updatePositions(cloneX, cloneY, cloneWidth, cloneHeight);
@ -977,12 +1008,10 @@ Workspace.prototype = {
return true; return true;
let [x, y, mask] = global.get_pointer(); let [x, y, mask] = global.get_pointer();
let wsWidth = this.actor.width * this.scale;
let wsHeight = this.actor.height * this.scale;
let pointerHasMoved = (this._cursorX != x && this._cursorY != y); let pointerHasMoved = (this._cursorX != x && this._cursorY != y);
let inWorkspace = (this.x < x && x < this.x + wsWidth && let inWorkspace = (this._x < x && x < this._x + this._width &&
this.y < y && y < this.y + wsHeight); this._y < y && y < this._y + this._height);
if (pointerHasMoved && inWorkspace) { if (pointerHasMoved && inWorkspace) {
// store current cursor position // store current cursor position
@ -1083,13 +1112,20 @@ Workspace.prototype = {
let clone = this._addWindowClone(win); let clone = this._addWindowClone(win);
if (win._overviewHint) { if (win._overviewHint) {
let x = (win._overviewHint.x - this.actor.x) / this.scale; let x = win._overviewHint.x - this.actor.x;
let y = (win._overviewHint.y - this.actor.y) / this.scale; let y = win._overviewHint.y - this.actor.y;
let scale = win._overviewHint.scale / this.scale; let scale = win._overviewHint.scale;
delete win._overviewHint; delete win._overviewHint;
clone.actor.set_position (x, y); clone.actor.set_position (x, y);
clone.actor.set_scale (scale, scale); clone.actor.set_scale (scale, scale);
} else {
// Position new windows at the top corner of the workspace rather
// than where they were placed for real to avoid the window
// being clipped to the workspaceView. Its not really more
// natural for the window to suddenly appear in the overview
// on some seemingly random location anyway.
clone.actor.set_position (this._x, this._y);
} }
this.positionWindows(WindowPositionFlags.ANIMATE); this.positionWindows(WindowPositionFlags.ANIMATE);
@ -1109,14 +1145,11 @@ Workspace.prototype = {
// Animate the full-screen to Overview transition. // Animate the full-screen to Overview transition.
zoomToOverview : function() { zoomToOverview : function() {
this.actor.set_position(this.x, this.y);
this.actor.set_scale(this.scale, this.scale);
// Position and scale the windows. // Position and scale the windows.
if (Main.overview.animationInProgress) if (Main.overview.animationInProgress)
this.positionWindows(WindowPositionFlags.ANIMATE | WindowPositionFlags.ZOOM); this.positionWindows(WindowPositionFlags.ANIMATE | WindowPositionFlags.INITIAL);
else else
this.positionWindows(WindowPositionFlags.ZOOM); this.positionWindows(WindowPositionFlags.INITIAL);
}, },
// Animates the return from Overview mode // Animates the return from Overview mode
@ -1134,7 +1167,7 @@ Workspace.prototype = {
this._overviewHiddenId = Main.overview.connect('hidden', Lang.bind(this, this._overviewHiddenId = Main.overview.connect('hidden', Lang.bind(this,
this._doneLeavingOverview)); this._doneLeavingOverview));
if (this._metaWorkspace == currentWorkspace) if (this.metaWorkspace != currentWorkspace)
return; return;
// Position and scale the windows. // Position and scale the windows.
@ -1149,7 +1182,6 @@ Workspace.prototype = {
y: clone.origY, y: clone.origY,
scale_x: 1.0, scale_x: 1.0,
scale_y: 1.0, scale_y: 1.0,
workspace_relative: this,
time: Overview.ANIMATION_TIME, time: Overview.ANIMATION_TIME,
opacity: 255, opacity: 255,
transition: 'easeOutQuad' transition: 'easeOutQuad'
@ -1160,7 +1192,6 @@ Workspace.prototype = {
{ scale_x: 0, { scale_x: 0,
scale_y: 0, scale_y: 0,
opacity: 0, opacity: 0,
workspace_relative: this,
time: Overview.ANIMATION_TIME, time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad' transition: 'easeOutQuad'
}); });
@ -1223,6 +1254,10 @@ Workspace.prototype = {
Main.overview.beginWindowDrag(); Main.overview.beginWindowDrag();
overlay.hide(); overlay.hide();
})); }));
clone.connect('drag-cancelled',
Lang.bind(this, function(clone) {
Main.overview.cancelledWindowDrag();
}));
clone.connect('drag-end', clone.connect('drag-end',
Lang.bind(this, function(clone) { Lang.bind(this, function(clone) {
Main.overview.endWindowDrag(); Main.overview.endWindowDrag();
@ -1330,56 +1365,3 @@ Workspace.prototype = {
}; };
Signals.addSignalMethods(Workspace.prototype); Signals.addSignalMethods(Workspace.prototype);
// Create a SpecialPropertyModifier to let us move windows in a
// straight line on the screen even though their containing workspace
// is also moving.
Tweener.registerSpecialPropertyModifier('workspace_relative', _workspaceRelativeModifier, _workspaceRelativeGet);
function _workspaceRelativeModifier(workspace) {
let [startX, startY] = Main.overview.getPosition();
let overviewPosX, overviewPosY, overviewScale;
if (!workspace)
return [];
if (workspace.leavingOverview) {
let [zoomedInX, zoomedInY] = Main.overview.getZoomedInPosition();
overviewPosX = { begin: startX, end: zoomedInX };
overviewPosY = { begin: startY, end: zoomedInY };
overviewScale = { begin: Main.overview.getScale(),
end: Main.overview.getZoomedInScale() };
} else {
overviewPosX = { begin: startX, end: 0 };
overviewPosY = { begin: startY, end: 0 };
overviewScale = { begin: Main.overview.getScale(), end: 1 };
}
return [ { name: 'x',
parameters: { workspacePos: workspace.x,
overviewPos: overviewPosX,
overviewScale: overviewScale } },
{ name: 'y',
parameters: { workspacePos: workspace.y,
overviewPos: overviewPosY,
overviewScale: overviewScale } }
];
}
function _workspaceRelativeGet(begin, end, time, params) {
let curOverviewPos = (1 - time) * params.overviewPos.begin +
time * params.overviewPos.end;
let curOverviewScale = (1 - time) * params.overviewScale.begin +
time * params.overviewScale.end;
// Calculate the screen position of the window.
let screen = (1 - time) *
((begin + params.workspacePos) * params.overviewScale.begin +
params.overviewPos.begin) +
time *
((end + params.workspacePos) * params.overviewScale.end +
params.overviewPos.end);
// Return the workspace coordinates.
return (screen - curOverviewPos) / curOverviewScale - params.workspacePos;
}

View File

@ -402,10 +402,6 @@ ThumbnailsBox.prototype = {
// for the border and padding of the background actor. // for the border and padding of the background actor.
this._background = new St.Bin({ style_class: 'workspace-thumbnails-background' }); this._background = new St.Bin({ style_class: 'workspace-thumbnails-background' });
// This will eventually be automatic, see https://bugzilla.gnome.org/show_bug.cgi?id=584662
if (St.Widget.get_default_direction () == St.TextDirection.RTL)
this._background.add_style_pseudo_class('rtl');
this.actor.add_actor(this._background); this.actor.add_actor(this._background);
let indicator = new St.Bin({ style_class: 'workspace-thumbnail-indicator' }); let indicator = new St.Bin({ style_class: 'workspace-thumbnail-indicator' });

View File

@ -25,14 +25,13 @@ const MAX_WORKSPACES = 16;
const CONTROLS_POP_IN_TIME = 0.1; const CONTROLS_POP_IN_TIME = 0.1;
function WorkspacesView(width, height, x, y, workspaces) { function WorkspacesView(workspaces) {
this._init(width, height, x, y, workspaces); this._init(workspaces);
} }
WorkspacesView.prototype = { WorkspacesView.prototype = {
_init: function(width, height, x, y, workspaces) { _init: function(workspaces) {
this.actor = new St.Group({ style_class: 'workspaces-view' }); this.actor = new St.Group({ style_class: 'workspaces-view' });
this.actor.set_clip(x, y, width, height);
// The actor itself isn't a drop target, so we don't want to pick on its area // The actor itself isn't a drop target, so we don't want to pick on its area
this.actor.set_size(0, 0); this.actor.set_size(0, 0);
@ -43,19 +42,16 @@ WorkspacesView.prototype = {
function() { function() {
let node = this.actor.get_theme_node(); let node = this.actor.get_theme_node();
this._spacing = node.get_length('spacing'); this._spacing = node.get_length('spacing');
this._computeWorkspacePositions(); this._updateWorkspaceActors(false);
})); }));
this.actor.connect('notify::mapped', this.actor.connect('notify::mapped',
Lang.bind(this, this._onMappedChanged)); Lang.bind(this, this._onMappedChanged));
this._width = width; this._width = 0;
this._height = height; this._height = 0;
this._x = x; this._x = 0;
this._y = y; this._y = 0;
this._zoomScale = 1.0;
this._spacing = 0; this._spacing = 0;
this._activeWorkspaceX = 0; // x offset of active ws while dragging
this._activeWorkspaceY = 0; // y offset of active ws while dragging
this._lostWorkspaces = []; this._lostWorkspaces = [];
this._animating = false; // tweening this._animating = false; // tweening
this._scrolling = false; // swipe-scrolling this._scrolling = false; // swipe-scrolling
@ -81,6 +77,11 @@ WorkspacesView.prototype = {
for (let w = 0; w < this._workspaces.length; w++) for (let w = 0; w < this._workspaces.length; w++)
this._workspaces[w].zoomToOverview(); this._workspaces[w].zoomToOverview();
})); }));
this._overviewShownId =
Main.overview.connect('shown',
Lang.bind(this, function() {
this.actor.set_clip(this._x, this._y, this._width, this._height);
}));
this._scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex, this._scrollAdjustment = new St.Adjustment({ value: activeWorkspaceIndex,
lower: 0, lower: 0,
@ -109,30 +110,17 @@ WorkspacesView.prototype = {
this._swipeScrollEndId = 0; this._swipeScrollEndId = 0;
}, },
setZoomScale: function(zoomScale) { setGeometry: function(x, y, width, height) {
if (zoomScale == this._zoomScale) if (this._x == x && this._y == y &&
return; this._width == width && this._height == height)
return;
this._width = width;
this._height = height;
this._x = x;
this._y = y;
this._zoomScale = zoomScale; for (let i = 0; i < this._workspaces.length; i++)
if (this._zoomOut) { this._workspaces[i].setGeometry(x, y, width, height);
// If we are already zoomed out, then we have to reposition.
// Note that when shown initially zoomOut is false, so we
// won't trigger this.
// setZoomScale can be invoked when the workspaces view is
// reallocated. Since we just want to animate things to the
// new position it seems OK to call updateWorkspaceActors
// immediately - adding a tween doesn't immediately cause
// a new allocation. But hide/show of the window overlays we
// do around animation does, so we need to do it later.
// This can be removed when we fix things to not hide/show
// the window overlay.
Meta.later_add(Meta.LaterType.BEFORE_REDRAW,
Lang.bind(this, function() {
this._computeWorkspacePositions();
this._updateWorkspaceActors(true);
}));
}
}, },
_lookupWorkspaceForMetaWindow: function (metaWindow) { _lookupWorkspaceForMetaWindow: function (metaWindow) {
@ -154,6 +142,8 @@ WorkspacesView.prototype = {
activeWorkspace.actor.raise_top(); activeWorkspace.actor.raise_top();
this.actor.remove_clip(this._x, this._y, this._width, this._height);
for (let w = 0; w < this._workspaces.length; w++) for (let w = 0; w < this._workspaces.length; w++)
this._workspaces[w].zoomFromOverview(); this._workspaces[w].zoomFromOverview();
}, },
@ -162,93 +152,27 @@ WorkspacesView.prototype = {
this.actor.destroy(); this.actor.destroy();
}, },
getScale: function() {
return this._workspaces[0].scale;
},
syncStacking: function(stackIndices) { syncStacking: function(stackIndices) {
for (let i = 0; i < this._workspaces.length; i++) for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].syncStacking(stackIndices); this._workspaces[i].syncStacking(stackIndices);
}, },
// Get the grid position of the active workspace. updateWindowPositions: function() {
getActiveWorkspacePosition: function() { for (let w = 0; w < this._workspaces.length; w++)
let activeWorkspaceIndex = global.screen.get_active_workspace_index(); this._workspaces[w].positionWindows(Workspace.WindowPositionFlags.ANIMATE);
let activeWorkspace = this._workspaces[activeWorkspaceIndex];
return [activeWorkspace.x, activeWorkspace.y];
},
zoomOut: function() {
if (this._zoomOut)
return;
this._zoomOut = true;
this._computeWorkspacePositions();
this._updateWorkspaceActors(true);
},
zoomIn: function() {
if (!this._zoomOut)
return;
this._zoomOut = false;
this._computeWorkspacePositions();
this._updateWorkspaceActors(true);
},
// Compute the position, scale and opacity of the workspaces, but don't
// actually change the actors to match
_computeWorkspacePositions: function() {
let active = global.screen.get_active_workspace_index();
let zoomScale = this._zoomOut ? this._zoomScale : 1;
let scale = zoomScale * this._width / global.screen_width;
let _width = this._workspaces[0].actor.width * scale;
let _height = this._workspaces[0].actor.height * scale;
this._activeWorkspaceX = (this._width - _width) / 2;
this._activeWorkspaceY = (this._height - _height) / 2;
for (let w = 0; w < this._workspaces.length; w++) {
let workspace = this._workspaces[w];
workspace.opacity = (this._inDrag && w != active) ? 200 : 255;
workspace.scale = scale;
workspace.x = this._x + this._activeWorkspaceX;
// We adjust the center because the zoomScale is to leave space for
// the expanded workspace control so we want to zoom to either the
// left part of the area or the right part of the area
let offset = 0.5 * (1 - this._zoomScale) * this._width;
let rtl = (St.Widget.get_default_direction () == St.TextDirection.RTL);
if (this._zoomOut)
workspace.x += rtl ? offset : - offset;
// We divide by zoomScale so that adjacent workspaces are always offscreen
// except when we are switching between workspaces
workspace.y = this._y + this._activeWorkspaceY
+ (w - active) * (_height + this._spacing) / zoomScale;
}
}, },
_scrollToActive: function(showAnimation) { _scrollToActive: function(showAnimation) {
let active = global.screen.get_active_workspace_index(); let active = global.screen.get_active_workspace_index();
this._computeWorkspacePositions();
this._updateWorkspaceActors(showAnimation); this._updateWorkspaceActors(showAnimation);
this._updateScrollAdjustment(active, showAnimation); this._updateScrollAdjustment(active, showAnimation);
}, },
// Update workspace actors parameters to the values calculated in // Update workspace actors parameters
// _computeWorkspacePositions()
// @showAnimation: iff %true, transition between states // @showAnimation: iff %true, transition between states
_updateWorkspaceActors: function(showAnimation) { _updateWorkspaceActors: function(showAnimation) {
let active = global.screen.get_active_workspace_index(); let active = global.screen.get_active_workspace_index();
let targetWorkspaceNewY = this._y + this._activeWorkspaceY;
let targetWorkspaceCurrentY = this._workspaces[active].y;
let dy = targetWorkspaceNewY - targetWorkspaceCurrentY;
this._animating = showAnimation; this._animating = showAnimation;
@ -257,14 +181,12 @@ WorkspacesView.prototype = {
Tweener.removeTweens(workspace.actor); Tweener.removeTweens(workspace.actor);
workspace.y += dy; let opacity = (this._inDrag && w != active) ? 200 : 255;
let y = (w - active) * (this._height + this._spacing);
if (showAnimation) { if (showAnimation) {
let params = { x: workspace.x, let params = { y: y,
y: workspace.y, opacity: opacity,
scale_x: workspace.scale,
scale_y: workspace.scale,
opacity: workspace.opacity,
time: WORKSPACE_SWITCH_TIME, time: WORKSPACE_SWITCH_TIME,
transition: 'easeOutQuad' transition: 'easeOutQuad'
}; };
@ -281,9 +203,8 @@ WorkspacesView.prototype = {
} }
Tweener.addTween(workspace.actor, params); Tweener.addTween(workspace.actor, params);
} else { } else {
workspace.actor.set_scale(workspace.scale, workspace.scale); workspace.actor.set_position(0, y);
workspace.actor.set_position(workspace.x, workspace.y); workspace.actor.opacity = opacity;
workspace.actor.opacity = workspace.opacity;
if (w == 0) if (w == 0)
this._updateVisibility(); this._updateVisibility();
} }
@ -294,7 +215,6 @@ WorkspacesView.prototype = {
Tweener.removeTweens(workspace.actor); Tweener.removeTweens(workspace.actor);
workspace.y += dy;
workspace.actor.show(); workspace.actor.show();
workspace.hideWindowsOverlays(); workspace.hideWindowsOverlays();
@ -338,7 +258,6 @@ WorkspacesView.prototype = {
this._lostWorkspaces[l].destroy(); this._lostWorkspaces[l].destroy();
this._lostWorkspaces = []; this._lostWorkspaces = [];
this._computeWorkspacePositions();
this._updateWorkspaceActors(false); this._updateWorkspaceActors(false);
}, },
@ -380,7 +299,6 @@ WorkspacesView.prototype = {
for (let w = oldNumWorkspaces; w < newNumWorkspaces; w++) for (let w = oldNumWorkspaces; w < newNumWorkspaces; w++)
this.actor.add_actor(this._workspaces[w].actor); this.actor.add_actor(this._workspaces[w].actor);
this._computeWorkspacePositions();
this._updateWorkspaceActors(false); this._updateWorkspaceActors(false);
} else { } else {
this._lostWorkspaces = lostWorkspaces; this._lostWorkspaces = lostWorkspaces;
@ -399,6 +317,7 @@ WorkspacesView.prototype = {
_onDestroy: function() { _onDestroy: function() {
this._scrollAdjustment.run_dispose(); this._scrollAdjustment.run_dispose();
Main.overview.disconnect(this._overviewShowingId); Main.overview.disconnect(this._overviewShowingId);
Main.overview.disconnect(this._overviewShownId);
global.window_manager.disconnect(this._switchWorkspaceNotifyId); global.window_manager.disconnect(this._switchWorkspaceNotifyId);
if (this._timeoutId) { if (this._timeoutId) {
@ -557,12 +476,6 @@ WorkspacesView.prototype = {
Main.overview.hide(); Main.overview.hide();
} }
if (result == Overview.SwipeScrollResult.SWIPE)
// The active workspace has changed; while swipe-scrolling
// has already taken care of the positioning, the cached
// positions need to be updated
this._computeWorkspacePositions();
// Make sure title captions etc are shown as necessary // Make sure title captions etc are shown as necessary
this._updateVisibility(); this._updateVisibility();
}, },
@ -590,7 +503,7 @@ WorkspacesView.prototype = {
return; return;
let currentY = firstWorkspaceY; let currentY = firstWorkspaceY;
let newY = this._y - adj.value / (adj.upper - 1) * workspacesHeight; let newY = - adj.value / (adj.upper - 1) * workspacesHeight;
let dy = newY - currentY; let dy = newY - currentY;
@ -640,6 +553,7 @@ WorkspacesDisplay.prototype = {
this.workspacesView = null; this.workspacesView = null;
this._inDrag = false; this._inDrag = false;
this._cancelledDrag = false;
this._zoomOut = false; this._zoomOut = false;
this._zoomFraction = 0; this._zoomFraction = 0;
@ -649,6 +563,7 @@ WorkspacesDisplay.prototype = {
this._itemDragBeginId = 0; this._itemDragBeginId = 0;
this._itemDragEndId = 0; this._itemDragEndId = 0;
this._windowDragBeginId = 0; this._windowDragBeginId = 0;
this._windowDragCancelledId = 0;
this._windowDragEndId = 0; this._windowDragEndId = 0;
}, },
@ -662,43 +577,10 @@ WorkspacesDisplay.prototype = {
this._workspaces[i] = new Workspace.Workspace(metaWorkspace); this._workspaces[i] = new Workspace.Workspace(metaWorkspace);
} }
let rtl = (St.Widget.get_default_direction () == St.TextDirection.RTL);
let totalAllocation = this.actor.allocation;
let totalWidth = totalAllocation.x2 - totalAllocation.x1;
let totalHeight = totalAllocation.y2 - totalAllocation.y1;
let controlsVisible = this._controls.get_theme_node().get_length('visible-width');
totalWidth -= controlsVisible;
// Workspaces expect to have the same ratio as the screen, so take
// this into account when fitting the workspace into the available space
let width, height;
let totalRatio = totalWidth / totalHeight;
let wsRatio = global.screen_width / global.screen_height;
if (wsRatio > totalRatio) {
width = totalWidth;
height = Math.floor(totalWidth / wsRatio);
} else {
width = Math.floor(totalHeight * wsRatio);
height = totalHeight;
}
// Position workspaces in the available space
let [x, y] = this.actor.get_transformed_position();
x = Math.floor(x + Math.abs(totalWidth - width) / 2);
y = Math.floor(y + Math.abs(totalHeight - height) / 2);
if (rtl)
x += controlsVisible;
let newView = new WorkspacesView(width, height, x, y, this._workspaces);
this._updateZoomScale();
if (this.workspacesView) if (this.workspacesView)
this.workspacesView.destroy(); this.workspacesView.destroy();
this.workspacesView = newView; this.workspacesView = new WorkspacesView(this._workspaces);
this._updateWorkspacesGeometry();
this._nWorkspacesNotifyId = this._nWorkspacesNotifyId =
global.screen.connect('notify::n-workspaces', global.screen.connect('notify::n-workspaces',
@ -717,6 +599,9 @@ WorkspacesDisplay.prototype = {
if (this._windowDragBeginId == 0) if (this._windowDragBeginId == 0)
this._windowDragBeginId = Main.overview.connect('window-drag-begin', this._windowDragBeginId = Main.overview.connect('window-drag-begin',
Lang.bind(this, this._dragBegin)); Lang.bind(this, this._dragBegin));
if (this._windowDragCancelledId == 0)
this._windowDragCancelledId = Main.overview.connect('window-drag-cancelled',
Lang.bind(this, this._dragCancelled));
if (this._windowDragEndId == 0) if (this._windowDragEndId == 0)
this._windowDragEndId = Main.overview.connect('window-drag-end', this._windowDragEndId = Main.overview.connect('window-drag-end',
Lang.bind(this, this._dragEnd)); Lang.bind(this, this._dragEnd));
@ -751,6 +636,10 @@ WorkspacesDisplay.prototype = {
Main.overview.disconnect(this._windowDragBeginId); Main.overview.disconnect(this._windowDragBeginId);
this._windowDragBeginId = 0; this._windowDragBeginId = 0;
} }
if (this._windowDragCancelledId > 0) {
Main.overview.disconnect(this._windowDragCancelledId);
this._windowDragCancelledId = 0;
}
if (this._windowDragEndId > 0) { if (this._windowDragEndId > 0) {
Main.overview.disconnect(this._windowDragEndId); Main.overview.disconnect(this._windowDragEndId);
this._windowDragEndId = 0; this._windowDragEndId = 0;
@ -809,22 +698,34 @@ WorkspacesDisplay.prototype = {
childBox.y2 = box.y2- box.y1; childBox.y2 = box.y2- box.y1;
this._controls.allocate(childBox, flags); this._controls.allocate(childBox, flags);
this._updateZoomScale(); this._updateWorkspacesGeometry();
}, },
_updateZoomScale: function() { _updateWorkspacesGeometry: function() {
if (!this.workspacesView) if (!this.workspacesView)
return; return;
let totalAllocation = this.actor.allocation; let width = this.actor.allocation.x2 - this.actor.allocation.x1;
let totalWidth = totalAllocation.x2 - totalAllocation.x1; let height = this.actor.allocation.y2 - this.actor.allocation.y1;
let totalHeight = totalAllocation.y2 - totalAllocation.y1;
let [controlsMin, controlsNatural] = this._controls.get_preferred_width(totalHeight); let [controlsMin, controlsNatural] = this._controls.get_preferred_width(height);
let controlsVisible = this._controls.get_theme_node().get_length('visible-width'); let controlsVisible = this._controls.get_theme_node().get_length('visible-width');
let zoomScale = (totalWidth - controlsNatural) / (totalWidth - controlsVisible); let [x, y] = this.actor.get_transformed_position();
this.workspacesView.setZoomScale(zoomScale);
let rtl = (St.Widget.get_default_direction () == St.TextDirection.RTL);
if (this._zoomOut) {
width -= controlsNatural;
if (rtl)
x += controlsNatural;
} else {
width -= controlsVisible;
if (rtl)
x += controlsVisible;
}
this.workspacesView.setGeometry(x, y, width, height);
}, },
_onRestacked: function() { _onRestacked: function() {
@ -890,9 +791,10 @@ WorkspacesDisplay.prototype = {
if (Main.overview.animationInProgress) if (Main.overview.animationInProgress)
return; return;
let shouldZoom = this._controls.hover || this._inDrag; let shouldZoom = this._controls.hover || (this._inDrag && !this._cancelledDrag);
if (shouldZoom != this._zoomOut) { if (shouldZoom != this._zoomOut) {
this._zoomOut = shouldZoom; this._zoomOut = shouldZoom;
this._updateWorkspacesGeometry();
if (!this.workspacesView) if (!this.workspacesView)
return; return;
@ -902,10 +804,7 @@ WorkspacesDisplay.prototype = {
time: WORKSPACE_SWITCH_TIME, time: WORKSPACE_SWITCH_TIME,
transition: 'easeOutQuad' }); transition: 'easeOutQuad' });
if (shouldZoom) this.workspacesView.updateWindowPositions();
this.workspacesView.zoomOut();
else
this.workspacesView.zoomIn();
} }
}, },
@ -915,6 +814,12 @@ WorkspacesDisplay.prototype = {
_dragBegin: function() { _dragBegin: function() {
this._inDrag = true; this._inDrag = true;
this._cancelledDrag = false;
this._updateZoom();
},
_dragCancelled: function() {
this._cancelledDrag = true;
this._updateZoom(); this._updateZoom();
}, },

View File

@ -4,7 +4,6 @@ const Clutter = imports.gi.Clutter;
const Lang = imports.lang; const Lang = imports.lang;
const Shell = imports.gi.Shell; const Shell = imports.gi.Shell;
const Signals = imports.signals; const Signals = imports.signals;
const Mainloop = imports.mainloop;
const DND = imports.ui.dnd; const DND = imports.ui.dnd;
function XdndHandler() { function XdndHandler() {
@ -41,9 +40,14 @@ XdndHandler.prototype = {
// Called when the user cancels the drag (i.e release the button) // Called when the user cancels the drag (i.e release the button)
_onLeave: function() { _onLeave: function() {
if (this._windowGroupVisibilityHandlerId != 0) { if (this._windowGroupVisibilityHandlerId != 0) {
Mainloop.source_remove(this._windowGroupVisibilityHandlerId); global.window_group.disconnect(this._windowGroupVisibilityHandlerId);
this._windowGroupVisibilityHandlerId = 0; this._windowGroupVisibilityHandlerId = 0;
} }
if (this._cursorWindowClone) {
this._cursorWindowClone.destroy();
this._cursorWindowClone = null;
}
this.emit('drag-end'); this.emit('drag-end');
}, },
@ -77,8 +81,7 @@ XdndHandler.prototype = {
// Make sure that the clone has the same position as the source // Make sure that the clone has the same position as the source
this._cursorWindowClone.add_constraint(constraint_position); this._cursorWindowClone.add_constraint(constraint_position);
} else { } else {
if (this._cursorWindowClone) if (this._cursorWindowClone) {
{
this._cursorWindowClone.destroy(); this._cursorWindowClone.destroy();
this._cursorWindowClone = null; this._cursorWindowClone = null;
} }

View File

@ -28,6 +28,7 @@ js/ui/windowAttentionHandler.js
js/ui/workspacesView.js js/ui/workspacesView.js
src/gvc/gvc-mixer-control.c src/gvc/gvc-mixer-control.c
src/gdmuser/gdm-user.c src/gdmuser/gdm-user.c
src/main.c
src/shell-app-system.c src/shell-app-system.c
src/shell-global.c src/shell-global.c
src/shell-polkit-authentication-agent.c src/shell-polkit-authentication-agent.c

152
po/ar.po
View File

@ -6,8 +6,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: HEAD\n" "Project-Id-Version: HEAD\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-02 19:08+0200\n" "POT-Creation-Date: 2011-03-09 01:12+0200\n"
"PO-Revision-Date: 2011-03-02 19:08+0300\n" "PO-Revision-Date: 2011-03-09 01:12+0300\n"
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n" "Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
"Language-Team: Arabic <doc@arabeyes.org>\n" "Language-Team: Arabic <doc@arabeyes.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -164,27 +164,27 @@ 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:195 #: ../js/ui/appDisplay.js:226
msgid "All" msgid "All"
msgstr "الكل" msgstr "الكل"
#: ../js/ui/appDisplay.js:282 #: ../js/ui/appDisplay.js:324
msgid "APPLICATIONS" msgid "APPLICATIONS"
msgstr "التطبيقات" msgstr "التطبيقات"
#: ../js/ui/appDisplay.js:312 #: ../js/ui/appDisplay.js:350
msgid "SETTINGS" msgid "SETTINGS"
msgstr "الإعدادات" msgstr "الإعدادات"
#: ../js/ui/appDisplay.js:572 #: ../js/ui/appDisplay.js:612
msgid "New Window" msgid "New Window"
msgstr "نافذة جديدة" msgstr "نافذة جديدة"
#: ../js/ui/appDisplay.js:575 #: ../js/ui/appDisplay.js:615
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "أزِل من المفضّلة" msgstr "أزِل من المفضّلة"
#: ../js/ui/appDisplay.js:576 #: ../js/ui/appDisplay.js:616
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "أضِف إلى المفضّلة" msgstr "أضِف إلى المفضّلة"
@ -344,7 +344,7 @@ msgstr "هذا الأسبوع"
msgid "Next week" msgid "Next week"
msgstr "الأسبوع القادم" msgstr "الأسبوع القادم"
#: ../js/ui/dash.js:174 #: ../js/ui/dash.js:174 ../js/ui/messageTray.js:933
msgid "Remove" msgid "Remove"
msgstr "أزِل" msgstr "أزِل"
@ -352,54 +352,54 @@ msgstr "أزِل"
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "إعدادات الوقت و التّأريخ" msgstr "إعدادات الوقت و التّأريخ"
#: ../js/ui/dateMenu.js:110 #: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "افتح التقويم" msgstr "افتح التقويم"
#. Translators: This is the time format with date used #. Translators: This is the time format with date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:162 #: ../js/ui/dateMenu.js:164
msgid "%a %b %e, %R:%S" msgid "%a %b %e, %R:%S"
msgstr "%A %e %B، %R:%S" msgstr "%A %e %B، %R:%S"
#: ../js/ui/dateMenu.js:163 #: ../js/ui/dateMenu.js:165
msgid "%a %b %e, %R" msgid "%a %b %e, %R"
msgstr "%A %e %B، %R" msgstr "%A %e %B، %R"
#. Translators: This is the time format without date used #. Translators: This is the time format without date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:167 #: ../js/ui/dateMenu.js:169
msgid "%a %R:%S" msgid "%a %R:%S"
msgstr "%A %R:%S" msgstr "%A %R:%S"
#: ../js/ui/dateMenu.js:168 #: ../js/ui/dateMenu.js:170
msgid "%a %R" msgid "%a %R"
msgstr "%A %R" msgstr "%A %R"
#. Translators: This is a time format with date used #. Translators: This is a time format with date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:175 #: ../js/ui/dateMenu.js:177
msgid "%a %b %e, %l:%M:%S %p" msgid "%a %b %e, %l:%M:%S %p"
msgstr "%A %e %B، %l:%M:%S %p" msgstr "%A %e %B، %l:%M:%S %p"
#: ../js/ui/dateMenu.js:176 #: ../js/ui/dateMenu.js:178
msgid "%a %b %e, %l:%M %p" msgid "%a %b %e, %l:%M %p"
msgstr "%A %e %B، %l:%M %p" msgstr "%A %e %B، %l:%M %p"
#. Translators: This is a time format without date used #. Translators: This is a time format without date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:180 #: ../js/ui/dateMenu.js:182
msgid "%a %l:%M:%S %p" msgid "%a %l:%M:%S %p"
msgstr "%A %l:%M:%S %p" msgstr "%A %l:%M:%S %p"
#: ../js/ui/dateMenu.js:181 #: ../js/ui/dateMenu.js:183
msgid "%a %l:%M %p" msgid "%a %l:%M %p"
msgstr "%A %Ol:%OM %p" msgstr "%A %Ol:%OM %p"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:207 #: ../js/ui/dateMenu.js:209
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A %e %B، %Y" msgstr "%A %e %B، %Y"
@ -476,37 +476,41 @@ msgstr "أكّد"
msgid "Cancel" msgid "Cancel"
msgstr "ألغِ" msgstr "ألغِ"
#: ../js/ui/lookingGlass.js:587 #: ../js/ui/lookingGlass.js:588
msgid "No extensions installed" msgid "No extensions installed"
msgstr "لم تثبّت أية امتدادات" msgstr "لم تثبّت أية امتدادات"
#: ../js/ui/lookingGlass.js:624 #: ../js/ui/lookingGlass.js:625
msgid "Enabled" msgid "Enabled"
msgstr "مفعّل" msgstr "مفعّل"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:626 ../src/gvc/gvc-mixer-control.c:1087 #: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1087
msgid "Disabled" msgid "Disabled"
msgstr "معطّل" msgstr "معطّل"
#: ../js/ui/lookingGlass.js:628 #: ../js/ui/lookingGlass.js:629
msgid "Error" msgid "Error"
msgstr "خطأ" msgstr "خطأ"
#: ../js/ui/lookingGlass.js:630 #: ../js/ui/lookingGlass.js:631
msgid "Out of date" msgid "Out of date"
msgstr "غير محدث" msgstr "غير محدث"
#: ../js/ui/lookingGlass.js:655 #: ../js/ui/lookingGlass.js:656
msgid "View Source" msgid "View Source"
msgstr "اعرض المصدر" msgstr "اعرض المصدر"
#: ../js/ui/lookingGlass.js:661 #: ../js/ui/lookingGlass.js:662
msgid "Web Page" msgid "Web Page"
msgstr "صفحة الوب" msgstr "صفحة الوب"
#: ../js/ui/messageTray.js:1902 #: ../js/ui/messageTray.js:926
msgid "Open"
msgstr "افتح"
#: ../js/ui/messageTray.js:1963
msgid "System Information" msgid "System Information"
msgstr "معلومات النظام" msgstr "معلومات النظام"
@ -522,18 +526,28 @@ msgstr "النوافذ"
msgid "Applications" msgid "Applications"
msgstr "التطبيقات" msgstr "التطبيقات"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:202
msgid "Dash"
msgstr "الشريط"
#. TODO - _quit() doesn't really work on apps in state STARTING yet #. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:529 #: ../js/ui/panel.js:560
#, c-format #, c-format
msgid "Quit %s" msgid "Quit %s"
msgstr "أغلق %s" msgstr "أغلق %s"
#. Button on the left side of the panel. #. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview". #. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:897 #: ../js/ui/panel.js:919
msgid "Activities" msgid "Activities"
msgstr "الأنشطة" msgstr "الأنشطة"
#: ../js/ui/panel.js:1020
msgid "Panel"
msgstr "اللوحة"
#: ../js/ui/placeDisplay.js:122 #: ../js/ui/placeDisplay.js:122
#, c-format #, c-format
msgid "Failed to unmount '%s'" msgid "Failed to unmount '%s'"
@ -556,7 +570,7 @@ msgstr "الأماكن والأجهزة"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle #. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will #. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches. #. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:612 #: ../js/ui/popupMenu.js:618
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -564,11 +578,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "من فضلك اكتب أمرا:" msgstr "من فضلك اكتب أمرا:"
#: ../js/ui/searchDisplay.js:295 #: ../js/ui/searchDisplay.js:283
msgid "Searching..." msgid "Searching..."
msgstr "يبحث..." msgstr "يبحث..."
#: ../js/ui/searchDisplay.js:309 #: ../js/ui/searchDisplay.js:297
msgid "No matching results." msgid "No matching results."
msgstr "لا نتائج مطابقة." msgstr "لا نتائج مطابقة."
@ -608,47 +622,47 @@ msgstr "بدّل المستخدم"
msgid "Log Out..." msgid "Log Out..."
msgstr "اخرج..." msgstr "اخرج..."
#: ../js/ui/status/accessibility.js:81 #: ../js/ui/status/accessibility.js:62
msgid "Zoom" msgid "Zoom"
msgstr "تقريب" msgstr "تقريب"
#: ../js/ui/status/accessibility.js:88 #: ../js/ui/status/accessibility.js:69
msgid "Screen Reader" msgid "Screen Reader"
msgstr "قارئ الشاشة" msgstr "قارئ الشاشة"
#: ../js/ui/status/accessibility.js:92 #: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard" msgid "Screen Keyboard"
msgstr "لوحة مفاتيح على الشاشة" msgstr "لوحة مفاتيح على الشاشة"
#: ../js/ui/status/accessibility.js:96 #: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts" msgid "Visual Alerts"
msgstr "تنبيهات بصرية" msgstr "تنبيهات بصرية"
#: ../js/ui/status/accessibility.js:99 #: ../js/ui/status/accessibility.js:80
msgid "Sticky Keys" msgid "Sticky Keys"
msgstr "مفاتيح لاصقة" msgstr "مفاتيح لاصقة"
#: ../js/ui/status/accessibility.js:102 #: ../js/ui/status/accessibility.js:83
msgid "Slow Keys" msgid "Slow Keys"
msgstr "مفاتيح بطيئة" msgstr "مفاتيح بطيئة"
#: ../js/ui/status/accessibility.js:105 #: ../js/ui/status/accessibility.js:86
msgid "Bounce Keys" msgid "Bounce Keys"
msgstr "مفاتيح لها صوت" msgstr "مفاتيح لها صوت"
#: ../js/ui/status/accessibility.js:108 #: ../js/ui/status/accessibility.js:89
msgid "Mouse Keys" msgid "Mouse Keys"
msgstr "مفاتيح الفأرة" msgstr "مفاتيح الفأرة"
#: ../js/ui/status/accessibility.js:112 #: ../js/ui/status/accessibility.js:93
msgid "Universal Access Settings" msgid "Universal Access Settings"
msgstr "إعدادات الإتاحة" msgstr "إعدادات الإتاحة"
#: ../js/ui/status/accessibility.js:164 #: ../js/ui/status/accessibility.js:145
msgid "High Contrast" msgid "High Contrast"
msgstr "تباين عال" msgstr "تباين عال"
#: ../js/ui/status/accessibility.js:209 #: ../js/ui/status/accessibility.js:182
msgid "Large Text" msgid "Large Text"
msgstr "نص كبير" msgstr "نص كبير"
@ -831,51 +845,51 @@ msgstr[3] "بقي %d دقائق"
msgstr[4] "بقي %d دقيقة" msgstr[4] "بقي %d دقيقة"
msgstr[5] "بقي %d دقيقة" msgstr[5] "بقي %d دقيقة"
#: ../js/ui/status/power.js:241 #: ../js/ui/status/power.js:227
msgid "AC adapter" msgid "AC adapter"
msgstr "مقبس طاقة" msgstr "مقبس طاقة"
#: ../js/ui/status/power.js:243 #: ../js/ui/status/power.js:229
msgid "Laptop battery" msgid "Laptop battery"
msgstr "بطارية حاسوب محمول" msgstr "بطارية حاسوب محمول"
#: ../js/ui/status/power.js:245 #: ../js/ui/status/power.js:231
msgid "UPS" msgid "UPS"
msgstr "مزود طاقة لا منقطعة" msgstr "مزود طاقة لا منقطعة"
#: ../js/ui/status/power.js:247 #: ../js/ui/status/power.js:233
msgid "Monitor" msgid "Monitor"
msgstr "شاشة" msgstr "شاشة"
#: ../js/ui/status/power.js:249 #: ../js/ui/status/power.js:235
msgid "Mouse" msgid "Mouse"
msgstr "فأرة" msgstr "فأرة"
#: ../js/ui/status/power.js:251 #: ../js/ui/status/power.js:237
msgid "Keyboard" msgid "Keyboard"
msgstr "لوحة المفاتيح" msgstr "لوحة المفاتيح"
#: ../js/ui/status/power.js:253 #: ../js/ui/status/power.js:239
msgid "PDA" msgid "PDA"
msgstr "مساعد رقمي" msgstr "مساعد رقمي"
#: ../js/ui/status/power.js:255 #: ../js/ui/status/power.js:241
msgid "Cell phone" msgid "Cell phone"
msgstr "هاتف محمول" msgstr "هاتف محمول"
#: ../js/ui/status/power.js:257 #: ../js/ui/status/power.js:243
msgid "Media player" msgid "Media player"
msgstr "مشغل وسائط" msgstr "مشغل وسائط"
#: ../js/ui/status/power.js:259 #: ../js/ui/status/power.js:245
msgid "Tablet" msgid "Tablet"
msgstr "لوحة" msgstr "لوحة"
#: ../js/ui/status/power.js:261 #: ../js/ui/status/power.js:247
msgid "Computer" msgid "Computer"
msgstr "حاسوب" msgstr "حاسوب"
#: ../js/ui/status/power.js:263 ../src/shell-app-system.c:1013 #: ../js/ui/status/power.js:249 ../src/shell-app-system.c:1013
msgid "Unknown" msgid "Unknown"
msgstr "مجهول" msgstr "مجهول"
@ -919,16 +933,20 @@ msgstr "أُرسلت الساعة %l:%M:%S في %A"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: ../js/ui/viewSelector.js:103 #: ../js/ui/viewSelector.js:117
msgid "Type to search..." msgid "Type to search..."
msgstr "اكتب نصا للبحث عنه..." msgstr "اكتب نصا للبحث عنه..."
#: ../js/ui/windowAttentionHandler.js:43 #: ../js/ui/viewSelector.js:137 ../src/shell-util.c:250
msgid "Search"
msgstr "ابحث"
#: ../js/ui/windowAttentionHandler.js:42
#, c-format #, c-format
msgid "%s has finished starting" msgid "%s has finished starting"
msgstr "انتهى %s من البدء" msgstr "انتهى %s من البدء"
#: ../js/ui/windowAttentionHandler.js:45 #: ../js/ui/windowAttentionHandler.js:44
#, c-format #, c-format
msgid "'%s' is ready" msgid "'%s' is ready"
msgstr "'%s' جاهز" msgstr "'%s' جاهز"
@ -963,11 +981,15 @@ msgstr[5] "%u مدخل"
msgid "System Sounds" msgid "System Sounds"
msgstr "أصوات النظام" msgstr "أصوات النظام"
#: ../src/shell-global.c:1298 #: ../src/main.c:395
msgid "Print version"
msgstr "اطبع الإصدارة"
#: ../src/shell-global.c:1308
msgid "Less than a minute ago" msgid "Less than a minute ago"
msgstr "منذ أقل من دقيقة" msgstr "منذ أقل من دقيقة"
#: ../src/shell-global.c:1302 #: ../src/shell-global.c:1312
#, c-format #, c-format
msgid "%d minute ago" msgid "%d minute ago"
msgid_plural "%d minutes ago" msgid_plural "%d minutes ago"
@ -978,7 +1000,7 @@ msgstr[3] "منذ %d دقائق"
msgstr[4] "منذ %d دقيقة" msgstr[4] "منذ %d دقيقة"
msgstr[5] "منذ %d دقيقة" msgstr[5] "منذ %d دقيقة"
#: ../src/shell-global.c:1307 #: ../src/shell-global.c:1317
#, c-format #, c-format
msgid "%d hour ago" msgid "%d hour ago"
msgid_plural "%d hours ago" msgid_plural "%d hours ago"
@ -989,7 +1011,7 @@ msgstr[3] "منذ %d ساعات"
msgstr[4] "منذ %d ساعة" msgstr[4] "منذ %d ساعة"
msgstr[5] "منذ %d ساعة" msgstr[5] "منذ %d ساعة"
#: ../src/shell-global.c:1312 #: ../src/shell-global.c:1322
#, c-format #, c-format
msgid "%d day ago" msgid "%d day ago"
msgid_plural "%d days ago" msgid_plural "%d days ago"
@ -1000,7 +1022,7 @@ msgstr[3] "منذ %d أيام"
msgstr[4] "منذ %d يوما" msgstr[4] "منذ %d يوما"
msgstr[5] "منذ %d يوم" msgstr[5] "منذ %d يوم"
#: ../src/shell-global.c:1317 #: ../src/shell-global.c:1327
#, c-format #, c-format
msgid "%d week ago" msgid "%d week ago"
msgid_plural "%d weeks ago" msgid_plural "%d weeks ago"
@ -1025,10 +1047,6 @@ msgstr "مجلد المنزل"
msgid "File System" msgid "File System"
msgstr "نظام الملفات" msgstr "نظام الملفات"
#: ../src/shell-util.c:250
msgid "Search"
msgstr "ابحث"
#. Translators: the first string is the name of a gvfs #. Translators: the first string is the name of a gvfs
#. * method, and the second string is a path. For #. * method, and the second string is a path. For
#. * example, "Trash: some-directory". It means that the #. * example, "Trash: some-directory". It means that the

984
po/bg.po

File diff suppressed because it is too large Load Diff

1224
po/ca.po

File diff suppressed because it is too large Load Diff

822
po/el.po

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

156
po/es.po
View File

@ -1,17 +1,17 @@
# Spanish translation of gnome-shell. # Spanish translation of gnome-shell.
# Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER # Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-shell package. # This file is distributed under the same license as the gnome-shell package.
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2010, 2011.
# Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010, 2011. # Jorge González <jorgegonz@svn.gnome.org>, 2009, 2010, 2011.
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2010, 2011.
# #
msgid "" msgid ""
msgstr "" 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&component=general\n" "shell&component=general\n"
"POT-Creation-Date: 2011-03-02 00:20+0000\n" "POT-Creation-Date: 2011-03-09 18:36+0000\n"
"PO-Revision-Date: 2011-03-02 20:39+0100\n" "PO-Revision-Date: 2011-03-09 19:37+0100\n"
"Last-Translator: Jorge González <jorgegonz@svn.gnome.org>\n" "Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n" "Language-Team: Español <gnome-es-list@gnome.org>\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"
@ -193,27 +193,27 @@ msgid "Execution of '%s' failed:"
msgstr "Falló la ejecución de «%s»:" msgstr "Falló la ejecución de «%s»:"
#. Translators: Filter to display all applications #. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:195 #: ../js/ui/appDisplay.js:226
msgid "All" msgid "All"
msgstr "Todas" msgstr "Todas"
#: ../js/ui/appDisplay.js:282 #: ../js/ui/appDisplay.js:324
msgid "APPLICATIONS" msgid "APPLICATIONS"
msgstr "APLICACIONES" msgstr "APLICACIONES"
#: ../js/ui/appDisplay.js:312 #: ../js/ui/appDisplay.js:350
msgid "SETTINGS" msgid "SETTINGS"
msgstr "CONFIGURACIÓN" msgstr "CONFIGURACIÓN"
#: ../js/ui/appDisplay.js:572 #: ../js/ui/appDisplay.js:612
msgid "New Window" msgid "New Window"
msgstr "Ventana nueva" msgstr "Ventana nueva"
#: ../js/ui/appDisplay.js:575 #: ../js/ui/appDisplay.js:615
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Quitar de los favoritos" msgstr "Quitar de los favoritos"
#: ../js/ui/appDisplay.js:576 #: ../js/ui/appDisplay.js:616
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Añadir a los favoritos" msgstr "Añadir a los favoritos"
@ -373,7 +373,7 @@ msgstr "Esta semana"
msgid "Next week" msgid "Next week"
msgstr "La semana que viene" msgstr "La semana que viene"
#: ../js/ui/dash.js:174 #: ../js/ui/dash.js:174 ../js/ui/messageTray.js:933
msgid "Remove" msgid "Remove"
msgstr "Quitar" msgstr "Quitar"
@ -381,54 +381,54 @@ msgstr "Quitar"
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Ajustes de hora y fecha" msgstr "Ajustes de hora y fecha"
#: ../js/ui/dateMenu.js:110 #: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Abrir calendario" msgstr "Abrir calendario"
#. Translators: This is the time format with date used #. Translators: This is the time format with date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:162 #: ../js/ui/dateMenu.js:164
msgid "%a %b %e, %R:%S" msgid "%a %b %e, %R:%S"
msgstr "%a %e de %b, %R:%S" msgstr "%a %e de %b, %R:%S"
#: ../js/ui/dateMenu.js:163 #: ../js/ui/dateMenu.js:165
msgid "%a %b %e, %R" msgid "%a %b %e, %R"
msgstr "%a %e de %b, %R" msgstr "%a %e de %b, %R"
#. Translators: This is the time format without date used #. Translators: This is the time format without date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:167 #: ../js/ui/dateMenu.js:169
msgid "%a %R:%S" msgid "%a %R:%S"
msgstr "%a %R:%S" msgstr "%a %R:%S"
#: ../js/ui/dateMenu.js:168 #: ../js/ui/dateMenu.js:170
msgid "%a %R" msgid "%a %R"
msgstr "%a %R" msgstr "%a %R"
#. Translators: This is a time format with date used #. Translators: This is a time format with date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:175 #: ../js/ui/dateMenu.js:177
msgid "%a %b %e, %l:%M:%S %p" msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %e de %b, %H:%M:%S" msgstr "%a %e de %b, %H:%M:%S"
#: ../js/ui/dateMenu.js:176 #: ../js/ui/dateMenu.js:178
msgid "%a %b %e, %l:%M %p" msgid "%a %b %e, %l:%M %p"
msgstr "%a %e de %b, %H:%M" msgstr "%a %e de %b, %H:%M"
#. Translators: This is a time format without date used #. Translators: This is a time format without date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:180 #: ../js/ui/dateMenu.js:182
msgid "%a %l:%M:%S %p" msgid "%a %l:%M:%S %p"
msgstr "%a %H:%M:%S" msgstr "%a %H:%M:%S"
#: ../js/ui/dateMenu.js:181 #: ../js/ui/dateMenu.js:183
msgid "%a %l:%M %p" msgid "%a %l:%M %p"
msgstr "%a %H:%M" msgstr "%a %H:%M"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:207 #: ../js/ui/dateMenu.js:209
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e de %B de %Y" msgstr "%A, %e de %B de %Y"
@ -508,37 +508,41 @@ msgstr "Confirmar"
msgid "Cancel" msgid "Cancel"
msgstr "Cancelar" msgstr "Cancelar"
#: ../js/ui/lookingGlass.js:587 #: ../js/ui/lookingGlass.js:588
msgid "No extensions installed" msgid "No extensions installed"
msgstr "No hay extensiones instaladas" msgstr "No hay extensiones instaladas"
#: ../js/ui/lookingGlass.js:624 #: ../js/ui/lookingGlass.js:625
msgid "Enabled" msgid "Enabled"
msgstr "Activado" msgstr "Activado"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:626 ../src/gvc/gvc-mixer-control.c:1087 #: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1087
msgid "Disabled" msgid "Disabled"
msgstr "Desactivado" msgstr "Desactivado"
#: ../js/ui/lookingGlass.js:628 #: ../js/ui/lookingGlass.js:629
msgid "Error" msgid "Error"
msgstr "Error" msgstr "Error"
#: ../js/ui/lookingGlass.js:630 #: ../js/ui/lookingGlass.js:631
msgid "Out of date" msgid "Out of date"
msgstr "Caducado" msgstr "Caducado"
#: ../js/ui/lookingGlass.js:655 #: ../js/ui/lookingGlass.js:656
msgid "View Source" msgid "View Source"
msgstr "Ver fuente" msgstr "Ver fuente"
#: ../js/ui/lookingGlass.js:661 #: ../js/ui/lookingGlass.js:662
msgid "Web Page" msgid "Web Page"
msgstr "Página web" msgstr "Página web"
#: ../js/ui/messageTray.js:1902 #: ../js/ui/messageTray.js:926
msgid "Open"
msgstr "Abrir"
#: ../js/ui/messageTray.js:1963
msgid "System Information" msgid "System Information"
msgstr "Información del sistema" msgstr "Información del sistema"
@ -554,18 +558,28 @@ msgstr "Ventanas"
msgid "Applications" msgid "Applications"
msgstr "Aplicaciones" msgstr "Aplicaciones"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:202
msgid "Dash"
msgstr "Plano"
#. TODO - _quit() doesn't really work on apps in state STARTING yet #. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:529 #: ../js/ui/panel.js:560
#, c-format #, c-format
msgid "Quit %s" msgid "Quit %s"
msgstr "Salir de %s" msgstr "Salir de %s"
#. Button on the left side of the panel. #. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview". #. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:897 #: ../js/ui/panel.js:919
msgid "Activities" msgid "Activities"
msgstr "Actividades" msgstr "Actividades"
#: ../js/ui/panel.js:1020
msgid "Panel"
msgstr "Panel"
#: ../js/ui/placeDisplay.js:122 #: ../js/ui/placeDisplay.js:122
#, c-format #, c-format
msgid "Failed to unmount '%s'" msgid "Failed to unmount '%s'"
@ -588,7 +602,7 @@ msgstr "LUGARES Y DISPOSITIVOS"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle #. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will #. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches. #. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:612 #: ../js/ui/popupMenu.js:618
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -596,11 +610,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "Introduzca un comando:" msgstr "Introduzca un comando:"
#: ../js/ui/searchDisplay.js:295 #: ../js/ui/searchDisplay.js:283
msgid "Searching..." msgid "Searching..."
msgstr "Buscando…" msgstr "Buscando…"
#: ../js/ui/searchDisplay.js:309 #: ../js/ui/searchDisplay.js:297
msgid "No matching results." msgid "No matching results."
msgstr "No se encontró ningún resultado coincidente." msgstr "No se encontró ningún resultado coincidente."
@ -640,47 +654,47 @@ msgstr "Cambiar de usuario"
msgid "Log Out..." msgid "Log Out..."
msgstr "Cerrar la sesión…" msgstr "Cerrar la sesión…"
#: ../js/ui/status/accessibility.js:81 #: ../js/ui/status/accessibility.js:62
msgid "Zoom" msgid "Zoom"
msgstr "Ampliación" msgstr "Ampliación"
#: ../js/ui/status/accessibility.js:88 #: ../js/ui/status/accessibility.js:69
msgid "Screen Reader" msgid "Screen Reader"
msgstr "Lector de pantalla" msgstr "Lector de pantalla"
#: ../js/ui/status/accessibility.js:92 #: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard" msgid "Screen Keyboard"
msgstr "Teclado en pantalla" msgstr "Teclado en pantalla"
#: ../js/ui/status/accessibility.js:96 #: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts" msgid "Visual Alerts"
msgstr "Alertas visuales" msgstr "Alertas visuales"
#: ../js/ui/status/accessibility.js:99 #: ../js/ui/status/accessibility.js:80
msgid "Sticky Keys" msgid "Sticky Keys"
msgstr "Teclas persistentes" msgstr "Teclas persistentes"
#: ../js/ui/status/accessibility.js:102 #: ../js/ui/status/accessibility.js:83
msgid "Slow Keys" msgid "Slow Keys"
msgstr "Teclas lentas" msgstr "Teclas lentas"
#: ../js/ui/status/accessibility.js:105 #: ../js/ui/status/accessibility.js:86
msgid "Bounce Keys" msgid "Bounce Keys"
msgstr "Rechazo de teclas" msgstr "Rechazo de teclas"
#: ../js/ui/status/accessibility.js:108 #: ../js/ui/status/accessibility.js:89
msgid "Mouse Keys" msgid "Mouse Keys"
msgstr "Teclas del ratón" msgstr "Teclas del ratón"
#: ../js/ui/status/accessibility.js:112 #: ../js/ui/status/accessibility.js:93
msgid "Universal Access Settings" msgid "Universal Access Settings"
msgstr "Preferencias del acceso universal" msgstr "Preferencias del acceso universal"
#: ../js/ui/status/accessibility.js:164 #: ../js/ui/status/accessibility.js:145
msgid "High Contrast" msgid "High Contrast"
msgstr "Contraste alto" msgstr "Contraste alto"
#: ../js/ui/status/accessibility.js:209 #: ../js/ui/status/accessibility.js:182
msgid "Large Text" msgid "Large Text"
msgstr "<b>Texto:</b>" msgstr "<b>Texto:</b>"
@ -847,51 +861,51 @@ msgid_plural "%d minutes remaining"
msgstr[0] "Queda %d minuto" msgstr[0] "Queda %d minuto"
msgstr[1] "Queda %d minutos" msgstr[1] "Queda %d minutos"
#: ../js/ui/status/power.js:241 #: ../js/ui/status/power.js:227
msgid "AC adapter" msgid "AC adapter"
msgstr "Adaptador de corriente" msgstr "Adaptador de corriente"
#: ../js/ui/status/power.js:243 #: ../js/ui/status/power.js:229
msgid "Laptop battery" msgid "Laptop battery"
msgstr "Batería del portátil" msgstr "Batería del portátil"
#: ../js/ui/status/power.js:245 #: ../js/ui/status/power.js:231
msgid "UPS" msgid "UPS"
msgstr "SAI" msgstr "SAI"
#: ../js/ui/status/power.js:247 #: ../js/ui/status/power.js:233
msgid "Monitor" msgid "Monitor"
msgstr "Monitor" msgstr "Monitor"
#: ../js/ui/status/power.js:249 #: ../js/ui/status/power.js:235
msgid "Mouse" msgid "Mouse"
msgstr "Ratón" msgstr "Ratón"
#: ../js/ui/status/power.js:251 #: ../js/ui/status/power.js:237
msgid "Keyboard" msgid "Keyboard"
msgstr "Teclado" msgstr "Teclado"
#: ../js/ui/status/power.js:253 #: ../js/ui/status/power.js:239
msgid "PDA" msgid "PDA"
msgstr "PDA" msgstr "PDA"
#: ../js/ui/status/power.js:255 #: ../js/ui/status/power.js:241
msgid "Cell phone" msgid "Cell phone"
msgstr "Teléfono móvil" msgstr "Teléfono móvil"
#: ../js/ui/status/power.js:257 #: ../js/ui/status/power.js:243
msgid "Media player" msgid "Media player"
msgstr "Reproductor multimedia" msgstr "Reproductor multimedia"
#: ../js/ui/status/power.js:259 #: ../js/ui/status/power.js:245
msgid "Tablet" msgid "Tablet"
msgstr "Tableta" msgstr "Tableta"
#: ../js/ui/status/power.js:261 #: ../js/ui/status/power.js:247
msgid "Computer" msgid "Computer"
msgstr "Equipo" msgstr "Equipo"
#: ../js/ui/status/power.js:263 ../src/shell-app-system.c:1013 #: ../js/ui/status/power.js:249 ../src/shell-app-system.c:1013
msgid "Unknown" msgid "Unknown"
msgstr "Desconocido" msgstr "Desconocido"
@ -935,16 +949,20 @@ msgstr "Enviado a las %X el %A"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: ../js/ui/viewSelector.js:103 #: ../js/ui/viewSelector.js:117
msgid "Type to search..." msgid "Type to search..."
msgstr "Teclear para buscar…" msgstr "Teclear para buscar…"
#: ../js/ui/windowAttentionHandler.js:43 #: ../js/ui/viewSelector.js:137 ../src/shell-util.c:250
msgid "Search"
msgstr "Buscar"
#: ../js/ui/windowAttentionHandler.js:42
#, c-format #, c-format
msgid "%s has finished starting" msgid "%s has finished starting"
msgstr "%s finalizó su lanzamiento" msgstr "%s finalizó su lanzamiento"
#: ../js/ui/windowAttentionHandler.js:45 #: ../js/ui/windowAttentionHandler.js:44
#, c-format #, c-format
msgid "'%s' is ready" msgid "'%s' is ready"
msgstr "«%s» está preparado" msgstr "«%s» está preparado"
@ -971,32 +989,36 @@ msgstr[1] "%u entradas"
msgid "System Sounds" msgid "System Sounds"
msgstr "Sonidos del sistema" msgstr "Sonidos del sistema"
#: ../src/shell-global.c:1298 #: ../src/main.c:395
msgid "Print version"
msgstr "Imprimir versión"
#: ../src/shell-global.c:1308
msgid "Less than a minute ago" msgid "Less than a minute ago"
msgstr "Hace menos de un minuto" msgstr "Hace menos de un minuto"
#: ../src/shell-global.c:1302 #: ../src/shell-global.c:1312
#, c-format #, c-format
msgid "%d minute ago" msgid "%d minute ago"
msgid_plural "%d minutes ago" msgid_plural "%d minutes ago"
msgstr[0] "Hace %d minuto" msgstr[0] "Hace %d minuto"
msgstr[1] "Hace %d minutos" msgstr[1] "Hace %d minutos"
#: ../src/shell-global.c:1307 #: ../src/shell-global.c:1317
#, c-format #, c-format
msgid "%d hour ago" msgid "%d hour ago"
msgid_plural "%d hours ago" msgid_plural "%d hours ago"
msgstr[0] "Hace %d hora" msgstr[0] "Hace %d hora"
msgstr[1] "Hace %d horas" msgstr[1] "Hace %d horas"
#: ../src/shell-global.c:1312 #: ../src/shell-global.c:1322
#, c-format #, c-format
msgid "%d day ago" msgid "%d day ago"
msgid_plural "%d days ago" msgid_plural "%d days ago"
msgstr[0] "Hace %d día" msgstr[0] "Hace %d día"
msgstr[1] "Hace %d días" msgstr[1] "Hace %d días"
#: ../src/shell-global.c:1317 #: ../src/shell-global.c:1327
#, c-format #, c-format
msgid "%d week ago" msgid "%d week ago"
msgid_plural "%d weeks ago" msgid_plural "%d weeks ago"
@ -1017,10 +1039,6 @@ msgstr "Carpeta personal"
msgid "File System" msgid "File System"
msgstr "Sistema de archivos" msgstr "Sistema de archivos"
#: ../src/shell-util.c:250
msgid "Search"
msgstr "Buscar"
#. Translators: the first string is the name of a gvfs #. Translators: the first string is the name of a gvfs
#. * method, and the second string is a path. For #. * method, and the second string is a path. For
#. * example, "Trash: some-directory". It means that the #. * example, "Trash: some-directory". It means that the

279
po/kn.po
View File

@ -9,7 +9,7 @@ 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&component=general\n" "cgi?product=gnome-shell&component=general\n"
"POT-Creation-Date: 2011-02-21 01:21+0000\n" "POT-Creation-Date: 2011-02-21 01:21+0000\n"
"PO-Revision-Date: 2011-02-21 12:52+0530\n" "PO-Revision-Date: 2011-03-09 09:36+0530\n"
"Last-Translator: Shankar Prasad <svenkate@redhat.com>\n" "Last-Translator: Shankar Prasad <svenkate@redhat.com>\n"
"Language-Team: Kannada <kn@li.org>\n" "Language-Team: Kannada <kn@li.org>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -20,59 +20,65 @@ msgstr ""
#: ../data/gnome-shell.desktop.in.in.h:1 #: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell" msgid "GNOME Shell"
msgstr "" msgstr "GNOME ಶೆಲ್‌"
#: ../data/gnome-shell.desktop.in.in.h:2 #: ../data/gnome-shell.desktop.in.in.h:2
msgid "Window management and application launching" msgid "Window management and application launching"
msgstr "" msgstr "ವಿಂಡೊ ನಿರ್ವಹಣೆ ಹಾಗು ಅನ್ವಯವನ್ನು ಆರಂಭಿಸುವಿಕೆ"
#: ../data/org.gnome.shell.gschema.xml.in.h:1 #: ../data/org.gnome.shell.gschema.xml.in.h:1
msgid "" 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 ಸಂವಾದಚೌಕವನ್ನು ಬಳಸಿಕೊಂಡು ಆಂತರಿಕ ದೋಷ ನಿವಾರಣೆ ಹಾಗು ಮೇಲ್ವಿಚಾರಣೆ "
"ಉಪಕರಣಗಳನ್ನು ನಿಲುಕಿಸಿಕೊಳ್ಳಲು ಅನುವುಮಾಡಿಕೊಡುತ್ತದೆ."
#: ../data/org.gnome.shell.gschema.xml.in.h:2 #: ../data/org.gnome.shell.gschema.xml.in.h:2
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 ಇಂದ ವಿಕಸನೆಗಾರರಿಗೆ ಹಾಗು ಪರೀಕ್ಷಕರಿಗೆ ಉಪಯುಕ್ತವಾಗುವ ಆಂತರಿಕ ಉಪಕರಣಗಳನ್ನು "
"ಶಕ್ತಗೊಳಿಸುತ್ತದೆ"
#: ../data/org.gnome.shell.gschema.xml.in.h:3 #: ../data/org.gnome.shell.gschema.xml.in.h:3
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.h:4 #: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "Framerate used for recording screencasts." msgid "Framerate used for recording screencasts."
msgstr "" msgstr "ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟುಗಳನ್ನು ರೆಕಾರ್ಡು ಮಾಡಲು ಬಳಸಲಾಗುವ ಫ್ರೇಮ್‌ದರಗಳು."
#: ../data/org.gnome.shell.gschema.xml.in.h:5 #: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid "" msgid ""
"GNOME Shell extensions have a uuid property; this key lists extensions which " "GNOME Shell extensions have a uuid property; this key lists extensions which "
"should not be loaded." "should not be loaded."
msgstr "" msgstr ""
"GNOME Shell extensions have a uuid property; this key lists extensions which "
"should not be loaded."
#: ../data/org.gnome.shell.gschema.xml.in.h:6 #: ../data/org.gnome.shell.gschema.xml.in.h:6
msgid "History for command (Alt-F2) dialog" msgid "History for command (Alt-F2) dialog"
msgstr "" msgstr "ಆಜ್ಞೆಯ ಇತಿಹಾಸ (Alt-F2) ಸಂವಾದಚೌಕ"
#: ../data/org.gnome.shell.gschema.xml.in.h:7 #: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "History for the looking glass dialog" msgid "History for the looking glass dialog"
msgstr "" msgstr "ನೋಡುವ ಗಾಜಿನ ಸಂವಾದ ಚೌಕಕ್ಕಾಗಿನ ಇತಿಹಾಸ"
#: ../data/org.gnome.shell.gschema.xml.in.h:8 #: ../data/org.gnome.shell.gschema.xml.in.h:8
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 "" msgstr "true ಆದಲ್ಲಿ, ದಿನಾಂಕವನ್ನು ಸಮಯದ ಜೊತೆಗೆ ಗಡಿಯಾರದಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತದೆ."
#: ../data/org.gnome.shell.gschema.xml.in.h:9 #: ../data/org.gnome.shell.gschema.xml.in.h:9
msgid "If true, display seconds in time." msgid "If true, display seconds in time."
msgstr "" msgstr "true ಆದಲ್ಲಿ, ಸಮಯದಲ್ಲಿ ಸೆಕೆಂಡುಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತದೆ."
#: ../data/org.gnome.shell.gschema.xml.in.h:10 #: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid "If true, display the ISO week date in the calendar." msgid "If true, display the ISO week date in the calendar."
msgstr "" msgstr "true ಆದಲ್ಲಿ, ಕ್ಯಾಲೆಂಡರಿನಲ್ಲಿ ISO ವಾರದ ದಿನವನ್ನು ತೋರಿಸುತ್ತದೆ."
#: ../data/org.gnome.shell.gschema.xml.in.h:11 #: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid "List of desktop file IDs for favorite applications" msgid "List of desktop file IDs for favorite applications"
msgstr "" msgstr "ಮೆಚ್ಚಿನ ಅನ್ವಯಗಳಿಗಾಗಿನ ಗಣಕತೆರೆ ಕಡತ IDಗಳ ಪಟ್ಟಿ"
#: ../data/org.gnome.shell.gschema.xml.in.h:13 #: ../data/org.gnome.shell.gschema.xml.in.h:13
#, no-c-format #, no-c-format
@ -91,21 +97,22 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:14 #: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock" msgid "Show date in clock"
msgstr "" msgstr "ಗಡಿಯಾರದಲ್ಲಿ ದಿನಾಂಕವನ್ನು ತೋರಿಸು"
#: ../data/org.gnome.shell.gschema.xml.in.h:15 #: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show the week date in the calendar" msgid "Show the week date in the calendar"
msgstr "" msgstr "ಕ್ಯಾಲೆಂಡರಿನಲ್ಲಿ ವಾರದ ದಿನವನ್ನು ತೋರಿಸು"
#: ../data/org.gnome.shell.gschema.xml.in.h:16 #: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds" msgid "Show time with seconds"
msgstr "" msgstr "ಸಮಯದೊಂದಿಗೆ ಸೆಕೆಂಡುಗಳನ್ನು ತೋರಿಸು"
#: ../data/org.gnome.shell.gschema.xml.in.h:17 #: ../data/org.gnome.shell.gschema.xml.in.h:17
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.h:18 #: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid "" msgid ""
@ -113,16 +120,21 @@ 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 ""
"ರೆಕಾರ್ಡು ಮಾಡಲಾದ ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟುಗಳಿಗಾಗಿನ ಕಡತದ ಹೆಸರು ಪ್ರಸಕ್ತ ದಿನಾಂಕದ "
"ಆಧರಿತವಾದ ಒಂದು ವಿಶೇಷವಾದ ಕಡತದ ಹೆಸರಾಗಿರುತ್ತದೆ, ಹಾಗು ಈ ವಿಸ್ತರಣೆಯನ್ನು ಬಳಸುತ್ತದೆ. "
"ಬೇರೊಂದು ಕಂಟೈನರ್ ಶೈಲಿಗೆ ರೆಕಾರ್ಡ್ ಮಾಡುವಾಗ ಇದನ್ನು ಬದಲಾಯಿಸಬೇಕಾಗುತ್ತದೆ."
#: ../data/org.gnome.shell.gschema.xml.in.h:19 #: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid "" 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 ""
"ಪ್ರತಿ ಸೆಕೆಂಡಿನ ಫ್ರೇಮ್‌ಗಳಲ್ಲಿನ GNOME ಶೆಲ್‌ನ ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟ್‍ ರೆಕಾರ್ಡರಿನಿಂದ "
"ರೆಕಾರ್ಡು ಮಾಡಲಾದ ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟಿನ ಫ್ರೇಮ್‌ದರ. "
#: ../data/org.gnome.shell.gschema.xml.in.h:20 #: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast" msgid "The gstreamer pipeline used to encode the screencast"
msgstr "" msgstr "ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟ್‍ ಅನ್ನು ಎನ್ಕೋಡ್ ಮಾಡಲು ಬಳಸಲಾಗುವ gstreamer ಪೈಪ್‌ಲೈನ್"
#: ../data/org.gnome.shell.gschema.xml.in.h:21 #: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid "" msgid ""
@ -134,43 +146,43 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:22 #: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Uuids of extensions to disable" msgid "Uuids of extensions to disable"
msgstr "" msgstr "ಅಶಕ್ತಗೊಳಿಸಬೇಕಿರುವ Uuidಗಳ ವಿಸ್ತರಣೆಗಳು"
#: ../data/org.gnome.shell.gschema.xml.in.h:23 #: ../data/org.gnome.shell.gschema.xml.in.h:23
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.h:24 #: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "disabled OpenSearch providers" msgid "disabled OpenSearch providers"
msgstr "" msgstr "ಅಶಕ್ತಗೊಳಿಸಲಾದ OpenSearch ಒದಗಿಸುವವರು"
#: ../js/misc/util.js:86 #: ../js/misc/util.js:86
msgid "Command not found" msgid "Command not found"
msgstr "" msgstr "ಆಜ್ಞೆಯು ಕಂಡು ಬಂದಿಲ್ಲ"
#. Replace "Error invoking GLib.shell_parse_argv: " with #. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer #. something nicer
#: ../js/misc/util.js:113 #: ../js/misc/util.js:113
msgid "Could not parse command:" msgid "Could not parse command:"
msgstr "" msgstr "ಆಜ್ಞೆಯನ್ನು ಪಾರ್ಸ್ ಮಾಡಲಾಗಿಲ್ಲ:"
#: ../js/misc/util.js:135 #: ../js/misc/util.js:135
msgid "No such application" msgid "No such application"
msgstr "" msgstr "ಅಂತಹ ಯಾವುದೆ ಅನ್ವಯವಿಲ್ಲ"
#: ../js/misc/util.js:148 #: ../js/misc/util.js:148
#, c-format #, c-format
msgid "Execution of '%s' failed:" msgid "Execution of '%s' failed:"
msgstr "" msgstr "'%s' ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ:"
#. Translators: Filter to display all applications #. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:174 #: ../js/ui/appDisplay.js:174
msgid "All" msgid "All"
msgstr "" msgstr "ಎಲ್ಲಾ"
#: ../js/ui/appDisplay.js:261 #: ../js/ui/appDisplay.js:261
msgid "APPLICATIONS" msgid "APPLICATIONS"
msgstr "" msgstr "APPLICATIONS"
#: ../js/ui/appDisplay.js:291 #: ../js/ui/appDisplay.js:291
msgid "PREFERENCES" msgid "PREFERENCES"
@ -182,21 +194,21 @@ msgstr "ಹೊಸ ವಿಂಡೊ"
#: ../js/ui/appDisplay.js:555 #: ../js/ui/appDisplay.js:555
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "" msgstr "ಎಲ್ಲಾ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳನ್ನು ತೆಗೆದುಹಾಕು"
#: ../js/ui/appDisplay.js:556 #: ../js/ui/appDisplay.js:556
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "" msgstr "ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳಿಗೆ ಸೇರಿಸು"
#: ../js/ui/appFavorites.js:91 #: ../js/ui/appFavorites.js:91
#, c-format #, c-format
msgid "%s has been added to your favorites." msgid "%s has been added to your favorites."
msgstr "" msgstr "%s ಅನ್ನು ನಿಮ್ಮ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳನ್ನು ಸೇರಿಸಲಾಗಿದೆ."
#: ../js/ui/appFavorites.js:122 #: ../js/ui/appFavorites.js:122
#, c-format #, c-format
msgid "%s has been removed from your favorites." msgid "%s has been removed from your favorites."
msgstr "" msgstr "%s ಅನ್ನು ನಿಮ್ಮ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳಿಂದ ತೆಗೆದುಹಾಕಲಾಗಿದೆ."
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
@ -314,7 +326,7 @@ msgstr "ಶ"
#. Translators: Text to show if there are no events #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:701 #: ../js/ui/calendar.js:701
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "" msgstr "ಯಾವುದೂ ಅನುಸೂಚಿತಗೊಂಡಿಲ್ಲ"
#. Translators: Shown on calendar heading when selected day occurs on current year #. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:717 #: ../js/ui/calendar.js:717
@ -350,11 +362,11 @@ msgstr "ತೆಗೆದು ಹಾಕು"
#: ../js/ui/dateMenu.js:93 #: ../js/ui/dateMenu.js:93
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "" msgstr "ದಿನಾಂಕ ಹಾಗು ಸಮಯದ ಸಿದ್ಧತೆಗಳು"
#: ../js/ui/dateMenu.js:112 #: ../js/ui/dateMenu.js:112
msgid "Open Calendar" msgid "Open Calendar"
msgstr "" msgstr "ಕ್ಯಾಲೆಂಡರನ್ನು ತೆರೆ"
#. Translators: This is the time format with date used #. Translators: This is the time format with date used
#. in 24-hour mode. #. in 24-hour mode.
@ -405,72 +417,76 @@ msgstr "%A %B %e, %Y"
#: ../js/ui/docDisplay.js:19 #: ../js/ui/docDisplay.js:19
msgid "RECENT ITEMS" msgid "RECENT ITEMS"
msgstr "" msgstr "RECENT ITEMS"
#: ../js/ui/endSessionDialog.js:63 #: ../js/ui/endSessionDialog.js:63
#, c-format #, c-format
msgid "Log Out %s" msgid "Log Out %s"
msgstr "" msgstr "%s ಇಂದ ನಿರ್ಗಮಿಸಿ"
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:69 #: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:69
msgid "Log Out" msgid "Log Out"
msgstr "" msgstr "ನಿರ್ಗಮಿಸಿ"
#: ../js/ui/endSessionDialog.js:65 #: ../js/ui/endSessionDialog.js:65
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:66 #: ../js/ui/endSessionDialog.js:66
#, c-format #, c-format
msgid "%s will be logged out automatically in %d seconds." msgid "%s will be logged out automatically in %d seconds."
msgstr "" msgstr "%s ರವರು %d ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ಗಮಿಸಲ್ಪಡುತ್ತಾರೆ."
#: ../js/ui/endSessionDialog.js:67 #: ../js/ui/endSessionDialog.js:67
#, c-format #, c-format
msgid "You will be logged out automatically in %d seconds." msgid "You will be logged out automatically in %d seconds."
msgstr "" msgstr "ನೀವು %d ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ಗಮಿಸಲ್ಪಡುತ್ತಾರೆ."
#: ../js/ui/endSessionDialog.js:68 #: ../js/ui/endSessionDialog.js:68
msgid "Logging out of the system." msgid "Logging out of the system."
msgstr "" msgstr "ವ್ಯವಸ್ಥೆಯಿಂದ ನಿರ್ಗಮಿಸಲಾಗುತ್ತಿದೆ."
#: ../js/ui/endSessionDialog.js:74 ../js/ui/endSessionDialog.js:78 #: ../js/ui/endSessionDialog.js:74 ../js/ui/endSessionDialog.js:78
msgid "Shut Down" msgid "Shut Down"
msgstr "" msgstr "ಸ್ಥಗಿತಗೊಳಿಸು"
#: ../js/ui/endSessionDialog.js:75 #: ../js/ui/endSessionDialog.js:75
msgid "Click Shut Down to quit these applications and shut down the system." msgid "Click Shut Down to quit these applications and shut down the system."
msgstr "" msgstr ""
"ಈ ಅನ್ವಯದಿಂದ ನಿರ್ಗಮಿಸಿ ನಂತರ ವ್ಯವಸ್ಥೆಯನ್ನು ಸ್ಥಗಿತಗೊಳಿಲು ಸ್ಥಗಿತಗೊಳಿಸು ಅನ್ನು "
"ಒತ್ತಿ."
#: ../js/ui/endSessionDialog.js:76 #: ../js/ui/endSessionDialog.js:76
#, c-format #, c-format
msgid "The system will shut down automatically in %d seconds." msgid "The system will shut down automatically in %d seconds."
msgstr "" msgstr "ವ್ಯವಸ್ಥೆಯು %d ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸ್ಥಗಿತಗೊಳ್ಳುತ್ತದೆ."
#: ../js/ui/endSessionDialog.js:77 #: ../js/ui/endSessionDialog.js:77
msgid "Shutting down the system." msgid "Shutting down the system."
msgstr "" msgstr "ವ್ಯವಸ್ಥೆಯನ್ನು ಸ್ಥಗಿತಗೊಳಿಸಲಾಗುತ್ತಿದೆ."
#: ../js/ui/endSessionDialog.js:84 ../js/ui/endSessionDialog.js:88 #: ../js/ui/endSessionDialog.js:84 ../js/ui/endSessionDialog.js:88
msgid "Restart" msgid "Restart"
msgstr "" msgstr "ಮರಳಿ ಆರಂಭಿಸು"
#: ../js/ui/endSessionDialog.js:85 #: ../js/ui/endSessionDialog.js:85
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:86 #: ../js/ui/endSessionDialog.js:86
#, c-format #, c-format
msgid "The system will restart automatically in %d seconds." msgid "The system will restart automatically in %d seconds."
msgstr "" msgstr "ವ್ಯವಸ್ಥೆಯು %d ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮರಳಿ ಆರಂಭಗೊಳ್ಳುತ್ತದೆ."
#: ../js/ui/endSessionDialog.js:87 #: ../js/ui/endSessionDialog.js:87
msgid "Restarting the system." msgid "Restarting the system."
msgstr "" msgstr "ನಿಮ್ಮ ವ್ಯವಸ್ಥೆಯನ್ನು ಮರಳಿ ಆರಂಭಿಸಲಾಗುತ್ತಿದೆ."
#: ../js/ui/endSessionDialog.js:395 #: ../js/ui/endSessionDialog.js:395
msgid "Confirm" msgid "Confirm"
msgstr "" msgstr "ಖಚಿತಪಡಿಸಿ"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:470 #: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:470
msgid "Cancel" msgid "Cancel"
@ -478,17 +494,17 @@ msgstr "ರದ್ದು ಮಾಡು"
#: ../js/ui/lookingGlass.js:587 #: ../js/ui/lookingGlass.js:587
msgid "No extensions installed" msgid "No extensions installed"
msgstr "" msgstr "ಯಾವುದು ವಿಸ್ತರಣೆಗಳನ್ನು ಅನುಸ್ಥಾಪಿಸಲಾಗಿಲ್ಲ"
#: ../js/ui/lookingGlass.js:624 #: ../js/ui/lookingGlass.js:624
msgid "Enabled" msgid "Enabled"
msgstr "" msgstr "ಶಕ್ತಗೊಳಿಸಲಾಗಿದೆ"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:626 ../src/gvc/gvc-mixer-control.c:1087 #: ../js/ui/lookingGlass.js:626 ../src/gvc/gvc-mixer-control.c:1087
msgid "Disabled" msgid "Disabled"
msgstr "" msgstr "ಅಶಕ್ತಗೊಳಿಸಲಾಗಿದೆ"
#: ../js/ui/lookingGlass.js:628 #: ../js/ui/lookingGlass.js:628
msgid "Error" msgid "Error"
@ -496,11 +512,11 @@ msgstr "ದೋಷ"
#: ../js/ui/lookingGlass.js:630 #: ../js/ui/lookingGlass.js:630
msgid "Out of date" msgid "Out of date"
msgstr "" msgstr "ಹಳೆಯದಾಗಿದೆ"
#: ../js/ui/lookingGlass.js:655 #: ../js/ui/lookingGlass.js:655
msgid "View Source" msgid "View Source"
msgstr "" msgstr "ಆಕರವನ್ನು ನೋಡಿ"
#: ../js/ui/lookingGlass.js:661 #: ../js/ui/lookingGlass.js:661
msgid "Web Page" msgid "Web Page"
@ -526,26 +542,26 @@ msgstr "ಅನ್ವಯಗಳು"
#: ../js/ui/panel.js:478 #: ../js/ui/panel.js:478
#, c-format #, c-format
msgid "Quit %s" msgid "Quit %s"
msgstr "" msgstr "%s ಇಂದ ನಿರ್ಗಮಿಸು"
#. Button on the left side of the panel. #. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview". #. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:612 #: ../js/ui/panel.js:612
msgid "Activities" msgid "Activities"
msgstr "" msgstr "ಚಟುವಟಿಕೆಗಳು"
#: ../js/ui/placeDisplay.js:122 #: ../js/ui/placeDisplay.js:122
#, c-format #, c-format
msgid "Failed to unmount '%s'" msgid "Failed to unmount '%s'"
msgstr "" msgstr "'%s' ಅನ್ನು ಅವರೋಹಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ"
#: ../js/ui/placeDisplay.js:125 #: ../js/ui/placeDisplay.js:125
msgid "Retry" msgid "Retry"
msgstr "" msgstr "ಮರಳಿ ಆರಂಭಿಸು"
#: ../js/ui/placeDisplay.js:165 #: ../js/ui/placeDisplay.js:165
msgid "Connect to..." msgid "Connect to..."
msgstr "" msgstr "ಇದಕ್ಕೆ ಸಂಪರ್ಕ ಜೋಡಿಸಿ..."
#: ../js/ui/placeDisplay.js:409 #: ../js/ui/placeDisplay.js:409
msgid "PLACES & DEVICES" msgid "PLACES & DEVICES"
@ -558,7 +574,7 @@ msgstr "PLACES & DEVICES"
#. simply result in invisible toggle switches. #. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:506 #: ../js/ui/popupMenu.js:506
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "" msgstr "toggle-switch-us"
#: ../js/ui/runDialog.js:201 #: ../js/ui/runDialog.js:201
msgid "Please enter a command:" msgid "Please enter a command:"
@ -570,7 +586,7 @@ msgstr "ಹುಡುಕಲಾಗುತ್ತಿದೆ..."
#: ../js/ui/searchDisplay.js:309 #: ../js/ui/searchDisplay.js:309
msgid "No matching results." msgid "No matching results."
msgstr "" msgstr "ಯಾವುದೆ ಫಲಿತಾಂಶಗಳು ತಾಳೆಯಾಗಿಲ್ಲ."
#: ../js/ui/statusMenu.js:102 #: ../js/ui/statusMenu.js:102
msgid "Available" msgid "Available"
@ -590,7 +606,7 @@ msgstr "ವ್ಯವಸ್ಥೆಯ ಸಿದ್ಧತೆಗಳು"
#: ../js/ui/statusMenu.js:126 #: ../js/ui/statusMenu.js:126
msgid "Lock Screen" msgid "Lock Screen"
msgstr "" msgstr "ತೆರೆಯನ್ನು ಲಾಕ್ ಮಾಡಿ"
#: ../js/ui/statusMenu.js:130 #: ../js/ui/statusMenu.js:130
msgid "Switch User" msgid "Switch User"
@ -598,7 +614,7 @@ msgstr "ಬಳಕೆದಾರನನ್ನು ಬದಲಿಸು"
#: ../js/ui/statusMenu.js:135 #: ../js/ui/statusMenu.js:135
msgid "Log Out..." msgid "Log Out..."
msgstr "" msgstr "ನಿರ್ಗಮಿಸಿ..."
#. This is temporarily removed, see #. This is temporarily removed, see
#. http://bugzilla.gnome.org/show_bug.cgi?id=636680 #. http://bugzilla.gnome.org/show_bug.cgi?id=636680
@ -608,51 +624,51 @@ msgstr ""
#. this.menu.addMenuItem(item); #. this.menu.addMenuItem(item);
#: ../js/ui/statusMenu.js:149 #: ../js/ui/statusMenu.js:149
msgid "Shut Down..." msgid "Shut Down..."
msgstr "" msgstr "ಸ್ಥಗಿತಗೊಳಿಸಿ..."
#: ../js/ui/status/accessibility.js:81 #: ../js/ui/status/accessibility.js:81
msgid "Zoom" msgid "Zoom"
msgstr "" msgstr "ಗಾತ್ರ ಬದಲಾವಣೆ"
#: ../js/ui/status/accessibility.js:88 #: ../js/ui/status/accessibility.js:88
msgid "Screen Reader" msgid "Screen Reader"
msgstr "" msgstr "ತೆರೆ ಓದುಗ"
#: ../js/ui/status/accessibility.js:92 #: ../js/ui/status/accessibility.js:92
msgid "Screen Keyboard" msgid "Screen Keyboard"
msgstr "" msgstr "ತೆರೆ ಕೀಲಿಮಣೆ"
#: ../js/ui/status/accessibility.js:96 #: ../js/ui/status/accessibility.js:96
msgid "Visual Alerts" msgid "Visual Alerts"
msgstr "" msgstr "ದೃಶ್ಯರೂಪದ ಎಚ್ಚರಿಕೆಗಳು"
#: ../js/ui/status/accessibility.js:99 #: ../js/ui/status/accessibility.js:99
msgid "Sticky Keys" msgid "Sticky Keys"
msgstr "" msgstr "ಸ್ಟಿಕಿ ಕೀಲಿಗಳು"
#: ../js/ui/status/accessibility.js:102 #: ../js/ui/status/accessibility.js:102
msgid "Slow Keys" msgid "Slow Keys"
msgstr "" msgstr "ನಿಧಾನ ಕೀಲಿಗಳು"
#: ../js/ui/status/accessibility.js:105 #: ../js/ui/status/accessibility.js:105
msgid "Bounce Keys" msgid "Bounce Keys"
msgstr "" msgstr "ಪುಟಿಯುವ ಕೀಲಿಗಳು"
#: ../js/ui/status/accessibility.js:108 #: ../js/ui/status/accessibility.js:108
msgid "Mouse Keys" msgid "Mouse Keys"
msgstr "" msgstr "ಮೌಸ್‌ ಕೀಲಿಗಳು"
#: ../js/ui/status/accessibility.js:112 #: ../js/ui/status/accessibility.js:112
msgid "Universal Access Settings" msgid "Universal Access Settings"
msgstr "" msgstr "ಜಾಗತಿಕ ನಿಲುಕಣೆ ಸಿದ್ಧತೆಗಳು"
#: ../js/ui/status/accessibility.js:164 #: ../js/ui/status/accessibility.js:164
msgid "High Contrast" msgid "High Contrast"
msgstr "" msgstr "ಅತಿ ಹೆಚ್ಚು ವೈದೃಶ್ಯ"
#: ../js/ui/status/accessibility.js:206 #: ../js/ui/status/accessibility.js:206
msgid "Large Text" msgid "Large Text"
msgstr "" msgstr "ದೊಡ್ಡ ಪಠ್ಯ"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:241 #: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:241
#: ../js/ui/status/bluetooth.js:337 ../js/ui/status/bluetooth.js:371 #: ../js/ui/status/bluetooth.js:337 ../js/ui/status/bluetooth.js:371
@ -666,11 +682,11 @@ msgstr "ಗೋಚರಿಕೆ"
#: ../js/ui/status/bluetooth.js:69 #: ../js/ui/status/bluetooth.js:69
msgid "Send Files to Device..." msgid "Send Files to Device..."
msgstr "" msgstr "ಸಾಧನಕ್ಕೆ ಕಡತಗಳನ್ನು ಕಳುಹಿಸಿ..."
#: ../js/ui/status/bluetooth.js:70 #: ../js/ui/status/bluetooth.js:70
msgid "Setup a New Device..." msgid "Setup a New Device..."
msgstr "" msgstr "ಒಂದು ಹೊಸ ಸಾಧನವನ್ನು ಸಿದ್ಧಗೊಳಿಸಿ..."
#: ../js/ui/status/bluetooth.js:95 #: ../js/ui/status/bluetooth.js:95
msgid "Bluetooth Settings" msgid "Bluetooth Settings"
@ -690,12 +706,12 @@ msgstr "ಕಡತಗಳಿಗಾಗಿ ವೀಕ್ಷಿಸು..."
#: ../js/ui/status/bluetooth.js:242 #: ../js/ui/status/bluetooth.js:242
msgid "Error browsing device" msgid "Error browsing device"
msgstr "" msgstr "ಸಾಧನವನ್ನು ವೀಕ್ಷಿಸುವಲ್ಲಿ ದೋಷ"
#: ../js/ui/status/bluetooth.js:243 #: ../js/ui/status/bluetooth.js:243
#, c-format #, c-format
msgid "The requested device cannot be browsed, error is '%s'" msgid "The requested device cannot be browsed, error is '%s'"
msgstr "" msgstr "ಮನವಿ ಸಲ್ಲಿಸಲಾದ ಸಾಧನವನ್ನು ವೀಕ್ಷಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ, ದೋಷವು '%s' ಆಗಿದೆ"
#: ../js/ui/status/bluetooth.js:251 #: ../js/ui/status/bluetooth.js:251
msgid "Keyboard Settings" msgid "Keyboard Settings"
@ -712,20 +728,20 @@ msgstr "ಧ್ವನಿಯ ಸಿದ್ಧತೆಗಳು"
#: ../js/ui/status/bluetooth.js:372 #: ../js/ui/status/bluetooth.js:372
#, c-format #, c-format
msgid "Authorization request from %s" msgid "Authorization request from %s"
msgstr "" msgstr "%s ಇಂದ ದೃಢೀಕರಣ ದೋಷ"
#: ../js/ui/status/bluetooth.js:378 #: ../js/ui/status/bluetooth.js:378
#, c-format #, c-format
msgid "Device %s wants access to the service '%s'" msgid "Device %s wants access to the service '%s'"
msgstr "" msgstr "%s ಎಂಬ ಸಾಧನಕ್ಕಾಗಿ '%s' ಎಂಬ ಸೇವೆಯನ್ನು ನಿಲುಕಿಸಿಕೊಳ್ಳಲು ಬಯಸುತ್ತಿದೆ"
#: ../js/ui/status/bluetooth.js:380 #: ../js/ui/status/bluetooth.js:380
msgid "Always grant access" msgid "Always grant access"
msgstr "" msgstr "ಯಾವಾಗಲೂ ಅನುಮತಿಸು"
#: ../js/ui/status/bluetooth.js:381 #: ../js/ui/status/bluetooth.js:381
msgid "Grant this time only" msgid "Grant this time only"
msgstr "" msgstr "ಈ ಬಾರಿ ಮಾತ್ರ ಅನುಮತಿಸು"
#: ../js/ui/status/bluetooth.js:382 #: ../js/ui/status/bluetooth.js:382
msgid "Reject" msgid "Reject"
@ -734,17 +750,17 @@ msgstr "ತಿರಸ್ಕರಿಸು"
#: ../js/ui/status/bluetooth.js:412 #: ../js/ui/status/bluetooth.js:412
#, c-format #, c-format
msgid "Pairing confirmation for %s" msgid "Pairing confirmation for %s"
msgstr "" msgstr "%s ಗಾಗಿ ಪೇರಿಂಗ್ ಖಚಿತಪಡಿಕೆ"
#: ../js/ui/status/bluetooth.js:418 ../js/ui/status/bluetooth.js:452 #: ../js/ui/status/bluetooth.js:418 ../js/ui/status/bluetooth.js:452
#, c-format #, c-format
msgid "Device %s wants to pair with this computer" msgid "Device %s wants to pair with this computer"
msgstr "" msgstr "%s ಎನ್ನುವ ಸಾಧನದೊಂದಿಗೆ ಸಂಪರ್ಕ ಜೋಡಿಸಲು ಬಯಸುತ್ತಿದೆ"
#: ../js/ui/status/bluetooth.js:419 #: ../js/ui/status/bluetooth.js:419
#, c-format #, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device." msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr "" msgstr "'%s' ಎನ್ನುವ PIN ಸಾಧನದಲ್ಲಿರುವುದಕ್ಕೆ ತಾಳೆಯಾಗುತ್ತದೆಯೆ ಎಂದು ಖಚಿತಪಡಿಸಿ."
#: ../js/ui/status/bluetooth.js:421 #: ../js/ui/status/bluetooth.js:421
msgid "Matches" msgid "Matches"
@ -757,11 +773,11 @@ msgstr "ತಾಳೆಯಾಗುತ್ತಿಲ್ಲ"
#: ../js/ui/status/bluetooth.js:445 #: ../js/ui/status/bluetooth.js:445
#, c-format #, c-format
msgid "Pairing request for %s" msgid "Pairing request for %s"
msgstr "" msgstr "%s ಗಾಗಿ ಪೇರಿಂಗ್ ಮನವಿ"
#: ../js/ui/status/bluetooth.js:453 #: ../js/ui/status/bluetooth.js:453
msgid "Please enter the PIN mentioned on the device." msgid "Please enter the PIN mentioned on the device."
msgstr "" msgstr "ದಯವಿಟ್ಟು ಸಾಧನದಲ್ಲಿ ಸೂಚಿಸಿರುವ PIN ಅನ್ನು ನಮೂದಿಸಿ."
#: ../js/ui/status/bluetooth.js:469 #: ../js/ui/status/bluetooth.js:469
msgid "OK" msgid "OK"
@ -769,51 +785,51 @@ msgstr "ಸರಿ"
#: ../js/ui/status/keyboard.js:72 #: ../js/ui/status/keyboard.js:72
msgid "Localization Settings" msgid "Localization Settings"
msgstr "" msgstr "ಲೋಕಲೈಸೇಶನ್ ಸಿದ್ಧತೆಗಳು"
#: ../js/ui/status/power.js:85 #: ../js/ui/status/power.js:85
msgid "Power Settings" msgid "Power Settings"
msgstr "" msgstr "ವಿದ್ಯುಚ್ಛಕ್ತಿ ಸಿದ್ಧತೆಗಳು"
#: ../js/ui/status/power.js:112 #: ../js/ui/status/power.js:112
#, c-format #, c-format
msgid "%d hour remaining" msgid "%d hour remaining"
msgid_plural "%d hours remaining" msgid_plural "%d hours remaining"
msgstr[0] "" msgstr[0] "%d ಗಂಟೆ ಬಾಕಿ ಇದೆ"
msgstr[1] "" msgstr[1] "%d ಗಂಟೆಗಳು ಬಾಕಿ ಇವೆ"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining" #. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:115 #: ../js/ui/status/power.js:115
#, c-format #, c-format
msgid "%d %s %d %s remaining" msgid "%d %s %d %s remaining"
msgstr "" msgstr "%d %s %d %s ಬಾಕಿ ಇದೆ"
#: ../js/ui/status/power.js:117 #: ../js/ui/status/power.js:117
msgid "hour" msgid "hour"
msgid_plural "hours" msgid_plural "hours"
msgstr[0] "" msgstr[0] "ಗಂಟೆ"
msgstr[1] "" msgstr[1] "ಗಂಟೆಗಳು"
#: ../js/ui/status/power.js:117 #: ../js/ui/status/power.js:117
msgid "minute" msgid "minute"
msgid_plural "minutes" msgid_plural "minutes"
msgstr[0] "" msgstr[0] "ನಿಮಿಷ"
msgstr[1] "" msgstr[1] "ನಿಮಿಷಗಳು"
#: ../js/ui/status/power.js:120 #: ../js/ui/status/power.js:120
#, c-format #, c-format
msgid "%d minute remaining" msgid "%d minute remaining"
msgid_plural "%d minutes remaining" msgid_plural "%d minutes remaining"
msgstr[0] "" msgstr[0] "%d ನಿಮಿಷ ಬಾಕಿ ಇದೆ"
msgstr[1] "" msgstr[1] "%d ನಿಮಿಷಗಳು ಬಾಕಿ ಇವೆ"
#: ../js/ui/status/power.js:235 #: ../js/ui/status/power.js:235
msgid "AC adapter" msgid "AC adapter"
msgstr "" msgstr "AC ಅಡಾಪ್ಟರ್"
#: ../js/ui/status/power.js:237 #: ../js/ui/status/power.js:237
msgid "Laptop battery" msgid "Laptop battery"
msgstr "" msgstr "ಲ್ಯಾಪ್‌ಟಾಪ್ ಬ್ಯಾಟರಿ"
#: ../js/ui/status/power.js:239 #: ../js/ui/status/power.js:239
msgid "UPS" msgid "UPS"
@ -821,15 +837,15 @@ msgstr "UPS"
#: ../js/ui/status/power.js:241 #: ../js/ui/status/power.js:241
msgid "Monitor" msgid "Monitor"
msgstr "" msgstr "ತೆರೆ"
#: ../js/ui/status/power.js:243 #: ../js/ui/status/power.js:243
msgid "Mouse" msgid "Mouse"
msgstr "" msgstr "ಮೌಸ್"
#: ../js/ui/status/power.js:245 #: ../js/ui/status/power.js:245
msgid "Keyboard" msgid "Keyboard"
msgstr "" msgstr "ಕೀಲಿಮಣೆ"
#: ../js/ui/status/power.js:247 #: ../js/ui/status/power.js:247
msgid "PDA" msgid "PDA"
@ -837,51 +853,51 @@ msgstr "PDA"
#: ../js/ui/status/power.js:249 #: ../js/ui/status/power.js:249
msgid "Cell phone" msgid "Cell phone"
msgstr "" msgstr "ಸೆಲ್ ಫೋನ್"
#: ../js/ui/status/power.js:251 #: ../js/ui/status/power.js:251
msgid "Media player" msgid "Media player"
msgstr "" msgstr "ಮೀಡಿಯ ಪ್ಲೇಯರ್"
#: ../js/ui/status/power.js:253 #: ../js/ui/status/power.js:253
msgid "Tablet" msgid "Tablet"
msgstr "" msgstr "ಟ್ಯಾಬ್ಲೆಟ್"
#: ../js/ui/status/power.js:255 #: ../js/ui/status/power.js:255
msgid "Computer" msgid "Computer"
msgstr "" msgstr "ಗಣಕ"
#: ../js/ui/status/power.js:257 ../src/shell-app-system.c:1013 #: ../js/ui/status/power.js:257 ../src/shell-app-system.c:1013
msgid "Unknown" msgid "Unknown"
msgstr "" msgstr "ಗೊತ್ತಿರದ"
#: ../js/ui/status/volume.js:44 #: ../js/ui/status/volume.js:44
msgid "Volume" msgid "Volume"
msgstr "" msgstr "ಧ್ವನಿ ಪ್ರಮಾಣ"
#: ../js/ui/status/volume.js:57 #: ../js/ui/status/volume.js:57
msgid "Microphone" msgid "Microphone"
msgstr "" msgstr "ಮೈಕ್ರೊಫೋನ್"
#: ../js/ui/telepathyClient.js:240 #: ../js/ui/telepathyClient.js:240
#, c-format #, c-format
msgid "%s is online." msgid "%s is online."
msgstr "" msgstr "%s ಆನ್‌ಲೈನ್‌ನಲ್ಲಿದ್ದಾರೆ."
#: ../js/ui/telepathyClient.js:245 #: ../js/ui/telepathyClient.js:245
#, c-format #, c-format
msgid "%s is offline." msgid "%s is offline."
msgstr "" msgstr "%s ಆಫ್‌ಲೈನ್‌ನಲ್ಲಿದ್ದಾರೆ."
#: ../js/ui/telepathyClient.js:248 #: ../js/ui/telepathyClient.js:248
#, c-format #, c-format
msgid "%s is away." msgid "%s is away."
msgstr "" msgstr "%s ಆಚೆ ಹೋಗಿದ್ದಾರೆ."
#: ../js/ui/telepathyClient.js:251 #: ../js/ui/telepathyClient.js:251
#, c-format #, c-format
msgid "%s is busy." msgid "%s is busy."
msgstr "" msgstr "%s\" ಕಾರ್ಯನಿರತವಾಗಿದ್ದಾರೆ."
#. Translators: this is a time format string followed by a date. #. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your #. If applicable, replace %X with a strftime format valid for your
@ -889,7 +905,7 @@ msgstr ""
#: ../js/ui/telepathyClient.js:349 #: ../js/ui/telepathyClient.js:349
#, no-c-format #, no-c-format
msgid "Sent at %X on %A" msgid "Sent at %X on %A"
msgstr "" msgstr "%X ಕ್ಕೆ %A ರಂದು ಕಳುಹಿಸಲಾಗಿದೆ"
#. Translators: this is the text displayed #. Translators: this is the text displayed
#. in the search entry when no search is #. in the search entry when no search is
@ -897,17 +913,17 @@ msgstr ""
#. characters #. characters
#: ../js/ui/viewSelector.js:30 #: ../js/ui/viewSelector.js:30
msgid "Type to search..." msgid "Type to search..."
msgstr "" msgstr "ಹುಡುಕಲು ನಮೂದಿಸು..."
#: ../js/ui/windowAttentionHandler.js:43 #: ../js/ui/windowAttentionHandler.js:43
#, c-format #, c-format
msgid "%s has finished starting" msgid "%s has finished starting"
msgstr "" msgstr "ಆರಂಭಗೊಳಿಸುವುದನ್ನು %s ಪೂರ್ಣಗೊಳಿಸಿದ್ದಾರೆ"
#: ../js/ui/windowAttentionHandler.js:45 #: ../js/ui/windowAttentionHandler.js:45
#, c-format #, c-format
msgid "'%s' is ready" msgid "'%s' is ready"
msgstr "" msgstr "'%s' ಸಿದ್ಧಗೊಂಡಿದೆ"
#. translators: #. translators:
#. * The number of sound outputs on a particular device #. * The number of sound outputs on a particular device
@ -915,8 +931,8 @@ msgstr ""
#, c-format #, c-format
msgid "%u Output" msgid "%u Output"
msgid_plural "%u Outputs" msgid_plural "%u Outputs"
msgstr[0] "" msgstr[0] "%u ಔಟ್‌ಪುಟ್"
msgstr[1] "" msgstr[1] "%u ಔಟ್‌ಪುಟ್‌ಗಳು"
#. translators: #. translators:
#. * The number of sound inputs on a particular device #. * The number of sound inputs on a particular device
@ -924,58 +940,58 @@ msgstr[1] ""
#, c-format #, c-format
msgid "%u Input" msgid "%u Input"
msgid_plural "%u Inputs" msgid_plural "%u Inputs"
msgstr[0] "" msgstr[0] "%u ಇನ್‌ಪುಟ್"
msgstr[1] "" msgstr[1] "%u ಇನ್‌ಪುಟ್‌ಗಳು"
#: ../src/gvc/gvc-mixer-control.c:1402 #: ../src/gvc/gvc-mixer-control.c:1402
msgid "System Sounds" msgid "System Sounds"
msgstr "" msgstr "ವ್ಯವಸ್ಥೆಯ ಧ್ವನಿಗಳು"
#: ../src/shell-global.c:1363 #: ../src/shell-global.c:1363
msgid "Less than a minute ago" msgid "Less than a minute ago"
msgstr "" msgstr "ಒಂದು ನಿಮಿಷಕ್ಕೂ ಹಿಂದೆ"
#: ../src/shell-global.c:1367 #: ../src/shell-global.c:1367
#, c-format #, c-format
msgid "%d minute ago" msgid "%d minute ago"
msgid_plural "%d minutes ago" msgid_plural "%d minutes ago"
msgstr[0] "" msgstr[0] "%d ನಿಮಿಷದ ಹಿಂದೆ"
msgstr[1] "" msgstr[1] "%d ನಿಮಿಷಗಳ ಹಿಂದೆ"
#: ../src/shell-global.c:1372 #: ../src/shell-global.c:1372
#, c-format #, c-format
msgid "%d hour ago" msgid "%d hour ago"
msgid_plural "%d hours ago" msgid_plural "%d hours ago"
msgstr[0] "" msgstr[0] "%d ಗಂಟೆಯ ಹಿಂದೆ"
msgstr[1] "" msgstr[1] "%d ಗಂಟೆಗಳ ಹಿಂದೆ"
#: ../src/shell-global.c:1377 #: ../src/shell-global.c:1377
#, c-format #, c-format
msgid "%d day ago" msgid "%d day ago"
msgid_plural "%d days ago" msgid_plural "%d days ago"
msgstr[0] "" msgstr[0] "%d ದಿನದ ಹಿಂದೆ"
msgstr[1] "" msgstr[1] "%d ದಿನಗಳ ಹಿಂದೆ"
#: ../src/shell-global.c:1382 #: ../src/shell-global.c:1382
#, c-format #, c-format
msgid "%d week ago" msgid "%d week ago"
msgid_plural "%d weeks ago" msgid_plural "%d weeks ago"
msgstr[0] "" msgstr[0] "%d ವಾರದ ಹಿಂದೆ"
msgstr[1] "" msgstr[1] "%d ವಾರಗಳ ಹಿಂದೆ"
#: ../src/shell-util.c:89 #: ../src/shell-util.c:89
msgid "Home Folder" msgid "Home Folder"
msgstr "" msgstr "ನೆಲೆ ಕಡತಕೋಶ"
#. Translators: this is the same string as the one found in #. Translators: this is the same string as the one found in
#. * nautilus #. * nautilus
#: ../src/shell-util.c:104 #: ../src/shell-util.c:104
msgid "File System" msgid "File System"
msgstr "" msgstr "ಕಡತ ವ್ಯವಸ್ಥೆ"
#: ../src/shell-util.c:250 #: ../src/shell-util.c:250
msgid "Search" msgid "Search"
msgstr "" msgstr "ಹುಡುಕು"
#. Translators: the first string is the name of a gvfs #. Translators: the first string is the name of a gvfs
#. * method, and the second string is a path. For #. * method, and the second string is a path. For
@ -987,3 +1003,4 @@ msgstr ""
msgid "%1$s: %2$s" msgid "%1$s: %2$s"
msgstr "%1$s: %2$s" msgstr "%1$s: %2$s"

155
po/nb.po
View File

@ -8,8 +8,8 @@ msgid ""
msgstr "" msgstr ""
"Project-Id-Version: gnome-shell 2.91.x\n" "Project-Id-Version: gnome-shell 2.91.x\n"
"Report-Msgid-Bugs-To: \n" "Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-02 20:21+0100\n" "POT-Creation-Date: 2011-03-08 15:24+0100\n"
"PO-Revision-Date: 2011-03-02 20:22+0100\n" "PO-Revision-Date: 2011-03-08 15:29+0100\n"
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n" "Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
"Language-Team: Norwegian Bokmål <i18n-nb@lister.ping.uio.no>\n" "Language-Team: Norwegian Bokmål <i18n-nb@lister.ping.uio.no>\n"
"Language: \n" "Language: \n"
@ -167,27 +167,27 @@ msgid "Execution of '%s' failed:"
msgstr "Kjøring av «%s» feilet:" msgstr "Kjøring av «%s» feilet:"
#. Translators: Filter to display all applications #. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:195 #: ../js/ui/appDisplay.js:226
msgid "All" msgid "All"
msgstr "Alle" msgstr "Alle"
#: ../js/ui/appDisplay.js:282 #: ../js/ui/appDisplay.js:324
msgid "APPLICATIONS" msgid "APPLICATIONS"
msgstr "PROGRAMMER" msgstr "PROGRAMMER"
#: ../js/ui/appDisplay.js:312 #: ../js/ui/appDisplay.js:350
msgid "SETTINGS" msgid "SETTINGS"
msgstr "INNSTILLINGER" msgstr "INNSTILLINGER"
#: ../js/ui/appDisplay.js:572 #: ../js/ui/appDisplay.js:612
msgid "New Window" msgid "New Window"
msgstr "Nytt vindu" msgstr "Nytt vindu"
#: ../js/ui/appDisplay.js:575 #: ../js/ui/appDisplay.js:615
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "Fjern fra favoritter" msgstr "Fjern fra favoritter"
#: ../js/ui/appDisplay.js:576 #: ../js/ui/appDisplay.js:616
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "Legg til i favoritter" msgstr "Legg til i favoritter"
@ -347,7 +347,7 @@ msgstr "Denne uken"
msgid "Next week" msgid "Next week"
msgstr "Neste uke" msgstr "Neste uke"
#: ../js/ui/dash.js:174 #: ../js/ui/dash.js:174 ../js/ui/messageTray.js:933
msgid "Remove" msgid "Remove"
msgstr "Fjern" msgstr "Fjern"
@ -355,54 +355,54 @@ msgstr "Fjern"
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "Innstillinger for dato og klokkeslett" msgstr "Innstillinger for dato og klokkeslett"
#: ../js/ui/dateMenu.js:110 #: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "Åpne kalender" msgstr "Åpne kalender"
#. Translators: This is the time format with date used #. Translators: This is the time format with date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:162 #: ../js/ui/dateMenu.js:164
msgid "%a %b %e, %R:%S" msgid "%a %b %e, %R:%S"
msgstr "%a %e %b, %R.%S" msgstr "%a %e %b, %R.%S"
#: ../js/ui/dateMenu.js:163 #: ../js/ui/dateMenu.js:165
msgid "%a %b %e, %R" msgid "%a %b %e, %R"
msgstr "%a %e %b, %R" msgstr "%a %e %b, %R"
#. Translators: This is the time format without date used #. Translators: This is the time format without date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:167 #: ../js/ui/dateMenu.js:169
msgid "%a %R:%S" msgid "%a %R:%S"
msgstr "%a %R.%S" msgstr "%a %R.%S"
#: ../js/ui/dateMenu.js:168 #: ../js/ui/dateMenu.js:170
msgid "%a %R" msgid "%a %R"
msgstr "%a %R" msgstr "%a %R"
#. Translators: This is a time format with date used #. Translators: This is a time format with date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:175 #: ../js/ui/dateMenu.js:177
msgid "%a %b %e, %l:%M:%S %p" msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %e %b, %l.%M.%S %p" msgstr "%a %e %b, %l.%M.%S %p"
#: ../js/ui/dateMenu.js:176 #: ../js/ui/dateMenu.js:178
msgid "%a %b %e, %l:%M %p" msgid "%a %b %e, %l:%M %p"
msgstr "%a %e %b, %l.%M %p" msgstr "%a %e %b, %l.%M %p"
#. Translators: This is a time format without date used #. Translators: This is a time format without date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:180 #: ../js/ui/dateMenu.js:182
msgid "%a %l:%M:%S %p" msgid "%a %l:%M:%S %p"
msgstr "%a %l.%M.%S %p" msgstr "%a %l.%M.%S %p"
#: ../js/ui/dateMenu.js:181 #: ../js/ui/dateMenu.js:183
msgid "%a %l:%M %p" msgid "%a %l:%M %p"
msgstr "%a %l.%M %p" msgstr "%a %l.%M %p"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:207 #: ../js/ui/dateMenu.js:209
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%a %e %B, %Y" msgstr "%a %e %B, %Y"
@ -482,37 +482,41 @@ msgstr "Bekreft"
msgid "Cancel" msgid "Cancel"
msgstr "Avbryt" msgstr "Avbryt"
#: ../js/ui/lookingGlass.js:587 #: ../js/ui/lookingGlass.js:588
msgid "No extensions installed" msgid "No extensions installed"
msgstr "Ingen utvidelser installert" msgstr "Ingen utvidelser installert"
#: ../js/ui/lookingGlass.js:624 #: ../js/ui/lookingGlass.js:625
msgid "Enabled" msgid "Enabled"
msgstr "Aktivert" msgstr "Aktivert"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:626 ../src/gvc/gvc-mixer-control.c:1087 #: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1087
msgid "Disabled" msgid "Disabled"
msgstr "Deaktivert" msgstr "Deaktivert"
#: ../js/ui/lookingGlass.js:628 #: ../js/ui/lookingGlass.js:629
msgid "Error" msgid "Error"
msgstr "Feil" msgstr "Feil"
#: ../js/ui/lookingGlass.js:630 #: ../js/ui/lookingGlass.js:631
msgid "Out of date" msgid "Out of date"
msgstr "Utdatert" msgstr "Utdatert"
#: ../js/ui/lookingGlass.js:655 #: ../js/ui/lookingGlass.js:656
msgid "View Source" msgid "View Source"
msgstr "Vis kildekode" msgstr "Vis kildekode"
#: ../js/ui/lookingGlass.js:661 #: ../js/ui/lookingGlass.js:662
msgid "Web Page" msgid "Web Page"
msgstr "Nettside" msgstr "Nettside"
#: ../js/ui/messageTray.js:1902 #: ../js/ui/messageTray.js:926
msgid "Open"
msgstr "Åpne"
#: ../js/ui/messageTray.js:1963
msgid "System Information" msgid "System Information"
msgstr "Systeminformasjon" msgstr "Systeminformasjon"
@ -528,18 +532,28 @@ msgstr "Vinduer"
msgid "Applications" msgid "Applications"
msgstr "Programmer" msgstr "Programmer"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:202
msgid "Dash"
msgstr "Favoritter"
#. TODO - _quit() doesn't really work on apps in state STARTING yet #. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:529 #: ../js/ui/panel.js:532
#, c-format #, c-format
msgid "Quit %s" msgid "Quit %s"
msgstr "Avslutt %s" msgstr "Avslutt %s"
#. Button on the left side of the panel. #. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview". #. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:897 #: ../js/ui/panel.js:893
msgid "Activities" msgid "Activities"
msgstr "Aktiviteter" msgstr "Aktiviteter"
#: ../js/ui/panel.js:994
msgid "Panel"
msgstr "Panel"
#: ../js/ui/placeDisplay.js:122 #: ../js/ui/placeDisplay.js:122
#, c-format #, c-format
msgid "Failed to unmount '%s'" msgid "Failed to unmount '%s'"
@ -562,7 +576,7 @@ msgstr "STEDER & ENHETER"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle #. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will #. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches. #. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:612 #: ../js/ui/popupMenu.js:618
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-intl" msgstr "toggle-switch-intl"
@ -570,11 +584,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "Oppgi en kommando:" msgstr "Oppgi en kommando:"
#: ../js/ui/searchDisplay.js:295 #: ../js/ui/searchDisplay.js:283
msgid "Searching..." msgid "Searching..."
msgstr "Søker …" msgstr "Søker …"
#: ../js/ui/searchDisplay.js:309 #: ../js/ui/searchDisplay.js:297
msgid "No matching results." msgid "No matching results."
msgstr "Ingen treff." msgstr "Ingen treff."
@ -614,47 +628,47 @@ msgstr "Bytt bruker"
msgid "Log Out..." msgid "Log Out..."
msgstr "Logg ut …" msgstr "Logg ut …"
#: ../js/ui/status/accessibility.js:81 #: ../js/ui/status/accessibility.js:62
msgid "Zoom" msgid "Zoom"
msgstr "Zoom" msgstr "Zoom"
#: ../js/ui/status/accessibility.js:88 #: ../js/ui/status/accessibility.js:69
msgid "Screen Reader" msgid "Screen Reader"
msgstr "Skjermleser" msgstr "Skjermleser"
#: ../js/ui/status/accessibility.js:92 #: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard" msgid "Screen Keyboard"
msgstr "Tastatur på skjermen" msgstr "Tastatur på skjermen"
#: ../js/ui/status/accessibility.js:96 #: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts" msgid "Visual Alerts"
msgstr "Synlig varsling" msgstr "Synlig varsling"
#: ../js/ui/status/accessibility.js:99 #: ../js/ui/status/accessibility.js:80
msgid "Sticky Keys" msgid "Sticky Keys"
msgstr "Klebrige taster" msgstr "Klebrige taster"
#: ../js/ui/status/accessibility.js:102 #: ../js/ui/status/accessibility.js:83
msgid "Slow Keys" msgid "Slow Keys"
msgstr "Trege taster" msgstr "Trege taster"
#: ../js/ui/status/accessibility.js:105 #: ../js/ui/status/accessibility.js:86
msgid "Bounce Keys" msgid "Bounce Keys"
msgstr "Spretne taster" msgstr "Spretne taster"
#: ../js/ui/status/accessibility.js:108 #: ../js/ui/status/accessibility.js:89
msgid "Mouse Keys" msgid "Mouse Keys"
msgstr "Mustaster" msgstr "Mustaster"
#: ../js/ui/status/accessibility.js:112 #: ../js/ui/status/accessibility.js:93
msgid "Universal Access Settings" msgid "Universal Access Settings"
msgstr "Innstillinger for tilgjengelighet" msgstr "Innstillinger for tilgjengelighet"
#: ../js/ui/status/accessibility.js:164 #: ../js/ui/status/accessibility.js:145
msgid "High Contrast" msgid "High Contrast"
msgstr "Høy kontrast" msgstr "Høy kontrast"
#: ../js/ui/status/accessibility.js:209 #: ../js/ui/status/accessibility.js:182
msgid "Large Text" msgid "Large Text"
msgstr "Stor tekst" msgstr "Stor tekst"
@ -821,51 +835,51 @@ msgid_plural "%d minutes remaining"
msgstr[0] "%d minutt gjenstår" msgstr[0] "%d minutt gjenstår"
msgstr[1] "%d minutter gjenstår" msgstr[1] "%d minutter gjenstår"
#: ../js/ui/status/power.js:241 #: ../js/ui/status/power.js:227
msgid "AC adapter" msgid "AC adapter"
msgstr "Strømadapter" msgstr "Strømadapter"
#: ../js/ui/status/power.js:243 #: ../js/ui/status/power.js:229
msgid "Laptop battery" msgid "Laptop battery"
msgstr "Batteri på bærbar" msgstr "Batteri på bærbar"
#: ../js/ui/status/power.js:245 #: ../js/ui/status/power.js:231
msgid "UPS" msgid "UPS"
msgstr "UPS" msgstr "UPS"
#: ../js/ui/status/power.js:247 #: ../js/ui/status/power.js:233
msgid "Monitor" msgid "Monitor"
msgstr "Skjerm" msgstr "Skjerm"
#: ../js/ui/status/power.js:249 #: ../js/ui/status/power.js:235
msgid "Mouse" msgid "Mouse"
msgstr "Mus" msgstr "Mus"
#: ../js/ui/status/power.js:251 #: ../js/ui/status/power.js:237
msgid "Keyboard" msgid "Keyboard"
msgstr "Tastatur" msgstr "Tastatur"
#: ../js/ui/status/power.js:253 #: ../js/ui/status/power.js:239
msgid "PDA" msgid "PDA"
msgstr "PDA" msgstr "PDA"
#: ../js/ui/status/power.js:255 #: ../js/ui/status/power.js:241
msgid "Cell phone" msgid "Cell phone"
msgstr "Mobiltelefon" msgstr "Mobiltelefon"
#: ../js/ui/status/power.js:257 #: ../js/ui/status/power.js:243
msgid "Media player" msgid "Media player"
msgstr "Medieavspiller" msgstr "Medieavspiller"
#: ../js/ui/status/power.js:259 #: ../js/ui/status/power.js:245
msgid "Tablet" msgid "Tablet"
msgstr "Nettbrett" msgstr "Nettbrett"
#: ../js/ui/status/power.js:261 #: ../js/ui/status/power.js:247
msgid "Computer" msgid "Computer"
msgstr "Datamaskin" msgstr "Datamaskin"
#: ../js/ui/status/power.js:263 ../src/shell-app-system.c:1013 #: ../js/ui/status/power.js:249 ../src/shell-app-system.c:1013
msgid "Unknown" msgid "Unknown"
msgstr "Ukjent" msgstr "Ukjent"
@ -909,16 +923,20 @@ msgstr "Sendt %X på %A"
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters. #. characters.
#: ../js/ui/viewSelector.js:103 #: ../js/ui/viewSelector.js:117
msgid "Type to search..." msgid "Type to search..."
msgstr "Skriv for å søke …" msgstr "Skriv for å søke …"
#: ../js/ui/windowAttentionHandler.js:43 #: ../js/ui/viewSelector.js:137 ../src/shell-util.c:250
msgid "Search"
msgstr "Søk"
#: ../js/ui/windowAttentionHandler.js:42
#, c-format #, c-format
msgid "%s has finished starting" msgid "%s has finished starting"
msgstr "%s er ferdig startet" msgstr "%s er ferdig startet"
#: ../js/ui/windowAttentionHandler.js:45 #: ../js/ui/windowAttentionHandler.js:44
#, c-format #, c-format
msgid "'%s' is ready" msgid "'%s' is ready"
msgstr "«%s» er klar" msgstr "«%s» er klar"
@ -945,32 +963,36 @@ msgstr[1] "%u innganger"
msgid "System Sounds" msgid "System Sounds"
msgstr "Systemlyder" msgstr "Systemlyder"
#: ../src/shell-global.c:1298 #: ../src/main.c:395
msgid "Print version"
msgstr "Skriv ut versjon"
#: ../src/shell-global.c:1308
msgid "Less than a minute ago" msgid "Less than a minute ago"
msgstr "Mindre enn ett minutt siden" msgstr "Mindre enn ett minutt siden"
#: ../src/shell-global.c:1302 #: ../src/shell-global.c:1312
#, c-format #, c-format
msgid "%d minute ago" msgid "%d minute ago"
msgid_plural "%d minutes ago" msgid_plural "%d minutes ago"
msgstr[0] "%d minutt siden" msgstr[0] "%d minutt siden"
msgstr[1] "%d minutter siden" msgstr[1] "%d minutter siden"
#: ../src/shell-global.c:1307 #: ../src/shell-global.c:1317
#, c-format #, c-format
msgid "%d hour ago" msgid "%d hour ago"
msgid_plural "%d hours ago" msgid_plural "%d hours ago"
msgstr[0] "%d time siden" msgstr[0] "%d time siden"
msgstr[1] "%d timer siden" msgstr[1] "%d timer siden"
#: ../src/shell-global.c:1312 #: ../src/shell-global.c:1322
#, c-format #, c-format
msgid "%d day ago" msgid "%d day ago"
msgid_plural "%d days ago" msgid_plural "%d days ago"
msgstr[0] "%d dag siden" msgstr[0] "%d dag siden"
msgstr[1] "%d dager siden" msgstr[1] "%d dager siden"
#: ../src/shell-global.c:1317 #: ../src/shell-global.c:1327
#, c-format #, c-format
msgid "%d week ago" msgid "%d week ago"
msgid_plural "%d weeks ago" msgid_plural "%d weeks ago"
@ -991,10 +1013,6 @@ msgstr "Hjemmemappe"
msgid "File System" msgid "File System"
msgstr "Filsystem" msgstr "Filsystem"
#: ../src/shell-util.c:250
msgid "Search"
msgstr "Søk"
#. Translators: the first string is the name of a gvfs #. Translators: the first string is the name of a gvfs
#. * method, and the second string is a path. For #. * method, and the second string is a path. For
#. * example, "Trash: some-directory". It means that the #. * example, "Trash: some-directory". It means that the
@ -1004,6 +1022,3 @@ msgstr "Søk"
#, c-format #, c-format
msgid "%1$s: %2$s" msgid "%1$s: %2$s"
msgstr "%1$s: %2$s" msgstr "%1$s: %2$s"
#~ msgid "PREFERENCES"
#~ msgstr "BRUKERVALG"

259
po/pa.po
View File

@ -7,8 +7,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." "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
"cgi?product=gnome-shell&component=general\n" "cgi?product=gnome-shell&component=general\n"
"POT-Creation-Date: 2011-02-23 16:51+0000\n" "POT-Creation-Date: 2011-03-07 16:15+0000\n"
"PO-Revision-Date: 2011-02-25 07:31+0530\n" "PO-Revision-Date: 2011-03-08 08:27+0530\n"
"Last-Translator: A S Alam <aalam@users.sf.net>\n" "Last-Translator: A S Alam <aalam@users.sf.net>\n"
"Language-Team: Punjabi/Panjabi <punjabi-users@lists.sf.net>\n" "Language-Team: Punjabi/Panjabi <punjabi-users@lists.sf.net>\n"
"MIME-Version: 1.0\n" "MIME-Version: 1.0\n"
@ -59,7 +59,6 @@ msgid "History for command (Alt-F2) dialog"
msgstr "ਕਮਾਂਡ (Alt-F2) ਡਾਈਲਾਗ ਲਈ ਅਤੀਤ" msgstr "ਕਮਾਂਡ (Alt-F2) ਡਾਈਲਾਗ ਲਈ ਅਤੀਤ"
#: ../data/org.gnome.shell.gschema.xml.in.h:7 #: ../data/org.gnome.shell.gschema.xml.in.h:7
#| msgid "History for command (Alt-F2) dialog"
msgid "History for the looking glass dialog" msgid "History for the looking glass dialog"
msgstr "ਗਲਾਸ ਡਾਈਲਾਗ ਖੋਜ ਲਈ ਅਤੀਤ" msgstr "ਗਲਾਸ ਡਾਈਲਾਗ ਖੋਜ ਲਈ ਅਤੀਤ"
@ -185,27 +184,27 @@ 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:174 #: ../js/ui/appDisplay.js:226
msgid "All" msgid "All"
msgstr "ਸਭ" msgstr "ਸਭ"
#: ../js/ui/appDisplay.js:261 #: ../js/ui/appDisplay.js:324
msgid "APPLICATIONS" msgid "APPLICATIONS"
msgstr "ਐਪਲੀਕੇਸ਼ਨ" msgstr "ਐਪਲੀਕੇਸ਼ਨ"
#: ../js/ui/appDisplay.js:291 #: ../js/ui/appDisplay.js:350
msgid "PREFERENCES" msgid "SETTINGS"
msgstr "ਪਸੰਦ" msgstr "ਸੈਟਿੰਗ"
#: ../js/ui/appDisplay.js:551 #: ../js/ui/appDisplay.js:612
msgid "New Window" msgid "New Window"
msgstr "ਨਵੀਂ ਵਿੰਡੋ" msgstr "ਨਵੀਂ ਵਿੰਡੋ"
#: ../js/ui/appDisplay.js:555 #: ../js/ui/appDisplay.js:615
msgid "Remove from Favorites" msgid "Remove from Favorites"
msgstr "ਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਓ" msgstr "ਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਓ"
#: ../js/ui/appDisplay.js:556 #: ../js/ui/appDisplay.js:616
msgid "Add to Favorites" msgid "Add to Favorites"
msgstr "ਪਸੰਦ 'ਚ ਸ਼ਾਮਲ ਕਰੋ" msgstr "ਪਸੰਦ 'ਚ ਸ਼ਾਮਲ ਕਰੋ"
@ -222,19 +221,19 @@ msgstr "%s ਨੂੰ ਤੁਹਾਡੀ ਪਸੰਦ ਤੋਂ ਹਟਾਇਆ
#. Translators: Shown in calendar event list for all day events #. Translators: Shown in calendar event list for all day events
#. * Keep it short, best if you can use less then 10 characters #. * Keep it short, best if you can use less then 10 characters
#. #.
#: ../js/ui/calendar.js:65 #: ../js/ui/calendar.js:66
msgctxt "event list time" msgctxt "event list time"
msgid "All Day" msgid "All Day"
msgstr "ਸਭ ਦਿਨ" msgstr "ਸਭ ਦਿਨ"
#. Translators: Shown in calendar event list, if 24h format #. Translators: Shown in calendar event list, if 24h format
#: ../js/ui/calendar.js:70 #: ../js/ui/calendar.js:71
msgctxt "event list time" msgctxt "event list time"
msgid "%H:%M" msgid "%H:%M"
msgstr "%H:%M" msgstr "%H:%M"
#. Transators: Shown in calendar event list, if 12h format #. Transators: Shown in calendar event list, if 12h format
#: ../js/ui/calendar.js:77 #: ../js/ui/calendar.js:78
msgctxt "event list time" msgctxt "event list time"
msgid "%l:%M %p" msgid "%l:%M %p"
msgstr "%l:%M %p" msgstr "%l:%M %p"
@ -244,43 +243,43 @@ msgstr "%l:%M %p"
#. * NOTE: These grid abbreviations are always shown together #. * NOTE: These grid abbreviations are always shown together
#. * and in order, e.g. "S M T W T F S". #. * and in order, e.g. "S M T W T F S".
#. #.
#: ../js/ui/calendar.js:117 #: ../js/ui/calendar.js:118
msgctxt "grid sunday" msgctxt "grid sunday"
msgid "S" msgid "S"
msgstr "ਐ" msgstr "ਐ"
#. Translators: Calendar grid abbreviation for Monday #. Translators: Calendar grid abbreviation for Monday
#: ../js/ui/calendar.js:119 #: ../js/ui/calendar.js:120
msgctxt "grid monday" msgctxt "grid monday"
msgid "M" msgid "M"
msgstr "ਸੋ" msgstr "ਸੋ"
#. Translators: Calendar grid abbreviation for Tuesday #. Translators: Calendar grid abbreviation for Tuesday
#: ../js/ui/calendar.js:121 #: ../js/ui/calendar.js:122
msgctxt "grid tuesday" msgctxt "grid tuesday"
msgid "T" msgid "T"
msgstr "ਮੰ" msgstr "ਮੰ"
#. Translators: Calendar grid abbreviation for Wednesday #. Translators: Calendar grid abbreviation for Wednesday
#: ../js/ui/calendar.js:123 #: ../js/ui/calendar.js:124
msgctxt "grid wednesday" msgctxt "grid wednesday"
msgid "W" msgid "W"
msgstr "ਬੁੱ" msgstr "ਬੁੱ"
#. Translators: Calendar grid abbreviation for Thursday #. Translators: Calendar grid abbreviation for Thursday
#: ../js/ui/calendar.js:125 #: ../js/ui/calendar.js:126
msgctxt "grid thursday" msgctxt "grid thursday"
msgid "T" msgid "T"
msgstr "ਵੀ" msgstr "ਵੀ"
#. Translators: Calendar grid abbreviation for Friday #. Translators: Calendar grid abbreviation for Friday
#: ../js/ui/calendar.js:127 #: ../js/ui/calendar.js:128
msgctxt "grid friday" msgctxt "grid friday"
msgid "F" msgid "F"
msgstr "ਸ਼ੁੱ" msgstr "ਸ਼ੁੱ"
#. Translators: Calendar grid abbreviation for Saturday #. Translators: Calendar grid abbreviation for Saturday
#: ../js/ui/calendar.js:129 #: ../js/ui/calendar.js:130
msgctxt "grid saturday" msgctxt "grid saturday"
msgid "S" msgid "S"
msgstr "ਸ਼" msgstr "ਸ਼"
@ -291,136 +290,136 @@ msgstr "ਸ਼"
#. * so they need to be unique (e.g. Tuesday and Thursday cannot #. * so they need to be unique (e.g. Tuesday and Thursday cannot
#. * both be 'T'). #. * both be 'T').
#. #.
#: ../js/ui/calendar.js:142 #: ../js/ui/calendar.js:143
msgctxt "list sunday" msgctxt "list sunday"
msgid "Su" msgid "Su"
msgstr "ਐ" msgstr "ਐ"
#. Translators: Event list abbreviation for Monday #. Translators: Event list abbreviation for Monday
#: ../js/ui/calendar.js:144 #: ../js/ui/calendar.js:145
msgctxt "list monday" msgctxt "list monday"
msgid "M" msgid "M"
msgstr "ਸੋ" msgstr "ਸੋ"
#. Translators: Event list abbreviation for Tuesday #. Translators: Event list abbreviation for Tuesday
#: ../js/ui/calendar.js:146 #: ../js/ui/calendar.js:147
msgctxt "list tuesday" msgctxt "list tuesday"
msgid "T" msgid "T"
msgstr "ਮੰ" msgstr "ਮੰ"
#. Translators: Event list abbreviation for Wednesday #. Translators: Event list abbreviation for Wednesday
#: ../js/ui/calendar.js:148 #: ../js/ui/calendar.js:149
msgctxt "list wednesday" msgctxt "list wednesday"
msgid "W" msgid "W"
msgstr "ਬੁੱ" msgstr "ਬੁੱ"
#. Translators: Event list abbreviation for Thursday #. Translators: Event list abbreviation for Thursday
#: ../js/ui/calendar.js:150 #: ../js/ui/calendar.js:151
msgctxt "list thursday" msgctxt "list thursday"
msgid "Th" msgid "Th"
msgstr "ਵੀ" msgstr "ਵੀ"
#. Translators: Event list abbreviation for Friday #. Translators: Event list abbreviation for Friday
#: ../js/ui/calendar.js:152 #: ../js/ui/calendar.js:153
msgctxt "list friday" msgctxt "list friday"
msgid "F" msgid "F"
msgstr "ਸ਼ੁੱ" msgstr "ਸ਼ੁੱ"
#. Translators: Event list abbreviation for Saturday #. Translators: Event list abbreviation for Saturday
#: ../js/ui/calendar.js:154 #: ../js/ui/calendar.js:155
msgctxt "list saturday" msgctxt "list saturday"
msgid "S" msgid "S"
msgstr "ਸ਼" msgstr "ਸ਼"
#. Translators: Text to show if there are no events #. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:701 #: ../js/ui/calendar.js:704
msgid "Nothing Scheduled" msgid "Nothing Scheduled"
msgstr "ਕੋਈ ਵੀ ਸੈਡਿਊਲ ਨਹੀਂ ਹੈ" msgstr "ਕੋਈ ਵੀ ਸੈਡਿਊਲ ਨਹੀਂ ਹੈ"
#. Translators: Shown on calendar heading when selected day occurs on current year #. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:717 #: ../js/ui/calendar.js:720
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d" msgid "%A, %B %d"
msgstr "%A, %d %B" msgstr "%A, %d %B"
#. Translators: Shown on calendar heading when selected day occurs on different year #. Translators: Shown on calendar heading when selected day occurs on different year
#: ../js/ui/calendar.js:720 #: ../js/ui/calendar.js:723
msgctxt "calendar heading" msgctxt "calendar heading"
msgid "%A, %B %d, %Y" msgid "%A, %B %d, %Y"
msgstr "%A, %d %B %Y" msgstr "%A, %d %B %Y"
#: ../js/ui/calendar.js:730 #: ../js/ui/calendar.js:733
msgid "Today" msgid "Today"
msgstr "ਅੱਜ" msgstr "ਅੱਜ"
#: ../js/ui/calendar.js:734 #: ../js/ui/calendar.js:737
msgid "Tomorrow" msgid "Tomorrow"
msgstr "ਭਲਕ" msgstr "ਭਲਕ"
#: ../js/ui/calendar.js:743 #: ../js/ui/calendar.js:746
msgid "This week" msgid "This week"
msgstr "ਇਹ ਹਫ਼ਤਾ" msgstr "ਇਹ ਹਫ਼ਤਾ"
#: ../js/ui/calendar.js:751 #: ../js/ui/calendar.js:754
msgid "Next week" msgid "Next week"
msgstr "ਹਫ਼ਤਾ ਅੱਗੇ" msgstr "ਹਫ਼ਤਾ ਅੱਗੇ"
#: ../js/ui/dash.js:174 #: ../js/ui/dash.js:174 ../js/ui/messageTray.js:933
msgid "Remove" msgid "Remove"
msgstr "ਹਟਾਓ" msgstr "ਹਟਾਓ"
#: ../js/ui/dateMenu.js:93 #: ../js/ui/dateMenu.js:91
msgid "Date and Time Settings" msgid "Date and Time Settings"
msgstr "ਮਿਤੀ ਤੇ ਸਮਾਂ ਸੈਟਿੰਗ" msgstr "ਮਿਤੀ ਤੇ ਸਮਾਂ ਸੈਟਿੰਗ"
#: ../js/ui/dateMenu.js:112 #: ../js/ui/dateMenu.js:111
msgid "Open Calendar" msgid "Open Calendar"
msgstr "ਕੈਲੰਡਰ ਖੋਲ੍ਹੋ" msgstr "ਕੈਲੰਡਰ ਖੋਲ੍ਹੋ"
#. Translators: This is the time format with date used #. Translators: This is the time format with date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:151 #: ../js/ui/dateMenu.js:164
msgid "%a %b %e, %R:%S" msgid "%a %b %e, %R:%S"
msgstr "%a, %e %b %R:%S" msgstr "%a, %e %b %R:%S"
#: ../js/ui/dateMenu.js:152 #: ../js/ui/dateMenu.js:165
msgid "%a %b %e, %R" msgid "%a %b %e, %R"
msgstr "%a %e %b, %R" msgstr "%a %e %b, %R"
#. Translators: This is the time format without date used #. Translators: This is the time format without date used
#. in 24-hour mode. #. in 24-hour mode.
#: ../js/ui/dateMenu.js:156 #: ../js/ui/dateMenu.js:169
msgid "%a %R:%S" msgid "%a %R:%S"
msgstr "%a %R:%S" msgstr "%a %R:%S"
#: ../js/ui/dateMenu.js:157 #: ../js/ui/dateMenu.js:170
msgid "%a %R" msgid "%a %R"
msgstr "%a %R" msgstr "%a %R"
#. Translators: This is a time format with date used #. Translators: This is a time format with date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:164 #: ../js/ui/dateMenu.js:177
msgid "%a %b %e, %l:%M:%S %p" msgid "%a %b %e, %l:%M:%S %p"
msgstr "%a %e %b, %l:%M:%S %p" msgstr "%a %e %b, %l:%M:%S %p"
#: ../js/ui/dateMenu.js:165 #: ../js/ui/dateMenu.js:178
msgid "%a %b %e, %l:%M %p" msgid "%a %b %e, %l:%M %p"
msgstr "%a %e %b, %l:%M %p" msgstr "%a %e %b, %l:%M %p"
#. Translators: This is a time format without date used #. Translators: This is a time format without date used
#. for AM/PM. #. for AM/PM.
#: ../js/ui/dateMenu.js:169 #: ../js/ui/dateMenu.js:182
msgid "%a %l:%M:%S %p" msgid "%a %l:%M:%S %p"
msgstr "%a %l:%M:%S %p" msgstr "%a %l:%M:%S %p"
#: ../js/ui/dateMenu.js:170 #: ../js/ui/dateMenu.js:183
msgid "%a %l:%M %p" msgid "%a %l:%M %p"
msgstr "%a %l:%M %p" msgstr "%a %l:%M %p"
#. Translators: This is the date format to use when the calendar popup is #. Translators: This is the date format to use when the calendar popup is
#. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM"). #. * shown - it is shown just below the time in the shell (e.g. "Tue 9:29 AM").
#. #.
#: ../js/ui/dateMenu.js:196 #: ../js/ui/dateMenu.js:209
msgid "%A %B %e, %Y" msgid "%A %B %e, %Y"
msgstr "%A, %e %B %Y" msgstr "%A, %e %B %Y"
@ -499,37 +498,41 @@ msgstr "ਪੁਸ਼ਟੀ"
msgid "Cancel" msgid "Cancel"
msgstr "ਰੱਦ ਕਰੋ" msgstr "ਰੱਦ ਕਰੋ"
#: ../js/ui/lookingGlass.js:587 #: ../js/ui/lookingGlass.js:588
msgid "No extensions installed" msgid "No extensions installed"
msgstr "ਕੋਈ ਇਕਸਟੈਨਸ਼ਨ ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ" msgstr "ਕੋਈ ਇਕਸਟੈਨਸ਼ਨ ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ"
#: ../js/ui/lookingGlass.js:624 #: ../js/ui/lookingGlass.js:625
msgid "Enabled" msgid "Enabled"
msgstr "ਚਾਲੂ ਹੈ" msgstr "ਚਾਲੂ ਹੈ"
#. translators: #. translators:
#. * The device has been disabled #. * The device has been disabled
#: ../js/ui/lookingGlass.js:626 ../src/gvc/gvc-mixer-control.c:1087 #: ../js/ui/lookingGlass.js:627 ../src/gvc/gvc-mixer-control.c:1087
msgid "Disabled" msgid "Disabled"
msgstr "ਬੰਦ ਹੈ" msgstr "ਬੰਦ ਹੈ"
#: ../js/ui/lookingGlass.js:628 #: ../js/ui/lookingGlass.js:629
msgid "Error" msgid "Error"
msgstr "ਗਲਤੀ" msgstr "ਗਲਤੀ"
#: ../js/ui/lookingGlass.js:630 #: ../js/ui/lookingGlass.js:631
msgid "Out of date" msgid "Out of date"
msgstr "ਪੁਰਾਣਾ" msgstr "ਪੁਰਾਣਾ"
#: ../js/ui/lookingGlass.js:655 #: ../js/ui/lookingGlass.js:656
msgid "View Source" msgid "View Source"
msgstr "ਸਰੋਤ ਵੇਖੋ" msgstr "ਸਰੋਤ ਵੇਖੋ"
#: ../js/ui/lookingGlass.js:661 #: ../js/ui/lookingGlass.js:662
msgid "Web Page" msgid "Web Page"
msgstr "ਵੈੱਬ ਪੇਜ਼" msgstr "ਵੈੱਬ ਪੇਜ਼"
#: ../js/ui/messageTray.js:1902 #: ../js/ui/messageTray.js:926
msgid "Open"
msgstr "ਖੋਲ੍ਹੋ"
#: ../js/ui/messageTray.js:1963
msgid "System Information" msgid "System Information"
msgstr "ਸਿਸਟਮ ਜਾਣਕਾਰੀ" msgstr "ਸਿਸਟਮ ਜਾਣਕਾਰੀ"
@ -545,18 +548,29 @@ msgstr "ਵਿੰਡੋ"
msgid "Applications" msgid "Applications"
msgstr "ਐਪਲੀਕੇਸ਼ਨ" msgstr "ਐਪਲੀਕੇਸ਼ਨ"
#. Translators: this is the name of the dock/favorites area on
#. the left of the overview
#: ../js/ui/overview.js:202
msgid "Dash"
msgstr "ਡੈਸ਼"
#. TODO - _quit() doesn't really work on apps in state STARTING yet #. TODO - _quit() doesn't really work on apps in state STARTING yet
#: ../js/ui/panel.js:537 #: ../js/ui/panel.js:532
#, c-format #, c-format
msgid "Quit %s" msgid "Quit %s"
msgstr "%s ਬੰਦ ਕਰੋ" msgstr "%s ਬੰਦ ਕਰੋ"
#. Button on the left side of the panel. #. Button on the left side of the panel.
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview". #. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
#: ../js/ui/panel.js:772 #: ../js/ui/panel.js:893
msgid "Activities" msgid "Activities"
msgstr "ਸਰਗਰਮੀਆਂ" msgstr "ਸਰਗਰਮੀਆਂ"
#: ../js/ui/panel.js:994
#| msgid "Cancel"
msgid "Panel"
msgstr "ਪੈਨਲ"
#: ../js/ui/placeDisplay.js:122 #: ../js/ui/placeDisplay.js:122
#, c-format #, c-format
msgid "Failed to unmount '%s'" msgid "Failed to unmount '%s'"
@ -579,7 +593,7 @@ msgstr "ਥਾਵਾਂ ਤੇ ਜੰਤਰ"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle #. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will #. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches. #. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:612 #: ../js/ui/popupMenu.js:618
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "toggle-switch-us" msgstr "toggle-switch-us"
@ -587,92 +601,91 @@ msgstr "toggle-switch-us"
msgid "Please enter a command:" msgid "Please enter a command:"
msgstr "ਕਮਾਂਡ ਦਿਓ ਜੀ:" msgstr "ਕਮਾਂਡ ਦਿਓ ਜੀ:"
#: ../js/ui/searchDisplay.js:295 #: ../js/ui/searchDisplay.js:283
msgid "Searching..." msgid "Searching..."
msgstr "ਖੋਜ ਜਾਰੀ ਹੈ..." msgstr "ਖੋਜ ਜਾਰੀ ਹੈ..."
#: ../js/ui/searchDisplay.js:309 #: ../js/ui/searchDisplay.js:297
msgid "No matching results." msgid "No matching results."
msgstr "ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ ਲੱਭਿਆ।" msgstr "ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ ਲੱਭਿਆ।"
#: ../js/ui/statusMenu.js:99 ../js/ui/statusMenu.js:163 #: ../js/ui/statusMenu.js:102 ../js/ui/statusMenu.js:166
msgid "Power Off..." msgid "Power Off..."
msgstr "...ਬੰਦ ਕਰੋ" msgstr "...ਬੰਦ ਕਰੋ"
#: ../js/ui/statusMenu.js:101 ../js/ui/statusMenu.js:162 #: ../js/ui/statusMenu.js:104 ../js/ui/statusMenu.js:165
#| msgid "Suspend..."
msgid "Suspend" msgid "Suspend"
msgstr "ਸਸਪੈਂਡ" msgstr "ਸਸਪੈਂਡ"
#: ../js/ui/statusMenu.js:122 #: ../js/ui/statusMenu.js:125
msgid "Available" msgid "Available"
msgstr "ਉਪਲੱਬਧ" msgstr "ਉਪਲੱਬਧ"
#: ../js/ui/statusMenu.js:127 #: ../js/ui/statusMenu.js:130
msgid "Busy" msgid "Busy"
msgstr "ਰੁਝਿਆ" msgstr "ਰੁਝਿਆ"
#: ../js/ui/statusMenu.js:135 #: ../js/ui/statusMenu.js:138
msgid "My Account" msgid "My Account"
msgstr "ਮੇਰਾ ਅਕਾਊਂਟ" msgstr "ਮੇਰਾ ਅਕਾਊਂਟ"
#: ../js/ui/statusMenu.js:139 #: ../js/ui/statusMenu.js:142
msgid "System Settings" msgid "System Settings"
msgstr "ਸਿਸਟਮ ਸੈਟਿੰਗ" msgstr "ਸਿਸਟਮ ਸੈਟਿੰਗ"
#: ../js/ui/statusMenu.js:146 #: ../js/ui/statusMenu.js:149
msgid "Lock Screen" msgid "Lock Screen"
msgstr "ਸਕਰੀਨ ਲਾਕ ਕਰੋ" msgstr "ਸਕਰੀਨ ਲਾਕ ਕਰੋ"
#: ../js/ui/statusMenu.js:150 #: ../js/ui/statusMenu.js:153
msgid "Switch User" msgid "Switch User"
msgstr "ਯੂਜ਼ਰ ਬਦਲੋ" msgstr "ਯੂਜ਼ਰ ਬਦਲੋ"
#: ../js/ui/statusMenu.js:155 #: ../js/ui/statusMenu.js:158
msgid "Log Out..." msgid "Log Out..."
msgstr "...ਲਾਗਆਉਟ" msgstr "...ਲਾਗਆਉਟ"
#: ../js/ui/status/accessibility.js:81 #: ../js/ui/status/accessibility.js:62
msgid "Zoom" msgid "Zoom"
msgstr "ਜ਼ੂਮ" msgstr "ਜ਼ੂਮ"
#: ../js/ui/status/accessibility.js:88 #: ../js/ui/status/accessibility.js:69
msgid "Screen Reader" msgid "Screen Reader"
msgstr "ਸਕਰੀਨ ਰੀਡਰ" msgstr "ਸਕਰੀਨ ਰੀਡਰ"
#: ../js/ui/status/accessibility.js:92 #: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard" msgid "Screen Keyboard"
msgstr "ਸਕਰੀਨ ਕੀਬੋਰਡ" msgstr "ਸਕਰੀਨ ਕੀਬੋਰਡ"
#: ../js/ui/status/accessibility.js:96 #: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts" msgid "Visual Alerts"
msgstr "ਦਿੱਖ ਚੇਤਾਵਨੀ" msgstr "ਦਿੱਖ ਚੇਤਾਵਨੀ"
#: ../js/ui/status/accessibility.js:99 #: ../js/ui/status/accessibility.js:80
msgid "Sticky Keys" msgid "Sticky Keys"
msgstr "ਸਟਿੱਕੀ ਸਵਿੱਚਾਂ" msgstr "ਸਟਿੱਕੀ ਸਵਿੱਚਾਂ"
#: ../js/ui/status/accessibility.js:102 #: ../js/ui/status/accessibility.js:83
msgid "Slow Keys" msgid "Slow Keys"
msgstr "ਹੌਲੀ ਸਵਿੱਚਾਂ" msgstr "ਹੌਲੀ ਸਵਿੱਚਾਂ"
#: ../js/ui/status/accessibility.js:105 #: ../js/ui/status/accessibility.js:86
msgid "Bounce Keys" msgid "Bounce Keys"
msgstr "ਬਾਊਂਸ ਸਵਿੱਚਾਂ" msgstr "ਬਾਊਂਸ ਸਵਿੱਚਾਂ"
#: ../js/ui/status/accessibility.js:108 #: ../js/ui/status/accessibility.js:89
msgid "Mouse Keys" msgid "Mouse Keys"
msgstr "ਮਾਊਸ ਸਵਿੱਚਾਂ" msgstr "ਮਾਊਸ ਸਵਿੱਚਾਂ"
#: ../js/ui/status/accessibility.js:112 #: ../js/ui/status/accessibility.js:93
msgid "Universal Access Settings" msgid "Universal Access Settings"
msgstr "ਯੂਨੀਵਰਸਲ ਅਸੈੱਸ ਸੈਟਿੰਗ" msgstr "ਯੂਨੀਵਰਸਲ ਅਸੈੱਸ ਸੈਟਿੰਗ"
#: ../js/ui/status/accessibility.js:164 #: ../js/ui/status/accessibility.js:145
msgid "High Contrast" msgid "High Contrast"
msgstr "ਵੱਧ ਕਨਟਰਾਸਟ" msgstr "ਵੱਧ ਕਨਟਰਾਸਟ"
#: ../js/ui/status/accessibility.js:209 #: ../js/ui/status/accessibility.js:182
msgid "Large Text" msgid "Large Text"
msgstr "ਵੱਡੇ ਅੱਖਰ" msgstr "ਵੱਡੇ ਅੱਖਰ"
@ -801,7 +814,13 @@ msgstr "ਲੋਕਲਾਈਜ਼ੇਸ਼ਨ ਸੈਟਿੰਗ"
msgid "Power Settings" msgid "Power Settings"
msgstr "ਪਾਵਰ ਸੈਟਿੰਗ" msgstr "ਪਾਵਰ ਸੈਟਿੰਗ"
#: ../js/ui/status/power.js:112 #. 0 is reported when UPower does not have enough data
#. to estimate battery life
#: ../js/ui/status/power.js:110
msgid "Estimating..."
msgstr "...ਅਨੁਮਾਨ ਲਾਇਆ ਜਾ ਰਿਹਾ ਹੈ"
#: ../js/ui/status/power.js:117
#, c-format #, c-format
msgid "%d hour remaining" msgid "%d hour remaining"
msgid_plural "%d hours remaining" msgid_plural "%d hours remaining"
@ -809,75 +828,75 @@ msgstr[0] "%d ਘੰਟਾ ਬਾਕੀ"
msgstr[1] "%d ਘੰਟੇ ਬਾਕੀ" msgstr[1] "%d ਘੰਟੇ ਬਾਕੀ"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining" #. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:115 #: ../js/ui/status/power.js:120
#, c-format #, c-format
msgid "%d %s %d %s remaining" msgid "%d %s %d %s remaining"
msgstr "%d %s %d %s ਬਾਕੀ" msgstr "%d %s %d %s ਬਾਕੀ"
#: ../js/ui/status/power.js:117 #: ../js/ui/status/power.js:122
msgid "hour" msgid "hour"
msgid_plural "hours" msgid_plural "hours"
msgstr[0] "ਘੰਟਾ" msgstr[0] "ਘੰਟਾ"
msgstr[1] "ਘੰਟੇ" msgstr[1] "ਘੰਟੇ"
#: ../js/ui/status/power.js:117 #: ../js/ui/status/power.js:122
msgid "minute" msgid "minute"
msgid_plural "minutes" msgid_plural "minutes"
msgstr[0] "ਮਿੰਟ" msgstr[0] "ਮਿੰਟ"
msgstr[1] "ਮਿੰਟ" msgstr[1] "ਮਿੰਟ"
#: ../js/ui/status/power.js:120 #: ../js/ui/status/power.js:125
#, c-format #, c-format
msgid "%d minute remaining" msgid "%d minute remaining"
msgid_plural "%d minutes remaining" msgid_plural "%d minutes remaining"
msgstr[0] "%d ਮਿੰਟ ਬਾਕੀ" msgstr[0] "%d ਮਿੰਟ ਬਾਕੀ"
msgstr[1] "%d ਮਿੰਟ ਬਾਕੀ" msgstr[1] "%d ਮਿੰਟ ਬਾਕੀ"
#: ../js/ui/status/power.js:235 #: ../js/ui/status/power.js:227
msgid "AC adapter" msgid "AC adapter"
msgstr "AC ਐਡਪਟਰ" msgstr "AC ਐਡਪਟਰ"
#: ../js/ui/status/power.js:237 #: ../js/ui/status/power.js:229
msgid "Laptop battery" msgid "Laptop battery"
msgstr "ਲੈਪਟਾਪ ਬੈਟਰੀ" msgstr "ਲੈਪਟਾਪ ਬੈਟਰੀ"
#: ../js/ui/status/power.js:239 #: ../js/ui/status/power.js:231
msgid "UPS" msgid "UPS"
msgstr "UPS" msgstr "UPS"
#: ../js/ui/status/power.js:241 #: ../js/ui/status/power.js:233
msgid "Monitor" msgid "Monitor"
msgstr "ਮਾਨੀਟਰ" msgstr "ਮਾਨੀਟਰ"
#: ../js/ui/status/power.js:243 #: ../js/ui/status/power.js:235
msgid "Mouse" msgid "Mouse"
msgstr "ਮਾਊਸ" msgstr "ਮਾਊਸ"
#: ../js/ui/status/power.js:245 #: ../js/ui/status/power.js:237
msgid "Keyboard" msgid "Keyboard"
msgstr "ਕੀਬੋਰਡ" msgstr "ਕੀਬੋਰਡ"
#: ../js/ui/status/power.js:247 #: ../js/ui/status/power.js:239
msgid "PDA" msgid "PDA"
msgstr "PDA" msgstr "PDA"
#: ../js/ui/status/power.js:249 #: ../js/ui/status/power.js:241
msgid "Cell phone" msgid "Cell phone"
msgstr "ਸੈੱਲ ਫੋਨ" msgstr "ਸੈੱਲ ਫੋਨ"
#: ../js/ui/status/power.js:251 #: ../js/ui/status/power.js:243
msgid "Media player" msgid "Media player"
msgstr "ਮੀਡਿਆ ਪਲੇਅਰ" msgstr "ਮੀਡਿਆ ਪਲੇਅਰ"
#: ../js/ui/status/power.js:253 #: ../js/ui/status/power.js:245
msgid "Tablet" msgid "Tablet"
msgstr "ਟੇਬਲੇਟ" msgstr "ਟੇਬਲੇਟ"
#: ../js/ui/status/power.js:255 #: ../js/ui/status/power.js:247
msgid "Computer" msgid "Computer"
msgstr "ਕੰਪਿਊਟਰ" msgstr "ਕੰਪਿਊਟਰ"
#: ../js/ui/status/power.js:257 ../src/shell-app-system.c:1013 #: ../js/ui/status/power.js:249 ../src/shell-app-system.c:1013
msgid "Unknown" msgid "Unknown"
msgstr "ਅਣਜਾਣ" msgstr "ਅਣਜਾਣ"
@ -889,22 +908,22 @@ msgstr "ਆਵਾਜ਼"
msgid "Microphone" msgid "Microphone"
msgstr "ਮਾਈਕਰੋਫੋਨ" msgstr "ਮਾਈਕਰੋਫੋਨ"
#: ../js/ui/telepathyClient.js:240 #: ../js/ui/telepathyClient.js:239
#, c-format #, c-format
msgid "%s is online." msgid "%s is online."
msgstr "%s ਆਨਲਾਈਨ ਹੈ।" msgstr "%s ਆਨਲਾਈਨ ਹੈ।"
#: ../js/ui/telepathyClient.js:245 #: ../js/ui/telepathyClient.js:244
#, c-format #, c-format
msgid "%s is offline." msgid "%s is offline."
msgstr "%s ਆਫਲਾਈਨ ਹੈ।" msgstr "%s ਆਫਲਾਈਨ ਹੈ।"
#: ../js/ui/telepathyClient.js:248 #: ../js/ui/telepathyClient.js:247
#, c-format #, c-format
msgid "%s is away." msgid "%s is away."
msgstr "%s ਦੂਰ ਹੈ।" msgstr "%s ਦੂਰ ਹੈ।"
#: ../js/ui/telepathyClient.js:251 #: ../js/ui/telepathyClient.js:250
#, c-format #, c-format
msgid "%s is busy." msgid "%s is busy."
msgstr "%s ਰੁੱਝਿਆ/ਰੁੱਝੀ ਹੈ।" msgstr "%s ਰੁੱਝਿਆ/ਰੁੱਝੀ ਹੈ।"
@ -912,7 +931,7 @@ msgstr "%s ਰੁੱਝਿਆ/ਰੁੱਝੀ ਹੈ।"
#. Translators: this is a time format string followed by a date. #. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your #. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds. #. locale, without seconds.
#: ../js/ui/telepathyClient.js:349 #: ../js/ui/telepathyClient.js:348
#, no-c-format #, no-c-format
msgid "Sent at %X on %A" msgid "Sent at %X on %A"
msgstr "%2$A ਨੂੰ %1$X ਵਜੇ ਭੇਜਿਆ" msgstr "%2$A ਨੂੰ %1$X ਵਜੇ ਭੇਜਿਆ"
@ -920,17 +939,21 @@ msgstr "%2$A ਨੂੰ %1$X ਵਜੇ ਭੇਜਿਆ"
#. Translators: this is the text displayed #. Translators: this is the text displayed
#. in the search entry when no search is #. in the search entry when no search is
#. active; it should not exceed ~30 #. active; it should not exceed ~30
#. characters #. characters.
#: ../js/ui/viewSelector.js:30 #: ../js/ui/viewSelector.js:117
msgid "Type to search..." msgid "Type to search..."
msgstr "...ਲੱਭਣ ਲਈ ਲਿਖੋ" msgstr "...ਲੱਭਣ ਲਈ ਲਿਖੋ"
#: ../js/ui/windowAttentionHandler.js:43 #: ../js/ui/viewSelector.js:137 ../src/shell-util.c:250
msgid "Search"
msgstr "ਖੋਜ"
#: ../js/ui/windowAttentionHandler.js:42
#, c-format #, c-format
msgid "%s has finished starting" msgid "%s has finished starting"
msgstr "%s ਸ਼ੁਰੂ ਹੋਣਾ ਖਤਮ ਹੋਇਆ" msgstr "%s ਸ਼ੁਰੂ ਹੋਣਾ ਖਤਮ ਹੋਇਆ"
#: ../js/ui/windowAttentionHandler.js:45 #: ../js/ui/windowAttentionHandler.js:44
#, c-format #, c-format
msgid "'%s' is ready" msgid "'%s' is ready"
msgstr "'%s' ਤਿਆਰ ਹੈ" msgstr "'%s' ਤਿਆਰ ਹੈ"
@ -957,32 +980,32 @@ msgstr[1] "%u ਇੰਪੁੱਟ"
msgid "System Sounds" msgid "System Sounds"
msgstr "ਸਿਸਟਮ ਸਾਊਂਡ" msgstr "ਸਿਸਟਮ ਸਾਊਂਡ"
#: ../src/shell-global.c:1363 #: ../src/shell-global.c:1298
msgid "Less than a minute ago" msgid "Less than a minute ago"
msgstr "ਇੱਕ ਮਿੰਟ ਤੋਂ ਘੱਟ ਚਿਰ ਪਹਿਲਾਂ" msgstr "ਇੱਕ ਮਿੰਟ ਤੋਂ ਘੱਟ ਚਿਰ ਪਹਿਲਾਂ"
#: ../src/shell-global.c:1367 #: ../src/shell-global.c:1302
#, c-format #, c-format
msgid "%d minute ago" msgid "%d minute ago"
msgid_plural "%d minutes ago" msgid_plural "%d minutes ago"
msgstr[0] "%d ਮਿੰਟ ਪਹਿਲਾਂ" msgstr[0] "%d ਮਿੰਟ ਪਹਿਲਾਂ"
msgstr[1] "%d ਮਿੰਟ ਪਹਿਲਾਂ" msgstr[1] "%d ਮਿੰਟ ਪਹਿਲਾਂ"
#: ../src/shell-global.c:1372 #: ../src/shell-global.c:1307
#, c-format #, c-format
msgid "%d hour ago" msgid "%d hour ago"
msgid_plural "%d hours ago" msgid_plural "%d hours ago"
msgstr[0] "%d ਘੰਟਾ ਪਹਿਲਾਂ" msgstr[0] "%d ਘੰਟਾ ਪਹਿਲਾਂ"
msgstr[1] "%d ਘੰਟੇ ਪਹਿਲਾਂ" msgstr[1] "%d ਘੰਟੇ ਪਹਿਲਾਂ"
#: ../src/shell-global.c:1377 #: ../src/shell-global.c:1312
#, c-format #, c-format
msgid "%d day ago" msgid "%d day ago"
msgid_plural "%d days ago" msgid_plural "%d days ago"
msgstr[0] "%d ਦਿਨ ਪਹਿਲਾਂ" msgstr[0] "%d ਦਿਨ ਪਹਿਲਾਂ"
msgstr[1] "%d ਦਿਨ ਪਹਿਲਾਂ" msgstr[1] "%d ਦਿਨ ਪਹਿਲਾਂ"
#: ../src/shell-global.c:1382 #: ../src/shell-global.c:1317
#, c-format #, c-format
msgid "%d week ago" msgid "%d week ago"
msgid_plural "%d weeks ago" msgid_plural "%d weeks ago"
@ -990,8 +1013,9 @@ msgstr[0] "%d ਹਫ਼ਤਾ ਪਹਿਲਾਂ"
msgstr[1] "%d ਹਫ਼ਤੇ ਪਹਿਲਾਂ" msgstr[1] "%d ਹਫ਼ਤੇ ਪਹਿਲਾਂ"
#: ../src/shell-polkit-authentication-agent.c:334 #: ../src/shell-polkit-authentication-agent.c:334
msgid "Authentation dialog was dismissed by the user" #| msgid "Authentation dialog was dismissed by the user"
msgstr "ਪਰਮਾਣਕਿਤਾ ਡਾਈਲਾਗ ਯੂਜ਼ਰ ਨੇ ਰੱਦ ਕੀਤਾ" msgid "Authentication dialog was dismissed by the user"
msgstr "ਪਰਮਾਣਕਿਤਾ ਡਾਈਲਾਗ ਯੂਜ਼ਰ ਵਲੋਂ ਰੱਦ ਕੀਤਾ"
#: ../src/shell-util.c:89 #: ../src/shell-util.c:89
msgid "Home Folder" msgid "Home Folder"
@ -1003,10 +1027,6 @@ msgstr "ਘਰ ਫੋਲਡਰ"
msgid "File System" msgid "File System"
msgstr "ਫਾਇਲ ਸਿਸਟਮ" msgstr "ਫਾਇਲ ਸਿਸਟਮ"
#: ../src/shell-util.c:250
msgid "Search"
msgstr "ਖੋਜ"
#. Translators: the first string is the name of a gvfs #. Translators: the first string is the name of a gvfs
#. * method, and the second string is a path. For #. * method, and the second string is a path. For
#. * example, "Trash: some-directory". It means that the #. * example, "Trash: some-directory". It means that the
@ -1017,6 +1037,9 @@ msgstr "ਖੋਜ"
msgid "%1$s: %2$s" msgid "%1$s: %2$s"
msgstr "%1$s: %2$s" msgstr "%1$s: %2$s"
#~ msgid "PREFERENCES"
#~ msgstr "ਪਸੰਦ"
#~ msgid "Clip the crosshairs at the center" #~ msgid "Clip the crosshairs at the center"
#~ msgstr "ਸੈਂਟਰ ਉੱਤੇ ਕਰਾਂਸਹੇਅਰ ਕਲਿੱਪ ਕਰੋ" #~ msgstr "ਸੈਂਟਰ ਉੱਤੇ ਕਰਾਂਸਹੇਅਰ ਕਲਿੱਪ ਕਰੋ"

992
po/pl.po

File diff suppressed because it is too large Load Diff

425
po/sl.po

File diff suppressed because it is too large Load Diff

View File

@ -522,8 +522,9 @@ msgstr "PLACES & DEVICES"
#. switches containing "◯" and "|"). Other values will #. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches. #. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:33 #: ../js/ui/popupMenu.js:33
#, fuzzy
msgid "toggle-switch-us" msgid "toggle-switch-us"
msgstr "முறைமை-மாற்றி-யூஎஸ்" msgstr "toggle-switch-us"
#: ../js/ui/runDialog.js:233 #: ../js/ui/runDialog.js:233
msgid "Please enter a command:" msgid "Please enter a command:"
@ -718,39 +719,3 @@ msgstr "தேடு"
msgid "%1$s: %2$s" msgid "%1$s: %2$s"
msgstr "%1$s: %2$s" msgstr "%1$s: %2$s"
#~ msgid "Overview workspace view mode"
#~ msgstr "பணி இட மேல்பார்வை காட்சிப் பாங்கு."
#~ msgid ""
#~ "The selected workspace view mode in the overview. Supported values are "
#~ "\"single\" and \"grid\"."
#~ msgstr ""
#~ "மேல்பார்வையில் தேர்ந்தெடுத்த பணீட காட்சி பாங்கு. ஆதரவுள்ள மதிப்புகள் 'ஒன்று' மற்றும் "
#~ "'வலை'"
#~ msgid "Drag here to add favorites"
#~ msgstr "விருப்பங்களுக்கு சேர்க்க இங்கு இழுத்துவிடு"
#~ msgid "Find"
#~ msgstr "தேடு"
#~ msgid "Searching..."
#~ msgstr "தேடுகிறது..."
#~ msgid "No matching results."
#~ msgstr "பொருத்தமான விடைகள் இல்லை"
#~ msgid "ON"
#~ msgstr "இயக்கத்தில்"
#~ msgid "OFF"
#~ msgstr "செயல் நீக்கு"
#~ msgid "Invisible"
#~ msgstr "பார்க்கமுடியாதது"
#~ msgid "Account Information..."
#~ msgstr "கணக்கு தகவல்..."
#~ msgid "System Preferences..."
#~ msgstr "கணினி முன்னுரிமைகள்..."

1022
po/vi.po

File diff suppressed because it is too large Load Diff

View File

@ -4,7 +4,10 @@ service_in_files = calendar-server/org.gnome.Shell.CalendarServer.service.in
service_DATA = $(service_in_files:.service.in=.service) service_DATA = $(service_in_files:.service.in=.service)
$(service_DATA): $(service_in_files) Makefile $(service_DATA): $(service_in_files) Makefile
@sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@.tmp && mv $@.tmp $@ $(AM_V_GEN) \
[ -d $(@D) ] || $(mkdir_p) $(@D) ; \
sed -e "s|\@libexecdir\@|$(libexecdir)|" $< > $@.tmp && mv $@.tmp $@
CLEANFILES += $(service_DATA)
libexec_PROGRAMS += gnome-shell-calendar-server libexec_PROGRAMS += gnome-shell-calendar-server

View File

@ -48,4 +48,5 @@ Gvc_1_0_gir_INCLUDES = GObject-2.0
Gvc_1_0_gir_CFLAGS = $(INCLUDES) -I$(srcdir)/gvc -DWITH_INTROSPECTION Gvc_1_0_gir_CFLAGS = $(INCLUDES) -I$(srcdir)/gvc -DWITH_INTROSPECTION
Gvc_1_0_gir_LIBS = libgvc.la Gvc_1_0_gir_LIBS = libgvc.la
Gvc_1_0_gir_FILES = $(addprefix $(srcdir)/,$(libgvc_la_gir_sources)) Gvc_1_0_gir_FILES = $(addprefix $(srcdir)/,$(libgvc_la_gir_sources))
INTROSPECTION_GIRS += Gvc-1.0.gir INTROSPECTION_GIRS += Gvc-1.0.gir
CLEANFILES += Gvc-1.0.gir

View File

@ -10,17 +10,31 @@ noinst_PROGRAMS =
-include $(INTROSPECTION_MAKEFILE) -include $(INTROSPECTION_MAKEFILE)
INTROSPECTION_GIRS = INTROSPECTION_GIRS =
INTROSPECTION_SCANNER_ARGS = --warn-all --warn-error --add-include-path=$(srcdir) INTROSPECTION_SCANNER_ARGS = --warn-all --warn-error --add-include-path=$(srcdir)
INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir) --includedir=$(MUTTER_LIB_DIR)/mutter/ INTROSPECTION_COMPILER_ARGS = --includedir=$(srcdir) --includedir=$(MUTTER_TYPELIB_DIR)
typelibdir = $(pkglibdir) typelibdir = $(pkglibdir)
typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib) typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
CLEANFILES += $(gir_DATA) $(typelib_DATA) CLEANFILES += $(gir_DATA) $(typelib_DATA)
generated_bin_scripts = gnome-shell-installed gnome-shell-jhbuild gnome-shell-extension-tool bin_SCRIPTS += gnome-shell-extension-tool
bin_SCRIPTS += gnome-shell $(generated_bin_scripts) bin_PROGRAMS = gnome-shell-real
generated_script_substitutions = -e "s|@MUTTER_BIN_DIR[@]|$(MUTTER_BIN_DIR)|" \ if USE_JHBUILD_WRAPPER_SCRIPT
gnome_shell = gnome-shell-jhbuild
bin_SCRIPTS += gnome-shell-jhbuild
else
gnome_shell = gnome-shell-real
endif
noinst_DATA = gnome-shell
gnome-shell: $(gnome_shell) Makefile
cp $< $@.tmp && mv $@.tmp $@
install-exec-hook:
mv $(DESTDIR)$(bindir)/$(gnome_shell) $(DESTDIR)$(bindir)/gnome-shell
generated_script_substitutions = \
-e "s|@bindir[@]|$(bindir)|" \
-e "s|@datadir[@]|$(datadir)|" \ -e "s|@datadir[@]|$(datadir)|" \
-e "s|@libexecdir[@]|$(libexecdir)|" \ -e "s|@libexecdir[@]|$(libexecdir)|" \
-e "s|@libdir[@]|$(libdir)|" \ -e "s|@libdir[@]|$(libdir)|" \
@ -33,22 +47,11 @@ generated_script_substitutions = -e "s|@MUTTER_BIN_DIR[@]|$(MUTTER_BIN_DIR)|" \
gnome-shell-jhbuild: gnome-shell-jhbuild.in Makefile gnome-shell-jhbuild: gnome-shell-jhbuild.in Makefile
$(AM_V_GEN) sed $(generated_script_substitutions) $< > $@.tmp && mv $@.tmp $@ && chmod a+x $@ $(AM_V_GEN) sed $(generated_script_substitutions) $< > $@.tmp && mv $@.tmp $@ && chmod a+x $@
gnome-shell-installed: gnome-shell-installed.in Makefile
$(AM_V_GEN) sed $(generated_script_substitutions) $< > $@.tmp && mv $@.tmp $@ && chmod a+x $@
gnome-shell-extension-tool: gnome-shell-extension-tool.in Makefile gnome-shell-extension-tool: gnome-shell-extension-tool.in Makefile
$(AM_V_GEN) sed $(generated_script_substitutions) $< > $@.tmp && mv $@.tmp $@ && chmod a+x $@ $(AM_V_GEN) sed $(generated_script_substitutions) $< > $@.tmp && mv $@.tmp $@ && chmod a+x $@
if USE_JHBUILD_WRAPPER_SCRIPT CLEANFILES += gnome-shell $(bin_SCRIPTS)
gnome-shell: gnome-shell-jhbuild Makefile EXTRA_DIST += $(bin_SCRIPTS:=.in)
cp $< $@.tmp && mv $@.tmp $@
else
gnome-shell: gnome-shell-installed Makefile
cp $< $@.tmp && mv $@.tmp $@
endif
CLEANFILES += gnome-shell $(generated_bin_scripts)
EXTRA_DIST += $(generated_bin_scripts:=.in)
include Makefile-gdmuser.am include Makefile-gdmuser.am
include Makefile-st.am include Makefile-st.am
@ -57,17 +60,17 @@ include Makefile-gvc.am
include Makefile-calendar-server.am include Makefile-calendar-server.am
gnome_shell_cflags = \ gnome_shell_cflags = \
$(MUTTER_PLUGIN_CFLAGS) \ $(GNOME_SHELL_CFLAGS) \
$(LIBGNOMEUI_CFLAGS) \
-I$(srcdir)/tray \ -I$(srcdir)/tray \
-DVERSION=\"$(VERSION)\" \
-DLOCALEDIR=\"$(datadir)/locale\" \ -DLOCALEDIR=\"$(datadir)/locale\" \
-DGNOME_SHELL_LIBEXECDIR=\"$(libexecdir)\" \ -DGNOME_SHELL_LIBEXECDIR=\"$(libexecdir)\" \
-DGNOME_SHELL_DATADIR=\"$(pkgdatadir)\" \ -DGNOME_SHELL_DATADIR=\"$(pkgdatadir)\" \
-DGNOME_SHELL_PKGLIBDIR=\"$(pkglibdir)\" \ -DGNOME_SHELL_PKGLIBDIR=\"$(pkglibdir)\" \
-DJSDIR=\"$(pkgdatadir)/js\" -DJSDIR=\"$(pkgdatadir)/js\"
plugindir = $(MUTTER_PLUGIN_DIR) privlibdir = $(pkglibdir)
plugin_LTLIBRARIES = libgnome-shell.la privlib_LTLIBRARIES = libgnome-shell.la
shell_built_sources = \ shell_built_sources = \
shell-marshal.h \ shell-marshal.h \
@ -134,6 +137,12 @@ libgnome_shell_la_SOURCES = \
libgnome_shell_la_gir_sources = \ libgnome_shell_la_gir_sources = \
$(filter-out %-private.h $(shell_recorder_non_gir_sources), $(shell_public_headers_h) $(libgnome_shell_la_SOURCES)) $(filter-out %-private.h $(shell_recorder_non_gir_sources), $(shell_public_headers_h) $(libgnome_shell_la_SOURCES))
gnome_shell_real_SOURCES = \
main.c
gnome_shell_real_CPPFLAGS = $(gnome_shell_cflags)
gnome_shell_real_LDADD = libgnome-shell.la $(libgnome_shell_la_LIBADD)
gnome_shell_real_DEPENDENCIES = libgnome-shell.la
######################################## ########################################
shell_recorder_sources = \ shell_recorder_sources = \
@ -216,9 +225,9 @@ stamp-shell-enum-types.h: $(srcdir)/shell-enum-types.h.in $(shell_public_headers
$(AM_V_GEN) ( cd $(srcdir) && \ $(AM_V_GEN) ( cd $(srcdir) && \
$(GLIB_MKENUMS) \ $(GLIB_MKENUMS) \
--template $< \ --template $< \
$(shell_public_headers_h) ) > $@.tmp && \ $(shell_public_headers_h) ) > $(@F).tmp && \
(cmp -s $@.tmp shell-enum-types.h || mv $@.tmp shell-enum-types.h) && \ (cmp -s $(@F).tmp shell-enum-types.h || mv $(@F).tmp shell-enum-types.h) && \
rm -f $@.tmp && \ rm -f $(@F).tmp && \
echo timestamp > $(@F) echo timestamp > $(@F)
EXTRA_DIST += shell-enum-types.h.in EXTRA_DIST += shell-enum-types.h.in
CLEANFILES += stamp-shell-enum-types.h CLEANFILES += stamp-shell-enum-types.h
@ -227,16 +236,15 @@ shell-enum-types.c: shell-enum-types.c.in stamp-shell-enum-types.h
$(AM_V_GEN) ( cd $(srcdir) && \ $(AM_V_GEN) ( cd $(srcdir) && \
$(GLIB_MKENUMS) \ $(GLIB_MKENUMS) \
--template $< \ --template $< \
$(shell_public_headers_h) ) > $@.tmp && \ $(shell_public_headers_h) ) > $(@F).tmp && \
mv $@.tmp $@ && \ mv $(@F).tmp $(@F) && \
rm -f $@.tmp rm -f $(@F).tmp
EXTRA_DIST += shell-enum-types.c.in EXTRA_DIST += shell-enum-types.c.in
libgnome_shell_la_LDFLAGS = -avoid-version -module libgnome_shell_la_LDFLAGS = -avoid-version
libgnome_shell_la_LIBADD = \ libgnome_shell_la_LIBADD = \
-lm \ -lm \
$(MUTTER_PLUGIN_LIBS) \ $(GNOME_SHELL_LIBS) \
$(LIBGNOMEUI_LIBS) \
$(BLUETOOTH_LIBS) \ $(BLUETOOTH_LIBS) \
libst-1.0.la \ libst-1.0.la \
libgdmuser-1.0.la \ libgdmuser-1.0.la \
@ -244,7 +252,7 @@ libgnome_shell_la_LIBADD = \
libgvc.la \ libgvc.la \
$(NULL) $(NULL)
libgnome_shell_la_CPPFLAGS = $(gnome_shell_cflags) $(LIBECAL_CFLAGS) libgnome_shell_la_CPPFLAGS = $(gnome_shell_cflags)
Shell-0.1.gir: libgnome-shell.la St-1.0.gir Shell-0.1.gir: libgnome-shell.la St-1.0.gir
Shell_0_1_gir_INCLUDES = Clutter-1.0 ClutterX11-1.0 Meta-2.91 TelepathyGLib-0.12 Shell_0_1_gir_INCLUDES = Clutter-1.0 ClutterX11-1.0 Meta-2.91 TelepathyGLib-0.12
@ -252,10 +260,9 @@ Shell_0_1_gir_CFLAGS = $(libgnome_shell_la_CPPFLAGS) -I $(srcdir)
Shell_0_1_gir_LIBS = libgnome-shell.la Shell_0_1_gir_LIBS = libgnome-shell.la
Shell_0_1_gir_FILES = $(addprefix $(srcdir)/,$(libgnome_shell_la_gir_sources)) Shell_0_1_gir_FILES = $(addprefix $(srcdir)/,$(libgnome_shell_la_gir_sources))
Shell_0_1_gir_SCANNERFLAGS = --include-uninstalled=$(builddir)/St-1.0.gir \ Shell_0_1_gir_SCANNERFLAGS = --include-uninstalled=$(builddir)/St-1.0.gir \
--add-include-path=$(MUTTER_LIB_DIR)/mutter/ \ --add-include-path=$(MUTTER_GIR_DIR)
--program=mutter \
--program-arg=--mutter-plugins=`pwd`/libgnome-shell.la
INTROSPECTION_GIRS += Shell-0.1.gir INTROSPECTION_GIRS += Shell-0.1.gir
CLEANFILES += Shell-0.1.gir
St-1.0.gir: libst-1.0.la St-1.0.gir: libst-1.0.la
St_1_0_gir_INCLUDES = Clutter-1.0 Gtk-3.0 St_1_0_gir_INCLUDES = Clutter-1.0 Gtk-3.0
@ -264,6 +271,7 @@ St_1_0_gir_LIBS = libst-1.0.la
St_1_0_gir_FILES = $(filter-out %-private.h $(st_non_gir_sources), $(addprefix $(srcdir)/,$(st_source_h))) \ St_1_0_gir_FILES = $(filter-out %-private.h $(st_non_gir_sources), $(addprefix $(srcdir)/,$(st_source_h))) \
$(addprefix $(srcdir)/,$(st_source_c)) $(addprefix $(srcdir)/,$(st_source_c))
INTROSPECTION_GIRS += St-1.0.gir INTROSPECTION_GIRS += St-1.0.gir
CLEANFILES += St-1.0.gir
Gdm-1.0.gir: libgdmuser-1.0.la Gdm-1.0.gir: libgdmuser-1.0.la
Gdm_1_0_gir_INCLUDES = GObject-2.0 GdkPixbuf-2.0 Gdm_1_0_gir_INCLUDES = GObject-2.0 GdkPixbuf-2.0
@ -272,3 +280,4 @@ Gdm_1_0_gir_LIBS = libgdmuser-1.0.la
Gdm_1_0_gir_FILES = $(filter-out %-private.h, $(addprefix $(srcdir)/,$(gdmuser_source_h))) \ Gdm_1_0_gir_FILES = $(filter-out %-private.h, $(addprefix $(srcdir)/,$(gdmuser_source_h))) \
$(addprefix $(srcdir)/,$(gdmuser_source_c)) $(addprefix $(srcdir)/,$(gdmuser_source_c))
INTROSPECTION_GIRS += Gdm-1.0.gir INTROSPECTION_GIRS += Gdm-1.0.gir
CLEANFILES += Gdm-1.0.gir

View File

@ -1,41 +0,0 @@
#!/bin/bash
# gnome-shell is a plugin for mutter; start mutter with the right
# options.
# About the value of NO_GAIL and NO_AT_BRIDGE: If a11y is enabled,
# gtk_init() will normally load gail and at-bridge. But we don't
# want at-bridge to be loaded until after clutter is initialized
# (which mutter does after initializing gtk) and we don't want
# gail to be loaded at all. So set these flags. shell_a11y_init()
# will clear them so they don't get passed to gnome-shell's
# children.
export NO_GAIL=1
export NO_AT_BRIDGE=1
# FIXME - Add gjs API to set this stuff and don't depend on the
# environment. These propagate to child processes.
export GJS_DEBUG_OUTPUT='stderr'
# By default only let gjs show errors and things that are explicitly
# logged via log() from javascript
export GJS_DEBUG_TOPICS='JS ERROR;JS LOG'
if test -z "$MUTTER_PLUGINS"; then
MUTTER_PLUGINS=libgnome-shell
fi
# Work around Ubuntu xulrunner bug,
# http://bugzilla.gnome.org/show_bug.cgi?id=573413
if test x@ENABLE_DYNAMIC_MOZJS_HACK@ = xyes; then
sdkdir=$(pkg-config --variable=sdkdir mozilla-js)
if test -n "${sdkdir}"; then
mozjs_libdir=$(echo "$sdkdir" | sed -e s,'-\(sdk\|devel\)',,)
if test -n "$LD_LIBRARY_PATH"; then
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$mozjs_libdir
else
LD_LIBRARY_PATH=$mozjs_libdir
fi
export LD_LIBRARY_PATH
fi
fi
exec mutter --mutter-plugins=$MUTTER_PLUGINS "$@"

View File

@ -143,17 +143,15 @@ def start_dconf_await_service():
loop.run() loop.run()
def start_shell(perf_output=None): def start_shell(perf_output=None):
bin_dir = os.path.dirname(os.path.abspath(sys.argv[0])) self_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
if os.path.exists(os.path.join(bin_dir, 'gnome-shell-jhbuild.in')): if os.path.exists(os.path.join(self_dir, 'gnome-shell-jhbuild.in')):
running_from_source_tree = True running_from_source_tree = True
top_dir = os.path.dirname(bin_dir) top_dir = os.path.dirname(self_dir)
plugin = os.path.join(top_dir, 'src', 'libgnome-shell.la')
typelib_dir = os.path.join(top_dir, "src") typelib_dir = os.path.join(top_dir, "src")
js_dir = os.path.join(top_dir, "js") js_dir = os.path.join(top_dir, "js")
data_dir = os.path.join(top_dir, "data") data_dir = os.path.join(top_dir, "data")
else: else:
running_from_source_tree = False running_from_source_tree = False
plugin = 'libgnome-shell'
js_dir = os.path.join('@pkgdatadir@', 'js') js_dir = os.path.join('@pkgdatadir@', 'js')
# Set up environment # Set up environment
@ -166,13 +164,13 @@ def start_shell(perf_output=None):
# below. Otherwise it's just a bad reimplementation of "jhbuild # below. Otherwise it's just a bad reimplementation of "jhbuild
# run". See bug #642084 # run". See bug #642084
env.update({'GNOME_SHELL_JS' : js_dir, env.update({'GNOME_SHELL_JS' : js_dir,
'PATH' : '@MUTTER_BIN_DIR@:' + os.environ.get('PATH', ''), 'PATH' : '@bindir@:' + os.environ.get('PATH', ''),
'XDG_CONFIG_DIRS' : '@sysconfdir@/xdg:' + (os.environ.get('XDG_CONFIG_DIRS') or '/etc/xdg'), 'XDG_CONFIG_DIRS' : '@sysconfdir@/xdg:' + (os.environ.get('XDG_CONFIG_DIRS') or '/etc/xdg'),
'XDG_DATA_DIRS' : '@datadir@:' + (os.environ.get('XDG_DATA_DIRS') or '/usr/local/share:/usr/share')}) 'XDG_DATA_DIRS' : '@datadir@:' + (os.environ.get('XDG_DATA_DIRS') or '/usr/local/share:/usr/share')})
if running_from_source_tree: if running_from_source_tree:
if os.environ.has_key('GI_TYPELIB_PATH'): if os.environ.has_key('GI_TYPELIB_PATH'):
typelib_dir = typelib_dir + ":" + os.environ.get('GI_TYPELIB_PATH') typelib_dir = typelib_dir + ":" + os.environ.get('GI_TYPELIB_PATH')
env.update({'GNOME_SHELL_BINDIR' : bin_dir, env.update({'GNOME_SHELL_BINDIR' : self_dir,
'GNOME_SHELL_DATADIR' : data_dir, 'GNOME_SHELL_DATADIR' : data_dir,
'GI_TYPELIB_PATH' : typelib_dir, 'GI_TYPELIB_PATH' : typelib_dir,
'GSETTINGS_SCHEMA_DIR' : data_dir }) 'GSETTINGS_SCHEMA_DIR' : data_dir })
@ -191,15 +189,14 @@ def start_shell(perf_output=None):
if perf_output is not None: if perf_output is not None:
env['SHELL_PERF_OUTPUT'] = perf_output env['SHELL_PERF_OUTPUT'] = perf_output
args = []
if options.debug: if options.debug:
debug_command = options.debug_command.split() debug_command = options.debug_command.split()
args = list(debug_command) if running_from_source_tree:
else: args += [os.path.join(top_dir, 'libtool'), '--mode=execute']
args = [] args += debug_command
if running_from_source_tree: args.append(os.path.join(self_dir, 'gnome-shell-real'))
env['MUTTER_PLUGINS'] = plugin
args.append(os.path.join(bin_dir, 'gnome-shell-installed'))
if options.replace: if options.replace:
args.append('--replace') args.append('--replace')
if options.sync: if options.sync:
@ -427,9 +424,9 @@ def run_performance_test():
} }
# Add the Git revision if available # Add the Git revision if available
bin_dir = os.path.dirname(os.path.abspath(sys.argv[0])) self_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
if os.path.exists(os.path.join(bin_dir, 'gnome-shell.in')): if os.path.exists(os.path.join(self_dir, 'gnome-shell-jhbuild.in')):
top_dir = os.path.dirname(bin_dir) top_dir = os.path.dirname(self_dir)
git_dir = os.path.join(top_dir, '.git') git_dir = os.path.join(top_dir, '.git')
if os.path.exists(git_dir): if os.path.exists(git_dir):
env = dict(os.environ) env = dict(os.environ)

View File

@ -25,42 +25,24 @@
#include "config.h" #include "config.h"
#include <meta-plugin.h>
#include <glib/gi18n-lib.h>
#include <clutter/clutter.h>
#include <clutter/x11/clutter-x11.h>
#include <gtk/gtk.h>
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <gjs/gjs.h>
#include <girepository.h>
#include <gmodule.h>
#ifdef HAVE_MALLINFO
#include <malloc.h>
#endif
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <clutter/clutter.h>
#include <clutter/x11/clutter-x11.h>
#include <GL/glx.h> #include <GL/glx.h>
#include <GL/glxext.h> #include <GL/glxext.h>
#include <gjs/gjs.h>
#include "display.h" #include <meta/display.h>
#include <meta/meta-plugin.h>
#include "shell-global-private.h" #include "shell-global-private.h"
#include "shell-perf-log.h" #include "shell-perf-log.h"
#include "shell-wm-private.h" #include "shell-wm-private.h"
#include "st.h"
#include "shell-a11y.h"
#define SHELL_DBUS_SERVICE "org.gnome.Shell"
#define MAGNIFIER_DBUS_SERVICE "org.gnome.Magnifier"
static void gnome_shell_plugin_dispose (GObject *object); static void gnome_shell_plugin_dispose (GObject *object);
static void gnome_shell_plugin_finalize (GObject *object); static void gnome_shell_plugin_finalize (GObject *object);
static void gnome_shell_plugin_early_initialize (MetaPlugin *plugin);
static void gnome_shell_plugin_start (MetaPlugin *plugin); static void gnome_shell_plugin_start (MetaPlugin *plugin);
static void gnome_shell_plugin_minimize (MetaPlugin *plugin, static void gnome_shell_plugin_minimize (MetaPlugin *plugin,
MetaWindowActor *actor); MetaWindowActor *actor);
@ -110,7 +92,6 @@ struct _GnomeShellPlugin
{ {
MetaPlugin parent; MetaPlugin parent;
GjsContext *gjs_context;
Atom panel_action; Atom panel_action;
Atom panel_action_run_dialog; Atom panel_action_run_dialog;
Atom panel_action_main_menu; Atom panel_action_main_menu;
@ -127,11 +108,9 @@ struct _GnomeShellPluginClass
MetaPluginClass parent_class; MetaPluginClass parent_class;
}; };
/* GType gnome_shell_plugin_get_type (void);
* Create the plugin struct; function pointers initialized in
* g_module_check_init(). G_DEFINE_TYPE (GnomeShellPlugin, gnome_shell_plugin, META_TYPE_PLUGIN)
*/
META_PLUGIN_DECLARE(GnomeShellPlugin, gnome_shell_plugin);
static void static void
gnome_shell_plugin_class_init (GnomeShellPluginClass *klass) gnome_shell_plugin_class_init (GnomeShellPluginClass *klass)
@ -142,7 +121,6 @@ gnome_shell_plugin_class_init (GnomeShellPluginClass *klass)
gobject_class->dispose = gnome_shell_plugin_dispose; gobject_class->dispose = gnome_shell_plugin_dispose;
gobject_class->finalize = gnome_shell_plugin_finalize; gobject_class->finalize = gnome_shell_plugin_finalize;
plugin_class->early_initialize = gnome_shell_plugin_early_initialize;
plugin_class->start = gnome_shell_plugin_start; plugin_class->start = gnome_shell_plugin_start;
plugin_class->map = gnome_shell_plugin_map; plugin_class->map = gnome_shell_plugin_map;
plugin_class->minimize = gnome_shell_plugin_minimize; plugin_class->minimize = gnome_shell_plugin_minimize;
@ -162,328 +140,6 @@ gnome_shell_plugin_class_init (GnomeShellPluginClass *klass)
static void static void
gnome_shell_plugin_init (GnomeShellPlugin *shell_plugin) gnome_shell_plugin_init (GnomeShellPlugin *shell_plugin)
{ {
meta_prefs_override_preference_location ("/apps/mutter/general/attach_modal_dialogs",
"/desktop/gnome/shell/windows/attach_modal_dialogs");
meta_prefs_override_preference_location ("/apps/metacity/general/button_layout",
"/desktop/gnome/shell/windows/button_layout");
meta_prefs_override_preference_location ("/apps/metacity/general/edge_tiling",
"/desktop/gnome/shell/windows/edge_tiling");
meta_prefs_override_preference_location ("/apps/metacity/general/theme",
"/desktop/gnome/shell/windows/theme");
}
static void
update_font_options (GtkSettings *settings)
{
StThemeContext *context;
ClutterStage *stage;
ClutterBackend *backend;
gint dpi;
gint hinting;
gchar *hint_style_str;
cairo_hint_style_t hint_style = CAIRO_HINT_STYLE_NONE;
gint antialias;
cairo_antialias_t antialias_mode = CAIRO_ANTIALIAS_NONE;
cairo_font_options_t *options;
/* Disable text mipmapping; it causes problems on pre-GEM Intel
* drivers and we should just be rendering text at the right
* size rather than scaling it. If we do effects where we dynamically
* zoom labels, then we might want to reconsider.
*/
clutter_set_font_flags (clutter_get_font_flags () & ~CLUTTER_FONT_MIPMAPPING);
g_object_get (settings,
"gtk-xft-dpi", &dpi,
"gtk-xft-antialias", &antialias,
"gtk-xft-hinting", &hinting,
"gtk-xft-hintstyle", &hint_style_str,
NULL);
stage = CLUTTER_STAGE (clutter_stage_get_default ());
context = st_theme_context_get_for_stage (stage);
if (dpi != -1)
/* GTK stores resolution as 1024 * dots/inch */
st_theme_context_set_resolution (context, dpi / 1024);
else
st_theme_context_set_default_resolution (context);
/* Clutter (as of 0.9) passes comprehensively wrong font options
* override whatever set_font_flags() did above.
*
* http://bugzilla.openedhand.com/show_bug.cgi?id=1456
*/
backend = clutter_get_default_backend ();
options = cairo_font_options_create ();
cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_ON);
if (hinting >= 0 && !hinting)
{
hint_style = CAIRO_HINT_STYLE_NONE;
}
else if (hint_style_str)
{
if (strcmp (hint_style_str, "hintnone") == 0)
hint_style = CAIRO_HINT_STYLE_NONE;
else if (strcmp (hint_style_str, "hintslight") == 0)
hint_style = CAIRO_HINT_STYLE_SLIGHT;
else if (strcmp (hint_style_str, "hintmedium") == 0)
hint_style = CAIRO_HINT_STYLE_MEDIUM;
else if (strcmp (hint_style_str, "hintfull") == 0)
hint_style = CAIRO_HINT_STYLE_FULL;
}
g_free (hint_style_str);
cairo_font_options_set_hint_style (options, hint_style);
/* We don't want to turn on subpixel anti-aliasing; since Clutter
* doesn't currently have the code to support ARGB masks,
* generating them then squashing them back to A8 is pointless.
*/
antialias_mode = (antialias < 0 || antialias) ? CAIRO_ANTIALIAS_GRAY
: CAIRO_ANTIALIAS_NONE;
cairo_font_options_set_antialias (options, antialias_mode);
clutter_backend_set_font_options (backend, options);
cairo_font_options_destroy (options);
}
static void
settings_notify_cb (GtkSettings *settings,
GParamSpec *pspec,
gpointer data)
{
update_font_options (settings);
}
static void
malloc_statistics_callback (ShellPerfLog *perf_log,
gpointer data)
{
#ifdef HAVE_MALLINFO
struct mallinfo info = mallinfo ();
shell_perf_log_update_statistic_i (perf_log,
"malloc.arenaSize",
info.arena);
shell_perf_log_update_statistic_i (perf_log,
"malloc.mmapSize",
info.hblkhd);
shell_perf_log_update_statistic_i (perf_log,
"malloc.usedSize",
info.uordblks);
#endif
}
static void
add_statistics (GnomeShellPlugin *shell_plugin)
{
ShellPerfLog *perf_log = shell_perf_log_get_default ();
/* For probably historical reasons, mallinfo() defines the returned values,
* even those in bytes as int, not size_t. We're determined not to use
* more than 2G of malloc'ed memory, so are OK with that.
*/
shell_perf_log_define_statistic (perf_log,
"malloc.arenaSize",
"Amount of memory allocated by malloc() with brk(), in bytes",
"i");
shell_perf_log_define_statistic (perf_log,
"malloc.mmapSize",
"Amount of memory allocated by malloc() with mmap(), in bytes",
"i");
shell_perf_log_define_statistic (perf_log,
"malloc.usedSize",
"Amount of malloc'ed memory currently in use",
"i");
shell_perf_log_add_statistics_callback (perf_log,
malloc_statistics_callback,
NULL, NULL);
}
/* This is an IBus workaround. The flow of events with IBus is that every time
* it gets gets a key event, it:
*
* Sends it to the daemon via D-Bus asynchronously
* When it gets an reply, synthesizes a new GdkEvent and puts it into the
* GDK event queue with gdk_event_put(), including
* IBUS_FORWARD_MASK = 1 << 25 in the state to prevent a loop.
*
* (Normally, IBus uses the GTK+ key snooper mechanism to get the key
* events early, but since our key events aren't visible to GTK+ key snoopers,
* IBus will instead get the events via the standard
* GtkIMContext.filter_keypress() mechanism.)
*
* There are a number of potential problems here; probably the worst
* problem is that IBus doesn't forward the timestamp with the event
* so that every key event that gets delivered ends up with
* GDK_CURRENT_TIME. This creates some very subtle bugs; for example
* if you have IBus running and a keystroke is used to trigger
* launching an application, focus stealing prevention won't work
* right. http://code.google.com/p/ibus/issues/detail?id=1184
*
* In any case, our normal flow of key events is:
*
* GDK filter function => clutter_x11_handle_event => clutter actor
*
* So, if we see a key event that gets delivered via the GDK event handler
* function - then we know it must be one of these synthesized events, and
* we should push it back to clutter.
*
* To summarize, the full key event flow with IBus is:
*
* GDK filter function
* => Mutter
* => gnome_shell_plugin_xevent_filter()
* => clutter_x11_handle_event()
* => clutter event delivery to actor
* => gtk_im_context_filter_event()
* => sent to IBus daemon
* => response received from IBus daemon
* => gdk_event_put()
* => GDK event handler
* => <this function>
* => clutter_event_put()
* => clutter event delivery to actor
*
* Anything else we see here we just pass on to the normal GDK event handler
* gtk_main_do_event().
*/
static void
gnome_shell_gdk_event_handler (GdkEvent *event_gdk,
gpointer data)
{
if (event_gdk->type == GDK_KEY_PRESS || event_gdk->type == GDK_KEY_RELEASE)
{
ClutterActor *stage;
Window stage_xwindow;
stage = clutter_stage_get_default ();
stage_xwindow = clutter_x11_get_stage_window (CLUTTER_STAGE (stage));
if (GDK_WINDOW_XID (event_gdk->key.window) == stage_xwindow)
{
ClutterDeviceManager *device_manager = clutter_device_manager_get_default ();
ClutterInputDevice *keyboard = clutter_device_manager_get_core_device (device_manager,
CLUTTER_KEYBOARD_DEVICE);
ClutterEvent *event_clutter = clutter_event_new ((event_gdk->type == GDK_KEY_PRESS) ?
CLUTTER_KEY_PRESS : CLUTTER_KEY_RELEASE);
event_clutter->key.time = event_gdk->key.time;
event_clutter->key.flags = CLUTTER_EVENT_NONE;
event_clutter->key.stage = CLUTTER_STAGE (stage);
event_clutter->key.source = NULL;
/* This depends on ClutterModifierType and GdkModifierType being
* identical, which they are currently. (They both match the X
* modifier state in the low 16-bits and have the same extensions.) */
event_clutter->key.modifier_state = event_gdk->key.state;
event_clutter->key.keyval = event_gdk->key.keyval;
event_clutter->key.hardware_keycode = event_gdk->key.hardware_keycode;
event_clutter->key.unicode_value = gdk_keyval_to_unicode (event_clutter->key.keyval);
event_clutter->key.device = keyboard;
clutter_event_put (event_clutter);
clutter_event_free (event_clutter);
return;
}
}
gtk_main_do_event (event_gdk);
}
static void
muted_log_handler (const char *log_domain,
GLogLevelFlags log_level,
const char *message,
gpointer data)
{
/* Intentionally empty to discard message */
}
static void
gnome_shell_plugin_early_initialize (MetaPlugin *plugin)
{
GError *error = NULL;
DBusGConnection *session;
DBusGProxy *bus;
guint32 request_name_result;
/** TODO:
* In the future we should use GDBus for this. However, in
* order to do that, we need to port all of the JavaScript
* code. Otherwise, the name will be claimed on the wrong
* connection.
*/
session = dbus_g_bus_get (DBUS_BUS_SESSION, NULL);
bus = dbus_g_proxy_new_for_name (session,
DBUS_SERVICE_DBUS,
DBUS_PATH_DBUS,
DBUS_INTERFACE_DBUS);
if (!dbus_g_proxy_call (bus, "RequestName", &error,
G_TYPE_STRING, SHELL_DBUS_SERVICE,
G_TYPE_UINT, 0,
G_TYPE_INVALID,
G_TYPE_UINT, &request_name_result,
G_TYPE_INVALID))
{
g_print ("failed to acquire org.gnome.Shell: %s\n", error->message);
/* If we somehow got started again, it's not an error to be running
* already. So just exit 0.
*/
exit (0);
}
/* Also grab org.gnome.Panel to replace any existing panel process,
* unless a special environment variable is passed. The environment
* variable is used by the gnome-shell (no --replace) launcher in
* Xephyr */
if (!dbus_g_proxy_call (bus, "RequestName", &error, G_TYPE_STRING,
"org.gnome.Panel", G_TYPE_UINT,
DBUS_NAME_FLAG_REPLACE_EXISTING | DBUS_NAME_FLAG_DO_NOT_QUEUE,
G_TYPE_INVALID, G_TYPE_UINT,
&request_name_result, G_TYPE_INVALID))
{
g_print ("failed to acquire org.gnome.Panel: %s\n", error->message);
exit (1);
}
/* ...and the org.gnome.Magnifier service.
*/
if (!dbus_g_proxy_call (bus, "RequestName", &error,
G_TYPE_STRING, MAGNIFIER_DBUS_SERVICE,
G_TYPE_UINT, 0,
G_TYPE_INVALID,
G_TYPE_UINT, &request_name_result,
G_TYPE_INVALID))
{
g_print ("failed to acquire %s: %s\n", MAGNIFIER_DBUS_SERVICE, error->message);
/* Failing to acquire the magnifer service is not fatal. Log the error,
* but keep going. */
}
/* ...and the org.freedesktop.Notifications service.
*/
if (!dbus_g_proxy_call (bus, "RequestName", &error,
G_TYPE_STRING, "org.freedesktop.Notifications",
G_TYPE_UINT, DBUS_NAME_FLAG_REPLACE_EXISTING | DBUS_NAME_FLAG_DO_NOT_QUEUE,
G_TYPE_INVALID,
G_TYPE_UINT, &request_name_result,
G_TYPE_INVALID))
{
g_print ("failed to acquire org.freedesktop.Notifications: %s\n", error->message);
}
g_object_unref (bus);
} }
static void static void
@ -493,32 +149,10 @@ gnome_shell_plugin_start (MetaPlugin *plugin)
MetaScreen *screen; MetaScreen *screen;
MetaDisplay *display; MetaDisplay *display;
Display *xdisplay; Display *xdisplay;
GtkSettings *settings;
GError *error = NULL; GError *error = NULL;
int status; int status;
const char *shell_js;
char **search_path;
const char *glx_extensions; const char *glx_extensions;
GjsContext *gjs_context;
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
shell_a11y_init ();
settings = gtk_settings_get_default ();
g_object_connect (settings,
"signal::notify::gtk-xft-dpi",
G_CALLBACK (settings_notify_cb), NULL,
"signal::notify::gtk-xft-antialias",
G_CALLBACK (settings_notify_cb), NULL,
"signal::notify::gtk-xft-hinting",
G_CALLBACK (settings_notify_cb), NULL,
"signal::notify::gtk-xft-hintstyle",
G_CALLBACK (settings_notify_cb), NULL,
NULL);
update_font_options (settings);
gdk_event_handler_set (gnome_shell_gdk_event_handler, plugin, NULL);
screen = meta_plugin_get_screen (plugin); screen = meta_plugin_get_screen (plugin);
display = meta_screen_get_display (screen); display = meta_screen_get_display (screen);
@ -538,40 +172,12 @@ gnome_shell_plugin_start (MetaPlugin *plugin)
"GL buffer swap complete event received (with timestamp of completion)", "GL buffer swap complete event received (with timestamp of completion)",
"x"); "x");
#if HAVE_BLUETOOTH
g_irepository_prepend_search_path (BLUETOOTH_DIR);
#endif
g_irepository_prepend_search_path (GNOME_SHELL_PKGLIBDIR);
shell_js = g_getenv("GNOME_SHELL_JS");
if (!shell_js)
shell_js = JSDIR;
search_path = g_strsplit(shell_js, ":", -1);
shell_plugin->gjs_context = g_object_new (GJS_TYPE_CONTEXT,
"search-path", search_path,
"js-version", "1.8",
NULL);
g_strfreev(search_path);
/* Disable debug spew from various libraries */
g_log_set_handler ("Gvc", G_LOG_LEVEL_DEBUG,
muted_log_handler, NULL);
g_log_set_handler ("GdmUser", G_LOG_LEVEL_DEBUG,
muted_log_handler, NULL);
g_log_set_handler ("Bluetooth", G_LOG_LEVEL_DEBUG | G_LOG_LEVEL_MESSAGE,
muted_log_handler, NULL);
/* Initialize the global object here. */
shell_plugin->global = shell_global_get (); shell_plugin->global = shell_global_get ();
_shell_global_set_plugin (shell_plugin->global, META_PLUGIN (shell_plugin));
_shell_global_set_plugin (shell_plugin->global, META_PLUGIN(shell_plugin)); gjs_context = _shell_global_get_gjs_context (shell_plugin->global);
_shell_global_set_gjs_context (shell_plugin->global, shell_plugin->gjs_context);
add_statistics (shell_plugin); if (!gjs_context_eval (gjs_context,
if (!gjs_context_eval (shell_plugin->gjs_context,
"const Main = imports.ui.main; Main.start();", "const Main = imports.ui.main; Main.start();",
-1, -1,
"<main>", "<main>",
@ -752,17 +358,3 @@ MetaPluginInfo *gnome_shell_plugin_plugin_info (MetaPlugin *plugin)
return &info; return &info;
} }
#if HAVE_BLUETOOTH
/* HACK:
Add a non-static function that calls into libgnome-bluetooth-applet.so,
to avoid the linker being too smart and removing the dependency.
This function is never actually called.
*/
extern GType bluetooth_applet_get_type(void);
void _shell_link_to_bluetooth(void);
void _shell_link_to_bluetooth(void) {
bluetooth_applet_get_type();
}
#endif

460
src/main.c Normal file
View File

@ -0,0 +1,460 @@
/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */
#include "config.h"
#ifdef HAVE_MALLINFO
#include <malloc.h>
#endif
#include <stdlib.h>
#include <string.h>
#include <clutter/clutter.h>
#include <clutter/x11/clutter-x11.h>
#include <dbus/dbus-glib.h>
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <gtk/gtk.h>
#include <glib/gi18n-lib.h>
#include <girepository.h>
#include <meta/main.h>
#include <meta/meta-plugin.h>
#include <meta/prefs.h>
#include "shell-a11y.h"
#include "shell-global.h"
#include "shell-perf-log.h"
#include "st.h"
extern GType gnome_shell_plugin_get_type (void);
#define SHELL_DBUS_SERVICE "org.gnome.Shell"
#define MAGNIFIER_DBUS_SERVICE "org.gnome.Magnifier"
static void
shell_dbus_init (void)
{
GError *error = NULL;
DBusGConnection *session;
DBusGProxy *bus;
guint32 request_name_result;
/** TODO:
* In the future we should use GDBus for this. However, in
* order to do that, we need to port all of the JavaScript
* code. Otherwise, the name will be claimed on the wrong
* connection.
*/
session = dbus_g_bus_get (DBUS_BUS_SESSION, NULL);
bus = dbus_g_proxy_new_for_name (session,
DBUS_SERVICE_DBUS,
DBUS_PATH_DBUS,
DBUS_INTERFACE_DBUS);
if (!dbus_g_proxy_call (bus, "RequestName", &error,
G_TYPE_STRING, SHELL_DBUS_SERVICE,
G_TYPE_UINT, 0,
G_TYPE_INVALID,
G_TYPE_UINT, &request_name_result,
G_TYPE_INVALID))
{
g_print ("failed to acquire org.gnome.Shell: %s\n", error->message);
/* If we somehow got started again, it's not an error to be running
* already. So just exit 0.
*/
exit (0);
}
/* Also grab org.gnome.Panel to replace any existing panel process,
* unless a special environment variable is passed. The environment
* variable is used by the gnome-shell (no --replace) launcher in
* Xephyr */
if (!dbus_g_proxy_call (bus, "RequestName", &error, G_TYPE_STRING,
"org.gnome.Panel", G_TYPE_UINT,
DBUS_NAME_FLAG_REPLACE_EXISTING | DBUS_NAME_FLAG_DO_NOT_QUEUE,
G_TYPE_INVALID, G_TYPE_UINT,
&request_name_result, G_TYPE_INVALID))
{
g_print ("failed to acquire org.gnome.Panel: %s\n", error->message);
exit (1);
}
/* ...and the org.gnome.Magnifier service.
*/
if (!dbus_g_proxy_call (bus, "RequestName", &error,
G_TYPE_STRING, MAGNIFIER_DBUS_SERVICE,
G_TYPE_UINT, 0,
G_TYPE_INVALID,
G_TYPE_UINT, &request_name_result,
G_TYPE_INVALID))
{
g_print ("failed to acquire %s: %s\n", MAGNIFIER_DBUS_SERVICE, error->message);
/* Failing to acquire the magnifer service is not fatal. Log the error,
* but keep going. */
}
/* ...and the org.freedesktop.Notifications service.
*/
if (!dbus_g_proxy_call (bus, "RequestName", &error,
G_TYPE_STRING, "org.freedesktop.Notifications",
G_TYPE_UINT, DBUS_NAME_FLAG_REPLACE_EXISTING | DBUS_NAME_FLAG_DO_NOT_QUEUE,
G_TYPE_INVALID,
G_TYPE_UINT, &request_name_result,
G_TYPE_INVALID))
{
g_print ("failed to acquire org.freedesktop.Notifications: %s\n", error->message);
}
g_object_unref (bus);
}
static void
update_font_options (GtkSettings *settings)
{
StThemeContext *context;
ClutterStage *stage;
ClutterBackend *backend;
gint dpi;
gint hinting;
gchar *hint_style_str;
cairo_hint_style_t hint_style = CAIRO_HINT_STYLE_NONE;
gint antialias;
cairo_antialias_t antialias_mode = CAIRO_ANTIALIAS_NONE;
cairo_font_options_t *options;
g_object_get (settings,
"gtk-xft-dpi", &dpi,
"gtk-xft-antialias", &antialias,
"gtk-xft-hinting", &hinting,
"gtk-xft-hintstyle", &hint_style_str,
NULL);
stage = CLUTTER_STAGE (clutter_stage_get_default ());
context = st_theme_context_get_for_stage (stage);
if (dpi != -1)
/* GTK stores resolution as 1024 * dots/inch */
st_theme_context_set_resolution (context, dpi / 1024);
else
st_theme_context_set_default_resolution (context);
/* Clutter (as of 0.9) passes comprehensively wrong font options
* override whatever set_font_flags() did above.
*
* http://bugzilla.openedhand.com/show_bug.cgi?id=1456
*/
backend = clutter_get_default_backend ();
options = cairo_font_options_create ();
cairo_font_options_set_hint_metrics (options, CAIRO_HINT_METRICS_ON);
if (hinting >= 0 && !hinting)
{
hint_style = CAIRO_HINT_STYLE_NONE;
}
else if (hint_style_str)
{
if (strcmp (hint_style_str, "hintnone") == 0)
hint_style = CAIRO_HINT_STYLE_NONE;
else if (strcmp (hint_style_str, "hintslight") == 0)
hint_style = CAIRO_HINT_STYLE_SLIGHT;
else if (strcmp (hint_style_str, "hintmedium") == 0)
hint_style = CAIRO_HINT_STYLE_MEDIUM;
else if (strcmp (hint_style_str, "hintfull") == 0)
hint_style = CAIRO_HINT_STYLE_FULL;
}
g_free (hint_style_str);
cairo_font_options_set_hint_style (options, hint_style);
/* We don't want to turn on subpixel anti-aliasing; since Clutter
* doesn't currently have the code to support ARGB masks,
* generating them then squashing them back to A8 is pointless.
*/
antialias_mode = (antialias < 0 || antialias) ? CAIRO_ANTIALIAS_GRAY
: CAIRO_ANTIALIAS_NONE;
cairo_font_options_set_antialias (options, antialias_mode);
clutter_backend_set_font_options (backend, options);
cairo_font_options_destroy (options);
}
static void
settings_notify_cb (GtkSettings *settings,
GParamSpec *pspec,
gpointer data)
{
update_font_options (settings);
}
static void
shell_fonts_init (void)
{
GtkSettings *settings;
/* Disable text mipmapping; it causes problems on pre-GEM Intel
* drivers and we should just be rendering text at the right
* size rather than scaling it. If we do effects where we dynamically
* zoom labels, then we might want to reconsider.
*/
clutter_set_font_flags (clutter_get_font_flags () & ~CLUTTER_FONT_MIPMAPPING);
settings = gtk_settings_get_default ();
g_object_connect (settings,
"signal::notify::gtk-xft-dpi",
G_CALLBACK (settings_notify_cb), NULL,
"signal::notify::gtk-xft-antialias",
G_CALLBACK (settings_notify_cb), NULL,
"signal::notify::gtk-xft-hinting",
G_CALLBACK (settings_notify_cb), NULL,
"signal::notify::gtk-xft-hintstyle",
G_CALLBACK (settings_notify_cb), NULL,
NULL);
update_font_options (settings);
}
static void
shell_prefs_init (void)
{
meta_prefs_override_preference_location ("/apps/mutter/general/attach_modal_dialogs",
"/desktop/gnome/shell/windows/attach_modal_dialogs");
meta_prefs_override_preference_location ("/apps/metacity/general/button_layout",
"/desktop/gnome/shell/windows/button_layout");
meta_prefs_override_preference_location ("/apps/metacity/general/edge_tiling",
"/desktop/gnome/shell/windows/edge_tiling");
meta_prefs_override_preference_location ("/apps/metacity/general/theme",
"/desktop/gnome/shell/windows/theme");
}
/* This is an IBus workaround. The flow of events with IBus is that every time
* it gets gets a key event, it:
*
* Sends it to the daemon via D-Bus asynchronously
* When it gets an reply, synthesizes a new GdkEvent and puts it into the
* GDK event queue with gdk_event_put(), including
* IBUS_FORWARD_MASK = 1 << 25 in the state to prevent a loop.
*
* (Normally, IBus uses the GTK+ key snooper mechanism to get the key
* events early, but since our key events aren't visible to GTK+ key snoopers,
* IBus will instead get the events via the standard
* GtkIMContext.filter_keypress() mechanism.)
*
* There are a number of potential problems here; probably the worst
* problem is that IBus doesn't forward the timestamp with the event
* so that every key event that gets delivered ends up with
* GDK_CURRENT_TIME. This creates some very subtle bugs; for example
* if you have IBus running and a keystroke is used to trigger
* launching an application, focus stealing prevention won't work
* right. http://code.google.com/p/ibus/issues/detail?id=1184
*
* In any case, our normal flow of key events is:
*
* GDK filter function => clutter_x11_handle_event => clutter actor
*
* So, if we see a key event that gets delivered via the GDK event handler
* function - then we know it must be one of these synthesized events, and
* we should push it back to clutter.
*
* To summarize, the full key event flow with IBus is:
*
* GDK filter function
* => Mutter
* => gnome_shell_plugin_xevent_filter()
* => clutter_x11_handle_event()
* => clutter event delivery to actor
* => gtk_im_context_filter_event()
* => sent to IBus daemon
* => response received from IBus daemon
* => gdk_event_put()
* => GDK event handler
* => <this function>
* => clutter_event_put()
* => clutter event delivery to actor
*
* Anything else we see here we just pass on to the normal GDK event handler
* gtk_main_do_event().
*/
static void
gnome_shell_gdk_event_handler (GdkEvent *event_gdk,
gpointer data)
{
if (event_gdk->type == GDK_KEY_PRESS || event_gdk->type == GDK_KEY_RELEASE)
{
ClutterActor *stage;
Window stage_xwindow;
stage = clutter_stage_get_default ();
stage_xwindow = clutter_x11_get_stage_window (CLUTTER_STAGE (stage));
if (GDK_WINDOW_XID (event_gdk->key.window) == stage_xwindow)
{
ClutterDeviceManager *device_manager = clutter_device_manager_get_default ();
ClutterInputDevice *keyboard = clutter_device_manager_get_core_device (device_manager,
CLUTTER_KEYBOARD_DEVICE);
ClutterEvent *event_clutter = clutter_event_new ((event_gdk->type == GDK_KEY_PRESS) ?
CLUTTER_KEY_PRESS : CLUTTER_KEY_RELEASE);
event_clutter->key.time = event_gdk->key.time;
event_clutter->key.flags = CLUTTER_EVENT_NONE;
event_clutter->key.stage = CLUTTER_STAGE (stage);
event_clutter->key.source = NULL;
/* This depends on ClutterModifierType and GdkModifierType being
* identical, which they are currently. (They both match the X
* modifier state in the low 16-bits and have the same extensions.) */
event_clutter->key.modifier_state = event_gdk->key.state;
event_clutter->key.keyval = event_gdk->key.keyval;
event_clutter->key.hardware_keycode = event_gdk->key.hardware_keycode;
event_clutter->key.unicode_value = gdk_keyval_to_unicode (event_clutter->key.keyval);
event_clutter->key.device = keyboard;
clutter_event_put (event_clutter);
clutter_event_free (event_clutter);
return;
}
}
gtk_main_do_event (event_gdk);
}
static void
malloc_statistics_callback (ShellPerfLog *perf_log,
gpointer data)
{
#ifdef HAVE_MALLINFO
struct mallinfo info = mallinfo ();
shell_perf_log_update_statistic_i (perf_log,
"malloc.arenaSize",
info.arena);
shell_perf_log_update_statistic_i (perf_log,
"malloc.mmapSize",
info.hblkhd);
shell_perf_log_update_statistic_i (perf_log,
"malloc.usedSize",
info.uordblks);
#endif
}
static void
shell_perf_log_init (void)
{
ShellPerfLog *perf_log = shell_perf_log_get_default ();
/* For probably historical reasons, mallinfo() defines the returned values,
* even those in bytes as int, not size_t. We're determined not to use
* more than 2G of malloc'ed memory, so are OK with that.
*/
shell_perf_log_define_statistic (perf_log,
"malloc.arenaSize",
"Amount of memory allocated by malloc() with brk(), in bytes",
"i");
shell_perf_log_define_statistic (perf_log,
"malloc.mmapSize",
"Amount of memory allocated by malloc() with mmap(), in bytes",
"i");
shell_perf_log_define_statistic (perf_log,
"malloc.usedSize",
"Amount of malloc'ed memory currently in use",
"i");
shell_perf_log_add_statistics_callback (perf_log,
malloc_statistics_callback,
NULL, NULL);
}
static void
muted_log_handler (const char *log_domain,
GLogLevelFlags log_level,
const char *message,
gpointer data)
{
/* Intentionally empty to discard message */
}
static gboolean
print_version (const gchar *option_name,
const gchar *value,
gpointer data,
GError **error)
{
g_print ("GNOME Shell %s\n", VERSION);
exit (0);
}
GOptionEntry gnome_shell_options[] = {
{
"version", 0, G_OPTION_FLAG_NO_ARG, G_OPTION_ARG_CALLBACK,
print_version,
N_("Print version"),
NULL
},
{ NULL }
};
int
main (int argc, char **argv)
{
GOptionContext *ctx;
GError *error = NULL;
g_type_init ();
bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
ctx = meta_get_option_context ();
g_option_context_add_main_entries (ctx, gnome_shell_options, GETTEXT_PACKAGE);
if (!g_option_context_parse (ctx, &argc, &argv, &error))
{
g_printerr ("%s: %s\n", argv[0], error->message);
exit (1);
}
meta_plugin_type_register (gnome_shell_plugin_get_type ());
/* Prevent meta_init() from causing gtk to load gail and at-bridge */
g_setenv ("NO_GAIL", "1", TRUE);
g_setenv ("NO_AT_BRIDGE", "1", TRUE);
meta_init ();
g_unsetenv ("NO_GAIL");
g_unsetenv ("NO_AT_BRIDGE");
/* FIXME: Add gjs API to set this stuff and don't depend on the
* environment. These propagate to child processes.
*/
g_setenv ("GJS_DEBUG_OUTPUT", "stderr", TRUE);
g_setenv ("GJS_DEBUG_TOPICS", "JS ERROR;JS LOG", TRUE);
shell_dbus_init ();
shell_a11y_init ();
shell_fonts_init ();
shell_perf_log_init ();
shell_prefs_init ();
gdk_event_handler_set (gnome_shell_gdk_event_handler, NULL, NULL);
g_irepository_prepend_search_path (GNOME_SHELL_PKGLIBDIR);
#if HAVE_BLUETOOTH
g_irepository_prepend_search_path (BLUETOOTH_DIR);
#endif
/* Disable debug spew from various libraries */
g_log_set_handler ("Gvc", G_LOG_LEVEL_DEBUG,
muted_log_handler, NULL);
g_log_set_handler ("GdmUser", G_LOG_LEVEL_DEBUG,
muted_log_handler, NULL);
g_log_set_handler ("Bluetooth", G_LOG_LEVEL_DEBUG | G_LOG_LEVEL_MESSAGE,
muted_log_handler, NULL);
/* Initialize the global object */
shell_global_get ();
return meta_run ();
}

View File

@ -134,9 +134,6 @@ shell_a11y_init (void)
{ {
char *bridge_path = NULL; char *bridge_path = NULL;
g_unsetenv ("NO_AT_BRIDGE");
g_unsetenv ("NO_GAIL");
if (!should_enable_a11y ()) if (!should_enable_a11y ())
return; return;

View File

@ -10,11 +10,11 @@
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <clutter/clutter.h> #include <clutter/clutter.h>
#include <glib/gi18n.h> #include <glib/gi18n.h>
#include <meta/display.h>
#include "shell-app-private.h" #include "shell-app-private.h"
#include "shell-window-tracker-private.h" #include "shell-window-tracker-private.h"
#include "shell-global.h" #include "shell-global.h"
#include "display.h"
#include "st.h" #include "st.h"
#define GMENU_I_KNOW_THIS_IS_UNSTABLE #define GMENU_I_KNOW_THIS_IS_UNSTABLE

View File

@ -4,9 +4,9 @@
#include <gio/gio.h> #include <gio/gio.h>
#include <clutter/clutter.h> #include <clutter/clutter.h>
#include <meta/window.h>
#include "shell-app.h" #include "shell-app.h"
#include "window.h"
#define SHELL_TYPE_APP_SYSTEM (shell_app_system_get_type ()) #define SHELL_TYPE_APP_SYSTEM (shell_app_system_get_type ())
#define SHELL_APP_SYSTEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_APP_SYSTEM, ShellAppSystem)) #define SHELL_APP_SYSTEM(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SHELL_TYPE_APP_SYSTEM, ShellAppSystem))

View File

@ -12,16 +12,15 @@
#include <glib.h> #include <glib.h>
#include <gio/gio.h> #include <gio/gio.h>
#include <dbus/dbus-glib.h> #include <dbus/dbus-glib.h>
#include <meta/display.h>
#include <meta/group.h>
#include <meta/window.h>
#include "shell-app-usage.h" #include "shell-app-usage.h"
#include "shell-window-tracker.h" #include "shell-window-tracker.h"
#include "shell-global.h" #include "shell-global.h"
#include "shell-marshal.h" #include "shell-marshal.h"
#include "display.h"
#include "window.h"
#include "group.h"
/* This file includes modified code from /* This file includes modified code from
* desktop-data-engine/engine-dbus/hippo-application-monitor.c * desktop-data-engine/engine-dbus/hippo-application-monitor.c
* in the functions collecting application usage data. * in the functions collecting application usage data.

View File

@ -2,16 +2,16 @@
#include "config.h" #include "config.h"
#include "st.h"
#include "shell-app-private.h"
#include "shell-global.h"
#include "shell-enum-types.h"
#include "display.h"
#include "st.h"
#include "shell-window-tracker-private.h"
#include <string.h> #include <string.h>
#include <meta/display.h>
#include "shell-app-private.h"
#include "shell-enum-types.h"
#include "shell-global.h"
#include "shell-window-tracker-private.h"
#include "st.h"
/* This is mainly a memory usage optimization - the user is going to /* This is mainly a memory usage optimization - the user is going to
* be running far fewer of the applications at one time than they have * be running far fewer of the applications at one time than they have
* installed. But it also just helps keep the code more logically * installed. But it also just helps keep the code more logically

View File

@ -4,8 +4,7 @@
#include <clutter/clutter.h> #include <clutter/clutter.h>
#include <gio/gio.h> #include <gio/gio.h>
#include <meta/window.h>
#include "window.h"
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@ -8,8 +8,8 @@
void _shell_global_set_plugin (ShellGlobal *global, void _shell_global_set_plugin (ShellGlobal *global,
MetaPlugin *plugin); MetaPlugin *plugin);
void _shell_global_set_gjs_context (ShellGlobal *global,
GjsContext *context); GjsContext *_shell_global_get_gjs_context (ShellGlobal *global);
gboolean _shell_global_check_xdnd_event (ShellGlobal *global, gboolean _shell_global_check_xdnd_event (ShellGlobal *global,
XEvent *xev); XEvent *xev);

View File

@ -2,38 +2,39 @@
#include "config.h" #include "config.h"
#include "shell-global-private.h"
#include "shell-enum-types.h"
#include "shell-perf-log.h"
#include "shell-window-tracker.h"
#include "shell-marshal.h"
#include "shell-wm.h"
#include "st.h"
#include "display.h"
#include "util.h"
#include <clutter/glx/clutter-glx.h>
#include <clutter/x11/clutter-x11.h>
#include <gdk/gdkx.h>
#include <dirent.h> #include <dirent.h>
#include <errno.h> #include <errno.h>
#include <fcntl.h> #include <fcntl.h>
#include <math.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <unistd.h> #include <unistd.h>
#include <dbus/dbus-glib.h>
#include <gio/gio.h>
#include <math.h>
#include <X11/extensions/Xfixes.h>
#include <gjs/gjs-module.h>
#include <canberra.h>
#include <libxml/xmlmemory.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#ifdef HAVE_SYS_RESOURCE_H #ifdef HAVE_SYS_RESOURCE_H
#include <sys/resource.h> #include <sys/resource.h>
#endif #endif
#include <X11/extensions/Xfixes.h>
#include <canberra.h>
#include <clutter/glx/clutter-glx.h>
#include <clutter/x11/clutter-x11.h>
#include <dbus/dbus-glib.h>
#include <gdk/gdkx.h>
#include <gio/gio.h>
#include <gjs/gjs-module.h>
#include <libxml/parser.h>
#include <libxml/tree.h>
#include <libxml/xmlmemory.h>
#include <meta/display.h>
#include <meta/util.h>
#include "shell-enum-types.h"
#include "shell-global-private.h"
#include "shell-jsapi-compat-private.h" #include "shell-jsapi-compat-private.h"
#include "shell-marshal.h"
#include "shell-perf-log.h"
#include "shell-window-tracker.h"
#include "shell-wm.h"
#include "st.h"
static void grab_notify (GtkWidget *widget, gboolean is_grab, gpointer user_data); static void grab_notify (GtkWidget *widget, gboolean is_grab, gpointer user_data);
@ -203,7 +204,8 @@ static void
shell_global_init (ShellGlobal *global) shell_global_init (ShellGlobal *global)
{ {
const char *datadir = g_getenv ("GNOME_SHELL_DATADIR"); const char *datadir = g_getenv ("GNOME_SHELL_DATADIR");
char *imagedir; const char *shell_js = g_getenv("GNOME_SHELL_JS");
char *imagedir, **search_path;
if (!datadir) if (!datadir)
datadir = GNOME_SHELL_DATADIR; datadir = GNOME_SHELL_DATADIR;
@ -242,6 +244,15 @@ shell_global_init (ShellGlobal *global)
ca_context_create (&global->sound_context); ca_context_create (&global->sound_context);
ca_context_change_props (global->sound_context, CA_PROP_APPLICATION_NAME, PACKAGE_NAME, CA_PROP_APPLICATION_ID, "org.gnome.Shell", NULL); ca_context_change_props (global->sound_context, CA_PROP_APPLICATION_NAME, PACKAGE_NAME, CA_PROP_APPLICATION_ID, "org.gnome.Shell", NULL);
ca_context_open (global->sound_context); ca_context_open (global->sound_context);
if (!shell_js)
shell_js = JSDIR;
search_path = g_strsplit (shell_js, ":", -1);
global->js_context = g_object_new (GJS_TYPE_CONTEXT,
"search-path", search_path,
"js-version", "1.8",
NULL);
g_strfreev (search_path);
} }
static void static void
@ -791,11 +802,10 @@ _shell_global_set_plugin (ShellGlobal *global,
global->focus_manager = st_focus_manager_get_for_stage (CLUTTER_STAGE (stage)); global->focus_manager = st_focus_manager_get_for_stage (CLUTTER_STAGE (stage));
} }
void GjsContext *
_shell_global_set_gjs_context (ShellGlobal *global, _shell_global_get_gjs_context (ShellGlobal *global)
GjsContext *context)
{ {
global->js_context = context; return global->js_context;
} }
/** /**

View File

@ -2,12 +2,11 @@
#ifndef __SHELL_GLOBAL_H__ #ifndef __SHELL_GLOBAL_H__
#define __SHELL_GLOBAL_H__ #define __SHELL_GLOBAL_H__
#include "meta-plugin.h"
#include <clutter/clutter.h> #include <clutter/clutter.h>
#include <glib-object.h> #include <glib-object.h>
#include <gdk-pixbuf/gdk-pixbuf.h> #include <gdk-pixbuf/gdk-pixbuf.h>
#include <gtk/gtk.h> #include <gtk/gtk.h>
#include <meta/meta-plugin.h>
#include <telepathy-glib/telepathy-glib.h> #include <telepathy-glib/telepathy-glib.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@ -4,11 +4,9 @@
#include <clutter/clutter.h> #include <clutter/clutter.h>
#include <clutter/x11/clutter-x11.h> #include <clutter/x11/clutter-x11.h>
#include <gtk/gtk.h>
#include <display.h>
#include <girepository.h> #include <girepository.h>
#include <gtk/gtk.h>
#include <meta/display.h>
#include "shell-tray-manager.h" #include "shell-tray-manager.h"
#include "na-tray-manager.h" #include "na-tray-manager.h"

View File

@ -9,6 +9,10 @@
#include <X11/Xatom.h> #include <X11/Xatom.h>
#include <gdk/gdk.h> #include <gdk/gdk.h>
#include <gdk/gdkx.h> #include <gdk/gdkx.h>
#include <meta/display.h>
#include <meta/group.h>
#include <meta/util.h>
#include <meta/window.h>
#define SN_API_NOT_YET_FROZEN 1 #define SN_API_NOT_YET_FROZEN 1
#include <libsn/sn.h> #include <libsn/sn.h>
@ -20,11 +24,6 @@
#include "shell-marshal.h" #include "shell-marshal.h"
#include "st.h" #include "st.h"
#include "display.h"
#include "window.h"
#include "group.h"
#include "util.h"
/* This file includes modified code from /* This file includes modified code from
* desktop-data-engine/engine-dbus/hippo-application-monitor.c * desktop-data-engine/engine-dbus/hippo-application-monitor.c
* in the functions collecting application usage data. * in the functions collecting application usage data.

View File

@ -4,8 +4,8 @@
#include <glib-object.h> #include <glib-object.h>
#include <glib.h> #include <glib.h>
#include <meta/window.h>
#include "window.h"
#include "shell-app.h" #include "shell-app.h"
#include "shell-app-system.h" #include "shell-app-system.h"

View File

@ -4,12 +4,12 @@
#include <string.h> #include <string.h>
#include <meta/keybindings.h>
#include "shell-wm-private.h" #include "shell-wm-private.h"
#include "shell-global.h" #include "shell-global.h"
#include "shell-marshal.h" #include "shell-marshal.h"
#include <keybindings.h>
struct _ShellWM { struct _ShellWM {
GObject parent; GObject parent;

View File

@ -3,7 +3,7 @@
#define __SHELL_WM_H__ #define __SHELL_WM_H__
#include <glib-object.h> #include <glib-object.h>
#include <meta-plugin.h> #include <meta/meta-plugin.h>
G_BEGIN_DECLS G_BEGIN_DECLS

View File

@ -218,7 +218,7 @@ st_button_key_press (ClutterActor *actor,
} }
} }
return FALSE; return CLUTTER_ACTOR_CLASS (st_button_parent_class)->key_press_event (actor, event);
} }
static gboolean static gboolean

View File

@ -646,23 +646,9 @@ st_container_navigate_focus (StWidget *widget,
* any child is inconsistently scaled, then the focus chain will * any child is inconsistently scaled, then the focus chain will
* probably be unpredictable. * probably be unpredictable.
*/ */
if (from) if (focus_child)
{ {
if (from == focus_child) clutter_actor_get_allocation_box (focus_child, &sort_data.box);
clutter_actor_get_allocation_box (focus_child, &sort_data.box);
else
{
float cx, cy, fx, fy, fw, fh;
clutter_actor_get_transformed_position (CLUTTER_ACTOR (container), &cx, &cy);
clutter_actor_get_transformed_position (from, &fx, &fy);
clutter_actor_get_transformed_size (from, &fw, &fh);
sort_data.box.x1 = fx - cx;
sort_data.box.x2 = fx - cx + fw;
sort_data.box.y1 = fy - cy;
sort_data.box.y2 = fy - cy + fh;
}
} }
else else
{ {

View File

@ -586,7 +586,7 @@ st_entry_key_press_event (ClutterActor *actor,
return TRUE; return TRUE;
} }
return FALSE; return CLUTTER_ACTOR_CLASS (st_entry_parent_class)->key_press_event (actor, event);
} }
static void static void

View File

@ -199,3 +199,26 @@ st_focus_manager_remove_group (StFocusManager *manager,
{ {
g_hash_table_remove (manager->priv->groups, root); g_hash_table_remove (manager->priv->groups, root);
} }
/**
* st_focus_manager_get_group:
* @manager: the #StFocusManager
* @widget: an #StWidget
*
* Checks if @widget is inside a focus group, and if so, returns
* the root of that group.
*
* Return value: (transfer none): the focus group root, or %NULL if
* @widget is not in a focus group
*/
StWidget *
st_focus_manager_get_group (StFocusManager *manager,
StWidget *widget)
{
ClutterActor *actor = CLUTTER_ACTOR (widget);
while (actor && !g_hash_table_lookup (manager->priv->groups, actor))
actor = clutter_actor_get_parent (actor);
return ST_WIDGET (actor);
}

View File

@ -73,6 +73,8 @@ void st_focus_manager_add_group (StFocusManager *manager,
StWidget *root); StWidget *root);
void st_focus_manager_remove_group (StFocusManager *manager, void st_focus_manager_remove_group (StFocusManager *manager,
StWidget *root); StWidget *root);
StWidget *st_focus_manager_get_group (StFocusManager *manager,
StWidget *widget);
G_END_DECLS G_END_DECLS

View File

@ -176,7 +176,8 @@ st_scroll_view_set_vfade (StScrollView *self,
if (priv->vfade_effect == NULL) if (priv->vfade_effect == NULL)
priv->vfade_effect = g_object_new (ST_TYPE_SCROLL_VIEW_FADE, NULL); priv->vfade_effect = g_object_new (ST_TYPE_SCROLL_VIEW_FADE, NULL);
clutter_actor_add_effect (CLUTTER_ACTOR (self), CLUTTER_EFFECT (priv->vfade_effect)); clutter_actor_add_effect_with_name (CLUTTER_ACTOR (self), "vfade",
CLUTTER_EFFECT (priv->vfade_effect));
} }
else else
{ {

View File

@ -1391,6 +1391,36 @@ st_texture_cache_load_sliced_image (StTextureCache *cache,
* icon you are loading, use %ST_ICON_FULLCOLOR. * icon you are loading, use %ST_ICON_FULLCOLOR.
*/ */
/* generates names like g_themed_icon_new_with_default_fallbacks(),
* but *only* symbolic names
*/
static char **
symbolic_names_for_icon (const char *name)
{
char **parts, **names;
int i;
parts = g_strsplit (name, "-", -1);
names = g_new (char *, g_strv_length (parts) + 1);
for (i = 0; parts[i]; i++)
{
if (i == 0)
{
names[i] = g_strdup_printf ("%s-symbolic", parts[i]);
}
else
{
names[i] = g_strdup_printf ("%.*s-%s-symbolic",
(int) (strlen (names[i - 1]) - strlen ("-symbolic")),
names[i - 1], parts[i]);
}
}
names[i] = NULL;
g_strfreev (parts);
return names;
}
/** /**
* st_texture_cache_load_icon_name: * st_texture_cache_load_icon_name:
* @cache: The texture cache instance * @cache: The texture cache instance
@ -1414,7 +1444,7 @@ st_texture_cache_load_icon_name (StTextureCache *cache,
{ {
ClutterActor *texture; ClutterActor *texture;
GIcon *themed; GIcon *themed;
char *symbolic; char **names;
g_return_val_if_fail (!(icon_type == ST_ICON_SYMBOLIC && theme_node == NULL), NULL); g_return_val_if_fail (!(icon_type == ST_ICON_SYMBOLIC && theme_node == NULL), NULL);
@ -1429,9 +1459,9 @@ st_texture_cache_load_icon_name (StTextureCache *cache,
return CLUTTER_ACTOR (texture); return CLUTTER_ACTOR (texture);
break; break;
case ST_ICON_SYMBOLIC: case ST_ICON_SYMBOLIC:
symbolic = g_strconcat (name, "-symbolic", NULL); names = symbolic_names_for_icon (name);
themed = g_themed_icon_new_with_default_fallbacks ((const gchar*)symbolic); themed = g_themed_icon_new_from_names (names, -1);
g_free (symbolic); g_strfreev (names);
texture = load_gicon_with_colors (cache, themed, size, texture = load_gicon_with_colors (cache, themed, size,
st_theme_node_get_icon_colors (theme_node)); st_theme_node_get_icon_colors (theme_node));
g_object_unref (themed); g_object_unref (themed);

View File

@ -103,6 +103,7 @@ enum
enum enum
{ {
STYLE_CHANGED, STYLE_CHANGED,
POPUP_MENU,
LAST_SIGNAL LAST_SIGNAL
}; };
@ -554,6 +555,7 @@ st_widget_get_theme_node (StWidget *widget)
StThemeNode *parent_node = NULL; StThemeNode *parent_node = NULL;
ClutterStage *stage = NULL; ClutterStage *stage = NULL;
ClutterActor *parent; ClutterActor *parent;
char *pseudo_class, *direction_pseudo_class;
parent = clutter_actor_get_parent (CLUTTER_ACTOR (widget)); parent = clutter_actor_get_parent (CLUTTER_ACTOR (widget));
while (parent != NULL) while (parent != NULL)
@ -575,13 +577,31 @@ st_widget_get_theme_node (StWidget *widget)
if (parent_node == NULL) if (parent_node == NULL)
parent_node = get_root_theme_node (CLUTTER_STAGE (stage)); parent_node = get_root_theme_node (CLUTTER_STAGE (stage));
/* Always append a "magic" pseudo class indicating the text
* direction, to allow to adapt the CSS when necessary without
* requiring separate style sheets.
*/
if (st_widget_get_direction (widget) == ST_TEXT_DIRECTION_RTL)
direction_pseudo_class = "rtl";
else
direction_pseudo_class = "ltr";
if (priv->pseudo_class)
pseudo_class = g_strconcat(priv->pseudo_class, " ",
direction_pseudo_class, NULL);
else
pseudo_class = direction_pseudo_class;
priv->theme_node = st_theme_node_new (st_theme_context_get_for_stage (stage), priv->theme_node = st_theme_node_new (st_theme_context_get_for_stage (stage),
parent_node, priv->theme, 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,
priv->pseudo_class, pseudo_class,
priv->inline_style); priv->inline_style);
if (pseudo_class != direction_pseudo_class)
g_free (pseudo_class);
} }
return priv->theme_node; return priv->theme_node;
@ -670,6 +690,21 @@ st_widget_key_focus_out (ClutterActor *actor)
st_widget_remove_style_pseudo_class (widget, "focus"); st_widget_remove_style_pseudo_class (widget, "focus");
} }
static gboolean
st_widget_key_press_event (ClutterActor *actor,
ClutterKeyEvent *event)
{
if (event->keyval == CLUTTER_KEY_Menu ||
(event->keyval == CLUTTER_KEY_F10 &&
(event->modifier_state & CLUTTER_SHIFT_MASK)))
{
g_signal_emit (actor, signals[POPUP_MENU], 0);
return TRUE;
}
return FALSE;
}
static void static void
st_widget_hide (ClutterActor *actor) st_widget_hide (ClutterActor *actor)
{ {
@ -744,6 +779,7 @@ st_widget_class_init (StWidgetClass *klass)
actor_class->leave_event = st_widget_leave; actor_class->leave_event = st_widget_leave;
actor_class->key_focus_in = st_widget_key_focus_in; actor_class->key_focus_in = st_widget_key_focus_in;
actor_class->key_focus_out = st_widget_key_focus_out; actor_class->key_focus_out = st_widget_key_focus_out;
actor_class->key_press_event = st_widget_key_press_event;
actor_class->hide = st_widget_hide; actor_class->hide = st_widget_hide;
actor_class->get_accessible = st_widget_get_accessible; actor_class->get_accessible = st_widget_get_accessible;
@ -899,6 +935,7 @@ st_widget_class_init (StWidgetClass *klass)
/** /**
* StWidget::style-changed: * StWidget::style-changed:
* @widget: the #StWidget
* *
* Emitted when the style information that the widget derives from the * Emitted when the style information that the widget derives from the
* theme changes * theme changes
@ -911,6 +948,22 @@ st_widget_class_init (StWidgetClass *klass)
NULL, NULL, NULL, NULL,
_st_marshal_VOID__VOID, _st_marshal_VOID__VOID,
G_TYPE_NONE, 0); G_TYPE_NONE, 0);
/**
* StWidget::popup-menu:
* @widget: the #StWidget
*
* Emitted when the user has requested a context menu (eg, via a
* keybinding)
*/
signals[POPUP_MENU] =
g_signal_new ("popup-menu",
G_TYPE_FROM_CLASS (klass),
G_SIGNAL_RUN_LAST,
G_STRUCT_OFFSET (StWidgetClass, popup_menu),
NULL, NULL,
_st_marshal_VOID__VOID,
G_TYPE_NONE, 0);
} }
/** /**
@ -1438,8 +1491,15 @@ st_widget_get_direction (StWidget *self)
void void
st_widget_set_direction (StWidget *self, StTextDirection dir) st_widget_set_direction (StWidget *self, StTextDirection dir)
{ {
StTextDirection old_direction;
g_return_if_fail (ST_IS_WIDGET (self)); g_return_if_fail (ST_IS_WIDGET (self));
old_direction = st_widget_get_direction (self);
self->priv->direction = dir; self->priv->direction = dir;
if (old_direction != st_widget_get_direction (self))
st_widget_style_changed (self);
} }
/** /**

View File

@ -77,13 +77,15 @@ struct _StWidgetClass
/*< private >*/ /*< private >*/
ClutterActorClass parent_class; ClutterActorClass parent_class;
/* vfuncs */ /* signals */
void (* style_changed) (StWidget *self); void (* style_changed) (StWidget *self);
gboolean (* navigate_focus) (StWidget *self, void (* popup_menu) (StWidget *self);
ClutterActor *from,
GtkDirectionType direction);
GType (*get_accessible_type) (void); /* vfuncs */
gboolean (* navigate_focus) (StWidget *self,
ClutterActor *from,
GtkDirectionType direction);
GType (* get_accessible_type) (void);
}; };
GType st_widget_get_type (void) G_GNUC_CONST; GType st_widget_get_type (void) G_GNUC_CONST;

View File

@ -27,7 +27,7 @@ EXTRA_DIST += $(TEST_MISC)
run-test.sh: run-test.sh.in run-test.sh: run-test.sh.in
$(AM_V_GEN) sed \ $(AM_V_GEN) sed \
-e "s|@MUTTER_LIB_DIR[@]|$(MUTTER_LIB_DIR)|" \ -e "s|@MUTTER_TYPELIB_DIR[@]|$(MUTTER_TYPELIB_DIR)|" \
-e "s|@srcdir[@]|$(srcdir)|" \ -e "s|@srcdir[@]|$(srcdir)|" \
$< > $@ && chmod a+x $@ $< > $@ && chmod a+x $@

2
tests/run-test.sh.in Normal file → Executable file
View File

@ -30,7 +30,7 @@ builddir=`cd $builddir && pwd`
srcdir=$builddir/@srcdir@ srcdir=$builddir/@srcdir@
srcdir=`cd $srcdir && pwd` srcdir=`cd $srcdir && pwd`
GI_TYPELIB_PATH="@MUTTER_LIB_DIR@/mutter:$builddir/../src" GI_TYPELIB_PATH="@MUTTER_TYPELIB_DIR@:$builddir/../src"
GJS_PATH="$srcdir:$srcdir/../js" GJS_PATH="$srcdir:$srcdir/../js"
GJS_DEBUG_OUTPUT=stderr GJS_DEBUG_OUTPUT=stderr
$verbose || GJS_DEBUG_TOPICS="JS ERROR;JS LOG" $verbose || GJS_DEBUG_TOPICS="JS ERROR;JS LOG"

View File

@ -53,13 +53,13 @@ fi
# binutils, curl, gcc, make, git # binutils, curl, gcc, make, git
# #
# General build stuff: # General build stuff:
# automake, bison, flex, gettext, gnome-common, gtk-doc, intltool, # automake, bison, flex, gettext, gnome-common, gperf, gtk-doc, intltool,
# libtool, pkgconfig, cvs # libtool, pkgconfig, cvs
# #
# Devel packages needed by gnome-shell and its deps: # Devel packages needed by gnome-shell and its deps:
# dbus-glib, expat, GL, gnome-menus, gstreamer, libffi, # dbus-glib, expat, GL, gnome-menus, gstreamer, libffi,
# libjasper, libjpeg, libpng, libpulse, libtiff, libwnck, # libjasper, libjpeg, libpng, libpulse, libtiff, libwnck,
# iso-codes, libxml2, ORBit2, pam, python, readline, # iso-codes, libical, libxml2, ORBit2, pam, python, readline,
# spidermonkey ({mozilla,firefox,xulrunner}-js), startup-notification, # spidermonkey ({mozilla,firefox,xulrunner}-js), startup-notification,
# xdamage, icon-naming-utils, upower, libtool-ltdl, libvorbis, # xdamage, icon-naming-utils, upower, libtool-ltdl, libvorbis,
# libgcrypt, libtasn1, libgnome-keyring, libgtop, cups, # libgcrypt, libtasn1, libgnome-keyring, libgtop, cups,
@ -73,10 +73,10 @@ fi
if test "x$system" = xUbuntu -o "x$system" = xDebian -o "x$system" = xLinuxMint ; then if test "x$system" = xUbuntu -o "x$system" = xDebian -o "x$system" = xLinuxMint ; then
reqd=" reqd="
build-essential curl build-essential curl
automake bison flex gettext git-core cvs gnome-common gtk-doc-tools automake bison flex gettext git-core gperf cvs gnome-common gtk-doc-tools
gvfs gvfs-backends icon-naming-utils gvfs gvfs-backends icon-naming-utils
libdbus-glib-1-dev libexpat-dev libffi-dev libgnome-menu-dev libgnome-desktop-dev libgtop2-dev libdbus-glib-1-dev libexpat-dev libffi-dev libgnome-menu-dev libgnome-desktop-dev libgtop2-dev
libjasper-dev libjpeg-dev libpng-dev libstartup-notification0-dev libtiff-dev libical-dev libjasper-dev libjpeg-dev libpng-dev libstartup-notification0-dev libtiff-dev
libwnck-dev libgl1-mesa-dev liborbit2-dev libpulse-dev libreadline5-dev libxml2-dev libwnck-dev libgl1-mesa-dev liborbit2-dev libpulse-dev libreadline5-dev libxml2-dev
mesa-common-dev mesa-utils libpam-dev python-dev python-gconf python-gobject mesa-common-dev mesa-utils libpam-dev python-dev python-gconf python-gobject
xulrunner-dev libcroco3-dev xulrunner-dev libcroco3-dev
@ -111,9 +111,9 @@ fi
if test "x$system" = xFedora ; then if test "x$system" = xFedora ; then
reqd=" reqd="
binutils curl gcc gcc-c++ make cvs binutils curl gcc gcc-c++ make cvs
automake bison flex gettext git gnome-common gnome-doc-utils gvfs intltool automake bison flex gettext git gnome-common gnome-doc-utils gperf gvfs intltool
libtool pkgconfig dbus-glib-devel gnome-desktop-devel gnome-menus-devel libtool pkgconfig dbus-glib-devel gnome-desktop-devel gnome-menus-devel
gnome-python2-gconf jasper-devel libffi-devel libjpeg-devel libpng-devel gnome-python2-gconf jasper-devel libffi-devel libical-devel libjpeg-devel libpng-devel
libtiff-devel libwnck-devel mesa-libGL-devel ORBit2-devel pam-devel libtiff-devel libwnck-devel mesa-libGL-devel ORBit2-devel pam-devel
pulseaudio-libs-devel python-devel pygobject2 readline-devel xulrunner-devel pulseaudio-libs-devel python-devel pygobject2 readline-devel xulrunner-devel
libXdamage-devel libcroco-devel libxml2-devel gstreamer-devel libXdamage-devel libcroco-devel libxml2-devel gstreamer-devel

View File

@ -16,8 +16,8 @@
<repository type="cvs" name="libxklavier.freedesktop.org" <repository type="cvs" name="libxklavier.freedesktop.org"
cvsroot=":pserver:anoncvs@anoncvs.freedesktop.org:/cvs/xklavier" cvsroot=":pserver:anoncvs@anoncvs.freedesktop.org:/cvs/xklavier"
password=""/> password=""/>
<repository type="git" name="git.collabora.co.uk" <repository type="git" name="git.freedesktop.org"
href="git://git.collabora.co.uk/git/"/> href="git://anongit.freedesktop.org"/>
<autotools id="gobject-introspection"> <autotools id="gobject-introspection">
<branch repo="git.gnome.org" module="gobject-introspection"/> <branch repo="git.gnome.org" module="gobject-introspection"/>
@ -251,7 +251,7 @@
</autotools> </autotools>
<autotools id="telepathy-glib" autogenargs="--disable-Werror" > <autotools id="telepathy-glib" autogenargs="--disable-Werror" >
<branch repo="git.collabora.co.uk" module="telepathy-glib" /> <branch repo="git.freedesktop.org" module="telepathy/telepathy-glib" />
<dependencies> <dependencies>
<dep package="gobject-introspection"/> <dep package="gobject-introspection"/>
</dependencies> </dependencies>

View File

@ -3,7 +3,7 @@
# This is a simple script that we use to check for files in git # This is a simple script that we use to check for files in git
# and not in the distribution. It was previously written in shell # and not in the distribution. It was previously written in shell
# and inlined in the Makefile.am, but 'git ls-files --exclude=<pattern>' # and inlined in the Makefile.am, but 'git ls-files --exclude=<pattern>'
# was changed to no longer due anything useful, which made that # was changed to no longer do anything useful, which made that
# too challenging to be worthwhile. # too challenging to be worthwhile.
import fnmatch, os, subprocess, sys import fnmatch, os, subprocess, sys