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-calendar-server
src/gnome-shell-extension-tool
src/gnome-shell-installed
src/gnome-shell-real
src/gnome-shell-jhbuild
src/run-js-test
src/test-recorder

View File

@ -1,5 +1,5 @@
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_SRCDIR([src/shell-global.c])
@ -63,7 +63,7 @@ AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
CLUTTER_MIN_VERSION=1.5.15
GOBJECT_INTROSPECTION_MIN_VERSION=0.10.1
GJS_MIN_VERSION=0.7.11
MUTTER_MIN_VERSION=2.91.90
MUTTER_MIN_VERSION=2.91.91
GTK_MIN_VERSION=3.0.0
GIO_MIN_VERSION=2.25.9
LIBECAL_MIN_VERSION=2.32.0
@ -74,20 +74,20 @@ TELEPATHY_GLIB_MIN_VERSION=0.13.12
POLKIT_MIN_VERSION=0.100
# Collect more than 20 libraries for a prize!
PKG_CHECK_MODULES(MUTTER_PLUGIN, gio-2.0 >= $GIO_MIN_VERSION
gio-unix-2.0 dbus-glib-1 libxml-2.0
gtk+-3.0 >= $GTK_MIN_VERSION
mutter-plugins >= $MUTTER_MIN_VERSION
gjs-internals-1.0 >= $GJS_MIN_VERSION
libgnome-menu $recorder_modules gconf-2.0
gdk-x11-3.0
clutter-x11-1.0 >= $CLUTTER_MIN_VERSION
clutter-glx-1.0 >= $CLUTTER_MIN_VERSION
libstartup-notification-1.0
gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION
libcanberra
telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION
polkit-agent-1 >= $POLKIT_MIN_VERSION)
PKG_CHECK_MODULES(GNOME_SHELL, gio-2.0 >= $GIO_MIN_VERSION
gio-unix-2.0 dbus-glib-1 libxml-2.0
gtk+-3.0 >= $GTK_MIN_VERSION
libmutter-wm >= $MUTTER_MIN_VERSION
gjs-internals-1.0 >= $GJS_MIN_VERSION
libgnome-menu $recorder_modules gconf-2.0
gdk-x11-3.0
clutter-x11-1.0 >= $CLUTTER_MIN_VERSION
clutter-glx-1.0 >= $CLUTTER_MIN_VERSION
libstartup-notification-1.0
gobject-introspection-1.0 >= $GOBJECT_INTROSPECTION_MIN_VERSION
libcanberra
telepathy-glib >= $TELEPATHY_GLIB_MIN_VERSION
polkit-agent-1 >= $POLKIT_MIN_VERSION)
GJS_VERSION=`$PKG_CONFIG --modversion gjs-internals-1.0`
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_LIBS=$LIBS
CFLAGS=$MUTTER_PLUGIN_CFLAGS
LIBS=$MUTTER_PLUGIN_LIBS
CFLAGS=$GNOME_SHELL_CFLAGS
LIBS=$GNOME_SHELL_LIBS
# 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)
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_LIBS)
MUTTER_BIN_DIR=`$PKG_CONFIG --variable=exec_prefix mutter-plugins`/bin
# FIXME: metacity-plugins.pc should point directly to its .gir file
MUTTER_LIB_DIR=`$PKG_CONFIG --variable=libdir mutter-plugins`
MUTTER_PLUGIN_DIR=`$PKG_CONFIG --variable=plugindir mutter-plugins`
AC_SUBST(MUTTER_BIN_DIR)
AC_SUBST(MUTTER_LIB_DIR)
AC_SUBST(MUTTER_PLUGIN_DIR)
MUTTER_GIR_DIR=`$PKG_CONFIG --variable=girdir libmutter-wm`
MUTTER_TYPELIB_DIR=`$PKG_CONFIG --variable=typelibdir libmutter-wm`
AC_SUBST(MUTTER_GIR_DIR)
AC_SUBST(MUTTER_TYPELIB_DIR)
GJS_CONSOLE=`$PKG_CONFIG --variable=gjs_console gjs-1.0`
AC_SUBST(GJS_CONSOLE)
@ -207,9 +204,6 @@ AC_ARG_ENABLE(dynamic-mozjs-hack,
ENABLE_DYNAMIC_MOZJS_HACK=$enable_dynamic_mozjs_hack
AC_SUBST(ENABLE_DYNAMIC_MOZJS_HACK)
AC_PATH_PROG(mutter, [mutter])
AC_SUBST(mutter)
AC_CONFIG_FILES([
Makefile
data/Makefile

View File

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

View File

@ -1,24 +1,26 @@
<?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) -->
<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"
version="1.0"
id="Foreground"
x="0px"
y="0px"
width="22"
height="22"
viewBox="0 0 16 16"
width="32"
height="32"
viewBox="0 0 23.272727 23.272727"
enable-background="new 0 0 16 16"
xml:space="preserve"
sodipodi:version="0.32"
inkscape:version="0.46"
inkscape:version="0.48+devel r10081 custom"
sodipodi:docname="close-window.svg"
inkscape:output_extension="org.inkscape.output.svg.inkscape"><metadata
id="metadata2399"><rdf:RDF><cc:Work
@ -37,11 +39,49 @@
inkscape:vp_y="0 : 1000 : 0"
inkscape:vp_z="16 : 8 : 1"
inkscape:persp3d-origin="8 : 5.3333333 : 1"
id="perspective2401" /></defs><sodipodi:namedview
inkscape:window-height="999"
inkscape:window-width="1680"
id="perspective2401" /><filter
color-interpolation-filters="sRGB"
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:pageopacity="1"
inkscape:pageopacity="0"
guidetolerance="10.0"
gridtolerance="10.0"
objecttolerance="10.0"
@ -50,27 +90,63 @@
pagecolor="#000000"
id="base"
showgrid="false"
inkscape:zoom="25.648691"
inkscape:cx="8.8097603"
inkscape:cy="9.0472789"
inkscape:zoom="1"
inkscape:cx="10.720189"
inkscape:cy="13.739577"
inkscape:window-x="0"
inkscape:window-y="26"
inkscape:current-layer="Foreground"
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
id="g3175"><path
sodipodi:nodetypes="csssc"
style="fill:#000000;fill-opacity:1;fill-rule:evenodd;stroke:#ffffff;stroke-width:1.59217799;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
id="path2394"
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"
clip-rule="evenodd" /><g
id="g3172"><path
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"
d="M 5.4242673,5.3313047 L 10.515414,10.421272 L 10.714004,10.646491"
id="path3152" /></g></g><path
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"
d="M 5.4402527,10.650392 L 10.688082,5.3573033"
id="path3154"
sodipodi:nodetypes="cc" /></svg>
style="display:inline"
id="g16402-8"
transform="translate(4.7533483,2.8238929)"><g
id="g3175-4"><path
sodipodi:type="inkscape:offset"
inkscape:radius="0"
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 "
xlink:href="#path2394-32"
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="path16480-5"
inkscape:href="#path2394-32"
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"
transform="translate(0,1.028519)" /><path
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;
}
#panelLeft {
#panelLeft:ltr {
padding-right: 4px;
}
#panelLeft:rtl {
padding-right: 0px;
padding-left: 4px;
}
#panelRight {
#panelRight:ltr {
padding-left: 4px;
}
#panelRight:rtl {
padding-left: 0px;
padding-right: 4px;
}
@ -297,6 +295,11 @@ StTooltip StLabel {
padding-left: 14px;
}
#legacyTray:rtl {
padding-left: 0px;
padding-right: 14px;
}
#legacyTray:compact {
spacing: 8px;
}
@ -354,10 +357,13 @@ StTooltip StLabel {
.window-close {
background-image: url("close-window.svg");
height: 24px;
width: 24px;
-st-background-image-shadow: -2px 2px 6px rgba(0,0,0,0.5);
-shell-close-overlap: 16px;
height: 34px;
width: 34px;
-shell-close-overlap: 20px;
}
.window-close:rtl {
-st-background-image-shadow: 2px 2px 6px rgba(0,0,0,0.5);
}
/* Dash */
@ -473,10 +479,15 @@ StTooltip StLabel {
}
#searchResultsContent {
padding: 0 20px 0 0;
padding-right: 20px;
spacing: 36px;
}
#searchResultsContent:rtl {
padding-right: 0px;
padding-left: 20px;
}
.search-statustext,
.search-section-header {
padding: 4px 12px;
@ -541,6 +552,11 @@ StTooltip StLabel {
spacing: 20px;
}
.all-app:rtl {
padding-right: 16px;
padding-left: 25px;
}
.app-filter {
font-size: 14px;
font-weight: bold;
@ -549,12 +565,25 @@ StTooltip StLabel {
width: 200px;
}
.app-filter:hover {
color: #eee;
}
.app-filter:selected {
color: #ffffff;
background-image: url("filter-selected.svg");
background-image: url("filter-selected-ltr.svg");
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 {
padding: 4px 8px;
}
@ -572,7 +601,8 @@ StTooltip StLabel {
.remove-favorite > .overview-icon,
.search-result-content > .overview-icon {
border-radius: 4px;
padding: 4px;
padding: 3px;
border: 1px rgba(0,0,0,0);
font-size: 10px;
color: white;
transition-duration: 100;
@ -597,6 +627,11 @@ StTooltip StLabel {
transition-duration: 100;
}
.app-well-app:focus > .overview-icon,
.search-result-content:focus > .overview-icon {
border: 1px solid #cccccc;
}
.app-well-menu {
font-size: 12px
}
@ -765,6 +800,11 @@ StTooltip StLabel {
background-image: url("calendar-arrow-left.svg");
border-radius: 4px;
}
.calendar-change-month-back:rtl {
background-image: url("calendar-arrow-right.svg");
}
.calendar-change-month-back:hover {
background-color: #999999;
}
@ -778,6 +818,11 @@ StTooltip StLabel {
background-image: url("calendar-arrow-right.svg");
border-radius: 4px;
}
.calendar-change-month-forward:rtl {
background-image: url("calendar-arrow-left.svg");
}
.calendar-change-month-forward:hover {
background-color: #999999;
}
@ -872,18 +917,31 @@ StTooltip StLabel {
padding-left: 0.3em;
}
.events-day-header:rtl {
padding-left: 0em;
padding-right: 0.3em;
}
.events-day-dayname {
font-size: 12px;
color: rgba(153, 153, 153, 1.0);
text-align: left;
}
.events-day-dayname:rtl {
text-align: right;
}
.events-day-time {
font-size: 12px;
color: #fff;
text-align: right;
}
.events-day-time:rtl {
text-align: left;
}
.events-day-task {
font-size: 12px;
color: rgba(153, 153, 153, 1.0);
@ -898,6 +956,11 @@ StTooltip StLabel {
padding-right: 8px;
}
.events-time-box:rtl {
padding-right: 0px;
padding-left: 8px;
}
.events-event-box {
}
@ -928,7 +991,7 @@ StTooltip StLabel {
padding-bottom: 8px;
}
.summary-notification-boxpointer {
.summary-boxpointer {
-arrow-border-radius: 9px;
-arrow-background-color: rgba(0,0,0,0.9);
-arrow-border-width: 2px;
@ -937,12 +1000,18 @@ StTooltip StLabel {
-arrow-rise: 15px;
}
.summary-notification-boxpointer #notification {
.summary-boxpointer #notification {
border-radius: 9px;
background: rgba(0,0,0,0) !important;
padding-bottom: 12px;
}
.summary-boxpointer #summary-right-click-menu {
font-size: 14px;
padding-top: 12px;
padding-bottom: 12px;
}
#notification-scrollview {
max-height: 10em;
}
@ -951,10 +1020,14 @@ StTooltip StLabel {
height: 1em;
}
#notification-scrollview > StScrollBar {
#notification-scrollview:ltr > StScrollBar {
padding-left: 6px;
}
#notification-scrollview:rtl > StScrollBar {
padding-right: 6px;
}
#notification-body {
spacing: 5px;
}
@ -1014,6 +1087,11 @@ StTooltip StLabel {
border-radius: 4px;
}
.chat-received:rtl {
padding-left: 0px;
padding-right: 4px;
}
.chat-sent {
background-gradient-direction: horizontal;
background-gradient-start: rgba(255, 255, 255, 0);
@ -1023,6 +1101,11 @@ StTooltip StLabel {
border-radius: 4px;
}
.chat-sent:rtl {
padding-left: 0px;
padding-right: 4px;
}
.chat-meta-message {
padding-left: 4px;
border-radius: 4px;
@ -1030,6 +1113,11 @@ StTooltip StLabel {
color: #bbbbbb;
}
.chat-meta-message:rtl {
padding-left: 0px;
padding-right: 4px;
}
#notification StEntry {
padding: 4px;
border-radius: 4px;
@ -1066,21 +1154,39 @@ StTooltip StLabel {
height: 36px;
}
.summary-source-button {
#summary-mode:rtl {
padding: 2px 4px 0px 0px;
}
.summary-source-button:ltr {
padding-left: 4px;
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;
}
.summary-source-button:last-child:rtl {
padding-left: 12px;
}
.source-title {
font-size: 12px;
font-weight: bold;
padding-left: 4px;
}
.source-title:rtl {
padding-left: 0px;
padding-right: 4px;
}
/* App Switcher */
#altTabPopup {
padding: 8px;
@ -1302,6 +1408,11 @@ StTooltip StLabel {
padding-bottom: 30px;
}
.end-session-dialog-subject:rtl {
padding-left: 0px;
padding-right: 17px;
}
.end-session-dialog-description {
font-size: 10pt;
color: white;
@ -1310,6 +1421,11 @@ StTooltip StLabel {
width: 16em;
}
.end-session-dialog-description:rtl {
padding-right: 17px;
padding-left: 40px;
}
.end-session-dialog-logout-icon {
border: 2px solid #8b8b8b;
border-radius: 5px;
@ -1331,14 +1447,27 @@ StTooltip StLabel {
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;
}
.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;
}
.end-session-dialog-app-list-item-icon:rtl {
padding-left: 17px;
}
.end-session-dialog-app-list-item-name {
font-size: 10pt;
}
@ -1379,10 +1508,19 @@ StTooltip StLabel {
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;
}
.polkit-dialog-password-label:rtl {
padding-left: 0.5em;
}
.polkit-dialog-password-entry {
background-color: white;
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 Signals = imports.signals;
const Clutter = imports.gi.Clutter;
const Params = imports.misc.params;
const DEFAULT_LIMIT = 512;
function HistoryManager(settings_key) {
this._init(settings_key);
function HistoryManager(params) {
this._init(params);
}
HistoryManager.prototype = {
_init: function(settings_key, limit) {
this._limit = limit || DEFAULT_LIMIT;
this._key = settings_key;
this._history = global.settings.get_strv(settings_key);
this._historyIndex = -1;
_init: function(params) {
params = Params.parse(params, { gsettingsKey: null,
limit: DEFAULT_LIMIT,
entry: null });
global.settings.connect('changed::' + settings_key,
Lang.bind(this, this._historyChanged));
this._key = params.gsettingsKey;
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() {
@ -26,18 +44,32 @@ HistoryManager.prototype = {
},
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();
},
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();
},
lastItem: function() {
this._historyIndex = this._history.length;
return this._indexChanged();
if (this._historyIndex != this._history.length) {
this._historyIndex = this._history.length;
this._indexChanged();
}
return this._historyIndex[this._history.length];
},
addItem: function(input) {
@ -45,28 +77,39 @@ HistoryManager.prototype = {
this._history[this._history.length - 1] != input) {
this._history.push(input);
this._historyIndex = this._history.length;
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() {
let current = this._history[this._historyIndex] || '';
this.emit('changed', current);
if (this._entry)
this._entry.set_text(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() {
if (this._history.length > this._limit)
this._history.splice(0, this._history.length - this._key);
global.settings.set_strv(this._key, this._history);
this._history.splice(0, this._history.length - this._limit);
if (this._key)
global.settings.set_strv(this._key, this._history);
}
};
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 [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.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.y2 = childBox.y1 + childNaturalHeight;
this._appSwitcher.actor.allocate(childBox, flags);

View File

@ -23,6 +23,7 @@ const Workspace = imports.ui.workspace;
const Params = imports.misc.params;
const MENU_POPUP_TIMEOUT = 600;
const SCROLL_TIME = 0.1;
function AlphabeticalView() {
this._init();
@ -67,6 +68,7 @@ AlphabeticalView.prototype = {
let appIcon = new AppWellIcon(this._appSystem.get_app(appInfo.get_id()));
this._grid.addItem(appIcon.actor);
appIcon.actor.connect('key-focus-in', Lang.bind(this, this._ensureIconVisible));
appIcon._appInfo = appInfo;
if (this._filterApp && !this._filterApp(appInfo))
@ -75,6 +77,28 @@ AlphabeticalView.prototype = {
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) {
this._filterApp = filter;
for (let i = 0; i < this._apps.length; i++)
@ -128,6 +152,12 @@ ViewByCategories.prototype = {
}));
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) {
@ -166,7 +196,8 @@ ViewByCategories.prototype = {
_addFilter: function(name, num) {
let button = new St.Button({ label: GLib.markup_escape_text (name, -1),
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 });
button.connect('clicked', Lang.bind(this, function() {
this._selectCategory(num);
@ -201,6 +232,14 @@ ViewByCategories.prototype = {
this._addFilter(sections[i], i);
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',
reactive: true,
button_mask: St.ButtonMask.ONE | St.ButtonMask.TWO,
can_focus: true,
x_fill: true,
y_fill: true });
this.actor._delegate = this;
@ -361,6 +401,7 @@ AppWellIcon.prototype = {
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
this.actor.connect('popup-menu', Lang.bind(this, this._onKeyboardPopupMenu));
this._menu = null;
this._menuManager = new PopupMenu.PopupMenuManager(this);
@ -437,6 +478,11 @@ AppWellIcon.prototype = {
return false;
},
_onKeyboardPopupMenu: function() {
this.popupMenu();
this._menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
},
getId: function() {
return this.app.get_id();
},
@ -454,6 +500,7 @@ AppWellIcon.prototype = {
if (!isPoppedUp)
this._onMenuPoppedDown();
}));
Main.overview.connect('hiding', Lang.bind(this, function () { this._menu.close(); }));
this._menuManager.addMenu(this._menu);
}

View File

@ -10,11 +10,18 @@ const St = imports.gi.St;
const AltTab = imports.ui.altTab;
const Main = imports.ui.main;
const Params = imports.misc.params;
const Tweener = imports.ui.tweener;
const POPUP_APPICON_SIZE = 96;
const POPUP_FADE_TIME = 0.1; // seconds
const SortGroup = {
TOP: 0,
MIDDLE: 1,
BOTTOM: 2
};
function CtrlAltTabManager() {
this._init();
}
@ -23,14 +30,18 @@ CtrlAltTabManager.prototype = {
_init: function() {
this._items = [];
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) {
this._items.push({ root: root, name: name, iconName: icon });
addGroup: function(root, name, icon, params) {
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); }));
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 ||
global.stage_input_mode == Shell.StageInputMode.NORMAL)
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) {
// 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
let screen = global.screen;
let display = screen.get_display();
let windows = display.get_tab_list(Meta.TabList.DOCKS, screen, screen.get_active_workspace ());
let windowTracker = Shell.WindowTracker.get_default();
let textureCache = St.TextureCache.get_default();
for (let i = 0; i < windows.length; i++) {
let icon;
let app = windowTracker.get_window_app(windows[i]);
if (app)
icon = app.create_icon_texture(POPUP_APPICON_SIZE);
else
icon = textureCache.bind_pixbuf_property(windows[i], 'icon');
items.push({ window: windows[i],
name: windows[i].title,
iconActor: icon });
if (!Main.overview.visible) {
let screen = global.screen;
let display = screen.get_display();
let windows = display.get_tab_list(Meta.TabList.DOCKS, screen, screen.get_active_workspace ());
let windowTracker = Shell.WindowTracker.get_default();
let textureCache = St.TextureCache.get_default();
for (let i = 0; i < windows.length; i++) {
let icon;
let app = windowTracker.get_window_app(windows[i]);
if (app)
icon = app.create_icon_texture(POPUP_APPICON_SIZE);
else
icon = textureCache.bind_pixbuf_property(windows[i], 'icon');
items.push({ window: windows[i],
name: windows[i].title,
iconActor: icon,
sortGroup: SortGroup.MIDDLE });
}
}
if (!items.length)
return;
items.sort(Lang.bind(this, this._sortItems));
new CtrlAltTabPopup().show(items, backwards);
}
};
@ -91,12 +137,12 @@ function CtrlAltTabPopup() {
CtrlAltTabPopup.prototype = {
_init : function() {
let primary = global.get_primary_monitor();
this.actor = new St.BoxLayout({ name: 'ctrlAltTabPopup',
reactive: true,
x: primary.x + primary.width / 2,
y: primary.y + primary.height / 2,
anchor_gravity: Clutter.Gravity.CENTER });
this.actor = new Shell.GenericContainer({ name: 'ctrlAltTabPopup',
reactive: true });
this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
this.actor.connect('allocate', Lang.bind(this, this._allocate));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
@ -106,6 +152,37 @@ CtrlAltTabPopup.prototype = {
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) {
if (!Main.pushModal(this.actor))
return false;
@ -180,11 +257,7 @@ CtrlAltTabPopup.prototype = {
_finish : function() {
this.destroy();
let item = this._items[this._selection];
if (item.root)
Main.ctrlAltTabManager.focusGroup(item.root);
else
Main.activateWindow(item.window);
Main.ctrlAltTabManager.focusGroup(this._items[this._selection]);
},
_popModal: function() {

View File

@ -262,11 +262,6 @@ Dash.prototype = {
clip_to_allocation: true });
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.connect('notify::height', Lang.bind(this,
function() {

View File

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

View File

@ -87,6 +87,10 @@ _Draggable.prototype = {
this.actor.connect('destroy', Lang.bind(this, function() {
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)
this._cancelDrag(global.get_current_time());
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._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;
},
@ -200,6 +210,11 @@ _Draggable.prototype = {
this._cancelDrag(event.get_time());
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;
@ -465,7 +480,9 @@ _Draggable.prototype = {
let [parentX, parentY] = this._dragOrigParent.get_transformed_position();
let [parentWidth, parentHeight] = this._dragOrigParent.get_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;
y = parentY + parentScale * this._dragOrigY;
@ -481,13 +498,14 @@ _Draggable.prototype = {
},
_cancelDrag: function(eventTime) {
this.emit('drag-cancelled', eventTime);
this._dragInProgress = false;
let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation();
if (this._actorDestroyed) {
global.unset_cursor();
if (!this._buttonDown)
this._ungrabEvents();
this._dragComplete();
this.emit('drag-end', eventTime, false);
return;
}
@ -544,12 +562,36 @@ _Draggable.prototype = {
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() {
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;
currentDraggable = null;
this._ungrabEvents();
}
};

View File

@ -28,6 +28,7 @@ var commandHeader = 'const Clutter = imports.gi.Clutter; ' +
'const Meta = imports.gi.Meta; ' +
'const Semantic = imports.misc.semantic' +
'const Shell = imports.gi.Shell; ' +
'const Tp = imports.gi.TelepathyGLib; ' +
'const Main = imports.ui.main; ' +
'const Lang = imports.lang; ' +
'const Tweener = imports.ui.tweener; ' +
@ -779,23 +780,8 @@ LookingGlass.prototype = {
return true;
}));
this._history = new History.HistoryManager(HISTORY_KEY);
this._history.connect('changed', Lang.bind(this, function(history, 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;
}
}));
this._history = new History.HistoryManager({ gsettingsKey: HISTORY_KEY,
entry: this._entry.clutter_text });
},
_updateFont: function() {

View File

@ -139,6 +139,7 @@ function start() {
placesManager = new PlaceDisplay.PlacesManager();
xdndHandler = new XdndHandler.XdndHandler();
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
overview = new Overview.Overview();
chrome = new Chrome.Chrome();
magnifier = new Magnifier.Magnifier();
@ -153,9 +154,6 @@ function start() {
overview.init();
statusIconDispatcher.start(messageTray.actor);
ctrlAltTabManager = new CtrlAltTab.CtrlAltTabManager();
ctrlAltTabManager.addGroup(panel.actor, _("Panel"), 'gnome-panel');
_startDate = new Date();
let recorderSettings = new Gio.Settings({ schema: 'org.gnome.shell.recorder' });
@ -264,12 +262,28 @@ function _checkWorkspaces() {
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
for (i = emptyWorkspaces.length - 2; i >= 0; i--) {
if (emptyWorkspaces[i])
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;
return false;
}

View File

@ -15,6 +15,7 @@ const St = imports.gi.St;
const BoxPointer = imports.ui.boxpointer;
const GnomeSession = imports.misc.gnomeSession;
const Main = imports.ui.main;
const PopupMenu = imports.ui.popupMenu;
const Params = imports.misc.params;
const Tweener = imports.ui.tweener;
const Util = imports.misc.util;
@ -517,25 +518,28 @@ Notification.prototype = {
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:
// @actor: actor to add to the body of the notification
//
// Appends @actor to the notification's body
addActor: function(actor, style) {
if (!this._scrollArea) {
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();
this._createScrollArea();
}
this._contentArea.add(actor, style ? style : {});
@ -570,11 +574,6 @@ Notification.prototype = {
//
// Scrolls the content area (if scrollable) to the indicated edge
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;
if (side == St.Side.TOP)
adjustment.value = adjustment.lower;
@ -853,7 +852,7 @@ Source.prototype = {
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,
function () {
if (this.notification == notification) {
@ -881,7 +880,7 @@ Source.prototype = {
},
// 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
@ -917,6 +916,27 @@ SummaryItem.prototype = {
this._sourceBox.add_actor(this._sourceIcon);
this._sourceBox.add_actor(this._sourceTitleBin, { expand: true });
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
@ -943,6 +963,7 @@ SummaryItem.prototype = {
this._sourceTitle.clutter_text.ellipsize = mode;
}
};
Signals.addSignalMethods(SummaryItem.prototype);
function MessageTray() {
this._init();
@ -980,17 +1001,19 @@ MessageTray.prototype = {
this._summaryMotionId = 0;
this._summaryNotificationBoxPointer = new BoxPointer.BoxPointer(St.Side.BOTTOM,
{ reactive: true,
track_hover: true });
this._summaryNotificationBoxPointer.actor.style_class = 'summary-notification-boxpointer';
this.actor.add_actor(this._summaryNotificationBoxPointer.actor);
this._summaryNotificationBoxPointer.actor.lower_bottom();
this._summaryNotificationBoxPointer.actor.hide();
this._summaryBoxPointer = new BoxPointer.BoxPointer(St.Side.BOTTOM,
{ reactive: true,
track_hover: true });
this._summaryBoxPointer.actor.style_class = 'summary-boxpointer';
this.actor.add_actor(this._summaryBoxPointer.actor);
this._summaryBoxPointer.actor.lower_bottom();
this._summaryBoxPointer.actor.hide();
this._summaryNotification = null;
this._summaryNotificationClickedId = 0;
this._summaryRightClickMenuClickedId = 0;
this._clickedSummaryItem = null;
this._clickedSummaryItemMouseButton = -1;
this._clickedSummaryItemAllocationChangedId = 0;
this._expandedSummaryItem = null;
this._summaryItemTitleWidth = 0;
@ -1004,7 +1027,7 @@ MessageTray.prototype = {
this._focusGrabber = new FocusGrabber();
this._focusGrabber.connect('focus-grabbed', Lang.bind(this,
function() {
if (this._summaryNotification)
if (this._summaryBoxPointer.bin.child)
this._lock();
}));
this._focusGrabber.connect('focus-ungrabbed', Lang.bind(this, this._unlock));
@ -1027,7 +1050,7 @@ MessageTray.prototype = {
this._notificationState = State.HIDDEN;
this._notificationTimeoutId = 0;
this._notificationExpandedId = 0;
this._summaryNotificationState = State.HIDDEN;
this._summaryBoxPointerState = State.HIDDEN;
this._summaryNotificationTimeoutId = 0;
this._summaryNotificationExpandedId = 0;
this._overviewVisible = Main.overview.visible;
@ -1037,7 +1060,7 @@ MessageTray.prototype = {
Main.chrome.addActor(this.actor, { affectsStruts: false,
visibleInOverview: true });
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));
@ -1138,9 +1161,9 @@ MessageTray.prototype = {
this._onSummaryItemHoverChanged(summaryItem);
}));
summaryItem.actor.connect('clicked', Lang.bind(this,
function () {
this._onSummaryItemClicked(summaryItem);
summaryItem.actor.connect('button-press-event', Lang.bind(this,
function (actor, event) {
this._onSummaryItemClicked(summaryItem, event);
}));
source.connect('destroy', Lang.bind(this, this._onSourceDestroy));
@ -1157,7 +1180,7 @@ MessageTray.prototype = {
if (index == -1)
return;
this._summaryItems[index].actor.destroy();
let summaryItemToRemove = this._summaryItems[index];
let newSummaryItemsIndex = this._newSummaryItems.indexOf(this._summaryItems[index]);
if (newSummaryItemsIndex != -1)
@ -1168,6 +1191,9 @@ MessageTray.prototype = {
if (source.isChat)
this._chatSummaryItemsCount--;
if (this._expandedSummaryItem == summaryItemToRemove)
this._expandedSummaryItem = null;
if (this._longestSummaryItem.source == source) {
let newTitleWidth = 0;
this._longestSummaryItem = null;
@ -1192,11 +1218,13 @@ MessageTray.prototype = {
this._notificationRemoved = true;
needUpdate = true;
}
if (this._clickedSummaryItem && this._clickedSummaryItem.source == source) {
if (this._clickedSummaryItem == summaryItemToRemove) {
this._unsetClickedSummaryItem();
needUpdate = true;
}
summaryItemToRemove.actor.destroy();
if (needUpdate);
this._updateState();
@ -1349,11 +1377,16 @@ MessageTray.prototype = {
this._expandedSummaryItem.setEllipsization(Pango.EllipsizeMode.END);
},
_onSummaryItemClicked: function(summaryItem) {
if (!this._clickedSummaryItem || this._clickedSummaryItem != summaryItem)
_onSummaryItemClicked: function(summaryItem, event) {
let clickedButton = event.get_button();
if (!this._clickedSummaryItem ||
this._clickedSummaryItem != summaryItem ||
this._clickedSummaryItemMouseButton != clickedButton) {
this._clickedSummaryItem = summaryItem;
else
this._clickedSummaryItemMouseButton = clickedButton;
} else {
this._unsetClickedSummaryItem();
}
this._updateState();
},
@ -1380,7 +1413,7 @@ MessageTray.prototype = {
// 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
// any expanded summary item other than the one related to the notification.
if (this._summaryNotificationBoxPointer.bin.hover)
if (this._summaryBoxPointer.bin.hover)
return;
this._useLongerTrayLeftTimeout = false;
@ -1538,19 +1571,23 @@ MessageTray.prototype = {
}
// Summary notification
let haveSummaryNotification = this._clickedSummaryItem != null;
let summaryNotificationIsMainNotification = (haveSummaryNotification &&
this._clickedSummaryItem.source.notification == this._notification);
let canShowSummaryNotification = this._summaryState == State.SHOWN;
let wrongSummaryNotification = (haveSummaryNotification &&
let haveClickedSummaryItem = this._clickedSummaryItem != null;
let summarySourceIsMainNotificationSource = (haveClickedSummaryItem && this._notification &&
this._clickedSummaryItem.source == this._notification.source);
let canShowSummaryBoxPointer = this._summaryState == State.SHOWN;
let wrongSummaryNotification = (this._clickedSummaryItemMouseButton == 1 &&
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 (haveSummaryNotification && !summaryNotificationIsMainNotification && canShowSummaryNotification)
this._showSummaryNotification();
} else if (this._summaryNotificationState == State.SHOWN) {
if (!haveSummaryNotification || !canShowSummaryNotification || wrongSummaryNotification)
this._hideSummaryNotification();
if (this._summaryBoxPointerState == State.HIDDEN) {
if (haveClickedSummaryItem && !summarySourceIsMainNotificationSource && canShowSummaryBoxPointer)
this._showSummaryBoxPointer();
} else if (this._summaryBoxPointerState == State.SHOWN) {
if (!haveClickedSummaryItem || !canShowSummaryBoxPointer || wrongSummaryBoxPointer)
this._hideSummaryBoxPointer();
}
// Tray itself
@ -1808,44 +1845,53 @@ MessageTray.prototype = {
this._expandedSummaryItemTitleWidth = this._summaryItemTitleWidth;
},
_showSummaryNotification: function() {
this._summaryNotification = this._clickedSummaryItem.source.notification;
this._summaryNotificationClickedId = this._summaryNotification.connect('done-displaying',
Lang.bind(this, this._escapeTray));
let index = this._notificationQueue.indexOf(this._summaryNotification);
if (index != -1)
this._notificationQueue.splice(index, 1);
_showSummaryBoxPointer: function() {
if (this._clickedSummaryItemMouseButton == 1) {
let clickedSummaryItemNotification = this._clickedSummaryItem.source.notification;
let index = this._notificationQueue.indexOf(clickedSummaryItemNotification);
if (index != -1)
this._notificationQueue.splice(index, 1);
this._summaryNotificationBoxPointer.bin.child = this._summaryNotification.actor;
this._focusGrabber.grabFocus(this._summaryNotification.actor);
this._summaryNotification = clickedSummaryItemNotification;
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._clickedSummaryItem.actor.connect('allocation-changed',
Lang.bind(this, this._adjustNotificationBoxPointerPosition));
Lang.bind(this, this._adjustSummaryBoxPointerPosition));
// _clickedSummaryItem.actor can change absolute postiion without changing allocation
this._summaryMotionId = this._summary.connect('allocation-changed',
Lang.bind(this, this._adjustNotificationBoxPointerPosition));
Lang.bind(this, this._adjustSummaryBoxPointerPosition));
this._summaryNotificationBoxPointer.actor.opacity = 0;
this._summaryNotificationBoxPointer.actor.show();
this._adjustNotificationBoxPointerPosition();
this._summaryBoxPointer.actor.opacity = 0;
this._summaryBoxPointer.actor.show();
this._adjustSummaryBoxPointerPosition();
this._summaryNotificationState = State.SHOWING;
this._summaryNotificationBoxPointer.show(true, Lang.bind(this, function() {
this._summaryNotificationState = State.SHOWN;
this._summaryBoxPointerState = State.SHOWING;
this._summaryBoxPointer.show(true, Lang.bind(this, function() {
this._summaryBoxPointerState = State.SHOWN;
}));
},
_adjustNotificationBoxPointerPosition: function() {
_adjustSummaryBoxPointerPosition: function() {
// The position of the arrow origin should be the same as center of this._clickedSummaryItem.actor
if (!this._clickedSummaryItem)
return;
this._summaryNotificationBoxPointer.setPosition(this._clickedSummaryItem.actor, 0, 0.5);
this._summaryBoxPointer.setPosition(this._clickedSummaryItem.actor, 0, 0.5);
},
_unsetClickedSummaryItem: function() {
@ -1856,14 +1902,20 @@ MessageTray.prototype = {
this._summaryMotionId = 0;
}
if (this._summaryRightClickMenuClickedId) {
this._clickedSummaryItem.disconnect(this._summaryRightClickMenuClickedId);
this._summaryRightClickMenuClickedId = 0;
}
this._clickedSummaryItem = null;
this._clickedSummaryItemMouseButton = -1;
},
_onSummaryNotificationExpanded: function() {
this._adjustNotificationBoxPointerPosition();
_onSummaryBoxPointerExpanded: function() {
this._adjustSummaryBoxPointerPosition();
},
_hideSummaryNotification: function() {
_hideSummaryBoxPointer: function() {
if (this._summaryNotificationExpandedId) {
this._summaryNotification.disconnect(this._summaryNotificationExpandedId);
this._summaryNotificationExpandedId = 0;
@ -1873,23 +1925,25 @@ MessageTray.prototype = {
this._unsetClickedSummaryItem();
this._focusGrabber.ungrabFocus();
this._summaryNotificationState = State.HIDING;
this._summaryNotificationBoxPointer.hide(true, Lang.bind(this, this._hideSummaryNotificationCompleted));
this._summaryBoxPointerState = State.HIDING;
this._summaryBoxPointer.hide(true, Lang.bind(this, this._hideSummaryBoxPointerCompleted));
},
_hideSummaryNotificationCompleted: function() {
this._summaryNotificationState = State.HIDDEN;
this._summaryNotificationBoxPointer.bin.child = null;
this._summaryNotification.collapseCompleted();
this._summaryNotification.disconnect(this._summaryNotificationClickedId);
this._summaryNotificationClickedId = 0;
let summaryNotification = this._summaryNotification;
this._summaryNotification = null;
if (summaryNotification.isTransient && !this._reNotifyWithSummaryNotificationAfterHide)
summaryNotification.destroy(NotificationDestroyedReason.EXPIRED);
if (this._reNotifyWithSummaryNotificationAfterHide) {
this._onNotify(summaryNotification.source, summaryNotification);
this._reNotifyWithSummaryNotificationAfterHide = false;
_hideSummaryBoxPointerCompleted: function() {
this._summaryBoxPointerState = State.HIDDEN;
this._summaryBoxPointer.bin.child = null;
if (this._summaryNotification != null) {
this._summaryNotification.collapseCompleted();
this._summaryNotification.disconnect(this._summaryNotificationClickedId);
this._summaryNotificationClickedId = 0;
let summaryNotification = this._summaryNotification;
this._summaryNotification = null;
if (summaryNotification.isTransient && !this._reNotifyWithSummaryNotificationAfterHide)
summaryNotification.destroy(NotificationDestroyedReason.EXPIRED);
if (this._reNotifyWithSummaryNotificationAfterHide) {
this._onNotify(summaryNotification.source, summaryNotification);
this._reNotifyWithSummaryNotificationAfterHide = false;
}
}
if (this._clickedSummaryItem)
this._updateState();
@ -1915,7 +1969,7 @@ SystemNotificationSource.prototype = {
icon_size: this.ICON_SIZE });
},
_notificationClicked: function() {
open: function() {
this.destroy();
}
};

View File

@ -435,6 +435,7 @@ Source.prototype = {
MessageTray.Source.prototype._init.call(this, title);
this._pid = pid;
this._appStateChangedId = 0;
this._setApp();
if (this.app)
this.title = this.app.get_name();
@ -459,6 +460,10 @@ Source.prototype = {
if (!this.app)
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
// notification-based icons (ie, not a trayicon) or if it was unset before
if (!this._isTrayIcon) {
@ -473,7 +478,7 @@ Source.prototype = {
this._isTrayIcon = true;
},
_notificationClicked: function(notification) {
open: function(notification) {
this.openApp();
},
@ -482,6 +487,16 @@ Source.prototype = {
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() {
if (this.app == null)
return;
@ -491,5 +506,13 @@ Source.prototype = {
let mostRecentWindow = windows[0];
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._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();
this.viewSelector.addViewTab(_("Applications"), appView.actor);
this.viewSelector.addViewTab(_("Applications"), appView.actor, 'system-run');
// Default search providers
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.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() {
@ -481,35 +485,14 @@ Overview.prototype = {
this.emit('window-drag-begin');
},
cancelledWindowDrag: function(source) {
this.emit('window-drag-cancelled');
},
endWindowDrag: function(source) {
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:
//
// 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;
Tweener.addTween(this._group,
{ opacity: 255,
transition: 'easeOutQuad',
time: ANIMATION_TIME
time: ANIMATION_TIME,
onComplete: this._showDone,
onCompleteScope: this
});
this._coverPane.raise_top();
@ -698,27 +664,13 @@ Overview.prototype = {
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.
Tweener.addTween(this._group,
{ opacity: 0,
transition: 'easeOutQuad',
time: ANIMATION_TIME
time: ANIMATION_TIME,
onComplete: this._hideDone,
onCompleteScope: this
});
this._coverPane.raise_top();

View File

@ -13,6 +13,7 @@ const Gettext = imports.gettext.domain('gnome-shell');
const _ = Gettext.gettext;
const Config = imports.misc.config;
const CtrlAltTab = imports.ui.ctrlAltTab;
const Overview = imports.ui.overview;
const PopupMenu = imports.ui.popupMenu;
const PanelMenu = imports.ui.panelMenu;
@ -243,6 +244,10 @@ AppMenuButton.prototype = {
let bin = new St.Bin({ name: 'appMenu' });
this.actor.set_child(bin);
this.actor.reactive = false;
this._targetIsCurrent = false;
this._container = new Shell.GenericContainer();
bin.set_child(this._container);
this._container.connect('get-preferred-width', Lang.bind(this, this._getContentPreferredWidth));
@ -275,7 +280,7 @@ AppMenuButton.prototype = {
this._clipWidth = PANEL_ICON_SIZE;
this._direction = SPINNER_SPEED;
this._spinner = new AnimatedIcon('process-working.png',
this._spinner = new AnimatedIcon('process-working.svg',
PANEL_ICON_SIZE);
this._container.add_actor(this._spinner.actor);
this._spinner.actor.lower_bottom();
@ -500,13 +505,6 @@ AppMenuButton.prototype = {
lastStartedApp = this._startingApps[i];
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 the app has just lost focus to the panel, pretend
@ -516,27 +514,56 @@ AppMenuButton.prototype = {
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)
this._iconBox.child.destroy();
this._iconBox.hide();
this._label.setText('');
this.actor.reactive = false;
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());
// TODO - _quit() doesn't really work on apps in state STARTING yet
this._quitMenu.label.set_text(_("Quit %s").format(targetApp.get_name()));
this._label.setText(targetApp.get_name());
// TODO - _quit() doesn't really work on apps in state STARTING yet
this._quitMenu.label.set_text(_("Quit %s").format(targetApp.get_name()));
this.actor.reactive = true;
this._iconBox.set_child(icon);
this._iconBox.show();
this._iconBox.set_child(icon);
this._iconBox.show();
if (targetApp.get_state() == Shell.AppState.STARTING)
this.startAnimation();
}
if (targetApp.get_state() == Shell.AppState.STARTING)
this.startAnimation();
this.emit('changed');
}
@ -813,13 +840,6 @@ Panel.prototype = {
this._centerBox = new St.BoxLayout({ name: 'panelCenter' });
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._rightCorner = new PanelCorner(St.Side.RIGHT);
@ -996,6 +1016,9 @@ Panel.prototype = {
Main.chrome.addActor(this._rightCorner.actor, { visibleInOverview: true,
affectsStruts: false,
affectsInputRegion: false });
Main.ctrlAltTabManager.addGroup(this.actor, _("Panel"), 'start-here',
{ sortGroup: CtrlAltTab.SortGroup.TOP });
},
_xdndShowOverview: function (actor) {

View File

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

View File

@ -54,8 +54,10 @@ PopupBaseMenuItem.prototype = {
}
if (params.reactive && params.hover)
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-out', Lang.bind(this, this._onKeyFocusOut));
}
},
_onStyleChanged: function (actor) {
@ -81,6 +83,10 @@ PopupBaseMenuItem.prototype = {
this.setActive(true);
},
_onKeyFocusOut: function (actor) {
this.setActive(false);
},
_onHoverChanged: function (actor) {
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() {
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() {
if (this.isOpen)
this.close(true);
@ -909,6 +882,8 @@ PopupMenu.prototype = {
this.actor = this._boxPointer.actor;
this.actor._delegate = this;
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.connect('get-preferred-width', Lang.bind(this, this._boxGetPreferredWidth));
this._boxWrapper.connect('get-preferred-height', Lang.bind(this, this._boxGetPreferredHeight));
@ -937,6 +912,15 @@ PopupMenu.prototype = {
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) {
this._boxPointer.setArrowOrigin(origin);
},
@ -1127,11 +1111,17 @@ PopupSubMenuMenuItem.prototype = {
},
_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.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 PopupBaseMenuItem.prototype._onKeyPressEvent.call(this, actor, event);
},
@ -1158,12 +1148,13 @@ PopupMenuManager.prototype = {
this.grabbed = false;
this._eventCaptureId = 0;
this._keyPressEventId = 0;
this._enterEventId = 0;
this._leaveEventId = 0;
this._keyFocusNotifyId = 0;
this._activeMenu = null;
this._menus = [];
this._preGrabInputMode = null;
this._grabbedFromKeynav = false;
},
addMenu: function(menu, position) {
@ -1172,15 +1163,13 @@ PopupMenuManager.prototype = {
openStateChangeId: menu.connect('open-state-changed', Lang.bind(this, this._onMenuOpenState)),
destroyId: menu.connect('destroy', Lang.bind(this, this._onMenuDestroy)),
enterId: 0,
focusInId: 0,
focusOutId: 0
focusInId: 0
};
let source = menu.sourceActor;
if (source) {
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.focusOutId = source.connect('key-focus-out', Lang.bind(this, function() { this._onKeyFocusOut(menu); }));
}
if (position == undefined)
@ -1205,8 +1194,6 @@ PopupMenuManager.prototype = {
menu.sourceActor.disconnect(menudata.enterId);
if (menudata.focusInId)
menu.sourceActor.disconnect(menudata.focusInId);
if (menudata.focusOutId)
menu.sourceActor.disconnect(menudata.focusOutId);
this._menus.splice(position, 1);
},
@ -1215,10 +1202,10 @@ PopupMenuManager.prototype = {
Main.pushModal(this._owner.actor);
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
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._keyFocusNotifyId = global.stage.connect('notify::key-focus', Lang.bind(this, this._onKeyFocusChanged));
this.grabbed = true;
},
@ -1226,49 +1213,47 @@ PopupMenuManager.prototype = {
_ungrab: function() {
global.stage.disconnect(this._eventCaptureId);
this._eventCaptureId = 0;
global.stage.disconnect(this._keyPressEventId);
this._keyPressEventId = 0;
global.stage.disconnect(this._enterEventId);
this._enterEventId = 0;
global.stage.disconnect(this._leaveEventId);
this._leaveEventId = 0;
global.stage.disconnect(this._keyFocusNotifyId);
this._keyFocusNotifyId = 0;
this.grabbed = false;
Main.popModal(this._owner.actor);
},
_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 (!this.grabbed) {
this._preGrabInputMode = global.stage_input_mode;
this._grabbedFromKeynav = hadFocus;
this._grab();
}
this._activeMenu = menu;
// if the focus is not already associated with the menu,
// then focus the menu
let focus = global.stage.key_focus;
if (!this._activeMenuContains(focus))
menu.sourceActor.grab_key_focus();
if (hadFocus)
focus.grab_key_focus();
else
menu.actor.grab_key_focus();
} else if (menu == this._activeMenu) {
let focus = global.stage.key_focus;
let fromActive = focus && this._activeMenuContains(focus);
if (this.grabbed)
this._ungrab();
this._activeMenu = null;
// If keynav was in effect before we grabbed, then we need
// to properly re-establish it after we ungrab. (popModal
// will have unset the focus.) If some part of the menu
// was focused at the time of the ungrab then focus its
// 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)
if (this._grabbedFromKeynav) {
if (this._preGrabInputMode == Shell.StageInputMode.FOCUSED)
global.stage_input_mode = Shell.StageInputMode.FOCUSED;
if (hadFocus && menu.sourceActor)
menu.sourceActor.grab_key_focus();
else
else if (focus)
focus.grab_key_focus();
}
}
@ -1296,29 +1281,20 @@ PopupMenuManager.prototype = {
return false;
},
_onKeyFocusOut: function(menu) {
if (!this.grabbed || menu != this._activeMenu)
_onKeyFocusChanged: function() {
if (!this.grabbed || !this._activeMenu)
return;
// We want to close the menu if the focus has moved somewhere
// other than inside the menu or to another menu's sourceActor.
// Unfortunately, when key-focus-out is emitted,
// stage.key_focus will be null. So we have to wait until
// after it emits the key-focus-in as well.
let id = global.stage.connect('notify::key-focus', Lang.bind(this,
function () {
global.stage.disconnect(id);
let focus = global.stage.key_focus;
if (focus) {
if (this._activeMenuContains(focus))
return;
if (focus._delegate && focus._delegate.menu &&
this._findMenu(focus._delegate.menu) != -1)
return;
}
if (menu != this._activeMenu)
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);
}));
this._closeMenu();
},
_onMenuDestroy: function(menu) {
@ -1354,18 +1330,6 @@ PopupMenuManager.prototype = {
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) {
if (!this.grabbed)
return false;
@ -1383,8 +1347,7 @@ PopupMenuManager.prototype = {
this._closeMenu();
return true;
}
} else if ((eventType == Clutter.EventType.BUTTON_PRESS && !activeMenuContains)
|| (eventType == Clutter.EventType.KEY_PRESS && event.get_key_symbol() == Clutter.Escape)) {
} else if (eventType == Clutter.EventType.BUTTON_PRESS && !activeMenuContains) {
this._closeMenu();
return true;
} else if (activeMenuContains || this._eventIsOnAnyMenuSource(event)) {
@ -1394,27 +1357,6 @@ PopupMenuManager.prototype = {
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() {
if (this._activeMenu != null)
this._activeMenu.close(true);

View File

@ -234,21 +234,10 @@ __proto__: ModalDialog.ModalDialog.prototype,
this._commandCompleter = new CommandCompleter();
this._group.connect('notify::visible', Lang.bind(this._commandCompleter, this._commandCompleter.update));
this._history = new History.HistoryManager(HISTORY_KEY);
this._history.connect('changed', Lang.bind(this, function(history, text) {
this._entryText.set_text(text);
}));
this._history = new History.HistoryManager({ gsettingsKey: HISTORY_KEY,
entry: this._entryText });
this._entryText.connect('key-press-event', Lang.bind(this, function(o, e) {
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 (Shell.get_event_state(e) & Clutter.ModifierType.CONTROL_MASK)
this._run(o.get_text(), true);

View File

@ -1,6 +1,7 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Gdm = imports.gi.Gdm;
const DBus = imports.dbus;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
@ -16,6 +17,16 @@ const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
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
//
// Copyright (C) 2004-2005 James M. Cape <jcape@ignore-your.tv>.
@ -43,7 +54,7 @@ StatusMenuButton.prototype = {
this._account_mgr = Tp.AccountManager.dup()
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._iconBox = new St.Bin();
@ -188,7 +199,7 @@ StatusMenuButton.prototype = {
_onLockScreenActivate: function() {
Main.overview.hide();
Util.spawn(['gnome-screensaver-command', '--lock']);
this._screenSaverProxy.LockRemote();
},
_onLoginScreenActivate: function() {
@ -207,7 +218,9 @@ StatusMenuButton.prototype = {
if (this._haveSuspend &&
this._suspendOrPowerOffItem.state == PopupMenu.PopupAlternatingMenuItemState.DEFAULT) {
this._upClient.suspend_sync(null);
this._screenSaverProxy.LockRemote(Lang.bind(this, function() {
this._upClient.suspend_sync(null);
}));
} else {
Util.spawn(['gnome-session-quit', '--power-off']);
}

View File

@ -173,7 +173,7 @@ Source.prototype = {
}
},
_notificationClicked: function(notification) {
open: function(notification) {
let props = {};
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();
@ -279,6 +279,16 @@ Notification.prototype = {
this._responseEntry.clutter_text.connect('activate', Lang.bind(this, this._onEntryActivated));
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._timestampTimeoutId = 0;
},
@ -305,7 +315,6 @@ Notification.prototype = {
let body = this.addBody(text);
body.add_style_class_name(style);
this.scrollTo(St.Side.BOTTOM);
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 -*- */
const Clutter = imports.gi.Clutter;
const Gtk = imports.gi.Gtk;
const Mainloop = imports.mainloop;
const Meta = imports.gi.Meta;
const Signals = imports.signals;
@ -15,12 +16,12 @@ const Search = imports.ui.search;
const SearchDisplay = imports.ui.searchDisplay;
const Tweener = imports.ui.tweener;
function BaseTab(titleActor, pageActor) {
this._init(titleActor, pageActor);
function BaseTab(titleActor, pageActor, name, a11yIcon) {
this._init(titleActor, pageActor, name, a11yIcon);
}
BaseTab.prototype = {
_init: function(titleActor, pageActor) {
_init: function(titleActor, pageActor, name, a11yIcon) {
this.title = titleActor;
this.page = new St.Bin({ child: pageActor,
x_align: St.Align.START,
@ -29,6 +30,14 @@ BaseTab.prototype = {
y_fill: true,
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;
},
@ -56,6 +65,11 @@ BaseTab.prototype = {
});
},
_a11yFocus: function() {
this._activate();
this.page.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
},
_activate: function() {
this.emit('activated');
}
@ -63,19 +77,19 @@ BaseTab.prototype = {
Signals.addSignalMethods(BaseTab.prototype);
function ViewTab(label, pageActor) {
this._init(label, pageActor);
function ViewTab(label, pageActor, a11yIcon) {
this._init(label, pageActor, a11yIcon);
}
ViewTab.prototype = {
__proto__: BaseTab.prototype,
_init: function(label, pageActor) {
_init: function(label, pageActor, a11yIcon) {
let titleActor = new St.Button({ label: label,
style_class: 'view-tab-title' });
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
characters. */
hint_text: _("Type to search..."),
track_hover: true });
track_hover: true,
can_focus: true });
this._text = this._entry.clutter_text;
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);
BaseTab.prototype._init.call(this,
this._entry,
this._searchResults.actor);
this._searchResults.actor,
_("Search"),
'edit-find');
this._text.connect('text-changed', Lang.bind(this, this._onTextChanged));
this._text.connect('activate', Lang.bind(this, function (se) {
@ -366,8 +383,8 @@ ViewSelector.prototype = {
}));
},
addViewTab: function(title, pageActor) {
let viewTab = new ViewTab(title, pageActor);
addViewTab: function(title, pageActor, a11yIcon) {
let viewTab = new ViewTab(title, pageActor, a11yIcon);
this._tabs.push(viewTab);
this._tabBox.add(viewTab.title);
this._addTab(viewTab);

View File

@ -15,12 +15,11 @@ function WindowAttentionHandler() {
WindowAttentionHandler.prototype = {
_init : function() {
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();
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) {
@ -57,28 +56,16 @@ WindowAttentionHandler.prototype = {
if (!window || window.has_focus() || window.is_skip_taskbar())
return;
let tracker = Shell.WindowTracker.get_default();
let app = tracker.get_window_app(window);
let appId = app.get_id();
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 app = this._tracker.get_window_app(window);
let source = new Source(app, window);
Main.messageTray.add(source);
let notification = new MessageTray.Notification(source, this._getTitle(app, window), this._getBanner(app, window));
source.notify(notification);
window.connect('notify::title', Lang.bind(this, function(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(); }));
source.signalIDs.push(window.connect('notify::title', Lang.bind(this, function(win) {
notification.update(this._getTitle(app, win), this._getBanner(app, win));
})));
}
};
@ -94,13 +81,27 @@ Source.prototype = {
this._window = window;
this._app = app;
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() {
return this._app.create_icon_texture(this.ICON_SIZE);
},
_notificationClicked : function(notification) {
open : function(notification) {
Main.activateWindow(this._window);
this.destroy();
}

View File

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

View File

@ -125,6 +125,7 @@ WindowClone.prototype = {
dragActorMaxSize: WINDOW_DND_SIZE,
dragActorOpacity: DRAGGING_WINDOW_OPACITY });
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.inDrag = false;
@ -288,10 +289,16 @@ WindowClone.prototype = {
},
_onDragBegin : function (draggable, time) {
[this.dragOrigX, this.dragOrigY] = this.actor.get_position();
this.dragOrigScale = this.actor.scale_x;
this.inDrag = true;
this.emit('drag-begin');
},
_onDragCancelled : function (draggable, time) {
this.emit('drag-cancelled');
},
_onDragEnd : function (draggable, time, snapback) {
this.inDrag = false;
@ -327,6 +334,7 @@ WindowOverlay.prototype = {
this._windowClone = windowClone;
this._parentActor = parentActor;
this._hidden = false;
let title = new St.Label({ style_class: 'window-caption',
text: metaWindow.title });
@ -372,11 +380,13 @@ WindowOverlay.prototype = {
},
hide: function() {
this._hidden = true;
this.closeButton.hide();
this.title.hide();
},
show: function() {
this._hidden = false;
let [x, y, mask] = global.get_pointer();
let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE,
x, y);
@ -387,8 +397,8 @@ WindowOverlay.prototype = {
},
fadeIn: function() {
this.show();
this.title.opacity = 0;
this.title.show();
this._parentActor.raise_top();
Tweener.addTween(this.title,
{ opacity: 255,
@ -419,8 +429,13 @@ WindowOverlay.prototype = {
let button = this.closeButton;
let title = this.title;
let buttonX = cloneX + cloneWidth - button._overlap;
let buttonY = cloneY - button.height + button._overlap;
let buttonX;
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));
if (!title.fullWidth)
@ -475,6 +490,12 @@ WindowOverlay.prototype = {
},
_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.closeButton.show();
this.emit('show-close-button');
@ -515,7 +536,7 @@ WindowOverlay.prototype = {
Signals.addSignalMethods(WindowOverlay.prototype);
const WindowPositionFlags = {
ZOOM: 1 << 0,
INITIAL: 1 << 0,
ANIMATE: 1 << 1
};
@ -531,27 +552,26 @@ Workspace.prototype = {
// When dragging a window, we use this slot for reserve space.
this._reservedSlot = null;
this.metaWorkspace = metaWorkspace;
this._x = 0;
this._y = 0;
this._width = 0;
this._height = 0;
this._windowOverlaysGroup = new Clutter.Group();
// Without this the drop area will be overlapped.
this._windowOverlaysGroup.set_size(0, 0);
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));
// 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());
// Create clones for windows that should be
@ -574,6 +594,22 @@ Workspace.prototype = {
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) {
for (let i = 0; i < this._windows.length; i++) {
if (this._windows[i].metaWindow == metaWindow) {
@ -583,17 +619,6 @@ Workspace.prototype = {
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) {
return this._lookupIndex(metaWindow) >= 0;
},
@ -672,10 +697,20 @@ Workspace.prototype = {
let xDelta, yDelta, distanceSquared;
let actorWidth, actorHeight;
actorWidth = actor.width * actor.scale_x;
actorHeight = actor.height * actor.scale_y;
xDelta = actor.x + actorWidth / 2.0 - xCenter * global.screen_width;
yDelta = actor.y + actorHeight / 2.0 - yCenter * global.screen_height;
let x = actor.x;
let y = actor.y;
let scale = actor.scale_x;
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;
return distanceSquared;
@ -700,6 +735,12 @@ Workspace.prototype = {
let delta = this._computeWindowMotion(cloneActor, slot);
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) {
@ -760,38 +801,35 @@ Workspace.prototype = {
},
/**
* _getSlotRelativeGeometry:
* _getSlotGeometry:
* @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.
*/
_getSlotRelativeGeometry: function(slot) {
_getSlotGeometry: function(slot) {
let [xCenter, yCenter, fraction] = slot;
let width = global.screen_width * fraction;
let height = global.screen_height * fraction;
let width = this._width * fraction;
let height = this._height * fraction;
let x = xCenter * global.screen_width - width / 2;
let y = yCenter * global.screen_height - height / 2;
let x = this._x + xCenter * this._width - width / 2 ;
let y = this._y + yCenter * this._height - height / 2;
return [x, y, width, height];
},
/**
* _computeWindowRelativeLayout:
* _computeWindowLayout:
* @metaWindow: A #MetaWindow
* @slot: A layout slot
*
* 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.
*/
_computeWindowRelativeLayout: function(metaWindow, slot) {
let [xCenter, yCenter, fraction] = slot;
let [x, y, width, height] = this._getSlotRelativeGeometry(slot);
xCenter = xCenter * global.screen_width;
_computeWindowLayout: function(metaWindow, slot) {
let [x, y, width, height] = this._getSlotGeometry(slot);
let rect = metaWindow.get_outer_rect();
let buttonOuterHeight, captionHeight;
@ -799,23 +837,19 @@ Workspace.prototype = {
if (this._windowOverlays[0]) {
[buttonOuterHeight, captionHeight] = this._windowOverlays[0].chromeHeights();
buttonOuterWidth = this._windowOverlays[0].chromeWidth() / this.scale;
buttonOuterWidth = this._windowOverlays[0].chromeWidth();
} else
[buttonOuterHeight, captionHeight] = [0, 0];
buttonOuterHeight /= this.scale;
captionHeight /= this.scale;
let desiredWidth = global.screen_width * fraction;
let desiredHeight = global.screen_height * fraction;
let scale = Math.min((desiredWidth - buttonOuterWidth) / rect.width,
(desiredHeight - buttonOuterHeight - captionHeight) / rect.height,
1.0 / this.scale);
let scale = Math.min((width - buttonOuterWidth) / rect.width,
(height - buttonOuterHeight - captionHeight) / rect.height,
1.0);
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
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
y = Math.floor(y + height - rect.height * scale - captionHeight);
@ -841,7 +875,7 @@ Workspace.prototype = {
/**
* positionWindows:
* @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.
*/
positionWindows : function(flags) {
@ -854,7 +888,7 @@ Workspace.prototype = {
if (this._reservedSlot)
clones.push(this._reservedSlot);
let workspaceZooming = flags & WindowPositionFlags.ZOOM;
let initialPositioning = flags & WindowPositionFlags.INITIAL;
let animate = flags & WindowPositionFlags.ANIMATE;
// Start the animations
@ -876,7 +910,7 @@ Workspace.prototype = {
if (clone.inDrag)
continue;
let [x, y, scale] = this._computeWindowRelativeLayout(metaWindow, slot);
let [x, y, scale] = this._computeWindowLayout(metaWindow, slot);
if (overlay)
overlay.hide();
@ -885,7 +919,7 @@ Workspace.prototype = {
/* Hidden windows should fade in and grow
* therefore we need to resize them now so they
* can be scaled up later */
if (workspaceZooming) {
if (initialPositioning) {
clone.actor.opacity = 0;
clone.actor.scale_x = 0;
clone.actor.scale_y = 0;
@ -906,7 +940,6 @@ Workspace.prototype = {
y: y,
scale_x: scale,
scale_y: scale,
workspace_relative: workspaceZooming ? this : null,
time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
@ -929,7 +962,7 @@ Workspace.prototype = {
let clone = clones[i];
let metaWindow = clone.metaWindow;
if (i == 0) {
clone.setStackAbove(null);
clone.setStackAbove(this._dropRect);
} else {
let previousClone = clones[i - 1];
clone.setStackAbove(previousClone.actor);
@ -949,10 +982,8 @@ Workspace.prototype = {
// be after the workspace animation finishes.
let [cloneX, cloneY] = clone.actor.get_position();
let [cloneWidth, cloneHeight] = clone.actor.get_size();
cloneX = this.x + this.scale * cloneX;
cloneY = this.y + this.scale * cloneY;
cloneWidth = this.scale * clone.actor.scale_x * cloneWidth;
cloneHeight = this.scale * clone.actor.scale_y * cloneHeight;
cloneWidth = clone.actor.scale_x * cloneWidth;
cloneHeight = clone.actor.scale_y * cloneHeight;
if (overlay) {
overlay.updatePositions(cloneX, cloneY, cloneWidth, cloneHeight);
@ -977,12 +1008,10 @@ Workspace.prototype = {
return true;
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 inWorkspace = (this.x < x && x < this.x + wsWidth &&
this.y < y && y < this.y + wsHeight);
let inWorkspace = (this._x < x && x < this._x + this._width &&
this._y < y && y < this._y + this._height);
if (pointerHasMoved && inWorkspace) {
// store current cursor position
@ -1083,13 +1112,20 @@ Workspace.prototype = {
let clone = this._addWindowClone(win);
if (win._overviewHint) {
let x = (win._overviewHint.x - this.actor.x) / this.scale;
let y = (win._overviewHint.y - this.actor.y) / this.scale;
let scale = win._overviewHint.scale / this.scale;
let x = win._overviewHint.x - this.actor.x;
let y = win._overviewHint.y - this.actor.y;
let scale = win._overviewHint.scale;
delete win._overviewHint;
clone.actor.set_position (x, y);
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);
@ -1109,14 +1145,11 @@ Workspace.prototype = {
// Animate the full-screen to Overview transition.
zoomToOverview : function() {
this.actor.set_position(this.x, this.y);
this.actor.set_scale(this.scale, this.scale);
// Position and scale the windows.
if (Main.overview.animationInProgress)
this.positionWindows(WindowPositionFlags.ANIMATE | WindowPositionFlags.ZOOM);
this.positionWindows(WindowPositionFlags.ANIMATE | WindowPositionFlags.INITIAL);
else
this.positionWindows(WindowPositionFlags.ZOOM);
this.positionWindows(WindowPositionFlags.INITIAL);
},
// Animates the return from Overview mode
@ -1134,7 +1167,7 @@ Workspace.prototype = {
this._overviewHiddenId = Main.overview.connect('hidden', Lang.bind(this,
this._doneLeavingOverview));
if (this._metaWorkspace == currentWorkspace)
if (this.metaWorkspace != currentWorkspace)
return;
// Position and scale the windows.
@ -1149,7 +1182,6 @@ Workspace.prototype = {
y: clone.origY,
scale_x: 1.0,
scale_y: 1.0,
workspace_relative: this,
time: Overview.ANIMATION_TIME,
opacity: 255,
transition: 'easeOutQuad'
@ -1160,7 +1192,6 @@ Workspace.prototype = {
{ scale_x: 0,
scale_y: 0,
opacity: 0,
workspace_relative: this,
time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad'
});
@ -1223,6 +1254,10 @@ Workspace.prototype = {
Main.overview.beginWindowDrag();
overlay.hide();
}));
clone.connect('drag-cancelled',
Lang.bind(this, function(clone) {
Main.overview.cancelledWindowDrag();
}));
clone.connect('drag-end',
Lang.bind(this, function(clone) {
Main.overview.endWindowDrag();
@ -1330,56 +1365,3 @@ 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.
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);
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;
function WorkspacesView(width, height, x, y, workspaces) {
this._init(width, height, x, y, workspaces);
function WorkspacesView(workspaces) {
this._init(workspaces);
}
WorkspacesView.prototype = {
_init: function(width, height, x, y, workspaces) {
_init: function(workspaces) {
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
this.actor.set_size(0, 0);
@ -43,19 +42,16 @@ WorkspacesView.prototype = {
function() {
let node = this.actor.get_theme_node();
this._spacing = node.get_length('spacing');
this._computeWorkspacePositions();
this._updateWorkspaceActors(false);
}));
this.actor.connect('notify::mapped',
Lang.bind(this, this._onMappedChanged));
this._width = width;
this._height = height;
this._x = x;
this._y = y;
this._zoomScale = 1.0;
this._width = 0;
this._height = 0;
this._x = 0;
this._y = 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._animating = false; // tweening
this._scrolling = false; // swipe-scrolling
@ -81,6 +77,11 @@ WorkspacesView.prototype = {
for (let w = 0; w < this._workspaces.length; w++)
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,
lower: 0,
@ -109,30 +110,17 @@ WorkspacesView.prototype = {
this._swipeScrollEndId = 0;
},
setZoomScale: function(zoomScale) {
if (zoomScale == this._zoomScale)
return;
setGeometry: function(x, y, width, height) {
if (this._x == x && this._y == y &&
this._width == width && this._height == height)
return;
this._width = width;
this._height = height;
this._x = x;
this._y = y;
this._zoomScale = zoomScale;
if (this._zoomOut) {
// 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);
}));
}
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].setGeometry(x, y, width, height);
},
_lookupWorkspaceForMetaWindow: function (metaWindow) {
@ -154,6 +142,8 @@ WorkspacesView.prototype = {
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++)
this._workspaces[w].zoomFromOverview();
},
@ -162,93 +152,27 @@ WorkspacesView.prototype = {
this.actor.destroy();
},
getScale: function() {
return this._workspaces[0].scale;
},
syncStacking: function(stackIndices) {
for (let i = 0; i < this._workspaces.length; i++)
this._workspaces[i].syncStacking(stackIndices);
},
// Get the grid position of the active workspace.
getActiveWorkspacePosition: function() {
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
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;
}
updateWindowPositions: function() {
for (let w = 0; w < this._workspaces.length; w++)
this._workspaces[w].positionWindows(Workspace.WindowPositionFlags.ANIMATE);
},
_scrollToActive: function(showAnimation) {
let active = global.screen.get_active_workspace_index();
this._computeWorkspacePositions();
this._updateWorkspaceActors(showAnimation);
this._updateScrollAdjustment(active, showAnimation);
},
// Update workspace actors parameters to the values calculated in
// _computeWorkspacePositions()
// Update workspace actors parameters
// @showAnimation: iff %true, transition between states
_updateWorkspaceActors: function(showAnimation) {
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;
@ -257,14 +181,12 @@ WorkspacesView.prototype = {
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) {
let params = { x: workspace.x,
y: workspace.y,
scale_x: workspace.scale,
scale_y: workspace.scale,
opacity: workspace.opacity,
let params = { y: y,
opacity: opacity,
time: WORKSPACE_SWITCH_TIME,
transition: 'easeOutQuad'
};
@ -281,9 +203,8 @@ WorkspacesView.prototype = {
}
Tweener.addTween(workspace.actor, params);
} else {
workspace.actor.set_scale(workspace.scale, workspace.scale);
workspace.actor.set_position(workspace.x, workspace.y);
workspace.actor.opacity = workspace.opacity;
workspace.actor.set_position(0, y);
workspace.actor.opacity = opacity;
if (w == 0)
this._updateVisibility();
}
@ -294,7 +215,6 @@ WorkspacesView.prototype = {
Tweener.removeTweens(workspace.actor);
workspace.y += dy;
workspace.actor.show();
workspace.hideWindowsOverlays();
@ -338,7 +258,6 @@ WorkspacesView.prototype = {
this._lostWorkspaces[l].destroy();
this._lostWorkspaces = [];
this._computeWorkspacePositions();
this._updateWorkspaceActors(false);
},
@ -380,7 +299,6 @@ WorkspacesView.prototype = {
for (let w = oldNumWorkspaces; w < newNumWorkspaces; w++)
this.actor.add_actor(this._workspaces[w].actor);
this._computeWorkspacePositions();
this._updateWorkspaceActors(false);
} else {
this._lostWorkspaces = lostWorkspaces;
@ -399,6 +317,7 @@ WorkspacesView.prototype = {
_onDestroy: function() {
this._scrollAdjustment.run_dispose();
Main.overview.disconnect(this._overviewShowingId);
Main.overview.disconnect(this._overviewShownId);
global.window_manager.disconnect(this._switchWorkspaceNotifyId);
if (this._timeoutId) {
@ -557,12 +476,6 @@ WorkspacesView.prototype = {
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
this._updateVisibility();
},
@ -590,7 +503,7 @@ WorkspacesView.prototype = {
return;
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;
@ -640,6 +553,7 @@ WorkspacesDisplay.prototype = {
this.workspacesView = null;
this._inDrag = false;
this._cancelledDrag = false;
this._zoomOut = false;
this._zoomFraction = 0;
@ -649,6 +563,7 @@ WorkspacesDisplay.prototype = {
this._itemDragBeginId = 0;
this._itemDragEndId = 0;
this._windowDragBeginId = 0;
this._windowDragCancelledId = 0;
this._windowDragEndId = 0;
},
@ -662,43 +577,10 @@ WorkspacesDisplay.prototype = {
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)
this.workspacesView.destroy();
this.workspacesView = newView;
this.workspacesView = new WorkspacesView(this._workspaces);
this._updateWorkspacesGeometry();
this._nWorkspacesNotifyId =
global.screen.connect('notify::n-workspaces',
@ -717,6 +599,9 @@ WorkspacesDisplay.prototype = {
if (this._windowDragBeginId == 0)
this._windowDragBeginId = Main.overview.connect('window-drag-begin',
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)
this._windowDragEndId = Main.overview.connect('window-drag-end',
Lang.bind(this, this._dragEnd));
@ -751,6 +636,10 @@ WorkspacesDisplay.prototype = {
Main.overview.disconnect(this._windowDragBeginId);
this._windowDragBeginId = 0;
}
if (this._windowDragCancelledId > 0) {
Main.overview.disconnect(this._windowDragCancelledId);
this._windowDragCancelledId = 0;
}
if (this._windowDragEndId > 0) {
Main.overview.disconnect(this._windowDragEndId);
this._windowDragEndId = 0;
@ -809,22 +698,34 @@ WorkspacesDisplay.prototype = {
childBox.y2 = box.y2- box.y1;
this._controls.allocate(childBox, flags);
this._updateZoomScale();
this._updateWorkspacesGeometry();
},
_updateZoomScale: function() {
_updateWorkspacesGeometry: function() {
if (!this.workspacesView)
return;
let totalAllocation = this.actor.allocation;
let totalWidth = totalAllocation.x2 - totalAllocation.x1;
let totalHeight = totalAllocation.y2 - totalAllocation.y1;
let width = this.actor.allocation.x2 - this.actor.allocation.x1;
let height = this.actor.allocation.y2 - this.actor.allocation.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 zoomScale = (totalWidth - controlsNatural) / (totalWidth - controlsVisible);
this.workspacesView.setZoomScale(zoomScale);
let [x, y] = this.actor.get_transformed_position();
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() {
@ -890,9 +791,10 @@ WorkspacesDisplay.prototype = {
if (Main.overview.animationInProgress)
return;
let shouldZoom = this._controls.hover || this._inDrag;
let shouldZoom = this._controls.hover || (this._inDrag && !this._cancelledDrag);
if (shouldZoom != this._zoomOut) {
this._zoomOut = shouldZoom;
this._updateWorkspacesGeometry();
if (!this.workspacesView)
return;
@ -902,10 +804,7 @@ WorkspacesDisplay.prototype = {
time: WORKSPACE_SWITCH_TIME,
transition: 'easeOutQuad' });
if (shouldZoom)
this.workspacesView.zoomOut();
else
this.workspacesView.zoomIn();
this.workspacesView.updateWindowPositions();
}
},
@ -915,6 +814,12 @@ WorkspacesDisplay.prototype = {
_dragBegin: function() {
this._inDrag = true;
this._cancelledDrag = false;
this._updateZoom();
},
_dragCancelled: function() {
this._cancelledDrag = true;
this._updateZoom();
},

View File

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

View File

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

152
po/ar.po
View File

@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: HEAD\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-02 19:08+0200\n"
"PO-Revision-Date: 2011-03-02 19:08+0300\n"
"POT-Creation-Date: 2011-03-09 01:12+0200\n"
"PO-Revision-Date: 2011-03-09 01:12+0300\n"
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
"Language-Team: Arabic <doc@arabeyes.org>\n"
"MIME-Version: 1.0\n"
@ -164,27 +164,27 @@ msgid "Execution of '%s' failed:"
msgstr "فشل تنفيذ '%s':"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:195
#: ../js/ui/appDisplay.js:226
msgid "All"
msgstr "الكل"
#: ../js/ui/appDisplay.js:282
#: ../js/ui/appDisplay.js:324
msgid "APPLICATIONS"
msgstr "التطبيقات"
#: ../js/ui/appDisplay.js:312
#: ../js/ui/appDisplay.js:350
msgid "SETTINGS"
msgstr "الإعدادات"
#: ../js/ui/appDisplay.js:572
#: ../js/ui/appDisplay.js:612
msgid "New Window"
msgstr "نافذة جديدة"
#: ../js/ui/appDisplay.js:575
#: ../js/ui/appDisplay.js:615
msgid "Remove from Favorites"
msgstr "أزِل من المفضّلة"
#: ../js/ui/appDisplay.js:576
#: ../js/ui/appDisplay.js:616
msgid "Add to Favorites"
msgstr "أضِف إلى المفضّلة"
@ -344,7 +344,7 @@ msgstr "هذا الأسبوع"
msgid "Next week"
msgstr "الأسبوع القادم"
#: ../js/ui/dash.js:174
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:933
msgid "Remove"
msgstr "أزِل"
@ -352,54 +352,54 @@ msgstr "أزِل"
msgid "Date and Time Settings"
msgstr "إعدادات الوقت و التّأريخ"
#: ../js/ui/dateMenu.js:110
#: ../js/ui/dateMenu.js:111
msgid "Open Calendar"
msgstr "افتح التقويم"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:162
#: ../js/ui/dateMenu.js:164
msgid "%a %b %e, %R:%S"
msgstr "%A %e %B، %R:%S"
#: ../js/ui/dateMenu.js:163
#: ../js/ui/dateMenu.js:165
msgid "%a %b %e, %R"
msgstr "%A %e %B، %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:167
#: ../js/ui/dateMenu.js:169
msgid "%a %R:%S"
msgstr "%A %R:%S"
#: ../js/ui/dateMenu.js:168
#: ../js/ui/dateMenu.js:170
msgid "%a %R"
msgstr "%A %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:175
#: ../js/ui/dateMenu.js:177
msgid "%a %b %e, %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"
msgstr "%A %e %B، %l:%M %p"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:180
#: ../js/ui/dateMenu.js:182
msgid "%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"
msgstr "%A %Ol:%OM %p"
#. 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").
#.
#: ../js/ui/dateMenu.js:207
#: ../js/ui/dateMenu.js:209
msgid "%A %B %e, %Y"
msgstr "%A %e %B، %Y"
@ -476,37 +476,41 @@ msgstr "أكّد"
msgid "Cancel"
msgstr "ألغِ"
#: ../js/ui/lookingGlass.js:587
#: ../js/ui/lookingGlass.js:588
msgid "No extensions installed"
msgstr "لم تثبّت أية امتدادات"
#: ../js/ui/lookingGlass.js:624
#: ../js/ui/lookingGlass.js:625
msgid "Enabled"
msgstr "مفعّل"
#. translators:
#. * 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"
msgstr "معطّل"
#: ../js/ui/lookingGlass.js:628
#: ../js/ui/lookingGlass.js:629
msgid "Error"
msgstr "خطأ"
#: ../js/ui/lookingGlass.js:630
#: ../js/ui/lookingGlass.js:631
msgid "Out of date"
msgstr "غير محدث"
#: ../js/ui/lookingGlass.js:655
#: ../js/ui/lookingGlass.js:656
msgid "View Source"
msgstr "اعرض المصدر"
#: ../js/ui/lookingGlass.js:661
#: ../js/ui/lookingGlass.js:662
msgid "Web Page"
msgstr "صفحة الوب"
#: ../js/ui/messageTray.js:1902
#: ../js/ui/messageTray.js:926
msgid "Open"
msgstr "افتح"
#: ../js/ui/messageTray.js:1963
msgid "System Information"
msgstr "معلومات النظام"
@ -522,18 +526,28 @@ msgstr "النوافذ"
msgid "Applications"
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
#: ../js/ui/panel.js:529
#: ../js/ui/panel.js:560
#, c-format
msgid "Quit %s"
msgstr "أغلق %s"
#. 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".
#: ../js/ui/panel.js:897
#: ../js/ui/panel.js:919
msgid "Activities"
msgstr "الأنشطة"
#: ../js/ui/panel.js:1020
msgid "Panel"
msgstr "اللوحة"
#: ../js/ui/placeDisplay.js:122
#, c-format
msgid "Failed to unmount '%s'"
@ -556,7 +570,7 @@ msgstr "الأماكن والأجهزة"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:612
#: ../js/ui/popupMenu.js:618
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@ -564,11 +578,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:"
msgstr "من فضلك اكتب أمرا:"
#: ../js/ui/searchDisplay.js:295
#: ../js/ui/searchDisplay.js:283
msgid "Searching..."
msgstr "يبحث..."
#: ../js/ui/searchDisplay.js:309
#: ../js/ui/searchDisplay.js:297
msgid "No matching results."
msgstr "لا نتائج مطابقة."
@ -608,47 +622,47 @@ msgstr "بدّل المستخدم"
msgid "Log Out..."
msgstr "اخرج..."
#: ../js/ui/status/accessibility.js:81
#: ../js/ui/status/accessibility.js:62
msgid "Zoom"
msgstr "تقريب"
#: ../js/ui/status/accessibility.js:88
#: ../js/ui/status/accessibility.js:69
msgid "Screen Reader"
msgstr "قارئ الشاشة"
#: ../js/ui/status/accessibility.js:92
#: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard"
msgstr "لوحة مفاتيح على الشاشة"
#: ../js/ui/status/accessibility.js:96
#: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts"
msgstr "تنبيهات بصرية"
#: ../js/ui/status/accessibility.js:99
#: ../js/ui/status/accessibility.js:80
msgid "Sticky Keys"
msgstr "مفاتيح لاصقة"
#: ../js/ui/status/accessibility.js:102
#: ../js/ui/status/accessibility.js:83
msgid "Slow Keys"
msgstr "مفاتيح بطيئة"
#: ../js/ui/status/accessibility.js:105
#: ../js/ui/status/accessibility.js:86
msgid "Bounce Keys"
msgstr "مفاتيح لها صوت"
#: ../js/ui/status/accessibility.js:108
#: ../js/ui/status/accessibility.js:89
msgid "Mouse Keys"
msgstr "مفاتيح الفأرة"
#: ../js/ui/status/accessibility.js:112
#: ../js/ui/status/accessibility.js:93
msgid "Universal Access Settings"
msgstr "إعدادات الإتاحة"
#: ../js/ui/status/accessibility.js:164
#: ../js/ui/status/accessibility.js:145
msgid "High Contrast"
msgstr "تباين عال"
#: ../js/ui/status/accessibility.js:209
#: ../js/ui/status/accessibility.js:182
msgid "Large Text"
msgstr "نص كبير"
@ -831,51 +845,51 @@ msgstr[3] "بقي %d دقائق"
msgstr[4] "بقي %d دقيقة"
msgstr[5] "بقي %d دقيقة"
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:227
msgid "AC adapter"
msgstr "مقبس طاقة"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:229
msgid "Laptop battery"
msgstr "بطارية حاسوب محمول"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:231
msgid "UPS"
msgstr "مزود طاقة لا منقطعة"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:233
msgid "Monitor"
msgstr "شاشة"
#: ../js/ui/status/power.js:249
#: ../js/ui/status/power.js:235
msgid "Mouse"
msgstr "فأرة"
#: ../js/ui/status/power.js:251
#: ../js/ui/status/power.js:237
msgid "Keyboard"
msgstr "لوحة المفاتيح"
#: ../js/ui/status/power.js:253
#: ../js/ui/status/power.js:239
msgid "PDA"
msgstr "مساعد رقمي"
#: ../js/ui/status/power.js:255
#: ../js/ui/status/power.js:241
msgid "Cell phone"
msgstr "هاتف محمول"
#: ../js/ui/status/power.js:257
#: ../js/ui/status/power.js:243
msgid "Media player"
msgstr "مشغل وسائط"
#: ../js/ui/status/power.js:259
#: ../js/ui/status/power.js:245
msgid "Tablet"
msgstr "لوحة"
#: ../js/ui/status/power.js:261
#: ../js/ui/status/power.js:247
msgid "Computer"
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"
msgstr "مجهول"
@ -919,16 +933,20 @@ msgstr "أُرسلت الساعة %l:%M:%S في %A"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/viewSelector.js:103
#: ../js/ui/viewSelector.js:117
msgid "Type to search..."
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
msgid "%s has finished starting"
msgstr "انتهى %s من البدء"
#: ../js/ui/windowAttentionHandler.js:45
#: ../js/ui/windowAttentionHandler.js:44
#, c-format
msgid "'%s' is ready"
msgstr "'%s' جاهز"
@ -963,11 +981,15 @@ msgstr[5] "%u مدخل"
msgid "System Sounds"
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"
msgstr "منذ أقل من دقيقة"
#: ../src/shell-global.c:1302
#: ../src/shell-global.c:1312
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
@ -978,7 +1000,7 @@ msgstr[3] "منذ %d دقائق"
msgstr[4] "منذ %d دقيقة"
msgstr[5] "منذ %d دقيقة"
#: ../src/shell-global.c:1307
#: ../src/shell-global.c:1317
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
@ -989,7 +1011,7 @@ msgstr[3] "منذ %d ساعات"
msgstr[4] "منذ %d ساعة"
msgstr[5] "منذ %d ساعة"
#: ../src/shell-global.c:1312
#: ../src/shell-global.c:1322
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
@ -1000,7 +1022,7 @@ msgstr[3] "منذ %d أيام"
msgstr[4] "منذ %d يوما"
msgstr[5] "منذ %d يوم"
#: ../src/shell-global.c:1317
#: ../src/shell-global.c:1327
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@ -1025,10 +1047,6 @@ msgstr "مجلد المنزل"
msgid "File System"
msgstr "نظام الملفات"
#: ../src/shell-util.c:250
msgid "Search"
msgstr "ابحث"
#. Translators: the first string is the name of a gvfs
#. * method, and the second string is a path. For
#. * 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.
# Copyright (C) 2009 gnome-shell's COPYRIGHT HOLDER
# 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.
# Daniel Mustieles <daniel.mustieles@gmail.com>, 2010, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell.master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&component=general\n"
"POT-Creation-Date: 2011-03-02 00:20+0000\n"
"PO-Revision-Date: 2011-03-02 20:39+0100\n"
"Last-Translator: Jorge González <jorgegonz@svn.gnome.org>\n"
"POT-Creation-Date: 2011-03-09 18:36+0000\n"
"PO-Revision-Date: 2011-03-09 19:37+0100\n"
"Last-Translator: Daniel Mustieles <daniel.mustieles@gmail.com>\n"
"Language-Team: Español <gnome-es-list@gnome.org>\n"
"MIME-Version: 1.0\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»:"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:195
#: ../js/ui/appDisplay.js:226
msgid "All"
msgstr "Todas"
#: ../js/ui/appDisplay.js:282
#: ../js/ui/appDisplay.js:324
msgid "APPLICATIONS"
msgstr "APLICACIONES"
#: ../js/ui/appDisplay.js:312
#: ../js/ui/appDisplay.js:350
msgid "SETTINGS"
msgstr "CONFIGURACIÓN"
#: ../js/ui/appDisplay.js:572
#: ../js/ui/appDisplay.js:612
msgid "New Window"
msgstr "Ventana nueva"
#: ../js/ui/appDisplay.js:575
#: ../js/ui/appDisplay.js:615
msgid "Remove from Favorites"
msgstr "Quitar de los favoritos"
#: ../js/ui/appDisplay.js:576
#: ../js/ui/appDisplay.js:616
msgid "Add to Favorites"
msgstr "Añadir a los favoritos"
@ -373,7 +373,7 @@ msgstr "Esta semana"
msgid "Next week"
msgstr "La semana que viene"
#: ../js/ui/dash.js:174
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:933
msgid "Remove"
msgstr "Quitar"
@ -381,54 +381,54 @@ msgstr "Quitar"
msgid "Date and Time Settings"
msgstr "Ajustes de hora y fecha"
#: ../js/ui/dateMenu.js:110
#: ../js/ui/dateMenu.js:111
msgid "Open Calendar"
msgstr "Abrir calendario"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:162
#: ../js/ui/dateMenu.js:164
msgid "%a %b %e, %R:%S"
msgstr "%a %e de %b, %R:%S"
#: ../js/ui/dateMenu.js:163
#: ../js/ui/dateMenu.js:165
msgid "%a %b %e, %R"
msgstr "%a %e de %b, %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:167
#: ../js/ui/dateMenu.js:169
msgid "%a %R:%S"
msgstr "%a %R:%S"
#: ../js/ui/dateMenu.js:168
#: ../js/ui/dateMenu.js:170
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:175
#: ../js/ui/dateMenu.js:177
msgid "%a %b %e, %l:%M:%S %p"
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"
msgstr "%a %e de %b, %H:%M"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:180
#: ../js/ui/dateMenu.js:182
msgid "%a %l:%M:%S %p"
msgstr "%a %H:%M:%S"
#: ../js/ui/dateMenu.js:181
#: ../js/ui/dateMenu.js:183
msgid "%a %l:%M %p"
msgstr "%a %H:%M"
#. 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").
#.
#: ../js/ui/dateMenu.js:207
#: ../js/ui/dateMenu.js:209
msgid "%A %B %e, %Y"
msgstr "%A, %e de %B de %Y"
@ -508,37 +508,41 @@ msgstr "Confirmar"
msgid "Cancel"
msgstr "Cancelar"
#: ../js/ui/lookingGlass.js:587
#: ../js/ui/lookingGlass.js:588
msgid "No extensions installed"
msgstr "No hay extensiones instaladas"
#: ../js/ui/lookingGlass.js:624
#: ../js/ui/lookingGlass.js:625
msgid "Enabled"
msgstr "Activado"
#. translators:
#. * 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"
msgstr "Desactivado"
#: ../js/ui/lookingGlass.js:628
#: ../js/ui/lookingGlass.js:629
msgid "Error"
msgstr "Error"
#: ../js/ui/lookingGlass.js:630
#: ../js/ui/lookingGlass.js:631
msgid "Out of date"
msgstr "Caducado"
#: ../js/ui/lookingGlass.js:655
#: ../js/ui/lookingGlass.js:656
msgid "View Source"
msgstr "Ver fuente"
#: ../js/ui/lookingGlass.js:661
#: ../js/ui/lookingGlass.js:662
msgid "Web Page"
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"
msgstr "Información del sistema"
@ -554,18 +558,28 @@ msgstr "Ventanas"
msgid "Applications"
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
#: ../js/ui/panel.js:529
#: ../js/ui/panel.js:560
#, c-format
msgid "Quit %s"
msgstr "Salir de %s"
#. 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".
#: ../js/ui/panel.js:897
#: ../js/ui/panel.js:919
msgid "Activities"
msgstr "Actividades"
#: ../js/ui/panel.js:1020
msgid "Panel"
msgstr "Panel"
#: ../js/ui/placeDisplay.js:122
#, c-format
msgid "Failed to unmount '%s'"
@ -588,7 +602,7 @@ msgstr "LUGARES Y DISPOSITIVOS"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:612
#: ../js/ui/popupMenu.js:618
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@ -596,11 +610,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:"
msgstr "Introduzca un comando:"
#: ../js/ui/searchDisplay.js:295
#: ../js/ui/searchDisplay.js:283
msgid "Searching..."
msgstr "Buscando…"
#: ../js/ui/searchDisplay.js:309
#: ../js/ui/searchDisplay.js:297
msgid "No matching results."
msgstr "No se encontró ningún resultado coincidente."
@ -640,47 +654,47 @@ msgstr "Cambiar de usuario"
msgid "Log Out..."
msgstr "Cerrar la sesión…"
#: ../js/ui/status/accessibility.js:81
#: ../js/ui/status/accessibility.js:62
msgid "Zoom"
msgstr "Ampliación"
#: ../js/ui/status/accessibility.js:88
#: ../js/ui/status/accessibility.js:69
msgid "Screen Reader"
msgstr "Lector de pantalla"
#: ../js/ui/status/accessibility.js:92
#: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard"
msgstr "Teclado en pantalla"
#: ../js/ui/status/accessibility.js:96
#: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts"
msgstr "Alertas visuales"
#: ../js/ui/status/accessibility.js:99
#: ../js/ui/status/accessibility.js:80
msgid "Sticky Keys"
msgstr "Teclas persistentes"
#: ../js/ui/status/accessibility.js:102
#: ../js/ui/status/accessibility.js:83
msgid "Slow Keys"
msgstr "Teclas lentas"
#: ../js/ui/status/accessibility.js:105
#: ../js/ui/status/accessibility.js:86
msgid "Bounce Keys"
msgstr "Rechazo de teclas"
#: ../js/ui/status/accessibility.js:108
#: ../js/ui/status/accessibility.js:89
msgid "Mouse Keys"
msgstr "Teclas del ratón"
#: ../js/ui/status/accessibility.js:112
#: ../js/ui/status/accessibility.js:93
msgid "Universal Access Settings"
msgstr "Preferencias del acceso universal"
#: ../js/ui/status/accessibility.js:164
#: ../js/ui/status/accessibility.js:145
msgid "High Contrast"
msgstr "Contraste alto"
#: ../js/ui/status/accessibility.js:209
#: ../js/ui/status/accessibility.js:182
msgid "Large Text"
msgstr "<b>Texto:</b>"
@ -847,51 +861,51 @@ msgid_plural "%d minutes remaining"
msgstr[0] "Queda %d minuto"
msgstr[1] "Queda %d minutos"
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:227
msgid "AC adapter"
msgstr "Adaptador de corriente"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:229
msgid "Laptop battery"
msgstr "Batería del portátil"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:231
msgid "UPS"
msgstr "SAI"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:233
msgid "Monitor"
msgstr "Monitor"
#: ../js/ui/status/power.js:249
#: ../js/ui/status/power.js:235
msgid "Mouse"
msgstr "Ratón"
#: ../js/ui/status/power.js:251
#: ../js/ui/status/power.js:237
msgid "Keyboard"
msgstr "Teclado"
#: ../js/ui/status/power.js:253
#: ../js/ui/status/power.js:239
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:255
#: ../js/ui/status/power.js:241
msgid "Cell phone"
msgstr "Teléfono móvil"
#: ../js/ui/status/power.js:257
#: ../js/ui/status/power.js:243
msgid "Media player"
msgstr "Reproductor multimedia"
#: ../js/ui/status/power.js:259
#: ../js/ui/status/power.js:245
msgid "Tablet"
msgstr "Tableta"
#: ../js/ui/status/power.js:261
#: ../js/ui/status/power.js:247
msgid "Computer"
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"
msgstr "Desconocido"
@ -935,16 +949,20 @@ msgstr "Enviado a las %X el %A"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/viewSelector.js:103
#: ../js/ui/viewSelector.js:117
msgid "Type to search..."
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
msgid "%s has finished starting"
msgstr "%s finalizó su lanzamiento"
#: ../js/ui/windowAttentionHandler.js:45
#: ../js/ui/windowAttentionHandler.js:44
#, c-format
msgid "'%s' is ready"
msgstr "«%s» está preparado"
@ -971,32 +989,36 @@ msgstr[1] "%u entradas"
msgid "System Sounds"
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"
msgstr "Hace menos de un minuto"
#: ../src/shell-global.c:1302
#: ../src/shell-global.c:1312
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "Hace %d minuto"
msgstr[1] "Hace %d minutos"
#: ../src/shell-global.c:1307
#: ../src/shell-global.c:1317
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "Hace %d hora"
msgstr[1] "Hace %d horas"
#: ../src/shell-global.c:1312
#: ../src/shell-global.c:1322
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "Hace %d día"
msgstr[1] "Hace %d días"
#: ../src/shell-global.c:1317
#: ../src/shell-global.c:1327
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@ -1017,10 +1039,6 @@ msgstr "Carpeta personal"
msgid "File System"
msgstr "Sistema de archivos"
#: ../src/shell-util.c:250
msgid "Search"
msgstr "Buscar"
#. Translators: the first string is the name of a gvfs
#. * method, and the second string is a path. For
#. * 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."
"cgi?product=gnome-shell&component=general\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"
"Language-Team: Kannada <kn@li.org>\n"
"MIME-Version: 1.0\n"
@ -20,59 +20,65 @@ msgstr ""
#: ../data/gnome-shell.desktop.in.in.h:1
msgid "GNOME Shell"
msgstr ""
msgstr "GNOME ಶೆಲ್‌"
#: ../data/gnome-shell.desktop.in.in.h:2
msgid "Window management and application launching"
msgstr ""
msgstr "ವಿಂಡೊ ನಿರ್ವಹಣೆ ಹಾಗು ಅನ್ವಯವನ್ನು ಆರಂಭಿಸುವಿಕೆ"
#: ../data/org.gnome.shell.gschema.xml.in.h:1
msgid ""
"Allows access to internal debugging and monitoring tools using the Alt-F2 "
"dialog."
msgstr ""
"Alt-F2 ಸಂವಾದಚೌಕವನ್ನು ಬಳಸಿಕೊಂಡು ಆಂತರಿಕ ದೋಷ ನಿವಾರಣೆ ಹಾಗು ಮೇಲ್ವಿಚಾರಣೆ "
"ಉಪಕರಣಗಳನ್ನು ನಿಲುಕಿಸಿಕೊಳ್ಳಲು ಅನುವುಮಾಡಿಕೊಡುತ್ತದೆ."
#: ../data/org.gnome.shell.gschema.xml.in.h:2
msgid "Enable internal tools useful for developers and testers from Alt-F2"
msgstr ""
"Alt-F2 ಇಂದ ವಿಕಸನೆಗಾರರಿಗೆ ಹಾಗು ಪರೀಕ್ಷಕರಿಗೆ ಉಪಯುಕ್ತವಾಗುವ ಆಂತರಿಕ ಉಪಕರಣಗಳನ್ನು "
"ಶಕ್ತಗೊಳಿಸುತ್ತದೆ"
#: ../data/org.gnome.shell.gschema.xml.in.h:3
msgid "File extension used for storing the screencast"
msgstr ""
msgstr "ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟುಗಳನ್ನು ಶೇಖರಿಸಿಡಲು ಬಳಸಲಾಗುವ ಕಡತ ವಿಸ್ತರಣೆಗಳು"
#: ../data/org.gnome.shell.gschema.xml.in.h:4
msgid "Framerate used for recording screencasts."
msgstr ""
msgstr "ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟುಗಳನ್ನು ರೆಕಾರ್ಡು ಮಾಡಲು ಬಳಸಲಾಗುವ ಫ್ರೇಮ್‌ದರಗಳು."
#: ../data/org.gnome.shell.gschema.xml.in.h:5
msgid ""
"GNOME Shell extensions have a uuid property; this key lists extensions which "
"should not be loaded."
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
msgid "History for command (Alt-F2) dialog"
msgstr ""
msgstr "ಆಜ್ಞೆಯ ಇತಿಹಾಸ (Alt-F2) ಸಂವಾದಚೌಕ"
#: ../data/org.gnome.shell.gschema.xml.in.h:7
msgid "History for the looking glass dialog"
msgstr ""
msgstr "ನೋಡುವ ಗಾಜಿನ ಸಂವಾದ ಚೌಕಕ್ಕಾಗಿನ ಇತಿಹಾಸ"
#: ../data/org.gnome.shell.gschema.xml.in.h:8
msgid "If true, display date in the clock, in addition to time."
msgstr ""
msgstr "true ಆದಲ್ಲಿ, ದಿನಾಂಕವನ್ನು ಸಮಯದ ಜೊತೆಗೆ ಗಡಿಯಾರದಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತದೆ."
#: ../data/org.gnome.shell.gschema.xml.in.h:9
msgid "If true, display seconds in time."
msgstr ""
msgstr "true ಆದಲ್ಲಿ, ಸಮಯದಲ್ಲಿ ಸೆಕೆಂಡುಗಳನ್ನು ತೋರಿಸಲಾಗುತ್ತದೆ."
#: ../data/org.gnome.shell.gschema.xml.in.h:10
msgid "If true, display the ISO week date in the calendar."
msgstr ""
msgstr "true ಆದಲ್ಲಿ, ಕ್ಯಾಲೆಂಡರಿನಲ್ಲಿ ISO ವಾರದ ದಿನವನ್ನು ತೋರಿಸುತ್ತದೆ."
#: ../data/org.gnome.shell.gschema.xml.in.h:11
msgid "List of desktop file IDs for favorite applications"
msgstr ""
msgstr "ಮೆಚ್ಚಿನ ಅನ್ವಯಗಳಿಗಾಗಿನ ಗಣಕತೆರೆ ಕಡತ IDಗಳ ಪಟ್ಟಿ"
#: ../data/org.gnome.shell.gschema.xml.in.h:13
#, no-c-format
@ -91,21 +97,22 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:14
msgid "Show date in clock"
msgstr ""
msgstr "ಗಡಿಯಾರದಲ್ಲಿ ದಿನಾಂಕವನ್ನು ತೋರಿಸು"
#: ../data/org.gnome.shell.gschema.xml.in.h:15
msgid "Show the week date in the calendar"
msgstr ""
msgstr "ಕ್ಯಾಲೆಂಡರಿನಲ್ಲಿ ವಾರದ ದಿನವನ್ನು ತೋರಿಸು"
#: ../data/org.gnome.shell.gschema.xml.in.h:16
msgid "Show time with seconds"
msgstr ""
msgstr "ಸಮಯದೊಂದಿಗೆ ಸೆಕೆಂಡುಗಳನ್ನು ತೋರಿಸು"
#: ../data/org.gnome.shell.gschema.xml.in.h:17
msgid ""
"The applications corresponding to these identifiers will be displayed in the "
"favorites area."
msgstr ""
"ಈ ಐಡೆಂಟಿಫಯರುಗಳಿಗೆ ಅನುಗುಣವಾದ ಅನ್ವಯಗಳನ್ನು ಮೆಚ್ಚಿನವುಗಳ ಜಾಗದಲ್ಲಿ ತೋರಿಸಲಾಗುತ್ತದೆ."
#: ../data/org.gnome.shell.gschema.xml.in.h:18
msgid ""
@ -113,16 +120,21 @@ msgid ""
"current date, and use this extension. It should be changed when recording to "
"a different container format."
msgstr ""
"ರೆಕಾರ್ಡು ಮಾಡಲಾದ ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟುಗಳಿಗಾಗಿನ ಕಡತದ ಹೆಸರು ಪ್ರಸಕ್ತ ದಿನಾಂಕದ "
"ಆಧರಿತವಾದ ಒಂದು ವಿಶೇಷವಾದ ಕಡತದ ಹೆಸರಾಗಿರುತ್ತದೆ, ಹಾಗು ಈ ವಿಸ್ತರಣೆಯನ್ನು ಬಳಸುತ್ತದೆ. "
"ಬೇರೊಂದು ಕಂಟೈನರ್ ಶೈಲಿಗೆ ರೆಕಾರ್ಡ್ ಮಾಡುವಾಗ ಇದನ್ನು ಬದಲಾಯಿಸಬೇಕಾಗುತ್ತದೆ."
#: ../data/org.gnome.shell.gschema.xml.in.h:19
msgid ""
"The framerate of the resulting screencast recordered by GNOME Shell's "
"screencast recorder in frames-per-second."
msgstr ""
"ಪ್ರತಿ ಸೆಕೆಂಡಿನ ಫ್ರೇಮ್‌ಗಳಲ್ಲಿನ GNOME ಶೆಲ್‌ನ ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟ್‍ ರೆಕಾರ್ಡರಿನಿಂದ "
"ರೆಕಾರ್ಡು ಮಾಡಲಾದ ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟಿನ ಫ್ರೇಮ್‌ದರ. "
#: ../data/org.gnome.shell.gschema.xml.in.h:20
msgid "The gstreamer pipeline used to encode the screencast"
msgstr ""
msgstr "ಸ್ಕ್ರೀನ್‌ಕ್ಯಾಸ್ಟ್‍ ಅನ್ನು ಎನ್ಕೋಡ್ ಮಾಡಲು ಬಳಸಲಾಗುವ gstreamer ಪೈಪ್‌ಲೈನ್"
#: ../data/org.gnome.shell.gschema.xml.in.h:21
msgid ""
@ -134,43 +146,43 @@ msgstr ""
#: ../data/org.gnome.shell.gschema.xml.in.h:22
msgid "Uuids of extensions to disable"
msgstr ""
msgstr "ಅಶಕ್ತಗೊಳಿಸಬೇಕಿರುವ Uuidಗಳ ವಿಸ್ತರಣೆಗಳು"
#: ../data/org.gnome.shell.gschema.xml.in.h:23
msgid "Whether to collect stats about applications usage"
msgstr ""
msgstr "ಅನ್ವಯದ ಬಳಕೆಯ ಬಗೆಗಿನ ಅಂಕಿಅಂಶಗಳನ್ನು ಸಂಗ್ರಹಿಸಬೇಕೆ"
#: ../data/org.gnome.shell.gschema.xml.in.h:24
msgid "disabled OpenSearch providers"
msgstr ""
msgstr "ಅಶಕ್ತಗೊಳಿಸಲಾದ OpenSearch ಒದಗಿಸುವವರು"
#: ../js/misc/util.js:86
msgid "Command not found"
msgstr ""
msgstr "ಆಜ್ಞೆಯು ಕಂಡು ಬಂದಿಲ್ಲ"
#. Replace "Error invoking GLib.shell_parse_argv: " with
#. something nicer
#: ../js/misc/util.js:113
msgid "Could not parse command:"
msgstr ""
msgstr "ಆಜ್ಞೆಯನ್ನು ಪಾರ್ಸ್ ಮಾಡಲಾಗಿಲ್ಲ:"
#: ../js/misc/util.js:135
msgid "No such application"
msgstr ""
msgstr "ಅಂತಹ ಯಾವುದೆ ಅನ್ವಯವಿಲ್ಲ"
#: ../js/misc/util.js:148
#, c-format
msgid "Execution of '%s' failed:"
msgstr ""
msgstr "'%s' ಅನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸುವಲ್ಲಿ ವಿಫಲಗೊಂಡಿದೆ:"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:174
msgid "All"
msgstr ""
msgstr "ಎಲ್ಲಾ"
#: ../js/ui/appDisplay.js:261
msgid "APPLICATIONS"
msgstr ""
msgstr "APPLICATIONS"
#: ../js/ui/appDisplay.js:291
msgid "PREFERENCES"
@ -182,21 +194,21 @@ msgstr "ಹೊಸ ವಿಂಡೊ"
#: ../js/ui/appDisplay.js:555
msgid "Remove from Favorites"
msgstr ""
msgstr "ಎಲ್ಲಾ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳನ್ನು ತೆಗೆದುಹಾಕು"
#: ../js/ui/appDisplay.js:556
msgid "Add to Favorites"
msgstr ""
msgstr "ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳಿಗೆ ಸೇರಿಸು"
#: ../js/ui/appFavorites.js:91
#, c-format
msgid "%s has been added to your favorites."
msgstr ""
msgstr "%s ಅನ್ನು ನಿಮ್ಮ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳನ್ನು ಸೇರಿಸಲಾಗಿದೆ."
#: ../js/ui/appFavorites.js:122
#, c-format
msgid "%s has been removed from your favorites."
msgstr ""
msgstr "%s ಅನ್ನು ನಿಮ್ಮ ಅಚ್ಚುಮೆಚ್ಚಿನವುಗಳಿಂದ ತೆಗೆದುಹಾಕಲಾಗಿದೆ."
#. Translators: Shown in calendar event list for all day events
#. * 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
#: ../js/ui/calendar.js:701
msgid "Nothing Scheduled"
msgstr ""
msgstr "ಯಾವುದೂ ಅನುಸೂಚಿತಗೊಂಡಿಲ್ಲ"
#. Translators: Shown on calendar heading when selected day occurs on current year
#: ../js/ui/calendar.js:717
@ -350,11 +362,11 @@ msgstr "ತೆಗೆದು ಹಾಕು"
#: ../js/ui/dateMenu.js:93
msgid "Date and Time Settings"
msgstr ""
msgstr "ದಿನಾಂಕ ಹಾಗು ಸಮಯದ ಸಿದ್ಧತೆಗಳು"
#: ../js/ui/dateMenu.js:112
msgid "Open Calendar"
msgstr ""
msgstr "ಕ್ಯಾಲೆಂಡರನ್ನು ತೆರೆ"
#. Translators: This is the time format with date used
#. in 24-hour mode.
@ -405,72 +417,76 @@ msgstr "%A %B %e, %Y"
#: ../js/ui/docDisplay.js:19
msgid "RECENT ITEMS"
msgstr ""
msgstr "RECENT ITEMS"
#: ../js/ui/endSessionDialog.js:63
#, c-format
msgid "Log Out %s"
msgstr ""
msgstr "%s ಇಂದ ನಿರ್ಗಮಿಸಿ"
#: ../js/ui/endSessionDialog.js:64 ../js/ui/endSessionDialog.js:69
msgid "Log Out"
msgstr ""
msgstr "ನಿರ್ಗಮಿಸಿ"
#: ../js/ui/endSessionDialog.js:65
msgid "Click Log Out to quit these applications and log out of the system."
msgstr ""
"ಈ ಅನ್ವಯದಿಂದ ನಿರ್ಗಮಿಸಿ ನಂತರ ವ್ಯವಸ್ಥೆಯಿಂದ ನಿರ್ಗಮಿಸಲು ನಿರ್ಗಮಿಸು ಅನ್ನು ಒತ್ತಿ."
#: ../js/ui/endSessionDialog.js:66
#, c-format
msgid "%s will be logged out automatically in %d seconds."
msgstr ""
msgstr "%s ರವರು %d ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ಗಮಿಸಲ್ಪಡುತ್ತಾರೆ."
#: ../js/ui/endSessionDialog.js:67
#, c-format
msgid "You will be logged out automatically in %d seconds."
msgstr ""
msgstr "ನೀವು %d ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ನಿರ್ಗಮಿಸಲ್ಪಡುತ್ತಾರೆ."
#: ../js/ui/endSessionDialog.js:68
msgid "Logging out of the system."
msgstr ""
msgstr "ವ್ಯವಸ್ಥೆಯಿಂದ ನಿರ್ಗಮಿಸಲಾಗುತ್ತಿದೆ."
#: ../js/ui/endSessionDialog.js:74 ../js/ui/endSessionDialog.js:78
msgid "Shut Down"
msgstr ""
msgstr "ಸ್ಥಗಿತಗೊಳಿಸು"
#: ../js/ui/endSessionDialog.js:75
msgid "Click Shut Down to quit these applications and shut down the system."
msgstr ""
"ಈ ಅನ್ವಯದಿಂದ ನಿರ್ಗಮಿಸಿ ನಂತರ ವ್ಯವಸ್ಥೆಯನ್ನು ಸ್ಥಗಿತಗೊಳಿಲು ಸ್ಥಗಿತಗೊಳಿಸು ಅನ್ನು "
"ಒತ್ತಿ."
#: ../js/ui/endSessionDialog.js:76
#, c-format
msgid "The system will shut down automatically in %d seconds."
msgstr ""
msgstr "ವ್ಯವಸ್ಥೆಯು %d ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಸ್ಥಗಿತಗೊಳ್ಳುತ್ತದೆ."
#: ../js/ui/endSessionDialog.js:77
msgid "Shutting down the system."
msgstr ""
msgstr "ವ್ಯವಸ್ಥೆಯನ್ನು ಸ್ಥಗಿತಗೊಳಿಸಲಾಗುತ್ತಿದೆ."
#: ../js/ui/endSessionDialog.js:84 ../js/ui/endSessionDialog.js:88
msgid "Restart"
msgstr ""
msgstr "ಮರಳಿ ಆರಂಭಿಸು"
#: ../js/ui/endSessionDialog.js:85
msgid "Click Restart to quit these applications and restart the system."
msgstr ""
"ಈ ಅನ್ವಯದಿಂದ ನಿರ್ಗಮಿಸಿ ಗಣಕವನ್ನು ಮರಳಿ ಅರಂಭಿಸಲು ಮರಳಿ ಆರಂಭಿಸು ಅನ್ನು ಕ್ಲಿಕ್ ಮಾಡಿ."
#: ../js/ui/endSessionDialog.js:86
#, c-format
msgid "The system will restart automatically in %d seconds."
msgstr ""
msgstr "ವ್ಯವಸ್ಥೆಯು %d ಸೆಕೆಂಡುಗಳಲ್ಲಿ ಸ್ವಯಂಚಾಲಿತವಾಗಿ ಮರಳಿ ಆರಂಭಗೊಳ್ಳುತ್ತದೆ."
#: ../js/ui/endSessionDialog.js:87
msgid "Restarting the system."
msgstr ""
msgstr "ನಿಮ್ಮ ವ್ಯವಸ್ಥೆಯನ್ನು ಮರಳಿ ಆರಂಭಿಸಲಾಗುತ್ತಿದೆ."
#: ../js/ui/endSessionDialog.js:395
msgid "Confirm"
msgstr ""
msgstr "ಖಚಿತಪಡಿಸಿ"
#: ../js/ui/endSessionDialog.js:400 ../js/ui/status/bluetooth.js:470
msgid "Cancel"
@ -478,17 +494,17 @@ msgstr "ರದ್ದು ಮಾಡು"
#: ../js/ui/lookingGlass.js:587
msgid "No extensions installed"
msgstr ""
msgstr "ಯಾವುದು ವಿಸ್ತರಣೆಗಳನ್ನು ಅನುಸ್ಥಾಪಿಸಲಾಗಿಲ್ಲ"
#: ../js/ui/lookingGlass.js:624
msgid "Enabled"
msgstr ""
msgstr "ಶಕ್ತಗೊಳಿಸಲಾಗಿದೆ"
#. translators:
#. * The device has been disabled
#: ../js/ui/lookingGlass.js:626 ../src/gvc/gvc-mixer-control.c:1087
msgid "Disabled"
msgstr ""
msgstr "ಅಶಕ್ತಗೊಳಿಸಲಾಗಿದೆ"
#: ../js/ui/lookingGlass.js:628
msgid "Error"
@ -496,11 +512,11 @@ msgstr "ದೋಷ"
#: ../js/ui/lookingGlass.js:630
msgid "Out of date"
msgstr ""
msgstr "ಹಳೆಯದಾಗಿದೆ"
#: ../js/ui/lookingGlass.js:655
msgid "View Source"
msgstr ""
msgstr "ಆಕರವನ್ನು ನೋಡಿ"
#: ../js/ui/lookingGlass.js:661
msgid "Web Page"
@ -526,26 +542,26 @@ msgstr "ಅನ್ವಯಗಳು"
#: ../js/ui/panel.js:478
#, c-format
msgid "Quit %s"
msgstr ""
msgstr "%s ಇಂದ ನಿರ್ಗಮಿಸು"
#. 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".
#: ../js/ui/panel.js:612
msgid "Activities"
msgstr ""
msgstr "ಚಟುವಟಿಕೆಗಳು"
#: ../js/ui/placeDisplay.js:122
#, c-format
msgid "Failed to unmount '%s'"
msgstr ""
msgstr "'%s' ಅನ್ನು ಅವರೋಹಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ"
#: ../js/ui/placeDisplay.js:125
msgid "Retry"
msgstr ""
msgstr "ಮರಳಿ ಆರಂಭಿಸು"
#: ../js/ui/placeDisplay.js:165
msgid "Connect to..."
msgstr ""
msgstr "ಇದಕ್ಕೆ ಸಂಪರ್ಕ ಜೋಡಿಸಿ..."
#: ../js/ui/placeDisplay.js:409
msgid "PLACES & DEVICES"
@ -558,7 +574,7 @@ msgstr "PLACES & DEVICES"
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:506
msgid "toggle-switch-us"
msgstr ""
msgstr "toggle-switch-us"
#: ../js/ui/runDialog.js:201
msgid "Please enter a command:"
@ -570,7 +586,7 @@ msgstr "ಹುಡುಕಲಾಗುತ್ತಿದೆ..."
#: ../js/ui/searchDisplay.js:309
msgid "No matching results."
msgstr ""
msgstr "ಯಾವುದೆ ಫಲಿತಾಂಶಗಳು ತಾಳೆಯಾಗಿಲ್ಲ."
#: ../js/ui/statusMenu.js:102
msgid "Available"
@ -590,7 +606,7 @@ msgstr "ವ್ಯವಸ್ಥೆಯ ಸಿದ್ಧತೆಗಳು"
#: ../js/ui/statusMenu.js:126
msgid "Lock Screen"
msgstr ""
msgstr "ತೆರೆಯನ್ನು ಲಾಕ್ ಮಾಡಿ"
#: ../js/ui/statusMenu.js:130
msgid "Switch User"
@ -598,7 +614,7 @@ msgstr "ಬಳಕೆದಾರನನ್ನು ಬದಲಿಸು"
#: ../js/ui/statusMenu.js:135
msgid "Log Out..."
msgstr ""
msgstr "ನಿರ್ಗಮಿಸಿ..."
#. This is temporarily removed, see
#. http://bugzilla.gnome.org/show_bug.cgi?id=636680
@ -608,51 +624,51 @@ msgstr ""
#. this.menu.addMenuItem(item);
#: ../js/ui/statusMenu.js:149
msgid "Shut Down..."
msgstr ""
msgstr "ಸ್ಥಗಿತಗೊಳಿಸಿ..."
#: ../js/ui/status/accessibility.js:81
msgid "Zoom"
msgstr ""
msgstr "ಗಾತ್ರ ಬದಲಾವಣೆ"
#: ../js/ui/status/accessibility.js:88
msgid "Screen Reader"
msgstr ""
msgstr "ತೆರೆ ಓದುಗ"
#: ../js/ui/status/accessibility.js:92
msgid "Screen Keyboard"
msgstr ""
msgstr "ತೆರೆ ಕೀಲಿಮಣೆ"
#: ../js/ui/status/accessibility.js:96
msgid "Visual Alerts"
msgstr ""
msgstr "ದೃಶ್ಯರೂಪದ ಎಚ್ಚರಿಕೆಗಳು"
#: ../js/ui/status/accessibility.js:99
msgid "Sticky Keys"
msgstr ""
msgstr "ಸ್ಟಿಕಿ ಕೀಲಿಗಳು"
#: ../js/ui/status/accessibility.js:102
msgid "Slow Keys"
msgstr ""
msgstr "ನಿಧಾನ ಕೀಲಿಗಳು"
#: ../js/ui/status/accessibility.js:105
msgid "Bounce Keys"
msgstr ""
msgstr "ಪುಟಿಯುವ ಕೀಲಿಗಳು"
#: ../js/ui/status/accessibility.js:108
msgid "Mouse Keys"
msgstr ""
msgstr "ಮೌಸ್‌ ಕೀಲಿಗಳು"
#: ../js/ui/status/accessibility.js:112
msgid "Universal Access Settings"
msgstr ""
msgstr "ಜಾಗತಿಕ ನಿಲುಕಣೆ ಸಿದ್ಧತೆಗಳು"
#: ../js/ui/status/accessibility.js:164
msgid "High Contrast"
msgstr ""
msgstr "ಅತಿ ಹೆಚ್ಚು ವೈದೃಶ್ಯ"
#: ../js/ui/status/accessibility.js:206
msgid "Large Text"
msgstr ""
msgstr "ದೊಡ್ಡ ಪಠ್ಯ"
#: ../js/ui/status/bluetooth.js:42 ../js/ui/status/bluetooth.js:241
#: ../js/ui/status/bluetooth.js:337 ../js/ui/status/bluetooth.js:371
@ -666,11 +682,11 @@ msgstr "ಗೋಚರಿಕೆ"
#: ../js/ui/status/bluetooth.js:69
msgid "Send Files to Device..."
msgstr ""
msgstr "ಸಾಧನಕ್ಕೆ ಕಡತಗಳನ್ನು ಕಳುಹಿಸಿ..."
#: ../js/ui/status/bluetooth.js:70
msgid "Setup a New Device..."
msgstr ""
msgstr "ಒಂದು ಹೊಸ ಸಾಧನವನ್ನು ಸಿದ್ಧಗೊಳಿಸಿ..."
#: ../js/ui/status/bluetooth.js:95
msgid "Bluetooth Settings"
@ -690,12 +706,12 @@ msgstr "ಕಡತಗಳಿಗಾಗಿ ವೀಕ್ಷಿಸು..."
#: ../js/ui/status/bluetooth.js:242
msgid "Error browsing device"
msgstr ""
msgstr "ಸಾಧನವನ್ನು ವೀಕ್ಷಿಸುವಲ್ಲಿ ದೋಷ"
#: ../js/ui/status/bluetooth.js:243
#, c-format
msgid "The requested device cannot be browsed, error is '%s'"
msgstr ""
msgstr "ಮನವಿ ಸಲ್ಲಿಸಲಾದ ಸಾಧನವನ್ನು ವೀಕ್ಷಿಸಲು ಸಾಧ್ಯವಾಗಿಲ್ಲ, ದೋಷವು '%s' ಆಗಿದೆ"
#: ../js/ui/status/bluetooth.js:251
msgid "Keyboard Settings"
@ -712,20 +728,20 @@ msgstr "ಧ್ವನಿಯ ಸಿದ್ಧತೆಗಳು"
#: ../js/ui/status/bluetooth.js:372
#, c-format
msgid "Authorization request from %s"
msgstr ""
msgstr "%s ಇಂದ ದೃಢೀಕರಣ ದೋಷ"
#: ../js/ui/status/bluetooth.js:378
#, c-format
msgid "Device %s wants access to the service '%s'"
msgstr ""
msgstr "%s ಎಂಬ ಸಾಧನಕ್ಕಾಗಿ '%s' ಎಂಬ ಸೇವೆಯನ್ನು ನಿಲುಕಿಸಿಕೊಳ್ಳಲು ಬಯಸುತ್ತಿದೆ"
#: ../js/ui/status/bluetooth.js:380
msgid "Always grant access"
msgstr ""
msgstr "ಯಾವಾಗಲೂ ಅನುಮತಿಸು"
#: ../js/ui/status/bluetooth.js:381
msgid "Grant this time only"
msgstr ""
msgstr "ಈ ಬಾರಿ ಮಾತ್ರ ಅನುಮತಿಸು"
#: ../js/ui/status/bluetooth.js:382
msgid "Reject"
@ -734,17 +750,17 @@ msgstr "ತಿರಸ್ಕರಿಸು"
#: ../js/ui/status/bluetooth.js:412
#, c-format
msgid "Pairing confirmation for %s"
msgstr ""
msgstr "%s ಗಾಗಿ ಪೇರಿಂಗ್ ಖಚಿತಪಡಿಕೆ"
#: ../js/ui/status/bluetooth.js:418 ../js/ui/status/bluetooth.js:452
#, c-format
msgid "Device %s wants to pair with this computer"
msgstr ""
msgstr "%s ಎನ್ನುವ ಸಾಧನದೊಂದಿಗೆ ಸಂಪರ್ಕ ಜೋಡಿಸಲು ಬಯಸುತ್ತಿದೆ"
#: ../js/ui/status/bluetooth.js:419
#, c-format
msgid "Please confirm whether the PIN '%s' matches the one on the device."
msgstr ""
msgstr "'%s' ಎನ್ನುವ PIN ಸಾಧನದಲ್ಲಿರುವುದಕ್ಕೆ ತಾಳೆಯಾಗುತ್ತದೆಯೆ ಎಂದು ಖಚಿತಪಡಿಸಿ."
#: ../js/ui/status/bluetooth.js:421
msgid "Matches"
@ -757,11 +773,11 @@ msgstr "ತಾಳೆಯಾಗುತ್ತಿಲ್ಲ"
#: ../js/ui/status/bluetooth.js:445
#, c-format
msgid "Pairing request for %s"
msgstr ""
msgstr "%s ಗಾಗಿ ಪೇರಿಂಗ್ ಮನವಿ"
#: ../js/ui/status/bluetooth.js:453
msgid "Please enter the PIN mentioned on the device."
msgstr ""
msgstr "ದಯವಿಟ್ಟು ಸಾಧನದಲ್ಲಿ ಸೂಚಿಸಿರುವ PIN ಅನ್ನು ನಮೂದಿಸಿ."
#: ../js/ui/status/bluetooth.js:469
msgid "OK"
@ -769,51 +785,51 @@ msgstr "ಸರಿ"
#: ../js/ui/status/keyboard.js:72
msgid "Localization Settings"
msgstr ""
msgstr "ಲೋಕಲೈಸೇಶನ್ ಸಿದ್ಧತೆಗಳು"
#: ../js/ui/status/power.js:85
msgid "Power Settings"
msgstr ""
msgstr "ವಿದ್ಯುಚ್ಛಕ್ತಿ ಸಿದ್ಧತೆಗಳು"
#: ../js/ui/status/power.js:112
#, c-format
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%d ಗಂಟೆ ಬಾಕಿ ಇದೆ"
msgstr[1] "%d ಗಂಟೆಗಳು ಬಾಕಿ ಇವೆ"
#. TRANSLATORS: this is a time string, as in "%d hours %d minutes remaining"
#: ../js/ui/status/power.js:115
#, c-format
msgid "%d %s %d %s remaining"
msgstr ""
msgstr "%d %s %d %s ಬಾಕಿ ಇದೆ"
#: ../js/ui/status/power.js:117
msgid "hour"
msgid_plural "hours"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "ಗಂಟೆ"
msgstr[1] "ಗಂಟೆಗಳು"
#: ../js/ui/status/power.js:117
msgid "minute"
msgid_plural "minutes"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "ನಿಮಿಷ"
msgstr[1] "ನಿಮಿಷಗಳು"
#: ../js/ui/status/power.js:120
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%d ನಿಮಿಷ ಬಾಕಿ ಇದೆ"
msgstr[1] "%d ನಿಮಿಷಗಳು ಬಾಕಿ ಇವೆ"
#: ../js/ui/status/power.js:235
msgid "AC adapter"
msgstr ""
msgstr "AC ಅಡಾಪ್ಟರ್"
#: ../js/ui/status/power.js:237
msgid "Laptop battery"
msgstr ""
msgstr "ಲ್ಯಾಪ್‌ಟಾಪ್ ಬ್ಯಾಟರಿ"
#: ../js/ui/status/power.js:239
msgid "UPS"
@ -821,15 +837,15 @@ msgstr "UPS"
#: ../js/ui/status/power.js:241
msgid "Monitor"
msgstr ""
msgstr "ತೆರೆ"
#: ../js/ui/status/power.js:243
msgid "Mouse"
msgstr ""
msgstr "ಮೌಸ್"
#: ../js/ui/status/power.js:245
msgid "Keyboard"
msgstr ""
msgstr "ಕೀಲಿಮಣೆ"
#: ../js/ui/status/power.js:247
msgid "PDA"
@ -837,51 +853,51 @@ msgstr "PDA"
#: ../js/ui/status/power.js:249
msgid "Cell phone"
msgstr ""
msgstr "ಸೆಲ್ ಫೋನ್"
#: ../js/ui/status/power.js:251
msgid "Media player"
msgstr ""
msgstr "ಮೀಡಿಯ ಪ್ಲೇಯರ್"
#: ../js/ui/status/power.js:253
msgid "Tablet"
msgstr ""
msgstr "ಟ್ಯಾಬ್ಲೆಟ್"
#: ../js/ui/status/power.js:255
msgid "Computer"
msgstr ""
msgstr "ಗಣಕ"
#: ../js/ui/status/power.js:257 ../src/shell-app-system.c:1013
msgid "Unknown"
msgstr ""
msgstr "ಗೊತ್ತಿರದ"
#: ../js/ui/status/volume.js:44
msgid "Volume"
msgstr ""
msgstr "ಧ್ವನಿ ಪ್ರಮಾಣ"
#: ../js/ui/status/volume.js:57
msgid "Microphone"
msgstr ""
msgstr "ಮೈಕ್ರೊಫೋನ್"
#: ../js/ui/telepathyClient.js:240
#, c-format
msgid "%s is online."
msgstr ""
msgstr "%s ಆನ್‌ಲೈನ್‌ನಲ್ಲಿದ್ದಾರೆ."
#: ../js/ui/telepathyClient.js:245
#, c-format
msgid "%s is offline."
msgstr ""
msgstr "%s ಆಫ್‌ಲೈನ್‌ನಲ್ಲಿದ್ದಾರೆ."
#: ../js/ui/telepathyClient.js:248
#, c-format
msgid "%s is away."
msgstr ""
msgstr "%s ಆಚೆ ಹೋಗಿದ್ದಾರೆ."
#: ../js/ui/telepathyClient.js:251
#, c-format
msgid "%s is busy."
msgstr ""
msgstr "%s\" ಕಾರ್ಯನಿರತವಾಗಿದ್ದಾರೆ."
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
@ -889,7 +905,7 @@ msgstr ""
#: ../js/ui/telepathyClient.js:349
#, no-c-format
msgid "Sent at %X on %A"
msgstr ""
msgstr "%X ಕ್ಕೆ %A ರಂದು ಕಳುಹಿಸಲಾಗಿದೆ"
#. Translators: this is the text displayed
#. in the search entry when no search is
@ -897,17 +913,17 @@ msgstr ""
#. characters
#: ../js/ui/viewSelector.js:30
msgid "Type to search..."
msgstr ""
msgstr "ಹುಡುಕಲು ನಮೂದಿಸು..."
#: ../js/ui/windowAttentionHandler.js:43
#, c-format
msgid "%s has finished starting"
msgstr ""
msgstr "ಆರಂಭಗೊಳಿಸುವುದನ್ನು %s ಪೂರ್ಣಗೊಳಿಸಿದ್ದಾರೆ"
#: ../js/ui/windowAttentionHandler.js:45
#, c-format
msgid "'%s' is ready"
msgstr ""
msgstr "'%s' ಸಿದ್ಧಗೊಂಡಿದೆ"
#. translators:
#. * The number of sound outputs on a particular device
@ -915,8 +931,8 @@ msgstr ""
#, c-format
msgid "%u Output"
msgid_plural "%u Outputs"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%u ಔಟ್‌ಪುಟ್"
msgstr[1] "%u ಔಟ್‌ಪುಟ್‌ಗಳು"
#. translators:
#. * The number of sound inputs on a particular device
@ -924,58 +940,58 @@ msgstr[1] ""
#, c-format
msgid "%u Input"
msgid_plural "%u Inputs"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%u ಇನ್‌ಪುಟ್"
msgstr[1] "%u ಇನ್‌ಪುಟ್‌ಗಳು"
#: ../src/gvc/gvc-mixer-control.c:1402
msgid "System Sounds"
msgstr ""
msgstr "ವ್ಯವಸ್ಥೆಯ ಧ್ವನಿಗಳು"
#: ../src/shell-global.c:1363
msgid "Less than a minute ago"
msgstr ""
msgstr "ಒಂದು ನಿಮಿಷಕ್ಕೂ ಹಿಂದೆ"
#: ../src/shell-global.c:1367
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%d ನಿಮಿಷದ ಹಿಂದೆ"
msgstr[1] "%d ನಿಮಿಷಗಳ ಹಿಂದೆ"
#: ../src/shell-global.c:1372
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%d ಗಂಟೆಯ ಹಿಂದೆ"
msgstr[1] "%d ಗಂಟೆಗಳ ಹಿಂದೆ"
#: ../src/shell-global.c:1377
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%d ದಿನದ ಹಿಂದೆ"
msgstr[1] "%d ದಿನಗಳ ಹಿಂದೆ"
#: ../src/shell-global.c:1382
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
msgstr[0] ""
msgstr[1] ""
msgstr[0] "%d ವಾರದ ಹಿಂದೆ"
msgstr[1] "%d ವಾರಗಳ ಹಿಂದೆ"
#: ../src/shell-util.c:89
msgid "Home Folder"
msgstr ""
msgstr "ನೆಲೆ ಕಡತಕೋಶ"
#. Translators: this is the same string as the one found in
#. * nautilus
#: ../src/shell-util.c:104
msgid "File System"
msgstr ""
msgstr "ಕಡತ ವ್ಯವಸ್ಥೆ"
#: ../src/shell-util.c:250
msgid "Search"
msgstr ""
msgstr "ಹುಡುಕು"
#. Translators: the first string is the name of a gvfs
#. * method, and the second string is a path. For
@ -987,3 +1003,4 @@ msgstr ""
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"

155
po/nb.po
View File

@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell 2.91.x\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-03-02 20:21+0100\n"
"PO-Revision-Date: 2011-03-02 20:22+0100\n"
"POT-Creation-Date: 2011-03-08 15:24+0100\n"
"PO-Revision-Date: 2011-03-08 15:29+0100\n"
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
"Language-Team: Norwegian Bokmål <i18n-nb@lister.ping.uio.no>\n"
"Language: \n"
@ -167,27 +167,27 @@ msgid "Execution of '%s' failed:"
msgstr "Kjøring av «%s» feilet:"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:195
#: ../js/ui/appDisplay.js:226
msgid "All"
msgstr "Alle"
#: ../js/ui/appDisplay.js:282
#: ../js/ui/appDisplay.js:324
msgid "APPLICATIONS"
msgstr "PROGRAMMER"
#: ../js/ui/appDisplay.js:312
#: ../js/ui/appDisplay.js:350
msgid "SETTINGS"
msgstr "INNSTILLINGER"
#: ../js/ui/appDisplay.js:572
#: ../js/ui/appDisplay.js:612
msgid "New Window"
msgstr "Nytt vindu"
#: ../js/ui/appDisplay.js:575
#: ../js/ui/appDisplay.js:615
msgid "Remove from Favorites"
msgstr "Fjern fra favoritter"
#: ../js/ui/appDisplay.js:576
#: ../js/ui/appDisplay.js:616
msgid "Add to Favorites"
msgstr "Legg til i favoritter"
@ -347,7 +347,7 @@ msgstr "Denne uken"
msgid "Next week"
msgstr "Neste uke"
#: ../js/ui/dash.js:174
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:933
msgid "Remove"
msgstr "Fjern"
@ -355,54 +355,54 @@ msgstr "Fjern"
msgid "Date and Time Settings"
msgstr "Innstillinger for dato og klokkeslett"
#: ../js/ui/dateMenu.js:110
#: ../js/ui/dateMenu.js:111
msgid "Open Calendar"
msgstr "Åpne kalender"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:162
#: ../js/ui/dateMenu.js:164
msgid "%a %b %e, %R:%S"
msgstr "%a %e %b, %R.%S"
#: ../js/ui/dateMenu.js:163
#: ../js/ui/dateMenu.js:165
msgid "%a %b %e, %R"
msgstr "%a %e %b, %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:167
#: ../js/ui/dateMenu.js:169
msgid "%a %R:%S"
msgstr "%a %R.%S"
#: ../js/ui/dateMenu.js:168
#: ../js/ui/dateMenu.js:170
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:175
#: ../js/ui/dateMenu.js:177
msgid "%a %b %e, %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"
msgstr "%a %e %b, %l.%M %p"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:180
#: ../js/ui/dateMenu.js:182
msgid "%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"
msgstr "%a %l.%M %p"
#. 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").
#.
#: ../js/ui/dateMenu.js:207
#: ../js/ui/dateMenu.js:209
msgid "%A %B %e, %Y"
msgstr "%a %e %B, %Y"
@ -482,37 +482,41 @@ msgstr "Bekreft"
msgid "Cancel"
msgstr "Avbryt"
#: ../js/ui/lookingGlass.js:587
#: ../js/ui/lookingGlass.js:588
msgid "No extensions installed"
msgstr "Ingen utvidelser installert"
#: ../js/ui/lookingGlass.js:624
#: ../js/ui/lookingGlass.js:625
msgid "Enabled"
msgstr "Aktivert"
#. translators:
#. * 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"
msgstr "Deaktivert"
#: ../js/ui/lookingGlass.js:628
#: ../js/ui/lookingGlass.js:629
msgid "Error"
msgstr "Feil"
#: ../js/ui/lookingGlass.js:630
#: ../js/ui/lookingGlass.js:631
msgid "Out of date"
msgstr "Utdatert"
#: ../js/ui/lookingGlass.js:655
#: ../js/ui/lookingGlass.js:656
msgid "View Source"
msgstr "Vis kildekode"
#: ../js/ui/lookingGlass.js:661
#: ../js/ui/lookingGlass.js:662
msgid "Web Page"
msgstr "Nettside"
#: ../js/ui/messageTray.js:1902
#: ../js/ui/messageTray.js:926
msgid "Open"
msgstr "Åpne"
#: ../js/ui/messageTray.js:1963
msgid "System Information"
msgstr "Systeminformasjon"
@ -528,18 +532,28 @@ msgstr "Vinduer"
msgid "Applications"
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
#: ../js/ui/panel.js:529
#: ../js/ui/panel.js:532
#, c-format
msgid "Quit %s"
msgstr "Avslutt %s"
#. 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".
#: ../js/ui/panel.js:897
#: ../js/ui/panel.js:893
msgid "Activities"
msgstr "Aktiviteter"
#: ../js/ui/panel.js:994
msgid "Panel"
msgstr "Panel"
#: ../js/ui/placeDisplay.js:122
#, c-format
msgid "Failed to unmount '%s'"
@ -562,7 +576,7 @@ msgstr "STEDER & ENHETER"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:612
#: ../js/ui/popupMenu.js:618
msgid "toggle-switch-us"
msgstr "toggle-switch-intl"
@ -570,11 +584,11 @@ msgstr "toggle-switch-intl"
msgid "Please enter a command:"
msgstr "Oppgi en kommando:"
#: ../js/ui/searchDisplay.js:295
#: ../js/ui/searchDisplay.js:283
msgid "Searching..."
msgstr "Søker …"
#: ../js/ui/searchDisplay.js:309
#: ../js/ui/searchDisplay.js:297
msgid "No matching results."
msgstr "Ingen treff."
@ -614,47 +628,47 @@ msgstr "Bytt bruker"
msgid "Log Out..."
msgstr "Logg ut …"
#: ../js/ui/status/accessibility.js:81
#: ../js/ui/status/accessibility.js:62
msgid "Zoom"
msgstr "Zoom"
#: ../js/ui/status/accessibility.js:88
#: ../js/ui/status/accessibility.js:69
msgid "Screen Reader"
msgstr "Skjermleser"
#: ../js/ui/status/accessibility.js:92
#: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard"
msgstr "Tastatur på skjermen"
#: ../js/ui/status/accessibility.js:96
#: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts"
msgstr "Synlig varsling"
#: ../js/ui/status/accessibility.js:99
#: ../js/ui/status/accessibility.js:80
msgid "Sticky Keys"
msgstr "Klebrige taster"
#: ../js/ui/status/accessibility.js:102
#: ../js/ui/status/accessibility.js:83
msgid "Slow Keys"
msgstr "Trege taster"
#: ../js/ui/status/accessibility.js:105
#: ../js/ui/status/accessibility.js:86
msgid "Bounce Keys"
msgstr "Spretne taster"
#: ../js/ui/status/accessibility.js:108
#: ../js/ui/status/accessibility.js:89
msgid "Mouse Keys"
msgstr "Mustaster"
#: ../js/ui/status/accessibility.js:112
#: ../js/ui/status/accessibility.js:93
msgid "Universal Access Settings"
msgstr "Innstillinger for tilgjengelighet"
#: ../js/ui/status/accessibility.js:164
#: ../js/ui/status/accessibility.js:145
msgid "High Contrast"
msgstr "Høy kontrast"
#: ../js/ui/status/accessibility.js:209
#: ../js/ui/status/accessibility.js:182
msgid "Large Text"
msgstr "Stor tekst"
@ -821,51 +835,51 @@ msgid_plural "%d minutes remaining"
msgstr[0] "%d minutt gjenstår"
msgstr[1] "%d minutter gjenstår"
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:227
msgid "AC adapter"
msgstr "Strømadapter"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:229
msgid "Laptop battery"
msgstr "Batteri på bærbar"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:231
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:233
msgid "Monitor"
msgstr "Skjerm"
#: ../js/ui/status/power.js:249
#: ../js/ui/status/power.js:235
msgid "Mouse"
msgstr "Mus"
#: ../js/ui/status/power.js:251
#: ../js/ui/status/power.js:237
msgid "Keyboard"
msgstr "Tastatur"
#: ../js/ui/status/power.js:253
#: ../js/ui/status/power.js:239
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:255
#: ../js/ui/status/power.js:241
msgid "Cell phone"
msgstr "Mobiltelefon"
#: ../js/ui/status/power.js:257
#: ../js/ui/status/power.js:243
msgid "Media player"
msgstr "Medieavspiller"
#: ../js/ui/status/power.js:259
#: ../js/ui/status/power.js:245
msgid "Tablet"
msgstr "Nettbrett"
#: ../js/ui/status/power.js:261
#: ../js/ui/status/power.js:247
msgid "Computer"
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"
msgstr "Ukjent"
@ -909,16 +923,20 @@ msgstr "Sendt %X på %A"
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters.
#: ../js/ui/viewSelector.js:103
#: ../js/ui/viewSelector.js:117
msgid "Type to search..."
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
msgid "%s has finished starting"
msgstr "%s er ferdig startet"
#: ../js/ui/windowAttentionHandler.js:45
#: ../js/ui/windowAttentionHandler.js:44
#, c-format
msgid "'%s' is ready"
msgstr "«%s» er klar"
@ -945,32 +963,36 @@ msgstr[1] "%u innganger"
msgid "System Sounds"
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"
msgstr "Mindre enn ett minutt siden"
#: ../src/shell-global.c:1302
#: ../src/shell-global.c:1312
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d minutt siden"
msgstr[1] "%d minutter siden"
#: ../src/shell-global.c:1307
#: ../src/shell-global.c:1317
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d time siden"
msgstr[1] "%d timer siden"
#: ../src/shell-global.c:1312
#: ../src/shell-global.c:1322
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d dag siden"
msgstr[1] "%d dager siden"
#: ../src/shell-global.c:1317
#: ../src/shell-global.c:1327
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@ -991,10 +1013,6 @@ msgstr "Hjemmemappe"
msgid "File System"
msgstr "Filsystem"
#: ../src/shell-util.c:250
msgid "Search"
msgstr "Søk"
#. Translators: the first string is the name of a gvfs
#. * method, and the second string is a path. For
#. * example, "Trash: some-directory". It means that the
@ -1004,6 +1022,3 @@ msgstr "Søk"
#, c-format
msgid "%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"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug."
"cgi?product=gnome-shell&component=general\n"
"POT-Creation-Date: 2011-02-23 16:51+0000\n"
"PO-Revision-Date: 2011-02-25 07:31+0530\n"
"POT-Creation-Date: 2011-03-07 16:15+0000\n"
"PO-Revision-Date: 2011-03-08 08:27+0530\n"
"Last-Translator: A S Alam <aalam@users.sf.net>\n"
"Language-Team: Punjabi/Panjabi <punjabi-users@lists.sf.net>\n"
"MIME-Version: 1.0\n"
@ -59,7 +59,6 @@ msgid "History for command (Alt-F2) dialog"
msgstr "ਕਮਾਂਡ (Alt-F2) ਡਾਈਲਾਗ ਲਈ ਅਤੀਤ"
#: ../data/org.gnome.shell.gschema.xml.in.h:7
#| msgid "History for command (Alt-F2) dialog"
msgid "History for the looking glass dialog"
msgstr "ਗਲਾਸ ਡਾਈਲਾਗ ਖੋਜ ਲਈ ਅਤੀਤ"
@ -185,27 +184,27 @@ msgid "Execution of '%s' failed:"
msgstr "'%s' ਚਲਾਉਣ ਲਈ ਫੇਲ੍ਹ:"
#. Translators: Filter to display all applications
#: ../js/ui/appDisplay.js:174
#: ../js/ui/appDisplay.js:226
msgid "All"
msgstr "ਸਭ"
#: ../js/ui/appDisplay.js:261
#: ../js/ui/appDisplay.js:324
msgid "APPLICATIONS"
msgstr "ਐਪਲੀਕੇਸ਼ਨ"
#: ../js/ui/appDisplay.js:291
msgid "PREFERENCES"
msgstr "ਪਸੰਦ"
#: ../js/ui/appDisplay.js:350
msgid "SETTINGS"
msgstr "ਸੈਟਿੰਗ"
#: ../js/ui/appDisplay.js:551
#: ../js/ui/appDisplay.js:612
msgid "New Window"
msgstr "ਨਵੀਂ ਵਿੰਡੋ"
#: ../js/ui/appDisplay.js:555
#: ../js/ui/appDisplay.js:615
msgid "Remove from Favorites"
msgstr "ਪਸੰਦ ਵਿੱਚੋਂ ਹਟਾਓ"
#: ../js/ui/appDisplay.js:556
#: ../js/ui/appDisplay.js:616
msgid "Add to Favorites"
msgstr "ਪਸੰਦ 'ਚ ਸ਼ਾਮਲ ਕਰੋ"
@ -222,19 +221,19 @@ msgstr "%s ਨੂੰ ਤੁਹਾਡੀ ਪਸੰਦ ਤੋਂ ਹਟਾਇਆ
#. Translators: Shown in calendar event list for all day events
#. * 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"
msgid "All Day"
msgstr "ਸਭ ਦਿਨ"
#. Translators: Shown in calendar event list, if 24h format
#: ../js/ui/calendar.js:70
#: ../js/ui/calendar.js:71
msgctxt "event list time"
msgid "%H:%M"
msgstr "%H:%M"
#. Transators: Shown in calendar event list, if 12h format
#: ../js/ui/calendar.js:77
#: ../js/ui/calendar.js:78
msgctxt "event list time"
msgid "%l:%M %p"
msgstr "%l:%M %p"
@ -244,43 +243,43 @@ msgstr "%l:%M %p"
#. * NOTE: These grid abbreviations are always shown together
#. * 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"
msgid "S"
msgstr "ਐ"
#. Translators: Calendar grid abbreviation for Monday
#: ../js/ui/calendar.js:119
#: ../js/ui/calendar.js:120
msgctxt "grid monday"
msgid "M"
msgstr "ਸੋ"
#. Translators: Calendar grid abbreviation for Tuesday
#: ../js/ui/calendar.js:121
#: ../js/ui/calendar.js:122
msgctxt "grid tuesday"
msgid "T"
msgstr "ਮੰ"
#. Translators: Calendar grid abbreviation for Wednesday
#: ../js/ui/calendar.js:123
#: ../js/ui/calendar.js:124
msgctxt "grid wednesday"
msgid "W"
msgstr "ਬੁੱ"
#. Translators: Calendar grid abbreviation for Thursday
#: ../js/ui/calendar.js:125
#: ../js/ui/calendar.js:126
msgctxt "grid thursday"
msgid "T"
msgstr "ਵੀ"
#. Translators: Calendar grid abbreviation for Friday
#: ../js/ui/calendar.js:127
#: ../js/ui/calendar.js:128
msgctxt "grid friday"
msgid "F"
msgstr "ਸ਼ੁੱ"
#. Translators: Calendar grid abbreviation for Saturday
#: ../js/ui/calendar.js:129
#: ../js/ui/calendar.js:130
msgctxt "grid saturday"
msgid "S"
msgstr "ਸ਼"
@ -291,136 +290,136 @@ msgstr "ਸ਼"
#. * so they need to be unique (e.g. Tuesday and Thursday cannot
#. * both be 'T').
#.
#: ../js/ui/calendar.js:142
#: ../js/ui/calendar.js:143
msgctxt "list sunday"
msgid "Su"
msgstr "ਐ"
#. Translators: Event list abbreviation for Monday
#: ../js/ui/calendar.js:144
#: ../js/ui/calendar.js:145
msgctxt "list monday"
msgid "M"
msgstr "ਸੋ"
#. Translators: Event list abbreviation for Tuesday
#: ../js/ui/calendar.js:146
#: ../js/ui/calendar.js:147
msgctxt "list tuesday"
msgid "T"
msgstr "ਮੰ"
#. Translators: Event list abbreviation for Wednesday
#: ../js/ui/calendar.js:148
#: ../js/ui/calendar.js:149
msgctxt "list wednesday"
msgid "W"
msgstr "ਬੁੱ"
#. Translators: Event list abbreviation for Thursday
#: ../js/ui/calendar.js:150
#: ../js/ui/calendar.js:151
msgctxt "list thursday"
msgid "Th"
msgstr "ਵੀ"
#. Translators: Event list abbreviation for Friday
#: ../js/ui/calendar.js:152
#: ../js/ui/calendar.js:153
msgctxt "list friday"
msgid "F"
msgstr "ਸ਼ੁੱ"
#. Translators: Event list abbreviation for Saturday
#: ../js/ui/calendar.js:154
#: ../js/ui/calendar.js:155
msgctxt "list saturday"
msgid "S"
msgstr "ਸ਼"
#. Translators: Text to show if there are no events
#: ../js/ui/calendar.js:701
#: ../js/ui/calendar.js:704
msgid "Nothing Scheduled"
msgstr "ਕੋਈ ਵੀ ਸੈਡਿਊਲ ਨਹੀਂ ਹੈ"
#. 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"
msgid "%A, %B %d"
msgstr "%A, %d %B"
#. 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"
msgid "%A, %B %d, %Y"
msgstr "%A, %d %B %Y"
#: ../js/ui/calendar.js:730
#: ../js/ui/calendar.js:733
msgid "Today"
msgstr "ਅੱਜ"
#: ../js/ui/calendar.js:734
#: ../js/ui/calendar.js:737
msgid "Tomorrow"
msgstr "ਭਲਕ"
#: ../js/ui/calendar.js:743
#: ../js/ui/calendar.js:746
msgid "This week"
msgstr "ਇਹ ਹਫ਼ਤਾ"
#: ../js/ui/calendar.js:751
#: ../js/ui/calendar.js:754
msgid "Next week"
msgstr "ਹਫ਼ਤਾ ਅੱਗੇ"
#: ../js/ui/dash.js:174
#: ../js/ui/dash.js:174 ../js/ui/messageTray.js:933
msgid "Remove"
msgstr "ਹਟਾਓ"
#: ../js/ui/dateMenu.js:93
#: ../js/ui/dateMenu.js:91
msgid "Date and Time Settings"
msgstr "ਮਿਤੀ ਤੇ ਸਮਾਂ ਸੈਟਿੰਗ"
#: ../js/ui/dateMenu.js:112
#: ../js/ui/dateMenu.js:111
msgid "Open Calendar"
msgstr "ਕੈਲੰਡਰ ਖੋਲ੍ਹੋ"
#. Translators: This is the time format with date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:151
#: ../js/ui/dateMenu.js:164
msgid "%a %b %e, %R:%S"
msgstr "%a, %e %b %R:%S"
#: ../js/ui/dateMenu.js:152
#: ../js/ui/dateMenu.js:165
msgid "%a %b %e, %R"
msgstr "%a %e %b, %R"
#. Translators: This is the time format without date used
#. in 24-hour mode.
#: ../js/ui/dateMenu.js:156
#: ../js/ui/dateMenu.js:169
msgid "%a %R:%S"
msgstr "%a %R:%S"
#: ../js/ui/dateMenu.js:157
#: ../js/ui/dateMenu.js:170
msgid "%a %R"
msgstr "%a %R"
#. Translators: This is a time format with date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:164
#: ../js/ui/dateMenu.js:177
msgid "%a %b %e, %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"
msgstr "%a %e %b, %l:%M %p"
#. Translators: This is a time format without date used
#. for AM/PM.
#: ../js/ui/dateMenu.js:169
#: ../js/ui/dateMenu.js:182
msgid "%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"
msgstr "%a %l:%M %p"
#. 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").
#.
#: ../js/ui/dateMenu.js:196
#: ../js/ui/dateMenu.js:209
msgid "%A %B %e, %Y"
msgstr "%A, %e %B %Y"
@ -499,37 +498,41 @@ msgstr "ਪੁਸ਼ਟੀ"
msgid "Cancel"
msgstr "ਰੱਦ ਕਰੋ"
#: ../js/ui/lookingGlass.js:587
#: ../js/ui/lookingGlass.js:588
msgid "No extensions installed"
msgstr "ਕੋਈ ਇਕਸਟੈਨਸ਼ਨ ਇੰਸਟਾਲ ਨਹੀਂ ਹੈ"
#: ../js/ui/lookingGlass.js:624
#: ../js/ui/lookingGlass.js:625
msgid "Enabled"
msgstr "ਚਾਲੂ ਹੈ"
#. translators:
#. * 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"
msgstr "ਬੰਦ ਹੈ"
#: ../js/ui/lookingGlass.js:628
#: ../js/ui/lookingGlass.js:629
msgid "Error"
msgstr "ਗਲਤੀ"
#: ../js/ui/lookingGlass.js:630
#: ../js/ui/lookingGlass.js:631
msgid "Out of date"
msgstr "ਪੁਰਾਣਾ"
#: ../js/ui/lookingGlass.js:655
#: ../js/ui/lookingGlass.js:656
msgid "View Source"
msgstr "ਸਰੋਤ ਵੇਖੋ"
#: ../js/ui/lookingGlass.js:661
#: ../js/ui/lookingGlass.js:662
msgid "Web Page"
msgstr "ਵੈੱਬ ਪੇਜ਼"
#: ../js/ui/messageTray.js:1902
#: ../js/ui/messageTray.js:926
msgid "Open"
msgstr "ਖੋਲ੍ਹੋ"
#: ../js/ui/messageTray.js:1963
msgid "System Information"
msgstr "ਸਿਸਟਮ ਜਾਣਕਾਰੀ"
@ -545,18 +548,29 @@ msgstr "ਵਿੰਡੋ"
msgid "Applications"
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
#: ../js/ui/panel.js:537
#: ../js/ui/panel.js:532
#, c-format
msgid "Quit %s"
msgstr "%s ਬੰਦ ਕਰੋ"
#. 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".
#: ../js/ui/panel.js:772
#: ../js/ui/panel.js:893
msgid "Activities"
msgstr "ਸਰਗਰਮੀਆਂ"
#: ../js/ui/panel.js:994
#| msgid "Cancel"
msgid "Panel"
msgstr "ਪੈਨਲ"
#: ../js/ui/placeDisplay.js:122
#, c-format
msgid "Failed to unmount '%s'"
@ -579,7 +593,7 @@ msgstr "ਥਾਵਾਂ ਤੇ ਜੰਤਰ"
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
#. switches containing "◯" and "|"). Other values will
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:612
#: ../js/ui/popupMenu.js:618
msgid "toggle-switch-us"
msgstr "toggle-switch-us"
@ -587,92 +601,91 @@ msgstr "toggle-switch-us"
msgid "Please enter a command:"
msgstr "ਕਮਾਂਡ ਦਿਓ ਜੀ:"
#: ../js/ui/searchDisplay.js:295
#: ../js/ui/searchDisplay.js:283
msgid "Searching..."
msgstr "ਖੋਜ ਜਾਰੀ ਹੈ..."
#: ../js/ui/searchDisplay.js:309
#: ../js/ui/searchDisplay.js:297
msgid "No matching results."
msgstr "ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ ਲੱਭਿਆ।"
#: ../js/ui/statusMenu.js:99 ../js/ui/statusMenu.js:163
#: ../js/ui/statusMenu.js:102 ../js/ui/statusMenu.js:166
msgid "Power Off..."
msgstr "...ਬੰਦ ਕਰੋ"
#: ../js/ui/statusMenu.js:101 ../js/ui/statusMenu.js:162
#| msgid "Suspend..."
#: ../js/ui/statusMenu.js:104 ../js/ui/statusMenu.js:165
msgid "Suspend"
msgstr "ਸਸਪੈਂਡ"
#: ../js/ui/statusMenu.js:122
#: ../js/ui/statusMenu.js:125
msgid "Available"
msgstr "ਉਪਲੱਬਧ"
#: ../js/ui/statusMenu.js:127
#: ../js/ui/statusMenu.js:130
msgid "Busy"
msgstr "ਰੁਝਿਆ"
#: ../js/ui/statusMenu.js:135
#: ../js/ui/statusMenu.js:138
msgid "My Account"
msgstr "ਮੇਰਾ ਅਕਾਊਂਟ"
#: ../js/ui/statusMenu.js:139
#: ../js/ui/statusMenu.js:142
msgid "System Settings"
msgstr "ਸਿਸਟਮ ਸੈਟਿੰਗ"
#: ../js/ui/statusMenu.js:146
#: ../js/ui/statusMenu.js:149
msgid "Lock Screen"
msgstr "ਸਕਰੀਨ ਲਾਕ ਕਰੋ"
#: ../js/ui/statusMenu.js:150
#: ../js/ui/statusMenu.js:153
msgid "Switch User"
msgstr "ਯੂਜ਼ਰ ਬਦਲੋ"
#: ../js/ui/statusMenu.js:155
#: ../js/ui/statusMenu.js:158
msgid "Log Out..."
msgstr "...ਲਾਗਆਉਟ"
#: ../js/ui/status/accessibility.js:81
#: ../js/ui/status/accessibility.js:62
msgid "Zoom"
msgstr "ਜ਼ੂਮ"
#: ../js/ui/status/accessibility.js:88
#: ../js/ui/status/accessibility.js:69
msgid "Screen Reader"
msgstr "ਸਕਰੀਨ ਰੀਡਰ"
#: ../js/ui/status/accessibility.js:92
#: ../js/ui/status/accessibility.js:73
msgid "Screen Keyboard"
msgstr "ਸਕਰੀਨ ਕੀਬੋਰਡ"
#: ../js/ui/status/accessibility.js:96
#: ../js/ui/status/accessibility.js:77
msgid "Visual Alerts"
msgstr "ਦਿੱਖ ਚੇਤਾਵਨੀ"
#: ../js/ui/status/accessibility.js:99
#: ../js/ui/status/accessibility.js:80
msgid "Sticky Keys"
msgstr "ਸਟਿੱਕੀ ਸਵਿੱਚਾਂ"
#: ../js/ui/status/accessibility.js:102
#: ../js/ui/status/accessibility.js:83
msgid "Slow Keys"
msgstr "ਹੌਲੀ ਸਵਿੱਚਾਂ"
#: ../js/ui/status/accessibility.js:105
#: ../js/ui/status/accessibility.js:86
msgid "Bounce Keys"
msgstr "ਬਾਊਂਸ ਸਵਿੱਚਾਂ"
#: ../js/ui/status/accessibility.js:108
#: ../js/ui/status/accessibility.js:89
msgid "Mouse Keys"
msgstr "ਮਾਊਸ ਸਵਿੱਚਾਂ"
#: ../js/ui/status/accessibility.js:112
#: ../js/ui/status/accessibility.js:93
msgid "Universal Access Settings"
msgstr "ਯੂਨੀਵਰਸਲ ਅਸੈੱਸ ਸੈਟਿੰਗ"
#: ../js/ui/status/accessibility.js:164
#: ../js/ui/status/accessibility.js:145
msgid "High Contrast"
msgstr "ਵੱਧ ਕਨਟਰਾਸਟ"
#: ../js/ui/status/accessibility.js:209
#: ../js/ui/status/accessibility.js:182
msgid "Large Text"
msgstr "ਵੱਡੇ ਅੱਖਰ"
@ -801,7 +814,13 @@ msgstr "ਲੋਕਲਾਈਜ਼ੇਸ਼ਨ ਸੈਟਿੰਗ"
msgid "Power Settings"
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
msgid "%d hour remaining"
msgid_plural "%d hours remaining"
@ -809,75 +828,75 @@ msgstr[0] "%d ਘੰਟਾ ਬਾਕੀ"
msgstr[1] "%d ਘੰਟੇ ਬਾਕੀ"
#. 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
msgid "%d %s %d %s remaining"
msgstr "%d %s %d %s ਬਾਕੀ"
#: ../js/ui/status/power.js:117
#: ../js/ui/status/power.js:122
msgid "hour"
msgid_plural "hours"
msgstr[0] "ਘੰਟਾ"
msgstr[1] "ਘੰਟੇ"
#: ../js/ui/status/power.js:117
#: ../js/ui/status/power.js:122
msgid "minute"
msgid_plural "minutes"
msgstr[0] "ਮਿੰਟ"
msgstr[1] "ਮਿੰਟ"
#: ../js/ui/status/power.js:120
#: ../js/ui/status/power.js:125
#, c-format
msgid "%d minute remaining"
msgid_plural "%d minutes remaining"
msgstr[0] "%d ਮਿੰਟ ਬਾਕੀ"
msgstr[1] "%d ਮਿੰਟ ਬਾਕੀ"
#: ../js/ui/status/power.js:235
#: ../js/ui/status/power.js:227
msgid "AC adapter"
msgstr "AC ਐਡਪਟਰ"
#: ../js/ui/status/power.js:237
#: ../js/ui/status/power.js:229
msgid "Laptop battery"
msgstr "ਲੈਪਟਾਪ ਬੈਟਰੀ"
#: ../js/ui/status/power.js:239
#: ../js/ui/status/power.js:231
msgid "UPS"
msgstr "UPS"
#: ../js/ui/status/power.js:241
#: ../js/ui/status/power.js:233
msgid "Monitor"
msgstr "ਮਾਨੀਟਰ"
#: ../js/ui/status/power.js:243
#: ../js/ui/status/power.js:235
msgid "Mouse"
msgstr "ਮਾਊਸ"
#: ../js/ui/status/power.js:245
#: ../js/ui/status/power.js:237
msgid "Keyboard"
msgstr "ਕੀਬੋਰਡ"
#: ../js/ui/status/power.js:247
#: ../js/ui/status/power.js:239
msgid "PDA"
msgstr "PDA"
#: ../js/ui/status/power.js:249
#: ../js/ui/status/power.js:241
msgid "Cell phone"
msgstr "ਸੈੱਲ ਫੋਨ"
#: ../js/ui/status/power.js:251
#: ../js/ui/status/power.js:243
msgid "Media player"
msgstr "ਮੀਡਿਆ ਪਲੇਅਰ"
#: ../js/ui/status/power.js:253
#: ../js/ui/status/power.js:245
msgid "Tablet"
msgstr "ਟੇਬਲੇਟ"
#: ../js/ui/status/power.js:255
#: ../js/ui/status/power.js:247
msgid "Computer"
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"
msgstr "ਅਣਜਾਣ"
@ -889,22 +908,22 @@ msgstr "ਆਵਾਜ਼"
msgid "Microphone"
msgstr "ਮਾਈਕਰੋਫੋਨ"
#: ../js/ui/telepathyClient.js:240
#: ../js/ui/telepathyClient.js:239
#, c-format
msgid "%s is online."
msgstr "%s ਆਨਲਾਈਨ ਹੈ।"
#: ../js/ui/telepathyClient.js:245
#: ../js/ui/telepathyClient.js:244
#, c-format
msgid "%s is offline."
msgstr "%s ਆਫਲਾਈਨ ਹੈ।"
#: ../js/ui/telepathyClient.js:248
#: ../js/ui/telepathyClient.js:247
#, c-format
msgid "%s is away."
msgstr "%s ਦੂਰ ਹੈ।"
#: ../js/ui/telepathyClient.js:251
#: ../js/ui/telepathyClient.js:250
#, c-format
msgid "%s is busy."
msgstr "%s ਰੁੱਝਿਆ/ਰੁੱਝੀ ਹੈ।"
@ -912,7 +931,7 @@ msgstr "%s ਰੁੱਝਿਆ/ਰੁੱਝੀ ਹੈ।"
#. Translators: this is a time format string followed by a date.
#. If applicable, replace %X with a strftime format valid for your
#. locale, without seconds.
#: ../js/ui/telepathyClient.js:349
#: ../js/ui/telepathyClient.js:348
#, no-c-format
msgid "Sent at %X on %A"
msgstr "%2$A ਨੂੰ %1$X ਵਜੇ ਭੇਜਿਆ"
@ -920,17 +939,21 @@ msgstr "%2$A ਨੂੰ %1$X ਵਜੇ ਭੇਜਿਆ"
#. Translators: this is the text displayed
#. in the search entry when no search is
#. active; it should not exceed ~30
#. characters
#: ../js/ui/viewSelector.js:30
#. characters.
#: ../js/ui/viewSelector.js:117
msgid "Type to search..."
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
msgid "%s has finished starting"
msgstr "%s ਸ਼ੁਰੂ ਹੋਣਾ ਖਤਮ ਹੋਇਆ"
#: ../js/ui/windowAttentionHandler.js:45
#: ../js/ui/windowAttentionHandler.js:44
#, c-format
msgid "'%s' is ready"
msgstr "'%s' ਤਿਆਰ ਹੈ"
@ -957,32 +980,32 @@ msgstr[1] "%u ਇੰਪੁੱਟ"
msgid "System Sounds"
msgstr "ਸਿਸਟਮ ਸਾਊਂਡ"
#: ../src/shell-global.c:1363
#: ../src/shell-global.c:1298
msgid "Less than a minute ago"
msgstr "ਇੱਕ ਮਿੰਟ ਤੋਂ ਘੱਟ ਚਿਰ ਪਹਿਲਾਂ"
#: ../src/shell-global.c:1367
#: ../src/shell-global.c:1302
#, c-format
msgid "%d minute ago"
msgid_plural "%d minutes ago"
msgstr[0] "%d ਮਿੰਟ ਪਹਿਲਾਂ"
msgstr[1] "%d ਮਿੰਟ ਪਹਿਲਾਂ"
#: ../src/shell-global.c:1372
#: ../src/shell-global.c:1307
#, c-format
msgid "%d hour ago"
msgid_plural "%d hours ago"
msgstr[0] "%d ਘੰਟਾ ਪਹਿਲਾਂ"
msgstr[1] "%d ਘੰਟੇ ਪਹਿਲਾਂ"
#: ../src/shell-global.c:1377
#: ../src/shell-global.c:1312
#, c-format
msgid "%d day ago"
msgid_plural "%d days ago"
msgstr[0] "%d ਦਿਨ ਪਹਿਲਾਂ"
msgstr[1] "%d ਦਿਨ ਪਹਿਲਾਂ"
#: ../src/shell-global.c:1382
#: ../src/shell-global.c:1317
#, c-format
msgid "%d week ago"
msgid_plural "%d weeks ago"
@ -990,8 +1013,9 @@ msgstr[0] "%d ਹਫ਼ਤਾ ਪਹਿਲਾਂ"
msgstr[1] "%d ਹਫ਼ਤੇ ਪਹਿਲਾਂ"
#: ../src/shell-polkit-authentication-agent.c:334
msgid "Authentation dialog was dismissed by the user"
msgstr "ਪਰਮਾਣਕਿਤਾ ਡਾਈਲਾਗ ਯੂਜ਼ਰ ਨੇ ਰੱਦ ਕੀਤਾ"
#| msgid "Authentation dialog was dismissed by the user"
msgid "Authentication dialog was dismissed by the user"
msgstr "ਪਰਮਾਣਕਿਤਾ ਡਾਈਲਾਗ ਯੂਜ਼ਰ ਵਲੋਂ ਰੱਦ ਕੀਤਾ"
#: ../src/shell-util.c:89
msgid "Home Folder"
@ -1003,10 +1027,6 @@ msgstr "ਘਰ ਫੋਲਡਰ"
msgid "File System"
msgstr "ਫਾਇਲ ਸਿਸਟਮ"
#: ../src/shell-util.c:250
msgid "Search"
msgstr "ਖੋਜ"
#. Translators: the first string is the name of a gvfs
#. * method, and the second string is a path. For
#. * example, "Trash: some-directory". It means that the
@ -1017,6 +1037,9 @@ msgstr "ਖੋਜ"
msgid "%1$s: %2$s"
msgstr "%1$s: %2$s"
#~ msgid "PREFERENCES"
#~ msgstr "ਪਸੰਦ"
#~ msgid "Clip the crosshairs at the center"
#~ 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
#. simply result in invisible toggle switches.
#: ../js/ui/popupMenu.js:33
#, fuzzy
msgid "toggle-switch-us"
msgstr "முறைமை-மாற்றி-யூஎஸ்"
msgstr "toggle-switch-us"
#: ../js/ui/runDialog.js:233
msgid "Please enter a command:"
@ -718,39 +719,3 @@ msgstr "தேடு"
msgid "%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) 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

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_LIBS = libgvc.la
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)
INTROSPECTION_GIRS =
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)
typelib_DATA = $(INTROSPECTION_GIRS:.gir=.typelib)
CLEANFILES += $(gir_DATA) $(typelib_DATA)
generated_bin_scripts = gnome-shell-installed gnome-shell-jhbuild gnome-shell-extension-tool
bin_SCRIPTS += gnome-shell $(generated_bin_scripts)
bin_SCRIPTS += gnome-shell-extension-tool
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|@libexecdir[@]|$(libexecdir)|" \
-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
$(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
$(AM_V_GEN) sed $(generated_script_substitutions) $< > $@.tmp && mv $@.tmp $@ && chmod a+x $@
if USE_JHBUILD_WRAPPER_SCRIPT
gnome-shell: gnome-shell-jhbuild Makefile
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)
CLEANFILES += gnome-shell $(bin_SCRIPTS)
EXTRA_DIST += $(bin_SCRIPTS:=.in)
include Makefile-gdmuser.am
include Makefile-st.am
@ -57,17 +60,17 @@ include Makefile-gvc.am
include Makefile-calendar-server.am
gnome_shell_cflags = \
$(MUTTER_PLUGIN_CFLAGS) \
$(LIBGNOMEUI_CFLAGS) \
$(GNOME_SHELL_CFLAGS) \
-I$(srcdir)/tray \
-DVERSION=\"$(VERSION)\" \
-DLOCALEDIR=\"$(datadir)/locale\" \
-DGNOME_SHELL_LIBEXECDIR=\"$(libexecdir)\" \
-DGNOME_SHELL_DATADIR=\"$(pkgdatadir)\" \
-DGNOME_SHELL_PKGLIBDIR=\"$(pkglibdir)\" \
-DJSDIR=\"$(pkgdatadir)/js\"
plugindir = $(MUTTER_PLUGIN_DIR)
plugin_LTLIBRARIES = libgnome-shell.la
privlibdir = $(pkglibdir)
privlib_LTLIBRARIES = libgnome-shell.la
shell_built_sources = \
shell-marshal.h \
@ -134,6 +137,12 @@ libgnome_shell_la_SOURCES = \
libgnome_shell_la_gir_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 = \
@ -216,9 +225,9 @@ stamp-shell-enum-types.h: $(srcdir)/shell-enum-types.h.in $(shell_public_headers
$(AM_V_GEN) ( cd $(srcdir) && \
$(GLIB_MKENUMS) \
--template $< \
$(shell_public_headers_h) ) > $@.tmp && \
(cmp -s $@.tmp shell-enum-types.h || mv $@.tmp shell-enum-types.h) && \
rm -f $@.tmp && \
$(shell_public_headers_h) ) > $(@F).tmp && \
(cmp -s $(@F).tmp shell-enum-types.h || mv $(@F).tmp shell-enum-types.h) && \
rm -f $(@F).tmp && \
echo timestamp > $(@F)
EXTRA_DIST += shell-enum-types.h.in
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) && \
$(GLIB_MKENUMS) \
--template $< \
$(shell_public_headers_h) ) > $@.tmp && \
mv $@.tmp $@ && \
rm -f $@.tmp
$(shell_public_headers_h) ) > $(@F).tmp && \
mv $(@F).tmp $(@F) && \
rm -f $(@F).tmp
EXTRA_DIST += shell-enum-types.c.in
libgnome_shell_la_LDFLAGS = -avoid-version -module
libgnome_shell_la_LIBADD = \
libgnome_shell_la_LDFLAGS = -avoid-version
libgnome_shell_la_LIBADD = \
-lm \
$(MUTTER_PLUGIN_LIBS) \
$(LIBGNOMEUI_LIBS) \
$(GNOME_SHELL_LIBS) \
$(BLUETOOTH_LIBS) \
libst-1.0.la \
libgdmuser-1.0.la \
@ -244,7 +252,7 @@ libgnome_shell_la_LIBADD = \
libgvc.la \
$(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_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_FILES = $(addprefix $(srcdir)/,$(libgnome_shell_la_gir_sources))
Shell_0_1_gir_SCANNERFLAGS = --include-uninstalled=$(builddir)/St-1.0.gir \
--add-include-path=$(MUTTER_LIB_DIR)/mutter/ \
--program=mutter \
--program-arg=--mutter-plugins=`pwd`/libgnome-shell.la
--add-include-path=$(MUTTER_GIR_DIR)
INTROSPECTION_GIRS += Shell-0.1.gir
CLEANFILES += Shell-0.1.gir
St-1.0.gir: libst-1.0.la
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))) \
$(addprefix $(srcdir)/,$(st_source_c))
INTROSPECTION_GIRS += St-1.0.gir
CLEANFILES += St-1.0.gir
Gdm-1.0.gir: libgdmuser-1.0.la
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))) \
$(addprefix $(srcdir)/,$(gdmuser_source_c))
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()
def start_shell(perf_output=None):
bin_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
if os.path.exists(os.path.join(bin_dir, 'gnome-shell-jhbuild.in')):
self_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
if os.path.exists(os.path.join(self_dir, 'gnome-shell-jhbuild.in')):
running_from_source_tree = True
top_dir = os.path.dirname(bin_dir)
plugin = os.path.join(top_dir, 'src', 'libgnome-shell.la')
top_dir = os.path.dirname(self_dir)
typelib_dir = os.path.join(top_dir, "src")
js_dir = os.path.join(top_dir, "js")
data_dir = os.path.join(top_dir, "data")
else:
running_from_source_tree = False
plugin = 'libgnome-shell'
js_dir = os.path.join('@pkgdatadir@', 'js')
# Set up environment
@ -166,13 +164,13 @@ def start_shell(perf_output=None):
# below. Otherwise it's just a bad reimplementation of "jhbuild
# run". See bug #642084
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_DATA_DIRS' : '@datadir@:' + (os.environ.get('XDG_DATA_DIRS') or '/usr/local/share:/usr/share')})
if running_from_source_tree:
if os.environ.has_key('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,
'GI_TYPELIB_PATH' : typelib_dir,
'GSETTINGS_SCHEMA_DIR' : data_dir })
@ -191,15 +189,14 @@ def start_shell(perf_output=None):
if perf_output is not None:
env['SHELL_PERF_OUTPUT'] = perf_output
args = []
if options.debug:
debug_command = options.debug_command.split()
args = list(debug_command)
else:
args = []
if running_from_source_tree:
args += [os.path.join(top_dir, 'libtool'), '--mode=execute']
args += debug_command
if running_from_source_tree:
env['MUTTER_PLUGINS'] = plugin
args.append(os.path.join(bin_dir, 'gnome-shell-installed'))
args.append(os.path.join(self_dir, 'gnome-shell-real'))
if options.replace:
args.append('--replace')
if options.sync:
@ -427,9 +424,9 @@ def run_performance_test():
}
# Add the Git revision if available
bin_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
if os.path.exists(os.path.join(bin_dir, 'gnome-shell.in')):
top_dir = os.path.dirname(bin_dir)
self_dir = os.path.dirname(os.path.abspath(sys.argv[0]))
if os.path.exists(os.path.join(self_dir, 'gnome-shell-jhbuild.in')):
top_dir = os.path.dirname(self_dir)
git_dir = os.path.join(top_dir, '.git')
if os.path.exists(git_dir):
env = dict(os.environ)

View File

@ -25,42 +25,24 @@
#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 <string.h>
#include <clutter/clutter.h>
#include <clutter/x11/clutter-x11.h>
#include <GL/glx.h>
#include <GL/glxext.h>
#include "display.h"
#include <gjs/gjs.h>
#include <meta/display.h>
#include <meta/meta-plugin.h>
#include "shell-global-private.h"
#include "shell-perf-log.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_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_minimize (MetaPlugin *plugin,
MetaWindowActor *actor);
@ -110,7 +92,6 @@ struct _GnomeShellPlugin
{
MetaPlugin parent;
GjsContext *gjs_context;
Atom panel_action;
Atom panel_action_run_dialog;
Atom panel_action_main_menu;
@ -127,11 +108,9 @@ struct _GnomeShellPluginClass
MetaPluginClass parent_class;
};
/*
* Create the plugin struct; function pointers initialized in
* g_module_check_init().
*/
META_PLUGIN_DECLARE(GnomeShellPlugin, gnome_shell_plugin);
GType gnome_shell_plugin_get_type (void);
G_DEFINE_TYPE (GnomeShellPlugin, gnome_shell_plugin, META_TYPE_PLUGIN)
static void
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->finalize = gnome_shell_plugin_finalize;
plugin_class->early_initialize = gnome_shell_plugin_early_initialize;
plugin_class->start = gnome_shell_plugin_start;
plugin_class->map = gnome_shell_plugin_map;
plugin_class->minimize = gnome_shell_plugin_minimize;
@ -162,328 +140,6 @@ gnome_shell_plugin_class_init (GnomeShellPluginClass *klass)
static void
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
@ -493,32 +149,10 @@ gnome_shell_plugin_start (MetaPlugin *plugin)
MetaScreen *screen;
MetaDisplay *display;
Display *xdisplay;
GtkSettings *settings;
GError *error = NULL;
int status;
const char *shell_js;
char **search_path;
const char *glx_extensions;
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);
GjsContext *gjs_context;
screen = meta_plugin_get_screen (plugin);
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)",
"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_global_set_plugin (shell_plugin->global, META_PLUGIN (shell_plugin));
_shell_global_set_plugin (shell_plugin->global, META_PLUGIN(shell_plugin));
_shell_global_set_gjs_context (shell_plugin->global, shell_plugin->gjs_context);
gjs_context = _shell_global_get_gjs_context (shell_plugin->global);
add_statistics (shell_plugin);
if (!gjs_context_eval (shell_plugin->gjs_context,
if (!gjs_context_eval (gjs_context,
"const Main = imports.ui.main; Main.start();",
-1,
"<main>",
@ -752,17 +358,3 @@ MetaPluginInfo *gnome_shell_plugin_plugin_info (MetaPlugin *plugin)
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;
g_unsetenv ("NO_AT_BRIDGE");
g_unsetenv ("NO_GAIL");
if (!should_enable_a11y ())
return;

View File

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

View File

@ -4,9 +4,9 @@
#include <gio/gio.h>
#include <clutter/clutter.h>
#include <meta/window.h>
#include "shell-app.h"
#include "window.h"
#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))

View File

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

View File

@ -2,16 +2,16 @@
#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 <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
* be running far fewer of the applications at one time than they have
* installed. But it also just helps keep the code more logically

View File

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

View File

@ -8,8 +8,8 @@
void _shell_global_set_plugin (ShellGlobal *global,
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,
XEvent *xev);

View File

@ -2,38 +2,39 @@
#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 <errno.h>
#include <fcntl.h>
#include <math.h>
#include <stdlib.h>
#include <string.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
#include <sys/resource.h>
#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-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);
@ -203,7 +204,8 @@ static void
shell_global_init (ShellGlobal *global)
{
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)
datadir = GNOME_SHELL_DATADIR;
@ -242,6 +244,15 @@ shell_global_init (ShellGlobal *global)
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_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
@ -791,11 +802,10 @@ _shell_global_set_plugin (ShellGlobal *global,
global->focus_manager = st_focus_manager_get_for_stage (CLUTTER_STAGE (stage));
}
void
_shell_global_set_gjs_context (ShellGlobal *global,
GjsContext *context)
GjsContext *
_shell_global_get_gjs_context (ShellGlobal *global)
{
global->js_context = context;
return global->js_context;
}
/**

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -3,7 +3,7 @@
#define __SHELL_WM_H__
#include <glib-object.h>
#include <meta-plugin.h>
#include <meta/meta-plugin.h>
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

View File

@ -646,23 +646,9 @@ st_container_navigate_focus (StWidget *widget,
* any child is inconsistently scaled, then the focus chain will
* probably be unpredictable.
*/
if (from)
if (focus_child)
{
if (from == focus_child)
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;
}
clutter_actor_get_allocation_box (focus_child, &sort_data.box);
}
else
{

View File

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

View File

@ -199,3 +199,26 @@ st_focus_manager_remove_group (StFocusManager *manager,
{
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);
void st_focus_manager_remove_group (StFocusManager *manager,
StWidget *root);
StWidget *st_focus_manager_get_group (StFocusManager *manager,
StWidget *widget);
G_END_DECLS

View File

@ -176,7 +176,8 @@ st_scroll_view_set_vfade (StScrollView *self,
if (priv->vfade_effect == 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
{

View File

@ -1391,6 +1391,36 @@ st_texture_cache_load_sliced_image (StTextureCache *cache,
* 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:
* @cache: The texture cache instance
@ -1414,7 +1444,7 @@ st_texture_cache_load_icon_name (StTextureCache *cache,
{
ClutterActor *texture;
GIcon *themed;
char *symbolic;
char **names;
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);
break;
case ST_ICON_SYMBOLIC:
symbolic = g_strconcat (name, "-symbolic", NULL);
themed = g_themed_icon_new_with_default_fallbacks ((const gchar*)symbolic);
g_free (symbolic);
names = symbolic_names_for_icon (name);
themed = g_themed_icon_new_from_names (names, -1);
g_strfreev (names);
texture = load_gicon_with_colors (cache, themed, size,
st_theme_node_get_icon_colors (theme_node));
g_object_unref (themed);

View File

@ -103,6 +103,7 @@ enum
enum
{
STYLE_CHANGED,
POPUP_MENU,
LAST_SIGNAL
};
@ -554,6 +555,7 @@ st_widget_get_theme_node (StWidget *widget)
StThemeNode *parent_node = NULL;
ClutterStage *stage = NULL;
ClutterActor *parent;
char *pseudo_class, *direction_pseudo_class;
parent = clutter_actor_get_parent (CLUTTER_ACTOR (widget));
while (parent != NULL)
@ -575,13 +577,31 @@ st_widget_get_theme_node (StWidget *widget)
if (parent_node == NULL)
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),
parent_node, priv->theme,
G_OBJECT_TYPE (widget),
clutter_actor_get_name (CLUTTER_ACTOR (widget)),
priv->style_class,
priv->pseudo_class,
pseudo_class,
priv->inline_style);
if (pseudo_class != direction_pseudo_class)
g_free (pseudo_class);
}
return priv->theme_node;
@ -670,6 +690,21 @@ st_widget_key_focus_out (ClutterActor *actor)
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
st_widget_hide (ClutterActor *actor)
{
@ -744,6 +779,7 @@ st_widget_class_init (StWidgetClass *klass)
actor_class->leave_event = st_widget_leave;
actor_class->key_focus_in = st_widget_key_focus_in;
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->get_accessible = st_widget_get_accessible;
@ -899,6 +935,7 @@ st_widget_class_init (StWidgetClass *klass)
/**
* StWidget::style-changed:
* @widget: the #StWidget
*
* Emitted when the style information that the widget derives from the
* theme changes
@ -911,6 +948,22 @@ st_widget_class_init (StWidgetClass *klass)
NULL, NULL,
_st_marshal_VOID__VOID,
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
st_widget_set_direction (StWidget *self, StTextDirection dir)
{
StTextDirection old_direction;
g_return_if_fail (ST_IS_WIDGET (self));
old_direction = st_widget_get_direction (self);
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 >*/
ClutterActorClass parent_class;
/* vfuncs */
void (* style_changed) (StWidget *self);
gboolean (* navigate_focus) (StWidget *self,
ClutterActor *from,
GtkDirectionType direction);
/* signals */
void (* style_changed) (StWidget *self);
void (* popup_menu) (StWidget *self);
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;

View File

@ -27,7 +27,7 @@ EXTRA_DIST += $(TEST_MISC)
run-test.sh: run-test.sh.in
$(AM_V_GEN) sed \
-e "s|@MUTTER_LIB_DIR[@]|$(MUTTER_LIB_DIR)|" \
-e "s|@MUTTER_TYPELIB_DIR[@]|$(MUTTER_TYPELIB_DIR)|" \
-e "s|@srcdir[@]|$(srcdir)|" \
$< > $@ && 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=`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_DEBUG_OUTPUT=stderr
$verbose || GJS_DEBUG_TOPICS="JS ERROR;JS LOG"

View File

@ -53,13 +53,13 @@ fi
# binutils, curl, gcc, make, git
#
# 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
#
# Devel packages needed by gnome-shell and its deps:
# dbus-glib, expat, GL, gnome-menus, gstreamer, libffi,
# 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,
# xdamage, icon-naming-utils, upower, libtool-ltdl, libvorbis,
# 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
reqd="
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
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
mesa-common-dev mesa-utils libpam-dev python-dev python-gconf python-gobject
xulrunner-dev libcroco3-dev
@ -111,9 +111,9 @@ fi
if test "x$system" = xFedora ; then
reqd="
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
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
pulseaudio-libs-devel python-devel pygobject2 readline-devel xulrunner-devel
libXdamage-devel libcroco-devel libxml2-devel gstreamer-devel

View File

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

View File

@ -3,7 +3,7 @@
# 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 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.
import fnmatch, os, subprocess, sys