Fix merge conflicts
Signed-off-by: David Zeuthen <davidz@redhat.com>
This commit is contained in:
commit
51481bed82
@ -1,5 +1,5 @@
|
|||||||
AC_PREREQ(2.63)
|
AC_PREREQ(2.63)
|
||||||
AC_INIT([gnome-shell],[2.91.2],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
AC_INIT([gnome-shell],[2.91.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell],[gnome-shell])
|
||||||
|
|
||||||
AC_CONFIG_HEADERS([config.h])
|
AC_CONFIG_HEADERS([config.h])
|
||||||
AC_CONFIG_SRCDIR([src/shell-global.c])
|
AC_CONFIG_SRCDIR([src/shell-global.c])
|
||||||
@ -57,7 +57,7 @@ fi
|
|||||||
|
|
||||||
AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
|
AM_CONDITIONAL(BUILD_RECORDER, $build_recorder)
|
||||||
|
|
||||||
CLUTTER_MIN_VERSION=1.3.14
|
CLUTTER_MIN_VERSION=1.5.8
|
||||||
GOBJECT_INTROSPECTION_MIN_VERSION=0.6.11
|
GOBJECT_INTROSPECTION_MIN_VERSION=0.6.11
|
||||||
GJS_MIN_VERSION=0.7
|
GJS_MIN_VERSION=0.7
|
||||||
MUTTER_MIN_VERSION=2.91.0
|
MUTTER_MIN_VERSION=2.91.0
|
||||||
@ -105,11 +105,7 @@ AC_SUBST(MUTTER_BIN_DIR)
|
|||||||
AC_SUBST(MUTTER_LIB_DIR)
|
AC_SUBST(MUTTER_LIB_DIR)
|
||||||
AC_SUBST(MUTTER_PLUGIN_DIR)
|
AC_SUBST(MUTTER_PLUGIN_DIR)
|
||||||
|
|
||||||
GJS_JS_DIR=`$PKG_CONFIG --variable=jsdir gjs-1.0`
|
|
||||||
GJS_JS_NATIVE_DIR=`$PKG_CONFIG --variable=jsnativedir gjs-1.0`
|
|
||||||
GJS_CONSOLE=`$PKG_CONFIG --variable=gjs_console gjs-1.0`
|
GJS_CONSOLE=`$PKG_CONFIG --variable=gjs_console gjs-1.0`
|
||||||
AC_SUBST(GJS_JS_DIR)
|
|
||||||
AC_SUBST(GJS_JS_NATIVE_DIR)
|
|
||||||
AC_SUBST(GJS_CONSOLE)
|
AC_SUBST(GJS_CONSOLE)
|
||||||
|
|
||||||
AC_CHECK_FUNCS(fdwalk)
|
AC_CHECK_FUNCS(fdwalk)
|
||||||
|
@ -25,6 +25,7 @@ dist_theme_DATA = \
|
|||||||
theme/close-window.svg \
|
theme/close-window.svg \
|
||||||
theme/close.svg \
|
theme/close.svg \
|
||||||
theme/corner-ripple.png \
|
theme/corner-ripple.png \
|
||||||
|
theme/dash-placeholder.svg \
|
||||||
theme/dialog-error.svg \
|
theme/dialog-error.svg \
|
||||||
theme/gnome-shell.css \
|
theme/gnome-shell.css \
|
||||||
theme/mosaic-view-active.svg \
|
theme/mosaic-view-active.svg \
|
||||||
@ -32,6 +33,7 @@ dist_theme_DATA = \
|
|||||||
theme/move-window-on-new.svg \
|
theme/move-window-on-new.svg \
|
||||||
theme/process-working.png \
|
theme/process-working.png \
|
||||||
theme/remove-workspace.svg \
|
theme/remove-workspace.svg \
|
||||||
|
theme/running-indicator.svg \
|
||||||
theme/scroll-button-down-hover.png \
|
theme/scroll-button-down-hover.png \
|
||||||
theme/scroll-button-down.png \
|
theme/scroll-button-down.png \
|
||||||
theme/scroll-button-up-hover.png \
|
theme/scroll-button-up-hover.png \
|
||||||
|
@ -41,18 +41,6 @@
|
|||||||
<default>[]</default>
|
<default>[]</default>
|
||||||
<_summary>History for command (Alt-F2) dialog</_summary>
|
<_summary>History for command (Alt-F2) dialog</_summary>
|
||||||
</key>
|
</key>
|
||||||
<key name="workspaces-view" type="s">
|
|
||||||
<default>'single'</default>
|
|
||||||
<_summary>Overview workspace view mode</_summary>
|
|
||||||
<_description>
|
|
||||||
The selected workspace view mode in the overview.
|
|
||||||
Supported values are "single" and "grid".
|
|
||||||
</_description>
|
|
||||||
<choices>
|
|
||||||
<choice value="single"/>
|
|
||||||
<choice value="grid"/>
|
|
||||||
</choices>
|
|
||||||
</key>
|
|
||||||
<child name="clock" schema="org.gnome.shell.clock"/>
|
<child name="clock" schema="org.gnome.shell.clock"/>
|
||||||
<child name="calendar" schema="org.gnome.shell.calendar"/>
|
<child name="calendar" schema="org.gnome.shell.calendar"/>
|
||||||
<child name="recorder" schema="org.gnome.shell.recorder"/>
|
<child name="recorder" schema="org.gnome.shell.recorder"/>
|
||||||
|
84
data/theme/dash-placeholder.svg
Normal file
84
data/theme/dash-placeholder.svg
Normal file
@ -0,0 +1,84 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
width="76"
|
||||||
|
height="27"
|
||||||
|
id="svg11252"
|
||||||
|
version="1.1">
|
||||||
|
<defs
|
||||||
|
id="defs11254">
|
||||||
|
<radialGradient
|
||||||
|
xlink:href="#linearGradient39563-4-2"
|
||||||
|
id="radialGradient68155-2-3"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1,0,0,0.3486842,0,317.8421)"
|
||||||
|
cx="49"
|
||||||
|
cy="488"
|
||||||
|
fx="49"
|
||||||
|
fy="488"
|
||||||
|
r="38" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient39563-4-2">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop39565-1-4" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop39567-7-9" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient
|
||||||
|
xlink:href="#linearGradient39573-6-1"
|
||||||
|
id="radialGradient68157-0-8"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
cx="50.5"
|
||||||
|
cy="487.5"
|
||||||
|
fx="50.5"
|
||||||
|
fy="487.5"
|
||||||
|
r="10.5" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient39573-6-1">
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;"
|
||||||
|
offset="0"
|
||||||
|
id="stop39575-5-6" />
|
||||||
|
<stop
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0;"
|
||||||
|
offset="1"
|
||||||
|
id="stop39577-1-2" />
|
||||||
|
</linearGradient>
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(-337,-518.86218)">
|
||||||
|
<g
|
||||||
|
id="g99967"
|
||||||
|
style="display:inline"
|
||||||
|
transform="translate(326,44.862171)">
|
||||||
|
<rect
|
||||||
|
style="opacity:0.49375;color:#000000;fill:url(#radialGradient68155-2-3);fill-opacity:1;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
|
id="rect99969"
|
||||||
|
width="76"
|
||||||
|
height="2"
|
||||||
|
x="11"
|
||||||
|
y="487"
|
||||||
|
rx="0"
|
||||||
|
ry="0" />
|
||||||
|
<path
|
||||||
|
style="opacity:0.43125;color:#000000;fill:url(#radialGradient68157-0-8);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate"
|
||||||
|
id="path99971"
|
||||||
|
d="M 61,487.5 C 61,493.29899 56.29899,498 50.5,498 44.70101,498 40,493.29899 40,487.5 40,481.70101 44.70101,477 50.5,477 c 5.79899,0 10.5,4.70101 10.5,10.5 z"
|
||||||
|
transform="matrix(1.2857143,0,0,1.2857143,-14.428572,-139.28571)" />
|
||||||
|
<path
|
||||||
|
transform="matrix(0.43589747,0,0,0.43589747,28.487179,275)"
|
||||||
|
d="M 61,487.5 C 61,493.29899 56.29899,498 50.5,498 44.70101,498 40,493.29899 40,487.5 40,481.70101 44.70101,477 50.5,477 c 5.79899,0 10.5,4.70101 10.5,10.5 z"
|
||||||
|
id="path99973"
|
||||||
|
style="color:#000000;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.9 KiB |
@ -149,6 +149,7 @@ StTooltip StLabel {
|
|||||||
|
|
||||||
.popup-slider-menu-item {
|
.popup-slider-menu-item {
|
||||||
height: 1em;
|
height: 1em;
|
||||||
|
min-width: 15em;
|
||||||
-slider-height: 0.3em;
|
-slider-height: 0.3em;
|
||||||
-slider-background-color: #333333;
|
-slider-background-color: #333333;
|
||||||
-slider-border-color: #5f5f5f;
|
-slider-border-color: #5f5f5f;
|
||||||
@ -257,90 +258,56 @@ StTooltip StLabel {
|
|||||||
|
|
||||||
/* Overview */
|
/* Overview */
|
||||||
|
|
||||||
.overview {
|
#overview {
|
||||||
background-color: #111;
|
spacing: 12px;
|
||||||
|
background-color: rgba(0,0,0,0.6);
|
||||||
}
|
}
|
||||||
|
|
||||||
.info-bar {
|
.workspaces-view {
|
||||||
color: #fff;
|
|
||||||
font-size: 14px;
|
|
||||||
spacing: 20px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info-bar-link-button {
|
|
||||||
background-color: #2d2d2d;
|
|
||||||
padding: 2px 14px;
|
|
||||||
border-radius: 10px;
|
|
||||||
border: 1px solid #181818;
|
|
||||||
}
|
|
||||||
|
|
||||||
.info-bar-link-button:hover {
|
|
||||||
border: 1px solid #666666;
|
|
||||||
}
|
|
||||||
|
|
||||||
.new-workspace-area {
|
|
||||||
border: 2px solid rgba(255, 255, 255, 0.8);
|
|
||||||
border-radius: 10px;
|
|
||||||
background-color: #111;
|
|
||||||
}
|
|
||||||
|
|
||||||
.new-workspace-area-internal {
|
|
||||||
background-gradient-direction: horizontal;
|
|
||||||
background-gradient-start: rgba(16, 16, 16, 0);
|
|
||||||
background-gradient-end: rgba(16, 16, 16, 1.0);
|
|
||||||
background-image: url("move-window-on-new.svg");
|
|
||||||
}
|
|
||||||
|
|
||||||
.new-workspace-area:hover {
|
|
||||||
border: 2px solid rgba(255, 255, 255, 1.0);
|
|
||||||
background-gradient-direction: horizontal;
|
|
||||||
background-gradient-start: rgba(130, 130, 130, 0.9);
|
|
||||||
background-gradient-end: rgba(16, 16, 16, 0.9);
|
|
||||||
}
|
|
||||||
|
|
||||||
.left-workspaces-shadow {
|
|
||||||
background-gradient-direction: horizontal;
|
|
||||||
background-gradient-start: rgba(16, 16, 16, 1.0);
|
|
||||||
background-gradient-end: rgba(16, 16, 16, 0.0);
|
|
||||||
}
|
|
||||||
|
|
||||||
.right-workspaces-shadow {
|
|
||||||
background-gradient-direction: horizontal;
|
|
||||||
background-gradient-end: rgba(16, 16, 16, 1.0);
|
|
||||||
background-gradient-start: rgba(16, 16, 16, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
.workspaces {
|
|
||||||
color: white;
|
color: white;
|
||||||
}
|
|
||||||
|
|
||||||
.workspaces.single {
|
|
||||||
spacing: 25px;
|
spacing: 25px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.workspaces.mosaic {
|
.workspace-indicator-panel {
|
||||||
spacing: 15px;
|
spacing: 8px;
|
||||||
}
|
|
||||||
|
|
||||||
.workspaces-bar {
|
|
||||||
height: 48px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.workspaces-bar {
|
|
||||||
spacing: 5px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.workspace-indicator {
|
.workspace-indicator {
|
||||||
width: 24px;
|
width: 24px;
|
||||||
height: 16px;
|
height: 16px;
|
||||||
background: rgba(155,155,155,0.8);
|
background: rgba(255,255,255,0.2);
|
||||||
border-spacing: 16px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.workspace-indicator.active {
|
.workspace-indicator.active {
|
||||||
background: rgba(255,255,255,0.8);
|
background: rgba(255,255,255,0.8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.workspace-controls {
|
||||||
|
width: 48px;
|
||||||
|
font-size: 32px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #ffffff;
|
||||||
|
border: 2px solid rgba(128, 128, 128, 0.4);
|
||||||
|
border-right: 0px;
|
||||||
|
border-radius: 9px 0px 0px 9px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.add-workspace {
|
||||||
|
background-color: rgba(128, 128, 128, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.add-workspace:hover {
|
||||||
|
background-color: rgba(128, 128, 128, 0.6);
|
||||||
|
}
|
||||||
|
|
||||||
|
.remove-workspace {
|
||||||
|
height: 48px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.remove-workspace:hover {
|
||||||
|
background-color: rgba(128, 128, 128, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
.window-caption {
|
.window-caption {
|
||||||
background: rgba(0,0,0,0.8);
|
background: rgba(0,0,0,0.8);
|
||||||
border: 1px solid rgba(128,128,128,0.40);
|
border: 1px solid rgba(128,128,128,0.40);
|
||||||
@ -358,161 +325,125 @@ StTooltip StLabel {
|
|||||||
-shell-close-overlap: 16px;
|
-shell-close-overlap: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.single-view-controls {
|
|
||||||
padding: 0px 15px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.workspace-controls {
|
|
||||||
width: 24px;
|
|
||||||
height: 16px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.workspace-controls.add {
|
|
||||||
background-image: url("add-workspace.svg");
|
|
||||||
}
|
|
||||||
|
|
||||||
.workspace-controls.remove {
|
|
||||||
background-image: url("remove-workspace.svg");
|
|
||||||
}
|
|
||||||
|
|
||||||
.workspace-controls.switch-single {
|
|
||||||
background-image: url("single-view.svg");
|
|
||||||
}
|
|
||||||
|
|
||||||
.workspace-controls.switch-mosaic {
|
|
||||||
background-image: url("mosaic-view.svg");
|
|
||||||
}
|
|
||||||
|
|
||||||
.workspace-controls.switch-single:checked {
|
|
||||||
background-image: url("single-view-active.svg");
|
|
||||||
}
|
|
||||||
|
|
||||||
.workspace-controls.switch-mosaic:checked {
|
|
||||||
background-image: url("mosaic-view-active.svg");
|
|
||||||
}
|
|
||||||
|
|
||||||
#SwitchScroll {
|
|
||||||
height: 14px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#SwitchScroll #hhandle {
|
|
||||||
border-radius: 7px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Dash */
|
/* Dash */
|
||||||
|
|
||||||
#dash {
|
#dash {
|
||||||
color: #5f5f5f;
|
color: #5f5f5f;
|
||||||
font-size: 12px;
|
font-size: 12px;
|
||||||
padding: 0px 14px;
|
padding: 6px 0px;
|
||||||
|
background-color: rgba(0, 0, 0, 0.5);
|
||||||
|
border: 2px solid rgba(128, 128, 128, 0.4);
|
||||||
|
border-left: 0px;
|
||||||
|
border-radius: 0px 9px 9px 0px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#dashSections {
|
#dash:empty {
|
||||||
spacing: 12px;
|
height: 100px;
|
||||||
|
width: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.dash-placeholder {
|
||||||
|
background-image: url("dash-placeholder.svg");
|
||||||
|
height: 27px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#viewSelector {
|
||||||
|
spacing: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#viewSelectorTabBar {
|
||||||
|
padding: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#searchArea {
|
||||||
|
padding: 0px 24px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#searchEntry {
|
#searchEntry {
|
||||||
padding: 4px;
|
padding: 4px 8px;
|
||||||
border-radius: 4px;
|
border-radius: 12px;
|
||||||
color: #a8a8a8;
|
color: rgb(128, 128, 128);
|
||||||
border: 1px solid #565656;
|
border: 2px solid rgba(128, 128, 128, 0.4);
|
||||||
background-color: #404040;
|
background-gradient-start: rgba(0, 0, 0, 0.2);
|
||||||
caret-color: #fff;
|
background-gradient-end: rgba(128, 128, 128, 0.2);
|
||||||
|
background-gradient-direction: vertical;
|
||||||
|
caret-color: rgb(128, 128, 128);
|
||||||
caret-size: 1px;
|
caret-size: 1px;
|
||||||
height: 16px;
|
height: 16px;
|
||||||
|
width: 250px;
|
||||||
transition-duration: 300;
|
transition-duration: 300;
|
||||||
}
|
}
|
||||||
|
|
||||||
#searchEntry:focus {
|
#searchEntry:focus {
|
||||||
color: #545454;
|
border: 2px solid #ffffff;
|
||||||
border: 1px solid #3a3a3a;
|
background-gradient-start: rgba(0, 0, 0, 0.2);
|
||||||
background-color: #e8e8e8;
|
background-gradient-end: #ffffff;
|
||||||
caret-color: #545454;
|
background-gradient-direction: vertical;
|
||||||
|
color: rgb(64, 64, 64);
|
||||||
|
font-weight: bold;
|
||||||
-st-shadow: 0px 0px 6px 2px rgba(255,255,255,0.9);
|
-st-shadow: 0px 0px 6px 2px rgba(255,255,255,0.9);
|
||||||
transition-duration: 0;
|
transition-duration: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#searchEntry:hover {
|
#searchEntry:hover {
|
||||||
color: #a8a8a8;
|
border: 2px solid #e8e8e8;
|
||||||
border: 1px solid #4d4d4d;
|
|
||||||
background-color: #e8e8e8;
|
|
||||||
caret-color: #545454;
|
caret-color: #545454;
|
||||||
transition-duration: 500;
|
transition-duration: 500;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dash-section {
|
.view-tab-title {
|
||||||
|
color: #888a85;
|
||||||
|
font-weight: bold;
|
||||||
|
padding: 0px 12px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-tab-title:selected {
|
||||||
|
color: white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.view-tab-boxpointer {
|
||||||
|
-arrow-border-radius: 9px;
|
||||||
|
-arrow-background-color: rgba(0,0,0,0.5);
|
||||||
|
-arrow-border-width: 2px;
|
||||||
|
-arrow-border-color: rgba(255,255,255,0.5);
|
||||||
|
-arrow-base: 30px;
|
||||||
|
-arrow-rise: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#searchResults {
|
||||||
|
padding: 20px 10px 10px 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#searchResultsContent {
|
||||||
|
padding: 0 10px;
|
||||||
spacing: 8px;
|
spacing: 8px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.section-header {
|
.search-statustext,
|
||||||
}
|
.search-section-header {
|
||||||
|
padding: 4px 12px;
|
||||||
.section-header-inner {
|
|
||||||
spacing: 4px;
|
spacing: 4px;
|
||||||
|
color: #6f6f6f;
|
||||||
}
|
}
|
||||||
|
|
||||||
.section-text-content {
|
.search-section {
|
||||||
padding: 4px 0px;
|
background-color: rgba(128, 128, 128, .1);
|
||||||
}
|
border: 1px solid rgba(50, 50, 50, .4);
|
||||||
|
|
||||||
.dash-section-content {
|
|
||||||
color: #ffffff;
|
|
||||||
spacing: 8px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.more-link {
|
|
||||||
}
|
|
||||||
|
|
||||||
.more-link-expander {
|
|
||||||
background-image: url("section-more.svg");
|
|
||||||
width: 9px;
|
|
||||||
height: 9px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.more-link-expander.open {
|
|
||||||
background-image: url("section-more-open.svg");
|
|
||||||
width: 9px;
|
|
||||||
height: 9px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dash-pane {
|
|
||||||
border-radius: 10px;
|
border-radius: 10px;
|
||||||
background-color: #111111;
|
}
|
||||||
border: 2px solid #868686;
|
|
||||||
|
.search-section-results {
|
||||||
color: #ffffff;
|
color: #ffffff;
|
||||||
padding: 30px 10px 10px 20px;
|
border-radius: 10px;
|
||||||
|
border: 1px solid rgba(50, 50, 50, .4);
|
||||||
|
padding: 6px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#dashAppSearchResults {
|
.search-section-list-results {
|
||||||
padding: 8px 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dash-search-statustext,
|
|
||||||
.dash-search-section-header {
|
|
||||||
padding: 4px 0px;
|
|
||||||
spacing: 4px;
|
spacing: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.dash-search-section-results {
|
.results-container {
|
||||||
color: #ffffff;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dash-search-section-list-results {
|
|
||||||
spacing: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dash-search-result-content {
|
|
||||||
padding: 3px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dash-search-result-content:selected {
|
|
||||||
padding: 2px;
|
|
||||||
border: 1px solid #5c5c5c;
|
|
||||||
border-radius: 2px;
|
|
||||||
background-color: #1e1e1e;
|
|
||||||
}
|
|
||||||
|
|
||||||
.dash-results-container {
|
|
||||||
spacing: 4px;
|
spacing: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -559,67 +490,66 @@ StTooltip StLabel {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.icon-grid {
|
.icon-grid {
|
||||||
spacing: 6px;
|
spacing: 36px;
|
||||||
-shell-grid-item-size: 70px;
|
-shell-grid-item-size: 70px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.all-app {
|
.all-app {
|
||||||
border-radius: 10px;
|
padding: 16px 250px 10px 16px;
|
||||||
background-color: #111111;
|
|
||||||
border: 2px solid #868686;
|
|
||||||
color: #ffffff;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-section-divider-container {
|
.app-section-divider-container {
|
||||||
padding-top: 10px;
|
padding-top: 36px;
|
||||||
padding-bottom: 10px;
|
padding-bottom: 36px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-section-divider {
|
.app-section-divider {
|
||||||
height: 2px;
|
height: 2px;
|
||||||
background-image: url("separator-white.png");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.all-app-controls-panel {
|
#dash > .app-well-app {
|
||||||
height: 30px;
|
padding: 6px 12px;
|
||||||
}
|
}
|
||||||
|
|
||||||
.all-app-scroll-view {
|
.remove-favorite-icon {
|
||||||
padding-right: 10px;
|
color: #a0a0a0;
|
||||||
padding-left: 10px;
|
|
||||||
padding-bottom: 10px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-well-app {
|
.remove-favorite-icon:hover {
|
||||||
border: 1px solid #181818;
|
color: white;
|
||||||
|
-st-shadow: black 0px 2px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.app-well-app > .overview-icon,
|
||||||
|
.remove-favorite > .overview-icon,
|
||||||
|
.search-result-content > .overview-icon {
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
width: 70px;
|
|
||||||
height: 70px;
|
|
||||||
font-size: 10px;
|
font-size: 10px;
|
||||||
|
color: white;
|
||||||
transition-duration: 100;
|
transition-duration: 100;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-well-app.running {
|
.app-well-app.running > .overview-icon {
|
||||||
background-gradient-direction: vertical;
|
text-shadow: black 0px 2px 2px;
|
||||||
background-gradient-start: #3d3d3d;
|
background-image: url("running-indicator.svg");
|
||||||
background-gradient-end: #181818;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-well-app.selected {
|
.app-well-app:selected > .overview-icon,
|
||||||
border: 1px solid #666666;
|
.search-result-content:selected > .overview-icon {
|
||||||
|
background: rgba(255,255,255,0.33);
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-well-app:hover {
|
.app-well-app:hover > .overview-icon,
|
||||||
border: 1px solid #666666;
|
.remove-favorite:hover > .overview-icon,
|
||||||
background-gradient-direction: vertical;
|
.search-result-content:hover > .overview-icon {
|
||||||
background-gradient-start: rgba(61,61,61,0.8);
|
background: rgba(255,255,255,0.33);
|
||||||
background-gradient-end: rgba(24,24,24,0.2);
|
text-shadow: black 0px 2px 2px;
|
||||||
transition-duration: 100;
|
transition-duration: 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
.app-well-app:active {
|
.app-well-app:active > .overview-icon {
|
||||||
background-color: #1e1e1e;
|
background-color: #1e1e1e;
|
||||||
border: 1px solid #5f5f5f;
|
border: 1px solid #5f5f5f;
|
||||||
}
|
}
|
||||||
@ -949,6 +879,10 @@ StTooltip StLabel {
|
|||||||
background: #666;
|
background: #666;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.url-highlighter {
|
||||||
|
link-color: #ccccff;
|
||||||
|
}
|
||||||
|
|
||||||
/* Message Tray */
|
/* Message Tray */
|
||||||
#message-tray {
|
#message-tray {
|
||||||
background-gradient-direction: vertical;
|
background-gradient-direction: vertical;
|
||||||
@ -995,6 +929,10 @@ StTooltip StLabel {
|
|||||||
height: 1em;
|
height: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#notification-scrollview > StScrollBar {
|
||||||
|
padding-left: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
#notification-body {
|
#notification-body {
|
||||||
spacing: 5px;
|
spacing: 5px;
|
||||||
}
|
}
|
||||||
@ -1055,6 +993,13 @@ StTooltip StLabel {
|
|||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.chat-meta-message {
|
||||||
|
padding-left: 4px;
|
||||||
|
border-radius: 4px;
|
||||||
|
font-size: 14px;
|
||||||
|
color: #bbbbbb;
|
||||||
|
}
|
||||||
|
|
||||||
.chat-response {
|
.chat-response {
|
||||||
padding: 4px;
|
padding: 4px;
|
||||||
border-radius: 4px;
|
border-radius: 4px;
|
||||||
@ -1063,7 +1008,6 @@ StTooltip StLabel {
|
|||||||
background-color: #404040;
|
background-color: #404040;
|
||||||
caret-color: #ffffff;
|
caret-color: #ffffff;
|
||||||
caret-size: 1px;
|
caret-size: 1px;
|
||||||
height: 18px;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.chat-response:focus {
|
.chat-response:focus {
|
||||||
|
89
data/theme/running-indicator.svg
Normal file
89
data/theme/running-indicator.svg
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<!-- Created with Inkscape (http://www.inkscape.org/) -->
|
||||||
|
|
||||||
|
<svg
|
||||||
|
xmlns:svg="http://www.w3.org/2000/svg"
|
||||||
|
xmlns="http://www.w3.org/2000/svg"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
width="74.01342"
|
||||||
|
height="74.006706"
|
||||||
|
id="svg7355"
|
||||||
|
version="1.1">
|
||||||
|
<defs
|
||||||
|
id="defs7357">
|
||||||
|
<radialGradient
|
||||||
|
xlink:href="#linearGradient36429"
|
||||||
|
id="radialGradient7461"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.0525552,0,0,1.0525552,-2.5162753,-9.0000838)"
|
||||||
|
cx="47.878681"
|
||||||
|
cy="171.25"
|
||||||
|
fx="47.878681"
|
||||||
|
fy="171.25"
|
||||||
|
r="37" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient36429">
|
||||||
|
<stop
|
||||||
|
id="stop36431"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||||
|
<stop
|
||||||
|
id="stop36433"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0;" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient
|
||||||
|
xlink:href="#linearGradient36471"
|
||||||
|
id="radialGradient7463"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
gradientTransform="matrix(1.1891549,0,0,0.55513246,-9.281289,36.12653)"
|
||||||
|
cx="49.067139"
|
||||||
|
cy="242.50381"
|
||||||
|
fx="49.067139"
|
||||||
|
fy="242.50381"
|
||||||
|
r="37.00671" />
|
||||||
|
<linearGradient
|
||||||
|
id="linearGradient36471">
|
||||||
|
<stop
|
||||||
|
id="stop36473"
|
||||||
|
offset="0"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:1;" />
|
||||||
|
<stop
|
||||||
|
id="stop36475"
|
||||||
|
offset="1"
|
||||||
|
style="stop-color:#ffffff;stop-opacity:0;" />
|
||||||
|
</linearGradient>
|
||||||
|
<radialGradient
|
||||||
|
r="37.00671"
|
||||||
|
fy="242.50381"
|
||||||
|
fx="49.067139"
|
||||||
|
cy="242.50381"
|
||||||
|
cx="49.067139"
|
||||||
|
gradientTransform="matrix(1.1891549,0,0,0.55513246,-9.281289,36.12653)"
|
||||||
|
gradientUnits="userSpaceOnUse"
|
||||||
|
id="radialGradient7488"
|
||||||
|
xlink:href="#linearGradient36471" />
|
||||||
|
</defs>
|
||||||
|
<g
|
||||||
|
id="layer1"
|
||||||
|
transform="translate(-266.21629,-168.11809)">
|
||||||
|
<g
|
||||||
|
style="display:inline"
|
||||||
|
id="g30864"
|
||||||
|
transform="translate(255.223,70.118091)">
|
||||||
|
<rect
|
||||||
|
ry="3.5996203"
|
||||||
|
rx="3.5996203"
|
||||||
|
y="98"
|
||||||
|
x="11"
|
||||||
|
height="74"
|
||||||
|
width="74"
|
||||||
|
id="rect14000"
|
||||||
|
style="opacity:0.371875;fill:url(#radialGradient7461);fill-opacity:1;stroke:none" />
|
||||||
|
<path
|
||||||
|
id="rect34520"
|
||||||
|
d="m 84.506708,167.95508 c 6e-6,1.96759 -1.584022,3.55162 -3.551629,3.55163 l -65.910146,0 c -1.967608,-1e-5 -3.551648,-1.58402 -3.551643,-3.55164"
|
||||||
|
style="opacity:0.2;fill:none;stroke:url(#radialGradient7488);stroke-width:1;stroke-opacity:1" />
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 2.6 KiB |
@ -8,6 +8,7 @@ nobase_dist_js_DATA = \
|
|||||||
misc/gnomeSession.js \
|
misc/gnomeSession.js \
|
||||||
misc/params.js \
|
misc/params.js \
|
||||||
misc/telepathy.js \
|
misc/telepathy.js \
|
||||||
|
misc/utils.js \
|
||||||
perf/core.js \
|
perf/core.js \
|
||||||
prefs/clockPreferences.js \
|
prefs/clockPreferences.js \
|
||||||
ui/altTab.js \
|
ui/altTab.js \
|
||||||
@ -40,6 +41,7 @@ nobase_dist_js_DATA = \
|
|||||||
ui/runDialog.js \
|
ui/runDialog.js \
|
||||||
ui/scripting.js \
|
ui/scripting.js \
|
||||||
ui/search.js \
|
ui/search.js \
|
||||||
|
ui/searchDisplay.js \
|
||||||
ui/shellDBus.js \
|
ui/shellDBus.js \
|
||||||
ui/statusIconDispatcher.js \
|
ui/statusIconDispatcher.js \
|
||||||
ui/statusMenu.js \
|
ui/statusMenu.js \
|
||||||
@ -48,6 +50,7 @@ nobase_dist_js_DATA = \
|
|||||||
ui/status/volume.js \
|
ui/status/volume.js \
|
||||||
ui/telepathyClient.js \
|
ui/telepathyClient.js \
|
||||||
ui/tweener.js \
|
ui/tweener.js \
|
||||||
|
ui/viewSelector.js \
|
||||||
ui/windowAttentionHandler.js \
|
ui/windowAttentionHandler.js \
|
||||||
ui/windowManager.js \
|
ui/windowManager.js \
|
||||||
ui/workspace.js \
|
ui/workspace.js \
|
||||||
|
19
js/misc/utils.js
Normal file
19
js/misc/utils.js
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||||
|
|
||||||
|
/* http://daringfireball.net/2010/07/improved_regex_for_matching_urls */
|
||||||
|
const _urlRegexp = /\b(([a-z][\w-]+:(\/{1,3}|[a-z0-9%])|www\d{0,3}[.]|[a-z0-9.\-]+[.][a-z]{2,4}\/)([^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”‘’]))/gi;
|
||||||
|
|
||||||
|
// findUrls:
|
||||||
|
// @str: string to find URLs in
|
||||||
|
//
|
||||||
|
// Searches @str for URLs and returns an array of objects with %url
|
||||||
|
// properties showing the matched URL string, and %pos properties indicating
|
||||||
|
// the position within @str where the URL was found.
|
||||||
|
//
|
||||||
|
// Return value: the list of match objects, as described above
|
||||||
|
function findUrls(str) {
|
||||||
|
let res = [], match;
|
||||||
|
while ((match = _urlRegexp.exec(str)))
|
||||||
|
res.push({ url: match[0], pos: match.index });
|
||||||
|
return res;
|
||||||
|
}
|
@ -21,8 +21,6 @@ const Tweener = imports.ui.tweener;
|
|||||||
const Workspace = imports.ui.workspace;
|
const Workspace = imports.ui.workspace;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
|
|
||||||
const WELL_MAX_COLUMNS = 16;
|
|
||||||
const WELL_MAX_SEARCH_ROWS = 1;
|
|
||||||
const MENU_POPUP_TIMEOUT = 600;
|
const MENU_POPUP_TIMEOUT = 600;
|
||||||
|
|
||||||
function AlphabeticalView() {
|
function AlphabeticalView() {
|
||||||
@ -32,7 +30,7 @@ function AlphabeticalView() {
|
|||||||
AlphabeticalView.prototype = {
|
AlphabeticalView.prototype = {
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this.actor = new St.BoxLayout({ vertical: true });
|
this.actor = new St.BoxLayout({ vertical: true });
|
||||||
this._grid = new IconGrid.IconGrid();
|
this._grid = new IconGrid.IconGrid({ xAlign: St.Align.START });
|
||||||
this._appSystem = Shell.AppSystem.get_default();
|
this._appSystem = Shell.AppSystem.get_default();
|
||||||
this.actor.add(this._grid.actor, { y_align: St.Align.START, expand: true });
|
this.actor.add(this._grid.actor, { y_align: St.Align.START, expand: true });
|
||||||
},
|
},
|
||||||
@ -148,22 +146,14 @@ AllAppDisplay.prototype = {
|
|||||||
Main.queueDeferredWork(this._workId);
|
Main.queueDeferredWork(this._workId);
|
||||||
}));
|
}));
|
||||||
|
|
||||||
let bin = new St.BoxLayout({ style_class: 'all-app-controls-panel',
|
this._scrollView = new St.ScrollView({ x_fill: true,
|
||||||
reactive: true });
|
|
||||||
this.actor = new St.BoxLayout({ style_class: 'all-app', vertical: true });
|
|
||||||
this.actor.hide();
|
|
||||||
|
|
||||||
let view = new St.ScrollView({ x_fill: true,
|
|
||||||
y_fill: false,
|
y_fill: false,
|
||||||
style_class: 'all-app-scroll-view',
|
|
||||||
vshadows: true });
|
vshadows: true });
|
||||||
this._scrollView = view;
|
this.actor = new St.Bin({ style_class: 'all-app',
|
||||||
this.actor.add(bin);
|
y_align: St.Align.START,
|
||||||
this.actor.add(view, { expand: true, y_fill: false, y_align: St.Align.START });
|
child: this._scrollView });
|
||||||
|
|
||||||
this._appView = new ViewByCategories();
|
this._appView = new ViewByCategories();
|
||||||
this._appView.connect('launching', Lang.bind(this, this.close));
|
|
||||||
this._appView.connect('drag-begin', Lang.bind(this, this.close));
|
|
||||||
this._scrollView.add_actor(this._appView.actor);
|
this._scrollView.add_actor(this._appView.actor);
|
||||||
|
|
||||||
this._scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
this._scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||||
@ -177,101 +167,10 @@ AllAppDisplay.prototype = {
|
|||||||
});
|
});
|
||||||
|
|
||||||
this._appView.refresh(apps);
|
this._appView.refresh(apps);
|
||||||
},
|
|
||||||
|
|
||||||
toggle: function() {
|
|
||||||
if (this.actor.visible) {
|
|
||||||
Tweener.addTween(this.actor,
|
|
||||||
{ opacity: 0,
|
|
||||||
time: Overview.PANE_FADE_TIME,
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onComplete: Lang.bind(this,
|
|
||||||
function() {
|
|
||||||
this.actor.hide();
|
|
||||||
this.emit('open-state-changed',
|
|
||||||
this.actor.visible);
|
|
||||||
})
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this.actor.show();
|
|
||||||
this.emit('open-state-changed', this.actor.visible);
|
|
||||||
this.actor.opacity = 0;
|
|
||||||
Tweener.addTween(this.actor,
|
|
||||||
{ opacity: 255,
|
|
||||||
time: Overview.PANE_FADE_TIME,
|
|
||||||
transition: 'easeOutQuad'
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
close: function() {
|
|
||||||
if (!this.actor.visible)
|
|
||||||
return;
|
|
||||||
this.toggle();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Signals.addSignalMethods(AllAppDisplay.prototype);
|
Signals.addSignalMethods(AllAppDisplay.prototype);
|
||||||
|
|
||||||
function AppSearchResultDisplay(provider) {
|
|
||||||
this._init(provider);
|
|
||||||
}
|
|
||||||
|
|
||||||
AppSearchResultDisplay.prototype = {
|
|
||||||
__proto__: Search.SearchResultDisplay.prototype,
|
|
||||||
|
|
||||||
_init: function (provider) {
|
|
||||||
Search.SearchResultDisplay.prototype._init.call(this, provider);
|
|
||||||
this._grid = new IconGrid.IconGrid({ rowLimit: WELL_MAX_SEARCH_ROWS });
|
|
||||||
this.actor = new St.Bin({ name: 'dashAppSearchResults',
|
|
||||||
x_align: St.Align.START });
|
|
||||||
this.actor.set_child(this._grid.actor);
|
|
||||||
},
|
|
||||||
|
|
||||||
renderResults: function(results, terms) {
|
|
||||||
let appSys = Shell.AppSystem.get_default();
|
|
||||||
let maxItems = WELL_MAX_SEARCH_ROWS * WELL_MAX_COLUMNS;
|
|
||||||
for (let i = 0; i < results.length && i < maxItems; i++) {
|
|
||||||
let result = results[i];
|
|
||||||
let app = appSys.get_app(result);
|
|
||||||
let display = new AppWellIcon(app);
|
|
||||||
this._grid.addItem(display.actor);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
clear: function () {
|
|
||||||
this._grid.removeAll();
|
|
||||||
this.selectionIndex = -1;
|
|
||||||
},
|
|
||||||
|
|
||||||
getVisibleResultCount: function() {
|
|
||||||
return this._grid.visibleItemsCount();
|
|
||||||
},
|
|
||||||
|
|
||||||
selectIndex: function (index) {
|
|
||||||
let nVisible = this.getVisibleResultCount();
|
|
||||||
if (this.selectionIndex >= 0) {
|
|
||||||
let prevActor = this._grid.getItemAtIndex(this.selectionIndex);
|
|
||||||
prevActor._delegate.setSelected(false);
|
|
||||||
}
|
|
||||||
this.selectionIndex = -1;
|
|
||||||
if (index >= nVisible)
|
|
||||||
return false;
|
|
||||||
else if (index < 0)
|
|
||||||
return false;
|
|
||||||
let targetActor = this._grid.getItemAtIndex(index);
|
|
||||||
targetActor._delegate.setSelected(true);
|
|
||||||
this.selectionIndex = index;
|
|
||||||
return true;
|
|
||||||
},
|
|
||||||
|
|
||||||
activateSelected: function() {
|
|
||||||
if (this.selectionIndex < 0)
|
|
||||||
return;
|
|
||||||
let targetActor = this._grid.getItemAtIndex(this.selectionIndex);
|
|
||||||
this.provider.activateResult(targetActor._delegate.app.get_id());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
function BaseAppSearchProvider() {
|
function BaseAppSearchProvider() {
|
||||||
this._init();
|
this._init();
|
||||||
@ -324,12 +223,10 @@ AppSearchProvider.prototype = {
|
|||||||
return this._appSys.subsearch(false, previousResults, terms);
|
return this._appSys.subsearch(false, previousResults, terms);
|
||||||
},
|
},
|
||||||
|
|
||||||
createResultContainerActor: function () {
|
|
||||||
return new AppSearchResultDisplay(this);
|
|
||||||
},
|
|
||||||
|
|
||||||
createResultActor: function (resultMeta, terms) {
|
createResultActor: function (resultMeta, terms) {
|
||||||
return new AppIcon(resultMeta.id);
|
let app = this._appSys.get_app(resultMeta['id']);
|
||||||
|
let icon = new AppWellIcon(app);
|
||||||
|
return icon.actor;
|
||||||
},
|
},
|
||||||
|
|
||||||
expandSearch: function(terms) {
|
expandSearch: function(terms) {
|
||||||
@ -375,7 +272,9 @@ AppIcon.prototype = {
|
|||||||
|
|
||||||
let label = this.app.get_name();
|
let label = this.app.get_name();
|
||||||
|
|
||||||
IconGrid.BaseIcon.prototype._init.call(this, label);
|
IconGrid.BaseIcon.prototype._init.call(this,
|
||||||
|
label,
|
||||||
|
{ setSizeManually: true });
|
||||||
},
|
},
|
||||||
|
|
||||||
createIcon: function(iconSize) {
|
createIcon: function(iconSize) {
|
||||||
@ -396,8 +295,8 @@ AppWellIcon.prototype = {
|
|||||||
y_fill: true });
|
y_fill: true });
|
||||||
this.actor._delegate = this;
|
this.actor._delegate = this;
|
||||||
|
|
||||||
this._icon = new AppIcon(app);
|
this.icon = new AppIcon(app);
|
||||||
this.actor.set_child(this._icon.actor);
|
this.actor.set_child(this.icon.actor);
|
||||||
|
|
||||||
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
|
||||||
|
|
||||||
@ -526,14 +425,6 @@ AppWellIcon.prototype = {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
setSelected: function (isSelected) {
|
|
||||||
this._selected = isSelected;
|
|
||||||
if (this._selected)
|
|
||||||
this.actor.add_style_class_name('selected');
|
|
||||||
else
|
|
||||||
this.actor.remove_style_class_name('selected');
|
|
||||||
},
|
|
||||||
|
|
||||||
_onMenuPoppedUp: function() {
|
_onMenuPoppedUp: function() {
|
||||||
if (this._getRunning()) {
|
if (this._getRunning()) {
|
||||||
Main.overview.getWorkspacesForWindow(null).setApplicationWindowSelection(this.app.get_id());
|
Main.overview.getWorkspacesForWindow(null).setApplicationWindowSelection(this.app.get_id());
|
||||||
@ -581,13 +472,13 @@ AppWellIcon.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
getDragActor: function() {
|
getDragActor: function() {
|
||||||
return this.app.create_icon_texture(this._icon.iconSize);
|
return this.app.create_icon_texture(this.icon.iconSize);
|
||||||
},
|
},
|
||||||
|
|
||||||
// Returns the original actor that should align with the actor
|
// Returns the original actor that should align with the actor
|
||||||
// we show as the item is being dragged.
|
// we show as the item is being dragged.
|
||||||
getDragActorSource: function() {
|
getDragActorSource: function() {
|
||||||
return this._icon.icon;
|
return this.icon.icon;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
Signals.addSignalMethods(AppWellIcon.prototype);
|
Signals.addSignalMethods(AppWellIcon.prototype);
|
||||||
@ -756,135 +647,3 @@ AppIconMenu.prototype = {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
Signals.addSignalMethods(AppIconMenu.prototype);
|
Signals.addSignalMethods(AppIconMenu.prototype);
|
||||||
|
|
||||||
function AppWell() {
|
|
||||||
this._init();
|
|
||||||
}
|
|
||||||
|
|
||||||
AppWell.prototype = {
|
|
||||||
_init : function() {
|
|
||||||
this._placeholderText = null;
|
|
||||||
this._menus = [];
|
|
||||||
this._menuDisplays = [];
|
|
||||||
|
|
||||||
this._favorites = [];
|
|
||||||
|
|
||||||
this._grid = new IconGrid.IconGrid();
|
|
||||||
this.actor = this._grid.actor;
|
|
||||||
this.actor._delegate = this;
|
|
||||||
|
|
||||||
this._workId = Main.initializeDeferredWork(this.actor, Lang.bind(this, this._redisplay));
|
|
||||||
|
|
||||||
this._tracker = Shell.WindowTracker.get_default();
|
|
||||||
this._appSystem = Shell.AppSystem.get_default();
|
|
||||||
|
|
||||||
this._appSystem.connect('installed-changed', Lang.bind(this, this._queueRedisplay));
|
|
||||||
AppFavorites.getAppFavorites().connect('changed', Lang.bind(this, this._queueRedisplay));
|
|
||||||
this._tracker.connect('app-state-changed', Lang.bind(this, this._queueRedisplay));
|
|
||||||
},
|
|
||||||
|
|
||||||
_appIdListToHash: function(apps) {
|
|
||||||
let ids = {};
|
|
||||||
for (let i = 0; i < apps.length; i++)
|
|
||||||
ids[apps[i].get_id()] = apps[i];
|
|
||||||
return ids;
|
|
||||||
},
|
|
||||||
|
|
||||||
_queueRedisplay: function () {
|
|
||||||
Main.queueDeferredWork(this._workId);
|
|
||||||
},
|
|
||||||
|
|
||||||
_redisplay: function () {
|
|
||||||
this._grid.removeAll();
|
|
||||||
|
|
||||||
let favorites = AppFavorites.getAppFavorites().getFavoriteMap();
|
|
||||||
|
|
||||||
/* hardcode here pending some design about how exactly desktop contexts behave */
|
|
||||||
let contextId = '';
|
|
||||||
|
|
||||||
let running = this._tracker.get_running_apps(contextId);
|
|
||||||
let runningIds = this._appIdListToHash(running);
|
|
||||||
|
|
||||||
let nFavorites = 0;
|
|
||||||
for (let id in favorites) {
|
|
||||||
let app = favorites[id];
|
|
||||||
let display = new AppWellIcon(app);
|
|
||||||
this._grid.addItem(display.actor);
|
|
||||||
nFavorites++;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (let i = 0; i < running.length; i++) {
|
|
||||||
let app = running[i];
|
|
||||||
if (app.get_id() in favorites)
|
|
||||||
continue;
|
|
||||||
let display = new AppWellIcon(app);
|
|
||||||
this._grid.addItem(display.actor);
|
|
||||||
}
|
|
||||||
if (this._placeholderText) {
|
|
||||||
this._placeholderText.destroy();
|
|
||||||
this._placeholderText = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (running.length == 0 && nFavorites == 0) {
|
|
||||||
this._placeholderText = new St.Label({ text: _("Drag here to add favorites") });
|
|
||||||
this.actor.add_actor(this._placeholderText);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
handleDragOver : function(source, actor, x, y, time) {
|
|
||||||
let app = null;
|
|
||||||
if (source instanceof AppWellIcon)
|
|
||||||
app = this._appSystem.get_app(source.getId());
|
|
||||||
else if (source instanceof Workspace.WindowClone)
|
|
||||||
app = this._tracker.get_window_app(source.metaWindow);
|
|
||||||
|
|
||||||
// Don't allow favoriting of transient apps
|
|
||||||
if (app == null || app.is_transient())
|
|
||||||
return DND.DragMotionResult.NO_DROP;
|
|
||||||
|
|
||||||
let id = app.get_id();
|
|
||||||
|
|
||||||
let favorites = AppFavorites.getAppFavorites().getFavoriteMap();
|
|
||||||
|
|
||||||
let srcIsFavorite = (id in favorites);
|
|
||||||
|
|
||||||
if (srcIsFavorite)
|
|
||||||
return DND.DragMotionResult.NO_DROP;
|
|
||||||
|
|
||||||
return DND.DragMotionResult.COPY_DROP;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Draggable target interface
|
|
||||||
acceptDrop : function(source, actor, x, y, time) {
|
|
||||||
let app = null;
|
|
||||||
if (source instanceof AppWellIcon) {
|
|
||||||
app = this._appSystem.get_app(source.getId());
|
|
||||||
} else if (source instanceof Workspace.WindowClone) {
|
|
||||||
app = this._tracker.get_window_app(source.metaWindow);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Don't allow favoriting of transient apps
|
|
||||||
if (app == null || app.is_transient()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
let id = app.get_id();
|
|
||||||
|
|
||||||
let favorites = AppFavorites.getAppFavorites().getFavoriteMap();
|
|
||||||
|
|
||||||
let srcIsFavorite = (id in favorites);
|
|
||||||
|
|
||||||
if (srcIsFavorite) {
|
|
||||||
return false;
|
|
||||||
} else {
|
|
||||||
Mainloop.idle_add(Lang.bind(this, function () {
|
|
||||||
AppFavorites.getAppFavorites().addFavorite(id);
|
|
||||||
return false;
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Signals.addSignalMethods(AppWell.prototype);
|
|
||||||
|
@ -63,7 +63,7 @@ AppFavorites.prototype = {
|
|||||||
return appId in this._favorites;
|
return appId in this._favorites;
|
||||||
},
|
},
|
||||||
|
|
||||||
_addFavorite: function(appId) {
|
_addFavorite: function(appId, pos) {
|
||||||
if (appId in this._favorites)
|
if (appId in this._favorites)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -73,23 +73,35 @@ AppFavorites.prototype = {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
let ids = this._getIds();
|
let ids = this._getIds();
|
||||||
|
if (pos == -1)
|
||||||
ids.push(appId);
|
ids.push(appId);
|
||||||
|
else
|
||||||
|
ids.splice(pos, 0, appId);
|
||||||
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
|
global.settings.set_strv(this.FAVORITE_APPS_KEY, ids);
|
||||||
this._favorites[appId] = app;
|
this._favorites[appId] = app;
|
||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
addFavorite: function(appId) {
|
addFavoriteAtPos: function(appId, pos) {
|
||||||
if (!this._addFavorite(appId))
|
if (!this._addFavorite(appId, pos))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
let app = Shell.AppSystem.get_default().get_app(appId);
|
let app = Shell.AppSystem.get_default().get_app(appId);
|
||||||
|
|
||||||
Main.overview.infoBar.setMessage(_("%s has been added to your favorites.").format(app.get_name()), Lang.bind(this, function () {
|
Main.overview.shellInfo.setMessage(_("%s has been added to your favorites.").format(app.get_name()), Lang.bind(this, function () {
|
||||||
this._removeFavorite(appId);
|
this._removeFavorite(appId);
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
|
addFavorite: function(appId) {
|
||||||
|
this.addFavoriteAtPos(appId, -1);
|
||||||
|
},
|
||||||
|
|
||||||
|
moveFavoriteToPos: function(appId, pos) {
|
||||||
|
this._removeFavorite(appId);
|
||||||
|
this._addFavorite(appId, pos);
|
||||||
|
},
|
||||||
|
|
||||||
_removeFavorite: function(appId) {
|
_removeFavorite: function(appId) {
|
||||||
if (!appId in this._favorites)
|
if (!appId in this._favorites)
|
||||||
return false;
|
return false;
|
||||||
@ -100,13 +112,16 @@ AppFavorites.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
removeFavorite: function(appId) {
|
removeFavorite: function(appId) {
|
||||||
|
let ids = this._getIds();
|
||||||
|
let pos = ids.indexOf(appId);
|
||||||
|
|
||||||
let app = this._favorites[appId];
|
let app = this._favorites[appId];
|
||||||
if (!this._removeFavorite(appId))
|
if (!this._removeFavorite(appId))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
Main.overview.infoBar.setMessage(_("%s has been removed from your favorites.").format(app.get_name()),
|
Main.overview.shellInfo.setMessage(_("%s has been removed from your favorites.").format(app.get_name()),
|
||||||
Lang.bind(this, function () {
|
Lang.bind(this, function () {
|
||||||
this._addFavorite(appId);
|
this._addFavorite(appId, pos);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -11,7 +11,7 @@ const POPUP_ANIMATION_TIME = 0.15;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* BoxPointer:
|
* BoxPointer:
|
||||||
* @side: A St.Side type; currently only St.Side.TOP is implemented
|
* @side: side to draw the arrow on
|
||||||
* @binProperties: Properties to set on contained bin
|
* @binProperties: Properties to set on contained bin
|
||||||
*
|
*
|
||||||
* An actor which displays a triangle "arrow" pointing to a given
|
* An actor which displays a triangle "arrow" pointing to a given
|
||||||
@ -272,7 +272,9 @@ BoxPointer.prototype = {
|
|||||||
// edge by the same distance as the main part of the box is
|
// edge by the same distance as the main part of the box is
|
||||||
// separated from its sourceActor
|
// separated from its sourceActor
|
||||||
let primary = global.get_primary_monitor();
|
let primary = global.get_primary_monitor();
|
||||||
let arrowRise = this.actor.get_theme_node().get_length('-arrow-rise');
|
let themeNode = this.actor.get_theme_node();
|
||||||
|
let arrowRise = themeNode.get_length('-arrow-rise');
|
||||||
|
let borderRadius = themeNode.get_length('-arrow-border-radius');
|
||||||
|
|
||||||
let resX, resY;
|
let resX, resY;
|
||||||
|
|
||||||
@ -298,13 +300,13 @@ BoxPointer.prototype = {
|
|||||||
case St.Side.BOTTOM:
|
case St.Side.BOTTOM:
|
||||||
switch (alignment) {
|
switch (alignment) {
|
||||||
case St.Align.START:
|
case St.Align.START:
|
||||||
resX = sourceX;
|
resX = sourceX - 2 * borderRadius;
|
||||||
break;
|
break;
|
||||||
case St.Align.MIDDLE:
|
case St.Align.MIDDLE:
|
||||||
resX = sourceX - Math.floor((natWidth - sourceWidth) / 2);
|
resX = sourceX - Math.floor((natWidth - sourceWidth) / 2);
|
||||||
break;
|
break;
|
||||||
case St.Align.END:
|
case St.Align.END:
|
||||||
resX = sourceX - (natWidth - sourceWidth);
|
resX = sourceX - (natWidth - sourceWidth) + 2 * borderRadius;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -318,13 +320,13 @@ BoxPointer.prototype = {
|
|||||||
case St.Side.RIGHT:
|
case St.Side.RIGHT:
|
||||||
switch (alignment) {
|
switch (alignment) {
|
||||||
case St.Align.START:
|
case St.Align.START:
|
||||||
resY = sourceY;
|
resY = sourceY - 2 * borderRadius;
|
||||||
break;
|
break;
|
||||||
case St.Align.MIDDLE:
|
case St.Align.MIDDLE:
|
||||||
resY = sourceY - Math.floor((natHeight - sourceHeight) / 2);
|
resY = sourceY - Math.floor((natHeight - sourceHeight) / 2);
|
||||||
break;
|
break;
|
||||||
case St.Align.END:
|
case St.Align.END:
|
||||||
resY = sourceY - (natHeight - sourceHeight);
|
resY = sourceY - (natHeight - sourceHeight) + 2 * borderRadius;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@ const Lang = imports.lang;
|
|||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const Pango = imports.gi.Pango;
|
const Pango = imports.gi.Pango;
|
||||||
const Gettext_gtk20 = imports.gettext.domain('gtk20');
|
const Gettext_gtk30 = imports.gettext.domain('gtk30');
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
const Gettext = imports.gettext.domain('gnome-shell');
|
||||||
const _ = Gettext.gettext;
|
const _ = Gettext.gettext;
|
||||||
|
|
||||||
@ -115,7 +115,7 @@ Calendar.prototype = {
|
|||||||
this._settings.connect('changed::' + SHOW_WEEKDATE_KEY, Lang.bind(this, this._onSettingsChange));
|
this._settings.connect('changed::' + SHOW_WEEKDATE_KEY, Lang.bind(this, this._onSettingsChange));
|
||||||
this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
|
this._useWeekdate = this._settings.get_boolean(SHOW_WEEKDATE_KEY);
|
||||||
|
|
||||||
let weekStartString = Gettext_gtk20.gettext('calendar:week_start:0');
|
let weekStartString = Gettext_gtk30.gettext('calendar:week_start:0');
|
||||||
if (weekStartString.indexOf('calendar:week_start:') == 0) {
|
if (weekStartString.indexOf('calendar:week_start:') == 0) {
|
||||||
this._weekStart = parseInt(weekStartString.substring(20));
|
this._weekStart = parseInt(weekStartString.substring(20));
|
||||||
}
|
}
|
||||||
@ -126,7 +126,7 @@ Calendar.prototype = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Find the ordering for month/year in the calendar heading
|
// Find the ordering for month/year in the calendar heading
|
||||||
switch (Gettext_gtk20.gettext('calendar:MY')) {
|
switch (Gettext_gtk30.gettext('calendar:MY')) {
|
||||||
case 'calendar:MY':
|
case 'calendar:MY':
|
||||||
this._headerFormat = '%B %Y';
|
this._headerFormat = '%B %Y';
|
||||||
break;
|
break;
|
||||||
|
1141
js/ui/dash.js
1141
js/ui/dash.js
File diff suppressed because it is too large
Load Diff
64
js/ui/dnd.js
64
js/ui/dnd.js
@ -26,9 +26,9 @@ const DragMotionResult = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const DRAG_CURSOR_MAP = {
|
const DRAG_CURSOR_MAP = {
|
||||||
0: Shell.Cursor.UNSUPPORTED_TARGET,
|
0: Shell.Cursor.DND_UNSUPPORTED_TARGET,
|
||||||
1: Shell.Cursor.COPY,
|
1: Shell.Cursor.DND_COPY,
|
||||||
2: Shell.Cursor.MOVE
|
2: Shell.Cursor.DND_MOVE
|
||||||
};
|
};
|
||||||
|
|
||||||
const DragDropResult = {
|
const DragDropResult = {
|
||||||
@ -100,6 +100,8 @@ _Draggable.prototype = {
|
|||||||
this._buttonDown = false; // The mouse button has been pressed and has not yet been released.
|
this._buttonDown = false; // The mouse button has been pressed and has not yet been released.
|
||||||
this._dragInProgress = false; // The drag has been started, and has not been dropped or cancelled yet.
|
this._dragInProgress = false; // The drag has been started, and has not been dropped or cancelled yet.
|
||||||
this._animationInProgress = false; // The drag is over and the item is in the process of animating to its original position (snapping back or reverting).
|
this._animationInProgress = false; // The drag is over and the item is in the process of animating to its original position (snapping back or reverting).
|
||||||
|
|
||||||
|
this._eventsGrabbed = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
_onButtonPress : function (actor, event) {
|
_onButtonPress : function (actor, event) {
|
||||||
@ -147,13 +149,19 @@ _Draggable.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_grabEvents: function() {
|
_grabEvents: function() {
|
||||||
|
if (!this._eventsGrabbed) {
|
||||||
Clutter.grab_pointer(_getEventHandlerActor());
|
Clutter.grab_pointer(_getEventHandlerActor());
|
||||||
Clutter.grab_keyboard(_getEventHandlerActor());
|
Clutter.grab_keyboard(_getEventHandlerActor());
|
||||||
|
this._eventsGrabbed = true;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_ungrabEvents: function() {
|
_ungrabEvents: function() {
|
||||||
|
if (this._eventsGrabbed) {
|
||||||
Clutter.ungrab_pointer();
|
Clutter.ungrab_pointer();
|
||||||
Clutter.ungrab_keyboard();
|
Clutter.ungrab_keyboard();
|
||||||
|
this._eventsGrabbed = false;
|
||||||
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
_onEvent: function(actor, event) {
|
_onEvent: function(actor, event) {
|
||||||
@ -213,7 +221,7 @@ _Draggable.prototype = {
|
|||||||
if (this._onEventId)
|
if (this._onEventId)
|
||||||
this._ungrabActor();
|
this._ungrabActor();
|
||||||
this._grabEvents();
|
this._grabEvents();
|
||||||
global.set_cursor(Shell.Cursor.IN_DRAG);
|
global.set_cursor(Shell.Cursor.DND_IN_DRAG);
|
||||||
|
|
||||||
this._dragX = this._dragStartX = stageX;
|
this._dragX = this._dragStartX = stageX;
|
||||||
this._dragY = this._dragStartY = stageY;
|
this._dragY = this._dragStartY = stageY;
|
||||||
@ -374,7 +382,7 @@ _Draggable.prototype = {
|
|||||||
}
|
}
|
||||||
target = target.get_parent();
|
target = target.get_parent();
|
||||||
}
|
}
|
||||||
global.set_cursor(Shell.Cursor.IN_DRAG);
|
global.set_cursor(Shell.Cursor.DND_IN_DRAG);
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
@ -440,24 +448,44 @@ _Draggable.prototype = {
|
|||||||
return true;
|
return true;
|
||||||
},
|
},
|
||||||
|
|
||||||
// Get position of the drag actor's source if the source is still around,
|
|
||||||
// or return the original location if the actor itself was being dragged
|
|
||||||
// or the source is no longer around.
|
|
||||||
_getRestoreLocation: function() {
|
_getRestoreLocation: function() {
|
||||||
let locX = this._snapBackX;
|
let x, y, scale;
|
||||||
let locY = this._snapBackY;
|
|
||||||
|
|
||||||
if (this._dragActorSource && this._dragActorSource.visible)
|
if (this._dragActorSource && this._dragActorSource.visible) {
|
||||||
[locX, locY] = this._dragActorSource.get_transformed_position();
|
// Snap the clone back to its source
|
||||||
return [locX, locY];
|
[x, y] = this._dragActorSource.get_transformed_position();
|
||||||
|
let [sourceScaledWidth, sourceScaledHeight] = this._dragActorSource.get_transformed_size();
|
||||||
|
scale = this._dragActor.width / sourceScaledWidth;
|
||||||
|
} else if (this._dragOrigParent) {
|
||||||
|
// Snap the actor back to its original position within
|
||||||
|
// its parent, adjusting for the fact that the parent
|
||||||
|
// may have been moved or scaled
|
||||||
|
let [parentX, parentY] = this._dragOrigParent.get_transformed_position();
|
||||||
|
x = parentX + this._dragOrigParent.scale_x * this._dragOrigX;
|
||||||
|
y = parentY + this._dragOrigParent.scale_y * this._dragOrigY;
|
||||||
|
|
||||||
|
let [parentWidth, parentHeight] = this._dragOrigParent.get_size();
|
||||||
|
let [parentScaledWidth, parentScaledHeight] = this._dragOrigParent.get_transformed_size();
|
||||||
|
let parentScale = parentScaledWidth / parentWidth;
|
||||||
|
scale = this._dragOrigScale * parentScale;
|
||||||
|
} else {
|
||||||
|
// Snap back actor to its original stage position
|
||||||
|
x = this._snapBackX;
|
||||||
|
y = this._snapBackY;
|
||||||
|
scale = this._snapBackScale;
|
||||||
|
}
|
||||||
|
|
||||||
|
return [x, y, scale];
|
||||||
},
|
},
|
||||||
|
|
||||||
_cancelDrag: function(eventTime) {
|
_cancelDrag: function(eventTime) {
|
||||||
this._dragInProgress = false;
|
this._dragInProgress = false;
|
||||||
let [snapBackX, snapBackY] = this._getRestoreLocation();
|
let [snapBackX, snapBackY, snapBackScale] = this._getRestoreLocation();
|
||||||
|
|
||||||
if (this._actorDestroyed) {
|
if (this._actorDestroyed) {
|
||||||
global.unset_cursor();
|
global.unset_cursor();
|
||||||
|
if (!this._buttonDown)
|
||||||
|
this._ungrabEvents();
|
||||||
this.emit('drag-end', eventTime, false);
|
this.emit('drag-end', eventTime, false);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -467,8 +495,8 @@ _Draggable.prototype = {
|
|||||||
Tweener.addTween(this._dragActor,
|
Tweener.addTween(this._dragActor,
|
||||||
{ x: snapBackX,
|
{ x: snapBackX,
|
||||||
y: snapBackY,
|
y: snapBackY,
|
||||||
scale_x: this._snapBackScale,
|
scale_x: snapBackScale,
|
||||||
scale_y: this._snapBackScale,
|
scale_y: snapBackScale,
|
||||||
opacity: this._dragOrigOpacity,
|
opacity: this._dragOrigOpacity,
|
||||||
time: SNAP_BACK_ANIMATION_TIME,
|
time: SNAP_BACK_ANIMATION_TIME,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
@ -480,11 +508,11 @@ _Draggable.prototype = {
|
|||||||
|
|
||||||
_restoreDragActor: function(eventTime) {
|
_restoreDragActor: function(eventTime) {
|
||||||
this._dragInProgress = false;
|
this._dragInProgress = false;
|
||||||
[restoreX, restoreY] = this._getRestoreLocation();
|
[restoreX, restoreY, restoreScale] = this._getRestoreLocation();
|
||||||
|
|
||||||
// fade the actor back in at its original location
|
// fade the actor back in at its original location
|
||||||
this._dragActor.set_position(restoreX, restoreY);
|
this._dragActor.set_position(restoreX, restoreY);
|
||||||
this._dragActor.set_scale(this._snapBackScale, this._snapBackScale);
|
this._dragActor.set_scale(restoreScale, restoreScale);
|
||||||
this._dragActor.opacity = 0;
|
this._dragActor.opacity = 0;
|
||||||
|
|
||||||
this._animationInProgress = true;
|
this._animationInProgress = true;
|
||||||
|
@ -4,7 +4,7 @@ const Clutter = imports.gi.Clutter;;
|
|||||||
const GLib = imports.gi.GLib;
|
const GLib = imports.gi.GLib;
|
||||||
const Shell = imports.gi.Shell;
|
const Shell = imports.gi.Shell;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Gettext_gtk20 = imports.gettext.domain('gtk20');
|
const Gettext_gtk30 = imports.gettext.domain('gtk30');
|
||||||
|
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
@ -65,7 +65,7 @@ function init() {
|
|||||||
String.prototype.format = Format.format;
|
String.prototype.format = Format.format;
|
||||||
|
|
||||||
// Set the default direction for St widgets (this needs to be done before any use of St)
|
// Set the default direction for St widgets (this needs to be done before any use of St)
|
||||||
if (Gettext_gtk20.gettext('default:LTR') == 'default:RTL') {
|
if (Gettext_gtk30.gettext('default:LTR') == 'default:RTL') {
|
||||||
St.Widget.set_default_direction(St.TextDirection.RTL);
|
St.Widget.set_default_direction(St.TextDirection.RTL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,8 @@
|
|||||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
|
const GLib = imports.gi.GLib;
|
||||||
|
const Gio = imports.gi.Gio;
|
||||||
const Gtk = imports.gi.Gtk;
|
const Gtk = imports.gi.Gtk;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
@ -14,6 +16,7 @@ const Tweener = imports.ui.tweener;
|
|||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
const BoxPointer = imports.ui.boxpointer;
|
const BoxPointer = imports.ui.boxpointer;
|
||||||
const Params = imports.misc.params;
|
const Params = imports.misc.params;
|
||||||
|
const Utils = imports.misc.utils;
|
||||||
|
|
||||||
const ANIMATION_TIME = 0.2;
|
const ANIMATION_TIME = 0.2;
|
||||||
const NOTIFICATION_TIMEOUT = 4;
|
const NOTIFICATION_TIMEOUT = 4;
|
||||||
@ -35,14 +38,131 @@ const State = {
|
|||||||
HIDING: 3
|
HIDING: 3
|
||||||
};
|
};
|
||||||
|
|
||||||
function _cleanMarkup(text) {
|
function _fixMarkup(text, allowMarkup) {
|
||||||
|
if (allowMarkup) {
|
||||||
// Support &, ", ', < and >, escape all other
|
// Support &, ", ', < and >, escape all other
|
||||||
// occurrences of '&'.
|
// occurrences of '&'.
|
||||||
let _text = text.replace(/&(?!amp;|quot;|apos;|lt;|gt;)/g, '&');
|
let _text = text.replace(/&(?!amp;|quot;|apos;|lt;|gt;)/g, '&');
|
||||||
// Support <b>, <i>, and <u>, escape anything else
|
// Support <b>, <i>, and <u>, escape anything else
|
||||||
// so it displays as raw markup.
|
// so it displays as raw markup.
|
||||||
return _text.replace(/<(\/?[^biu]>|[^>\/][^>])/g, '<$1');
|
return _text.replace(/<(\/?[^biu]>|[^>\/][^>])/g, '<$1');
|
||||||
|
} else {
|
||||||
|
// Escape everything
|
||||||
|
let _text = text.replace(/&/g, '&');
|
||||||
|
return _text.replace(/</g, '<');
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function URLHighlighter(text, lineWrap, allowMarkup) {
|
||||||
|
this._init(text, lineWrap, allowMarkup);
|
||||||
|
}
|
||||||
|
|
||||||
|
URLHighlighter.prototype = {
|
||||||
|
_init: function(text, lineWrap, allowMarkup) {
|
||||||
|
if (!text)
|
||||||
|
text = '';
|
||||||
|
this.actor = new St.Label({ reactive: true, style_class: 'url-highlighter' });
|
||||||
|
this._linkColor = '#ccccff';
|
||||||
|
this.actor.connect('style-changed', Lang.bind(this, function() {
|
||||||
|
let color = new Clutter.Color();
|
||||||
|
let hasColor = this.actor.get_theme_node().get_color('link-color', color);
|
||||||
|
if (hasColor) {
|
||||||
|
let linkColor = color.to_string().substr(0, 7);
|
||||||
|
if (linkColor != this._linkColor) {
|
||||||
|
this._linkColor = linkColor;
|
||||||
|
this._highlightUrls();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
if (lineWrap) {
|
||||||
|
this.actor.clutter_text.line_wrap = true;
|
||||||
|
this.actor.clutter_text.line_wrap_mode = Pango.WrapMode.WORD_CHAR;
|
||||||
|
this.actor.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setMarkup(text, allowMarkup);
|
||||||
|
this.actor.connect('button-release-event', Lang.bind(this, function (actor, event) {
|
||||||
|
let urlId = this._findUrlAtPos(event);
|
||||||
|
if (urlId != -1) {
|
||||||
|
let url = this._urls[urlId].url;
|
||||||
|
if (url.indexOf(':') == -1)
|
||||||
|
url = 'http://' + url;
|
||||||
|
try {
|
||||||
|
Gio.app_info_launch_default_for_uri(url, global.create_app_launch_context());
|
||||||
|
return true;
|
||||||
|
} catch (e) {
|
||||||
|
// TODO: remove this after gnome 3 release
|
||||||
|
let p = new Shell.Process({ 'args' : ['gvfs-open', url] });
|
||||||
|
p.run();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}));
|
||||||
|
this.actor.connect('motion-event', Lang.bind(this, function(actor, event) {
|
||||||
|
let urlId = this._findUrlAtPos(event);
|
||||||
|
if (urlId != -1 && !this._cursorChanged) {
|
||||||
|
global.set_cursor(Shell.Cursor.POINTING_HAND);
|
||||||
|
this._cursorChanged = true;
|
||||||
|
} else if (urlId == -1) {
|
||||||
|
global.unset_cursor();
|
||||||
|
this._cursorChanged = false;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}));
|
||||||
|
this.actor.connect('leave-event', Lang.bind(this, function() {
|
||||||
|
if (this._cursorChanged) {
|
||||||
|
this._cursorChanged = false;
|
||||||
|
global.unset_cursor();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
setMarkup: function(text, allowMarkup) {
|
||||||
|
text = text ? _fixMarkup(text, allowMarkup) : '';
|
||||||
|
this._text = text;
|
||||||
|
|
||||||
|
this.actor.clutter_text.set_markup(text);
|
||||||
|
/* clutter_text.text contain text without markup */
|
||||||
|
this._urls = Utils.findUrls(this.actor.clutter_text.text);
|
||||||
|
this._highlightUrls();
|
||||||
|
},
|
||||||
|
|
||||||
|
_highlightUrls: function() {
|
||||||
|
// text here contain markup
|
||||||
|
let urls = Utils.findUrls(this._text);
|
||||||
|
let markup = '';
|
||||||
|
let pos = 0;
|
||||||
|
for (let i = 0; i < urls.length; i++) {
|
||||||
|
let url = urls[i];
|
||||||
|
let str = this._text.substr(pos, url.pos - pos);
|
||||||
|
markup += str + '<span foreground="' + this._linkColor + '"><u>' + url.url + '</u></span>';
|
||||||
|
pos = url.pos + url.url.length;
|
||||||
|
}
|
||||||
|
markup += this._text.substr(pos);
|
||||||
|
this.actor.clutter_text.set_markup(markup);
|
||||||
|
},
|
||||||
|
|
||||||
|
_findUrlAtPos: function(event) {
|
||||||
|
let success;
|
||||||
|
let [x, y] = event.get_coords();
|
||||||
|
[success, x, y] = this.actor.transform_stage_point(x, y);
|
||||||
|
let find_pos = -1;
|
||||||
|
for (let i = 0; i < this.actor.clutter_text.text.length; i++) {
|
||||||
|
let [success, px, py, line_height] = this.actor.clutter_text.position_to_coords(i);
|
||||||
|
if (py > y || py + line_height < y || x < px)
|
||||||
|
continue;
|
||||||
|
find_pos = i;
|
||||||
|
}
|
||||||
|
if (find_pos != -1) {
|
||||||
|
for (let i = 0; i < this._urls.length; i++)
|
||||||
|
if (find_pos >= this._urls[i].pos &&
|
||||||
|
this._urls[i].pos + this._urls[i].url.length > find_pos)
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// Notification:
|
// Notification:
|
||||||
// @source: the notification's Source
|
// @source: the notification's Source
|
||||||
@ -73,7 +193,8 @@ function _cleanMarkup(text) {
|
|||||||
// area.
|
// area.
|
||||||
//
|
//
|
||||||
// @params can contain values for 'customContent', 'body', 'icon',
|
// @params can contain values for 'customContent', 'body', 'icon',
|
||||||
// and 'clear' parameters.
|
// 'titleMarkup', 'bannerMarkup', 'bodyMarkup', and 'clear'
|
||||||
|
// parameters.
|
||||||
//
|
//
|
||||||
// If @params contains a 'customContent' parameter with the value %true,
|
// If @params contains a 'customContent' parameter with the value %true,
|
||||||
// then @banner will not be shown in the body of the notification when the
|
// then @banner will not be shown in the body of the notification when the
|
||||||
@ -87,6 +208,12 @@ function _cleanMarkup(text) {
|
|||||||
// source.createNotificationIcon(). However, if @params contains an 'icon'
|
// source.createNotificationIcon(). However, if @params contains an 'icon'
|
||||||
// parameter, the passed in icon will be used.
|
// parameter, the passed in icon will be used.
|
||||||
//
|
//
|
||||||
|
// If @params contains a 'titleMarkup', 'bannerMarkup', or
|
||||||
|
// 'bodyMarkup' parameter with the value %true, then the corresponding
|
||||||
|
// element is assumed to use pango markup. If the parameter is not
|
||||||
|
// present for an element, then anything that looks like markup in
|
||||||
|
// that element will appear literally in the output.
|
||||||
|
//
|
||||||
// If @params contains a 'clear' parameter with the value %true, then
|
// If @params contains a 'clear' parameter with the value %true, then
|
||||||
// the content and the action area of the notification will be cleared.
|
// the content and the action area of the notification will be cleared.
|
||||||
// The content area is also always cleared if 'customContent' is false
|
// The content area is also always cleared if 'customContent' is false
|
||||||
@ -103,6 +230,7 @@ Notification.prototype = {
|
|||||||
this._useActionIcons = false;
|
this._useActionIcons = false;
|
||||||
this._customContent = false;
|
this._customContent = false;
|
||||||
this._bannerBodyText = null;
|
this._bannerBodyText = null;
|
||||||
|
this._bannerBodyMarkup = false;
|
||||||
this._titleFitsInBannerMode = true;
|
this._titleFitsInBannerMode = true;
|
||||||
this._spacing = 0;
|
this._spacing = 0;
|
||||||
|
|
||||||
@ -148,7 +276,8 @@ Notification.prototype = {
|
|||||||
|
|
||||||
this._titleLabel = new St.Label();
|
this._titleLabel = new St.Label();
|
||||||
this._bannerBox.add_actor(this._titleLabel);
|
this._bannerBox.add_actor(this._titleLabel);
|
||||||
this._bannerLabel = new St.Label();
|
this._bannerUrlHighlighter = new URLHighlighter();
|
||||||
|
this._bannerLabel = this._bannerUrlHighlighter.actor;
|
||||||
this._bannerBox.add_actor(this._bannerLabel);
|
this._bannerBox.add_actor(this._bannerLabel);
|
||||||
|
|
||||||
this.update(title, banner, params);
|
this.update(title, banner, params);
|
||||||
@ -175,6 +304,9 @@ Notification.prototype = {
|
|||||||
params = Params.parse(params, { customContent: false,
|
params = Params.parse(params, { customContent: false,
|
||||||
body: null,
|
body: null,
|
||||||
icon: null,
|
icon: null,
|
||||||
|
titleMarkup: false,
|
||||||
|
bannerMarkup: false,
|
||||||
|
bodyMarkup: false,
|
||||||
clear: false });
|
clear: false });
|
||||||
|
|
||||||
this._customContent = params.customContent;
|
this._customContent = params.customContent;
|
||||||
@ -205,7 +337,7 @@ Notification.prototype = {
|
|||||||
y_fill: false,
|
y_fill: false,
|
||||||
y_align: St.Align.START });
|
y_align: St.Align.START });
|
||||||
|
|
||||||
title = title ? _cleanMarkup(title.replace(/\n/g, ' ')) : '';
|
title = title ? _fixMarkup(title.replace(/\n/g, ' '), params.titleMarkup) : '';
|
||||||
this._titleLabel.clutter_text.set_markup('<b>' + title + '</b>');
|
this._titleLabel.clutter_text.set_markup('<b>' + title + '</b>');
|
||||||
|
|
||||||
// Unless the notification has custom content, we save this._bannerBodyText
|
// Unless the notification has custom content, we save this._bannerBodyText
|
||||||
@ -213,9 +345,11 @@ Notification.prototype = {
|
|||||||
// expandable due to other elements in its content area or due to the banner
|
// expandable due to other elements in its content area or due to the banner
|
||||||
// not fitting fully in the single-line mode.
|
// not fitting fully in the single-line mode.
|
||||||
this._bannerBodyText = this._customContent ? null : banner;
|
this._bannerBodyText = this._customContent ? null : banner;
|
||||||
|
this._bannerBodyMarkup = params.bannerMarkup;
|
||||||
|
|
||||||
banner = banner ? _cleanMarkup(banner.replace(/\n/g, ' ')) : '';
|
banner = banner ? banner.replace(/\n/g, ' ') : '';
|
||||||
this._bannerLabel.clutter_text.set_markup(banner);
|
|
||||||
|
this._bannerUrlHighlighter.setMarkup(banner, params.bannerMarkup);
|
||||||
this._bannerLabel.queue_relayout();
|
this._bannerLabel.queue_relayout();
|
||||||
|
|
||||||
// Add the bannerBody now if we know for sure we'll need it
|
// Add the bannerBody now if we know for sure we'll need it
|
||||||
@ -223,7 +357,7 @@ Notification.prototype = {
|
|||||||
this._addBannerBody();
|
this._addBannerBody();
|
||||||
|
|
||||||
if (params.body)
|
if (params.body)
|
||||||
this.addBody(params.body);
|
this.addBody(params.body, params.bodyMarkup);
|
||||||
this._updated();
|
this._updated();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -231,7 +365,7 @@ Notification.prototype = {
|
|||||||
// @actor: actor to add to the body of the notification
|
// @actor: actor to add to the body of the notification
|
||||||
//
|
//
|
||||||
// Appends @actor to the notification's body
|
// Appends @actor to the notification's body
|
||||||
addActor: function(actor) {
|
addActor: function(actor, style) {
|
||||||
if (!this._scrollArea) {
|
if (!this._scrollArea) {
|
||||||
this.actor.add_style_class_name('multi-line-notification');
|
this.actor.add_style_class_name('multi-line-notification');
|
||||||
this._scrollArea = new St.ScrollView({ name: 'notification-scrollview',
|
this._scrollArea = new St.ScrollView({ name: 'notification-scrollview',
|
||||||
@ -248,34 +382,30 @@ Notification.prototype = {
|
|||||||
this._addBannerBody();
|
this._addBannerBody();
|
||||||
}
|
}
|
||||||
|
|
||||||
this._contentArea.add(actor);
|
this._contentArea.add(actor, style ? style : {});
|
||||||
this._updated();
|
this._updated();
|
||||||
},
|
},
|
||||||
|
|
||||||
// addBody:
|
// addBody:
|
||||||
// @text: the text
|
// @text: the text
|
||||||
|
// @markup: %true if @text contains pango markup
|
||||||
|
// @style: style to use when adding the actor containing the text
|
||||||
//
|
//
|
||||||
// Adds a multi-line label containing @text to the notification.
|
// Adds a multi-line label containing @text to the notification.
|
||||||
//
|
//
|
||||||
// Return value: the newly-added label
|
// Return value: the newly-added label
|
||||||
addBody: function(text) {
|
addBody: function(text, markup, style) {
|
||||||
let body = new St.Label();
|
let label = new URLHighlighter(text, true, markup);
|
||||||
body.clutter_text.line_wrap = true;
|
|
||||||
body.clutter_text.line_wrap_mode = Pango.WrapMode.WORD_CHAR;
|
|
||||||
body.clutter_text.ellipsize = Pango.EllipsizeMode.NONE;
|
|
||||||
|
|
||||||
text = text ? _cleanMarkup(text) : '';
|
this.addActor(label.actor, style);
|
||||||
body.clutter_text.set_markup(text);
|
return label.actor;
|
||||||
|
|
||||||
this.addActor(body);
|
|
||||||
return body;
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_addBannerBody: function() {
|
_addBannerBody: function() {
|
||||||
if (this._bannerBodyText) {
|
if (this._bannerBodyText) {
|
||||||
let text = this._bannerBodyText;
|
let text = this._bannerBodyText;
|
||||||
this._bannerBodyText = null;
|
this._bannerBodyText = null;
|
||||||
this.addBody(text);
|
this.addBody(text, this._bannerBodyMarkup);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
@ -75,11 +75,11 @@ const Urgency = {
|
|||||||
const rewriteRules = {
|
const rewriteRules = {
|
||||||
'XChat': [
|
'XChat': [
|
||||||
{ pattern: /^XChat: Private message from: (\S*) \(.*\)$/,
|
{ pattern: /^XChat: Private message from: (\S*) \(.*\)$/,
|
||||||
replacement: '<$1>' },
|
replacement: '<$1>' },
|
||||||
{ pattern: /^XChat: New public message from: (\S*) \((.*)\)$/,
|
{ pattern: /^XChat: New public message from: (\S*) \((.*)\)$/,
|
||||||
replacement: '$2 <$1>' },
|
replacement: '$2 <$1>' },
|
||||||
{ pattern: /^XChat: Highlighted message from: (\S*) \((.*)\)$/,
|
{ pattern: /^XChat: Highlighted message from: (\S*) \((.*)\)$/,
|
||||||
replacement: '$2 <$1>' }
|
replacement: '$2 <$1>' }
|
||||||
]
|
]
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -205,8 +205,6 @@ NotificationDaemon.prototype = {
|
|||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
summary = GLib.markup_escape_text(summary, -1);
|
|
||||||
|
|
||||||
let rewrites = rewriteRules[appName];
|
let rewrites = rewriteRules[appName];
|
||||||
if (rewrites) {
|
if (rewrites) {
|
||||||
for (let i = 0; i < rewrites.length; i++) {
|
for (let i = 0; i < rewrites.length; i++) {
|
||||||
@ -281,7 +279,9 @@ NotificationDaemon.prototype = {
|
|||||||
let iconActor = this._iconForNotificationData(icon, hints, source.ICON_SIZE);
|
let iconActor = this._iconForNotificationData(icon, hints, source.ICON_SIZE);
|
||||||
|
|
||||||
if (notification == null) {
|
if (notification == null) {
|
||||||
notification = new MessageTray.Notification(source, summary, body, { icon: iconActor });
|
notification = new MessageTray.Notification(source, summary, body,
|
||||||
|
{ icon: iconActor,
|
||||||
|
bannerMarkup: true });
|
||||||
ndata.notification = notification;
|
ndata.notification = notification;
|
||||||
notification.connect('clicked', Lang.bind(this,
|
notification.connect('clicked', Lang.bind(this,
|
||||||
function(n) {
|
function(n) {
|
||||||
@ -294,6 +294,7 @@ NotificationDaemon.prototype = {
|
|||||||
notification.connect('action-invoked', Lang.bind(this, this._actionInvoked, source, id));
|
notification.connect('action-invoked', Lang.bind(this, this._actionInvoked, source, id));
|
||||||
} else {
|
} else {
|
||||||
notification.update(summary, body, { icon: iconActor,
|
notification.update(summary, body, { icon: iconActor,
|
||||||
|
bannerMarkup: true,
|
||||||
clear: true });
|
clear: true });
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||||
|
|
||||||
const Clutter = imports.gi.Clutter;
|
const Clutter = imports.gi.Clutter;
|
||||||
|
const Meta = imports.gi.Meta;
|
||||||
const Mainloop = imports.mainloop;
|
const Mainloop = imports.mainloop;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
@ -8,104 +9,60 @@ const St = imports.gi.St;
|
|||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
const Gettext = imports.gettext.domain('gnome-shell');
|
||||||
const _ = Gettext.gettext;
|
const _ = Gettext.gettext;
|
||||||
|
|
||||||
|
const AppDisplay = imports.ui.appDisplay;
|
||||||
|
const Dash = imports.ui.dash;
|
||||||
|
const DocDisplay = imports.ui.docDisplay;
|
||||||
const GenericDisplay = imports.ui.genericDisplay;
|
const GenericDisplay = imports.ui.genericDisplay;
|
||||||
const Lightbox = imports.ui.lightbox;
|
const Lightbox = imports.ui.lightbox;
|
||||||
const Main = imports.ui.main;
|
const Main = imports.ui.main;
|
||||||
|
const MessageTray = imports.ui.messageTray;
|
||||||
const Panel = imports.ui.panel;
|
const Panel = imports.ui.panel;
|
||||||
const Dash = imports.ui.dash;
|
const PlaceDisplay = imports.ui.placeDisplay;
|
||||||
const Tweener = imports.ui.tweener;
|
const Tweener = imports.ui.tweener;
|
||||||
|
const ViewSelector = imports.ui.viewSelector;
|
||||||
const WorkspacesView = imports.ui.workspacesView;
|
const WorkspacesView = imports.ui.workspacesView;
|
||||||
|
|
||||||
// Time for initial animation going into Overview mode
|
// Time for initial animation going into Overview mode
|
||||||
const ANIMATION_TIME = 0.25;
|
const ANIMATION_TIME = 0.25;
|
||||||
|
|
||||||
// Time for pane menus to fade in/out
|
// We split the screen vertically between the dash and the view selector.
|
||||||
const PANE_FADE_TIME = 0.1;
|
const DASH_SPLIT_FRACTION = 0.1;
|
||||||
|
|
||||||
// We divide the screen into a grid of rows and columns, which we use
|
const SHELL_INFO_HIDE_TIMEOUT = 10;
|
||||||
// to help us position the Overview components, such as the side panel
|
|
||||||
// that lists applications and documents, the workspaces display, and
|
|
||||||
// the button for adding additional workspaces.
|
|
||||||
// In the regular mode, the side panel takes up one column on the left,
|
|
||||||
// and the workspaces display takes up the remaining columns.
|
|
||||||
// In the expanded side panel display mode, the side panel takes up two
|
|
||||||
// columns, and the workspaces display slides all the way to the right,
|
|
||||||
// being visible only in the last quarter of the right-most column.
|
|
||||||
// In the future, this mode will have more components, such as a display
|
|
||||||
// of documents which were recently opened with a given application, which
|
|
||||||
// will take up the remaining sections of the display.
|
|
||||||
|
|
||||||
const WIDE_SCREEN_CUT_OFF_RATIO = 1.4;
|
function Source() {
|
||||||
// A common netbook resolution is 1024x600, which trips the widescreen
|
|
||||||
// ratio. However that leaves way too few pixels for the dash. So
|
|
||||||
// just treat this as a regular screen.
|
|
||||||
const WIDE_SCREEN_MINIMUM_HEIGHT = 768;
|
|
||||||
|
|
||||||
const COLUMNS_REGULAR_SCREEN = 4;
|
|
||||||
const ROWS_REGULAR_SCREEN = 8;
|
|
||||||
const COLUMNS_WIDE_SCREEN = 5;
|
|
||||||
const ROWS_WIDE_SCREEN = 10;
|
|
||||||
|
|
||||||
const DEFAULT_PADDING = 4;
|
|
||||||
|
|
||||||
// Padding around workspace grid / Spacing between Dash and Workspaces
|
|
||||||
const WORKSPACE_GRID_PADDING = 12;
|
|
||||||
|
|
||||||
const COLUMNS_FOR_WORKSPACES_REGULAR_SCREEN = 3;
|
|
||||||
const ROWS_FOR_WORKSPACES_REGULAR_SCREEN = 6;
|
|
||||||
|
|
||||||
const COLUMNS_FOR_WORKSPACES_WIDE_SCREEN = 4;
|
|
||||||
const ROWS_FOR_WORKSPACES_WIDE_SCREEN = 8;
|
|
||||||
|
|
||||||
// A multi-state; PENDING is used during animations
|
|
||||||
const STATE_ACTIVE = true;
|
|
||||||
const STATE_PENDING_INACTIVE = false;
|
|
||||||
const STATE_INACTIVE = false;
|
|
||||||
|
|
||||||
const SHADOW_COLOR = new Clutter.Color();
|
|
||||||
SHADOW_COLOR.from_pixel(0x00000033);
|
|
||||||
const TRANSPARENT_COLOR = new Clutter.Color();
|
|
||||||
TRANSPARENT_COLOR.from_pixel(0x00000000);
|
|
||||||
|
|
||||||
const SHADOW_WIDTH = 6;
|
|
||||||
|
|
||||||
const NUMBER_OF_SECTIONS_IN_SEARCH = 2;
|
|
||||||
|
|
||||||
const INFO_BAR_HIDE_TIMEOUT = 10;
|
|
||||||
|
|
||||||
let wideScreen = false;
|
|
||||||
let displayGridColumnWidth = null;
|
|
||||||
let displayGridRowHeight = null;
|
|
||||||
|
|
||||||
function InfoBar() {
|
|
||||||
this._init();
|
this._init();
|
||||||
}
|
}
|
||||||
|
|
||||||
InfoBar.prototype = {
|
Source.prototype = {
|
||||||
|
__proto__: MessageTray.Source.prototype,
|
||||||
|
|
||||||
_init: function() {
|
_init: function() {
|
||||||
this.actor = new St.Bin({ style_class: 'info-bar-panel',
|
MessageTray.Source.prototype._init.call(this,
|
||||||
x_fill: true,
|
"System Information");
|
||||||
y_fill: false });
|
this._setSummaryIcon(this.createNotificationIcon());
|
||||||
this._label = new St.Label();
|
},
|
||||||
this._undo = new St.Button({ style_class: 'info-bar-link-button' });
|
|
||||||
|
|
||||||
let bin = new St.Bin({ x_fill: false,
|
createNotificationIcon: function() {
|
||||||
y_fill: false,
|
return new St.Icon({ icon_name: 'info',
|
||||||
x_align: St.Align.MIDDLE,
|
icon_type: St.IconType.FULLCOLOR,
|
||||||
y_align: St.Align.MIDDLE });
|
icon_size: this.ICON_SIZE });
|
||||||
this.actor.set_child(bin);
|
},
|
||||||
|
|
||||||
let box = new St.BoxLayout({ style_class: 'info-bar' });
|
_notificationClicked: function() {
|
||||||
bin.set_child(box);
|
this.destroy();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function ShellInfo() {
|
||||||
|
this._init();
|
||||||
|
}
|
||||||
|
|
||||||
|
ShellInfo.prototype = {
|
||||||
|
_init: function() {
|
||||||
|
this._source = null;
|
||||||
this._timeoutId = 0;
|
this._timeoutId = 0;
|
||||||
|
|
||||||
box.add(this._label, {'y-fill' : false, 'y-align' : St.Align.MIDDLE});
|
|
||||||
box.add(this._undo);
|
|
||||||
|
|
||||||
this.actor.set_opacity(0);
|
|
||||||
|
|
||||||
this._undoCallback = null;
|
this._undoCallback = null;
|
||||||
this._undo.connect('clicked', Lang.bind(this, this._onUndoClicked));
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_onUndoClicked: function() {
|
_onUndoClicked: function() {
|
||||||
@ -114,27 +71,16 @@ InfoBar.prototype = {
|
|||||||
|
|
||||||
if (this._undoCallback)
|
if (this._undoCallback)
|
||||||
this._undoCallback();
|
this._undoCallback();
|
||||||
this.actor.set_opacity(0);
|
|
||||||
this._undoCallback = null;
|
this._undoCallback = null;
|
||||||
},
|
|
||||||
|
|
||||||
_hideDone: function() {
|
if (this._source)
|
||||||
this._undoCallback = null;
|
this._source.destroy();
|
||||||
},
|
|
||||||
|
|
||||||
_hide: function() {
|
|
||||||
Tweener.addTween(this.actor,
|
|
||||||
{ opacity: 0,
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
time: ANIMATION_TIME,
|
|
||||||
onComplete: this._hideDone,
|
|
||||||
onCompleteScope: this
|
|
||||||
});
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_onTimeout: function() {
|
_onTimeout: function() {
|
||||||
this._timeoutId = 0;
|
this._timeoutId = 0;
|
||||||
this._hide();
|
if (this._source)
|
||||||
|
this._source.destroy();
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -142,28 +88,33 @@ InfoBar.prototype = {
|
|||||||
if (this._timeoutId)
|
if (this._timeoutId)
|
||||||
Mainloop.source_remove(this._timeoutId);
|
Mainloop.source_remove(this._timeoutId);
|
||||||
|
|
||||||
this._timeout = false;
|
this._timeoutId = Mainloop.timeout_add_seconds(SHELL_INFO_HIDE_TIMEOUT,
|
||||||
|
Lang.bind(this, this._onTimeout));
|
||||||
|
|
||||||
this._label.text = text;
|
if (this._source == null) {
|
||||||
|
this._source = new Source();
|
||||||
|
this._source.connect('destroy', Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
this._source = null;
|
||||||
|
}));
|
||||||
|
Main.messageTray.add(this._source);
|
||||||
|
}
|
||||||
|
|
||||||
Tweener.addTween(this.actor,
|
let notification = this._source.notification;
|
||||||
{ opacity: 255,
|
if (notification == null)
|
||||||
transition: 'easeOutQuad',
|
notification = new MessageTray.Notification(this._source, text, null);
|
||||||
time: ANIMATION_TIME
|
|
||||||
});
|
|
||||||
|
|
||||||
this._timeoutId = Mainloop.timeout_add_seconds(INFO_BAR_HIDE_TIMEOUT, Lang.bind(this, this._onTimeout));
|
|
||||||
|
|
||||||
if (undoLabel)
|
|
||||||
this._undo.label = undoLabel;
|
|
||||||
else
|
else
|
||||||
this._undo.label = _("Undo");
|
notification.update(text, null, { clear: true });
|
||||||
|
|
||||||
this._undoCallback = undoCallback;
|
this._undoCallback = undoCallback;
|
||||||
if (undoCallback)
|
if (undoCallback) {
|
||||||
this._undo.show();
|
notification.addButton('system-undo',
|
||||||
else
|
undoLabel ? undoLabel : _("Undo"));
|
||||||
this._undo.hide();
|
notification.connect('action-invoked',
|
||||||
|
Lang.bind(this, this._onUndoClicked));
|
||||||
|
}
|
||||||
|
|
||||||
|
this._source.notify(notification);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -173,30 +124,37 @@ function Overview() {
|
|||||||
|
|
||||||
Overview.prototype = {
|
Overview.prototype = {
|
||||||
_init : function() {
|
_init : function() {
|
||||||
this._group = new St.Group({ style_class: 'overview' });
|
// The actual global.background_actor is inside global.window_group,
|
||||||
|
// which is hidden when displaying the overview, so we display a clone.
|
||||||
|
this._background = new Clutter.Clone({ source: global.background_actor });
|
||||||
|
this._background.hide();
|
||||||
|
global.overlay_group.add_actor(this._background);
|
||||||
|
|
||||||
|
this._desktopFade = new St.Bin();
|
||||||
|
global.overlay_group.add_actor(this._desktopFade);
|
||||||
|
|
||||||
|
this._spacing = 0;
|
||||||
|
|
||||||
|
this._group = new St.Group({ name: 'overview' });
|
||||||
this._group._delegate = this;
|
this._group._delegate = this;
|
||||||
this._group.connect('destroy', Lang.bind(this,
|
this._group.connect('style-changed',
|
||||||
function() {
|
Lang.bind(this, function() {
|
||||||
if (this._lightbox) {
|
let node = this._group.get_theme_node();
|
||||||
this._lightbox.destroy();
|
let spacing = node.get_length('spacing');
|
||||||
this._lightbox = null;
|
if (spacing != this._spacing) {
|
||||||
|
this._spacing = spacing;
|
||||||
|
this.relayout();
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
this.infoBar = new InfoBar();
|
this.shellInfo = new ShellInfo();
|
||||||
this._group.add_actor(this.infoBar.actor);
|
|
||||||
|
|
||||||
this._workspacesManager = null;
|
this._workspacesDisplay = null;
|
||||||
this._lightbox = null;
|
|
||||||
|
|
||||||
this.visible = false;
|
this.visible = false;
|
||||||
this.animationInProgress = false;
|
this.animationInProgress = false;
|
||||||
this._hideInProgress = false;
|
this._hideInProgress = false;
|
||||||
|
|
||||||
this._recalculateGridSizes();
|
|
||||||
|
|
||||||
this._activeDisplayPane = null;
|
|
||||||
|
|
||||||
// During transitions, we raise this to the top to avoid having the overview
|
// During transitions, we raise this to the top to avoid having the overview
|
||||||
// area be reactive; it causes too many issues such as double clicks on
|
// area be reactive; it causes too many issues such as double clicks on
|
||||||
// Dash elements, or mouseover handlers in the workspaces.
|
// Dash elements, or mouseover handlers in the workspaces.
|
||||||
@ -205,196 +163,86 @@ Overview.prototype = {
|
|||||||
this._group.add_actor(this._coverPane);
|
this._group.add_actor(this._coverPane);
|
||||||
this._coverPane.connect('event', Lang.bind(this, function (actor, event) { return true; }));
|
this._coverPane.connect('event', Lang.bind(this, function (actor, event) { return true; }));
|
||||||
|
|
||||||
// Similar to the cover pane but used for dialogs ("panes"); see the comments
|
|
||||||
// in addPane below.
|
|
||||||
this._transparentBackground = new Clutter.Rectangle({ opacity: 0,
|
|
||||||
reactive: true });
|
|
||||||
this._group.add_actor(this._transparentBackground);
|
|
||||||
|
|
||||||
// Background color for the Overview
|
|
||||||
this._backOver = new St.Label();
|
|
||||||
this._group.add_actor(this._backOver);
|
|
||||||
|
|
||||||
this._group.hide();
|
this._group.hide();
|
||||||
global.overlay_group.add_actor(this._group);
|
global.overlay_group.add_actor(this._group);
|
||||||
|
|
||||||
|
this.viewSelector = new ViewSelector.ViewSelector();
|
||||||
|
this._group.add_actor(this.viewSelector.actor);
|
||||||
|
|
||||||
|
this._workspacesDisplay = new WorkspacesView.WorkspacesDisplay();
|
||||||
|
this.viewSelector.addViewTab("Windows", this._workspacesDisplay.actor);
|
||||||
|
|
||||||
|
let appView = new AppDisplay.AllAppDisplay();
|
||||||
|
this.viewSelector.addViewTab("Applications", appView.actor);
|
||||||
|
|
||||||
|
// Default search providers
|
||||||
|
this.viewSelector.addSearchProvider(new AppDisplay.AppSearchProvider());
|
||||||
|
this.viewSelector.addSearchProvider(new AppDisplay.PrefsSearchProvider());
|
||||||
|
this.viewSelector.addSearchProvider(new PlaceDisplay.PlaceSearchProvider());
|
||||||
|
this.viewSelector.addSearchProvider(new DocDisplay.DocSearchProvider());
|
||||||
|
|
||||||
// TODO - recalculate everything when desktop size changes
|
// TODO - recalculate everything when desktop size changes
|
||||||
this._dash = new Dash.Dash();
|
this._dash = new Dash.Dash();
|
||||||
this._group.add_actor(this._dash.actor);
|
this._group.add_actor(this._dash.actor);
|
||||||
|
this._dash.actor.add_constraint(this.viewSelector.constrainY);
|
||||||
// Container to hold popup pane chrome.
|
this._dash.actor.add_constraint(this.viewSelector.constrainHeight);
|
||||||
this._paneContainer = new St.BoxLayout({ style_class: 'overview-pane' });
|
|
||||||
// Note here we explicitly don't set the paneContainer to be reactive yet; that's done
|
|
||||||
// inside the notify::visible handler on panes.
|
|
||||||
this._paneContainer.connect('button-release-event', Lang.bind(this, function(background) {
|
|
||||||
this._activeDisplayPane.close();
|
|
||||||
return true;
|
|
||||||
}));
|
|
||||||
this._group.add_actor(this._paneContainer);
|
|
||||||
|
|
||||||
this._transparentBackground.lower_bottom();
|
|
||||||
this._paneContainer.hide();
|
|
||||||
|
|
||||||
this._coverPane.lower_bottom();
|
this._coverPane.lower_bottom();
|
||||||
|
|
||||||
this.workspaces = null;
|
this.workspaces = null;
|
||||||
},
|
},
|
||||||
|
|
||||||
_onViewChanged: function() {
|
_getDesktopClone: function() {
|
||||||
if (!this.visible)
|
let windows = global.get_window_actors().filter(function(w) {
|
||||||
return;
|
return w.meta_window.get_window_type() == Meta.WindowType.DESKTOP;
|
||||||
|
});
|
||||||
|
if (windows.length == 0)
|
||||||
|
return null;
|
||||||
|
|
||||||
this.workspaces = this._workspacesManager.workspacesView;
|
let clone = new Clutter.Clone({ source: windows[0].get_texture() });
|
||||||
|
clone.source.connect('destroy', Lang.bind(this, function() {
|
||||||
// Show new workspacesView
|
clone.destroy();
|
||||||
this._group.add_actor(this.workspaces.actor);
|
}));
|
||||||
this._workspacesBar.raise(this.workspaces.actor);
|
return clone;
|
||||||
this._dash.actor.raise(this.workspaces.actor);
|
|
||||||
},
|
|
||||||
|
|
||||||
_recalculateGridSizes: function () {
|
|
||||||
let primary = global.get_primary_monitor();
|
|
||||||
wideScreen = (primary.width/primary.height > WIDE_SCREEN_CUT_OFF_RATIO) &&
|
|
||||||
(primary.height >= WIDE_SCREEN_MINIMUM_HEIGHT);
|
|
||||||
|
|
||||||
// We divide the screen into an imaginary grid which helps us determine the layout of
|
|
||||||
// different visual components.
|
|
||||||
if (wideScreen) {
|
|
||||||
displayGridColumnWidth = Math.floor(primary.width / COLUMNS_WIDE_SCREEN);
|
|
||||||
displayGridRowHeight = Math.floor(primary.height / ROWS_WIDE_SCREEN);
|
|
||||||
} else {
|
|
||||||
displayGridColumnWidth = Math.floor(primary.width / COLUMNS_REGULAR_SCREEN);
|
|
||||||
displayGridRowHeight = Math.floor(primary.height / ROWS_REGULAR_SCREEN);
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
|
|
||||||
relayout: function () {
|
relayout: function () {
|
||||||
let primary = global.get_primary_monitor();
|
let primary = global.get_primary_monitor();
|
||||||
let rtl = (St.Widget.get_default_direction () == St.TextDirection.RTL);
|
let rtl = (St.Widget.get_default_direction () == St.TextDirection.RTL);
|
||||||
|
|
||||||
this._recalculateGridSizes();
|
let contentY = Panel.PANEL_HEIGHT;
|
||||||
|
let contentHeight = primary.height - contentY - Main.messageTray.actor.height;
|
||||||
|
|
||||||
this._group.set_position(primary.x, primary.y);
|
this._group.set_position(primary.x, primary.y);
|
||||||
this._group.set_size(primary.width, primary.height);
|
this._group.set_size(primary.width, primary.height);
|
||||||
|
|
||||||
let contentY = Panel.PANEL_HEIGHT;
|
|
||||||
let contentHeight = primary.height - contentY;
|
|
||||||
|
|
||||||
this._coverPane.set_position(0, contentY);
|
this._coverPane.set_position(0, contentY);
|
||||||
this._coverPane.set_size(primary.width, contentHeight);
|
this._coverPane.set_size(primary.width, contentHeight);
|
||||||
|
|
||||||
let workspaceColumnsUsed = wideScreen ? COLUMNS_FOR_WORKSPACES_WIDE_SCREEN : COLUMNS_FOR_WORKSPACES_REGULAR_SCREEN;
|
let viewWidth = (1.0 - DASH_SPLIT_FRACTION) * primary.width - this._spacing;
|
||||||
let workspaceRowsUsed = wideScreen ? ROWS_FOR_WORKSPACES_WIDE_SCREEN : ROWS_FOR_WORKSPACES_REGULAR_SCREEN;
|
let viewHeight = contentHeight - 2 * this._spacing;
|
||||||
|
let viewY = contentY + this._spacing;
|
||||||
this._workspacesWidth = displayGridColumnWidth * workspaceColumnsUsed
|
let viewX = rtl ? 0
|
||||||
- WORKSPACE_GRID_PADDING * 2;
|
: Math.floor(DASH_SPLIT_FRACTION * primary.width) + this._spacing;
|
||||||
// We scale the vertical padding by (primary.height / primary.width)
|
|
||||||
// so that the workspace preserves its aspect ratio.
|
|
||||||
this._workspacesHeight = Math.floor(displayGridRowHeight * workspaceRowsUsed
|
|
||||||
- WORKSPACE_GRID_PADDING * (primary.height / primary.width) * 2);
|
|
||||||
|
|
||||||
|
// Set the dash's x position - y is handled by a constraint
|
||||||
|
let dashX;
|
||||||
if (rtl) {
|
if (rtl) {
|
||||||
this._workspacesX = WORKSPACE_GRID_PADDING;
|
this._dash.actor.set_anchor_point_from_gravity(Clutter.Gravity.NORTH_EAST);
|
||||||
|
dashX = primary.width;
|
||||||
} else {
|
} else {
|
||||||
this._workspacesX = displayGridColumnWidth + WORKSPACE_GRID_PADDING;
|
dashX = 0;
|
||||||
}
|
}
|
||||||
this._workspacesY = Math.floor(displayGridRowHeight + WORKSPACE_GRID_PADDING * (primary.height / primary.width));
|
this._dash.actor.set_x(dashX);
|
||||||
|
|
||||||
if (rtl) {
|
this.viewSelector.actor.set_position(viewX, viewY);
|
||||||
this._dash.actor.set_position(primary.width - displayGridColumnWidth, contentY);
|
this.viewSelector.actor.set_size(viewWidth, viewHeight);
|
||||||
} else {
|
|
||||||
this._dash.actor.set_position(0, contentY);
|
|
||||||
}
|
|
||||||
|
|
||||||
this._dash.actor.set_size(displayGridColumnWidth, contentHeight);
|
|
||||||
this._dash.searchArea.height = this._workspacesY - contentY;
|
|
||||||
this._dash.sectionArea.height = this._workspacesHeight;
|
|
||||||
this._dash.searchResults.actor.height = this._workspacesHeight;
|
|
||||||
|
|
||||||
this.infoBar.actor.set_position(displayGridColumnWidth, Panel.PANEL_HEIGHT);
|
|
||||||
this.infoBar.actor.set_size(primary.width - displayGridColumnWidth, this._workspacesY - Panel.PANEL_HEIGHT);
|
|
||||||
this.infoBar.actor.raise_top();
|
|
||||||
|
|
||||||
// place the 'Add Workspace' button in the bottom row of the grid
|
|
||||||
this._workspacesBarX = this._workspacesX;
|
|
||||||
this._workspacesBarWidth = this._workspacesWidth;
|
|
||||||
this._workspacesBarY = primary.height - displayGridRowHeight;
|
|
||||||
|
|
||||||
// The parent (this._group) is positioned at the top left of the primary monitor
|
|
||||||
// while this._backOver occupies the entire screen.
|
|
||||||
this._backOver.set_position(- primary.x, - primary.y);
|
|
||||||
this._backOver.set_size(global.screen_width, global.screen_height);
|
|
||||||
|
|
||||||
this._paneContainer.set_position(this._dash.actor.x + this._dash.actor.width + DEFAULT_PADDING,
|
|
||||||
this._workspacesY);
|
|
||||||
// Dynamic width
|
|
||||||
this._paneContainer.height = this._workspacesHeight;
|
|
||||||
if (rtl) {
|
|
||||||
this._paneContainer.connect('notify::width', Lang.bind(this, function (paneContainer) {
|
|
||||||
paneContainer.x = this._dash.actor.x - (DEFAULT_PADDING + paneContainer.width);
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
this._transparentBackground.set_position(primary.x, primary.y);
|
|
||||||
this._transparentBackground.set_size(primary.width, primary.height);
|
|
||||||
|
|
||||||
},
|
|
||||||
|
|
||||||
addPane: function (pane, align) {
|
|
||||||
pane.actor.height = .9 * this._workspacesHeight;
|
|
||||||
this._paneContainer.add(pane.actor, { expand: true,
|
|
||||||
y_fill: false,
|
|
||||||
y_align: align });
|
|
||||||
// When a pane is displayed, we raise the transparent background to the top
|
|
||||||
// and connect to button-release-event on it, then raise the pane above that.
|
|
||||||
// The idea here is that clicking anywhere outside the pane should close it.
|
|
||||||
// When the active pane is closed, undo the effect.
|
|
||||||
let backgroundEventId = null;
|
|
||||||
pane.connect('open-state-changed', Lang.bind(this, function (pane, isOpen) {
|
|
||||||
if (isOpen) {
|
|
||||||
this._activeDisplayPane = pane;
|
|
||||||
this._transparentBackground.raise_top();
|
|
||||||
this._paneContainer.raise_top();
|
|
||||||
this._paneContainer.show();
|
|
||||||
this._paneReady = false;
|
|
||||||
if (backgroundEventId != null)
|
|
||||||
this._transparentBackground.disconnect(backgroundEventId);
|
|
||||||
backgroundEventId = this._transparentBackground.connect('captured-event', Lang.bind(this, function (actor, event) {
|
|
||||||
if (event.get_source() != this._transparentBackground)
|
|
||||||
return false;
|
|
||||||
if (event.type() == Clutter.EventType.BUTTON_PRESS)
|
|
||||||
this._paneReady = true;
|
|
||||||
if (event.type() == Clutter.EventType.BUTTON_RELEASE
|
|
||||||
&& this._paneReady)
|
|
||||||
this._activeDisplayPane.close();
|
|
||||||
return true;
|
|
||||||
}));
|
|
||||||
if (!this._lightbox)
|
|
||||||
this._lightbox = new Lightbox.Lightbox(this._group,
|
|
||||||
{ fadeTime: PANE_FADE_TIME });
|
|
||||||
this._lightbox.show();
|
|
||||||
this._lightbox.highlight(this._paneContainer);
|
|
||||||
} else if (pane == this._activeDisplayPane) {
|
|
||||||
this._activeDisplayPane = null;
|
|
||||||
if (backgroundEventId != null) {
|
|
||||||
this._transparentBackground.disconnect(backgroundEventId);
|
|
||||||
backgroundEventId = null;
|
|
||||||
}
|
|
||||||
this._transparentBackground.lower_bottom();
|
|
||||||
this._paneContainer.hide();
|
|
||||||
this._lightbox.hide();
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
},
|
},
|
||||||
|
|
||||||
//// Public methods ////
|
//// Public methods ////
|
||||||
|
|
||||||
beginItemDrag: function(source) {
|
beginItemDrag: function(source) {
|
||||||
// Close any active panes if @source is a GenericDisplayItem.
|
|
||||||
// This allows the user to place the item on any workspace.
|
|
||||||
if (source instanceof GenericDisplay.GenericDisplayItem)
|
|
||||||
if (this._activeDisplayPane != null)
|
|
||||||
this._activeDisplayPane.close();
|
|
||||||
this.emit('item-drag-begin');
|
this.emit('item-drag-begin');
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -402,6 +250,14 @@ Overview.prototype = {
|
|||||||
this.emit('item-drag-end');
|
this.emit('item-drag-end');
|
||||||
},
|
},
|
||||||
|
|
||||||
|
beginWindowDrag: function(source) {
|
||||||
|
this.emit('window-drag-begin');
|
||||||
|
},
|
||||||
|
|
||||||
|
endWindowDrag: function(source) {
|
||||||
|
this.emit('window-drag-end');
|
||||||
|
},
|
||||||
|
|
||||||
// Returns the scale the Overview has when we just start zooming out
|
// Returns the scale the Overview has when we just start zooming out
|
||||||
// to overview mode. That is, when just the active workspace is showing.
|
// to overview mode. That is, when just the active workspace is showing.
|
||||||
getZoomedInScale : function() {
|
getZoomedInScale : function() {
|
||||||
@ -419,49 +275,23 @@ Overview.prototype = {
|
|||||||
|
|
||||||
// Returns the current scale of the Overview.
|
// Returns the current scale of the Overview.
|
||||||
getScale : function() {
|
getScale : function() {
|
||||||
return this._group.scaleX;
|
return this.workspaces.actor.scaleX;
|
||||||
},
|
},
|
||||||
|
|
||||||
// Returns the current position of the Overview.
|
// Returns the current position of the Overview.
|
||||||
getPosition : function() {
|
getPosition : function() {
|
||||||
return [this._group.x, this._group.y];
|
return [this.workspaces.actor.x, this.workspaces.actor.y];
|
||||||
},
|
},
|
||||||
|
|
||||||
show : function() {
|
show : function() {
|
||||||
if (this.visible)
|
if (this.visible)
|
||||||
return;
|
return;
|
||||||
if (!Main.pushModal(this._dash.actor))
|
if (!Main.pushModal(this.viewSelector.actor))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
this.visible = true;
|
this.visible = true;
|
||||||
this.animationInProgress = true;
|
this.animationInProgress = true;
|
||||||
|
|
||||||
this._dash.show();
|
|
||||||
|
|
||||||
/* TODO: make this stuff dynamic */
|
|
||||||
this._workspacesManager =
|
|
||||||
new WorkspacesView.WorkspacesManager(this._workspacesWidth,
|
|
||||||
this._workspacesHeight,
|
|
||||||
this._workspacesX,
|
|
||||||
this._workspacesY);
|
|
||||||
this._workspacesManager.connect('view-changed',
|
|
||||||
Lang.bind(this, this._onViewChanged));
|
|
||||||
this.workspaces = this._workspacesManager.workspacesView;
|
|
||||||
this._group.add_actor(this.workspaces.actor);
|
|
||||||
|
|
||||||
// The workspaces actor is as big as the screen, so we have to raise the dash above it
|
|
||||||
// for drag and drop to work. In the future we should fix the workspaces to not
|
|
||||||
// be as big as the screen.
|
|
||||||
this._dash.actor.raise(this.workspaces.actor);
|
|
||||||
|
|
||||||
this._workspacesBar = this._workspacesManager.controlsBar.actor;
|
|
||||||
this._workspacesBar.set_position(this._workspacesBarX,
|
|
||||||
this._workspacesBarY);
|
|
||||||
this._workspacesBar.width = this._workspacesBarWidth;
|
|
||||||
|
|
||||||
this._group.add_actor(this._workspacesBar);
|
|
||||||
this._workspacesBar.raise(this.workspaces.actor);
|
|
||||||
|
|
||||||
// All the the actors in the window group are completely obscured,
|
// All the the actors in the window group are completely obscured,
|
||||||
// hiding the group holding them while the Overview is displayed greatly
|
// hiding the group holding them while the Overview is displayed greatly
|
||||||
// increases performance of the Overview especially when there are many
|
// increases performance of the Overview especially when there are many
|
||||||
@ -471,17 +301,38 @@ Overview.prototype = {
|
|||||||
// clones of them, this would obviously no longer be necessary.
|
// clones of them, this would obviously no longer be necessary.
|
||||||
global.window_group.hide();
|
global.window_group.hide();
|
||||||
this._group.show();
|
this._group.show();
|
||||||
|
this._background.show();
|
||||||
|
|
||||||
// Create a zoom out effect. First scale the Overview group up and
|
this.viewSelector.show();
|
||||||
|
this._workspacesDisplay.show();
|
||||||
|
this._dash.show();
|
||||||
|
|
||||||
|
this.workspaces = this._workspacesDisplay.workspacesView;
|
||||||
|
global.overlay_group.add_actor(this.workspaces.actor);
|
||||||
|
|
||||||
|
if (!this._desktopFade.child)
|
||||||
|
this._desktopFade.child = this._getDesktopClone();
|
||||||
|
|
||||||
|
if (!this.workspaces.getActiveWorkspace().hasMaximizedWindows()) {
|
||||||
|
this._desktopFade.opacity = 255;
|
||||||
|
this._desktopFade.show();
|
||||||
|
Tweener.addTween(this._desktopFade,
|
||||||
|
{ opacity: 0,
|
||||||
|
time: ANIMATION_TIME,
|
||||||
|
transition: 'easeOutQuad'
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create a zoom out effect. First scale the workspaces view up and
|
||||||
// position it so that the active workspace fills up the whole screen,
|
// position it so that the active workspace fills up the whole screen,
|
||||||
// then transform the group to its normal dimensions and position.
|
// then transform it to its normal dimensions and position.
|
||||||
// The opposite transition is used in hide().
|
// The opposite transition is used in hide().
|
||||||
this._group.scaleX = this._group.scaleY = this.getZoomedInScale();
|
this.workspaces.actor.scaleX = this.workspaces.actor.scaleY = this.getZoomedInScale();
|
||||||
[this._group.x, this._group.y] = this.getZoomedInPosition();
|
[this.workspaces.actor.x, this.workspaces.actor.y] = this.getZoomedInPosition();
|
||||||
let primary = global.get_primary_monitor();
|
let primary = global.get_primary_monitor();
|
||||||
Tweener.addTween(this._group,
|
Tweener.addTween(this.workspaces.actor,
|
||||||
{ x: primary.x,
|
{ x: primary.x - this._group.x,
|
||||||
y: primary.y,
|
y: primary.y - this._group.y,
|
||||||
scaleX: 1,
|
scaleX: 1,
|
||||||
scaleY: 1,
|
scaleY: 1,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
@ -490,9 +341,9 @@ Overview.prototype = {
|
|||||||
onCompleteScope: this
|
onCompleteScope: this
|
||||||
});
|
});
|
||||||
|
|
||||||
// Make Dash fade in so that it doesn't appear too big.
|
// Make the other elements fade in.
|
||||||
this._dash.actor.opacity = 0;
|
this._group.opacity = 0;
|
||||||
Tweener.addTween(this._dash.actor,
|
Tweener.addTween(this._group,
|
||||||
{ opacity: 255,
|
{ opacity: 255,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
time: ANIMATION_TIME
|
time: ANIMATION_TIME
|
||||||
@ -508,16 +359,24 @@ Overview.prototype = {
|
|||||||
|
|
||||||
this.animationInProgress = true;
|
this.animationInProgress = true;
|
||||||
this._hideInProgress = true;
|
this._hideInProgress = true;
|
||||||
if (this._activeDisplayPane != null)
|
|
||||||
this._activeDisplayPane.close();
|
if (!this.workspaces.getActiveWorkspace().hasMaximizedWindows()) {
|
||||||
|
this._desktopFade.opacity = 0;
|
||||||
|
this._desktopFade.show();
|
||||||
|
Tweener.addTween(this._desktopFade,
|
||||||
|
{ opacity: 255,
|
||||||
|
time: ANIMATION_TIME,
|
||||||
|
transition: 'easeOutQuad' });
|
||||||
|
}
|
||||||
|
|
||||||
this.workspaces.hide();
|
this.workspaces.hide();
|
||||||
|
|
||||||
// Create a zoom in effect by transforming the Overview group so that
|
// Create a zoom in effect by transforming the workspaces view so that
|
||||||
// the active workspace fills up the whole screen. The opposite
|
// the active workspace fills up the whole screen. The opposite
|
||||||
// transition is used in show().
|
// transition is used in show().
|
||||||
let scale = this.getZoomedInScale();
|
let scale = this.getZoomedInScale();
|
||||||
let [posX, posY] = this.getZoomedInPosition();
|
let [posX, posY] = this.getZoomedInPosition();
|
||||||
Tweener.addTween(this._group,
|
Tweener.addTween(this.workspaces.actor,
|
||||||
{ x: posX,
|
{ x: posX,
|
||||||
y: posY,
|
y: posY,
|
||||||
scaleX: scale,
|
scaleX: scale,
|
||||||
@ -528,8 +387,8 @@ Overview.prototype = {
|
|||||||
onCompleteScope: this
|
onCompleteScope: this
|
||||||
});
|
});
|
||||||
|
|
||||||
// Make Dash fade out so that it doesn't appear to big.
|
// Make other elements fade out.
|
||||||
Tweener.addTween(this._dash.actor,
|
Tweener.addTween(this._group,
|
||||||
{ opacity: 0,
|
{ opacity: 0,
|
||||||
transition: 'easeOutQuad',
|
transition: 'easeOutQuad',
|
||||||
time: ANIMATION_TIME
|
time: ANIMATION_TIME
|
||||||
@ -565,6 +424,7 @@ Overview.prototype = {
|
|||||||
return;
|
return;
|
||||||
|
|
||||||
this.animationInProgress = false;
|
this.animationInProgress = false;
|
||||||
|
this._desktopFade.hide();
|
||||||
this._coverPane.lower_bottom();
|
this._coverPane.lower_bottom();
|
||||||
|
|
||||||
this.emit('shown');
|
this.emit('shown');
|
||||||
@ -576,12 +436,12 @@ Overview.prototype = {
|
|||||||
this.workspaces.destroy();
|
this.workspaces.destroy();
|
||||||
this.workspaces = null;
|
this.workspaces = null;
|
||||||
|
|
||||||
this._workspacesBar.destroy();
|
this._workspacesDisplay.hide();
|
||||||
this._workspacesBar = null;
|
this.viewSelector.hide();
|
||||||
|
|
||||||
this._workspacesManager = null;
|
|
||||||
|
|
||||||
this._dash.hide();
|
this._dash.hide();
|
||||||
|
|
||||||
|
this._desktopFade.hide();
|
||||||
|
this._background.hide();
|
||||||
this._group.hide();
|
this._group.hide();
|
||||||
|
|
||||||
this.visible = false;
|
this.visible = false;
|
||||||
@ -590,7 +450,7 @@ Overview.prototype = {
|
|||||||
|
|
||||||
this._coverPane.lower_bottom();
|
this._coverPane.lower_bottom();
|
||||||
|
|
||||||
Main.popModal(this._dash.actor);
|
Main.popModal(this.viewSelector.actor);
|
||||||
this.emit('hidden');
|
this.emit('hidden');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -109,7 +109,7 @@ PlaceDeviceInfo.prototype = {
|
|||||||
this._mount.unmount_finish(res);
|
this._mount.unmount_finish(res);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
let message = _("Failed to unmount '%s'").format(o.get_name());
|
let message = _("Failed to unmount '%s'").format(o.get_name());
|
||||||
Main.overview.infoBar.setMessage(message,
|
Main.overview.shellInfo.setMessage(message,
|
||||||
Lang.bind(this, this.remove),
|
Lang.bind(this, this.remove),
|
||||||
_("Retry"));
|
_("Retry"));
|
||||||
}
|
}
|
||||||
|
@ -296,15 +296,15 @@ PopupBaseMenuItem.prototype = {
|
|||||||
};
|
};
|
||||||
Signals.addSignalMethods(PopupBaseMenuItem.prototype);
|
Signals.addSignalMethods(PopupBaseMenuItem.prototype);
|
||||||
|
|
||||||
function PopupMenuItem(text) {
|
function PopupMenuItem() {
|
||||||
this._init(text);
|
this._init.apply(this, arguments);
|
||||||
}
|
}
|
||||||
|
|
||||||
PopupMenuItem.prototype = {
|
PopupMenuItem.prototype = {
|
||||||
__proto__: PopupBaseMenuItem.prototype,
|
__proto__: PopupBaseMenuItem.prototype,
|
||||||
|
|
||||||
_init: function (text) {
|
_init: function (text, params) {
|
||||||
PopupBaseMenuItem.prototype._init.call(this);
|
PopupBaseMenuItem.prototype._init.call(this, params);
|
||||||
|
|
||||||
this.label = new St.Label({ text: text });
|
this.label = new St.Label({ text: text });
|
||||||
this.addActor(this.label);
|
this.addActor(this.label);
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
|
|
||||||
const RESULT_ICON_SIZE = 24;
|
const RESULT_ICON_SIZE = 48;
|
||||||
|
|
||||||
// Not currently referenced by the search API, but
|
// Not currently referenced by the search API, but
|
||||||
// this enumeration can be useful for provider
|
// this enumeration can be useful for provider
|
||||||
@ -182,7 +182,7 @@ SearchProvider.prototype = {
|
|||||||
* implementation will show the icon next to the name.
|
* implementation will show the icon next to the name.
|
||||||
*
|
*
|
||||||
* The actor should be an instance of St.Widget, with the style class
|
* The actor should be an instance of St.Widget, with the style class
|
||||||
* 'dash-search-result-content'.
|
* 'search-result-content'.
|
||||||
*/
|
*/
|
||||||
createResultActor: function(resultMeta, terms) {
|
createResultActor: function(resultMeta, terms) {
|
||||||
return null;
|
return null;
|
||||||
|
332
js/ui/searchDisplay.js
Normal file
332
js/ui/searchDisplay.js
Normal file
@ -0,0 +1,332 @@
|
|||||||
|
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||||
|
|
||||||
|
const Clutter = imports.gi.Clutter;
|
||||||
|
const Lang = imports.lang;
|
||||||
|
const Gettext = imports.gettext.domain('gnome-shell');
|
||||||
|
const _ = Gettext.gettext;
|
||||||
|
const Gtk = imports.gi.Gtk;
|
||||||
|
const St = imports.gi.St;
|
||||||
|
|
||||||
|
const DND = imports.ui.dnd;
|
||||||
|
const IconGrid = imports.ui.iconGrid;
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
const Search = imports.ui.search;
|
||||||
|
|
||||||
|
const MAX_SEARCH_RESULTS_ROWS = 2;
|
||||||
|
|
||||||
|
|
||||||
|
function SearchResult(provider, metaInfo, terms) {
|
||||||
|
this._init(provider, metaInfo, terms);
|
||||||
|
}
|
||||||
|
|
||||||
|
SearchResult.prototype = {
|
||||||
|
_init: function(provider, metaInfo, terms) {
|
||||||
|
this.provider = provider;
|
||||||
|
this.metaInfo = metaInfo;
|
||||||
|
this.actor = new St.Clickable({ style_class: 'search-result',
|
||||||
|
reactive: true,
|
||||||
|
x_align: St.Align.START,
|
||||||
|
y_fill: true });
|
||||||
|
this.actor._delegate = this;
|
||||||
|
|
||||||
|
let content = provider.createResultActor(metaInfo, terms);
|
||||||
|
if (content == null) {
|
||||||
|
content = new St.Bin({ style_class: 'search-result-content',
|
||||||
|
reactive: true,
|
||||||
|
track_hover: true });
|
||||||
|
let icon = new IconGrid.BaseIcon(this.metaInfo['name'],
|
||||||
|
{ createIcon: Lang.bind(this, function(size) {
|
||||||
|
return this.metaInfo['icon'];
|
||||||
|
})});
|
||||||
|
content.set_child(icon.actor);
|
||||||
|
}
|
||||||
|
this._content = content;
|
||||||
|
this.actor.set_child(content);
|
||||||
|
|
||||||
|
this.actor.connect('clicked', Lang.bind(this, this._onResultClicked));
|
||||||
|
|
||||||
|
let draggable = DND.makeDraggable(this.actor);
|
||||||
|
draggable.connect('drag-begin',
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
Main.overview.beginItemDrag(this);
|
||||||
|
}));
|
||||||
|
draggable.connect('drag-end',
|
||||||
|
Lang.bind(this, function() {
|
||||||
|
Main.overview.endItemDrag(this);
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
setSelected: function(selected) {
|
||||||
|
if (selected)
|
||||||
|
this._content.add_style_pseudo_class('selected');
|
||||||
|
else
|
||||||
|
this._content.remove_style_pseudo_class('selected');
|
||||||
|
},
|
||||||
|
|
||||||
|
activate: function() {
|
||||||
|
this.provider.activateResult(this.metaInfo.id);
|
||||||
|
Main.overview.toggle();
|
||||||
|
},
|
||||||
|
|
||||||
|
_onResultClicked: function(actor, event) {
|
||||||
|
this.activate();
|
||||||
|
},
|
||||||
|
|
||||||
|
getDragActorSource: function() {
|
||||||
|
return this.metaInfo['icon'];
|
||||||
|
},
|
||||||
|
|
||||||
|
getDragActor: function(stageX, stageY) {
|
||||||
|
return new Clutter.Clone({ source: this.metaInfo['icon'] });
|
||||||
|
},
|
||||||
|
|
||||||
|
shellWorkspaceLaunch: function() {
|
||||||
|
if (this.provider.dragActivateResult)
|
||||||
|
this.provider.dragActivateResult(this.metaInfo.id);
|
||||||
|
else
|
||||||
|
this.provider.activateResult(this.metaInfo.id);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
function GridSearchResults(provider) {
|
||||||
|
this._init(provider);
|
||||||
|
}
|
||||||
|
|
||||||
|
GridSearchResults.prototype = {
|
||||||
|
__proto__: Search.SearchResultDisplay.prototype,
|
||||||
|
|
||||||
|
_init: function(provider) {
|
||||||
|
Search.SearchResultDisplay.prototype._init.call(this, provider);
|
||||||
|
this._grid = new IconGrid.IconGrid({ rowLimit: MAX_SEARCH_RESULTS_ROWS,
|
||||||
|
xAlign: St.Align.START });
|
||||||
|
this.actor = new St.Bin({ x_align: St.Align.START });
|
||||||
|
this.actor.set_child(this._grid.actor);
|
||||||
|
this.selectionIndex = -1;
|
||||||
|
},
|
||||||
|
|
||||||
|
getVisibleResultCount: function() {
|
||||||
|
return this._grid.visibleItemsCount();
|
||||||
|
},
|
||||||
|
|
||||||
|
renderResults: function(results, terms) {
|
||||||
|
for (let i = 0; i < results.length; i++) {
|
||||||
|
let result = results[i];
|
||||||
|
let meta = this.provider.getResultMeta(result);
|
||||||
|
let display = new SearchResult(this.provider, meta, terms);
|
||||||
|
this._grid.addItem(display.actor);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
clear: function () {
|
||||||
|
this._grid.removeAll();
|
||||||
|
this.selectionIndex = -1;
|
||||||
|
},
|
||||||
|
|
||||||
|
selectIndex: function (index) {
|
||||||
|
let nVisible = this.getVisibleResultCount();
|
||||||
|
if (this.selectionIndex >= 0) {
|
||||||
|
let prevActor = this._grid.getItemAtIndex(this.selectionIndex);
|
||||||
|
prevActor._delegate.setSelected(false);
|
||||||
|
}
|
||||||
|
this.selectionIndex = -1;
|
||||||
|
if (index >= nVisible)
|
||||||
|
return false;
|
||||||
|
else if (index < 0)
|
||||||
|
return false;
|
||||||
|
let targetActor = this._grid.getItemAtIndex(index);
|
||||||
|
targetActor._delegate.setSelected(true);
|
||||||
|
this.selectionIndex = index;
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
activateSelected: function() {
|
||||||
|
if (this.selectionIndex < 0)
|
||||||
|
return;
|
||||||
|
let targetActor = this._grid.getItemAtIndex(this.selectionIndex);
|
||||||
|
targetActor._delegate.activate();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
function SearchResults(searchSystem) {
|
||||||
|
this._init(searchSystem);
|
||||||
|
}
|
||||||
|
|
||||||
|
SearchResults.prototype = {
|
||||||
|
_init: function(searchSystem) {
|
||||||
|
this._searchSystem = searchSystem;
|
||||||
|
|
||||||
|
this.actor = new St.Bin({ name: 'searchResults',
|
||||||
|
y_align: St.Align.START,
|
||||||
|
x_align: St.Align.START,
|
||||||
|
x_fill: true });
|
||||||
|
this._content = new St.BoxLayout({ name: 'searchResultsContent',
|
||||||
|
vertical: true });
|
||||||
|
|
||||||
|
let scrollView = new St.ScrollView({ x_fill: true,
|
||||||
|
y_fill: false,
|
||||||
|
vshadows: true });
|
||||||
|
scrollView.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
|
||||||
|
scrollView.add_actor(this._content);
|
||||||
|
|
||||||
|
this.actor.set_child(scrollView);
|
||||||
|
|
||||||
|
this._statusText = new St.Label({ style_class: 'search-statustext' });
|
||||||
|
this._content.add(this._statusText);
|
||||||
|
this._selectedProvider = -1;
|
||||||
|
this._providers = this._searchSystem.getProviders();
|
||||||
|
this._providerMeta = [];
|
||||||
|
for (let i = 0; i < this._providers.length; i++)
|
||||||
|
this.createProviderMeta(this._providers[i]);
|
||||||
|
},
|
||||||
|
|
||||||
|
createProviderMeta: function(provider) {
|
||||||
|
let providerBox = new St.BoxLayout({ style_class: 'search-section',
|
||||||
|
vertical: true });
|
||||||
|
let titleButton = new St.Button({ style_class: 'search-section-header',
|
||||||
|
reactive: true,
|
||||||
|
x_fill: true,
|
||||||
|
y_fill: true });
|
||||||
|
titleButton.connect('clicked', Lang.bind(this, function () { this._onHeaderClicked(provider); }));
|
||||||
|
providerBox.add(titleButton);
|
||||||
|
let titleBox = new St.BoxLayout();
|
||||||
|
titleButton.set_child(titleBox);
|
||||||
|
let title = new St.Label({ text: provider.title });
|
||||||
|
let count = new St.Label();
|
||||||
|
titleBox.add(title, { expand: true });
|
||||||
|
titleBox.add(count);
|
||||||
|
|
||||||
|
let resultDisplayBin = new St.Bin({ style_class: 'search-section-results',
|
||||||
|
x_fill: true,
|
||||||
|
y_fill: true });
|
||||||
|
providerBox.add(resultDisplayBin, { expand: true });
|
||||||
|
let resultDisplay = provider.createResultContainerActor();
|
||||||
|
if (resultDisplay == null) {
|
||||||
|
resultDisplay = new GridSearchResults(provider);
|
||||||
|
}
|
||||||
|
resultDisplayBin.set_child(resultDisplay.actor);
|
||||||
|
|
||||||
|
this._providerMeta.push({ actor: providerBox,
|
||||||
|
resultDisplay: resultDisplay,
|
||||||
|
count: count });
|
||||||
|
this._content.add(providerBox);
|
||||||
|
},
|
||||||
|
|
||||||
|
_clearDisplay: function() {
|
||||||
|
this._selectedProvider = -1;
|
||||||
|
this._visibleResultsCount = 0;
|
||||||
|
for (let i = 0; i < this._providerMeta.length; i++) {
|
||||||
|
let meta = this._providerMeta[i];
|
||||||
|
meta.resultDisplay.clear();
|
||||||
|
meta.actor.hide();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
reset: function() {
|
||||||
|
this._searchSystem.reset();
|
||||||
|
this._statusText.hide();
|
||||||
|
this._clearDisplay();
|
||||||
|
},
|
||||||
|
|
||||||
|
startingSearch: function() {
|
||||||
|
this.reset();
|
||||||
|
this._statusText.set_text(_("Searching..."));
|
||||||
|
this._statusText.show();
|
||||||
|
},
|
||||||
|
|
||||||
|
_metaForProvider: function(provider) {
|
||||||
|
return this._providerMeta[this._providers.indexOf(provider)];
|
||||||
|
},
|
||||||
|
|
||||||
|
updateSearch: function (searchString) {
|
||||||
|
let results = this._searchSystem.updateSearch(searchString);
|
||||||
|
|
||||||
|
this._clearDisplay();
|
||||||
|
|
||||||
|
if (results.length == 0) {
|
||||||
|
this._statusText.set_text(_("No matching results."));
|
||||||
|
this._statusText.show();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
this._statusText.hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
let terms = this._searchSystem.getTerms();
|
||||||
|
|
||||||
|
for (let i = 0; i < results.length; i++) {
|
||||||
|
let [provider, providerResults] = results[i];
|
||||||
|
let meta = this._metaForProvider(provider);
|
||||||
|
meta.actor.show();
|
||||||
|
meta.resultDisplay.renderResults(providerResults, terms);
|
||||||
|
meta.count.set_text('' + providerResults.length);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.selectDown(false);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
_onHeaderClicked: function(provider) {
|
||||||
|
provider.expandSearch(this._searchSystem.getTerms());
|
||||||
|
},
|
||||||
|
|
||||||
|
_modifyActorSelection: function(resultDisplay, up) {
|
||||||
|
let success;
|
||||||
|
let index = resultDisplay.getSelectionIndex();
|
||||||
|
if (up && index == -1)
|
||||||
|
index = resultDisplay.getVisibleResultCount() - 1;
|
||||||
|
else if (up)
|
||||||
|
index = index - 1;
|
||||||
|
else
|
||||||
|
index = index + 1;
|
||||||
|
return resultDisplay.selectIndex(index);
|
||||||
|
},
|
||||||
|
|
||||||
|
selectUp: function(recursing) {
|
||||||
|
for (let i = this._selectedProvider; i >= 0; i--) {
|
||||||
|
let meta = this._providerMeta[i];
|
||||||
|
if (!meta.actor.visible)
|
||||||
|
continue;
|
||||||
|
let success = this._modifyActorSelection(meta.resultDisplay, true);
|
||||||
|
if (success) {
|
||||||
|
this._selectedProvider = i;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this._providerMeta.length > 0 && !recursing) {
|
||||||
|
this._selectedProvider = this._providerMeta.length - 1;
|
||||||
|
this.selectUp(true);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
selectDown: function(recursing) {
|
||||||
|
let current = this._selectedProvider;
|
||||||
|
if (current == -1)
|
||||||
|
current = 0;
|
||||||
|
for (let i = current; i < this._providerMeta.length; i++) {
|
||||||
|
let meta = this._providerMeta[i];
|
||||||
|
if (!meta.actor.visible)
|
||||||
|
continue;
|
||||||
|
let success = this._modifyActorSelection(meta.resultDisplay, false);
|
||||||
|
if (success) {
|
||||||
|
this._selectedProvider = i;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (this._providerMeta.length > 0 && !recursing) {
|
||||||
|
this._selectedProvider = 0;
|
||||||
|
this.selectDown(true);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
activateSelected: function() {
|
||||||
|
let current = this._selectedProvider;
|
||||||
|
if (current < 0)
|
||||||
|
return;
|
||||||
|
let meta = this._providerMeta[current];
|
||||||
|
let resultDisplay = meta.resultDisplay;
|
||||||
|
resultDisplay.activateSelected();
|
||||||
|
Main.overview.hide();
|
||||||
|
}
|
||||||
|
};
|
@ -26,7 +26,10 @@ const UPDeviceType = {
|
|||||||
MOUSE: 5,
|
MOUSE: 5,
|
||||||
KEYBOARD: 6,
|
KEYBOARD: 6,
|
||||||
PDA: 7,
|
PDA: 7,
|
||||||
PHONE: 8
|
PHONE: 8,
|
||||||
|
MEDIA_PLAYER: 9,
|
||||||
|
TABLET: 10,
|
||||||
|
COMPUTER: 11
|
||||||
};
|
};
|
||||||
|
|
||||||
const UPDeviceState = {
|
const UPDeviceState = {
|
||||||
@ -68,12 +71,19 @@ Indicator.prototype = {
|
|||||||
this._deviceItems = [ ];
|
this._deviceItems = [ ];
|
||||||
this._hasPrimary = false;
|
this._hasPrimary = false;
|
||||||
this._primaryDeviceId = null;
|
this._primaryDeviceId = null;
|
||||||
|
|
||||||
this._batteryItem = new PopupMenu.PopupMenuItem('');
|
this._batteryItem = new PopupMenu.PopupMenuItem('');
|
||||||
|
this._primaryPercentage = new St.Label();
|
||||||
|
let percentBin = new St.Bin();
|
||||||
|
percentBin.set_child(this._primaryPercentage, { x_align: St.Align.END });
|
||||||
|
this._batteryItem.addActor(percentBin);
|
||||||
this.menu.addMenuItem(this._batteryItem);
|
this.menu.addMenuItem(this._batteryItem);
|
||||||
|
|
||||||
this._deviceSep = new PopupMenu.PopupSeparatorMenuItem();
|
this._deviceSep = new PopupMenu.PopupSeparatorMenuItem();
|
||||||
this.menu.addMenuItem(this._deviceSep);
|
this.menu.addMenuItem(this._deviceSep);
|
||||||
this._otherDevicePosition = 2;
|
this._otherDevicePosition = 2;
|
||||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||||
|
|
||||||
this.menu.addAction(_("What's using power..."),function() {
|
this.menu.addAction(_("What's using power..."),function() {
|
||||||
GLib.spawn_command_line_async('gnome-power-statistics --device wakeups');
|
GLib.spawn_command_line_async('gnome-power-statistics --device wakeups');
|
||||||
});
|
});
|
||||||
@ -95,10 +105,12 @@ Indicator.prototype = {
|
|||||||
this._deviceSep.actor.hide();
|
this._deviceSep.actor.hide();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let [device_id, device_type, summary, percentage, state, time] = device;
|
let [device_id, device_type, icon, percentage, state, time] = device;
|
||||||
if (device_type == UPDeviceType.BATTERY) {
|
if (device_type == UPDeviceType.BATTERY) {
|
||||||
this._hasPrimary = true;
|
this._hasPrimary = true;
|
||||||
this._batteryItem.label.text = summary;
|
let minutes = Math.floor(time / 60);
|
||||||
|
this._batteryItem.label.text = Gettext.ngettext("%d minute remaining", "%d minutes remaining", minutes).format(minutes);
|
||||||
|
this._primaryPercentage.text = '%d%%'.format(Math.round(percentage));
|
||||||
this._batteryItem.actor.show();
|
this._batteryItem.actor.show();
|
||||||
if (this._deviceItems.length > 0)
|
if (this._deviceItems.length > 0)
|
||||||
this._deviceSep.actor.show();
|
this._deviceSep.actor.show();
|
||||||
@ -109,6 +121,18 @@ Indicator.prototype = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this._primaryDeviceId = device_id;
|
this._primaryDeviceId = device_id;
|
||||||
|
if (this._primaryDeviceId) {
|
||||||
|
this._batteryItem.actor.reactive = true;
|
||||||
|
this._batteryItem.actor.can_focus = true;
|
||||||
|
this._batteryItem.connect('activate', function(item) {
|
||||||
|
let p = new Shell.Process({ args: ['gnome-power-statistics', '--device', device_id] });
|
||||||
|
p.run();
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
// virtual device
|
||||||
|
this._batteryItem.actor.reactive = false;
|
||||||
|
this._batteryItem.actor.can_focus = false;
|
||||||
|
}
|
||||||
}));
|
}));
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -181,24 +205,12 @@ DeviceItem.prototype = {
|
|||||||
_init: function(device) {
|
_init: function(device) {
|
||||||
PopupMenu.PopupBaseMenuItem.prototype._init.call(this);
|
PopupMenu.PopupBaseMenuItem.prototype._init.call(this);
|
||||||
|
|
||||||
let [device_id, device_type, summary, percentage, state, time] = device;
|
let [device_id, device_type, icon, percentage, state, time] = device;
|
||||||
|
|
||||||
this._box = new St.BoxLayout({ style_class: 'popup-device-menu-item' });
|
this._box = new St.BoxLayout({ style_class: 'popup-device-menu-item' });
|
||||||
this._label = new St.Label({ text: summary });
|
this._label = new St.Label({ text: this._deviceTypeToString(device_type) });
|
||||||
|
|
||||||
let icon;
|
this._icon = new St.Icon({ gicon: Shell.util_icon_from_string(icon),
|
||||||
switch (state) {
|
|
||||||
case UPDeviceState.FULLY_CHARGED:
|
|
||||||
icon = 'battery-full-charged';
|
|
||||||
break;
|
|
||||||
case UPDeviceState.UNKNOWN:
|
|
||||||
icon = 'battery-missing';
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
icon = this._percentageToIcon(percentage) + (state == UPDeviceState.CHARGING ? '-charging' : '');
|
|
||||||
}
|
|
||||||
|
|
||||||
this._icon = new St.Icon({ icon_name: icon,
|
|
||||||
icon_type: St.IconType.SYMBOLIC,
|
icon_type: St.IconType.SYMBOLIC,
|
||||||
style_class: 'popup-menu-icon' });
|
style_class: 'popup-menu-icon' });
|
||||||
|
|
||||||
@ -212,15 +224,32 @@ DeviceItem.prototype = {
|
|||||||
this.addActor(percentBin);
|
this.addActor(percentBin);
|
||||||
},
|
},
|
||||||
|
|
||||||
_percentageToIcon: function(p) {
|
_deviceTypeToString: function(type) {
|
||||||
if (p > 60)
|
switch (type) {
|
||||||
return 'battery-full';
|
case UPDeviceType.AC_POWER:
|
||||||
if (p > 30)
|
return _("AC adapter");
|
||||||
return 'battery-good';
|
case UPDeviceType.BATTERY:
|
||||||
if (p > 10)
|
return _("Laptop battery");
|
||||||
return 'battery-low';
|
case UPDeviceType.UPS:
|
||||||
if (p > 0)
|
return _("UPS");
|
||||||
return 'battery-caution';
|
case UPDeviceType.MONITOR:
|
||||||
return 'battery-empty';
|
return _("Monitor");
|
||||||
|
case UPDeviceType.MOUSE:
|
||||||
|
return _("Mouse");
|
||||||
|
case UPDeviceType.KEYBOARD:
|
||||||
|
return _("Keyboard");
|
||||||
|
case UPDeviceType.PDA:
|
||||||
|
return _("PDA");
|
||||||
|
case UPDeviceType.PHONE:
|
||||||
|
return _("Cell phone");
|
||||||
|
case UPDeviceType.MEDIA_PLAYER:
|
||||||
|
return _("Media player");
|
||||||
|
case UPDeviceType.TABLET:
|
||||||
|
return _("Tablet");
|
||||||
|
case UPDeviceType.COMPUTER:
|
||||||
|
return _("Computer");
|
||||||
|
default:
|
||||||
|
return _("Unknown");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -38,12 +38,11 @@ Indicator.prototype = {
|
|||||||
this._output = null;
|
this._output = null;
|
||||||
this._outputVolumeId = 0;
|
this._outputVolumeId = 0;
|
||||||
this._outputMutedId = 0;
|
this._outputMutedId = 0;
|
||||||
this._outputSwitch = new PopupMenu.PopupSwitchMenuItem(_("Volume: Muted"), false);
|
this._outputTitle = new PopupMenu.PopupMenuItem(_("Volume"), { reactive: false });
|
||||||
this._outputSwitch.connect('toggled', Lang.bind(this, this._switchToggled, '_output'));
|
|
||||||
this._outputSlider = new PopupMenu.PopupSliderMenuItem(0);
|
this._outputSlider = new PopupMenu.PopupSliderMenuItem(0);
|
||||||
this._outputSlider.connect('value-changed', Lang.bind(this, this._sliderChanged, '_output'));
|
this._outputSlider.connect('value-changed', Lang.bind(this, this._sliderChanged, '_output'));
|
||||||
this._outputSlider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange));
|
this._outputSlider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange));
|
||||||
this.menu.addMenuItem(this._outputSwitch);
|
this.menu.addMenuItem(this._outputTitle);
|
||||||
this.menu.addMenuItem(this._outputSlider);
|
this.menu.addMenuItem(this._outputSlider);
|
||||||
|
|
||||||
this._separator = new PopupMenu.PopupSeparatorMenuItem();
|
this._separator = new PopupMenu.PopupSeparatorMenuItem();
|
||||||
@ -52,12 +51,11 @@ Indicator.prototype = {
|
|||||||
this._input = null;
|
this._input = null;
|
||||||
this._inputVolumeId = 0;
|
this._inputVolumeId = 0;
|
||||||
this._inputMutedId = 0;
|
this._inputMutedId = 0;
|
||||||
this._inputSwitch = new PopupMenu.PopupSwitchMenuItem(_("Microphone: Muted"), false);
|
this._inputTitle = new PopupMenu.PopupMenuItem(_("Microphone"), { reactive: false });
|
||||||
this._inputSwitch.connect('toggled', Lang.bind(this, this._switchToggled, '_input'));
|
|
||||||
this._inputSlider = new PopupMenu.PopupSliderMenuItem(0);
|
this._inputSlider = new PopupMenu.PopupSliderMenuItem(0);
|
||||||
this._inputSlider.connect('value-changed', Lang.bind(this, this._sliderChanged, '_input'));
|
this._inputSlider.connect('value-changed', Lang.bind(this, this._sliderChanged, '_input'));
|
||||||
this._inputSlider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange));
|
this._inputSlider.connect('drag-end', Lang.bind(this, this._notifyVolumeChange));
|
||||||
this.menu.addMenuItem(this._inputSwitch);
|
this.menu.addMenuItem(this._inputTitle);
|
||||||
this.menu.addMenuItem(this._inputSlider);
|
this.menu.addMenuItem(this._inputSlider);
|
||||||
|
|
||||||
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
|
||||||
@ -75,11 +73,18 @@ Indicator.prototype = {
|
|||||||
let currentVolume = this._output.volume;
|
let currentVolume = this._output.volume;
|
||||||
|
|
||||||
if (direction == Clutter.ScrollDirection.DOWN) {
|
if (direction == Clutter.ScrollDirection.DOWN) {
|
||||||
|
let prev_muted = this._output.is_muted;
|
||||||
this._output.volume = Math.max(0, currentVolume - VOLUME_MAX * VOLUME_ADJUSTMENT_STEP);
|
this._output.volume = Math.max(0, currentVolume - VOLUME_MAX * VOLUME_ADJUSTMENT_STEP);
|
||||||
|
if (this._output.volume < 1) {
|
||||||
|
this._output.volume = 0;
|
||||||
|
if (!prev_muted)
|
||||||
|
this._output.change_is_muted(true);
|
||||||
|
}
|
||||||
this._output.push_volume();
|
this._output.push_volume();
|
||||||
}
|
}
|
||||||
else if (direction == Clutter.ScrollDirection.UP) {
|
else if (direction == Clutter.ScrollDirection.UP) {
|
||||||
this._output.volume = Math.min(VOLUME_MAX, currentVolume + VOLUME_MAX * VOLUME_ADJUSTMENT_STEP);
|
this._output.volume = Math.min(VOLUME_MAX, currentVolume + VOLUME_MAX * VOLUME_ADJUSTMENT_STEP);
|
||||||
|
this._output.change_is_muted(false);
|
||||||
this._output.push_volume();
|
this._output.push_volume();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -103,8 +108,7 @@ Indicator.prototype = {
|
|||||||
this._mutedChanged (null, null, '_output');
|
this._mutedChanged (null, null, '_output');
|
||||||
this._volumeChanged (null, null, '_output');
|
this._volumeChanged (null, null, '_output');
|
||||||
} else {
|
} else {
|
||||||
this._outputSwitch.label.text = _("Volume: Muted");
|
this._outputSlider.setValue(0);
|
||||||
this._outputSwitch.setToggleState(false);
|
|
||||||
this.setIcon('audio-volume-muted-symbolic');
|
this.setIcon('audio-volume-muted-symbolic');
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -124,7 +128,7 @@ Indicator.prototype = {
|
|||||||
this._volumeChanged (null, null, '_input');
|
this._volumeChanged (null, null, '_input');
|
||||||
} else {
|
} else {
|
||||||
this._separator.actor.hide();
|
this._separator.actor.hide();
|
||||||
this._inputSwitch.actor.hide();
|
this._inputTitle.actor.hide();
|
||||||
this._inputSlider.actor.hide();
|
this._inputSlider.actor.hide();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -147,11 +151,11 @@ Indicator.prototype = {
|
|||||||
}
|
}
|
||||||
if (showInput) {
|
if (showInput) {
|
||||||
this._separator.actor.show();
|
this._separator.actor.show();
|
||||||
this._inputSwitch.actor.show();
|
this._inputTitle.actor.show();
|
||||||
this._inputSlider.actor.show();
|
this._inputSlider.actor.show();
|
||||||
} else {
|
} else {
|
||||||
this._separator.actor.hide();
|
this._separator.actor.hide();
|
||||||
this._inputSwitch.actor.hide();
|
this._inputTitle.actor.hide();
|
||||||
this._inputSlider.actor.hide();
|
this._inputSlider.actor.hide();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -174,7 +178,17 @@ Indicator.prototype = {
|
|||||||
log ('Volume slider changed for %s, but %s does not exist'.format(property, property));
|
log ('Volume slider changed for %s, but %s does not exist'.format(property, property));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this[property].volume = value * VOLUME_MAX;
|
let volume = value * VOLUME_MAX;
|
||||||
|
let prev_muted = this[property].is_muted;
|
||||||
|
if (volume < 1) {
|
||||||
|
this[property].volume = 0;
|
||||||
|
if (!prev_muted)
|
||||||
|
this[property].change_is_muted(true);
|
||||||
|
} else {
|
||||||
|
this[property].volume = volume;
|
||||||
|
if (prev_muted)
|
||||||
|
this[property].change_is_muted(false);
|
||||||
|
}
|
||||||
this[property].push_volume();
|
this[property].push_volume();
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -182,20 +196,10 @@ Indicator.prototype = {
|
|||||||
global.play_theme_sound('audio-volume-change');
|
global.play_theme_sound('audio-volume-change');
|
||||||
},
|
},
|
||||||
|
|
||||||
_switchToggled: function(switchItem, state, property) {
|
|
||||||
if (this[property] == null) {
|
|
||||||
log ('Volume mute switch toggled for %s, but %s does not exist'.format(property, property));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
this[property].change_is_muted(!state);
|
|
||||||
this._notifyVolumeChange();
|
|
||||||
},
|
|
||||||
|
|
||||||
_mutedChanged: function(object, param_spec, property) {
|
_mutedChanged: function(object, param_spec, property) {
|
||||||
let muted = this[property].is_muted;
|
let muted = this[property].is_muted;
|
||||||
let toggleSwitch = this[property+'Switch'];
|
let slider = this[property+'Slider'];
|
||||||
toggleSwitch.setToggleState(!muted);
|
slider.setValue(muted ? 0 : (this[property].volume / VOLUME_MAX));
|
||||||
this._updateLabel(property);
|
|
||||||
if (property == '_output') {
|
if (property == '_output') {
|
||||||
if (muted)
|
if (muted)
|
||||||
this.setIcon('audio-volume-muted');
|
this.setIcon('audio-volume-muted');
|
||||||
@ -206,17 +210,7 @@ Indicator.prototype = {
|
|||||||
|
|
||||||
_volumeChanged: function(object, param_spec, property) {
|
_volumeChanged: function(object, param_spec, property) {
|
||||||
this[property+'Slider'].setValue(this[property].volume / VOLUME_MAX);
|
this[property+'Slider'].setValue(this[property].volume / VOLUME_MAX);
|
||||||
this._updateLabel(property);
|
|
||||||
if (property == '_output' && !this._output.is_muted)
|
if (property == '_output' && !this._output.is_muted)
|
||||||
this.setIcon(this._volumeToIcon(this._output.volume));
|
this.setIcon(this._volumeToIcon(this._output.volume));
|
||||||
},
|
|
||||||
|
|
||||||
_updateLabel: function(property) {
|
|
||||||
let label;
|
|
||||||
if (this[property].is_muted)
|
|
||||||
label = (property == '_output' ? _("Volume: Muted") : _("Microphone: Muted"));
|
|
||||||
else
|
|
||||||
label = (property == '_output' ? _("Volume: %3.0f%%") : _("Microphone: %3.0f%%")).format(this[property].volume / VOLUME_MAX * 100);
|
|
||||||
this[property+'Switch'].label.text = label;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -111,11 +111,11 @@ StatusMenuButton.prototype = {
|
|||||||
item = new PopupMenu.PopupSeparatorMenuItem();
|
item = new PopupMenu.PopupSeparatorMenuItem();
|
||||||
this.menu.addMenuItem(item);
|
this.menu.addMenuItem(item);
|
||||||
|
|
||||||
item = new PopupMenu.PopupMenuItem(_("My Account..."));
|
item = new PopupMenu.PopupMenuItem(_("My Account"));
|
||||||
item.connect('activate', Lang.bind(this, this._onMyAccountActivate));
|
item.connect('activate', Lang.bind(this, this._onMyAccountActivate));
|
||||||
this.menu.addMenuItem(item);
|
this.menu.addMenuItem(item);
|
||||||
|
|
||||||
item = new PopupMenu.PopupMenuItem(_("System Settings..."));
|
item = new PopupMenu.PopupMenuItem(_("System Settings"));
|
||||||
item.connect('activate', Lang.bind(this, this._onPreferencesActivate));
|
item.connect('activate', Lang.bind(this, this._onPreferencesActivate));
|
||||||
this.menu.addMenuItem(item);
|
this.menu.addMenuItem(item);
|
||||||
|
|
||||||
@ -138,7 +138,7 @@ StatusMenuButton.prototype = {
|
|||||||
item = new PopupMenu.PopupSeparatorMenuItem();
|
item = new PopupMenu.PopupSeparatorMenuItem();
|
||||||
this.menu.addMenuItem(item);
|
this.menu.addMenuItem(item);
|
||||||
|
|
||||||
item = new PopupMenu.PopupMenuItem(_("Suspend"));
|
item = new PopupMenu.PopupMenuItem(_("Suspend..."));
|
||||||
item.connect('activate', Lang.bind(this, this._onShutDownActivate));
|
item.connect('activate', Lang.bind(this, this._onShutDownActivate));
|
||||||
this.menu.addMenuItem(item);
|
this.menu.addMenuItem(item);
|
||||||
|
|
||||||
@ -153,7 +153,7 @@ StatusMenuButton.prototype = {
|
|||||||
|
|
||||||
_onMyAccountActivate: function() {
|
_onMyAccountActivate: function() {
|
||||||
Main.overview.hide();
|
Main.overview.hide();
|
||||||
this._spawn(['gnome-about-me']);
|
this._spawn(['gnome-control-center', 'user-accounts']);
|
||||||
},
|
},
|
||||||
|
|
||||||
_onPreferencesActivate: function() {
|
_onPreferencesActivate: function() {
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
const DBus = imports.dbus;
|
const DBus = imports.dbus;
|
||||||
const GLib = imports.gi.GLib;
|
const GLib = imports.gi.GLib;
|
||||||
const Lang = imports.lang;
|
const Lang = imports.lang;
|
||||||
|
const Mainloop = imports.mainloop;
|
||||||
const Signals = imports.signals;
|
const Signals = imports.signals;
|
||||||
const St = imports.gi.St;
|
const St = imports.gi.St;
|
||||||
const Gettext = imports.gettext.domain('gnome-shell');
|
const Gettext = imports.gettext.domain('gnome-shell');
|
||||||
@ -16,6 +17,7 @@ let contactManager;
|
|||||||
let channelDispatcher;
|
let channelDispatcher;
|
||||||
|
|
||||||
// See Notification.appendMessage
|
// See Notification.appendMessage
|
||||||
|
const SCROLLBACK_IMMEDIATE_TIME = 60; // 1 minute
|
||||||
const SCROLLBACK_RECENT_TIME = 15 * 60; // 15 minutes
|
const SCROLLBACK_RECENT_TIME = 15 * 60; // 15 minutes
|
||||||
const SCROLLBACK_RECENT_LENGTH = 20;
|
const SCROLLBACK_RECENT_LENGTH = 20;
|
||||||
const SCROLLBACK_IDLE_LENGTH = 5;
|
const SCROLLBACK_IDLE_LENGTH = 5;
|
||||||
@ -531,7 +533,7 @@ Source.prototype = {
|
|||||||
_messageReceived: function(channel, id, timestamp, sender,
|
_messageReceived: function(channel, id, timestamp, sender,
|
||||||
type, flags, text) {
|
type, flags, text) {
|
||||||
this._ensureNotification();
|
this._ensureNotification();
|
||||||
this._notification.appendMessage(text);
|
this._notification.appendMessage(text, timestamp);
|
||||||
this.notify(this._notification);
|
this.notify(this._notification);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -565,7 +567,7 @@ Source.prototype = {
|
|||||||
msg += ' <i>(' + GLib.markup_escape_text(message, -1) + ')</i>';
|
msg += ' <i>(' + GLib.markup_escape_text(message, -1) + ')</i>';
|
||||||
|
|
||||||
this._ensureNotification();
|
this._ensureNotification();
|
||||||
this._notification.appendMessage(msg, true);
|
this._notification.appendPresence(msg, notify);
|
||||||
if (notify)
|
if (notify)
|
||||||
this.notify(this._notification);
|
this.notify(this._notification);
|
||||||
}
|
}
|
||||||
@ -586,23 +588,40 @@ Notification.prototype = {
|
|||||||
this.setActionArea(this._responseEntry);
|
this.setActionArea(this._responseEntry);
|
||||||
|
|
||||||
this._history = [];
|
this._history = [];
|
||||||
|
this._timestampTimeoutId = 0;
|
||||||
},
|
},
|
||||||
|
|
||||||
appendMessage: function(text, asTitle) {
|
appendMessage: function(text, timestamp) {
|
||||||
if (asTitle)
|
|
||||||
this.update(text, null, { customContent: true });
|
|
||||||
else
|
|
||||||
this.update(this.source.title, text, { customContent: true });
|
this.update(this.source.title, text, { customContent: true });
|
||||||
this._append(text, 'chat-received');
|
this._append(text, 'chat-received', timestamp);
|
||||||
},
|
},
|
||||||
|
|
||||||
_append: function(text, style) {
|
_append: function(text, style, timestamp) {
|
||||||
|
let currentTime = (Date.now() / 1000);
|
||||||
|
if (!timestamp)
|
||||||
|
timestamp = currentTime;
|
||||||
|
let lastMessageTime = -1;
|
||||||
|
if (this._history.length > 0)
|
||||||
|
lastMessageTime = this._history[0].time;
|
||||||
|
|
||||||
|
// Reset the old message timeout
|
||||||
|
if (this._timestampTimeoutId)
|
||||||
|
Mainloop.source_remove(this._timestampTimeoutId);
|
||||||
|
|
||||||
let body = this.addBody(text);
|
let body = this.addBody(text);
|
||||||
body.add_style_class_name(style);
|
body.add_style_class_name(style);
|
||||||
this.scrollTo(St.Side.BOTTOM);
|
this.scrollTo(St.Side.BOTTOM);
|
||||||
|
|
||||||
let now = new Date().getTime() / 1000;
|
this._history.unshift({ actor: body, time: timestamp, realMessage: true });
|
||||||
this._history.unshift({ actor: body, time: now });
|
|
||||||
|
if (timestamp < currentTime - SCROLLBACK_IMMEDIATE_TIME)
|
||||||
|
this._appendTimestamp();
|
||||||
|
else
|
||||||
|
// Schedule a new timestamp in SCROLLBACK_IMMEDIATE_TIME
|
||||||
|
// from the timestamp of the message.
|
||||||
|
this._timestampTimeoutId = Mainloop.timeout_add_seconds(
|
||||||
|
SCROLLBACK_IMMEDIATE_TIME - (currentTime - timestamp),
|
||||||
|
Lang.bind(this, this._appendTimestamp));
|
||||||
|
|
||||||
if (this._history.length > 1) {
|
if (this._history.length > 1) {
|
||||||
// Keep the scrollback from growing too long. If the most
|
// Keep the scrollback from growing too long. If the most
|
||||||
@ -611,17 +630,43 @@ Notification.prototype = {
|
|||||||
// SCROLLBACK_RECENT_LENGTH previous messages. Otherwise
|
// SCROLLBACK_RECENT_LENGTH previous messages. Otherwise
|
||||||
// we'll keep SCROLLBACK_IDLE_LENGTH messages.
|
// we'll keep SCROLLBACK_IDLE_LENGTH messages.
|
||||||
|
|
||||||
let lastMessageTime = this._history[1].time;
|
let maxLength = (lastMessageTime < currentTime - SCROLLBACK_RECENT_TIME) ?
|
||||||
let maxLength = (lastMessageTime < now - SCROLLBACK_RECENT_TIME) ?
|
|
||||||
SCROLLBACK_IDLE_LENGTH : SCROLLBACK_RECENT_LENGTH;
|
SCROLLBACK_IDLE_LENGTH : SCROLLBACK_RECENT_LENGTH;
|
||||||
if (this._history.length > maxLength) {
|
let filteredHistory = this._history.filter(function(item) { return item.realMessage });
|
||||||
let expired = this._history.splice(maxLength);
|
if (filteredHistory.length > maxLength) {
|
||||||
|
let lastMessageToKeep = filteredHistory[maxLength];
|
||||||
|
let expired = this._history.splice(this._history.indexOf(lastMessageToKeep));
|
||||||
for (let i = 0; i < expired.length; i++)
|
for (let i = 0; i < expired.length; i++)
|
||||||
expired[i].actor.destroy();
|
expired[i].actor.destroy();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
_appendTimestamp: function() {
|
||||||
|
let lastMessageTime = this._history[0].time;
|
||||||
|
let lastMessageDate = new Date(lastMessageTime * 1000);
|
||||||
|
|
||||||
|
/* 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. */
|
||||||
|
let timeLabel = this.addBody(lastMessageDate.toLocaleFormat(_("Sent at %X on %A")), false, { expand: true, x_fill: false, x_align: St.Align.END });
|
||||||
|
timeLabel.add_style_class_name('chat-meta-message');
|
||||||
|
this._history.unshift({ actor: timeLabel, time: lastMessageTime, realMessage: false });
|
||||||
|
|
||||||
|
this._timestampTimeoutId = 0;
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
appendPresence: function(text, asTitle) {
|
||||||
|
if (asTitle)
|
||||||
|
this.update(text, null, { customContent: true });
|
||||||
|
else
|
||||||
|
this.update(this.source.title, null, { customContent: true });
|
||||||
|
let label = this.addBody(text);
|
||||||
|
label.add_style_class_name('chat-meta-message');
|
||||||
|
this._history.unshift({ actor: label, time: (Date.now() / 1000), realMessage: false});
|
||||||
|
},
|
||||||
|
|
||||||
grabFocus: function(lockTray) {
|
grabFocus: function(lockTray) {
|
||||||
// Need to call the base class function first so that
|
// Need to call the base class function first so that
|
||||||
// it saves where the key focus was before.
|
// it saves where the key focus was before.
|
||||||
|
628
js/ui/viewSelector.js
Normal file
628
js/ui/viewSelector.js
Normal file
@ -0,0 +1,628 @@
|
|||||||
|
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
|
||||||
|
|
||||||
|
const Clutter = imports.gi.Clutter;
|
||||||
|
const Mainloop = imports.mainloop;
|
||||||
|
const Meta = imports.gi.Meta;
|
||||||
|
const Signals = imports.signals;
|
||||||
|
const Lang = imports.lang;
|
||||||
|
const Shell = imports.gi.Shell;
|
||||||
|
const St = imports.gi.St;
|
||||||
|
const Gettext = imports.gettext.domain('gnome-shell');
|
||||||
|
const _ = Gettext.gettext;
|
||||||
|
|
||||||
|
const Main = imports.ui.main;
|
||||||
|
const Search = imports.ui.search;
|
||||||
|
const SearchDisplay = imports.ui.searchDisplay;
|
||||||
|
const Tweener = imports.ui.tweener;
|
||||||
|
|
||||||
|
|
||||||
|
function SearchEntry() {
|
||||||
|
this._init();
|
||||||
|
}
|
||||||
|
|
||||||
|
SearchEntry.prototype = {
|
||||||
|
_init : function() {
|
||||||
|
this.actor = new St.Entry({ name: 'searchEntry',
|
||||||
|
hint_text: _("Search your computer") });
|
||||||
|
this.entry = this.actor.clutter_text;
|
||||||
|
|
||||||
|
this.actor.clutter_text.connect('text-changed', Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
if (this.isActive())
|
||||||
|
this.actor.set_secondary_icon_from_file(global.imagedir +
|
||||||
|
'close-black.svg');
|
||||||
|
else
|
||||||
|
this.actor.set_secondary_icon_from_file(null);
|
||||||
|
}));
|
||||||
|
this.actor.connect('secondary-icon-clicked', Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
this.reset();
|
||||||
|
}));
|
||||||
|
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||||
|
|
||||||
|
global.stage.connect('notify::key-focus', Lang.bind(this, this._updateCursorVisibility));
|
||||||
|
|
||||||
|
this.pane = null;
|
||||||
|
|
||||||
|
this._capturedEventId = 0;
|
||||||
|
},
|
||||||
|
|
||||||
|
_updateCursorVisibility: function() {
|
||||||
|
let focus = global.stage.get_key_focus();
|
||||||
|
if (focus == global.stage || focus == this.entry)
|
||||||
|
this.entry.set_cursor_visible(true);
|
||||||
|
else
|
||||||
|
this.entry.set_cursor_visible(false);
|
||||||
|
},
|
||||||
|
|
||||||
|
show: function() {
|
||||||
|
if (this._capturedEventId == 0)
|
||||||
|
this._capturedEventId = global.stage.connect('captured-event',
|
||||||
|
Lang.bind(this, this._onCapturedEvent));
|
||||||
|
this.entry.set_cursor_visible(true);
|
||||||
|
this.entry.set_selection(0, 0);
|
||||||
|
},
|
||||||
|
|
||||||
|
hide: function() {
|
||||||
|
if (this._capturedEventId > 0) {
|
||||||
|
global.stage.disconnect(this._capturedEventId);
|
||||||
|
this._capturedEventId = 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
reset: function () {
|
||||||
|
let [x, y, mask] = global.get_pointer();
|
||||||
|
let actor = global.stage.get_actor_at_pos (Clutter.PickMode.REACTIVE,
|
||||||
|
x, y);
|
||||||
|
// this.actor is never hovered directly, only its clutter_text and icon
|
||||||
|
let hovered = this.actor == actor.get_parent();
|
||||||
|
|
||||||
|
this.actor.set_hover(hovered);
|
||||||
|
|
||||||
|
this.entry.text = '';
|
||||||
|
|
||||||
|
// Return focus to the stage
|
||||||
|
global.stage.set_key_focus(null);
|
||||||
|
|
||||||
|
this.entry.set_cursor_visible(true);
|
||||||
|
this.entry.set_selection(0, 0);
|
||||||
|
},
|
||||||
|
|
||||||
|
getText: function () {
|
||||||
|
return this.entry.get_text().replace(/^\s+/g, '').replace(/\s+$/g, '');
|
||||||
|
},
|
||||||
|
|
||||||
|
// some search term has been entered
|
||||||
|
isActive: function() {
|
||||||
|
return this.actor.get_text() != '';
|
||||||
|
},
|
||||||
|
|
||||||
|
// the entry does not show the hint
|
||||||
|
_isActivated: function() {
|
||||||
|
return this.entry.text == this.actor.get_text();
|
||||||
|
},
|
||||||
|
|
||||||
|
_onCapturedEvent: function(actor, event) {
|
||||||
|
let source = event.get_source();
|
||||||
|
let panelEvent = source && Main.panel.actor.contains(source);
|
||||||
|
|
||||||
|
switch (event.type()) {
|
||||||
|
case Clutter.EventType.BUTTON_PRESS:
|
||||||
|
// the user clicked outside after activating the entry, but
|
||||||
|
// with no search term entered - cancel the search
|
||||||
|
if (source != this.entry && this.entry.text == '') {
|
||||||
|
this.reset();
|
||||||
|
// allow only panel events to continue
|
||||||
|
return !panelEvent;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
case Clutter.EventType.KEY_PRESS:
|
||||||
|
// If neither the stage nor our entry have key focus, some
|
||||||
|
// "special" actor grabbed the focus (run dialog, looking
|
||||||
|
// glass); we don't want to interfere with that
|
||||||
|
let focus = global.stage.get_key_focus();
|
||||||
|
if (focus != global.stage && focus != this.entry)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
let sym = event.get_key_symbol();
|
||||||
|
|
||||||
|
// If we have an active search, Escape cancels it - if we
|
||||||
|
// haven't, the key is ignored
|
||||||
|
if (sym == Clutter.Escape)
|
||||||
|
if (this._isActivated()) {
|
||||||
|
this.reset();
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Ignore non-printable keys
|
||||||
|
if (!Clutter.keysym_to_unicode(sym))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
// Search started - move the key focus to the entry and
|
||||||
|
// "repeat" the event
|
||||||
|
if (!this._isActivated()) {
|
||||||
|
global.stage.set_key_focus(this.entry);
|
||||||
|
this.entry.event(event, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
default:
|
||||||
|
// Suppress all other events outside the panel while the entry
|
||||||
|
// is activated and no search has been entered - any click
|
||||||
|
// outside the entry will cancel the search
|
||||||
|
return (this.entry.text == '' && !panelEvent);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_onDestroy: function() {
|
||||||
|
if (this._capturedEventId > 0) {
|
||||||
|
global.stage.disconnect(this._capturedEventId);
|
||||||
|
this._capturedEventId = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Signals.addSignalMethods(SearchEntry.prototype);
|
||||||
|
|
||||||
|
|
||||||
|
function BaseTab(titleActor, pageActor) {
|
||||||
|
this._init(titleActor, pageActor);
|
||||||
|
}
|
||||||
|
|
||||||
|
BaseTab.prototype = {
|
||||||
|
_init: function(titleActor, pageActor) {
|
||||||
|
this.title = titleActor;
|
||||||
|
this.page = new St.Bin({ child: pageActor,
|
||||||
|
x_align: St.Align.START,
|
||||||
|
y_align: St.Align.START,
|
||||||
|
x_fill: true,
|
||||||
|
y_fill: true,
|
||||||
|
style_class: 'view-tab-page' });
|
||||||
|
|
||||||
|
this.visible = false;
|
||||||
|
},
|
||||||
|
|
||||||
|
show: function() {
|
||||||
|
this.visible = true;
|
||||||
|
this.page.opacity = 0;
|
||||||
|
this.page.show();
|
||||||
|
|
||||||
|
Tweener.addTween(this.page,
|
||||||
|
{ opacity: 255,
|
||||||
|
time: 0.1,
|
||||||
|
transition: 'easeOutQuad' });
|
||||||
|
},
|
||||||
|
|
||||||
|
hide: function() {
|
||||||
|
this.visible = false;
|
||||||
|
Tweener.addTween(this.page,
|
||||||
|
{ opacity: 0,
|
||||||
|
time: 0.1,
|
||||||
|
transition: 'easeOutQuad',
|
||||||
|
onComplete: Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
this.page.hide();
|
||||||
|
})
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
_activate: function() {
|
||||||
|
this.emit('activated');
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Signals.addSignalMethods(BaseTab.prototype);
|
||||||
|
|
||||||
|
|
||||||
|
function ViewTab(label, pageActor) {
|
||||||
|
this._init(label, pageActor);
|
||||||
|
}
|
||||||
|
|
||||||
|
ViewTab.prototype = {
|
||||||
|
__proto__: BaseTab.prototype,
|
||||||
|
|
||||||
|
_init: function(label, pageActor) {
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
function SearchTab() {
|
||||||
|
this._init();
|
||||||
|
}
|
||||||
|
|
||||||
|
SearchTab.prototype = {
|
||||||
|
__proto__: BaseTab.prototype,
|
||||||
|
|
||||||
|
_init: function() {
|
||||||
|
this._searchActive = false;
|
||||||
|
this._searchPending = false;
|
||||||
|
this._keyPressId = 0;
|
||||||
|
this._searchTimeoutId = 0;
|
||||||
|
|
||||||
|
this._searchSystem = new Search.SearchSystem();
|
||||||
|
|
||||||
|
this._searchEntry = new SearchEntry();
|
||||||
|
this._searchResults = new SearchDisplay.SearchResults(this._searchSystem);
|
||||||
|
BaseTab.prototype._init.call(this,
|
||||||
|
this._searchEntry.actor,
|
||||||
|
this._searchResults.actor);
|
||||||
|
this._searchEntry.entry.connect('text-changed',
|
||||||
|
Lang.bind(this, this._onTextChanged));
|
||||||
|
this._searchEntry.entry.connect('activate', Lang.bind(this, function (se) {
|
||||||
|
if (this._searchTimeoutId > 0) {
|
||||||
|
Mainloop.source_remove(this._searchTimeoutId);
|
||||||
|
this._doSearch();
|
||||||
|
}
|
||||||
|
this._searchResults.activateSelected();
|
||||||
|
return true;
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
setFindAsYouType: function(enabled) {
|
||||||
|
if (enabled)
|
||||||
|
this._searchEntry.show();
|
||||||
|
else
|
||||||
|
this._searchEntry.hide();
|
||||||
|
},
|
||||||
|
|
||||||
|
show: function() {
|
||||||
|
BaseTab.prototype.show.call(this);
|
||||||
|
|
||||||
|
if (this._keyPressId == 0)
|
||||||
|
this._keyPressId = global.stage.connect('key-press-event',
|
||||||
|
Lang.bind(this, this._onKeyPress));
|
||||||
|
},
|
||||||
|
|
||||||
|
hide: function() {
|
||||||
|
BaseTab.prototype.hide.call(this);
|
||||||
|
|
||||||
|
if (this._keyPressId > 0) {
|
||||||
|
global.stage.disconnect(this._keyPressId);
|
||||||
|
this._keyPressId = 0;
|
||||||
|
}
|
||||||
|
this._searchEntry.reset();
|
||||||
|
},
|
||||||
|
|
||||||
|
addSearchProvider: function(provider) {
|
||||||
|
this._searchSystem.registerProvider(provider);
|
||||||
|
this._searchResults.createProviderMeta(provider);
|
||||||
|
},
|
||||||
|
|
||||||
|
_onTextChanged: function (se, prop) {
|
||||||
|
let searchPreviouslyActive = this._searchActive;
|
||||||
|
this._searchActive = this._searchEntry.isActive();
|
||||||
|
this._searchPending = this._searchActive && !searchPreviouslyActive;
|
||||||
|
if (this._searchPending) {
|
||||||
|
this._searchResults.startingSearch();
|
||||||
|
}
|
||||||
|
if (this._searchActive) {
|
||||||
|
this._activate();
|
||||||
|
} else {
|
||||||
|
this.emit('search-cancelled');
|
||||||
|
}
|
||||||
|
if (!this._searchActive) {
|
||||||
|
if (this._searchTimeoutId > 0) {
|
||||||
|
Mainloop.source_remove(this._searchTimeoutId);
|
||||||
|
this._searchTimeoutId = 0;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this._searchTimeoutId > 0)
|
||||||
|
return;
|
||||||
|
this._searchTimeoutId = Mainloop.timeout_add(150, Lang.bind(this, this._doSearch));
|
||||||
|
},
|
||||||
|
|
||||||
|
_onKeyPress: function(stage, event) {
|
||||||
|
// If neither the stage nor the search entry have key focus, some
|
||||||
|
// "special" actor grabbed the focus (run dialog, looking glass);
|
||||||
|
// we don't want to interfere with that
|
||||||
|
let focus = stage.get_key_focus();
|
||||||
|
if (focus != stage && focus != this._searchEntry.entry)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
let symbol = event.get_key_symbol();
|
||||||
|
if (symbol == Clutter.Up) {
|
||||||
|
if (!this._searchActive)
|
||||||
|
return true;
|
||||||
|
this._searchResults.selectUp(false);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
} else if (symbol == Clutter.Down) {
|
||||||
|
if (!this._searchActive)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
this._searchResults.selectDown(false);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
_doSearch: function () {
|
||||||
|
this._searchTimeoutId = 0;
|
||||||
|
let text = this._searchEntry.getText();
|
||||||
|
this._searchResults.updateSearch(text);
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
function ViewSelector() {
|
||||||
|
this._init();
|
||||||
|
}
|
||||||
|
|
||||||
|
ViewSelector.prototype = {
|
||||||
|
_init : function() {
|
||||||
|
this.actor = new St.BoxLayout({ name: 'viewSelector',
|
||||||
|
vertical: true });
|
||||||
|
|
||||||
|
// The tab bar is located at the top of the view selector and
|
||||||
|
// holds both "normal" tab labels and the search entry. The former
|
||||||
|
// is left aligned, the latter right aligned - unless the text
|
||||||
|
// direction is RTL, in which case the order is reversed.
|
||||||
|
this._tabBar = new Shell.GenericContainer();
|
||||||
|
this._tabBar.connect('get-preferred-width',
|
||||||
|
Lang.bind(this, this._getPreferredTabBarWidth));
|
||||||
|
this._tabBar.connect('get-preferred-height',
|
||||||
|
Lang.bind(this, this._getPreferredTabBarHeight));
|
||||||
|
this._tabBar.connect('allocate',
|
||||||
|
Lang.bind(this, this._allocateTabBar));
|
||||||
|
this.actor.add(this._tabBar);
|
||||||
|
|
||||||
|
// Box to hold "normal" tab labels
|
||||||
|
this._tabBox = new St.BoxLayout({ name: 'viewSelectorTabBar' });
|
||||||
|
this._tabBar.add_actor(this._tabBox);
|
||||||
|
|
||||||
|
// The searchArea just holds the entry
|
||||||
|
this._searchArea = new St.Bin({ name: 'searchArea' });
|
||||||
|
this._tabBar.add_actor(this._searchArea);
|
||||||
|
|
||||||
|
// The page area holds the tab pages. Every page is given the
|
||||||
|
// area's full allocation, so that the pages would appear on top
|
||||||
|
// of each other if the inactive ones weren't hidden.
|
||||||
|
this._pageArea = new Shell.Stack();
|
||||||
|
this.actor.add(this._pageArea, { x_fill: true,
|
||||||
|
y_fill: true,
|
||||||
|
expand: true });
|
||||||
|
|
||||||
|
this._tabs = [];
|
||||||
|
this._activeTab = null;
|
||||||
|
|
||||||
|
this._searchTab = new SearchTab();
|
||||||
|
this._searchArea.set_child(this._searchTab.title);
|
||||||
|
this._addTab(this._searchTab);
|
||||||
|
|
||||||
|
this._searchTab.connect('search-cancelled', Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
this._switchTab(this._activeTab);
|
||||||
|
}));
|
||||||
|
|
||||||
|
this._keyPressId = 0;
|
||||||
|
this._itemDragBeginId = 0;
|
||||||
|
this._overviewHidingId = 0;
|
||||||
|
|
||||||
|
// Public constraints which may be used to tie actors' height or
|
||||||
|
// vertical position to the current tab's content; as the content's
|
||||||
|
// height and position depend on the view selector's style properties
|
||||||
|
// (e.g. font size, padding, spacing, ...) it would be extremely hard
|
||||||
|
// and ugly to get these from the outside. While it would be possible
|
||||||
|
// to use position and height properties directly, outside code would
|
||||||
|
// need to ensure that the content is properly allocated before
|
||||||
|
// accessing the properties.
|
||||||
|
this.constrainY = new Clutter.BindConstraint({ source: this._pageArea,
|
||||||
|
coordinate: Clutter.BindCoordinate.Y });
|
||||||
|
this.constrainHeight = new Clutter.BindConstraint({ source: this._pageArea,
|
||||||
|
coordinate: Clutter.BindCoordinate.HEIGHT });
|
||||||
|
},
|
||||||
|
|
||||||
|
_addTab: function(tab) {
|
||||||
|
tab.page.hide();
|
||||||
|
this._pageArea.add_actor(tab.page);
|
||||||
|
tab.connect('activated', Lang.bind(this, function(tab) {
|
||||||
|
this._switchTab(tab);
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
addViewTab: function(title, pageActor) {
|
||||||
|
let viewTab = new ViewTab(title, pageActor);
|
||||||
|
this._tabs.push(viewTab);
|
||||||
|
this._tabBox.add(viewTab.title);
|
||||||
|
this._addTab(viewTab);
|
||||||
|
},
|
||||||
|
|
||||||
|
_switchTab: function(tab) {
|
||||||
|
if (this._activeTab && this._activeTab.visible) {
|
||||||
|
if (this._activeTab == tab)
|
||||||
|
return;
|
||||||
|
this._activeTab.title.remove_style_pseudo_class('selected');
|
||||||
|
this._activeTab.hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tab != this._searchTab) {
|
||||||
|
tab.title.add_style_pseudo_class('selected');
|
||||||
|
this._activeTab = tab;
|
||||||
|
if (this._searchTab.visible) {
|
||||||
|
this._searchTab.hide();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!tab.visible)
|
||||||
|
tab.show();
|
||||||
|
|
||||||
|
// Pull a Meg Ryan:
|
||||||
|
if (Main.overview && Main.overview.workspaces) {
|
||||||
|
if (tab != this._tabs[0]) {
|
||||||
|
Tweener.addTween(Main.overview.workspaces.actor,
|
||||||
|
{ opacity: 0,
|
||||||
|
time: 0.1,
|
||||||
|
transition: 'easeOutQuad',
|
||||||
|
onComplete: Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
Main.overview.workspaces.actor.hide();
|
||||||
|
Main.overview.workspaces.actor.opacity = 255;
|
||||||
|
})
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
Main.overview.workspaces.actor.opacity = 0;
|
||||||
|
Main.overview.workspaces.actor.show();
|
||||||
|
Tweener.addTween(Main.overview.workspaces.actor,
|
||||||
|
{ opacity: 255,
|
||||||
|
time: 0.1,
|
||||||
|
transition: 'easeOutQuad' });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_switchDefaultTab: function() {
|
||||||
|
if (this._tabs.length > 0)
|
||||||
|
this._switchTab(this._tabs[0]);
|
||||||
|
},
|
||||||
|
|
||||||
|
_nextTab: function() {
|
||||||
|
if (this._tabs.length == 0 ||
|
||||||
|
this._tabs[this._tabs.length - 1] == this._activeTab)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (let i = 0; i < this._tabs.length; i++)
|
||||||
|
if (this._tabs[i] == this._activeTab) {
|
||||||
|
this._switchTab(this._tabs[i + 1]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_prevTab: function() {
|
||||||
|
if (this._tabs.length == 0 || this._tabs[0] == this._activeTab)
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (let i = 0; i < this._tabs.length; i++)
|
||||||
|
if (this._tabs[i] == this._activeTab) {
|
||||||
|
this._switchTab(this._tabs[i - 1]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_getPreferredTabBarWidth: function(box, forHeight, alloc) {
|
||||||
|
let children = box.get_children();
|
||||||
|
for (let i = 0; i < children.length; i++) {
|
||||||
|
let [childMin, childNat] = children[i].get_preferred_width(forHeight);
|
||||||
|
alloc.min_size += childMin;
|
||||||
|
alloc.natural_size += childNat;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_getPreferredTabBarHeight: function(box, forWidth, alloc) {
|
||||||
|
let children = box.get_children();
|
||||||
|
for (let i = 0; i < children.length; i++) {
|
||||||
|
let [childMin, childNatural] = children[i].get_preferred_height(forWidth);
|
||||||
|
if (childMin > alloc.min_size)
|
||||||
|
alloc.min_size = childMin;
|
||||||
|
if (childNatural > alloc.natural_size)
|
||||||
|
alloc.natural_size = childNatural;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_allocateTabBar: function(container, box, flags) {
|
||||||
|
let allocWidth = box.x2 - box.x1;
|
||||||
|
let allocHeight = box.y2 - box.y1;
|
||||||
|
|
||||||
|
let [searchMinWidth, searchNatWidth] = this._searchArea.get_preferred_width(-1);
|
||||||
|
let [barMinWidth, barNatWidth] = this._tabBox.get_preferred_width(-1);
|
||||||
|
let childBox = new Clutter.ActorBox();
|
||||||
|
childBox.y1 = 0;
|
||||||
|
childBox.y2 = allocHeight;
|
||||||
|
if (this.actor.get_direction() == St.TextDirection.RTL) {
|
||||||
|
childBox.x1 = allocWidth - barNatWidth;
|
||||||
|
childBox.x2 = allocWidth;
|
||||||
|
} else {
|
||||||
|
childBox.x1 = 0;
|
||||||
|
childBox.x2 = barNatWidth;
|
||||||
|
}
|
||||||
|
this._tabBox.allocate(childBox, flags);
|
||||||
|
|
||||||
|
if (this.actor.get_direction() == St.TextDirection.RTL) {
|
||||||
|
childBox.x1 = 0;
|
||||||
|
childBox.x2 = searchNatWidth;
|
||||||
|
} else {
|
||||||
|
childBox.x1 = allocWidth - searchNatWidth;
|
||||||
|
childBox.x2 = allocWidth;
|
||||||
|
}
|
||||||
|
this._searchArea.allocate(childBox, flags);
|
||||||
|
|
||||||
|
Meta.later_add(Meta.LaterType.BEFORE_REDRAW, Lang.bind(this,
|
||||||
|
function() {
|
||||||
|
this.constrainY.offset = this.actor.y;
|
||||||
|
}));
|
||||||
|
},
|
||||||
|
|
||||||
|
_onKeyPress: function(stage, event) {
|
||||||
|
// Only process events if the stage has key focus - search is handled
|
||||||
|
// by the search tab, and we do not want to interfere with "special"
|
||||||
|
// actors grabbing focus (run dialog, looking glass, notifications).
|
||||||
|
let focus = stage.get_key_focus();
|
||||||
|
if (focus != stage)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
let modifiers = Shell.get_event_state(event);
|
||||||
|
let symbol = event.get_key_symbol();
|
||||||
|
if (symbol == Clutter.Escape) {
|
||||||
|
Main.overview.hide();
|
||||||
|
return true;
|
||||||
|
} else if (modifiers & Clutter.ModifierType.CONTROL_MASK) {
|
||||||
|
if (symbol == Clutter.Page_Up) {
|
||||||
|
if (!this._searchActive)
|
||||||
|
this._prevTab();
|
||||||
|
return true;
|
||||||
|
} else if (symbol == Clutter.Page_Down) {
|
||||||
|
if (!this._searchActive)
|
||||||
|
this._nextTab();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
addSearchProvider: function(provider) {
|
||||||
|
this._searchTab.addSearchProvider(provider);
|
||||||
|
},
|
||||||
|
|
||||||
|
show: function() {
|
||||||
|
this._searchTab.setFindAsYouType(true);
|
||||||
|
|
||||||
|
if (this._itemDragBeginId == 0)
|
||||||
|
this._itemDragBeginId = Main.overview.connect('item-drag-begin',
|
||||||
|
Lang.bind(this, this._switchDefaultTab));
|
||||||
|
if (this._overviewHidingId == 0)
|
||||||
|
this._overviewHidingId = Main.overview.connect('hiding',
|
||||||
|
Lang.bind(this, this._switchDefaultTab));
|
||||||
|
if (this._keyPressId == 0)
|
||||||
|
this._keyPressId = global.stage.connect('key-press-event',
|
||||||
|
Lang.bind(this, this._onKeyPress));
|
||||||
|
|
||||||
|
this._switchDefaultTab();
|
||||||
|
},
|
||||||
|
|
||||||
|
hide: function() {
|
||||||
|
this._searchTab.setFindAsYouType(false);
|
||||||
|
|
||||||
|
if (this._keyPressId > 0) {
|
||||||
|
global.stage.disconnect(this._keyPressId);
|
||||||
|
this._keyPressId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._itemDragBeginId > 0) {
|
||||||
|
Main.overview.disconnect(this._itemDragBeginId);
|
||||||
|
this._itemDragBeginId = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._overviewHidingId > 0) {
|
||||||
|
Main.overview.disconnect(this._overviewHidingId);
|
||||||
|
this._overviewHidingId = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
Signals.addSignalMethods(ViewSelector.prototype);
|
@ -20,9 +20,6 @@ const FOCUS_ANIMATION_TIME = 0.15;
|
|||||||
|
|
||||||
const WINDOW_DND_SIZE = 256;
|
const WINDOW_DND_SIZE = 256;
|
||||||
|
|
||||||
const FRAME_COLOR = new Clutter.Color();
|
|
||||||
FRAME_COLOR.from_pixel(0xffffffff);
|
|
||||||
|
|
||||||
const SCROLL_SCALE_AMOUNT = 100 / 5;
|
const SCROLL_SCALE_AMOUNT = 100 / 5;
|
||||||
|
|
||||||
const LIGHTBOX_FADE_TIME = 0.1;
|
const LIGHTBOX_FADE_TIME = 0.1;
|
||||||
@ -54,11 +51,6 @@ function _clamp(value, min, max) {
|
|||||||
return Math.max(min, Math.min(max, value));
|
return Math.max(min, Math.min(max, value));
|
||||||
}
|
}
|
||||||
|
|
||||||
// Spacing between workspaces. At the moment, the same spacing is used
|
|
||||||
// in both zoomed-in and zoomed-out views; this is slightly
|
|
||||||
// metaphor-breaking, but the alternatives are also weird.
|
|
||||||
const GRID_SPACING = 15;
|
|
||||||
const FRAME_SIZE = GRID_SPACING / 3;
|
|
||||||
|
|
||||||
function ScaledPoint(x, y, scaleX, scaleY) {
|
function ScaledPoint(x, y, scaleX, scaleY) {
|
||||||
[this.x, this.y, this.scaleX, this.scaleY] = arguments;
|
[this.x, this.y, this.scaleX, this.scaleY] = arguments;
|
||||||
@ -140,6 +132,9 @@ WindowClone.prototype = {
|
|||||||
if (this.inDrag || this._zooming)
|
if (this.inDrag || this._zooming)
|
||||||
// We'll fix up the stack after the drag/zooming
|
// We'll fix up the stack after the drag/zooming
|
||||||
return;
|
return;
|
||||||
|
if (this._stackAbove == null)
|
||||||
|
this.actor.lower_bottom();
|
||||||
|
else
|
||||||
this.actor.raise(this._stackAbove);
|
this.actor.raise(this._stackAbove);
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -247,11 +242,13 @@ WindowClone.prototype = {
|
|||||||
this.emit('zoom-end');
|
this.emit('zoom-end');
|
||||||
|
|
||||||
this.actor.reparent(this._origParent);
|
this.actor.reparent(this._origParent);
|
||||||
|
if (this._stackAbove == null)
|
||||||
|
this.actor.lower_bottom();
|
||||||
// If the workspace has been destroyed while we were reparented to
|
// If the workspace has been destroyed while we were reparented to
|
||||||
// the stage, _stackAbove will be unparented and we can't raise our
|
// the stage, _stackAbove will be unparented and we can't raise our
|
||||||
// actor above it - as we are bound to be destroyed anyway in that
|
// actor above it - as we are bound to be destroyed anyway in that
|
||||||
// case, we can skip that step
|
// case, we can skip that step
|
||||||
if (this._stackAbove && this._stackAbove.get_parent())
|
else if (this._stackAbove.get_parent())
|
||||||
this.actor.raise(this._stackAbove);
|
this.actor.raise(this._stackAbove);
|
||||||
|
|
||||||
[this.actor.x, this.actor.y] = this._zoomLocalOrig.getPosition();
|
[this.actor.x, this.actor.y] = this._zoomLocalOrig.getPosition();
|
||||||
@ -283,82 +280,20 @@ WindowClone.prototype = {
|
|||||||
// We may not have a parent if DnD completed successfully, in
|
// We may not have a parent if DnD completed successfully, in
|
||||||
// which case our clone will shortly be destroyed and replaced
|
// which case our clone will shortly be destroyed and replaced
|
||||||
// with a new one on the target workspace.
|
// with a new one on the target workspace.
|
||||||
if (this.actor.get_parent() != null)
|
if (this.actor.get_parent() != null) {
|
||||||
|
if (this._stackAbove == null)
|
||||||
|
this.actor.lower_bottom();
|
||||||
|
else
|
||||||
this.actor.raise(this._stackAbove);
|
this.actor.raise(this._stackAbove);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
this.emit('drag-end');
|
this.emit('drag-end');
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Signals.addSignalMethods(WindowClone.prototype);
|
Signals.addSignalMethods(WindowClone.prototype);
|
||||||
|
|
||||||
|
|
||||||
function DesktopClone(window) {
|
|
||||||
this._init(window);
|
|
||||||
}
|
|
||||||
|
|
||||||
DesktopClone.prototype = {
|
|
||||||
_init : function(window) {
|
|
||||||
this.actor = new Clutter.Group({ reactive: true });
|
|
||||||
|
|
||||||
let background = new Clutter.Clone({ source: global.background_actor });
|
|
||||||
this.actor.add_actor(background);
|
|
||||||
|
|
||||||
if (window) {
|
|
||||||
this._desktop = new Clutter.Clone({ source: window.get_texture() });
|
|
||||||
this.actor.add_actor(this._desktop);
|
|
||||||
this._desktop.hide();
|
|
||||||
} else {
|
|
||||||
this._desktop = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.actor.connect('button-release-event',
|
|
||||||
Lang.bind(this, this._onButtonRelease));
|
|
||||||
},
|
|
||||||
|
|
||||||
zoomFromOverview: function(fadeInIcons) {
|
|
||||||
if (this._desktop == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (fadeInIcons) {
|
|
||||||
this._desktop.opacity = 0;
|
|
||||||
this._desktop.show();
|
|
||||||
Tweener.addTween(this._desktop,
|
|
||||||
{ opacity: 255,
|
|
||||||
time: Overview.ANIMATION_TIME,
|
|
||||||
transition: 'easeOutQuad' });
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
zoomToOverview: function(fadeOutIcons) {
|
|
||||||
if (this._desktop == null)
|
|
||||||
return;
|
|
||||||
|
|
||||||
if (fadeOutIcons) {
|
|
||||||
this._desktop.opacity = 255;
|
|
||||||
this._desktop.show();
|
|
||||||
Tweener.addTween(this._desktop,
|
|
||||||
{ opacity: 0,
|
|
||||||
time: Overview.ANIMATION_TIME,
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onComplete: Lang.bind(this,
|
|
||||||
function() {
|
|
||||||
this._desktop.hide();
|
|
||||||
})
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
this._desktop.hide();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
_onButtonRelease : function (actor, event) {
|
|
||||||
this.emit('selected', event.get_time());
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
Signals.addSignalMethods(DesktopClone.prototype);
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @windowClone: Corresponding window clone
|
* @windowClone: Corresponding window clone
|
||||||
* @parentActor: The actor which will be the parent of all overlay items
|
* @parentActor: The actor which will be the parent of all overlay items
|
||||||
@ -534,12 +469,10 @@ WindowOverlay.prototype = {
|
|||||||
|
|
||||||
_idleToggleCloseButton: function() {
|
_idleToggleCloseButton: function() {
|
||||||
this._idleToggleCloseId = 0;
|
this._idleToggleCloseId = 0;
|
||||||
let [x, y, mask] = global.get_pointer();
|
if (!this._windowClone.actor.has_pointer &&
|
||||||
let actor = global.stage.get_actor_at_pos(Clutter.PickMode.REACTIVE,
|
!this.closeButton.has_pointer)
|
||||||
x, y);
|
|
||||||
if (actor != this._windowClone.actor && actor != this.closeButton) {
|
|
||||||
this.closeButton.hide();
|
this.closeButton.hide();
|
||||||
}
|
|
||||||
return false;
|
return false;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -561,7 +494,6 @@ WindowOverlay.prototype = {
|
|||||||
this._parentActor.queue_relayout();
|
this._parentActor.queue_relayout();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Signals.addSignalMethods(WindowOverlay.prototype);
|
Signals.addSignalMethods(WindowOverlay.prototype);
|
||||||
|
|
||||||
const WindowPositionFlags = {
|
const WindowPositionFlags = {
|
||||||
@ -585,10 +517,20 @@ Workspace.prototype = {
|
|||||||
// Without this the drop area will be overlapped.
|
// Without this the drop area will be overlapped.
|
||||||
this._windowOverlaysGroup.set_size(0, 0);
|
this._windowOverlaysGroup.set_size(0, 0);
|
||||||
|
|
||||||
this.actor = new Clutter.Group();
|
this.actor = new Clutter.Group({ reactive: true });
|
||||||
this.actor._delegate = this;
|
this.actor._delegate = this;
|
||||||
|
|
||||||
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
|
||||||
|
this.actor.connect('button-release-event', Lang.bind(this,
|
||||||
|
function(actor, event) {
|
||||||
|
// Only switch to the workspace when there's no application
|
||||||
|
// windows open. The problem is that it's too easy to miss
|
||||||
|
// an app window and get the wrong one focused.
|
||||||
|
if (this._windows.length == 0) {
|
||||||
|
this.metaWorkspace.activate(event.get_time());
|
||||||
|
Main.overview.hide();
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
// Items in _windowOverlaysGroup should not be scaled, so we don't
|
// Items in _windowOverlaysGroup should not be scaled, so we don't
|
||||||
// add them to this.actor, but to its parent whenever it changes
|
// add them to this.actor, but to its parent whenever it changes
|
||||||
@ -604,35 +546,10 @@ Workspace.prototype = {
|
|||||||
|
|
||||||
let windows = global.get_window_actors().filter(this._isMyWindow, this);
|
let windows = global.get_window_actors().filter(this._isMyWindow, this);
|
||||||
|
|
||||||
// Find the desktop window
|
|
||||||
for (let i = 0; i < windows.length; i++) {
|
|
||||||
if (windows[i].meta_window.get_window_type() == Meta.WindowType.DESKTOP) {
|
|
||||||
this._desktop = new DesktopClone(windows[i]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// If there wasn't one, fake it
|
|
||||||
if (!this._desktop)
|
|
||||||
this._desktop = new DesktopClone();
|
|
||||||
|
|
||||||
this._desktop.connect('selected',
|
|
||||||
Lang.bind(this,
|
|
||||||
function(clone, time) {
|
|
||||||
// Only switch to the workspace when there's no application windows
|
|
||||||
// open (we always have one window for the desktop). The problem
|
|
||||||
// is that it's too easy to miss an app window and get the wrong
|
|
||||||
// one focused.
|
|
||||||
if (this._windows.length == 1) {
|
|
||||||
this.metaWorkspace.activate(time);
|
|
||||||
Main.overview.hide();
|
|
||||||
}
|
|
||||||
}));
|
|
||||||
this.actor.add_actor(this._desktop.actor);
|
|
||||||
|
|
||||||
// Create clones for remaining windows that should be
|
// Create clones for remaining windows that should be
|
||||||
// visible in the Overview
|
// visible in the Overview
|
||||||
this._windows = [this._desktop];
|
this._windows = [];
|
||||||
this._windowOverlays = [ null ];
|
this._windowOverlays = [];
|
||||||
for (let i = 0; i < windows.length; i++) {
|
for (let i = 0; i < windows.length; i++) {
|
||||||
if (this._isOverviewWindow(windows[i])) {
|
if (this._isOverviewWindow(windows[i])) {
|
||||||
this._addWindowClone(windows[i]);
|
this._addWindowClone(windows[i]);
|
||||||
@ -651,8 +568,6 @@ Workspace.prototype = {
|
|||||||
|
|
||||||
this._visible = false;
|
this._visible = false;
|
||||||
|
|
||||||
this._frame = null;
|
|
||||||
|
|
||||||
this.leavingOverview = false;
|
this.leavingOverview = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -714,9 +629,6 @@ Workspace.prototype = {
|
|||||||
this._lightbox.show();
|
this._lightbox.show();
|
||||||
else
|
else
|
||||||
this._lightbox.hide();
|
this._lightbox.hide();
|
||||||
|
|
||||||
if (this._frame)
|
|
||||||
this._frame.set_opacity(showLightbox ? 150 : 255);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -737,32 +649,6 @@ Workspace.prototype = {
|
|||||||
this._lightbox.highlight(actor);
|
this._lightbox.highlight(actor);
|
||||||
},
|
},
|
||||||
|
|
||||||
// Mark the workspace selected/not-selected
|
|
||||||
setSelected : function(selected) {
|
|
||||||
// Don't draw a frame if we only have one workspace
|
|
||||||
if (selected && global.screen.n_workspaces > 1) {
|
|
||||||
if (this._frame)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// FIXME: do something cooler-looking using clutter-cairo
|
|
||||||
this._frame = new Clutter.Rectangle({ color: FRAME_COLOR });
|
|
||||||
this.actor.add_actor(this._frame);
|
|
||||||
this._frame.set_position(this._desktop.actor.x - FRAME_SIZE / this.actor.scale_x,
|
|
||||||
this._desktop.actor.y - FRAME_SIZE / this.actor.scale_y);
|
|
||||||
this._frame.set_size(this._desktop.actor.width + 2 * FRAME_SIZE / this.actor.scale_x,
|
|
||||||
this._desktop.actor.height + 2 * FRAME_SIZE / this.actor.scale_y);
|
|
||||||
this._frame.lower_bottom();
|
|
||||||
|
|
||||||
this._framePosHandler = this.actor.connect('notify::scale-x', Lang.bind(this, this._updateFramePosition));
|
|
||||||
} else {
|
|
||||||
if (!this._frame)
|
|
||||||
return;
|
|
||||||
this.actor.disconnect(this._framePosHandler);
|
|
||||||
this._frame.destroy();
|
|
||||||
this._frame = null;
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* setReactive:
|
* setReactive:
|
||||||
* @reactive: %true iff the workspace should be reactive
|
* @reactive: %true iff the workspace should be reactive
|
||||||
@ -770,14 +656,7 @@ Workspace.prototype = {
|
|||||||
* Set the workspace (desktop) reactive
|
* Set the workspace (desktop) reactive
|
||||||
**/
|
**/
|
||||||
setReactive: function(reactive) {
|
setReactive: function(reactive) {
|
||||||
this._desktop.actor.reactive = reactive;
|
this.actor.reactive = reactive;
|
||||||
},
|
|
||||||
|
|
||||||
_updateFramePosition : function() {
|
|
||||||
this._frame.set_position(this._desktop.actor.x - FRAME_SIZE / this.actor.scale_x,
|
|
||||||
this._desktop.actor.y - FRAME_SIZE / this.actor.scale_y);
|
|
||||||
this._frame.set_size(this._desktop.actor.width + 2 * FRAME_SIZE / this.actor.scale_x,
|
|
||||||
this._desktop.actor.height + 2 * FRAME_SIZE / this.actor.scale_y);
|
|
||||||
},
|
},
|
||||||
|
|
||||||
_isCloneVisible: function(clone) {
|
_isCloneVisible: function(clone) {
|
||||||
@ -788,7 +667,7 @@ Workspace.prototype = {
|
|||||||
* _getVisibleClones:
|
* _getVisibleClones:
|
||||||
*
|
*
|
||||||
* Returns a list WindowClone objects where the clone isn't filtered
|
* Returns a list WindowClone objects where the clone isn't filtered
|
||||||
* out by any application filter. The clone for the desktop is excluded.
|
* out by any application filter.
|
||||||
* The returned array will always be newly allocated; it is not in any
|
* The returned array will always be newly allocated; it is not in any
|
||||||
* defined order, and thus it's convenient to call .sort() with your
|
* defined order, and thus it's convenient to call .sort() with your
|
||||||
* choice of sorting function.
|
* choice of sorting function.
|
||||||
@ -796,7 +675,7 @@ Workspace.prototype = {
|
|||||||
_getVisibleClones: function() {
|
_getVisibleClones: function() {
|
||||||
let visible = [];
|
let visible = [];
|
||||||
|
|
||||||
for (let i = 1; i < this._windows.length; i++) {
|
for (let i = 0; i < this._windows.length; i++) {
|
||||||
let clone = this._windows[i];
|
let clone = this._windows[i];
|
||||||
|
|
||||||
if (!this._isCloneVisible(clone))
|
if (!this._isCloneVisible(clone))
|
||||||
@ -808,7 +687,7 @@ Workspace.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_resetCloneVisibility: function () {
|
_resetCloneVisibility: function () {
|
||||||
for (let i = 1; i < this._windows.length; i++) {
|
for (let i = 0; i < this._windows.length; i++) {
|
||||||
let clone = this._windows[i];
|
let clone = this._windows[i];
|
||||||
let overlay = this._windowOverlays[i];
|
let overlay = this._windowOverlays[i];
|
||||||
|
|
||||||
@ -1007,9 +886,9 @@ Workspace.prototype = {
|
|||||||
let buttonOuterHeight, captionHeight;
|
let buttonOuterHeight, captionHeight;
|
||||||
let buttonOuterWidth = 0;
|
let buttonOuterWidth = 0;
|
||||||
|
|
||||||
if (this._windowOverlays[1]) {
|
if (this._windowOverlays[0]) {
|
||||||
[buttonOuterHeight, captionHeight] = this._windowOverlays[1].chromeHeights();
|
[buttonOuterHeight, captionHeight] = this._windowOverlays[0].chromeHeights();
|
||||||
buttonOuterWidth = this._windowOverlays[1].chromeWidth() / this.scale;
|
buttonOuterWidth = this._windowOverlays[0].chromeWidth() / this.scale;
|
||||||
} else
|
} else
|
||||||
[buttonOuterHeight, captionHeight] = [0, 0];
|
[buttonOuterHeight, captionHeight] = [0, 0];
|
||||||
buttonOuterHeight /= this.scale;
|
buttonOuterHeight /= this.scale;
|
||||||
@ -1128,8 +1007,6 @@ Workspace.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
syncStacking: function(stackIndices) {
|
syncStacking: function(stackIndices) {
|
||||||
let desktopClone = this._windows[0];
|
|
||||||
|
|
||||||
let visibleClones = this._getVisibleClones();
|
let visibleClones = this._getVisibleClones();
|
||||||
visibleClones.sort(function (a, b) { return stackIndices[a.metaWindow.get_stable_sequence()] - stackIndices[b.metaWindow.get_stable_sequence()]; });
|
visibleClones.sort(function (a, b) { return stackIndices[a.metaWindow.get_stable_sequence()] - stackIndices[b.metaWindow.get_stable_sequence()]; });
|
||||||
|
|
||||||
@ -1137,7 +1014,7 @@ Workspace.prototype = {
|
|||||||
let clone = visibleClones[i];
|
let clone = visibleClones[i];
|
||||||
let metaWindow = clone.metaWindow;
|
let metaWindow = clone.metaWindow;
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
clone.setStackAbove(desktopClone.actor);
|
clone.setStackAbove(null);
|
||||||
} else {
|
} else {
|
||||||
let previousClone = visibleClones[i - 1];
|
let previousClone = visibleClones[i - 1];
|
||||||
clone.setStackAbove(previousClone.actor);
|
clone.setStackAbove(previousClone.actor);
|
||||||
@ -1157,8 +1034,8 @@ Workspace.prototype = {
|
|||||||
// be after the workspace animation finishes.
|
// be after the workspace animation finishes.
|
||||||
let [cloneX, cloneY] = clone.actor.get_position();
|
let [cloneX, cloneY] = clone.actor.get_position();
|
||||||
let [cloneWidth, cloneHeight] = clone.actor.get_size();
|
let [cloneWidth, cloneHeight] = clone.actor.get_size();
|
||||||
cloneX = this.gridX + this.scale * cloneX;
|
cloneX = this.x + this.scale * cloneX;
|
||||||
cloneY = this.gridY + this.scale * cloneY;
|
cloneY = this.y + this.scale * cloneY;
|
||||||
cloneWidth = this.scale * clone.actor.scale_x * cloneWidth;
|
cloneWidth = this.scale * clone.actor.scale_x * cloneWidth;
|
||||||
cloneHeight = this.scale * clone.actor.scale_y * cloneHeight;
|
cloneHeight = this.scale * clone.actor.scale_y * cloneHeight;
|
||||||
|
|
||||||
@ -1172,7 +1049,7 @@ Workspace.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_fadeInAllOverlays: function() {
|
_fadeInAllOverlays: function() {
|
||||||
for (let i = 1; i < this._windows.length; i++) {
|
for (let i = 0; i < this._windows.length; i++) {
|
||||||
let clone = this._windows[i];
|
let clone = this._windows[i];
|
||||||
let overlay = this._windowOverlays[i];
|
let overlay = this._windowOverlays[i];
|
||||||
if (this._showOnlyWindows != null && !(clone.metaWindow in this._showOnlyWindows))
|
if (this._showOnlyWindows != null && !(clone.metaWindow in this._showOnlyWindows))
|
||||||
@ -1182,7 +1059,7 @@ Workspace.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_hideAllOverlays: function() {
|
_hideAllOverlays: function() {
|
||||||
for (let i = 1; i< this._windows.length; i++) {
|
for (let i = 0; i < this._windows.length; i++) {
|
||||||
let overlay = this._windowOverlays[i];
|
let overlay = this._windowOverlays[i];
|
||||||
overlay.hide();
|
overlay.hide();
|
||||||
}
|
}
|
||||||
@ -1197,8 +1074,8 @@ Workspace.prototype = {
|
|||||||
let wsHeight = this.actor.height * this.scale;
|
let wsHeight = this.actor.height * this.scale;
|
||||||
|
|
||||||
let pointerHasMoved = (this._cursorX != x && this._cursorY != y);
|
let pointerHasMoved = (this._cursorX != x && this._cursorY != y);
|
||||||
let inWorkspace = (this.gridX < x && x < this.gridX + wsWidth &&
|
let inWorkspace = (this.x < x && x < this.x + wsWidth &&
|
||||||
this.gridY < y && y < this.gridY + wsHeight);
|
this.y < y && y < this.y + wsHeight);
|
||||||
|
|
||||||
if (pointerHasMoved && inWorkspace) {
|
if (pointerHasMoved && inWorkspace) {
|
||||||
// store current cursor position
|
// store current cursor position
|
||||||
@ -1309,8 +1186,8 @@ Workspace.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
// check for maximized windows on the workspace
|
// check for maximized windows on the workspace
|
||||||
_haveMaximizedWindows: function() {
|
hasMaximizedWindows: function() {
|
||||||
for (let i = 1; i < this._windows.length; i++) {
|
for (let i = 0; i < this._windows.length; i++) {
|
||||||
let metaWindow = this._windows[i].metaWindow;
|
let metaWindow = this._windows[i].metaWindow;
|
||||||
if (metaWindow.showing_on_its_workspace() &&
|
if (metaWindow.showing_on_its_workspace() &&
|
||||||
metaWindow.maximized_horizontally &&
|
metaWindow.maximized_horizontally &&
|
||||||
@ -1322,7 +1199,7 @@ Workspace.prototype = {
|
|||||||
|
|
||||||
// Animate the full-screen to Overview transition.
|
// Animate the full-screen to Overview transition.
|
||||||
zoomToOverview : function() {
|
zoomToOverview : function() {
|
||||||
this.actor.set_position(this.gridX, this.gridY);
|
this.actor.set_position(this.x, this.y);
|
||||||
this.actor.set_scale(this.scale, this.scale);
|
this.actor.set_scale(this.scale, this.scale);
|
||||||
|
|
||||||
// Position and scale the windows.
|
// Position and scale the windows.
|
||||||
@ -1331,12 +1208,6 @@ Workspace.prototype = {
|
|||||||
else
|
else
|
||||||
this.positionWindows(WindowPositionFlags.ZOOM);
|
this.positionWindows(WindowPositionFlags.ZOOM);
|
||||||
|
|
||||||
let active = global.screen.get_active_workspace();
|
|
||||||
let fadeInIcons = (Main.overview.animationInProgress &&
|
|
||||||
active == this.metaWorkspace &&
|
|
||||||
!this._haveMaximizedWindows());
|
|
||||||
this._desktop.zoomToOverview(fadeInIcons);
|
|
||||||
|
|
||||||
this._visible = true;
|
this._visible = true;
|
||||||
},
|
},
|
||||||
|
|
||||||
@ -1354,7 +1225,7 @@ Workspace.prototype = {
|
|||||||
this._doneLeavingOverview));
|
this._doneLeavingOverview));
|
||||||
|
|
||||||
// Position and scale the windows.
|
// Position and scale the windows.
|
||||||
for (let i = 1; i < this._windows.length; i++) {
|
for (let i = 0; i < this._windows.length; i++) {
|
||||||
let clone = this._windows[i];
|
let clone = this._windows[i];
|
||||||
|
|
||||||
clone.zoomFromOverview();
|
clone.zoomFromOverview();
|
||||||
@ -1383,77 +1254,9 @@ Workspace.prototype = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
let active = global.screen.get_active_workspace();
|
|
||||||
let fadeOutIcons = (active == this.metaWorkspace &&
|
|
||||||
!this._haveMaximizedWindows());
|
|
||||||
this._desktop.zoomFromOverview(fadeOutIcons);
|
|
||||||
|
|
||||||
this._visible = false;
|
this._visible = false;
|
||||||
},
|
},
|
||||||
|
|
||||||
// Animates grid shrinking/expanding when a row or column
|
|
||||||
// of workspaces is added or removed
|
|
||||||
resizeToGrid : function (oldScale) {
|
|
||||||
this._hideAllOverlays();
|
|
||||||
Tweener.addTween(this.actor,
|
|
||||||
{ x: this.gridX,
|
|
||||||
y: this.gridY,
|
|
||||||
scale_x: this.scale,
|
|
||||||
scale_y: this.scale,
|
|
||||||
time: Overview.ANIMATION_TIME,
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onComplete: Lang.bind(this, this._fadeInAllOverlays)
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
// Animates the addition of a new (empty) workspace
|
|
||||||
slideIn : function(oldScale) {
|
|
||||||
if (this.gridCol > this.gridRow) {
|
|
||||||
this.actor.set_position(global.screen_width, this.gridY);
|
|
||||||
this.actor.set_scale(oldScale, oldScale);
|
|
||||||
} else {
|
|
||||||
this.actor.set_position(this.gridX, global.screen_height);
|
|
||||||
this.actor.set_scale(this.scale, this.scale);
|
|
||||||
}
|
|
||||||
Tweener.addTween(this.actor,
|
|
||||||
{ x: this.gridX,
|
|
||||||
y: this.gridY,
|
|
||||||
scale_x: this.scale,
|
|
||||||
scale_y: this.scale,
|
|
||||||
time: Overview.ANIMATION_TIME,
|
|
||||||
transition: 'easeOutQuad'
|
|
||||||
});
|
|
||||||
|
|
||||||
this._visible = true;
|
|
||||||
},
|
|
||||||
|
|
||||||
// Animates the removal of a workspace
|
|
||||||
slideOut : function(onComplete) {
|
|
||||||
let destX = this.actor.x, destY = this.actor.y;
|
|
||||||
|
|
||||||
this._hideAllOverlays();
|
|
||||||
|
|
||||||
if (this.gridCol > this.gridRow)
|
|
||||||
destX = global.screen_width;
|
|
||||||
else
|
|
||||||
destY = global.screen_height;
|
|
||||||
Tweener.addTween(this.actor,
|
|
||||||
{ x: destX,
|
|
||||||
y: destY,
|
|
||||||
scale_x: this.scale,
|
|
||||||
scale_y: this.scale,
|
|
||||||
time: Overview.ANIMATION_TIME,
|
|
||||||
transition: 'easeOutQuad',
|
|
||||||
onComplete: onComplete
|
|
||||||
});
|
|
||||||
|
|
||||||
this._visible = false;
|
|
||||||
|
|
||||||
// Don't let the user try to select this workspace as it's
|
|
||||||
// making its exit.
|
|
||||||
this._desktop.reactive = false;
|
|
||||||
},
|
|
||||||
|
|
||||||
destroy : function() {
|
destroy : function() {
|
||||||
this.actor.destroy();
|
this.actor.destroy();
|
||||||
},
|
},
|
||||||
@ -1475,7 +1278,7 @@ Workspace.prototype = {
|
|||||||
// their parent (this.actor), but we might have a zoomed window
|
// their parent (this.actor), but we might have a zoomed window
|
||||||
// which has been reparented to the stage - _windows[0] holds
|
// which has been reparented to the stage - _windows[0] holds
|
||||||
// the desktop window, which is never reparented
|
// the desktop window, which is never reparented
|
||||||
for (let w = 1; w < this._windows.length; w++)
|
for (let w = 0; w < this._windows.length; w++)
|
||||||
this._windows[w].destroy();
|
this._windows[w].destroy();
|
||||||
this._windows = [];
|
this._windows = [];
|
||||||
},
|
},
|
||||||
@ -1506,12 +1309,12 @@ Workspace.prototype = {
|
|||||||
Lang.bind(this, this._onCloneSelected));
|
Lang.bind(this, this._onCloneSelected));
|
||||||
clone.connect('drag-begin',
|
clone.connect('drag-begin',
|
||||||
Lang.bind(this, function(clone) {
|
Lang.bind(this, function(clone) {
|
||||||
this.emit('window-drag-begin', clone.actor);
|
Main.overview.beginWindowDrag();
|
||||||
overlay.hide();
|
overlay.hide();
|
||||||
}));
|
}));
|
||||||
clone.connect('drag-end',
|
clone.connect('drag-end',
|
||||||
Lang.bind(this, function(clone) {
|
Lang.bind(this, function(clone) {
|
||||||
this.emit('window-drag-end', clone.actor);
|
Main.overview.endWindowDrag();
|
||||||
overlay.show();
|
overlay.show();
|
||||||
}));
|
}));
|
||||||
clone.connect('zoom-start',
|
clone.connect('zoom-start',
|
||||||
@ -1534,7 +1337,7 @@ Workspace.prototype = {
|
|||||||
},
|
},
|
||||||
|
|
||||||
_onShowOverlayClose: function (windowOverlay) {
|
_onShowOverlayClose: function (windowOverlay) {
|
||||||
for (let i = 1; i < this._windowOverlays.length; i++) {
|
for (let i = 0; i < this._windowOverlays.length; i++) {
|
||||||
let overlay = this._windowOverlays[i];
|
let overlay = this._windowOverlays[i];
|
||||||
if (overlay == windowOverlay)
|
if (overlay == windowOverlay)
|
||||||
continue;
|
continue;
|
||||||
@ -1643,11 +1446,11 @@ function _workspaceRelativeModifier(workspace) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return [ { name: 'x',
|
return [ { name: 'x',
|
||||||
parameters: { workspacePos: workspace.gridX,
|
parameters: { workspacePos: workspace.x,
|
||||||
overviewPos: overviewPosX,
|
overviewPos: overviewPosX,
|
||||||
overviewScale: overviewScale } },
|
overviewScale: overviewScale } },
|
||||||
{ name: 'y',
|
{ name: 'y',
|
||||||
parameters: { workspacePos: workspace.gridY,
|
parameters: { workspacePos: workspace.y,
|
||||||
overviewPos: overviewPosY,
|
overviewPos: overviewPosY,
|
||||||
overviewScale: overviewScale } }
|
overviewScale: overviewScale } }
|
||||||
];
|
];
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -15,9 +15,12 @@ js/ui/popupMenu.js
|
|||||||
js/ui/runDialog.js
|
js/ui/runDialog.js
|
||||||
js/ui/statusMenu.js
|
js/ui/statusMenu.js
|
||||||
js/ui/status/accessibility.js
|
js/ui/status/accessibility.js
|
||||||
|
js/ui/viewSelector.js
|
||||||
js/ui/windowAttentionHandler.js
|
js/ui/windowAttentionHandler.js
|
||||||
js/ui/workspacesView.js
|
js/ui/workspacesView.js
|
||||||
src/gvc/gvc-mixer-control.c
|
src/gvc/gvc-mixer-control.c
|
||||||
src/gdmuser/gdm-user.c
|
src/gdmuser/gdm-user.c
|
||||||
|
src/shell-app-system.c
|
||||||
src/shell-global.c
|
src/shell-global.c
|
||||||
src/shell-uri-util.c
|
src/shell-util.c
|
||||||
|
|
||||||
|
207
po/gl.po
207
po/gl.po
@ -10,8 +10,8 @@ msgid ""
|
|||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: gnome-shell master\n"
|
"Project-Id-Version: gnome-shell master\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2010-11-03 00:26+0100\n"
|
"POT-Creation-Date: 2010-11-29 17:32+0100\n"
|
||||||
"PO-Revision-Date: 2010-11-03 00:28+0100\n"
|
"PO-Revision-Date: 2010-11-29 17:33+0100\n"
|
||||||
"Last-Translator: Fran Diéguez <frandieguez@ubuntu.com>\n"
|
"Last-Translator: Fran Diéguez <frandieguez@ubuntu.com>\n"
|
||||||
"Language-Team: Galician <gnome-gl-list@gnome.org>\n"
|
"Language-Team: Galician <gnome-gl-list@gnome.org>\n"
|
||||||
"Language: gl\n"
|
"Language: gl\n"
|
||||||
@ -104,10 +104,6 @@ msgid "List of desktop file IDs for favorite applications"
|
|||||||
msgstr "Mostra os ID de ficheiros desktop para os aplicativos preferidos"
|
msgstr "Mostra os ID de ficheiros desktop para os aplicativos preferidos"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
||||||
msgid "Overview workspace view mode"
|
|
||||||
msgstr "Modo de visualización do espazo de traballo de vista previa"
|
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
|
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
|
||||||
"used for gst-launch. The pipeline should have an unconnected sink pad where "
|
"used for gst-launch. The pipeline should have an unconnected sink pad where "
|
||||||
@ -128,19 +124,19 @@ msgstr ""
|
|||||||
"está a un valor baleiro, usarase a tubería predeterminada. Actualmente é "
|
"está a un valor baleiro, usarase a tubería predeterminada. Actualmente é "
|
||||||
"«videorate ! theoraenc ! oggmux» e grava en Ogg Theora."
|
"«videorate ! theoraenc ! oggmux» e grava en Ogg Theora."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:15
|
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
||||||
msgid "Show date in clock"
|
msgid "Show date in clock"
|
||||||
msgstr "Mostrar a data no reloxo"
|
msgstr "Mostrar a data no reloxo"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:16
|
#: ../data/org.gnome.shell.gschema.xml.in.h:15
|
||||||
msgid "Show the week date in the calendar"
|
msgid "Show the week date in the calendar"
|
||||||
msgstr "Mostrar a data da semana no calendario"
|
msgstr "Mostrar a data da semana no calendario"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:17
|
#: ../data/org.gnome.shell.gschema.xml.in.h:16
|
||||||
msgid "Show time with seconds"
|
msgid "Show time with seconds"
|
||||||
msgstr "Mostrar a hora con segundos"
|
msgstr "Mostrar a hora con segundos"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:18
|
#: ../data/org.gnome.shell.gschema.xml.in.h:17
|
||||||
msgid ""
|
msgid ""
|
||||||
"The applications corresponding to these identifiers will be displayed in the "
|
"The applications corresponding to these identifiers will be displayed in the "
|
||||||
"favorites area."
|
"favorites area."
|
||||||
@ -148,7 +144,7 @@ msgstr ""
|
|||||||
"Os aplicativos que corresponden a estes identificadores mostraranse na área "
|
"Os aplicativos que corresponden a estes identificadores mostraranse na área "
|
||||||
"de preferidos."
|
"de preferidos."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:19
|
#: ../data/org.gnome.shell.gschema.xml.in.h:18
|
||||||
msgid ""
|
msgid ""
|
||||||
"The filename for recorded screencasts will be a unique filename based on the "
|
"The filename for recorded screencasts will be a unique filename based on the "
|
||||||
"current date, and use this extension. It should be changed when recording to "
|
"current date, and use this extension. It should be changed when recording to "
|
||||||
@ -158,7 +154,7 @@ msgstr ""
|
|||||||
"baseado na data actual e usa esta extensión. Debería cambiar ao grabar nun "
|
"baseado na data actual e usa esta extensión. Debería cambiar ao grabar nun "
|
||||||
"formato de contedor diferente."
|
"formato de contedor diferente."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
#: ../data/org.gnome.shell.gschema.xml.in.h:19
|
||||||
msgid ""
|
msgid ""
|
||||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||||
"screencast recorder in frames-per-second."
|
"screencast recorder in frames-per-second."
|
||||||
@ -166,19 +162,11 @@ msgstr ""
|
|||||||
"A taxa de marcos do screencast resultante grabado polo grabador de "
|
"A taxa de marcos do screencast resultante grabado polo grabador de "
|
||||||
"screencasts de GNOME Shell en marcos-por-segundo."
|
"screencasts de GNOME Shell en marcos-por-segundo."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:21
|
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
||||||
msgid "The gstreamer pipeline used to encode the screencast"
|
msgid "The gstreamer pipeline used to encode the screencast"
|
||||||
msgstr "A tubería de gstreamer usada para codificar o screencast"
|
msgstr "A tubería de gstreamer usada para codificar o screencast"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
#: ../data/org.gnome.shell.gschema.xml.in.h:21
|
||||||
msgid ""
|
|
||||||
"The selected workspace view mode in the overview. Supported values are "
|
|
||||||
"\"single\" and \"grid\"."
|
|
||||||
msgstr ""
|
|
||||||
"O modo de visualización do espazo de traballo seleccionado na vista previa. "
|
|
||||||
"Os valores admitidos son \"single\" e \"grid\"."
|
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:23
|
|
||||||
msgid ""
|
msgid ""
|
||||||
"The shell normally monitors active applications in order to present the most "
|
"The shell normally monitors active applications in order to present the most "
|
||||||
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
||||||
@ -190,7 +178,7 @@ msgstr ""
|
|||||||
"privados, vostede pode desactivar isto por motivos de privacidade. Teña en "
|
"privados, vostede pode desactivar isto por motivos de privacidade. Teña en "
|
||||||
"conta que facendo isto non eliminará os datos gardados."
|
"conta que facendo isto non eliminará os datos gardados."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:24
|
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
||||||
msgid ""
|
msgid ""
|
||||||
"This key specifies the format used by the panel clock when the format key is "
|
"This key specifies the format used by the panel clock when the format key is "
|
||||||
"set to \"custom\". You can use conversion specifiers understood by strftime"
|
"set to \"custom\". You can use conversion specifiers understood by strftime"
|
||||||
@ -202,7 +190,7 @@ msgstr ""
|
|||||||
"de conversión que entende strftime() para obter un formato de hora "
|
"de conversión que entende strftime() para obter un formato de hora "
|
||||||
"especificado. Vexa o manual de strftime() para obter máis información."
|
"especificado. Vexa o manual de strftime() para obter máis información."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:25
|
#: ../data/org.gnome.shell.gschema.xml.in.h:23
|
||||||
msgid ""
|
msgid ""
|
||||||
"This key specifies the hour format used by the panel clock. Possible values "
|
"This key specifies the hour format used by the panel clock. Possible values "
|
||||||
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
|
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
|
||||||
@ -219,11 +207,11 @@ msgstr ""
|
|||||||
"está estabelecido a «unix» ou «custom», as chaves show_date e show_seconds "
|
"está estabelecido a «unix» ou «custom», as chaves show_date e show_seconds "
|
||||||
"ignoraranse."
|
"ignoraranse."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:26
|
#: ../data/org.gnome.shell.gschema.xml.in.h:24
|
||||||
msgid "Uuids of extensions to disable"
|
msgid "Uuids of extensions to disable"
|
||||||
msgstr "Os Uuid das extensións a desactivar"
|
msgstr "Os Uuid das extensións a desactivar"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:27
|
#: ../data/org.gnome.shell.gschema.xml.in.h:25
|
||||||
msgid "Whether to collect stats about applications usage"
|
msgid "Whether to collect stats about applications usage"
|
||||||
msgstr "Indica se recoller estatísticas sobre o uso dos aplicativos"
|
msgstr "Indica se recoller estatísticas sobre o uso dos aplicativos"
|
||||||
|
|
||||||
@ -409,62 +397,41 @@ msgstr "Formato _12 horas"
|
|||||||
msgid "_24 hour format"
|
msgid "_24 hour format"
|
||||||
msgstr "Formato _24 horas"
|
msgstr "Formato _24 horas"
|
||||||
|
|
||||||
#. **** Applications ****
|
#: ../js/ui/appDisplay.js:215
|
||||||
#: ../js/ui/appDisplay.js:316 ../js/ui/dash.js:778
|
|
||||||
msgid "APPLICATIONS"
|
msgid "APPLICATIONS"
|
||||||
msgstr "APLICATIVOS"
|
msgstr "APLICATIVOS"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:348
|
#: ../js/ui/appDisplay.js:245
|
||||||
msgid "PREFERENCES"
|
msgid "PREFERENCES"
|
||||||
msgstr "PREFERENCIAS"
|
msgstr "PREFERENCIAS"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:647
|
#: ../js/ui/appDisplay.js:538
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Xanela nova"
|
msgstr "Xanela nova"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:651
|
#: ../js/ui/appDisplay.js:542
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Eliminar dos favoritos"
|
msgstr "Eliminar dos favoritos"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:652
|
#: ../js/ui/appDisplay.js:543
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Engadir aos favoritos"
|
msgstr "Engadir aos favoritos"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:829
|
#: ../js/ui/appFavorites.js:91
|
||||||
msgid "Drag here to add favorites"
|
|
||||||
msgstr "Arrastre aquí para engadir aos favoritos"
|
|
||||||
|
|
||||||
#: ../js/ui/appFavorites.js:88
|
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s has been added to your favorites."
|
msgid "%s has been added to your favorites."
|
||||||
msgstr "%s foi engadido aos seus favoritos."
|
msgstr "%s foi engadido aos seus favoritos."
|
||||||
|
|
||||||
#: ../js/ui/appFavorites.js:107
|
#: ../js/ui/appFavorites.js:122
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s has been removed from your favorites."
|
msgid "%s has been removed from your favorites."
|
||||||
msgstr "%s foi eliminado dos seus favoritos."
|
msgstr "%s foi eliminado dos seus favoritos."
|
||||||
|
|
||||||
#: ../js/ui/dash.js:142
|
#: ../js/ui/dash.js:27
|
||||||
msgid "Find"
|
msgid "Remove"
|
||||||
msgstr "Buscar"
|
msgstr "Eliminar"
|
||||||
|
|
||||||
#: ../js/ui/dash.js:473
|
#: ../js/ui/docDisplay.js:494
|
||||||
msgid "Searching..."
|
|
||||||
msgstr "Buscando..."
|
|
||||||
|
|
||||||
#: ../js/ui/dash.js:487
|
|
||||||
msgid "No matching results."
|
|
||||||
msgstr "Non hai resultados que coincidan."
|
|
||||||
|
|
||||||
#. **** Places ****
|
|
||||||
#. Translators: This is in the sense of locations for documents,
|
|
||||||
#. network locations, etc.
|
|
||||||
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:554
|
|
||||||
msgid "PLACES & DEVICES"
|
|
||||||
msgstr "LUGARES E DISPOSITIVOS"
|
|
||||||
|
|
||||||
#. **** Documents ****
|
|
||||||
#: ../js/ui/dash.js:804 ../js/ui/docDisplay.js:494
|
|
||||||
msgid "RECENT ITEMS"
|
msgid "RECENT ITEMS"
|
||||||
msgstr "ELEMENTOS RECENTES"
|
msgstr "ELEMENTOS RECENTES"
|
||||||
|
|
||||||
@ -498,63 +465,63 @@ msgstr "Ver fonte"
|
|||||||
msgid "Web Page"
|
msgid "Web Page"
|
||||||
msgstr "Páxina web"
|
msgstr "Páxina web"
|
||||||
|
|
||||||
#: ../js/ui/overview.js:160
|
#: ../js/ui/overview.js:112
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "Desfacer"
|
msgstr "Desfacer"
|
||||||
|
|
||||||
#. TODO - _quit() doesn't really work on apps in state STARTING yet
|
#. TODO - _quit() doesn't really work on apps in state STARTING yet
|
||||||
#: ../js/ui/panel.js:469
|
#: ../js/ui/panel.js:470
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Quit %s"
|
msgid "Quit %s"
|
||||||
msgstr "Saír de %s"
|
msgstr "Saír de %s"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:494
|
#: ../js/ui/panel.js:495
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr "Preferencias"
|
msgstr "Preferencias"
|
||||||
|
|
||||||
#. Translators: This is the time format with date used
|
#. Translators: This is the time format with date used
|
||||||
#. in 24-hour mode.
|
#. in 24-hour mode.
|
||||||
#: ../js/ui/panel.js:580
|
#: ../js/ui/panel.js:581
|
||||||
msgid "%a %b %e, %R:%S"
|
msgid "%a %b %e, %R:%S"
|
||||||
msgstr "%a %e de %b, %R:%S"
|
msgstr "%a %e de %b, %R:%S"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:581
|
#: ../js/ui/panel.js:582
|
||||||
msgid "%a %b %e, %R"
|
msgid "%a %b %e, %R"
|
||||||
msgstr "%a %e de %b, %R"
|
msgstr "%a %e de %b, %R"
|
||||||
|
|
||||||
#. Translators: This is the time format without date used
|
#. Translators: This is the time format without date used
|
||||||
#. in 24-hour mode.
|
#. in 24-hour mode.
|
||||||
#: ../js/ui/panel.js:585
|
#: ../js/ui/panel.js:586
|
||||||
msgid "%a %R:%S"
|
msgid "%a %R:%S"
|
||||||
msgstr "%a %R:%S"
|
msgstr "%a %R:%S"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:586
|
#: ../js/ui/panel.js:587
|
||||||
msgid "%a %R"
|
msgid "%a %R"
|
||||||
msgstr "%a %R"
|
msgstr "%a %R"
|
||||||
|
|
||||||
#. Translators: This is a time format with date used
|
#. Translators: This is a time format with date used
|
||||||
#. for AM/PM.
|
#. for AM/PM.
|
||||||
#: ../js/ui/panel.js:593
|
#: ../js/ui/panel.js:594
|
||||||
msgid "%a %b %e, %l:%M:%S %p"
|
msgid "%a %b %e, %l:%M:%S %p"
|
||||||
msgstr "%a %e de %b, %H:%M:%S"
|
msgstr "%a %e de %b, %H:%M:%S"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:594
|
#: ../js/ui/panel.js:595
|
||||||
msgid "%a %b %e, %l:%M %p"
|
msgid "%a %b %e, %l:%M %p"
|
||||||
msgstr "%a %e de %b, %H:%M"
|
msgstr "%a %e de %b, %H:%M"
|
||||||
|
|
||||||
#. Translators: This is a time format without date used
|
#. Translators: This is a time format without date used
|
||||||
#. for AM/PM.
|
#. for AM/PM.
|
||||||
#: ../js/ui/panel.js:598
|
#: ../js/ui/panel.js:599
|
||||||
msgid "%a %l:%M:%S %p"
|
msgid "%a %l:%M:%S %p"
|
||||||
msgstr "%a %H:%M:%S"
|
msgstr "%a %H:%M:%S"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:599
|
#: ../js/ui/panel.js:600
|
||||||
msgid "%a %l:%M %p"
|
msgid "%a %l:%M %p"
|
||||||
msgstr "%a %l:%M %p"
|
msgstr "%a %l:%M %p"
|
||||||
|
|
||||||
#. Button on the left side of the panel.
|
#. Button on the left side of the panel.
|
||||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||||
#: ../js/ui/panel.js:744
|
#: ../js/ui/panel.js:745
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "Actividades"
|
msgstr "Actividades"
|
||||||
|
|
||||||
@ -571,6 +538,10 @@ msgstr "Reintentar"
|
|||||||
msgid "Connect to..."
|
msgid "Connect to..."
|
||||||
msgstr "Conectar con..."
|
msgstr "Conectar con..."
|
||||||
|
|
||||||
|
#: ../js/ui/placeDisplay.js:558
|
||||||
|
msgid "PLACES & DEVICES"
|
||||||
|
msgstr "LUGARES E DISPOSITIVOS"
|
||||||
|
|
||||||
#. Translators: this MUST be either "toggle-switch-us"
|
#. Translators: this MUST be either "toggle-switch-us"
|
||||||
#. (for toggle switches containing the English words
|
#. (for toggle switches containing the English words
|
||||||
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
#. "ON" and "OFF") or "toggle-switch-intl" (for toggle
|
||||||
@ -597,39 +568,31 @@ msgstr "Dispoñíbel"
|
|||||||
msgid "Busy"
|
msgid "Busy"
|
||||||
msgstr "Ocupado"
|
msgstr "Ocupado"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:111
|
#: ../js/ui/statusMenu.js:114
|
||||||
msgid "Invisible"
|
msgid "My Account"
|
||||||
msgstr "Invisíbel"
|
msgstr "A miña conta"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:119
|
#: ../js/ui/statusMenu.js:118
|
||||||
msgid "My Account..."
|
msgid "System Settings"
|
||||||
msgstr "A miña conta..."
|
msgstr "Configuracións do sistema"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:123
|
#: ../js/ui/statusMenu.js:125
|
||||||
msgid "System Settings..."
|
|
||||||
msgstr "Configuracións do sistema..."
|
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:130
|
|
||||||
msgid "Lock Screen"
|
msgid "Lock Screen"
|
||||||
msgstr "Bloquear pantalla"
|
msgstr "Bloquear pantalla"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:134
|
#: ../js/ui/statusMenu.js:129
|
||||||
msgid "Switch User"
|
msgid "Switch User"
|
||||||
msgstr "Cambiar de usuario"
|
msgstr "Cambiar de usuario"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:139
|
#: ../js/ui/statusMenu.js:134
|
||||||
msgid "Log Out..."
|
msgid "Log Out..."
|
||||||
msgstr "Saír da sesión..."
|
msgstr "Saír da sesión..."
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:146
|
#: ../js/ui/statusMenu.js:141
|
||||||
msgid "Suspend"
|
msgid "Suspend..."
|
||||||
msgstr "Suspender"
|
msgstr "Suspender..."
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:150
|
#: ../js/ui/statusMenu.js:145
|
||||||
msgid "Restart..."
|
|
||||||
msgstr "Reiniciar..."
|
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:154
|
|
||||||
msgid "Shut Down..."
|
msgid "Shut Down..."
|
||||||
msgstr "Apagar..."
|
msgstr "Apagar..."
|
||||||
|
|
||||||
@ -669,14 +632,18 @@ msgstr "Configuracións de acceso universal"
|
|||||||
msgid "High Contrast"
|
msgid "High Contrast"
|
||||||
msgstr "Alto contraste"
|
msgstr "Alto contraste"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:202
|
#: ../js/ui/status/accessibility.js:205
|
||||||
msgid "Large Text"
|
msgid "Large Text"
|
||||||
msgstr "Texto máis grande"
|
msgstr "Texto máis grande"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:223
|
#: ../js/ui/status/accessibility.js:224
|
||||||
msgid "Zoom"
|
msgid "Zoom"
|
||||||
msgstr "Ampliación"
|
msgstr "Ampliación"
|
||||||
|
|
||||||
|
#: ../js/ui/viewSelector.js:26
|
||||||
|
msgid "Search your computer"
|
||||||
|
msgstr "Buscar no seu computador"
|
||||||
|
|
||||||
#: ../js/ui/windowAttentionHandler.js:43
|
#: ../js/ui/windowAttentionHandler.js:43
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s has finished starting"
|
msgid "%s has finished starting"
|
||||||
@ -687,14 +654,14 @@ msgstr "%s rematou de iniarse"
|
|||||||
msgid "'%s' is ready"
|
msgid "'%s' is ready"
|
||||||
msgstr "«%s» está preparado"
|
msgstr "«%s» está preparado"
|
||||||
|
|
||||||
#: ../js/ui/workspacesView.js:229
|
#: ../js/ui/workspacesView.js:244
|
||||||
msgid ""
|
msgid ""
|
||||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Non é posíbel engadir unha área de traballo nova porque chegouse ao límite "
|
"Non é posíbel engadir unha área de traballo nova porque chegouse ao límite "
|
||||||
"de áreas de traballo."
|
"de áreas de traballo."
|
||||||
|
|
||||||
#: ../js/ui/workspacesView.js:246
|
#: ../js/ui/workspacesView.js:260
|
||||||
msgid "Can't remove the first workspace."
|
msgid "Can't remove the first workspace."
|
||||||
msgstr "Non é posíbel quitar a primeira área de traballo."
|
msgstr "Non é posíbel quitar a primeira área de traballo."
|
||||||
|
|
||||||
@ -720,49 +687,53 @@ msgstr[1] "%u entradas"
|
|||||||
msgid "System Sounds"
|
msgid "System Sounds"
|
||||||
msgstr "Sons do sistema"
|
msgstr "Sons do sistema"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1219
|
#: ../src/shell-app-system.c:1012
|
||||||
|
msgid "Unknown"
|
||||||
|
msgstr "Descoñecido"
|
||||||
|
|
||||||
|
#: ../src/shell-global.c:1163
|
||||||
msgid "Less than a minute ago"
|
msgid "Less than a minute ago"
|
||||||
msgstr "Hai menos dun minuto"
|
msgstr "Hai menos dun minuto"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1223
|
#: ../src/shell-global.c:1167
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d minute ago"
|
msgid "%d minute ago"
|
||||||
msgid_plural "%d minutes ago"
|
msgid_plural "%d minutes ago"
|
||||||
msgstr[0] "hai %d minuto"
|
msgstr[0] "hai %d minuto"
|
||||||
msgstr[1] "hai %d minutos"
|
msgstr[1] "hai %d minutos"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1228
|
#: ../src/shell-global.c:1172
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d hour ago"
|
msgid "%d hour ago"
|
||||||
msgid_plural "%d hours ago"
|
msgid_plural "%d hours ago"
|
||||||
msgstr[0] "hai %d hora"
|
msgstr[0] "hai %d hora"
|
||||||
msgstr[1] "hai %d horas"
|
msgstr[1] "hai %d horas"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1233
|
#: ../src/shell-global.c:1177
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d day ago"
|
msgid "%d day ago"
|
||||||
msgid_plural "%d days ago"
|
msgid_plural "%d days ago"
|
||||||
msgstr[0] "hai %d día"
|
msgstr[0] "hai %d día"
|
||||||
msgstr[1] "hai %d días"
|
msgstr[1] "hai %d días"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1238
|
#: ../src/shell-global.c:1182
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d week ago"
|
msgid "%d week ago"
|
||||||
msgid_plural "%d weeks ago"
|
msgid_plural "%d weeks ago"
|
||||||
msgstr[0] "hai %d semana"
|
msgstr[0] "hai %d semana"
|
||||||
msgstr[1] "hai %d semanas"
|
msgstr[1] "hai %d semanas"
|
||||||
|
|
||||||
#: ../src/shell-uri-util.c:89
|
#: ../src/shell-util.c:89
|
||||||
msgid "Home Folder"
|
msgid "Home Folder"
|
||||||
msgstr "Cartafol persoal"
|
msgstr "Cartafol persoal"
|
||||||
|
|
||||||
#. Translators: this is the same string as the one found in
|
#. Translators: this is the same string as the one found in
|
||||||
#. * nautilus
|
#. * nautilus
|
||||||
#: ../src/shell-uri-util.c:104
|
#: ../src/shell-util.c:104
|
||||||
msgid "File System"
|
msgid "File System"
|
||||||
msgstr "Sistema de ficheiros"
|
msgstr "Sistema de ficheiros"
|
||||||
|
|
||||||
#: ../src/shell-uri-util.c:250
|
#: ../src/shell-util.c:250
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Buscar"
|
msgstr "Buscar"
|
||||||
|
|
||||||
@ -771,11 +742,39 @@ msgstr "Buscar"
|
|||||||
#. * example, "Trash: some-directory". It means that the
|
#. * example, "Trash: some-directory". It means that the
|
||||||
#. * directory called "some-directory" is in the trash.
|
#. * directory called "some-directory" is in the trash.
|
||||||
#.
|
#.
|
||||||
#: ../src/shell-uri-util.c:300
|
#: ../src/shell-util.c:300
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%1$s: %2$s"
|
msgid "%1$s: %2$s"
|
||||||
msgstr "%1$s: %2$s"
|
msgstr "%1$s: %2$s"
|
||||||
|
|
||||||
|
#~ msgid "Overview workspace view mode"
|
||||||
|
#~ msgstr "Modo de visualización do espazo de traballo de vista previa"
|
||||||
|
|
||||||
|
#~ msgid ""
|
||||||
|
#~ "The selected workspace view mode in the overview. Supported values are "
|
||||||
|
#~ "\"single\" and \"grid\"."
|
||||||
|
#~ msgstr ""
|
||||||
|
#~ "O modo de visualización do espazo de traballo seleccionado na vista "
|
||||||
|
#~ "previa. Os valores admitidos son \"single\" e \"grid\"."
|
||||||
|
|
||||||
|
#~ msgid "Drag here to add favorites"
|
||||||
|
#~ msgstr "Arrastre aquí para engadir aos favoritos"
|
||||||
|
|
||||||
|
#~ msgid "Find"
|
||||||
|
#~ msgstr "Buscar"
|
||||||
|
|
||||||
|
#~ msgid "Searching..."
|
||||||
|
#~ msgstr "Buscando..."
|
||||||
|
|
||||||
|
#~ msgid "No matching results."
|
||||||
|
#~ msgstr "Non hai resultados que coincidan."
|
||||||
|
|
||||||
|
#~ msgid "Invisible"
|
||||||
|
#~ msgstr "Invisíbel"
|
||||||
|
|
||||||
|
#~ msgid "Restart..."
|
||||||
|
#~ msgstr "Reiniciar..."
|
||||||
|
|
||||||
#~ msgid "System Preferences..."
|
#~ msgid "System Preferences..."
|
||||||
#~ msgstr "Preferencias do sistema..."
|
#~ msgstr "Preferencias do sistema..."
|
||||||
|
|
||||||
|
90
po/nb.po
90
po/nb.po
@ -5,10 +5,10 @@
|
|||||||
#
|
#
|
||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: gnome-shell 2.31.x\n"
|
"Project-Id-Version: gnome-shell 2.91.x\n"
|
||||||
"Report-Msgid-Bugs-To: \n"
|
"Report-Msgid-Bugs-To: \n"
|
||||||
"POT-Creation-Date: 2010-10-28 17:35+0200\n"
|
"POT-Creation-Date: 2010-11-20 14:39+0100\n"
|
||||||
"PO-Revision-Date: 2010-10-28 17:38+0200\n"
|
"PO-Revision-Date: 2010-11-20 14:40+0100\n"
|
||||||
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
|
"Last-Translator: Kjartan Maraas <kmaraas@gnome.org>\n"
|
||||||
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
|
"Language-Team: Norwegian bokmål <i18n-nb@lister.ping.uio.no>\n"
|
||||||
"Language: \n"
|
"Language: \n"
|
||||||
@ -344,19 +344,19 @@ msgstr "PROGRAMMER"
|
|||||||
msgid "PREFERENCES"
|
msgid "PREFERENCES"
|
||||||
msgstr "BRUKERVALG"
|
msgstr "BRUKERVALG"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:648
|
#: ../js/ui/appDisplay.js:647
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "Nytt vindu"
|
msgstr "Nytt vindu"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:652
|
#: ../js/ui/appDisplay.js:651
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "Fjern fra favoritter"
|
msgstr "Fjern fra favoritter"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:653
|
#: ../js/ui/appDisplay.js:652
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "Legg til i favoritter"
|
msgstr "Legg til i favoritter"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:830
|
#: ../js/ui/appDisplay.js:829
|
||||||
msgid "Drag here to add favorites"
|
msgid "Drag here to add favorites"
|
||||||
msgstr "Dra hit for å legge til favoritter"
|
msgstr "Dra hit for å legge til favoritter"
|
||||||
|
|
||||||
@ -385,7 +385,7 @@ msgstr "Ingen treff."
|
|||||||
#. **** Places ****
|
#. **** Places ****
|
||||||
#. Translators: This is in the sense of locations for documents,
|
#. Translators: This is in the sense of locations for documents,
|
||||||
#. network locations, etc.
|
#. network locations, etc.
|
||||||
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:554
|
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:558
|
||||||
msgid "PLACES & DEVICES"
|
msgid "PLACES & DEVICES"
|
||||||
msgstr "STEDER & ENHETER"
|
msgstr "STEDER & ENHETER"
|
||||||
|
|
||||||
@ -429,58 +429,58 @@ msgid "Undo"
|
|||||||
msgstr "Angre"
|
msgstr "Angre"
|
||||||
|
|
||||||
#. TODO - _quit() doesn't really work on apps in state STARTING yet
|
#. TODO - _quit() doesn't really work on apps in state STARTING yet
|
||||||
#: ../js/ui/panel.js:469
|
#: ../js/ui/panel.js:470
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Quit %s"
|
msgid "Quit %s"
|
||||||
msgstr "Avslutt %s"
|
msgstr "Avslutt %s"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:494
|
#: ../js/ui/panel.js:495
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr "Brukervalg"
|
msgstr "Brukervalg"
|
||||||
|
|
||||||
#. Translators: This is the time format with date used
|
#. Translators: This is the time format with date used
|
||||||
#. in 24-hour mode.
|
#. in 24-hour mode.
|
||||||
#: ../js/ui/panel.js:580
|
#: ../js/ui/panel.js:581
|
||||||
msgid "%a %b %e, %R:%S"
|
msgid "%a %b %e, %R:%S"
|
||||||
msgstr "%a %e %b, %R.%S"
|
msgstr "%a %e %b, %R.%S"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:581
|
#: ../js/ui/panel.js:582
|
||||||
msgid "%a %b %e, %R"
|
msgid "%a %b %e, %R"
|
||||||
msgstr "%a %e %b, %R"
|
msgstr "%a %e %b, %R"
|
||||||
|
|
||||||
#. Translators: This is the time format without date used
|
#. Translators: This is the time format without date used
|
||||||
#. in 24-hour mode.
|
#. in 24-hour mode.
|
||||||
#: ../js/ui/panel.js:585
|
#: ../js/ui/panel.js:586
|
||||||
msgid "%a %R:%S"
|
msgid "%a %R:%S"
|
||||||
msgstr "%a %R.%S"
|
msgstr "%a %R.%S"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:586
|
#: ../js/ui/panel.js:587
|
||||||
msgid "%a %R"
|
msgid "%a %R"
|
||||||
msgstr "%a %R"
|
msgstr "%a %R"
|
||||||
|
|
||||||
#. Translators: This is a time format with date used
|
#. Translators: This is a time format with date used
|
||||||
#. for AM/PM.
|
#. for AM/PM.
|
||||||
#: ../js/ui/panel.js:593
|
#: ../js/ui/panel.js:594
|
||||||
msgid "%a %b %e, %l:%M:%S %p"
|
msgid "%a %b %e, %l:%M:%S %p"
|
||||||
msgstr "%a %e %b, %l.%M.%S %p"
|
msgstr "%a %e %b, %l.%M.%S %p"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:594
|
#: ../js/ui/panel.js:595
|
||||||
msgid "%a %b %e, %l:%M %p"
|
msgid "%a %b %e, %l:%M %p"
|
||||||
msgstr "%a %e %b, %l.%M %p"
|
msgstr "%a %e %b, %l.%M %p"
|
||||||
|
|
||||||
#. Translators: This is a time format without date used
|
#. Translators: This is a time format without date used
|
||||||
#. for AM/PM.
|
#. for AM/PM.
|
||||||
#: ../js/ui/panel.js:598
|
#: ../js/ui/panel.js:599
|
||||||
msgid "%a %l:%M:%S %p"
|
msgid "%a %l:%M:%S %p"
|
||||||
msgstr "%a %l.%M.%S %p"
|
msgstr "%a %l.%M.%S %p"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:599
|
#: ../js/ui/panel.js:600
|
||||||
msgid "%a %l:%M %p"
|
msgid "%a %l:%M %p"
|
||||||
msgstr "%a %l.%M %p"
|
msgstr "%a %l.%M %p"
|
||||||
|
|
||||||
#. Button on the left side of the panel.
|
#. Button on the left side of the panel.
|
||||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||||
#: ../js/ui/panel.js:744
|
#: ../js/ui/panel.js:745
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "Aktiviteter"
|
msgstr "Aktiviteter"
|
||||||
|
|
||||||
@ -523,39 +523,31 @@ msgstr "Tilgjengelig"
|
|||||||
msgid "Busy"
|
msgid "Busy"
|
||||||
msgstr "Opptatt"
|
msgstr "Opptatt"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:111
|
#: ../js/ui/statusMenu.js:114
|
||||||
msgid "Invisible"
|
|
||||||
msgstr "Usynlig"
|
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:119
|
|
||||||
msgid "My Account..."
|
msgid "My Account..."
|
||||||
msgstr "Min konto..."
|
msgstr "Min konto..."
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:123
|
#: ../js/ui/statusMenu.js:118
|
||||||
msgid "System Preferences..."
|
msgid "System Settings..."
|
||||||
msgstr "Brukervalg for systemet..."
|
msgstr "Systeminnstillinger..."
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:130
|
#: ../js/ui/statusMenu.js:125
|
||||||
msgid "Lock Screen"
|
msgid "Lock Screen"
|
||||||
msgstr "Lås skjerm"
|
msgstr "Lås skjerm"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:134
|
#: ../js/ui/statusMenu.js:129
|
||||||
msgid "Switch User"
|
msgid "Switch User"
|
||||||
msgstr "Bytt bruker"
|
msgstr "Bytt bruker"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:139
|
#: ../js/ui/statusMenu.js:134
|
||||||
msgid "Log Out..."
|
msgid "Log Out..."
|
||||||
msgstr "Logg ut..."
|
msgstr "Logg ut..."
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:146
|
#: ../js/ui/statusMenu.js:141
|
||||||
msgid "Suspend"
|
msgid "Suspend"
|
||||||
msgstr "Hvilemodus"
|
msgstr "Hvilemodus"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:150
|
#: ../js/ui/statusMenu.js:145
|
||||||
msgid "Restart..."
|
|
||||||
msgstr "Start på nytt..."
|
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:154
|
|
||||||
msgid "Shut Down..."
|
msgid "Shut Down..."
|
||||||
msgstr "Avslutt..."
|
msgstr "Avslutt..."
|
||||||
|
|
||||||
@ -595,11 +587,11 @@ msgstr "Innstillinger for tilgjengelighet"
|
|||||||
msgid "High Contrast"
|
msgid "High Contrast"
|
||||||
msgstr "Høy kontrast"
|
msgstr "Høy kontrast"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:202
|
#: ../js/ui/status/accessibility.js:205
|
||||||
msgid "Large Text"
|
msgid "Large Text"
|
||||||
msgstr "Stor tekst"
|
msgstr "Stor tekst"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:223
|
#: ../js/ui/status/accessibility.js:224
|
||||||
msgid "Zoom"
|
msgid "Zoom"
|
||||||
msgstr "Zoom"
|
msgstr "Zoom"
|
||||||
|
|
||||||
@ -646,49 +638,53 @@ msgstr[1] "%u innganger"
|
|||||||
msgid "System Sounds"
|
msgid "System Sounds"
|
||||||
msgstr "Systemlyder"
|
msgstr "Systemlyder"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1204
|
#: ../src/shell-app-system.c:1012
|
||||||
|
msgid "Unknown"
|
||||||
|
msgstr "Ukjent"
|
||||||
|
|
||||||
|
#: ../src/shell-global.c:1158
|
||||||
msgid "Less than a minute ago"
|
msgid "Less than a minute ago"
|
||||||
msgstr "Mindre enn ett minutt siden"
|
msgstr "Mindre enn ett minutt siden"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1208
|
#: ../src/shell-global.c:1162
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d minute ago"
|
msgid "%d minute ago"
|
||||||
msgid_plural "%d minutes ago"
|
msgid_plural "%d minutes ago"
|
||||||
msgstr[0] "%d minutt siden"
|
msgstr[0] "%d minutt siden"
|
||||||
msgstr[1] "%d minutter siden"
|
msgstr[1] "%d minutter siden"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1213
|
#: ../src/shell-global.c:1167
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d hour ago"
|
msgid "%d hour ago"
|
||||||
msgid_plural "%d hours ago"
|
msgid_plural "%d hours ago"
|
||||||
msgstr[0] "%d time siden"
|
msgstr[0] "%d time siden"
|
||||||
msgstr[1] "%d timer siden"
|
msgstr[1] "%d timer siden"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1218
|
#: ../src/shell-global.c:1172
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d day ago"
|
msgid "%d day ago"
|
||||||
msgid_plural "%d days ago"
|
msgid_plural "%d days ago"
|
||||||
msgstr[0] "%d dag siden"
|
msgstr[0] "%d dag siden"
|
||||||
msgstr[1] "%d dager siden"
|
msgstr[1] "%d dager siden"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1223
|
#: ../src/shell-global.c:1177
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d week ago"
|
msgid "%d week ago"
|
||||||
msgid_plural "%d weeks ago"
|
msgid_plural "%d weeks ago"
|
||||||
msgstr[0] "%d uke siden"
|
msgstr[0] "%d uke siden"
|
||||||
msgstr[1] "%d uker siden"
|
msgstr[1] "%d uker siden"
|
||||||
|
|
||||||
#: ../src/shell-uri-util.c:89
|
#: ../src/shell-util.c:89
|
||||||
msgid "Home Folder"
|
msgid "Home Folder"
|
||||||
msgstr "Hjemmemappe"
|
msgstr "Hjemmemappe"
|
||||||
|
|
||||||
#. Translators: this is the same string as the one found in
|
#. Translators: this is the same string as the one found in
|
||||||
#. * nautilus
|
#. * nautilus
|
||||||
#: ../src/shell-uri-util.c:104
|
#: ../src/shell-util.c:104
|
||||||
msgid "File System"
|
msgid "File System"
|
||||||
msgstr "Filsystem"
|
msgstr "Filsystem"
|
||||||
|
|
||||||
#: ../src/shell-uri-util.c:250
|
#: ../src/shell-util.c:250
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "Søk"
|
msgstr "Søk"
|
||||||
|
|
||||||
@ -697,7 +693,7 @@ msgstr "Søk"
|
|||||||
#. * example, "Trash: some-directory". It means that the
|
#. * example, "Trash: some-directory". It means that the
|
||||||
#. * directory called "some-directory" is in the trash.
|
#. * directory called "some-directory" is in the trash.
|
||||||
#.
|
#.
|
||||||
#: ../src/shell-uri-util.c:300
|
#: ../src/shell-util.c:300
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%1$s: %2$s"
|
msgid "%1$s: %2$s"
|
||||||
msgstr "%1$s: %2$s"
|
msgstr "%1$s: %2$s"
|
||||||
|
549
po/th.po
549
po/th.po
@ -8,8 +8,8 @@ msgstr ""
|
|||||||
"Project-Id-Version: gnome-shell master\n"
|
"Project-Id-Version: gnome-shell master\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||||
"shell&component=general\n"
|
"shell&component=general\n"
|
||||||
"POT-Creation-Date: 2010-06-13 23:04+0000\n"
|
"POT-Creation-Date: 2010-11-20 13:40+0000\n"
|
||||||
"PO-Revision-Date: 2010-06-14 20:22+0700\n"
|
"PO-Revision-Date: 2010-11-23 10:04+0700\n"
|
||||||
"Last-Translator: Sira Nokyoongtong <gumaraa@gmail.com>\n"
|
"Last-Translator: Sira Nokyoongtong <gumaraa@gmail.com>\n"
|
||||||
"Language-Team: Thai <thai-l10n@googlegroups.com>\n"
|
"Language-Team: Thai <thai-l10n@googlegroups.com>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
@ -19,11 +19,11 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||||
msgid "GNOME Shell"
|
msgid "GNOME Shell"
|
||||||
msgstr ""
|
msgstr "เชลล์ GNOME"
|
||||||
|
|
||||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||||
msgid "Window management and application launching"
|
msgid "Window management and application launching"
|
||||||
msgstr ""
|
msgstr "การจัดการหน้าต่างและการเรียกใช้โปรแกรม"
|
||||||
|
|
||||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:1
|
||||||
msgid "Clock"
|
msgid "Clock"
|
||||||
@ -33,6 +33,294 @@ msgstr "นาฬิกา"
|
|||||||
msgid "Customize the panel clock"
|
msgid "Customize the panel clock"
|
||||||
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 ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:2
|
||||||
|
msgid "Custom format of the clock"
|
||||||
|
msgstr "รูปแบบนาฬิกากำหนดเอง"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:3
|
||||||
|
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:4
|
||||||
|
msgid "File extension used for storing the screencast"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:5
|
||||||
|
msgid "Framerate used for recording screencasts."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:6
|
||||||
|
msgid ""
|
||||||
|
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
||||||
|
"should not be loaded."
|
||||||
|
msgstr ""
|
||||||
|
"ส่วนขยายต่างๆ ของเชลล์ GNOME จะมี uuid ประจำตัว ค่านี้จะเก็บรายชื่อของส่วนขยายที่จะไม่เรียกใช้"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
||||||
|
msgid "History for command (Alt-F2) dialog"
|
||||||
|
msgstr "ประวัติคำสั่งของกล่องโต้ตอบเรียกโปรแกรม (Alt-F2)"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:8
|
||||||
|
msgid "Hour format"
|
||||||
|
msgstr "รูปแบบชั่วโมง"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:9
|
||||||
|
msgid ""
|
||||||
|
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
|
||||||
|
"clock, in addition to time."
|
||||||
|
msgstr ""
|
||||||
|
"ถ้าเลือก และรูปแบบเวลาเป็น \"12-hour\" หรือ \"24-hour\" "
|
||||||
|
"ก็จะแสดงวันที่ในนาฬิกาควบคู่กับเวลาด้วย"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:10
|
||||||
|
msgid ""
|
||||||
|
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
|
||||||
|
"time."
|
||||||
|
msgstr ""
|
||||||
|
"ถ้าเลือก และรูปแบบเวลาเป็น \"12-hour\" หรือ \"24-hour\" ก็จะแสดงวินาทีในเวลาด้วย"
|
||||||
|
|
||||||
|
# See http://en.wikipedia.org/wiki/ISO_week_date
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:11
|
||||||
|
msgid "If true, display the ISO week date in the calendar."
|
||||||
|
msgstr "ถ้าเลือก จะแสดงวันที่แบบสัปดาห์ของ ISO ในปฏิทิน"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:12
|
||||||
|
msgid "List of desktop file IDs for favorite applications"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
||||||
|
msgid "Overview workspace view mode"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
||||||
|
msgid ""
|
||||||
|
"Sets the GStreamer pipeline used to encode recordings. It follows the syntax "
|
||||||
|
"used for gst-launch. The pipeline should have an unconnected sink pad where "
|
||||||
|
"the recorded video is recorded. It will normally have a unconnected source "
|
||||||
|
"pad; output from that pad will be written into the output file. However the "
|
||||||
|
"pipeline can also take care of its own output - this might be used to send "
|
||||||
|
"the output to an icecast server via shout2send or similar. When unset or set "
|
||||||
|
"to an empty value, the default pipeline will be used. This is currently "
|
||||||
|
"'videorate ! theoraenc ! oggmux' and records to Ogg Theora."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:15
|
||||||
|
msgid "Show date in clock"
|
||||||
|
msgstr "แสดงวันที่ในนาฬิกา"
|
||||||
|
|
||||||
|
# See http://en.wikipedia.org/wiki/ISO_week_date
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:16
|
||||||
|
msgid "Show the week date in the calendar"
|
||||||
|
msgstr "แสดงวันที่แบบสัปดาห์ในปฏิทิน"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:17
|
||||||
|
msgid "Show time with seconds"
|
||||||
|
msgstr "แสดงเวลาพร้อมวินาที"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:18
|
||||||
|
msgid ""
|
||||||
|
"The applications corresponding to these identifiers will be displayed in the "
|
||||||
|
"favorites area."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:19
|
||||||
|
msgid ""
|
||||||
|
"The filename for recorded screencasts will be a unique filename based on the "
|
||||||
|
"current date, and use this extension. It should be changed when recording to "
|
||||||
|
"a different container format."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
||||||
|
msgid ""
|
||||||
|
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||||
|
"screencast recorder in frames-per-second."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:21
|
||||||
|
msgid "The gstreamer pipeline used to encode the screencast"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
||||||
|
msgid ""
|
||||||
|
"The selected workspace view mode in the overview. Supported values are "
|
||||||
|
"\"single\" and \"grid\"."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:23
|
||||||
|
msgid ""
|
||||||
|
"The shell normally monitors active applications in order to present the most "
|
||||||
|
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
||||||
|
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||||
|
"remove already saved data."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:24
|
||||||
|
msgid ""
|
||||||
|
"This key specifies the format used by the panel clock when the format key is "
|
||||||
|
"set to \"custom\". You can use conversion specifiers understood by strftime"
|
||||||
|
"() to obtain a specific format. See the strftime() manual for more "
|
||||||
|
"information."
|
||||||
|
msgstr ""
|
||||||
|
"ค่านี้กำหนดรูปแบบของเวลาในแอพเพล็ตนาฬิกาเมื่อกำหนดรูปแบบเป็น \"custom\" "
|
||||||
|
"คุณสามารถใช้รหัสการแปลงของ strftime() เพื่อระบุรูปแบบที่ต้องการได้ "
|
||||||
|
"ดูข้อมูลเพิ่มเติมได้จากคู่มือของ strftime()"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:25
|
||||||
|
msgid ""
|
||||||
|
"This key specifies the hour format used by the panel clock. Possible values "
|
||||||
|
"are \"12-hour\", \"24-hour\", \"unix\" and \"custom\". If set to \"unix\", "
|
||||||
|
"the clock will display time in seconds since Epoch, i.e. 1970-01-01. If set "
|
||||||
|
"to \"custom\", the clock will display time according to the format specified "
|
||||||
|
"in the custom_format key. Note that if set to either \"unix\" or \"custom\", "
|
||||||
|
"the show_date and show_seconds keys are ignored."
|
||||||
|
msgstr ""
|
||||||
|
"ค่านี้กำหนดรูปแบบชั่วโมงที่จะใช้ในแอพเพล็ตนาฬิกา ค่าที่เป็นไปได้คือ\"12-hour\", \"24-hour\", "
|
||||||
|
"\"unix\" และ \"custom\" ถ้ากำหนดเป็น \"unix\" นาฬิกาจะแสดงเวลาเป็นวินาทีนับจาก 1970-"
|
||||||
|
"01-01 ถ้ากำหนดเป็น \"custom\" นาฬิกาจะแสดงตามรูปแบบที่กำหนดใน custom_format "
|
||||||
|
"สังเกตว่าถ้ากำหนดเป็น \"unix\" หรือ \"custom\" ค่า show_date และ show_seconds "
|
||||||
|
"ก็จะไม่มีผล"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:26
|
||||||
|
msgid "Uuids of extensions to disable"
|
||||||
|
msgstr "uuid ของส่วนขยายที่จะปิดใช้"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.shell.gschema.xml.in.h:27
|
||||||
|
msgid "Whether to collect stats about applications usage"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:1
|
||||||
|
msgid "Clip the crosshairs at the center"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:2
|
||||||
|
msgid "Color of the crosshairs"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:3
|
||||||
|
msgid ""
|
||||||
|
"Determines the length of the vertical and horizontal lines that make up the "
|
||||||
|
"crosshairs."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:4
|
||||||
|
msgid ""
|
||||||
|
"Determines the position of the magnified mouse image within the magnified "
|
||||||
|
"view and how it reacts to system mouse movement. The values are - none: no "
|
||||||
|
"mouse tracking; - centered: the mouse image is displayed at the center of "
|
||||||
|
"the zoom region (which also represents the point under the system mouse) and "
|
||||||
|
"the magnified contents are scrolled as the system mouse moves; - "
|
||||||
|
"proportional: the position of the magnified mouse in the zoom region is "
|
||||||
|
"proportionally the same as the position of the system mouse on screen; - "
|
||||||
|
"push: when the magnified mouse intersects a boundary of the zoom region, the "
|
||||||
|
"contents are scrolled into view."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:5
|
||||||
|
msgid ""
|
||||||
|
"Determines the transparency of the crosshairs, from fully opaque to fully "
|
||||||
|
"transparent."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:6
|
||||||
|
msgid ""
|
||||||
|
"Determines whether the crosshairs intersect the magnified mouse sprite, or "
|
||||||
|
"are clipped such that the ends of the horizontal and vertical lines surround "
|
||||||
|
"the mouse image."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:7
|
||||||
|
msgid "Enable lens mode"
|
||||||
|
msgstr "เปิดใช้โหมดแว่นขยาย"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:8
|
||||||
|
msgid ""
|
||||||
|
"Enables/disables display of crosshairs centered on the magnified mouse "
|
||||||
|
"sprite."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:9
|
||||||
|
msgid ""
|
||||||
|
"For centered mouse tracking, when the system pointer is at or near the edge "
|
||||||
|
"of the screen, the magnified contents continue to scroll such that the "
|
||||||
|
"screen edge moves into the magnified view."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:10
|
||||||
|
msgid "Length of the crosshairs"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:11
|
||||||
|
msgid "Magnification factor"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:12
|
||||||
|
msgid "Mouse Tracking Mode"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:13
|
||||||
|
msgid "Opacity of the crosshairs"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:14
|
||||||
|
msgid "Screen position"
|
||||||
|
msgstr "ตำแหน่งของหน้าจอ"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:15
|
||||||
|
msgid "Scroll magnified contents beyond the edges of the desktop"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:16
|
||||||
|
msgid "Show or hide crosshairs"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:17
|
||||||
|
msgid "Show or hide the magnifier"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:18
|
||||||
|
msgid "Show or hide the magnifier and all of its zoom regions."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:19
|
||||||
|
msgid ""
|
||||||
|
"The color of the the vertical and horizontal lines that make up the "
|
||||||
|
"crosshairs."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:20
|
||||||
|
msgid ""
|
||||||
|
"The magnified view either fills the entire screen, or occupies the top-half, "
|
||||||
|
"bottom-half, left-half, or right-half of the screen."
|
||||||
|
msgstr ""
|
||||||
|
"ช่องแสดงภาพขยายอาจจะใหญ่เต็มจอภาพ (full-screen) หรืออาจจะกินที่แค่ครึ่งบน (top-half) "
|
||||||
|
"ครึ่งล่าง (bottom-half) ครึ่งซ้าย (left-half) หรือครึ่งขวา (right-half)"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:21
|
||||||
|
msgid ""
|
||||||
|
"The power of the magnification. A value of 1.0 means no magnification. A "
|
||||||
|
"value of 2.0 doubles the size."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:22
|
||||||
|
msgid "Thickness of the crosshairs"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:23
|
||||||
|
msgid ""
|
||||||
|
"Whether the magnified view should be centered over the location of the "
|
||||||
|
"system mouse and move with it."
|
||||||
|
msgstr "กำหนดว่าจะให้ภาพขยายหน้าจอวางตำแหน่งกึ่งกลางที่เมาส์และเคลื่อนย้ายไปตามเมาส์หรือไม่"
|
||||||
|
|
||||||
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:24
|
||||||
|
msgid "Width of the vertical and horizontal lines that make up the crosshairs."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
#: ../data/clock-preferences.ui.h:1
|
#: ../data/clock-preferences.ui.h:1
|
||||||
msgid "Clock Format"
|
msgid "Clock Format"
|
||||||
msgstr "รูปแบบนาฬิกา"
|
msgstr "รูปแบบนาฬิกา"
|
||||||
@ -62,31 +350,31 @@ msgid "_24 hour format"
|
|||||||
msgstr "แบบ _24 ขั่วโมง"
|
msgstr "แบบ _24 ขั่วโมง"
|
||||||
|
|
||||||
#. **** Applications ****
|
#. **** Applications ****
|
||||||
#: ../js/ui/appDisplay.js:388 ../js/ui/dash.js:872
|
#: ../js/ui/appDisplay.js:316 ../js/ui/dash.js:778
|
||||||
msgid "APPLICATIONS"
|
msgid "APPLICATIONS"
|
||||||
msgstr "โปรแกรม"
|
msgstr "โปรแกรม"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:420
|
#: ../js/ui/appDisplay.js:348
|
||||||
msgid "PREFERENCES"
|
msgid "PREFERENCES"
|
||||||
msgstr "ปรับแต่ง"
|
msgstr "ปรับแต่ง"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:726
|
#: ../js/ui/appDisplay.js:647
|
||||||
msgid "New Window"
|
msgid "New Window"
|
||||||
msgstr "หน้าต่างใหม่"
|
msgstr "หน้าต่างใหม่"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:730
|
#: ../js/ui/appDisplay.js:651
|
||||||
msgid "Remove from Favorites"
|
msgid "Remove from Favorites"
|
||||||
msgstr "ลบออกจากรายการโปรด"
|
msgstr "ลบออกจากรายการโปรด"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:731
|
#: ../js/ui/appDisplay.js:652
|
||||||
msgid "Add to Favorites"
|
msgid "Add to Favorites"
|
||||||
msgstr "เพิ่มเข้าในรายการโปรด"
|
msgstr "เพิ่มเข้าในรายการโปรด"
|
||||||
|
|
||||||
#: ../js/ui/appDisplay.js:1038
|
#: ../js/ui/appDisplay.js:829
|
||||||
msgid "Drag here to add favorites"
|
msgid "Drag here to add favorites"
|
||||||
msgstr "ลากมาที่นี่เพื่อเพิ่มเป็นรายการโปรด"
|
msgstr "ลากมาที่นี่เพื่อเพิ่มเป็นรายการโปรด"
|
||||||
|
|
||||||
#: ../js/ui/appFavorites.js:89
|
#: ../js/ui/appFavorites.js:88
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s has been added to your favorites."
|
msgid "%s has been added to your favorites."
|
||||||
msgstr "%s ถูกเพิ่มเข้าในรายการโปรดของคุณแล้ว"
|
msgstr "%s ถูกเพิ่มเข้าในรายการโปรดของคุณแล้ว"
|
||||||
@ -96,233 +384,313 @@ msgstr "%s ถูกเพิ่มเข้าในรายการโปร
|
|||||||
msgid "%s has been removed from your favorites."
|
msgid "%s has been removed from your favorites."
|
||||||
msgstr "%s ถูกลบออกจากรายการโปรดของคุณแล้ว"
|
msgstr "%s ถูกลบออกจากรายการโปรดของคุณแล้ว"
|
||||||
|
|
||||||
#: ../js/ui/dash.js:204
|
#: ../js/ui/dash.js:142
|
||||||
msgid "Find"
|
msgid "Find"
|
||||||
msgstr "หา"
|
msgstr "หา"
|
||||||
|
|
||||||
#: ../js/ui/dash.js:527
|
#: ../js/ui/dash.js:473
|
||||||
msgid "Searching..."
|
msgid "Searching..."
|
||||||
msgstr "กำลังค้นหา..."
|
msgstr "กำลังค้นหา..."
|
||||||
|
|
||||||
#: ../js/ui/dash.js:541
|
#: ../js/ui/dash.js:487
|
||||||
msgid "No matching results."
|
msgid "No matching results."
|
||||||
msgstr "ไม่มีผลลัพธ์ที่ตรงกัน"
|
msgstr "ไม่มีผลลัพธ์ที่ตรงกัน"
|
||||||
|
|
||||||
#. **** Places ****
|
#. **** Places ****
|
||||||
#. Translators: This is in the sense of locations for documents,
|
#. Translators: This is in the sense of locations for documents,
|
||||||
#. network locations, etc.
|
#. network locations, etc.
|
||||||
#: ../js/ui/dash.js:891 ../js/ui/placeDisplay.js:551
|
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:558
|
||||||
msgid "PLACES & DEVICES"
|
msgid "PLACES & DEVICES"
|
||||||
msgstr ""
|
msgstr "ที่หลักๆ และอุปกรณ์"
|
||||||
|
|
||||||
#. **** Documents ****
|
#. **** Documents ****
|
||||||
#: ../js/ui/dash.js:898 ../js/ui/docDisplay.js:497
|
#: ../js/ui/dash.js:804 ../js/ui/docDisplay.js:494
|
||||||
msgid "RECENT ITEMS"
|
msgid "RECENT ITEMS"
|
||||||
msgstr ""
|
msgstr "รายการล่าสุด"
|
||||||
|
|
||||||
#: ../js/ui/lookingGlass.js:475
|
#: ../js/ui/lookingGlass.js:552
|
||||||
msgid "No extensions installed"
|
msgid "No extensions installed"
|
||||||
msgstr "ไม่มีส่วนขยายติดตั้งอยู่"
|
msgstr "ไม่มีส่วนขยายติดตั้งอยู่"
|
||||||
|
|
||||||
#: ../js/ui/lookingGlass.js:512
|
#: ../js/ui/lookingGlass.js:589
|
||||||
msgid "Enabled"
|
msgid "Enabled"
|
||||||
msgstr ""
|
msgstr "เปิดใช้งาน"
|
||||||
|
|
||||||
#: ../js/ui/lookingGlass.js:514
|
#. translators:
|
||||||
|
#. * The device has been disabled
|
||||||
|
#: ../js/ui/lookingGlass.js:591 ../src/gvc/gvc-mixer-control.c:1087
|
||||||
msgid "Disabled"
|
msgid "Disabled"
|
||||||
msgstr ""
|
msgstr "ปิดใช้"
|
||||||
|
|
||||||
#: ../js/ui/lookingGlass.js:516
|
#: ../js/ui/lookingGlass.js:593
|
||||||
msgid "Error"
|
msgid "Error"
|
||||||
msgstr "ผิดพลาด"
|
msgstr "ผิดพลาด"
|
||||||
|
|
||||||
#: ../js/ui/lookingGlass.js:518
|
#: ../js/ui/lookingGlass.js:595
|
||||||
msgid "Out of date"
|
msgid "Out of date"
|
||||||
msgstr ""
|
msgstr "ตกรุ่น"
|
||||||
|
|
||||||
#: ../js/ui/lookingGlass.js:543
|
#: ../js/ui/lookingGlass.js:620
|
||||||
msgid "View Source"
|
msgid "View Source"
|
||||||
msgstr ""
|
msgstr "ดูซอร์ส"
|
||||||
|
|
||||||
#: ../js/ui/lookingGlass.js:549
|
#: ../js/ui/lookingGlass.js:626
|
||||||
msgid "Web Page"
|
msgid "Web Page"
|
||||||
msgstr "หน้าเว็บ"
|
msgstr "หน้าเว็บ"
|
||||||
|
|
||||||
#: ../js/ui/overview.js:165
|
#: ../js/ui/overview.js:160
|
||||||
msgid "Undo"
|
msgid "Undo"
|
||||||
msgstr "เรียกคืน"
|
msgstr "เรียกคืน"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:334
|
#. TODO - _quit() doesn't really work on apps in state STARTING yet
|
||||||
|
#: ../js/ui/panel.js:470
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Quit %s"
|
msgid "Quit %s"
|
||||||
msgstr "ออกจาก %s"
|
msgstr "ออกจาก %s"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:354
|
#: ../js/ui/panel.js:495
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr "ปรับแต่ง"
|
msgstr "ปรับแต่ง"
|
||||||
|
|
||||||
#. Translators: This is the time format with date used
|
#. Translators: This is the time format with date used
|
||||||
#. in 24-hour mode.
|
#. in 24-hour mode.
|
||||||
#: ../js/ui/panel.js:441
|
#: ../js/ui/panel.js:581
|
||||||
msgid "%a %b %e, %R:%S"
|
msgid "%a %b %e, %R:%S"
|
||||||
msgstr ""
|
msgstr "%a %d %b, %R:%S"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:442
|
#: ../js/ui/panel.js:582
|
||||||
msgid "%a %b %e, %R"
|
msgid "%a %b %e, %R"
|
||||||
msgstr ""
|
msgstr "%a %d %b, %R"
|
||||||
|
|
||||||
#. Translators: This is the time format without date used
|
#. Translators: This is the time format without date used
|
||||||
#. in 24-hour mode.
|
#. in 24-hour mode.
|
||||||
#: ../js/ui/panel.js:446
|
#: ../js/ui/panel.js:586
|
||||||
msgid "%a %R:%S"
|
msgid "%a %R:%S"
|
||||||
msgstr ""
|
msgstr "%a %R:%S"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:447
|
#: ../js/ui/panel.js:587
|
||||||
msgid "%a %R"
|
msgid "%a %R"
|
||||||
msgstr ""
|
msgstr "%a %R"
|
||||||
|
|
||||||
#. Translators: This is a time format with date used
|
#. Translators: This is a time format with date used
|
||||||
#. for AM/PM.
|
#. for AM/PM.
|
||||||
#: ../js/ui/panel.js:454
|
#: ../js/ui/panel.js:594
|
||||||
msgid "%a %b %e, %l:%M:%S %p"
|
msgid "%a %b %e, %l:%M:%S %p"
|
||||||
msgstr ""
|
msgstr "%a %d %b, %l:%M:%S %p"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:455
|
#: ../js/ui/panel.js:595
|
||||||
msgid "%a %b %e, %l:%M %p"
|
msgid "%a %b %e, %l:%M %p"
|
||||||
msgstr ""
|
msgstr "%a %d %b, %l:%M %p"
|
||||||
|
|
||||||
#. Translators: This is a time format without date used
|
#. Translators: This is a time format without date used
|
||||||
#. for AM/PM.
|
#. for AM/PM.
|
||||||
#: ../js/ui/panel.js:459
|
#: ../js/ui/panel.js:599
|
||||||
msgid "%a %l:%M:%S %p"
|
msgid "%a %l:%M:%S %p"
|
||||||
msgstr ""
|
msgstr "%a %l:%M:%S %p"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:460
|
#: ../js/ui/panel.js:600
|
||||||
msgid "%a %l:%M %p"
|
msgid "%a %l:%M %p"
|
||||||
msgstr ""
|
msgstr "%a %l:%M %p"
|
||||||
|
|
||||||
#. Button on the left side of the panel.
|
#. Button on the left side of the panel.
|
||||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||||
#: ../js/ui/panel.js:562
|
#: ../js/ui/panel.js:745
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "กิจกรรม"
|
msgstr "กิจกรรม"
|
||||||
|
|
||||||
#: ../js/ui/placeDisplay.js:108
|
#: ../js/ui/placeDisplay.js:111
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to unmount '%s'"
|
msgid "Failed to unmount '%s'"
|
||||||
msgstr "เลิกเมานท์ '%s' ไม่สำเร็จ"
|
msgstr "เลิกเมานท์ '%s' ไม่สำเร็จ"
|
||||||
|
|
||||||
#: ../js/ui/placeDisplay.js:111
|
#: ../js/ui/placeDisplay.js:114
|
||||||
msgid "Retry"
|
msgid "Retry"
|
||||||
msgstr "ลองใหม่"
|
msgstr "ลองใหม่"
|
||||||
|
|
||||||
#: ../js/ui/placeDisplay.js:156
|
#: ../js/ui/placeDisplay.js:159
|
||||||
msgid "Connect to..."
|
msgid "Connect to..."
|
||||||
msgstr "เชื่อมต่อไปยัง..."
|
msgstr "เชื่อมต่อไปยัง..."
|
||||||
|
|
||||||
#: ../js/ui/runDialog.js:235
|
#. Translators: this MUST be either "toggle-switch-us"
|
||||||
|
#. (for toggle switches containing the English words
|
||||||
|
#. "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:33
|
||||||
|
msgid "toggle-switch-us"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../js/ui/runDialog.js:233
|
||||||
msgid "Please enter a command:"
|
msgid "Please enter a command:"
|
||||||
msgstr "โปรดป้อนคำสั่ง:"
|
msgstr "โปรดป้อนคำสั่ง:"
|
||||||
|
|
||||||
#: ../js/ui/runDialog.js:380
|
#: ../js/ui/runDialog.js:378
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Execution of '%s' failed:"
|
msgid "Execution of '%s' failed:"
|
||||||
msgstr ""
|
msgstr "คำสั่ง '%s' ทำงานล้มเหลว:"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:91
|
#: ../js/ui/statusMenu.js:101
|
||||||
msgid "Available"
|
msgid "Available"
|
||||||
msgstr ""
|
msgstr "อยู่"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:95
|
|
||||||
msgid "Busy"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:99
|
|
||||||
msgid "Invisible"
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:106
|
#: ../js/ui/statusMenu.js:106
|
||||||
msgid "Account Information..."
|
msgid "Busy"
|
||||||
msgstr "ข้อมูลบัญชี..."
|
msgstr "ไม่ว่าง"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:110
|
#: ../js/ui/statusMenu.js:114
|
||||||
msgid "System Preferences..."
|
msgid "My Account..."
|
||||||
msgstr "ปรับแต่งระบบ..."
|
msgstr "บัญชีของฉัน..."
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:117
|
#: ../js/ui/statusMenu.js:118
|
||||||
|
msgid "System Settings..."
|
||||||
|
msgstr "ตั้งค่าระบบ..."
|
||||||
|
|
||||||
|
#: ../js/ui/statusMenu.js:125
|
||||||
msgid "Lock Screen"
|
msgid "Lock Screen"
|
||||||
msgstr "ล็อคหน้าจอ"
|
msgstr "ล็อคหน้าจอ"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:121
|
#: ../js/ui/statusMenu.js:129
|
||||||
msgid "Switch User"
|
msgid "Switch User"
|
||||||
msgstr "สลับผู้ใช้"
|
msgstr "สลับผู้ใช้"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:126
|
#: ../js/ui/statusMenu.js:134
|
||||||
msgid "Log Out..."
|
msgid "Log Out..."
|
||||||
msgstr "ออกจากระบบ..."
|
msgstr "ออกจากระบบ..."
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:130
|
#: ../js/ui/statusMenu.js:141
|
||||||
|
msgid "Suspend"
|
||||||
|
msgstr "พักเครื่อง"
|
||||||
|
|
||||||
|
#: ../js/ui/statusMenu.js:145
|
||||||
msgid "Shut Down..."
|
msgid "Shut Down..."
|
||||||
msgstr "ปิดเครื่อง..."
|
msgstr "ปิดเครื่อง..."
|
||||||
|
|
||||||
#: ../js/ui/windowAttentionHandler.js:47
|
#: ../js/ui/status/accessibility.js:88
|
||||||
|
msgid "Screen Reader"
|
||||||
|
msgstr "โปรแกรมอ่านหน้าจอ"
|
||||||
|
|
||||||
|
#: ../js/ui/status/accessibility.js:91
|
||||||
|
msgid "Screen Keyboard"
|
||||||
|
msgstr "แป้นพิมพ์บนหน้าจอ"
|
||||||
|
|
||||||
|
#: ../js/ui/status/accessibility.js:94
|
||||||
|
msgid "Visual Alerts"
|
||||||
|
msgstr "แจ้งเหตุด้วยภาพ"
|
||||||
|
|
||||||
|
#: ../js/ui/status/accessibility.js:97
|
||||||
|
msgid "Sticky Keys"
|
||||||
|
msgstr "ค้างปุ่มกด"
|
||||||
|
|
||||||
|
#: ../js/ui/status/accessibility.js:100
|
||||||
|
msgid "Slow Keys"
|
||||||
|
msgstr "พิมพ์แบบช้า"
|
||||||
|
|
||||||
|
#: ../js/ui/status/accessibility.js:103
|
||||||
|
msgid "Bounce Keys"
|
||||||
|
msgstr "ป้องกันการกดแป้นรัว"
|
||||||
|
|
||||||
|
#: ../js/ui/status/accessibility.js:106
|
||||||
|
msgid "Mouse Keys"
|
||||||
|
msgstr "บังคับเมาส์ด้วยแป้น"
|
||||||
|
|
||||||
|
#: ../js/ui/status/accessibility.js:110
|
||||||
|
msgid "Universal Access Settings"
|
||||||
|
msgstr "ตั้งค่าสิ่งอำนวยความสะดวก"
|
||||||
|
|
||||||
|
#: ../js/ui/status/accessibility.js:163
|
||||||
|
msgid "High Contrast"
|
||||||
|
msgstr "สีตัดกัน"
|
||||||
|
|
||||||
|
#: ../js/ui/status/accessibility.js:205
|
||||||
|
msgid "Large Text"
|
||||||
|
msgstr "อักษรขนาดใหญ่"
|
||||||
|
|
||||||
|
#: ../js/ui/status/accessibility.js:224
|
||||||
|
msgid "Zoom"
|
||||||
|
msgstr "ซูม"
|
||||||
|
|
||||||
|
#: ../js/ui/windowAttentionHandler.js:43
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s has finished starting"
|
msgid "%s has finished starting"
|
||||||
msgstr ""
|
msgstr "%s เปิดเสร็จแล้ว"
|
||||||
|
|
||||||
#: ../js/ui/windowAttentionHandler.js:49
|
#: ../js/ui/windowAttentionHandler.js:45
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "'%s' is ready"
|
msgid "'%s' is ready"
|
||||||
msgstr "'%s' พร้อมแล้ว"
|
msgstr "'%s' พร้อมแล้ว"
|
||||||
|
|
||||||
#: ../js/ui/workspacesView.js:237
|
#: ../js/ui/workspacesView.js:229
|
||||||
msgid ""
|
msgid ""
|
||||||
"Can't add a new workspace because maximum workspaces limit has been reached."
|
"Can't add a new workspace because maximum workspaces limit has been reached."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
|
||||||
#: ../js/ui/workspacesView.js:254
|
#: ../js/ui/workspacesView.js:246
|
||||||
msgid "Can't remove the first workspace."
|
msgid "Can't remove the first workspace."
|
||||||
msgstr "ไม่สามารถลบพื้นที่ทำงานแรกได้"
|
msgstr "ไม่สามารถลบพื้นที่ทำงานแรกได้"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1025
|
#. translators:
|
||||||
|
#. * The number of sound outputs on a particular device
|
||||||
|
#: ../src/gvc/gvc-mixer-control.c:1094
|
||||||
|
#, c-format
|
||||||
|
msgid "%u Output"
|
||||||
|
msgid_plural "%u Outputs"
|
||||||
|
msgstr[0] ""
|
||||||
|
|
||||||
|
#. translators:
|
||||||
|
#. * The number of sound inputs on a particular device
|
||||||
|
#: ../src/gvc/gvc-mixer-control.c:1104
|
||||||
|
#, c-format
|
||||||
|
msgid "%u Input"
|
||||||
|
msgid_plural "%u Inputs"
|
||||||
|
msgstr[0] ""
|
||||||
|
|
||||||
|
#: ../src/gvc/gvc-mixer-control.c:1402
|
||||||
|
msgid "System Sounds"
|
||||||
|
msgstr "เสียงของระบบ"
|
||||||
|
|
||||||
|
#: ../src/shell-app-system.c:1012
|
||||||
|
msgid "Unknown"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: ../src/shell-global.c:1158
|
||||||
msgid "Less than a minute ago"
|
msgid "Less than a minute ago"
|
||||||
msgstr "ไม่ถึงหนึ่งนาทีก่อน"
|
msgstr "ไม่ถึงหนึ่งนาทีก่อน"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1029
|
#: ../src/shell-global.c:1162
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d minute ago"
|
msgid "%d minute ago"
|
||||||
msgid_plural "%d minutes ago"
|
msgid_plural "%d minutes ago"
|
||||||
msgstr[0] "%d นาทีก่อน"
|
msgstr[0] "%d นาทีก่อน"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1034
|
#: ../src/shell-global.c:1167
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d hour ago"
|
msgid "%d hour ago"
|
||||||
msgid_plural "%d hours ago"
|
msgid_plural "%d hours ago"
|
||||||
msgstr[0] "%d ชั่วโมงก่อน"
|
msgstr[0] "%d ชั่วโมงก่อน"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1039
|
#: ../src/shell-global.c:1172
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d day ago"
|
msgid "%d day ago"
|
||||||
msgid_plural "%d days ago"
|
msgid_plural "%d days ago"
|
||||||
msgstr[0] "%d วันก่อน"
|
msgstr[0] "%d วันก่อน"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1044
|
#: ../src/shell-global.c:1177
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d week ago"
|
msgid "%d week ago"
|
||||||
msgid_plural "%d weeks ago"
|
msgid_plural "%d weeks ago"
|
||||||
msgstr[0] "%d สัปดาห์ก่อน"
|
msgstr[0] "%d สัปดาห์ก่อน"
|
||||||
|
|
||||||
#: ../src/shell-uri-util.c:89
|
#: ../src/shell-util.c:89
|
||||||
msgid "Home Folder"
|
msgid "Home Folder"
|
||||||
msgstr "โฟลเดอร์บ้าน"
|
msgstr "โฟลเดอร์บ้าน"
|
||||||
|
|
||||||
#. Translators: this is the same string as the one found in
|
#. Translators: this is the same string as the one found in
|
||||||
#. * nautilus
|
#. * nautilus
|
||||||
#: ../src/shell-uri-util.c:104
|
#: ../src/shell-util.c:104
|
||||||
msgid "File System"
|
msgid "File System"
|
||||||
msgstr "ระบบแฟ้ม"
|
msgstr "ระบบแฟ้ม"
|
||||||
|
|
||||||
#: ../src/shell-uri-util.c:250
|
#: ../src/shell-util.c:250
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "ค้นหา"
|
msgstr "ค้นหา"
|
||||||
|
|
||||||
@ -331,7 +699,10 @@ msgstr "ค้นหา"
|
|||||||
#. * example, "Trash: some-directory". It means that the
|
#. * example, "Trash: some-directory". It means that the
|
||||||
#. * directory called "some-directory" is in the trash.
|
#. * directory called "some-directory" is in the trash.
|
||||||
#.
|
#.
|
||||||
#: ../src/shell-uri-util.c:300
|
#: ../src/shell-util.c:300
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%1$s: %2$s"
|
msgid "%1$s: %2$s"
|
||||||
msgstr ""
|
msgstr "%1$s: %2$s"
|
||||||
|
|
||||||
|
#~ msgid "Account Information..."
|
||||||
|
#~ msgstr "ข้อมูลบัญชี..."
|
||||||
|
272
po/ug.po
272
po/ug.po
@ -8,10 +8,11 @@
|
|||||||
msgid ""
|
msgid ""
|
||||||
msgstr ""
|
msgstr ""
|
||||||
"Project-Id-Version: gnome-shell\n"
|
"Project-Id-Version: gnome-shell\n"
|
||||||
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&component=general\n"
|
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
|
||||||
"POT-Creation-Date: 2010-11-11 00:43+0000\n"
|
"shell&component=general\n"
|
||||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
"POT-Creation-Date: 2010-11-25 14:32+0000\n"
|
||||||
"Last-Translator: Gheyret Kenji<gheyret@yahoo.com>\n"
|
"PO-Revision-Date: 2010-11-25 14:28+0600\n"
|
||||||
|
"Last-Translator: Sahran <sahran@live.com>\n"
|
||||||
"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
|
"Language-Team: Uyghur Computer Science Association <UKIJ@yahoogroups.com>\n"
|
||||||
"MIME-Version: 1.0\n"
|
"MIME-Version: 1.0\n"
|
||||||
"Content-Type: text/plain; charset=UTF-8\n"
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
@ -20,7 +21,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../data/gnome-shell.desktop.in.in.h:1
|
#: ../data/gnome-shell.desktop.in.in.h:1
|
||||||
msgid "GNOME Shell"
|
msgid "GNOME Shell"
|
||||||
msgstr "GNOME چاپان"
|
msgstr "GNOME Shell"
|
||||||
|
|
||||||
#: ../data/gnome-shell.desktop.in.in.h:2
|
#: ../data/gnome-shell.desktop.in.in.h:2
|
||||||
msgid "Window management and application launching"
|
msgid "Window management and application launching"
|
||||||
@ -32,7 +33,7 @@ msgstr "سائەت"
|
|||||||
|
|
||||||
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
#: ../data/gnome-shell-clock-preferences.desktop.in.in.h:2
|
||||||
msgid "Customize the panel clock"
|
msgid "Customize the panel clock"
|
||||||
msgstr "ئىختىيارىچە تاختا سائەت"
|
msgstr "تاختا سائەتنى ئۆزلەشتۈرىدۇ"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:1
|
#: ../data/org.gnome.shell.gschema.xml.in.h:1
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -42,25 +43,32 @@ msgstr "ئىچكى سازلاش ۋە كۆزىتىش قورالىنى زىيار
|
|||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:2
|
#: ../data/org.gnome.shell.gschema.xml.in.h:2
|
||||||
msgid "Custom format of the clock"
|
msgid "Custom format of the clock"
|
||||||
msgstr "ئىختىيارىي سائەت فورماتى"
|
msgstr "سائەتنىڭ ئىختىيارىي فورماتى"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:3
|
#: ../data/org.gnome.shell.gschema.xml.in.h:3
|
||||||
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
msgid "Enable internal tools useful for developers and testers from Alt-F2"
|
||||||
msgstr "ئىچكى قورال قوزغىتىلسا ئىجادكارلار ۋە سىنىغۇچىلارنىڭ Alt-F2 ئارقىلىق كىرىشىگە قۇلايلىق"
|
msgstr ""
|
||||||
|
"ئىچكى قورال قوزغىتىلسا ئىجادكارلار ۋە سىنىغۇچىلارنىڭ Alt-F2 ئارقىلىق "
|
||||||
|
"كىرىشىگە قۇلايلىق"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:4
|
#: ../data/org.gnome.shell.gschema.xml.in.h:4
|
||||||
msgid "File extension used for storing the screencast"
|
msgid "File extension used for storing the screencast"
|
||||||
msgstr "ھۆججەت كېڭەيتىلگەن ئاتى ئېكران كەسمىسى (screencasts) ساقلاشقا ئىشلىتىلىدۇ"
|
msgstr ""
|
||||||
|
"ئېكران كەسمىسى (screencasts) ساقلاشتا ئىشلىتىلىدىغان ھۆججەتنىڭ كېڭەيتىلگەن "
|
||||||
|
"ئاتى "
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:5
|
#: ../data/org.gnome.shell.gschema.xml.in.h:5
|
||||||
msgid "Framerate used for recording screencasts."
|
msgid "Framerate used for recording screencasts."
|
||||||
msgstr "كاندۇك نىسبىتى ئېكران كەسمىسى (screencasts) خاتىرىلەشكە ئىشلىتىلىدۇ"
|
msgstr ""
|
||||||
|
"ئېكران كەسمىسى (screencasts) خاتىرىلەشتە ئىشلىتىلىدىغان كاندۇك تېزلىكى."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:6
|
#: ../data/org.gnome.shell.gschema.xml.in.h:6
|
||||||
msgid ""
|
msgid ""
|
||||||
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
"GNOME Shell extensions have a uuid property; this key lists extensions which "
|
||||||
"should not be loaded."
|
"should not be loaded."
|
||||||
msgstr "GNOME چاپان (Shell)كېڭەيتىلمىسىنىڭ uuid خاسلىقى بار؛ بۇ كۇنۇپكا يۈكلەنمەيدىغان كېڭەيتىلمىلەر تىزىملىكىنى كۆرسىتىدۇ."
|
msgstr ""
|
||||||
|
"GNOME چاپان (Shell)كېڭەيتىلمىسىنىڭ uuid خاسلىقى بار؛ بۇ كۇنۇپكا "
|
||||||
|
"يۈكلەنمەيدىغان كېڭەيتىلمىلەر تىزىملىكىنى كۆرسىتىدۇ."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
#: ../data/org.gnome.shell.gschema.xml.in.h:7
|
||||||
msgid "History for command (Alt-F2) dialog"
|
msgid "History for command (Alt-F2) dialog"
|
||||||
@ -74,13 +82,17 @@ msgstr "سائەت فورماتى"
|
|||||||
msgid ""
|
msgid ""
|
||||||
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
|
"If true and format is either \"12-hour\" or \"24-hour\", display date in the "
|
||||||
"clock, in addition to time."
|
"clock, in addition to time."
|
||||||
msgstr "ئەگەر راست (true) بولسا سائەتتە ۋاقىت فورماتىنى «12 سائەت» ياكى «24 سائەت» كۆرسەتكەندىن سىرت چېسلانىمۇ كۆرسىتىدۇ."
|
msgstr ""
|
||||||
|
"ئەگەر راست (true) بولسا سائەتتە ۋاقىت فورماتىنى «12 سائەت» ياكى «24 سائەت» "
|
||||||
|
"كۆرسەتكەندىن سىرت چېسلانىمۇ كۆرسىتىدۇ."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:10
|
#: ../data/org.gnome.shell.gschema.xml.in.h:10
|
||||||
msgid ""
|
msgid ""
|
||||||
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
|
"If true and format is either \"12-hour\" or \"24-hour\", display seconds in "
|
||||||
"time."
|
"time."
|
||||||
msgstr "ئەگەر راست (true) بولسا سائەتتە ۋاقىت فورماتىنى «12 سائەت» ياكى «24 سائەت» كۆرسەتكەندىن سىرت سېكۇنتنىمۇ كۆرسىتىدۇ."
|
msgstr ""
|
||||||
|
"ئەگەر راست (true) بولسا سائەتتە ۋاقىت فورماتىنى «12 سائەت» ياكى «24 سائەت» "
|
||||||
|
"كۆرسەتكەندىن سىرت سېكۇنتنىمۇ كۆرسىتىدۇ. "
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:11
|
#: ../data/org.gnome.shell.gschema.xml.in.h:11
|
||||||
msgid "If true, display the ISO week date in the calendar."
|
msgid "If true, display the ISO week date in the calendar."
|
||||||
@ -88,11 +100,11 @@ msgstr "ئەگەر راست(true) بولسا يىلنامىدىكى ISO ھەپت
|
|||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:12
|
#: ../data/org.gnome.shell.gschema.xml.in.h:12
|
||||||
msgid "List of desktop file IDs for favorite applications"
|
msgid "List of desktop file IDs for favorite applications"
|
||||||
msgstr "ئامراق پروگراممىلارنىڭ ئۈستەل ئۈستى ھۆججەت ID تىزىملىكى"
|
msgstr "ئامراق قوللىنىشچان پروگراممىلارنىڭ ئۈستەل ئۈستى ھۆججەت ID تىزىملىكى"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
#: ../data/org.gnome.shell.gschema.xml.in.h:13
|
||||||
msgid "Overview workspace view mode"
|
msgid "Overview workspace view mode"
|
||||||
msgstr "قىسقىچە بايان خىزمەت رايون كۆرۈنۈش ھالىتى"
|
msgstr "خىزمەت رايون كۆرۈنۈش ھالىتى ھەققىدە قىسقىچە بايان"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
#: ../data/org.gnome.shell.gschema.xml.in.h:14
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -105,6 +117,16 @@ msgid ""
|
|||||||
"to an empty value, the default pipeline will be used. This is currently "
|
"to an empty value, the default pipeline will be used. This is currently "
|
||||||
"'videorate ! theoraenc ! oggmux' and records to Ogg Theora."
|
"'videorate ! theoraenc ! oggmux' and records to Ogg Theora."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"ئۈن ئېلىشنى كودلاشتا ئىشلىتىلىدىغان GStreamer ئاقما لىنىيىنى تەڭشەيدۇ. ئۇ "
|
||||||
|
"gst-launch گرامماتىكىسىغا بوي سۇنىدۇ. بۇ ئاقما لىنىيىدە ئۇلانمىغان sink pad "
|
||||||
|
"بولۇشى لازىم، خاتىرىلىنىدىغان سىن مۇشۇ جايدا خاتىرىلىنىدۇ. بۇ لىنىيىدە "
|
||||||
|
"ئادەتتە يەنە بىر ئۇلانمىغان مەنبە pad بولىدۇ؛ بۇ pad چىقارغان ئۇچۇرلار "
|
||||||
|
"ھۆججەتكە يېزىلىدۇ. ئەمما ئاقما لىنىيە ئۆزىنىڭ چىقىرىشىنى بىر تەرەپ "
|
||||||
|
"قىلالايدۇ، بۇنداق بولغاندا shout2send ئارقىلىق ياكى شۇنىڭغا ئوخشاش ئۇسۇلدا "
|
||||||
|
"چىقىرىشنى icecast مۇلازىمېتىرىغا يوللايدۇ. ئاقما لىنىيە تەڭشەلمىگەن ياكى بوش "
|
||||||
|
"قىممەتكە تەڭشەلگەندە كۆڭۈلدىكى ئاقما لىنىيە قوزغىتىلىدۇ. ئۇنىڭ نۆۋەتتىكى "
|
||||||
|
"قىممىتى 'videorate ! theoraenc ! oggmux' بولۇپ، فورماتى Ogg شەكلىدە "
|
||||||
|
"خاتىرىلىنىدۇ."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:15
|
#: ../data/org.gnome.shell.gschema.xml.in.h:15
|
||||||
msgid "Show date in clock"
|
msgid "Show date in clock"
|
||||||
@ -112,7 +134,7 @@ msgstr "سائەت ئىچىدە چېسلا كۆرسەت"
|
|||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:16
|
#: ../data/org.gnome.shell.gschema.xml.in.h:16
|
||||||
msgid "Show the week date in the calendar"
|
msgid "Show the week date in the calendar"
|
||||||
msgstr "يىلنامىدە ھەپتە كۆرسەت"
|
msgstr "يىلنامىدە ھەپتىنى كۆرسىتىدۇ"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:17
|
#: ../data/org.gnome.shell.gschema.xml.in.h:17
|
||||||
msgid "Show time with seconds"
|
msgid "Show time with seconds"
|
||||||
@ -129,23 +151,30 @@ msgid ""
|
|||||||
"The filename for recorded screencasts will be a unique filename based on the "
|
"The filename for recorded screencasts will be a unique filename based on the "
|
||||||
"current date, and use this extension. It should be changed when recording to "
|
"current date, and use this extension. It should be changed when recording to "
|
||||||
"a different container format."
|
"a different container format."
|
||||||
msgstr "خاتىرىلەنگەن ئېكراننىڭ ھۆججەت ئاتى نۆۋەتتىكى چېسلا ئاساسىدا بىردىنبىر بولۇپ بۇ كېڭەيتىلگەن ئاتىنى ئىشلىتىدۇ. ئۇ ئۆزگەرسە ئوخشاش بولمىغان قاچا فورماتىدا خاتىرىلەيدۇ."
|
msgstr ""
|
||||||
|
"خاتىرىلەنگەن ئېكراننىڭ ھۆججەت ئاتى نۆۋەتتىكى چېسلا ئاساسىدا بىردىنبىر بولۇپ "
|
||||||
|
"بۇ كېڭەيتىلگەن ئاتىنى ئىشلىتىدۇ. ئۇ ئۆزگەرسە ئوخشاش بولمىغان قاچا فورماتىدا "
|
||||||
|
"خاتىرىلەيدۇ."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
#: ../data/org.gnome.shell.gschema.xml.in.h:20
|
||||||
msgid ""
|
msgid ""
|
||||||
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
"The framerate of the resulting screencast recordered by GNOME Shell's "
|
||||||
"screencast recorder in frames-per-second."
|
"screencast recorder in frames-per-second."
|
||||||
msgstr "GNOME Shell ئېكران خاتىرىلىگۈچ ھەر سېكۇنتتا خاتىرىلەيدىغان ئېكران كەسمىسى كاندۇك نىسبىتى"
|
msgstr ""
|
||||||
|
"GNOME Shell ئېكران خاتىرىلىگۈچ ھەر سېكۇنتتا خاتىرىلەيدىغان ئېكران كەسمىسى "
|
||||||
|
"كاندۇك سۈرىتى(ھەر سېكۇنتتىكى كاندۇك سانى)."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:21
|
#: ../data/org.gnome.shell.gschema.xml.in.h:21
|
||||||
msgid "The gstreamer pipeline used to encode the screencast"
|
msgid "The gstreamer pipeline used to encode the screencast"
|
||||||
msgstr ""
|
msgstr "ئېكران كەسمىسىنى كودلاشتا ئىشلىتىلىدىغان gstreamer ئاقما لىنىيىسى"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
#: ../data/org.gnome.shell.gschema.xml.in.h:22
|
||||||
msgid ""
|
msgid ""
|
||||||
"The selected workspace view mode in the overview. Supported values are "
|
"The selected workspace view mode in the overview. Supported values are "
|
||||||
"\"single\" and \"grid\"."
|
"\"single\" and \"grid\"."
|
||||||
msgstr "تاللانغان قىسقىچە مەزمۇن خىزمەت رايونى كۆرۈنۈشىدە قوللايدىغان قىممەت «يەككە» ۋە «سېتكا»"
|
msgstr ""
|
||||||
|
"قىسقىچە باياندىكى تاللانغان خىزمەت رايونىنىڭ كۆرۈنۈش ھالىتى. ئىشلىتىشكە "
|
||||||
|
"بولىدىغان قىممەتلەر «يەككە» ۋە «سېتكا»"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:23
|
#: ../data/org.gnome.shell.gschema.xml.in.h:23
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -153,7 +182,11 @@ msgid ""
|
|||||||
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
"used ones (e.g. in launchers). While this data will be kept private, you may "
|
||||||
"want to disable this for privacy reasons. Please note that doing so won't "
|
"want to disable this for privacy reasons. Please note that doing so won't "
|
||||||
"remove already saved data."
|
"remove already saved data."
|
||||||
msgstr "چاپان (shell) ئادەتتىكى ئەھۋالدا كۆپ ئىشلىتىلىدىغان ئاكتىپ پروگراممىلار(مەسىلەن، ئىجرا قىلىنىۋاتقان)نى كۆزىتىدۇ. گەرچە بۇ سانلىق مەلۇماتلار مەخپىي ساقلانسىمۇ، شەخسىي سىر سەۋەبىدىن بۇنى چەكلىشىڭىز مۇمكىن. دىققەت بۇنداق قىلغاندا ئاللىبۇرۇن ساقلانغان سانلىق مەلۇماتلار چىقىرىۋېتىلمەيدۇ."
|
msgstr ""
|
||||||
|
"چاپان (shell) ئادەتتىكى ئەھۋالدا كۆپ ئىشلىتىلىدىغان ئاكتىپ پروگراممىلار"
|
||||||
|
"(مەسىلەن، ئىجرا قىلىنىۋاتقان)نى كۆزىتىدۇ. گەرچە بۇ سانلىق مەلۇماتلار مەخپىي "
|
||||||
|
"ساقلانسىمۇ، شەخسىي سىر سەۋەبىدىن بۇنى چەكلىشىڭىز مۇمكىن. دىققەت بۇنداق "
|
||||||
|
"قىلغاندا ئاللىبۇرۇن ساقلانغان سانلىق مەلۇماتلار چىقىرىۋېتىلمەيدۇ."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:24
|
#: ../data/org.gnome.shell.gschema.xml.in.h:24
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -161,7 +194,11 @@ msgid ""
|
|||||||
"set to \"custom\". You can use conversion specifiers understood by strftime"
|
"set to \"custom\". You can use conversion specifiers understood by strftime"
|
||||||
"() to obtain a specific format. See the strftime() manual for more "
|
"() to obtain a specific format. See the strftime() manual for more "
|
||||||
"information."
|
"information."
|
||||||
msgstr "format (فورمات) كۇنۇپكىسى \"custom\" (ئىختىيارى) قىلىپ تەڭشەلسە بۇ كۇنۇپكا تاختا سائەت ئىشلىتىدىغان فورماتنى بەلگىلەيدۇ. سىز strftime()نىڭ فورمات بەلگىسىنى ئىشلىتىپ بەلگىلەنگەن فورماتقا ئېرىشەلەيسىز. تەپسىلاتىنى strftime() نىڭ قوللانمىسىدىن كۆرۈڭ."
|
msgstr ""
|
||||||
|
"format (فورمات) كۇنۇپكىسى \"custom\" (ئىختىيارى) قىلىپ تەڭشەلسە بۇ كۇنۇپكا "
|
||||||
|
"تاختا سائەت ئىشلىتىدىغان فورماتنى بەلگىلەيدۇ. سىز strftime()نىڭ فورمات "
|
||||||
|
"بەلگىسىنى ئىشلىتىپ بەلگىلەنگەن فورماتقا ئېرىشەلەيسىز. تەپسىلاتىنى strftime() "
|
||||||
|
"نىڭ قوللانمىسىدىن كۆرۈڭ."
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:25
|
#: ../data/org.gnome.shell.gschema.xml.in.h:25
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -171,11 +208,18 @@ msgid ""
|
|||||||
"to \"custom\", the clock will display time according to the format specified "
|
"to \"custom\", the clock will display time according to the format specified "
|
||||||
"in the custom_format key. Note that if set to either \"unix\" or \"custom\", "
|
"in the custom_format key. Note that if set to either \"unix\" or \"custom\", "
|
||||||
"the show_date and show_seconds keys are ignored."
|
"the show_date and show_seconds keys are ignored."
|
||||||
msgstr "بۇ كۇنۇپكا تاختا سائەت ئىشلەتكەن سائەت فورماتىنى بەلگىلىگەن. ئىشلەتكىلى بولىدىغان قىممىتى \"12-hour\" يەنى (12 سائەت)، \"24-hour\" يەنى (24 سائەت)، \"unix\" ۋە \"custom\" (ئىختىيارى). ئەگەر \"unix\" قىلىپ تەڭشەلسە سائەت ئۆزلۈكىدىن يېڭى ئېرا (يەنى، 1970-01-01) دىن ئۆتكەن سېكۇنتنى ئاساس قىلىدۇ. ئەگەر \"custom\" قىلىپ تەڭشەلسە سائەت custom_format كۇنۇپكا قىممىتىگە ئاساسەن ۋاقىتنى كۆرسىتىدۇ. ئەگەر \"unix\" ياكى \"custom\" قىلىپ تەڭشەلسە show_date ۋە show_seconds قىممىتىگە پەرۋا قىلمايدۇ"
|
msgstr ""
|
||||||
|
"بۇ كۇنۇپكا تاختا سائەت ئىشلەتكەن سائەت فورماتىنى بەلگىلىگەن. ئىشلەتكىلى "
|
||||||
|
"بولىدىغان قىممىتى \"12-hour\" يەنى (12 سائەت)، \"24-hour\" يەنى (24 سائەت)، "
|
||||||
|
"\"unix\" ۋە \"custom\" (ئىختىيارى). ئەگەر \"unix\" قىلىپ تەڭشەلسە سائەت "
|
||||||
|
"ئۆزلۈكىدىن يېڭى ئېرا (يەنى، 1970-01-01) دىن ئۆتكەن سېكۇنتنى ئاساس قىلىدۇ. "
|
||||||
|
"ئەگەر \"custom\" قىلىپ تەڭشەلسە سائەت custom_format كۇنۇپكا قىممىتىگە "
|
||||||
|
"ئاساسەن ۋاقىتنى كۆرسىتىدۇ. ئەگەر \"unix\" ياكى \"custom\" قىلىپ تەڭشەلسە "
|
||||||
|
"show_date ۋە show_seconds قىممىتىگە پەرۋا قىلمايدۇ"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:26
|
#: ../data/org.gnome.shell.gschema.xml.in.h:26
|
||||||
msgid "Uuids of extensions to disable"
|
msgid "Uuids of extensions to disable"
|
||||||
msgstr "كېڭەيتىلمىنىڭ Uuid چەكلەندى"
|
msgstr "چەكلىنىدىغان كېڭەيتىلمىنىڭ Uuid سى"
|
||||||
|
|
||||||
#: ../data/org.gnome.shell.gschema.xml.in.h:27
|
#: ../data/org.gnome.shell.gschema.xml.in.h:27
|
||||||
msgid "Whether to collect stats about applications usage"
|
msgid "Whether to collect stats about applications usage"
|
||||||
@ -183,17 +227,18 @@ msgstr "پروگراممىنىڭ ئىشلىتىلىشى ھەققىدىكى ست
|
|||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:1
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:1
|
||||||
msgid "Clip the crosshairs at the center"
|
msgid "Clip the crosshairs at the center"
|
||||||
msgstr ""
|
msgstr "نىشانلىغۇچنى ئوتتۇرىغا توغرىلا"
|
||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:2
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:2
|
||||||
msgid "Color of the crosshairs"
|
msgid "Color of the crosshairs"
|
||||||
msgstr ""
|
msgstr "نىشانلىغۇچنىڭ رەڭگى"
|
||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:3
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:3
|
||||||
msgid ""
|
msgid ""
|
||||||
"Determines the length of the vertical and horizontal lines that make up the "
|
"Determines the length of the vertical and horizontal lines that make up the "
|
||||||
"crosshairs."
|
"crosshairs."
|
||||||
msgstr ""
|
msgstr ""
|
||||||
|
"نىشانلىغۇچنى ھاسىل قىلىدىغان توغرا ۋە بوي سىزىقنىڭ ئۇزۇنلۇقى بەلگىلىنىدۇ."
|
||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:4
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:4
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -212,7 +257,7 @@ msgstr ""
|
|||||||
msgid ""
|
msgid ""
|
||||||
"Determines the transparency of the crosshairs, from fully opaque to fully "
|
"Determines the transparency of the crosshairs, from fully opaque to fully "
|
||||||
"transparent."
|
"transparent."
|
||||||
msgstr ""
|
msgstr "نىشانلىغۇچنىڭ سۈزۈكلۈكى تولۇق سۈزۈكتىن تولۇق تۇتۇققىچە بەلگىلىنىدۇ."
|
||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:6
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:6
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -223,7 +268,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:7
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:7
|
||||||
msgid "Enable lens mode"
|
msgid "Enable lens mode"
|
||||||
msgstr ""
|
msgstr "لېنزا ھالىتىنى قوزغات"
|
||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:8
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:8
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -240,19 +285,19 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:10
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:10
|
||||||
msgid "Length of the crosshairs"
|
msgid "Length of the crosshairs"
|
||||||
msgstr ""
|
msgstr "نىشانلىغۇچنىڭ ئېگىزلىكى"
|
||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:11
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:11
|
||||||
msgid "Magnification factor"
|
msgid "Magnification factor"
|
||||||
msgstr ""
|
msgstr "چوڭايتىش-كىچىكلىتىش نىسبىتى"
|
||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:12
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:12
|
||||||
msgid "Mouse Tracking Mode"
|
msgid "Mouse Tracking Mode"
|
||||||
msgstr ""
|
msgstr "چاشقىنەك ئىزلاش ھالىتى"
|
||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:13
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:13
|
||||||
msgid "Opacity of the crosshairs"
|
msgid "Opacity of the crosshairs"
|
||||||
msgstr ""
|
msgstr "نىشانلىغۇچنىڭ سۈزۈكلۈكى"
|
||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:14
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:14
|
||||||
msgid "Screen position"
|
msgid "Screen position"
|
||||||
@ -264,21 +309,21 @@ msgstr "دومىلىما چوڭايتقۇچ ئۈستەل ئۈستى گىرۋەك
|
|||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:16
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:16
|
||||||
msgid "Show or hide crosshairs"
|
msgid "Show or hide crosshairs"
|
||||||
msgstr ""
|
msgstr "نىشانلىغۇچنى كۆرسەت ياكى يوشۇر"
|
||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:17
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:17
|
||||||
msgid "Show or hide the magnifier"
|
msgid "Show or hide the magnifier"
|
||||||
msgstr ""
|
msgstr "لوپا ئەينەكنى كۆرسەت ياكى يوشۇر"
|
||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:18
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:18
|
||||||
msgid "Show or hide the magnifier and all of its zoom regions."
|
msgid "Show or hide the magnifier and all of its zoom regions."
|
||||||
msgstr ""
|
msgstr "لوپا ئەينەك ۋە ئۇنىڭ ھەممە چوڭايتىش دائىرىسىنى كۆرسەت ياكى يوشۇرىدۇ."
|
||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:19
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:19
|
||||||
msgid ""
|
msgid ""
|
||||||
"The color of the the vertical and horizontal lines that make up the "
|
"The color of the the vertical and horizontal lines that make up the "
|
||||||
"crosshairs."
|
"crosshairs."
|
||||||
msgstr ""
|
msgstr "نىشانلىغۇچنى ھاسىل قىلىدىغان توغرا ۋە بوي سىزىقنىڭ رەڭگى."
|
||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:20
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:20
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -290,11 +335,11 @@ msgstr ""
|
|||||||
msgid ""
|
msgid ""
|
||||||
"The power of the magnification. A value of 1.0 means no magnification. A "
|
"The power of the magnification. A value of 1.0 means no magnification. A "
|
||||||
"value of 2.0 doubles the size."
|
"value of 2.0 doubles the size."
|
||||||
msgstr ""
|
msgstr "چوڭايتىش كۈچى. 1.0 چوڭايتمايدۇ، 2.0 چوڭلۇقىنى ھەسسىلەيدۇ دېگەن مەنىدە."
|
||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:22
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:22
|
||||||
msgid "Thickness of the crosshairs"
|
msgid "Thickness of the crosshairs"
|
||||||
msgstr ""
|
msgstr "نىشانلىغۇچنىڭ قېلىنلىقى"
|
||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:23
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:23
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -304,7 +349,7 @@ msgstr ""
|
|||||||
|
|
||||||
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:24
|
#: ../data/org.gnome.accessibility.magnifier.gschema.xml.in.h:24
|
||||||
msgid "Width of the vertical and horizontal lines that make up the crosshairs."
|
msgid "Width of the vertical and horizontal lines that make up the crosshairs."
|
||||||
msgstr ""
|
msgstr "نىشانلىغۇچنى ھاسىل قىلىدىغان توغرا ۋە بوي سىزىقنىڭ كەڭلىكى."
|
||||||
|
|
||||||
#: ../data/clock-preferences.ui.h:1
|
#: ../data/clock-preferences.ui.h:1
|
||||||
msgid "Clock Format"
|
msgid "Clock Format"
|
||||||
@ -316,11 +361,11 @@ msgstr "سائەت مايىللىقى"
|
|||||||
|
|
||||||
#: ../data/clock-preferences.ui.h:3
|
#: ../data/clock-preferences.ui.h:3
|
||||||
msgid "Panel Display"
|
msgid "Panel Display"
|
||||||
msgstr "تاختا كۆرسەت"
|
msgstr "تاختا كۆرسىتىش"
|
||||||
|
|
||||||
#: ../data/clock-preferences.ui.h:4
|
#: ../data/clock-preferences.ui.h:4
|
||||||
msgid "Show seco_nds"
|
msgid "Show seco_nds"
|
||||||
msgstr "سېكۇنت كۆرسەت(_N)"
|
msgstr "سېكۇنتنى كۆرسەت(_N)"
|
||||||
|
|
||||||
#: ../data/clock-preferences.ui.h:5
|
#: ../data/clock-preferences.ui.h:5
|
||||||
msgid "Show the _date"
|
msgid "Show the _date"
|
||||||
@ -357,12 +402,12 @@ msgstr "يىغقۇچقا قوش"
|
|||||||
|
|
||||||
#: ../js/ui/appDisplay.js:829
|
#: ../js/ui/appDisplay.js:829
|
||||||
msgid "Drag here to add favorites"
|
msgid "Drag here to add favorites"
|
||||||
msgstr "بۇ جايغا سۆرەپ قىسقۇچقا قوش"
|
msgstr "بۇ جايغا سۆرەپ يىغقۇچقا قوش"
|
||||||
|
|
||||||
#: ../js/ui/appFavorites.js:88
|
#: ../js/ui/appFavorites.js:88
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%s has been added to your favorites."
|
msgid "%s has been added to your favorites."
|
||||||
msgstr "%s يىغقۇچىڭىزغا قوشۇلىدۇ."
|
msgstr "%s يىغقۇچىڭىزغا قوشۇلدى."
|
||||||
|
|
||||||
#: ../js/ui/appFavorites.js:107
|
#: ../js/ui/appFavorites.js:107
|
||||||
#, c-format
|
#, c-format
|
||||||
@ -375,7 +420,7 @@ msgstr "ئىزدە"
|
|||||||
|
|
||||||
#: ../js/ui/dash.js:473
|
#: ../js/ui/dash.js:473
|
||||||
msgid "Searching..."
|
msgid "Searching..."
|
||||||
msgstr "ئىزدەۋاتىدۇ…"
|
msgstr "ئىزدەۋاتىدۇ..."
|
||||||
|
|
||||||
#: ../js/ui/dash.js:487
|
#: ../js/ui/dash.js:487
|
||||||
msgid "No matching results."
|
msgid "No matching results."
|
||||||
@ -384,7 +429,7 @@ msgstr "ماس كېلىدىغان نەتىجە يوق."
|
|||||||
#. **** Places ****
|
#. **** Places ****
|
||||||
#. Translators: This is in the sense of locations for documents,
|
#. Translators: This is in the sense of locations for documents,
|
||||||
#. network locations, etc.
|
#. network locations, etc.
|
||||||
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:554
|
#: ../js/ui/dash.js:797 ../js/ui/placeDisplay.js:558
|
||||||
msgid "PLACES & DEVICES"
|
msgid "PLACES & DEVICES"
|
||||||
msgstr "ئورۇن ۋە ئۈسكۈنىلەر"
|
msgstr "ئورۇن ۋە ئۈسكۈنىلەر"
|
||||||
|
|
||||||
@ -428,65 +473,65 @@ msgid "Undo"
|
|||||||
msgstr "يېنىۋال"
|
msgstr "يېنىۋال"
|
||||||
|
|
||||||
#. TODO - _quit() doesn't really work on apps in state STARTING yet
|
#. TODO - _quit() doesn't really work on apps in state STARTING yet
|
||||||
#: ../js/ui/panel.js:469
|
#: ../js/ui/panel.js:470
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Quit %s"
|
msgid "Quit %s"
|
||||||
msgstr "%s چېكىن"
|
msgstr "%s چېكىن"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:494
|
#: ../js/ui/panel.js:495
|
||||||
msgid "Preferences"
|
msgid "Preferences"
|
||||||
msgstr "مايىللىق"
|
msgstr "مايىللىق"
|
||||||
|
|
||||||
#. Translators: This is the time format with date used
|
#. Translators: This is the time format with date used
|
||||||
#. in 24-hour mode.
|
#. in 24-hour mode.
|
||||||
#: ../js/ui/panel.js:580
|
#: ../js/ui/panel.js:581
|
||||||
msgid "%a %b %e, %R:%S"
|
msgid "%a %b %e, %R:%S"
|
||||||
msgstr "%a %b %e، %R:%S"
|
msgstr "%a %b %e، %R:%S"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:581
|
#: ../js/ui/panel.js:582
|
||||||
msgid "%a %b %e, %R"
|
msgid "%a %b %e, %R"
|
||||||
msgstr "%a %b %e، %R"
|
msgstr "%a %b %e، %R"
|
||||||
|
|
||||||
#. Translators: This is the time format without date used
|
#. Translators: This is the time format without date used
|
||||||
#. in 24-hour mode.
|
#. in 24-hour mode.
|
||||||
#: ../js/ui/panel.js:585
|
#: ../js/ui/panel.js:586
|
||||||
msgid "%a %R:%S"
|
msgid "%a %R:%S"
|
||||||
msgstr "%a %R:%S"
|
msgstr "%a %R:%S"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:586
|
#: ../js/ui/panel.js:587
|
||||||
msgid "%a %R"
|
msgid "%a %R"
|
||||||
msgstr "%a %R"
|
msgstr "%a %R"
|
||||||
|
|
||||||
#. Translators: This is a time format with date used
|
#. Translators: This is a time format with date used
|
||||||
#. for AM/PM.
|
#. for AM/PM.
|
||||||
#: ../js/ui/panel.js:593
|
|
||||||
msgid "%a %b %e, %l:%M:%S %p"
|
|
||||||
msgstr "%a %b %e, %l:%M:%S %p"
|
|
||||||
|
|
||||||
#: ../js/ui/panel.js:594
|
#: ../js/ui/panel.js:594
|
||||||
|
msgid "%a %b %e, %l:%M:%S %p"
|
||||||
|
msgstr "%a %b %e، %l:%M:%S %p"
|
||||||
|
|
||||||
|
#: ../js/ui/panel.js:595
|
||||||
msgid "%a %b %e, %l:%M %p"
|
msgid "%a %b %e, %l:%M %p"
|
||||||
msgstr "%a %b %e, %l:%M %p"
|
msgstr "%a %b %e، %l:%M %p"
|
||||||
|
|
||||||
#. Translators: This is a time format without date used
|
#. Translators: This is a time format without date used
|
||||||
#. for AM/PM.
|
#. for AM/PM.
|
||||||
#: ../js/ui/panel.js:598
|
#: ../js/ui/panel.js:599
|
||||||
msgid "%a %l:%M:%S %p"
|
msgid "%a %l:%M:%S %p"
|
||||||
msgstr "%a %l:%M:%S %p"
|
msgstr "%a %l:%M:%S %p"
|
||||||
|
|
||||||
#: ../js/ui/panel.js:599
|
#: ../js/ui/panel.js:600
|
||||||
msgid "%a %l:%M %p"
|
msgid "%a %l:%M %p"
|
||||||
msgstr "%p%l:%M (%a)"
|
msgstr "%p%l:%M (%a)"
|
||||||
|
|
||||||
#. Button on the left side of the panel.
|
#. Button on the left side of the panel.
|
||||||
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
#. Translators: If there is no suitable word for "Activities" in your language, you can use the word for "Overview".
|
||||||
#: ../js/ui/panel.js:744
|
#: ../js/ui/panel.js:745
|
||||||
msgid "Activities"
|
msgid "Activities"
|
||||||
msgstr "ھەرىكەتچان"
|
msgstr "پائالىيەتلەر"
|
||||||
|
|
||||||
#: ../js/ui/placeDisplay.js:111
|
#: ../js/ui/placeDisplay.js:111
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Failed to unmount '%s'"
|
msgid "Failed to unmount '%s'"
|
||||||
msgstr "%s نىڭ ئېگەرنى يېشىش مەغلۇپ بولدى."
|
msgstr "«%s» نى ئېگەرسىزلەش مەغلۇپ بولدى"
|
||||||
|
|
||||||
#: ../js/ui/placeDisplay.js:114
|
#: ../js/ui/placeDisplay.js:114
|
||||||
msgid "Retry"
|
msgid "Retry"
|
||||||
@ -494,7 +539,7 @@ msgstr "قايتا سىنا"
|
|||||||
|
|
||||||
#: ../js/ui/placeDisplay.js:159
|
#: ../js/ui/placeDisplay.js:159
|
||||||
msgid "Connect to..."
|
msgid "Connect to..."
|
||||||
msgstr "باغلانماق..."
|
msgstr "باغلىنىش…"
|
||||||
|
|
||||||
#. Translators: this MUST be either "toggle-switch-us"
|
#. Translators: this MUST be either "toggle-switch-us"
|
||||||
#. (for toggle switches containing the English words
|
#. (for toggle switches containing the English words
|
||||||
@ -503,7 +548,7 @@ msgstr "باغلانماق..."
|
|||||||
#. simply result in invisible toggle switches.
|
#. simply result in invisible toggle switches.
|
||||||
#: ../js/ui/popupMenu.js:33
|
#: ../js/ui/popupMenu.js:33
|
||||||
msgid "toggle-switch-us"
|
msgid "toggle-switch-us"
|
||||||
msgstr ""
|
msgstr "toggle-switch-us"
|
||||||
|
|
||||||
#: ../js/ui/runDialog.js:233
|
#: ../js/ui/runDialog.js:233
|
||||||
msgid "Please enter a command:"
|
msgid "Please enter a command:"
|
||||||
@ -512,49 +557,47 @@ msgstr "بۇيرۇق كىرگۈزۈڭ:"
|
|||||||
#: ../js/ui/runDialog.js:378
|
#: ../js/ui/runDialog.js:378
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "Execution of '%s' failed:"
|
msgid "Execution of '%s' failed:"
|
||||||
msgstr "'%s' ئىجرا قىلالمىدى:"
|
msgstr "«%s» ئىجرا قىلىش مەغلۇپ بولدى:"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:101
|
#: ../js/ui/statusMenu.js:101
|
||||||
msgid "Available"
|
msgid "Available"
|
||||||
msgstr "ئىشلىتىلىشچان"
|
msgstr "بار"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:106
|
#: ../js/ui/statusMenu.js:106
|
||||||
msgid "Busy"
|
msgid "Busy"
|
||||||
msgstr "ئالدىراش"
|
msgstr "ئالدىراش"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:111
|
#: ../js/ui/statusMenu.js:114
|
||||||
msgid "Invisible"
|
#, fuzzy
|
||||||
msgstr "يوشۇرۇن"
|
#| msgid "My Account..."
|
||||||
|
msgid "My Account"
|
||||||
|
msgstr "ھېساباتىم…"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:119
|
#: ../js/ui/statusMenu.js:118
|
||||||
msgid "My Account..."
|
#, fuzzy
|
||||||
msgstr ""
|
#| msgid "System Settings..."
|
||||||
|
msgid "System Settings"
|
||||||
|
msgstr "سىستېما تەڭشەكلىرى..."
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:123
|
#: ../js/ui/statusMenu.js:125
|
||||||
msgid "System Settings..."
|
|
||||||
msgstr "سىستېما تەڭشەكلىرى"
|
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:130
|
|
||||||
msgid "Lock Screen"
|
msgid "Lock Screen"
|
||||||
msgstr "ئېكراننى قۇلۇپلا"
|
msgstr "ئېكراننى قۇلۇپلاش"
|
||||||
|
|
||||||
|
#: ../js/ui/statusMenu.js:129
|
||||||
|
msgid "Switch User"
|
||||||
|
msgstr "ئىشلەتكۈچى ئالماشتۇرۇش"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:134
|
#: ../js/ui/statusMenu.js:134
|
||||||
msgid "Switch User"
|
|
||||||
msgstr "ئىشلەتكۈچى ئالماشتۇر"
|
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:139
|
|
||||||
msgid "Log Out..."
|
msgid "Log Out..."
|
||||||
msgstr "تىزىمدىن چىق…"
|
msgstr "تىزىمدىن چىقىش…"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:146
|
#: ../js/ui/statusMenu.js:141
|
||||||
msgid "Suspend"
|
#, fuzzy
|
||||||
msgstr "ۋاقىتلىق توختىتىش"
|
#| msgid "Suspend"
|
||||||
|
msgid "Suspend..."
|
||||||
|
msgstr "توڭلات"
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:150
|
#: ../js/ui/statusMenu.js:145
|
||||||
msgid "Restart..."
|
|
||||||
msgstr ""
|
|
||||||
|
|
||||||
#: ../js/ui/statusMenu.js:154
|
|
||||||
msgid "Shut Down..."
|
msgid "Shut Down..."
|
||||||
msgstr "تاقا…"
|
msgstr "تاقا…"
|
||||||
|
|
||||||
@ -572,33 +615,33 @@ msgstr "كۆرۈنمە ئاگاھلاندۇرۇش"
|
|||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:97
|
#: ../js/ui/status/accessibility.js:97
|
||||||
msgid "Sticky Keys"
|
msgid "Sticky Keys"
|
||||||
msgstr "چاپلاش كۇنۇپكىسى"
|
msgstr "Sticky Keys"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:100
|
#: ../js/ui/status/accessibility.js:100
|
||||||
msgid "Slow Keys"
|
msgid "Slow Keys"
|
||||||
msgstr "ئاستا كۇنۇپكا"
|
msgstr "Slow Keys"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:103
|
#: ../js/ui/status/accessibility.js:103
|
||||||
msgid "Bounce Keys"
|
msgid "Bounce Keys"
|
||||||
msgstr "قاڭقىش كۇنۇپكىسى"
|
msgstr "Bounce Keys"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:106
|
#: ../js/ui/status/accessibility.js:106
|
||||||
msgid "Mouse Keys"
|
msgid "Mouse Keys"
|
||||||
msgstr "چاشقىنەك كۇنۇپكا"
|
msgstr "Mouse Keys"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:110
|
#: ../js/ui/status/accessibility.js:110
|
||||||
msgid "Universal Access Settings"
|
msgid "Universal Access Settings"
|
||||||
msgstr "ھەممىباب زىيارەت تەڭشىكى"
|
msgstr "ئۇنىۋېرسال زىيارەت تەڭشىكى"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:163
|
#: ../js/ui/status/accessibility.js:163
|
||||||
msgid "High Contrast"
|
msgid "High Contrast"
|
||||||
msgstr "يۇقىرى ئاق-قارىلىقى"
|
msgstr "يۇقىرى ئاق-قارىلىقى"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:202
|
#: ../js/ui/status/accessibility.js:205
|
||||||
msgid "Large Text"
|
msgid "Large Text"
|
||||||
msgstr "چوڭ تېكىست"
|
msgstr "چوڭ تېكىست"
|
||||||
|
|
||||||
#: ../js/ui/status/accessibility.js:223
|
#: ../js/ui/status/accessibility.js:224
|
||||||
msgid "Zoom"
|
msgid "Zoom"
|
||||||
msgstr "كېڭەيت تارايت"
|
msgstr "كېڭەيت تارايت"
|
||||||
|
|
||||||
@ -610,7 +653,7 @@ msgstr "%s باشلاشنى تاماملىدى"
|
|||||||
#: ../js/ui/windowAttentionHandler.js:45
|
#: ../js/ui/windowAttentionHandler.js:45
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "'%s' is ready"
|
msgid "'%s' is ready"
|
||||||
msgstr "'%s' تەييار بولدى"
|
msgstr "«%s» تەييار"
|
||||||
|
|
||||||
#: ../js/ui/workspacesView.js:229
|
#: ../js/ui/workspacesView.js:229
|
||||||
msgid ""
|
msgid ""
|
||||||
@ -619,7 +662,7 @@ msgstr "يېڭى خىزمەت رايونى قوشالمايدۇ چۈنكى ئە
|
|||||||
|
|
||||||
#: ../js/ui/workspacesView.js:246
|
#: ../js/ui/workspacesView.js:246
|
||||||
msgid "Can't remove the first workspace."
|
msgid "Can't remove the first workspace."
|
||||||
msgstr "بىرىنچى خىزمەت رايونىنى چىقىرىۋېتەلمەيدۇ."
|
msgstr "بىرىنچى خىزمەت رايونىنى چىقىرىۋەتكىلى بولمايدۇ."
|
||||||
|
|
||||||
#. translators:
|
#. translators:
|
||||||
#. * The number of sound outputs on a particular device
|
#. * The number of sound outputs on a particular device
|
||||||
@ -627,7 +670,7 @@ msgstr "بىرىنچى خىزمەت رايونىنى چىقىرىۋېتەلمە
|
|||||||
#, c-format
|
#, c-format
|
||||||
msgid "%u Output"
|
msgid "%u Output"
|
||||||
msgid_plural "%u Outputs"
|
msgid_plural "%u Outputs"
|
||||||
msgstr[0] "%u چىقار"
|
msgstr[0] "%u چىقىرىلما"
|
||||||
|
|
||||||
#. translators:
|
#. translators:
|
||||||
#. * The number of sound inputs on a particular device
|
#. * The number of sound inputs on a particular device
|
||||||
@ -635,51 +678,55 @@ msgstr[0] "%u چىقار"
|
|||||||
#, c-format
|
#, c-format
|
||||||
msgid "%u Input"
|
msgid "%u Input"
|
||||||
msgid_plural "%u Inputs"
|
msgid_plural "%u Inputs"
|
||||||
msgstr[0] "%u كىرگۈز"
|
msgstr[0] "%u كىرگۈزۈلمە"
|
||||||
|
|
||||||
#: ../src/gvc/gvc-mixer-control.c:1402
|
#: ../src/gvc/gvc-mixer-control.c:1402
|
||||||
msgid "System Sounds"
|
msgid "System Sounds"
|
||||||
msgstr "سىستېما ئاۋازى"
|
msgstr "سىستېما ئاۋازى"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1219
|
#: ../src/shell-app-system.c:1012
|
||||||
|
msgid "Unknown"
|
||||||
|
msgstr "نامەلۇم"
|
||||||
|
|
||||||
|
#: ../src/shell-global.c:1163
|
||||||
msgid "Less than a minute ago"
|
msgid "Less than a minute ago"
|
||||||
msgstr "بىر مىنۇتتىنمۇ ئىلگىرى"
|
msgstr "بىر مىنۇتتىنمۇ ئىلگىرى"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1223
|
#: ../src/shell-global.c:1167
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d minute ago"
|
msgid "%d minute ago"
|
||||||
msgid_plural "%d minutes ago"
|
msgid_plural "%d minutes ago"
|
||||||
msgstr[0] "%d مىنۇت ئىلگىرى"
|
msgstr[0] "%d مىنۇت ئىلگىرى"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1228
|
#: ../src/shell-global.c:1172
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d hour ago"
|
msgid "%d hour ago"
|
||||||
msgid_plural "%d hours ago"
|
msgid_plural "%d hours ago"
|
||||||
msgstr[0] "%d سائەت ئىلگىرى"
|
msgstr[0] "%d سائەت ئىلگىرى"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1233
|
#: ../src/shell-global.c:1177
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d day ago"
|
msgid "%d day ago"
|
||||||
msgid_plural "%d days ago"
|
msgid_plural "%d days ago"
|
||||||
msgstr[0] "%d كۈن ئىلگىرى"
|
msgstr[0] "%d كۈن ئىلگىرى"
|
||||||
|
|
||||||
#: ../src/shell-global.c:1238
|
#: ../src/shell-global.c:1182
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%d week ago"
|
msgid "%d week ago"
|
||||||
msgid_plural "%d weeks ago"
|
msgid_plural "%d weeks ago"
|
||||||
msgstr[0] "%d ھەپتە ئىلگىرى"
|
msgstr[0] "%d ھەپتە ئىلگىرى"
|
||||||
|
|
||||||
#: ../src/shell-uri-util.c:89
|
#: ../src/shell-util.c:89
|
||||||
msgid "Home Folder"
|
msgid "Home Folder"
|
||||||
msgstr "باش مۇندەرىجە"
|
msgstr "ماكان مۇندەرىجە"
|
||||||
|
|
||||||
#. Translators: this is the same string as the one found in
|
#. Translators: this is the same string as the one found in
|
||||||
#. * nautilus
|
#. * nautilus
|
||||||
#: ../src/shell-uri-util.c:104
|
#: ../src/shell-util.c:104
|
||||||
msgid "File System"
|
msgid "File System"
|
||||||
msgstr "ھۆججەت سىستېمىسى"
|
msgstr "ھۆججەت سىستېمىسى"
|
||||||
|
|
||||||
#: ../src/shell-uri-util.c:250
|
#: ../src/shell-util.c:250
|
||||||
msgid "Search"
|
msgid "Search"
|
||||||
msgstr "ئىزدە"
|
msgstr "ئىزدە"
|
||||||
|
|
||||||
@ -688,7 +735,10 @@ msgstr "ئىزدە"
|
|||||||
#. * example, "Trash: some-directory". It means that the
|
#. * example, "Trash: some-directory". It means that the
|
||||||
#. * directory called "some-directory" is in the trash.
|
#. * directory called "some-directory" is in the trash.
|
||||||
#.
|
#.
|
||||||
#: ../src/shell-uri-util.c:300
|
#: ../src/shell-util.c:300
|
||||||
#, c-format
|
#, c-format
|
||||||
msgid "%1$s: %2$s"
|
msgid "%1$s: %2$s"
|
||||||
msgstr "%1$s: %2$s "
|
msgstr "%1$s: %2$s "
|
||||||
|
|
||||||
|
#~ msgid "Invisible"
|
||||||
|
#~ msgstr "يوشۇرۇن"
|
||||||
|
@ -13,8 +13,6 @@ bin_SCRIPTS = gnome-shell gnome-shell-clock-preferences
|
|||||||
gnome-shell: gnome-shell.in
|
gnome-shell: gnome-shell.in
|
||||||
$(AM_V_GEN) sed -e "s|@MUTTER_BIN_DIR[@]|$(MUTTER_BIN_DIR)|" \
|
$(AM_V_GEN) sed -e "s|@MUTTER_BIN_DIR[@]|$(MUTTER_BIN_DIR)|" \
|
||||||
-e "s|@datadir[@]|$(datadir)|" \
|
-e "s|@datadir[@]|$(datadir)|" \
|
||||||
-e "s|@GJS_JS_DIR[@]|$(GJS_JS_DIR)|" \
|
|
||||||
-e "s|@GJS_JS_NATIVE_DIR[@]|$(GJS_JS_NATIVE_DIR)|" \
|
|
||||||
-e "s|@libexecdir[@]|$(libexecdir)|" \
|
-e "s|@libexecdir[@]|$(libexecdir)|" \
|
||||||
-e "s|@libdir[@]|$(libdir)|" \
|
-e "s|@libdir[@]|$(libdir)|" \
|
||||||
-e "s|@pkgdatadir[@]|$(pkgdatadir)|" \
|
-e "s|@pkgdatadir[@]|$(pkgdatadir)|" \
|
||||||
|
@ -220,7 +220,7 @@ def start_shell(perf_output=None):
|
|||||||
|
|
||||||
# Set up environment
|
# Set up environment
|
||||||
env = dict(os.environ)
|
env = dict(os.environ)
|
||||||
env.update({'GNOME_SHELL_JS' : '@GJS_JS_DIR@:@GJS_JS_NATIVE_DIR@:' + js_dir,
|
env.update({'GNOME_SHELL_JS' : js_dir,
|
||||||
'PATH' : '@MUTTER_BIN_DIR@:' + os.environ.get('PATH', ''),
|
'PATH' : '@MUTTER_BIN_DIR@:' + os.environ.get('PATH', ''),
|
||||||
'XDG_CONFIG_DIRS' : '@sysconfdir@/xdg:' + (os.environ.get('XDG_CONFIG_DIRS') or '/etc/xdg'),
|
'XDG_CONFIG_DIRS' : '@sysconfdir@/xdg:' + (os.environ.get('XDG_CONFIG_DIRS') or '/etc/xdg'),
|
||||||
'XDG_DATA_DIRS' : '@datadir@:' + (os.environ.get('XDG_DATA_DIRS') or '/usr/local/share:/usr/share'),
|
'XDG_DATA_DIRS' : '@datadir@:' + (os.environ.get('XDG_DATA_DIRS') or '/usr/local/share:/usr/share'),
|
||||||
|
@ -245,6 +245,34 @@ shell_generic_container_finalize (GObject *object)
|
|||||||
G_OBJECT_CLASS (shell_generic_container_parent_class)->finalize (object);
|
G_OBJECT_CLASS (shell_generic_container_parent_class)->finalize (object);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Based on implementation from clutter-group.c */
|
||||||
|
static gboolean
|
||||||
|
shell_generic_container_get_paint_volume (ClutterActor *actor,
|
||||||
|
ClutterPaintVolume *volume)
|
||||||
|
{
|
||||||
|
GList *l, *children;
|
||||||
|
|
||||||
|
children = st_container_get_children_list (ST_CONTAINER (actor));
|
||||||
|
|
||||||
|
CLUTTER_ACTOR_CLASS (shell_generic_container_parent_class)->get_paint_volume (actor, volume);
|
||||||
|
|
||||||
|
for (l = children; l != NULL; l = l->next)
|
||||||
|
{
|
||||||
|
ClutterActor *child = l->data;
|
||||||
|
const ClutterPaintVolume *child_volume;
|
||||||
|
|
||||||
|
/* This gets the paint volume of the child transformed into the
|
||||||
|
* group's coordinate space... */
|
||||||
|
child_volume = clutter_actor_get_transformed_paint_volume (child, actor);
|
||||||
|
if (!child_volume)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
clutter_paint_volume_union (volume, child_volume);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
shell_generic_container_class_init (ShellGenericContainerClass *klass)
|
shell_generic_container_class_init (ShellGenericContainerClass *klass)
|
||||||
{
|
{
|
||||||
@ -257,6 +285,7 @@ shell_generic_container_class_init (ShellGenericContainerClass *klass)
|
|||||||
actor_class->get_preferred_width = shell_generic_container_get_preferred_width;
|
actor_class->get_preferred_width = shell_generic_container_get_preferred_width;
|
||||||
actor_class->get_preferred_height = shell_generic_container_get_preferred_height;
|
actor_class->get_preferred_height = shell_generic_container_get_preferred_height;
|
||||||
actor_class->allocate = shell_generic_container_allocate;
|
actor_class->allocate = shell_generic_container_allocate;
|
||||||
|
actor_class->get_paint_volume = shell_generic_container_get_paint_volume;
|
||||||
actor_class->paint = shell_generic_container_paint;
|
actor_class->paint = shell_generic_container_paint;
|
||||||
actor_class->pick = shell_generic_container_pick;
|
actor_class->pick = shell_generic_container_pick;
|
||||||
|
|
||||||
|
@ -509,6 +509,9 @@ shell_global_set_cursor (ShellGlobal *global,
|
|||||||
case SHELL_CURSOR_DND_UNSUPPORTED_TARGET:
|
case SHELL_CURSOR_DND_UNSUPPORTED_TARGET:
|
||||||
name = "dnd-none";
|
name = "dnd-none";
|
||||||
break;
|
break;
|
||||||
|
case SHELL_CURSOR_POINTING_HAND:
|
||||||
|
name = "hand";
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
g_return_if_reached ();
|
g_return_if_reached ();
|
||||||
}
|
}
|
||||||
@ -528,6 +531,8 @@ shell_global_set_cursor (ShellGlobal *global,
|
|||||||
case SHELL_CURSOR_DND_COPY:
|
case SHELL_CURSOR_DND_COPY:
|
||||||
cursor_type = GDK_PLUS;
|
cursor_type = GDK_PLUS;
|
||||||
break;
|
break;
|
||||||
|
case SHELL_CURSOR_POINTING_HAND:
|
||||||
|
cursor_type = GDK_HAND2;
|
||||||
case SHELL_CURSOR_DND_UNSUPPORTED_TARGET:
|
case SHELL_CURSOR_DND_UNSUPPORTED_TARGET:
|
||||||
cursor_type = GDK_X_CURSOR;
|
cursor_type = GDK_X_CURSOR;
|
||||||
break;
|
break;
|
||||||
|
@ -38,7 +38,8 @@ typedef enum {
|
|||||||
SHELL_CURSOR_DND_IN_DRAG,
|
SHELL_CURSOR_DND_IN_DRAG,
|
||||||
SHELL_CURSOR_DND_UNSUPPORTED_TARGET,
|
SHELL_CURSOR_DND_UNSUPPORTED_TARGET,
|
||||||
SHELL_CURSOR_DND_MOVE,
|
SHELL_CURSOR_DND_MOVE,
|
||||||
SHELL_CURSOR_DND_COPY
|
SHELL_CURSOR_DND_COPY,
|
||||||
|
SHELL_CURSOR_POINTING_HAND
|
||||||
} ShellCursor;
|
} ShellCursor;
|
||||||
|
|
||||||
void shell_global_set_cursor (ShellGlobal *global,
|
void shell_global_set_cursor (ShellGlobal *global,
|
||||||
|
@ -876,29 +876,39 @@ st_box_layout_apply_transform (ClutterActor *a,
|
|||||||
cogl_matrix_translate (m, (int) -x, (int) -y, 0);
|
cogl_matrix_translate (m, (int) -x, (int) -y, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* If we are translated, then we need to translate back before chaining
|
||||||
|
* up or the background and borders will be drawn in the wrong place */
|
||||||
|
static void
|
||||||
|
get_border_paint_offsets (StBoxLayout *self,
|
||||||
|
double *x,
|
||||||
|
double *y)
|
||||||
|
{
|
||||||
|
StBoxLayoutPrivate *priv = self->priv;
|
||||||
|
|
||||||
|
if (priv->hadjustment)
|
||||||
|
*x = st_adjustment_get_value (priv->hadjustment);
|
||||||
|
else
|
||||||
|
*x = 0;
|
||||||
|
|
||||||
|
if (priv->vadjustment)
|
||||||
|
*y = st_adjustment_get_value (priv->vadjustment);
|
||||||
|
else
|
||||||
|
*y = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_box_layout_paint (ClutterActor *actor)
|
st_box_layout_paint (ClutterActor *actor)
|
||||||
{
|
{
|
||||||
StBoxLayoutPrivate *priv = ST_BOX_LAYOUT (actor)->priv;
|
StBoxLayout *self = ST_BOX_LAYOUT (actor);
|
||||||
|
StBoxLayoutPrivate *priv = self->priv;
|
||||||
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
|
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
|
||||||
GList *l, *children;
|
GList *l, *children;
|
||||||
gdouble x, y;
|
gdouble x, y;
|
||||||
ClutterActorBox allocation_box;
|
ClutterActorBox allocation_box;
|
||||||
ClutterActorBox content_box;
|
ClutterActorBox content_box;
|
||||||
|
|
||||||
if (priv->hadjustment)
|
get_border_paint_offsets (self, &x, &y);
|
||||||
x = st_adjustment_get_value (priv->hadjustment);
|
|
||||||
else
|
|
||||||
x = 0;
|
|
||||||
|
|
||||||
if (priv->vadjustment)
|
|
||||||
y = st_adjustment_get_value (priv->vadjustment);
|
|
||||||
else
|
|
||||||
y = 0;
|
|
||||||
|
|
||||||
/* If we are translated, then we need to translate back before chaining
|
|
||||||
* up or the background and borders will be drawn in the wrong place */
|
|
||||||
if (x != 0 || y != 0)
|
if (x != 0 || y != 0)
|
||||||
{
|
{
|
||||||
cogl_push_matrix ();
|
cogl_push_matrix ();
|
||||||
@ -950,23 +960,15 @@ static void
|
|||||||
st_box_layout_pick (ClutterActor *actor,
|
st_box_layout_pick (ClutterActor *actor,
|
||||||
const ClutterColor *color)
|
const ClutterColor *color)
|
||||||
{
|
{
|
||||||
StBoxLayoutPrivate *priv = ST_BOX_LAYOUT (actor)->priv;
|
StBoxLayout *self = ST_BOX_LAYOUT (actor);
|
||||||
|
StBoxLayoutPrivate *priv = self->priv;
|
||||||
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
|
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (actor));
|
||||||
GList *l, *children;
|
GList *l, *children;
|
||||||
gdouble x, y;
|
gdouble x, y;
|
||||||
ClutterActorBox allocation_box;
|
ClutterActorBox allocation_box;
|
||||||
ClutterActorBox content_box;
|
ClutterActorBox content_box;
|
||||||
|
|
||||||
if (priv->hadjustment)
|
get_border_paint_offsets (self, &x, &y);
|
||||||
x = st_adjustment_get_value (priv->hadjustment);
|
|
||||||
else
|
|
||||||
x = 0;
|
|
||||||
|
|
||||||
if (priv->vadjustment)
|
|
||||||
y = st_adjustment_get_value (priv->vadjustment);
|
|
||||||
else
|
|
||||||
y = 0;
|
|
||||||
|
|
||||||
if (x != 0 || y != 0)
|
if (x != 0 || y != 0)
|
||||||
{
|
{
|
||||||
cogl_push_matrix ();
|
cogl_push_matrix ();
|
||||||
@ -1011,6 +1013,34 @@ st_box_layout_pick (ClutterActor *actor,
|
|||||||
cogl_clip_pop ();
|
cogl_clip_pop ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
st_box_layout_get_paint_volume (ClutterActor *actor,
|
||||||
|
ClutterPaintVolume *volume)
|
||||||
|
{
|
||||||
|
StBoxLayout *self = ST_BOX_LAYOUT (actor);
|
||||||
|
gdouble x, y;
|
||||||
|
|
||||||
|
CLUTTER_ACTOR_CLASS (st_box_layout_parent_class)->get_paint_volume (actor, volume);
|
||||||
|
|
||||||
|
/* When scrolled, st_box_layout_apply_transform() includes the scroll offset
|
||||||
|
* and affects paint volumes. This is right for our children, but our paint volume
|
||||||
|
* is determined by our allocation and borders and doesn't scroll, so we need
|
||||||
|
* to reverse-compensate here, the same as we do when painting.
|
||||||
|
*/
|
||||||
|
get_border_paint_offsets (self, &x, &y);
|
||||||
|
if (x != 0 || y != 0)
|
||||||
|
{
|
||||||
|
ClutterVertex origin;
|
||||||
|
|
||||||
|
clutter_paint_volume_get_origin (volume, &origin);
|
||||||
|
origin.x += x;
|
||||||
|
origin.y += y;
|
||||||
|
clutter_paint_volume_set_origin (volume, &origin);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_box_layout_style_changed (StWidget *self)
|
st_box_layout_style_changed (StWidget *self)
|
||||||
{
|
{
|
||||||
@ -1047,6 +1077,7 @@ st_box_layout_class_init (StBoxLayoutClass *klass)
|
|||||||
actor_class->apply_transform = st_box_layout_apply_transform;
|
actor_class->apply_transform = st_box_layout_apply_transform;
|
||||||
|
|
||||||
actor_class->paint = st_box_layout_paint;
|
actor_class->paint = st_box_layout_paint;
|
||||||
|
actor_class->get_paint_volume = st_box_layout_get_paint_volume;
|
||||||
actor_class->pick = st_box_layout_pick;
|
actor_class->pick = st_box_layout_pick;
|
||||||
|
|
||||||
widget_class->style_changed = st_box_layout_style_changed;
|
widget_class->style_changed = st_box_layout_style_changed;
|
||||||
|
@ -3,6 +3,7 @@
|
|||||||
* st-group.c: A fixed layout container based on ClutterGroup
|
* st-group.c: A fixed layout container based on ClutterGroup
|
||||||
*
|
*
|
||||||
* Copyright 2010 Florian Müllner
|
* Copyright 2010 Florian Müllner
|
||||||
|
* Copyright 2010 Intel Corporation
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU Lesser General Public License,
|
* under the terms and conditions of the GNU Lesser General Public License,
|
||||||
@ -230,7 +231,33 @@ st_group_hide_all (ClutterActor *actor)
|
|||||||
NULL);
|
NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Based on implementation from clutter-group.c */
|
||||||
|
static gboolean
|
||||||
|
st_group_get_paint_volume (ClutterActor *actor,
|
||||||
|
ClutterPaintVolume *volume)
|
||||||
|
{
|
||||||
|
GList *l, *children;
|
||||||
|
|
||||||
|
children = st_container_get_children_list (ST_CONTAINER (actor));
|
||||||
|
|
||||||
|
CLUTTER_ACTOR_CLASS (st_group_parent_class)->get_paint_volume (actor, volume);
|
||||||
|
|
||||||
|
for (l = children; l != NULL; l = l->next)
|
||||||
|
{
|
||||||
|
ClutterActor *child = l->data;
|
||||||
|
const ClutterPaintVolume *child_volume;
|
||||||
|
|
||||||
|
/* This gets the paint volume of the child transformed into the
|
||||||
|
* group's coordinate space... */
|
||||||
|
child_volume = clutter_actor_get_transformed_paint_volume (child, actor);
|
||||||
|
if (!child_volume)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
clutter_paint_volume_union (volume, child_volume);
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -242,6 +269,7 @@ st_group_class_init (StGroupClass *klass)
|
|||||||
actor_class->get_preferred_height = st_group_get_preferred_height;
|
actor_class->get_preferred_height = st_group_get_preferred_height;
|
||||||
actor_class->allocate = st_group_allocate;
|
actor_class->allocate = st_group_allocate;
|
||||||
actor_class->paint = st_group_paint;
|
actor_class->paint = st_group_paint;
|
||||||
|
actor_class->get_paint_volume = st_group_get_paint_volume;
|
||||||
actor_class->pick = st_group_pick;
|
actor_class->pick = st_group_pick;
|
||||||
actor_class->show_all = st_group_show_all;
|
actor_class->show_all = st_group_show_all;
|
||||||
actor_class->hide_all = st_group_hide_all;
|
actor_class->hide_all = st_group_hide_all;
|
||||||
|
@ -56,6 +56,10 @@ struct _StIconPrivate
|
|||||||
gint prop_icon_size; /* icon size set as property */
|
gint prop_icon_size; /* icon size set as property */
|
||||||
gint theme_icon_size; /* icon size from theme node */
|
gint theme_icon_size; /* icon size from theme node */
|
||||||
gint icon_size; /* icon size we are using */
|
gint icon_size; /* icon size we are using */
|
||||||
|
|
||||||
|
CoglHandle shadow_material;
|
||||||
|
float shadow_width;
|
||||||
|
float shadow_height;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void st_icon_update (StIcon *icon);
|
static void st_icon_update (StIcon *icon);
|
||||||
@ -145,6 +149,12 @@ st_icon_dispose (GObject *gobject)
|
|||||||
priv->gicon = NULL;
|
priv->gicon = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (priv->shadow_material)
|
||||||
|
{
|
||||||
|
cogl_handle_unref (priv->shadow_material);
|
||||||
|
priv->shadow_material = COGL_INVALID_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
G_OBJECT_CLASS (st_icon_parent_class)->dispose (gobject);
|
G_OBJECT_CLASS (st_icon_parent_class)->dispose (gobject);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -227,8 +237,31 @@ st_icon_paint (ClutterActor *actor)
|
|||||||
CLUTTER_ACTOR_CLASS (st_icon_parent_class)->paint (actor);
|
CLUTTER_ACTOR_CLASS (st_icon_parent_class)->paint (actor);
|
||||||
|
|
||||||
if (priv->icon_texture)
|
if (priv->icon_texture)
|
||||||
|
{
|
||||||
|
if (priv->shadow_material)
|
||||||
|
{
|
||||||
|
StThemeNode *node = st_widget_get_theme_node (ST_WIDGET (actor));
|
||||||
|
StShadow *shadow_spec = st_theme_node_get_shadow (node);
|
||||||
|
ClutterActorBox allocation;
|
||||||
|
float width, height;
|
||||||
|
|
||||||
|
clutter_actor_get_allocation_box (priv->icon_texture, &allocation);
|
||||||
|
clutter_actor_box_get_size (&allocation, &width, &height);
|
||||||
|
|
||||||
|
allocation.x1 = (width - priv->shadow_width) / 2;
|
||||||
|
allocation.y1 = (height - priv->shadow_height) / 2;
|
||||||
|
allocation.x2 = allocation.x1 + priv->shadow_width;
|
||||||
|
allocation.y2 = allocation.y1 + priv->shadow_height;
|
||||||
|
|
||||||
|
_st_paint_shadow_with_opacity (shadow_spec,
|
||||||
|
priv->shadow_material,
|
||||||
|
&allocation,
|
||||||
|
clutter_actor_get_paint_opacity (priv->icon_texture));
|
||||||
|
}
|
||||||
|
|
||||||
clutter_actor_paint (priv->icon_texture);
|
clutter_actor_paint (priv->icon_texture);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
st_icon_map (ClutterActor *actor)
|
st_icon_map (ClutterActor *actor)
|
||||||
@ -326,6 +359,45 @@ st_icon_init (StIcon *self)
|
|||||||
self->priv->icon_size = DEFAULT_ICON_SIZE;
|
self->priv->icon_size = DEFAULT_ICON_SIZE;
|
||||||
self->priv->prop_icon_size = -1;
|
self->priv->prop_icon_size = -1;
|
||||||
self->priv->icon_type = DEFAULT_ICON_TYPE;
|
self->priv->icon_type = DEFAULT_ICON_TYPE;
|
||||||
|
|
||||||
|
self->priv->icon_texture = COGL_INVALID_HANDLE;
|
||||||
|
self->priv->shadow_width = -1;
|
||||||
|
self->priv->shadow_height = -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
st_icon_update_shadow_material (StIcon *icon)
|
||||||
|
{
|
||||||
|
StIconPrivate *priv = icon->priv;
|
||||||
|
StThemeNode *theme_node = st_widget_get_theme_node (ST_WIDGET (icon));
|
||||||
|
StShadow *shadow_spec = st_theme_node_get_shadow (theme_node);
|
||||||
|
|
||||||
|
if (priv->shadow_material)
|
||||||
|
{
|
||||||
|
cogl_handle_unref (priv->shadow_material);
|
||||||
|
priv->shadow_material = COGL_INVALID_HANDLE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shadow_spec)
|
||||||
|
{
|
||||||
|
CoglHandle material;
|
||||||
|
gint width, height;
|
||||||
|
|
||||||
|
clutter_texture_get_base_size (CLUTTER_TEXTURE (priv->icon_texture),
|
||||||
|
&width, &height);
|
||||||
|
material = _st_create_shadow_material_from_actor (shadow_spec,
|
||||||
|
priv->icon_texture);
|
||||||
|
priv->shadow_material = material;
|
||||||
|
priv->shadow_width = width;
|
||||||
|
priv->shadow_height = height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
on_pixbuf_changed (ClutterTexture *texture,
|
||||||
|
StIcon *icon)
|
||||||
|
{
|
||||||
|
st_icon_update_shadow_material (icon);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -366,7 +438,14 @@ st_icon_update (StIcon *icon)
|
|||||||
priv->icon_size);
|
priv->icon_size);
|
||||||
}
|
}
|
||||||
if (priv->icon_texture)
|
if (priv->icon_texture)
|
||||||
|
{
|
||||||
|
st_icon_update_shadow_material (icon);
|
||||||
clutter_actor_set_parent (priv->icon_texture, CLUTTER_ACTOR (icon));
|
clutter_actor_set_parent (priv->icon_texture, CLUTTER_ACTOR (icon));
|
||||||
|
|
||||||
|
/* "pixbuf-change" is actually a misnomer for "texture-changed" */
|
||||||
|
g_signal_connect (priv->icon_texture, "pixbuf-change",
|
||||||
|
G_CALLBACK (on_pixbuf_changed), icon);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
|
@ -181,6 +181,13 @@ st_im_text_paint (ClutterActor *actor)
|
|||||||
update_im_cursor_location (self);
|
update_im_cursor_location (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
st_im_text_get_paint_volume (ClutterActor *self,
|
||||||
|
ClutterPaintVolume *volume)
|
||||||
|
{
|
||||||
|
return clutter_paint_volume_set_from_allocation (volume, self);
|
||||||
|
}
|
||||||
|
|
||||||
/* Returns a new reference to window */
|
/* Returns a new reference to window */
|
||||||
static GdkWindow *
|
static GdkWindow *
|
||||||
window_for_actor (ClutterActor *actor)
|
window_for_actor (ClutterActor *actor)
|
||||||
@ -440,6 +447,7 @@ st_im_text_class_init (StIMTextClass *klass)
|
|||||||
object_class->dispose = st_im_text_dispose;
|
object_class->dispose = st_im_text_dispose;
|
||||||
|
|
||||||
actor_class->paint = st_im_text_paint;
|
actor_class->paint = st_im_text_paint;
|
||||||
|
actor_class->get_paint_volume = st_im_text_get_paint_volume;
|
||||||
actor_class->realize = st_im_text_realize;
|
actor_class->realize = st_im_text_realize;
|
||||||
actor_class->unrealize = st_im_text_unrealize;
|
actor_class->unrealize = st_im_text_unrealize;
|
||||||
|
|
||||||
|
@ -718,7 +718,7 @@ get_length_from_term (StThemeNode *node,
|
|||||||
if (term->type != TERM_NUMBER)
|
if (term->type != TERM_NUMBER)
|
||||||
{
|
{
|
||||||
g_warning ("Ignoring length property that isn't a number");
|
g_warning ("Ignoring length property that isn't a number");
|
||||||
return FALSE;
|
return VALUE_NOT_FOUND;
|
||||||
}
|
}
|
||||||
|
|
||||||
num = term->content.num;
|
num = term->content.num;
|
||||||
@ -859,7 +859,7 @@ get_length_from_term_int (StThemeNode *node,
|
|||||||
GetFromTermResult result;
|
GetFromTermResult result;
|
||||||
|
|
||||||
result = get_length_from_term (node, term, use_parent_font, &value);
|
result = get_length_from_term (node, term, use_parent_font, &value);
|
||||||
if (result != VALUE_NOT_FOUND)
|
if (result == VALUE_FOUND)
|
||||||
*length = (int) (0.5 + value);
|
*length = (int) (0.5 + value);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -1053,7 +1053,7 @@ do_border_property (StThemeNode *node,
|
|||||||
StSide side = (StSide)-1;
|
StSide side = (StSide)-1;
|
||||||
ClutterColor color;
|
ClutterColor color;
|
||||||
gboolean color_set = FALSE;
|
gboolean color_set = FALSE;
|
||||||
int width;
|
int width = 0; /* suppress warning */
|
||||||
gboolean width_set = FALSE;
|
gboolean width_set = FALSE;
|
||||||
int j;
|
int j;
|
||||||
|
|
||||||
@ -1098,7 +1098,8 @@ do_border_property (StThemeNode *node,
|
|||||||
const char *ident = term->content.str->stryng->str;
|
const char *ident = term->content.str->stryng->str;
|
||||||
if (strcmp (ident, "none") == 0 || strcmp (ident, "hidden") == 0)
|
if (strcmp (ident, "none") == 0 || strcmp (ident, "hidden") == 0)
|
||||||
{
|
{
|
||||||
width = 0.;
|
width = 0;
|
||||||
|
width_set = TRUE;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (strcmp (ident, "solid") == 0)
|
else if (strcmp (ident, "solid") == 0)
|
||||||
@ -1185,7 +1186,7 @@ do_outline_property (StThemeNode *node,
|
|||||||
const char *property_name = decl->property->stryng->str + 7; /* Skip 'outline' */
|
const char *property_name = decl->property->stryng->str + 7; /* Skip 'outline' */
|
||||||
ClutterColor color;
|
ClutterColor color;
|
||||||
gboolean color_set = FALSE;
|
gboolean color_set = FALSE;
|
||||||
int width;
|
int width = 0; /* suppress warning */
|
||||||
gboolean width_set = FALSE;
|
gboolean width_set = FALSE;
|
||||||
|
|
||||||
if (strcmp (property_name, "") == 0)
|
if (strcmp (property_name, "") == 0)
|
||||||
@ -1202,7 +1203,8 @@ do_outline_property (StThemeNode *node,
|
|||||||
const char *ident = term->content.str->stryng->str;
|
const char *ident = term->content.str->stryng->str;
|
||||||
if (strcmp (ident, "none") == 0 || strcmp (ident, "hidden") == 0)
|
if (strcmp (ident, "none") == 0 || strcmp (ident, "hidden") == 0)
|
||||||
{
|
{
|
||||||
width = 0.;
|
width = 0;
|
||||||
|
width_set = TRUE;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
else if (strcmp (ident, "solid") == 0)
|
else if (strcmp (ident, "solid") == 0)
|
||||||
@ -2234,17 +2236,19 @@ font_variant_from_term (CRTerm *term,
|
|||||||
const PangoFontDescription *
|
const PangoFontDescription *
|
||||||
st_theme_node_get_font (StThemeNode *node)
|
st_theme_node_get_font (StThemeNode *node)
|
||||||
{
|
{
|
||||||
PangoStyle font_style;
|
/* Initialized despite _set flags to suppress compiler warnings */
|
||||||
|
PangoStyle font_style = PANGO_STYLE_NORMAL;
|
||||||
gboolean font_style_set = FALSE;
|
gboolean font_style_set = FALSE;
|
||||||
PangoVariant variant;
|
PangoVariant variant = PANGO_VARIANT_NORMAL;
|
||||||
gboolean variant_set = FALSE;
|
gboolean variant_set = FALSE;
|
||||||
PangoWeight weight;
|
PangoWeight weight = PANGO_WEIGHT_NORMAL;
|
||||||
gboolean weight_absolute;
|
gboolean weight_absolute = TRUE;
|
||||||
gboolean weight_set = FALSE;
|
gboolean weight_set = FALSE;
|
||||||
double parent_size;
|
double size = 0.;
|
||||||
double size = 0.; /* Suppress warning */
|
|
||||||
gboolean size_set = FALSE;
|
gboolean size_set = FALSE;
|
||||||
|
|
||||||
char *family = NULL;
|
char *family = NULL;
|
||||||
|
double parent_size;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (node->font_desc)
|
if (node->font_desc)
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
* Copyright 2009, 2010 Red Hat, Inc.
|
* Copyright 2009, 2010 Red Hat, Inc.
|
||||||
* Copyright 2009 Abderrahim Kitouni
|
* Copyright 2009 Abderrahim Kitouni
|
||||||
* Copyright 2009, 2010 Florian Müllner
|
* Copyright 2009, 2010 Florian Müllner
|
||||||
|
* Copyright 2010 Adel Gadllah
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify it
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
* under the terms and conditions of the GNU Lesser General Public License,
|
* under the terms and conditions of the GNU Lesser General Public License,
|
||||||
@ -668,6 +669,31 @@ st_widget_hide (ClutterActor *actor)
|
|||||||
CLUTTER_ACTOR_CLASS (st_widget_parent_class)->hide (actor);
|
CLUTTER_ACTOR_CLASS (st_widget_parent_class)->hide (actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
st_widget_get_paint_volume (ClutterActor *self, ClutterPaintVolume *volume)
|
||||||
|
{
|
||||||
|
ClutterActorBox paint_box, alloc_box;
|
||||||
|
StThemeNode *theme_node;
|
||||||
|
ClutterVertex origin;
|
||||||
|
|
||||||
|
/* Setting the paint volume does not make sense when we don't have any allocation */
|
||||||
|
if (!clutter_actor_has_allocation (self))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
theme_node = st_widget_get_theme_node (ST_WIDGET(self));
|
||||||
|
clutter_actor_get_allocation_box (self, &alloc_box);
|
||||||
|
st_theme_node_get_paint_box (theme_node, &alloc_box, &paint_box);
|
||||||
|
|
||||||
|
origin.x = paint_box.x1 - alloc_box.x1;
|
||||||
|
origin.y = paint_box.y1 - alloc_box.y1;
|
||||||
|
origin.z = 0.0f;
|
||||||
|
|
||||||
|
clutter_paint_volume_set_origin (volume, &origin);
|
||||||
|
clutter_paint_volume_set_width (volume, paint_box.x2 - paint_box.x1);
|
||||||
|
clutter_paint_volume_set_height (volume, paint_box.y2 - paint_box.y1);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -688,6 +714,7 @@ st_widget_class_init (StWidgetClass *klass)
|
|||||||
actor_class->get_preferred_height = st_widget_get_preferred_height;
|
actor_class->get_preferred_height = st_widget_get_preferred_height;
|
||||||
actor_class->allocate = st_widget_allocate;
|
actor_class->allocate = st_widget_allocate;
|
||||||
actor_class->paint = st_widget_paint;
|
actor_class->paint = st_widget_paint;
|
||||||
|
actor_class->get_paint_volume = st_widget_get_paint_volume;
|
||||||
actor_class->parent_set = st_widget_parent_set;
|
actor_class->parent_set = st_widget_parent_set;
|
||||||
actor_class->map = st_widget_map;
|
actor_class->map = st_widget_map;
|
||||||
actor_class->unmap = st_widget_unmap;
|
actor_class->unmap = st_widget_unmap;
|
||||||
|
@ -24,8 +24,6 @@ EXTRA_DIST += $(TEST_MISC)
|
|||||||
|
|
||||||
run-test.sh: run-test.sh.in
|
run-test.sh: run-test.sh.in
|
||||||
$(AM_V_GEN) sed \
|
$(AM_V_GEN) sed \
|
||||||
-e "s|@GJS_JS_DIR[@]|$(GJS_JS_DIR)|" \
|
|
||||||
-e "s|@GJS_JS_NATIVE_DIR[@]|$(GJS_JS_NATIVE_DIR)|" \
|
|
||||||
-e "s|@MUTTER_LIB_DIR[@]|$(MUTTER_LIB_DIR)|" \
|
-e "s|@MUTTER_LIB_DIR[@]|$(MUTTER_LIB_DIR)|" \
|
||||||
-e "s|@srcdir[@]|$(srcdir)|" \
|
-e "s|@srcdir[@]|$(srcdir)|" \
|
||||||
$< > $@ && chmod a+x $@
|
$< > $@ && chmod a+x $@
|
||||||
|
@ -31,17 +31,13 @@ srcdir=$builddir/@srcdir@
|
|||||||
srcdir=`cd $srcdir && pwd`
|
srcdir=`cd $srcdir && pwd`
|
||||||
|
|
||||||
GI_TYPELIB_PATH="@MUTTER_LIB_DIR@/mutter:$builddir/../src"
|
GI_TYPELIB_PATH="@MUTTER_LIB_DIR@/mutter:$builddir/../src"
|
||||||
|
GJS_PATH="$srcdir:$srcdir/../js"
|
||||||
GJS_DEBUG_OUTPUT=stderr
|
GJS_DEBUG_OUTPUT=stderr
|
||||||
$verbose || GJS_DEBUG_TOPICS="JS ERROR;JS LOG"
|
$verbose || GJS_DEBUG_TOPICS="JS ERROR;JS LOG"
|
||||||
GNOME_SHELL_TESTSDIR="$srcdir/"
|
GNOME_SHELL_TESTSDIR="$srcdir/"
|
||||||
|
|
||||||
export GI_TYPELIB_PATH GJS_DEBUG_OUTPUT GJS_DEBUG_TOPICS GNOME_SHELL_JS GNOME_SHELL_TESTSDIR LD_PRELOAD
|
export GI_TYPELIB_PATH GJS_PATH GJS_DEBUG_OUTPUT GJS_DEBUG_TOPICS GNOME_SHELL_JS GNOME_SHELL_TESTSDIR LD_PRELOAD
|
||||||
|
|
||||||
run_js_test_args=
|
|
||||||
for i in $srcdir $srcdir/../js @GJS_JS_DIR@ @GJS_JS_NATIVE_DIR@ ; do
|
|
||||||
run_js_test_args="$run_js_test_args -I $i"
|
|
||||||
done
|
|
||||||
|
|
||||||
for test in $tests ; do
|
for test in $tests ; do
|
||||||
$debug $builddir/../src/run-js-test $run_js_test_args $test || exit $?
|
$debug $builddir/../src/run-js-test $test || exit $?
|
||||||
done
|
done
|
||||||
|
@ -62,7 +62,7 @@ fi
|
|||||||
# libxklavier, libxml2, ORBit2, pam, python, readline,
|
# libxklavier, libxml2, ORBit2, pam, python, readline,
|
||||||
# spidermonkey ({mozilla,firefox,xulrunner}-js), startup-notification,
|
# spidermonkey ({mozilla,firefox,xulrunner}-js), startup-notification,
|
||||||
# xdamage, icon-naming-utils, upower, libtool-ltdl, libvorbis,
|
# xdamage, icon-naming-utils, upower, libtool-ltdl, libvorbis,
|
||||||
# libgcrypt, libtasn1
|
# libgcrypt, libtasn1, libgnome-keyring
|
||||||
#
|
#
|
||||||
# Non-devel packages needed by gnome-shell and its deps:
|
# Non-devel packages needed by gnome-shell and its deps:
|
||||||
# glxinfo, gstreamer-plugins-base, gstreamer-plugins-good,
|
# glxinfo, gstreamer-plugins-base, gstreamer-plugins-good,
|
||||||
@ -82,7 +82,7 @@ if test "x$system" = xUbuntu -o "x$system" = xDebian -o "x$system" = xLinuxMint
|
|||||||
mesa-common-dev mesa-utils libpam-dev python-dev python-gconf python-gobject
|
mesa-common-dev mesa-utils libpam-dev python-dev python-gconf python-gobject
|
||||||
xulrunner-dev xserver-xephyr gnome-terminal libcroco3-dev
|
xulrunner-dev xserver-xephyr gnome-terminal libcroco3-dev
|
||||||
libgstreamer0.10-dev gstreamer0.10-plugins-base gstreamer0.10-plugins-good
|
libgstreamer0.10-dev gstreamer0.10-plugins-base gstreamer0.10-plugins-good
|
||||||
libltdl-dev libvorbis-dev libxklavier-dev
|
libltdl-dev libvorbis-dev libxklavier-dev libgnome-keyring-dev libupower-glib-dev
|
||||||
"
|
"
|
||||||
|
|
||||||
if apt-cache show autopoint > /dev/null 2> /dev/null; then
|
if apt-cache show autopoint > /dev/null 2> /dev/null; then
|
||||||
@ -120,6 +120,7 @@ if test "x$system" = xFedora ; then
|
|||||||
startup-notification-devel xorg-x11-server-Xephyr gnome-terminal zenity
|
startup-notification-devel xorg-x11-server-Xephyr gnome-terminal zenity
|
||||||
icon-naming-utils upower-devel libtool-ltdl-devel libvorbis-devel
|
icon-naming-utils upower-devel libtool-ltdl-devel libvorbis-devel
|
||||||
libxklavier-devel libgcrypt-devel libtasn1-devel libtasn1-tools
|
libxklavier-devel libgcrypt-devel libtasn1-devel libtasn1-tools
|
||||||
|
libgnome-keyring-devel
|
||||||
"
|
"
|
||||||
|
|
||||||
if expr $version \>= 14 > /dev/null ; then
|
if expr $version \>= 14 > /dev/null ; then
|
||||||
|
@ -191,35 +191,6 @@
|
|||||||
</dependencies>
|
</dependencies>
|
||||||
</autotools>
|
</autotools>
|
||||||
|
|
||||||
<autotools id="gnome-keyring">
|
|
||||||
<branch repo="git.gnome.org" module="gnome-keyring"/>
|
|
||||||
<dependencies>
|
|
||||||
<dep package="glib"/>
|
|
||||||
</dependencies>
|
|
||||||
</autotools>
|
|
||||||
|
|
||||||
<autotools id="libnotify">
|
|
||||||
<branch repo="git.gnome.org" module="libnotify"/>
|
|
||||||
<dependencies>
|
|
||||||
<dep package="gtk3"/>
|
|
||||||
</dependencies>
|
|
||||||
</autotools>
|
|
||||||
|
|
||||||
<autotools id="libgnomekbd">
|
|
||||||
<branch repo="git.gnome.org" module="libgnomekbd"/>
|
|
||||||
<dependencies>
|
|
||||||
<dep package="gtk3"/>
|
|
||||||
</dependencies>
|
|
||||||
</autotools>
|
|
||||||
|
|
||||||
<autotools id="gnome-settings-daemon">
|
|
||||||
<branch repo="git.gnome.org" module="gnome-settings-daemon"/>
|
|
||||||
<dependencies>
|
|
||||||
<dep package="libnotify"/>
|
|
||||||
<dep package="gnome-desktop-3"/>
|
|
||||||
</dependencies>
|
|
||||||
</autotools>
|
|
||||||
|
|
||||||
<autotools id="gnome-control-center">
|
<autotools id="gnome-control-center">
|
||||||
<branch repo="git.gnome.org" module="gnome-control-center"/>
|
<branch repo="git.gnome.org" module="gnome-control-center"/>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
@ -238,7 +209,6 @@
|
|||||||
<dep package="gconf"/>
|
<dep package="gconf"/>
|
||||||
<dep package="cairo"/>
|
<dep package="cairo"/>
|
||||||
<dep package="libnotify"/>
|
<dep package="libnotify"/>
|
||||||
<dep package="gnome-keyring"/>
|
|
||||||
<dep package="libcanberra"/>
|
<dep package="libcanberra"/>
|
||||||
<dep package="gnome-control-center"/>
|
<dep package="gnome-control-center"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
Loading…
Reference in New Issue
Block a user