Compare commits

..

20 Commits

Author SHA1 Message Date
Giovanni Campagna
8349925139 Bump version for 3.2.3
Not a GNOME Shell release, but it's useful to tag mass-uploads of
extensions (expecially for translations).
2011-12-16 22:11:51 +01:00
Giovanni Campagna
374abed8a1 all: remove all GSettings usage
Since GSettings is not supported in extensions in 3.2, all settings
have been replaced by constants in JS files (except for user-theme,
whose only purpose is to actually bridge GSettings to the shell).
Customizations are still supported in master, and distributions
packaging these extensions for system-wide install may consider
reverting this bug.
2011-12-16 22:11:12 +01:00
Norman L. Smith
dd6b0dc7a9 Changed workspace indicator to use less panel space by displaying only high-lighted workspace number on panel.
Signed-off-by: Norman L. Smith <nls1729@gmail.com>
2011-12-14 00:07:33 +01:00
Giovanni Campagna
85620c0adb alternate-tab: use 3.2 binding names
In 3.2 branch, the GSettings migration hasn't happened yet, so
we need to use underscores in binding names.
Also, uncomment some code that handles keyPressEvent, as the core
shell code causes crashes in all_thumbnails, sometimes.
2011-12-11 15:36:17 +01:00
Giovanni Campagna
a585fa111a alternative-status-menu: disconnect signals on enable() too
We need to disconnect the signals every time we destroy the
IMStatusChooserItem, that is, both at enable() and at disable().

(In particular, disconnecting at disable() doesn't matter much, since
those signals are emitted only very early after login - which is why
enabling in the middle of session worked before)
2011-12-08 01:00:50 +01:00
Bastien Durel
0d15e68904 correct init() function
https://bugzilla.gnome.org/show_bug.cgi?id=665691
2011-12-07 15:07:07 +01:00
Giovanni Campagna
a6c379f5ed alternative-status-menu: disconnect signals for IMStatusChooserItem
In master shell, calling destroy does this automatically, but the
patch was not backported, so we need to hack around this here.
2011-12-07 15:07:07 +01:00
Giovanni Campagna
60efccc4ad windowsNavigator: fix switching with azerty keyboards
Some keyboard layouts (in particular, azerty / french) require
pressing shift to obtain numerals. Therefore we should not cancel
the switch when shift is pressed.
Also, we should accept indifferently left or right modifiers.
2011-12-07 15:07:07 +01:00
Giovanni Campagna
6f4e615999 workspace-indicator: fix removing the last workspace
When closing the last workspace, we could access an invalid
item, causing a TypeError and therefore leaving a stale "Workspace 2"
label.
2011-12-07 15:07:07 +01:00
Giovanni Campagna
2794d9d9d7 drive-menu, example: import GLib before referencing it 2011-12-07 15:07:07 +01:00
Ville-Pekka Vainio
10d4458ef2 Add Finnish translation and fi to LINGUAS 2011-12-04 00:47:34 +02:00
Jorge González
7900ed69c4 Updated Spanish translation 2011-12-03 12:25:19 +01:00
Matej Urbančič
96a79e87f2 Updated Slovenian translation 2011-12-02 16:46:55 +01:00
Marek Černocký
aad6bad1a6 Updated Czech translation 2011-12-01 13:20:48 +01:00
Giovanni Campagna
53fc6c795b Bump version to 3.2.2
Not really a release (there is no gnome-shell 3.2.2), just tagging,
so versions uploaded at extensions.gnome.org correspond to git tags.
2011-11-28 16:29:10 +01:00
Giovanni Campagna
0e37feff15 Cherry-pick translations from master.
Merged manually, sorry if there are fall-outs.
2011-11-28 16:25:35 +01:00
Giovanni Campagna
e488482a2c Introduce local-install.sh script
Cherry-picked from master.
2011-11-28 16:20:29 +01:00
Giovanni Campagna
c4b40926bd Remove all references to localedir from metadata.json
It is not used anymore, now that translations are bundled with
the extension. Also, in the zip files it ended up with my home
folder, which is not nice.

Cherry-picked from master, added code to load translation from
within the extension folder.
2011-11-28 16:20:24 +01:00
Giovanni Campagna
da622f3f61 Add capability to build extension zip-files
Now, typing "make zip-file" will create a standard zip-file for each
extension, with everything necessary, including translations and GSettings schemas.
These files can then be installed with the tweak-tool or uploaded
at extensions.gnome.org

Based on an earlier patch by Jasper St. Pierre.

Cherry-picked from master. The zip file contains everything that is
needed for extensions, but schemas and translations are not loaded
from there, as convenience.js cannot be supported in 3.2
2011-11-28 16:16:28 +01:00
Giovanni Campagna
3c5b893830 apps-menu: skip NoDisplay entries 2011-11-28 16:16:28 +01:00
129 changed files with 7115 additions and 15851 deletions

5
.gitignore vendored
View File

@@ -6,18 +6,13 @@ config.log
config.status
aclocal.m4
autom4te.cache/
data/*.json
po/gnome-shell-extensions.pot
po/POTFILES
po/stamp-it
staging/
zip-files/
*~
*.gmo
metadata.json
*.desktop
*.desktop.in
*.gschema.xml
*.gschema.valid
*.session

View File

@@ -1,15 +1,7 @@
ACLOCAL_AMFLAGS = -I m4 ${ACLOCAL_FLAGS}
DIST_SUBDIRS = data extensions po
SUBDIRS = extensions po
if CLASSIC_MODE
SUBDIRS += data
endif
EXTRA_DIST = lib/convenience.js
DISTCHECK_CONFIGURE_FLAGS = --enable-extensions=all
include include.mk
@@ -17,36 +9,18 @@ include include.mk
zip-file: all
-rm -fR $(builddir)/_build
-rm -fR $(builddir)/zip-files
$(MKDIR_P) $(builddir)/_build; \
$(MKDIR_P) $(builddir)/zip-files; \
$(MAKE) install DESTDIR="$(abs_builddir)/_build"; \
mkdir $(builddir)/_build; \
mkdir $(builddir)/zip-files; \
$(MAKE) install DESTDIR="`pwd`/_build"; \
for i in $(ENABLED_EXTENSIONS); do \
mv "$(builddir)/_build$(topextensiondir)/$${i}$(extensionbase)" "$(builddir)/_build/"; \
cp -r "$(builddir)/_build$(datadir)/locale" "$(builddir)/_build/$${i}$(extensionbase)"; \
cp "$(srcdir)/COPYING" -t "$(builddir)/_build/$${i}$(extensionbase)"; \
cp "$(srcdir)/NEWS" -t "$(builddir)/_build/$${i}$(extensionbase)"; \
if [ -f "$(builddir)/_build$(datadir)/glib-2.0/schemas/$(gschemabase).$${i}.gschema.xml" ]; then \
$(MKDIR_P) "$(builddir)/_build/$${i}$(extensionbase)/schemas"; \
mv "$(builddir)/_build$(datadir)/glib-2.0/schemas/$(gschemabase).$${i}.gschema.xml" "$(builddir)/_build/$${i}$(extensionbase)/schemas"; \
glib-compile-schemas "$(builddir)/_build/$${i}$(extensionbase)/schemas"; \
mv "`pwd`/_build/$(topextensiondir)/$${i}$(extensionbase)" "`pwd`/_build/"; \
cp -r "`pwd`/_build/$(datadir)/locale" "`pwd`/_build/$${i}$(extensionbase)"; \
if [ -f "`pwd`/_build/$(datadir)/glib-2.0/schemas/$(gschemabase).$${i}.gschema.xml" ]; then \
mkdir "`pwd`/_build/$${i}$(extensionbase)/schemas"; \
mv "`pwd`/_build/$(datadir)/glib-2.0/schemas/$(gschemabase).$${i}.gschema.xml" "`pwd`/_build/$${i}$(extensionbase)/schemas"; \
glib-compile-schemas "`pwd`/_build/$${i}$(extensionbase)/schemas"; \
fi; \
(cd "$(builddir)/_build/$${i}$(extensionbase)"; \
(cd "`pwd`/_build/$${i}$(extensionbase)"; \
zip -qr "$(abs_builddir)/zip-files/$${i}$(extensionbase).shell-extension.zip" .; \
); \
done
-rm -fR $(builddir)/_build
localprefix = $(HOME)/.local/share/gnome-shell/extensions
local-install: zip-file
for i in $(ENABLED_EXTENSIONS); do \
uuid="$${i}$(extensionbase)"; \
zip_file="$(abs_builddir)/zip-files/$${uuid}.shell-extension.zip"; \
if [ -d "$(localprefix)/$${uuid}" ]; then \
rm -fR "$(localprefix)/$${uuid}"; \
fi; \
$(MKDIR_P) $(localprefix)/$${uuid}; \
(cd $(localprefix)/$${uuid}; \
unzip -q $${zip_file}; \
); \
done

213
NEWS
View File

@@ -1,207 +1,18 @@
3.7.92
======
* misc bug fixes to app-menu and window-list
* translation updates (de, sl, pt_BR, ru)
3.7.91
======
* various updates for shell changes
* update window-list to always use application icons
* update apps-menu to not load subdirectories as
separate categories
* translation updates (lt, zh_CN)
3.7.90
======
* various fixes to make places-menu behave more
like Nautilus, including showing the machine
name in place of File System
* various updates for shell changes
* alternative-status-menu no longer supports
ConsoleKit systems, you need to install logind
to have suspend or hibernate
* translation updates (es, cz, pl, sr)
3.7.5.1
=======
* new extension forgotten in previous NEWS entry:
windows-list
* also forgotten previously: classic mode got a new
GNOME2 style
* build fixes
3.7.5
3.2.2
=====
* places-menu is back in the classic extensions, with
a new old GNOME-2 look
* classic mode moved the date menu to right, where we
all know it rightly belongs
* apps-menu received a face-lift, with the inclusion
of a reduced form of AxeMenu
* new extension in the classic set: launch-new-instance,
which modifies the behavior of clicking in the dash
and app launcher
* alternate-tab, native-window-placement and windowsNavigator
updated for gnome-shell changes
* translation updates (es, cz, pl)
* various: fix missing GLib import
* workspace-indicator: fix when removing the last workspace
* alternative-status-menu: fix long standing crash without avatar
* alternate-tab: use GConf binding names
* all: remove GSettings usage and allow local installation
* all: update translations
3.7.4
3.2.2
=====
* a separate configure switch has been added to enable
classic mode session definitions
* places-menu is no longer part of the classic-mode
extension set
* updated translations (ar, gl, hu, lt, pt_BR, sr)
3.7.3
=====
* new extensions: default-min-max, static-workspaces
* alternate-tab now uses the built-in window switcher and just
takes over the switch-application keybinding
* workspace-indicator: is no longer part of classic-mode
* we now install classic-mode data files for gdm, gnome-session
and gnome-shell, so if you enable classic-mode you get a new
session option in GDM
* updated translations (ar, es, pl, ru, sl, zh_HK, zh_TW)
3.7.2
=====
* fixed crashes with places-menu, windowsNavigator, alternate-tab
and native-window-placement
* alternate-tab now hides attached modal dialogs
* places-menu has restored support for Nautilus 3.4
* the default for hibernate is now to show in alternative-status-menu
* some extensions are now tagged as "classic", and can be chosen with
--enable-extensions=classic-mode
* dock and gajim were removed at the beginning of the 3.7.1 cycle,
as they were buggy and unmaintained
* updated translations (ar, cs, de, el, es, gl, id, lt, lv, pa, pl
ru, sk, sl, sr, sr@latin)
3.6.1
=====
* fixed alternative-status-menu for the new lock screen
* squashed some alternate-tab warnings
* drive-menu now works with 3.6 again
* updated translations (ar, cs, el, es, gl, id, lv, pl, sl)
3.6.0
=====
* major rework in places menu, to make it work without
removed supporting code in the shell and to make it look like
the nautilus sidebar
(similar work would be needed for drive-menu, not done yet)
* updated translations (ca, cs, de, el, en_GB, es, fi, hu, id, lt,
pl, pt_BR, ru, sl, sr)
3.5.91
======
* various crashers were fixed in alternative-tab
* auto-move-windows now can be made to work with static workspaces
* place-menu is now on the left and uses symbolic icons like Files
* StIconType usage was removed from all extensions, after it was
removed in core
* systemMonitor, xrandr-indicator, apps-menu, places-menu,
alternative-status-menu were updated for the newer shell
* updated translations (es, gl, it, pl, sl)
3.5.90
======
* alternate-tab has been reworked again, the old mode switch
was removed and the all&thumbnails code extended to handle
icons and filtering to the workspace
* alternate-tab thumbnails now reflect the aspect ratio of the windows
* systemMonitor now shows a tooltip above the indicator
* native-window-placement, systemMonitor and windowsNavigator have been updated
for the newer shell
* updated translations (es, pa)
3.5.5
=====
* convenience module has been relicensed to BSD,
for compatibility with GPLv3 extensions
* alternate-tab has been refactored and seen various
improvements to all&thumbnails mode, including a new
overlaid application icon
* updated translations (lt, id, sr)
3.5.4
=====
* updated translations (de, es, ar, sl, lv, zh_CN)
3.5.2
=====
* removable-drive-menu is now a11y friendly
* the dock can now be placed on any monitor, not just the primary
* dock is now clipped to its monitor
* alternative-status-menu now exposes GSettings for Suspend
and Hibernate visibility - no UI yet
* more gnome-shell API changes (places-menu, removable-drive-menu,
alternative-status-menu)
* miscellaneous bug fixes (native-window-placement, gajim,
auto-move-windows)
* updated translations
3.4.0
=====
* build system improvements
* updated translations (ar, cs, fr)
3.3.92
======
* various updates for gnome-shell API changes (dock,
native-window-placement)
* local-install is now a make rule, not a shell script
* updated translations (zh, es, sw, ga, hu, it, no, pt_BR, de, sl,
pl, la, fi, sr)
3.3.90
======
* system wide installation via "make install" is possible
again
* alternate-tab can now pre-activate the selected window
* auto-move-windows, workspace-indicator and example gained
new preference dialogs
* workspace-indicator: fixed a bug wrt focus stealing prevention
* updated translations (es, pt_BR, it, sl, gl, sr)
3.3.5
=====
* improvements to the build system and convenience module,
making it easier for other extensions to use, and bringing
it up to date with gnome-shell changes
* all extensions were ported to the Lang.Class framework
(except xrandr-indicator, which is pending GDBus merge)
* alternate-tab and dock were slightly refactored to clean up
some old code
3.3.4
=====
* improved styling of windowsNavigator tooltips
* fixed windowsNavigator when used with the numeric keypad
* fixed native-window-placement with custom button layout
* updated translations (pt_BR, cz)
3.3.3
=====
* windowsNavigator was fixed to work with azerty keyboards
* drive-menu was changed to use media-eject icon instead of media-optical
* dock: the default value of hide-effect is now move
* dock: if autohide is disabled, now it pushes maximized windows aside
* dock was updated to match current core shell styling
* native-window-placement: position stategy setting was removed
* alternative-status-menu no longer conflicts with other extensions
in the user menu
* various other minor bug fixes
* updated translations (zh, uk, es, it, cz, sl, sk, fi)
3.3.2
=====
* all extensions are now self-contained, including l10n and settings
* introduce a convenience module that can be shared among all extensions
* you can know build an installable zip file with make zip-file
* apps-menu no longer shows NoDisplay apps
* alternative-status-menu, alternate-tab: fix for master shell
* made extensions self-contained with respect to translations
(for schema files gnome-shell master is needed)
* cherry-picked some bug fixes
* cherry-picked translations
3.2.1
=====

View File

@@ -1,10 +1,10 @@
AC_PREREQ(2.63)
AC_INIT([gnome-shell-extensions],[3.7.92],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&component=extensions])
AC_INIT([gnome-shell-extensions],[3.2.3],[https://bugzilla.gnome.org/enter_bug.cgi?product=gnome-shell&component=extensions])
AC_CONFIG_MACRO_DIR([m4])
AC_CONFIG_AUX_DIR([config])
AM_INIT_AUTOMAKE([1.10 dist-xz no-dist-gzip foreign tar-ustar])
AM_INIT_AUTOMAKE([1.10 dist-bzip2 no-dist-gzip foreign tar-ustar])
m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])])
@@ -18,45 +18,24 @@ PKG_PROG_PKG_CONFIG([0.22])
GLIB_GSETTINGS
SHELL_VERSION="$PACKAGE_VERSION"
shell_major=`echo "$PACKAGE_VERSION" | cut -d'.' -f1`
shell_minor=`echo "$PACKAGE_VERSION" | cut -d'.' -f2`
if test "$(($shell_minor % 2))" -eq 0; then
SHELL_VERSION="$shell_major.$shell_minor"
fi
AC_SUBST([SHELL_VERSION])
dnl keep this in alphabetic order
CLASSIC_EXTENSIONS="apps-menu places-menu alternate-tab default-min-max launch-new-instance static-workspaces window-list"
DEFAULT_EXTENSIONS="$CLASSIC_EXTENSIONS alternative-status-menu drive-menu windowsNavigator workspace-indicator"
ALL_EXTENSIONS="$DEFAULT_EXTENSIONS auto-move-windows example native-window-placement systemMonitor user-theme xrandr-indicator"
AC_SUBST(CLASSIC_EXTENSIONS, [$CLASSIC_EXTENSIONS])
dnl by default, install only extensions that do not change completely the shell experience,
dnl that don't require GSettings and that don't require external packages for typelibs
dnl (so basically only menus, status icons, search providers, overview tabs, message tray sources, etc.)
DEFAULT_EXTENSIONS="alternative-status-menu apps-menu dock drive-menu gajim places-menu windowsNavigator workspace-indicator"
ALL_EXTENSIONS="$DEFAULT_EXTENSIONS alternate-tab auto-move-windows example native-window-placement systemMonitor user-theme xrandr-indicator"
AC_SUBST(ALL_EXTENSIONS, [$ALL_EXTENSIONS])
AC_ARG_ENABLE([extensions],
[AS_HELP_STRING([--enable-extensions],[Space separated list of extensions to enable.
The default is to build and distribute all extensions that can be installed in the home directory and have no external depedencies.
Use "all" to enable all available extensions, or "classic-mode" to enable extensions that restore GNOME 2 functionality.])],
The default is to build all extensions that can be installed in the home directory and have no external depedencies.
Use "all" to enable all available extensions.])],
[],
[enable_extensions=$DEFAULT_EXTENSIONS]
)
if test x"$enable_extensions" = xall; then
if test x$enable_extensions = xall; then
enable_extensions="$ALL_EXTENSIONS"
enable_classic_mode_default=yes
elif test x"$enable_extensions" = xclassic-mode; then
enable_extensions="$CLASSIC_EXTENSIONS"
enable_classic_mode_default=yes
else
enable_classic_mode_default=no
fi
AC_ARG_ENABLE([classic-mode],
[AS_HELP_STRING([--enable-classic-mode],[Enable installing data files for classic mode.
Defaults to yes if enabling all or classic-mode extensions, and no otherwise.])],
[],
[enable_classic_mode=$enable_classic_mode_default])
AM_CONDITIONAL([CLASSIC_MODE], [test x"$enable_classic_mode" != xno])
ENABLED_EXTENSIONS=
for e in $enable_extensions; do
case $e in
@@ -71,7 +50,7 @@ for e in $enable_extensions; do
[AC_MSG_WARN([gnome-desktop-3.0 not found, disabling xrandr-indicator])])
;;
dnl keep this in alphabetic order
alternate-tab|alternative-status-menu|apps-menu|auto-move-windows|default-min-max|drive-menu|example|launch-new-instance|native-window-placement|places-menu|static-workspaces|user-theme|window-list|windowsNavigator|workspace-indicator)
alternate-tab|alternative-status-menu|apps-menu|auto-move-windows|dock|drive-menu|example|gajim|native-window-placement|places-menu|user-theme|windowsNavigator|workspace-indicator)
ENABLED_EXTENSIONS="$ENABLED_EXTENSIONS $e"
;;
*)
@@ -83,21 +62,18 @@ AC_SUBST(ENABLED_EXTENSIONS, [$ENABLED_EXTENSIONS])
dnl Please keep this sorted alphabetically
AC_CONFIG_FILES([
data/Makefile
extensions/alternate-tab/Makefile
extensions/alternative-status-menu/Makefile
extensions/apps-menu/Makefile
extensions/auto-move-windows/Makefile
extensions/default-min-max/Makefile
extensions/dock/Makefile
extensions/drive-menu/Makefile
extensions/example/Makefile
extensions/launch-new-instance/Makefile
extensions/gajim/Makefile
extensions/native-window-placement/Makefile
extensions/places-menu/Makefile
extensions/static-workspaces/Makefile
extensions/systemMonitor/Makefile
extensions/user-theme/Makefile
extensions/window-list/Makefile
extensions/windowsNavigator/Makefile
extensions/workspace-indicator/Makefile
extensions/xrandr-indicator/Makefile

View File

@@ -1,64 +0,0 @@
include $(top_srcdir)/include.mk
desktopdir = $(datadir)/applications
desktop_in_in_files = gnome-shell-classic.desktop.in.in
desktop_in_files = $(desktop_in_in_files:.desktop.in.in=.desktop.in)
desktop_DATA = $(desktop_in_files:.desktop.in=.desktop)
sessiondir = $(datadir)/gnome-session/sessions
session_in_in_files = gnome-classic.session.desktop.in.in
session_in_files = $(session_in_in_files:.session.desktop.in.in=.session.desktop.in)
session_DATA = $(session_in_files:.session.desktop.in=.session)
xsessiondir = $(datadir)/xsessions
xsession_in_files = gnome-classic.desktop.in
xsession_DATA = $(xsession_in_files:.desktop.in=.desktop)
modedir = $(datadir)/gnome-shell/modes
mode_in_files = classic.json.in
mode_DATA = $(mode_in_files:.json.in=.json)
themedir = $(datadir)/gnome-shell/theme
theme_DATA = \
$(srcdir)/classic-toggle-off-intl.svg \
$(srcdir)/classic-toggle-off-us.svg \
$(srcdir)/classic-toggle-on-intl.svg \
$(srcdir)/classic-toggle-on-us.svg \
$(srcdir)/gnome-classic.css \
$(NULL)
%.desktop.in:%.desktop.in.in
$(AM_V_GEN) sed \
-e "s|\@libexecdir\@|$(libexecdir)|" \
-e "s|\@bindir\@|$(bindir)|" \
-e "s|\@VERSION\@|$(VERSION)|" \
$< > $@
comma:=,
empty:=
space:= $(empty) $(empty)
extensions:=$(patsubst %,\"%$(extensionbase)\",$(CLASSIC_EXTENSIONS))
extension_list:=$(subst $(space),$(comma),$(extensions))
%.json:%.json.in
$(AM_V_GEN) sed \
-e "s|\@CLASSIC_EXTENSIONS\@|$(extension_list)|g" \
$< > $@
%.session: %.session.desktop.in $(INTLTOOL_MERGE) $(wildcard $(top_srcdir)/po/*.po) ; LC_ALL=C $(INTLTOOL_MERGE) -d -u -c $(top_builddir)/po/.intltool-merge-cache $(top_srcdir)/po $< $@
@INTLTOOL_DESKTOP_RULE@
EXTRA_DIST = \
$(desktop_in_in_files) \
$(session_in_in_files) \
$(xsession_in_files) \
$(mode_in_files) \
$(theme_DATA) \
$(NULL)
CLEANFILES = \
$(desktop_DATA) \
$(session_DATA) \
$(xsession_DATA) \
$(mode_DATA) \
$(NULL)

View File

@@ -1,250 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="65"
height="22"
id="svg10865"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="toggle-off-us.svg">
<defs
id="defs10867">
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient62852-6-5"
id="linearGradient62981-1-1"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.85639946,0,0,0.81059641,27.810405,92.069729)"
x1="740"
y1="486.10501"
x2="740"
y2="505.3204" />
<linearGradient
id="linearGradient62852-6-5">
<stop
id="stop62854-6-7"
offset="0"
style="stop-color:#ffffff;stop-opacity:1" />
<stop
style="stop-color:#eeeeec;stop-opacity:1"
offset="0.97726452"
id="stop62858-8-0" />
<stop
id="stop62860-5-3"
offset="1"
style="stop-color:#f5f5f4;stop-opacity:1" />
</linearGradient>
<inkscape:path-effect
is_visible="true"
id="path-effect62989-8-0"
effect="spiro" />
<linearGradient
id="linearGradient62821-5-8">
<stop
id="stop62823-2-4"
offset="0"
style="stop-color:#d1d3d1;stop-opacity:1;" />
<stop
id="stop62825-3-8"
offset="1"
style="stop-color:#ebebeb;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient62852-6-5-3">
<stop
id="stop62854-6-7-6"
offset="0"
style="stop-color:#ffffff;stop-opacity:1" />
<stop
style="stop-color:#eeeeec;stop-opacity:1"
offset="0.97726452"
id="stop62858-8-0-3" />
<stop
id="stop62860-5-3-9"
offset="1"
style="stop-color:#f5f5f4;stop-opacity:1" />
</linearGradient>
<inkscape:path-effect
effect="spiro"
id="path-effect62829-6-8-0"
is_visible="true" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient62821-5-8-1"
id="linearGradient62864-0-3-1"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3066667,0,0,1,-197.64667,0)"
x1="702.58966"
y1="484.49405"
x2="702.58966"
y2="507.42715" />
<linearGradient
id="linearGradient62821-5-8-1">
<stop
id="stop62823-2-4-2"
offset="0"
style="stop-color:#d1d3d1;stop-opacity:1;" />
<stop
id="stop62825-3-8-9"
offset="1"
style="stop-color:#ebebeb;stop-opacity:1;" />
</linearGradient>
<linearGradient
y2="507.42715"
x2="702.58966"
y1="484.49405"
x1="702.58966"
gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
gradientUnits="userSpaceOnUse"
id="linearGradient11647"
xlink:href="#linearGradient62821-5-8-1"
inkscape:collect="always" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="-133.20351"
inkscape:cy="20.84411"
inkscape:document-units="px"
inkscape:current-layer="g62929"
showgrid="false"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:snap-others="false"
inkscape:window-width="2560"
inkscape:window-height="1380"
inkscape:window-x="1600"
inkscape:window-y="28"
inkscape:window-maximized="1"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid11512" />
</sodipodi:namedview>
<metadata
id="metadata10870">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1030.3622)">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
style="display:inline"
id="g62929"
transform="translate(-643.91421,517.29894)">
<g
transform="translate(0,30)"
id="g62931">
<rect
style="fill:url(#linearGradient62864-0-3-1);fill-opacity:1;stroke:#a6a8a6;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;color:#000000;color-interpolation:sRGB;color-interpolation-filters:linearRGB;fill-rule:nonzero;stroke-linejoin:miter;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;clip-rule:nonzero"
id="rect62935"
width="63.856125"
height="21.093594"
x="644.5"
y="483.5"
rx="2"
ry="2" />
<rect
style="fill:url(#linearGradient62981-1-1);fill-opacity:1;stroke:#777b7a;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
id="rect62937"
width="29.97398"
height="17.022524"
x="646.55896"
y="485.61429"
rx="1"
ry="1" />
<g
transform="translate(-38.048674,-1.9445437)"
id="g62939">
<rect
ry="1"
rx="1"
y="492"
x="695"
height="8"
width="2"
id="rect62941"
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
<rect
ry="1"
rx="1"
y="492"
x="699"
height="8"
width="2"
id="rect62943"
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
<rect
ry="1"
rx="1"
y="492"
x="703"
height="8"
width="2"
id="rect62945"
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
</g>
<path
inkscape:connector-curvature="0"
inkscape:original-d="m 647.78624,486.57192 27.94632,0"
inkscape:path-effect="#path-effect62989-8-0"
id="path62947"
d="m 647.78624,486.57192 27.94632,0"
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<g
id="g11665"
transform="matrix(0.78906097,0,0,0.78906097,178.78814,111.57844)" />
<path
style="fill:none;stroke:#ffffff;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
transform="translate(642.41421,514.02037)"
d="m 55,11.875 a 4.625,4.625 0 1 1 -9.25,0 4.625,4.625 0 1 1 9.25,0 z"
sodipodi:ry="4.625"
sodipodi:rx="4.625"
sodipodi:cy="11.875"
sodipodi:cx="50.375"
id="path3786"
sodipodi:type="arc" />
<path
sodipodi:type="arc"
id="path3016"
sodipodi:cx="50.375"
sodipodi:cy="11.875"
sodipodi:rx="4.625"
sodipodi:ry="4.625"
d="m 55,11.875 a 4.625,4.625 0 1 1 -9.25,0 4.625,4.625 0 1 1 9.25,0 z"
transform="translate(642.41421,512.02037)"
style="fill:none;stroke:#555753;stroke-width:2;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 8.1 KiB

View File

@@ -1,255 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="65"
height="22"
id="svg10865"
version="1.1"
inkscape:version="0.48+devel r12050"
sodipodi:docname="toggle-off-us.svg">
<defs
id="defs10867">
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient62852-6-5"
id="linearGradient62981-1-1"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.85639946,0,0,0.81059641,27.810405,92.069729)"
x1="740"
y1="486.10501"
x2="740"
y2="505.3204" />
<linearGradient
id="linearGradient62852-6-5">
<stop
id="stop62854-6-7"
offset="0"
style="stop-color:#ffffff;stop-opacity:1" />
<stop
style="stop-color:#eeeeec;stop-opacity:1"
offset="0.97726452"
id="stop62858-8-0" />
<stop
id="stop62860-5-3"
offset="1"
style="stop-color:#f5f5f4;stop-opacity:1" />
</linearGradient>
<inkscape:path-effect
is_visible="true"
id="path-effect62989-8-0"
effect="spiro" />
<linearGradient
id="linearGradient62821-5-8">
<stop
id="stop62823-2-4"
offset="0"
style="stop-color:#d1d3d1;stop-opacity:1;" />
<stop
id="stop62825-3-8"
offset="1"
style="stop-color:#ebebeb;stop-opacity:1;" />
</linearGradient>
<linearGradient
id="linearGradient62852-6-5-3">
<stop
id="stop62854-6-7-6"
offset="0"
style="stop-color:#ffffff;stop-opacity:1" />
<stop
style="stop-color:#eeeeec;stop-opacity:1"
offset="0.97726452"
id="stop62858-8-0-3" />
<stop
id="stop62860-5-3-9"
offset="1"
style="stop-color:#f5f5f4;stop-opacity:1" />
</linearGradient>
<inkscape:path-effect
effect="spiro"
id="path-effect62829-6-8-0"
is_visible="true" />
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient62821-5-8-1"
id="linearGradient62864-0-3-1"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3066667,0,0,1,-197.64667,0)"
x1="702.58966"
y1="484.49405"
x2="702.58966"
y2="507.42715" />
<linearGradient
id="linearGradient62821-5-8-1">
<stop
id="stop62823-2-4-2"
offset="0"
style="stop-color:#d1d3d1;stop-opacity:1;" />
<stop
id="stop62825-3-8-9"
offset="1"
style="stop-color:#ebebeb;stop-opacity:1;" />
</linearGradient>
<linearGradient
y2="507.42715"
x2="702.58966"
y1="484.49405"
x1="702.58966"
gradientTransform="matrix(1.3066667,0,0,1,-841.64667,-483)"
gradientUnits="userSpaceOnUse"
id="linearGradient11647"
xlink:href="#linearGradient62821-5-8-1"
inkscape:collect="always" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="50.925774"
inkscape:cy="11.296867"
inkscape:document-units="px"
inkscape:current-layer="g62929"
showgrid="false"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:snap-others="false"
inkscape:window-width="2560"
inkscape:window-height="1375"
inkscape:window-x="1600"
inkscape:window-y="28"
inkscape:window-maximized="1"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid11512" />
</sodipodi:namedview>
<metadata
id="metadata10870">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1030.3622)">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
style="display:inline"
id="g62929"
transform="translate(-643.91421,517.29894)">
<g
transform="translate(0,30)"
id="g62931">
<rect
style="fill:url(#linearGradient62864-0-3-1);fill-opacity:1;stroke:#a6a8a6;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;color:#000000;color-interpolation:sRGB;color-interpolation-filters:linearRGB;fill-rule:nonzero;stroke-linejoin:miter;stroke-dashoffset:0;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate;clip-rule:nonzero"
id="rect62935"
width="63.856125"
height="21.093594"
x="644.5"
y="483.5"
rx="2"
ry="2" />
<rect
style="fill:url(#linearGradient62981-1-1);fill-opacity:1;stroke:#777b7a;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
id="rect62937"
width="29.97398"
height="17.022524"
x="646.55896"
y="485.61429"
rx="1"
ry="1" />
<g
transform="translate(-38.048674,-1.9445437)"
id="g62939">
<rect
ry="1"
rx="1"
y="492"
x="695"
height="8"
width="2"
id="rect62941"
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
<rect
ry="1"
rx="1"
y="492"
x="699"
height="8"
width="2"
id="rect62943"
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
<rect
ry="1"
rx="1"
y="492"
x="703"
height="8"
width="2"
id="rect62945"
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
</g>
<path
inkscape:connector-curvature="0"
inkscape:original-d="m 647.78624,486.57192 27.94632,0"
inkscape:path-effect="#path-effect62989-8-0"
id="path62947"
d="m 647.78624,486.57192 27.94632,0"
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<g
id="g11665"
transform="matrix(0.78906097,0,0,0.78906097,167.78814,111.57844)">
<text
xml:space="preserve"
style="font-size:13.14816952px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;display:inline;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
x="644.02277"
y="534.94739"
id="text62949-7"
sodipodi:linespacing="125%"
transform="scale(1.0113976,0.98873084)"><tspan
sodipodi:role="line"
id="tspan62951-7"
x="644.02277"
y="534.94739">OFF</tspan></text>
<text
xml:space="preserve"
style="font-size:12.69556618px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#2e3436;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
x="644.46393"
y="533.87158"
id="text62949"
sodipodi:linespacing="125%"
transform="scale(1.0113976,0.98873084)"><tspan
sodipodi:role="line"
id="tspan62951"
x="644.46393"
y="533.87158">OFF</tspan></text>
</g>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 8.5 KiB

View File

@@ -1,199 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="65"
height="22"
id="svg10865"
version="1.1"
inkscape:version="0.48.4 r9939"
sodipodi:docname="toggle-on-us.svg">
<defs
id="defs10867">
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient62991-9-6"
id="linearGradient62979-8-1"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3066667,0,0,1,-197.64667,0)"
x1="702.58966"
y1="484.49405"
x2="702.58966"
y2="507.42715" />
<linearGradient
inkscape:collect="always"
id="linearGradient62991-9-6">
<stop
style="stop-color:#589fe9;stop-opacity:1"
offset="0"
id="stop62993-6-9" />
<stop
style="stop-color:#a3cefe;stop-opacity:1"
offset="1"
id="stop62995-1-6" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient62852-6-5"
id="linearGradient62981-1-1"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.85639946,0,0,0.81059641,57.747905,92.132229)"
x1="740"
y1="486.10501"
x2="740"
y2="505.3204" />
<linearGradient
id="linearGradient62852-6-5">
<stop
id="stop62854-6-7"
offset="0"
style="stop-color:#ffffff;stop-opacity:1" />
<stop
style="stop-color:#eeeeec;stop-opacity:1"
offset="0.97726452"
id="stop62858-8-0" />
<stop
id="stop62860-5-3"
offset="1"
style="stop-color:#f5f5f4;stop-opacity:1" />
</linearGradient>
<inkscape:path-effect
is_visible="true"
id="path-effect62989-8-0"
effect="spiro" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="14.199007"
inkscape:cy="11.127758"
inkscape:document-units="px"
inkscape:current-layer="g62929"
showgrid="false"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:snap-others="false"
inkscape:window-width="2560"
inkscape:window-height="1380"
inkscape:window-x="1600"
inkscape:window-y="28"
inkscape:window-maximized="1"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid11512" />
</sodipodi:namedview>
<metadata
id="metadata10870">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title></dc:title>
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1030.3622)">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
style="display:inline"
id="g62929"
transform="translate(-643.91421,517.29894)">
<g
transform="translate(0,30)"
id="g62931">
<rect
style="fill:url(#linearGradient62979-8-1);fill-opacity:1;stroke:#1a71cc;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect62935"
width="63.856125"
height="21.093594"
x="644.5"
y="483.5"
rx="2"
ry="2" />
<rect
style="fill:url(#linearGradient62981-1-1);fill-opacity:1;stroke:#777b7a;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
id="rect62937"
width="29.97398"
height="17.022524"
x="676.49646"
y="485.67679"
rx="1"
ry="1" />
<g
transform="translate(-7.9861743,-1.9445437)"
id="g62939">
<rect
ry="1"
rx="1"
y="492"
x="695"
height="8"
width="2"
id="rect62941"
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
<rect
ry="1"
rx="1"
y="492"
x="699"
height="8"
width="2"
id="rect62943"
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
<rect
ry="1"
rx="1"
y="492"
x="703"
height="8"
width="2"
id="rect62945"
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
</g>
<path
inkscape:connector-curvature="0"
inkscape:original-d="m 677.59874,486.57192 27.94632,0"
inkscape:path-effect="#path-effect62989-8-0"
id="path62947"
d="m 677.59874,486.57192 27.94632,0"
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<path
inkscape:connector-curvature="0"
id="path4444"
d="m 661.91421,522.09451 0,7"
style="fill:none;stroke:#1a71cc;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;color:#000000;fill-opacity:1;fill-rule:nonzero;marker:none;visibility:visible;display:inline;overflow:visible;enable-background:accumulate" />
<path
style="fill:none;stroke:#ffffff;stroke-width:2;stroke-linecap:square;stroke-linejoin:miter;stroke-opacity:1;stroke-miterlimit:4;stroke-dasharray:none"
d="m 18,7.96875 0,7"
id="path3922"
inkscape:connector-curvature="0"
transform="translate(643.91421,513.06326)" />
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.5 KiB

View File

@@ -1,212 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:xlink="http://www.w3.org/1999/xlink"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="65"
height="22"
id="svg10865"
version="1.1"
inkscape:version="0.48+devel r12050"
sodipodi:docname="toggle-on-us.svg">
<defs
id="defs10867">
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient62991-9-6"
id="linearGradient62979-8-1"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(1.3066667,0,0,1,-197.64667,0)"
x1="702.58966"
y1="484.49405"
x2="702.58966"
y2="507.42715" />
<linearGradient
inkscape:collect="always"
id="linearGradient62991-9-6">
<stop
style="stop-color:#589fe9;stop-opacity:1"
offset="0"
id="stop62993-6-9" />
<stop
style="stop-color:#a3cefe;stop-opacity:1"
offset="1"
id="stop62995-1-6" />
</linearGradient>
<linearGradient
inkscape:collect="always"
xlink:href="#linearGradient62852-6-5"
id="linearGradient62981-1-1"
gradientUnits="userSpaceOnUse"
gradientTransform="matrix(0.85639946,0,0,0.81059641,57.747905,92.132229)"
x1="740"
y1="486.10501"
x2="740"
y2="505.3204" />
<linearGradient
id="linearGradient62852-6-5">
<stop
id="stop62854-6-7"
offset="0"
style="stop-color:#ffffff;stop-opacity:1" />
<stop
style="stop-color:#eeeeec;stop-opacity:1"
offset="0.97726452"
id="stop62858-8-0" />
<stop
id="stop62860-5-3"
offset="1"
style="stop-color:#f5f5f4;stop-opacity:1" />
</linearGradient>
<inkscape:path-effect
is_visible="true"
id="path-effect62989-8-0"
effect="spiro" />
</defs>
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="1"
inkscape:cx="8.2018252"
inkscape:cy="8.0650495"
inkscape:document-units="px"
inkscape:current-layer="g62929"
showgrid="false"
borderlayer="true"
inkscape:showpageshadow="false"
inkscape:snap-nodes="false"
inkscape:snap-bbox="true"
inkscape:bbox-paths="true"
inkscape:snap-others="false"
inkscape:window-width="2560"
inkscape:window-height="1375"
inkscape:window-x="1600"
inkscape:window-y="28"
inkscape:window-maximized="1"
showborder="false">
<inkscape:grid
type="xygrid"
id="grid11512" />
</sodipodi:namedview>
<metadata
id="metadata10870">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-1030.3622)">
<g
inkscape:export-ydpi="90"
inkscape:export-xdpi="90"
inkscape:export-filename="/home/lapo.fedora/SparkleShare/gnome-mockups/system-settings/network/network-panel-summary.png"
style="display:inline"
id="g62929"
transform="translate(-643.91421,517.29894)">
<g
transform="translate(0,30)"
id="g62931">
<rect
style="fill:url(#linearGradient62979-8-1);fill-opacity:1;stroke:#1a71cc;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
id="rect62935"
width="63.856125"
height="21.093594"
x="644.5"
y="483.5"
rx="2"
ry="2" />
<rect
style="fill:url(#linearGradient62981-1-1);fill-opacity:1;stroke:#777b7a;stroke-width:1;stroke-linecap:round;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none;display:inline"
id="rect62937"
width="29.97398"
height="17.022524"
x="676.49646"
y="485.67679"
rx="1"
ry="1" />
<g
transform="translate(-7.9861743,-1.9445437)"
id="g62939">
<rect
ry="1"
rx="1"
y="492"
x="695"
height="8"
width="2"
id="rect62941"
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
<rect
ry="1"
rx="1"
y="492"
x="699"
height="8"
width="2"
id="rect62943"
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
<rect
ry="1"
rx="1"
y="492"
x="703"
height="8"
width="2"
id="rect62945"
style="fill:#e8e8e5;fill-opacity:1;stroke:none;display:inline" />
</g>
<path
inkscape:connector-curvature="0"
inkscape:original-d="m 677.59874,486.57192 27.94632,0"
inkscape:path-effect="#path-effect62989-8-0"
id="path62947"
d="m 677.59874,486.57192 27.94632,0"
style="fill:none;stroke:#ffffff;stroke-width:1px;stroke-linecap:round;stroke-linejoin:miter;stroke-opacity:1" />
</g>
<text
transform="scale(1.0113976,0.98873084)"
sodipodi:linespacing="125%"
id="text62949-7"
y="534.96918"
x="646.71399"
style="font-size:10.01104736px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#1a71cc;fill-opacity:1;stroke:none;display:inline;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
xml:space="preserve"><tspan
y="534.96918"
x="646.71399"
id="tspan62951-7"
sodipodi:role="line">ON</tspan></text>
<text
transform="scale(1.0113976,0.98873084)"
sodipodi:linespacing="125%"
id="text62949"
y="533.94482"
x="646.71399"
style="font-size:10.01104736px;font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;line-height:125%;letter-spacing:0px;word-spacing:0px;fill:#ffffff;fill-opacity:1;stroke:none;font-family:Cantarell;-inkscape-font-specification:Cantarell Bold"
xml:space="preserve"><tspan
y="533.94482"
x="646.71399"
id="tspan62951"
sodipodi:role="line">ON</tspan></text>
</g>
</g>
</svg>

Before

Width:  |  Height:  |  Size: 6.9 KiB

View File

@@ -1,10 +0,0 @@
{
"parentMode": "user",
"stylesheetName": "gnome-classic.css",
"enabledExtensions": [@CLASSIC_EXTENSIONS@],
"panel": { "left": ["activities", "appMenu"],
"center": [],
"right": ["a11y", "keyboard", "volume", "bluetooth",
"network", "battery", "dateMenu", "userMenu"]
}
}

View File

@@ -1,210 +0,0 @@
@import url("gnome-shell.css");
/* FIXME:
- white edge highlight with text-shadow and icon-shadow for panel-button
- better shading of the panel (dark 5%) - impossible without multipoint gradients, image-bg is a hack
- bubble menus: separators
- submenus (network, ...)
- startup notification spinner
*/
#panel {
background-color: #e9e9e9 !important;
background-gradient-direction: vertical;
background-gradient-end: #d0d0d0;
border-top-color: #666; /* we don't support non-uniform border-colors and
use the top border color for any border, so we
need to set it even if all we want is a bottom
border */
border-bottom: 1px solid #666;
app-icon-bottom-clip: 0px;
/* hrm, still no multipoint gradients
background-image: linear-gradient(left, rgba(255, 255, 255, 0), rgba(255, 255, 255, 1) 50%, rgba(255, 255, 255, 0)) !important;*/
}
#panel:overview {
background-color: #000 !important;
background-gradient-end: #000 !important;
border-top-color: #000;
border-bottom: 1px solid #000 !important;
}
#panel.lock-screen {
background-color: rgba(0,0,0,0.3) !important;
background-gradient-end: rgba(0,0,0,0.3) !important;
border-top-color: transparent;
}
#panel.unlock-screen {
background-color: transparent !important;
background-gradient-end: transparent !important;
border-top-color: transparent;
}
/* TOP BAR */
.panel-corner,
.panel-corner:active,
.panel-corner:overview,
.panel-corner:focus {
-panel-corner-radius: 0 !important;
}
.panel-button {
color: #555 !important;
-natural-hpadding: 6px !important;
-minimum-hpadding: 3px !important;
}
#panel:overview .panel-button,
#panel.lock-screen .panel-button,
#panel.unlock-screen .panel-button {
color: #ccc !important;
}
.panel-button:hover {
color: #000 !important;
}
#panel:overview .panel-button:hover,
#panel:overview .panel-button:active {
color: white !important;
}
.panel-button > .system-status-icon {
icon-shadow: #fff 0 1px 0 !important; /* FIXME */
}
.panel-button:hover,
.panel-button:active,
.panel-button:overview,
.panel-button:focus {
text-shadow: 0 0 0 transparent !important; /* FIXME: why can't I do none ? */
}
.panel-button:active,
.panel-button:overview,
.panel-button:focus {
background-color: #4a90d9 !important; /* FIXME */
color: #fff !important;
border: none !important;
border-image: none !important;
background-image: none !important;
}
#panelUserMenu {
padding: 0 10px 0 10px !important;
}
#appMenu {
text-shadow: 0 0 0 transparent !important;
}
/* used for the app menu header only */
.label-shadow {
color: rgba(0,0,0,0.5);
}
.label-shadow {
color: rgba(255,255,255,.5) !important;
}
.panel-button:active .label-shadow,
.panel-button:focus .label-shadow {
color: rgba(0,0,0,.5) !important;
}
.popup-menu-boxpointer {
-arrow-background-color: #e9e9e9 !important;
-arrow-border-width: 1px !important;
-arrow-border-color: #aaa !important;
-arrow-border-radius: 3px !important;
color: #000 !important;
-arrow-base: 11px !important;
-arrow-rise: 5px !important;
}
.popup-combo-menu {
background-color: #e9e9e9 !important;
border: 1px solid #aaa !important;
color: #000 !important;
}
.popup-menu-item:active {
background-color: #4a90d9 !important;
color: #fff !important;
}
.popup-menu-item:insensitive {
color: #888;
}
.popup-subtitle-menu-item, .popup-subtitle-menu-item:insensitive {
color: #000;
}
/* CALENDAR */
.calendar {}
.calendar-month-label {
color: #333 !important;
}
.datemenu-date-label,
.events-day-header {
color: #666 !important;
}
.calendar-day-base:active {
color: #fff !important;
background-color: #4a90d9 !important;
background-image: none !important;
border-image: none !important;
}
.calendar-today {
background-color: #4a90d9 !important;
background-image: none !important;
border-image: none !important;
}
.calendar-day-base {
color: #666 !important;
}
.calendar-day-base:hover {
background-color: #666 !important;
color: #fff !important;
}
.calendar-nonwork-day {
color: #999 !important;
}
.events-day-dayname,
.events-day-time {
color: #666 !important;
}
/* VOLUME SLIDER */
.popup-slider-menu-item {
-slider-background-color: #e9e9e9;
-slider-border-color: #999;
-slider-active-background-color: #76b0ec;
-slider-active-border-color: #1f6dbc;
}
/* ON OFF switch */
.toggle-switch-us {
background-image: url("classic-toggle-off-us.svg");
background-size: contain;
}
.toggle-switch-us:checked {
background-image: url("classic-toggle-on-us.svg");
background-size: contain;
}
.toggle-switch-intl {
background-image: url("classic-toggle-off-intl.svg");
background-size: contain;
}
.toggle-switch-intl:checked {
background-image: url("classic-toggle-on-intl.svg");
background-size: contain;
}

View File

@@ -1,7 +0,0 @@
[Desktop Entry]
_Name=GNOME Classic
_Comment=This session logs you into GNOME Classic
Exec=gnome-session --session gnome-classic
TryExec=gnome-session
Icon=
Type=Application

View File

@@ -1,4 +0,0 @@
[GNOME Session]
_Name=GNOME Classic
RequiredComponents=gnome-shell-classic;gnome-settings-daemon;nautilus-classic;
IsRunnableHelper=@libexecdir@/gnome-session-check-accelerated

View File

@@ -1,17 +0,0 @@
[Desktop Entry]
Type=Application
_Name=GNOME Shell Classic
_Comment=Window management and application launching
Exec=@bindir@/gnome-shell --mode=classic
TryExec=@bindir@/gnome-shell
X-GNOME-Bugzilla-Bugzilla=GNOME
X-GNOME-Bugzilla-Product=gnome-shell
X-GNOME-Bugzilla-Component=general
X-GNOME-Bugzilla-Version=@VERSION@
Categories=GNOME;GTK;Core;
OnlyShowIn=GNOME;
NoDisplay=true
X-GNOME-Autostart-Phase=WindowManager
X-GNOME-Provides=panel;windowmanager;
X-GNOME-Autostart-Notify=true
X-GNOME-AutoRestart=false

View File

@@ -1,18 +1,13 @@
include $(top_srcdir)/include.mk
dist_extension_DATA = extension.js stylesheet.css $(EXTRA_MODULES)
nodist_extension_DATA = metadata.json $(top_srcdir)/lib/convenience.js $(EXTRA_EXTENSION)
dist_extension_DATA = extension.js stylesheet.css
nodist_extension_DATA = metadata.json $(EXTRA_EXTENSION)
EXTRA_DIST = metadata.json.in
metadata.json: metadata.json.in $(top_builddir)/config.status
$(AM_V_GEN) sed \
-e "s|[@]extension_id@|$(EXTENSION_ID)|" \
-e "s|[@]uuid@|$(uuid)|" \
-e "s|[@]gschemaname@|$(gschemaname)|" \
-e "s|[@]gettext_domain@|$(GETTEXT_PACKAGE)|" \
-e "s|[@]shell_current@|$(SHELL_VERSION)|" \
-e "s|[@]url@|$(extensionurl)|" \
$< > $@
$(AM_V_GEN) sed -e "s|[@]uuid@|$(uuid)|" \
-e "s|[@]shell_current@|$(PACKAGE_VERSION)|" \
-e "s|[@]url@|$(extensionurl)|" $< > $@
CLEANFILES = metadata.json

View File

@@ -1,5 +1,3 @@
EXTENSION_ID = alternate-tab
EXTRA_MODULES = prefs.js
include ../../extension.mk

View File

@@ -1,64 +1,621 @@
/* -*- mode: js; js-basic-offset: 4; indent-tabs-mode: nil -*- */
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const Lang = imports.lang;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
/* most of the code is borrowed from
* > js/ui/altTab.js <
* of the gnome-shell source code
*/
const AltTab = imports.ui.altTab;
const Clutter = imports.gi.Clutter;
const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Main = imports.ui.main;
const Mainloop = imports.mainloop;
const ModalDialog = imports.ui.modalDialog;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const Tweener = imports.ui.tweener;
const WindowManager = imports.ui.windowManager;
let injections = {};
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const N_ = function(e) { return e };
function init(metadata) {
const POPUP_DELAY_TIMEOUT = 150; // milliseconds
// Settings: choose one of MODES, the description is in MESSAGE
// (master branch has a nice dialog, but we cannot in gnome 3.2)
const BEHAVIOUR = 'all_thumbnails';
const MODES = {
all_thumbnails: function(shellwm, binding, mask, window, backwards) {
let tabPopup = new AltTabPopup2();
if (!tabPopup.show(backwards, binding, mask))
tabPopup.destroy();
},
workspace_icons: function(shellwm, binding, mask, window, backwards) {
if (shellwm._workspaceSwitcherPopup != null)
shellwm._workspaceSwitcherPopup.actor.hide();
let tabPopup = new AltTabPopupW();
if (!tabPopup.show(backwards, binding, mask))
tabPopup.destroy();
}
};
const MESSAGE = N_("This is the first time you use the Alternate Tab extension. \n\
Please choose your preferred behaviour:\n\
\n\
All & Thumbnails:\n\
This mode presents all applications from all workspaces in one selection \n\
list. Instead of using the application icon of every window, it uses small \n\
thumbnails resembling the window itself. \n\
\n\
Workspace & Icons:\n\
This mode let's you switch between the applications of your current \n\
workspace and gives you additionally the option to switch to the last used \n\
application of your previous workspace. This is always the last symbol in \n\
the list and is segregated by a separator/vertical line if available. \n\
Every window is represented by its application icon. \n\
\n\
If you whish to revert to the default behavior for the Alt-Tab switcher, just\n\
disable the extension from extensions.gnome.org or the Advanced Settings application.\
");
function AltTabPopupW() {
this._init();
}
function setKeybinding(name, func) {
Main.wm.setCustomKeybindingHandler(name, Shell.KeyBindingMode.NORMAL, func);
AltTabPopupW.prototype = {
__proto__ : AltTab.AltTabPopup.prototype,
_windowActivated : function(thumbnailList, n) { },
show : function(backward, binding, mask) {
let appSys = Shell.AppSystem.get_default();
let apps = appSys.get_running ();
if (!apps.length)
return false;
if (!Main.pushModal(this.actor)) {
// Probably someone else has a pointer grab, try again with keyboard only
if (!Main.pushModal(this.actor, global.get_current_time(), Meta.ModalOptions.POINTER_ALREADY_GRABBED)) {
return false;
}
}
this._haveModal = true;
this._modifierMask = AltTab.primaryModifier(mask);
this.actor.connect('key-press-event', Lang.bind(this, this._keyPressEvent));
this.actor.connect('key-release-event', Lang.bind(this, this._keyReleaseEvent));
this.actor.connect('button-press-event', Lang.bind(this, this._clickedOutside));
this.actor.connect('scroll-event', Lang.bind(this, this._onScroll));
this._appSwitcher = new WindowSwitcher(apps, this);
this.actor.add_actor(this._appSwitcher.actor);
this._appSwitcher.connect('item-activated', Lang.bind(this, this._appActivated));
this._appSwitcher.connect('item-entered', Lang.bind(this, this._appEntered));
this._appIcons = this._appSwitcher.icons;
// Need to force an allocation so we can figure out whether we
// need to scroll when selecting
this.actor.opacity = 0;
this.actor.show();
this.actor.get_allocation_box();
// Make the initial selection
if (binding == 'switch_group') {
//see AltTab.AltTabPopup.show function
//cached windows are always of length one, so select first app and the window
//the direction doesn't matter, so ignore backward
this._select(0, 0);
} else if (binding == 'switch_group_backward') {
this._select(0, 0);
} else if (binding == 'switch_windows_backward') {
this._select(this._appIcons.length - 1);
} else if (this._appIcons.length == 1) {
this._select(0);
} else if (backward) {
this._select(this._appIcons.length - 1);
} else {
this._select(1);
}
// There's a race condition; if the user released Alt before
// we got the grab, then we won't be notified. (See
// https://bugzilla.gnome.org/show_bug.cgi?id=596695 for
// details.) So we check now. (Have to do this after updating
// selection.)
let [x, y, mods] = global.get_pointer();
if (!(mods & this._modifierMask)) {
this._finish();
return false;
}
// We delay showing the popup so that fast Alt+Tab users aren't
// disturbed by the popup briefly flashing.
this._initialDelayTimeoutId = Mainloop.timeout_add(POPUP_DELAY_TIMEOUT,
Lang.bind(this, function () {
this.actor.opacity = 255;
this._initialDelayTimeoutId = 0;
}));
return true;
},
_finish : function() {
let app = this._appIcons[this._currentApp];
if (!app)
return;
Main.activateWindow(app.cachedWindows[0]);
this.destroy();
}
};
function AppIcon(app, window) {
this._init(app, window);
}
AppIcon.prototype = {
__proto__ : AltTab.AppIcon.prototype,
_init: function(app, window) {
this.app = app;
this.cachedWindows = [];
this.cachedWindows.push(window);
this.actor = new St.BoxLayout({ style_class: 'alt-tab-app',
vertical: true });
this.icon = null;
this._iconBin = new St.Bin({ x_fill: true, y_fill: true });
this.actor.add(this._iconBin, { x_fill: false, y_fill: false } );
let title = window.get_title();
if (title) {
this.label = new St.Label({ text: title });
let bin = new St.Bin({ x_align: St.Align.MIDDLE });
bin.add_actor(this.label);
this.actor.add(bin);
}
else {
this.label = new St.Label({ text: this.app.get_name() });
this.actor.add(this.label, { x_fill: false });
}
}
};
function WindowSwitcher(apps, altTabPopup) {
this._init(apps, altTabPopup);
}
WindowSwitcher.prototype = {
__proto__ : AltTab.AppSwitcher.prototype,
_init : function(apps, altTabPopup) {
AltTab.SwitcherList.prototype._init.call(this, true);
// Construct the AppIcons, sort by time, add to the popup
let activeWorkspace = global.screen.get_active_workspace();
let workspaceIcons = [];
let otherIcons = [];
for (let i = 0; i < apps.length; i++) {
// Cache the window list now; we don't handle dynamic changes here,
// and we don't want to be continually retrieving it
let windows = apps[i].get_windows();
for(let j = 0; j < windows.length; j++) {
let appIcon = new AppIcon(apps[i], windows[j]);
if (this._isWindowOnWorkspace(windows[j], activeWorkspace)) {
workspaceIcons.push(appIcon);
}
else {
otherIcons.push(appIcon);
}
}
}
workspaceIcons.sort(Lang.bind(this, this._sortAppIcon));
otherIcons.sort(Lang.bind(this, this._sortAppIcon));
if(otherIcons.length > 0) {
let mostRecentOtherIcon = otherIcons[0];
otherIcons = [];
otherIcons.push(mostRecentOtherIcon);
}
this.icons = [];
this._arrows = [];
for (let i = 0; i < workspaceIcons.length; i++)
this._addIcon(workspaceIcons[i]);
if (workspaceIcons.length > 0 && otherIcons.length > 0)
this.addSeparator();
for (let i = 0; i < otherIcons.length; i++)
this._addIcon(otherIcons[i]);
this._curApp = -1;
this._iconSize = 0;
this._altTabPopup = altTabPopup;
this._mouseTimeOutId = 0;
},
_isWindowOnWorkspace: function(w, workspace) {
if (w.get_workspace() == workspace)
return true;
return false;
},
_sortAppIcon : function(appIcon1, appIcon2) {
let t1 = appIcon1.cachedWindows[0].get_user_time();
let t2 = appIcon2.cachedWindows[0].get_user_time();
if (t2 > t1) return 1;
else return -1;
}
};
/* This object is never instantiated in the current branch, but
I don't trust git merge enough to remove it */
function AltTabSettingsDialog() {
this._init();
}
AltTabSettingsDialog.prototype = {
__proto__: ModalDialog.ModalDialog.prototype,
_init : function() {
ModalDialog.ModalDialog.prototype._init.call(this, { styleClass: null });
let mainContentBox = new St.BoxLayout({ style_class: 'polkit-dialog-main-layout',
vertical: false });
this.contentLayout.add(mainContentBox,
{ x_fill: true,
y_fill: true });
let messageBox = new St.BoxLayout({ style_class: 'polkit-dialog-message-layout',
vertical: true });
mainContentBox.add(messageBox,
{ y_align: St.Align.START });
this._subjectLabel = new St.Label({ style_class: 'polkit-dialog-headline',
text: _("Alt Tab Behaviour") });
messageBox.add(this._subjectLabel,
{ y_fill: false,
y_align: St.Align.START });
this._descriptionLabel = new St.Label({ style_class: 'polkit-dialog-description',
text: Gettext.gettext(MESSAGE) });
messageBox.add(this._descriptionLabel,
{ y_fill: true,
y_align: St.Align.START });
this.setButtons([
{
label: _("All & Thumbnails"),
action: Lang.bind(this, function() {
this.setBehaviour('all_thumbnails');
this.close();
})
},
{
label: _("Workspace & Icons"),
action: Lang.bind(this, function() {
this.setBehaviour('workspace_icons');
this.close();
})
},
{
label: _("Cancel"),
action: Lang.bind(this, function() {
this.close();
}),
key: Clutter.Escape
}
]);
},
setBehaviour: function(behaviour) {
this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
this._settings.set_string(SETTINGS_BEHAVIOUR_KEY, behaviour);
this._settings.set_boolean(SETTINGS_FIRST_TIME_KEY, false);
}
};
function AltTabPopup2() {
this._init();
}
AltTabPopup2.prototype = {
__proto__ : AltTab.AltTabPopup.prototype,
_init : function() {
this.actor = new Shell.GenericContainer({ name: 'altTabPopup',
reactive: true });
this.actor.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
this.actor.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
this.actor.connect('allocate', Lang.bind(this, this._allocate));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._haveModal = false;
this._currentApp = 0;
this._currentWindow = -1;
this._thumbnailTimeoutId = 0;
this._motionTimeoutId = 0;
// Initially disable hover so we ignore the enter-event if
// the switcher appears underneath the current pointer location
this._disableHover();
//this.show();
Main.uiGroup.add_actor(this.actor);
//this._select(0);
},
show : function(backward, binding, mask) {
let windows = global.get_window_actors();
let list = '';
let normal_windows= [];
let appIcons = [];
let appSys = Shell.AppSystem.get_default();
let apps = appSys.get_running();
for (let w = windows.length-1; w >= 0; w--) {
let win = windows[w].get_meta_window();
normal_windows.push(win);
}
normal_windows.sort(Lang.bind(this, this._sortWindows));
let win_on_top = normal_windows.shift();
normal_windows.push(win_on_top);
windows = normal_windows;
for (let w = 0; w < windows.length; w++) {
let win = windows[w];
let ap1 = null;
for (let i = 0;i < apps.length; i++) {
let app_wins = apps[i].get_windows();
for (let j = 0;j < app_wins.length; j++) {
if (app_wins[j] == win)
ap1 = new AltTab.AppIcon(apps[i]);
}
}
if (ap1 != null) {
ap1.cachedWindows = [win];
appIcons.push(ap1);
}
}
if (!windows.length) {
this.destroy();
return false;
}
if (!Main.pushModal(this.actor)) {
// Probably someone else has a pointer grab, try again with keyboard only
if (!Main.pushModal(this.actor, global.get_current_time(), Meta.ModalOptions.POINTER_ALREADY_GRABBED)) {
return false;
}
}
this._haveModal = true;
this._modifierMask = AltTab.primaryModifier(mask);
this.actor.connect('key-press-event', Lang.bind(this, this._keyPressEvent));
this.actor.connect('key-release-event', Lang.bind(this, this._keyReleaseEvent));
this.actor.connect('button-press-event', Lang.bind(this, this._clickedOutside));
this.actor.connect('scroll-event', Lang.bind(this, this._onScroll));
this._appSwitcher = new WindowList(windows);
this._appSwitcher._altTabPopup=this;
this.actor.add_actor(this._appSwitcher.actor);
this._appSwitcher.connect('item-activated', Lang.bind(this, this._appActivated));
this._appSwitcher.connect('item-entered', Lang.bind(this, this._appEntered));
this._appIcons = appIcons;
// make the initial selection
if (backward)
this._select(windows.length - 2);
else
this._select(0);
this.actor.opacity = 0;
this.actor.show();
// There's a race condition; if the user released Alt before
// we got the grab, then we won't be notified. (See
// https://bugzilla.gnome.org/show_bug.cgi?id=596695 for
// details.) So we check now. (Have to do this after updating
// selection.)
let [x, y, mods] = global.get_pointer();
if (!(mods & this._modifierMask)) {
this._finish();
return false;
}
// We delay showing the popup so that fast Alt+Tab users aren't
// disturbed by the popup briefly flashing.
this._initialDelayTimeoutId = Mainloop.timeout_add(AltTab.POPUP_DELAY_TIMEOUT,
Lang.bind(this, function () {
this.actor.opacity = 255;
this._initialDelayTimeoutId = 0;
}));
return true
},
_keyPressEvent : function(actor, event) {
let keysym = event.get_key_symbol();
let shift = (Shell.get_event_state(event) & Clutter.ModifierType.SHIFT_MASK);
// X allows servers to represent Shift+Tab in two different ways
if (shift && keysym == Clutter.Tab)
keysym = Clutter.ISO_Left_Tab;
this._disableHover();
if (keysym == Clutter.grave)
this._select(this._currentApp, this._nextWindow());
else if (keysym == Clutter.asciitilde)
this._select(this._currentApp, this._previousWindow());
else if (keysym == Clutter.Escape)
this.destroy();
else if (this._thumbnailsFocused) {
if (keysym == Clutter.Tab) {
if (this._currentWindow == this._appIcons[this._currentApp].cachedWindows.length - 1)
this._select(this._nextApp());
else
this._select(this._currentApp, this._nextWindow());
} else if (keysym == Clutter.ISO_Left_Tab) {
if (this._currentWindow == 0 || this._currentWindow == -1)
this._select(this._previousApp());
else
this._select(this._currentApp, this._previousWindow());
} else if (keysym == Clutter.Left)
this._select(this._currentApp, this._previousWindow());
else if (keysym == Clutter.Right)
this._select(this._currentApp, this._nextWindow());
else if (keysym == Clutter.Up)
this._select(this._currentApp, null, true);
} else {
if (keysym == Clutter.Tab)
this._select(this._nextApp());
else if (keysym == Clutter.ISO_Left_Tab)
this._select(this._previousApp());
else if (keysym == Clutter.Left)
this._select(this._previousApp());
else if (keysym == Clutter.Right)
this._select(this._nextApp());
}
return true;
},
_sortWindows : function(win1,win2) {
let t1 = win1.get_user_time();
let t2 = win2.get_user_time();
if (t2 > t1) return 1;
else return -1;
},
_appActivated : function(thumbnailList, n) {
let appIcon = this._appIcons[this._currentApp];
Main.activateWindow(appIcon.cachedWindows[0]);
this.destroy();
},
_finish : function() {
let app = this._appIcons[this._currentApp];
Main.activateWindow(app.cachedWindows[0]);
this.destroy();
},
};
function WindowList(windows) {
this._init(windows);
}
WindowList.prototype = {
__proto__ : AltTab.SwitcherList.prototype,
_init : function(windows) {
AltTab.SwitcherList.prototype._init.call(this, true);
let activeWorkspace = global.screen.get_active_workspace();
this._labels = new Array();
this._thumbnailBins = new Array();
this._clones = new Array();
this._windows = windows;
this._arrows = new Array();
this.icons = new Array();
for (let w = 0; w < windows.length; w++) {
let arrow = new St.DrawingArea({ style_class: 'switcher-arrow' });
arrow.connect('repaint', Lang.bind(this, function (area) {
Shell.draw_box_pointer(area, Shell.PointerDirection.DOWN);
}));
this._list.add_actor(arrow);
this._arrows.push(arrow);
arrow.hide();
let win=windows[w];
let appSys = Shell.AppSystem.get_default();
let apps = appSys.get_running();
let ap1 = null;
for (let i = 0; i < apps.length; i++) {
let app_wins = apps[i].get_windows();
for (let j = 0; j < app_wins.length; j++) {
if (app_wins[j] == win) {
ap1 = new AltTab.AppIcon(apps[i]);
let mutterWindow = win.get_compositor_private();
let windowTexture = mutterWindow.get_texture ();
let [width, height] = windowTexture.get_size();
let scale = Math.min(1.0, 128 / width, 128 / height);
let clone = new Clutter.Clone ({ source: windowTexture, reactive: true, width: width * scale, height: height * scale });
ap1.icon = ap1.app.create_icon_texture(128);
ap1._iconBin.set_size(128,128);
ap1._iconBin.child = clone;
ap1.label.text = win.get_title();
}
}
}
if (ap1 != null) {
ap1.cachedWindows = [win];
this.addItem(ap1.actor, ap1.label);
this.icons.push(ap1);
}
}
},
addSeparator: function () {
this._separator=null;
}
};
function init(metadata) {
imports.gettext.bindtextdomain('gnome-shell-extensions', GLib.build_filenamev([metadata.path, 'locale']));
}
function doAltTab(shellwm, binding, mask, window, backwards) {
let behaviour = BEHAVIOUR;
if(behaviour in MODES) {
MODES[behaviour](shellwm, binding, mask, window, backwards);
}
}
function enable() {
injections['_initialSelection'] = AltTab.WindowSwitcherPopup.prototype._initialSelection;
AltTab.WindowSwitcherPopup.prototype._initialSelection = function(backward, binding) {
if (binding == 'switch-windows-backward' ||
binding == 'switch-applications-backward' ||
binding == 'switch-group-backward' || backward)
this._select(this._items.length - 1);
else if (this._items.length == 1)
this._select(0);
else
this._select(1);
};
injections['_keyPressHandler'] = AltTab.WindowSwitcherPopup.prototype._keyPressHandler;
AltTab.WindowSwitcherPopup.prototype._keyPressHandler = function(keysym, backwards, action) {
if (action == Meta.KeyBindingAction.SWITCH_WINDOWS ||
action == Meta.KeyBindingAction.SWITCH_APPLICATIONS ||
action == Meta.KeyBindingAction.SWITCH_GROUP) {
this._select(backwards ? this._previous() : this._next());
} else if (action == Meta.KeyBindingAction.SWITCH_WINDOWS_BACKWARD ||
action == Meta.KeyBindingAction.SWITCH_APPLICATIONS_BACKWARD ||
action == Meta.KeyBindingAction.SWITCH_GROUP_BACKWARD) {
this._select(this._previous());
} else {
if (keysym == Clutter.Left)
this._select(this._previous());
else if (keysym == Clutter.Right)
this._select(this._next());
}
};
setKeybinding('switch-applications', Lang.bind(Main.wm, Main.wm._startWindowSwitcher));
setKeybinding('switch-group', Lang.bind(Main.wm, Main.wm._startWindowSwitcher));
setKeybinding('switch-applications-backward', Lang.bind(Main.wm, Main.wm._startWindowSwitcher));
setKeybinding('switch-group-backward', Lang.bind(Main.wm, Main.wm._startWindowSwitcher));
Main.wm.setKeybindingHandler('switch_windows', doAltTab);
Main.wm.setKeybindingHandler('switch_group', doAltTab);
Main.wm.setKeybindingHandler('switch_windows_backward', doAltTab);
Main.wm.setKeybindingHandler('switch_group_backward', doAltTab);
}
function disable() {
setKeybinding('switch-applications', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
setKeybinding('switch-group', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
setKeybinding('switch-applications-backward', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
setKeybinding('switch-group-backward', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
for (prop in injections)
AltTab.WindowSwitcherPopup.prototype[prop] = injections[prop];
Main.wm.setKeybindingHandler('switch_windows', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
Main.wm.setKeybindingHandler('switch_group', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
Main.wm.setKeybindingHandler('switch_windows_backward', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
Main.wm.setKeybindingHandler('switch_group_backward', Lang.bind(Main.wm, Main.wm._startAppSwitcher));
}

View File

@@ -1,11 +1,8 @@
{
"extension-id": "@extension_id@",
"uuid": "@uuid@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"name": "AlternateTab",
"description": "A replacement for Alt-Tab, allows to cycle between windows and does not group by application",
"original-authors": [ "jw@bargsten.org", "thomas.bouffon@gmail.com" ],
"shell-version": [ "@shell_current@" ],
"shell-version": [ "@shell_current@", "3.2" ],
"url": "@url@"
}

View File

@@ -1,78 +0,0 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const GObject = imports.gi.GObject;
const Lang = imports.lang;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const N_ = function(e) { return e };
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
const SETTINGS_APP_ICON_MODE = 'app-icon-mode';
const SETTINGS_CURRENT_WORKSPACE_ONLY = 'current-workspace-only';
const MODES = {
'thumbnail-only': N_("Thumbnail only"),
'app-icon-only': N_("Application icon only"),
'both': N_("Thumbnail and application icon"),
};
const AltTabSettingsWidget = new GObject.Class({
Name: 'AlternateTab.Prefs.AltTabSettingsWidget',
GTypeName: 'AltTabSettingsWidget',
Extends: Gtk.Grid,
_init : function(params) {
this.parent(params);
this.margin = 10;
this.orientation = Gtk.Orientation.VERTICAL;
this._settings = new Gio.Settings({ schema: 'org.gnome.shell.window-switcher' });
let presentLabel = _("Present windows as");
this.add(new Gtk.Label({ label: presentLabel, sensitive: true,
margin_bottom: 10, margin_top: 5 }));
let top = 1;
let radio = null;
let currentMode = this._settings.get_string(SETTINGS_APP_ICON_MODE);
for (let mode in MODES) {
// copy the mode variable because it has function scope, not block scope
// so cannot be used in a closure
let modeCapture = mode;
let name = Gettext.gettext(MODES[mode]);
radio = new Gtk.RadioButton({ group: radio, label: name, valign: Gtk.Align.START });
radio.connect('toggled', Lang.bind(this, function(widget) {
if (widget.active)
this._settings.set_string(SETTINGS_APP_ICON_MODE, modeCapture);
}));
this.add(radio);
if (mode == currentMode)
radio.active = true;
top += 1;
}
let check = new Gtk.CheckButton({ label: _("Show only windows in the current workspace"),
margin_top: 12 });
this._settings.bind(SETTINGS_CURRENT_WORKSPACE_ONLY, check, 'active', Gio.SettingsBindFlags.DEFAULT);
this.add(check);
},
});
function init() {
Convenience.initTranslations();
}
function buildPrefsWidget() {
let widget = new AltTabSettingsWidget();
widget.show_all();
return widget;
}

View File

@@ -1,4 +1,3 @@
EXTENSION_ID = alternative-status-menu
include ../../extension.mk
include ../../settings.mk

View File

@@ -1,172 +1,143 @@
/* -*- mode: js2 - indent-tabs-mode: nil - js2-basic-offset: 4 -*- */
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const St = imports.gi.St;
const BoxPointer = imports.ui.boxpointer;
const Main = imports.ui.main;
const PopupMenu = imports.ui.popupMenu;
const GnomeSession = imports.misc.gnomeSession;
const UserMenu = imports.ui.userMenu;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
const LOCK_ENABLED_KEY = 'lock-enabled';
let extension;
// Need to reimplement here the missing bits from LoginManager
function loginManager_hibernate() {
if (this._proxy) {
// systemd path
this._proxy.call("Hibernate",
GLib.Variant.new('(b)', [true]),
Gio.DBusCallFlags.NONE,
-1, null, null);
} else {
// Can't do in ConsoleKit
this.emit('prepare-for-sleep', true);
this.emit('prepare-for-sleep', false);
}
function updateSuspend(object, pspec, item) {
item.actor.visible = object.get_can_suspend();
}
function loginManager_canHibernate(asyncCallback) {
if (this._proxy) {
// systemd path
this._proxy.call("CanHibernate",
null,
Gio.DBusCallFlags.NONE,
-1, null, function(proxy, asyncResult) {
let result, error;
try {
result = proxy.call_finish(asyncResult);
} catch(e) {
error = e;
}
if (error)
asyncCallback(false);
else
asyncCallback(result[0] != 'no');
});
} else {
Mainloop.idle_add(Lang.bind(this, function() {
asyncCallback(false);
return false;
}));
}
}
function statusMenu_updateHaveHibernate() {
loginManager_canHibernate.call(this._loginManager, Lang.bind(this,
function(result) {
this._haveHibernate = result;
this._updateSuspendOrPowerOff();
}));
}
function statusMenu_updateSuspendOrPowerOff() {
this._suspendOrPowerOffItem.actor.hide();
extension.suspendItem.actor.visible = this._haveSuspend;
extension.hibernateItem.actor.visible = this._haveHibernate;
extension.powerOffItem.actor.visible = this._haveShutdown;
function updateHibernate(object, pspec, item) {
item.actor.visible = object.get_can_hibernate();
}
function onSuspendActivate(item) {
Main.overview.hide();
this.menu.close(BoxPointer.PopupAnimation.NONE);
this._loginManager.suspend();
this._screenSaverProxy.LockRemote(Lang.bind(this, function() {
this._upClient.suspend_sync(null);
}));
}
function onHibernateActivate(item) {
Main.overview.hide();
this.menu.close(BoxPointer.PopupAnimation.NONE);
loginManager_hibernate.call(this._loginManager);
this._screenSaverProxy.LockRemote(Lang.bind(this, function() {
this._upClient.hibernate_sync(null);
}));
}
const Extension = new Lang.Class({
Name: 'AlternativeStatusMenu.Extension',
function createSubMenu() {
let item;
_init: function() {
this.suspendItem = null;
this.hibernateItem = null;
this.powerOffItem = null;
item = new UserMenu.IMStatusChooserItem();
item.connect('activate', Lang.bind(this, this._onMyAccountActivate));
this.menu.addMenuItem(item);
Convenience.initTranslations();
this._settings = Convenience.getSettings();
},
item = new PopupMenu.PopupSwitchMenuItem(_("Notifications"));
item.connect('activate', Lang.bind(this, this._updatePresenceStatus));
this.menu.addMenuItem(item);
this._notificationsSwitch = item;
enable: function() {
let statusMenu = Main.panel.statusArea.userMenu;
item = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(item);
let children = statusMenu.menu._getMenuItems();
let index = children.length;
item = new PopupMenu.PopupMenuItem(_("Online Accounts"));
item.connect('activate', Lang.bind(this, this._onOnlineAccountsActivate));
this.menu.addMenuItem(item);
/* find the old entry */
for (let i = children.length - 1; i >= 0; i--) {
if (children[i] == statusMenu._suspendOrPowerOffItem) {
index = i;
break;
}
}
item = new PopupMenu.PopupMenuItem(_("System Settings"));
item.connect('activate', Lang.bind(this, this._onPreferencesActivate));
this.menu.addMenuItem(item);
/* add the new entries */
this.suspendItem = new PopupMenu.PopupMenuItem(_("Suspend"));
this.suspendItem.connect('activate', Lang.bind(statusMenu, onSuspendActivate));
item = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(item);
this.hibernateItem = new PopupMenu.PopupMenuItem(_("Hibernate"));
this.hibernateItem.connect('activate', Lang.bind(statusMenu, onHibernateActivate));
item = new PopupMenu.PopupMenuItem(_("Lock Screen"));
item.connect('activate', Lang.bind(this, this._onLockScreenActivate));
this.menu.addMenuItem(item);
this._lockScreenItem = item;
this.powerOffItem = new PopupMenu.PopupMenuItem(_("Power Off"));
this.powerOffItem.connect('activate', Lang.bind(statusMenu, function() {
this._session.ShutdownRemote();
}));
item = new PopupMenu.PopupMenuItem(_("Switch User"));
item.connect('activate', Lang.bind(this, this._onLoginScreenActivate));
this.menu.addMenuItem(item);
this._loginScreenItem = item;
/* insert the entries at the found position */
statusMenu.menu.addMenuItem(this.suspendItem, index);
statusMenu.menu.addMenuItem(this.hibernateItem, index + 1);
statusMenu.menu.addMenuItem(this.powerOffItem, index + 2);
item = new PopupMenu.PopupMenuItem(_("Log Out..."));
item.connect('activate', Lang.bind(this, this._onQuitSessionActivate));
this.menu.addMenuItem(item);
this._logoutItem = item;
this._openStateChangedId = statusMenu.menu.connect('open-state-changed', function() {
statusMenu_updateHaveHibernate.call(statusMenu);
});
item = new PopupMenu.PopupSeparatorMenuItem();
this.menu.addMenuItem(item);
this._previousUpdateSuspendOrPowerOff = statusMenu._updateSuspendOrPowerOff;
statusMenu._updateSuspendOrPowerOff = statusMenu_updateSuspendOrPowerOff;
item = new PopupMenu.PopupMenuItem(_("Suspend"));
item.connect('activate', Lang.bind(this, onSuspendActivate));
this._upClient.connect('notify::can-suspend', Lang.bind(this, updateSuspend, item));
updateSuspend(this._upClient, null, item);
this.menu.addMenuItem(item);
this._settingsChangedId = this._settings.connect('changed', function() {
statusMenu._updateSuspendOrPowerOff();
});
},
item = new PopupMenu.PopupMenuItem(_("Hibernate"));
item.connect('activate', Lang.bind(this, onHibernateActivate));
this._upClient.connect('notify::can-hibernate', Lang.bind(this, updateHibernate, item));
updateHibernate(this._upClient, null, item);
this.menu.addMenuItem(item);
disable: function() {
let statusMenu = Main.panel.statusArea.userMenu;
this.suspendItem.destroy();
this.hibernateItem.destroy();
this.powerOffItem.destroy();
statusMenu.menu.disconnect(this._openStateChangedId);
this._settings.disconnect(this._settingsChangedId);
statusMenu._updateSuspendOrPowerOff = this._previousUpdateSuspendOrPowerOff;
statusMenu._updateSuspendOrPowerOff();
},
});
item = new PopupMenu.PopupMenuItem(_("Power Off..."));
item.connect('activate', Lang.bind(this, function() {
this._session.ShutdownRemote();
}));
this.menu.addMenuItem(item);
}
// Put your extension initialization code here
function init(metadata) {
return (extension = new Extension());
imports.gettext.bindtextdomain('gnome-shell-extensions', GLib.build_filenamev([metadata.path, 'locale']));
}
function predestroy(statusMenu) {
// HACK! disconnect signals to avoid references to destroyed objects
let imstatusitem = statusMenu.menu._getMenuItems()[0];
imstatusitem._user.disconnect(imstatusitem._userLoadedId);
imstatusitem._user.disconnect(imstatusitem._userChangedId);
}
function reset(statusMenu) {
statusMenu._updateSwitchUser();
statusMenu._updateLogout();
statusMenu._updateLockScreen();
statusMenu._presence.getStatus(Lang.bind(statusMenu, statusMenu._updateSwitch));
// HACK! Obtain the IMStatusChooserItem and force a _updateUser
statusMenu.menu._getMenuItems()[0]._updateUser();
}
function enable() {
let statusMenu = Main.panel._statusArea.userMenu;
predestroy(statusMenu);
statusMenu.menu.removeAll();
createSubMenu.call(statusMenu);
reset(statusMenu);
}
function disable() {
// not guarranteed to work, if more extensions operate in the same place
let statusMenu = Main.panel._statusArea.userMenu;
predestroy(statusMenu);
statusMenu.menu.removeAll();
statusMenu._createSubMenu();
reset(statusMenu);
}

View File

@@ -1,10 +1,7 @@
{
"extension-id": "@extension_id@",
"uuid": "@uuid@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"name": "Alternative Status Menu",
"description": "Replaces GNOME Shell Status Menu with one showing Suspend/Hibernate and Power Off as separate items",
"shell-version": [ "@shell_current@" ],
"shell-version": [ "@shell_current@", "3.2" ],
"url": "@url@"
}

View File

@@ -1,14 +0,0 @@
<schemalist gettext-domain="gnome-shell-extensions">
<schema id="org.gnome.shell.extensions.alternative-status-menu" path="/org/gnome/shell/extensions/alternative-status-menu/">
<key name="allow-suspend" type="b">
<default>true</default>
<_summary>Enable suspending</_summary>
<_description>Control the visibility of the Suspend menu item</_description>
</key>
<key name="allow-hibernate" type="b">
<default>true</default>
<_summary>Enable hibernating</_summary>
<_description>Control the visibility of the Hibernate menu item</_description>
</key>
</schema>
</schemalist>

View File

@@ -1,498 +1,111 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Atk = imports.gi.Atk;
const GMenu = imports.gi.GMenu;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const Clutter = imports.gi.Clutter;
const Main = imports.ui.main;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Gtk = imports.gi.Gtk;
const GLib = imports.gi.GLib;
const Signals = imports.signals;
const Layout = imports.ui.layout;
const Pango = imports.gi.Pango;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const ICON_SIZE = 28;
let appsys = Shell.AppSystem.get_default();
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
function AppMenuItem() {
this._init.apply(this, arguments);
}
const appSys = Shell.AppSystem.get_default();
AppMenuItem.prototype = {
__proto__: PopupMenu.PopupBaseMenuItem.prototype,
const APPLICATION_ICON_SIZE = 32;
const MENU_HEIGHT_OFFSET = 132;
_init: function (app, params) {
PopupMenu.PopupBaseMenuItem.prototype._init.call(this, params);
const ActivitiesMenuItem = new Lang.Class({
Name: 'ActivitiesMenuItem',
Extends: PopupMenu.PopupBaseMenuItem,
_init: function(button) {
this.parent();
this._button = button;
this.addActor(new St.Label({ text: _("Activities Overview") }));
this._app = app;
this.label = new St.Label({ text: app.get_name() });
this.addActor(this.label);
this._icon = app.create_icon_texture(ICON_SIZE);
this.addActor(this._icon, { expand: false });
},
activate: function(event) {
this._button.menu.toggle();
Main.overview.toggle();
this.parent(event);
},
});
activate: function (event) {
this._app.activate_full(-1, event.get_time());
const ApplicationMenuItem = new Lang.Class({
Name: 'ApplicationMenuItem',
Extends: PopupMenu.PopupBaseMenuItem,
_init: function(button, app) {
this.parent();
this._app = app;
this._button = button;
let icon = this._app.create_icon_texture(APPLICATION_ICON_SIZE);
this.addActor(icon);
let appLabel = new St.Label({ text: app.get_name() });
this.addActor(appLabel, { span: -1, expand: true });
this.actor.label_actor = appLabel;
},
activate: function(event) {
this._app.open_new_window(event.get_time());
this._button.selectCategory(null, null);
this._button.menu.toggle();
this.parent(event);
},
setActive: function(active, params) {
if (active)
this._button.scrollToButton(this);
this.parent(active, params);
},
_getPreferredWidth: function(actor, forHeight, alloc) {
alloc.min_size = alloc.natural_size = -1;
PopupMenu.PopupBaseMenuItem.prototype.activate.call(this, event);
}
});
const CategoryMenuItem = new Lang.Class({
Name: 'CategoryMenuItem',
Extends: PopupMenu.PopupBaseMenuItem,
};
_init: function(button, category) {
this.parent();
this._category = category;
this._button = button;
function ApplicationsButton() {
this._init();
}
let name;
if (this._category)
name = this._category.get_name();
else
name = _("Favorites");
this.addActor(new St.Label({ text: name }));
},
activate: function(event) {
this._button.selectCategory(this._category, this);
this._button.scrollToCatButton(this);
this.parent(event);
},
setActive: function(active, params) {
if (active) {
this._button.selectCategory(this._category, this);
this._button.scrollToCatButton(this);
}
this.parent(active, params);
}
});
const HotCorner = new Lang.Class({
Name: 'HotCorner',
Extends: Layout.HotCorner,
_onCornerEntered : function() {
if (!this._entered) {
this._entered = true;
if (!Main.overview.animationInProgress) {
this._activationTime = Date.now() / 1000;
this.rippleAnimation();
Main.overview.toggle();
}
}
return false;
}
});
const ApplicationsMenu = new Lang.Class({
Name: 'ApplicationsMenu',
Extends: PopupMenu.PopupMenu,
_init: function(sourceActor, arrowAlignment, arrowSide, button, hotCorner) {
this.parent(sourceActor, arrowAlignment, arrowSide);
this._button = button;
this._hotCorner = hotCorner;
},
open: function(animate) {
this._hotCorner.setBarrierSize(0);
if (this._hotCorner.actor) // fallback corner
this._hotCorner.actor.hide();
this.parent(animate);
},
close: function(animate) {
let size = Main.layoutManager.panelBox.height;
this._hotCorner.setBarrierSize(size);
if (this._hotCorner.actor) // fallback corner
this._hotCorner.actor.show();
this.parent(animate);
},
toggle: function() {
if (this.isOpen) {
this._button.selectCategory(null, null);
} else {
if (Main.overview.visible)
Main.overview.hide();
}
this.parent();
}
});
const ApplicationsButton = new Lang.Class({
Name: 'ApplicationsButton',
Extends: PanelMenu.Button,
ApplicationsButton.prototype = {
__proto__: PanelMenu.SystemStatusButton.prototype,
_init: function() {
this.parent(1.0, null, false);
this._hotCorner = Main.layoutManager.hotCorners[Main.layoutManager.primaryIndex];
this.setMenu(new ApplicationsMenu(this.actor, 1.0, St.Side.TOP, this, this._hotCorner));
Main.panel.menuManager.addMenu(this.menu);
// At this moment applications menu is not keyboard navigable at
// all (so not accessible), so it doesn't make sense to set as
// role ATK_ROLE_MENU like other elements of the panel.
this.actor.accessible_role = Atk.Role.LABEL;
this._label = new St.Label({ text: _("Applications") });
this.actor.add_actor(this._label);
this.actor.name = 'panelApplications';
this.actor.label_actor = this._label;
this.actor.connect('captured-event', Lang.bind(this, this._onCapturedEvent));
_showingId = Main.overview.connect('showing', Lang.bind(this, function() {
this.actor.add_accessible_state (Atk.StateType.CHECKED);
}));
_hidingId = Main.overview.connect('hiding', Lang.bind(this, function() {
this.actor.remove_accessible_state (Atk.StateType.CHECKED);
}));
this.reloadFlag = false;
this._createLayout();
PanelMenu.SystemStatusButton.prototype._init.call(this, 'start-here');
this._display();
_installedChangedId = appSys.connect('installed-changed', Lang.bind(this, function() {
if (this.menu.isOpen) {
this._redisplay();
this.mainBox.show();
} else {
this.reloadFlag = true;
}
}));
// Since the hot corner uses stage coordinates, Clutter won't
// queue relayouts for us when the panel moves. Queue a relayout
// when that happens.
_panelBoxChangedId = Main.layoutManager.connect('panel-box-changed', Lang.bind(this, function() {
container.queue_relayout();
}));
appsys.connect('installed-changed', Lang.bind(this, this.reDisplay));
},
_createVertSeparator: function() {
let separator = new St.DrawingArea({ style_class: 'calendar-vertical-separator',
pseudo_class: 'highlighted' });
separator.connect('repaint', Lang.bind(this, this._onVertSepRepaint));
return separator;
},
_onCapturedEvent: function(actor, event) {
if (event.type() == Clutter.EventType.BUTTON_PRESS) {
if (!Main.overview.shouldToggleByCornerOrButton())
return true;
}
return false;
},
_onVertSepRepaint: function(area) {
let cr = area.get_context();
let themeNode = area.get_theme_node();
let [width, height] = area.get_surface_size();
let stippleColor = themeNode.get_color('-stipple-color');
let stippleWidth = themeNode.get_length('-stipple-width');
let x = Math.floor(width/2) + 0.5;
cr.moveTo(x, 0);
cr.lineTo(x, height);
Clutter.cairo_set_source_color(cr, stippleColor);
cr.setDash([1, 3], 1); // Hard-code for now
cr.setLineWidth(stippleWidth);
cr.stroke();
},
_onOpenStateChanged: function(menu, open) {
if (open) {
if (this.reloadFlag) {
this._redisplay();
this.reloadFlag = false;
}
this.mainBox.show();
}
this.parent(menu, open);
},
_redisplay: function() {
this.applicationsBox.destroy_all_children();
this.categoriesBox.destroy_all_children();
reDisplay : function() {
this._clearAll();
this._display();
},
_loadCategory: function(categoryId, dir) {
let iter = dir.iter();
let nextType;
_clearAll : function() {
this.menu.removeAll();
},
// Recursively load a GMenuTreeDirectory; we could put this in ShellAppSystem too
// (taken from js/ui/appDisplay.js in core shell)
_loadCategory: function(dir, menu) {
var iter = dir.iter();
var nextType;
while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) {
if (nextType == GMenu.TreeItemType.ENTRY) {
let entry = iter.get_entry();
if (!entry.get_app_info().get_nodisplay()) {
let app = appSys.lookup_app_by_tree_entry(entry);
let menu_id = dir.get_menu_id();
this.applicationsByCategory[categoryId].push(app);
}
var entry = iter.get_entry();
var app = appsys.lookup_app_by_tree_entry(entry);
if (!entry.get_app_info().get_nodisplay())
menu.addMenuItem(new AppMenuItem(app));
} else if (nextType == GMenu.TreeItemType.DIRECTORY) {
let subdir = iter.get_directory();
if (!subdir.get_is_nodisplay())
this._loadCategory(categoryId, subdir);
this._loadCategory(iter.get_directory(), menu);
}
}
},
scrollToButton: function(button) {
let appsScrollBoxAdj = this.applicationsScrollBox.get_vscroll_bar().get_adjustment();
let appsScrollBoxAlloc = this.applicationsScrollBox.get_allocation_box();
let currentScrollValue = appsScrollBoxAdj.get_value();
let boxHeight = appsScrollBoxAlloc.y2 - appsScrollBoxAlloc.y1;
let buttonAlloc = button.actor.get_allocation_box();
let newScrollValue = currentScrollValue;
if (currentScrollValue > buttonAlloc.y1 - 10)
newScrollValue = buttonAlloc.y1 - 10;
if (boxHeight + currentScrollValue < buttonAlloc.y2 + 10)
newScrollValue = buttonAlloc.y2 - boxHeight + 10;
if (newScrollValue != currentScrollValue)
appsScrollBoxAdj.set_value(newScrollValue);
},
scrollToCatButton: function(button) {
let catsScrollBoxAdj = this.categoriesScrollBox.get_vscroll_bar().get_adjustment();
let catsScrollBoxAlloc = this.categoriesScrollBox.get_allocation_box();
let currentScrollValue = catsScrollBoxAdj.get_value();
let boxHeight = catsScrollBoxAlloc.y2 - catsScrollBoxAlloc.y1;
let buttonAlloc = button.actor.get_allocation_box();
let newScrollValue = currentScrollValue;
if (currentScrollValue > buttonAlloc.y1 - 10)
newScrollValue = buttonAlloc.y1 - 10;
if (boxHeight + currentScrollValue < buttonAlloc.y2 + 10)
newScrollValue = buttonAlloc.y2 - boxHeight + 10;
if (newScrollValue != currentScrollValue)
catsScrollBoxAdj.set_value(newScrollValue);
},
_createLayout: function() {
let section = new PopupMenu.PopupMenuSection();
this.menu.addMenuItem(section);
this.mainBox = new St.BoxLayout({ vertical: false });
this.leftBox = new St.BoxLayout({ vertical: true });
this.applicationsScrollBox = new St.ScrollView({ x_fill: true, y_fill: false,
y_align: St.Align.START,
style_class: 'vfade' });
this.applicationsScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
let vscroll = this.applicationsScrollBox.get_vscroll_bar();
vscroll.connect('scroll-start', Lang.bind(this, function() {
this.menu.passEvents = true;
}));
vscroll.connect('scroll-stop', Lang.bind(this, function() {
this.menu.passEvents = false;
}));
this.categoriesScrollBox = new St.ScrollView({ x_fill: true, y_fill: false,
y_align: St.Align.START,
style_class: 'vfade' });
this.categoriesScrollBox.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC);
vscroll = this.categoriesScrollBox.get_vscroll_bar();
vscroll.connect('scroll-start', Lang.bind(this, function() {
this.menu.passEvents = true;
}));
vscroll.connect('scroll-stop', Lang.bind(this, function() {
this.menu.passEvents = false;
}));
this.leftBox.add(this.categoriesScrollBox, { expand: true,
x_fill: true, y_fill: true,
y_align: St.Align.START });
let activities = new ActivitiesMenuItem(this);
this.leftBox.add(activities.actor, { expand: false,
x_fill: true, y_fill: false,
y_align: St.Align.START });
this.applicationsBox = new St.BoxLayout({ vertical: true });
this.applicationsScrollBox.add_actor(this.applicationsBox);
this.categoriesBox = new St.BoxLayout({ vertical: true });
this.categoriesScrollBox.add_actor(this.categoriesBox, { expand: true, x_fill: false });
this.mainBox.add(this.leftBox);
this.mainBox.add(this._createVertSeparator(), { expand: false, x_fill: false, y_fill: true});
this.mainBox.add(this.applicationsScrollBox, { expand: true, x_fill: true, y_fill: true });
section.actor.add_actor(this.mainBox);
},
_display: function() {
this._applicationsButtons = new Array();
this.mainBox.style=('width: 640px;');
this.mainBox.hide();
//Load categories
this.applicationsByCategory = {};
let tree = appSys.get_tree();
_display : function() {
let tree = appsys.get_tree();
let root = tree.get_root_directory();
let categoryMenuItem = new CategoryMenuItem(this, null);
this.categoriesBox.add_actor(categoryMenuItem.actor);
let iter = root.iter();
let nextType;
while ((nextType = iter.next()) != GMenu.TreeItemType.INVALID) {
if (nextType == GMenu.TreeItemType.DIRECTORY) {
let dir = iter.get_directory();
if (!dir.get_is_nodisplay()) {
let categoryId = dir.get_menu_id();
this.applicationsByCategory[categoryId] = [];
this._loadCategory(categoryId, dir);
if (this.applicationsByCategory[categoryId].length > 0) {
let categoryMenuItem = new CategoryMenuItem(this, dir);
this.categoriesBox.add_actor(categoryMenuItem.actor);
}
}
let item = new PopupMenu.PopupSubMenuMenuItem(dir.get_name());
this._loadCategory(dir, item.menu);
this.menu.addMenuItem(item);
}
}
//Load applications
this._displayButtons(this._listApplications(null));
let height = this.categoriesBox.height + MENU_HEIGHT_OFFSET + 'px';
this.mainBox.style+=('height: ' + height);
},
_clearApplicationsBox: function(selectedActor) {
let actors = this.applicationsBox.get_children();
for (let i = 0; i < actors.length; i++) {
let actor = actors[i];
this.applicationsBox.remove_actor(actor);
}
},
selectCategory: function(dir, categoryMenuItem) {
if (categoryMenuItem)
this._clearApplicationsBox(categoryMenuItem.actor);
else
this._clearApplicationsBox(null);
if (dir)
this._displayButtons(this._listApplications(dir.get_menu_id()));
else
this._displayButtons(this._listApplications(null));
},
_displayButtons: function(apps) {
if (apps) {
for (let i = 0; i < apps.length; i++) {
let app = apps[i];
if (!this._applicationsButtons[app]) {
let applicationMenuItem = new ApplicationMenuItem(this, app);
this._applicationsButtons[app] = applicationMenuItem;
}
if (!this._applicationsButtons[app].actor.get_parent())
this.applicationsBox.add_actor(this._applicationsButtons[app].actor);
}
}
},
_listApplications: function(category_menu_id) {
let applist;
if (category_menu_id) {
applist = this.applicationsByCategory[category_menu_id];
} else {
applist = new Array();
let favorites = global.settings.get_strv('favorite-apps');
for (let i = 0; i < favorites.length; i++) {
let app = appSys.lookup_app(favorites[i]);
if (app)
applist.push(app);
}
}
applist.sort(function(a,b) {
return a.get_name().toLowerCase() > b.get_name().toLowerCase();
});
return applist;
},
destroy: function() {
this.menu.actor.get_children().forEach(function(c) { c.destroy() });
this.parent();
}
});
};
let appsMenuButton;
let activitiesButton;
let _hidingId;
let _installedChangedId;
let _panelBoxChangedId;
let _showingId;
function enable() {
activitiesButton = Main.panel.statusArea['activities'];
activitiesButton.container.hide();
appsMenuButton = new ApplicationsButton();
Main.panel.addToStatusArea('apps-menu', appsMenuButton, 1, 'left');
Main.wm.setCustomKeybindingHandler('panel-main-menu',
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
function() {
appsMenuButton.menu.toggle();
});
Main.panel._leftBox.insert_actor(appsMenuButton.actor, 1);
Main.panel._leftBox.child_set(appsMenuButton.actor, { y_fill : true } );
Main.panel._menus.addMenu(appsMenuButton.menu);
}
function disable() {
Main.panel.menuManager.removeMenu(appsMenuButton.menu);
appSys.disconnect(_installedChangedId);
Main.layoutManager.disconnect(_panelBoxChangedId);
Main.overview.disconnect(_hidingId);
Main.overview.disconnect(_showingId);
appsMenuButton.destroy();
activitiesButton.container.show();
Main.wm.setCustomKeybindingHandler('panel-main-menu',
Shell.KeyBindingMode.NORMAL |
Shell.KeyBindingMode.OVERVIEW,
Main.sessionMode.hasOverview ?
Lang.bind(Main.overview, Main.overview.toggle) :
null);
}
function init(metadata) {
Convenience.initTranslations();
function init() {
/* do nothing */
}

View File

@@ -1,10 +1,7 @@
{
"extension-id": "@extension_id@",
"uuid": "@uuid@",
"gettext-domain": "@gettext_domain@",
"name": "Applications Menu",
"description": "Add a gnome 2.x style menu for applications",
"original-authors": [ "e2002@bk.ru", "debarshir@gnome.org" ],
"shell-version": [ "@shell_current@" ],
"shell-version": [ "@shell_current@", "3.2" ],
"url": "@url@"
}

View File

@@ -1,7 +1,3 @@
EXTENSION_ID = auto-move-windows
EXTRA_MODULES = prefs.js
include ../../extension.mk
include ../../settings.mk

View File

@@ -11,19 +11,16 @@ const St = imports.gi.St;
const Main = imports.ui.main;
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
// list of applications and workspace pairs
// format: "desktop-file-id.desktop:<num>"
const APPLICATIONS = [ ];
const SETTINGS_KEY = 'application-list';
let settings;
const WindowMover = new Lang.Class({
Name: 'AutoMoveWindows.WindowMover',
function WindowMover() {
this._init();
}
WindowMover.prototype = {
_init: function() {
this._settings = settings;
this._windowTracker = Shell.WindowTracker.get_default();
let display = global.screen.get_display();
@@ -49,7 +46,7 @@ const WindowMover = new Lang.Class({
if (!this._windowTracker.is_window_interesting(window))
return;
let spaces = this._settings.get_strv(SETTINGS_KEY);
let spaces = APPLICATIONS;
let app = this._windowTracker.get_window_app(window);
if (!app) {
@@ -77,86 +74,84 @@ const WindowMover = new Lang.Class({
}
}
}
});
}
let prevCheckWorkspaces;
let winMover;
function init() {
Convenience.initTranslations();
settings = Convenience.getSettings();
}
function myCheckWorkspaces() {
let i;
let emptyWorkspaces = new Array(Main._workspaces.length);
for (i = 0; i < Main._workspaces.length; i++) {
let lastRemoved = Main._workspaces[i]._lastRemovedWindow;
if (lastRemoved &&
(lastRemoved.get_window_type() == Meta.WindowType.SPLASHSCREEN ||
lastRemoved.get_window_type() == Meta.WindowType.DIALOG ||
lastRemoved.get_window_type() == Meta.WindowType.MODAL_DIALOG))
emptyWorkspaces[i] = false;
else
emptyWorkspaces[i] = true;
}
let windows = global.get_window_actors();
for (i = 0; i < windows.length; i++) {
let win = windows[i];
if (win.get_meta_window().is_on_all_workspaces())
continue;
let workspaceIndex = win.get_workspace();
emptyWorkspaces[workspaceIndex] = false;
}
// If we don't have an empty workspace at the end, add one
if (!emptyWorkspaces[emptyWorkspaces.length -1]) {
global.screen.append_new_workspace(false, global.get_current_time());
emptyWorkspaces.push(false);
}
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
let activeIsLast = activeWorkspaceIndex == global.screen.n_workspaces - 2;
let removingTrailWorkspaces = (emptyWorkspaces[activeWorkspaceIndex] &&
activeIsLast);
// Don't enter the overview when removing multiple empty workspaces at startup
let showOverview = (removingTrailWorkspaces &&
!emptyWorkspaces.every(function(x) { return x; }));
if (removingTrailWorkspaces) {
// "Merge" the empty workspace we are removing with the one at the end
Main.wm.blockAnimations();
}
// Delete other empty workspaces; do it from the end to avoid index changes
for (i = emptyWorkspaces.length - 2; i >= 0; i--) {
if (emptyWorkspaces[i])
global.screen.remove_workspace(Main._workspaces[i], global.get_current_time());
else
break;
}
if (removingTrailWorkspaces) {
global.screen.get_workspace_by_index(global.screen.n_workspaces - 1).activate(global.get_current_time());
Main.wm.unblockAnimations();
if (!Main.overview.visible && showOverview)
Main.overview.show();
}
Main._checkWorkspacesId = 0;
return false;
function init(extensionMeta) {
// do nothing here
}
function enable() {
prevCheckWorkspaces = Main._checkWorkspaces;
if (Meta.prefs_get_dynamic_workspaces())
Main._checkWorkspaces = myCheckWorkspaces;
Main._checkWorkspaces = function() {
let i;
let emptyWorkspaces = new Array(Main._workspaces.length);
for (i = 0; i < Main._workspaces.length; i++) {
let lastRemoved = Main._workspaces[i]._lastRemovedWindow;
if (lastRemoved &&
(lastRemoved.get_window_type() == Meta.WindowType.SPLASHSCREEN ||
lastRemoved.get_window_type() == Meta.WindowType.DIALOG ||
lastRemoved.get_window_type() == Meta.WindowType.MODAL_DIALOG))
emptyWorkspaces[i] = false;
else
emptyWorkspaces[i] = true;
}
let windows = global.get_window_actors();
for (i = 0; i < windows.length; i++) {
let win = windows[i];
if (win.get_meta_window().is_on_all_workspaces())
continue;
let workspaceIndex = win.get_workspace();
emptyWorkspaces[workspaceIndex] = false;
}
// If we don't have an empty workspace at the end, add one
if (!emptyWorkspaces[emptyWorkspaces.length -1]) {
global.screen.append_new_workspace(false, global.get_current_time());
emptyWorkspaces.push(false);
}
let activeWorkspaceIndex = global.screen.get_active_workspace_index();
let activeIsLast = activeWorkspaceIndex == global.screen.n_workspaces - 2;
let removingTrailWorkspaces = (emptyWorkspaces[activeWorkspaceIndex] &&
activeIsLast);
// Don't enter the overview when removing multiple empty workspaces at startup
let showOverview = (removingTrailWorkspaces &&
!emptyWorkspaces.every(function(x) { return x; }));
if (removingTrailWorkspaces) {
// "Merge" the empty workspace we are removing with the one at the end
Main.wm.blockAnimations();
}
// Delete other empty workspaces; do it from the end to avoid index changes
for (i = emptyWorkspaces.length - 2; i >= 0; i--) {
if (emptyWorkspaces[i])
global.screen.remove_workspace(Main._workspaces[i], global.get_current_time());
else
break;
}
if (removingTrailWorkspaces) {
global.screen.get_workspace_by_index(global.screen.n_workspaces - 1).activate(global.get_current_time());
Main.wm.unblockAnimations();
if (!Main.overview.visible && showOverview)
Main.overview.show();
}
Main._checkWorkspacesId = 0;
return false;
};
winMover = new WindowMover();
}

View File

@@ -1,11 +1,8 @@
{
"extension-id": "@extension_id@",
"uuid": "@uuid@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"name": "Auto Move Windows",
"description": "Move applications to specific workspaces when they create windows",
"shell-version": [ "@shell_current@" ],
"shell-version": [ "@shell_current@", "3.2" ],
"original-authors": [ "alessandro.crismani@gmail.com", "thomas.bouffon@gmail.com" ],
"url": "@url@"
}

View File

@@ -1,10 +0,0 @@
<schemalist gettext-domain="gnome-shell-extensions">
<schema id="org.gnome.shell.extensions.auto-move-windows" path="/org/gnome/shell/extensions/auto-move-windows/">
<key name="application-list" type="as">
<!-- FIXME: should be a(su), when JS supports more of GVariant -->
<default>[ ]</default>
<_summary>Application and workspace list</_summary>
<_description>A list of strings, each containing an application id (desktop file name), followed by a colon and the workspace number</_description>
</key>
</schema>
</schemalist>

View File

@@ -1,260 +0,0 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
// Start apps on custom workspaces
const GdkPixbuf = imports.gi.GdkPixbuf;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const GMenu = imports.gi.GMenu;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const N_ = function(e) { return e };
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
const SETTINGS_KEY = 'application-list';
const WORKSPACE_MAX = 36; // compiled in limit of mutter
const Columns = {
APPINFO: 0,
DISPLAY_NAME: 1,
ICON: 2,
WORKSPACE: 3,
ADJUSTMENT: 4
};
const Widget = new GObject.Class({
Name: 'AutoMoveWindows.Prefs.Widget',
GTypeName: 'AutoMoveWindowsPrefsWidget',
Extends: Gtk.Grid,
_init: function(params) {
this.parent(params);
this.set_orientation(Gtk.Orientation.VERTICAL);
this._settings = Convenience.getSettings();
this._settings.connect('changed', Lang.bind(this, this._refresh));
this._changedPermitted = false;
this._store = new Gtk.ListStore();
this._store.set_column_types([Gio.AppInfo, GObject.TYPE_STRING, Gio.Icon, GObject.TYPE_INT,
Gtk.Adjustment]);
this._treeView = new Gtk.TreeView({ model: this._store,
hexpand: true, vexpand: true });
this._treeView.get_selection().set_mode(Gtk.SelectionMode.SINGLE);
let appColumn = new Gtk.TreeViewColumn({ expand: true, sort_column_id: Columns.DISPLAY_NAME,
title: _("Application") });
let iconRenderer = new Gtk.CellRendererPixbuf;
appColumn.pack_start(iconRenderer, false);
appColumn.add_attribute(iconRenderer, "gicon", Columns.ICON);
let nameRenderer = new Gtk.CellRendererText;
appColumn.pack_start(nameRenderer, true);
appColumn.add_attribute(nameRenderer, "text", Columns.DISPLAY_NAME);
this._treeView.append_column(appColumn);
let workspaceColumn = new Gtk.TreeViewColumn({ title: _("Workspace"),
sort_column_id: Columns.WORKSPACE });
let workspaceRenderer = new Gtk.CellRendererSpin({ editable: true });
workspaceRenderer.connect('edited', Lang.bind(this, this._workspaceEdited));
workspaceColumn.pack_start(workspaceRenderer, true);
workspaceColumn.add_attribute(workspaceRenderer, "adjustment", Columns.ADJUSTMENT);
workspaceColumn.add_attribute(workspaceRenderer, "text", Columns.WORKSPACE);
this._treeView.append_column(workspaceColumn);
this.add(this._treeView);
let toolbar = new Gtk.Toolbar();
toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_INLINE_TOOLBAR);
this.add(toolbar);
let newButton = new Gtk.ToolButton({ stock_id: Gtk.STOCK_NEW,
label: _("Add rule"),
is_important: true });
newButton.connect('clicked', Lang.bind(this, this._createNew));
toolbar.add(newButton);
let delButton = new Gtk.ToolButton({ stock_id: Gtk.STOCK_DELETE });
delButton.connect('clicked', Lang.bind(this, this._deleteSelected));
toolbar.add(delButton);
this._changedPermitted = true;
this._refresh();
},
_createNew: function() {
let dialog = new Gtk.Dialog({ title: _("Create new matching rule"),
transient_for: this.get_toplevel(),
modal: true });
dialog.add_button(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL);
dialog.add_button(_("Add"), Gtk.ResponseType.OK);
dialog.set_default_response(Gtk.ResponseType.OK);
let grid = new Gtk.Grid({ column_spacing: 10,
row_spacing: 15,
margin: 10 });
dialog._appChooser = new Gtk.AppChooserWidget({ show_all: true });
grid.attach(dialog._appChooser, 0, 0, 2, 1);
grid.attach(new Gtk.Label({ label: _("Workspace") }),
0, 1, 1, 1);
let adjustment = new Gtk.Adjustment({ lower: 1,
upper: WORKSPACE_MAX,
step_increment: 1
});
dialog._spin = new Gtk.SpinButton({ adjustment: adjustment,
snap_to_ticks: true });
dialog._spin.set_value(1);
grid.attach(dialog._spin, 1, 1, 1, 1);
dialog.get_content_area().add(grid);
dialog.connect('response', Lang.bind(this, function(dialog, id) {
if (id != Gtk.ResponseType.OK) {
dialog.destroy();
return;
}
let appInfo = dialog._appChooser.get_app_info();
if (!appInfo)
return;
let index = Math.floor(dialog._spin.value);
if (isNaN(index) || index < 0)
index = 1;
this._changedPermitted = false;
if (!this._appendItem(appInfo.get_id(), index)) {
this._changedPermitted = true;
return;
}
let iter = this._store.append();
let adj = new Gtk.Adjustment({ lower: 1,
upper: WORKSPACE_MAX,
step_increment: 1,
value: index });
this._store.set(iter,
[Columns.APPINFO, Columns.ICON, Columns.DISPLAY_NAME, Columns.WORKSPACE, Columns.ADJUSTMENT],
[appInfo, appInfo.get_icon(), appInfo.get_display_name(), index, adj]);
this._changedPermitted = true;
dialog.destroy();
}));
dialog.show_all();
},
_deleteSelected: function() {
let [any, model, iter] = this._treeView.get_selection().get_selected();
if (any) {
let appInfo = this._store.get_value(iter, Columns.APPINFO);
this._changedPermitted = false;
this._removeItem(appInfo.get_id());
this._store.remove(iter);
this._changedPermitted = true;
}
},
_workspaceEdited: function(renderer, pathString, text) {
let index = parseInt(text);
if (isNaN(index) || index < 0)
index = 1;
let path = Gtk.TreePath.new_from_string(pathString);
let [model, iter] = this._store.get_iter(path);
let appInfo = this._store.get_value(iter, Columns.APPINFO);
this._changedPermitted = false;
this._changeItem(appInfo.get_id(), index);
this._store.set_value(iter, Columns.WORKSPACE, index);
this._changedPermitted = true;
},
_refresh: function() {
if (!this._changedPermitted)
// Ignore this notification, model is being modified outside
return;
this._store.clear();
let currentItems = this._settings.get_strv(SETTINGS_KEY);
let validItems = [ ];
for (let i = 0; i < currentItems.length; i++) {
let [id, index] = currentItems[i].split(':');
let appInfo = Gio.DesktopAppInfo.new(id);
if (!appInfo)
continue;
validItems.push(currentItems[i]);
let iter = this._store.append();
let adj = new Gtk.Adjustment({ lower: 1,
upper: WORKSPACE_MAX,
step_increment: 1,
value: index });
this._store.set(iter,
[Columns.APPINFO, Columns.ICON, Columns.DISPLAY_NAME, Columns.WORKSPACE, Columns.ADJUSTMENT],
[appInfo, appInfo.get_icon(), appInfo.get_display_name(), parseInt(index), adj]);
}
if (validItems.length != currentItems.length) // some items were filtered out
this._settings.set_strv(SETTINGS_KEY, validItems);
},
_appendItem: function(id, workspace) {
let currentItems = this._settings.get_strv(SETTINGS_KEY);
let alreadyHave = currentItems.map(function(el) {
return el.split(':')[0];
}).indexOf(id) != -1;
if (alreadyHave) {
printerr("Already have an item for this id");
return false;
}
currentItems.push(id + ':' + workspace);
this._settings.set_strv(SETTINGS_KEY, currentItems);
return true;
},
_removeItem: function(id) {
let currentItems = this._settings.get_strv(SETTINGS_KEY);
let index = currentItems.map(function(el) {
return el.split(':')[0];
}).indexOf(id);
if (index < 0)
return;
currentItems.splice(index, 1);
this._settings.set_strv(SETTINGS_KEY, currentItems);
},
_changeItem: function(id, workspace) {
let currentItems = this._settings.get_strv(SETTINGS_KEY);
let index = currentItems.map(function(el) {
return el.split(':')[0];
}).indexOf(id);
if (index < 0)
currentItems.push(id + ':' + workspace);
else
currentItems[index] = id + ':' + workspace;
this._settings.set_strv(SETTINGS_KEY, currentItems);
}
});
function init() {
Convenience.initTranslations();
}
function buildPrefsWidget() {
let widget = new Widget();
widget.show_all();
return widget;
}

View File

@@ -1,3 +0,0 @@
EXTENSION_ID = default-min-max
include ../../extension.mk

View File

@@ -1,20 +0,0 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
const Meta = imports.gi.Meta;
const BUTTON_LAYOUT_KEY = 'button-layout';
const EXTENSION_SCHEMA = 'org.gnome.desktop.wm.preferences';
const SHELL_OVERRIDES_SCHEMA = 'org.gnome.shell.overrides';
function init(metadata) {
}
function enable() {
// Override gnome-shell's overrides
Meta.prefs_override_preference_schema(BUTTON_LAYOUT_KEY, EXTENSION_SCHEMA);
}
function disable() {
// Restore gnome-shell's overrides
Meta.prefs_override_preference_schema(BUTTON_LAYOUT_KEY, SHELL_OVERRIDES_SCHEMA);
}

View File

@@ -1,11 +0,0 @@
{
"extension-id": "@extension_id@",
"uuid": "@uuid@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"name": "Default Minimize and Maximize",
"description": "Adds minimize and maximize buttons to the titlebar by default",
"original-authors": [ "debarshir@gnome.org" ],
"shell-version": [ "@shell_current@" ],
"url": "@url@"
}

View File

@@ -1 +0,0 @@
/* This extensions requires no special styling */

View File

@@ -0,0 +1,3 @@
EXTENSION_ID = dock
include ../../extension.mk

View File

@@ -0,0 +1,879 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Clutter = imports.gi.Clutter;
const Pango = imports.gi.Pango;
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const Shell = imports.gi.Shell;
const Lang = imports.lang;
const Signals = imports.signals;
const St = imports.gi.St;
const Mainloop = imports.mainloop;
const AppFavorites = imports.ui.appFavorites;
const DND = imports.ui.dnd;
const Main = imports.ui.main;
const Overview = imports.ui.overview;
const PopupMenu = imports.ui.popupMenu;
const Search = imports.ui.search;
const Tweener = imports.ui.tweener;
const Workspace = imports.ui.workspace;
const AppDisplay = imports.ui.appDisplay;
const AltTab = imports.ui.altTab;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
//hide
//const autohide_animation_time = 0.3;
// Keep enums in sync with GSettings schemas
const PositionMode = {
LEFT: 0,
RIGHT: 1
};
const AutoHideEffect = {
RESIZE: 0,
RESCALE: 1,
MOVE: 2
};
// Settings
const DOCK_POSITION = PositionMode.RIGHT;
const DOCK_SIZE = 48;
const DOCK_AUTOHIDE = true;
const DOCK_EFFECTHIDE = AutoHideEffect.MOVE;
const DOCK_AUTOHIDE_ANIMATION_TIME = 0.3;
// Do not change anything below this line (it is intentionally duplicate to keep in
// sync with master branch)
let position = PositionMode.RIGHT;
let dockicon_size = 48;
let hideable = true;
let hideDock = true;
let hideEffect = AutoHideEffect.RESIZE;
let autohide_animation_time = 0.3;
const DND_RAISE_APP_TIMEOUT = 500;
/*************************************************************************************/
/**** start resize's Dock functions *****************/
/*************************************************************************************/
function hideDock_size () {
if (hideable){
let monitor = Main.layoutManager.primaryMonitor
let position_x = monitor.x;
let height = (this._nicons)*(this._item_size + this._spacing) + 2*this._spacing;
let width = this._item_size + 4*this._spacing;
Tweener.addTween(this,{
_item_size: 1,
time: autohide_animation_time,
transition: 'easeOutQuad',
onUpdate: function () {
height = (this._nicons)*(this._item_size + this._spacing) + 2*this._spacing;
width = this._item_size + 4*this._spacing;
switch (position) {
case PositionMode.LEFT:
position_x=monitor.x-2*this._spacing;
break;
case PositionMode.RIGHT:
default:
position_x = monitor.x + (monitor.width-1-this._item_size-2*this._spacing);
}
this.actor.set_position (position_x,monitor.y+(monitor.height-height)/2);
this.actor.set_size(width,height);
},
});
hideDock=true;
}
}
function showDock_size () {
let monitor = Main.layoutManager.primaryMonitor;
let height = (this._nicons)*(this._item_size + this._spacing) + 2*this._spacing;
let width = this._item_size + 4*this._spacing;
let position_x = monitor.x;
Tweener.addTween(this,{
_item_size: dockicon_size,
time: autohide_animation_time,
transition: 'easeOutQuad',
onUpdate: function () {
height = (this._nicons)*(this._item_size + this._spacing) + 2*this._spacing;
width = this._item_size + 4*this._spacing;
switch (position) {
case PositionMode.LEFT:
position_x=monitor.x-2*this._spacing;
break;
case PositionMode.RIGHT:
default:
position_x=monitor.x + (monitor.width-this._item_size-2*this._spacing);
}
this.actor.set_position (position_x, monitor.y+(monitor.height-height)/2);
this.actor.set_size(width,height);
}
});
hideDock=false;
}
function initShowDock_size () {
this._item_size=1;
this._showDock();
}
function showEffectAddItem_size () {
let primary = Main.layoutManager.primaryMonitor;
let height = (this._nicons)*(this._item_size + this._spacing) + 2*this._spacing;
let width = this._item_size + 4*this._spacing;
Tweener.addTween(this.actor, {
y: primary.y + (primary.height-height)/2,
height: height,
width: width,
time: autohide_animation_time,
transition: 'easeOutQuad'
});
}
/**************************************************************************************/
/**** start rescale's Dock functions *****************/
/**************************************************************************************/
function hideDock_scale () {
this._item_size = dockicon_size;
let monitor = Main.layoutManager.primaryMonitor;
let cornerX = 0;
let height = this._nicons*(this._item_size + this._spacing) + 2*this._spacing;
let width = this._item_size + 4*this._spacing;
switch (position) {
case PositionMode.LEFT:
cornerX=monitor.x;
break;
case PositionMode.RIGHT:
default:
cornerX = monitor.x + monitor.width-1;
}
if (hideable) {
Tweener.addTween(this.actor,{
y: monitor.y + (monitor.height-height)/2,
x: cornerX,
height:height,
width: width,
scale_x: 0.025,
time: autohide_animation_time,
transition: 'easeOutQuad'
});
hideDock=true;
}
}
function showDock_scale () {
this._item_size = dockicon_size;
let monitor = Main.layoutManager.primaryMonitor;
let position_x = monitor.x;
let height = this._nicons*(this._item_size + this._spacing) + 2*this._spacing;
let width = this._item_size + 4*this._spacing;
switch (position) {
case PositionMode.LEFT:
position_x=monitor.x-2*this._spacing;
break;
case PositionMode.RIGHT:
default:
position_x=monitor.x + (monitor.width-this._item_size-2*this._spacing);
}
Tweener.addTween(this.actor, {
y: monitor.y + (monitor.height-height)/2,
x: monitor.x + position_x,
height: height,
width: width,
scale_x: 1,
time: autohide_animation_time,
transition: 'easeOutQuad'
});
hideDock=false;
}
function initShowDock_scale () {
let primary = Main.layoutManager.primaryMonitor;
let height = this._nicons*(this._item_size + this._spacing) + 2*this._spacing;
let width = this._item_size + 4*this._spacing;
this.actor.set_scale (0,0);
this.actor.set_size (width,height);
// set the position of the dock
switch (position) {
case PositionMode.LEFT:
this.actor.x = 0;
// effect of creation of the dock
Tweener.addTween(this.actor, {
x: primary.x-2*this._spacing,
y: primary.y + (primary.height-height)/2,
time: autohide_animation_time * 3,
transition: 'easeOutQuad'
});
break;
case PositionMode.RIGHT:
default:
this.actor.x = primary.width-1;
// effect of creation of the dock
Tweener.addTween(this.actor, {
x: primary.x + primary.width-this._item_size- 2*this._spacing,
y: primary.y + (primary.height-height)/2,
time: autohide_animation_time * 3,
transition: 'easeOutQuad'
});
}
Tweener.addTween(this.actor,{
scale_x: 1,
scale_y: 1,
time: autohide_animation_time * 3,
transition: 'easeOutQuad'
});
hideDock=false;
}
function showEffectAddItem_scale () {
let monitor = Main.layoutManager.primaryMonitor;
let height = this._nicons*(this._item_size + this._spacing) + 2*this._spacing;
let width = this._item_size + 4*this._spacing;
Tweener.addTween(this.actor, {
y: monitor.y + (monitor.height-height)/2,
height: height,
width: width,
time: autohide_animation_time,
transition: 'easeOutQuad'
});
}
/**************************************************************************************/
/**** start move Dock functions *****************/
/**************************************************************************************/
function hideDock_move () {
this._item_size = dockicon_size;
let monitor = Main.layoutManager.primaryMonitor;
let cornerX = 0;
let height = this._nicons*(this._item_size + this._spacing) + 2*this._spacing;
let width = this._item_size + 4*this._spacing;
switch (position) {
case PositionMode.LEFT:
cornerX= monitor.x - width + this._spacing;
break;
case PositionMode.RIGHT:
default:
cornerX = monitor.x + monitor.width - this._spacing;
}
if (hideable) {
Tweener.addTween(this.actor,{
x: cornerX,
y: monitor.y + (monitor.height - height)/2,
width: width,
height: height,
time: autohide_animation_time,
transition: 'easeOutQuad'
});
hideDock=true;
}
}
function showDock_move () {
this._item_size = dockicon_size;
let monitor = Main.layoutManager.primaryMonitor;
let position_x = monitor.x;
let height = this._nicons*(this._item_size + this._spacing) + 2*this._spacing;
let width = this._item_size + 4*this._spacing;
switch (position) {
case PositionMode.LEFT:
position_x=monitor.x - 2*this._spacing;
break;
case PositionMode.RIGHT:
default:
position_x=monitor.x + (monitor.width-this._item_size-2*this._spacing);
}
Tweener.addTween(this.actor, {
x: position_x,
y: monitor.y + (monitor.height - height)/2,
width: width,
height: height,
time: autohide_animation_time,
transition: 'easeOutQuad'
});
hideDock=false;
}
function initShowDock_move () {
this._showDock();
}
function showEffectAddItem_move () {
let monitor = Main.layoutManager.primaryMonitor;
let height = this._nicons*(this._item_size + this._spacing) + 2*this._spacing;
let width = this._item_size + 4*this._spacing;
Tweener.addTween(this.actor, {
y: monitor.y + (monitor.height-height)/2,
height: height,
width: width,
time: autohide_animation_time,
transition: 'easeOutQuad'
});
}
function Dock() {
this._init();
}
Dock.prototype = {
_init : function() {
this._placeholderText = null;
this._menus = [];
this._menuDisplays = [];
this._favorites = [];
// Load Settings
position = DOCK_POSITION;
dockicon_size = DOCK_SIZE;
hideDock = hideable = DOCK_AUTOHIDE;
hideEffect = DOCK_EFFECTHIDE;
autohide_animation_time = DOCK_AUTOHIDE_ANIMATION_TIME;
this._spacing = 4;
this._item_size = dockicon_size;
this._nicons = 0;
this._selectFunctionsHide ();
this.actor = new St.BoxLayout({ name: 'dock', vertical: true, reactive: true });
this._grid = new Shell.GenericContainer();
this.actor.add(this._grid, { expand: true, y_align: St.Align.START });
this.actor.connect('style-changed', Lang.bind(this, this._onStyleChanged));
this._grid.connect('get-preferred-width', Lang.bind(this, this._getPreferredWidth));
this._grid.connect('get-preferred-height', Lang.bind(this, this._getPreferredHeight));
this._grid.connect('allocate', Lang.bind(this, this._allocate));
this._workId = Main.initializeDeferredWork(this.actor, Lang.bind(this, this._redisplay));
this._tracker = Shell.WindowTracker.get_default();
this._appSystem = Shell.AppSystem.get_default();
this._installedChangedId = this._appSystem.connect('installed-changed', Lang.bind(this, this._queueRedisplay));
this._appFavoritesChangedId = AppFavorites.getAppFavorites().connect('changed', Lang.bind(this, this._queueRedisplay));
this._appStateChangedId = this._appSystem.connect('app-state-changed', Lang.bind(this, this._queueRedisplay));
this._overviewShowingId = Main.overview.connect('showing', Lang.bind(this, function() {
this.actor.hide();
}));
this._overviewHiddenId = Main.overview.connect('hidden', Lang.bind(this, function() {
this.actor.show();
}));
Main.layoutManager.addChrome(this.actor);
this._leave_event = this.actor.connect('leave-event', Lang.bind(this, this._hideDock));
this._enter_event = this.actor.connect('enter-event', Lang.bind(this, this._showDock));
this._hideDock();
},
destroy: function() {
if (this._installedChangedId) {
this._appSystem.disconnect(this._installedChangedId);
this._installedChangedId = 0;
}
if (this._appFavoritesChangedId) {
AppFavorites.getAppFavorites().disconnect(this._appFavoritesChangedId);
this._appFavoritesChangedId = 0;
}
if (this._appStateChangedId) {
this._appSystem.disconnect(this._appStateChangedId);
this._appStateChangedId = 0;
}
if (this._overviewShowingId) {
Main.overview.disconnect(this._overviewShowingId);
this._overviewShowingId = 0;
}
if (this._overviewHiddenId) {
Main.overview.disconnect(this._overviewHiddenId);
this._overviewHiddenId = 0;
}
this.actor.destroy();
// Break reference cycles
this._appSystem = null;
this._tracker = null;
},
// fuctions hide
_restoreHideDock: function(){
hideable = DOCK_AUTOHIDE;
},
_disableHideDock: function (){
hideable = false;
},
_selectFunctionsHide: function () {
switch (hideEffect) {
case AutoHideEffect.RESCALE:
this._hideDock = hideDock_scale;
this._showDock = showDock_scale;
this._initShowDock = initShowDock_scale;
this._showEffectAddItem = showEffectAddItem_scale;
break;
case AutoHideEffect.MOVE:
this._hideDock = hideDock_move;
this._showDock = showDock_move;
this._initShowDock = initShowDock_move;
this._showEffectAddItem = showEffectAddItem_move;
break;
case AutoHideEffect.RESIZE:
default:
this._hideDock = hideDock_size;
this._showDock = showDock_size;
this._initShowDock = initShowDock_size;
this._showEffectAddItem = showEffectAddItem_size;
}
},
_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.removeAll();
let favorites = AppFavorites.getAppFavorites().getFavoriteMap();
let running = this._appSystem.get_running();
let runningIds = this._appIdListToHash(running);
let icons = 0;
let nFavorites = 0;
for (let id in favorites) {
let app = favorites[id];
let display = new DockIcon(app,this);
this.addItem(display.actor);
nFavorites++;
icons++;
}
for (let i = 0; i < running.length; i++) {
let app = running[i];
if (app.get_id() in favorites)
continue;
let display = new DockIcon(app,this);
icons++;
this.addItem(display.actor);
}
this._nicons=icons;
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);
}
let primary = Main.layoutManager.primaryMonitor;
let height = (icons)*(this._item_size + this._spacing) + 2*this._spacing;
let width = this._item_size + 4*this._spacing;
if (this.actor.y != primary.y) {
if (hideable && hideDock) {
this._hideDock();
} else {
if (dockicon_size == this._item_size) {
// only add/delete icon
this._showEffectAddItem ();
} else {
// change size icon
this._showDock ();
}
}
} else {
// effect of creation
this._initShowDock ();
}
},
_getPreferredWidth: function (grid, forHeight, alloc) {
alloc.min_size = this._item_size;
alloc.natural_size = this._item_size + this._spacing;
},
_getPreferredHeight: function (grid, forWidth, alloc) {
let children = this._grid.get_children();
let nRows = children.length;
let totalSpacing = Math.max(0, nRows - 1) * this._spacing;
let height = nRows * this._item_size + totalSpacing;
alloc.min_size = height;
alloc.natural_size = height;
},
_allocate: function (grid, box, flags) {
let children = this._grid.get_children();
let x = box.x1 + this._spacing;
if (position == PositionMode.LEFT)
x = box.x1 + 2*this._spacing;
let y = box.y1 + this._spacing;
for (let i = 0; i < children.length; i++) {
let childBox = new Clutter.ActorBox();
childBox.x1 = x;
childBox.y1 = y;
childBox.x2 = childBox.x1 + this._item_size;
childBox.y2 = childBox.y1 + this._item_size;
children[i].allocate(childBox, flags);
y += this._item_size + this._spacing;
}
},
_onStyleChanged: function() {
let themeNode = this.actor.get_theme_node();
let [success, len] = themeNode.get_length('spacing', false);
if (success)
this._spacing = len;
[success, len] = themeNode.get_length('-shell-grid-item-size', false);
if (success)
this._item_size = len;
this._grid.queue_relayout();
},
removeAll: function () {
this._grid.get_children().forEach(Lang.bind(this, function (child) {
child.destroy();
}));
},
addItem: function(actor) {
this._grid.add_actor(actor);
}
};
Signals.addSignalMethods(Dock.prototype);
function DockIcon(app, dock) {
this._init(app, dock);
}
DockIcon.prototype = {
_init : function(app, dock) {
this.app = app;
this.actor = new St.Button({ style_class: 'dock-app',
button_mask: St.ButtonMask.ONE | St.ButtonMask.TWO,
reactive: true,
x_fill: true,
y_fill: true });
this.actor._delegate = this;
this.actor.set_size(dockicon_size, dockicon_size);
this._icon = this.app.create_icon_texture(dockicon_size);
this.actor.set_child(this._icon);
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
this._menu = null;
this._menuManager = new PopupMenu.PopupMenuManager(this);
this._has_focus = false;
let tracker = Shell.WindowTracker.get_default();
tracker.connect('notify::focus-app', Lang.bind(this, this._onStateChanged));
this.actor.connect('button-press-event', Lang.bind(this, this._onButtonPress));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this.actor.connect('notify::hover', Lang.bind(this, this._hoverChanged));
this._menuTimeoutId = 0;
this._stateChangedId = this.app.connect('notify::state',
Lang.bind(this, this._onStateChanged));
this._onStateChanged();
this._dock=dock;
},
_onDestroy: function() {
if (this._stateChangedId > 0)
this.app.disconnect(this._stateChangedId);
this._stateChangedId = 0;
this._removeMenuTimeout();
},
_removeMenuTimeout: function() {
if (this._menuTimeoutId > 0) {
Mainloop.source_remove(this._menuTimeoutId);
this._menuTimeoutId = 0;
}
},
_hoverChanged: function(actor) {
if (actor != this.actor)
this._has_focus = false;
else
this._has_focus = true;
return false;
},
_onStateChanged: function() {
let tracker = Shell.WindowTracker.get_default();
let focusedApp = tracker.focus_app;
if (this.app.state != Shell.AppState.STOPPED) {
this.actor.add_style_class_name('running');
if (this.app == focusedApp) {
this.actor.add_style_class_name('focused');
} else {
this.actor.remove_style_class_name('focused');
}
} else {
this.actor.remove_style_class_name('focused');
this.actor.remove_style_class_name('running');
}
},
_onButtonPress: function(actor, event) {
let button = event.get_button();
if (button == 1) {
this._removeMenuTimeout();
this._menuTimeoutId = Mainloop.timeout_add(AppDisplay.MENU_POPUP_TIMEOUT, Lang.bind(this, function() {
this.popupMenu();
}));
} else if (button == 3) {
this.popupMenu();
}
},
_onClicked: function(actor, button) {
this._removeMenuTimeout();
if (button == 1) {
this._onActivate(Clutter.get_current_event());
} else if (button == 2) {
// Last workspace is always empty
let launchWorkspace = global.screen.get_workspace_by_index(global.screen.n_workspaces - 1);
launchWorkspace.activate(global.get_current_time());
this.emit('launching');
this.app.open_new_window(-1);
}
return false;
},
getId: function() {
return this.app.get_id();
},
popupMenu: function() {
this._removeMenuTimeout();
this.actor.fake_release();
this._dock._disableHideDock();
if (!this._menu) {
this._menu = new DockIconMenu(this);
this._menu.connect('activate-window', Lang.bind(this, function (menu, window) {
this.activateWindow(window);
}));
this._menu.connect('open-state-changed', Lang.bind(this, function (menu, isPoppedUp) {
if (!isPoppedUp){
//Restore value of autohidedock
this._dock._restoreHideDock();
this._dock._hideDock();
this._onMenuPoppedDown();
}
}));
this._menuManager.addMenu(this._menu, true);
}
this._menu.popup();
return false;
},
activateWindow: function(metaWindow) {
if (metaWindow) {
this._didActivateWindow = true;
Main.activateWindow(metaWindow);
}
},
setSelected: function (isSelected) {
this._selected = isSelected;
if (this._selected)
this.actor.add_style_class_name('selected');
else
this.actor.remove_style_class_name('selected');
},
_onMenuPoppedDown: function() {
this.actor.sync_hover();
},
_getRunning: function() {
return this.app.state != Shell.AppState.STOPPED;
},
_onActivate: function (event) {
this.emit('launching');
let modifiers = Shell.get_event_state(event);
if (modifiers & Clutter.ModifierType.CONTROL_MASK
&& this.app.state == Shell.AppState.RUNNING) {
let current_workspace = global.screen.get_active_workspace().index();
this.app.open_new_window(current_workspace);
} else {
let tracker = Shell.WindowTracker.get_default();
let focusedApp = tracker.focus_app;
if (this.app == focusedApp) {
let windows = this.app.get_windows();
let current_workspace = global.screen.get_active_workspace();
for (let i = 0; i < windows.length; i++) {
let w = windows[i];
if (w.get_workspace() == current_workspace)
w.minimize();
}
} else {
this.app.activate(-1);
}
}
Main.overview.hide();
},
shellWorkspaceLaunch : function() {
this.app.open_new_window();
}
};
Signals.addSignalMethods(DockIcon.prototype);
function DockIconMenu(source) {
this._init(source);
}
DockIconMenu.prototype = {
__proto__: AppDisplay.AppIconMenu.prototype,
_init: function(source) {
switch (position) {
case PositionMode.LEFT:
PopupMenu.PopupMenu.prototype._init.call(this, source.actor, St.Align.MIDDLE, St.Side.LEFT, 0);
break;
case PositionMode.RIGHT:
default:
PopupMenu.PopupMenu.prototype._init.call(this, source.actor, St.Align.MIDDLE, St.Side.RIGHT, 0);
}
this._source = source;
this.connect('activate', Lang.bind(this, this._onActivate));
this.actor.add_style_class_name('dock-menu');
// Chain our visibility and lifecycle to that of the source
source.actor.connect('notify::mapped', Lang.bind(this, function () {
if (!source.actor.mapped)
this.close();
}));
source.actor.connect('destroy', Lang.bind(this, function () { this.actor.destroy(); }));
Main.layoutManager.addChrome(this.actor);
},
_redisplay: function() {
this.removeAll();
let windows = this._source.app.get_windows();
// Display the app windows menu items and the separator between windows
// of the current desktop and other windows.
let activeWorkspace = global.screen.get_active_workspace();
let separatorShown = windows.length > 0 && windows[0].get_workspace() != activeWorkspace;
for (let i = 0; i < windows.length; i++) {
if (!separatorShown && windows[i].get_workspace() != activeWorkspace) {
this._appendSeparator();
separatorShown = true;
}
let item = this._appendMenuItem(windows[i].title);
item._window = windows[i];
}
if (windows.length > 0)
this._appendSeparator();
let isFavorite = AppFavorites.getAppFavorites().isFavorite(this._source.app.get_id());
this._newWindowMenuItem = windows.length > 0 ? this._appendMenuItem(_("New Window")) : null;
this._quitAppMenuItem = windows.length >0 ? this._appendMenuItem(_("Quit Application")) : null;
if (windows.length > 0)
this._appendSeparator();
this._toggleFavoriteMenuItem = this._appendMenuItem(isFavorite ?
_("Remove from Favorites")
: _("Add to Favorites"));
this._highlightedItem = null;
},
_onActivate: function (actor, child) {
if (child._window) {
let metaWindow = child._window;
this.emit('activate-window', metaWindow);
} else if (child == this._newWindowMenuItem) {
let current_workspace = global.screen.get_active_workspace().index();
this._source.app.open_new_window(current_workspace);
this.emit('activate-window', null);
} else if (child == this._quitAppMenuItem) {
this._source.app.request_quit();
} else if (child == this._toggleFavoriteMenuItem) {
let favs = AppFavorites.getAppFavorites();
let isFavorite = favs.isFavorite(this._source.app.get_id());
if (isFavorite)
favs.removeFavorite(this._source.app.get_id());
else
favs.addFavorite(this._source.app.get_id());
}
this.close();
}
}
function init(extensionMeta) {
imports.gettext.bindtextdomain('gnome-shell-extensions', GLib.build_filenamev([extensionMeta.path, 'locale']));
}
let dock;
function enable() {
dock = new Dock();
}
function disable() {
dock.destroy();
dock = null;
}

View File

@@ -0,0 +1,8 @@
{
"uuid": "@uuid@",
"name": "Dock",
"description": "A dock for the GNOME Shell -- displays favorite and running applications",
"original-author": "tclaesson@gmail.com",
"shell-version": [ "@shell_current@", "3.2" ],
"url": "@url@"
}

View File

@@ -0,0 +1,54 @@
#dock {
border-radius: 9px;
background-color: rgba(0,0,0,0.9);
border-width: 2px;
border-color: #5f5f5f;
}
/* Panel */
.dock-app {
padding: 4px;
width: 70px;
height: 70px;
border-radius: 4px;
transition-duration: 100;
}
.dock-app.running {
padding: 3px;
border: 1px solid #181818;
background-gradient-direction: vertical;
background-gradient-start: #3d3d3d;
background-gradient-end: #181818;
}
.dock-app.selected {
padding: 3px;
border: 1px solid #666666;
}
.dock-app.focused {
padding: 3px;
border: 1px solid #5f5f5f;
background-gradient-direction: vertical;
background-gradient-start: rgba(61,61,61,0.8);
background-gradient-end: rgba(24,24,24,0.2);
}
.dock-app:hover {
padding: 3px;
border: 1px solid #666666;
background-gradient-direction: vertical;
background-gradient-start: rgba(61,61,61,0.8);
background-gradient-end: rgba(24,24,24,0.2);
transition-duration: 100;
}
.dock-app:active {
padding: 3px;
background-color: #1e1e1e;
border: 1px solid #5f5f5f;
}
.dock-menu {
font-size: 12px
}

View File

@@ -1,4 +1,5 @@
// Drive menu extension
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const Lang = imports.lang;
const St = imports.gi.St;
@@ -11,26 +12,24 @@ const Main = imports.ui.main;
const Panel = imports.ui.panel;
const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const ShellMountOperation = imports.ui.shellMountOperation;
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
function DriveMenuItem(place) {
this._init(place);
}
const MountMenuItem = new Lang.Class({
Name: 'DriveMenu.MountMenuItem',
Extends: PopupMenu.PopupBaseMenuItem,
DriveMenuItem.prototype = {
__proto__: PopupMenu.PopupBaseMenuItem.prototype,
_init: function(mount) {
this.parent();
_init: function(place) {
PopupMenu.PopupBaseMenuItem.prototype._init.call(this);
this.label = new St.Label({ text: mount.get_name() });
this.place = place;
this.label = new St.Label({ text: place.name });
this.addActor(this.label);
this.actor.label_actor = this.label;
this.mount = mount;
let ejectIcon = new St.Icon({ icon_name: 'media-eject-symbolic',
let ejectIcon = new St.Icon({ icon_name: 'media-eject',
icon_type: St.IconType.SYMBOLIC,
style_class: 'popup-menu-icon ' });
let ejectButton = new St.Button({ child: ejectIcon });
ejectButton.connect('clicked', Lang.bind(this, this._eject));
@@ -38,140 +37,62 @@ const MountMenuItem = new Lang.Class({
},
_eject: function() {
let mountOp = new ShellMountOperation.ShellMountOperation(this.mount);
if (this.mount.can_eject())
this.mount.eject_with_operation(Gio.MountUnmountFlags.NONE,
mountOp.mountOp,
null, // Gio.Cancellable
Lang.bind(this, this._ejectFinish));
else
this.mount.unmount_with_operation(Gio.MountUnmountFlags.NONE,
mountOp.mountOp,
null, // Gio.Cancellable
Lang.bind(this, this._unmountFinish));
},
_unmountFinish: function(mount, result) {
try {
mount.unmount_with_operation_finish(result);
} catch(e) {
this._reportFailure(e);
}
},
_ejectFinish: function(mount, result) {
try {
mount.eject_with_operation_finish(result);
} catch(e) {
this._reportFailure(e);
}
},
_reportFailure: function(exception) {
let msg = _("Ejecting drive '%s' failed:").format(this.mount.get_name());
Main.notifyError(msg, exception.message);
this.place.remove();
},
activate: function(event) {
Gio.AppInfo.launch_default_for_uri(this.mount.get_root().get_uri(),
global.create_app_launch_context());
this.place.launch({ timestamp: event.get_time() });
this.parent(event);
PopupMenu.PopupBaseMenuItem.prototype.activate.call(this, event);
}
});
};
const DriveMenu = new Lang.Class({
Name: 'DriveMenu.DriveMenu',
Extends: PanelMenu.SystemStatusButton,
function DriveMenu() {
this._init();
}
DriveMenu.prototype = {
__proto__: PanelMenu.SystemStatusButton.prototype,
_init: function() {
this.parent('media-eject-symbolic', _("Removable devices"));
// is 'media-eject' better?
PanelMenu.SystemStatusButton.prototype._init.call(this, 'media-optical');
this._monitor = Gio.VolumeMonitor.get();
this._addedId = this._monitor.connect('mount-added', Lang.bind(this, function(monitor, mount) {
this._addMount(mount);
this._updateMenuVisibility();
}));
this._removedId = this._monitor.connect('mount-removed', Lang.bind(this, function(monitor, mount) {
this._removeMount(mount);
this._updateMenuVisibility();
}));
this._manager = Main.placesManager;
this._manager.connect('mounts-updated', Lang.bind(this, this._update));
this._mounts = [ ];
this._contentSection = new PopupMenu.PopupMenuSection();
this.menu.addMenuItem(this._contentSection);
this._monitor.get_mounts().forEach(Lang.bind(this, this._addMount));
this._update();
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addAction(_("Open File"), function(event) {
this.menu.addAction(_("Open file manager"), function(event) {
let appSystem = Shell.AppSystem.get_default();
let app = appSystem.lookup_app('nautilus.desktop');
app.activate_full(-1, event.get_time());
});
this._updateMenuVisibility();
},
_updateMenuVisibility: function() {
if (this._mounts.length > 0)
this.actor.show();
else
this.actor.hide();
},
_update: function() {
this._contentSection.removeAll();
_isMountInteresting: function(mount) {
if (!mount.can_eject() && !mount.can_unmount())
return false;
let volume = mount.get_volume();
if (volume == null) {
// probably a GDaemonMount, could be network or
// local, but we can't tell; assume it's local for now
return true;
}
return volume.get_identifier('class') != 'network';
},
_addMount: function(mount) {
if (!this._isMountInteresting(mount))
return;
let item = new MountMenuItem(mount);
this._mounts.unshift(item);
this.menu.addMenuItem(item, 0);
},
_removeMount: function(mount) {
if (!this._isMountInteresting(mount))
return;
for (let i = 0; i < this._mounts.length; i++) {
let item = this._mounts[i];
if (item.mount == mount) {
item.destroy();
this._mounts.splice(i, 1);
return;
let mounts = this._manager.getMounts();
let any = false;
for (let i = 0; i < mounts.length; i++) {
if (mounts[i].isRemovable()) {
this._contentSection.addMenuItem(new DriveMenuItem(mounts[i]));
any = true;
}
}
log ('Removing a mount that was never added to the menu');
this.actor.visible = any;
},
}
destroy: function() {
if (this._connectedId) {
this._monitor.disconnect(this._connectedId);
this._monitor.disconnect(this._disconnectedId);
this._connectedId = 0;
this._disconnectedId = 0;
}
this.parent();
},
});
function init() {
Convenience.initTranslations();
// Put your extension initialization code here
function init(metadata) {
imports.gettext.bindtextdomain('gnome-shell-extensions', GLib.build_filenamev([metadata.path, 'locale']));
}
let _indicator;

View File

@@ -1,10 +1,7 @@
{
"extension-id": "@extension_id@",
"uuid": "@uuid@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"name": "Removable Drive Menu",
"description": "A status menu for accessing and unmounting removable devices",
"shell-version": [ "@shell_current@" ],
"shell-version": [ "@shell_current@", "3.2" ],
"url": "@url@"
}

View File

@@ -1,6 +1,3 @@
EXTENSION_ID = example
EXTRA_MODULES = prefs.js
include ../../extension.mk
include ../../settings.mk

View File

@@ -1,5 +1,5 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
// Sample extension code, makes clicking on the panel show a message
const GLib = imports.gi.GLib;
const St = imports.gi.St;
const Mainloop = imports.mainloop;
@@ -8,26 +8,19 @@ const _ = Gettext.gettext;
const Main = imports.ui.main;
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
function _showHello() {
let settings = Convenience.getSettings();
let text = settings.get_string('hello-text') || _("Hello, world!");
let label = new St.Label({ style_class: 'helloworld-label', text: text });
let text = new St.Label({ style_class: 'helloworld-label', text: _("Hello, world!") });
let monitor = Main.layoutManager.primaryMonitor;
global.stage.add_actor(label);
label.set_position(Math.floor (monitor.width / 2 - label.width / 2), Math.floor(monitor.height / 2 - label.height / 2));
Mainloop.timeout_add(3000, function () { label.destroy(); });
global.stage.add_actor(text);
text.set_position(Math.floor (monitor.width / 2 - text.width / 2), Math.floor(monitor.height / 2 - text.height / 2));
Mainloop.timeout_add(3000, function () { text.destroy(); });
}
// Put your extension initialization code here
function init(metadata) {
log ('Example extension initalized');
Convenience.initTranslations();
imports.gettext.bindtextdomain('gnome-shell-extensions', GLib.build_filenamev([metadata.path, 'locale']));
}
let signalId;

View File

@@ -1,10 +1,7 @@
{
"extension-id": "@extension_id@",
"uuid": "@uuid@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"name": "Hello, World!",
"description": "An example extension to show how it works. Shows Hello, world when clicking on the top panel.",
"shell-version": [ "@shell_current@" ],
"shell-version": [ "@shell_current@", "3.2" ],
"url": "@url@"
}

View File

@@ -1,9 +0,0 @@
<schemalist gettext-domain="gnome-shell-extensions">
<schema id="org.gnome.shell.extensions.example" path="/org/gnome/shell/extensions/example/">
<key name="hello-text" type="s">
<default>''</default>
<_summary>Alternative greeting text.</_summary>
<_description>If not empty, it contains the text that will be shown when clicking on the panel.</_description>
</key>
</schema>
</schemalist>

View File

@@ -1,52 +0,0 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Gio = imports.gi.Gio;
const Gtk = imports.gi.Gtk;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
function init() {
Convenience.initTranslations();
}
const ExamplePrefsWidget = new GObject.Class({
Name: 'Example.Prefs.Widget',
GTypeName: 'ExamplePrefsWidget',
Extends: Gtk.Grid,
_init: function(params) {
this.parent(params);
this.margin = this.row_spacing = this.column_spacing = 10;
// TRANSLATORS: Example is the name of the extension, should not be
// translated
let primaryText = _("Example aims to show how to build well behaved \
extensions for the Shell and as such it has little functionality on its own.\n\
Nevertheless it's possible to customize the greeting message.");
this.attach(new Gtk.Label({ label: primaryText, wrap: true }), 0, 0, 2, 1);
this.attach(new Gtk.Label({ label: '<b>' + _("Message:") + '</b>', use_markup: true }),
0, 1, 1, 1);
let entry = new Gtk.Entry({ hexpand: true });
this.attach(entry, 1, 1, 1, 1);
this._settings = Convenience.getSettings();
this._settings.bind('hello-text', entry, 'text', Gio.SettingsBindFlags.DEFAULT);
}
});
function buildPrefsWidget() {
let widget = new ExamplePrefsWidget();
widget.show_all();
return widget;
}

View File

@@ -0,0 +1,3 @@
EXTENSION_ID = gajim
include ../../extension.mk

View File

@@ -0,0 +1,340 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const DBus = imports.dbus;
const Gettext = imports.gettext.domain('gnome-shell');
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Signals = imports.signals;
const St = imports.gi.St;
const Tp = imports.gi.TelepathyGLib;
const Main = imports.ui.main;
const Mainloop = imports.mainloop;
const MessageTray = imports.ui.messageTray;
const Shell = imports.gi.Shell;
const TelepathyClient = imports.ui.telepathyClient;
const _ = Gettext.gettext;
// http://ntt.cc/ext/base64-Encoding-Decoding.html
const keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";
function decode64(input) {
let output = "";
let chr1, chr2, chr3;
let enc1, enc2, enc3, enc4;
let i = 0;
input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");
do {
enc1 = keyStr.indexOf(input.charAt(i++));
enc2 = keyStr.indexOf(input.charAt(i++));
enc3 = keyStr.indexOf(input.charAt(i++));
enc4 = keyStr.indexOf(input.charAt(i++));
chr1 = (enc1 << 2) | (enc2 >> 4);
chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
chr3 = ((enc3 & 3) << 6) | enc4;
output = output + String.fromCharCode(chr1);
if (enc3 != 64) {
output = output + String.fromCharCode(chr2);
}
if (enc4 != 64) {
output = output + String.fromCharCode(chr3);
}
chr1 = chr2 = chr3 = "";
enc1 = enc2 = enc3 = enc4 = "";
} while (i < input.length);
return unescape(output);
}
function wrappedText(text, sender, timestamp, direction) {
if (!timestamp)
timestamp = (Date.now() / 1000);
return {
messageType: Tp.ChannelTextMessageType.NORMAL,
text: text,
sender: sender,
timestamp: timestamp,
direction: direction
};
}
function Source(gajimClient, accountName, author, initialMessage) {
this._init(gajimClient, accountName, author, initialMessage);
}
Source.prototype = {
__proto__: MessageTray.Source.prototype,
_init: function(gajimClient, accountName, author, initialMessage) {
MessageTray.Source.prototype._init.call(this, author);
this.isChat = true;
this._author = author;
this._gajimClient = gajimClient;
this._accountName = accountName;
this._initialMessage = initialMessage;
this._iconUri = null;
this._presence = "online";
this._notification = new TelepathyClient.ChatNotification(this);
this._notification.setUrgency(MessageTray.Urgency.HIGH);
let jid = author.split('/')[0];
let proxy = this._gajimClient.proxy();
proxy.contact_infoRemote(jid, Lang.bind(this, this._gotContactInfos));
this._statusChangeId = proxy.connect('ContactStatus',
Lang.bind(this, this._onStatusChange));
this._contactAbsenceId = proxy.connect('ContactAbsence',
Lang.bind(this, this._onStatusChange));
this._chatStateId = proxy.connect('ChatState',
Lang.bind(this, this._onChatState));
this._messageSentId = proxy.connect('MessageSent',
Lang.bind(this, this._messageSent));
this._newMessageId = proxy.connect('NewMessage',
Lang.bind(this, this._messageReceived));
},
destroy: function() {
let proxy = this._gajimClient.proxy();
proxy.disconnect(this._statusChangeId);
proxy.disconnect(this._contactAbsenceId);
proxy.disconnect(this._chatStateId);
proxy.disconnect(this._messageSentId);
proxy.disconnect(this._newMessageId);
MessageTray.Source.prototype.destroy.call(this);
},
_gotContactInfos: function(result, excp) {
this.title = result['FN'];
let avatarUri = null;
if (result['PHOTO']) {
let mimeType = result['PHOTO']['TYPE'];
let avatarData = decode64(result['PHOTO']['BINVAL']);
let sha = result['PHOTO']['SHA'];
avatarUri = this._gajimClient.cacheAvatar(mimeType, sha, avatarData);
}
this._iconUri = avatarUri;
this._setSummaryIcon(this.createNotificationIcon());
let message = wrappedText(this._initialMessage, this._author, null, TelepathyClient.NotificationDirection.RECEIVED);
this._notification.appendMessage(message, false);
if (!Main.messageTray.contains(this))
Main.messageTray.add(this);
this.notify(this._notification);
},
createNotificationIcon: function() {
let iconBox = new St.Bin({ style_class: 'avatar-box' });
iconBox._size = this.ICON_SIZE;
if (!this._iconUri) {
iconBox.child = new St.Icon({ icon_name: 'avatar-default',
icon_type: St.IconType.FULLCOLOR,
icon_size: iconBox._size });
} else {
let textureCache = St.TextureCache.get_default();
iconBox.child = textureCache.load_uri_async(this._iconUri, iconBox._size, iconBox._size);
}
return iconBox;
},
open: function(notification) {
// Lookup for the messages window and display it. In the case where it's not o
// opened yet fallback to the roster window.
let windows = global.get_window_actors();
for (let i = 0; i < windows.length; i++) {
let metaWindow = windows[i].metaWindow;
if (metaWindow.get_wm_class_instance() == "gajim" &&
metaWindow.get_role() == "messages") {
Main.activateWindow(metaWindow);
return;
}
}
let app = Shell.AppSystem.get_default().lookup_app('gajim.desktop');
app.activate(-1);
},
_onChatState: function(emitter, data) {
let chatstate = data[1][5];
if (chatstate == 'gone')
this.destroy();
},
setChatState: function(state) {
// Gajim DBUS API doesn't support sending chatstate yet.
},
_messageReceived: function(emitter, data) {
let author = data[1][0];
let text = data[1][1];
if (text && (author == this._author)) {
let message = wrappedText(text, this._author, null, TelepathyClient.NotificationDirection.RECEIVED);
this._notification.appendMessage(message, false);
this.notify(this._notification);
}
},
_messageSent: function(emitter, data) {
let recipient = data[1][0];
let text = data[1][1];
let chatstate = data[1][3];
if (text && (recipient == this._author)) {
let message = wrappedText(text, this._author, null, TelepathyClient.NotificationDirection.SENT);
this._notification.appendMessage(message, false);
} else if (chatstate == 'gone')
this.destroy();
},
notify: function() {
MessageTray.Source.prototype.notify.call(this, this._notification);
},
respond: function(text) {
let jid = this._author;
let keyID = ""; // unencrypted.
this._gajimClient.proxy().send_chat_messageRemote(jid, text, keyID, this._accountName);
},
_onStatusChange: function(emitter, data) {
if (!this.title)
return;
let jid = data[1][0];
let presence = data[1][1];
let message = data[1][2];
if (jid != this._author.split('/')[0])
return;
let presenceMessage, shouldNotify, title;
title = GLib.markup_escape_text(this.title, -1);
if (presence == "away") {
presenceMessage = _("%s is away.").format(title);
shouldNotify = false;
} else if (presence == "offline") {
presenceMessage = _("%s is offline.").format(title);
shouldNotify = (this._presence != "offline");
} else if (presence == "online") {
presenceMessage = _("%s is online.").format(title);
shouldNotify = (this._presence == "offline");
} else if (presence == "dnd") {
presenceMessage = _("%s is busy.").format(title);
shouldNotify = false;
} else
return;
this._presence = presence;
if (message)
presenceMessage += ' <i>(' + GLib.markup_escape_text(message, -1) + ')</i>';
this._notification.appendPresence(presenceMessage, shouldNotify);
if (shouldNotify)
this.notify(this._notification);
}
};
const GajimIface = {
name: 'org.gajim.dbus.RemoteInterface',
properties: [],
methods: [{ name: 'send_chat_message', inSignature: 'ssss', outSignature: 'b'},
{ name: 'contact_info', inSignature: 's', outSignature: 'a{sv}'}],
signals: [{ name: 'NewMessage', inSignature: 'av' },
{ name: 'ChatState', inSignature: 'av' },
{ name: 'ContactStatus', inSignature: 'av' },
{ name: 'ContactAbsence', inSignature: 'av' },
{ name: 'MessageSent', inSignature: 'av' }]
};
let Gajim = DBus.makeProxyClass(GajimIface);
function GajimClient() {
this._init();
}
GajimClient.prototype = {
_init: function() {
this._sources = {};
},
proxy : function() {
return this._proxy;
},
enable: function() {
this._cacheDir = GLib.get_user_cache_dir() + '/gnome-shell/gajim-avatars';
let dir = Gio.file_new_for_path(this._cacheDir);
if (!dir.query_exists(null)) {
GLib.mkdir_with_parents(this._cacheDir, 0x1c0); // 0x1c0 = octal 0700
}
this._proxy = new Gajim(DBus.session, 'org.gajim.dbus', '/org/gajim/dbus/RemoteObject');
this._newMessageId = this._proxy.connect('NewMessage', Lang.bind(this, this._messageReceived));
},
disable: function() {
if (this._newMessageId) {
this._proxy.disconnect(this._newMessageId);
this._newMessageId = 0;
}
this._proxy = null;
for (let id in this._sources)
this._sources[id].destroy();
this._sources = { };
},
_messageReceived : function(emitter, data) {
let author = data[1][0];
let message = data[1][1];
let account = data[0];
let source = this._sources[author];
if (!source) {
source = new Source(this, account, author, message);
source.connect('destroy', Lang.bind(this,
function() {
delete this._sources[author];
}));
this._sources[author] = source;
}
},
cacheAvatar : function(mimeType, sha, avatarData) {
let ext = mimeType.split('/')[1];
let file = this._cacheDir + '/' + sha + '.' + ext;
let uri = GLib.filename_to_uri(file, null);
if (GLib.file_test(file, GLib.FileTest.EXISTS))
return uri;
let success = false;
try {
success = GLib.file_set_contents(file, avatarData, avatarData.length);
} catch (e) {
logError(e, 'Error caching avatar data');
}
return uri;
}
};
function init() {
return new GajimClient();
}

View File

@@ -0,0 +1,7 @@
{
"uuid": "@uuid@",
"name": "Gajim IM integration",
"description": "Display Gajim incoming chats as notifications in the Shell message tray.",
"shell-version": [ "@shell_current@", "3.2" ],
"url": "http://base-art.net"
}

View File

@@ -0,0 +1 @@
/* none used */

View File

@@ -1,3 +0,0 @@
EXTENSION_ID = launch-new-instance
include ../../extension.mk

View File

@@ -1,37 +0,0 @@
const Main = imports.ui.main;
const AppDisplay = imports.ui.appDisplay;
var _onActivateOriginal = null;
var _activateResultOriginal = null;
function _onActivate(event) {
this.emit('launching');
if (this._onActivateOverride) {
this._onActivateOverride(event);
} else {
this.app.open_new_window(-1);
}
Main.overview.hide();
}
function _activateResult(app) {
app.open_new_window(-1);
}
function init() {
}
function enable() {
_onActivateOriginal = AppDisplay.AppIcon.prototype._onActivate;
AppDisplay.AppIcon.prototype._onActivate = _onActivate;
_activateResultOriginal = AppDisplay.AppSearchProvider.prototype.activateResult;
AppDisplay.AppSearchProvider.prototype.activateResult = _activateResult;
}
function disable() {
AppDisplay.AppIcon.prototype._onActivate = _onActivateOriginal;
AppDisplay.AppSearchProvider.prototype.activateResult = _activateResultOriginal;
}

View File

@@ -1,10 +0,0 @@
{
"extension-id": "@extension_id@",
"uuid": "@uuid@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"name": "Launch new instance",
"description": "Always launch a new instance",
"shell-version": [ "@shell_current@" ],
"url": "@url@"
}

View File

@@ -1 +0,0 @@
/* This extensions requires no special styling */

View File

@@ -1,5 +1,3 @@
EXTENSION_ID = native-window-placement
include ../../extension.mk
include ../../settings.mk

View File

@@ -20,9 +20,16 @@ const Tweener = imports.ui.tweener;
const Workspace = imports.ui.workspace;
const WindowPositionFlags = Workspace.WindowPositionFlags;
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
const WindowPlacementStrategy = {
NATURAL: 0,
GRID: 1,
};
/* Begin user settings */
const PLACEMENT_STRATEGY = WindowPlacementStrategy.NATURAL;
const USE_MORE_SCREEN = true;
const WINDOW_CAPTIONS_ON_TOP = true;
/* End user settings - do not change anything below this line */
// testing settings for natural window placement strategy:
const WINDOW_PLACEMENT_NATURAL_FILLGAPS = true; // enlarge windows at the end to fill gaps // not implemented yet
@@ -33,12 +40,6 @@ const WINDOW_PLACEMENT_NATURAL_MAX_TRANSLATIONS = 5000; // safety li
const PLACE_WINDOW_CAPTIONS_ON_TOP = true; // place window titles in overview on top of windows with overlap parameter
const WORKSPACE_BORDER_GAP = 10; // minimum gap between the workspace area and the workspace selector
const WINDOW_AREA_TOP_GAP = 20; // minimum gap between the workspace area and the top border. This keeps window captions and close buttons visible. 13px (26/2) should currently be enough.
const BUTTON_LAYOUT_SCHEMA = 'org.gnome.shell.overrides';
const BUTTON_LAYOUT_KEY = 'button-layout';
function injectToFunction(parent, name, func) {
let origin = parent[name];
parent[name] = function() {
@@ -49,17 +50,17 @@ function injectToFunction(parent, name, func) {
return ret;
}
}
const WORKSPACE_BORDER_GAP = 10; // gap between the workspace area and the workspace selector
const Rect = new Lang.Class({
Name: 'NativeWindowPlacement.Rect',
_init: function(x, y, width, height) {
[this.x, this.y, this.width, this.height] = [x, y, width, height];
},
function Rect(x, y, width, height) {
[this.x, this.y, this.width, this.height] = arguments;
}
Rect.prototype = {
/**
* used in _calculateWindowTransformationsNatural to replace Meta.Rectangle that is too slow.
*/
copy: function() {
return new Rect(this.x, this.y, this.width, this.height);
},
@@ -108,26 +109,22 @@ const Rect = new Lang.Class({
this.x += dx;
this.y += dy;
}
});
};
let winInjections, workspaceInjections, connectedSignals;
function resetState() {
winInjections = { };
workspaceInjections = { };
workViewInjections = { };
connectedSignals = [ ];
}
function enable() {
resetState();
let settings = Convenience.getSettings();
let useMoreScreen = settings.get_boolean('use-more-screen');
let windowCaptionsOnTop = settings.get_boolean('window-captions-on-top');
let signalId = settings.connect('changed::use-more-screen', function() {
useMoreScreen = settings.get_boolean('use-more-screen');
});
connectedSignals.push({ obj: settings, id: signalId });
let placementStrategy = PLACEMENT_STRATEGY;
let useMoreScreen = USE_MORE_SCREEN;
/**
* _calculateWindowTransformationsNatural:
@@ -145,41 +142,10 @@ function enable() {
return win2.metaWindow.get_stable_sequence() - win1.metaWindow.get_stable_sequence();
});
let node = this.actor.get_theme_node();
let columnSpacing = node.get_length('-horizontal-spacing');
let rowSpacing = node.get_length('-vertical-spacing');
let padding = {
left: node.get_padding(St.Side.LEFT),
top: node.get_padding(St.Side.TOP),
bottom: node.get_padding(St.Side.BOTTOM),
right: node.get_padding(St.Side.RIGHT),
};
let closeButtonHeight, captionHeight;
let leftBorder, rightBorder;
// If the window captions are below the window, put an additional gap to account for them
if (!windowCaptionsOnTop && this._windowOverlays.length) {
// All of the overlays have the same chrome sizes,
// so just pick the first one.
let overlay = this._windowOverlays[0];
[closeButtonHeight, captionHeight] = overlay.chromeHeights();
[leftBorder, rightBorder] = overlay.chromeWidths();
} else {
[closeButtonHeight, captionHeight] = [0, 0];
[leftBorder, rightBorder] = [0, 0];
}
rowSpacing += captionHeight;
columnSpacing += (rightBorder + leftBorder) / 2;
padding.top += closeButtonHeight;
padding.bottom += captionHeight;
padding.left += leftBorder;
padding.right += rightBorder;
let area = new Rect(this._x + padding.left,
this._y + padding.top,
this._width - padding.left - padding.right,
this._height - padding.top - padding.bottom);
// Put a gap on the right edge of the workspace to separe it from the workspace selector
let x_gap = WORKSPACE_BORDER_GAP;
let y_gap = WORKSPACE_BORDER_GAP * this._height / this._width
let area = new Rect(this._x, this._y, this._width - x_gap, this._height - y_gap);
let bounds = area.copy();
@@ -321,8 +287,8 @@ function enable() {
let targets = [];
for (let i = 0; i < rects.length; i++) {
rects[i].x = rects[i].x * scale + area.x;
rects[i].y = rects[i].y * scale + area.y;
rects[i].x = rects[i].x * scale + this._x;
rects[i].y = rects[i].y * scale + this._y;
targets[i] = [rects[i].x, rects[i].y, scale];
}
@@ -332,13 +298,32 @@ function enable() {
workspaceInjections['_calculateWindowTransformationsNatural'] = undefined;
/**
* _realPositionWindows:
* _calculateWindowTransformationsGrid:
* @clones: Array of #MetaWindow
*
* Returns clones with matching target coordinates and scales to arrange windows in a grid.
*/
Workspace.Workspace.prototype._calculateWindowTransformationsGrid = function(clones) {
let slots = this._computeAllWindowSlots(clones.length);
clones = this._orderWindowsByMotionAndStartup(clones, slots);
let targets = [];
for (let i = 0; i < clones.length; i++) {
targets[i] = this._computeWindowLayout(clones[i].metaWindow, slots[i]);
}
return [clones, targets];
}
workspaceInjections['_calculateWindowTransformationsGrid'] = undefined;
/**
* positionWindows:
* @flags:
* INITIAL - this is the initial positioning of the windows.
* ANIMATE - Indicates that we need animate changing position.
*/
workspaceInjections['_realPositionWindows'] = Workspace.Workspace.prototype._realPositionWindows;
Workspace.Workspace.prototype._realPositionWindows = function(flags) {
workspaceInjections['positionWindows'] = Workspace.Workspace.prototype.positionWindows;
Workspace.Workspace.prototype.positionWindows = function(flags) {
if (this._repositionWindowsId > 0) {
Mainloop.source_remove(this._repositionWindowsId);
this._repositionWindowsId = 0;
@@ -352,32 +337,38 @@ function enable() {
let animate = flags & WindowPositionFlags.ANIMATE;
// Start the animations
let targets = [];
let targets = [];
let scales = [];
[clones, targets] = this._calculateWindowTransformationsNatural(clones);
switch (placementStrategy) {
case WindowPlacementStrategy.NATURAL:
[clones, targets] = this._calculateWindowTransformationsNatural(clones);
break;
default:
log ('Invalid window placement strategy');
placementStrategy = WindowPlacementStrategy.GRID;
case WindowPlacementStrategy.GRID:
[clones, targets] = this._calculateWindowTransformationsGrid(clones);
break;
}
let currentWorkspace = global.screen.get_active_workspace();
let currentWorkspace = global.screen.get_active_workspace();
let isOnCurrentWorkspace = this.metaWorkspace == null || this.metaWorkspace == currentWorkspace;
for (let i = 0; i < clones.length; i++) {
let clone = clones[i];
let [x, y , scale] = targets[i];
let [x, y , scale] = targets[i];
let metaWindow = clone.metaWindow;
let mainIndex = this._lookupIndex(metaWindow);
let overlay = this._windowOverlays[mainIndex];
clone.slotId = i;
// Positioning a window currently being dragged must be avoided;
// we'll just leave a blank spot in the layout for it.
if (clone.inDrag)
continue;
clone.slot = [x, y, clone.actor.width * scale, clone.actor.height * scale];
if (overlay && initialPositioning)
overlay.hide(initialPositioning);
if (overlay)
overlay.hide();
if (animate && isOnCurrentWorkspace) {
if (!metaWindow.showing_on_its_workspace()) {
/* Hidden windows should fade in and grow
@@ -399,66 +390,115 @@ function enable() {
});
}
this._animateClone(clone, overlay, x, y, scale, initialPositioning);
Tweener.addTween(clone.actor,
{ x: x,
y: y,
scale_x: scale,
scale_y: scale,
time: Overview.ANIMATION_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
this._showWindowOverlay(clone, overlay, true);
})
});
} else {
clone.actor.set_position(x, y);
clone.actor.set_scale(scale, scale);
clone.overlay.relayout(false);
this._showWindowOverlay(clone, overlay, isOnCurrentWorkspace);
}
}
}
/// position window titles on top of windows in overlay ////
if (windowCaptionsOnTop) {
if (WINDOW_CAPTIONS_ON_TOP) {
winInjections['_init'] = Workspace.WindowOverlay.prototype._init;
Workspace.WindowOverlay.prototype._init = function(windowClone, parentActor) {
let metaWindow = windowClone.metaWindow;
this._windowClone = windowClone;
this._parentActor = parentActor;
this._hidden = false;
let title = new St.Label({ style_class: 'window-caption',
text: metaWindow.title });
title.clutter_text.ellipsize = Pango.EllipsizeMode.END;
title._spacing = 0;
title._overlap = 0;
this._updateCaptionId = metaWindow.connect('notify::title', Lang.bind(this, function(w) {
this.title.text = w.title;
}));
let button = new St.Button({ style_class: 'window-close' });
button._overlap = 0;
this._idleToggleCloseId = 0;
button.connect('clicked', Lang.bind(this, this._closeWindow));
windowClone.actor.connect('destroy', Lang.bind(this, this._onDestroy));
windowClone.actor.connect('enter-event', Lang.bind(this, this._onEnter));
windowClone.actor.connect('leave-event', Lang.bind(this, this._onLeave));
this._windowAddedId = 0;
windowClone.connect('zoom-start', Lang.bind(this, this.hide));
windowClone.connect('zoom-end', Lang.bind(this, this.show));
button.hide();
this.title = title;
this.closeButton = button;
parentActor.add_actor(this.title);
parentActor.add_actor(this.closeButton);
title.connect('style-changed', Lang.bind(this, this._onStyleChanged));
button.connect('style-changed', Lang.bind(this, this._onStyleChanged));
// force a style change if we are already on a stage - otherwise
// the signal will be emitted normally when we are added
if (parentActor.get_stage())
this._onStyleChanged();
},
winInjections['chromeHeights'] = Workspace.WindowOverlay.prototype.chromeHeights;
Workspace.WindowOverlay.prototype.chromeHeights = function () {
Workspace.WindowOverlay.prototype.chromeHeights = function () {
return [Math.max( this.closeButton.height - this.closeButton._overlap, this.title.height - this.title._overlap),
0];
};
0];
},
winInjections['updatePositions'] = Workspace.WindowOverlay.prototype.updatePositions;
Workspace.WindowOverlay.prototype.updatePositions = function(cloneX, cloneY, cloneWidth, cloneHeight, animate) {
Workspace.WindowOverlay.prototype.updatePositions = function(cloneX, cloneY, cloneWidth, cloneHeight) {
let button = this.closeButton;
let title = this.title;
let settings = new Gio.Settings({ schema: BUTTON_LAYOUT_SCHEMA });
let layout = settings.get_string(BUTTON_LAYOUT_KEY);
let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL;
let split = layout.split(":");
let side;
if (split[0].indexOf("close") > -1)
side = rtl ? St.Side.RIGHT : St.Side.LEFT;
else
side = rtl ? St.Side.LEFT : St.Side.RIGHT;
let buttonX;
let buttonY = cloneY - (button.height - button._overlap);
if (side == St.Side.LEFT)
buttonX = cloneX - (button.width - button._overlap);
if (St.Widget.get_default_direction() == St.TextDirection.RTL)
buttonX = cloneX - (button.width - button._overlap);
else
buttonX = cloneX + (cloneWidth - button._overlap);
buttonX = cloneX + (cloneWidth - button._overlap);
if (animate)
this._animateOverlayActor(button, Math.floor(buttonX), Math.floor(buttonY), button.width);
else
button.set_position(Math.floor(buttonX), Math.floor(buttonY));
button.set_position(Math.floor(buttonX), Math.floor(buttonY));
if (!title.fullWidth)
title.fullWidth = title.width;
let titleWidth = Math.min(title.fullWidth, cloneWidth);
title.fullWidth = title.width;
title.width = Math.min(title.fullWidth, cloneWidth);
let titleX = cloneX + (cloneWidth - titleWidth) / 2;
let titleY = cloneY - title.height + title._spacing;
let titleX = cloneX + (cloneWidth - title.width) / 2;
let titleY = cloneY - title.height + title._overlap;
title.set_position(Math.floor(titleX), Math.floor(titleY));
},
if (animate)
this._animateOverlayActor(title, Math.floor(titleX), Math.floor(titleY), titleWidth);
else {
title.width = titleWidth;
title.set_position(Math.floor(titleX), Math.floor(titleY));
}
};
winInjections['_onStyleChanged'] = Workspace.WindowOverlay.prototype._onStyleChanged;
Workspace.WindowOverlay.prototype._onStyleChanged = function() {
let titleNode = this.title.get_theme_node();
this.title._spacing = titleNode.get_length('-shell-caption-spacing');
this.title._overlap = titleNode.get_length('-shell-caption-overlap');
let closeNode = this.closeButton.get_theme_node();
this.closeButton._overlap = closeNode.get_length('-shell-close-overlap');
this._parentActor.queue_relayout();
}
}
}

View File

@@ -1,11 +1,8 @@
{
"uuid": "@uuid@",
"extension-id": "@extension_id@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"name": "Native Window Placement",
"description": "Arrange windows in overview in a more native way",
"shell-version": [ "@shell_current@" ],
"shell-version": [ "@shell_current@", "3.2" ],
"url": "@url@",
"original-authors": [ "wepmaschda@gmx.de" ]
}

View File

@@ -1,16 +0,0 @@
<schemalist gettext-domain="gnome-shell-extensions">
<schema id="org.gnome.shell.extensions.native-window-placement" path="/org/gnome/shell/extensions/native-window-placement/">
<key name="use-more-screen" type="b">
<default>true</default>
<_summary>Use more screen for windows</_summary>
<_description>Try to use more screen for placing window thumbnails by adapting to screen aspect ratio, and consolidating
them further to reduce the bounding box. This setting applies only with the natural placement strategy.</_description>
</key>
<key name="window-captions-on-top" type="b">
<default>true</default>
<_summary>Place window captions on top</_summary>
<_description>If true, place window captions on top the respective thumbnail, overriding shell default of placing it at
the bottom. Changing this setting requires restarting the shell to have any effect.</_description>
</key>
</schema>
</schemalist>

View File

@@ -1,9 +1,4 @@
.window-caption {
-shell-caption-spacing: 13px; /* current caption height is 26px => set it to half of it. TODO: better solution needed */
color: red;
-shell-caption-overlap: 10px;
}
.window-picker {
-horizontal-spacing: 32px;
-vertical-spacing: 32px;
padding: 64px 32px;
}

View File

@@ -1,5 +1,3 @@
EXTENSION_ID = places-menu
EXTRA_MODULES = placeDisplay.js
include ../../extension.mk

View File

@@ -1,6 +1,6 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const Gio = imports.gi.Gio;
const Gdk = imports.gi.Gdk;
const GLib = imports.gi.GLib;
const Lang = imports.lang;
const Shell = imports.gi.Shell;
@@ -13,122 +13,115 @@ const Panel = imports.ui.panel;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const N_ = function(x) { return x; }
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
const PlaceDisplay = Me.imports.placeDisplay;
const PLACE_ICON_SIZE = 22;
const PLACE_ICON_SIZE = 16;
function PlacesMenu() {
this._init.apply(this, arguments);
}
const PlaceMenuItem = new Lang.Class({
Name: 'PlaceMenuItem',
Extends: PopupMenu.PopupBaseMenuItem,
_init: function(info) {
this.parent();
this._info = info;
this._icon = new St.Icon({ gicon: info.icon,
icon_size: PLACE_ICON_SIZE });
this.addActor(this._icon);
this._label = new St.Label({ text: info.name });
this.addActor(this._label);
this._changedId = info.connect('changed',
Lang.bind(this, this._propertiesChanged));
},
destroy: function() {
if (this._changedId) {
this._info.disconnect(this._changedId);
this._changedId = 0;
}
this.parent();
},
activate: function(event) {
this._info.launch(event.get_time());
this.parent(event);
},
_propertiesChanged: function(info) {
this._icon.gicon = info.icon;
this._label.text = info.name;
},
});
const SECTIONS = [
'special',
'devices',
'bookmarks',
'network'
]
const PlacesMenu = new Lang.Class({
Name: 'PlacesMenu.PlacesMenu',
Extends: PanelMenu.Button,
PlacesMenu.prototype = {
__proto__: PanelMenu.SystemStatusButton.prototype,
_init: function() {
let label = new St.Label({ text: _("Places") });
this.parent(0.0, label.text);
this.actor.add_actor(label);
PanelMenu.SystemStatusButton.prototype._init.call(this, 'folder');
this.placesManager = new PlaceDisplay.PlacesManager();
this._sections = { };
for (let i=0; i < SECTIONS.length; i++) {
let id = SECTIONS[i];
this._sections[id] = new PopupMenu.PopupMenuSection();
this.placesManager.connect(id + '-updated', Lang.bind(this, function() {
this._redisplay(id);
}));
this._create(id);
this.menu.addMenuItem(this._sections[id]);
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
}
this.defaultItems = [];
this.bookmarkItems = [];
this.deviceItems = [];
this._createDefaultPlaces();
this._bookmarksSection = new PopupMenu.PopupMenuSection();
this.menu.addMenuItem(this._bookmarksSection);
this._createBookmarks();
this._devicesMenuItem = new PopupMenu.PopupSubMenuMenuItem('Removable Devices');
this.menu.addMenuItem(this._devicesMenuItem);
this._createDevices();
Main.placesManager.connect('bookmarks-updated',Lang.bind(this,this._redisplayBookmarks));
Main.placesManager.connect('mounts-updated',Lang.bind(this,this._redisplayDevices));
},
destroy: function() {
this.placesManager.destroy();
this.parent();
_redisplayBookmarks: function(){
this._clearBookmarks();
this._createBookmarks();
},
_redisplay: function(id) {
this._sections[id].removeAll();
this._create(id);
_redisplayDevices: function(){
this._clearDevices();
this._createDevices();
},
_create: function(id) {
let places = this.placesManager.get(id);
_createDefaultPlaces : function() {
this.defaultPlaces = Main.placesManager.getDefaultPlaces();
for (let i = 0; i < places.length; i++)
this._sections[id].addMenuItem(new PlaceMenuItem(places[i]));
for (let placeid = 0; placeid < this.defaultPlaces.length; placeid++) {
this.defaultItems[placeid] = new PopupMenu.PopupMenuItem(this.defaultPlaces[placeid].name);
let icon = this.defaultPlaces[placeid].iconFactory(PLACE_ICON_SIZE);
this.defaultItems[placeid].addActor(icon, { align: St.Align.END });
this.defaultItems[placeid].place = this.defaultPlaces[placeid];
this.menu.addMenuItem(this.defaultItems[placeid]);
this.defaultItems[placeid].connect('activate', function(actor,event) {
actor.place.launch();
});
this._sections[id].actor.visible = places.length > 0;
}
});
}
},
function init() {
Convenience.initTranslations();
_createBookmarks : function() {
this.bookmarks = Main.placesManager.getBookmarks();
for (let bookmarkid = 0; bookmarkid < this.bookmarks.length; bookmarkid++) {
this.bookmarkItems[bookmarkid] = new PopupMenu.PopupMenuItem(this.bookmarks[bookmarkid].name);
let icon = this.bookmarks[bookmarkid].iconFactory(PLACE_ICON_SIZE);
this.bookmarkItems[bookmarkid].addActor(icon, { align: St.Align.END });
this.bookmarkItems[bookmarkid].place = this.bookmarks[bookmarkid];
this._bookmarksSection.addMenuItem(this.bookmarkItems[bookmarkid]);
this.bookmarkItems[bookmarkid].connect('activate', function(actor,event) {
actor.place.launch();
});
}
},
_createDevices : function() {
this.devices = Main.placesManager.getMounts();
for (let devid = 0; devid < this.devices.length; devid++) {
this.deviceItems[devid] = new PopupMenu.PopupMenuItem(this.devices[devid].name);
let icon = this.devices[devid].iconFactory(PLACE_ICON_SIZE);
this.deviceItems[devid].addActor(icon, { align: St.Align.END });
this.deviceItems[devid].place = this.devices[devid];
this._devicesMenuItem.menu.addMenuItem(this.deviceItems[devid]);
this.deviceItems[devid].connect('activate', function(actor,event) {
actor.place.launch();
});
}
if (this.devices.length == 0)
this._devicesMenuItem.actor.hide();
else
this._devicesMenuItem.actor.show();
},
_clearBookmarks : function(){
this._bookmarksSection.removeAll();
this.bookmarkItems = [];
},
_clearDevices : function(){
this._devicesMenuItem.menu.removeAll();
this.DeviceItems = [];
},
};
function init(metadata) {
imports.gettext.bindtextdomain('gnome-shell-extensions', GLib.build_filenamev([metadata.path, 'locale']));
}
let _indicator;
function enable() {
_indicator = new PlacesMenu;
let pos = 1;
if ('apps-menu' in Main.panel.statusArea)
pos = 2;
Main.panel.addToStatusArea('places-menu', _indicator, pos, 'left');
Main.panel.addToStatusArea('places-menu', _indicator);
}
function disable() {

View File

@@ -1,10 +1,7 @@
{
"extension-id": "@extension_id@",
"uuid": "@uuid@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"name": "Places Status Indicator",
"description": "Add a systems status menu for quickly navigating places in the system",
"shell-version": [ "@shell_current@" ],
"shell-version": [ "@shell_current@", "3.2" ],
"url": "@url@"
}

View File

@@ -1,446 +0,0 @@
// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
const GLib = imports.gi.GLib;
const Gio = imports.gi.Gio;
const Shell = imports.gi.Shell;
const Lang = imports.lang;
const Mainloop = imports.mainloop;
const Signals = imports.signals;
const St = imports.gi.St;
const DND = imports.ui.dnd;
const Main = imports.ui.main;
const Params = imports.misc.params;
const Search = imports.ui.search;
const Util = imports.misc.util;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const N_ = function(x) { return x; }
const Hostname1Iface = <interface name="org.freedesktop.hostname1">
<property name="PrettyHostname" type="s" access="read" />
</interface>;
const Hostname1 = Gio.DBusProxy.makeProxyWrapper(Hostname1Iface);
const PlaceInfo = new Lang.Class({
Name: 'PlaceInfo',
_init: function(kind, file, name, icon) {
this.kind = kind;
this.file = file;
this.name = name || this._getFileName();
this.icon = icon ? new Gio.ThemedIcon({ name: icon }) : this.getIcon();
},
destroy: function() {
},
isRemovable: function() {
return false;
},
launch: function(timestamp) {
let launchContext = global.create_app_launch_context();
launchContext.set_timestamp(timestamp);
try {
Gio.AppInfo.launch_default_for_uri(this.file.get_uri(),
launchContext);
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_MOUNTED)) {
this.file.mount_enclosing_volume(0, null, null, function(file, result) {
file.mount_enclosing_volume_finish(result);
Gio.AppInfo.launch_default_for_uri(file.get_uri(), launchContext);
});
} catch(e) {
Main.notifyError(_("Failed to launch \"%s\"").format(this.name), e.message);
}
},
getIcon: function() {
try {
let info = this.file.query_info('standard::symbolic-icon', 0, null);
return info.get_symbolic_icon();
} catch(e if e instanceof Gio.IOErrorEnum) {
// return a generic icon for this kind
switch (this.kind) {
case 'network':
return new Gio.ThemedIcon({ name: 'folder-remote-symbolic' });
case 'devices':
return new Gio.ThemedIcon({ name: 'drive-harddisk-symbolic' });
case 'special':
case 'bookmarks':
default:
if (!this.file.is_native())
return new Gio.ThemedIcon({ name: 'folder-remote-symbolic' });
else
return new Gio.ThemedIcon({ name: 'folder-symbolic' });
}
}
},
_getFileName: function() {
try {
let info = this.file.query_info('standard::display-name', 0, null);
return info.get_display_name();
} catch(e if e instanceof Gio.IOErrorEnum) {
return this.file.get_basename();
}
},
});
Signals.addSignalMethods(PlaceInfo.prototype);
const RootInfo = new Lang.Class({
Name: 'RootInfo',
Extends: PlaceInfo,
_init: function() {
this.parent('devices', Gio.File.new_for_path('/'), _("Computer"));
this._proxy = new Hostname1(Gio.DBus.system,
'org.freedesktop.hostname1',
'/org/freedesktop/hostname1',
Lang.bind(this, function(obj, error) {
if (error)
return;
this._proxy.connect('g-properties-changed',
Lang.bind(this, this._propertiesChanged));
this._propertiesChanged(obj);
}));
},
getIcon: function() {
return new Gio.ThemedIcon({ name: 'drive-harddisk-symbolic' });
},
_propertiesChanged: function(proxy) {
// GDBusProxy will emit a g-properties-changed when hostname1 goes down
// ignore it
if (proxy.g_name_owner) {
this.name = proxy.PrettyHostname || _("Computer");
this.emit('changed');
}
},
destroy: function() {
this._proxy.run_dispose();
this.parent();
}
});
const PlaceDeviceInfo = new Lang.Class({
Name: 'PlaceDeviceInfo',
Extends: PlaceInfo,
_init: function(kind, mount) {
this._mount = mount;
this.parent(kind, mount.get_root(), mount.get_name());
},
getIcon: function() {
return this._mount.get_symbolic_icon();
}
});
const PlaceVolumeInfo = new Lang.Class({
Name: 'PlaceVolumeInfo',
Extends: PlaceInfo,
_init: function(kind, volume) {
this._volume = volume;
this.parent(kind, volume.get_activation_root(), volume.get_name());
},
launch: function(timestamp) {
if (this.file) {
this.parent(timestamp);
return;
}
this._volume.mount(0, null, null, Lang.bind(this, function(volume, result) {
volume.mount_finish(result);
let mount = volume.get_mount();
this.file = mount.get_root();
this.parent(timestamp);
}));
},
getIcon: function() {
return this._volume.get_symbolic_icon();
}
});
const DEFAULT_DIRECTORIES = [
GLib.UserDirectory.DIRECTORY_DOCUMENTS,
GLib.UserDirectory.DIRECTORY_PICTURES,
GLib.UserDirectory.DIRECTORY_MUSIC,
GLib.UserDirectory.DIRECTORY_DOWNLOAD,
GLib.UserDirectory.DIRECTORY_VIDEOS,
];
const PlacesManager = new Lang.Class({
Name: 'PlacesManager',
_init: function() {
this._places = {
special: [],
devices: [],
bookmarks: [],
network: [],
};
let homePath = GLib.get_home_dir();
this._places.special.push(new PlaceInfo('special',
Gio.File.new_for_path(homePath),
_("Home")));
let specials = [];
for (let i = 0; i < DEFAULT_DIRECTORIES.length; i++) {
let specialPath = GLib.get_user_special_dir(DEFAULT_DIRECTORIES[i]);
if (specialPath == homePath)
continue;
let file = Gio.File.new_for_path(specialPath), info;
try {
info = new PlaceInfo('special', file);
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) {
continue;
}
specials.push(info);
}
specials.sort(function(a, b) {
return GLib.utf8_collate(a.name, b.name);
});
this._places.special = this._places.special.concat(specials);
/*
* Show devices, code more or less ported from nautilus-places-sidebar.c
*/
this._volumeMonitor = Gio.VolumeMonitor.get();
this._connectVolumeMonitorSignals();
this._updateMounts();
this._bookmarksFile = this._findBookmarksFile()
this._bookmarkTimeoutId = 0;
this._monitor = null;
if (this._bookmarksFile) {
this._monitor = this._bookmarksFile.monitor_file(Gio.FileMonitorFlags.NONE, null);
this._monitor.connect('changed', Lang.bind(this, function () {
if (this._bookmarkTimeoutId > 0)
return;
/* Defensive event compression */
this._bookmarkTimeoutId = Mainloop.timeout_add(100, Lang.bind(this, function () {
this._bookmarkTimeoutId = 0;
this._reloadBookmarks();
return false;
}));
}));
this._reloadBookmarks();
}
},
_connectVolumeMonitorSignals: function() {
const signals = ['volume-added', 'volume-removed', 'volume-changed',
'mount-added', 'mount-removed', 'mount-changed',
'drive-connected', 'drive-disconnected', 'drive-changed'];
this._volumeMonitorSignals = [];
let func = Lang.bind(this, this._updateMounts);
for (let i = 0; i < signals.length; i++) {
let id = this._volumeMonitor.connect(signals[i], func);
this._volumeMonitorSignals.push(id);
}
},
destroy: function() {
for (let i = 0; i < this._volumeMonitorSignals.length; i++)
this._volumeMonitor.disconnect(this._volumeMonitorSignals[i]);
if (this._monitor)
this._monitor.cancel();
if (this._bookmarkTimeoutId)
Mainloop.source_remove(this._bookmarkTimeoutId);
},
_updateMounts: function() {
let networkMounts = [];
let networkVolumes = [];
this._places.devices.forEach(function (p) { p.destroy(); });
this._places.devices = [];
this._places.network.forEach(function (p) { p.destroy(); });
this._places.network = [];
/* Add standard places */
this._places.devices.push(new RootInfo());
this._places.network.push(new PlaceInfo('network',
Gio.File.new_for_uri('network:///'),
_("Browse Network"),
'network-workgroup-symbolic'));
/* first go through all connected drives */
let drives = this._volumeMonitor.get_connected_drives();
for (let i = 0; i < drives.length; i++) {
let volumes = drives[i].get_volumes();
for(let j = 0; j < volumes.length; j++) {
if (volumes[j].get_identifier('class').indexOf('network') >= 0) {
networkVolumes.push(volumes[i]);
} else {
let mount = volumes[j].get_mount();
if(mount != null)
this._addMount('devices', mount);
}
}
}
/* add all volumes that is not associated with a drive */
let volumes = this._volumeMonitor.get_volumes();
for(let i = 0; i < volumes.length; i++) {
if(volumes[i].get_drive() != null)
continue;
if (volumes[i].get_identifier('class').indexOf('network') >= 0) {
networkVolumes.push(volumes[i]);
} else {
let mount = volumes[i].get_mount();
if(mount != null)
this._addMount('devices', mount);
}
}
/* add mounts that have no volume (/etc/mtab mounts, ftp, sftp,...) */
let mounts = this._volumeMonitor.get_mounts();
for(let i = 0; i < mounts.length; i++) {
if(mounts[i].is_shadowed())
continue;
if(mounts[i].get_volume())
continue;
let root = mounts[i].get_default_location();
if (!root.is_native()) {
networkMounts.push(mounts[i]);
continue;
}
this._addMount('devices', mounts[i]);
}
for (let i = 0; i < networkVolumes.length; i++) {
let mount = networkVolumes[i].get_mount();
if (mount) {
networkMounts.push(mount);
continue;
}
this._addVolume('network', networkVolumes[i]);
}
for (let i = 0; i < networkMounts.length; i++) {
this._addMount('network', networkMounts[i]);
}
this.emit('devices-updated');
this.emit('network-updated');
},
_findBookmarksFile: function() {
let paths = [
GLib.build_filenamev([GLib.get_user_config_dir(), 'gtk-3.0', 'bookmarks']),
GLib.build_filenamev([GLib.get_home_dir(), '.gtk-bookmarks']),
];
for (let i = 0; i < paths.length; i++) {
if (GLib.file_test(paths[i], GLib.FileTest.EXISTS))
return Gio.File.new_for_path(paths[i]);
}
return null;
},
_reloadBookmarks: function() {
this._bookmarks = [];
let content = Shell.get_file_contents_utf8_sync(this._bookmarksFile.get_path());
let lines = content.split('\n');
let bookmarks = [];
for (let i = 0; i < lines.length; i++) {
let line = lines[i];
let components = line.split(' ');
let bookmark = components[0];
if (!bookmark)
continue;
let file = Gio.File.new_for_uri(bookmark);
if (file.is_native() && !file.query_exists(null))
continue;
let duplicate = false;
for (let i = 0; i < this._places.special.length; i++) {
if (file.equal(this._places.special[i].file)) {
duplicate = true;
break;
}
}
if (duplicate)
continue;
for (let i = 0; i < bookmarks.length; i++) {
if (file.equal(bookmarks[i].file)) {
duplicate = true;
break;
}
}
if (duplicate)
continue;
let label = null;
if (components.length > 1)
label = components.slice(1).join(' ');
bookmarks.push(new PlaceInfo('bookmarks', file, label));
}
this._places.bookmarks = bookmarks;
this.emit('bookmarks-updated');
},
_addMount: function(kind, mount) {
let devItem;
try {
devItem = new PlaceDeviceInfo(kind, mount);
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) {
return;
}
this._places[kind].push(devItem);
},
_addVolume: function(kind, volume) {
let volItem;
try {
volItem = new PlaceVolumeInfo(kind, volume);
} catch(e if e.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.NOT_FOUND)) {
return;
}
this._places[kind].push(volItem);
},
get: function (kind) {
return this._places[kind];
}
});
Signals.addSignalMethods(PlacesManager.prototype);

View File

@@ -1,3 +0,0 @@
EXTENSION_ID = static-workspaces
include ../../extension.mk

View File

@@ -1,18 +0,0 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
const Meta = imports.gi.Meta;
function init(metadata) {
}
function enable() {
// Override gnome-shell's overrides
Meta.prefs_override_preference_schema('dynamic-workspaces',
'org.gnome.mutter');
}
function disable() {
// Restore gnome-shell's overrides
Meta.prefs_override_preference_schema('dynamic-workspaces',
'org.gnome.shell.overrides');
}

View File

@@ -1,11 +0,0 @@
{
"extension-id": "@extension_id@",
"uuid": "@uuid@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"name": "Static workspaces",
"description": "Disable dynamic workspace management",
"original-authors": [ "fmuellner@gnome.org" ],
"shell-version": [ "@shell_current@" ],
"url": "@url@"
}

View File

@@ -1 +0,0 @@
/* This extensions requires no special styling */

View File

@@ -8,28 +8,23 @@ const St = imports.gi.St;
const Shell = imports.gi.Shell;
const Main = imports.ui.main;
const Tweener = imports.ui.tweener;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
const INDICATOR_UPDATE_INTERVAL = 500;
const INDICATOR_NUM_GRID_LINES = 3;
const ITEM_LABEL_SHOW_TIME = 0.15;
const ITEM_LABEL_HIDE_TIME = 0.1;
const ITEM_HOVER_TIMEOUT = 300;
let _cpuIndicator;
let _memIndicator;
let _box;
const Indicator = new Lang.Class({
Name: 'SystemMonitor.Indicator',
function Indicator() {
this._init();
}
Indicator.prototype = {
_init: function() {
this._initValues();
this.drawing_area = new St.DrawingArea({ reactive: true });
this.drawing_area.width = 100; this.drawing_area.height = 100;
this.drawing_area.connect('repaint', Lang.bind(this, this._draw));
this.drawing_area.connect('button-press-event', function() {
let app = Shell.AppSystem.get_default().lookup_app('gnome-system-monitor.desktop');
@@ -37,8 +32,7 @@ const Indicator = new Lang.Class({
});
this.actor = new St.Bin({ style_class: "extension-systemMonitor-indicator-area",
reactive: true, track_hover: true,
x_fill: true, y_fill: true });
reactive: true});
this.actor.add_actor(this.drawing_area);
this._timeout = Mainloop.timeout_add(INDICATOR_UPDATE_INTERVAL, Lang.bind(this, function () {
@@ -48,63 +42,9 @@ const Indicator = new Lang.Class({
}));
},
showLabel: function() {
if (this.label == null)
return;
this.label.opacity = 0;
this.label.show();
let [stageX, stageY] = this.actor.get_transformed_position();
let itemWidth = this.actor.allocation.x2 - this.actor.allocation.x1;
let itemHeight = this.actor.allocation.y2 - this.actor.allocation.y1;
let labelWidth = this.label.width;
let labelHeight = this.label.height;
let xOffset = Math.floor((itemWidth - labelWidth) / 2)
let x = stageX + xOffset;
let node = this.label.get_theme_node();
let yOffset = node.get_length('-y-offset');
let y = stageY - this.label.get_height() - yOffset;
this.label.set_position(x, y);
Tweener.addTween(this.label,
{ opacity: 255,
time: ITEM_LABEL_SHOW_TIME,
transition: 'easeOutQuad',
});
},
setLabelText: function(text) {
if (this.label == null)
this.label = new St.Label({ style_class: 'extension-systemMonitor-indicator-label'});
this.label.set_text(text);
Main.layoutManager.addChrome(this.label);
this.label.hide();
},
hideLabel: function () {
Tweener.addTween(this.label,
{ opacity: 0,
time: ITEM_LABEL_HIDE_TIME,
transition: 'easeOutQuad',
onComplete: Lang.bind(this, function() {
this.label.hide();
})
});
},
destroy: function() {
Mainloop.source_remove(this._timeout);
this.actor.destroy();
if (this.label)
this.label.destroy();
},
_initValues: function() {
@@ -191,16 +131,20 @@ const Indicator = new Lang.Class({
cr.setDash([], 0);
cr.stroke();
}
}
});
const CpuIndicator = new Lang.Class({
Name: 'SystemMonitor.CpuIndicator',
Extends: Indicator,
}
};
function CpuIndicator() {
this._init();
}
CpuIndicator.prototype = {
__proto__: Indicator.prototype,
_init: function() {
this.parent();
Indicator.prototype._init.call(this);
this.gridColor = '-grid-color';
this.renderStats = [ 'cpu-user', 'cpu-sys', 'cpu-iowait' ];
@@ -209,8 +153,6 @@ const CpuIndicator = new Lang.Class({
this.renderStats = this.renderStats.sort(function(a,b) {
return renderStatOrder[a] - renderStatOrder[b];
});
this.setLabelText(_("CPU"));
},
_initValues: function() {
@@ -245,15 +187,17 @@ const CpuIndicator = new Lang.Class({
this._prev = cpu;
}
});
};
const MemoryIndicator = new Lang.Class({
Name: 'SystemMonitor.MemoryIndicator',
Extends: Indicator,
function MemoryIndicator() {
this._init();
}
MemoryIndicator.prototype = {
__proto__: Indicator.prototype,
_init: function() {
this.parent();
Indicator.prototype._init.call(this);
this.gridColor = '-grid-color';
this.renderStats = [ 'mem-user', 'mem-other', 'mem-cached' ];
@@ -262,8 +206,6 @@ const MemoryIndicator = new Lang.Class({
this.renderStats = this.renderStats.sort(function(a,b) {
return renderStatOrder[a] - renderStatOrder[b];
});
this.setLabelText(_("Memory"));
},
_initValues: function() {
@@ -285,76 +227,25 @@ const MemoryIndicator = new Lang.Class({
t += this.mem.cached / this.mem.total;
this.stats['mem-cached'].values.push(t);
}
});
const INDICATORS = [CpuIndicator, MemoryIndicator];
const Extension = new Lang.Class({
Name: 'SystemMonitor.Extension',
_init: function() {
Convenience.initTranslations();
this._showLabelTimeoutId = 0;
this._resetHoverTimeoutId = 0;
this._labelShowing = false;
},
enable: function() {
this._box = new St.BoxLayout({ style_class: 'extension-systemMonitor-container',
x_align: Clutter.ActorAlign.START,
x_expand: true });
this._indicators = [ ];
for (let i = 0; i < INDICATORS.length; i++) {
let indicator = new (INDICATORS[i])();
indicator.actor.connect('notify::hover', Lang.bind(this, function() {
this._onHover(indicator);
}));
this._box.add_actor(indicator.actor);
this._indicators.push(indicator);
}
Main.messageTray.actor.add_actor(this._box);
},
disable: function() {
this._indicators.forEach(function(i) { i.destroy(); });
this._box.destroy();
},
_onHover: function (item) {
if (item.actor.get_hover()) {
if (this._showLabelTimeoutId == 0) {
let timeout = this._labelShowing ? 0 : ITEM_HOVER_TIMEOUT;
this._showLabelTimeoutId = Mainloop.timeout_add(timeout,
Lang.bind(this, function() {
this._labelShowing = true;
item.showLabel();
return false;
}));
if (this._resetHoverTimeoutId > 0) {
Mainloop.source_remove(this._resetHoverTimeoutId);
this._resetHoverTimeoutId = 0;
}
}
} else {
if (this._showLabelTimeoutId > 0)
Mainloop.source_remove(this._showLabelTimeoutId);
this._showLabelTimeoutId = 0;
item.hideLabel();
if (this._labelShowing) {
this._resetHoverTimeoutId = Mainloop.timeout_add(ITEM_HOVER_TIMEOUT,
Lang.bind(this, function() {
this._labelShowing = false;
return false;
}));
}
}
},
});
};
function init() {
return new Extension();
// nothing to do here
}
function enable() {
_cpuIndicator = new CpuIndicator();
_memIndicator = new MemoryIndicator();
_box = new St.BoxLayout({ style_class: 'extension-systemMonitor-container' });
_box.add(_cpuIndicator.actor);
_box.add(_memIndicator.actor);
Main.messageTray.actor.add_actor(_box);
}
function disable() {
_cpuIndicator.destroy();
_cpuIndicator = null;
_memIndicator.destroy();
_memIndicator = null;
_box.destroy();
}

View File

@@ -1,9 +1,6 @@
{
"shell-version": ["@shell_current@" ],
"shell-version": ["@shell_current@", "3.2" ],
"uuid": "@uuid@",
"extension-id": "@extension_id@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"original-author": "zaspire@rambler.ru",
"name": "SystemMonitor",
"description": "System Monitor",

View File

@@ -2,17 +2,15 @@
spacing: 5px;
padding-left: 5px;
padding-right: 5px;
padding-bottom: 10px;
padding-top: 10px;
padding-bottom: 1px;
padding-top: 0px;
}
.extension-systemMonitor-indicator-area {
border: 1px solid #8d8d8d;
border-radius: 3px;
width: 100px;
/* message tray is 72px, so 20px padding of the container,
2px of border, makes it 50px */
height: 50px;
height: 30px;
-grid-color: #575757;
-cpu-total-color: rgb(0,154,62);
-cpu-user-color: rgb(69,154,0);
@@ -23,13 +21,3 @@
-mem-other-color: rgb(205,203,41);
background-color: #1e1e1e;
}
.extension-systemMonitor-indicator-label {
border-radius: 7px;
padding: 4px 12px;
background-color: rgba(0,0,0,0.9);
text-align: center;
-y-offset: 8px;
font-size: 9pt;
font-weight: bold;
}

View File

@@ -1,5 +1,14 @@
EXTENSION_ID = user-theme
include ../../extension.mk
include ../../settings.mk
gschemas_in = $(gschemabase).user-theme.gschema.xml.in
@INTLTOOL_XML_NOMERGE_RULE@
gsettings_SCHEMAS = $(gschemas_in:.xml.in=.xml)
@GSETTINGS_RULES@
CLEANFILES += $(gschemas_in:.xml.in=.valid) $(gsettings_SCHEMAS)
EXTRA_DIST += $(gschemas_in)

View File

@@ -6,20 +6,19 @@ const Gio = imports.gi.Gio;
const Lang = imports.lang;
const Main = imports.ui.main;
const SETTINGS_SCHEMA = 'org.gnome.shell.extensions.user-theme';
const SETTINGS_KEY = 'name';
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
const ThemeManager = new Lang.Class({
Name: 'UserTheme.ThemeManager',
function ThemeManager() {
this._init();
}
ThemeManager.prototype = {
_init: function() {
this._settings = Convenience.getSettings();
},
enable: function() {
this._settings = new Gio.Settings({ schema: SETTINGS_SCHEMA });
this._changedId = this._settings.connect('changed::'+SETTINGS_KEY, Lang.bind(this, this._changeTheme));
this._changeTheme();
},
@@ -30,6 +29,8 @@ const ThemeManager = new Lang.Class({
this._changedId = 0;
}
this._settings = null;
Main.setThemeStylesheet(null);
Main.loadTheme();
},
@@ -63,8 +64,9 @@ const ThemeManager = new Lang.Class({
Main.setThemeStylesheet(_stylesheet);
Main.loadTheme();
}
});
}
function init() {
function init(metadata) {
return new ThemeManager();
}

View File

@@ -1,11 +1,9 @@
{
"uuid": "@uuid@",
"extension-id": "@extension_id@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"name": "User Themes",
"description": "Load shell themes from user directory",
"shell-version": [ "@shell_current@" ],
"shell-version": [ "@shell_current@", "3.2" ],
"localedir": "@LOCALEDIR@",
"original-authors": [ "john.stowers@gmail.com" ],
"url": "@url@"
}

View File

@@ -1,10 +0,0 @@
EXTENSION_ID = window-list
EXTRA_MODULES = prefs.js
if CLASSIC_MODE
EXTRA_MODULES += classic.css
endif
include ../../extension.mk
include ../../settings.mk

View File

@@ -1,42 +0,0 @@
@import url("stylesheet.css");
#panel.bottom-panel {
border-top-width: 1px;
border-bottom-width: 0px;
}
.bottom-panel .window-button > StWidget {
background-color: #e9e9e9 !important;
background-gradient-direction: vertical;
background-gradient-end: #d0d0d0;
color: #555 !important;
border-radius: 2px !important;
text-shadow: 0 0 transparent;
box-shadow: inset -1px -1px 1px rgba(0,0,0,0.5) !important;
}
.bottom-panel .window-button:hover > StWidget {
background-color: #f9f9f9 !important;
background-gradient-end: #e0e0e0;
}
.bottom-panel .window-button:active > StWidget {
box-shadow: inset 1px 1px 2px rgba(0,0,0,0.5) !important;
}
.bottom-panel .window-button.focused > StWidget {
background-color: #a9a9a9 !important;
background-gradient-end: #b0b0b0;
box-shadow: inset 1px 1px 2px rgba(0,0,0,0.5) !important;
}
.bottom-panel .window-button.focused:hover > StWidget {
background-color: #b9b9b9 !important;
background-gradient-end: #c0c0c0;
}
.bottom-panel .window-button.minimized > StWidget {
color: #888 !important;
box-shadow: inset -1px -1px 1px rgba(0,0,0,0.4) !important;
}

View File

@@ -1,638 +0,0 @@
const Clutter = imports.gi.Clutter;
const Gtk = imports.gi.Gtk;
const Meta = imports.gi.Meta;
const Shell = imports.gi.Shell;
const St = imports.gi.St;
const Hash = imports.misc.hash;
const Lang = imports.lang;
const Main = imports.ui.main;
const MessageTray = imports.ui.messageTray;
const PopupMenu = imports.ui.popupMenu;
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
const ICON_TEXTURE_SIZE = 24;
const GroupingMode = {
NEVER: 0,
ALWAYS: 1
};
function _minimizeOrActivateWindow(window) {
let focusWindow = global.display.focus_window;
if (focusWindow == window ||
focusWindow && focusWindow.get_transient_for() == window)
window.minimize();
else
window.activate(global.get_current_time());
}
const WindowTitle = new Lang.Class({
Name: 'WindowTitle',
_init: function(metaWindow) {
this._metaWindow = metaWindow;
this.actor = new St.BoxLayout();
let app = Shell.WindowTracker.get_default().get_window_app(metaWindow);
this._icon = new St.Bin({ style_class: 'window-button-icon',
child: app.create_icon_texture(ICON_TEXTURE_SIZE) });
this.actor.add(this._icon);
this._label = new St.Label();
this.actor.add(this._label);
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._notifyTitleId =
this._metaWindow.connect('notify::title',
Lang.bind(this, this._updateTitle));
this._notifyMinimizedId =
this._metaWindow.connect('notify::minimized',
Lang.bind(this, this._minimizedChanged));
this._minimizedChanged();
},
_minimizedChanged: function() {
this._icon.opacity = this._metaWindow.minimized ? 128 : 255;
this._updateTitle();
},
_updateTitle: function() {
if (this._metaWindow.minimized)
this._label.text = '[%s]'.format(this._metaWindow.title);
else
this._label.text = this._metaWindow.title;
},
_onDestroy: function() {
this._metaWindow.disconnect(this._notifyTitleId);
this._metaWindow.disconnect(this._notifyMinimizedId);
}
});
const WindowButton = new Lang.Class({
Name: 'WindowButton',
_init: function(metaWindow) {
this.metaWindow = metaWindow;
this._windowTitle = new WindowTitle(this.metaWindow);
this.actor = new St.Button({ style_class: 'window-button',
x_fill: true,
can_focus: true,
child: this._windowTitle.actor });
this.actor._delegate = this;
this.actor.connect('allocation-changed',
Lang.bind(this, this._updateIconGeometry));
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._switchWorkspaceId =
global.window_manager.connect('switch-workspace',
Lang.bind(this, this._updateVisibility));
this._updateVisibility();
this._notifyFocusId =
global.display.connect('notify::focus-window',
Lang.bind(this, this._updateStyle));
this._updateStyle();
},
_onClicked: function() {
_minimizeOrActivateWindow(this.metaWindow);
},
_updateStyle: function() {
if (this.metaWindow.minimized)
this.actor.add_style_class_name('minimized');
else
this.actor.remove_style_class_name('minimized');
if (global.display.focus_window == this.metaWindow)
this.actor.add_style_class_name('focused');
else
this.actor.remove_style_class_name('focused');
},
_updateVisibility: function() {
let workspace = global.screen.get_active_workspace();
this.actor.visible = this.metaWindow.located_on_workspace(workspace);
},
_updateIconGeometry: function() {
let rect = new Meta.Rectangle();
[rect.x, rect.y] = this.actor.get_transformed_position();
[rect.width, rect.height] = this.actor.get_transformed_size();
this.metaWindow.set_icon_geometry(rect);
},
_onDestroy: function() {
global.window_manager.disconnect(this._switchWorkspaceId);
global.display.disconnect(this._notifyFocusId);
}
});
const AppButton = new Lang.Class({
Name: 'AppButton',
_init: function(app) {
this.app = app;
let stack = new St.Widget({ layout_manager: new Clutter.BinLayout() });
this.actor = new St.Button({ style_class: 'window-button',
x_fill: true,
can_focus: true,
child: stack });
this.actor._delegate = this;
this.actor.connect('allocation-changed',
Lang.bind(this, this._updateIconGeometry));
this._singleWindowTitle = new St.Bin({ x_expand: true,
x_align: St.Align.START });
stack.add_actor(this._singleWindowTitle);
this._multiWindowTitle = new St.BoxLayout({ x_expand: true });
stack.add_actor(this._multiWindowTitle);
let icon = new St.Bin({ style_class: 'window-button-icon',
child: app.create_icon_texture(ICON_TEXTURE_SIZE) });
this._multiWindowTitle.add(icon);
this._multiWindowTitle.add(new St.Label({ text: app.get_name() }));
this._menuManager = new PopupMenu.PopupMenuManager(this);
this._menu = new PopupMenu.PopupMenu(this.actor, 0.5, St.Side.BOTTOM);
this._menu.actor.hide();
this._menu.connect('activate', Lang.bind(this, this._onMenuActivate));
this._menuManager.addMenu(this._menu);
Main.uiGroup.add_actor(this._menu.actor);
this.actor.connect('clicked', Lang.bind(this, this._onClicked));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._switchWorkspaceId =
global.window_manager.connect('switch-workspace',
Lang.bind(this, this._updateVisibility));
this._updateVisibility();
this._windowsChangedId =
this.app.connect('windows-changed',
Lang.bind(this, this._windowsChanged));
this._windowsChanged();
this._windowTracker = Shell.WindowTracker.get_default();
this._notifyFocusId =
this._windowTracker.connect('notify::focus-app',
Lang.bind(this, this._updateStyle));
this._updateStyle();
},
_updateVisibility: function() {
let workspace = global.screen.get_active_workspace();
this.actor.visible = this.app.is_on_workspace(workspace);
},
_updateStyle: function() {
if (this._windowTracker.focus_app == this.app)
this.actor.add_style_class_name('focused');
else
this.actor.remove_style_class_name('focused');
},
_updateIconGeometry: function() {
let rect = new Meta.Rectangle();
[rect.x, rect.y] = this.actor.get_transformed_position();
[rect.width, rect.height] = this.actor.get_transformed_size();
let windows = this.app.get_windows();
windows.forEach(function(w) {
w.set_icon_geometry(rect);
});
},
_getWindowList: function() {
let workspace = global.screen.get_active_workspace();
return this.app.get_windows().filter(function(win) {
return win.located_on_workspace(workspace);
});
},
_windowsChanged: function() {
let windows = this._getWindowList();
this._singleWindowTitle.visible = windows.length == 1;
this._multiWindowTitle.visible = !this._singleWindowTitle.visible;
if (this._singleWindowTitle.visible) {
if (!this._windowTitle) {
this._windowTitle = new WindowTitle(windows[0]);
this._singleWindowTitle.child = this._windowTitle.actor;
}
} else {
if (this._windowTitle) {
this._singleWindowTitle.child = null;
this._windowTitle = null;
}
}
},
_onClicked: function() {
if (this._menu.isOpen) {
this._menu.close();
return;
}
let windows = this._getWindowList();
if (windows.length == 1) {
_minimizeOrActivateWindow(windows[0]);
} else {
this._menu.removeAll();
for (let i = 0; i < windows.length; i++) {
let windowTitle = new WindowTitle(windows[i]);
let item = new PopupMenu.PopupBaseMenuItem();
item.addActor(windowTitle.actor);
item._window = windows[i];
this._menu.addMenuItem(item);
}
this._menu.open();
let event = Clutter.get_current_event();
if (event && event.type() == Clutter.EventType.KEY_RELEASE)
this._menu.actor.navigate_focus(null, Gtk.DirectionType.TAB_FORWARD, false);
}
},
_onMenuActivate: function(menu, child) {
child._window.activate(global.get_current_time());
},
_onDestroy: function() {
global.window_manager.disconnect(this._switchWorkspaceId);
this._windowTracker.disconnect(this._notifyFocusId);
this.app.disconnect(this._windowsChangedId);
this._menu.actor.destroy();
}
});
const TrayButton = new Lang.Class({
Name: 'TrayButton',
_init: function() {
this._counterLabel = new St.Label({ x_align: Clutter.ActorAlign.CENTER,
x_expand: true,
y_align: Clutter.ActorAlign.CENTER,
y_expand: true });
this.actor = new St.Button({ style_class: 'summary-source-counter',
child: this._counterLabel,
layoutManager: new Clutter.BinLayout() });
this.actor.set_x_align(Clutter.ActorAlign.END);
this.actor.set_x_expand(true);
this.actor.set_y_expand(true);
this.actor.connect('clicked', Lang.bind(this,
function() {
if (Main.messageTray._trayState == MessageTray.State.HIDDEN)
Main.messageTray.toggle();
}));
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
this._trayItemCount = 0;
Main.messageTray.getSources().forEach(Lang.bind(this,
function(source) {
this._sourceAdded(Main.messageTray, source);
}));
this._sourceAddedId =
Main.messageTray.connect('source-added',
Lang.bind(this, this._sourceAdded));
this._sourceRemovedId =
Main.messageTray.connect('source-removed',
Lang.bind(this, this._sourceRemoved));
this._updateVisibility();
},
_sourceAdded: function(tray, source) {
this._trayItemCount++;
this._updateVisibility();
},
_sourceRemoved: function(source) {
this._trayItemCount--;
this.actor.checked = false;
this._updateVisibility();
},
_updateVisibility: function() {
this._counterLabel.text = this._trayItemCount.toString();
this.actor.visible = this._trayItemCount > 0;
},
_onDestroy: function() {
Main.messageTray.getSources().forEach(Lang.bind(this,
function(source) {
if (!source._windowListDestroyId)
return;
source.disconnect(source._windowListDestroyId)
delete source._windowListDestroyId;
}));
Main.messageTray.disconnect(this._sourceAddedId);
Main.messageTray.disconnect(this._sourceRemovedId);
}
});
const WindowList = new Lang.Class({
Name: 'WindowList',
_init: function() {
this.actor = new St.Widget({ name: 'panel',
style_class: 'bottom-panel',
reactive: true,
track_hover: true,
layout_manager: new Clutter.BinLayout()});
this.actor.connect('destroy', Lang.bind(this, this._onDestroy));
let box = new St.BoxLayout({ x_expand: true, y_expand: true });
this.actor.add_actor(box);
let layout = new Clutter.BoxLayout({ homogeneous: true });
this._windowList = new St.Widget({ style_class: 'window-list',
layout_manager: layout,
x_align: Clutter.ActorAlign.START,
x_expand: true,
y_expand: true });
box.add(this._windowList, { expand: true });
this._windowList.connect('style-changed', Lang.bind(this,
function() {
let node = this._windowList.get_theme_node();
let spacing = node.get_length('spacing');
this._windowList.layout_manager.spacing = spacing;
}));
this._trayButton = new TrayButton();
box.add(this._trayButton.actor);
Main.layoutManager.addChrome(this.actor, { affectsStruts: true,
trackFullscreen: true });
Main.ctrlAltTabManager.addGroup(this.actor, _('Window List'), 'start-here-symbolic');
this._appSystem = Shell.AppSystem.get_default();
this._appStateChangedId =
this._appSystem.connect('app-state-changed',
Lang.bind(this, this._onAppStateChanged));
this._monitorsChangedId =
Main.layoutManager.connect('monitors-changed',
Lang.bind(this, this._updatePosition));
this._updatePosition();
this._keyboardVisiblechangedId =
Main.layoutManager.connect('keyboard-visible-changed',
Lang.bind(this, function(o, state) {
Main.layoutManager.keyboardBox.visible = state;
Main.uiGroup.set_child_above_sibling(windowList.actor,
Main.layoutManager.keyboardBox);
this._updateKeyboardAnchor();
}));
this._workspaceSignals = new Hash.Map();
this._nWorkspacesChangedId =
global.screen.connect('notify::n-workspaces',
Lang.bind(this, this._onWorkspacesChanged));
this._onWorkspacesChanged();
this._overviewShowingId =
Main.overview.connect('showing', Lang.bind(this, function() {
this.actor.hide();
this._updateKeyboardAnchor();
this._updateMessageTrayAnchor();
}));
this._overviewHidingId =
Main.overview.connect('hiding', Lang.bind(this, function() {
this.actor.show();
this._updateKeyboardAnchor();
this._updateMessageTrayAnchor();
}));
this._updateMessageTrayAnchor();
this._settings = Convenience.getSettings();
this._groupingModeChangedId =
this._settings.connect('changed::grouping-mode',
Lang.bind(this, this._groupingModeChanged));
this._groupingModeChanged();
},
_groupingModeChanged: function() {
this._groupingMode = this._settings.get_enum('grouping-mode');
this._populateWindowList();
},
_populateWindowList: function() {
this._windowList.destroy_all_children();
if (this._groupingMode == GroupingMode.NEVER) {
let windows = Meta.get_window_actors(global.screen);
for (let i = 0; i < windows.length; i++)
this._onWindowAdded(null, windows[i].metaWindow);
} else {
let apps = this._appSystem.get_running();
for (let i = 0; i < apps.length; i++)
this._addApp(apps[i]);
}
},
_updatePosition: function() {
let monitor = Main.layoutManager.primaryMonitor;
this.actor.width = monitor.width;
this.actor.set_position(monitor.x, monitor.y + monitor.height - this.actor.height);
},
_updateKeyboardAnchor: function() {
if (!Main.keyboard.actor)
return;
let anchorY = Main.overview.visible ? 0 : this.actor.height;
Main.keyboard.actor.anchor_y = anchorY;
},
_updateMessageTrayAnchor: function() {
let anchorY = this.actor.visible ? this.actor.height : 0;
Main.messageTray.actor.anchor_y = anchorY;
Main.messageTray._notificationWidget.anchor_y = -anchorY;
},
_onAppStateChanged: function(appSys, app) {
if (this._groupingMode != GroupingMode.ALWAYS)
return;
if (app.state == Shell.AppState.RUNNING)
this._addApp(app);
else if (app.state == Shell.AppState.STOPPED)
this._removeApp(app);
},
_addApp: function(app) {
let button = new AppButton(app);
this._windowList.layout_manager.pack(button.actor,
true, true, true,
Clutter.BoxAlignment.START,
Clutter.BoxAlignment.START);
},
_removeApp: function(app) {
let children = this._windowList.get_children();
for (let i = 0; i < children.length; i++) {
if (children[i]._delegate.app == app) {
children[i].destroy();
return;
}
}
},
_onWindowAdded: function(ws, win) {
if (!Shell.WindowTracker.get_default().is_window_interesting(win))
return;
if (this._groupingMode != GroupingMode.NEVER)
return;
let button = new WindowButton(win);
this._windowList.layout_manager.pack(button.actor,
true, true, true,
Clutter.BoxAlignment.START,
Clutter.BoxAlignment.START);
},
_onWindowRemoved: function(ws, win) {
if (this._groupingMode != GroupingMode.NEVER)
return;
let children = this._windowList.get_children();
for (let i = 0; i < children.length; i++) {
if (children[i]._delegate.metaWindow == win) {
children[i].destroy();
return;
}
}
},
_onWorkspacesChanged: function() {
let numWorkspaces = global.screen.n_workspaces;
for (let i = 0; i < numWorkspaces; i++) {
let workspace = global.screen.get_workspace_by_index(i);
if (this._workspaceSignals.has(workspace))
continue;
let signals = { windowAddedId: 0, windowRemovedId: 0 };
signals._windowAddedId =
workspace.connect_after('window-added',
Lang.bind(this, this._onWindowAdded));
signals._windowRemovedId =
workspace.connect('window-removed',
Lang.bind(this, this._onWindowRemoved));
this._workspaceSignals.set(workspace, signals);
}
},
_disconnectWorkspaceSignals: function() {
let numWorkspaces = global.screen.n_workspaces;
for (let i = 0; i < numWorkspaces; i++) {
let workspace = global.screen.get_workspace_by_index(i);
let signals = this._workspaceSignals.delete(workspace)[1];
workspace.disconnect(signals._windowAddedId);
workspace.disconnect(signals._windowRemovedId);
}
},
_onDestroy: function() {
Main.ctrlAltTabManager.removeGroup(this.actor);
this._appSystem.disconnect(this._appStateChangedId);
this._appStateChangedId = 0;
Main.layoutManager.disconnect(this._monitorsChangedId);
this._monitorsChangedId = 0;
Main.layoutManager.disconnect(this._keyboardVisiblechangedId);
this._keyboardVisiblechangedId = 0;
Main.layoutManager.hideKeyboard();
this._disconnectWorkspaceSignals();
global.screen.disconnect(this._nWorkspacesChangedId);
this._nWorkspacesChangedId = 0;
Main.messageTray.actor.anchor_y = 0;
Main.messageTray._notificationWidget.anchor_y = 0;
Main.overview.disconnect(this._overviewShowingId);
Main.overview.disconnect(this._overviewHidingId);
this._settings.disconnect(this._groupingModeChangedId);
let windows = Meta.get_window_actors(global.screen);
for (let i = 0; i < windows.length; i++)
windows[i].metaWindow.set_icon_geometry(null);
}
});
let windowList;
let injections = {};
let notificationParent;
function init() {
}
function enable() {
windowList = new WindowList();
windowList.actor.connect('notify::hover', Lang.bind(Main.messageTray,
function() {
this._pointerInTray = windowList.actor.hover;
this._updateState();
}));
injections['_trayDwellTimeout'] = MessageTray.MessageTray.prototype._trayDwellTimeout;
MessageTray.MessageTray.prototype._trayDwellTimeout = function() {
return false;
};
notificationParent = Main.messageTray._notificationWidget.get_parent();
Main.messageTray._notificationWidget.hide();
Main.messageTray._notificationWidget.reparent(windowList.actor);
Main.messageTray._notificationWidget.show();
}
function disable() {
if (!windowList)
return;
windowList.actor.hide();
if (notificationParent) {
Main.messageTray._notificationWidget.reparent(notificationParent);
notificationParent = null;
}
windowList.actor.destroy();
windowList = null;
for (prop in injections)
MessageTray.MessageTray.prototype[prop] = injections[prop];
}

View File

@@ -1,10 +0,0 @@
{
"extension-id": "@extension_id@",
"uuid": "@uuid@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"name": "Window List",
"description": "Display a window list at the bottom of the screen",
"shell-version": [ "@shell_current@" ],
"url": "@url@"
}

View File

@@ -1,18 +0,0 @@
<schemalist gettext-domain="gnome-shell-extensions">
<enum id="org.gnome.shell.extensions.window-list.GroupingMode">
<value value="0" nick="never"/>
<value value="1" nick="always"/>
</enum>
<schema id="org.gnome.shell.extensions.window-list"
path="/org/gnome/shell/extensions/window-list/">
<key name="grouping-mode"
enum="org.gnome.shell.extensions.window-list.GroupingMode">
<default>'never'</default>
<_summary>When to group windows</_summary>
<_description>
Decides when to group windows from the same application on the
window list. Possible values are "never" and "always".
</_description>
</key>
</schema>
</schemalist>

View File

@@ -1,80 +0,0 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
const GObject = imports.gi.GObject;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
function init() {
Convenience.initTranslations();
}
const WindowListPrefsWidget = new GObject.Class({
Name: 'WindowList.Prefs.Widget',
GTypeName: 'WindowListPrefsWidget',
Extends: Gtk.Frame,
_init: function(params) {
this.parent(params);
this.shadow_type = Gtk.ShadowType.NONE;
this.margin = 24;
let title = '<b>' + _("Window Grouping") + '</b>';
let titleLabel = new Gtk.Label({ use_markup: true, label: title });
this.set_label_widget(titleLabel);
let align = new Gtk.Alignment({ left_padding: 12 });
this.add(align);
let grid = new Gtk.Grid({ orientation: Gtk.Orientation.VERTICAL,
row_spacing: 6,
column_spacing: 6,
margin_top: 6 });
align.add(grid);
this._settings = Convenience.getSettings();
let currentMode = this._settings.get_string('grouping-mode');
let range = this._settings.get_range('grouping-mode');
let modes = range.deep_unpack()[1].deep_unpack();
let modeLabels = {
'never': _("Never group windows"),
'always': _("Always group windows")
};
let radio = null;
for (let i = 0; i < modes.length; i++) {
let mode = modes[i];
let label = modeLabels[mode];
if (!label) {
log('Unhandled option "%s" for grouping-mode'.format(mode));
continue;
}
radio = new Gtk.RadioButton({ group: radio,
label: label,
active: currentMode == mode });
grid.add(radio);
radio.connect('toggled', Lang.bind(this, function(button) {
if (button.active)
this._settings.set_string('grouping-mode', mode);
}));
}
}
});
function buildPrefsWidget() {
let widget = new WindowListPrefsWidget();
widget.show_all();
return widget;
}

View File

@@ -1,67 +0,0 @@
.bottom-panel {
/* .window-button-icon height +
.window-button vertical padding +
.window-button > StWidget vertical padding) */
height: 30px;
}
.window-list {
spacing: 2px;
font-size: 10pt;
}
.window-button {
padding: 1px;
}
.window-button:first-child:ltr {
padding-left: 2px;
}
.window-button:last-child:rtl {
padding-right: 2px;
}
.window-button > StWidget {
max-width: 250px;
color: #bbb;
background-color: black;
border-radius: 4px;
padding: 3px 6px 1px;
box-shadow: inset 1px 1px 4px rgba(255,255,255,0.5);
text-shadow: 1px 1px 4px rgba(0,0,0,0.8);
spacing: 4px;
}
.window-button:hover > StWidget {
color: white;
background-color: #1f1f1f;
}
.window-button:active > StWidget,
.window-button:focus > StWidget {
box-shadow: inset 2px 2px 4px rgba(255,255,255,0.5);
}
.window-button.focused > StWidget {
color: white;
box-shadow: inset 1px 1px 4px rgba(255,255,255,0.7);
}
.window-button.focused:active > StWidget {
box-shadow: inset 2px 2px 4px rgba(255,255,255,0.7);
}
.window-button.minimized > StWidget {
color: #666;
box-shadow: inset -1px -1px 4px rgba(255,255,255,0.5);
}
.window-button.minimized:active > StWidget {
box-shadow: inset -2px -2px 4px rgba(255,255,255,0.5);
}
.window-button-icon {
width: 24px;
height: 24px;
}

View File

@@ -33,15 +33,31 @@ function resetState() {
function enable() {
resetState();
Workspace.WindowOverlay.prototype.setId = function(id) {
if (this._text.visible && id == null)
this._text.hide();
this._id = id;
if (id != null)
this._text.text = this._id.toString();
}
winInjections['setId'] = undefined;
Workspace.WindowOverlay.prototype.getId = function() {
return this._id;
}
winInjections['getId'] = undefined;
Workspace.WindowOverlay.prototype.showTooltip = function() {
if (this._id === null)
return;
this._text.raise_top();
this._text.show();
this._text.text = (this._windowClone.slotId + 1).toString();
this._text.text = this._id.toString();
}
winInjections['showTooltip'] = undefined;
Workspace.WindowOverlay.prototype.hideTooltip = function() {
if (this._text && this._text.visible)
if (this._text.visible)
this._text.hide();
}
winInjections['hideTooltip'] = undefined;
@@ -67,9 +83,11 @@ function enable() {
workspaceInjections['hideTooltip'] = undefined;
Workspace.Workspace.prototype.getWindowWithTooltip = function(id) {
for (let i = 0; i < this._windows.length; i++) {
if ((this._windows[i].slotId + 1) == id)
return this._windows[i].metaWindow;
for (let i in this._windowOverlays) {
if (this._windowOverlays[i] == null)
continue;
if (this._windowOverlays[i].getId() === id)
return this._windowOverlays[i]._windowClone.metaWindow;
}
return null;
}
@@ -109,11 +127,11 @@ function enable() {
workViewInjections['_hideWorkspacesTooltips'] = undefined;
WorkspacesView.WorkspacesView.prototype._onKeyRelease = function(s, o) {
if (this._pickWindow &&
if (this._pickWindow &&
(o.get_key_symbol() == Clutter.KEY_Alt_L ||
o.get_key_symbol() == Clutter.KEY_Alt_R))
this._hideTooltips();
if (this._pickWorkspace &&
if (this._pickWorkspace &&
(o.get_key_symbol() == Clutter.KEY_Control_L ||
o.get_key_symbol() == Clutter.KEY_Control_R))
this._hideWorkspacesTooltips();
@@ -121,9 +139,6 @@ function enable() {
workViewInjections['_onKeyRelease'] = undefined;
WorkspacesView.WorkspacesView.prototype._onKeyPress = function(s, o) {
if(Main.overview._viewSelector._activePage != Main.overview._viewSelector._workspacesPage)
return false;
if ((o.get_key_symbol() == Clutter.KEY_Alt_L ||
o.get_key_symbol() == Clutter.KEY_Alt_R)
&& !this._pickWorkspace) {
@@ -160,14 +175,10 @@ function enable() {
return false;
}
let c = o.get_key_symbol() - Clutter.KEY_KP_0;
let c = o.get_key_symbol() - Clutter.KEY_0;
if (c > 9 || c <= 0) {
c = o.get_key_symbol() - Clutter.KEY_0;
if (c > 9 || c <= 0) {
this._hideTooltips();
global.log(c);
return false;
}
this._hideTooltips();
return false;
}
let win = this._workspaces[this._active].getWindowWithTooltip(c);
@@ -179,13 +190,10 @@ function enable() {
return true;
}
if (this._pickWorkspace) {
let c = o.get_key_symbol() - Clutter.KEY_KP_0;
let c = o.get_key_symbol() - Clutter.KEY_0;
if (c > 9 || c <= 0) {
c = o.get_key_symbol() - Clutter.KEY_0;
if (c > 9 || c <= 0) {
this._hideWorkspacesTooltips();
return false;
}
this._hideWorkspacesTooltips();
return false;
}
let workspace = this._workspaces[c - 1];
@@ -206,12 +214,10 @@ function enable() {
parentActor.add_actor(this._text);
});
winInjections['relayout'] = injectToFunction(Workspace.WindowOverlay.prototype, 'relayout', function(animate) {
let [cloneX, cloneY, cloneWidth, cloneHeight] = this._windowClone.slot;
winInjections['updatePositions'] = injectToFunction(Workspace.WindowOverlay.prototype, 'updatePositions', function(cloneX, cloneY, cloneWidth, cloneHeight) {
let textX = cloneX - 2;
let textY = cloneY - 2;
this._text.set_position(Math.floor(textX) + 5, Math.floor(textY) + 5);
this._text.set_position(Math.floor(textX), Math.floor(textY));
this._text.raise_top();
});
@@ -229,6 +235,23 @@ function enable() {
this._tip = null;
});
workspaceInjections['positionWindows'] = injectToFunction(Workspace.Workspace.prototype, 'positionWindows', function(flags) {
let visibleClones = this._windows.slice();
if (this._reservedSlot)
visibleClones.push(this._reservedSlot);
let slots = this._computeAllWindowSlots(visibleClones.length);
visibleClones = this._orderWindowsByMotionAndStartup(visibleClones, slots);
for (let i = 0; i < visibleClones.length; i++) {
let clone = visibleClones[i];
let metaWindow = clone.metaWindow;
let mainIndex = this._lookupIndex(metaWindow);
let overlay = this._windowOverlays[mainIndex];
if (overlay)
overlay.setId(i < 9 ? i + 1 : null);
}
});
workViewInjections['_init'] = injectToFunction(WorkspacesView.WorkspacesView.prototype, '_init', function(width, height, x, y, workspaces) {
this._pickWorkspace = false;
this._pickWindow = false;
@@ -253,8 +276,6 @@ function removeInjection(object, injection, name) {
}
function disable() {
let i;
for (i in workspaceInjections)
removeInjection(Workspace.Workspace.prototype, workspaceInjections, i);
for (i in winInjections)

View File

@@ -1,9 +1,6 @@
{
"shell-version": ["@shell_current@" ],
"extension-id": "@extension_id@",
"shell-version": ["@shell_current@", "3.2" ],
"uuid": "@uuid@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"original-author": "zaspire@rambler.ru",
"name": "windowNavigator",
"description": "Allow keyboard selection of windows and workspaces in overlay mode",

View File

@@ -1,5 +1,5 @@
.extension-windowsNavigator-window-tooltip {
color: #fefefe;
color: #ff0000;
background: rgba(0,0,0,0.8);
border: 1px solid rgba(128,128,128,0.40);
border-radius: 10px;

View File

@@ -1,5 +1,3 @@
EXTENSION_ID = workspace-indicator
EXTRA_MODULES = prefs.js
include ../../extension.mk

View File

@@ -1,6 +1,3 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
const Gio = imports.gi.Gio;
const Meta = imports.gi.Meta;
const Clutter = imports.gi.Clutter;
const St = imports.gi.St;
@@ -10,125 +7,103 @@ const PanelMenu = imports.ui.panelMenu;
const PopupMenu = imports.ui.popupMenu;
const Panel = imports.ui.panel;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const Main = imports.ui.main;
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
function WorkspaceIndicator() {
this._init.apply(this, arguments);
}
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
const WORKSPACE_KEY = 'workspace-names';
WorkspaceIndicator.prototype = {
__proto__: PanelMenu.SystemStatusButton.prototype,
const WorkspaceIndicator = new Lang.Class({
Name: 'WorkspaceIndicator.WorkspaceIndicator',
Extends: PanelMenu.Button,
_init: function(){
PanelMenu.SystemStatusButton.prototype._init.call(this, 'folder');
_init: function(){
this.parent(0.0, _("Workspace Indicator"));
this._currentWorkspace = global.screen.get_active_workspace().index();
this.statusLabel = new St.Label({ text: this._labelText() });
this._currentWorkspace = global.screen.get_active_workspace().index();
this.statusLabel = new St.Label({ text: this._labelText() });
// destroy all previously created children, and add our statusLabel
this.actor.get_children().forEach(function(c) { c.destroy() });
this.actor.add_actor(this.statusLabel);
this.actor.add_actor(this.statusLabel);
this.workspacesItems = [];
this._workspaceSection = new PopupMenu.PopupMenuSection();
this.menu.addMenuItem(this._workspaceSection);
global.screen.connect_after('workspace-added', Lang.bind(this,this._createWorkspacesSection));
global.screen.connect_after('workspace-removed', Lang.bind(this,this._createWorkspacesSection));
global.screen.connect_after('workspace-switched', Lang.bind(this,this._updateIndicator));
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
this._createWorkspacesSection();
this.workspacesItems = [];
this._workspaceSection = new PopupMenu.PopupMenuSection();
this.menu.addMenuItem(this._workspaceSection);
//styling
this.menu.actor.add_style_class_name('workspace-indicator-shorter');
this.statusLabel.add_style_class_name('panel-workspace-indicator');
},
this._screenSignals = [];
this._screenSignals.push(global.screen.connect_after('workspace-added', Lang.bind(this,this._createWorkspacesSection)));
this._screenSignals.push(global.screen.connect_after('workspace-removed', Lang.bind(this,this._createWorkspacesSection)));
this._screenSignals.push(global.screen.connect_after('workspace-switched', Lang.bind(this,this._updateIndicator)));
_updateIndicator: function() {
this.workspacesItems[this._currentWorkspace].setShowDot(false);
this._currentWorkspace = global.screen.get_active_workspace().index();
this.workspacesItems[this._currentWorkspace].setShowDot(true);
this.actor.connect('scroll-event', Lang.bind(this, this._onScrollEvent));
this._createWorkspacesSection();
this.statusLabel.set_text(this._labelText());
},
//styling
this.statusLabel.add_style_class_name('panel-workspace-indicator');
_labelText : function(workspaceIndex) {
if(workspaceIndex == undefined) {
workspaceIndex = this._currentWorkspace;
return (workspaceIndex + 1).toString();
}
return Meta.prefs_get_workspace_name(workspaceIndex);
},
this._settings = new Gio.Settings({ schema: WORKSPACE_SCHEMA });
this._settingsChangedId = this._settings.connect('changed::' + WORKSPACE_KEY, Lang.bind(this, this._createWorkspacesSection));
},
_createWorkspacesSection : function() {
this._workspaceSection.removeAll();
this.workspacesItems = [];
this._currentWorkspace = global.screen.get_active_workspace().index();
destroy: function() {
for (let i = 0; i < this._screenSignals.length; i++)
global.screen.disconnect(this._screenSignals[i]);
let i = 0;
for(; i < global.screen.n_workspaces; i++) {
this.workspacesItems[i] = new PopupMenu.PopupMenuItem(this._labelText(i));
this._workspaceSection.addMenuItem(this.workspacesItems[i]);
this.workspacesItems[i].workspaceId = i;
this.workspacesItems[i].label_actor = this.statusLabel;
let self = this;
this.workspacesItems[i].connect('activate', Lang.bind(this, function(actor, event) {
this._activate(actor.workspaceId);
}));
if (this._settingsChangedId) {
this._settings.disconnect(this._settingsChangedId);
this._settingsChangedId = 0;
}
if (i == this._currentWorkspace)
this.workspacesItems[i].setShowDot(true);
}
this.parent();
},
this.statusLabel.set_text(this._labelText());
},
_updateIndicator: function() {
this.workspacesItems[this._currentWorkspace].setShowDot(false);
this._currentWorkspace = global.screen.get_active_workspace().index();
this.workspacesItems[this._currentWorkspace].setShowDot(true);
_activate : function (index) {
if(index >= 0 && index < global.screen.n_workspaces) {
let metaWorkspace = global.screen.get_workspace_by_index(index);
metaWorkspace.activate(true);
}
},
this.statusLabel.set_text(this._labelText());
},
_onScrollEvent : function(actor, event) {
let direction = event.get_scroll_direction();
let diff = 0;
if (direction == Clutter.ScrollDirection.DOWN) {
diff = 1;
} else if (direction == Clutter.ScrollDirection.UP) {
diff = -1;
} else {
return;
}
_labelText : function(workspaceIndex) {
if(workspaceIndex == undefined) {
workspaceIndex = this._currentWorkspace;
return (workspaceIndex + 1).toString();
}
return Meta.prefs_get_workspace_name(workspaceIndex);
},
_createWorkspacesSection : function() {
this._workspaceSection.removeAll();
this.workspacesItems = [];
this._currentWorkspace = global.screen.get_active_workspace().index();
let i = 0;
for(; i < global.screen.n_workspaces; i++) {
this.workspacesItems[i] = new PopupMenu.PopupMenuItem(this._labelText(i));
this._workspaceSection.addMenuItem(this.workspacesItems[i]);
this.workspacesItems[i].workspaceId = i;
this.workspacesItems[i].label_actor = this.statusLabel;
let self = this;
this.workspacesItems[i].connect('activate', Lang.bind(this, function(actor, event) {
this._activate(actor.workspaceId);
}));
if (i == this._currentWorkspace)
this.workspacesItems[i].setShowDot(true);
}
this.statusLabel.set_text(this._labelText());
},
_activate : function (index) {
if(index >= 0 && index < global.screen.n_workspaces) {
let metaWorkspace = global.screen.get_workspace_by_index(index);
metaWorkspace.activate(global.get_current_time());
}
},
_onScrollEvent : function(actor, event) {
let direction = event.get_scroll_direction();
let diff = 0;
if (direction == Clutter.ScrollDirection.DOWN) {
diff = 1;
} else if (direction == Clutter.ScrollDirection.UP) {
diff = -1;
} else {
return;
}
let newIndex = global.screen.get_active_workspace().index() + diff;
this._activate(newIndex);
},
});
let newIndex = global.screen.get_active_workspace().index() + diff;
this._activate(newIndex);
},
}
function init(meta) {
Convenience.initTranslations();
// empty
}
let _indicator;

View File

@@ -1,11 +1,8 @@
{
"extension-id": "@extension_id@",
"uuid": "@uuid@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"name": "Workspace Indicator",
"description": "Put an indicator on the panel signaling in which workspace you are, and give you the possibility of switching to another one",
"shell-version": [ "@shell_current@" ],
"shell-version": [ "@shell_current@", "3.2" ],
"original-authors": [ "erick.red@gmail.com" ],
"url": "@url@"
}

View File

@@ -1,207 +0,0 @@
// -*- mode: js2; indent-tabs-mode: nil; js2-basic-offset: 4 -*-
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const GObject = imports.gi.GObject;
const Gtk = imports.gi.Gtk;
const Lang = imports.lang;
const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const N_ = function(e) { return e };
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
const WORKSPACE_SCHEMA = 'org.gnome.desktop.wm.preferences';
const WORKSPACE_KEY = 'workspace-names';
const WorkspaceNameModel = new GObject.Class({
Name: 'WorkspaceIndicator.WorkspaceNameModel',
GTypeName: 'WorkspaceNameModel',
Extends: Gtk.ListStore,
Columns: {
LABEL: 0,
},
_init: function(params) {
this.parent(params);
this.set_column_types([GObject.TYPE_STRING]);
this._settings = new Gio.Settings({ schema: WORKSPACE_SCHEMA });
//this._settings.connect('changed::workspace-names', Lang.bind(this, this._reloadFromSettings));
this._reloadFromSettings();
// overriding class closure doesn't work, because GtkTreeModel
// plays tricks with marshallers and class closures
this.connect('row-changed', Lang.bind(this, this._onRowChanged));
this.connect('row-inserted', Lang.bind(this, this._onRowInserted));
this.connect('row-deleted', Lang.bind(this, this._onRowDeleted));
},
_reloadFromSettings: function() {
if (this._preventChanges)
return;
this._preventChanges = true;
let newNames = this._settings.get_strv(WORKSPACE_KEY);
let i = 0;
let [ok, iter] = this.get_iter_first();
while (ok && i < newNames.length) {
this.set(iter, [this.Columns.LABEL], [newNames[i]]);
ok = this.iter_next(iter);
i++;
}
while (ok)
ok = this.remove(iter);
for ( ; i < newNames.length; i++) {
iter = this.append();
this.set(iter, [this.Columns.LABEL], [newNames[i]]);
}
this._preventChanges = false;
},
_onRowChanged: function(self, path, iter) {
if (this._preventChanges)
return;
this._preventChanges = true;
let index = path.get_indices()[0];
let names = this._settings.get_strv(WORKSPACE_KEY);
if (index >= names.length) {
// fill with blanks
for (let i = names.length; i <= index; i++)
names[i] = '';
}
names[index] = this.get_value(iter, this.Columns.LABEL);
this._settings.set_strv(WORKSPACE_KEY, names);
this._preventChanges = false;
},
_onRowInserted: function(self, path, iter) {
if (this._preventChanges)
return;
this._preventChanges = true;
let index = path.get_indices()[0];
let names = this._settings.get_strv(WORKSPACE_KEY);
let label = this.get_value(iter, this.Columns.LABEL) || '';
names.splice(index, 0, label);
this._settings.set_strv(WORKSPACE_KEY, names);
this._preventChanges = false;
},
_onRowDeleted: function(self, path) {
if (this._preventChanges)
return;
this._preventChanges = true;
let index = path.get_indices()[0];
let names = this._settings.get_strv(WORKSPACE_KEY);
if (index >= names.length)
return;
names.splice(index, 1);
// compact the array
for (let i = names.length -1; i >= 0 && !names[i]; i++)
names.pop();
this._settings.set_strv(WORKSPACE_KEY, names);
this._preventChanges = false;
},
});
const WorkspaceSettingsWidget = new GObject.Class({
Name: 'WorkspaceIndicator.WorkspaceSettingsWidget',
GTypeName: 'WorkspaceSettingsWidget',
Extends: Gtk.Grid,
_init: function(params) {
this.parent(params);
this.margin = 10;
this.orientation = Gtk.Orientation.VERTICAL;
this.add(new Gtk.Label({ label: _("Workspace names:"),
margin_bottom: 5 }));
this._store = new WorkspaceNameModel();
this._treeView = new Gtk.TreeView({ model: this._store,
headers_visible: false,
reorderable: true,
hexpand: true,
vexpand: true
});
let column = new Gtk.TreeViewColumn({ title: _("Name") });
let renderer = new Gtk.CellRendererText({ editable: true });
renderer.connect('edited', Lang.bind(this, this._cellEdited));
column.pack_start(renderer, true);
column.add_attribute(renderer, 'text', this._store.Columns.LABEL);
this._treeView.append_column(column);
this.add(this._treeView);
let toolbar = new Gtk.Toolbar();
toolbar.get_style_context().add_class(Gtk.STYLE_CLASS_INLINE_TOOLBAR);
let newButton = new Gtk.ToolButton({ stock_id: Gtk.STOCK_NEW });
newButton.connect('clicked', Lang.bind(this, this._newClicked));
toolbar.add(newButton);
let delButton = new Gtk.ToolButton({ stock_id: Gtk.STOCK_DELETE });
delButton.connect('clicked', Lang.bind(this, this._delClicked));
toolbar.add(delButton);
this.add(toolbar);
},
_cellEdited: function(renderer, path, new_text) {
let [ok, iter] = this._store.get_iter_from_string(path);
if (ok)
this._store.set(iter, [this._store.Columns.LABEL], [new_text]);
},
_newClicked: function() {
let iter = this._store.append();
let index = this._store.get_path(iter).get_indices()[0];
let label = _("Workspace %d").format(index);
this._store.set(iter, [this._store.Columns.LABEL], [label]);
},
_delClicked: function() {
let [any, model, iter] = this._treeView.get_selection().get_selected();
if (any)
this._store.remove(iter);
}
});
function init() {
Convenience.initTranslations();
}
function buildPrefsWidget() {
let widget = new WorkspaceSettingsWidget();
widget.show_all();
return widget;
}

View File

@@ -1,3 +1,7 @@
.workspace-indicator-shorter {
min-width: 25px;
font-size: 10pt;
}
.panel-workspace-indicator {
padding: 0 8px;
background-color: rgba(200, 200, 200, .5);

View File

@@ -1,7 +1,7 @@
/* -*- mode: js2; js2-basic-offset: 4; indent-tabs-mode: nil -*- */
const DBus = imports.dbus;
const Gdk = imports.gi.Gdk;
const Gio = imports.gi.Gio;
const GLib = imports.gi.GLib;
const GnomeDesktop = imports.gi.GnomeDesktop;
const Lang = imports.lang;
@@ -17,10 +17,6 @@ const Gettext = imports.gettext.domain('gnome-shell-extensions');
const _ = Gettext.gettext;
const N_ = function(e) { return e };
const ExtensionUtils = imports.misc.extensionUtils;
const Me = ExtensionUtils.getCurrentExtension();
const Convenience = Me.imports.convenience;
const possibleRotations = [ GnomeDesktop.RRRotation.ROTATION_0,
GnomeDesktop.RRRotation.ROTATION_90,
GnomeDesktop.RRRotation.ROTATION_180,
@@ -33,23 +29,25 @@ let rotations = [ [ GnomeDesktop.RRRotation.ROTATION_0, N_("Normal") ],
[ GnomeDesktop.RRRotation.ROTATION_180, N_("Upside-down") ]
];
const XRandr2Iface = <interface name='org.gnome.SettingsDaemon.XRANDR_2'>
<method name='ApplyConfiguration'>
<arg type='x' direction='in'/>
<arg type='x' direction='in'/>
</method>
</interface>;
const XRandr2Iface = {
name: 'org.gnome.SettingsDaemon.XRANDR_2',
methods: [
{ name: 'ApplyConfiguration', inSignature: 'xx', outSignature: '' },
]
};
let XRandr2 = DBus.makeProxyClass(XRandr2Iface);
const XRandr2 = Gio.DBusProxy.makeProxyWrapper(XRandr2Iface);
function Indicator() {
this._init.apply(this, arguments);
}
const Indicator = new Lang.Class({
Name: 'XRandRIndicator',
Extends: PanelMenu.SystemStatusButton,
Indicator.prototype = {
__proto__: PanelMenu.SystemStatusButton.prototype,
_init: function() {
this.parent('preferences-desktop-display-symbolic', _("Display"));
PanelMenu.SystemStatusButton.prototype._init.call(this, 'preferences-desktop-display');
this._proxy = new XRandr2(Gio.DBus.session, 'org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon/XRANDR');
this._proxy = new XRandr2(DBus.session, 'org.gnome.SettingsDaemon', '/org/gnome/SettingsDaemon/XRANDR');
try {
this._screen = new GnomeDesktop.RRScreen({ gdk_screen: Gdk.Screen.get_default() });
@@ -77,7 +75,9 @@ const Indicator = new Lang.Class({
this._addOutputItem(config, outputs[i]);
}
this.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem());
this.menu.addSettingsAction(_("Display Settings"), 'gnome-display-panel.desktop');
this.menu.addAction(_("Configure display settings..."), function() {
GLib.spawn_command_line_async('gnome-control-center display');
});
},
_addOutputItem: function(config, output) {
@@ -133,10 +133,11 @@ const Indicator = new Lang.Class({
}
return retval;
}
});
}
function init(metadata) {
Convenience.initTranslations();
imports.gettext.bindtextdomain('gnome-shell-extensions', GLib.build_filenamev([metadata.path, 'locale']));
}
let _indicator;

View File

@@ -1,10 +1,7 @@
{
"extension-id": "@extension_id@",
"uuid": "@uuid@",
"settings-schema": "@gschemaname@",
"gettext-domain": "@gettext_domain@",
"name": "Monitor Status Indicator",
"description": "Add a systems status menu for rotating monitors (overrides what is currently provided by gnome-settings-daemon)",
"shell-version": [ "@shell_current@" ],
"shell-version": [ "@shell_current@", "3.2" ],
"url": "@url@"
}

View File

@@ -7,6 +7,5 @@ extensionbase = @gnome-shell-extensions.gcampax.github.com
gschemabase = org.gnome.shell.extensions
uuid = $(EXTENSION_ID)$(extensionbase)
gschemaname = $(gschemabase).$(EXTENSION_ID)
extensiondir = $(topextensiondir)/$(uuid)

View File

@@ -1,93 +0,0 @@
/* -*- mode: js; js-basic-offset: 4; indent-tabs-mode: nil -*- */
/*
Copyright (c) 2011-2012, Giovanni Campagna <scampa.giovanni@gmail.com>
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
* Neither the name of the GNOME nor the
names of its contributors may be used to endorse or promote products
derived from this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
const Gettext = imports.gettext;
const Gio = imports.gi.Gio;
const Config = imports.misc.config;
const ExtensionUtils = imports.misc.extensionUtils;
/**
* initTranslations:
* @domain: (optional): the gettext domain to use
*
* Initialize Gettext to load translations from extensionsdir/locale.
* If @domain is not provided, it will be taken from metadata['gettext-domain']
*/
function initTranslations(domain) {
let extension = ExtensionUtils.getCurrentExtension();
domain = domain || extension.metadata['gettext-domain'];
// check if this extension was built with "make zip-file", and thus
// has the locale files in a subfolder
// otherwise assume that extension has been installed in the
// same prefix as gnome-shell
let localeDir = extension.dir.get_child('locale');
if (localeDir.query_exists(null))
Gettext.bindtextdomain(domain, localeDir.get_path());
else
Gettext.bindtextdomain(domain, Config.LOCALEDIR);
}
/**
* getSettings:
* @schema: (optional): the GSettings schema id
*
* Builds and return a GSettings schema for @schema, using schema files
* in extensionsdir/schemas. If @schema is not provided, it is taken from
* metadata['settings-schema'].
*/
function getSettings(schema) {
let extension = ExtensionUtils.getCurrentExtension();
schema = schema || extension.metadata['settings-schema'];
const GioSSS = Gio.SettingsSchemaSource;
// check if this extension was built with "make zip-file", and thus
// has the schema files in a subfolder
// otherwise assume that extension has been installed in the
// same prefix as gnome-shell (and therefore schemas are available
// in the standard folders)
let schemaDir = extension.dir.get_child('schemas');
let schemaSource;
if (schemaDir.query_exists(null))
schemaSource = GioSSS.new_from_directory(schemaDir.get_path(),
GioSSS.get_default(),
false);
else
schemaSource = GioSSS.get_default();
let schemaObj = schemaSource.lookup(schema, true);
if (!schemaObj)
throw new Error('Schema ' + schema + ' could not be found for extension '
+ extension.metadata.uuid + '. Please check your installation.');
return new Gio.Settings({ settings_schema: schemaObj });
}

15
local-install.sh Executable file
View File

@@ -0,0 +1,15 @@
#!/bin/bash
extensionbase=~/.local/share/gnome-shell/extensions
for i in zip-files/*; do
zip_file=`pwd`/$i;
uuid=`basename $i | sed -e "s/.shell-extension.zip//"`;
if [ -d $extensionbase/$uuid ]; then
rm -fR $extensionbase/$uuid;
fi
mkdir $extensionbase/$uuid;
(cd $extensionbase/$uuid;
unzip -q $zip_file;
);
done

View File

@@ -1,11 +1,9 @@
ar
ca
cs
da
de
el
en_GB
eo
es
eu
fa
@@ -14,10 +12,8 @@ fr
gl
he
hu
id
it
ja
ko
lv
lt
nb
@@ -26,14 +22,10 @@ pt
pt_BR
pl
ru
sk
sl
sr
sr@latin
sv
te
vi
uk
zh_CN
zh_HK
zh_TW

View File

@@ -1,27 +1,9 @@
data/gnome-classic.desktop.in
data/gnome-classic.session.desktop.in.in
data/gnome-shell-classic.desktop.in.in
extensions/alternate-tab/prefs.js
extensions/alternative-status-menu/extension.js
extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in
extensions/apps-menu/extension.js
extensions/alternate-tab/extension.js
extensions/auto-move-windows/extension.js
extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in
extensions/auto-move-windows/prefs.js
extensions/drive-menu/extension.js
extensions/dock/extension.js
extensions/example/extension.js
extensions/example/org.gnome.shell.extensions.example.gschema.xml.in
extensions/example/prefs.js
extensions/native-window-placement/extension.js
extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in
extensions/places-menu/extension.js
extensions/places-menu/placeDisplay.js
extensions/systemMonitor/extension.js
extensions/user-theme/extension.js
extensions/gajim/extension.js
extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in
extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml.in
extensions/window-list/prefs.js
extensions/windowsNavigator/extension.js
extensions/workspace-indicator/extension.js
extensions/workspace-indicator/prefs.js
extensions/xrandr-indicator/extension.js

338
po/ar.po
View File

@@ -1,338 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# Khaled Hosny <khaledhosny@eglug.org>, 2012.
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-12-24 12:44+0200\n"
"PO-Revision-Date: 2012-12-24 12:46+0200\n"
"Last-Translator: Khaled Hosny <khaledhosny@eglug.org>\n"
"Language-Team: Arabic <doc@arabeyes.org>\n"
"Language: ar\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 "
"&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n"
"X-Generator: Virtaal 0.7.0\n"
#: ../data/gnome-classic.desktop.in.h:1
#: ../data/gnome-classic.session.desktop.in.in.h:1
msgid "GNOME Classic"
msgstr "جنوم تقليدية"
#: ../data/gnome-classic.desktop.in.h:2
msgid "This session logs you into GNOME Classic"
msgstr "تولجك هذه الجلسة في جنوم التقليدية"
#: ../data/gnome-shell-classic.desktop.in.in.h:1
msgid "GNOME Shell Classic"
msgstr "صدفة جنوم تقليدية"
#: ../data/gnome-shell-classic.desktop.in.in.h:2
msgid "Window management and application launching"
msgstr "إدارة النوافذ وإطلاق التطبيقات"
#: ../extensions/alternate-tab/prefs.js:20
msgid "Thumbnail only"
msgstr "مصغّرة فقط"
#: ../extensions/alternate-tab/prefs.js:21
msgid "Application icon only"
msgstr "أيقونة التطبيق فقط"
#: ../extensions/alternate-tab/prefs.js:22
msgid "Thumbnail and application icon"
msgstr "مصغّرة وأيقونة التطبيق"
#: ../extensions/alternate-tab/prefs.js:37
msgid "Present windows as"
msgstr "كيفية عرض التطبيقات"
#: ../extensions/alternate-tab/prefs.js:62
msgid "Show only windows in the current workspace"
msgstr "أظهر نوافذ مساحات العمل الحالية فقط"
#. add the new entries
#: ../extensions/alternative-status-menu/extension.js:144
msgid "Suspend"
msgstr "علّق"
#: ../extensions/alternative-status-menu/extension.js:147
msgid "Hibernate"
msgstr "أسبِت"
#: ../extensions/alternative-status-menu/extension.js:150
msgid "Power Off"
msgstr "أطفئ"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:1
msgid "Enable suspending"
msgstr "فعّل التعليق"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:2
msgid "Control the visibility of the Suspend menu item"
msgstr "تحكم في ظهور ”علّق“ في القائمة"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:3
msgid "Enable hibernating"
msgstr "فعّل الإسبات"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:4
msgid "Control the visibility of the Hibernate menu item"
msgstr "تحكم في ظهور ”أسبِت“ في القائمة"
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:1
msgid "Application and workspace list"
msgstr "قائمة التطبيقات ومساحات العمل"
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
msgid ""
"A list of strings, each containing an application id (desktop file name), "
"followed by a colon and the workspace number"
msgstr ""
#: ../extensions/auto-move-windows/prefs.js:55
msgid "Application"
msgstr "التطبيق"
#: ../extensions/auto-move-windows/prefs.js:64
#: ../extensions/auto-move-windows/prefs.js:106
msgid "Workspace"
msgstr "مساحة العمل"
#: ../extensions/auto-move-windows/prefs.js:80
msgid "Add rule"
msgstr "أضِف قاعدة"
#: ../extensions/auto-move-windows/prefs.js:94
msgid "Create new matching rule"
msgstr "أنشئ قاعدة تطابق"
#: ../extensions/auto-move-windows/prefs.js:98
msgid "Add"
msgstr "أضِف"
#: ../extensions/drive-menu/extension.js:72
#, c-format
msgid "Ejecting drive '%s' failed:"
msgstr "فشل إخراج '%s':"
#: ../extensions/drive-menu/extension.js:89
msgid "Removable devices"
msgstr "الأجهزة المنفصلة"
#: ../extensions/drive-menu/extension.js:106
msgid "Open File"
msgstr "افتح الملف"
#: ../extensions/example/extension.js:17
msgid "Hello, world!"
msgstr "أهلا، يا عالم!"
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:1
msgid "Alternative greeting text."
msgstr ""
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:2
msgid ""
"If not empty, it contains the text that will be shown when clicking on the "
"panel."
msgstr ""
#. TRANSLATORS: Example is the name of the extension, should not be
#. translated
#: ../extensions/example/prefs.js:30
msgid ""
"Example aims to show how to build well behaved extensions for the Shell and "
"as such it has little functionality on its own.\n"
"Nevertheless it's possible to customize the greeting message."
msgstr ""
#: ../extensions/example/prefs.js:36
msgid "Message:"
msgstr "الرسالة:"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:1
msgid "Use more screen for windows"
msgstr ""
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:2
msgid ""
"Try to use more screen for placing window thumbnails by adapting to screen "
"aspect ratio, and consolidating them further to reduce the bounding box. "
"This setting applies only with the natural placement strategy."
msgstr ""
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
msgid "Place window captions on top"
msgstr ""
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
msgid ""
"If true, place window captions on top the respective thumbnail, overriding "
"shell default of placing it at the bottom. Changing this setting requires "
"restarting the shell to have any effect."
msgstr ""
#: ../extensions/places-menu/extension.js:46
msgid "Places"
msgstr "الأماكن"
#: ../extensions/places-menu/extension.js:47
msgid "Devices"
msgstr "الأجهزة"
#: ../extensions/places-menu/extension.js:48
msgid "Bookmarks"
msgstr "العلامات"
#: ../extensions/places-menu/extension.js:49
msgid "Network"
msgstr "الشبكة"
#: ../extensions/places-menu/placeDisplay.js:48
#, c-format
msgid "Failed to launch \"%s\""
msgstr "فشل تشغيل \"%s\""
#: ../extensions/places-menu/placeDisplay.js:121
msgid "Home"
msgstr "المنزل"
#: ../extensions/places-menu/placeDisplay.js:195
msgid "File System"
msgstr "نظام الملفات"
#: ../extensions/places-menu/placeDisplay.js:199
msgid "Browse network"
msgstr "تصفّح الشبكة"
#: ../extensions/systemMonitor/extension.js:213
msgid "CPU"
msgstr "المعالج"
#: ../extensions/systemMonitor/extension.js:266
msgid "Memory"
msgstr "الذاكرة"
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:1
msgid "Theme name"
msgstr "اسم السمة"
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr ""
#: ../extensions/workspace-indicator/extension.js:30
msgid "Workspace Indicator"
msgstr "مؤشر مساحات العمل"
#: ../extensions/workspace-indicator/prefs.js:141
msgid "Workspace names:"
msgstr "أسماء مساحات العمل"
#: ../extensions/workspace-indicator/prefs.js:152
msgid "Name"
msgstr "الاسم"
#: ../extensions/workspace-indicator/prefs.js:186
#, c-format
msgid "Workspace %d"
msgstr "مساحة العمل %Id"
#: ../extensions/xrandr-indicator/extension.js:30
msgid "Normal"
msgstr "عادي"
#: ../extensions/xrandr-indicator/extension.js:31
msgid "Left"
msgstr "يسار"
#: ../extensions/xrandr-indicator/extension.js:32
msgid "Right"
msgstr "يمين"
#: ../extensions/xrandr-indicator/extension.js:33
msgid "Upside-down"
msgstr "رأسا على عقب"
#: ../extensions/xrandr-indicator/extension.js:50
msgid "Display"
msgstr "العرض"
#: ../extensions/xrandr-indicator/extension.js:80
msgid "Display Settings"
msgstr "إعدادات العرض"
#~ msgid "Drag here to add favorites"
#~ msgstr "اسحب إلى هنا ليضاف إلى المفضّلة"
#~ msgid "New Window"
#~ msgstr "نافذة جديدة"
#~ msgid "Quit Application"
#~ msgstr "أغلق التطبيق"
#~ msgid "Remove from Favorites"
#~ msgstr "أزِل من المفضّلة"
#~ msgid "Add to Favorites"
#~ msgstr "أضِف إلى المفضّلة"
#~ msgid "Icon size"
#~ msgstr "حجم الأيقونة"
#~ msgid "Monitor"
#~ msgstr "الشاشة"
#~ msgid "%s is away."
#~ msgstr "%s غائب."
#~ msgid "%s is offline."
#~ msgstr "%s غير متّصل."
#~ msgid "%s is online."
#~ msgstr "%s متّصل."
#~ msgid "%s is busy."
#~ msgstr "%s مشغول."
#~ msgid ""
#~ "This mode presents all applications from all workspaces in one selection "
#~ "list. Instead of using the application icon of every window, it uses "
#~ "small thumbnails resembling the window itself."
#~ msgstr ""
#~ "يعرض هذا النمط كل التطبيقات من كل مساحات العمل في قائمة واحدة، وبدلا من "
#~ "استخدام أيقونة التطبيق لكل النوافذ يستخدم صورة مصغّرة للنافذة نفسها."
#~ msgid "Workspace & Icons"
#~ msgstr "مساحة العمل مع أيقونات"
#~ msgid ""
#~ "This mode let's you switch between the applications of your current "
#~ "workspace and gives you additionally the option to switch to the last "
#~ "used application of your previous workspace. This is always the last "
#~ "symbol in the list and is segregated by a separator/vertical line if "
#~ "available. \n"
#~ "Every window is represented by its application icon."
#~ msgstr ""
#~ "يتيح هذا النمط التنقل بين التطبيقات في مساحة العمل الحالية بالإضافة إلى "
#~ "إمكانية الانتقال إلى آخر تطبيق استُخدم في مساحة العمل السابقة، والذي سيكون "
#~ "دائما آخر عنصر في القائمة مفصولا بخط رأسي.\n"
#~ "تُمثل كل نافذة بأيقونة التطبيق الذي تنتمي إليه."
#~ msgid "Move current selection to front before closing the popup"
#~ msgstr "انقل الاختيار الحالي إلى المقدمة قبل غلق النافذة المنبثقة."
#~ msgid ""
#~ "The Alternate Tab can be used in different modes, that affect the way "
#~ "windows are chosen and presented."
#~ msgstr ""
#~ "يمكن استخدام هذا الامتداد في أنماط مختلفة تؤثر على كيفية اختيار وعرض "
#~ "النوافذ."
#~ msgid "Removable Devices"
#~ msgstr "الأجهزة المنفصلة"

605
po/ca.po
View File

@@ -2,93 +2,152 @@
# Copyright (C) 2011 gnome-shell-extensions's COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-shell-extensions package.
# Jordi Mas i Hernandez <jmas@softcatala.org>, 2011.
# Gil Forcada <gilforcada@guifi.net>, 2012.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell-extensions\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=extensions\n"
"POT-Creation-Date: 2012-09-06 17:51+0000\n"
"PO-Revision-Date: 2012-09-29 00:02+0200\n"
"Last-Translator: Gil Forcada <gilforcada@guifi.net>\n"
"Language-Team: Catalan <tradgnome@softcatala.org>\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-08-19 23:28+0200\n"
"PO-Revision-Date: 2011-08-02 07:30+0200\n"
"Last-Translator: jmas@softcatala.org\n"
"Language-Team: ca_ES <tradgnome@softcatala.net>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bits\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"Content-Transfer-Encoding: 8bit\n"
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
msgid "The application icon mode."
msgstr "El mode d'icona d'aplicació."
#: ../extensions/alternative-status-menu/extension.js:39
msgid "Available"
msgstr "Disponible"
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'."
msgstr ""
"Configura com es mostren les icones en l'intercanviador. Les possibilitats "
"vàlides són «thumbnail-only» (només miniatures, mostra les miniatures de les "
"finestres), «app-icon-only» (només icona de l'aplicació, mostra només la "
"icona de l'aplicació) o «both» (ambdós, mostra tan la icona de l'aplicació "
"com la miniatura). "
#: ../extensions/alternative-status-menu/extension.js:44
msgid "Busy"
msgstr "Ocupat"
#: ../extensions/alternate-tab/prefs.js:26
msgid "Thumbnail only"
msgstr "Només miniatures"
#: ../extensions/alternative-status-menu/extension.js:52
msgid "My Account"
msgstr "El meu compte"
#: ../extensions/alternate-tab/prefs.js:27
msgid "Application icon only"
msgstr "Només la icona de l'aplicació"
#: ../extensions/alternative-status-menu/extension.js:56
msgid "System Settings"
msgstr "Paràmetres de l'ordinador"
#: ../extensions/alternate-tab/prefs.js:28
msgid "Thumbnail and application icon"
msgstr "Miniatura i icona de l'aplicació"
#: ../extensions/alternative-status-menu/extension.js:63
msgid "Lock Screen"
msgstr "Bloca la pantalla"
#: ../extensions/alternate-tab/prefs.js:43
msgid "Present windows as"
msgstr "Mostra les finestres com a"
#: ../extensions/alternative-status-menu/extension.js:67
msgid "Switch User"
msgstr "Canvia d'usuari"
#: ../extensions/alternate-tab/prefs.js:68
msgid "Show only windows in the current workspace"
msgstr "Mostra només les icones de l'espai de treball actual"
#: ../extensions/alternative-status-menu/extension.js:72
msgid "Log Out..."
msgstr "Surt..."
#. add the new entries
#: ../extensions/alternative-status-menu/extension.js:68
#: ../extensions/alternative-status-menu/extension.js:79
msgid "Suspend"
msgstr "Atura temporalment"
#: ../extensions/alternative-status-menu/extension.js:73
#: ../extensions/alternative-status-menu/extension.js:85
msgid "Hibernate"
msgstr "Hiberna"
#: ../extensions/alternative-status-menu/extension.js:78
msgid "Power Off"
msgstr "Apaga"
#: ../extensions/alternative-status-menu/extension.js:91
msgid "Power Off..."
msgstr "Apaga..."
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:1
msgid "Enable suspending"
msgstr "Habilita l'aturada temporal"
#: ../extensions/alternate-tab/extension.js:44
msgid ""
"This is the first time you use the Alternate Tab extension. \n"
"Please choose your preferred behaviour:\n"
"\n"
"All & Thumbnails:\n"
" This mode presents all applications from all workspaces in one "
"selection \n"
" list. Instead of using the application icon of every window, it uses "
"small \n"
" thumbnails resembling the window itself. \n"
"\n"
"Workspace & Icons:\n"
" This mode let's you switch between the applications of your current \n"
" workspace and gives you additionally the option to switch to the last "
"used \n"
" application of your previous workspace. This is always the last symbol "
"in \n"
" the list and is segregated by a separator/vertical line if available. \n"
" Every window is represented by its application icon. \n"
"\n"
"Native:\n"
" This mode is the native GNOME 3 behaviour or in other words: Clicking \n"
" native switches the Alternate Tab extension off. \n"
msgstr ""
"Aquest és el primer cop que utilitzeu l'extensió «Alternate Tab». \n"
"Trieu el comportament que preferiu:\n"
"\n"
"Totes i miniatures:\n"
" Aquest mode presenta totes les aplicacions de tots els espais de treball "
"com a\n"
" una llista de selecció. En comptes de mostrar la icona d'aplicació de "
"cada finestra, mostra les \n"
" miniatures que representen el contingut de la finestra. \n"
"\n"
"Espai de treball i icones:\n"
" Aquest mode us permet canviar entre aplicacions de l'espai de treball "
"actual \n"
" i us dóna la possibilitat de canviar a l'última aplicació usada de "
"l'espai de \n"
" treball anterior. Aquest és sempre el darrer símbol a la llista i està "
"separat \n"
" per una línia vertical/separador quan està disponible. \n"
" Cada finestra es representa per la seva icona d'aplicació. \n"
"\n"
"Nadiu:\n"
" Aquest és el mode de comportament nadiu al GNOME 3 o amb altres "
"paraules: fent \n"
" clic inhabilita l'extensió «Alternate Tab». \n"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:2
msgid "Control the visibility of the Suspend menu item"
msgstr "Permet controlar si es mostra l'element de menú «Atura temporalment»"
#: ../extensions/alternate-tab/extension.js:269
msgid "Alt Tab Behaviour"
msgstr "Comportament de l'«Alternate Tab»"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:3
msgid "Enable hibernating"
msgstr "Habilita la hibernació"
#: ../extensions/alternate-tab/extension.js:285
msgid "All & Thumbnails"
msgstr "Totes i miniatures"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:4
msgid "Control the visibility of the Hibernate menu item"
msgstr "Permet controlar si es mostra l'element de menú «Hiberna»"
#: ../extensions/alternate-tab/extension.js:292
msgid "Workspace & Icons"
msgstr "Espai de treball i icones"
#: ../extensions/alternate-tab/extension.js:299
msgid "Native"
msgstr "Nadiu"
#: ../extensions/alternate-tab/extension.js:306
msgid "Cancel"
msgstr "Cancel·la"
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
msgid "Ask the user for a default behaviour if true."
msgstr "Si és «true» (cert) pregunta a l'usuari pel comportament per defecte."
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
msgid "Indicates if Alternate Tab is newly installed"
msgstr "Indica si s'acaba d'instal·lar l'«Alternate Tab»"
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:3
msgid ""
"Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails and "
"workspace_icons."
msgstr ""
"Defineix el comportament de l'«Alternate Tab». Els valors possibles són: "
"«native» (nadiu), «all_thumbnails» (totes i miniatures) i "
"«workspace_icons» (espai de treball i icones)."
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:4
msgid "The alt tab behaviour."
msgstr "Comportament de l'«Alternate Tab»"
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:1
msgid "Application and workspace list"
msgstr "Aplicació i llista d'espais de treball"
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
msgid ""
"A list of strings, each containing an application id (desktop file name), "
"followed by a colon and the workspace number"
@@ -97,52 +156,62 @@ msgstr ""
"d'aplicació (nom del fitxer de l'escriptori), seguit de dos punts i el "
"número de l'espai de treball"
#: ../extensions/auto-move-windows/prefs.js:55
msgid "Application"
msgstr "Aplicació"
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
msgid "Application and workspace list"
msgstr "Aplicació i llista d'espais de treball"
#: ../extensions/auto-move-windows/prefs.js:64
#: ../extensions/auto-move-windows/prefs.js:106
msgid "Workspace"
msgstr "Espai de treball"
#: ../extensions/auto-move-windows/prefs.js:80
msgid "Add rule"
msgstr "Afegeix una regla"
#: ../extensions/auto-move-windows/prefs.js:94
msgid "Create new matching rule"
msgstr "Crea una regla de coincidència nova"
#: ../extensions/auto-move-windows/prefs.js:98
msgid "Add"
msgstr "Afegeix"
#: ../extensions/dock/extension.js:600
#: ../extensions/dock/extension.js:437
msgid "Drag here to add favorites"
msgstr "Arrossegueu aquí per afegir als preferits"
#: ../extensions/dock/extension.js:926
#: ../extensions/dock/extension.js:771
msgid "New Window"
msgstr "Finestra nova"
#: ../extensions/dock/extension.js:928
#: ../extensions/dock/extension.js:773
msgid "Quit Application"
msgstr "Surt de l'aplicació"
#: ../extensions/dock/extension.js:933
#: ../extensions/dock/extension.js:778
msgid "Remove from Favorites"
msgstr "Suprimeix dels preferits"
#: ../extensions/dock/extension.js:934
#: ../extensions/dock/extension.js:779
msgid "Add to Favorites"
msgstr "Afegeix als preferits"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:1
msgid "Autohide duration"
msgstr "Duració de l'ocultació automàtica"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:2
msgid "Autohide effect"
msgstr "Efecte de l'ocultació automàtica"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:3
msgid "Enable/disable autohide"
msgstr "Habilita/Inhabilita l'ocultació automàtica"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:4
msgid "Icon size"
msgstr "Mida de la icona"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:5
msgid "Position of the dock"
msgstr "Posició de l'acoblador"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:2
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:6
msgid "Sets icon size of the dock."
msgstr "Defineix la mida de la icona per l'acoblador."
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:7
msgid ""
"Sets the effect of the hide dock. Allowed values are 'resize' or 'rescale'"
msgstr ""
"Defineix l'efecte de l'acoblador amagat. Els valors permesos són "
"«resize» (amplia) o «rescale» (escala)"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:8
msgid ""
"Sets the position of the dock in the screen. Allowed values are 'right' or "
"'left'"
@@ -150,115 +219,61 @@ msgstr ""
"Defineix la posició de l'acoblador a la pantalla. Els valors permesos són "
"«right» (dreta) o «left» (esquerra)"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:3
msgid "Icon size"
msgstr "Mida de la icona"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:4
msgid "Sets icon size of the dock."
msgstr "Defineix la mida de la icona per l'acoblador."
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:5
msgid "Enable/disable autohide"
msgstr "Habilita/inhabilita l'ocultació automàtica"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:6
msgid "Autohide effect"
msgstr "Efecte de l'ocultació automàtica"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:7
msgid ""
"Sets the effect of the hide dock. Allowed values are 'resize', 'rescale' and "
"'move'"
msgstr ""
"Defineix l'efecte de l'acoblador ocult. Els valors permesos són "
"«resize» (amplia), «rescale» (escala) i «move» (mou)"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:8
msgid "Autohide duration"
msgstr "Duració de l'ocultació automàtica"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:9
msgid "Sets the time duration of the autohide effect."
msgstr "Defineix la durada en temps de l'efecte d'ocultació automàtica."
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:10
msgid "Monitor"
msgstr "Pantalla"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:11
msgid ""
"Sets monitor to display dock in. The default value (-1) is the primary "
"monitor."
msgstr ""
"Estableix la pantalla a on es mostra l'acoblador. El valor per defecte és "
"«-1», la pantalla principal."
#: ../extensions/drive-menu/extension.js:56
msgid "Removable devices"
msgstr "Dispositius extraïbles"
#: ../extensions/drive-menu/extension.js:67
msgid "Open file manager"
msgstr "Obre del gestor de fitxers"
#: ../extensions/example/extension.js:17
#: ../extensions/example/extension.js:11
msgid "Hello, world!"
msgstr "Hola, món!"
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:1
msgid "Alternative greeting text."
msgstr "Text de rebuda alternatiu."
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:2
msgid ""
"If not empty, it contains the text that will be shown when clicking on the "
"panel."
msgstr ""
"Si no és buit, conté el text que es mostrarà quan es faci clic en el quadre."
#. TRANSLATORS: Example is the name of the extension, should not be
#. translated
#: ../extensions/example/prefs.js:30
msgid ""
"Example aims to show how to build well behaved extensions for the Shell and "
"as such it has little functionality on its own.\n"
"Nevertheless it's possible to customize the greeting message."
msgstr ""
"L'«Example» està pensat com una extensió del GNOME Shell que demostri la "
"manera correcta de crear extensions. Com a extensió pròpiament dita no fa "
"gairebé res.\n"
"Tot i així permet personalitzar el missatge del rebedor."
#: ../extensions/example/prefs.js:36
msgid "Message:"
msgstr "Missatge:"
#: ../extensions/gajim/extension.js:226
#: ../extensions/gajim/extension.js:219
#, c-format
msgid "%s is away."
msgstr "%s està absent."
#: ../extensions/gajim/extension.js:229
#: ../extensions/gajim/extension.js:222
#, c-format
msgid "%s is offline."
msgstr "%s està fora de línia."
#: ../extensions/gajim/extension.js:232
#: ../extensions/gajim/extension.js:225
#, c-format
msgid "%s is online."
msgstr "%s està en línia."
#: ../extensions/gajim/extension.js:235
#: ../extensions/gajim/extension.js:228
#, c-format
msgid "%s is busy."
msgstr "%s està ocupat."
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:1
msgid "Use more screen for windows"
msgstr "Utilitza més pantalla per les finestres"
msgid ""
"If true, place window captions on top the respective thumbnail, overriding "
"shell default of placing it at the bottom. Changing this setting requires "
"restarting the shell to have any effect."
msgstr ""
"Si és «true» (cert), posiciona el títol de la finestra damunt de la "
"miniatura corresponent, substituint el comportament per defecte del Shell de "
"posicionar-lo a baix. Cal reiniciar el Shell per tal de que aquest canvi "
"tingui efecte."
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:2
msgid "Place window captions on top"
msgstr "Posiciona els títols de les finestres al damunt"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
msgid ""
"The algorithm used to layout thumbnails in the overview. 'grid' to use the "
"default grid based algorithm, 'natural' to use another one that reflects "
"more the position and size of the actual window"
msgstr ""
"L'algoritme per posicionar les miniatures en la perspectiva general. Useu "
"«grid» (graella) per a utilitzar l'algoritme per defecte basat en disposició "
"en graella, o «natural» (natural) per a usar un algoritme que reflexa millor "
"la posició i mida de la finestra actual."
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
msgid ""
"Try to use more screen for placing window thumbnails by adapting to screen "
"aspect ratio, and consolidating them further to reduce the bounding box. "
@@ -270,258 +285,38 @@ msgstr ""
"configuració només s'aplica a l'estratègia de posicionament de finestres "
"natural."
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
msgid "Place window captions on top"
msgstr "Posiciona els títols de les finestres al damunt"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:5
msgid "Use more screen for windows"
msgstr "Utilitza més pantalla per les finestres"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
msgid ""
"If true, place window captions on top the respective thumbnail, overriding "
"shell default of placing it at the bottom. Changing this setting requires "
"restarting the shell to have any effect."
msgstr ""
"Si és «true» (cert), posiciona el títol de la finestra damunt de la "
"miniatura corresponent, substituint el comportament per defecte del Shell de "
"posicionar-lo a baix. Cal reiniciar el Shell per tal de que aquest canvi "
"tingui efecte."
#: ../extensions/places-menu/extension.js:46
msgid "Places"
msgstr "Llocs"
#: ../extensions/places-menu/extension.js:47
msgid "Devices"
msgstr "Dispositius"
#: ../extensions/places-menu/extension.js:48
msgid "Bookmarks"
msgstr "Adreces d'interès"
#: ../extensions/places-menu/extension.js:49
msgid "Network"
msgstr "Xarxa"
#: ../extensions/places-menu/placeDisplay.js:48
#, c-format
msgid "Failed to launch \"%s\""
msgstr "No s'ha pogut iniciar «%s»"
#: ../extensions/places-menu/placeDisplay.js:121
msgid "Home"
msgstr "Inici"
#: ../extensions/places-menu/placeDisplay.js:184
msgid "File System"
msgstr "Sistema de fitxers"
#: ../extensions/places-menu/placeDisplay.js:188
msgid "Browse network"
msgstr "Navega per la xarxa"
#: ../extensions/systemMonitor/extension.js:213
msgid "CPU"
msgstr "CPU"
#: ../extensions/systemMonitor/extension.js:266
msgid "Memory"
msgstr "Memòria"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:6
msgid "Window placement strategy"
msgstr "Estratègia de posicionament de la finestra"
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:1
msgid "Theme name"
msgstr "Nom del tema"
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr "El nom del tema que es carregarà des de ~/.themes/name/gnome-shell"
#: ../extensions/workspace-indicator/extension.js:30
msgid "Workspace Indicator"
msgstr "Indicador de l'espai de treball"
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
msgid "Theme name"
msgstr "Nom del tema"
#: ../extensions/workspace-indicator/prefs.js:141
msgid "Workspace names:"
msgstr "Noms dels espais de treball:"
#: ../extensions/workspace-indicator/prefs.js:152
msgid "Name"
msgstr "Nom"
#: ../extensions/workspace-indicator/prefs.js:186
#, c-format
msgid "Workspace %d"
msgstr "Espai de treball %d"
#: ../extensions/xrandr-indicator/extension.js:30
#: ../extensions/xrandr-indicator/extension.js:26
msgid "Normal"
msgstr "Normal"
#: ../extensions/xrandr-indicator/extension.js:31
#: ../extensions/xrandr-indicator/extension.js:27
msgid "Left"
msgstr "Esquerra"
#: ../extensions/xrandr-indicator/extension.js:32
#: ../extensions/xrandr-indicator/extension.js:28
msgid "Right"
msgstr "Dreta"
#: ../extensions/xrandr-indicator/extension.js:33
#: ../extensions/xrandr-indicator/extension.js:29
msgid "Upside-down"
msgstr "Capgira"
#: ../extensions/xrandr-indicator/extension.js:50
msgid "Display"
msgstr "Pantalla"
#: ../extensions/xrandr-indicator/extension.js:80
msgid "Display Settings"
msgstr "Paràmetres de la pantalla"
#~ msgid "The alt tab behaviour."
#~ msgstr "Comportament de l'«Alternate Tab»."
#~ msgid ""
#~ "Sets the Alt-Tab behaviour. Possible values are: all_thumbnails and "
#~ "workspace_icons. See the configuration dialogs for details."
#~ msgstr ""
#~ "Defineix el comportament de l'«Alternate Tab». Els valors possibles són: "
#~ "«all_thumbnails» (totes i les miniatures) i «workspace_icons» (espais de "
#~ "treball i icones). Vegeu els diàlegs de configuració per saber-ne més."
#~ msgid ""
#~ "This mode presents all applications from all workspaces in one selection "
#~ "list. Instead of using the application icon of every window, it uses "
#~ "small thumbnails resembling the window itself."
#~ msgstr ""
#~ "Aquest mode mostra totes les aplicacions de tots els espais de treball en "
#~ "una sola llista de selecció. En comptes de fer servir la icona de "
#~ "l'aplicació per cada finestra, fa servir miniatures de les mateixes "
#~ "finestres de les aplicacions."
#~ msgid "Workspace & Icons"
#~ msgstr "Espai de treball i icones"
#~ msgid ""
#~ "This mode let's you switch between the applications of your current "
#~ "workspace and gives you additionally the option to switch to the last "
#~ "used application of your previous workspace. This is always the last "
#~ "symbol in the list and is segregated by a separator/vertical line if "
#~ "available. \n"
#~ "Every window is represented by its application icon."
#~ msgstr ""
#~ "Aquest mode us permet canviar entre les aplicacions de l'espai de treball "
#~ "actual i us dóna la possibilitat de canviar a l'última aplicació "
#~ "utilitzada de l'espai de treball anterior. Es mostra, en cas d'estar "
#~ "disponible, sempre com a l'última icona de la llista, separada de la "
#~ "resta amb un separador vertical.\n"
#~ "Cada finestra està representada per la seva icona d'aplicació."
#~ msgid "Move current selection to front before closing the popup"
#~ msgstr ""
#~ "Mou la selecció actual al primer pla abans de tancar el diàleg emergent"
#~ msgid ""
#~ "The Alternate Tab can be used in different modes, that affect the way "
#~ "windows are chosen and presented."
#~ msgstr ""
#~ "L'«Alternate Tab» es pot utilitzar de diferents maneres que canvien la "
#~ "forma en que es seleccionen i es mostren les finestres."
#~ msgid "Removable Devices"
#~ msgstr "Dispositius extraïbles"
#~ msgid "Configure display settings..."
#~ msgstr "Configura els paràmetres de visualització..."
#~ msgid "Available"
#~ msgstr "Disponible"
#~ msgid "Busy"
#~ msgstr "Ocupat"
#~ msgid "My Account"
#~ msgstr "El meu compte"
#~ msgid "Lock Screen"
#~ msgstr "Bloca la pantalla"
#~ msgid "Switch User"
#~ msgstr "Canvia d'usuari"
#~ msgid "Log Out..."
#~ msgstr "Surt..."
#~ msgid ""
#~ "This is the first time you use the Alternate Tab extension. \n"
#~ "Please choose your preferred behaviour:\n"
#~ "\n"
#~ "All & Thumbnails:\n"
#~ " This mode presents all applications from all workspaces in one "
#~ "selection \n"
#~ " list. Instead of using the application icon of every window, it uses "
#~ "small \n"
#~ " thumbnails resembling the window itself. \n"
#~ "\n"
#~ "Workspace & Icons:\n"
#~ " This mode let's you switch between the applications of your current \n"
#~ " workspace and gives you additionally the option to switch to the last "
#~ "used \n"
#~ " application of your previous workspace. This is always the last "
#~ "symbol in \n"
#~ " the list and is segregated by a separator/vertical line if "
#~ "available. \n"
#~ " Every window is represented by its application icon. \n"
#~ "\n"
#~ "Native:\n"
#~ " This mode is the native GNOME 3 behaviour or in other words: "
#~ "Clicking \n"
#~ " native switches the Alternate Tab extension off. \n"
#~ msgstr ""
#~ "Aquest és el primer cop que utilitzeu l'extensió «Alternate Tab». \n"
#~ "Trieu el comportament que preferiu:\n"
#~ "\n"
#~ "Totes i miniatures:\n"
#~ " Aquest mode presenta totes les aplicacions de tots els espais de "
#~ "treball com a\n"
#~ " una llista de selecció. En comptes de mostrar la icona d'aplicació de "
#~ "cada finestra, mostra les \n"
#~ " miniatures que representen el contingut de la finestra. \n"
#~ "\n"
#~ "Espai de treball i icones:\n"
#~ " Aquest mode us permet canviar entre aplicacions de l'espai de treball "
#~ "actual \n"
#~ " i us dóna la possibilitat de canviar a l'última aplicació usada de "
#~ "l'espai de \n"
#~ " treball anterior. Aquest és sempre el darrer símbol a la llista i "
#~ "està separat \n"
#~ " per una línia vertical/separador quan està disponible. \n"
#~ " Cada finestra es representa per la seva icona d'aplicació. \n"
#~ "\n"
#~ "Nadiu:\n"
#~ " Aquest és el mode de comportament nadiu al GNOME 3 o amb altres "
#~ "paraules: fent \n"
#~ " clic inhabilita l'extensió «Alternate Tab». \n"
#~ msgid "Alt Tab Behaviour"
#~ msgstr "Comportament de l'«Alternate Tab»"
#~ msgid "Cancel"
#~ msgstr "Cancel·la"
#~ msgid "Ask the user for a default behaviour if true."
#~ msgstr ""
#~ "Si és «true» (cert) pregunta a l'usuari pel comportament per defecte."
#~ msgid "Indicates if Alternate Tab is newly installed"
#~ msgstr "Indica si s'acaba d'instal·lar l'«Alternate Tab»"
#~ msgid ""
#~ "The algorithm used to layout thumbnails in the overview. 'grid' to use "
#~ "the default grid based algorithm, 'natural' to use another one that "
#~ "reflects more the position and size of the actual window"
#~ msgstr ""
#~ "L'algoritme per posicionar les miniatures en la perspectiva general. Useu "
#~ "«grid» (graella) per a utilitzar l'algoritme per defecte basat en "
#~ "disposició en graella, o «natural» (natural) per a usar un algoritme que "
#~ "reflexa millor la posició i mida de la finestra actual."
#~ msgid "Window placement strategy"
#~ msgstr "Estratègia de posicionament de la finestra"
#: ../extensions/xrandr-indicator/extension.js:78
msgid "Configure display settings..."
msgstr "Configura els paràmetres de visualització..."

436
po/cs.po
View File

@@ -2,15 +2,15 @@
# Copyright (C) 2011 gnome-shell-extensions's COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-shell-extensions package.
#
# Marek Černocký <marek@manet.cz>, 2011, 2012, 2013.
# Marek Černocký <marek@manet.cz>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell-extensions master\n"
"Project-Id-Version: gnome-shell-extensions 3.2\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=extensions\n"
"POT-Creation-Date: 2013-02-08 12:25+0000\n"
"PO-Revision-Date: 2013-02-17 09:19+0100\n"
"POT-Creation-Date: 2011-11-28 19:18+0000\n"
"PO-Revision-Date: 2011-11-22 11:43+0100\n"
"Last-Translator: Marek Černocký <marek@manet.cz>\n"
"Language-Team: Czech <gnome-cs-list@gnome.org>\n"
"Language: cs\n"
@@ -18,91 +18,129 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n"
"X-Generator: Gtranslator 2.91.6\n"
#: ../data/gnome-classic.desktop.in.h:1
#: ../data/gnome-classic.session.desktop.in.in.h:1
msgid "GNOME Classic"
msgstr "GNOME klasik"
#: ../extensions/alternative-status-menu/extension.js:45
msgid "Notifications"
msgstr "Oznamování"
#: ../data/gnome-classic.desktop.in.h:2
msgid "This session logs you into GNOME Classic"
msgstr "Toto sezení vás přihlásí do GNOME klasik"
#: ../extensions/alternative-status-menu/extension.js:53
msgid "Online Accounts"
msgstr "Účty on-line"
#: ../data/gnome-shell-classic.desktop.in.in.h:1
msgid "GNOME Shell Classic"
msgstr "GNOME Shell klasik"
#: ../extensions/alternative-status-menu/extension.js:57
msgid "System Settings"
msgstr "Nastavení systému"
#: ../data/gnome-shell-classic.desktop.in.in.h:2
msgid "Window management and application launching"
msgstr "Správa oken a spouštění aplikací"
#: ../extensions/alternative-status-menu/extension.js:64
msgid "Lock Screen"
msgstr "Zamknout obrazovku"
#: ../extensions/alternate-tab/prefs.js:20
msgid "Thumbnail only"
msgstr "Pouze náhled"
#: ../extensions/alternative-status-menu/extension.js:69
msgid "Switch User"
msgstr "Přepnout uživatele"
#: ../extensions/alternate-tab/prefs.js:21
msgid "Application icon only"
msgstr "Pouze ikona aplikace"
#: ../extensions/alternative-status-menu/extension.js:74
msgid "Log Out..."
msgstr "Odhlásit se…"
#: ../extensions/alternate-tab/prefs.js:22
msgid "Thumbnail and application icon"
msgstr "Náhled a ikona aplikace"
#: ../extensions/alternate-tab/prefs.js:37
msgid "Present windows as"
msgstr "Představovat okna jako"
#: ../extensions/alternate-tab/prefs.js:62
msgid "Show only windows in the current workspace"
msgstr "Zobrazovat pouze okna z aktuální pracovní plochy"
#. add the new entries
#: ../extensions/alternative-status-menu/extension.js:144
#: ../extensions/alternative-status-menu/extension.js:82
msgid "Suspend"
msgstr "Uspat do paměti"
#: ../extensions/alternative-status-menu/extension.js:147
#: ../extensions/alternative-status-menu/extension.js:88
msgid "Hibernate"
msgstr "Uspat na disk"
#: ../extensions/alternative-status-menu/extension.js:150
msgid "Power Off"
msgstr "Vypnout"
#: ../extensions/alternative-status-menu/extension.js:94
msgid "Power Off..."
msgstr "Vypnout"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:1
msgid "Enable suspending"
msgstr "Povolit uspávání do paměti"
#: ../extensions/alternate-tab/extension.js:50
msgid ""
"This is the first time you use the Alternate Tab extension. \n"
"Please choose your preferred behaviour:\n"
"\n"
"All & Thumbnails:\n"
" This mode presents all applications from all workspaces in one "
"selection \n"
" list. Instead of using the application icon of every window, it uses "
"small \n"
" thumbnails resembling the window itself. \n"
"\n"
"Workspace & Icons:\n"
" This mode let's you switch between the applications of your current \n"
" workspace and gives you additionally the option to switch to the last "
"used \n"
" application of your previous workspace. This is always the last symbol "
"in \n"
" the list and is segregated by a separator/vertical line if available. \n"
" Every window is represented by its application icon. \n"
"\n"
"If you whish to revert to the default behavior for the Alt-Tab switcher, "
"just\n"
"disable the extension from extensions.gnome.org or the Advanced Settings "
"application."
msgstr ""
"Právě jste poprvé použili rozšíření Alternate Tab.\n"
"Vyberte si vámi upřednostňované chování:\n"
"\n"
"Vše a náhledy:\n"
" Tento režim předkládá všechny aplikace ze všech pracovních ploch\n"
" v jediném výběrovém seznamu. Místo ikon aplikací pro každé z oken\n"
" používá malé náhledy vytvořené přímo podle oken.\n"
"\n"
"Pracovní plocha a ikony:\n"
" Tento režim vám umožňuje přepínat mezi aplikacemi vaší aktuální "
"pracovní\n"
" plochy a poskytuje vám navíc možnost přepnout se na naposledy použitou\n"
" aplikaci vaší předchozí pracovní plochy. Jde vždy o poslední symbol v "
"seznamu\n"
" a pokud je k dispozici, je oddělen oddělovačem/svislou čárou. Každé z "
"oken\n"
" je prezentováno ikonou příslušné aplikace.\n"
"\n"
"Jestliže si přejete vrátit výchozí chování přepínače Alt-Tab, jednoduše "
"rozšíření\n"
"zakažte v extensions.gnome.org nebo v aplikaci Pokročilá nastavení."
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:2
msgid "Control the visibility of the Suspend menu item"
msgstr "Řídí viditelnost položky „Uspat do paměti“ v nabídce"
#: ../extensions/alternate-tab/extension.js:291
msgid "Alt Tab Behaviour"
msgstr "Chování Alt Tab"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:3
msgid "Enable hibernating"
msgstr "Povolit uspávání na disk"
#: ../extensions/alternate-tab/extension.js:307
msgid "All & Thumbnails"
msgstr "Vše a náhledy"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:4
msgid "Control the visibility of the Hibernate menu item"
msgstr "Řídí viditelnost položky „Uspat na disk“ v nabídce"
#: ../extensions/alternate-tab/extension.js:314
msgid "Workspace & Icons"
msgstr "Pracovní plocha a ikony"
#: ../extensions/apps-menu/extension.js:50
msgid "Activities Overview"
msgstr "Přehled činností"
#: ../extensions/alternate-tab/extension.js:321
msgid "Cancel"
msgstr "Zrušit"
#: ../extensions/apps-menu/extension.js:103
msgid "Favorites"
msgstr "Oblíbené"
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
msgid "Ask the user for a default behaviour if true."
msgstr "Když je zapnuto, dotázat se uživatele na výchozí chování."
#: ../extensions/apps-menu/extension.js:197
msgid "Applications"
msgstr "Aplikace"
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
msgid "Indicates if Alternate Tab is newly installed"
msgstr "Signalizuje, když je rozšíření Alternate Tab nově nainstalováno"
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:3
msgid ""
"Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails and "
"workspace_icons."
msgstr ""
"Nastavuje chování klávesové zkratky Alt-Tab. Možné hodnoty jsou: native "
"(přirozené), all_thumbnails (vše a náhledy) a workspace_icons (pracovní "
"plocha a ikony)."
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:4
msgid "The alt tab behaviour."
msgstr "Chování klávesové zkratky alt tab."
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:1
msgid "Application and workspace list"
msgstr "Seznam aplikací a pracovních ploch"
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
msgid ""
"A list of strings, each containing an application id (desktop file name), "
"followed by a colon and the workspace number"
@@ -110,90 +148,98 @@ msgstr ""
"Seznam řetězců, z nichž každý obsahuje ID aplikace (název souboru pracovní "
"plochy), následovaný dvojtečkou a číslem pracovní plochy"
#: ../extensions/auto-move-windows/prefs.js:55
msgid "Application"
msgstr "Aplikace"
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
msgid "Application and workspace list"
msgstr "Seznam aplikací a pracovních ploch"
#: ../extensions/auto-move-windows/prefs.js:64
#: ../extensions/auto-move-windows/prefs.js:106
msgid "Workspace"
msgstr "Pracovní plocha"
#: ../extensions/dock/extension.js:569
msgid "Drag here to add favorites"
msgstr "Přetažením sem přidáte do oblíbených"
#: ../extensions/auto-move-windows/prefs.js:80
msgid "Add rule"
msgstr "Přidat pravidlo"
#: ../extensions/dock/extension.js:902
msgid "New Window"
msgstr "Nové okno"
#: ../extensions/auto-move-windows/prefs.js:94
msgid "Create new matching rule"
msgstr "Vytvoření nového srovnávacího pravidla"
#: ../extensions/dock/extension.js:904
msgid "Quit Application"
msgstr "Ukončit aplikaci"
#: ../extensions/auto-move-windows/prefs.js:98
msgid "Add"
msgstr "Přidat"
#: ../extensions/dock/extension.js:909
msgid "Remove from Favorites"
msgstr "Odebrat z oblíbených"
#: ../extensions/drive-menu/extension.js:72
#, c-format
msgid "Ejecting drive '%s' failed:"
msgstr "Vysunutí disku „%s“ selhalo:"
#: ../extensions/dock/extension.js:910
msgid "Add to Favorites"
msgstr "Přidat do oblíbených"
#: ../extensions/drive-menu/extension.js:89
msgid "Removable devices"
msgstr "Výměnná zařízení"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:1
msgid "Autohide duration"
msgstr "Čas automatického skrývání"
#: ../extensions/drive-menu/extension.js:106
msgid "Open File"
msgstr "Otevřít soubor"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:2
msgid "Autohide effect"
msgstr "Efekt automatického skrývání"
#: ../extensions/example/extension.js:17
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:3
msgid "Enable/disable autohide"
msgstr "Zapnout/vypnout automatické skrývání"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:4
msgid "Icon size"
msgstr "Velikost ikony"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:5
msgid "Position of the dock"
msgstr "Poloha doku"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:6
msgid "Sets icon size of the dock."
msgstr "Nastavuje velikost ikon v doku."
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:7
msgid ""
"Sets the effect of the hide dock. Allowed values are 'resize' or 'rescale'"
msgstr ""
"Nastavuje efekt skrývání doku. Povolené hodnoty jsou „resize“ (změna "
"velikosti) a „rescale“ (změna měřítka)"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:8
msgid ""
"Sets the position of the dock in the screen. Allowed values are 'right' or "
"'left'"
msgstr ""
"Nastavuje polohu doku na obrazovce. Povolené hodnoty jsou „right“ (vpravo) "
"nebo „left“ (vlevo)."
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:9
msgid "Sets the time duration of the autohide effect."
msgstr "Nastavuje čas trvání efektu automatického skrývání."
#: ../extensions/example/extension.js:11
msgid "Hello, world!"
msgstr "Ahoj světe!"
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:1
msgid "Alternative greeting text."
msgstr "Alternativní uvítací text"
#: ../extensions/gajim/extension.js:227
#, c-format
msgid "%s is away."
msgstr "%s je pryč."
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:2
msgid ""
"If not empty, it contains the text that will be shown when clicking on the "
"panel."
msgstr ""
"Pokud není prázdné, obsahuje text, který se objeví po kliknutí na panel."
#: ../extensions/gajim/extension.js:230
#, c-format
msgid "%s is offline."
msgstr "%s je odpojen."
#. TRANSLATORS: Example is the name of the extension, should not be
#. translated
#: ../extensions/example/prefs.js:30
msgid ""
"Example aims to show how to build well behaved extensions for the Shell and "
"as such it has little functionality on its own.\n"
"Nevertheless it's possible to customize the greeting message."
msgstr ""
"Rozšíření Example vám má jen ukázat, jak sestavit dobře fungující rozšíření "
"pro Shell, a tak je jeho praktické využití pramalé.\n"
"Přesto si můžete alespoň upravit uvítací zprávu."
#: ../extensions/gajim/extension.js:233
#, c-format
msgid "%s is online."
msgstr "%s je připojen."
#: ../extensions/example/prefs.js:36
msgid "Message:"
msgstr "Zpráva:"
#: ../extensions/gajim/extension.js:236
#, c-format
msgid "%s is busy."
msgstr "%s je zaneprázdněn."
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:1
msgid "Use more screen for windows"
msgstr "Použít větší část obrazovky pro okna"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:2
msgid ""
"Try to use more screen for placing window thumbnails by adapting to screen "
"aspect ratio, and consolidating them further to reduce the bounding box. "
"This setting applies only with the natural placement strategy."
msgstr ""
"Pomocí přizpůsobení měřítka obrazovky spolu se zmenšením ohraničení zkusit "
"využít větší část obrazovky pro umístění náhledů oken. Toto nastavení se "
"použije pouze dohromady se strategií umisťování „natural“."
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
msgid "Place window captions on top"
msgstr "Umístit název okna nahoru"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
msgid ""
"If true, place window captions on top the respective thumbnail, overriding "
"shell default of placing it at the bottom. Changing this setting requires "
@@ -203,104 +249,68 @@ msgstr ""
"přepíše výchozí chování shellu, který jej umisťuje dolů. Změna tohoto "
"nastavení vyžaduje restart shellu, aby se projevila."
#: ../extensions/places-menu/extension.js:57
msgid "Places"
msgstr "Místa"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:2
msgid "Place window captions on top"
msgstr "Umístit název okna nahoru"
#: ../extensions/places-menu/placeDisplay.js:48
#, c-format
msgid "Failed to launch \"%s\""
msgstr "Selhalo spuštění „%s“"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
msgid ""
"The algorithm used to layout thumbnails in the overview. 'grid' to use the "
"default grid based algorithm, 'natural' to use another one that reflects "
"more the position and size of the actual window"
msgstr ""
"Algoritmus použitý k rozvržení náhledů v přehledu. „grid“ použijte pro "
"výchozí algoritmus založený na pravidelné mřížce, „natural“ pro jiný "
"algoritmus, který se snaží brát v úvahu polohu a velikost aktuálního okna"
#: ../extensions/places-menu/placeDisplay.js:121
msgid "Home"
msgstr "Domů"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
msgid ""
"Try to use more screen for placing window thumbnails by adapting to screen "
"aspect ratio, and consolidating them further to reduce the bounding box. "
"This setting applies only with the natural placement strategy."
msgstr ""
"Pomocí přizpůsobení měřítka obrazovky spolu se zmenšením ohraničení zkusit "
"využít větší část obrazovky pro umístění náhledů oken. Toto nastavení se "
"použije pouze dohromady se strategií umisťování „natural“."
#: ../extensions/places-menu/placeDisplay.js:195
msgid "Computer"
msgstr "Počítač"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:5
msgid "Use more screen for windows"
msgstr "Použít větší část obrazovky pro okna"
#: ../extensions/places-menu/placeDisplay.js:199
msgid "Browse Network"
msgstr "Procházet síť"
#: ../extensions/systemMonitor/extension.js:213
msgid "CPU"
msgstr "Procesor"
#: ../extensions/systemMonitor/extension.js:266
msgid "Memory"
msgstr "Paměť"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:6
msgid "Window placement strategy"
msgstr "Strategie umisťování oken"
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:1
msgid "Theme name"
msgstr "Název motivu"
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr "Název motivu, který se má načíst z ~/.themes/name/gnome-shell"
#: ../extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml.in.h:1
msgid "When to group windows"
msgstr "Kdy seskupovat okna"
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
msgid "Theme name"
msgstr "Název motivu"
#: ../extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml.in.h:2
msgid ""
"Decides when to group windows from the same application on the window list. "
"Possible values are \"never\" and \"always\"."
msgstr ""
"Rozhoduje, kdy se mají v seznamu oken seskupovat okna stejné aplikace. Možné "
"hodnoty jsou „never“ (nikdy) a „always“ (vždy)."
#: ../extensions/window-list/prefs.js:30
msgid "Window Grouping"
msgstr "Seskupování oken"
#: ../extensions/window-list/prefs.js:49
msgid "Never group windows"
msgstr "Nikdy neseskupovat okna"
#: ../extensions/window-list/prefs.js:50
msgid "Always group windows"
msgstr "Vždy seskupovat okna"
#: ../extensions/workspace-indicator/extension.js:30
msgid "Workspace Indicator"
msgstr "Ukazatel pracovní plochy"
#: ../extensions/workspace-indicator/prefs.js:141
msgid "Workspace names:"
msgstr "Názvy pracovních ploch"
#: ../extensions/workspace-indicator/prefs.js:152
msgid "Name"
msgstr "Název"
#: ../extensions/workspace-indicator/prefs.js:186
#, c-format
msgid "Workspace %d"
msgstr "Pracovní plocha %d"
#: ../extensions/xrandr-indicator/extension.js:30
#: ../extensions/xrandr-indicator/extension.js:26
msgid "Normal"
msgstr "Normální"
#: ../extensions/xrandr-indicator/extension.js:31
#: ../extensions/xrandr-indicator/extension.js:27
msgid "Left"
msgstr "Doleva"
#: ../extensions/xrandr-indicator/extension.js:32
#: ../extensions/xrandr-indicator/extension.js:28
msgid "Right"
msgstr "Doprava"
#: ../extensions/xrandr-indicator/extension.js:33
#: ../extensions/xrandr-indicator/extension.js:29
msgid "Upside-down"
msgstr "Vzhůru nohama"
#: ../extensions/xrandr-indicator/extension.js:50
msgid "Display"
msgstr "Obrazovka"
#: ../extensions/xrandr-indicator/extension.js:78
msgid "Configure display settings..."
msgstr "Upravit nastavení zobrazení…"
#: ../extensions/xrandr-indicator/extension.js:80
msgid "Display Settings"
msgstr "Nastavení obrazovky"
msgid "Available"
msgstr "Dostupný"
msgid "Busy"
msgstr "Zaneprázdněný"

209
po/da.po
View File

@@ -8,8 +8,8 @@ msgid ""
msgstr ""
"Project-Id-Version: gnome-shell-extensions master\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2012-01-02 12:35+0100\n"
"PO-Revision-Date: 2011-12-27 00:32+0000\n"
"POT-Creation-Date: 2011-04-06 22:28+0200\n"
"PO-Revision-Date: 2011-04-06 09:07+0000\n"
"Last-Translator: Kris Thomsen <lakristho@gmail.com>\n"
"Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
"Language: da\n"
@@ -18,105 +18,6 @@ msgstr ""
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
#. add the new entries
#: ../extensions/alternative-status-menu/extension.js:68
msgid "Suspend"
msgstr "Dvale"
#: ../extensions/alternative-status-menu/extension.js:73
msgid "Hibernate"
msgstr "Hviletilstand"
#: ../extensions/alternative-status-menu/extension.js:78
msgid "Power Off..."
msgstr "Sluk..."
#: ../extensions/alternate-tab/extension.js:54
msgid ""
"This is the first time you use the Alternate Tab extension. \n"
"Please choose your preferred behaviour:\n"
"\n"
"All & Thumbnails:\n"
" This mode presents all applications from all workspaces in one "
"selection \n"
" list. Instead of using the application icon of every window, it uses "
"small \n"
" thumbnails resembling the window itself. \n"
"\n"
"Workspace & Icons:\n"
" This mode let's you switch between the applications of your current \n"
" workspace and gives you additionally the option to switch to the last "
"used \n"
" application of your previous workspace. This is always the last symbol "
"in \n"
" the list and is segregated by a separator/vertical line if available. \n"
" Every window is represented by its application icon. \n"
"\n"
"If you whish to revert to the default behavior for the Alt-Tab switcher, "
"just\n"
"disable the extension from extensions.gnome.org or the Advanced Settings "
"application."
msgstr ""
"Dette er første gang du bruger Alternate Tab-udvidelsen. \n"
"Vælg venligst din foretrukne opførsel:\n"
"\n"
"Alle & miniaturebilleder:\n"
" Denne tilstand præsenterer alle programmer fra alle arbejdsområder i en "
"markerings- \n"
" liste. I stedet for at bruge programikonet for hvert vindue, bruges et "
"lille \n"
" miniaturebillede af vinduet selv. \n"
"\n"
"Arbejdsområde & ikoner:\n"
" Denne tilstand giver mulighed for at skifte mellem programmerne i dit "
"nuværende \n"
" arbejdsområde og giver dig derudover muligheden for at skifte til det "
"seneste brugte \n"
" program i dit tidligere arbejdsområde. Dette er altid det sidste symbol "
"i \n"
" listen og er visuelt adskilt af en vertikal linje, hvis tilgængelig. \n"
" Hvert vindue er repræsenteret af dets programikon. \n"
"\n"
"Hvis du ønsker at skifte tilbage til standardopførslen for Alt-Tab-"
"skifteren, skal du\n"
"blot deaktivere udvidelsen fra extensions.gnome.org eller programmet "
"Avancerede indstillinger."
#: ../extensions/alternate-tab/extension.js:295
msgid "Alt Tab Behaviour"
msgstr "Alt-Tab-opførsel"
#: ../extensions/alternate-tab/extension.js:311
msgid "All & Thumbnails"
msgstr "Alle & miniaturebilleder"
#: ../extensions/alternate-tab/extension.js:318
msgid "Workspace & Icons"
msgstr "Arbejdsområde & ikoner"
#: ../extensions/alternate-tab/extension.js:325
msgid "Cancel"
msgstr "Annullér"
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
msgid "Ask the user for a default behaviour if true."
msgstr ""
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
msgid "Indicates if Alternate Tab is newly installed"
msgstr ""
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:3
msgid ""
"Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails and "
"workspace_icons."
msgstr ""
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:4
#, fuzzy
msgid "The alt tab behaviour."
msgstr "Alt-Tab-opførsel"
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:1
msgid ""
"A list of strings, each containing an application id (desktop file name), "
@@ -129,120 +30,50 @@ msgstr ""
msgid "Application and workspace list"
msgstr "Liste over programmer og arbejdsområder"
#: ../extensions/dock/extension.js:561
#: ../extensions/dock/extension.js:116
msgid "Drag here to add favorites"
msgstr "Træk hertil for at føje til favoritter"
#: ../extensions/dock/extension.js:896
#: ../extensions/dock/extension.js:417
msgid "New Window"
msgstr "Nyt vindue"
#: ../extensions/dock/extension.js:898
#: ../extensions/dock/extension.js:419
msgid "Quit Application"
msgstr "Afslut program"
#: ../extensions/dock/extension.js:903
#: ../extensions/dock/extension.js:424
msgid "Remove from Favorites"
msgstr "Fjern fra favoritter"
#: ../extensions/dock/extension.js:904
#: ../extensions/dock/extension.js:425
msgid "Add to Favorites"
msgstr "Føj til favoritter"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:1
msgid "Autohide duration"
msgstr ""
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:2
msgid "Autohide effect"
msgstr ""
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:3
msgid "Enable/disable autohide"
msgstr ""
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:4
msgid "Icon size"
msgstr ""
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:5
msgid "Position of the dock"
msgstr ""
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:6
msgid "Sets icon size of the dock."
msgstr ""
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:7
msgid ""
"Sets the effect of the hide dock. Allowed values are 'resize', 'rescale' and "
"'move'"
msgstr ""
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:8
msgid ""
"Sets the position of the dock in the screen. Allowed values are 'right' or "
"'left'"
msgstr ""
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:9
msgid "Sets the time duration of the autohide effect."
msgstr ""
#: ../extensions/drive-menu/extension.js:69
msgid "Open file manager"
msgstr ""
#: ../extensions/example/extension.js:11
msgid "Hello, world!"
msgstr "Hej verden!"
#: ../extensions/gajim/extension.js:227
#: ../extensions/gajim/extension.js:219
#, c-format
msgid "%s is away."
msgstr "%s er ikke til stede."
#: ../extensions/gajim/extension.js:230
#: ../extensions/gajim/extension.js:222
#, c-format
msgid "%s is offline."
msgstr "%s er frakoblet."
#: ../extensions/gajim/extension.js:233
#: ../extensions/gajim/extension.js:225
#, c-format
msgid "%s is online."
msgstr "%s er tilgængelig."
#: ../extensions/gajim/extension.js:236
#: ../extensions/gajim/extension.js:228
#, c-format
msgid "%s is busy."
msgstr "%s er optaget."
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:1
msgid ""
"If true, place window captions on top the respective thumbnail, overriding "
"shell default of placing it at the bottom. Changing this setting requires "
"restarting the shell to have any effect."
msgstr ""
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:2
msgid "Place window captions on top"
msgstr ""
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
msgid ""
"Try to use more screen for placing window thumbnails by adapting to screen "
"aspect ratio, and consolidating them further to reduce the bounding box. "
"This setting applies only with the natural placement strategy."
msgstr ""
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
msgid "Use more screen for windows"
msgstr ""
#: ../extensions/places-menu/extension.js:36
msgid "Removable Devices"
msgstr ""
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:1
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr "Navnet på temaet, som indlæses fra ~/.themes/name/gnome-shell"
@@ -270,21 +101,3 @@ msgstr "På hovedet"
#: ../extensions/xrandr-indicator/extension.js:78
msgid "Configure display settings..."
msgstr "Konfigurér skærmindstillinger..."
#~ msgid "Notifications"
#~ msgstr "Beskeder"
#~ msgid "Online Accounts"
#~ msgstr "Online konti"
#~ msgid "System Settings"
#~ msgstr "Systemindstillinger"
#~ msgid "Lock Screen"
#~ msgstr "Lås skærm"
#~ msgid "Switch User"
#~ msgstr "Skift bruger"
#~ msgid "Log Out..."
#~ msgstr "Log ud..."

487
po/de.po
View File

@@ -1,205 +1,252 @@
# German translation for gnome-shell-extensions.
# Copyright (C) 2011 gnome-shell-extensions's COPYRIGHT HOLDER
# This file is distributed under the same license as the gnome-shell-extensions package.
# Mario Blättermann <mario.blaettermann@gmail.com>, 2011-2013.
# Christian Kirbach <Christian.Kirbach@googlemail.com>, 2011, 2012.
# Mario Blättermann <mario.blaettermann@gmail.com>, 2011.
# Christian Kirbach <Christian.Kirbach@googlemail.com>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: gnome-shell-extensions master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=extensions\n"
"POT-Creation-Date: 2013-03-11 01:25+0000\n"
"PO-Revision-Date: 2013-03-13 20:30+0100\n"
"POT-Creation-Date: 2011-11-18 17:35+0000\n"
"PO-Revision-Date: 2011-11-18 18:37+0100\n"
"Last-Translator: Mario Blättermann <mario.blaettermann@gmail.com>\n"
"Language-Team: Deutsch <gnome-de@gnome.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
"Plural-Forms: nplurals=2; plural=(n!=1);\n"
"X-Poedit-Language: German\n"
"X-Poedit-Country: GERMANY\n"
"X-Generator: Gtranslator 2.91.5\n"
#: ../data/gnome-classic.desktop.in.h:1
#: ../data/gnome-classic.session.desktop.in.in.h:1
msgid "GNOME Classic"
msgstr "GNOME Classic"
#: ../extensions/alternative-status-menu/extension.js:44
msgid "Notifications"
msgstr "Benachrichtigungen"
#: ../data/gnome-classic.desktop.in.h:2
msgid "This session logs you into GNOME Classic"
msgstr "Diese Sitzung meldet Sie in GNOME Classic an"
#: ../extensions/alternative-status-menu/extension.js:52
msgid "Online Accounts"
msgstr "Online-Konten"
#: ../data/gnome-shell-classic.desktop.in.in.h:1
msgid "GNOME Shell Classic"
msgstr "GNOME Shell Classic"
#: ../extensions/alternative-status-menu/extension.js:56
msgid "System Settings"
msgstr "Systemeinstellungen"
#: ../data/gnome-shell-classic.desktop.in.in.h:2
msgid "Window management and application launching"
msgstr "Fensterverwaltung und Anwendungsstart"
#: ../extensions/alternative-status-menu/extension.js:63
msgid "Lock Screen"
msgstr "Bildschirm sperren"
#: ../extensions/alternate-tab/prefs.js:20
msgid "Thumbnail only"
msgstr "Nur Vorschaubild"
#: ../extensions/alternative-status-menu/extension.js:68
msgid "Switch User"
msgstr "Benutzer wechseln"
#: ../extensions/alternate-tab/prefs.js:21
msgid "Application icon only"
msgstr "Nur Anwendungssymbol"
#: ../extensions/alternative-status-menu/extension.js:73
msgid "Log Out..."
msgstr "Abmelden …"
#: ../extensions/alternate-tab/prefs.js:22
msgid "Thumbnail and application icon"
msgstr "Vorschaubild und Anwendungssymbol"
#: ../extensions/alternate-tab/prefs.js:37
msgid "Present windows as"
msgstr "Fenster darstellen als"
#: ../extensions/alternate-tab/prefs.js:62
msgid "Show only windows in the current workspace"
msgstr "Nur Fenster der aktuellen Arbeitsfläche anzeigen"
#. add the new entries
#: ../extensions/alternative-status-menu/extension.js:125
#: ../extensions/alternative-status-menu/extension.js:81
msgid "Suspend"
msgstr "Bereitschaft"
#: ../extensions/alternative-status-menu/extension.js:128
#: ../extensions/alternative-status-menu/extension.js:87
msgid "Hibernate"
msgstr "Ruhezustand"
#: ../extensions/alternative-status-menu/extension.js:131
msgid "Power Off"
#: ../extensions/alternative-status-menu/extension.js:93
msgid "Power Off..."
msgstr "Ausschalten …"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:1
msgid "Enable suspending"
msgstr "Bereitschaft einblenden"
#: ../extensions/alternate-tab/extension.js:50
msgid ""
"This is the first time you use the Alternate Tab extension. \n"
"Please choose your preferred behaviour:\n"
"\n"
"All & Thumbnails:\n"
" This mode presents all applications from all workspaces in one "
"selection \n"
" list. Instead of using the application icon of every window, it uses "
"small \n"
" thumbnails resembling the window itself. \n"
"\n"
"Workspace & Icons:\n"
" This mode let's you switch between the applications of your current \n"
" workspace and gives you additionally the option to switch to the last "
"used \n"
" application of your previous workspace. This is always the last symbol "
"in \n"
" the list and is segregated by a separator/vertical line if available. \n"
" Every window is represented by its application icon. \n"
"\n"
"If you whish to revert to the default behavior for the Alt-Tab switcher, "
"just\n"
"disable the extension from extensions.gnome.org or the Advanced Settings "
"application."
msgstr ""
"Sie verwenden die Erweiterung »Alt-Tab« das erste Mal. \n"
"Bitte wählen Sie das gewünschte Verhalten:\n"
"\n"
"Alle und Vorschaubilder:\n"
" Dieser Modus stellt alle Anwendungen aus allen Arbeitsflächen in einer\n"
" Auswahlliste dar. Anstelle des Anwendungssymbols jedes Fensters werden\n"
" kleine Vorschaubilder dargestellt, die dem Fenster ähnlich sind. \n"
"\n"
"Arbeitsfläche und Symbole:\n"
" Dieser Modus ermöglicht den Wechsel zwischen Anwendungen auf Ihrer \n"
" aktuellen Arbeitsfläche und ermöglicht weiterhin, auf die zuletzt "
"verwendete\n"
" Anwendung der letzten Arbeitsfläche zu wechseln. Sie ist immer das letzte "
"Symbol\n"
" der Liste und ist durch einen Trenner (vertikale Linie) getrennt. \n"
" Jedes Fenster wird durch das entsprechende Anwendungssymbol "
"repräsentiert.\n"
"\n"
"Falls Sie zum Standardverhalten der Alt-Tab-Umschaltung zurückkehren wollen,\n"
"deaktivieren Sie diese Erweiterung in extensions.gnome.org oder verwenden "
"Sie\n"
"die »Erweiterten Einstellungen«."
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:2
msgid "Control the visibility of the Suspend menu item"
msgstr "Die Sichtbarkeit des Menüeintrags »Bereitschaft« festlegen"
#: ../extensions/alternate-tab/extension.js:291
msgid "Alt Tab Behaviour"
msgstr "Verhalten bei Alt-Tab"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:3
msgid "Enable hibernating"
msgstr "Ruhezustand einblenden"
#: ../extensions/alternate-tab/extension.js:307
msgid "All & Thumbnails"
msgstr "Alle und Vorschaubilder"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:4
msgid "Control the visibility of the Hibernate menu item"
msgstr "Die Sichtbarkeit des Menüeintrags »Ruhezustand« festlegen"
#: ../extensions/alternate-tab/extension.js:314
msgid "Workspace & Icons"
msgstr "Arbeitsbereich und Symbole"
#: ../extensions/apps-menu/extension.js:37
msgid "Activities Overview"
msgstr "Aktivitäten-Übersicht"
#: ../extensions/alternate-tab/extension.js:321
msgid "Cancel"
msgstr "Abbrechen"
#: ../extensions/apps-menu/extension.js:95
msgid "Favorites"
msgstr "Favoriten"
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
msgid "Ask the user for a default behaviour if true."
msgstr ""
"Falls wahr, so wird der Benutzer nach dem voreinzustellendem Verhalten "
"gefragt."
#: ../extensions/apps-menu/extension.js:184
msgid "Applications"
msgstr "Anwendungen"
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
msgid "Indicates if Alternate Tab is newly installed"
msgstr "Gibt an, ob die Erweiterung »Alt-Tab« neu installiert wurde"
# Oder müssen die Werte doch übersetzt werden? -ck
# Nein, dconf verhält sich hier nicht anders als gconf. Keinesfalls übersetzen! -mb
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:3
msgid ""
"Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails and "
"workspace_icons."
msgstr ""
"Legt das Verhalten bei Drücken von Alt-Tab fest. Mögliche Werte sind: "
"»native«, »all_thumbnails« und »workspace_icons«."
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:4
msgid "The alt tab behaviour."
msgstr "Das Verhalten bei Eingabe von Alt-Tab."
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:1
msgid "Application and workspace list"
msgstr "Anwendungs- und Arbeitsflächenliste"
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
msgid ""
"A list of strings, each containing an application id (desktop file name), "
"followed by a colon and the workspace number"
msgstr ""
"Eine Liste aus Zeichenketten, wovon jede eine Anwendungskennung (*.desktop-"
"Datei) enthält, gefolgt von einem Doppelpunkt und der Nummer der "
"Arbeitsfläche"
"Datei) enthält, gefolgt von einem Doppelpunkt und der Nummer der Arbeitsfläche"
#: ../extensions/auto-move-windows/prefs.js:55
msgid "Application"
msgstr "Anwendung"
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
msgid "Application and workspace list"
msgstr "Anwendungs- und Arbeitsflächenliste"
#: ../extensions/auto-move-windows/prefs.js:64
#: ../extensions/auto-move-windows/prefs.js:106
msgid "Workspace"
msgstr "Arbeitsfläche "
#: ../extensions/dock/extension.js:484
msgid "Drag here to add favorites"
msgstr "Hierher ziehen, um zu Favoriten hinzuzufügen"
#: ../extensions/auto-move-windows/prefs.js:80
msgid "Add rule"
msgstr "Regel hinzufügen"
#: ../extensions/dock/extension.js:817
msgid "New Window"
msgstr "Neues Fenster"
#: ../extensions/auto-move-windows/prefs.js:94
msgid "Create new matching rule"
msgstr "Neue Übereinstimmungsregel erstellen"
#: ../extensions/dock/extension.js:819
msgid "Quit Application"
msgstr "Anwendung beenden"
#: ../extensions/auto-move-windows/prefs.js:98
msgid "Add"
msgstr "Hinzufügen"
#: ../extensions/dock/extension.js:824
msgid "Remove from Favorites"
msgstr "Aus Favoriten entfernen"
#: ../extensions/drive-menu/extension.js:72
#, c-format
msgid "Ejecting drive '%s' failed:"
msgstr "Auswerfen von Laufwerk »%s« schlug fehl:"
#: ../extensions/dock/extension.js:825
msgid "Add to Favorites"
msgstr "Zu Favoriten hinzufügen"
#: ../extensions/drive-menu/extension.js:89
msgid "Removable devices"
msgstr "Wechseldatenträger"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:1
msgid "Autohide duration"
msgstr "Dauer automatisch verbergen"
#: ../extensions/drive-menu/extension.js:106
msgid "Open File"
msgstr "Datei öffnen"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:2
msgid "Autohide effect"
msgstr "Effekt automatisch verbergen"
#: ../extensions/example/extension.js:17
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:3
msgid "Enable/disable autohide"
msgstr "Automatisches Verbergen aktivieren/deaktivieren"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:4
msgid "Icon size"
msgstr "Symbolgröße"
# Dock = das Dock ? -ck
# Sofern es sich nicht um das Original-Dash handelt, ja. -mb
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:5
msgid "Position of the dock"
msgstr "Position des Docks"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:6
msgid "Sets icon size of the dock."
msgstr "Legt die Symbolgröße für das Dock fest"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:7
msgid ""
"Sets the effect of the hide dock. Allowed values are 'resize' or 'rescale'"
msgstr ""
"Legt den Effekt für das versteckte Dock fest. Mögliche Werte sind »resize« "
"und »rescale«"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:8
msgid ""
"Sets the position of the dock in the screen. Allowed values are 'right' or "
"'left'"
msgstr ""
"Legt die Position des Docks auf dem Bildschirm fest. Mögliche Werte sind "
"»right« und »left«"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:9
msgid "Sets the time duration of the autohide effect."
msgstr "Legt die Effektdauer für automatisches Verbergen fest."
#: ../extensions/example/extension.js:11
msgid "Hello, world!"
msgstr "Hallo, Welt!"
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:1
msgid "Alternative greeting text."
msgstr "Alternative Begrüßungstext."
#: ../extensions/gajim/extension.js:227
#, c-format
msgid "%s is away."
msgstr "%s ist abwesend."
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:2
msgid ""
"If not empty, it contains the text that will be shown when clicking on the "
"panel."
msgstr ""
"Falls nicht leer, ist dies der Text, der beim Anklicken des Panels angezeigt "
"wird."
#: ../extensions/gajim/extension.js:230
#, c-format
msgid "%s is offline."
msgstr "%s ist abgemeldet."
#. TRANSLATORS: Example is the name of the extension, should not be
#. translated
#: ../extensions/example/prefs.js:30
msgid ""
"Example aims to show how to build well behaved extensions for the Shell and "
"as such it has little functionality on its own.\n"
"Nevertheless it's possible to customize the greeting message."
msgstr ""
"Das Beispiel soll zeigen, wie sich korrekt verhaltende Erweiterungen für die "
"Shell erstellt werden. Es enthält grundlegende Funktionalität.\n"
"Es ist möglich, die Begrüßungsnachricht zu ändern."
#: ../extensions/gajim/extension.js:233
#, c-format
msgid "%s is online."
msgstr "%s ist angemeldet."
#: ../extensions/example/prefs.js:36
msgid "Message:"
msgstr "Nachricht:"
#: ../extensions/gajim/extension.js:236
#, c-format
msgid "%s is busy."
msgstr "%s ist beschäftigt."
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:1
msgid "Use more screen for windows"
msgstr "Mehr Bildschirmbereich für Fenster verwenden"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:2
msgid ""
"Try to use more screen for placing window thumbnails by adapting to screen "
"aspect ratio, and consolidating them further to reduce the bounding box. "
"This setting applies only with the natural placement strategy."
msgstr ""
"Versuchen, mehr Bildschirmfläche zum Platzieren der Fenstervorschaubilder zu "
"verwenden, indem das Bildschirmseitenverhältnis berücksichtigt wird und "
"diese stärker zusammengelegt werden, um den umgebenden Rahmen zu "
"verkleinern. Diese Einstellung betrifft nur den natürlichen "
"Platzierungsalgorithmus."
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
msgid "Place window captions on top"
msgstr "Fensterbeschriftungen oben platzieren"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
msgid ""
"If true, place window captions on top the respective thumbnail, overriding "
"shell default of placing it at the bottom. Changing this setting requires "
@@ -209,143 +256,75 @@ msgstr ""
"Vorschaubild platziert und damit die Voreinstellung der Shell übergangen. "
"Eine Änderungseinstellung tritt erst mit einem Neustart der Shell in Kraft."
#: ../extensions/places-menu/extension.js:77
msgid "Places"
msgstr "Orte"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:2
msgid "Place window captions on top"
msgstr "Fensterbeschriftungen oben platzieren"
#: ../extensions/places-menu/placeDisplay.js:56
#, c-format
msgid "Failed to launch \"%s\""
msgstr "Starten von »%s« fehlgeschlagen"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
msgid ""
"The algorithm used to layout thumbnails in the overview. 'grid' to use the "
"default grid based algorithm, 'natural' to use another one that reflects more "
"the position and size of the actual window"
msgstr ""
"Der Algorithmus zum Anordnen der Vorschaubilder in der Übersicht. »grid« "
"verwendet den voreingestellten Raster-basierten Algorithmus, »natural« setzt "
"einen anderen ein, der mehr die tatsächliche Position und Größe des Fensters "
"berücksichtigt."
#: ../extensions/places-menu/placeDisplay.js:98
#: ../extensions/places-menu/placeDisplay.js:121
msgid "Computer"
msgstr "Rechner"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
msgid ""
"Try to use more screen for placing window thumbnails by adapting to screen "
"aspect ratio, and consolidating them further to reduce the bounding box. This "
"setting applies only with the natural placement strategy."
msgstr ""
"Versuchen, mehr Bildschirmfläche zum Platzieren der Fenstervorschaubilder zu "
"verwenden, indem das Bildschirmseitenverhältnis berücksichtigt wird und diese "
"stärker zusammengelegt werden, um den umgebenden Rahmen zu verkleinern. Diese "
"Einstellung betrifft nur den natürlichen Platzierungsalgorithmus."
#: ../extensions/places-menu/placeDisplay.js:199
msgid "Home"
msgstr "Persönlicher Ordner"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:5
msgid "Use more screen for windows"
msgstr "Mehr Bildschirmbereich für Fenster verwenden"
#: ../extensions/places-menu/placeDisplay.js:286
msgid "Browse Network"
msgstr "Netzwerk durchsuchen"
#: ../extensions/systemMonitor/extension.js:213
msgid "CPU"
msgstr "CPU"
#: ../extensions/systemMonitor/extension.js:266
msgid "Memory"
msgstr "Speicher"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:6
msgid "Window placement strategy"
msgstr "Regeln zur Fensterplatzierung"
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:1
msgid "Theme name"
msgstr "Themenname"
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr ""
"Der Name des Themas, welches aus ~/.themes/name/gnome-shell geladen werden "
"soll"
#: ../extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml.in.h:1
msgid "When to group windows"
msgstr "Fenstergruppierung"
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
msgid "Theme name"
msgstr "Themenname"
#: ../extensions/window-list/org.gnome.shell.extensions.window-list.gschema.xml.in.h:2
msgid ""
"Decides when to group windows from the same application on the window list. "
"Possible values are \"never\" and \"always\"."
msgstr ""
"Legt fest, ob Fenster der gleichen Anwendung in der Fensterliste gruppiert "
"werden sollen. Mögliche Werte sind »never« (nie) und »always« (immer)."
#: ../extensions/window-list/prefs.js:30
msgid "Window Grouping"
msgstr "Fenstergruppierung"
#: ../extensions/window-list/prefs.js:49
msgid "Never group windows"
msgstr "Fenster niemals gruppieren"
#: ../extensions/window-list/prefs.js:50
msgid "Always group windows"
msgstr "Fenster immer gruppieren"
#: ../extensions/workspace-indicator/extension.js:30
msgid "Workspace Indicator"
msgstr "Arbeitsflächenindikator"
#: ../extensions/workspace-indicator/prefs.js:141
msgid "Workspace names:"
msgstr "Namen der Arbeitsflächen:"
#: ../extensions/workspace-indicator/prefs.js:152
msgid "Name"
msgstr "Name"
#: ../extensions/workspace-indicator/prefs.js:186
#, c-format
msgid "Workspace %d"
msgstr "Arbeitsfläche %d"
#: ../extensions/xrandr-indicator/extension.js:30
#: ../extensions/xrandr-indicator/extension.js:26
msgid "Normal"
msgstr "Normal"
#: ../extensions/xrandr-indicator/extension.js:31
#: ../extensions/xrandr-indicator/extension.js:27
msgid "Left"
msgstr "Links"
#: ../extensions/xrandr-indicator/extension.js:32
#: ../extensions/xrandr-indicator/extension.js:28
msgid "Right"
msgstr "Rechts"
#: ../extensions/xrandr-indicator/extension.js:33
#: ../extensions/xrandr-indicator/extension.js:29
msgid "Upside-down"
msgstr "Kopfüber"
#: ../extensions/xrandr-indicator/extension.js:50
msgid "Display"
msgstr "Anzeige"
#: ../extensions/xrandr-indicator/extension.js:78
msgid "Configure display settings..."
msgstr "Bildschirmeinstellungen festlegen …"
#: ../extensions/xrandr-indicator/extension.js:80
msgid "Display Settings"
msgstr "Bildschirmeinstellungen"
#~ msgid "Native"
#~ msgstr "Nativ"
#~ msgid "The application icon mode."
#~ msgstr "Der Modus des Anwendungssymbols."
#~ msgid "Available"
#~ msgstr "Verfügbar"
#~ msgid ""
#~ "Configures how the windows are shown in the switcher. Valid possibilities "
#~ "are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
#~ "only' (shows only the application icon) or 'both'."
#~ msgstr ""
#~ "Legt fest, wie die Fenster im Fensterumschalter angezeigt werden. Gültige "
#~ "Werte sind »thumbnail-only« (zeigt ein Vorschaubild des Fensters), »app-"
#~ "icon-only« (zeigt das Anwendungssymbol) oder »both« (beides)."
#~ msgid "Devices"
#~ msgstr "Geräte"
#~ msgid "Bookmarks"
#~ msgstr "Lesezeichen"
#~ msgid "Network"
#~ msgstr "Netzwerk"
#~ msgid "File System"
#~ msgstr "Dateisystem"
#~ msgid "Drag here to add favorites"
#~ msgstr "Hierher ziehen, um zu Favoriten hinzuzufügen"
#~ msgid "New Window"
#~ msgstr "Neues Fenster"
#~ msgid "Quit Application"
#~ msgstr "Anwendung beenden"
#~ msgid "Remove from Favorites"
#~ msgstr "Aus Favoriten entfernen"
#~ msgid "Busy"
#~ msgstr "Beschäftigt"

611
po/el.po
View File

@@ -9,85 +9,145 @@ msgstr ""
"Project-Id-Version: gnome-shell-extensions master\n"
"Report-Msgid-Bugs-To: http://bugzilla.gnome.org/enter_bug.cgi?product=gnome-"
"shell&keywords=I18N+L10N&component=extensions\n"
"POT-Creation-Date: 2012-10-08 17:42+0000\n"
"PO-Revision-Date: 2012-10-11 17:16+0200\n"
"Last-Translator: Tom Tryfonidis <tomtryf@gmail.com>\n"
"POT-Creation-Date: 2011-09-17 15:20+0000\n"
"PO-Revision-Date: 2011-09-18 14:34+0300\n"
"Last-Translator: Ιωάννης Ζαμπούκας <ioza1964@yahoo.gr>\n"
"Language-Team: Greek <team@gnome.gr>\n"
"Language: el\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Content-Transfer-Encoding: 8bits\n"
"Plural-Forms: nplurals=2; plural=(n != 1)\n"
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
msgid "The application icon mode."
msgstr "Η λειτουργία εικονιδίου της εφαρμογής"
#: ../extensions/alternative-status-menu/extension.js:44
msgid "Notifications"
msgstr "Ειδοποιήσεις"
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
msgid ""
"Configures how the windows are shown in the switcher. Valid possibilities "
"are 'thumbnail-only' (shows a thumbnail of the window), 'app-icon-"
"only' (shows only the application icon) or 'both'."
msgstr ""
"Διαμορφώνει πως τα παράθυρα θα εμφανίζονται στν εναλλαγή των παραθύρων. "
"Έγκυρες ρυθμίσεις είναι 'thumbnail-only' (εμφανίζει μια μικρογραφία του "
"παραθύρου), 'app-icon-only' (εμφανίζει μόνο το εικονίδιο της εφαρμογής) ή "
"'both'."
#: ../extensions/alternative-status-menu/extension.js:52
msgid "Online Accounts"
msgstr "Λογαριασμοί διαδικτύου"
#: ../extensions/alternate-tab/prefs.js:26
msgid "Thumbnail only"
msgstr "Μόνο μικρογραφίες"
#: ../extensions/alternative-status-menu/extension.js:56
msgid "System Settings"
msgstr "Ρυθμίσεις συστήματος"
#: ../extensions/alternate-tab/prefs.js:27
msgid "Application icon only"
msgstr "Μόνο εικονίδια εφαρμογών"
#: ../extensions/alternative-status-menu/extension.js:63
msgid "Lock Screen"
msgstr "Κλείδωμα οθόνης"
#: ../extensions/alternate-tab/prefs.js:28
msgid "Thumbnail and application icon"
msgstr "Εικονίδια μικρογραφιών και εφαρμογών"
#: ../extensions/alternative-status-menu/extension.js:68
msgid "Switch User"
msgstr "Αλλαγή χρήστη"
#: ../extensions/alternate-tab/prefs.js:43
msgid "Present windows as"
msgstr "Παρουσίαση παραθύρων ως"
#: ../extensions/alternative-status-menu/extension.js:73
msgid "Log Out..."
msgstr "Αποσύνδεση…"
#: ../extensions/alternate-tab/prefs.js:68
msgid "Show only windows in the current workspace"
msgstr "Προβολή των παραθύρων μόνο στον τρέχων χώρο εργασίας"
#. add the new entries
#: ../extensions/alternative-status-menu/extension.js:86
#: ../extensions/alternative-status-menu/extension.js:81
msgid "Suspend"
msgstr "Αναστολή"
#: ../extensions/alternative-status-menu/extension.js:91
#: ../extensions/alternative-status-menu/extension.js:87
msgid "Hibernate"
msgstr "Αδρανοποίηση"
#: ../extensions/alternative-status-menu/extension.js:96
msgid "Power Off"
msgstr "Τερματισμός"
#: ../extensions/alternative-status-menu/extension.js:93
msgid "Power Off..."
msgstr "Σβήσιμο…"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:1
msgid "Enable suspending"
msgstr "Ενεργοποίηση αναστολής"
#: ../extensions/alternate-tab/extension.js:44
msgid ""
"This is the first time you use the Alternate Tab extension. \n"
"Please choose your preferred behaviour:\n"
"\n"
"All & Thumbnails:\n"
" This mode presents all applications from all workspaces in one "
"selection \n"
" list. Instead of using the application icon of every window, it uses "
"small \n"
" thumbnails resembling the window itself. \n"
"\n"
"Workspace & Icons:\n"
" This mode let's you switch between the applications of your current \n"
" workspace and gives you additionally the option to switch to the last "
"used \n"
" application of your previous workspace. This is always the last symbol "
"in \n"
" the list and is segregated by a separator/vertical line if available. \n"
" Every window is represented by its application icon. \n"
"\n"
"Native:\n"
" This mode is the native GNOME 3 behaviour or in other words: Clicking \n"
" native switches the Alternate Tab extension off. \n"
msgstr ""
"Αυτή είναι η πρώτη φορά που χρησιμοποιήσατε την εναλλακτική επέκταση "
"στηλοθέτη. \n"
"Παρακαλούμε επιλέξτε την συμπεριφορά που επιθυμείτε εσείς:\n"
"\n"
"Όλα & μικρογραφίες:\n"
" Αυτή η κατάσταση εμφανίζει όλες τις εφαρμογές από όλους τους χώρους "
"εργασίας σε μια επιλογή \n"
" λίστα. Αντί να χρησιμοποιεί το εικονίδιο της εφαρμογής από κάθε "
"παράθυρο, χρησιμοποιεί μικρές \n"
" μικρογραφίες που μοιάζουν με το ίδιο το παράθυρο. \n"
"\n"
"Χώρος εργασίας & εικονίδια:\n"
" Αυτή η λειτουργία σας επιτρέπει να κάνετε εναλλαγή μεταξύ των εφαρμογών "
"του τρέχοντος \n"
" χώρου εργασίας σας και σας δίνει επιπλέον τη δυνατότητα να μεταβείτε "
"στην τελευταία χρησιμοποιημένη \n"
" εφαρμογή του προηγούμενου χώρου εργασίας σας. Αυτό είναι πάντα το "
"τελευταίο σύμβολο στη \n"
" λίστα και είναι απομονωμένο από ένα διαχωριστικό/κάθετη γραμμή, εάν "
"υπάρχει. \n"
" Κάθε παράθυρο αντιπροσωπεύεται από εικονίδιο της εφαρμογής της. \n"
"\n"
"Μητρική:\n"
" Αυτή η λειτουργία είναι η μητρική συμπεριφορά του GNOME 3 ή με άλλα "
"λόγια: Αν κάνετε κλικ \n"
" στο μητρική θέτει εκτός λειτουργίας την εναλλακτική επέκταση "
"στηλοθέτη. \n"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:2
msgid "Control the visibility of the Suspend menu item"
msgstr "Ελέγχει την ορατότητα του αντικειμένου Αναστολη"
#: ../extensions/alternate-tab/extension.js:269
msgid "Alt Tab Behaviour"
msgstr "Συμπεριφορά Alt Tab"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:3
msgid "Enable hibernating"
msgstr "Ενεργοποίηση αδρανοποίησης"
#: ../extensions/alternate-tab/extension.js:285
msgid "All & Thumbnails"
msgstr "Όλα & μικρογραφίες"
#: ../extensions/alternative-status-menu/org.gnome.shell.extensions.alternative-status-menu.gschema.xml.in.h:4
msgid "Control the visibility of the Hibernate menu item"
msgstr "Ελέγχει την ορατότητα του αντικειμένου Αδρανοποίηση"
#: ../extensions/alternate-tab/extension.js:292
msgid "Workspace & Icons"
msgstr "Χώρος εργασίας & εικονίδια"
#: ../extensions/alternate-tab/extension.js:299
msgid "Native"
msgstr "Εγγενή"
#: ../extensions/alternate-tab/extension.js:306
msgid "Cancel"
msgstr "Ακύρωση"
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:1
msgid "Ask the user for a default behaviour if true."
msgstr "Ρωτήστε τον χρήστη για μια προεπιλεγμένη συμπεριφορα εαν αληθεύει."
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:2
msgid "Indicates if Alternate Tab is newly installed"
msgstr "Υποδεικνύει αν ο εναλλακτικός στηλοθέτης είναι νεοεισαχθείς"
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:3
msgid ""
"Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails and "
"workspace_icons."
msgstr ""
"Ρυθμίζει την συμπεριφορά του Alt Tab. Πιθανές τιμές είναι οι εξής: μητρική, "
"όλες_μικρογραφίες και εικονίδια_χώρου εργασίας."
#: ../extensions/alternate-tab/org.gnome.shell.extensions.alternate-tab.gschema.xml.in.h:4
msgid "The alt tab behaviour."
msgstr "Η συμπεριφορά alt tab."
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:1
msgid "Application and workspace list"
msgstr "Λίστα εφαρμογών και χώρου εργασίας"
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
msgid ""
"A list of strings, each containing an application id (desktop file name), "
"followed by a colon and the workspace number"
@@ -96,190 +156,98 @@ msgstr ""
"(όνομα αρχείου επιφάνειας εργασίας), ακολουθούμενη από άνω και κάτω τελεία "
"και τον αριθμό του χώρου εργασίας"
#: ../extensions/auto-move-windows/prefs.js:55
msgid "Application"
msgstr "Εφαρμογή"
#: ../extensions/auto-move-windows/org.gnome.shell.extensions.auto-move-windows.gschema.xml.in.h:2
msgid "Application and workspace list"
msgstr "Λίστα εφαρμογής και χώρου εργασίας"
#: ../extensions/auto-move-windows/prefs.js:64
#: ../extensions/auto-move-windows/prefs.js:106
msgid "Workspace"
msgstr "Χώρος εργασίας"
#: ../extensions/auto-move-windows/prefs.js:80
msgid "Add rule"
msgstr "Προσθήκη κανόνα"
#: ../extensions/auto-move-windows/prefs.js:94
msgid "Create new matching rule"
msgstr "Δημιουργία νέου κανόνα που ταιριάζει"
#: ../extensions/auto-move-windows/prefs.js:98
msgid "Add"
msgstr "Προσθήκη"
#: ../extensions/dock/extension.js:600
#: ../extensions/dock/extension.js:486
msgid "Drag here to add favorites"
msgstr "Σύρετε εδώ για να προσθέσετε αγαπημένα"
#: ../extensions/dock/extension.js:926
#: ../extensions/dock/extension.js:820
msgid "New Window"
msgstr "Νέο παράθυρο"
#: ../extensions/dock/extension.js:928
#: ../extensions/dock/extension.js:822
msgid "Quit Application"
msgstr "Εγκατάλειψη εφαρμογής"
#: ../extensions/dock/extension.js:933
#: ../extensions/dock/extension.js:827
msgid "Remove from Favorites"
msgstr "Απομάκρυνση από τα αγαπημένα"
#: ../extensions/dock/extension.js:934
#: ../extensions/dock/extension.js:828
msgid "Add to Favorites"
msgstr "Προσθήκη στα αγαπημένα"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:1
msgid "Autohide duration"
msgstr "Διάρκεια αυτόματης απόκρυψης"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:2
msgid "Autohide effect"
msgstr "Εφέ αυτόματης απόκρυψης"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:3
msgid "Enable/disable autohide"
msgstr "Ενεργοποίηση/απενεργοποίηση αυτόματης απόκρυψης"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:4
msgid "Icon size"
msgstr "Μέγεθος εικονιδίου"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:5
msgid "Position of the dock"
msgstr "Θέση υποδοχέα"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:2
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:6
msgid "Sets icon size of the dock."
msgstr "Ρυθμίζει το μέγεθος εικόνας του υποδοχέα."
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:7
msgid ""
"Sets the effect of the hide dock. Allowed values are 'resize' or 'rescale'"
msgstr ""
"Ρυθμίζειτην επίδραση κρυψίματος του υποδοχέα. Επιτρεπόμενες τιμές είναι "
"resize («αλλαγή μεγέθους») ή rescale («αλλαγή κλίμακας»)"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:8
msgid ""
"Sets the position of the dock in the screen. Allowed values are 'right' or "
"'left'"
msgstr ""
"Ρυθμίζει τη θέση του υποδοχέα στην οθόνη. Επιτρεπόμενες τιμές είναι right "
"(«δεξιά») ή right («αριστερά»)"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:3
msgid "Icon size"
msgstr "Μέγεθος εικονιδίου"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:4
msgid "Sets icon size of the dock."
msgstr "Ρυθμίζει το μέγεθος εικόνας του υποδοχέα."
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:5
msgid "Enable/disable autohide"
msgstr "Ενεργοποίηση/απενεργοποίηση αυτόματης απόκρυψης"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:6
msgid "Autohide effect"
msgstr "Εφέ αυτόματης απόκρυψης"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:7
msgid ""
"Sets the effect of the hide dock. Allowed values are 'resize', 'rescale' and "
"'move'"
msgstr ""
"Ρυθμίζει το εφέ κρυψίματος του υποδοχέα. Επιτρεπόμενες τιμές είναι 'resize', "
"'rescale' και 'move'"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:8
msgid "Autohide duration"
msgstr "Διάρκεια αυτόματης απόκρυψης"
"Ρυθμίζει τη θέση του υποδοχέα στην οθόνη. Επιτρεπόμενες τιμές είναι right («δεξιά») "
"ή right («αριστερά»)"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:9
msgid "Sets the time duration of the autohide effect."
msgstr "Ρυθμίζει την χρονική διάρκεια του εφέ αυτόματης απόκρυψης."
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:10
msgid "Monitor"
msgstr "Οθόνη"
#: ../extensions/dock/org.gnome.shell.extensions.dock.gschema.xml.in.h:11
msgid ""
"Sets monitor to display dock in. The default value (-1) is the primary "
"monitor."
msgstr ""
"Ορίζει την οθόνη για την εμφάνιση του ταμπλό. Η προεπιλεγμένη τιμή (-1) "
"είναι η κύρια οθόνη."
#: ../extensions/drive-menu/extension.js:72
#, c-format
msgid "Ejecting drive '%s' failed:"
msgstr "Απέτυχε η εξαγωγή του δίσκου '%s':"
#: ../extensions/drive-menu/extension.js:89
msgid "Removable devices"
msgstr "Αφαιρούμενες συσκευές"
#: ../extensions/drive-menu/extension.js:106
#| msgid "Open file manager"
msgid "Open File"
msgstr "Άνοιγμα αρχείου"
#: ../extensions/example/extension.js:17
#: ../extensions/example/extension.js:11
msgid "Hello, world!"
msgstr "Γεια σου, κόσμε!"
msgstr "Καλημέρα, Κόσμε!"
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:1
msgid "Alternative greeting text."
msgstr "Εναλλακτικό κείμενο χαιρετισμού"
#: ../extensions/example/org.gnome.shell.extensions.example.gschema.xml.in.h:2
msgid ""
"If not empty, it contains the text that will be shown when clicking on the "
"panel."
msgstr ""
"Αν δεν είναι κενό, περιέχει το κείμενο που θα εμφανιστεί όταν θα κάνετε κλικ "
"στον πίνακα εφαρμογών."
#. TRANSLATORS: Example is the name of the extension, should not be
#. translated
#: ../extensions/example/prefs.js:30
msgid ""
"Example aims to show how to build well behaved extensions for the Shell and "
"as such it has little functionality on its own.\n"
"Nevertheless it's possible to customize the greeting message."
msgstr ""
"Το παράδειγμα στοχεύει να δείξει πώς να δημιουργήσουμε επεκτάσεις για το "
"κέλυφος που συμπεριφέρονται σωστά και ως αυτού έχει μικρή λειτουργικότητα "
"από μόνο του.\n"
"Παρ' όλα αυτά είναι δυνατό να προσαρμόσετε το μήνυμα χαιρετισμού."
#: ../extensions/example/prefs.js:36
msgid "Message:"
msgstr "Μήνυμα:"
#: ../extensions/gajim/extension.js:226
#: ../extensions/gajim/extension.js:227
#, c-format
msgid "%s is away."
msgstr "%s είναι εκτός."
#: ../extensions/gajim/extension.js:229
#: ../extensions/gajim/extension.js:230
#, c-format
msgid "%s is offline."
msgstr "%s είναι εκτός σύνδεσης."
#: ../extensions/gajim/extension.js:232
#: ../extensions/gajim/extension.js:233
#, c-format
msgid "%s is online."
msgstr "%s είναι σε σύνδεση."
#: ../extensions/gajim/extension.js:235
#: ../extensions/gajim/extension.js:236
#, c-format
msgid "%s is busy."
msgstr "%s είναι απασχολημένος/η."
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:1
msgid "Use more screen for windows"
msgstr "Χρησιμοποιήστε περισσότερη οθόνη για τα παράθυρα"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:2
msgid ""
"Try to use more screen for placing window thumbnails by adapting to screen "
"aspect ratio, and consolidating them further to reduce the bounding box. "
"This setting applies only with the natural placement strategy."
msgstr ""
"Προσπαθήστε να χρησιμοποιήσετε περισσότερη οθόνη για την τοποθέτηση "
"μικρογραφιών παραθύρου προσαρμόζοντας τον λόγο διαστάσεων οθόνης, και "
"εδραιώνοντας τους περαιτέρω για να μειώσετε το πλαίσιο οριοθέτησης. Αυτή η "
"ρύθμιση ισχύει μόνο με την στρατηγική φυσικής τοποθέτησης."
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
msgid "Place window captions on top"
msgstr "Τοποθετήστε τίτλους παράθυρου στην κορυφή"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
msgid ""
"If true, place window captions on top the respective thumbnail, overriding "
"shell default of placing it at the bottom. Changing this setting requires "
@@ -290,247 +258,66 @@ msgstr ""
"το τοποθετεί στο κάτω μέρος. Η αλλαγή αυτής της ρύθμισης απαιτεί "
"επανεκκίνηση του κέλυφους για να έχει κάποιο αποτέλεσμα."
#: ../extensions/places-menu/extension.js:46
msgid "Places"
msgstr "Τοποθεσίες"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:2
msgid "Place window captions on top"
msgstr "Τοποθετήστε τίτλους παράθυρου στην κορυφή"
#: ../extensions/places-menu/extension.js:47
msgid "Devices"
msgstr "Συσκευές"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:3
msgid ""
"The algorithm used to layout thumbnails in the overview. 'grid' to use the "
"default grid based algorithm, 'natural' to use another one that reflects "
"more the position and size of the actual window"
msgstr ""
"Ο αλγόριθμος που χρησιμοποιείται για την διάταξη μικρογραφιών στην "
"επισκόπηση. grid («πλέγμα») να χρησιμοποιήσει τον αλγόριθμο που βασίζετε στο "
"προεπιλεγμένο πλέγμα, natural («φυσικό») να χρησιμοποιήσει ένα άλλο που αντανακλά "
"περισσότερο τη θέση και το μέγεθος της πραγματικού παράθυρου"
#: ../extensions/places-menu/extension.js:48
msgid "Bookmarks"
msgstr "Σελιδοδείκτες"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:4
msgid ""
"Try to use more screen for placing window thumbnails by adapting to screen "
"aspect ratio, and consolidating them further to reduce the bounding box. "
"This setting applies only with the natural placement strategy."
msgstr ""
"Προσπαθήστε να χρησιμοποιήσετε περισσότερη οθόνη για την τοποθέτηση "
"μικρογραφιών παραθύρου προσαρμόζοντας τον λόγο διαστάσεων οθόνης, και "
"εδραιώνοντας τους περαιτέρω για να μειώσετε το πλαίσιο οριοθέτησης. Αυτή η "
"ρύθμιση ισχύει μόνο με την στρατηγική φυσικής τοποθέτησης."
#: ../extensions/places-menu/extension.js:49
msgid "Network"
msgstr "Δίκτυο"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:5
msgid "Use more screen for windows"
msgstr "Χρησιμοποιήστε περισσότερη οθόνη για τα παράθυρα"
#: ../extensions/places-menu/placeDisplay.js:48
#, c-format
msgid "Failed to launch \"%s\""
msgstr "Αποτυχία εκκίνησης \"%s\""
#: ../extensions/places-menu/placeDisplay.js:121
msgid "Home"
msgstr "Προσωπικός φάκελος"
#: ../extensions/places-menu/placeDisplay.js:184
msgid "File System"
msgstr "Σύστημα αρχείων"
#: ../extensions/places-menu/placeDisplay.js:188
msgid "Browse network"
msgstr "Περιήγηση δικτύου"
#: ../extensions/systemMonitor/extension.js:213
msgid "CPU"
msgstr "CPU"
#: ../extensions/systemMonitor/extension.js:266
msgid "Memory"
msgstr "Μνήμη"
#: ../extensions/native-window-placement/org.gnome.shell.extensions.native-window-placement.gschema.xml.in.h:6
msgid "Window placement strategy"
msgstr "Στρατηγική τοποθέτησης παραθύρου"
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:1
msgid "Theme name"
msgstr "Όνομα θέματος"
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
msgid "The name of the theme, to be loaded from ~/.themes/name/gnome-shell"
msgstr ""
"Το όνομα του θέματος, για να φορτωθεί από το αρχείο ~ / .themes / name / "
"gnome-shell"
#: ../extensions/workspace-indicator/extension.js:30
msgid "Workspace Indicator"
msgstr "Δείκτης χώρου εργασίας"
#: ../extensions/user-theme/org.gnome.shell.extensions.user-theme.gschema.xml.in.h:2
msgid "Theme name"
msgstr "Όνομα θέματος"
#: ../extensions/workspace-indicator/prefs.js:141
msgid "Workspace names:"
msgstr "Ονόματα χώρων εργασίας:"
#: ../extensions/workspace-indicator/prefs.js:152
msgid "Name"
msgstr "Όνομα"
#: ../extensions/workspace-indicator/prefs.js:186
#, c-format
msgid "Workspace %d"
msgstr "Χώρος εργασίας %d"
#: ../extensions/xrandr-indicator/extension.js:30
#: ../extensions/xrandr-indicator/extension.js:26
msgid "Normal"
msgstr "Κανονικό"
#: ../extensions/xrandr-indicator/extension.js:31
#: ../extensions/xrandr-indicator/extension.js:27
msgid "Left"
msgstr "Αριστερά"
#: ../extensions/xrandr-indicator/extension.js:32
#: ../extensions/xrandr-indicator/extension.js:28
msgid "Right"
msgstr "Δεξιά"
#: ../extensions/xrandr-indicator/extension.js:33
#: ../extensions/xrandr-indicator/extension.js:29
msgid "Upside-down"
msgstr "Αναποδογυρισμένο"
#: ../extensions/xrandr-indicator/extension.js:50
msgid "Display"
msgstr "Οθόνη"
#: ../extensions/xrandr-indicator/extension.js:80
msgid "Display Settings"
msgstr "Ρυθμίσεις οθόνης"
#~ msgid "The alt tab behaviour."
#~ msgstr "Η συμπεριφορά alt tab."
#~| msgid ""
#~| "Sets the Alt-Tab behaviour. Possible values are: native, all_thumbnails "
#~| "and workspace_icons."
#~ msgid ""
#~ "Sets the Alt-Tab behaviour. Possible values are: all_thumbnails and "
#~ "workspace_icons. See the configuration dialogs for details."
#~ msgstr ""
#~ "Ρυθμίζει την συμπεριφορά του Alt Tab. Πιθανές τιμές είναι οι εξής: "
#~ "όλες_μικρογραφίες (all_thumbnails) και εικονίδια_χώρου εργασίας "
#~ "(workspace_icons). Δείτε τις ρυθμίσεις διαλόγου για λεπτομέρειες."
#~ msgid ""
#~ "This mode presents all applications from all workspaces in one selection "
#~ "list. Instead of using the application icon of every window, it uses "
#~ "small thumbnails resembling the window itself."
#~ msgstr ""
#~ "Αυτή η κατάσταση εμφανίζει όλες τις εφαρμογές απ' όλους τους χώρους "
#~ "εργασίας σε μια λίστα επιλογής. Αντί να χρησιμοποιήσει το εικονίδιο της "
#~ "εφαρμογής για κάθε παράθυρο, χρησιμοποιεί μικρογραφίες που μοιάζουν με το "
#~ "ίδιο το παράθυρο."
#~ msgid "Workspace & Icons"
#~ msgstr "Χώρος εργασίας & εικονίδια"
#~ msgid ""
#~ "This mode let's you switch between the applications of your current "
#~ "workspace and gives you additionally the option to switch to the last "
#~ "used application of your previous workspace. This is always the last "
#~ "symbol in the list and is segregated by a separator/vertical line if "
#~ "available. \n"
#~ "Every window is represented by its application icon."
#~ msgstr ""
#~ "Αυτή η κατάσταση σας επιτρέπει την εναλλαγή μεταξύ των εφαρμογών του "
#~ "τωρινού χώρου εργασίας και σας δίνει επιπλέον την επιλογή να μεταβείτε "
#~ "στην τελευταία χρησιμοποιημένη εφαρμογή του προηγούμενου χώρου εργασίας "
#~ "σας. Αυτό είναι πάντα το τελευταίο σύμβολο στη λιστα και διαχωρίζεται από "
#~ "μια κάθετη γραμμή αν είναι διαθέσιμη. \n"
#~ "Κάθε παράθυρο αντιπροσωπεύεται από το εικονίδιο της εφαρμογής του."
#~ msgid "Move current selection to front before closing the popup"
#~ msgstr ""
#~ "Μετακινήστε τη τωρινή επιλογή προς τα εμπρός πριν το κλείσιμο του "
#~ "αναδυόμενου"
#, fuzzy
#~ msgid ""
#~ "The Alternate Tab can be used in different modes, that affect the way "
#~ "windows are chosen and presented."
#~ msgstr ""
#~ "Το Alternate Tab μπορεί να χρησιμοποιηθεί σε διαφορετικές καταστάσεις, οι "
#~ "οποίες επηρεάζουν τον τρόπο που τα παράθυρα επιλέγονται και "
#~ "παρουσιάζονται."
#~ msgid "Configure display settings..."
#~ msgstr "Διαμορφώστε τις ρυθμίσεις της οθόνης…"
#~ msgid "Notifications"
#~ msgstr "Ειδοποιήσεις"
#~ msgid "Online Accounts"
#~ msgstr "Λογαριασμοί διαδικτύου"
#~ msgid "Lock Screen"
#~ msgstr "Κλείδωμα οθόνης"
#~ msgid "Switch User"
#~ msgstr "Αλλαγή χρήστη"
#~ msgid "Log Out..."
#~ msgstr "Αποσύνδεση…"
#~ msgid ""
#~ "This is the first time you use the Alternate Tab extension. \n"
#~ "Please choose your preferred behaviour:\n"
#~ "\n"
#~ "All & Thumbnails:\n"
#~ " This mode presents all applications from all workspaces in one "
#~ "selection \n"
#~ " list. Instead of using the application icon of every window, it uses "
#~ "small \n"
#~ " thumbnails resembling the window itself. \n"
#~ "\n"
#~ "Workspace & Icons:\n"
#~ " This mode let's you switch between the applications of your current \n"
#~ " workspace and gives you additionally the option to switch to the last "
#~ "used \n"
#~ " application of your previous workspace. This is always the last "
#~ "symbol in \n"
#~ " the list and is segregated by a separator/vertical line if "
#~ "available. \n"
#~ " Every window is represented by its application icon. \n"
#~ "\n"
#~ "Native:\n"
#~ " This mode is the native GNOME 3 behaviour or in other words: "
#~ "Clicking \n"
#~ " native switches the Alternate Tab extension off. \n"
#~ msgstr ""
#~ "Αυτή είναι η πρώτη φορά που χρησιμοποιήσατε την εναλλακτική επέκταση "
#~ "στηλοθέτη. \n"
#~ "Παρακαλούμε επιλέξτε την συμπεριφορά που επιθυμείτε εσείς:\n"
#~ "\n"
#~ "Όλα & μικρογραφίες:\n"
#~ " Αυτή η κατάσταση εμφανίζει όλες τις εφαρμογές από όλους τους χώρους "
#~ "εργασίας σε μια επιλογή \n"
#~ " λίστα. Αντί να χρησιμοποιεί το εικονίδιο της εφαρμογής από κάθε "
#~ "παράθυρο, χρησιμοποιεί μικρές \n"
#~ " μικρογραφίες που μοιάζουν με το ίδιο το παράθυρο. \n"
#~ "\n"
#~ "Χώρος εργασίας & εικονίδια:\n"
#~ " Αυτή η λειτουργία σας επιτρέπει να κάνετε εναλλαγή μεταξύ των "
#~ "εφαρμογών του τρέχοντος \n"
#~ " χώρου εργασίας σας και σας δίνει επιπλέον τη δυνατότητα να μεταβείτε "
#~ "στην τελευταία χρησιμοποιημένη \n"
#~ " εφαρμογή του προηγούμενου χώρου εργασίας σας. Αυτό είναι πάντα το "
#~ "τελευταίο σύμβολο στη \n"
#~ " λίστα και είναι απομονωμένο από ένα διαχωριστικό/κάθετη γραμμή, εάν "
#~ "υπάρχει. \n"
#~ " Κάθε παράθυρο αντιπροσωπεύεται από εικονίδιο της εφαρμογής της. \n"
#~ "\n"
#~ "Μητρική:\n"
#~ " Αυτή η λειτουργία είναι η μητρική συμπεριφορά του GNOME 3 ή με άλλα "
#~ "λόγια: Αν κάνετε κλικ \n"
#~ " στο μητρική θέτει εκτός λειτουργίας την εναλλακτική επέκταση "
#~ "στηλοθέτη. \n"
#~ msgid "Alt Tab Behaviour"
#~ msgstr "Συμπεριφορά Alt Tab"
#~ msgid "Cancel"
#~ msgstr "Ακύρωση"
#~ msgid "Ask the user for a default behaviour if true."
#~ msgstr "Ρωτήστε τον χρήστη για μια προεπιλεγμένη συμπεριφορα εαν αληθεύει."
#~ msgid "Indicates if Alternate Tab is newly installed"
#~ msgstr "Υποδεικνύει αν ο εναλλακτικός στηλοθέτης είναι νεοεισαχθείς"
#~ msgid ""
#~ "The algorithm used to layout thumbnails in the overview. 'grid' to use "
#~ "the default grid based algorithm, 'natural' to use another one that "
#~ "reflects more the position and size of the actual window"
#~ msgstr ""
#~ "Ο αλγόριθμος που χρησιμοποιείται για την διάταξη μικρογραφιών στην "
#~ "επισκόπηση. grid («πλέγμα») να χρησιμοποιήσει τον αλγόριθμο που βασίζετε "
#~ "στο προεπιλεγμένο πλέγμα, natural («φυσικό») να χρησιμοποιήσει ένα άλλο "
#~ "που αντανακλά περισσότερο τη θέση και το μέγεθος της πραγματικού παράθυρου"
#~ msgid "Window placement strategy"
#~ msgstr "Στρατηγική τοποθέτησης παραθύρου"
#: ../extensions/xrandr-indicator/extension.js:78
msgid "Configure display settings..."
msgstr "Διαμορφώστε τις ρυθμίσεις της οθόνης…"

Some files were not shown because too many files have changed in this diff Show More