From 47ed033a40208459cb5814b536106d34e3cbd819 Mon Sep 17 00:00:00 2001 From: Aryan Kaushik <34372791+Aryan20@users.noreply.github.com> Date: Sun, 12 Sep 2021 23:10:34 +0530 Subject: [PATCH] updated code to whitesur 120921 a0730b0 --- lib-core.sh | 3 +- lib-flatpak.sh | 60 +- lib-install.sh | 103 +- .../activities-black/activities-arch.svg | 26 +- .../activities-black/activities-debian.svg | 51 +- .../activities-black/activities-fedora.svg | 30 +- .../activities-black/activities-gnome.svg | 50 +- .../activities-black/activities-manjaro.svg | 50 +- .../activities-black/activities-mxlinux.svg | 39 +- .../activities-black/activities-opensuse.svg | 41 +- .../activities-black/activities-popos.svg | 39 +- .../activities-black/activities-simple.svg | 50 +- .../activities-black/activities-ubuntu.svg | 50 +- .../activities-black/activities-void.svg | 55 +- .../activities-black/activities-zorin.svg | 41 +- .../activities-black/activities.svg | 28 +- .../activities/activities-arch.svg | 26 +- .../activities/activities-debian.svg | 51 +- .../activities/activities-fedora.svg | 32 +- .../activities/activities-gnome.svg | 50 +- .../activities/activities-manjaro.svg | 50 +- .../activities/activities-mxlinux.svg | 39 +- .../activities/activities-opensuse.svg | 41 +- .../activities/activities-popos.svg | 39 +- .../activities/activities-simple.svg | 44 +- .../activities/activities-ubuntu.svg | 50 +- .../activities/activities-void.svg | 41 +- .../activities/activities-zorin.svg | 39 +- .../gnome-shell/activities/activities.svg | 28 +- ...dash-to-dock.scss => _dash-to-dock-3.scss} | 0 src/other/dash-to-dock/_dash-to-dock-4.scss | 334 +++ .../dash-to-dock@micxgx.gmail.com/COPYING | 339 --- .../dash-to-dock@micxgx.gmail.com/README.md | 45 - .../dash-to-dock@micxgx.gmail.com/Settings.ui | 2660 ----------------- .../appIconIndicators.js | 1078 ------- .../dash-to-dock@micxgx.gmail.com/appIcons.js | 1273 -------- .../dash-to-dock@micxgx.gmail.com/dash.js | 1072 ------- .../dbusmenuUtils.js | 274 -- .../dash-to-dock@micxgx.gmail.com/docking.js | 1967 ------------ .../extension.js | 21 - .../fileManager1API.js | 226 -- .../intellihide.js | 321 -- .../launcherAPI.js | 281 -- .../locale/ar/LC_MESSAGES/dashtodock.mo | Bin 8303 -> 0 bytes .../locale/cs/LC_MESSAGES/dashtodock.mo | Bin 10321 -> 0 bytes .../locale/de/LC_MESSAGES/dashtodock.mo | Bin 8726 -> 0 bytes .../locale/el/LC_MESSAGES/dashtodock.mo | Bin 12052 -> 0 bytes .../locale/es/LC_MESSAGES/dashtodock.mo | Bin 10083 -> 0 bytes .../locale/eu/LC_MESSAGES/dashtodock.mo | Bin 10183 -> 0 bytes .../locale/fr/LC_MESSAGES/dashtodock.mo | Bin 10218 -> 0 bytes .../locale/gl/LC_MESSAGES/dashtodock.mo | Bin 8819 -> 0 bytes .../locale/hu/LC_MESSAGES/dashtodock.mo | Bin 9276 -> 0 bytes .../locale/id/LC_MESSAGES/dashtodock.mo | Bin 8560 -> 0 bytes .../locale/it/LC_MESSAGES/dashtodock.mo | Bin 9880 -> 0 bytes .../locale/ja/LC_MESSAGES/dashtodock.mo | Bin 12122 -> 0 bytes .../locale/nb/LC_MESSAGES/dashtodock.mo | Bin 9203 -> 0 bytes .../locale/nl/LC_MESSAGES/dashtodock.mo | Bin 10077 -> 0 bytes .../locale/pl/LC_MESSAGES/dashtodock.mo | Bin 10048 -> 0 bytes .../locale/pt/LC_MESSAGES/dashtodock.mo | Bin 9261 -> 0 bytes .../locale/pt_BR/LC_MESSAGES/dashtodock.mo | Bin 9895 -> 0 bytes .../locale/ru/LC_MESSAGES/dashtodock.mo | Bin 12849 -> 0 bytes .../locale/sk/LC_MESSAGES/dashtodock.mo | Bin 6290 -> 0 bytes .../locale/sr/LC_MESSAGES/dashtodock.mo | Bin 11186 -> 0 bytes .../locale/sr@latin/LC_MESSAGES/dashtodock.mo | Bin 8824 -> 0 bytes .../locale/sv/LC_MESSAGES/dashtodock.mo | Bin 10093 -> 0 bytes .../locale/tr/LC_MESSAGES/dashtodock.mo | Bin 10080 -> 0 bytes .../locale/uk_UA/LC_MESSAGES/dashtodock.mo | Bin 15770 -> 0 bytes .../locale/zh_CN/LC_MESSAGES/dashtodock.mo | Bin 9442 -> 0 bytes .../locale/zh_TW/LC_MESSAGES/dashtodock.mo | Bin 9484 -> 0 bytes .../locations.js | 293 -- .../media/glossy.svg | 139 - .../media/highlight_stacked_bg.svg | 82 - .../media/highlight_stacked_bg_h.svg | 82 - .../media/logo.svg | 528 ---- .../metadata.json | 12 - .../dash-to-dock@micxgx.gmail.com/prefs.js | 838 ------ .../schemas/gschemas.compiled | Bin 7277 -> 0 bytes ....shell.extensions.dash-to-dock.gschema.xml | 551 ---- .../stylesheet.css | 231 -- .../dash-to-dock@micxgx.gmail.com/theming.js | 553 ---- .../dash-to-dock@micxgx.gmail.com/utils.js | 308 -- .../windowPreview.js | 598 ---- src/other/dash-to-dock/stylesheet-40.scss | 9 + src/other/dash-to-dock/stylesheet-dark.scss | 2 +- src/other/dash-to-dock/stylesheet-light.scss | 2 +- .../Monterey/left-tab-close-button.css | 28 + src/other/firefox/Monterey/parts/tabsbar.css | 8 + .../WhiteSur/left-tab-close-button.css | 19 + src/other/firefox/WhiteSur/parts/tabsbar.css | 27 +- src/other/firefox/userChrome-Monterey.css | 3 + src/other/firefox/userChrome-WhiteSur.css | 3 + src/sass/_theme-options.scss | 3 + src/sass/gnome-shell/common/_calendar.scss | 4 + src/sass/gnome-shell/common/_dialogs.scss | 4 + src/sass/gnome-shell/common/_entries.scss | 6 +- .../gnome-shell/common/_login-dialog.scss | 360 ++- src/sass/gnome-shell/common/_misc.scss | 4 +- src/sass/gnome-shell/common/_panel.scss | 51 +- src/sass/gnome-shell/common/_popovers.scss | 54 +- .../extensions-40-0/_dash-to-dock.scss | 81 +- src/sass/gnome-shell/widgets-40-0/_dash.scss | 30 +- src/sass/gtk/_common-3.0.scss | 3 +- tweaks.sh | 72 +- 103 files changed, 1659 insertions(+), 14466 deletions(-) rename src/other/dash-to-dock/{_dash-to-dock.scss => _dash-to-dock-3.scss} (100%) create mode 100644 src/other/dash-to-dock/_dash-to-dock-4.scss delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/COPYING delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/README.md delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/Settings.ui delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/appIconIndicators.js delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/appIcons.js delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/dash.js delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/dbusmenuUtils.js delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/docking.js delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/extension.js delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/fileManager1API.js delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/intellihide.js delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/launcherAPI.js delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/ar/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/cs/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/de/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/el/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/es/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/eu/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/fr/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/gl/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/hu/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/id/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/it/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/ja/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/nb/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/nl/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/pl/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/pt/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/pt_BR/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/ru/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/sk/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/sr/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/sr@latin/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/sv/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/tr/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/uk_UA/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/zh_CN/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/zh_TW/LC_MESSAGES/dashtodock.mo delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locations.js delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/media/glossy.svg delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/media/highlight_stacked_bg.svg delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/media/highlight_stacked_bg_h.svg delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/media/logo.svg delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/metadata.json delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/prefs.js delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/schemas/gschemas.compiled delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/schemas/org.gnome.shell.extensions.dash-to-dock.gschema.xml delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/stylesheet.css delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/theming.js delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/utils.js delete mode 100644 src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/windowPreview.js create mode 100644 src/other/dash-to-dock/stylesheet-40.scss create mode 100644 src/other/firefox/Monterey/left-tab-close-button.css create mode 100644 src/other/firefox/WhiteSur/left-tab-close-button.css diff --git a/lib-core.sh b/lib-core.sh index 82d7640..f511793 100755 --- a/lib-core.sh +++ b/lib-core.sh @@ -35,7 +35,7 @@ else fi #----------Program options-------------# -SASSC_OPT="-M -t expanded" +SASSC_OPT="-t expanded" if [[ "$(uname -s)" =~ "BSD" || "$(uname -s)" == "Darwin" ]]; then SED_OPT="-i """ @@ -75,6 +75,7 @@ ETC_CSS_FILE="/etc/alternatives/gdm3.css" ETC_GR_FILE="/etc/alternatives/gdm3-theme.gresource" YARU_GR_FILE="/usr/share/gnome-shell/theme/Yaru/gnome-shell-theme.gresource" POP_OS_GR_FILE="/usr/share/gnome-shell/theme/Pop/gnome-shell-theme.gresource" +ZORIN_GR_FILE="/usr/share/gnome-shell/theme/ZorinBlue-Light/gnome-shell-theme.gresource" MISC_GR_FILE="/usr/share/gnome-shell/gnome-shell-theme.gresource" GS_GR_XML_FILE="${THEME_SRC_DIR}/main/gnome-shell/gnome-shell-theme.gresource.xml" diff --git a/lib-flatpak.sh b/lib-flatpak.sh index 1479441..9ad35ca 100755 --- a/lib-flatpak.sh +++ b/lib-flatpak.sh @@ -2,14 +2,12 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -[[ -n "$PAKITHEME_VERBOSE" ]] && set -x ||: - die() { echo "$@" >&2 exit 1 } -pakitheme() { +pakitheme_gtk3() { local color="$(destify ${1})" local opacity="$(destify ${2})" local alt="$(destify ${3})" @@ -17,27 +15,30 @@ pakitheme() { local FLATPAK_THEME="${name}${color}${opacity}${alt}${theme}" - local GTK_THEME_VER=3.22 + local GTK_3_THEME_VER=3.22 local cache_home="${XDG_CACHE_HOME:-$HOME/.cache}" local data_home="${XDG_DATA_HOME:-$HOME/.local/share}" local pakitheme_cache="$cache_home/pakitheme" local repo_dir="$pakitheme_cache/repo" - local app_id="org.gtk.Gtk3theme.$FLATPAK_THEME" + local gtk3_app_id="org.gtk.Gtk3theme.$FLATPAK_THEME" local root_dir="$pakitheme_cache/$FLATPAK_THEME" local repo_dir="$root_dir/repo" local build_dir="$root_dir/build" - prompt -i "Converting theme: $FLATPAK_THEME" - for location in "$data_home/themes" "$HOME/.themes" /usr/share/themes; do if [[ -d "$location/$FLATPAK_THEME" ]]; then - prompt -s "Found theme located at: $location/$FLATPAK_THEME" + prompt -s "Found theme located at: $location/$FLATPAK_THEME \n" theme_path="$location/$FLATPAK_THEME" break fi done - [[ -n "$theme_path" ]] || die 'Could not locate theme.' + if [[ -n "$theme_path" ]]; then + prompt -i "Converting theme: $FLATPAK_THEME... \n" + else + prompt -e "Could not locate theme... install theme first! \n" + exit 0 + fi rm -rf "$root_dir" "$repo_dir" mkdir -p "$repo_dir" @@ -54,40 +55,40 @@ pakitheme() { cp -a "$theme_path/gtk-3.$theme_gtk_version/"* "$build_dir/files" mkdir -p "$build_dir/files/share/appdata" - cat >"$build_dir/files/share/appdata/$app_id.appdata.xml" <"$build_dir/files/share/appdata/$gtk3_app_id.appdata.xml" < - $app_id + $gtk3_app_id CC0-1.0 - $flatpak_name Gtk theme - $flatpak_name Gtk theme (generated via pakitheme) + $FLATPAK_THEME Gtk theme + $FLATPAK_THEME Gtk theme (generated via pakitheme) EOF - appstream-compose --prefix="$build_dir/files" --basename="$app_id" --origin=flatpak "$app_id" + appstream-compose --prefix="$build_dir/files" --basename="$gtk3_app_id" --origin=flatpak "$gtk3_app_id" ostree --repo="$repo_dir" commit -b base --tree=dir="$build_dir" bundles=() while read -r arch; do - bundle="$root_dir/$app_id-$arch.flatpak" + bundle="$root_dir/$gtk3_app_id-$arch.flatpak" rm -rf "$build_dir" ostree --repo="$repo_dir" checkout -U base "$build_dir" read -rd '' metadata < "$build_dir/metadata" - ostree --repo="$repo_dir" commit -b "runtime/$app_id/$arch/$GTK_THEME_VER" \ + ostree --repo="$repo_dir" commit -b "runtime/$gtk3_app_id/$arch/$GTK_3_THEME_VER" \ --add-metadata-string "xa.metadata=$(cat $build_dir/metadata)" --link-checkout-speedup "$build_dir" - flatpak build-bundle --runtime "$repo_dir" "$bundle" "$app_id" "$GTK_THEME_VER" + flatpak build-bundle --runtime "$repo_dir" "$bundle" "$gtk3_app_id" "$GTK_3_THEME_VER" trap 'rm "$bundle"' EXIT @@ -97,6 +98,23 @@ EOF done < <(flatpak list --runtime --columns=arch:f | sort -u) for bundle in "${bundles[@]}"; do - flatpak install -y --$install_target "${bundle}" + if [[ -w "/root" ]]; then + sudo flatpak install -y --system "${bundle}" + else + udo flatpak install -y --user "${bundle}" + fi done } + +flatpak_remove() { + local color="$(destify ${1})" + local opacity="$(destify ${2})" + local alt="$(destify ${3})" + local theme="$(destify ${4})" + + if [[ -w "/root" ]]; then + sudo flatpak remove -y --system org.gtk.Gtk3theme.${name}${color}${opacity}${alt}${theme} + else + udo flatpak remove -y --user org.gtk.Gtk3theme.${name}${color}${opacity}${alt}${theme} + fi +} diff --git a/lib-install.sh b/lib-install.sh index 7e6e635..f42debb 100755 --- a/lib-install.sh +++ b/lib-install.sh @@ -250,6 +250,39 @@ install_dialog_deps() { fi } +install_flatpak_deps() { + if ! has_command ostree || ! has_command appstream-compose; then + prompt -w "DEPS: 'ostree' and 'appstream-util' is required for flatpak installing." + prepare_deps; stop_animation + + if has_command zypper; then + sudo zypper in -y libostree appstream-glib + elif has_command swupd; then + # Rolling release + prepare_swupd && sudo swupd ostree libappstream-glib + elif has_command apt; then + prepare_install_apt_packages ostree appstream-util + elif has_command dnf; then + sudo dnf install -y ostree libappstream-glib + elif has_command yum; then + sudo yum install -y ostree libappstream-glib + elif has_command pacman; then + # Rolling release + sudo pacman -Syyu --noconfirm --needed ostree appstream-glib + elif has_command xbps-install; then + # Rolling release + # 'libxml2' is already included here, and it's gonna broke the installation + # if you add it + prepare_xbps && sudo xbps-install -Sy ostree appstream-glib + elif has_command eopkg; then + # Rolling release + sudo eopkg -y upgrade; sudo eopkg -y ostree appstream-glib + else + installation_sorry + fi + fi +} + ############################################################################### # THEME MODULES # ############################################################################### @@ -552,6 +585,8 @@ install_gdm_theme() { TARGET="${POP_OS_GR_FILE}" elif check_theme_file "$YARU_GR_FILE"; then TARGET="${YARU_GR_FILE}" + elif check_theme_file "$ZORIN_GR_FILE"; then + TARGET="${ZORIN_GR_FILE}" elif check_theme_file "$MISC_GR_FILE"; then TARGET="${MISC_GR_FILE}" fi @@ -570,6 +605,7 @@ revert_gdm_theme() { restore_file "${ZORIN_CSS_FILE}"; restore_file "${ETC_CSS_FILE}" restore_file "${POP_OS_GR_FILE}"; restore_file "${YARU_GR_FILE}" restore_file "${MISC_GR_FILE}"; restore_file "${ETC_GR_FILE}" + restore_file "${ZORIN_GR_FILE}" } ############################################################################### @@ -671,22 +707,24 @@ install_dash_to_dock_theme() { if [[ -d "${DASH_TO_DOCK_DIR_HOME}" ]]; then backup_file "${DASH_TO_DOCK_DIR_HOME}/stylesheet.css" "udo" - udoify_file "${DASH_TO_DOCK_DIR_HOME}/stylesheet.css" - udo sassc ${SASSC_OPT} "${DASH_TO_DOCK_SRC_DIR}/stylesheet$(destify ${colors[0]}).scss" "${DASH_TO_DOCK_DIR_HOME}/stylesheet.css" + udoify_file "${DASH_TO_DOCK_DIR_HOME}/stylesheet.css" + if [[ "${GNOME_VERSION}" == 'new' ]]; then + udo sassc ${SASSC_OPT} "${DASH_TO_DOCK_SRC_DIR}/stylesheet-40.scss" "${DASH_TO_DOCK_DIR_HOME}/stylesheet.css" + else + udo sassc ${SASSC_OPT} "${DASH_TO_DOCK_SRC_DIR}/stylesheet$(destify ${colors[0]}).scss" "${DASH_TO_DOCK_DIR_HOME}/stylesheet.css" + fi elif [[ -d "${DASH_TO_DOCK_DIR_ROOT}" ]]; then backup_file "${DASH_TO_DOCK_DIR_ROOT}/stylesheet.css" "sudo" - sudo sassc ${SASSC_OPT} "${DASH_TO_DOCK_SRC_DIR}/stylesheet$(destify ${colors[0]}).scss" "${DASH_TO_DOCK_DIR_ROOT}/stylesheet.css" + if [[ "${GNOME_VERSION}" == 'new' ]]; then + sudo sassc ${SASSC_OPT} "${DASH_TO_DOCK_SRC_DIR}/stylesheet-40.scss" "${DASH_TO_DOCK_DIR_ROOT}/stylesheet.css" + else + sudo sassc ${SASSC_OPT} "${DASH_TO_DOCK_SRC_DIR}/stylesheet$(destify ${colors[0]}).scss" "${DASH_TO_DOCK_DIR_ROOT}/stylesheet.css" + fi fi udo dbus-launch dconf write /org/gnome/shell/extensions/dash-to-dock/apply-custom-theme true } -revert_dash_to_dock() { - if [[ -d "${DASH_TO_DOCK_DIR_HOME}.bak" ]]; then - restore_file "${DASH_TO_DOCK_DIR_HOME}" "udo" - fi -} - revert_dash_to_dock_theme() { if [[ -d "${DASH_TO_DOCK_DIR_HOME}" ]]; then restore_file "${DASH_TO_DOCK_DIR_HOME}/stylesheet.css" "udo" @@ -701,30 +739,14 @@ revert_dash_to_dock_theme() { # FLATPAK & SNAP # ############################################################################### -flatpak_remove() { - local color="$(destify ${1})" - local opacity="$(destify ${2})" - local alt="$(destify ${3})" - local theme="$(destify ${4})" - - if [[ -w "/root" ]]; then - flatpak remove -y --system org.gtk.Gtk3theme.${THEME_NAME}${color}${opacity}${alt}${theme} - else - flatpak remove -y --user org.gtk.Gtk3theme.${THEME_NAME}${color}${opacity}${alt}${theme} - fi -} - connect_flatpak() { - if [[ -w "/root" ]]; then - install_target=system - else - install_target=user - fi + install_flatpak_deps + for opacity in "${opacities[@]}"; do for alt in "${alts[@]}"; do for theme in "${themes[@]}"; do for color in "${colors[@]}"; do - pakitheme "${color}" "${opacity}" "${alt}" "${theme}" + pakitheme_gtk3 "${color}" "${opacity}" "${alt}" "${theme}" done done done @@ -789,64 +811,69 @@ customize_theme() { # Change gnome-shell panel transparency if [[ "${panel_opacity}" != 'default' ]]; then - prompt -s "Changing panel transparency ..." + prompt -s "Changing panel transparency ... \n" sed $SED_OPT "/\$panel_opacity/s/0.15/0.${panel_opacity}/" "${THEME_SRC_DIR}/sass/_theme-options-temp.scss" fi # Change gnome-shell panel height size if [[ "${panel_size}" != 'default' ]]; then - prompt -s "Changing panel height size to '${panel_size}'..." + prompt -s "Changing panel height size to '${panel_size}'... \n" sed $SED_OPT "/\$panel_size/s/default/${panel_size}/" "${THEME_SRC_DIR}/sass/_theme-options-temp.scss" fi # Change gnome-shell show apps button style if [[ "${showapps_normal}" == 'true' ]]; then - prompt -s "Changing gnome-shell show apps button style ..." + prompt -s "Changing gnome-shell show apps button style ... \n" sed $SED_OPT "/\$showapps_button/s/bigsur/normal/" "${THEME_SRC_DIR}/sass/_theme-options-temp.scss" fi # Change Nautilus sidarbar size if [[ "${sidebar_size}" != 'default' ]]; then - prompt -s "Changing Nautilus sidebar size ..." + prompt -s "Changing Nautilus sidebar size ... \n" sed $SED_OPT "/\$sidebar_size/s/200px/${sidebar_size}px/" "${THEME_SRC_DIR}/sass/_theme-options-temp.scss" fi # Change Nautilus style if [[ "${nautilus_style}" != 'stable' ]]; then - prompt -s "Changing Nautilus style ..." + prompt -s "Changing Nautilus style ... \n" sed $SED_OPT "/\$nautilus_style/s/stable/${nautilus_style}/" "${THEME_SRC_DIR}/sass/_theme-options-temp.scss" fi # Change Nautilus titlebutton placement style if [[ "${right_placement}" == 'true' ]]; then - prompt -s "Changing Nautilus titlebutton placement style ..." + prompt -s "Changing Nautilus titlebutton placement style ... \n" sed $SED_OPT "/\$placement/s/left/right/" "${THEME_SRC_DIR}/sass/_theme-options-temp.scss" fi # Change maximized window radius if [[ "${max_round}" == 'true' ]]; then - prompt -s "Changing maximized window style ..." + prompt -s "Changing maximized window style ... \n" sed $SED_OPT "/\$max_window_style/s/square/round/" "${THEME_SRC_DIR}/sass/_theme-options-temp.scss" fi # Change panel font color if [[ "${monterey}" == 'true' ]]; then black_font="true" - prompt -s "Changing to Monterey style ..." + prompt -s "Changing to Monterey style ... \n" sed $SED_OPT "/\$monterey/s/false/true/" "${THEME_SRC_DIR}/sass/_theme-options-temp.scss" sed $SED_OPT "/\$panel_opacity/s/0.15/0.5/" "${THEME_SRC_DIR}/sass/_theme-options-temp.scss" fi # Change panel font color if [[ "${black_font}" == 'true' ]]; then - prompt -s "Changing panel font color ..." + prompt -s "Changing panel font color ... \n" sed $SED_OPT "/\$panel_font/s/white/black/" "${THEME_SRC_DIR}/sass/_theme-options-temp.scss" fi if [[ "${compact}" == 'false' ]]; then - prompt -s "Changing Definition mode to HD (Bigger font, Bigger size) ..." + prompt -s "Changing Definition mode to HD (Bigger font, Bigger size) ... \n" #FIXME: @vince is it not implemented yet? (Only Gnome-shell and Gtk theme finished!) fi + + if [[ "${scale}" == 'x2' ]]; then + prompt -s "Changing GDM scaling to 200% ... \n" + sed $SED_OPT "/\$scale/s/default/x2/" "${THEME_SRC_DIR}/sass/_theme-options-temp.scss" + fi } #-----------------------------------DIALOGS------------------------------------# diff --git a/src/assets/gnome-shell/activities-black/activities-arch.svg b/src/assets/gnome-shell/activities-black/activities-arch.svg index ef9d64a..30c0c94 100644 --- a/src/assets/gnome-shell/activities-black/activities-arch.svg +++ b/src/assets/gnome-shell/activities-black/activities-arch.svg @@ -12,11 +12,11 @@ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:export-ydpi="90.000000" inkscape:export-xdpi="90.000000" - width="24" - height="24" + width="48" + height="48" id="svg11300" sodipodi:version="0.32" - inkscape:version="0.92.4 (5da689c313, 2019-01-14)" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" sodipodi:docname="activities-arch.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" version="1.0" @@ -30,18 +30,18 @@ borderopacity="1" inkscape:pageopacity="1" inkscape:pageshadow="2" - inkscape:zoom="8" - inkscape:cx="-21.058413" - inkscape:cy="5.92008" + inkscape:zoom="5.6568543" + inkscape:cx="100.91506" + inkscape:cy="-4.3148635" inkscape:current-layer="layer1" showgrid="true" inkscape:grid-bbox="true" inkscape:document-units="px" inkscape:showpageshadow="true" - inkscape:window-width="1366" - inkscape:window-height="710" + inkscape:window-width="3840" + inkscape:window-height="2032" inkscape:window-x="0" - inkscape:window-y="28" + inkscape:window-y="56" width="400px" height="300px" inkscape:snap-nodes="true" @@ -104,7 +104,7 @@ - + @@ -143,11 +143,11 @@ inkscape:groupmode="layer" inkscape:label="Base" id="layer1" - transform="translate(0,-276)"> + transform="translate(0,-252)"> diff --git a/src/assets/gnome-shell/activities-black/activities-debian.svg b/src/assets/gnome-shell/activities-black/activities-debian.svg index 250e6ea..c986ddb 100644 --- a/src/assets/gnome-shell/activities-black/activities-debian.svg +++ b/src/assets/gnome-shell/activities-black/activities-debian.svg @@ -2,25 +2,24 @@ + style="display:inline;enable-background:new" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + guidehiopacity="0.49803922" + inkscape:pagecheckerboard="0"> - - - - + id="defs3" /> @@ -104,7 +95,6 @@ - @@ -145,9 +135,8 @@ id="layer1" transform="translate(0,-276)"> diff --git a/src/assets/gnome-shell/activities-black/activities-fedora.svg b/src/assets/gnome-shell/activities-black/activities-fedora.svg index 219fffe..3a38af1 100644 --- a/src/assets/gnome-shell/activities-black/activities-fedora.svg +++ b/src/assets/gnome-shell/activities-black/activities-fedora.svg @@ -4,11 +4,11 @@ - - - - + id="defs3" /> @@ -104,7 +95,6 @@ - @@ -146,8 +136,8 @@ transform="translate(0,-276)"> diff --git a/src/assets/gnome-shell/activities-black/activities-gnome.svg b/src/assets/gnome-shell/activities-black/activities-gnome.svg index 31bbfe7..763ddc2 100644 --- a/src/assets/gnome-shell/activities-black/activities-gnome.svg +++ b/src/assets/gnome-shell/activities-black/activities-gnome.svg @@ -2,25 +2,24 @@ + style="display:inline;enable-background:new" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + guidehiopacity="0.49803922" + inkscape:pagecheckerboard="0"> - - - - + id="defs3" /> @@ -104,7 +95,6 @@ - @@ -146,8 +136,8 @@ transform="translate(0,-276)"> diff --git a/src/assets/gnome-shell/activities-black/activities-manjaro.svg b/src/assets/gnome-shell/activities-black/activities-manjaro.svg index ab7d795..533c971 100644 --- a/src/assets/gnome-shell/activities-black/activities-manjaro.svg +++ b/src/assets/gnome-shell/activities-black/activities-manjaro.svg @@ -2,25 +2,24 @@ + style="display:inline;enable-background:new" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + guidehiopacity="0.49803922" + inkscape:pagecheckerboard="0"> - - - - + id="defs3" /> @@ -104,7 +95,6 @@ - @@ -146,8 +136,8 @@ transform="translate(0,-276)"> diff --git a/src/assets/gnome-shell/activities-black/activities-mxlinux.svg b/src/assets/gnome-shell/activities-black/activities-mxlinux.svg index 06e67bc..c0472d4 100644 --- a/src/assets/gnome-shell/activities-black/activities-mxlinux.svg +++ b/src/assets/gnome-shell/activities-black/activities-mxlinux.svg @@ -1,3 +1,38 @@ - - + + + + + diff --git a/src/assets/gnome-shell/activities-black/activities-opensuse.svg b/src/assets/gnome-shell/activities-black/activities-opensuse.svg index 1805990..77169cd 100644 --- a/src/assets/gnome-shell/activities-black/activities-opensuse.svg +++ b/src/assets/gnome-shell/activities-black/activities-opensuse.svg @@ -1,3 +1,40 @@ - - + + + + + diff --git a/src/assets/gnome-shell/activities-black/activities-popos.svg b/src/assets/gnome-shell/activities-black/activities-popos.svg index 56da326..d925943 100644 --- a/src/assets/gnome-shell/activities-black/activities-popos.svg +++ b/src/assets/gnome-shell/activities-black/activities-popos.svg @@ -1,3 +1,38 @@ - - + + + + + diff --git a/src/assets/gnome-shell/activities-black/activities-simple.svg b/src/assets/gnome-shell/activities-black/activities-simple.svg index 17f773b..6c037c5 100644 --- a/src/assets/gnome-shell/activities-black/activities-simple.svg +++ b/src/assets/gnome-shell/activities-black/activities-simple.svg @@ -2,41 +2,42 @@ + inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)" + sodipodi:docname="activities-simple.svg" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + inkscape:window-maximized="1" + inkscape:pagecheckerboard="0" /> @@ -45,7 +46,6 @@ image/svg+xml - @@ -56,16 +56,16 @@ transform="translate(0,-1029.8622)"> + transform="matrix(2.1333333,0,0,2.1333333,3.75e-7,-1167.1771)"> + style="opacity:1;fill:#333333;fill-opacity:1;stroke:none;stroke-width:0.9375;stroke-opacity:1" /> @@ -74,7 +74,7 @@ cy="1041.1122" cx="18.75" id="circle4791" - style="opacity:1;fill:#383838;fill-opacity:1;stroke:none;stroke-width:0.9375;stroke-opacity:1" /> + style="opacity:1;fill:#333333;fill-opacity:1;stroke:none;stroke-width:0.9375;stroke-opacity:1" /> diff --git a/src/assets/gnome-shell/activities-black/activities-ubuntu.svg b/src/assets/gnome-shell/activities-black/activities-ubuntu.svg index 04a02c7..36ad930 100644 --- a/src/assets/gnome-shell/activities-black/activities-ubuntu.svg +++ b/src/assets/gnome-shell/activities-black/activities-ubuntu.svg @@ -2,25 +2,24 @@ + style="display:inline;enable-background:new" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + guidehiopacity="0.49803922" + inkscape:pagecheckerboard="0"> - - - - + id="defs3" /> @@ -104,7 +95,6 @@ - @@ -146,8 +136,8 @@ transform="translate(0,-276)"> diff --git a/src/assets/gnome-shell/activities-black/activities-void.svg b/src/assets/gnome-shell/activities-black/activities-void.svg index 20370d7..6f27559 100644 --- a/src/assets/gnome-shell/activities-black/activities-void.svg +++ b/src/assets/gnome-shell/activities-black/activities-void.svg @@ -1,37 +1,35 @@ + inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> image/svg+xml - + transform="matrix(7.5590557,0,0,7.5590557,-2.9956602e-7,-2197.0394)" + id="layer1"> + id="g5457"> + style="fill:#333333" /> diff --git a/src/assets/gnome-shell/activities-black/activities-zorin.svg b/src/assets/gnome-shell/activities-black/activities-zorin.svg index 1cad42e..5c4acd9 100644 --- a/src/assets/gnome-shell/activities-black/activities-zorin.svg +++ b/src/assets/gnome-shell/activities-black/activities-zorin.svg @@ -1,5 +1,38 @@ - - - - + + + + + diff --git a/src/assets/gnome-shell/activities-black/activities.svg b/src/assets/gnome-shell/activities-black/activities.svg index c1a6cfd..c1d3ff1 100644 --- a/src/assets/gnome-shell/activities-black/activities.svg +++ b/src/assets/gnome-shell/activities-black/activities.svg @@ -12,12 +12,12 @@ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:export-ydpi="90.000000" inkscape:export-xdpi="90.000000" - width="24" - height="24" + width="48" + height="48" id="svg11300" sodipodi:version="0.32" - inkscape:version="0.92.2 (5c3e80d, 2017-08-06)" - sodipodi:docname="activities-active.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + sodipodi:docname="activities.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" version="1.0" style="display:inline;enable-background:new"> @@ -30,18 +30,18 @@ borderopacity="1" inkscape:pageopacity="1" inkscape:pageshadow="2" - inkscape:zoom="8" - inkscape:cx="19.066587" - inkscape:cy="5.92008" + inkscape:zoom="16" + inkscape:cx="36.697868" + inkscape:cy="24.948153" inkscape:current-layer="layer1" showgrid="true" inkscape:grid-bbox="true" inkscape:document-units="px" inkscape:showpageshadow="true" - inkscape:window-width="1600" - inkscape:window-height="848" + inkscape:window-width="3840" + inkscape:window-height="2032" inkscape:window-x="0" - inkscape:window-y="25" + inkscape:window-y="56" width="400px" height="300px" inkscape:snap-nodes="true" @@ -104,7 +104,7 @@ - + @@ -143,10 +143,10 @@ inkscape:groupmode="layer" inkscape:label="Base" id="layer1" - transform="translate(0,-276)"> + transform="translate(0,-252)"> diff --git a/src/assets/gnome-shell/activities/activities-arch.svg b/src/assets/gnome-shell/activities/activities-arch.svg index 6e16749..fe83f29 100644 --- a/src/assets/gnome-shell/activities/activities-arch.svg +++ b/src/assets/gnome-shell/activities/activities-arch.svg @@ -12,11 +12,11 @@ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:export-ydpi="90.000000" inkscape:export-xdpi="90.000000" - width="24" - height="24" + width="48" + height="48" id="svg11300" sodipodi:version="0.32" - inkscape:version="0.92.4 (5da689c313, 2019-01-14)" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" sodipodi:docname="activities-arch.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" version="1.0" @@ -30,18 +30,18 @@ borderopacity="1" inkscape:pageopacity="1" inkscape:pageshadow="2" - inkscape:zoom="8" - inkscape:cx="-21.058413" - inkscape:cy="5.92008" + inkscape:zoom="5.6568543" + inkscape:cx="100.91506" + inkscape:cy="-4.3148635" inkscape:current-layer="layer1" showgrid="true" inkscape:grid-bbox="true" inkscape:document-units="px" inkscape:showpageshadow="true" - inkscape:window-width="1366" - inkscape:window-height="710" + inkscape:window-width="3840" + inkscape:window-height="2032" inkscape:window-x="0" - inkscape:window-y="28" + inkscape:window-y="56" width="400px" height="300px" inkscape:snap-nodes="true" @@ -104,7 +104,7 @@ - + @@ -143,11 +143,11 @@ inkscape:groupmode="layer" inkscape:label="Base" id="layer1" - transform="translate(0,-276)"> + transform="translate(0,-252)"> diff --git a/src/assets/gnome-shell/activities/activities-debian.svg b/src/assets/gnome-shell/activities/activities-debian.svg index 2cce964..a2ac00e 100644 --- a/src/assets/gnome-shell/activities/activities-debian.svg +++ b/src/assets/gnome-shell/activities/activities-debian.svg @@ -2,25 +2,24 @@ + style="display:inline;enable-background:new" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + guidehiopacity="0.49803922" + inkscape:pagecheckerboard="0"> - - - - + id="defs3" /> @@ -104,7 +95,6 @@ - @@ -145,9 +135,8 @@ id="layer1" transform="translate(0,-276)"> diff --git a/src/assets/gnome-shell/activities/activities-fedora.svg b/src/assets/gnome-shell/activities/activities-fedora.svg index ef63e5a..c263218 100644 --- a/src/assets/gnome-shell/activities/activities-fedora.svg +++ b/src/assets/gnome-shell/activities/activities-fedora.svg @@ -4,11 +4,11 @@ - - - - + id="defs3" /> @@ -104,7 +95,6 @@ - @@ -146,8 +136,8 @@ transform="translate(0,-276)"> diff --git a/src/assets/gnome-shell/activities/activities-gnome.svg b/src/assets/gnome-shell/activities/activities-gnome.svg index 98b0cae..443fbab 100644 --- a/src/assets/gnome-shell/activities/activities-gnome.svg +++ b/src/assets/gnome-shell/activities/activities-gnome.svg @@ -2,25 +2,24 @@ + style="display:inline;enable-background:new" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + guidehiopacity="0.49803922" + inkscape:pagecheckerboard="0"> - - - - + id="defs3" /> @@ -104,7 +95,6 @@ - @@ -146,8 +136,8 @@ transform="translate(0,-276)"> diff --git a/src/assets/gnome-shell/activities/activities-manjaro.svg b/src/assets/gnome-shell/activities/activities-manjaro.svg index 13ebf15..654fee1 100644 --- a/src/assets/gnome-shell/activities/activities-manjaro.svg +++ b/src/assets/gnome-shell/activities/activities-manjaro.svg @@ -2,25 +2,24 @@ + style="display:inline;enable-background:new" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + guidehiopacity="0.49803922" + inkscape:pagecheckerboard="0"> - - - - + id="defs3" /> @@ -104,7 +95,6 @@ - @@ -146,8 +136,8 @@ transform="translate(0,-276)"> diff --git a/src/assets/gnome-shell/activities/activities-mxlinux.svg b/src/assets/gnome-shell/activities/activities-mxlinux.svg index aca9404..392cd7c 100644 --- a/src/assets/gnome-shell/activities/activities-mxlinux.svg +++ b/src/assets/gnome-shell/activities/activities-mxlinux.svg @@ -1,3 +1,38 @@ - - + + + + + diff --git a/src/assets/gnome-shell/activities/activities-opensuse.svg b/src/assets/gnome-shell/activities/activities-opensuse.svg index bf3e809..301b44a 100644 --- a/src/assets/gnome-shell/activities/activities-opensuse.svg +++ b/src/assets/gnome-shell/activities/activities-opensuse.svg @@ -1,3 +1,40 @@ - - + + + + + diff --git a/src/assets/gnome-shell/activities/activities-popos.svg b/src/assets/gnome-shell/activities/activities-popos.svg index f218a92..23af5a6 100644 --- a/src/assets/gnome-shell/activities/activities-popos.svg +++ b/src/assets/gnome-shell/activities/activities-popos.svg @@ -1,3 +1,38 @@ - - + + + + + diff --git a/src/assets/gnome-shell/activities/activities-simple.svg b/src/assets/gnome-shell/activities/activities-simple.svg index 0db267b..cd77b53 100644 --- a/src/assets/gnome-shell/activities/activities-simple.svg +++ b/src/assets/gnome-shell/activities/activities-simple.svg @@ -2,41 +2,42 @@ + inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)" + sodipodi:docname="activities-simple.svg" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + inkscape:window-maximized="1" + inkscape:pagecheckerboard="0" /> @@ -45,7 +46,6 @@ image/svg+xml - @@ -56,7 +56,7 @@ transform="translate(0,-1029.8622)"> + transform="matrix(2.1333333,0,0,2.1333333,3.75e-7,-1167.1771)"> + style="display:inline;enable-background:new" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + guidehiopacity="0.49803922" + inkscape:pagecheckerboard="0"> - - - - + id="defs3" /> @@ -104,7 +95,6 @@ - @@ -146,8 +136,8 @@ transform="translate(0,-276)"> diff --git a/src/assets/gnome-shell/activities/activities-void.svg b/src/assets/gnome-shell/activities/activities-void.svg index a068d09..4d87ec2 100644 --- a/src/assets/gnome-shell/activities/activities-void.svg +++ b/src/assets/gnome-shell/activities/activities-void.svg @@ -1,15 +1,37 @@ + viewBox="0 0 48 48" + height="48" + width="48" + sodipodi:docname="activities-void.svg" + inkscape:version="1.1 (c4e8f9ed74, 2021-05-24)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:cc="http://creativecommons.org/ns#" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + image/svg+xml - - + + + + + diff --git a/src/assets/gnome-shell/activities/activities.svg b/src/assets/gnome-shell/activities/activities.svg index 13dff87..48c8664 100644 --- a/src/assets/gnome-shell/activities/activities.svg +++ b/src/assets/gnome-shell/activities/activities.svg @@ -12,12 +12,12 @@ xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" inkscape:export-ydpi="90.000000" inkscape:export-xdpi="90.000000" - width="24" - height="24" + width="48" + height="48" id="svg11300" sodipodi:version="0.32" - inkscape:version="0.92.2 (5c3e80d, 2017-08-06)" - sodipodi:docname="activities-active.svg" + inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)" + sodipodi:docname="activities.svg" inkscape:output_extension="org.inkscape.output.svg.inkscape" version="1.0" style="display:inline;enable-background:new"> @@ -30,18 +30,18 @@ borderopacity="1" inkscape:pageopacity="1" inkscape:pageshadow="2" - inkscape:zoom="8" - inkscape:cx="19.066587" - inkscape:cy="5.92008" + inkscape:zoom="16" + inkscape:cx="36.697868" + inkscape:cy="24.948153" inkscape:current-layer="layer1" showgrid="true" inkscape:grid-bbox="true" inkscape:document-units="px" inkscape:showpageshadow="true" - inkscape:window-width="1600" - inkscape:window-height="848" + inkscape:window-width="3840" + inkscape:window-height="2032" inkscape:window-x="0" - inkscape:window-y="25" + inkscape:window-y="56" width="400px" height="300px" inkscape:snap-nodes="true" @@ -104,7 +104,7 @@ - + @@ -143,10 +143,10 @@ inkscape:groupmode="layer" inkscape:label="Base" id="layer1" - transform="translate(0,-276)"> + transform="translate(0,-252)"> diff --git a/src/other/dash-to-dock/_dash-to-dock.scss b/src/other/dash-to-dock/_dash-to-dock-3.scss similarity index 100% rename from src/other/dash-to-dock/_dash-to-dock.scss rename to src/other/dash-to-dock/_dash-to-dock-3.scss diff --git a/src/other/dash-to-dock/_dash-to-dock-4.scss b/src/other/dash-to-dock/_dash-to-dock-4.scss new file mode 100644 index 0000000..471fb5e --- /dev/null +++ b/src/other/dash-to-dock/_dash-to-dock-4.scss @@ -0,0 +1,334 @@ + +$dash_background_color: if($variant == 'light', rgba($panel_bg, $panel_opacity), rgba($panel_bg, $panel_opacity + 0.1)); +$dash_placeholder_size: 32px; +$dash_padding: $base_padding + 4px; // 10px +$dash_spacing: round($base_padding / 4); +$dash_bottom_margin: $base_margin * 4; +$dash_border_radius: $dash_radius; + +// Stock +$dock_side_margin: $dash_bottom_margin / 4; +$dock_fixed_inner_margin: $dock_side_margin; + +// Adapted to $dock_bottom_margin + +@function shrink($val) { + @return round($val / 4); +} + +@function opposite($val) { + @return map-get( + ( + left: right, + right: left, + top: bottom, + bottom: top, + ), + $val + ); +} + +$osd_fg_color: #eeeeec; + +@each $side in bottom, top, left, right { + #dashtodockContainer.#{$side} { + #dash { + margin: 0; + padding: 0; + padding-#{$side}: $dash_padding; + padding-#{opposite($side)}: $dash_padding; + + .dash-background { + margin: 0; + margin-#{$side}: $dock_side_margin; + padding: $dash_padding; + } + + .dash-separator { + @if $side == top or $side == bottom { + margin-bottom: 0; + } @else { + height: 1px; + margin: ($dash_spacing + ($dash_padding / 2)) 0; + background-color: transparentize($osd_fg_color, 0.7); + } + } + + .dash-item-container { + .app-well-app, + .show-apps { + padding: $dash_spacing; + padding-#{$side}: $dash_padding + $dock_side_margin; + padding-#{opposite($side)}: $dash_padding; + } + } + } + + &.shrink { + #dash { + .dash-background { + margin-#{$side}: shrink($dock_side_margin); + padding: shrink($dash_padding); + border-radius: $dash_border_radius - $dash_padding + shrink($dash_padding); + } + + #dashtodockDashContainer { + padding: shrink($dash_padding); + } + + .dash-item-container { + .app-well-app, + .show-apps { + padding: shrink($dash_spacing); + padding-#{$side}: shrink($dash_padding + $dock_side_margin); + padding-#{opposite($side)}: shrink($dash_padding); + } + } + } + + &.fixed { + #dash { + .dash-background { + margin-#{opposite($side)}: shrink($dock_fixed_inner_margin); + } + + .dash-item-container { + .app-well-app, + .show-apps { + padding-#{opposite($side)}: shrink($dash_padding + $dock_fixed_inner_margin); + } + } + } + } + } + + &.fixed { + #dash { + .dash-background { + margin-#{opposite($side)}: $dock_fixed_inner_margin; + } + + .dash-item-container { + .app-well-app, + .show-apps { + padding-#{opposite($side)}: $dash_padding + $dock_fixed_inner_margin; + } + } + } + } + } +} + +@each $side in bottom, top, left, right { + #dashtodockContainer.extended.#{$side} { + #dash { + margin: 0; + padding: 0; + + .dash-background { + margin: 0; + margin-#{$side}: 0 !important; + border-radius: 0; + padding: 0; + padding-#{$side}: $dash_padding; + padding-#{opposite($side)}: $dash_padding; + } + + #dashtodockDashContainer { + padding: $dash_padding; + padding-#{$side}: 0; + padding-#{opposite($side)}: 0; + } + + .dash-item-container { + .app-well-app, + .show-apps { + padding: $dash_spacing; + padding-#{$side}: $dash_padding; + padding-#{opposite($side)}: $dash_padding; + } + + .show-apps { + @if $side == top or $side == bottom { + margin-left: $dash_padding; + } @else { + margin-top: $dash_padding; + } + } + } + } + + &.shrink { + #dash { + .dash-background { + margin: 0; + margin-#{$side}: 0 !important; + border-radius: 0; + padding: 0; + padding-#{$side}: shrink($dash_padding - $dash_spacing); + padding-#{opposite($side)}: shrink($dash_padding - $dash_spacing); + } + + #dashtodockDashContainer { + padding: shrink($dash_padding - $dash_spacing); + padding-#{$side}: 0; + padding-#{opposite($side)}: 0; + } + + .dash-item-container { + .app-well-app, + .show-apps { + padding: shrink($dash_spacing); + padding-#{$side}: shrink($dash_padding); + padding-#{opposite($side)}: shrink($dash_padding); + } + + .show-apps { + @if $side == top or $side == bottom { + margin-left: shrink($dash_spacing); + } @else { + margin-top: shrink($dash_spacing); + } + } + } + } + } + + &.shrink.fixed { + #dash { + .dash-background { + margin-#{opposite($side)}: 0; + } + } + } + } +} + +#dashtodockContainer.top.shrink #dash .dash-background { + margin-top: 4px; + margin-bottom: 0; +} + +#dashtodockContainer.straight-corner #dash .dash-background, +#dashtodockContainer.shrink.straight-corner #dash .dash-background { + border-radius: 0px; +} + +/* Scrollview style */ +.bottom #dashtodockDashScrollview, +.top #dashtodockDashScrollview { + -st-hfade-offset: 24px; +} + +.left #dashtodockDashScrollview, +.right #dashtodockDashScrollview { + -st-vfade-offset: 24px; +} + +#dashtodockContainer.running-dots .dash-item-container > StButton, +#dashtodockContainer.dashtodock .dash-item-container > StButton { + transition-duration: 250; + background-size: contain; +} + +/* Running and focused application style */ + +#dashtodockContainer.running-dots .app-well-app.running > .overview-icon, +#dashtodockContainer.dashtodock .app-well-app.running > .overview-icon { + background-image: none; +} + +#dashtodockContainer.running-dots .app-well-app.focused .overview-icon, +#dashtodockContainer.dashtodock .app-well-app.focused .overview-icon { + background-color: rgba(238, 238, 236, 0.2); +} + +#dashtodockContainer.dashtodock #dash .dash-background { + background: #2e3436; +} + +#dashtodockContainer.dashtodock .progress-bar { + /* Customization of the progress bar style, e.g.: + -progress-bar-background: rgba(0.8, 0.8, 0.8, 1); + -progress-bar-border: rgba(0.9, 0.9, 0.9, 1); + */ +} + +#dashtodockContainer.top #dash .placeholder, +#dashtodockContainer.bottom #dash .placeholder { + width: 32px; + height: 1px; +} + +/* + * This is applied to a dummy actor. Only the alpha value for the background and border color + * and the transition-duration are used + */ +#dashtodockContainer.dummy-opaque { + background-color: rgba(0, 0, 0, 0.8); + border-color: rgba(0, 0, 0, 0.4); + transition-duration: 300ms; +} + +/* + * This is applied to a dummy actor. Only the alpha value for the background and border color + * and the transition-duration are used + */ +#dashtodockContainer.dummy-transparent { + background-color: rgba(0, 0, 0, 0.2); + border-color: rgba(0, 0, 0, 0.1); + transition-duration: 500ms; +} + +#dashtodockContainer .number-overlay { + color: rgba(255, 255, 255, 1); + background-color: rgba(0, 0, 0, 0.8); + text-align: center; +} + +#dashtodockContainer .notification-badge { + color: rgba(255, 255, 255, 1); + background-color: rgba(255, 0, 0, 1); + padding: 0.2em 0.5em; + border-radius: 1em; + font-weight: bold; + text-align: center; + margin: 2px; +} + +#dashtodockPreviewSeparator.popup-separator-menu-item-horizontal { + width: 1px; + height: auto; + border-right-width: 1px; + margin: 32px 0px; +} + +.dashtodock-app-well-preview-menu-item { + padding: 1em 1em 0.5em 1em; +} + +#dashtodockContainer .metro .overview-icon { + border-radius: 0px; +} + +#dashtodockContainer.bottom .metro.running2.focused, +#dashtodockContainer.bottom .metro.running3.focused, +#dashtodockContainer.bottom .metro.running4.focused, +#dashtodockContainer.top .metro.running2.focused, +#dashtodockContainer.top .metro.running3.focused, +#dashtodockContainer.top .metro.running4.focused { + background-image: url("./media/highlight_stacked_bg.svg"); + background-position: 0px 0px; + background-size: contain; +} + +#dashtodockContainer.left .metro.running2.focused, +#dashtodockContainer.left .metro.running3.focused, +#dashtodockContainer.left .metro.running4.focused, +#dashtodockContainer.right .metro.running2.focused, +#dashtodockContainer.right .metro.running3.focused, +#dashtodockContainer.right .metro.running4.focused { + background-image: url("./media/highlight_stacked_bg_h.svg"); + background-position: 0px 0px; + background-size: contain; +} diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/COPYING b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/COPYING deleted file mode 100644 index d159169..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/COPYING +++ /dev/null @@ -1,339 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 2, June 1991 - - Copyright (C) 1989, 1991 Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The licenses for most software are designed to take away your -freedom to share and change it. By contrast, the GNU General Public -License is intended to guarantee your freedom to share and change free -software--to make sure the software is free for all its users. This -General Public License applies to most of the Free Software -Foundation's software and to any other program whose authors commit to -using it. (Some other Free Software Foundation software is covered by -the GNU Lesser General Public License instead.) You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -this service if you wish), that you receive source code or can get it -if you want it, that you can change the software or use pieces of it -in new free programs; and that you know you can do these things. - - To protect your rights, we need to make restrictions that forbid -anyone to deny you these rights or to ask you to surrender the rights. -These restrictions translate to certain responsibilities for you if you -distribute copies of the software, or if you modify it. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must give the recipients all the rights that -you have. You must make sure that they, too, receive or can get the -source code. And you must show them these terms so they know their -rights. - - We protect your rights with two steps: (1) copyright the software, and -(2) offer you this license which gives you legal permission to copy, -distribute and/or modify the software. - - Also, for each author's protection and ours, we want to make certain -that everyone understands that there is no warranty for this free -software. If the software is modified by someone else and passed on, we -want its recipients to know that what they have is not the original, so -that any problems introduced by others will not reflect on the original -authors' reputations. - - Finally, any free program is threatened constantly by software -patents. We wish to avoid the danger that redistributors of a free -program will individually obtain patent licenses, in effect making the -program proprietary. To prevent this, we have made it clear that any -patent must be licensed for everyone's free use or not licensed at all. - - The precise terms and conditions for copying, distribution and -modification follow. - - GNU GENERAL PUBLIC LICENSE - TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION - - 0. This License applies to any program or other work which contains -a notice placed by the copyright holder saying it may be distributed -under the terms of this General Public License. The "Program", below, -refers to any such program or work, and a "work based on the Program" -means either the Program or any derivative work under copyright law: -that is to say, a work containing the Program or a portion of it, -either verbatim or with modifications and/or translated into another -language. (Hereinafter, translation is included without limitation in -the term "modification".) Each licensee is addressed as "you". - -Activities other than copying, distribution and modification are not -covered by this License; they are outside its scope. The act of -running the Program is not restricted, and the output from the Program -is covered only if its contents constitute a work based on the -Program (independent of having been made by running the Program). -Whether that is true depends on what the Program does. - - 1. You may copy and distribute verbatim copies of the Program's -source code as you receive it, in any medium, provided that you -conspicuously and appropriately publish on each copy an appropriate -copyright notice and disclaimer of warranty; keep intact all the -notices that refer to this License and to the absence of any warranty; -and give any other recipients of the Program a copy of this License -along with the Program. - -You may charge a fee for the physical act of transferring a copy, and -you may at your option offer warranty protection in exchange for a fee. - - 2. You may modify your copy or copies of the Program or any portion -of it, thus forming a work based on the Program, and copy and -distribute such modifications or work under the terms of Section 1 -above, provided that you also meet all of these conditions: - - a) You must cause the modified files to carry prominent notices - stating that you changed the files and the date of any change. - - b) You must cause any work that you distribute or publish, that in - whole or in part contains or is derived from the Program or any - part thereof, to be licensed as a whole at no charge to all third - parties under the terms of this License. - - c) If the modified program normally reads commands interactively - when run, you must cause it, when started running for such - interactive use in the most ordinary way, to print or display an - announcement including an appropriate copyright notice and a - notice that there is no warranty (or else, saying that you provide - a warranty) and that users may redistribute the program under - these conditions, and telling the user how to view a copy of this - License. (Exception: if the Program itself is interactive but - does not normally print such an announcement, your work based on - the Program is not required to print an announcement.) - -These requirements apply to the modified work as a whole. If -identifiable sections of that work are not derived from the Program, -and can be reasonably considered independent and separate works in -themselves, then this License, and its terms, do not apply to those -sections when you distribute them as separate works. But when you -distribute the same sections as part of a whole which is a work based -on the Program, the distribution of the whole must be on the terms of -this License, whose permissions for other licensees extend to the -entire whole, and thus to each and every part regardless of who wrote it. - -Thus, it is not the intent of this section to claim rights or contest -your rights to work written entirely by you; rather, the intent is to -exercise the right to control the distribution of derivative or -collective works based on the Program. - -In addition, mere aggregation of another work not based on the Program -with the Program (or with a work based on the Program) on a volume of -a storage or distribution medium does not bring the other work under -the scope of this License. - - 3. You may copy and distribute the Program (or a work based on it, -under Section 2) in object code or executable form under the terms of -Sections 1 and 2 above provided that you also do one of the following: - - a) Accompany it with the complete corresponding machine-readable - source code, which must be distributed under the terms of Sections - 1 and 2 above on a medium customarily used for software interchange; or, - - b) Accompany it with a written offer, valid for at least three - years, to give any third party, for a charge no more than your - cost of physically performing source distribution, a complete - machine-readable copy of the corresponding source code, to be - distributed under the terms of Sections 1 and 2 above on a medium - customarily used for software interchange; or, - - c) Accompany it with the information you received as to the offer - to distribute corresponding source code. (This alternative is - allowed only for noncommercial distribution and only if you - received the program in object code or executable form with such - an offer, in accord with Subsection b above.) - -The source code for a work means the preferred form of the work for -making modifications to it. For an executable work, complete source -code means all the source code for all modules it contains, plus any -associated interface definition files, plus the scripts used to -control compilation and installation of the executable. However, as a -special exception, the source code distributed need not include -anything that is normally distributed (in either source or binary -form) with the major components (compiler, kernel, and so on) of the -operating system on which the executable runs, unless that component -itself accompanies the executable. - -If distribution of executable or object code is made by offering -access to copy from a designated place, then offering equivalent -access to copy the source code from the same place counts as -distribution of the source code, even though third parties are not -compelled to copy the source along with the object code. - - 4. You may not copy, modify, sublicense, or distribute the Program -except as expressly provided under this License. Any attempt -otherwise to copy, modify, sublicense or distribute the Program is -void, and will automatically terminate your rights under this License. -However, parties who have received copies, or rights, from you under -this License will not have their licenses terminated so long as such -parties remain in full compliance. - - 5. You are not required to accept this License, since you have not -signed it. However, nothing else grants you permission to modify or -distribute the Program or its derivative works. These actions are -prohibited by law if you do not accept this License. Therefore, by -modifying or distributing the Program (or any work based on the -Program), you indicate your acceptance of this License to do so, and -all its terms and conditions for copying, distributing or modifying -the Program or works based on it. - - 6. Each time you redistribute the Program (or any work based on the -Program), the recipient automatically receives a license from the -original licensor to copy, distribute or modify the Program subject to -these terms and conditions. You may not impose any further -restrictions on the recipients' exercise of the rights granted herein. -You are not responsible for enforcing compliance by third parties to -this License. - - 7. If, as a consequence of a court judgment or allegation of patent -infringement or for any other reason (not limited to patent issues), -conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot -distribute so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you -may not distribute the Program at all. For example, if a patent -license would not permit royalty-free redistribution of the Program by -all those who receive copies directly or indirectly through you, then -the only way you could satisfy both it and this License would be to -refrain entirely from distribution of the Program. - -If any portion of this section is held invalid or unenforceable under -any particular circumstance, the balance of the section is intended to -apply and the section as a whole is intended to apply in other -circumstances. - -It is not the purpose of this section to induce you to infringe any -patents or other property right claims or to contest validity of any -such claims; this section has the sole purpose of protecting the -integrity of the free software distribution system, which is -implemented by public license practices. Many people have made -generous contributions to the wide range of software distributed -through that system in reliance on consistent application of that -system; it is up to the author/donor to decide if he or she is willing -to distribute software through any other system and a licensee cannot -impose that choice. - -This section is intended to make thoroughly clear what is believed to -be a consequence of the rest of this License. - - 8. If the distribution and/or use of the Program is restricted in -certain countries either by patents or by copyrighted interfaces, the -original copyright holder who places the Program under this License -may add an explicit geographical distribution limitation excluding -those countries, so that distribution is permitted only in or among -countries not thus excluded. In such case, this License incorporates -the limitation as if written in the body of this License. - - 9. The Free Software Foundation may publish revised and/or new versions -of the General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - -Each version is given a distinguishing version number. If the Program -specifies a version number of this License which applies to it and "any -later version", you have the option of following the terms and conditions -either of that version or of any later version published by the Free -Software Foundation. If the Program does not specify a version number of -this License, you may choose any version ever published by the Free Software -Foundation. - - 10. If you wish to incorporate parts of the Program into other free -programs whose distribution conditions are different, write to the author -to ask for permission. For software which is copyrighted by the Free -Software Foundation, write to the Free Software Foundation; we sometimes -make exceptions for this. Our decision will be guided by the two goals -of preserving the free status of all derivatives of our free software and -of promoting the sharing and reuse of software generally. - - NO WARRANTY - - 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY -FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN -OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES -PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED -OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS -TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE -PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, -REPAIR OR CORRECTION. - - 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR -REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, -INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING -OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED -TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY -YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER -PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE -POSSIBILITY OF SUCH DAMAGES. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along - with this program; if not, write to the Free Software Foundation, Inc., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/README.md b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/README.md deleted file mode 100644 index 1c76c69..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/README.md +++ /dev/null @@ -1,45 +0,0 @@ -# Dash to Dock -![screenshot](https://github.com/micheleg/dash-to-dock/raw/master/media/screenshot.jpg) - -## A dock for the GNOME Shell -This extension enhances the dash moving it out of the overview and transforming it in a dock for an easier launching of applications and a faster switching between windows and desktops without having to leave the desktop view. - -[](https://extensions.gnome.org/extension/307/dash-to-dock) - -For additional installation instructions and more information visit [https://micheleg.github.io/dash-to-dock/](https://micheleg.github.io/dash-to-dock/). - -## Installation from source - -The extension can be installed directly from source, either for the convenience of using git or to test the latest development version. Clone the desired branch with git - -### Build Dependencies - -To compile the stylesheet you'll need an implementation of SASS. Dash to Dock supports `dart-sass` (`sass`), `sassc`, and `ruby-sass`. Every distro should have at least one of these implementations, we recommend using `dart-sass` (`sass`) or `sassc` over `ruby-sass` as `ruby-sass` is deprecated. - -By default, Dash to Dock will attempt to build with `dart-sass`. To change this behavior set the `SASS` environment variable to either `sassc` or `ruby`. - -```bash -export SASS=sassc -# or... -export SASS=ruby -``` - -### Building - -Clone the repository or download the branch from github. A simple Makefile is included. - -Next use `make` to install the extension into your home directory. A Shell reload is required `Alt+F2 r Enter` under Xorg or under Wayland you may have to logout and login. The extension has to be enabled with *gnome-extensions-app* (GNOME Extensions) or with *dconf*. - -```bash -git clone https://github.com/micheleg/dash-to-dock.git -make -make install -``` - -## Bug Reporting - -Bugs should be reported to the Github bug tracker [https://github.com/micheleg/dash-to-dock/issues](https://github.com/micheleg/dash-to-dock/issues). - -## License -Dash to Dock Gnome Shell extension is distributed under the terms of the GNU General Public License, -version 2 or later. See the COPYING file for details. diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/Settings.ui b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/Settings.ui deleted file mode 100644 index d2560de..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/Settings.ui +++ /dev/null @@ -1,2660 +0,0 @@ - - - - - 1 - 0.050000000000000003 - 0.25 - - - 0 - 12 - 12 - 12 - 12 - vertical - - - 0 - - - 0 - none - - - 100 - 80 - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - 1 - When set to minimize, double clicking minimizes all the windows of the application. - 1 - 40 - - - - 0 - 1 - - - - - - 0 - 1 - Shift+Click action - - - 0 - 0 - - - - - - 0 - center - - Raise window - Minimize window - Launch new instance - Cycle through windows - Minimize or overview - Show window previews - Minimize or show previews - Focus or show previews - Focus, minimize or show previews - Quit - - - 1 - 0 - 2 - - - - - - - - - - 100 - 80 - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - 1 - Behavior for Middle-Click. - 1 - 40 - - - - 0 - 1 - - - - - - 0 - 1 - Middle-Click action - - - 0 - 0 - - - - - - 0 - center - - Raise window - Minimize window - Launch new instance - Cycle through windows - Minimize or overview - Show window previews - Minimize or show previews - Focus or show previews - Focus, minimize or show previews - Quit - - - 1 - 0 - 2 - - - - - - - - - - 100 - 80 - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - 1 - Behavior for Shift+Middle-Click. - 1 - 40 - - - - 0 - 1 - - - - - - 0 - 1 - Shift+Middle-Click action - - - 0 - 0 - - - - - - 0 - center - - Raise window - Minimize window - Launch new instance - Cycle through windows - Minimize or overview - Show window previews - Minimize or show previews - Focus or show previews - Focus, minimize or show previews - Quit - - - 1 - 0 - 2 - - - - - - - - - - - - - - - - - 1 - 0.01 - 0.10 - - - 0.33 - 1 - 0.01 - 0.10 - - - 10 - 1 - 5 - - - 0 - 12 - 12 - 12 - 12 - vertical - - - 0 - - - - 0 - none - - - 100 - 80 - - - 0 - 12 - 12 - 12 - 12 - vertical - 12 - - - 0 - 32 - - - 1 - 0 - center - Enable Unity7 like glossy backlit items - - - - - - center - - - - - - - 0 - - - 1 - 0 - start - Use dominant color - - - - - - - - - - 0 - 32 - - - - 1 - 0 - - - - - - 0 - 1 - Customize indicator style - fill - - - 0 - 0 - - - - - - - - 0 - 1 - vertical - 12 - - - 0 - 32 - - - 1 - 0 - Color - - - - - - 1 - - - - - - - 0 - 32 - - - 1 - 0 - Border color - - - - - - 1 - - - - - - - 0 - 32 - - - 1 - 0 - Border width - - - - - - dot_border_width_adjustment - - - - - - - - - - - - - - - - - - - - 1 - 0.050000000000000003 - 0.25 - - - 16 - 128 - 1 - 10 - - - 6 - 6 - 6 - 6 - - - - - 0 - 24 - 24 - 24 - 24 - vertical - 24 - - - 0 - - - - 0 - none - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - 1 - start - Show the dock on - - 0 - 0 - - - - - - 0 - center - - - 1 - 0 - - - - - - Show on all monitors. - 12 - - - 0 - 2 - 2 - - - - - - - - - - - - - - - - 100 - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - 1 - Position on screen - - - - - - 0 - 32 - - - Left - end - center - - - - - - - Bottom - center - - position_left_button - - - - - - Top - center - - - position_left_button - - - - - - Right - center - - position_left_button - - - - - - - - - - - - - - - - - - - 0 - - - - 0 - none - - - 100 - 80 - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - 1 - start - Hide the dock when it obstructs a window of the current application. More refined settings are available. - 1 - - - - 0 - 1 - - - - - - 0 - 1 - start - Intelligent autohide - - - 0 - 0 - - - - - - 0 - 6 - - - 1 - center - center - - - - 0 - emblem-system-symbolic - - - - - - - - end - center - - - - 1 - 0 - 2 - - - - - - - - - - - - - - - - - 0 - - - - 0 - none - - - 100 - 80 - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - Dock size limit - - - 0 - 0 - - - - - - 1 - baseline - 1 - dock_size_adjustment - 0 - 2 - right - - - 1 - 0 - - - - - - Panel mode: extend to the screen edge - 12 - - - 0 - 1 - 2 - - - - - - - - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - Icon size limit - - - 0 - 0 - - - - - - 1 - baseline - 1 - icon_size_adjustment - 1 - 0 - right - - - 1 - 0 - - - - - - Fixed icon size: scroll to reveal other icons - 12 - - - 0 - 1 - 2 - - - - - - - - - - - - - - - - - - - 0 - Position and size - - - - - - - 1 - - - 0 - 24 - 24 - 24 - 24 - vertical - 24 - - - 0 - - - - 0 - none - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - end - center - - 1 - 0 - - - - - - 0 - 1 - start - Show favorite applications - - - 0 - 0 - - - - - - - - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - end - center - - 1 - 0 - - - - - - 0 - 1 - start - Show running applications - - - 0 - 0 - - - - - - Isolate workspaces. - start - 12 - - - 0 - 2 - 2 - - - - - - Isolate monitors. - start - 12 - - - 0 - 3 - 2 - - - - - - 3 - - - - 0 - Show open windows previews. - 1 - - - - 0 - 1 - 2 - - - - - - - - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - end - center - - 1 - 0 - 2 - - - - - - 0 - 1 - If disabled, these settings are accessible from gnome-tweak-tool or the extension website. - 1 - - - - 0 - 1 - - - - - - 0 - 1 - start - Show <i>Applications</i> icon - 1 - - - 0 - 0 - - - - - - Move the applications button at the beginning of the dock. - start - 12 - - - 0 - 2 - 2 - - - - - - 3 - - - - - 0 - start - Animate <i>Show Applications</i>. - 1 - - - - 0 - 3 - 2 - - - - - - - - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - end - center - - 1 - 0 - - - - - - 0 - 1 - start - Show trash can - - - 0 - 0 - - - - - - - - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - end - center - - 1 - 0 - - - - - - 0 - 1 - start - Show mounted volumes and devices - - - 0 - 0 - - - - - - - - - - - - - - - - - - - 0 - Launchers - - - - - - - 2 - - - 0 - 24 - 24 - 24 - 24 - vertical - 24 - - - 0 - - - - 0 - none - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - start - 1 - Enable Super+(0-9) as shortcuts to activate apps. It can also be used together with Shift and Ctrl. - 1 - 1 - - - - 0 - 1 - - - - - - 0 - 1 - start - Use keyboard shortcuts to activate apps - - - 0 - 0 - - - - - - 0 - 6 - - - 1 - center - center - - - - 0 - emblem-system-symbolic - - - - - - - - end - center - - - - 1 - 0 - 2 - - - - - - - - - - - - - - - - - 0 - - - - 0 - none - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - 1 - start - Behaviour when clicking on the icon of a running application. - 1 - - - - 0 - 1 - - - - - - 0 - 1 - start - Click action - - - 0 - 0 - - - - - - 0 - 6 - - - 1 - center - - - 0 - emblem-system-symbolic - - - - - - - - 0 - center - - Raise window - Minimize - Launch new instance - Cycle through windows - Minimize or overview - Show window previews - Minimize or show previews - Focus or show previews - Focus, minimize or show previews - - - - - 1 - 0 - 2 - - - - - - - - - - - - - - - - - 0 - - - - 0 - none - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - 1 - start - Behaviour when scrolling on the icon of an application. - 1 - - - - 0 - 1 - - - - - - 0 - 1 - start - Scroll action - - - 0 - 0 - - - - - - 0 - 6 - - - 0 - center - - Do nothing - Cycle through windows - Switch workspace - - - - - 1 - 0 - 2 - - - - - - - - - - - - - - - - - - - 0 - start - Behavior - - - - - - - 3 - - - 0 - 24 - 24 - 24 - 24 - vertical - 24 - - - 0 - - - - none - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - 1 - start - Few customizations meant to integrate the dock with the default GNOME theme. Alternatively, specific options can be enabled below. - 1 - - - - 0 - 1 - - - - - - 0 - 1 - start - Use built-in theme - - - 0 - 0 - - - - - - end - center - - 1 - 0 - 2 - - - - - - - - - - - - - - - - - 0 - - - - 0 - none - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - end - center - - 1 - 0 - 2 - - - - - - 0 - 1 - start - Save space reducing padding and border radius. - - - - 0 - 1 - - - - - - 0 - 1 - start - Shrink the dash - - - 0 - 0 - - - - - - - - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - 1 - start - Customize windows counter indicators - - - 0 - 0 - - - - - - 0 - 6 - - - 1 - center - center - - - - 0 - emblem-system-symbolic - - - - - - - - 0 - - Default - Dots - Squares - Dashes - Segmented - Solid - Ciliora - Metro - - - - - 1 - 0 - 2 - - - - - - - - - - - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - 1 - start - Set the background color for the dash. - 1 - - - - 0 - 1 - - - - - - 0 - 1 - start - Customize the dash color - - - 0 - 0 - - - - - - 0 - 6 - - - 1 - center - center - - - - - - end - center - - - - 1 - 0 - 2 - - - - - - - - - - - - 0 - vertical - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - 1 - start - Tune the dash background opacity. - - - - 0 - 1 - - - - - - 0 - 1 - start - Customize opacity - - - 0 - 0 - - - - - - 0 - 6 - - - 1 - center - center - - - 0 - emblem-system-symbolic - - - - - - - - 0 - center - - Default - Fixed - Dynamic - - - - - 1 - 0 - 2 - - - - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - Opacity - - - - - 1 - 1 - custom_opacity_adjustement - - 0 - 0 - 0 - 2 - right - - - - - - - - - - - - 100 - 80 - - - 0 - 32 - - - 1 - 0 - center - start - Force straight corner - - - - - - center - 3 - - - - - - - - - - - - - - - - - - 0 - Appearance - - - - - - - 4 - - - 0 - 0 - 24 - 24 - 1 - 1 - vertical - 5 - - - - - - 0 - <b>Dash to Dock</b> - 1 - - - - - 0 - center - - - 0 - end - version: - - - - - 0 - start - ... - - - - - - - 0 - Moves the dash out of the overview transforming it in a dock - center - 1 - - - - - 0 - center - 5 - - - 0 - Created by - - - - - Michele (<a href="mailto:micxgx@gmail.com">micxgx@gmail.com</a>) - 1 - - - - - - - Webpage - 1 - center - - https://micheleg.github.io/dash-to-dock/ - - - - - 1 - end - <span size="small">This program comes with ABSOLUTELY NO WARRANTY. -See the <a href="https://www.gnu.org/licenses/old-licenses/gpl-2.0.html">GNU General Public License, version 2 or later</a> for details.</span> - 1 - center - 1 - - - - - - - 0 - About - - - - - - - 1 - 0.01 - 0.10000000000000001 - - - 1 - 0.01 - 0.10000000000000001 - - - 0 - 12 - 12 - 12 - 12 - vertical - - - 0 - - - - 0 - none - - - 100 - 80 - - - 0 - 12 - 12 - 12 - 12 - vertical - 12 - - - 0 - 32 - - - - 1 - 0 - - - - - - 0 - 1 - Customize minimum and maximum opacity values - fill - - - 0 - 0 - - - - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - Minimum opacity - - - - - 1 - 1 - min_opacity_adjustement - - 0 - 0 - 0 - 2 - right - - - - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - Maximum opacity - - - - - 1 - 1 - max_opacity_adjustement - - 0 - 0 - 0 - 2 - right - - - - - - - - - - - - - - - - - - - 1000 - 50 - 250 - - - 10 - 0.25 - 1 - - - 0 - 12 - 12 - 12 - 12 - vertical - - - 0 - - - - 0 - none - - - 100 - 80 - - - 0 - 12 - 12 - 12 - 12 - 32 - - - end - center - - 1 - 0 - 2 - - - - - - 0 - 1 - Number overlay - - - 0 - 0 - - - - - - 0 - Temporarily show the application numbers over the icons, corresponding to the shortcut. - 1 - 40 - - - - 0 - 1 - - - - - - - - - - 100 - 80 - - - 0 - 12 - 12 - 12 - 12 - 32 - - - end - center - - 1 - 0 - 2 - - - - - - 0 - 1 - start - Show the dock if it is hidden - - - 0 - 0 - - - - - - 0 - If using autohide, the dock will appear for a short time when triggering the shortcut. - 1 - 40 - - - - 0 - 1 - - - - - - - - - - 100 - 80 - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - center - 12 - - 1 - 0 - - - - - - 0 - 1 - Shortcut for the options above - - - 0 - 0 - - - - - - 0 - Syntax: <Shift>, <Ctrl>, <Alt>, <Super> - 1 - 40 - - - - 0 - 1 - - - - - - - - - - - - - - - 0 - 12 - 12 - 12 - 12 - 1 - 6 - 32 - - - end - shortcut_time_adjustment - 3 - - 1 - 0 - - - - - - 0 - 1 - Hide timeout (s) - - - 0 - 0 - - - - - - - - - - - - - - - - - 1 - 0.050000000000000003 - 0.25 - - - 0 - 12 - 12 - 12 - 12 - vertical - - - 0 - - - - 0 - none - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - 1 - start - Show the dock by mouse hover on the screen edge. - 1 - - - - 0 - 1 - - - - - - 0 - 1 - Autohide - - - 0 - 0 - - - - - - end - center - - 1 - 0 - 2 - - - - - - Push to show: require pressure to show the dock - - - 0 - 3 - 2 - - - - - - Enable in fullscreen mode - 12 - - - 0 - 2 - 2 - - - - - - - - - - - - 0 - 12 - 12 - 12 - 12 - 32 - - - 0 - 1 - start - Show the dock when it doesn't obstruct application windows. - 1 - - - - 0 - 1 - - - - - - 0 - 1 - Dodge windows - - - 0 - 0 - - - - - - end - center - - 1 - 0 - 2 - - - - - - 0 - vertical - - - All windows - 12 - - 1 - - - - - - Only focused application's windows - - 1 - all_windows_radio_button - - - - - - Only maximized windows - - 1 - all_windows_radio_button - - - - - 0 - 2 - 2 - - - - - - - - - - - - 0 - 12 - 12 - 12 - 12 - 1 - 6 - 32 - - - end - animation_time_adjustment - 3 - - 1 - 0 - - - - - - 0 - 1 - Animation duration (s) - - - 0 - 0 - - - - - - end - hide_timeout_adjustment - 3 - - 1 - 1 - - - - - - end - show_timeout_adjustment - 3 - - 1 - 2 - - - - - - 0.000 - pressure_threshold_adjustment - - 1 - 3 - - - - - - 0 - 1 - Hide timeout (s) - - - 0 - 1 - - - - - - 0 - 1 - Show timeout (s) - - - 0 - 2 - - - - - - 0 - 1 - Pressure threshold - - - 0 - 3 - - - - - - - - - - - - - - - - diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/appIconIndicators.js b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/appIconIndicators.js deleted file mode 100644 index f015a80..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/appIconIndicators.js +++ /dev/null @@ -1,1078 +0,0 @@ -const Cairo = imports.cairo; -const Clutter = imports.gi.Clutter; -const GdkPixbuf = imports.gi.GdkPixbuf -const Gio = imports.gi.Gio; -const Graphene = imports.gi.Graphene; -const Gtk = imports.gi.Gtk; -const Main = imports.ui.main; -const Pango = imports.gi.Pango; -const Shell = imports.gi.Shell; -const St = imports.gi.St; - -const Util = imports.misc.util; - -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Docking = Me.imports.docking; -const Utils = Me.imports.utils; - -let tracker = Shell.WindowTracker.get_default(); - -const RunningIndicatorStyle = { - DEFAULT: 0, - DOTS: 1, - SQUARES: 2, - DASHES: 3, - SEGMENTED: 4, - SOLID: 5, - CILIORA: 6, - METRO: 7 -}; - -const MAX_WINDOWS_CLASSES = 4; - - -/* - * This is the main indicator class to be used. The desired bahviour is - * obtained by composing the desired classes below based on the settings. - * - */ -var AppIconIndicator = class DashToDock_AppIconIndicator { - - constructor(source) { - this._indicators = []; - - // Unity indicators always enabled for now - let unityIndicator = new UnityIndicator(source); - this._indicators.push(unityIndicator); - - // Choose the style for the running indicators - let runningIndicator = null; - let runningIndicatorStyle; - - let settings = Docking.DockManager.settings; - if (settings.get_boolean('apply-custom-theme' )) { - runningIndicatorStyle = RunningIndicatorStyle.DOTS; - } else { - runningIndicatorStyle = settings.get_enum('running-indicator-style'); - } - - switch (runningIndicatorStyle) { - case RunningIndicatorStyle.DEFAULT: - runningIndicator = new RunningIndicatorDefault(source); - break; - - case RunningIndicatorStyle.DOTS: - runningIndicator = new RunningIndicatorDots(source); - break; - - case RunningIndicatorStyle.SQUARES: - runningIndicator = new RunningIndicatorSquares(source); - break; - - case RunningIndicatorStyle.DASHES: - runningIndicator = new RunningIndicatorDashes(source); - break; - - case RunningIndicatorStyle.SEGMENTED: - runningIndicator = new RunningIndicatorSegmented(source); - break; - - case RunningIndicatorStyle.SOLID: - runningIndicator = new RunningIndicatorSolid(source); - break; - - case RunningIndicatorStyle.CILIORA: - runningIndicator = new RunningIndicatorCiliora(source); - break; - - case RunningIndicatorStyle.METRO: - runningIndicator = new RunningIndicatorMetro(source); - break; - - default: - runningIndicator = new RunningIndicatorBase(source); - } - - this._indicators.push(runningIndicator); - } - - update() { - for (let i=0; i { - this._signalsHandler.destroy(); - }); - } - - update() { - } - - destroy() { - this._source.disconnect(this._sourceDestroyId); - this._signalsHandler.destroy(); - } -}; - -/* - * A base indicator class for running style, from which all other EunningIndicators should derive, - * providing some basic methods, variables definitions and their update, css style classes handling. - * - */ -var RunningIndicatorBase = class DashToDock_RunningIndicatorBase extends IndicatorBase { - - constructor(source) { - super(source) - - this._side = Utils.getPosition(); - this._nWindows = 0; - - this._dominantColorExtractor = new DominantColorExtractor(this._source.app); - - // These statuses take into account the workspace/monitor isolation - this._isFocused = false; - this._isRunning = false; - } - - update() { - // Limit to 1 to MAX_WINDOWS_CLASSES windows classes - this._nWindows = Math.min(this._source.getInterestingWindows().length, MAX_WINDOWS_CLASSES); - - // We need to check the number of windows, as the focus might be - // happening on another monitor if using isolation - if (tracker.focus_app == this._source.app && this._nWindows > 0) - this._isFocused = true; - else - this._isFocused = false; - - // In the case of workspace isolation, we need to hide the dots of apps with - // no windows in the current workspace - if ((this._source.app.state != Shell.AppState.STOPPED || this._source.isLocation()) && this._nWindows > 0) - this._isRunning = true; - else - this._isRunning = false; - - this._updateCounterClass(); - this._updateFocusClass(); - this._updateDefaultDot(); - } - - _updateCounterClass() { - for (let i = 1; i <= MAX_WINDOWS_CLASSES; i++) { - let className = 'running' + i; - if (i != this._nWindows) - this._source.remove_style_class_name(className); - else - this._source.add_style_class_name(className); - } - } - - _updateFocusClass() { - if (this._isFocused) - this._source.add_style_class_name('focused'); - else - this._source.remove_style_class_name('focused'); - } - - _updateDefaultDot() { - if (this._isRunning) - this._source._dot.show(); - else - this._source._dot.hide(); - } - - _hideDefaultDot() { - // I use opacity to hide the default dot because the show/hide function - // are used by the parent class. - this._source._dot.opacity = 0; - } - - _restoreDefaultDot() { - this._source._dot.opacity = 255; - } - - _enableBacklight() { - - let colorPalette = this._dominantColorExtractor._getColorPalette(); - - // Fallback - if (colorPalette === null) { - this._source._iconContainer.set_style( - 'border-radius: 5px;' + - 'background-gradient-direction: vertical;' + - 'background-gradient-start: #e0e0e0;' + - 'background-gradient-end: darkgray;' - ); - - return; - } - - this._source._iconContainer.set_style( - 'border-radius: 5px;' + - 'background-gradient-direction: vertical;' + - 'background-gradient-start: ' + colorPalette.original + ';' + - 'background-gradient-end: ' + colorPalette.darker + ';' - ); - - } - - _disableBacklight() { - this._source._iconContainer.set_style(null); - } - - destroy() { - this._disableBacklight(); - // Remove glossy background if the children still exists - if (this._source._iconContainer.get_children().length > 1) - this._source._iconContainer.get_children()[1].set_style(null); - this._restoreDefaultDot(); - - super.destroy(); - } -}; - -// We add a css class so third parties themes can limit their indicaor customization -// to the case we do nothing -var RunningIndicatorDefault = class DashToDock_RunningIndicatorDefault extends RunningIndicatorBase { - - constructor(source) { - super(source); - this._source.add_style_class_name('default'); - } - - destroy() { - this._source.remove_style_class_name('default'); - super.destroy(); - } -}; - -var RunningIndicatorDots = class DashToDock_RunningIndicatorDots extends RunningIndicatorBase { - - constructor(source) { - super(source) - - this._hideDefaultDot(); - - this._area = new St.DrawingArea({x_expand: true, y_expand: true}); - - // We draw for the bottom case and rotate the canvas for other placements - //set center of rotatoins to the center - this._area.set_pivot_point(0.5, 0.5); - // prepare transformation matrix - let m = new Graphene.Matrix(); - m.init_identity(); - let v = new Graphene.Vec3(); - v.init(0, 0, 1); - - switch (this._side) { - case St.Side.TOP: - m.xx = -1; - m.rotate(180, v); - break - - case St.Side.BOTTOM: - // nothing - break; - - case St.Side.LEFT: - m.yy = -1; - m.rotate(90, v); - break; - - case St.Side.RIGHT: - m.rotate(-90, v); - break - } - - this._area.set_transform(m); - - this._area.connect('repaint', this._updateIndicator.bind(this)); - this._source._iconContainer.add_child(this._area); - - let keys = ['custom-theme-running-dots-color', - 'custom-theme-running-dots-border-color', - 'custom-theme-running-dots-border-width', - 'custom-theme-customize-running-dots', - 'unity-backlit-items', - 'running-indicator-dominant-color']; - - keys.forEach(function(key) { - this._signalsHandler.add([ - Docking.DockManager.settings, - 'changed::' + key, - this.update.bind(this) - ]); - }, this); - - // Apply glossy background - // TODO: move to enable/disableBacklit to apply itonly to the running apps? - // TODO: move to css class for theming support - this._glossyBackgroundStyle = 'background-image: url(\'' + Me.path + '/media/glossy.svg\');' + - 'background-size: contain;'; - } - - update() { - super.update(); - - // Enable / Disable the backlight of running apps - if (!Docking.DockManager.settings.get_boolean('apply-custom-theme') && - Docking.DockManager.settings.get_boolean('unity-backlit-items')) { - this._source._iconContainer.get_children()[1].set_style(this._glossyBackgroundStyle); - if (this._isRunning) - this._enableBacklight(); - else - this._disableBacklight(); - } else { - this._disableBacklight(); - this._source._iconContainer.get_children()[1].set_style(null); - } - - if (this._area) - this._area.queue_repaint(); - } - - _computeStyle() { - - let [width, height] = this._area.get_surface_size(); - this._width = height; - this._height = width; - - // By defaut re-use the style - background color, and border width and color - - // of the default dot - let themeNode = this._source._dot.get_theme_node(); - this._borderColor = themeNode.get_border_color(this._side); - this._borderWidth = themeNode.get_border_width(this._side); - this._bodyColor = themeNode.get_background_color(); - - let settings = Docking.DockManager.settings; - if (!settings.get_boolean('apply-custom-theme')) { - // Adjust for the backlit case - if (settings.get_boolean('unity-backlit-items')) { - // Use dominant color for dots too if the backlit is enables - let colorPalette = this._dominantColorExtractor._getColorPalette(); - - // Slightly adjust the styling - this._borderWidth = 2; - - if (colorPalette !== null) { - this._borderColor = Clutter.color_from_string(colorPalette.lighter)[1] ; - this._bodyColor = Clutter.color_from_string(colorPalette.darker)[1]; - } else { - // Fallback - this._borderColor = Clutter.color_from_string('white')[1]; - this._bodyColor = Clutter.color_from_string('gray')[1]; - } - } - - // Apply dominant color if requested - if (settings.get_boolean('running-indicator-dominant-color')) { - let colorPalette = this._dominantColorExtractor._getColorPalette(); - if (colorPalette !== null) { - this._bodyColor = Clutter.color_from_string(colorPalette.original)[1]; - } - } - - // Finally, use customize style if requested - if (settings.get_boolean('custom-theme-customize-running-dots')) { - this._borderColor = Clutter.color_from_string(settings.get_string('custom-theme-running-dots-border-color'))[1]; - this._borderWidth = settings.get_int('custom-theme-running-dots-border-width'); - this._bodyColor = Clutter.color_from_string(settings.get_string('custom-theme-running-dots-color'))[1]; - } - } - - // Define the radius as an arbitrary size, but keep large enough to account - // for the drawing of the border. - this._radius = Math.max(this._width/22, this._borderWidth/2); - this._padding = 0; // distance from the margin - this._spacing = this._radius + this._borderWidth; // separation between the dots - } - - _updateIndicator() { - - let area = this._area; - let cr = this._area.get_context(); - - this._computeStyle(); - this._drawIndicator(cr); - cr.$dispose(); - } - - _drawIndicator(cr) { - // Draw the required numbers of dots - let n = this._nWindows; - - cr.setLineWidth(this._borderWidth); - Clutter.cairo_set_source_color(cr, this._borderColor); - - // draw for the bottom case: - cr.translate((this._width - (2*n)*this._radius - (n-1)*this._spacing)/2, this._height - this._padding); - for (let i = 0; i < n; i++) { - cr.newSubPath(); - cr.arc((2*i+1)*this._radius + i*this._spacing, -this._radius - this._borderWidth/2, this._radius, 0, 2*Math.PI); - } - - cr.strokePreserve(); - Clutter.cairo_set_source_color(cr, this._bodyColor); - cr.fill(); - } - - destroy() { - this._area.destroy(); - super.destroy(); - } -}; - -// Adapted from dash-to-panel by Jason DeRose -// https://github.com/jderose9/dash-to-panel -var RunningIndicatorCiliora = class DashToDock_RunningIndicatorCiliora extends RunningIndicatorDots { - - _drawIndicator(cr) { - if (this._isRunning) { - - let size = Math.max(this._width/20, this._borderWidth); - let spacing = size; // separation between the dots - let lineLength = this._width - (size*(this._nWindows-1)) - (spacing*(this._nWindows-1)); - let padding = this._borderWidth; - // For the backlit case here we don't want the outer border visible - if (Docking.DockManager.settings.get_boolean('unity-backlit-items') && - !Docking.DockManager.settings.get_boolean('custom-theme-customize-running-dots')) - padding = 0; - let yOffset = this._height - padding - size; - - cr.setLineWidth(this._borderWidth); - Clutter.cairo_set_source_color(cr, this._borderColor); - - cr.translate(0, yOffset); - cr.newSubPath(); - cr.rectangle(0, 0, lineLength, size); - for (let i = 1; i < this._nWindows; i++) { - cr.newSubPath(); - cr.rectangle(lineLength + (i*spacing) + ((i-1)*size), 0, size, size); - } - - cr.strokePreserve(); - Clutter.cairo_set_source_color(cr, this._bodyColor); - cr.fill(); - } - } -}; - -// Adapted from dash-to-panel by Jason DeRose -// https://github.com/jderose9/dash-to-panel -var RunningIndicatorSegmented = class DashToDock_RunningIndicatorSegmented extends RunningIndicatorDots { - - _drawIndicator(cr) { - if (this._isRunning) { - let size = Math.max(this._width/20, this._borderWidth); - let spacing = Math.ceil(this._width/18); // separation between the dots - let dashLength = Math.ceil((this._width - ((this._nWindows-1)*spacing))/this._nWindows); - let lineLength = this._width - (size*(this._nWindows-1)) - (spacing*(this._nWindows-1)); - let padding = this._borderWidth; - // For the backlit case here we don't want the outer border visible - if (Docking.DockManager.settings.get_boolean('unity-backlit-items') && - !Docking.DockManager.settings.get_boolean('custom-theme-customize-running-dots')) - padding = 0; - let yOffset = this._height - padding - size; - - cr.setLineWidth(this._borderWidth); - Clutter.cairo_set_source_color(cr, this._borderColor); - - cr.translate(0, yOffset); - for (let i = 0; i < this._nWindows; i++) { - cr.newSubPath(); - cr.rectangle(i*dashLength + i*spacing, 0, dashLength, size); - } - - cr.strokePreserve(); - Clutter.cairo_set_source_color(cr, this._bodyColor); - cr.fill() - } - } -}; - -// Adapted from dash-to-panel by Jason DeRose -// https://github.com/jderose9/dash-to-panel -var RunningIndicatorSolid = class DashToDock_RunningIndicatorSolid extends RunningIndicatorDots { - - _drawIndicator(cr) { - if (this._isRunning) { - - let size = Math.max(this._width/20, this._borderWidth); - let padding = this._borderWidth; - // For the backlit case here we don't want the outer border visible - if (Docking.DockManager.settings.get_boolean('unity-backlit-items') && - !Docking.DockManager.settings.get_boolean('custom-theme-customize-running-dots')) - padding = 0; - let yOffset = this._height - padding - size; - - cr.setLineWidth(this._borderWidth); - Clutter.cairo_set_source_color(cr, this._borderColor); - - cr.translate(0, yOffset); - cr.newSubPath(); - cr.rectangle(0, 0, this._width, size); - - cr.strokePreserve(); - Clutter.cairo_set_source_color(cr, this._bodyColor); - cr.fill(); - - } - } -}; - -// Adapted from dash-to-panel by Jason DeRose -// https://github.com/jderose9/dash-to-panel -var RunningIndicatorSquares = class DashToDock_RunningIndicatorSquares extends RunningIndicatorDots { - - _drawIndicator(cr) { - if (this._isRunning) { - let size = Math.max(this._width/11, this._borderWidth); - let padding = this._borderWidth; - let spacing = Math.ceil(this._width/18); // separation between the dots - let yOffset = this._height - padding - size; - - cr.setLineWidth(this._borderWidth); - Clutter.cairo_set_source_color(cr, this._borderColor); - - cr.translate(Math.floor((this._width - this._nWindows*size - (this._nWindows-1)*spacing)/2), yOffset); - for (let i = 0; i < this._nWindows; i++) { - cr.newSubPath(); - cr.rectangle(i*size + i*spacing, 0, size, size); - } - cr.strokePreserve(); - Clutter.cairo_set_source_color(cr, this._bodyColor); - cr.fill(); - } - } -} - -// Adapted from dash-to-panel by Jason DeRose -// https://github.com/jderose9/dash-to-panel -var RunningIndicatorDashes = class DashToDock_RunningIndicatorDashes extends RunningIndicatorDots { - - _drawIndicator(cr) { - if (this._isRunning) { - let size = Math.max(this._width/20, this._borderWidth); - let padding = this._borderWidth; - let spacing = Math.ceil(this._width/18); // separation between the dots - let dashLength = Math.floor(this._width/4) - spacing; - let yOffset = this._height - padding - size; - - cr.setLineWidth(this._borderWidth); - Clutter.cairo_set_source_color(cr, this._borderColor); - - cr.translate(Math.floor((this._width - this._nWindows*dashLength - (this._nWindows-1)*spacing)/2), yOffset); - for (let i = 0; i < this._nWindows; i++) { - cr.newSubPath(); - cr.rectangle(i*dashLength + i*spacing, 0, dashLength, size); - } - - cr.strokePreserve(); - Clutter.cairo_set_source_color(cr, this._bodyColor); - cr.fill(); - } - } -} - -// Adapted from dash-to-panel by Jason DeRose -// https://github.com/jderose9/dash-to-panel -var RunningIndicatorMetro = class DashToDock_RunningIndicatorMetro extends RunningIndicatorDots { - - constructor(source) { - super(source); - this._source.add_style_class_name('metro'); - } - - destroy() { - this._source.remove_style_class_name('metro'); - super.destroy(); - } - - _drawIndicator(cr) { - if (this._isRunning) { - let size = Math.max(this._width/20, this._borderWidth); - let padding = 0; - // For the backlit case here we don't want the outer border visible - if (Docking.DockManager.settings.get_boolean('unity-backlit-items') && - !Docking.DockManager.settings.get_boolean('custom-theme-customize-running-dots')) - padding = 0; - let yOffset = this._height - padding - size; - - let n = this._nWindows; - if(n <= 1) { - cr.translate(0, yOffset); - Clutter.cairo_set_source_color(cr, this._bodyColor); - cr.newSubPath(); - cr.rectangle(0, 0, this._width, size); - cr.fill(); - } else { - let blackenedLength = (1/48)*this._width; // need to scale with the SVG for the stacked highlight - let darkenedLength = this._isFocused ? (2/48)*this._width : (10/48)*this._width; - let blackenedColor = this._bodyColor.shade(.3); - let darkenedColor = this._bodyColor.shade(.7); - - cr.translate(0, yOffset); - - Clutter.cairo_set_source_color(cr, this._bodyColor); - cr.newSubPath(); - cr.rectangle(0, 0, this._width - darkenedLength - blackenedLength, size); - cr.fill(); - Clutter.cairo_set_source_color(cr, blackenedColor); - cr.newSubPath(); - cr.rectangle(this._width - darkenedLength - blackenedLength, 0, 1, size); - cr.fill(); - Clutter.cairo_set_source_color(cr, darkenedColor); - cr.newSubPath(); - cr.rectangle(this._width - darkenedLength, 0, darkenedLength, size); - cr.fill(); - } - } - } -} - -/* - * Unity like notification and progress indicators - */ -var UnityIndicator = class DashToDock_UnityIndicator extends IndicatorBase { - - constructor(source) { - - super(source); - - this._notificationBadgeLabel = new St.Label(); - this._notificationBadgeBin = new St.Bin({ - child: this._notificationBadgeLabel, - x_align: Clutter.ActorAlign.END, - y_align: Clutter.ActorAlign.START, - x_expand: true, y_expand: true - }); - this._notificationBadgeLabel.add_style_class_name('notification-badge'); - this._notificationBadgeLabel.clutter_text.ellipsize = Pango.EllipsizeMode.MIDDLE; - this._notificationBadgeBin.hide(); - - this._source._iconContainer.add_child(this._notificationBadgeBin); - this.updateNotificationBadgeStyle(); - - const remoteEntry = this._source.remoteModel.lookupById(this._source.app.id); - this._signalsHandler.add([ - remoteEntry, - ['count-changed', 'count-visible-changed'], - (sender, { count, count_visible }) => - this.setNotificationCount(count_visible ? count : 0) - ], [ - remoteEntry, - ['progress-changed', 'progress-visible-changed'], - (sender, { progress, progress_visible }) => - this.setProgress(progress_visible ? progress : -1) - ], [ - remoteEntry, - 'urgent-changed', - (sender, { urgent }) => this.setUrgent(urgent) - ], [ - St.ThemeContext.get_for_stage(global.stage), - 'changed', - this.updateNotificationBadgeStyle.bind(this) - ], [ - this._source._iconContainer, - 'notify::size', - this.updateNotificationBadgeStyle.bind(this) - ]); - - this._isUrgent = false; - } - - updateNotificationBadgeStyle() { - let themeContext = St.ThemeContext.get_for_stage(global.stage); - let fontDesc = themeContext.get_font(); - let defaultFontSize = fontDesc.get_size() / 1024; - let fontSize = defaultFontSize * 0.9; - let iconSize = Main.overview.dash.iconSize; - let defaultIconSize = Docking.DockManager.settings.get_default_value( - 'dash-max-icon-size').unpack(); - - if (!fontDesc.get_size_is_absolute()) { - // fontSize was exprimed in points, so convert to pixel - fontSize /= 0.75; - } - - fontSize = Math.round((iconSize / defaultIconSize) * fontSize); - let leftMargin = Math.round((iconSize / defaultIconSize) * 3); - - this._notificationBadgeLabel.set_style( - 'font-size: ' + fontSize + 'px;' + - 'margin-left: ' + leftMargin + 'px' - ); - } - - _notificationBadgeCountToText(count) { - if (count <= 9999) { - return count.toString(); - } else if (count < 1e5) { - let thousands = count / 1e3; - return thousands.toFixed(1).toString() + "k"; - } else if (count < 1e6) { - let thousands = count / 1e3; - return thousands.toFixed(0).toString() + "k"; - } else if (count < 1e8) { - let millions = count / 1e6; - return millions.toFixed(1).toString() + "M"; - } else if (count < 1e9) { - let millions = count / 1e6; - return millions.toFixed(0).toString() + "M"; - } else { - let billions = count / 1e9; - return billions.toFixed(1).toString() + "B"; - } - } - - setNotificationCount(count) { - if (count > 0) { - let text = this._notificationBadgeCountToText(count); - this._notificationBadgeLabel.set_text(text); - this._notificationBadgeBin.show(); - } else { - this._notificationBadgeBin.hide(); - } - } - - _showProgressOverlay() { - if (this._progressOverlayArea) { - this._updateProgressOverlay(); - return; - } - - this._progressOverlayArea = new St.DrawingArea({x_expand: true, y_expand: true}); - this._progressOverlayArea.add_style_class_name('progress-bar'); - this._progressOverlayArea.connect('repaint', () => { - this._drawProgressOverlay(this._progressOverlayArea); - }); - - this._source._iconContainer.add_child(this._progressOverlayArea); - let node = this._progressOverlayArea.get_theme_node(); - - let [hasColor, color] = node.lookup_color('-progress-bar-background', false); - if (hasColor) - this._progressbar_background = color - else - this._progressbar_background = new Clutter.Color({red: 204, green: 204, blue: 204, alpha: 255}); - - [hasColor, color] = node.lookup_color('-progress-bar-border', false); - if (hasColor) - this._progressbar_border = color; - else - this._progressbar_border = new Clutter.Color({red: 230, green: 230, blue: 230, alpha: 255}); - - this._updateProgressOverlay(); - } - - _hideProgressOverlay() { - if (this._progressOverlayArea) - this._progressOverlayArea.destroy(); - this._progressOverlayArea = null; - this._progressbar_background = null; - this._progressbar_border = null; - } - - _updateProgressOverlay() { - if (this._progressOverlayArea) - this._progressOverlayArea.queue_repaint(); - } - - _drawProgressOverlay(area) { - let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; - let [surfaceWidth, surfaceHeight] = area.get_surface_size(); - let cr = area.get_context(); - - let iconSize = this._source.icon.iconSize * scaleFactor; - - let x = Math.floor((surfaceWidth - iconSize) / 2); - let y = Math.floor((surfaceHeight - iconSize) / 2); - - let lineWidth = Math.floor(1.0 * scaleFactor); - let padding = Math.floor(iconSize * 0.05); - let width = iconSize - 2.0*padding; - let height = Math.floor(Math.min(18.0*scaleFactor, 0.20*iconSize)); - x += padding; - y += iconSize - height - padding; - - cr.setLineWidth(lineWidth); - - // Draw the outer stroke - let stroke = new Cairo.LinearGradient(0, y, 0, y + height); - let fill = null; - stroke.addColorStopRGBA(0.5, 0.5, 0.5, 0.5, 0.1); - stroke.addColorStopRGBA(0.9, 0.8, 0.8, 0.8, 0.4); - Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, width, height, true, true, stroke, fill); - - // Draw the background - x += lineWidth; - y += lineWidth; - width -= 2.0*lineWidth; - height -= 2.0*lineWidth; - - stroke = Cairo.SolidPattern.createRGBA(0.20, 0.20, 0.20, 0.9); - fill = new Cairo.LinearGradient(0, y, 0, y + height); - fill.addColorStopRGBA(0.4, 0.25, 0.25, 0.25, 1.0); - fill.addColorStopRGBA(0.9, 0.35, 0.35, 0.35, 1.0); - Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, width, height, true, true, stroke, fill); - - // Draw the finished bar - x += lineWidth; - y += lineWidth; - width -= 2.0*lineWidth; - height -= 2.0*lineWidth; - - let finishedWidth = Math.ceil(this._progress * width); - - let bg = this._progressbar_background; - let bd = this._progressbar_border; - - stroke = Cairo.SolidPattern.createRGBA(bd.red/255, bd.green/255, bd.blue/255, bd.alpha/255); - fill = Cairo.SolidPattern.createRGBA(bg.red/255, bg.green/255, bg.blue/255, bg.alpha/255); - - if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) - Utils.drawRoundedLine(cr, x + lineWidth/2.0 + width - finishedWidth, y + lineWidth/2.0, finishedWidth, height, true, true, stroke, fill); - else - Utils.drawRoundedLine(cr, x + lineWidth/2.0, y + lineWidth/2.0, finishedWidth, height, true, true, stroke, fill); - - cr.$dispose(); - } - - setProgress(progress) { - if (progress < 0) { - this._hideProgressOverlay(); - } else { - this._progress = Math.min(progress, 1.0); - this._showProgressOverlay(); - } - } - - setUrgent(urgent) { - const icon = this._source.icon._iconBin; - if (urgent) { - if (!this._isUrgent) { - icon.set_pivot_point(0.5, 0.5); - this._source.iconAnimator.addAnimation(icon, 'dance'); - this._isUrgent = true; - } - } else { - if (this._isUrgent) { - this._source.iconAnimator.removeAnimation(icon, 'dance'); - this._isUrgent = false; - } - icon.rotation_angle_z = 0; - } - } -} - - -// We need an icons theme object, this is the only way I managed to get -// pixel buffers that can be used for calculating the backlight color -let themeLoader = null; - -// Global icon cache. Used for Unity7 styling. -let iconCacheMap = new Map(); -// Max number of items to store -// We don't expect to ever reach this number, but let's put an hard limit to avoid -// even the remote possibility of the cached items to grow indefinitely. -const MAX_CACHED_ITEMS = 1000; -// When the size exceed it, the oldest 'n' ones are deleted -const BATCH_SIZE_TO_DELETE = 50; -// The icon size used to extract the dominant color -const DOMINANT_COLOR_ICON_SIZE = 64; - -// Compute dominant color frim the app icon. -// The color is cached for efficiency. -var DominantColorExtractor = class DashToDock_DominantColorExtractor { - - constructor(app) { - this._app = app; - } - - /** - * Try to get the pixel buffer for the current icon, if not fail gracefully - */ - _getIconPixBuf() { - let iconTexture = this._app.create_icon_texture(16); - - if (themeLoader === null) { - let ifaceSettings = new Gio.Settings({ schema: "org.gnome.desktop.interface" }); - - themeLoader = new Gtk.IconTheme(), - themeLoader.set_custom_theme(ifaceSettings.get_string('icon-theme')); // Make sure the correct theme is loaded - } - - // Unable to load the icon texture, use fallback - if (iconTexture instanceof St.Icon === false) { - return null; - } - - iconTexture = iconTexture.get_gicon(); - - // Unable to load the icon texture, use fallback - if (iconTexture === null) { - return null; - } - - if (iconTexture instanceof Gio.FileIcon) { - // Use GdkPixBuf to load the pixel buffer from the provided file path - return GdkPixbuf.Pixbuf.new_from_file(iconTexture.get_file().get_path()); - } - - // Get the pixel buffer from the icon theme - let icon_info = themeLoader.lookup_icon(iconTexture.get_names()[0], DOMINANT_COLOR_ICON_SIZE, 0); - if (icon_info !== null) - return icon_info.load_icon(); - else - return null; - } - - /** - * The backlight color choosing algorithm was mostly ported to javascript from the - * Unity7 C++ source of Canonicals: - * https://bazaar.launchpad.net/~unity-team/unity/trunk/view/head:/launcher/LauncherIcon.cpp - * so it more or less works the same way. - */ - _getColorPalette() { - if (iconCacheMap.get(this._app.get_id())) { - // We already know the answer - return iconCacheMap.get(this._app.get_id()); - } - - let pixBuf = this._getIconPixBuf(); - if (pixBuf == null) - return null; - - let pixels = pixBuf.get_pixels(), - offset = 0; - - let total = 0, - rTotal = 0, - gTotal = 0, - bTotal = 0; - - let resample_y = 1, - resample_x = 1; - - // Resampling of large icons - // We resample icons larger than twice the desired size, as the resampling - // to a size s - // DOMINANT_COLOR_ICON_SIZE < s < 2*DOMINANT_COLOR_ICON_SIZE, - // most of the case exactly DOMINANT_COLOR_ICON_SIZE as the icon size is tipycally - // a multiple of it. - let width = pixBuf.get_width(); - let height = pixBuf.get_height(); - - // Resample - if (height >= 2* DOMINANT_COLOR_ICON_SIZE) - resample_y = Math.floor(height/DOMINANT_COLOR_ICON_SIZE); - - if (width >= 2* DOMINANT_COLOR_ICON_SIZE) - resample_x = Math.floor(width/DOMINANT_COLOR_ICON_SIZE); - - if (resample_x !==1 || resample_y !== 1) - pixels = this._resamplePixels(pixels, resample_x, resample_y); - - // computing the limit outside the for (where it would be repeated at each iteration) - // for performance reasons - let limit = pixels.length; - for (let offset = 0; offset < limit; offset+=4) { - let r = pixels[offset], - g = pixels[offset + 1], - b = pixels[offset + 2], - a = pixels[offset + 3]; - - let saturation = (Math.max(r,g, b) - Math.min(r,g, b)); - let relevance = 0.1 * 255 * 255 + 0.9 * a * saturation; - - rTotal += r * relevance; - gTotal += g * relevance; - bTotal += b * relevance; - - total += relevance; - } - - total = total * 255; - - let r = rTotal / total, - g = gTotal / total, - b = bTotal / total; - - let hsv = Utils.ColorUtils.RGBtoHSV(r * 255, g * 255, b * 255); - - if (hsv.s > 0.15) - hsv.s = 0.65; - hsv.v = 0.90; - - let rgb = Utils.ColorUtils.HSVtoRGB(hsv.h, hsv.s, hsv.v); - - // Cache the result. - let backgroundColor = { - lighter: Utils.ColorUtils.ColorLuminance(rgb.r, rgb.g, rgb.b, 0.2), - original: Utils.ColorUtils.ColorLuminance(rgb.r, rgb.g, rgb.b, 0), - darker: Utils.ColorUtils.ColorLuminance(rgb.r, rgb.g, rgb.b, -0.5) - }; - - if (iconCacheMap.size >= MAX_CACHED_ITEMS) { - //delete oldest cached values (which are in order of insertions) - let ctr=0; - for (let key of iconCacheMap.keys()) { - if (++ctr > BATCH_SIZE_TO_DELETE) - break; - iconCacheMap.delete(key); - } - } - - iconCacheMap.set(this._app.get_id(), backgroundColor); - - return backgroundColor; - } - - /** - * Downsample large icons before scanning for the backlight color to - * improve performance. - * - * @param pixBuf - * @param pixels - * @param resampleX - * @param resampleY - * - * @return []; - */ - _resamplePixels (pixels, resampleX, resampleY) { - let resampledPixels = []; - // computing the limit outside the for (where it would be repeated at each iteration) - // for performance reasons - let limit = pixels.length / (resampleX * resampleY) / 4; - for (let i = 0; i < limit; i++) { - let pixel = i * resampleX * resampleY; - - resampledPixels.push(pixels[pixel * 4]); - resampledPixels.push(pixels[pixel * 4 + 1]); - resampledPixels.push(pixels[pixel * 4 + 2]); - resampledPixels.push(pixels[pixel * 4 + 3]); - } - - return resampledPixels; - } -}; diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/appIcons.js b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/appIcons.js deleted file mode 100644 index e10fb46..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/appIcons.js +++ /dev/null @@ -1,1273 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const Clutter = imports.gi.Clutter; -const GdkPixbuf = imports.gi.GdkPixbuf -const Gio = imports.gi.Gio; -const GLib = imports.gi.GLib; -const GObject = imports.gi.GObject; -const Signals = imports.signals; -const Meta = imports.gi.Meta; -const Shell = imports.gi.Shell; -const St = imports.gi.St; - -// Use __ () and N__() for the extension gettext domain, and reuse -// the shell domain with the default _() and N_() -const Gettext = imports.gettext.domain('dashtodock'); -const __ = Gettext.gettext; -const N__ = function(e) { return e }; - -const AppDisplay = imports.ui.appDisplay; -const AppFavorites = imports.ui.appFavorites; -const Dash = imports.ui.dash; -const DND = imports.ui.dnd; -const IconGrid = imports.ui.iconGrid; -const Main = imports.ui.main; -const PopupMenu = imports.ui.popupMenu; -const Util = imports.misc.util; -const Workspace = imports.ui.workspace; - -const ExtensionUtils = imports.misc.extensionUtils; -const Me = ExtensionUtils.getCurrentExtension(); -const Docking = Me.imports.docking; -const Utils = Me.imports.utils; -const WindowPreview = Me.imports.windowPreview; -const AppIconIndicators = Me.imports.appIconIndicators; -const DbusmenuUtils = Me.imports.dbusmenuUtils; - -let tracker = Shell.WindowTracker.get_default(); - -const clickAction = { - SKIP: 0, - MINIMIZE: 1, - LAUNCH: 2, - CYCLE_WINDOWS: 3, - MINIMIZE_OR_OVERVIEW: 4, - PREVIEWS: 5, - MINIMIZE_OR_PREVIEWS: 6, - FOCUS_OR_PREVIEWS: 7, - FOCUS_MINIMIZE_OR_PREVIEWS: 8, - QUIT: 9 -}; - -const scrollAction = { - DO_NOTHING: 0, - CYCLE_WINDOWS: 1, - SWITCH_WORKSPACE: 2 -}; - -let recentlyClickedAppLoopId = 0; -let recentlyClickedApp = null; -let recentlyClickedAppWindows = null; -let recentlyClickedAppIndex = 0; -let recentlyClickedAppMonitor = -1; - -/** - * Extend AppIcon - * - * - Apply a css class based on the number of windows of each application (#N); - * - Customized indicators for running applications in place of the default "dot" style which is hidden (#N); - * a class of the form "running#N" is applied to the AppWellIcon actor. - * like the original .running one. - * - Add a .focused style to the focused app - * - Customize click actions. - * - Update minimization animation target - * - Update menu if open on windows change - */ -var MyAppIcon = GObject.registerClass( -class MyAppIcon extends Dash.DashIcon { - // settings are required inside. - _init(remoteModel, app, monitorIndex, iconAnimator) { - super._init(app); - - // a prefix is required to avoid conflicting with the parent class variable - this.monitorIndex = monitorIndex; - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this.remoteModel = remoteModel; - this.iconAnimator = iconAnimator; - this._indicator = null; - - let appInfo = app.get_app_info(); - this._location = appInfo ? appInfo.get_string('XdtdUri') : null; - - this._updateIndicatorStyle(); - - // Monitor windows-changes instead of app state. - // Keep using the same Id and function callback (that is extended) - if (this._stateChangedId > 0) { - this.app.disconnect(this._stateChangedId); - this._stateChangedId = 0; - } - - this._windowsChangedId = this.app.connect('windows-changed', - this.onWindowsChanged.bind(this)); - this._focusAppChangeId = tracker.connect('notify::focus-app', - this._onFocusAppChanged.bind(this)); - - // In Wayland sessions, this signal is needed to track the state of windows dragged - // from one monitor to another. As this is triggered quite often (whenever a new winow - // of any application opened or moved to a different desktop), - // we restrict this signal to the case when 'isolate-monitors' is true, - // and if there are at least 2 monitors. - if (Docking.DockManager.settings.get_boolean('isolate-monitors') && - Main.layoutManager.monitors.length > 1) { - this._signalsHandler.removeWithLabel('isolate-monitors'); - this._signalsHandler.addWithLabel('isolate-monitors', [ - global.display, - 'window-entered-monitor', - this._onWindowEntered.bind(this) - ]); - } - - this._progressOverlayArea = null; - this._progress = 0; - - let keys = ['apply-custom-theme', - 'running-indicator-style', - ]; - - keys.forEach(function(key) { - this._signalsHandler.add([ - Docking.DockManager.settings, - 'changed::' + key, - this._updateIndicatorStyle.bind(this) - ]); - }, this); - - if (this._location) { - this._signalsHandler.add([ - Docking.DockManager.getDefault().fm1Client, - 'windows-changed', - this.onWindowsChanged.bind(this) - ]); - } - - this._numberOverlay(); - - this._previewMenuManager = null; - this._previewMenu = null; - } - - _onDestroy() { - super._onDestroy(); - - // This is necessary due to an upstream bug - // https://bugzilla.gnome.org/show_bug.cgi?id=757556 - // It can be safely removed once it get solved upstrea. - if (this._menu) - this._menu.close(false); - - // Disconect global signals - - if (this._windowsChangedId > 0) - this.app.disconnect(this._windowsChangedId); - this._windowsChangedId = 0; - - if (this._focusAppChangeId > 0) { - tracker.disconnect(this._focusAppChangeId); - this._focusAppChangeId = 0; - } - - this._signalsHandler.destroy(); - } - - // TOOD Rename this function - _updateIndicatorStyle() { - - if (this._indicator !== null) { - this._indicator.destroy(); - this._indicator = null; - } - this._indicator = new AppIconIndicators.AppIconIndicator(this); - this._indicator.update(); - } - - _onWindowEntered(metaScreen, monitorIndex, metaWin) { - let app = Shell.WindowTracker.get_default().get_window_app(metaWin); - if (app && app.get_id() == this.app.get_id()) - this.onWindowsChanged(); - } - - vfunc_scroll_event(scrollEvent) { - let settings = Docking.DockManager.settings; - let isEnabled = settings.get_enum('scroll-action') === scrollAction.CYCLE_WINDOWS; - if (!isEnabled) - return Clutter.EVENT_PROPAGATE; - - // We only activate windows of running applications, i.e. we never open new windows - // We check if the app is running, and that the # of windows is > 0 in - // case we use workspace isolation, - let appIsRunning = this.app.state == Shell.AppState.RUNNING - && this.getInterestingWindows().length > 0; - - if (!appIsRunning) - return Clutter.EVENT_PROPAGATE; - - if (this._optionalScrollCycleWindowsDeadTimeId) - return Clutter.EVENT_PROPAGATE; - else - this._optionalScrollCycleWindowsDeadTimeId = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, 250, () => { - this._optionalScrollCycleWindowsDeadTimeId = 0; - }); - - let direction = null; - - switch (scrollEvent.direction) { - case Clutter.ScrollDirection.UP: - direction = Meta.MotionDirection.UP; - break; - case Clutter.ScrollDirection.DOWN: - direction = Meta.MotionDirection.DOWN; - break; - case Clutter.ScrollDirection.SMOOTH: - let [, dy] = Clutter.get_current_event().get_scroll_delta(); - if (dy < 0) - direction = Meta.MotionDirection.UP; - else if (dy > 0) - direction = Meta.MotionDirection.DOWN; - break; - } - - let focusedApp = tracker.focus_app; - if (!Main.overview._shown) { - let reversed = direction === Meta.MotionDirection.UP; - if (this.app == focusedApp) - this._cycleThroughWindows(reversed); - else { - // Activate the first window - let windows = this.getInterestingWindows(); - if (windows.length > 0) { - let w = windows[0]; - Main.activateWindow(w); - } - } - } - else - this.app.activate(); - return Clutter.EVENT_STOP; - } - - onWindowsChanged() { - - if (this._menu && this._menu.isOpen) - this._menu.update(); - - this._indicator.update(); - this.updateIconGeometry(); - } - - /** - * Update taraget for minimization animation - */ - updateIconGeometry() { - // If (for unknown reason) the actor is not on the stage the reported size - // and position are random values, which might exceeds the integer range - // resulting in an error when assigned to the a rect. This is a more like - // a workaround to prevent flooding the system with errors. - if (this.get_stage() == null) - return; - - let rect = new Meta.Rectangle(); - - [rect.x, rect.y] = this.get_transformed_position(); - [rect.width, rect.height] = this.get_transformed_size(); - - let windows = this.getWindows(); - if (Docking.DockManager.settings.get_boolean('multi-monitor')) { - let monitorIndex = this.monitorIndex; - windows = windows.filter(function(w) { - return w.get_monitor() == monitorIndex; - }); - } - windows.forEach(function(w) { - w.set_icon_geometry(rect); - }); - } - - _updateRunningStyle() { - // The logic originally in this function has been moved to - // AppIconIndicatorBase._updateDefaultDot(). However it cannot be removed as - // it called by the parent constructor. - } - - popupMenu() { - this._removeMenuTimeout(); - this.fake_release(); - this._draggable.fakeRelease(); - - if (!this._menu) { - this._menu = new MyAppIconMenu(this, this.remoteModel); - this._menu.connect('activate-window', (menu, window) => { - this.activateWindow(window); - }); - this._menu.connect('open-state-changed', (menu, isPoppedUp) => { - if (!isPoppedUp) - this._onMenuPoppedDown(); - else { - // Setting the max-height is s useful if part of the menu is - // scrollable so the minimum height is smaller than the natural height. - let monitor_index = Main.layoutManager.findIndexForActor(this); - let workArea = Main.layoutManager.getWorkAreaForMonitor(monitor_index); - let position = Utils.getPosition(); - this._isHorizontal = ( position == St.Side.TOP || - position == St.Side.BOTTOM); - // If horizontal also remove the height of the dash - let fixedDock = Docking.DockManager.settings.get_boolean('dock-fixed'); - let additional_margin = this._isHorizontal && !fixedDock ? Main.overview.dash.height : 0; - let verticalMargins = this._menu.actor.margin_top + this._menu.actor.margin_bottom; - // Also set a max width to the menu, so long labels (long windows title) get truncated - this._menu.actor.style = ('max-height: ' + Math.round(workArea.height - additional_margin - verticalMargins) + 'px;' + - 'max-width: 400px'); - } - }); - let id = Main.overview.connect('hiding', () => { - this._menu.close(); - }); - this._menu.actor.connect('destroy', function() { - Main.overview.disconnect(id); - }); - - this._menuManager.addMenu(this._menu); - } - - this.emit('menu-state-changed', true); - - this.set_hover(true); - this._menu.popup(); - this._menuManager.ignoreRelease(); - this.emit('sync-tooltip'); - - return false; - } - - _onFocusAppChanged() { - this._indicator.update(); - } - - activate(button) { - let event = Clutter.get_current_event(); - let modifiers = event ? event.get_state() : 0; - let focusedApp = tracker.focus_app; - - // Only consider SHIFT and CONTROL as modifiers (exclude SUPER, CAPS-LOCK, etc.) - modifiers = modifiers & (Clutter.ModifierType.SHIFT_MASK | Clutter.ModifierType.CONTROL_MASK); - - // We don't change the CTRL-click behaviour: in such case we just chain - // up the parent method and return. - if (modifiers & Clutter.ModifierType.CONTROL_MASK) { - // Keep default behaviour: launch new window - // By calling the parent method I make it compatible - // with other extensions tweaking ctrl + click - super.activate(button); - return; - } - - // We check what type of click we have and if the modifier SHIFT is - // being used. We then define what buttonAction should be for this - // event. - let buttonAction = 0; - let settings = Docking.DockManager.settings; - if (button && button == 2 ) { - if (modifiers & Clutter.ModifierType.SHIFT_MASK) - buttonAction = settings.get_enum('shift-middle-click-action'); - else - buttonAction = settings.get_enum('middle-click-action'); - } - else if (button && button == 1) { - if (modifiers & Clutter.ModifierType.SHIFT_MASK) - buttonAction = settings.get_enum('shift-click-action'); - else - buttonAction = settings.get_enum('click-action'); - } - - // We check if the app is running, and that the # of windows is > 0 in - // case we use workspace isolation. - let windows = this.getInterestingWindows(); - let appIsRunning = (this.app.state == Shell.AppState.RUNNING || this.isLocation()) - && windows.length > 0; - - // Some action modes (e.g. MINIMIZE_OR_OVERVIEW) require overview to remain open - // This variable keeps track of this - let shouldHideOverview = true; - - // We customize the action only when the application is already running - if (appIsRunning) { - switch (buttonAction) { - case clickAction.MINIMIZE: - // In overview just activate the app, unless the acion is explicitely - // requested with a keyboard modifier - if (!Main.overview._shown || modifiers){ - // If we have button=2 or a modifier, allow minimization even if - // the app is not focused - if (this.app == focusedApp || button == 2 || modifiers & Clutter.ModifierType.SHIFT_MASK) { - // minimize all windows on double click and always in the case of primary click without - // additional modifiers - let click_count = 0; - if (Clutter.EventType.CLUTTER_BUTTON_PRESS) - click_count = event.get_click_count(); - let all_windows = (button == 1 && ! modifiers) || click_count > 1; - this._minimizeWindow(all_windows); - } - else - this._activateAllWindows(); - } - else { - let w = windows[0]; - Main.activateWindow(w); - } - break; - - case clickAction.MINIMIZE_OR_OVERVIEW: - // When a single window is present, toggle minimization - // If only one windows is present toggle minimization, but only when trigggered with the - // simple click action (no modifiers, no middle click). - if (windows.length == 1 && !modifiers && button == 1) { - let w = windows[0]; - if (this.app == focusedApp) { - // Window is raised, minimize it - this._minimizeWindow(w); - } else { - // Window is minimized, raise it - Main.activateWindow(w); - } - // Launch overview when multiple windows are present - // TODO: only show current app windows when gnome shell API will allow it - } else { - shouldHideOverview = false; - Main.overview.toggle(); - } - break; - - case clickAction.CYCLE_WINDOWS: - if (!Main.overview._shown){ - if (this.app == focusedApp) - this._cycleThroughWindows(); - else { - // Activate the first window - let w = windows[0]; - Main.activateWindow(w); - } - } - else - this.app.activate(); - break; - - case clickAction.FOCUS_OR_PREVIEWS: - if (this.app == focusedApp && - (windows.length > 1 || modifiers || button != 1)) { - this._windowPreviews(); - } else { - // Activate the first window - let w = windows[0]; - Main.activateWindow(w); - } - break; - - case clickAction.FOCUS_MINIMIZE_OR_PREVIEWS: - if (this.app == focusedApp) { - if (windows.length > 1 || modifiers || button != 1) - this._windowPreviews(); - else if (!Main.overview.visible) - this._minimizeWindow(); - } else { - // Activate the first window - let w = windows[0]; - Main.activateWindow(w); - } - break; - - case clickAction.LAUNCH: - this.launchNewWindow(); - break; - - case clickAction.PREVIEWS: - if (!Main.overview._shown) { - // If only one windows is present just switch to it, but only when trigggered with the - // simple click action (no modifiers, no middle click). - if (windows.length == 1 && !modifiers && button == 1) { - let w = windows[0]; - Main.activateWindow(w); - } else - this._windowPreviews(); - } - else { - this.app.activate(); - } - break; - - case clickAction.MINIMIZE_OR_PREVIEWS: - // When a single window is present, toggle minimization - // If only one windows is present toggle minimization, but only when trigggered with the - // simple click action (no modifiers, no middle click). - if (!Main.overview._shown){ - if (windows.length == 1 && !modifiers && button == 1) { - let w = windows[0]; - if (this.app == focusedApp) { - // Window is raised, minimize it - this._minimizeWindow(w); - } else { - // Window is minimized, raise it - Main.activateWindow(w); - } - } else { - // Launch previews when multiple windows are present - this._windowPreviews(); - } - } else { - this.app.activate(); - } - break; - - case clickAction.QUIT: - this.closeAllWindows(); - break; - - case clickAction.SKIP: - let w = windows[0]; - Main.activateWindow(w); - break; - } - } - else { - this.launchNewWindow(); - } - - // Hide overview except when action mode requires it - if(shouldHideOverview) { - Main.overview.hide(); - } - } - - shouldShowTooltip() { - return this.hover && (!this._menu || !this._menu.isOpen) && - (!this._previewMenu || !this._previewMenu.isOpen); - } - - _windowPreviews() { - if (!this._previewMenu) { - this._previewMenuManager = new PopupMenu.PopupMenuManager(this); - - this._previewMenu = new WindowPreview.WindowPreviewMenu(this); - - this._previewMenuManager.addMenu(this._previewMenu); - - this._previewMenu.connect('open-state-changed', (menu, isPoppedUp) => { - if (!isPoppedUp) - this._onMenuPoppedDown(); - }); - let id = Main.overview.connect('hiding', () => { - this._previewMenu.close(); - }); - this._previewMenu.actor.connect('destroy', function() { - Main.overview.disconnect(id); - }); - - } - - if (this._previewMenu.isOpen) - this._previewMenu.close(); - else - this._previewMenu.popup(); - - return false; - } - - // Try to do the right thing when attempting to launch a new window of an app. In - // particular, if the application doens't allow to launch a new window, activate - // the existing window instead. - launchNewWindow(p) { - let appInfo = this.app.get_app_info(); - let actions = appInfo.list_actions(); - if (this.app.can_open_new_window()) { - this.animateLaunch(); - // This is used as a workaround for a bug resulting in no new windows being opened - // for certain running applications when calling open_new_window(). - // - // https://bugzilla.gnome.org/show_bug.cgi?id=756844 - // - // Similar to what done when generating the popupMenu entries, if the application provides - // a "New Window" action, use it instead of directly requesting a new window with - // open_new_window(), which fails for certain application, notably Nautilus. - if (actions.indexOf('new-window') == -1) { - this.app.open_new_window(-1); - } - else { - let i = actions.indexOf('new-window'); - if (i !== -1) - this.app.launch_action(actions[i], global.get_current_time(), -1); - } - } - else { - // Try to manually activate the first window. Otherwise, when the app is activated by - // switching to a different workspace, a launch spinning icon is shown and disappers only - // after a timeout. - let windows = this.getWindows(); - if (windows.length > 0) - Main.activateWindow(windows[0]) - else - this.app.activate(); - } - } - - _numberOverlay() { - // Add label for a Hot-Key visual aid - this._numberOverlayLabel = new St.Label(); - this._numberOverlayBin = new St.Bin({ - child: this._numberOverlayLabel, - x_align: Clutter.ActorAlign.START, - y_align: Clutter.ActorAlign.START, - x_expand: true, y_expand: true - }); - this._numberOverlayLabel.add_style_class_name('number-overlay'); - this._numberOverlayOrder = -1; - this._numberOverlayBin.hide(); - - this._iconContainer.add_child(this._numberOverlayBin); - - } - - updateNumberOverlay() { - // We apply an overall scale factor that might come from a HiDPI monitor. - // Clutter dimensions are in physical pixels, but CSS measures are in logical - // pixels, so make sure to consider the scale. - let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; - // Set the font size to something smaller than the whole icon so it is - // still visible. The border radius is large to make the shape circular - let [minWidth, natWidth] = this._iconContainer.get_preferred_width(-1); - let font_size = Math.round(Math.max(12, 0.3*natWidth) / scaleFactor); - let size = Math.round(font_size*1.2); - this._numberOverlayLabel.set_style( - 'font-size: ' + font_size + 'px;' + - 'border-radius: ' + this.icon.iconSize + 'px;' + - 'width: ' + size + 'px; height: ' + size +'px;' - ); - } - - setNumberOverlay(number) { - this._numberOverlayOrder = number; - this._numberOverlayLabel.set_text(number.toString()); - } - - toggleNumberOverlay(activate) { - if (activate && this._numberOverlayOrder > -1) { - this.updateNumberOverlay(); - this._numberOverlayBin.show(); - } - else - this._numberOverlayBin.hide(); - } - - _minimizeWindow(param) { - // Param true make all app windows minimize - let windows = this.getInterestingWindows(); - let current_workspace = global.workspace_manager.get_active_workspace(); - for (let i = 0; i < windows.length; i++) { - let w = windows[i]; - if (w.get_workspace() == current_workspace && w.showing_on_its_workspace()) { - w.minimize(); - // Just minimize one window. By specification it should be the - // focused window on the current workspace. - if(!param) - break; - } - } - } - - // By default only non minimized windows are activated. - // This activates all windows in the current workspace. - _activateAllWindows() { - // First activate first window so workspace is switched if needed. - // We don't do this if isolation is on! - if (!Docking.DockManager.settings.get_boolean('isolate-workspaces') && - !Docking.DockManager.settings.get_boolean('isolate-monitors')) - this.app.activate(); - - // then activate all other app windows in the current workspace - let windows = this.getInterestingWindows(); - let activeWorkspace = global.workspace_manager.get_active_workspace_index(); - - if (windows.length <= 0) - return; - - let activatedWindows = 0; - - for (let i = windows.length - 1; i >= 0; i--) { - if (windows[i].get_workspace().index() == activeWorkspace) { - Main.activateWindow(windows[i]); - activatedWindows++; - } - } - } - - //This closes all windows of the app. - closeAllWindows() { - let windows = this.getInterestingWindows(); - for (let i = 0; i < windows.length; i++) - windows[i].delete(global.get_current_time()); - } - - _cycleThroughWindows(reversed) { - // Store for a little amount of time last clicked app and its windows - // since the order changes upon window interaction - let MEMORY_TIME=3000; - - let app_windows = this.getInterestingWindows(); - - if (app_windows.length <1) - return - - if (recentlyClickedAppLoopId > 0) - GLib.source_remove(recentlyClickedAppLoopId); - recentlyClickedAppLoopId = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, MEMORY_TIME, this._resetRecentlyClickedApp); - - // If there isn't already a list of windows for the current app, - // or the stored list is outdated, use the current windows list. - let monitorIsolation = Docking.DockManager.settings.get_boolean('isolate-monitors'); - if (!recentlyClickedApp || - recentlyClickedApp.get_id() != this.app.get_id() || - recentlyClickedAppWindows.length != app_windows.length || - (recentlyClickedAppMonitor != this.monitorIndex && monitorIsolation)) { - recentlyClickedApp = this.app; - recentlyClickedAppWindows = app_windows; - recentlyClickedAppMonitor = this.monitorIndex; - recentlyClickedAppIndex = 0; - } - - if (reversed) { - recentlyClickedAppIndex--; - if (recentlyClickedAppIndex < 0) recentlyClickedAppIndex = recentlyClickedAppWindows.length - 1; - } else { - recentlyClickedAppIndex++; - } - let index = recentlyClickedAppIndex % recentlyClickedAppWindows.length; - let window = recentlyClickedAppWindows[index]; - - Main.activateWindow(window); - } - - _resetRecentlyClickedApp() { - if (recentlyClickedAppLoopId > 0) - GLib.source_remove(recentlyClickedAppLoopId); - recentlyClickedAppLoopId=0; - recentlyClickedApp =null; - recentlyClickedAppWindows = null; - recentlyClickedAppIndex = 0; - recentlyClickedAppMonitor = -1; - - return false; - } - - getWindows() { - return getWindows(this.app, this._location); - } - - // Filter out unnecessary windows, for instance - // nautilus desktop window. - getInterestingWindows() { - return getInterestingWindows(this.app, this.monitorIndex, this._location); - } - - // Does the Icon represent a location rather than an App - isLocation() { - return this._location != null; - } -}); -/** - * Extend AppIconMenu - * - * - set popup arrow side based on dash orientation - * - Add close windows option based on quitfromdash extension - * (https://github.com/deuill/shell-extension-quitfromdash) - * - Add open windows thumbnails instead of list - * - update menu when application windows change - */ -const MyAppIconMenu = class DashToDock_MyAppIconMenu extends AppDisplay.AppIconMenu { - - constructor(source, remoteModel) { - let side = Utils.getPosition(); - - // Damm it, there has to be a proper way of doing this... - // As I can't call the parent parent constructor (?) passing the side - // parameter, I overwite what I need later - super(source); - - // Change the initialized side where required. - this._arrowSide = side; - this._boxPointer._arrowSide = side; - this._boxPointer._userArrowSide = side; - - this._signalsHandler = new Utils.GlobalSignalsHandler(); - - if (remoteModel && DbusmenuUtils.haveDBusMenu()) { - const [onQuicklist, onDynamicSection] = Utils.splitHandler((sender, { quicklist }, dynamicSection) => { - dynamicSection.removeAll(); - if (quicklist) { - quicklist.get_children().forEach(remoteItem => - dynamicSection.addMenuItem(DbusmenuUtils.makePopupMenuItem(remoteItem, false))); - } - }); - - this._signalsHandler.add([ - remoteModel.lookupById(this._source.app.id), - 'quicklist-changed', - onQuicklist - ], [ - this, - 'dynamic-section-changed', - onDynamicSection - ]); - } - } - - destroy() { - this._signalsHandler.destroy(); - super.destroy(); - } - - _rebuildMenu() { - this.removeAll(); - - if (Docking.DockManager.settings.get_boolean('show-windows-preview')) { - // Display the app windows menu items and the separator between windows - // of the current desktop and other windows. - - this._allWindowsMenuItem = new PopupMenu.PopupSubMenuMenuItem(__('All Windows'), false); - this._allWindowsMenuItem.hide(); - this.addMenuItem(this._allWindowsMenuItem); - - if (!this._source.app.is_window_backed()) { - this._appendSeparator(); - - let appInfo = this._source.app.get_app_info(); - let actions = appInfo.list_actions(); - if (this._source.app.can_open_new_window() && - actions.indexOf('new-window') == -1) { - this._newWindowMenuItem = this._appendMenuItem(_('New Window')); - this._newWindowMenuItem.connect('activate', () => { - if (this._source.app.state == Shell.AppState.STOPPED) - this._source.animateLaunch(); - - this._source.app.open_new_window(-1); - this.emit('activate-window', null); - }); - this._appendSeparator(); - } - - - if (AppDisplay.discreteGpuAvailable && - this._source.app.state == Shell.AppState.STOPPED && - actions.indexOf('activate-discrete-gpu') == -1) { - this._onDiscreteGpuMenuItem = this._appendMenuItem(_('Launch using Dedicated Graphics Card')); - this._onDiscreteGpuMenuItem.connect('activate', () => { - if (this._source.app.state == Shell.AppState.STOPPED) - this._source.animateLaunch(); - - this._source.app.launch(0, -1, true); - this.emit('activate-window', null); - }); - } - - for (let i = 0; i < actions.length; i++) { - let action = actions[i]; - let item = this._appendMenuItem(appInfo.get_action_name(action)); - item.connect('activate', (emitter, event) => { - this._source.app.launch_action(action, event.get_time(), -1); - this.emit('activate-window', null); - }); - } - - let canFavorite = global.settings.is_writable('favorite-apps') && - !this._source.isLocation(); - - if (canFavorite) { - this._appendSeparator(); - - let isFavorite = AppFavorites.getAppFavorites().isFavorite(this._source.app.get_id()); - - if (isFavorite) { - let item = this._appendMenuItem(_('Remove from Favorites')); - item.connect('activate', () => { - let favs = AppFavorites.getAppFavorites(); - favs.removeFavorite(this._source.app.get_id()); - }); - } else { - let item = this._appendMenuItem(_('Add to Favorites')); - item.connect('activate', () => { - let favs = AppFavorites.getAppFavorites(); - favs.addFavorite(this._source.app.get_id()); - }); - } - } - - if (Shell.AppSystem.get_default().lookup_app('org.gnome.Software.desktop') && - !this._source.isLocation()) { - this._appendSeparator(); - let item = this._appendMenuItem(_('Show Details')); - item.connect('activate', () => { - let id = this._source.app.get_id(); - let args = GLib.Variant.new('(ss)', [id, '']); - Gio.DBus.get(Gio.BusType.SESSION, null, - function(o, res) { - let bus = Gio.DBus.get_finish(res); - bus.call('org.gnome.Software', - '/org/gnome/Software', - 'org.gtk.Actions', 'Activate', - GLib.Variant.new('(sava{sv})', - ['details', [args], null]), - null, 0, -1, null, null); - Main.overview.hide(); - }); - }); - } - } - - } else { - if (super._rebuildMenu) - super._rebuildMenu(); - else - super._redisplay(); - } - - // dynamic menu - const items = this._getMenuItems(); - let i = items.length; - if (Shell.AppSystem.get_default().lookup_app('org.gnome.Software.desktop')) { - i -= 2; - } - if (global.settings.is_writable('favorite-apps')) { - i -= 2; - } - if (i < 0) { - i = 0; - } - const dynamicSection = new PopupMenu.PopupMenuSection(); - this.addMenuItem(dynamicSection, i); - this.emit('dynamic-section-changed', dynamicSection); - - // quit menu - this._appendSeparator(); - this._quitfromDashMenuItem = this._appendMenuItem(_('Quit')); - this._quitfromDashMenuItem.connect('activate', () => { - this._source.closeAllWindows(); - }); - - this.update(); - } - - // update menu content when application windows change. This is desirable as actions - // acting on windows (closing) are performed while the menu is shown. - update() { - - let windows = this._source.getInterestingWindows(); - - // update, show or hide the quit menu - if ( windows.length > 0) { - let quitFromDashMenuText = ""; - if (windows.length == 1) - this._quitfromDashMenuItem.label.set_text(_('Quit')); - else - this._quitfromDashMenuItem.label.set_text(__('Quit %d Windows').format(windows.length)); - - this._quitfromDashMenuItem.actor.show(); - - } else { - this._quitfromDashMenuItem.actor.hide(); - } - - if(Docking.DockManager.settings.get_boolean('show-windows-preview')){ - - // update, show, or hide the allWindows menu - // Check if there are new windows not already displayed. In such case, repopulate the allWindows - // menu. Windows removal is already handled by each preview being connected to the destroy signal - let old_windows = this._allWindowsMenuItem.menu._getMenuItems().map(function(item){ - return item._window; - }); - - let new_windows = windows.filter(function(w) {return old_windows.indexOf(w) < 0;}); - if (new_windows.length > 0) { - this._populateAllWindowMenu(windows); - - // Try to set the width to that of the submenu. - // TODO: can't get the actual size, getting a bit less. - // Temporary workaround: add 15px to compensate - this._allWindowsMenuItem.width = this._allWindowsMenuItem.menu.actor.width + 15; - - } - - // The menu is created hidden and never hidded after being shown. Instead, a singlal - // connected to its items destroy will set is insensitive if no more windows preview are shown. - if (windows.length > 0){ - this._allWindowsMenuItem.show(); - this._allWindowsMenuItem.setSensitive(true); - } - } - - // Update separators - this._getMenuItems().forEach(item => { - if ('label' in item) { - this._updateSeparatorVisibility(item); - } - }); - } - - _populateAllWindowMenu(windows) { - - this._allWindowsMenuItem.menu.removeAll(); - - if (windows.length > 0) { - - let activeWorkspace = global.workspace_manager.get_active_workspace(); - let separatorShown = windows[0].get_workspace() != activeWorkspace; - - for (let i = 0; i < windows.length; i++) { - let window = windows[i]; - if (!separatorShown && window.get_workspace() != activeWorkspace) { - this._allWindowsMenuItem.menu.addMenuItem(new PopupMenu.PopupSeparatorMenuItem()); - separatorShown = true; - } - - let item = new WindowPreview.WindowPreviewMenuItem(window); - this._allWindowsMenuItem.menu.addMenuItem(item); - item.connect('activate', () => { - this.emit('activate-window', window); - }); - - // This is to achieve a more gracefull transition when the last windows is closed. - item.connect('destroy', () => { - if(this._allWindowsMenuItem.menu._getMenuItems().length == 1) // It's still counting the item just going to be destroyed - this._allWindowsMenuItem.setSensitive(false); - }); - } - } - } -}; -Signals.addSignalMethods(MyAppIconMenu.prototype); - -function getWindows(app, location) { - if (location != null && Docking.DockManager.getDefault().fm1Client) { - return Docking.DockManager.getDefault().fm1Client.getWindows(location); - } else { - return app.get_windows(); - } -} - -// Filter out unnecessary windows, for instance -// nautilus desktop window. -function getInterestingWindows(app, monitorIndex, location) { - let windows = getWindows(app, location).filter(function(w) { - return !w.skip_taskbar; - }); - - let settings = Docking.DockManager.settings; - - // When using workspace isolation, we filter out windows - // that are not in the current workspace - if (settings.get_boolean('isolate-workspaces')) - windows = windows.filter(function(w) { - return w.get_workspace().index() == global.workspace_manager.get_active_workspace_index(); - }); - - if (settings.get_boolean('isolate-monitors')) - windows = windows.filter(function(w) { - return w.get_monitor() == monitorIndex; - }); - - return windows; -} - -/** - * A ShowAppsIcon improved class. - * - * - set label position based on dash orientation (Note, I am reusing most machinery of the appIcon class) - * - implement a popupMenu based on the AppIcon code (Note, I am reusing most machinery of the appIcon class) - * - */ - -var MyShowAppsIcon = GObject.registerClass({ - Signals: { - 'menu-state-changed': { param_types: [GObject.TYPE_BOOLEAN] }, - 'sync-tooltip': {} - } -} -, class DashToDock_MyShowAppsIcon extends Dash.ShowAppsIcon { - _init() { - super._init(); - - // Re-use appIcon methods - let appIconPrototype = AppDisplay.AppIcon.prototype; - this.toggleButton.y_expand = false; - this.toggleButton.connect('popup-menu', - appIconPrototype._onKeyboardPopupMenu.bind(this)); - this.toggleButton.connect('clicked', - this._removeMenuTimeout.bind(this)); - - this.reactive = true; - this.toggleButton.popupMenu = () => this.popupMenu.call(this); - this.toggleButton._removeMenuTimeout = () => this._removeMenuTimeout.call(this); - - this._menu = null; - this._menuManager = new PopupMenu.PopupMenuManager(this); - this._menuTimeoutId = 0; - } - - vfunc_leave_event(leaveEvent) - { - return AppDisplay.AppIcon.prototype.vfunc_leave_event.call( - this.toggleButton, leaveEvent); - } - - vfunc_button_press_event(buttonPressEvent) - { - return AppDisplay.AppIcon.prototype.vfunc_button_press_event.call( - this.toggleButton, buttonPressEvent); - } - - vfunc_touch_event(touchEvent) - { - return AppDisplay.AppIcon.prototype.vfunc_touch_event.call( - this.toggleButton, touchEvent); - } - - showLabel() { - itemShowLabel.call(this); - } - - _onMenuPoppedDown() { - AppDisplay.AppIcon.prototype._onMenuPoppedDown.apply(this, arguments); - } - - _setPopupTimeout() { - AppDisplay.AppIcon.prototype._onMenuPoppedDown.apply(this, arguments); - } - - _removeMenuTimeout() { - AppDisplay.AppIcon.prototype._removeMenuTimeout.apply(this, arguments); - } - - popupMenu() { - this._removeMenuTimeout(); - this.toggleButton.fake_release(); - - if (!this._menu) { - this._menu = new MyShowAppsIconMenu(this); - this._menu.connect('open-state-changed', (menu, isPoppedUp) => { - if (!isPoppedUp) - this._onMenuPoppedDown(); - }); - let id = Main.overview.connect('hiding', () => { - this._menu.close(); - }); - this._menu.actor.connect('destroy', function() { - Main.overview.disconnect(id); - }); - this._menuManager.addMenu(this._menu); - } - - this.emit('menu-state-changed', true); - - this.toggleButton.set_hover(true); - this._menu.popup(); - this._menuManager.ignoreRelease(); - this.emit('sync-tooltip'); - - return false; - } -}); - - -/** - * A menu for the showAppsIcon - */ -var MyShowAppsIconMenu = class DashToDock_MyShowAppsIconMenu extends MyAppIconMenu { - _rebuildMenu() { - this.removeAll(); - - /* Translators: %s is "Settings", which is automatically translated. You - can also translate the full message if this fits better your language. */ - let name = __('Dash to Dock %s').format(_('Settings')) - let item = this._appendMenuItem(name); - - item.connect('activate', function () { - if (typeof ExtensionUtils.openPrefs === 'function') { - ExtensionUtils.openPrefs(); - } else { - Util.spawn(["gnome-shell-extension-prefs", Me.metadata.uuid]); - } - }); - } -}; - -/** - * This function is used for both extendShowAppsIcon and extendDashItemContainer - */ -function itemShowLabel() { - // Check if the label is still present at all. When switching workpaces, the - // item might have been destroyed in between. - if (!this._labelText || this.label.get_stage() == null) - return; - - this.label.set_text(this._labelText); - this.label.opacity = 0; - this.label.show(); - - let [stageX, stageY] = this.get_transformed_position(); - let node = this.label.get_theme_node(); - - let itemWidth = this.allocation.x2 - this.allocation.x1; - let itemHeight = this.allocation.y2 - this.allocation.y1; - - let labelWidth = this.label.get_width(); - let labelHeight = this.label.get_height(); - - let x, y, xOffset, yOffset; - - let position = Utils.getPosition(); - this._isHorizontal = ((position == St.Side.TOP) || (position == St.Side.BOTTOM)); - let labelOffset = node.get_length('-x-offset'); - - switch (position) { - case St.Side.LEFT: - yOffset = Math.floor((itemHeight - labelHeight) / 2); - y = stageY + yOffset; - xOffset = labelOffset; - x = stageX + this.get_width() + xOffset; - break; - case St.Side.RIGHT: - yOffset = Math.floor((itemHeight - labelHeight) / 2); - y = stageY + yOffset; - xOffset = labelOffset; - x = Math.round(stageX) - labelWidth - xOffset; - break; - case St.Side.TOP: - y = stageY + labelOffset + itemHeight; - xOffset = Math.floor((itemWidth - labelWidth) / 2); - x = stageX + xOffset; - break; - case St.Side.BOTTOM: - yOffset = labelOffset; - y = stageY - labelHeight - yOffset; - xOffset = Math.floor((itemWidth - labelWidth) / 2); - x = stageX + xOffset; - break; - } - - // keep the label inside the screen border - // Only needed fot the x coordinate. - - // Leave a few pixel gap - let gap = 5; - let monitor = Main.layoutManager.findMonitorForActor(this); - if (x - monitor.x < gap) - x += monitor.x - x + labelOffset; - else if (x + labelWidth > monitor.x + monitor.width - gap) - x -= x + labelWidth - (monitor.x + monitor.width) + gap; - - this.label.remove_all_transitions(); - this.label.set_position(x, y); - this.label.ease({ - opacity: 255, - duration: Dash.DASH_ITEM_LABEL_SHOW_TIME, - mode: Clutter.AnimationMode.EASE_OUT_QUAD - }); -} diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/dash.js b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/dash.js deleted file mode 100644 index bac49c2..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/dash.js +++ /dev/null @@ -1,1072 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const Clutter = imports.gi.Clutter; -const Gio = imports.gi.Gio; -const GLib = imports.gi.GLib; -const GObject = imports.gi.GObject; -const Meta = imports.gi.Meta; -const Shell = imports.gi.Shell; -const St = imports.gi.St; - -const AppDisplay = imports.ui.appDisplay; -const AppFavorites = imports.ui.appFavorites; -const Dash = imports.ui.dash; -const DND = imports.ui.dnd; -const IconGrid = imports.ui.iconGrid; -const Main = imports.ui.main; -const PopupMenu = imports.ui.popupMenu; -const Util = imports.misc.util; -const Workspace = imports.ui.workspace; - -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Docking = Me.imports.docking; -const Utils = Me.imports.utils; -const AppIcons = Me.imports.appIcons; -const Locations = Me.imports.locations; - -const DASH_ANIMATION_TIME = Dash.DASH_ANIMATION_TIME; -const DASH_ITEM_LABEL_HIDE_TIME = Dash.DASH_ITEM_LABEL_HIDE_TIME; -const DASH_ITEM_HOVER_TIMEOUT = Dash.DASH_ITEM_HOVER_TIMEOUT; - -/** - * Extend DashItemContainer - * - * - set label position based on dash orientation - * - */ -let MyDashItemContainer = GObject.registerClass( -class DashToDock_MyDashItemContainer extends Dash.DashItemContainer { - - showLabel() { - return AppIcons.itemShowLabel.call(this); - } -}); - -const MyDashIconsVerticalLayout = GObject.registerClass( - class DashToDock_MyDashIconsVerticalLayout extends Clutter.BoxLayout { - _init() { - super._init({ - orientation: Clutter.Orientation.VERTICAL, - }); - } - - vfunc_get_preferred_height(container, forWidth) { - const [natHeight] = super.vfunc_get_preferred_height(container, forWidth); - return [natHeight, 0]; - } -}); - - -const baseIconSizes = [16, 22, 24, 32, 48, 64, 96, 128]; - -/** - * This class is a fork of the upstream dash class (ui.dash.js) - * - * Summary of changes: - * - disconnect global signals adding a destroy method; - * - play animations even when not in overview mode - * - set a maximum icon size - * - show running and/or favorite applications - * - hide showApps label when the custom menu is shown. - * - add scrollview - * ensure actor is visible on keyfocus inseid the scrollview - * - add 128px icon size, might be usefull for hidpi display - * - sync minimization application target position. - * - keep running apps ordered. - */ -var MyDash = GObject.registerClass({ - Signals: { - 'menu-closed': {}, - 'icon-size-changed': {}, - } -}, class DashToDock_MyDash extends St.Widget { - - _init(remoteModel, monitorIndex) { - // Initialize icon variables and size - this._maxWidth = -1; - this._maxHeight = -1; - this.iconSize = Docking.DockManager.settings.get_int('dash-max-icon-size'); - this._availableIconSizes = baseIconSizes; - this._shownInitially = false; - this._initializeIconSize(this.iconSize); - - this._separator = null; - - this._remoteModel = remoteModel; - this._monitorIndex = monitorIndex; - this._position = Utils.getPosition(); - this._isHorizontal = ((this._position == St.Side.TOP) || - (this._position == St.Side.BOTTOM)); - this._signalsHandler = new Utils.GlobalSignalsHandler(); - - this._dragPlaceholder = null; - this._dragPlaceholderPos = -1; - this._animatingPlaceholdersCount = 0; - this._showLabelTimeoutId = 0; - this._resetHoverTimeoutId = 0; - this._labelShowing = false; - - super._init({ - name: 'dash', - offscreen_redirect: Clutter.OffscreenRedirect.ALWAYS, - layout_manager: new Clutter.BinLayout() - }); - - this._dashContainer = new St.BoxLayout({ - x_align: Clutter.ActorAlign.CENTER, - y_align: this._isHorizontal ? Clutter.ActorAlign.CENTER: Clutter.ActorAlign.START, - vertical: !this._isHorizontal, - y_expand: this._isHorizontal, - x_expand: !this._isHorizontal, - pack_start: Docking.DockManager.settings.get_boolean('show-apps-at-top') - }); - - this._scrollView = new St.ScrollView({ - name: 'dashtodockDashScrollview', - // TODO: Fix scrolling - hscrollbar_policy: this._isHorizontal ? St.PolicyType.EXTERNAL : St.PolicyType.NEVER, - vscrollbar_policy: this._isHorizontal ? St.PolicyType.NEVER : St.PolicyType.EXTERNAL, - x_expand: this._isHorizontal, - y_expand: !this._isHorizontal, - enable_mouse_scrolling: false - }); - - if (Docking.DockManager.settings.get_boolean('extend-height')) { - if (!this._isHorizontal) { - this._scrollView.y_align = Clutter.ActorAlign.START; - } else { - this._scrollView.x_align = Clutter.ActorAlign.START; - } - } - - this._scrollView.connect('scroll-event', this._onScrollEvent.bind(this)); - - let rtl = Clutter.get_default_text_direction() == Clutter.TextDirection.RTL; - this._box = new St.BoxLayout({ - vertical: !this._isHorizontal, - clip_to_allocation: false, - ...(!this._isHorizontal ? { layout_manager: new MyDashIconsVerticalLayout() } : {}), - x_align: rtl ? Clutter.ActorAlign.END : Clutter.ActorAlign.START, - y_align: this._isHorizontal ? Clutter.ActorAlign.CENTER: Clutter.ActorAlign.START, - y_expand: !this._isHorizontal, - x_expand: this._isHorizontal - }); - this._box._delegate = this; - this._dashContainer.add_actor(this._scrollView); - this._scrollView.add_actor(this._box); - - this._showAppsIcon = new AppIcons.MyShowAppsIcon(); - this._showAppsIcon.show(false); - this._showAppsIcon.icon.setIconSize(this.iconSize); - this._showAppsIcon.x_expand = false; - this._showAppsIcon.y_expand = false; - if (!this._isHorizontal) - this._showAppsIcon.y_align = Clutter.ActorAlign.START; - this._hookUpLabel(this._showAppsIcon); - this._showAppsIcon.connect('menu-state-changed', (_icon, opened) => { - this._itemMenuStateChanged(this._showAppsIcon, opened); - }); - - this._dashContainer.add_child(this._showAppsIcon); - - this._background = new St.Widget({ - style_class: 'dash-background', - y_expand: this._isHorizontal, - x_expand: !this._isHorizontal, - }); - - const sizerBox = new Clutter.Actor(); - sizerBox.add_constraint(new Clutter.BindConstraint({ - source: this._isHorizontal ? this._showAppsIcon.icon : this._dashContainer, - coordinate: Clutter.BindCoordinate.HEIGHT, - })); - sizerBox.add_constraint(new Clutter.BindConstraint({ - source: this._isHorizontal ? this._dashContainer : this._showAppsIcon.icon, - coordinate: Clutter.BindCoordinate.WIDTH, - })); - this._background.add_child(sizerBox); - - this.add_child(this._background); - this.add_child(this._dashContainer); - - this._workId = Main.initializeDeferredWork(this._box, this._redisplay.bind(this)); - - this._shellSettings = new Gio.Settings({ - schema_id: 'org.gnome.shell' - }); - - this._appSystem = Shell.AppSystem.get_default(); - - this.iconAnimator = new Docking.IconAnimator(this); - - this._signalsHandler.add([ - this._appSystem, - 'installed-changed', - () => { - AppFavorites.getAppFavorites().reload(); - this._queueRedisplay(); - } - ], [ - AppFavorites.getAppFavorites(), - 'changed', - this._queueRedisplay.bind(this) - ], [ - this._appSystem, - 'app-state-changed', - this._queueRedisplay.bind(this) - ], [ - Main.overview, - 'item-drag-begin', - this._onItemDragBegin.bind(this) - ], [ - Main.overview, - 'item-drag-end', - this._onItemDragEnd.bind(this) - ], [ - Main.overview, - 'item-drag-cancelled', - this._onItemDragCancelled.bind(this) - ], [ - Main.overview, - 'window-drag-begin', - this._onWindowDragBegin.bind(this) - ], [ - Main.overview, - 'window-drag-cancelled', - this._onWindowDragEnd.bind(this) - ], [ - Main.overview, - 'window-drag-end', - this._onWindowDragEnd.bind(this) - ]); - - this.connect('destroy', this._onDestroy.bind(this)); - } - - vfunc_get_preferred_height(forWidth) { - let [minHeight, natHeight] = super.vfunc_get_preferred_height.call(this, forWidth); - if (!this._isHorizontal && this._maxHeight !== -1 && natHeight > this._maxHeight) - return [minHeight, this._maxHeight] - else - return [minHeight, natHeight] - } - - vfunc_get_preferred_width(forHeight) { - let [minWidth, natWidth] = super.vfunc_get_preferred_width.call(this, forHeight); - if (this._isHorizontal && this._maxWidth !== -1 && natWidth > this._maxWidth) - return [minWidth, this._maxWidth] - else - return [minWidth, natWidth] - } - - get _container() { - return this._dashContainer; - } - - _onDestroy() { - this.iconAnimator.destroy(); - this._signalsHandler.destroy(); - } - - - _onItemDragBegin() { - return Dash.Dash.prototype._onItemDragBegin.call(this, ...arguments); - } - - _onItemDragCancelled() { - return Dash.Dash.prototype._onItemDragCancelled.call(this, ...arguments); - } - - _onItemDragEnd() { - return Dash.Dash.prototype._onItemDragEnd.call(this, ...arguments); - } - - _endItemDrag() { - return Dash.Dash.prototype._endItemDrag.call(this, ...arguments); - } - - _onItemDragMotion() { - return Dash.Dash.prototype._onItemDragMotion.call(this, ...arguments); - } - - _appIdListToHash() { - return Dash.Dash.prototype._appIdListToHash.call(this, ...arguments); - } - - _queueRedisplay() { - return Dash.Dash.prototype._queueRedisplay.call(this, ...arguments); - } - - _hookUpLabel() { - return Dash.Dash.prototype._hookUpLabel.call(this, ...arguments); - } - - _syncLabel() { - return Dash.Dash.prototype._syncLabel.call(this, ...arguments); - } - - _clearDragPlaceholder() { - return Dash.Dash.prototype._clearDragPlaceholder.call(this, ...arguments); - } - - _clearEmptyDropTarget() { - return Dash.Dash.prototype._clearEmptyDropTarget.call(this, ...arguments); - } - - handleDragOver(source, actor, x, y, time) { - let ret; - if (this._isHorizontal) { - ret = Dash.Dash.prototype.handleDragOver.call(this, source, actor, x, y, time); - - if (ret == DND.DragMotionResult.CONTINUE) - return ret; - } else { - Object.defineProperty(this._box, 'height', { - configurable: true, - get: () => this._box.get_children().reduce((a, c) => a + c.height, 0), - }); - - let replacedPlaceholderWidth = false; - if (this._dragPlaceholder) { - replacedPlaceholderWidth = true; - Object.defineProperty(this._dragPlaceholder, 'width', { - configurable: true, - get: () => this._dragPlaceholder.height, - }); - } - - ret = Dash.Dash.prototype.handleDragOver.call(this, source, actor, y, x, time); - - delete this._box.height; - if (replacedPlaceholderWidth && this._dragPlaceholder) - delete this._dragPlaceholder.width; - - if (ret == DND.DragMotionResult.CONTINUE) - return ret; - - if (this._dragPlaceholder) { - this._dragPlaceholder.child.set_width(this.iconSize / 2); - this._dragPlaceholder.child.set_height(this.iconSize); - - let pos = this._dragPlaceholderPos; - if (this._isHorizontal && (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL)) - pos = this._box.get_children() - 1 - pos; - - if (pos != this._dragPlaceholderPos) { - this._dragPlaceholderPos = pos; - this._box.set_child_at_index(this._dragPlaceholder, - this._dragPlaceholderPos) - } - } - } - - if (this._dragPlaceholder) { - // Ensure the next and previous icon are visible when moving the placeholder - // (I assume there's room for both of them) - if (this._dragPlaceholderPos > 0) - ensureActorVisibleInScrollView(this._scrollView, - this._box.get_children()[this._dragPlaceholderPos - 1]); - - if (this._dragPlaceholderPos < this._box.get_children().length - 1) - ensureActorVisibleInScrollView(this._scrollView, - this._box.get_children()[this._dragPlaceholderPos + 1]); - } - - return ret; - } - - acceptDrop() { - return Dash.Dash.prototype.acceptDrop.call(this, ...arguments); - } - - _onWindowDragBegin() { - return Dash.Dash.prototype._onWindowDragBegin.call(this, ...arguments); - } - - _onWindowDragEnd() { - return Dash.Dash.prototype._onWindowDragEnd.call(this, ...arguments); - } - - _onScrollEvent(actor, event) { - // If scroll is not used because the icon is resized, let the scroll event propagate. - if (!Docking.DockManager.settings.get_boolean('icon-size-fixed')) - return Clutter.EVENT_PROPAGATE; - - // reset timeout to avid conflicts with the mousehover event - if (this._ensureAppIconVisibilityTimeoutId > 0) { - GLib.source_remove(this._ensureAppIconVisibilityTimeoutId); - this._ensureAppIconVisibilityTimeoutId = 0; - } - - // Skip to avoid double events mouse - // TODO: Horizontal events are emulated, potentially due to a conflict - // with the workspace switching gesture. - if (!this._isHorizontal && event.is_pointer_emulated()) { - return Clutter.EVENT_STOP; - } - - let adjustment, delta = 0; - - if (this._isHorizontal) - adjustment = this._scrollView.get_hscroll_bar().get_adjustment(); - else - adjustment = this._scrollView.get_vscroll_bar().get_adjustment(); - - let increment = adjustment.step_increment; - - if (this._isHorizontal) { - switch (event.get_scroll_direction()) { - case Clutter.ScrollDirection.LEFT: - delta = -increment; - break; - case Clutter.ScrollDirection.RIGHT: - delta = +increment; - break; - case Clutter.ScrollDirection.SMOOTH: - let [dx, dy] = event.get_scroll_delta(); - // TODO: Handle y - //delta = dy * increment; - // Also consider horizontal component, for instance touchpad - delta = dx * increment; - break; - } - } else { - switch (event.get_scroll_direction()) { - case Clutter.ScrollDirection.UP: - delta = -increment; - break; - case Clutter.ScrollDirection.DOWN: - delta = +increment; - break; - case Clutter.ScrollDirection.SMOOTH: - let [, dy] = event.get_scroll_delta(); - delta = dy * increment; - break; - } - } - - const value = adjustment.get_value(); - - // TODO: Remove this if possible. - if (Number.isNaN(value)) { - adjustment.set_value(delta); - } else { - adjustment.set_value(value + delta); - } - - return Clutter.EVENT_STOP; - } - - _createAppItem(app) { - let appIcon = new AppIcons.MyAppIcon(this._remoteModel, app, - this._monitorIndex, this.iconAnimator); - - if (appIcon._draggable) { - appIcon._draggable.connect('drag-begin', () => { - appIcon.opacity = 50; - }); - appIcon._draggable.connect('drag-end', () => { - appIcon.opacity = 255; - }); - } - - appIcon.connect('menu-state-changed', (appIcon, opened) => { - this._itemMenuStateChanged(item, opened); - }); - - let item = new MyDashItemContainer(); - item.setChild(appIcon); - - appIcon.connect('notify::hover', () => { - if (appIcon.hover) { - this._ensureAppIconVisibilityTimeoutId = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, 100, () => { - ensureActorVisibleInScrollView(this._scrollView, appIcon); - this._ensureAppIconVisibilityTimeoutId = 0; - return GLib.SOURCE_REMOVE; - }); - } - else { - if (this._ensureAppIconVisibilityTimeoutId > 0) { - GLib.source_remove(this._ensureAppIconVisibilityTimeoutId); - this._ensureAppIconVisibilityTimeoutId = 0; - } - } - }); - - appIcon.connect('clicked', (actor) => { - ensureActorVisibleInScrollView(this._scrollView, actor); - }); - - appIcon.connect('key-focus-in', (actor) => { - let [x_shift, y_shift] = ensureActorVisibleInScrollView(this._scrollView, actor); - - // This signal is triggered also by mouse click. The popup menu is opened at the original - // coordinates. Thus correct for the shift which is going to be applied to the scrollview. - if (appIcon._menu) { - appIcon._menu._boxPointer.xOffset = -x_shift; - appIcon._menu._boxPointer.yOffset = -y_shift; - } - }); - - // Override default AppIcon label_actor, now the - // accessible_name is set at DashItemContainer.setLabelText - appIcon.label_actor = null; - item.setLabelText(app.get_name()); - - appIcon.icon.setIconSize(this.iconSize); - this._hookUpLabel(item, appIcon); - - return item; - } - - /** - * Return an array with the "proper" appIcons currently in the dash - */ - getAppIcons() { - // Only consider children which are "proper" - // icons (i.e. ignoring drag placeholders) and which are not - // animating out (which means they will be destroyed at the end of - // the animation) - let iconChildren = this._box.get_children().filter(function(actor) { - return actor.child && - !!actor.child.icon && - !actor.animatingOut; - }); - - let appIcons = iconChildren.map(function(actor) { - return actor.child; - }); - - return appIcons; - } - - _updateAppsIconGeometry() { - let appIcons = this.getAppIcons(); - appIcons.forEach(function(icon) { - icon.updateIconGeometry(); - }); - } - - _itemMenuStateChanged(item, opened) { - Dash.Dash.prototype._itemMenuStateChanged.call(this, item, opened); - - if (!opened) { - // I want to listen from outside when a menu is closed. I used to - // add a custom signal to the appIcon, since gnome 3.8 the signal - // calling this callback was added upstream. - this.emit('menu-closed'); - } - } - - _adjustIconSize() { - // For the icon size, we only consider children which are "proper" - // icons (i.e. ignoring drag placeholders) and which are not - // animating out (which means they will be destroyed at the end of - // the animation) - let iconChildren = this._box.get_children().filter(actor => { - return actor.child && - actor.child._delegate && - actor.child._delegate.icon && - !actor.animatingOut; - }); - - iconChildren.push(this._showAppsIcon); - - if (this._maxWidth === -1 && this._maxHeight === -1) - return; - - // Check if the container is present in the stage. This avoids critical - // errors when unlocking the screen - if (!this._container.get_stage()) - return; - - const themeNode = this.get_theme_node(); - const maxAllocation = new Clutter.ActorBox({ - x1: 0, - y1: 0, - x2: this._isHorizontal ? this._maxWidth : 42 /* whatever */, - y2: this._isHorizontal ? 42 : this._maxHeight - }); - let maxContent = themeNode.get_content_box(maxAllocation); - let availWidth; - if (this._isHorizontal) - availWidth = maxContent.x2 - maxContent.x1; - else - availWidth = maxContent.y2 - maxContent.y1; - let spacing = themeNode.get_length('spacing'); - - let firstButton = iconChildren[0].child; - let firstIcon = firstButton._delegate.icon; - - // Enforce valid spacings during the size request - firstIcon.icon.ensure_style(); - const [, , iconWidth, iconHeight] = firstIcon.icon.get_preferred_size(); - const [, , buttonWidth, buttonHeight] = firstButton.get_preferred_size(); - - // Subtract icon padding and box spacing from the available height - if (this._isHorizontal) - // Subtract icon padding and box spacing from the available width - availWidth -= iconChildren.length * (buttonWidth - iconWidth) + - (iconChildren.length - 1) * spacing; - else - availWidth -= iconChildren.length * (buttonHeight - iconHeight) + - (iconChildren.length - 1) * spacing; - - // let availHeight = this._maxHeight; - // availHeight -= this._background.get_theme_node().get_vertical_padding(); - // availHeight -= themeNode.get_vertical_padding(); - // availHeight -= buttonHeight - iconHeight; - - const maxIconSize = // TODO: Math.min( - availWidth / iconChildren.length // ); , availHeight); - let scaleFactor = St.ThemeContext.get_for_stage(global.stage).scale_factor; - let iconSizes = this._availableIconSizes.map(s => s * scaleFactor); - - let newIconSize = this._availableIconSizes[0]; - for (let i = 0; i < iconSizes.length; i++) { - if (iconSizes[i] <= maxIconSize) - newIconSize = this._availableIconSizes[i]; - } - - if (newIconSize == this.iconSize) - return; - - let oldIconSize = this.iconSize; - this.iconSize = newIconSize; - this.emit('icon-size-changed'); - - let scale = oldIconSize / newIconSize; - for (let i = 0; i < iconChildren.length; i++) { - let icon = iconChildren[i].child._delegate.icon; - - // Set the new size immediately, to keep the icons' sizes - // in sync with this.iconSize - icon.setIconSize(this.iconSize); - - // Don't animate the icon size change when the overview - // is transitioning, not visible or when initially filling - // the dash - if (!Main.overview.visible || Main.overview.animationInProgress || - !this._shownInitially) - continue; - - let [targetWidth, targetHeight] = icon.icon.get_size(); - - // Scale the icon's texture to the previous size and - // tween to the new size - icon.icon.set_size(icon.icon.width * scale, - icon.icon.height * scale); - - icon.icon.ease({ - width: targetWidth, - height: targetHeight, - duration: DASH_ANIMATION_TIME, - mode: Clutter.AnimationMode.EASE_OUT_QUAD, - }); - } - - if (this._separator) { - if (this._isHorizontal) { - this._separator.ease({ - height: this.iconSize, - duration: DASH_ANIMATION_TIME, - mode: Clutter.AnimationMode.EASE_OUT_QUAD, - }); - } else { - this._separator.ease({ - width: this.iconSize, - duration: DASH_ANIMATION_TIME, - mode: Clutter.AnimationMode.EASE_OUT_QUAD, - }); - } - } - } - - _redisplay() { - let favorites = AppFavorites.getAppFavorites().getFavoriteMap(); - - let running = this._appSystem.get_running(); - let settings = Docking.DockManager.settings; - - if (settings.get_boolean('isolate-workspaces') || - settings.get_boolean('isolate-monitors')) { - // When using isolation, we filter out apps that have no windows in - // the current workspace - let monitorIndex = this._monitorIndex; - running = running.filter(function(_app) { - return AppIcons.getInterestingWindows(_app, monitorIndex).length != 0; - }); - } - - let children = this._box.get_children().filter(actor => { - return actor.child && - actor.child._delegate && - actor.child._delegate.app; - }); - // Apps currently in the dash - let oldApps = children.map(actor => actor.child._delegate.app); - // Apps supposed to be in the dash - let newApps = []; - - if (settings.get_boolean('show-favorites')) { - for (let id in favorites) - newApps.push(favorites[id]); - } - - if (settings.get_boolean('show-running')) { - for (let i = 0; i < running.length; i++) { - let app = running[i]; - if (settings.get_boolean('show-favorites') && app.get_id() in favorites) - continue; - newApps.push(app); - } - } - - if (settings.get_boolean('show-mounts')) { - if (!this._removables) { - this._removables = new Locations.Removables(); - this._signalsHandler.addWithLabel('show-mounts', - [ this._removables, - 'changed', - this._queueRedisplay.bind(this) ]); - } - Array.prototype.push.apply(newApps, this._removables.getApps()); - } else if (this._removables) { - this._signalsHandler.removeWithLabel('show-mounts'); - this._removables.destroy(); - this._removables = null; - } - - if (settings.get_boolean('show-trash')) { - if (!this._trash) { - this._trash = new Locations.Trash(); - this._signalsHandler.addWithLabel('show-trash', - [ this._trash, - 'changed', - this._queueRedisplay.bind(this) ]); - } - newApps.push(this._trash.getApp()); - } else if (this._trash) { - this._signalsHandler.removeWithLabel('show-trash'); - this._trash.destroy(); - this._trash = null; - } - - // Figure out the actual changes to the list of items; we iterate - // over both the list of items currently in the dash and the list - // of items expected there, and collect additions and removals. - // Moves are both an addition and a removal, where the order of - // the operations depends on whether we encounter the position - // where the item has been added first or the one from where it - // was removed. - // There is an assumption that only one item is moved at a given - // time; when moving several items at once, everything will still - // end up at the right position, but there might be additional - // additions/removals (e.g. it might remove all the launchers - // and add them back in the new order even if a smaller set of - // additions and removals is possible). - // If above assumptions turns out to be a problem, we might need - // to use a more sophisticated algorithm, e.g. Longest Common - // Subsequence as used by diff. - - let addedItems = []; - let removedActors = []; - - let newIndex = 0; - let oldIndex = 0; - while (newIndex < newApps.length || oldIndex < oldApps.length) { - let oldApp = oldApps.length > oldIndex ? oldApps[oldIndex] : null; - let newApp = newApps.length > newIndex ? newApps[newIndex] : null; - - // No change at oldIndex/newIndex - if (oldApp == newApp) { - oldIndex++; - newIndex++; - continue; - } - - // App removed at oldIndex - if (oldApp && !newApps.includes(oldApp)) { - removedActors.push(children[oldIndex]); - oldIndex++; - continue; - } - - // App added at newIndex - if (newApp && !oldApps.includes(newApp)) { - addedItems.push({ app: newApp, - item: this._createAppItem(newApp), - pos: newIndex }); - newIndex++; - continue; - } - - // App moved - let nextApp = newApps.length > newIndex + 1 - ? newApps[newIndex + 1] : null; - let insertHere = nextApp && nextApp == oldApp; - let alreadyRemoved = removedActors.reduce((result, actor) => { - let removedApp = actor.child._delegate.app; - return result || removedApp == newApp; - }, false); - - if (insertHere || alreadyRemoved) { - let newItem = this._createAppItem(newApp); - addedItems.push({ app: newApp, - item: newItem, - pos: newIndex + removedActors.length }); - newIndex++; - } else { - removedActors.push(children[oldIndex]); - oldIndex++; - } - } - - for (let i = 0; i < addedItems.length; i++) { - this._box.insert_child_at_index(addedItems[i].item, - addedItems[i].pos); - } - - for (let i = 0; i < removedActors.length; i++) { - let item = removedActors[i]; - - // Don't animate item removal when the overview is transitioning - // or hidden - if (!Main.overview.animationInProgress) - item.animateOutAndDestroy(); - else - item.destroy(); - } - - this._adjustIconSize(); - - // Skip animations on first run when adding the initial set - // of items, to avoid all items zooming in at once - - let animate = this._shownInitially && - !Main.overview.animationInProgress; - - if (!this._shownInitially) - this._shownInitially = true; - - for (let i = 0; i < addedItems.length; i++) - addedItems[i].item.show(animate); - - // Update separator - const nFavorites = Object.keys(favorites).length; - const nIcons = children.length + addedItems.length - removedActors.length; - if (nFavorites > 0 && nFavorites < nIcons) { - if (!this._separator) { - if (!this._isHorizontal) { - this._separator = new St.Widget({ - style_class: 'vertical-dash-separator', - x_align: Clutter.ActorAlign.CENTER, - width: this.iconSize, - }); - } else { - this._separator = new St.Widget({ - style_class: 'dash-separator', - y_align: Clutter.ActorAlign.CENTER, - height: this.iconSize, - }); - } - - this._box.add_child(this._separator); - } - let pos = nFavorites; - if (this._dragPlaceholder) - pos++; - this._box.set_child_at_index(this._separator, pos); - } else if (this._separator) { - this._separator.destroy(); - this._separator = null; - } - - // Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=692744 - // Without it, StBoxLayout may use a stale size cache - this._box.queue_relayout(); - // TODO - // This is required for icon reordering when the scrollview is used. - this._updateAppsIconGeometry(); - - // This will update the size, and the corresponding number for each icon - this._updateNumberOverlay(); - } - - _updateNumberOverlay() { - let appIcons = this.getAppIcons(); - let counter = 1; - appIcons.forEach(function(icon) { - if (counter < 10){ - icon.setNumberOverlay(counter); - counter++; - } else if (counter == 10) { - icon.setNumberOverlay(0); - counter++; - } else { - // No overlay after 10 - icon.setNumberOverlay(-1); - } - icon.updateNumberOverlay(); - }); - - } - - toggleNumberOverlay(activate) { - let appIcons = this.getAppIcons(); - appIcons.forEach(function(icon) { - icon.toggleNumberOverlay(activate); - }); - } - - _initializeIconSize(max_size) { - let max_allowed = baseIconSizes[baseIconSizes.length-1]; - max_size = Math.min(max_size, max_allowed); - - if (Docking.DockManager.settings.get_boolean('icon-size-fixed')) - this._availableIconSizes = [max_size]; - else { - this._availableIconSizes = baseIconSizes.filter(function(val) { - return (val vvalue + vpageSize - voffset) - vvalue = Math.min(vupper -vpageSize, y2 + voffset - vpageSize); - - if (x1 < hvalue + hoffset) - hvalue = Math.max(0, x1 - hoffset); - else if (hvalue < hupper - hpageSize && x2 > hvalue + hpageSize - hoffset) - hvalue = Math.min(hupper - hpageSize, x2 + hoffset - hpageSize); - - if (vvalue !== vvalue0) { - vadjustment.ease(vvalue, { - mode: Clutter.AnimationMode.EASE_OUT_QUAD, - duration: Util.SCROLL_TIME - }); - } - - if (hvalue !== hvalue0) { - hadjustment.ease(hvalue, { - mode: Clutter.AnimationMode.EASE_OUT_QUAD, - duration: Util.SCROLL_TIME - }); - } - - return [hvalue- hvalue0, vvalue - vvalue0]; -} diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/dbusmenuUtils.js b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/dbusmenuUtils.js deleted file mode 100644 index 0d2793d..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/dbusmenuUtils.js +++ /dev/null @@ -1,274 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const Atk = imports.gi.Atk; -const Clutter = imports.gi.Clutter; -let Dbusmenu = null; /* Dynamically imported */ -const Gio = imports.gi.Gio; -const GLib = imports.gi.GLib; -const St = imports.gi.St; - -const PopupMenu = imports.ui.popupMenu; - -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Utils = Me.imports.utils; - -// Dbusmenu features not (yet) supported: -// -// * The CHILD_DISPLAY property -// -// This seems to have only one possible value in the Dbusmenu API, so -// there's little point in depending on it--the code in libdbusmenu sets it -// if and only if an item has children, so for our purposes it's simpler -// and more intuitive to just check children.length. (This does ignore the -// possibility of a program not using libdbusmenu and setting CHILD_DISPLAY -// independently, perhaps to indicate that an childless menu item should -// nevertheless be displayed like a submenu.) -// -// * Children more than two levels deep -// -// PopupMenu doesn't seem to support submenus in submenus. -// -// * Shortcut keys -// -// If these keys are supposed to be installed as global shortcuts, we'd -// have to query these aggressively and not wait for the DBus menu to be -// mapped to a popup menu. A shortcut key that only works once the popup -// menu is open and has key focus is possibly of marginal value. - -function haveDBusMenu() { - if (Dbusmenu) - return Dbusmenu; - - try { - Dbusmenu = imports.gi.Dbusmenu; - return Dbusmenu; - } catch (e) { - log(`Failed to import DBusMenu, quicklists are not avaialble: ${e}`); - return null; - } -} - - -function makePopupMenuItem(dbusmenuItem, deep) { - // These are the only properties guaranteed to be available when the root - // item is first announced. Other properties might be loaded already, but - // be sure to connect to Dbusmenu.MENUITEM_SIGNAL_PROPERTY_CHANGED to get - // the most up-to-date values in case they aren't. - const itemType = dbusmenuItem.property_get(Dbusmenu.MENUITEM_PROP_TYPE); - const label = dbusmenuItem.property_get(Dbusmenu.MENUITEM_PROP_LABEL); - const visible = dbusmenuItem.property_get_bool(Dbusmenu.MENUITEM_PROP_VISIBLE); - const enabled = dbusmenuItem.property_get_bool(Dbusmenu.MENUITEM_PROP_ENABLED); - const accessibleDesc = dbusmenuItem.property_get(Dbusmenu.MENUITEM_PROP_ACCESSIBLE_DESC); - //const childDisplay = dbusmenuItem.property_get(Dbusmenu.MENUITEM_PROP_CHILD_DISPLAY); - - let item; - const signalsHandler = new Utils.GlobalSignalsHandler(); - const wantIcon = itemType === Dbusmenu.CLIENT_TYPES_IMAGE; - - // If the basic type of the menu item needs to change, call this. - const recreateItem = () => { - const newItem = makePopupMenuItem(dbusmenuItem, deep); - const parentMenu = item._parent; - parentMenu.addMenuItem(newItem); - // Reminder: Clutter thinks of later entries in the child list as - // "above" earlier ones, so "above" here means "below" in terms of the - // menu's vertical order. - parentMenu.actor.set_child_above_sibling(newItem.actor, item.actor); - if (newItem.menu) { - parentMenu.actor.set_child_above_sibling(newItem.menu.actor, newItem.actor); - } - parentMenu.actor.remove_child(item.actor); - item.destroy(); - item = null; - }; - - const updateDisposition = () => { - const disposition = dbusmenuItem.property_get(Dbusmenu.MENUITEM_PROP_DISPOSITION); - let icon_name = null; - switch (disposition) { - case Dbusmenu.MENUITEM_DISPOSITION_ALERT: - case Dbusmenu.MENUITEM_DISPOSITION_WARNING: - icon_name = 'dialog-warning-symbolic'; - break; - case Dbusmenu.MENUITEM_DISPOSITION_INFORMATIVE: - icon_name = 'dialog-information-symbolic'; - break; - } - if (icon_name) { - item._dispositionIcon = new St.Icon({ - icon_name, - style_class: 'popup-menu-icon', - y_align: Clutter.ActorAlign.CENTER, - y_expand: true, - }); - let expander; - for (let child = item.label.get_next_sibling();; child = child.get_next_sibling()) { - if (!child) { - expander = new St.Bin({ - style_class: 'popup-menu-item-expander', - x_expand: true, - }); - item.actor.add_child(expander); - break; - } else if (child instanceof St.Widget && child.has_style_class_name('popup-menu-item-expander')) { - expander = child; - break; - } - } - item.actor.insert_child_above(item._dispositionIcon, expander); - } else if (item._dispositionIcon) { - item.actor.remove_child(item._dispositionIcon); - item._dispositionIcon = null; - } - }; - - const updateIcon = () => { - if (!wantIcon) { - return; - } - const iconData = dbusmenuItem.property_get_byte_array(Dbusmenu.MENUITEM_PROP_ICON_DATA); - const iconName = dbusmenuItem.property_get(Dbusmenu.MENUITEM_PROP_ICON_NAME); - if (iconName) { - item.icon.icon_name = iconName; - } else if (iconData.length) { - item.icon.gicon = Gio.BytesIcon.new(iconData); - } - }; - - const updateOrnament = () => { - const toggleType = dbusmenuItem.property_get(Dbusmenu.MENUITEM_PROP_TOGGLE_TYPE); - switch (toggleType) { - case Dbusmenu.MENUITEM_TOGGLE_CHECK: - item.actor.accessible_role = Atk.Role.CHECK_MENU_ITEM; - break; - case Dbusmenu.MENUITEM_TOGGLE_RADIO: - item.actor.accessible_role = Atk.Role.RADIO_MENU_ITEM; - break; - default: - item.actor.accessible_role = Atk.Role.MENU_ITEM; - } - let ornament = PopupMenu.Ornament.NONE; - const state = dbusmenuItem.property_get_int(Dbusmenu.MENUITEM_PROP_TOGGLE_STATE); - if (state === Dbusmenu.MENUITEM_TOGGLE_STATE_UNKNOWN) { - // PopupMenu doesn't natively support an "unknown" ornament, but we - // can hack one in: - item.setOrnament(ornament); - item.actor.add_accessible_state(Atk.StateType.INDETERMINATE); - item._ornamentLabel.text = '\u2501'; - item.actor.remove_style_pseudo_class('checked'); - } else { - item.actor.remove_accessible_state(Atk.StateType.INDETERMINATE); - if (state === Dbusmenu.MENUITEM_TOGGLE_STATE_CHECKED) { - if (toggleType === Dbusmenu.MENUITEM_TOGGLE_CHECK) { - ornament = PopupMenu.Ornament.CHECK; - } else if (toggleType === Dbusmenu.MENUITEM_TOGGLE_RADIO) { - ornament = PopupMenu.Ornament.DOT; - } - item.actor.add_style_pseudo_class('checked'); - } else { - item.actor.remove_style_pseudo_class('checked'); - } - item.setOrnament(ornament); - } - }; - - const onPropertyChanged = (dbusmenuItem, name, value) => { - // `value` is null when a property is cleared, so handle those cases - // with sensible defaults. - switch (name) { - case Dbusmenu.MENUITEM_PROP_TYPE: - recreateItem(); - break; - case Dbusmenu.MENUITEM_PROP_ENABLED: - item.setSensitive(value ? value.unpack() : false); - break; - case Dbusmenu.MENUITEM_PROP_LABEL: - item.label.text = value ? value.unpack() : ''; - break; - case Dbusmenu.MENUITEM_PROP_VISIBLE: - item.actor.visible = value ? value.unpack() : false; - break; - case Dbusmenu.MENUITEM_PROP_DISPOSITION: - updateDisposition(); - break; - case Dbusmenu.MENUITEM_PROP_ACCESSIBLE_DESC: - item.actor.get_accessible().accessible_description = value && value.unpack() || ''; - break; - case Dbusmenu.MENUITEM_PROP_ICON_DATA: - case Dbusmenu.MENUITEM_PROP_ICON_NAME: - updateIcon(); - break; - case Dbusmenu.MENUITEM_PROP_TOGGLE_TYPE: - case Dbusmenu.MENUITEM_PROP_TOGGLE_STATE: - updateOrnament(); - break; - } - }; - - - // Start actually building the menu item. - const children = dbusmenuItem.get_children(); - if (children.length && !deep) { - // Make a submenu. - item = new PopupMenu.PopupSubMenuMenuItem(label, wantIcon); - const updateChildren = () => { - const children = dbusmenuItem.get_children(); - if (!children.length) { - return recreateItem(); - } - item.menu.removeAll(); - children.forEach(remoteChild => - item.menu.addMenuItem(makePopupMenuItem(remoteChild, true))); - }; - updateChildren(); - signalsHandler.add( - [dbusmenuItem, Dbusmenu.MENUITEM_SIGNAL_CHILD_ADDED, updateChildren], - [dbusmenuItem, Dbusmenu.MENUITEM_SIGNAL_CHILD_MOVED, updateChildren], - [dbusmenuItem, Dbusmenu.MENUITEM_SIGNAL_CHILD_REMOVED, updateChildren]); - - } else { - // Don't make a submenu. - if (!deep) { - // We only have the potential to get a submenu if we aren't deep. - signalsHandler.add( - [dbusmenuItem, Dbusmenu.MENUITEM_SIGNAL_CHILD_ADDED, recreateItem], - [dbusmenuItem, Dbusmenu.MENUITEM_SIGNAL_CHILD_MOVED, recreateItem], - [dbusmenuItem, Dbusmenu.MENUITEM_SIGNAL_CHILD_REMOVED, recreateItem]); - } - - if (itemType === Dbusmenu.CLIENT_TYPES_SEPARATOR) { - item = new PopupMenu.PopupSeparatorMenuItem(); - } else if (wantIcon) { - item = new PopupMenu.PopupImageMenuItem(label, null); - item.icon = item._icon; - } else { - item = new PopupMenu.PopupMenuItem(label); - } - } - - // Set common initial properties. - item.actor.visible = visible; - item.setSensitive(enabled); - if (accessibleDesc) { - item.actor.get_accessible().accessible_description = accessibleDesc; - } - updateDisposition(); - updateIcon(); - updateOrnament(); - - // Prevent an initial resize flicker. - if (wantIcon) { - item.icon.icon_size = 16; - } - - signalsHandler.add([dbusmenuItem, Dbusmenu.MENUITEM_SIGNAL_PROPERTY_CHANGED, onPropertyChanged]); - - // Connections on item will be lost when item is disposed; there's no need - // to add them to signalsHandler. - item.connect('activate', () => { - dbusmenuItem.handle_event(Dbusmenu.MENUITEM_EVENT_ACTIVATED, new GLib.Variant('i', 0), Math.floor(Date.now()/1000)); - }); - item.connect('destroy', () => signalsHandler.destroy()); - - return item; -} diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/docking.js b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/docking.js deleted file mode 100644 index daa9de5..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/docking.js +++ /dev/null @@ -1,1967 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const Clutter = imports.gi.Clutter; -const GLib = imports.gi.GLib; -const GObject = imports.gi.GObject; -const Meta = imports.gi.Meta; -const Shell = imports.gi.Shell; -const St = imports.gi.St; -const Params = imports.misc.params; - -const Main = imports.ui.main; -const Dash = imports.ui.dash; -const IconGrid = imports.ui.iconGrid; -const Overview = imports.ui.overview; -const OverviewControls = imports.ui.overviewControls; -const PointerWatcher = imports.ui.pointerWatcher; -const Signals = imports.signals; -const SearchController = imports.ui.searchController; -const WorkspaceSwitcherPopup= imports.ui.workspaceSwitcherPopup; -const Layout = imports.ui.layout; -const LayoutManager = imports.ui.main.layoutManager; - -const ExtensionUtils = imports.misc.extensionUtils; -const Me = ExtensionUtils.getCurrentExtension(); -const Utils = Me.imports.utils; -const Intellihide = Me.imports.intellihide; -const Theming = Me.imports.theming; -const MyDash = Me.imports.dash; -const LauncherAPI = Me.imports.launcherAPI; -const FileManager1API = Me.imports.fileManager1API; - -const DOCK_DWELL_CHECK_INTERVAL = 100; - -var State = { - HIDDEN: 0, - SHOWING: 1, - SHOWN: 2, - HIDING: 3 -}; - -const scrollAction = { - DO_NOTHING: 0, - CYCLE_WINDOWS: 1, - SWITCH_WORKSPACE: 2 -}; - -/** - * Ported from GNOME Shell 3.38 - * - * In GNOME Shell 40+ the dash is always visible, - * we need to re-include a spacer because our dash - * is not always visible. - */ -var DashSpacer = GObject.registerClass( - class DashSpacer extends Clutter.Actor { - _init(source) { - super._init(); - - this._bindConstraint = new Clutter.BindConstraint({ - source, - coordinate: Clutter.BindCoordinate.SIZE, - }); - this.add_constraint(this._bindConstraint); - } - - setMaxSize(size) { - // Handles overview controls trying to set the dash' max size. - } - - vfunc_get_preferred_width(forHeight) { - if (this._bindConstraint) - return this._bindConstraint.source.get_preferred_width(forHeight); - return super.vfunc_get_preferred_width(forHeight); - } - - vfunc_get_preferred_height(forWidth) { - if (this._bindConstraint) - return this._bindConstraint.source.get_preferred_height(forWidth); - return super.vfunc_get_preferred_height(forWidth); - } - } -); - - -/** - * A simple St.Widget with one child whose allocation takes into account the - * slide out of its child via the _slidex parameter ([0:1]). - * - * Required since I want to track the input region of this container which is - * based on its allocation even if the child overlows the parent actor. By doing - * this the region of the dash that is slideout is not steling anymore the input - * regions making the extesion usable when the primary monitor is the right one. - * - * The slidex parameter can be used to directly animate the sliding. The parent - * must have a WEST (SOUTH) anchor_point to achieve the sliding to the RIGHT (BOTTOM) - * side. -*/ -var DashSlideContainer = GObject.registerClass({ - Properties: { - 'side': GObject.ParamSpec.enum( - 'side', 'side', 'side', - GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT_ONLY, - St.Side, St.Side.LEFT), - 'slidex': GObject.ParamSpec.double( - 'slidex', 'slidex', 'slidex', - GObject.ParamFlags.READWRITE | GObject.ParamFlags.CONSTRUCT, - 0, 1, 1), - } -}, class DashToDock_DashSlideContainer extends St.Bin { - - _init(params = {}) { - super._init(params); - - // slide parameter: 1 = visible, 0 = hidden. - this._slidex = params.slidex || 1; - this._slideoutSize = 0; // minimum size when slided out - } - - vfunc_allocate(box, flags) { - let contentBox = this.get_theme_node().get_content_box(box); - - this.set_allocation(box); - - if (this.child == null) - return; - - let availWidth = contentBox.x2 - contentBox.x1; - let availHeight = contentBox.y2 - contentBox.y1; - let [, , natChildWidth, natChildHeight] = - this.child.get_preferred_size(); - - let childWidth = natChildWidth; - let childHeight = natChildHeight; - - let childBox = new Clutter.ActorBox(); - - let slideoutSize = this._slideoutSize; - - if (this.side == St.Side.LEFT) { - childBox.x1 = (this._slidex -1) * (childWidth - slideoutSize); - childBox.x2 = slideoutSize + this._slidex*(childWidth - slideoutSize); - childBox.y1 = 0; - childBox.y2 = childBox.y1 + childHeight; - } - else if ((this.side == St.Side.RIGHT) || (this.side == St.Side.BOTTOM)) { - childBox.x1 = 0; - childBox.x2 = childWidth; - childBox.y1 = 0; - childBox.y2 = childBox.y1 + childHeight; - } - else if (this.side == St.Side.TOP) { - childBox.x1 = 0; - childBox.x2 = childWidth; - childBox.y1 = (this._slidex -1) * (childHeight - slideoutSize); - childBox.y2 = slideoutSize + this._slidex * (childHeight - slideoutSize); - } - - this.child.allocate(childBox); - - this.child.set_clip(-childBox.x1, -childBox.y1, - -childBox.x1+availWidth, -childBox.y1 + availHeight); - } - - /** - * Just the child width but taking into account the slided out part - */ - vfunc_get_preferred_width(forHeight) { - let [minWidth, natWidth] = super.vfunc_get_preferred_width(forHeight); - if ((this.side == St.Side.LEFT) || (this.side == St.Side.RIGHT)) { - minWidth = (minWidth - this._slideoutSize) * this._slidex + this._slideoutSize; - natWidth = (natWidth - this._slideoutSize) * this._slidex + this._slideoutSize; - } - return [minWidth, natWidth]; - } - - /** - * Just the child height but taking into account the slided out part - */ - vfunc_get_preferred_height(forWidth) { - let [minHeight, natHeight] = super.vfunc_get_preferred_height(forWidth); - if ((this.side == St.Side.TOP) || (this.side == St.Side.BOTTOM)) { - minHeight = (minHeight - this._slideoutSize) * this._slidex + this._slideoutSize; - natHeight = (natHeight - this._slideoutSize) * this._slidex + this._slideoutSize; - } - return [minHeight, natHeight]; - } - - set slidex(value) { - if (value == this._slidex) - return; - - this._slidex = value; - this.notify('slidex'); - - this.queue_relayout(); - } - - get slidex() { - return this._slidex; - } -}); - -var DockedDash = GObject.registerClass({ - Signals: { - 'showing': {}, - 'hiding': {}, - } -}, class DashToDock extends St.Bin { - - _init(remoteModel, monitorIndex) { - this._rtl = (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL); - - // Load settings - let settings = DockManager.settings; - this._remoteModel = remoteModel; - this._monitorIndex = monitorIndex; - // Connect global signals - this._signalsHandler = new Utils.GlobalSignalsHandler(); - - this._bindSettingsChanges(); - - this._position = Utils.getPosition(); - this._isHorizontal = ((this._position == St.Side.TOP) || (this._position == St.Side.BOTTOM)); - - // Temporary ignore hover events linked to autohide for whatever reason - this._ignoreHover = false; - this._oldignoreHover = null; - // This variables are linked to the settings regardles of autohide or intellihide - // being temporary disable. Get set by _updateVisibilityMode; - this._autohideIsEnabled = null; - this._intellihideIsEnabled = null; - this._fixedIsEnabled = null; - - // Create intellihide object to monitor windows overlapping - this._intellihide = new Intellihide.Intellihide(this._monitorIndex); - - // initialize dock state - this._dockState = State.HIDDEN; - - // Put dock on the required monitor - this._monitor = Main.layoutManager.monitors[this._monitorIndex]; - - // this store size and the position where the dash is shown; - // used by intellihide module to check window overlap. - this.staticBox = new Clutter.ActorBox(); - - // Initialize pressure barrier variables - this._canUsePressure = false; - this._pressureBarrier = null; - this._barrier = null; - this._removeBarrierTimeoutId = 0; - - // Initialize dwelling system variables - this._dockDwelling = false; - this._dockWatch = null; - this._dockDwellUserTime = 0; - this._dockDwellTimeoutId = 0 - - // Create a new dash object - this.dash = new MyDash.MyDash(this._remoteModel, this._monitorIndex); - - if (Main.overview.isDummy || !settings.get_boolean('show-show-apps-button')) - this.dash.hideShowAppsButton(); - - // Create the main actor and the containers for sliding in and out and - // centering, turn on track hover - - let positionStyleClass = ['top', 'right', 'bottom', 'left']; - // This is the centering actor - super._init({ - name: 'dashtodockContainer', - reactive: false, - style_class: positionStyleClass[this._position], - }); - - // This is the sliding actor whose allocation is to be tracked for input regions - this._slider = new DashSlideContainer({ - side: this._position, - slidex: 0, - ...(this._isHorizontal ? { - x_align: Clutter.ActorAlign.CENTER, - } : { - y_align: Clutter.ActorAlign.CENTER, - }) - }); - - // This is the actor whose hover status us tracked for autohide - this._box = new St.BoxLayout({ - name: 'dashtodockBox', - reactive: true, - track_hover: true - }); - this._box.connect('notify::hover', this._hoverChanged.bind(this)); - - this._signalsHandler.add([ - // update when workarea changes, for instance if other extensions modify the struts - //(like moving th panel at the bottom) - global.display, - 'workareas-changed', - this._resetPosition.bind(this) - ], [ - global.display, - 'in-fullscreen-changed', - this._updateBarrier.bind(this) - ], [ - // Monitor windows overlapping - this._intellihide, - 'status-changed', - this._updateDashVisibility.bind(this) - ], [ - // sync hover after a popupmenu is closed - this.dash, - 'menu-closed', - () => { this._box.sync_hover() } - ]); - - if (!Main.overview.isDummy) { - this._signalsHandler.add([ - Main.overview, - 'item-drag-begin', - this._onDragStart.bind(this) - ], [ - Main.overview, - 'item-drag-end', - this._onDragEnd.bind(this) - ], [ - Main.overview, - 'item-drag-cancelled', - this._onDragEnd.bind(this) - ], [ - Main.overview, - 'showing', - this._onOverviewShowing.bind(this) - ], [ - Main.overview, - 'hiding', - this._onOverviewHiding.bind(this) - ], - [ - Main.overview, - 'hidden', - this._onOverviewHidden.bind(this) - ]); - } - - this._injectionsHandler = new Utils.InjectionsHandler(); - this._themeManager = new Theming.ThemeManager(this); - - // Since the actor is not a topLevel child and its parent is now not added to the Chrome, - // the allocation change of the parent container (slide in and slideout) doesn't trigger - // anymore an update of the input regions. Force the update manually. - this.connect('notify::allocation', - Main.layoutManager._queueUpdateRegions.bind(Main.layoutManager)); - - - // Since Clutter has no longer ClutterAllocationFlags, - // "allocation-changed" signal has been removed. MR !1245 - this.dash._container.connect('notify::allocation', this._updateStaticBox.bind(this)); - this._slider.connect(this._isHorizontal ? 'notify::x' : 'notify::y', this._updateStaticBox.bind(this)); - - // Load optional features that need to be activated for one dock only - if (this._monitorIndex == settings.get_int('preferred-monitor')) - this._enableExtraFeatures(); - // Load optional features that need to be activated once per dock - this._optionalScrollWorkspaceSwitch(); - - // Delay operations that require the shell to be fully loaded and with - // user theme applied. - - this._paintId = global.stage.connect('after-paint', this._initialize.bind(this)); - - // Reserve space for the dash in the overview. - this._dashSpacer = new DashSpacer(this._box); - - // Add dash container actor and the container to the Chrome. - this.set_child(this._slider); - this._slider.set_child(this._box); - this._box.add_actor(this.dash); - - // Add aligning container without tracking it for input region - Main.uiGroup.add_child(this); - if (Main.uiGroup.contains(global.top_window_group)) - Main.uiGroup.set_child_below_sibling(this, global.top_window_group); - - if (settings.get_boolean('dock-fixed')) { - // Note: tracking the fullscreen directly on the slider actor causes some hiccups when fullscreening - // windows of certain applications - Main.layoutManager._trackActor(this, {affectsInputRegion: false, trackFullscreen: true}); - Main.layoutManager._trackActor(this._slider, {affectsStruts: true}); - } - else - Main.layoutManager._trackActor(this._slider); - - // Create and apply height/width constraint to the dash. - if (this._isHorizontal) { - this.connect('notify::width', () => { - this.dash.setMaxSize(this.width, this.height); - }); - } else { - this.connect('notify::height', () => { - this.dash.setMaxSize(this.width, this.height) - }); - } - - if (this._position == St.Side.RIGHT) - this.connect('notify::width', () => this.translation_x = -this.width); - else if (this._position == St.Side.BOTTOM) - this.connect('notify::height', () => this.translation_y = -this.height); - - // Set initial position - this._resetPosition(); - - this.connect('destroy', this._onDestroy.bind(this)); - } - - _untrackDock() { - Main.layoutManager._untrackActor(this); - Main.layoutManager._untrackActor(this._slider); - - } - - _trackDock() { - if (DockManager.settings.get_boolean('dock-fixed')) { - if (Main.layoutManager._findActor(this) == -1) - Main.layoutManager._trackActor(this, { affectsInputRegion: false, trackFullscreen: true }); - if (Main.layoutManager._findActor(this._slider) == -1) - Main.layoutManager._trackActor(this._slider, { affectsStruts: true }); - } else { - if (Main.layoutManager._findActor(this._slider) == -1) - Main.layoutManager._trackActor(this._slider); - } - } - - _initialize() { - log('[dash-to-dock] initializing...'); - - if (this._paintId > 0) { - global.stage.disconnect(this._paintId); - this._paintId = 0; - } - - // Apply custome css class according to the settings - this._themeManager.updateCustomTheme(); - - this._updateVisibilityMode(); - - // In case we are already inside the overview when the extension is loaded, - // for instance on unlocking the screen if it was locked with the overview open. - if (Main.overview.visibleTarget) { - this._onOverviewShowing(); - } - - // Setup pressure barrier (GS38+ only) - this._updatePressureBarrier(); - this._updateBarrier(); - - // setup dwelling system if pressure barriers are not available - this._setupDockDwellIfNeeded(); - } - - _onDestroy() { - // Disconnect global signals - this._signalsHandler.destroy(); - // The dash, intellihide and themeManager have global signals as well internally - this.dash.destroy(); - this._intellihide.destroy(); - this._themeManager.destroy(); - - this._injectionsHandler.destroy(); - - if (this._marginLater) { - Meta.later_remove(this._marginLater); - delete this._marginLater; - } - - // Remove barrier timeout - if (this._removeBarrierTimeoutId > 0) - GLib.source_remove(this._removeBarrierTimeoutId); - - // Remove existing barrier - this._removeBarrier(); - - // Remove pointer watcher - if (this._dockWatch) { - PointerWatcher.getPointerWatcher()._removeWatch(this._dockWatch); - this._dockWatch = null; - } - } - - _bindSettingsChanges() { - let settings = DockManager.settings; - this._signalsHandler.add([ - settings, - 'changed::scroll-action', - () => { this._optionalScrollWorkspaceSwitch(); } - ], [ - settings, - 'changed::dash-max-icon-size', - () => { this.dash.setIconSize(settings.get_int('dash-max-icon-size')); } - ], [ - settings, - 'changed::icon-size-fixed', - () => { this.dash.setIconSize(settings.get_int('dash-max-icon-size')); } - ], [ - settings, - 'changed::show-favorites', - () => { this.dash.resetAppIcons(); } - ], [ - settings, - 'changed::show-trash', - () => { this.dash.resetAppIcons(); }, - Utils.SignalsHandlerFlags.CONNECT_AFTER, - ], [ - settings, - 'changed::show-mounts', - () => { this.dash.resetAppIcons(); }, - Utils.SignalsHandlerFlags.CONNECT_AFTER - ], [ - settings, - 'changed::show-running', - () => { this.dash.resetAppIcons(); } - ], [ - settings, - 'changed::show-apps-at-top', - () => { this.dash.updateShowAppsButton(); } - ], [ - settings, - 'changed::show-show-apps-button', - () => { - if (!Main.overview.isDummy && - settings.get_boolean('show-show-apps-button')) - this.dash.showShowAppsButton(); - else - this.dash.hideShowAppsButton(); - } - ], [ - settings, - 'changed::dock-fixed', - () => { - this._untrackDock(); - this._trackDock(); - - this._resetPosition(); - - // Add or remove barrier depending on if dock-fixed - this._updateBarrier(); - - this._updateVisibilityMode(); - } - ], [ - settings, - 'changed::intellihide', - this._updateVisibilityMode.bind(this) - ], [ - settings, - 'changed::intellihide-mode', - () => { this._intellihide.forceUpdate(); } - ], [ - settings, - 'changed::autohide', - () => { - this._updateVisibilityMode(); - this._updateBarrier(); - } - ], [ - settings, - 'changed::autohide-in-fullscreen', - this._updateBarrier.bind(this) - ], - [ - settings, - 'changed::extend-height', - this._resetPosition.bind(this) - ], [ - settings, - 'changed::height-fraction', - this._resetPosition.bind(this) - ], [ - settings, - 'changed::require-pressure-to-show', - () => { - // Remove pointer watcher - if (this._dockWatch) { - PointerWatcher.getPointerWatcher()._removeWatch(this._dockWatch); - this._dockWatch = null; - } - this._setupDockDwellIfNeeded(); - this._updateBarrier(); - } - ], [ - settings, - 'changed::pressure-threshold', - () => { - this._updatePressureBarrier(); - this._updateBarrier(); - } - ]); - - } - - /** - * This is call when visibility settings change - */ - _updateVisibilityMode() { - let settings = DockManager.settings; - if (settings.get_boolean('dock-fixed')) { - this._fixedIsEnabled = true; - this._autohideIsEnabled = false; - this._intellihideIsEnabled = false; - } - else { - this._fixedIsEnabled = false; - this._autohideIsEnabled = settings.get_boolean('autohide') - this._intellihideIsEnabled = settings.get_boolean('intellihide') - } - - if (this._autohideIsEnabled) - this.add_style_class_name('autohide'); - else - this.remove_style_class_name('autohide'); - - if (this._intellihideIsEnabled) - this._intellihide.enable(); - else - this._intellihide.disable(); - - this._updateDashVisibility(); - } - - /** - * Show/hide dash based on, in order of priority: - * overview visibility - * fixed mode - * intellihide - * autohide - * overview visibility - */ - _updateDashVisibility() { - if (Main.overview.visibleTarget) - return; - - let settings = DockManager.settings; - - if (this._fixedIsEnabled) { - this._removeAnimations(); - this._animateIn(settings.get_double('animation-time'), 0); - } - else if (this._intellihideIsEnabled) { - if (this._intellihide.getOverlapStatus()) { - this._ignoreHover = false; - // Do not hide if autohide is enabled and mouse is hover - if (!this._box.hover || !this._autohideIsEnabled) - this._animateOut(settings.get_double('animation-time'), 0); - } - else { - this._ignoreHover = true; - this._removeAnimations(); - this._animateIn(settings.get_double('animation-time'), 0); - } - } - else { - if (this._autohideIsEnabled) { - this._ignoreHover = false; - - if (this._box.hover) - this._animateIn(settings.get_double('animation-time'), 0); - else - this._animateOut(settings.get_double('animation-time'), 0); - } - else - this._animateOut(settings.get_double('animation-time'), 0); - } - } - - _onOverviewShowing() { - this.add_style_class_name('overview'); - - this._ignoreHover = true; - this._intellihide.disable(); - this._removeAnimations(); - // The overview uses the monitor's work area to calculate background size. - // If our dock is fixed, it will shrink the monitor's work area unexpectedly. - this._untrackDock(); - this._animateIn(DockManager.settings.get_double('animation-time'), 0); - } - - _onOverviewHiding() { - this._ignoreHover = false; - this._intellihide.enable(); - this._trackDock(); - this._updateDashVisibility(); - } - - _onOverviewHidden() { - this.remove_style_class_name('overview'); - } - - _hoverChanged() { - if (!this._ignoreHover) { - // Skip if dock is not in autohide mode for instance because it is shown - // by intellihide. - if (this._autohideIsEnabled) { - if (this._box.hover) - this._show(); - else - this._hide(); - } - } - } - - getDockState() { - return this._dockState; - } - - _show() { - this._delayedHide = false; - if ((this._dockState == State.HIDDEN) || (this._dockState == State.HIDING)) { - if (this._dockState == State.HIDING) - // suppress all potential queued transitions - i.e. added but not started, - // always give priority to show - this._removeAnimations(); - - this.emit('showing'); - this._animateIn(DockManager.settings.get_double('animation-time'), 0); - } - } - - _hide() { - // If no hiding animation is running or queued - if ((this._dockState == State.SHOWN) || (this._dockState == State.SHOWING)) { - let settings = DockManager.settings; - let delay = settings.get_double('hide-delay'); - - if (this._dockState == State.SHOWING) { - // if a show already started, let it finish; queue hide without removing the show. - // to obtain this, we wait for the animateIn animation to be completed - this._delayedHide = true; - return; - } - - this.emit('hiding'); - this._animateOut(settings.get_double('animation-time'), delay); - } - } - - _animateIn(time, delay) { - this._dockState = State.SHOWING; - this.dash.iconAnimator.start(); - this._delayedHide = false; - - this._slider.ease_property('slidex', 1, { - duration: time * 1000, - delay: delay * 1000, - mode: Clutter.AnimationMode.EASE_OUT_QUAD, - onComplete: () => { - this._dockState = State.SHOWN; - // Remove barrier so that mouse pointer is released and can access monitors on other side of dock - // NOTE: Delay needed to keep mouse from moving past dock and re-hiding dock immediately. This - // gives users an opportunity to hover over the dock - if (this._removeBarrierTimeoutId > 0) - GLib.source_remove(this._removeBarrierTimeoutId); - - if (!this._delayedHide) { - this._removeBarrierTimeoutId = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, 100, this._removeBarrier.bind(this)); - } else { - this._hide(); - } - } - }); - } - - _animateOut(time, delay) { - this._dockState = State.HIDING; - - this._slider.ease_property('slidex', 0, { - duration: time * 1000, - delay: delay * 1000, - mode: Clutter.AnimationMode.EASE_OUT_QUAD, - onComplete: () => { - this._dockState = State.HIDDEN; - // Remove queued barried removal if any - if (this._removeBarrierTimeoutId > 0) - GLib.source_remove(this._removeBarrierTimeoutId); - this._updateBarrier(); - this.dash.iconAnimator.pause(); - } - }); - } - - /** - * Dwelling system based on the GNOME Shell 3.14 messageTray code. - */ - _setupDockDwellIfNeeded() { - // If we don't have extended barrier features, then we need - // to support the old tray dwelling mechanism. - if (!global.display.supports_extended_barriers() || - !DockManager.settings.get_boolean('require-pressure-to-show')) { - let pointerWatcher = PointerWatcher.getPointerWatcher(); - this._dockWatch = pointerWatcher.addWatch(DOCK_DWELL_CHECK_INTERVAL, this._checkDockDwell.bind(this)); - this._dockDwelling = false; - this._dockDwellUserTime = 0; - } - } - - _checkDockDwell(x, y) { - - let workArea = Main.layoutManager.getWorkAreaForMonitor(this._monitor.index) - let shouldDwell; - // Check for the correct screen edge, extending the sensitive area to the whole workarea, - // minus 1 px to avoid conflicting with other active corners. - if (this._position == St.Side.LEFT) - shouldDwell = (x == this._monitor.x) && (y > workArea.y) && (y < workArea.y + workArea.height); - else if (this._position == St.Side.RIGHT) - shouldDwell = (x == this._monitor.x + this._monitor.width - 1) && (y > workArea.y) && (y < workArea.y + workArea.height); - else if (this._position == St.Side.TOP) - shouldDwell = (y == this._monitor.y) && (x > workArea.x) && (x < workArea.x + workArea.width); - else if (this._position == St.Side.BOTTOM) - shouldDwell = (y == this._monitor.y + this._monitor.height - 1) && (x > workArea.x) && (x < workArea.x + workArea.width); - - if (shouldDwell) { - // We only set up dwell timeout when the user is not hovering over the dock - // already (!this._box.hover). - // The _dockDwelling variable is used so that we only try to - // fire off one dock dwell - if it fails (because, say, the user has the mouse down), - // we don't try again until the user moves the mouse up and down again. - if (!this._dockDwelling && !this._box.hover && (this._dockDwellTimeoutId == 0)) { - // Save the interaction timestamp so we can detect user input - let focusWindow = global.display.focus_window; - this._dockDwellUserTime = focusWindow ? focusWindow.user_time : 0; - - this._dockDwellTimeoutId = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, - DockManager.settings.get_double('show-delay') * 1000, - this._dockDwellTimeout.bind(this)); - GLib.Source.set_name_by_id(this._dockDwellTimeoutId, '[dash-to-dock] this._dockDwellTimeout'); - } - this._dockDwelling = true; - } - else { - this._cancelDockDwell(); - this._dockDwelling = false; - } - } - - _cancelDockDwell() { - if (this._dockDwellTimeoutId != 0) { - GLib.source_remove(this._dockDwellTimeoutId); - this._dockDwellTimeoutId = 0; - } - } - - _dockDwellTimeout() { - this._dockDwellTimeoutId = 0; - - if (!DockManager.settings.get_boolean('autohide-in-fullscreen') && - this._monitor.inFullscreen) - return GLib.SOURCE_REMOVE; - - // We don't want to open the tray when a modal dialog - // is up, so we check the modal count for that. When we are in the - // overview we have to take the overview's modal push into account - if (Main.modalCount > (Main.overview.visible ? 1 : 0)) - return GLib.SOURCE_REMOVE; - - // If the user interacted with the focus window since we started the tray - // dwell (by clicking or typing), don't activate the message tray - let focusWindow = global.display.focus_window; - let currentUserTime = focusWindow ? focusWindow.user_time : 0; - if (currentUserTime != this._dockDwellUserTime) - return GLib.SOURCE_REMOVE; - - // Reuse the pressure version function, the logic is the same - this._onPressureSensed(); - return GLib.SOURCE_REMOVE; - } - - _updatePressureBarrier() { - let settings = DockManager.settings; - this._canUsePressure = global.display.supports_extended_barriers(); - let pressureThreshold = settings.get_double('pressure-threshold'); - - // Remove existing pressure barrier - if (this._pressureBarrier) { - this._pressureBarrier.destroy(); - this._pressureBarrier = null; - } - - if (this._barrier) { - this._barrier.destroy(); - this._barrier = null; - } - - // Create new pressure barrier based on pressure threshold setting - if (this._canUsePressure) { - this._pressureBarrier = new Layout.PressureBarrier(pressureThreshold, settings.get_double('show-delay')*1000, - Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW); - this._pressureBarrier.connect('trigger', (barrier) => { - if (!settings.get_boolean('autohide-in-fullscreen') && this._monitor.inFullscreen) - return; - this._onPressureSensed(); - }); - } - } - - /** - * handler for mouse pressure sensed - */ - _onPressureSensed() { - if (Main.overview.visibleTarget) - return; - - // In case the mouse move away from the dock area before hovering it, in such case the leave event - // would never be triggered and the dock would stay visible forever. - let triggerTimeoutId = GLib.timeout_add(GLib.PRIORITY_DEFAULT, 250, () => { - triggerTimeoutId = 0; - - let [x, y, mods] = global.get_pointer(); - let shouldHide = true; - switch (this._position) { - case St.Side.LEFT: - if (x <= this.staticBox.x2 && - x >= this._monitor.x && - y >= this._monitor.y && - y <= this._monitor.y + this._monitor.height) { - shouldHide = false; - } - break; - case St.Side.RIGHT: - if (x >= this.staticBox.x1 && - x <= this._monitor.x + this._monitor.width && - y >= this._monitor.y && - y <= this._monitor.y + this._monitor.height) { - shouldHide = false; - } - break; - case St.Side.TOP: - if (x >= this._monitor.x && - x <= this._monitor.x + this._monitor.width && - y <= this.staticBox.y2 && - y >= this._monitor.y) { - shouldHide = false; - } - break; - case St.Side.BOTTOM: - if (x >= this._monitor.x && - x <= this._monitor.x + this._monitor.width && - y >= this.staticBox.y1 && - y <= this._monitor.y + this._monitor.height) { - shouldHide = false; - } - } - if (shouldHide) { - this._hoverChanged(); - return GLib.SOURCE_REMOVE; - } - else { - return GLib.SOURCE_CONTINUE; - } - - }); - - this._show(); - } - - /** - * Remove pressure barrier - */ - _removeBarrier() { - if (this._barrier) { - if (this._pressureBarrier) - this._pressureBarrier.removeBarrier(this._barrier); - this._barrier.destroy(); - this._barrier = null; - } - this._removeBarrierTimeoutId = 0; - return false; - } - - /** - * Update pressure barrier size - */ - _updateBarrier() { - // Remove existing barrier - this._removeBarrier(); - - // The barrier needs to be removed in fullscreen with autohide disabled, otherwise the mouse can - // get trapped on monitor. - if (this._monitor.inFullscreen && - !DockManager.settings.get_boolean('autohide-in-fullscreen')) - return - - // Manually reset pressure barrier - // This is necessary because we remove the pressure barrier when it is triggered to show the dock - if (this._pressureBarrier) { - this._pressureBarrier._reset(); - this._pressureBarrier._isTriggered = false; - } - - // Create new barrier - // The barrier extends to the whole workarea, minus 1 px to avoid conflicting with other active corners - // Note: dash in fixed position doesn't use pressure barrier. - if (this._canUsePressure && this._autohideIsEnabled && - DockManager.settings.get_boolean('require-pressure-to-show')) { - let x1, x2, y1, y2, direction; - let workArea = Main.layoutManager.getWorkAreaForMonitor(this._monitor.index) - - if (this._position == St.Side.LEFT) { - x1 = this._monitor.x + 1; - x2 = x1; - y1 = workArea.y + 1; - y2 = workArea.y + workArea.height - 1; - direction = Meta.BarrierDirection.POSITIVE_X; - } - else if (this._position == St.Side.RIGHT) { - x1 = this._monitor.x + this._monitor.width - 1; - x2 = x1; - y1 = workArea.y + 1; - y2 = workArea.y + workArea.height - 1; - direction = Meta.BarrierDirection.NEGATIVE_X; - } - else if (this._position == St.Side.TOP) { - x1 = workArea.x + 1; - x2 = workArea.x + workArea.width - 1; - y1 = this._monitor.y; - y2 = y1; - direction = Meta.BarrierDirection.POSITIVE_Y; - } - else if (this._position == St.Side.BOTTOM) { - x1 = workArea.x + 1; - x2 = workArea.x + workArea.width - 1; - y1 = this._monitor.y + this._monitor.height; - y2 = y1; - direction = Meta.BarrierDirection.NEGATIVE_Y; - } - - if (this._pressureBarrier && this._dockState == State.HIDDEN) { - this._barrier = new Meta.Barrier({ - display: global.display, - x1: x1, - x2: x2, - y1: y1, - y2: y2, - directions: direction - }); - this._pressureBarrier.addBarrier(this._barrier); - } - } - } - - _isPrimaryMonitor() { - return (this._monitorIndex == Main.layoutManager.primaryIndex); - } - - _resetPosition() { - // Ensure variables linked to settings are updated. - this._updateVisibilityMode(); - - let extendHeight = DockManager.settings.get_boolean('extend-height'); - - // Note: do not use the workarea coordinates in the direction on which the dock is placed, - // to avoid a loop [position change -> workArea change -> position change] with - // fixed dock. - let workArea = Main.layoutManager.getWorkAreaForMonitor(this._monitorIndex); - - - let fraction = DockManager.settings.get_double('height-fraction'); - - if (extendHeight) - fraction = 1; - else if ((fraction < 0) || (fraction > 1)) - fraction = 0.95; - - if (this._isHorizontal) { - this.width = Math.round(fraction * workArea.width); - - let pos_y = this._monitor.y; - if (this._position == St.Side.BOTTOM) - pos_y += this._monitor.height; - - this.x = workArea.x + Math.round((1 - fraction) / 2 * workArea.width); - this.y = pos_y; - - if (extendHeight) { - this.dash._container.set_width(this.width); - this.add_style_class_name('extended'); - } else { - this.dash._container.set_width(-1); - this.remove_style_class_name('extended'); - } - } else { - this.height = Math.round(fraction * workArea.height); - - let pos_x = this._monitor.x; - if (this._position == St.Side.RIGHT) - pos_x += this._monitor.width; - - this.x = pos_x; - this.y = workArea.y + Math.round((1 - fraction) / 2 * workArea.height); - - this._signalsHandler.removeWithLabel('verticalOffsetChecker'); - - if (extendHeight) { - this.dash._container.set_height(this.height); - this.add_style_class_name('extended'); - } else { - this.dash._container.set_height(-1); - this.remove_style_class_name('extended'); - } - } - } - - _updateStaticBox() { - this.staticBox.init_rect( - this.x + this._slider.x - (this._position == St.Side.RIGHT ? this._box.width : 0), - this.y + this._slider.y - (this._position == St.Side.BOTTOM ? this._box.height : 0), - this._box.width, - this._box.height - ); - - this._intellihide.updateTargetBox(this.staticBox); - } - - _removeAnimations() { - this._slider.remove_all_transitions(); - } - - _onDragStart() { - this._oldignoreHover = this._ignoreHover; - this._ignoreHover = true; - this._animateIn(DockManager.settings.get_double('animation-time'), 0); - } - - _onDragEnd() { - if (this._oldignoreHover !== null) - this._ignoreHover = this._oldignoreHover; - this._oldignoreHover = null; - this._box.sync_hover(); - } - - /** - * Show dock and give key focus to it - */ - _onAccessibilityFocus() { - this._box.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); - this._animateIn(DockManager.settings.get_double('animation-time'), 0); - } - - // Optional features to be enabled only for the main Dock - _enableExtraFeatures() { - // Restore dash accessibility - Main.ctrlAltTabManager.addGroup( - this.dash, _('Dash'), 'user-bookmarks-symbolic', - {focusCallback: this._onAccessibilityFocus.bind(this)}); - } - - /** - * Switch workspace by scrolling over the dock - */ - _optionalScrollWorkspaceSwitch() { - let label = 'optionalScrollWorkspaceSwitch'; - - function isEnabled() { - return DockManager.settings.get_enum('scroll-action') === scrollAction.SWITCH_WORKSPACE; - } - - DockManager.settings.connect('changed::scroll-action', () => { - if (isEnabled.bind(this)()) - enable.bind(this)(); - else - disable.bind(this)(); - }); - - if (isEnabled.bind(this)()) - enable.bind(this)(); - - function enable() { - this._signalsHandler.removeWithLabel(label); - - this._signalsHandler.addWithLabel(label, [ - this._box, - 'scroll-event', - onScrollEvent.bind(this) - ]); - } - - function disable() { - this._signalsHandler.removeWithLabel(label); - - if (this._optionalScrollWorkspaceSwitchDeadTimeId) { - GLib.source_remove(this._optionalScrollWorkspaceSwitchDeadTimeId); - this._optionalScrollWorkspaceSwitchDeadTimeId = 0; - } - } - - // This was inspired to desktop-scroller@obsidien.github.com - function onScrollEvent(actor, event) { - // When in overview change workspace only in windows view - if (Main.overview.visible) - return false; - - let activeWs = global.workspace_manager.get_active_workspace(); - let direction = null; - - switch (event.get_scroll_direction()) { - case Clutter.ScrollDirection.UP: - direction = Meta.MotionDirection.LEFT; - break; - case Clutter.ScrollDirection.DOWN: - direction = Meta.MotionDirection.RIGHT; - break; - case Clutter.ScrollDirection.SMOOTH: - let [dx, dy] = event.get_scroll_delta(); - if (dy < 0) - direction = Meta.MotionDirection.LEFT; - else if (dy > 0) - direction = Meta.MotionDirection.RIGHT; - break; - } - - if (direction !== null) { - // Prevent scroll events from triggering too many workspace switches - // by adding a 250ms deadtime between each scroll event. - // Usefull on laptops when using a touchpad. - - // During the deadtime do nothing - if (this._optionalScrollWorkspaceSwitchDeadTimeId) - return false; - else - this._optionalScrollWorkspaceSwitchDeadTimeId = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, 250, () => { - this._optionalScrollWorkspaceSwitchDeadTimeId = 0; - }); - - let ws; - - ws = activeWs.get_neighbor(direction) - - if (Main.wm._workspaceSwitcherPopup == null) - // Support Workspace Grid extension showing their custom Grid Workspace Switcher - if (global.workspace_manager.workspace_grid !== undefined) { - Main.wm._workspaceSwitcherPopup = - global.workspace_manager.workspace_grid.getWorkspaceSwitcherPopup(); - } else { - Main.wm._workspaceSwitcherPopup = new WorkspaceSwitcherPopup.WorkspaceSwitcherPopup(); - } - // Set the actor non reactive, so that it doesn't prevent the - // clicks events from reaching the dash actor. I can't see a reason - // why it should be reactive. - Main.wm._workspaceSwitcherPopup.reactive = false; - Main.wm._workspaceSwitcherPopup.connect('destroy', function() { - Main.wm._workspaceSwitcherPopup = null; - }); - - // If Workspace Grid is installed, let them handle the scroll behaviour. - if (global.workspace_manager.workspace_grid !== undefined) - ws = global.workspace_manager.workspace_grid.actionMoveWorkspace(direction); - else - Main.wm.actionMoveWorkspace(ws); - - // Do not show workspaceSwitcher in overview - if (!Main.overview.visible) - Main.wm._workspaceSwitcherPopup.display(direction, ws.index()); - - return true; - } - else - return false; - } - } - - _activateApp(appIndex) { - let children = this.dash._box.get_children().filter(function(actor) { - return actor.child && - actor.child.app; - }); - - // Apps currently in the dash - let apps = children.map(function(actor) { - return actor.child; - }); - - // Activate with button = 1, i.e. same as left click - let button = 1; - if (appIndex < apps.length) - apps[appIndex].activate(button); - } -}); - -/* - * Handle keybaord shortcuts - */ -const DashToDock_KeyboardShortcuts_NUM_HOTKEYS = 10; - -var KeyboardShortcuts = class DashToDock_KeyboardShortcuts { - - constructor() { - this._signalsHandler = new Utils.GlobalSignalsHandler(); - - this._hotKeysEnabled = false; - if (DockManager.settings.get_boolean('hot-keys')) - this._enableHotKeys(); - - this._signalsHandler.add([ - DockManager.settings, - 'changed::hot-keys', - () => { - if (DockManager.settings.get_boolean('hot-keys')) - this._enableHotKeys.bind(this)(); - else - this._disableHotKeys.bind(this)(); - } - ]); - - this._optionalNumberOverlay(); - } - - destroy() { - // Remove keybindings - this._disableHotKeys(); - this._disableExtraShortcut(); - this._signalsHandler.destroy(); - } - - _enableHotKeys() { - if (this._hotKeysEnabled) - return; - - // Setup keyboard bindings for dash elements - let keys = ['app-hotkey-', 'app-shift-hotkey-', 'app-ctrl-hotkey-']; - keys.forEach( function(key) { - for (let i = 0; i < DashToDock_KeyboardShortcuts_NUM_HOTKEYS; i++) { - let appNum = i; - Main.wm.addKeybinding(key + (i + 1), DockManager.settings, - Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, - Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, - () => { - DockManager.getDefault().mainDock._activateApp(appNum); - this._showOverlay(); - }); - } - }, this); - - this._hotKeysEnabled = true; - } - - _disableHotKeys() { - if (!this._hotKeysEnabled) - return; - - let keys = ['app-hotkey-', 'app-shift-hotkey-', 'app-ctrl-hotkey-']; - keys.forEach( function(key) { - for (let i = 0; i < DashToDock_KeyboardShortcuts_NUM_HOTKEYS; i++) - Main.wm.removeKeybinding(key + (i + 1)); - }, this); - - this._hotKeysEnabled = false; - } - - _optionalNumberOverlay() { - let settings = DockManager.settings; - this._shortcutIsSet = false; - // Enable extra shortcut if either 'overlay' or 'show-dock' are true - if (settings.get_boolean('hot-keys') && - (settings.get_boolean('hotkeys-overlay') || settings.get_boolean('hotkeys-show-dock'))) - this._enableExtraShortcut(); - - this._signalsHandler.add([ - settings, - 'changed::hot-keys', - this._checkHotkeysOptions.bind(this) - ], [ - settings, - 'changed::hotkeys-overlay', - this._checkHotkeysOptions.bind(this) - ], [ - settings, - 'changed::hotkeys-show-dock', - this._checkHotkeysOptions.bind(this) - ]); - } - - _checkHotkeysOptions() { - let settings = DockManager.settings; - - if (settings.get_boolean('hot-keys') && - (settings.get_boolean('hotkeys-overlay') || settings.get_boolean('hotkeys-show-dock'))) - this._enableExtraShortcut(); - else - this._disableExtraShortcut(); - } - - _enableExtraShortcut() { - if (!this._shortcutIsSet) { - Main.wm.addKeybinding('shortcut', DockManager.settings, - Meta.KeyBindingFlags.IGNORE_AUTOREPEAT, - Shell.ActionMode.NORMAL | Shell.ActionMode.OVERVIEW, - this._showOverlay.bind(this)); - this._shortcutIsSet = true; - } - } - - _disableExtraShortcut() { - if (this._shortcutIsSet) { - Main.wm.removeKeybinding('shortcut'); - this._shortcutIsSet = false; - } - } - - _showOverlay() { - for (let dock of DockManager.allDocks) { - if (DockManager.settings.get_boolean('hotkeys-overlay')) - dock.dash.toggleNumberOverlay(true); - - // Restart the counting if the shortcut is pressed again - if (dock._numberOverlayTimeoutId) { - GLib.source_remove(dock._numberOverlayTimeoutId); - dock._numberOverlayTimeoutId = 0; - } - - // Hide the overlay/dock after the timeout - let timeout = DockManager.settings.get_double('shortcut-timeout') * 1000; - dock._numberOverlayTimeoutId = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, timeout, () => { - dock._numberOverlayTimeoutId = 0; - dock.dash.toggleNumberOverlay(false); - // Hide the dock again if necessary - dock._updateDashVisibility(); - }); - - // Show the dock if it is hidden - if (DockManager.settings.get_boolean('hotkeys-show-dock')) { - let showDock = (dock._intellihideIsEnabled || dock._autohideIsEnabled); - if (showDock) - dock._show(); - } - } - } -}; - -/** - * Isolate overview to open new windows for inactive apps - * Note: the future implementaion is not fully contained here. Some bits are around in other methods of other classes. - * This class just take care of enabling/disabling the option. - */ -var WorkspaceIsolation = class DashToDock_WorkspaceIsolation { - - constructor() { - - let settings = DockManager.settings; - - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this._injectionsHandler = new Utils.InjectionsHandler(); - - this._signalsHandler.add([ - settings, - 'changed::isolate-workspaces', - () => { - DockManager.allDocks.forEach((dock) => - dock.dash.resetAppIcons()); - if (settings.get_boolean('isolate-workspaces') || - settings.get_boolean('isolate-monitors')) - this._enable.bind(this)(); - else - this._disable.bind(this)(); - } - ],[ - settings, - 'changed::isolate-monitors', - () => { - DockManager.allDocks.forEach((dock) => - dock.dash.resetAppIcons()); - if (settings.get_boolean('isolate-workspaces') || - settings.get_boolean('isolate-monitors')) - this._enable.bind(this)(); - else - this._disable.bind(this)(); - } - ]); - - if (settings.get_boolean('isolate-workspaces') || - settings.get_boolean('isolate-monitors')) - this._enable(); - - } - - _enable() { - - // ensure I never double-register/inject - // although it should never happen - this._disable(); - - DockManager.allDocks.forEach((dock) => { - this._signalsHandler.addWithLabel('isolation', [ - global.display, - 'restacked', - dock.dash._queueRedisplay.bind(dock.dash) - ], [ - global.window_manager, - 'switch-workspace', - dock.dash._queueRedisplay.bind(dock.dash) - ]); - - // This last signal is only needed for monitor isolation, as windows - // might migrate from one monitor to another without triggering 'restacked' - if (DockManager.settings.get_boolean('isolate-monitors')) - this._signalsHandler.addWithLabel('isolation', [ - global.display, - 'window-entered-monitor', - dock.dash._queueRedisplay.bind(dock.dash) - ]); - - }, this); - - // here this is the Shell.App - function IsolatedOverview() { - // These lines take care of Nautilus for icons on Desktop - let windows = this.get_windows().filter(function(w) { - return w.get_workspace().index() == global.workspace_manager.get_active_workspace_index(); - }); - if (windows.length == 1) - if (windows[0].skip_taskbar) - return this.open_new_window(-1); - - if (this.is_on_workspace(global.workspace_manager.get_active_workspace())) - return Main.activateWindow(windows[0]); - return this.open_new_window(-1); - } - - this._injectionsHandler.addWithLabel('isolation', [ - Shell.App.prototype, - 'activate', - IsolatedOverview - ]); - } - - _disable () { - this._signalsHandler.removeWithLabel('isolation'); - this._injectionsHandler.removeWithLabel('isolation'); - } - - destroy() { - this._signalsHandler.destroy(); - this._injectionsHandler.destroy(); - } -}; - - -var DockManager = class DashToDock_DockManager { - - constructor() { - if (Me.imports.extension.dockManager) - throw new Error('DashToDock has been already initialized'); - - Me.imports.extension.dockManager = this; - - this._remoteModel = new LauncherAPI.LauncherEntryRemoteModel(); - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this._settings = ExtensionUtils.getSettings('org.gnome.shell.extensions.dash-to-dock'); - this._oldDash = Main.overview.isDummy ? null : Main.overview.dash; - - this._ensureFileManagerClient(); - - /* Array of all the docks created */ - this._allDocks = []; - this._createDocks(); - - // status variable: true when the overview is shown through the dash - // applications button. - this._forcedOverview = false; - - // Connect relevant signals to the toggling function - this._bindSettingsChanges(); - } - - static getDefault() { - return Me.imports.extension.dockManager - } - - static get allDocks() { - return DockManager.getDefault()._allDocks; - } - - static get settings() { - return DockManager.getDefault()._settings; - } - - get fm1Client() { - return this._fm1Client; - } - - get mainDock() { - return this._allDocks.length ? this._allDocks[0] : null; - } - - _ensureFileManagerClient() { - let supportsLocations = ['show-trash', 'show-mounts'].some((s) => { - return this._settings.get_boolean(s); - }); - - if (supportsLocations) { - if (!this._fm1Client) - this._fm1Client = new FileManager1API.FileManager1Client(); - } else if (this._fm1Client) { - this._fm1Client.destroy(); - this._fm1Client = null; - } - } - - _toggle() { - if (this._toggleLater) - Meta.later_remove(this._toggleLater); - - this._toggleLater = Meta.later_add(Meta.LaterType.BEFORE_REDRAW, () => { - delete this._toggleLater; - this._restoreDash(); - this._deleteDocks(); - this._createDocks(); - this.emit('toggled'); - }); - } - - _bindSettingsChanges() { - // Connect relevant signals to the toggling function - this._signalsHandler.add([ - Meta.MonitorManager.get(), - 'monitors-changed', - this._toggle.bind(this) - ], [ - Main.sessionMode, - 'updated', - this._toggle.bind(this) - ], [ - this._settings, - 'changed::multi-monitor', - this._toggle.bind(this) - ], [ - this._settings, - 'changed::preferred-monitor', - this._toggle.bind(this) - ], [ - this._settings, - 'changed::dock-position', - this._toggle.bind(this) - ], [ - this._settings, - 'changed::extend-height', - this._adjustPanelCorners.bind(this) - ], [ - this._settings, - 'changed::dock-fixed', - this._adjustPanelCorners.bind(this) - ], [ - this._settings, - 'changed::show-trash', - () => this._ensureFileManagerClient() - ], [ - this._settings, - 'changed::show-mounts', - () => this._ensureFileManagerClient() - ]); - } - - _createDocks() { - - // If there are no monitors (headless configurations, but it can also happen temporary while disconnecting - // and reconnecting monitors), just do nothing. When a monitor will be connected we we'll be notified and - // and thus create the docks. This prevents pointing trying to access monitors throughout the code, were we - // are assuming that at least the primary monitor is present. - if (Main.layoutManager.monitors.length <= 0) { - return; - } - - this._preferredMonitorIndex = this._settings.get_int('preferred-monitor'); - // In case of multi-monitor, we consider the dock on the primary monitor to be the preferred (main) one - // regardless of the settings - // The dock goes on the primary monitor also if the settings are incosistent (e.g. desired monitor not connected). - if (this._settings.get_boolean('multi-monitor') || - this._preferredMonitorIndex < 0 || this._preferredMonitorIndex > Main.layoutManager.monitors.length - 1 - ) { - this._preferredMonitorIndex = Main.layoutManager.primaryIndex; - } else { - // Gdk and shell monitors numbering differ at least under wayland: - // While the primary monitor appears to be always index 0 in Gdk, - // the shell can assign a different number (Main.layoutManager.primaryMonitor) - // This ensure the indexing in the settings (Gdk) and in the shell are matched, - // i.e. that we start counting from the primaryMonitorIndex - this._preferredMonitorIndex = (Main.layoutManager.primaryIndex + this._preferredMonitorIndex) % Main.layoutManager.monitors.length ; - } - - // First we create the main Dock, to get the extra features to bind to this one - let dock = new DockedDash(this._remoteModel, this._preferredMonitorIndex); - this._allDocks.push(dock); - - // connect app icon into the view selector - dock.dash.showAppsButton.connect('notify::checked', this._onShowAppsButtonToggled.bind(this)); - - // Make the necessary changes to Main.overview.dash - this._prepareMainDash(); - - // Adjust corners if necessary - this._adjustPanelCorners(); - - if (this._settings.get_boolean('multi-monitor')) { - let nMon = Main.layoutManager.monitors.length; - for (let iMon = 0; iMon < nMon; iMon++) { - if (iMon == this._preferredMonitorIndex) - continue; - let dock = new DockedDash(this._remoteModel, iMon); - this._allDocks.push(dock); - // connect app icon into the view selector - dock.dash.showAppsButton.connect('notify::checked', this._onShowAppsButtonToggled.bind(this)); - } - } - - // Load optional features. We load *after* the docks are created, since - // we need to connect the signals to all dock instances. - this._workspaceIsolation = new WorkspaceIsolation(); - this._keyboardShortcuts = new KeyboardShortcuts(); - } - - _prepareMainDash() { - // Ensure Main.overview.dash is set to our dash in dummy mode - // while just use the default getter otherwise. - // The getter must be dynamic and not set only when we've a dummy - // overview because the mode can change dynamically. - let defaultDashGetter = Object.getOwnPropertyDescriptor( - Main.overview.constructor.prototype, 'dash').get; - Object.defineProperty(Main.overview, 'dash', { - configurable: true, - get: () => Main.overview.isDummy ? - this.mainDock.dash : defaultDashGetter.call(Main.overview), - }); - - if (Main.overview.isDummy) - return; - - this._signalsHandler.removeWithLabel('old-dash-changes'); - - // Hide usual Dash - this._oldDash.hide(); - - // Also set dash width to 1, so it's almost not taken into account by code - // calculaing the reserved space in the overview. The reason to keep it at 1 is - // to allow its visibility change to trigger an allocaion of the appGrid which - // in turn is triggergin the appsIcon spring animation, required when no other - // actors has this effect, i.e in horizontal mode and without the workspaceThumnails - // 1 static workspace only) - this._oldDash.set_height(1); - - this._signalsHandler.addWithLabel('old-dash-changes', [ - this._oldDash, - 'notify::visible', - () => this._prepareMainDash() - ], [ - this._oldDash, - 'notify::width', - () => this._prepareMainDash() - ]); - - // Pretend I'm the dash: meant to make appgrid swarm animation come from - // the right position of the appShowButton. - let overviewControls = Main.overview._overview._controls; - overviewControls.dash = this.mainDock.dash; - overviewControls._searchController._showAppsButton = this.mainDock.dash.showAppsButton; - - if (this.mainDock.dash._isHorizontal) { - overviewControls._dashSpacer = this.mainDock._dashSpacer; - Main.overview._overview._controls.add_child(this.mainDock._dashSpacer); - Main.overview._overview._controls.layout_manager._dash = this.mainDock._dashSpacer; - } - } - - _deleteDocks() { - if (!this._allDocks.length) - return; - - // Remove extra features - this._workspaceIsolation.destroy(); - this._keyboardShortcuts.destroy(); - - // Delete all docks - this._allDocks.forEach(d => d.destroy()); - this._allDocks = []; - } - - _restoreDash() { - Object.defineProperty(Main.overview, 'dash', - Object.getOwnPropertyDescriptor( - Main.overview.constructor.prototype, 'dash')); - - if (!this._oldDash) - return; - - this._signalsHandler.removeWithLabel('old-dash-changes'); - - let overviewControls = Main.overview._overview._controls; - Main.overview._overview._controls.layout_manager._dash = this._oldDash; - if (this.mainDock._dashSpacer) { - Main.overview._overview._controls.remove_child(this.mainDock._dashSpacer); - } - - overviewControls.dash = this._oldDash; - overviewControls._searchController._showAppsButton = this._oldDash.showAppsButton; - Main.overview.dash.show(); - Main.overview.dash.set_height(-1); // reset default dash size - // This force the recalculation of the icon size - Main.overview.dash._maxHeight = -1; - } - - get searchController() { - return Main.overview._overview.controls._searchController; - } - - _onShowAppsButtonToggled(button) { - const checked = button.checked; - const overviewControls = Main.overview._overview.controls; - - if (!Main.overview.visible) { - this.mainDock.dash.showAppsButton._fromDesktop = true; - Main.overview.show(OverviewControls.ControlsState.APP_GRID); - } else { - if (!checked && this.mainDock.dash.showAppsButton._fromDesktop) { - Main.overview.hide(); - this.mainDock.dash.showAppsButton._fromDesktop = false; - } else { - // TODO: I'm not sure how reliable this is, we might need to move the - // _onShowAppsButtonToggled logic into the extension. - if (!checked) { - this.mainDock.dash.showAppsButton._fromDesktop = false; - } - - // Instead of "syncing" the stock button, let's call its callback directly. - overviewControls._onShowAppsButtonToggled.call(overviewControls); - } - } - - // Because we "disconnected" from the search controller, we have to manage its state. - this.searchController._setSearchActive(false); - } - - destroy() { - this._signalsHandler.destroy(); - if (this._toggleLater) { - Meta.later_remove(this._toggleLater); - delete this._toggleLater; - } - this._restoreDash(); - this._deleteDocks(); - this._revertPanelCorners(); - if (this._oldSelectorMargin) - Main.overview._overview.controls._searchController.margin_bottom = this._oldSelectorMargin; - if (this._fm1Client) { - this._fm1Client.destroy(); - this._fm1Client = null; - } - this._remoteModel.destroy(); - this._settings.run_dispose(); - this._settings = null; - this._oldDash = null; - - Me.imports.extension.dockManager = null; - } - - /** - * Adjust Panel corners - */ - _adjustPanelCorners() { - let position = Utils.getPosition(); - let isHorizontal = ((position == St.Side.TOP) || (position == St.Side.BOTTOM)); - let extendHeight = this._settings.get_boolean('extend-height'); - let fixedIsEnabled = this._settings.get_boolean('dock-fixed'); - let dockOnPrimary = this._settings.get_boolean('multi-monitor') || - this._preferredMonitorIndex == Main.layoutManager.primaryIndex; - - if (!isHorizontal && dockOnPrimary && extendHeight && fixedIsEnabled) { - Main.panel._rightCorner.hide(); - Main.panel._leftCorner.hide(); - } - else - this._revertPanelCorners(); - } - - _revertPanelCorners() { - Main.panel._leftCorner.show(); - Main.panel._rightCorner.show(); - } -}; -Signals.addSignalMethods(DockManager.prototype); - -// This class drives long-running icon animations, to keep them running in sync -// with each other, and to save CPU by pausing them when the dock is hidden. -var IconAnimator = class DashToDock_IconAnimator { - constructor(actor) { - this._count = 0; - this._started = false; - this._animations = { - dance: [], - }; - this._timeline = new Clutter.Timeline({ - duration: 3000, - repeat_count: -1, - actor - }); - - this._timeline.connect('new-frame', () => { - const progress = this._timeline.get_progress(); - const danceRotation = progress < 1/6 ? 15*Math.sin(progress*24*Math.PI) : 0; - const dancers = this._animations.dance; - for (let i = 0, iMax = dancers.length; i < iMax; i++) { - dancers[i].target.rotation_angle_z = danceRotation; - } - }); - } - - destroy() { - this._timeline.stop(); - this._timeline = null; - for (const name in this._animations) { - const pairs = this._animations[name]; - for (let i = 0, iMax = pairs.length; i < iMax; i++) { - const pair = pairs[i]; - pair.target.disconnect(pair.targetDestroyId); - } - } - this._animations = null; - } - - pause() { - if (this._started && this._count > 0) { - this._timeline.stop(); - } - this._started = false; - } - - start() { - if (!this._started && this._count > 0) { - this._timeline.start(); - } - this._started = true; - } - - addAnimation(target, name) { - const targetDestroyId = target.connect('destroy', () => this.removeAnimation(target, name)); - this._animations[name].push({ target, targetDestroyId }); - if (this._started && this._count === 0) { - this._timeline.start(); - } - this._count++; - } - - removeAnimation(target, name) { - const pairs = this._animations[name]; - for (let i = 0, iMax = pairs.length; i < iMax; i++) { - const pair = pairs[i]; - if (pair.target === target) { - target.disconnect(pair.targetDestroyId); - pairs.splice(i, 1); - this._count--; - if (this._started && this._count === 0) { - this._timeline.stop(); - } - return; - } - } - } -}; diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/extension.js b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/extension.js deleted file mode 100644 index 0b7b5c6..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/extension.js +++ /dev/null @@ -1,21 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const ExtensionUtils = imports.misc.extensionUtils; -const Me = ExtensionUtils.getCurrentExtension(); -const Docking = Me.imports.docking; - -// We declare this with var so it can be accessed by other extensions in -// GNOME Shell 3.26+ (mozjs52+). -var dockManager; - -function init() { - ExtensionUtils.initTranslations('dashtodock'); -} - -function enable() { - new Docking.DockManager(); -} - -function disable() { - dockManager.destroy(); -} diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/fileManager1API.js b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/fileManager1API.js deleted file mode 100644 index 64ec621..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/fileManager1API.js +++ /dev/null @@ -1,226 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const Gio = imports.gi.Gio; -const Signals = imports.signals; - -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Utils = Me.imports.utils; - -const FileManager1Iface = '\ - \ - \ - '; - -const FileManager1Proxy = Gio.DBusProxy.makeProxyWrapper(FileManager1Iface); - -/** - * This class implements a client for the org.freedesktop.FileManager1 dbus - * interface, and specifically for the OpenWindowsWithLocations property - * which is published by Nautilus, but is not an official part of the interface. - * - * The property is a map from window identifiers to a list of locations open in - * the window. - * - * While OpeWindowsWithLocations is part of upstream Nautilus, for many years - * prior, Ubuntu patched Nautilus to publish XUbuntuOpenLocationsXids, which is - * similar but uses Xids as the window identifiers instead of gtk window paths. - * - * When an old or unpatched Nautilus is running, we will observe the properties - * to always be empty arrays, but there will not be any correctness issues. - */ -var FileManager1Client = class DashToDock_FileManager1Client { - - constructor() { - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this._cancellable = new Gio.Cancellable(); - - this._locationMap = new Map(); - this._proxy = new FileManager1Proxy(Gio.DBus.session, - "org.freedesktop.FileManager1", - "/org/freedesktop/FileManager1", - (initable, error) => { - // Use async construction to avoid blocking on errors. - if (error) { - if (!error.matches(Gio.IOErrorEnum, Gio.IOErrorEnum.CANCELLED)) - global.log(error); - } else { - this._updateLocationMap(); - } - }, this._cancellable); - - this._signalsHandler.add([ - this._proxy, - 'g-properties-changed', - this._onPropertyChanged.bind(this) - ], [ - // We must additionally listen for Screen events to know when to - // rebuild our location map when the set of available windows changes. - global.workspace_manager, - 'workspace-switched', - this._updateLocationMap.bind(this) - ], [ - global.display, - 'window-entered-monitor', - this._updateLocationMap.bind(this) - ], [ - global.display, - 'window-left-monitor', - this._updateLocationMap.bind(this) - ]); - } - - destroy() { - this._cancellable.cancel(); - this._signalsHandler.destroy(); - this._proxy.run_dispose(); - } - - /** - * Return an array of windows that are showing a location or - * sub-directories of that location. - */ - getWindows(location) { - let ret = new Set(); - let locationEsc = location; - - if (!location.endsWith('/')) { - locationEsc += '/'; - } - - for (let [k,v] of this._locationMap) { - if ((k + '/').startsWith(locationEsc)) { - for (let l of v) { - ret.add(l); - } - } - } - return Array.from(ret); - } - - _onPropertyChanged(proxy, changed, invalidated) { - let property = changed.unpack(); - if (property && - ('XUbuntuOpenLocationsXids' in property || - 'OpenWindowsWithLocations' in property)) { - this._updateLocationMap(); - } - } - - _updateLocationMap() { - let properties = this._proxy.get_cached_property_names(); - if (properties == null) { - // Nothing to check yet. - return; - } - - if (properties.includes('OpenWindowsWithLocations')) { - this._updateFromPaths(); - } else if (properties.includes('XUbuntuOpenLocationsXids')) { - this._updateFromXids(); - } - } - - _updateFromPaths() { - let pathToLocations = this._proxy.OpenWindowsWithLocations; - let pathToWindow = getPathToWindow(); - - let locationToWindow = new Map(); - for (let path in pathToLocations) { - let locations = pathToLocations[path]; - for (let i = 0; i < locations.length; i++) { - let l = locations[i]; - // Use a set to deduplicate when a window has a - // location open in multiple tabs. - if (!locationToWindow.has(l)) { - locationToWindow.set(l, new Set()); - } - let window = pathToWindow.get(path); - if (window != null) { - locationToWindow.get(l).add(window); - } - } - } - this._locationMap = locationToWindow; - this.emit('windows-changed'); - } - - _updateFromXids() { - let xidToLocations = this._proxy.XUbuntuOpenLocationsXids; - let xidToWindow = getXidToWindow(); - - let locationToWindow = new Map(); - for (let xid in xidToLocations) { - let locations = xidToLocations[xid]; - for (let i = 0; i < locations.length; i++) { - let l = locations[i]; - // Use a set to deduplicate when a window has a - // location open in multiple tabs. - if (!locationToWindow.has(l)) { - locationToWindow.set(l, new Set()); - } - let window = xidToWindow.get(parseInt(xid)); - if (window != null) { - locationToWindow.get(l).add(window); - } - } - } - this._locationMap = locationToWindow; - this.emit('windows-changed'); - } -} -Signals.addSignalMethods(FileManager1Client.prototype); - -/** - * Construct a map of gtk application window object paths to MetaWindows. - */ -function getPathToWindow() { - let pathToWindow = new Map(); - - for (let i = 0; i < global.workspace_manager.n_workspaces; i++) { - let ws = global.workspace_manager.get_workspace_by_index(i); - ws.list_windows().map(function(w) { - let path = w.get_gtk_window_object_path(); - if (path != null) { - pathToWindow.set(path, w); - } - }); - } - return pathToWindow; -} - -/** - * Construct a map of XIDs to MetaWindows. - * - * This is somewhat annoying as you cannot lookup a window by - * XID in any way, and must iterate through all of them looking - * for a match. - */ -function getXidToWindow() { - let xidToWindow = new Map(); - - for (let i = 0; i < global.workspace_manager.n_workspaces; i++) { - let ws = global.workspace_manager.get_workspace_by_index(i); - ws.list_windows().map(function(w) { - let xid = guessWindowXID(w); - if (xid != null) { - xidToWindow.set(parseInt(xid), w); - } - }); - } - return xidToWindow; -} - -/** - * Guesses the X ID of a window. - * - * This is the basic implementation that is sufficient for Nautilus - * windows. The pixel-saver extension has a much more complex - * implementation if we ever need it. - */ -function guessWindowXID(win) { - try { - return win.get_description().match(/0x[0-9a-f]+/)[0]; - } catch (err) { - return null; - } -} diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/intellihide.js b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/intellihide.js deleted file mode 100644 index 9c10938..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/intellihide.js +++ /dev/null @@ -1,321 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const GLib = imports.gi.GLib; -const Meta = imports.gi.Meta; -const Shell = imports.gi.Shell; - -const Main = imports.ui.main; -const Signals = imports.signals; - -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Docking = Me.imports.docking; -const Utils = Me.imports.utils; - -// A good compromise between reactivity and efficiency; to be tuned. -const INTELLIHIDE_CHECK_INTERVAL = 100; - -const OverlapStatus = { - UNDEFINED: -1, - FALSE: 0, - TRUE: 1 -}; - -const IntellihideMode = { - ALL_WINDOWS: 0, - FOCUS_APPLICATION_WINDOWS: 1, - MAXIMIZED_WINDOWS : 2 -}; - -// List of windows type taken into account. Order is important (keep the original -// enum order). -const handledWindowTypes = [ - Meta.WindowType.NORMAL, - Meta.WindowType.DOCK, - Meta.WindowType.DIALOG, - Meta.WindowType.MODAL_DIALOG, - Meta.WindowType.TOOLBAR, - Meta.WindowType.MENU, - Meta.WindowType.UTILITY, - Meta.WindowType.SPLASHSCREEN -]; - -/** - * A rough and ugly implementation of the intellihide behaviour. - * Intallihide object: emit 'status-changed' signal when the overlap of windows - * with the provided targetBoxClutter.ActorBox changes; - */ -var Intellihide = class DashToDock_Intellihide { - - constructor(monitorIndex) { - // Load settings - this._monitorIndex = monitorIndex; - - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this._tracker = Shell.WindowTracker.get_default(); - this._focusApp = null; // The application whose window is focused. - this._topApp = null; // The application whose window is on top on the monitor with the dock. - - this._isEnabled = false; - this.status = OverlapStatus.UNDEFINED; - this._targetBox = null; - - this._checkOverlapTimeoutContinue = false; - this._checkOverlapTimeoutId = 0; - - this._trackedWindows = new Map(); - - // Connect global signals - this._signalsHandler.add([ - // Add signals on windows created from now on - global.display, - 'window-created', - this._windowCreated.bind(this) - ], [ - // triggered for instance when the window list order changes, - // included when the workspace is switched - global.display, - 'restacked', - this._checkOverlap.bind(this) - ], [ - // when windows are alwasy on top, the focus window can change - // without the windows being restacked. Thus monitor window focus change. - this._tracker, - 'notify::focus-app', - this._checkOverlap.bind(this) - ], [ - // update wne monitor changes, for instance in multimonitor when monitor are attached - Meta.MonitorManager.get(), - 'monitors-changed', - this._checkOverlap.bind(this) - ]); - } - - destroy() { - // Disconnect global signals - this._signalsHandler.destroy(); - - // Remove residual windows signals - this.disable(); - } - - enable() { - this._isEnabled = true; - this._status = OverlapStatus.UNDEFINED; - global.get_window_actors().forEach(function(wa) { - this._addWindowSignals(wa); - }, this); - this._doCheckOverlap(); - } - - disable() { - this._isEnabled = false; - - for (let wa of this._trackedWindows.keys()) { - this._removeWindowSignals(wa); - } - this._trackedWindows.clear(); - - if (this._checkOverlapTimeoutId > 0) { - GLib.source_remove(this._checkOverlapTimeoutId); - this._checkOverlapTimeoutId = 0; - } - } - - _windowCreated(display, metaWindow) { - this._addWindowSignals(metaWindow.get_compositor_private()); - } - - _addWindowSignals(wa) { - if (!this._handledWindow(wa)) - return; - let signalId = wa.connect('notify::allocation', this._checkOverlap.bind(this)); - this._trackedWindows.set(wa, signalId); - wa.connect('destroy', this._removeWindowSignals.bind(this)); - } - - _removeWindowSignals(wa) { - if (this._trackedWindows.get(wa)) { - wa.disconnect(this._trackedWindows.get(wa)); - this._trackedWindows.delete(wa); - } - - } - - updateTargetBox(box) { - this._targetBox = box; - this._checkOverlap(); - } - - forceUpdate() { - this._status = OverlapStatus.UNDEFINED; - this._doCheckOverlap(); - } - - getOverlapStatus() { - return (this._status == OverlapStatus.TRUE); - } - - _checkOverlap() { - if (!this._isEnabled || (this._targetBox == null)) - return; - - /* Limit the number of calls to the doCheckOverlap function */ - if (this._checkOverlapTimeoutId) { - this._checkOverlapTimeoutContinue = true; - return - } - - this._doCheckOverlap(); - - this._checkOverlapTimeoutId = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, INTELLIHIDE_CHECK_INTERVAL, () => { - this._doCheckOverlap(); - if (this._checkOverlapTimeoutContinue) { - this._checkOverlapTimeoutContinue = false; - return GLib.SOURCE_CONTINUE; - } else { - this._checkOverlapTimeoutId = 0; - return GLib.SOURCE_REMOVE; - } - }); - } - - _doCheckOverlap() { - - if (!this._isEnabled || (this._targetBox == null)) - return; - - let overlaps = OverlapStatus.FALSE; - let windows = global.get_window_actors(); - - if (windows.length > 0) { - /* - * Get the top window on the monitor where the dock is placed. - * The idea is that we dont want to overlap with the windows of the topmost application, - * event is it's not the focused app -- for instance because in multimonitor the user - * select a window in the secondary monitor. - */ - - let topWindow = null; - for (let i = windows.length - 1; i >= 0; i--) { - let meta_win = windows[i].get_meta_window(); - if (this._handledWindow(windows[i]) && (meta_win.get_monitor() == this._monitorIndex)) { - topWindow = meta_win; - break; - } - } - - if (topWindow !== null) { - this._topApp = this._tracker.get_window_app(topWindow); - // If there isn't a focused app, use that of the window on top - this._focusApp = this._tracker.focus_app || this._topApp - - windows = windows.filter(this._intellihideFilterInteresting, this); - - for (let i = 0; i < windows.length; i++) { - let win = windows[i].get_meta_window(); - - if (win) { - let rect = win.get_frame_rect(); - - let test = (rect.x < this._targetBox.x2) && - (rect.x + rect.width > this._targetBox.x1) && - (rect.y < this._targetBox.y2) && - (rect.y + rect.height > this._targetBox.y1); - - if (test) { - overlaps = OverlapStatus.TRUE; - break; - } - } - } - } - } - - if (this._status !== overlaps) { - this._status = overlaps; - this.emit('status-changed', this._status); - } - - } - - // Filter interesting windows to be considered for intellihide. - // Consider all windows visible on the current workspace. - // Optionally skip windows of other applications - _intellihideFilterInteresting(wa) { - let meta_win = wa.get_meta_window(); - if (!this._handledWindow(wa)) - return false; - - let currentWorkspace = global.workspace_manager.get_active_workspace_index(); - let wksp = meta_win.get_workspace(); - let wksp_index = wksp.index(); - - // Depending on the intellihide mode, exclude non-relevent windows - switch (Docking.DockManager.settings.get_enum('intellihide-mode')) { - case IntellihideMode.ALL_WINDOWS: - // Do nothing - break; - - case IntellihideMode.FOCUS_APPLICATION_WINDOWS: - // Skip windows of other apps - if (this._focusApp) { - // The DropDownTerminal extension is not an application per se - // so we match its window by wm class instead - if (meta_win.get_wm_class() == 'DropDownTerminalWindow') - return true; - - let currentApp = this._tracker.get_window_app(meta_win); - let focusWindow = global.display.get_focus_window() - - // Consider half maximized windows side by side - // and windows which are alwayson top - if((currentApp != this._focusApp) && (currentApp != this._topApp) - && !((focusWindow && focusWindow.maximized_vertically && !focusWindow.maximized_horizontally) - && (meta_win.maximized_vertically && !meta_win.maximized_horizontally) - && meta_win.get_monitor() == focusWindow.get_monitor()) - && !meta_win.is_above()) - return false; - } - break; - - case IntellihideMode.MAXIMIZED_WINDOWS: - // Skip unmaximized windows - if (!meta_win.maximized_vertically && !meta_win.maximized_horizontally) - return false; - break; - } - - if ( wksp_index == currentWorkspace && meta_win.showing_on_its_workspace() ) - return true; - else - return false; - - } - - // Filter windows by type - // inspired by Opacify@gnome-shell.localdomain.pl - _handledWindow(wa) { - let metaWindow = wa.get_meta_window(); - - if (!metaWindow) - return false; - - // The DropDownTerminal extension uses the POPUP_MENU window type hint - // so we match its window by wm class instead - if (metaWindow.get_wm_class() == 'DropDownTerminalWindow') - return true; - - let wtype = metaWindow.get_window_type(); - for (let i = 0; i < handledWindowTypes.length; i++) { - var hwtype = handledWindowTypes[i]; - if (hwtype == wtype) - return true; - else if (hwtype > wtype) - return false; - } - return false; - } -}; - -Signals.addSignalMethods(Intellihide.prototype); diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/launcherAPI.js b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/launcherAPI.js deleted file mode 100644 index 55f44f7..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/launcherAPI.js +++ /dev/null @@ -1,281 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const Gio = imports.gi.Gio; - -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const DbusmenuUtils = Me.imports.dbusmenuUtils; - -const Dbusmenu = DbusmenuUtils.haveDBusMenu(); - -var LauncherEntryRemoteModel = class DashToDock_LauncherEntryRemoteModel { - - constructor() { - this._entrySourceStacks = new Map(); - this._remoteMaps = new Map(); - - this._launcher_entry_dbus_signal_id = - Gio.DBus.session.signal_subscribe(null, // sender - 'com.canonical.Unity.LauncherEntry', // iface - 'Update', // member - null, // path - null, // arg0 - Gio.DBusSignalFlags.NONE, - (connection, sender_name, object_path, interface_name, signal_name, parameters) => - this._onUpdate(sender_name, ...parameters.deep_unpack())); - - this._dbus_name_owner_changed_signal_id = - Gio.DBus.session.signal_subscribe('org.freedesktop.DBus', // sender - 'org.freedesktop.DBus', // interface - 'NameOwnerChanged', // member - '/org/freedesktop/DBus', // path - null, // arg0 - Gio.DBusSignalFlags.NONE, - (connection, sender_name, object_path, interface_name, signal_name, parameters) => - this._onDBusNameChange(...parameters.deep_unpack().slice(1))); - - this._acquireUnityDBus(); - } - - destroy() { - if (this._launcher_entry_dbus_signal_id) { - Gio.DBus.session.signal_unsubscribe(this._launcher_entry_dbus_signal_id); - } - - if (this._dbus_name_owner_changed_signal_id) { - Gio.DBus.session.signal_unsubscribe(this._dbus_name_owner_changed_signal_id); - } - - this._releaseUnityDBus(); - } - - _lookupStackById(appId) { - let sourceStack = this._entrySourceStacks.get(appId); - if (!sourceStack) { - this._entrySourceStacks.set(appId, sourceStack = new PropertySourceStack(new LauncherEntry(), launcherEntryDefaults)); - } - return sourceStack; - } - - lookupById(appId) { - return this._lookupStackById(appId).target; - } - - _acquireUnityDBus() { - if (!this._unity_bus_id) { - this._unity_bus_id = Gio.DBus.session.own_name('com.canonical.Unity', - Gio.BusNameOwnerFlags.ALLOW_REPLACEMENT | Gio.BusNameOwnerFlags.REPLACE, - null, () => this._unity_bus_id = 0); - } - } - - _releaseUnityDBus() { - if (this._unity_bus_id) { - Gio.DBus.session.unown_name(this._unity_bus_id); - this._unity_bus_id = 0; - } - } - - _onDBusNameChange(before, after) { - if (!before || !this._remoteMaps.size) { - return; - } - const remoteMap = this._remoteMaps.get(before); - if (!remoteMap) { - return; - } - this._remoteMaps.delete(before); - if (after && !this._remoteMaps.has(after)) { - this._remoteMaps.set(after, remoteMap); - } else { - for (const [appId, remote] of remoteMap) { - const sourceStack = this._entrySourceStacks.get(appId); - const changed = sourceStack.remove(remote); - if (changed) { - sourceStack.target._emitChangedEvents(changed); - } - } - } - } - - _onUpdate(senderName, appUri, properties) { - if (!senderName) { - return; - } - - const appId = appUri.replace(/(^\w+:|^)\/\//, ''); - if (!appId) { - return; - } - - let remoteMap = this._remoteMaps.get(senderName); - if (!remoteMap) { - this._remoteMaps.set(senderName, remoteMap = new Map()); - } - let remote = remoteMap.get(appId); - if (!remote) { - remoteMap.set(appId, remote = Object.assign({}, launcherEntryDefaults)); - } - for (const name in properties) { - if (name === 'quicklist' && Dbusmenu) { - const quicklistPath = properties[name].unpack(); - if (quicklistPath && (!remote._quicklistMenuClient || remote._quicklistMenuClient.dbus_object !== quicklistPath)) { - remote.quicklist = null; - let menuClient = remote._quicklistMenuClient; - if (menuClient) { - menuClient.dbus_object = quicklistPath; - } else { - // This property should not be enumerable - Object.defineProperty(remote, '_quicklistMenuClient', { - writable: true, - value: menuClient = new Dbusmenu.Client({ dbus_name: senderName, dbus_object: quicklistPath }), - }); - } - const handler = () => { - const root = menuClient.get_root(); - if (remote.quicklist !== root) { - remote.quicklist = root; - if (sourceStack.isTop(remote)) { - sourceStack.target.quicklist = root; - sourceStack.target._emitChangedEvents(['quicklist']); - } - } - }; - menuClient.connect(Dbusmenu.CLIENT_SIGNAL_ROOT_CHANGED, handler); - } - } else { - remote[name] = properties[name].unpack(); - } - } - - const sourceStack = this._lookupStackById(appId); - sourceStack.target._emitChangedEvents(sourceStack.update(remote)); - } -}; - -const launcherEntryDefaults = { - count: 0, - progress: 0, - urgent: false, - quicklist: null, - 'count-visible': false, - 'progress-visible': false, -}; - -const LauncherEntry = class DashToDock_LauncherEntry { - constructor() { - this._connections = new Map(); - this._handlers = new Map(); - this._nextId = 0; - } - - connect(eventNames, callback) { - if (typeof eventNames === 'string') { - eventNames = [eventNames]; - } - callback(this, this); - const id = this._nextId++; - const handler = { id, callback }; - eventNames.forEach(name => { - let handlerList = this._handlers.get(name); - if (!handlerList) { - this._handlers.set(name, handlerList = []); - } - handlerList.push(handler); - }); - this._connections.set(id, eventNames); - return id; - } - - disconnect(id) { - const eventNames = this._connections.get(id); - if (!eventNames) { - return; - } - this._connections.delete(id); - eventNames.forEach(name => { - const handlerList = this._handlers.get(name); - if (handlerList) { - for (let i = 0, iMax = handlerList.length; i < iMax; i++) { - if (handlerList[i].id === id) { - handlerList.splice(i, 1); - break; - } - } - } - }); - } - - _emitChangedEvents(propertyNames) { - const handlers = new Set(); - propertyNames.forEach(name => { - const handlerList = this._handlers.get(name + '-changed'); - if (handlerList) { - for (let i = 0, iMax = handlerList.length; i < iMax; i++) { - handlers.add(handlerList[i]); - } - } - }); - Array.from(handlers).sort((x, y) => x.id - y.id).forEach(handler => handler.callback(this, this)); - } -} - -for (const name in launcherEntryDefaults) { - const jsName = name.replace(/-/g, '_'); - LauncherEntry.prototype[jsName] = launcherEntryDefaults[name]; - if (jsName !== name) { - Object.defineProperty(LauncherEntry.prototype, name, { - get() { - return this[jsName]; - }, - set(value) { - this[jsName] = value; - }, - }); - } -} - -const PropertySourceStack = class DashToDock_PropertySourceStack { - constructor(target, bottom) { - this.target = target; - this._bottom = bottom; - this._stack = []; - } - - isTop(source) { - return this._stack.length > 0 && this._stack[this._stack.length - 1] === source; - } - - update(source) { - if (!this.isTop(source)) { - this.remove(source); - this._stack.push(source); - } - return this._assignFrom(source); - } - - remove(source) { - const stack = this._stack; - const top = stack[stack.length - 1]; - if (top === source) { - stack.length--; - return this._assignFrom(stack.length > 0 ? stack[stack.length - 1] : this._bottom); - } - for (let i = 0, iMax = stack.length; i < iMax; i++) { - if (stack[i] === source) { - stack.splice(i, 1); - break; - } - } - } - - _assignFrom(source) { - const changedProperties = []; - for (const name in source) { - if (this.target[name] !== source[name]) { - this.target[name] = source[name]; - changedProperties.push(name); - } - } - return changedProperties; - } -} diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/ar/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/ar/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index 78deaa584f2d2593e60609b7a4dc8502b9e6fc46..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8303 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 J{;Q~@{u@j=uwnoJ diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/cs/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/cs/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index 1cc799db8d8a580c195b45e834f93152e8af4491..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10321 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 Ji2SdJ`fnXRi#q@S diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/de/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/de/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index f7b2ed5d7df55c366fd7e3e10f644829af6eb948..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8726 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 MZ%co>;BRRE4^anh-T(jq diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/es/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/es/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index 99888b074cd0217febd7f9fd378a69a381652ebc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10083 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 PGx14=|8Bt1%W8$?P?>bJ>7jkCi?99#F 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 diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/fr/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/fr/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index a9a712cbd7a81c5408ab33dda9e41f8d70a9455e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10218 zcmbuEYm8*aRmUs%5j>6^;{+S*1Xnf*UT3F!*GufR$Fm#H&djbi?Cg$bX1#WT!MD4s zyRY~5z3uy$*)bmomV&T^gcR`*Mv)zeWN(5%K~W-55#%SVL>e6AQWVT z5+LIDulwkp-LZ(oRoDEx@2y*P>eM;^b570Q-F)@08?J)(9@@)S8S`l{dOLr({^2@f zUIqUVyaxQ@j4{`Pe_Y|8f$!t@tKco*n;;)^J)M3SyrsfBz}xt}AGF{icogh`N5J0! z-vRzjg|CCx^7~CtqWo8N|0+63j+;Qua|`(6;QPQkzz4ut@Z;c*fWHiCUC)6(27Vd* z0QeW+kAnXJz7xFuhH}2!LCv=h)c79)_52=?k6Gr=)!;g)evg7(@Coov@MTc)d>ecQ zy!OUY-e+|Ph;3oJ8_;v8z;C?#o1CN4Q-xJ`w zz_h|&0@*6_94I+I3u?Sep!D`fp!)v_sQvj%P~(0Rl-%C|)&F`17v2uefd{~Oun!`t z`CU+Q{2{3Id;^p|z72j5d=unjZoAnSK4!MUkANC?4Lk^TK*{+jkgYJk3F^Jif|B=3 zU>p1jh)T^HARqHx{%D==U@<=l-U90WQBdnx1%Cp35_~WCEGRpD5tJRi0$T8&K-s}H zDB*VSc2Msh0S|!>gL?lN5Y?C$zz4uDRKNcfls>)>@-a6snAW!sl>CQ5>E%99?>`92 zP96r&gWDi3XTA(w0-`~5ny#H?) zyX5(9g*UROd-(l+Q0sgQ)cXafe!l=p|Gx%Gj?aMF-yQHl@LS*#cqht3G!udHr)NOP z|J$JCdmfZNUaWq936vjw4Yc4Z;4JtrpzP^Zgpq%4fFA�(oS91C+d905#9+p!BNF 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 diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/gl/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/gl/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index b89c1027c134f064ab40cd815342b98bb7babc27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8819 zcmbuETZ|mpS;x;Nn}i*bT`(c{z*%R*-lp4QJG<*0k0)u{W3Q7LdonX#dy_yo-F>FJ z;_9m2y3EB<06_>+q#!{ANGL+FcnJHj4@(3O4oD~?B!qb2^1w<+D=q(Cdu*?GpfsodT~+6N=evLB>v`?S{l8(j9OFZbN8W18FM;!K=Y#9i4;k||@LBM$ z!H?JXM;15lf-Ue_n37xrFam!L{1Nb9LD6{w{0#U2#GVKH;Jd-^fJec<1b+OfYR48sPz{?(f=H{2*%(N_$`n>^F2O9|NEf$dk>S}0k*)8 zf=_|c$7jJK;Hbu50Qoat=i?aoyP){^8xT>f`N@M2mme&EvdgEy4}uQV`Y(YC;BSFi|7Rde&A))B z!Po2ilQ1E>p9f*h^g+!lz(>Jf2CsoHgSfVN8%oyx4}d%}PlB4a3`%d?;3k-Wvd?$H z&V9!G1t>i{2(#Y<-wkU18=&^P59JGwfTI5qQ1YyRqT@jM;SEsw`!XoLe;s@b{C%(k z{#}h9es5)m&x5ja49YLQ2ufdH1|`pLgYxI!0WJ6vI1m0g2r2VADEmCf=F<05pq{UT zqB{VYVs=1OYJL@b5&S0j2zUfz=>8e-6!;RT`Tq#M0R9&!dRq_|{TqCg;8(!UfIk2~ z0$xKIPl8_rWzTPc($AmrA^!gXlzjgVLel&vD7`&I5KEu$2c_TB;0bUQRNnY`kS)v~ zgWBiS`u+!?*1wm{{&oFK1?D6uStPG6#lb~}{8!gy#uDQh zhGOO%L)S7xIyuWwPLcfUjN=UHOxIf&Pca_V4VQdD`C8X?#x;igUDt&Q%oCt|=yQxS z^)vax3gc>h-@vE%BL8rVR{cIPz8A>%Wbd~#9%m?bW2$idET5+t@{8tD3@l5L#igSJ4V0?`6aosGm7Zw)GQa*Nx&7+(C%+Y-0;`r$D z)-cNLI7-=v>}yj0XR|U%^ukS9o{(===e;bA<9jVn?pT**eV<|9SnO9fyHURwa#IxP$OQJS z>q#@_T$pw)^Qf+GyZh!`nKKEuvFKI$!w`9~AN!d%qe>4!Alq$JHC>sGT`wwTX*Ci~ zXy!BIq>R4Hhc(aV_It4$FH6h85D%?PeLl5GS`1NuIiL1!1kbi{G>QuD`vX6jxRSUo z>o?1>&z^j2q4n(J*5x)IrdiP|i`*7zkbOtKg2MB*y;Rs9vEt%9MH*Y?Xrf359=koQXJ=k-?hD3g_ZBwk#|XgKeU?}%Rf%RC*L$^a@%TDcjr)cB}?hucc6c^&W zHt(fv+mCWh?$2wl9Ci=U>h*k{M>6_$mX7QoA+@!NUGHwRiZn&sEU@VJ3Nn?#f7f^O zs98QFtb^wiR-n9WQPuU zS$&ZfQj+aX}^@FHNQ?<#ZrFK|KP&FYeBi8Sm z-7LP9BU zopIJ(;^PpBi#FI>kz84)3Q|w1FzYGimm?^m&tiLa80JhqMdJfg&8 z`_NA!@}gNUNm|h7?d~Fu{$d$1e>_=Oy{VLgvdpJTvekx*@ZehU8+dcb4gD(qbF-l^ zG@A~C1Q&p8zwAkKW7qEoUxn#zmDe-Zk4l_mGZcr$_M4sv>d!E0&8Bvd5nb=bfW!)k zP#}V5H^zfbsA7i-#NCB$vQ3>*Cp4P0H(nK;Hli8Y$v7ExAdDj%J zncZqyL1Ri1T{#2pYKQXSrn1)sLB3XRGg%OAhX}|m$Be#DDkdgxDae7V$%AlkAY}Tf z&yz=|33yh%hW%!%nN%8xHPZDkJN0B**Chqh0EE+3jr>X8i5Fy(Jloy zSe~~_Du6<2lOUAYWwYf+<1}+wL;&Z~t0b7wTVtgV>fvRmKJ%(Kgv%Iz4QaHF)!MV# zW-A?=tum=g5iHJnaDB{Zo2wY0TSjrwBDJvd$cINa{C+oe86p0r#ot`>-LWGjTvLUs zW05=+(#t$*=d?<3Yff&>8;TgNBpDm!);VuR-p-uyJ+V& zJSr<%YxyARx6YP>ytS3`c>PLi12#IqDsn|@+%G`QLJEb)Z8!H zK|Hs1X>Dc7+wu0o+_@BQN!Vh43=aj_^w>CdQF7Y$hAu-@XRdBtXq}qQ3t8T0t(Byg z%9@MzR5vQ-uD7bAf8cRF^?lq~t-;B;^_XLL+~Nc>$`@@i4!8N46Q^zU^~__5efW$$ z{`l#+H*acIa-zL%Y8>4}VmB{cwii3vD^-Y_z znRclnDZbC4SZ7y+Dh_VtcRvUXO{OHf#vX(pAt!b?Fs32bn)7J57m1a=quNovs=KQ1 z;Ut#yB4;{-R5rDavkFWVkQlKiNB&e{U4*;z@Ex&16)Hp;U9fq4=X-D0Ty$_dw@<$5 z#E6v~$5T5l;~WMO7penwfnzxNdLj*HT+Q3=_xJ>6jn`IciGz zeP_1F9S5(Z@=eZIL6ER|WhW}6+^IJ{=elTI4>u2PPkSxo!=iHOlph=9?CLakw02@m zdM@@kcqu`v9#iM+UfU0D_b5{-tS62C_`2)r)PxY3UJKr^3au4eNz&0cCX&q6#t-x! z`Gb`>LwTeped{)aDQ#BUp7(aobCe^U2jwVm<}oUj*$x}|C@!d{KpeM6XNS(+i{-(~ z)^%O9mr|o@m2GpUKDKgUGFqR)mN|S93PBU2I!ZYtXK84?V&n;I|xWLYbD!xGLgdOqrmO zU}E%%5N0!iKeCU6X*AMDM?7SbD3eyJDdd>hy;*>w?{3CQk>U-9V;#cPjL9N(cSdyU z_!Z$3wc{|c;#Mh%?~@z_7qx~Q+V$87Hc6d3)PItf(#j+$ur9bHKLQ2G@1hl&^O(+A zX>TUjChDEeC}nq{|Rxk#a>oGox~q(4;ZF$-}TX^&H%p zJjOY&7mYE8;zQ{ow1m6}4HfzHUK>q2yMtT!D8JBhwZNTvHAR{58EEX+-TaMhIygTewMv2rXV^O$=0p?94M5 zZE}fOJ$RX)mH16c2MeF8;-HSu@->R0+O3Sn{N{lbWv%uQkok2iZjV0X|7t{=ooDI*S*XrNhgiSkgh&FG#}jI5Mme=iOGfB%_0NEg>OV}PlO_wv zc|wHHh2G=jK~_yO+!7_wl4@yvGLm$@7wb3@LN=sty`LVEsDgEUL_3N>O5!9r*t!*U j*?c&@g%~Zz96hUF<(t>?Qj9lazr*fccd4W}+SLCArqePd diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/hu/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/hu/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index 6e2d85e753a86dd0fc1842521009d7711b4f7413..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9276 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 MU2R*TOQT2oU*Ol9fdBvi diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/it/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/it/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index fc1f7228714a3dce08d4c91435e56c3ac9a43a0d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9880 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 L)Ag4GoRaxp;6^~+ diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/ja/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/ja/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index 9b9b9435c6df9d64c9dd1f9beae9234c5bb79bc6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12122 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 diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/nb/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/nb/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index 005884f3d914017e5aa4f8fec3e86f02211cb193..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9203 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 T)DEZN<7b(nv}uI^Y+C;h&0L5! diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/pt_BR/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/pt_BR/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index cbe7c664e09ac302402acdf2d673605d06cc94e6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9895 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 TAv9W#e7%&pnj&@~(VZ9Qp9u@+;M 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 diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/sk/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/sk/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index 5b25bec81aefd6d07f59bc9f2b2cb8a5be84d793..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6290 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 diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/sr/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/sr/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index da3e086199f2e685e378f0782bc638eb22763eeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11186 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 diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/sr@latin/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/sr@latin/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index 1fcfb47a64385b209ea62252130336388c33e02d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8824 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 scp)9%vJI{e=R(O{8aG2T?{LUjP6A diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/sv/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/sv/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index bab036ea01d4cdcc3e4d6d9a35c0e4e292c48119..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10093 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 diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/uk_UA/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/uk_UA/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index a475c96e2e0d6cc93a45fbc49eaf6d316920e592..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15770 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 diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/zh_CN/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/zh_CN/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index 8ebfc33144988cb5c24ad3c49b1f6703146f0b7b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9442 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 Nm6MV3S`SaM{{^Jo_GSP8 diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/zh_TW/LC_MESSAGES/dashtodock.mo b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locale/zh_TW/LC_MESSAGES/dashtodock.mo deleted file mode 100644 index 3ca257aa96892bf4a59b1901ca21357fe3b9493b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9484 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 diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locations.js b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locations.js deleted file mode 100644 index 9dae93f..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/locations.js +++ /dev/null @@ -1,293 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const Gio = imports.gi.Gio; -const GLib = imports.gi.GLib; -const Gtk = imports.gi.Gtk; -const Shell = imports.gi.Shell; -const Signals = imports.signals; - -// Use __ () and N__() for the extension gettext domain, and reuse -// the shell domain with the default _() and N_() -const Gettext = imports.gettext.domain('dashtodock'); -const __ = Gettext.gettext; -const N__ = function(e) { return e }; - -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Utils = Me.imports.utils; - -const UPDATE_TRASH_DELAY = 500; - -/** - * This class maintains a Shell.App representing the Trash and keeps it - * up-to-date as the trash fills and is emptied over time. - */ -var Trash = class DashToDock_Trash { - - constructor() { - this._file = Gio.file_new_for_uri('trash://'); - try { - this._monitor = this._file.monitor_directory(0, null); - this._signalId = this._monitor.connect( - 'changed', - this._onTrashChange.bind(this) - ); - } catch (e) { - log(`Impossible to monitor trash: ${e}`) - } - this._lastEmpty = true; - this._empty = true; - this._schedUpdateId = 0; - this._updateTrash(); - } - - destroy() { - if (this._monitor) { - this._monitor.disconnect(this._signalId); - this._monitor.run_dispose(); - } - this._file.run_dispose(); - } - - _onTrashChange() { - if (this._schedUpdateId) { - GLib.source_remove(this._schedUpdateId); - } - this._schedUpdateId = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, UPDATE_TRASH_DELAY, () => { - this._schedUpdateId = 0; - this._updateTrash(); - return GLib.SOURCE_REMOVE; - }); - } - - _updateTrash() { - try { - let children = this._file.enumerate_children('*', 0, null); - this._empty = children.next_file(null) == null; - children.close(null); - } catch (e) { - log(`Impossible to enumerate trash children: ${e}`) - return; - } - - this._ensureApp(); - } - - _ensureApp() { - if (this._trashApp == null || - this._lastEmpty != this._empty) { - let trashKeys = new GLib.KeyFile(); - trashKeys.set_string('Desktop Entry', 'Name', __('Trash')); - trashKeys.set_string('Desktop Entry', 'Icon', - this._empty ? 'user-trash' : 'user-trash-full'); - trashKeys.set_string('Desktop Entry', 'Type', 'Application'); - trashKeys.set_string('Desktop Entry', 'Exec', 'gio open trash:///'); - trashKeys.set_string('Desktop Entry', 'StartupNotify', 'false'); - trashKeys.set_string('Desktop Entry', 'XdtdUri', 'trash:///'); - if (!this._empty) { - trashKeys.set_string('Desktop Entry', 'Actions', 'empty-trash;'); - trashKeys.set_string('Desktop Action empty-trash', 'Name', __('Empty Trash')); - trashKeys.set_string('Desktop Action empty-trash', 'Exec', - 'dbus-send --print-reply --dest=org.gnome.Nautilus /org/gnome/Nautilus org.gnome.Nautilus.FileOperations.EmptyTrash'); - } - - let trashAppInfo = Gio.DesktopAppInfo.new_from_keyfile(trashKeys); - this._trashApp = new Shell.App({appInfo: trashAppInfo}); - this._lastEmpty = this._empty; - - this.emit('changed'); - } - } - - getApp() { - this._ensureApp(); - return this._trashApp; - } -} -Signals.addSignalMethods(Trash.prototype); - -/** - * This class maintains Shell.App representations for removable devices - * plugged into the system, and keeps the list of Apps up-to-date as - * devices come and go and are mounted and unmounted. - */ -var Removables = class DashToDock_Removables { - - constructor() { - this._signalsHandler = new Utils.GlobalSignalsHandler(); - - this._monitor = Gio.VolumeMonitor.get(); - this._volumeApps = [] - this._mountApps = [] - - this._monitor.get_volumes().forEach( - (volume) => { - this._onVolumeAdded(this._monitor, volume); - } - ); - - this._monitor.get_mounts().forEach( - (mount) => { - this._onMountAdded(this._monitor, mount); - } - ); - - this._signalsHandler.add([ - this._monitor, - 'mount-added', - this._onMountAdded.bind(this) - ], [ - this._monitor, - 'mount-removed', - this._onMountRemoved.bind(this) - ], [ - this._monitor, - 'volume-added', - this._onVolumeAdded.bind(this) - ], [ - this._monitor, - 'volume-removed', - this._onVolumeRemoved.bind(this) - ]); - } - - destroy() { - this._signalsHandler.destroy(); - this._monitor.run_dispose(); - } - - _getWorkingIconName(icon) { - if (icon instanceof Gio.EmblemedIcon) { - icon = icon.get_icon(); - } - if (icon instanceof Gio.ThemedIcon) { - let iconTheme = Gtk.IconTheme.get_default(); - let names = icon.get_names(); - for (let i = 0; i < names.length; i++) { - let iconName = names[i]; - if (iconTheme.has_icon(iconName)) { - return iconName; - } - } - return ''; - } else { - return icon.to_string(); - } - } - - _onVolumeAdded(monitor, volume) { - if (!volume.can_mount()) { - return; - } - - if (volume.get_identifier('class') == 'network') { - return; - } - - let activationRoot = volume.get_activation_root(); - if (!activationRoot) { - // Can't offer to mount a device if we don't know - // where to mount it. - // These devices are usually ejectable so you - // don't normally unmount them anyway. - return; - } - - let escapedUri = activationRoot.get_uri() - let uri = GLib.uri_unescape_string(escapedUri, null); - - let volumeKeys = new GLib.KeyFile(); - volumeKeys.set_string('Desktop Entry', 'Name', volume.get_name()); - volumeKeys.set_string('Desktop Entry', 'Icon', this._getWorkingIconName(volume.get_icon())); - volumeKeys.set_string('Desktop Entry', 'Type', 'Application'); - volumeKeys.set_string('Desktop Entry', 'Exec', 'gio open "' + uri + '"'); - volumeKeys.set_string('Desktop Entry', 'StartupNotify', 'false'); - volumeKeys.set_string('Desktop Entry', 'XdtdUri', escapedUri); - volumeKeys.set_string('Desktop Entry', 'Actions', 'mount;'); - volumeKeys.set_string('Desktop Action mount', 'Name', __('Mount')); - volumeKeys.set_string('Desktop Action mount', 'Exec', 'gio mount "' + uri + '"'); - let volumeAppInfo = Gio.DesktopAppInfo.new_from_keyfile(volumeKeys); - let volumeApp = new Shell.App({appInfo: volumeAppInfo}); - this._volumeApps.push(volumeApp); - this.emit('changed'); - } - - _onVolumeRemoved(monitor, volume) { - for (let i = 0; i < this._volumeApps.length; i++) { - let app = this._volumeApps[i]; - if (app.get_name() == volume.get_name()) { - this._volumeApps.splice(i, 1); - } - } - this.emit('changed'); - } - - _onMountAdded(monitor, mount) { - // Filter out uninteresting mounts - if (!mount.can_eject() && !mount.can_unmount()) - return; - if (mount.is_shadowed()) - return; - - let volume = mount.get_volume(); - if (!volume || volume.get_identifier('class') == 'network') { - return; - } - - let escapedUri = mount.get_root().get_uri() - let uri = GLib.uri_unescape_string(escapedUri, null); - - let mountKeys = new GLib.KeyFile(); - mountKeys.set_string('Desktop Entry', 'Name', mount.get_name()); - mountKeys.set_string('Desktop Entry', 'Icon', - this._getWorkingIconName(volume.get_icon())); - mountKeys.set_string('Desktop Entry', 'Type', 'Application'); - mountKeys.set_string('Desktop Entry', 'Exec', 'gio open "' + uri + '"'); - mountKeys.set_string('Desktop Entry', 'StartupNotify', 'false'); - mountKeys.set_string('Desktop Entry', 'XdtdUri', escapedUri); - mountKeys.set_string('Desktop Entry', 'Actions', 'unmount;'); - if (mount.can_eject()) { - mountKeys.set_string('Desktop Action unmount', 'Name', __('Eject')); - mountKeys.set_string('Desktop Action unmount', 'Exec', - 'gio mount -e "' + uri + '"'); - } else { - mountKeys.set_string('Desktop Entry', 'Actions', 'unmount;'); - mountKeys.set_string('Desktop Action unmount', 'Name', __('Unmount')); - mountKeys.set_string('Desktop Action unmount', 'Exec', - 'gio mount -u "' + uri + '"'); - } - let mountAppInfo = Gio.DesktopAppInfo.new_from_keyfile(mountKeys); - let mountApp = new Shell.App({appInfo: mountAppInfo}); - this._mountApps.push(mountApp); - this.emit('changed'); - } - - _onMountRemoved(monitor, mount) { - for (let i = 0; i < this._mountApps.length; i++) { - let app = this._mountApps[i]; - if (app.get_name() == mount.get_name()) { - this._mountApps.splice(i, 1); - } - } - this.emit('changed'); - } - - getApps() { - // When we have both a volume app and a mount app, we prefer - // the mount app. - let apps = new Map(); - this._volumeApps.map(function(app) { - apps.set(app.get_name(), app); - }); - this._mountApps.map(function(app) { - apps.set(app.get_name(), app); - }); - - let ret = []; - for (let app of apps.values()) { - ret.push(app); - } - return ret; - } -} -Signals.addSignalMethods(Removables.prototype); diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/media/glossy.svg b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/media/glossy.svg deleted file mode 100644 index 55b71ba..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/media/glossy.svg +++ /dev/null @@ -1,139 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/media/highlight_stacked_bg.svg b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/media/highlight_stacked_bg.svg deleted file mode 100644 index 19be5a9..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/media/highlight_stacked_bg.svg +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/media/highlight_stacked_bg_h.svg b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/media/highlight_stacked_bg_h.svg deleted file mode 100644 index eeaa869..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/media/highlight_stacked_bg_h.svg +++ /dev/null @@ -1,82 +0,0 @@ - - - - - - image/svg+xml - - - - - - - - - - - - - diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/media/logo.svg b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/media/logo.svg deleted file mode 100644 index eebd0b1..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/media/logo.svg +++ /dev/null @@ -1,528 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - image/svg+xml - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Dash to Dock - Michele - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/metadata.json b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/metadata.json deleted file mode 100644 index fadda6a..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/metadata.json +++ /dev/null @@ -1,12 +0,0 @@ -{ -"shell-version": [ - "40" -], -"uuid": "dash-to-dock@micxgx.gmail.com", -"name": "Dash to Dock", -"description": "A dock for the Gnome Shell. This extension moves the dash out of the overview transforming it in a dock for an easier launching of applications and a faster switching between windows and desktops. Side and bottom placement options are available.", -"original-author": "micxgx@gmail.com", -"url": "https://micheleg.github.io/dash-to-dock/", -"gettext-domain": "dashtodock", -"version": 69 -} diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/prefs.js b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/prefs.js deleted file mode 100644 index 88c6df4..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/prefs.js +++ /dev/null @@ -1,838 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const Gio = imports.gi.Gio; -const GLib = imports.gi.GLib; -const GObject = imports.gi.GObject; -const Gtk = imports.gi.Gtk; -const Gdk = imports.gi.Gdk; - -// Use __ () and N__() for the extension gettext domain, and reuse -// the shell domain with the default _() and N_() -const Gettext = imports.gettext.domain('dashtodock'); -const __ = Gettext.gettext; -const N__ = function (e) { return e }; - -const ExtensionUtils = imports.misc.extensionUtils; -const Me = ExtensionUtils.getCurrentExtension(); - -const SCALE_UPDATE_TIMEOUT = 500; -const DEFAULT_ICONS_SIZES = [128, 96, 64, 48, 32, 24, 16]; - -const TransparencyMode = { - DEFAULT: 0, - FIXED: 1, - DYNAMIC: 3 -}; - -const RunningIndicatorStyle = { - DEFAULT: 0, - DOTS: 1, - SQUARES: 2, - DASHES: 3, - SEGMENTED: 4, - SOLID: 5, - CILIORA: 6, - METRO: 7 -}; - -// TODO: -// function setShortcut(settings) { -// let shortcut_text = settings.get_string('shortcut-text'); -// let [key, mods] = Gtk.accelerator_parse(shortcut_text); - -// if (Gtk.accelerator_valid(key, mods)) { -// let shortcut = Gtk.accelerator_name(key, mods); -// settings.set_strv('shortcut', [shortcut]); -// } -// else { -// settings.set_strv('shortcut', []); -// } -// } - -var Settings = GObject.registerClass({ - Implements: [Gtk.BuilderScope], -}, class DashToDock_Settings extends GObject.Object { - - _init() { - super._init(); - - this._settings = ExtensionUtils.getSettings('org.gnome.shell.extensions.dash-to-dock'); - - this._rtl = (Gtk.Widget.get_default_direction() == Gtk.TextDirection.RTL); - - this._builder = new Gtk.Builder(); - this._builder.set_scope(this); - this._builder.set_translation_domain(Me.metadata['gettext-domain']); - this._builder.add_from_file(Me.path + '/Settings.ui'); - - this.widget = new Gtk.ScrolledWindow({ hscrollbar_policy: Gtk.PolicyType.NEVER }); - this._notebook = this._builder.get_object('settings_notebook'); - this.widget.set_child(this._notebook); - - // Timeout to delay the update of the settings - this._dock_size_timeout = 0; - this._icon_size_timeout = 0; - this._opacity_timeout = 0; - - this._bindSettings(); - } - - vfunc_create_closure(builder, handlerName, flags, connectObject) { - if (flags & Gtk.BuilderClosureFlags.SWAPPED) - throw new Error('Unsupported template signal flag "swapped"'); - - if (typeof this[handlerName] === 'undefined') - throw new Error(`${handlerName} is undefined`); - - return this[handlerName].bind(connectObject || this); - } - - dock_display_combo_changed_cb(combo) { - this._settings.set_int('preferred-monitor', this._monitors[combo.get_active()]); - } - - position_top_button_toggled_cb(button) { - if (button.get_active()) - this._settings.set_enum('dock-position', 0); - } - - position_right_button_toggled_cb(button) { - if (button.get_active()) - this._settings.set_enum('dock-position', 1); - } - - position_bottom_button_toggled_cb(button) { - if (button.get_active()) - this._settings.set_enum('dock-position', 2); - } - - position_left_button_toggled_cb(button) { - if (button.get_active()) - this._settings.set_enum('dock-position', 3); - } - - icon_size_combo_changed_cb(combo) { - this._settings.set_int('dash-max-icon-size', this._allIconSizes[combo.get_active()]); - } - - dock_size_scale_value_changed_cb(scale) { - // Avoid settings the size continuously - if (this._dock_size_timeout > 0) - GLib.source_remove(this._dock_size_timeout); - const id = this._dock_size_timeout = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, SCALE_UPDATE_TIMEOUT, () => { - if (id === this._dock_size_timeout) { - this._settings.set_double('height-fraction', scale.get_value()); - this._dock_size_timeout = 0; - return GLib.SOURCE_REMOVE; - } - }); - } - - icon_size_scale_value_changed_cb(scale) { - // Avoid settings the size consinuosly - if (this._icon_size_timeout > 0) - GLib.source_remove(this._icon_size_timeout); - this._icon_size_timeout = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, SCALE_UPDATE_TIMEOUT, () => { - log(scale.get_value()); - this._settings.set_int('dash-max-icon-size', scale.get_value()); - this._icon_size_timeout = 0; - return GLib.SOURCE_REMOVE; - }); - } - custom_opacity_scale_value_changed_cb(scale) { - // Avoid settings the opacity consinuosly as it's change is animated - if (this._opacity_timeout > 0) - GLib.source_remove(this._opacity_timeout); - this._opacity_timeout = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, SCALE_UPDATE_TIMEOUT, () => { - this._settings.set_double('background-opacity', scale.get_value()); - this._opacity_timeout = 0; - return GLib.SOURCE_REMOVE; - }); - } - min_opacity_scale_value_changed_cb(scale) { - // Avoid settings the opacity consinuosly as it's change is animated - if (this._opacity_timeout > 0) - GLib.source_remove(this._opacity_timeout); - this._opacity_timeout = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, SCALE_UPDATE_TIMEOUT, () => { - this._settings.set_double('min-alpha', scale.get_value()); - this._opacity_timeout = 0; - return GLib.SOURCE_REMOVE; - }); - } - max_opacity_scale_value_changed_cb(scale) { - // Avoid settings the opacity consinuosly as it's change is animated - if (this._opacity_timeout > 0) - GLib.source_remove(this._opacity_timeout); - this._opacity_timeout = GLib.timeout_add( - GLib.PRIORITY_DEFAULT, SCALE_UPDATE_TIMEOUT, () => { - this._settings.set_double('max-alpha', scale.get_value()); - this._opacity_timeout = 0; - return GLib.SOURCE_REMOVE; - }); - } - - all_windows_radio_button_toggled_cb(button) { - if (button.get_active()) - this._settings.set_enum('intellihide-mode', 0); - } - focus_application_windows_radio_button_toggled_cb(button) { - if (button.get_active()) - this._settings.set_enum('intellihide-mode', 1); - } - maximized_windows_radio_button_toggled_cb(button) { - if (button.get_active()) - this._settings.set_enum('intellihide-mode', 2); - } - - - _bindSettings() { - // Position and size panel - - // Monitor options - - this._monitors = []; - // Build options based on the number of monitors and the current settings. - let monitors = Gdk.Display.get_default().get_monitors(); - let n_monitors = monitors.length; - let primary_monitor = 0; // Gdk.Screen.get_default().get_primary_monitor(); - - let monitor = this._settings.get_int('preferred-monitor'); - - // Add primary monitor with index 0, because in GNOME Shell the primary monitor is always 0 - this._builder.get_object('dock_monitor_combo').append_text(__('Primary monitor')); - this._monitors.push(0); - - // Add connected monitors - let ctr = 0; - for (let i = 0; i < n_monitors; i++) { - if (i !== primary_monitor) { - ctr++; - this._monitors.push(ctr); - this._builder.get_object('dock_monitor_combo').append_text(__('Secondary monitor ') + ctr); - } - } - - // If one of the external monitor is set as preferred, show it even if not attached - if ((monitor >= n_monitors) && (monitor !== primary_monitor)) { - this._monitors.push(monitor) - this._builder.get_object('dock_monitor_combo').append_text(__('Secondary monitor ') + ++ctr); - } - - this._builder.get_object('dock_monitor_combo').set_active(this._monitors.indexOf(monitor)); - - // Position option - let position = this._settings.get_enum('dock-position'); - - switch (position) { - case 0: - this._builder.get_object('position_top_button').set_active(true); - break; - case 1: - this._builder.get_object('position_right_button').set_active(true); - break; - case 2: - this._builder.get_object('position_bottom_button').set_active(true); - break; - case 3: - this._builder.get_object('position_left_button').set_active(true); - break; - } - - if (this._rtl) { - /* Left is Right in rtl as a setting */ - this._builder.get_object('position_left_button').set_label(__('Right')); - this._builder.get_object('position_right_button').set_label(__('Left')); - } - - // Intelligent autohide options - this._settings.bind('dock-fixed', - this._builder.get_object('intelligent_autohide_switch'), - 'active', - Gio.SettingsBindFlags.INVERT_BOOLEAN); - this._settings.bind('dock-fixed', - this._builder.get_object('intelligent_autohide_button'), - 'sensitive', - Gio.SettingsBindFlags.INVERT_BOOLEAN); - this._settings.bind('autohide', - this._builder.get_object('autohide_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('autohide-in-fullscreen', - this._builder.get_object('autohide_enable_in_fullscreen_checkbutton'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('require-pressure-to-show', - this._builder.get_object('require_pressure_checkbutton'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('intellihide', - this._builder.get_object('intellihide_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('animation-time', - this._builder.get_object('animation_duration_spinbutton'), - 'value', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('hide-delay', - this._builder.get_object('hide_timeout_spinbutton'), - 'value', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('show-delay', - this._builder.get_object('show_timeout_spinbutton'), - 'value', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('pressure-threshold', - this._builder.get_object('pressure_threshold_spinbutton'), - 'value', - Gio.SettingsBindFlags.DEFAULT); - - //this._builder.get_object('animation_duration_spinbutton').set_value(this._settings.get_double('animation-time')); - - // Create dialog for intelligent autohide advanced settings - this._builder.get_object('intelligent_autohide_button').connect('clicked', () => { - - let dialog = new Gtk.Dialog({ - title: __('Intelligent autohide customization'), - transient_for: this.widget.get_root(), - use_header_bar: true, - modal: true - }); - - // GTK+ leaves positive values for application-defined response ids. - // Use +1 for the reset action - dialog.add_button(__('Reset to defaults'), 1); - - let box = this._builder.get_object('intelligent_autohide_advanced_settings_box'); - dialog.get_content_area().append(box); - - this._settings.bind('intellihide', - this._builder.get_object('intellihide_mode_box'), - 'sensitive', - Gio.SettingsBindFlags.GET); - - // intellihide mode - - let intellihideModeRadioButtons = [ - this._builder.get_object('all_windows_radio_button'), - this._builder.get_object('focus_application_windows_radio_button'), - this._builder.get_object('maximized_windows_radio_button') - ]; - - intellihideModeRadioButtons[this._settings.get_enum('intellihide-mode')].set_active(true); - - this._settings.bind('autohide', - this._builder.get_object('require_pressure_checkbutton'), - 'sensitive', - Gio.SettingsBindFlags.GET); - - this._settings.bind('autohide', - this._builder.get_object('autohide_enable_in_fullscreen_checkbutton'), - 'sensitive', - Gio.SettingsBindFlags.GET); - - this._settings.bind('require-pressure-to-show', - this._builder.get_object('show_timeout_spinbutton'), - 'sensitive', - Gio.SettingsBindFlags.INVERT_BOOLEAN); - this._settings.bind('require-pressure-to-show', - this._builder.get_object('show_timeout_label'), - 'sensitive', - Gio.SettingsBindFlags.INVERT_BOOLEAN); - this._settings.bind('require-pressure-to-show', - this._builder.get_object('pressure_threshold_spinbutton'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('require-pressure-to-show', - this._builder.get_object('pressure_threshold_label'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - dialog.connect('response', (dialog, id) => { - if (id == 1) { - // restore default settings for the relevant keys - let keys = ['intellihide', 'autohide', 'intellihide-mode', 'autohide-in-fullscreen', 'require-pressure-to-show', - 'animation-time', 'show-delay', 'hide-delay', 'pressure-threshold']; - keys.forEach(function (val) { - this._settings.set_value(val, this._settings.get_default_value(val)); - }, this); - intellihideModeRadioButtons[this._settings.get_enum('intellihide-mode')].set_active(true); - } else { - // remove the settings box so it doesn't get destroyed; - dialog.get_content_area().remove(box); - dialog.destroy(); - } - return; - }); - - dialog.present(); - - }); - - // size options - const dock_size_scale = this._builder.get_object('dock_size_scale'); - dock_size_scale.set_value(this._settings.get_double('height-fraction')); - dock_size_scale.add_mark(0.9, Gtk.PositionType.TOP, null); - dock_size_scale.set_format_value_func((_, value) => { - return Math.round(value * 100) + ' %'; - }); - let icon_size_scale = this._builder.get_object('icon_size_scale'); - icon_size_scale.set_range(8, DEFAULT_ICONS_SIZES[0]); - icon_size_scale.set_value(this._settings.get_int('dash-max-icon-size')); - DEFAULT_ICONS_SIZES.forEach(function (val) { - icon_size_scale.add_mark(val, Gtk.PositionType.TOP, val.toString()); - }); - icon_size_scale.set_format_value_func((_, value) => { - return value + ' px'; - }); - - // Corrent for rtl languages - if (this._rtl) { - // Flip value position: this is not done automatically - dock_size_scale.set_value_pos(Gtk.PositionType.LEFT); - icon_size_scale.set_value_pos(Gtk.PositionType.LEFT); - // I suppose due to a bug, having a more than one mark and one above a value of 100 - // makes the rendering of the marks wrong in rtl. This doesn't happen setting the scale as not flippable - // and then manually inverting it - icon_size_scale.set_flippable(false); - icon_size_scale.set_inverted(true); - } - - this._settings.bind('icon-size-fixed', this._builder.get_object('icon_size_fixed_checkbutton'), 'active', Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('extend-height', this._builder.get_object('dock_size_extend_checkbutton'), 'active', Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('extend-height', this._builder.get_object('dock_size_scale'), 'sensitive', Gio.SettingsBindFlags.INVERT_BOOLEAN); - - - // Apps panel - - this._settings.bind('show-running', - this._builder.get_object('show_running_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('isolate-workspaces', - this._builder.get_object('application_button_isolation_button'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('isolate-monitors', - this._builder.get_object('application_button_monitor_isolation_button'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('show-windows-preview', - this._builder.get_object('windows_preview_button'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('multi-monitor', - this._builder.get_object('multi_monitor_button'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('show-favorites', - this._builder.get_object('show_favorite_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('show-trash', - this._builder.get_object('show_trash_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('show-mounts', - this._builder.get_object('show_mounts_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('show-show-apps-button', - this._builder.get_object('show_applications_button_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('show-apps-at-top', - this._builder.get_object('application_button_first_button'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('show-show-apps-button', - this._builder.get_object('application_button_first_button'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('animate-show-apps', - this._builder.get_object('application_button_animation_button'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('show-show-apps-button', - this._builder.get_object('application_button_animation_button'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - - // Behavior panel - - this._settings.bind('hot-keys', - this._builder.get_object('hot_keys_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('hot-keys', - this._builder.get_object('overlay_button'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT); - - this._builder.get_object('click_action_combo').set_active(this._settings.get_enum('click-action')); - this._builder.get_object('click_action_combo').connect('changed', (widget) => { - this._settings.set_enum('click-action', widget.get_active()); - }); - - this._builder.get_object('scroll_action_combo').set_active(this._settings.get_enum('scroll-action')); - this._builder.get_object('scroll_action_combo').connect('changed', (widget) => { - this._settings.set_enum('scroll-action', widget.get_active()); - }); - - this._builder.get_object('shift_click_action_combo').connect('changed', (widget) => { - this._settings.set_enum('shift-click-action', widget.get_active()); - }); - - this._builder.get_object('middle_click_action_combo').connect('changed', (widget) => { - this._settings.set_enum('middle-click-action', widget.get_active()); - }); - this._builder.get_object('shift_middle_click_action_combo').connect('changed', (widget) => { - this._settings.set_enum('shift-middle-click-action', widget.get_active()); - }); - - // Create dialog for number overlay options - this._builder.get_object('overlay_button').connect('clicked', () => { - - let dialog = new Gtk.Dialog({ - title: __('Show dock and application numbers'), - transient_for: this.widget.get_root(), - use_header_bar: true, - modal: true - }); - - // GTK+ leaves positive values for application-defined response ids. - // Use +1 for the reset action - dialog.add_button(__('Reset to defaults'), 1); - - let box = this._builder.get_object('box_overlay_shortcut'); - dialog.get_content_area().append(box); - - this._builder.get_object('overlay_switch').set_active(this._settings.get_boolean('hotkeys-overlay')); - this._builder.get_object('show_dock_switch').set_active(this._settings.get_boolean('hotkeys-show-dock')); - - // We need to update the shortcut 'strv' when the text is modified - this._settings.connect('changed::shortcut-text', () => { setShortcut(this._settings); }); - this._settings.bind('shortcut-text', - this._builder.get_object('shortcut_entry'), - 'text', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('hotkeys-overlay', - this._builder.get_object('overlay_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('hotkeys-show-dock', - this._builder.get_object('show_dock_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('shortcut-timeout', - this._builder.get_object('timeout_spinbutton'), - 'value', - Gio.SettingsBindFlags.DEFAULT); - - dialog.connect('response', (dialog, id) => { - if (id == 1) { - // restore default settings for the relevant keys - let keys = ['shortcut-text', 'hotkeys-overlay', 'hotkeys-show-dock', 'shortcut-timeout']; - keys.forEach(function (val) { - this._settings.set_value(val, this._settings.get_default_value(val)); - }, this); - } else { - // remove the settings box so it doesn't get destroyed; - dialog.get_content_area().remove(box); - dialog.destroy(); - } - return; - }); - - dialog.present(); - }); - - // Create dialog for middle-click options - this._builder.get_object('middle_click_options_button').connect('clicked', () => { - - let dialog = new Gtk.Dialog({ - title: __('Customize middle-click behavior'), - transient_for: this.widget.get_root(), - use_header_bar: true, - modal: true - }); - - // GTK+ leaves positive values for application-defined response ids. - // Use +1 for the reset action - dialog.add_button(__('Reset to defaults'), 1); - - let box = this._builder.get_object('box_middle_click_options'); - dialog.get_content_area().append(box); - - this._builder.get_object('shift_click_action_combo').set_active(this._settings.get_enum('shift-click-action')); - - this._builder.get_object('middle_click_action_combo').set_active(this._settings.get_enum('middle-click-action')); - - this._builder.get_object('shift_middle_click_action_combo').set_active(this._settings.get_enum('shift-middle-click-action')); - - this._settings.bind('shift-click-action', - this._builder.get_object('shift_click_action_combo'), - 'active-id', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('middle-click-action', - this._builder.get_object('middle_click_action_combo'), - 'active-id', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('shift-middle-click-action', - this._builder.get_object('shift_middle_click_action_combo'), - 'active-id', - Gio.SettingsBindFlags.DEFAULT); - - dialog.connect('response', (dialog, id) => { - if (id == 1) { - // restore default settings for the relevant keys - let keys = ['shift-click-action', 'middle-click-action', 'shift-middle-click-action']; - keys.forEach(function (val) { - this._settings.set_value(val, this._settings.get_default_value(val)); - }, this); - this._builder.get_object('shift_click_action_combo').set_active(this._settings.get_enum('shift-click-action')); - this._builder.get_object('middle_click_action_combo').set_active(this._settings.get_enum('middle-click-action')); - this._builder.get_object('shift_middle_click_action_combo').set_active(this._settings.get_enum('shift-middle-click-action')); - } else { - // remove the settings box so it doesn't get destroyed; - dialog.get_content_area().remove(box); - dialog.destroy(); - } - return; - }); - - dialog.present(); - - }); - - // Appearance Panel - - this._settings.bind('apply-custom-theme', this._builder.get_object('customize_theme'), 'sensitive', Gio.SettingsBindFlags.INVERT_BOOLEAN | Gio.SettingsBindFlags.GET); - this._settings.bind('apply-custom-theme', this._builder.get_object('builtin_theme_switch'), 'active', Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('custom-theme-shrink', this._builder.get_object('shrink_dash_switch'), 'active', Gio.SettingsBindFlags.DEFAULT); - - // Running indicators - this._builder.get_object('running_indicators_combo').set_active( - this._settings.get_enum('running-indicator-style') - ); - this._builder.get_object('running_indicators_combo').connect( - 'changed', - (widget) => { - this._settings.set_enum('running-indicator-style', widget.get_active()); - } - ); - - if (this._settings.get_enum('running-indicator-style') == RunningIndicatorStyle.DEFAULT) - this._builder.get_object('running_indicators_advance_settings_button').set_sensitive(false); - - this._settings.connect('changed::running-indicator-style', () => { - if (this._settings.get_enum('running-indicator-style') == RunningIndicatorStyle.DEFAULT) - this._builder.get_object('running_indicators_advance_settings_button').set_sensitive(false); - else - this._builder.get_object('running_indicators_advance_settings_button').set_sensitive(true); - }); - - // Create dialog for running indicators advanced settings - this._builder.get_object('running_indicators_advance_settings_button').connect('clicked', () => { - - let dialog = new Gtk.Dialog({ - title: __('Customize running indicators'), - transient_for: this.widget.get_root(), - use_header_bar: true, - modal: true - }); - - let box = this._builder.get_object('running_dots_advance_settings_box'); - dialog.get_content_area().append(box); - - this._settings.bind('running-indicator-dominant-color', - this._builder.get_object('dominant_color_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - - this._settings.bind('custom-theme-customize-running-dots', - this._builder.get_object('dot_style_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('custom-theme-customize-running-dots', - this._builder.get_object('dot_style_settings_box'), - 'sensitive', Gio.SettingsBindFlags.DEFAULT); - - let rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('custom-theme-running-dots-color')); - this._builder.get_object('dot_color_colorbutton').set_rgba(rgba); - - this._builder.get_object('dot_color_colorbutton').connect('notify::rgba', (button) => { - let css = button.rgba.to_string(); - - this._settings.set_string('custom-theme-running-dots-color', css); - }); - - rgba.parse(this._settings.get_string('custom-theme-running-dots-border-color')); - this._builder.get_object('dot_border_color_colorbutton').set_rgba(rgba); - - this._builder.get_object('dot_border_color_colorbutton').connect('notify::rgba', (button) => { - let css = button.rgba.to_string(); - - this._settings.set_string('custom-theme-running-dots-border-color', css); - }); - - this._settings.bind('custom-theme-running-dots-border-width', - this._builder.get_object('dot_border_width_spin_button'), - 'value', - Gio.SettingsBindFlags.DEFAULT); - - - dialog.connect('response', (dialog, id) => { - // remove the settings box so it doesn't get destroyed; - dialog.get_content_area().remove(box); - dialog.destroy(); - return; - }); - - dialog.present(); - - }); - - this._settings.bind('custom-background-color', this._builder.get_object('custom_background_color_switch'), 'active', Gio.SettingsBindFlags.DEFAULT); - this._settings.bind('custom-background-color', this._builder.get_object('custom_background_color'), 'sensitive', Gio.SettingsBindFlags.DEFAULT); - - let rgba = new Gdk.RGBA(); - rgba.parse(this._settings.get_string('background-color')); - this._builder.get_object('custom_background_color').set_rgba(rgba); - - this._builder.get_object('custom_background_color').connect('notify::rgba', (button) => { - let css = button.rgba.to_string(); - - this._settings.set_string('background-color', css); - }); - - // Opacity - this._builder.get_object('customize_opacity_combo').set_active_id( - this._settings.get_enum('transparency-mode').toString() - ); - this._builder.get_object('customize_opacity_combo').connect( - 'changed', - (widget) => { - this._settings.set_enum('transparency-mode', parseInt(widget.get_active_id())); - } - ); - - const custom_opacity_scale = this._builder.get_object('custom_opacity_scale'); - custom_opacity_scale.set_value(this._settings.get_double('background-opacity')); - custom_opacity_scale.set_format_value_func((_, value) => { - return Math.round(value * 100) + '%'; - }); - - if (this._settings.get_enum('transparency-mode') !== TransparencyMode.FIXED) - this._builder.get_object('custom_opacity_scale').set_sensitive(false); - - this._settings.connect('changed::transparency-mode', () => { - if (this._settings.get_enum('transparency-mode') !== TransparencyMode.FIXED) - this._builder.get_object('custom_opacity_scale').set_sensitive(false); - else - this._builder.get_object('custom_opacity_scale').set_sensitive(true); - }); - - if (this._settings.get_enum('transparency-mode') !== TransparencyMode.DYNAMIC) { - this._builder.get_object('dynamic_opacity_button').set_sensitive(false); - } - - this._settings.connect('changed::transparency-mode', () => { - if (this._settings.get_enum('transparency-mode') !== TransparencyMode.DYNAMIC) { - this._builder.get_object('dynamic_opacity_button').set_sensitive(false); - } - else { - this._builder.get_object('dynamic_opacity_button').set_sensitive(true); - } - }); - - // Create dialog for transparency advanced settings - this._builder.get_object('dynamic_opacity_button').connect('clicked', () => { - - let dialog = new Gtk.Dialog({ - title: __('Customize opacity'), - transient_for: this.widget.get_root(), - use_header_bar: true, - modal: true - }); - - let box = this._builder.get_object('advanced_transparency_dialog'); - dialog.get_content_area().append(box); - - this._settings.bind( - 'customize-alphas', - this._builder.get_object('customize_alphas_switch'), - 'active', - Gio.SettingsBindFlags.DEFAULT - ); - this._settings.bind( - 'customize-alphas', - this._builder.get_object('min_alpha_scale'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT - ); - this._settings.bind( - 'customize-alphas', - this._builder.get_object('max_alpha_scale'), - 'sensitive', - Gio.SettingsBindFlags.DEFAULT - ); - - const min_alpha_scale = this._builder.get_object('min_alpha_scale'); - const max_alpha_scale = this._builder.get_object('max_alpha_scale'); - min_alpha_scale.set_value( - this._settings.get_double('min-alpha') - ); - min_alpha_scale.set_format_value_func((_, value) => { - return Math.round(value * 100) + ' %'; - }); - max_alpha_scale.set_format_value_func((_, value) => { - return Math.round(value * 100) + ' %'; - }); - - max_alpha_scale.set_value( - this._settings.get_double('max-alpha') - ); - - dialog.connect('response', (dialog, id) => { - // remove the settings box so it doesn't get destroyed; - dialog.get_content_area().remove(box); - dialog.destroy(); - return; - }); - - dialog.present(); - }); - - - this._settings.bind('unity-backlit-items', - this._builder.get_object('unity_backlit_items_switch'), - 'active', Gio.SettingsBindFlags.DEFAULT - ); - - this._settings.bind('force-straight-corner', - this._builder.get_object('force_straight_corner_switch'), - 'active', Gio.SettingsBindFlags.DEFAULT); - - // About Panel - - this._builder.get_object('extension_version').set_label(Me.metadata.version.toString()); - } -}); - -function init() { - ExtensionUtils.initTranslations(); -} - -function buildPrefsWidget() { - let settings = new Settings(); - let widget = settings.widget; - if (widget.show_all) widget.show_all(); - return widget; -} diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/schemas/gschemas.compiled b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/schemas/gschemas.compiled deleted file mode 100644 index e39b0671708a77948fac6681be6e9ce1a83c06e4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7277 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 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 'BOTTOM' - Dock position - Dock is shown on the Left, Right, Top or Bottom side of the screen. - - - 0.2 - Animation time - Sets the time duration of the autohide effect. - - - 0.25 - Show delay - Sets the delay after the mouse reaches the screen border before showing the dock. - - - 0.20 - Show delay - Sets the delay after the mouse left the dock before hiding it. - - - false - Set a custom dash background background color - Sets the color for the dash background. - - - "#ffffff" - Dash background color. - Customize the background color of the dash. - - - 'DEFAULT' - Transparency mode for the dock - FIXED: constant transparency. DYNAMIC: dock takes the opaque style only when windows are close to it. - - - 'DEFAULT' - ... - DEFAULT: .... DOTS: .... - - - false - Use application icon dominant color for the indicator color - - - - false - Manually set the min and max opacity - For the dynamic mode, the min/max opacity values will be given by 'min-alpha' and 'max-alpha'. - - - 0.2 - Opacity of the dash background when free-floating - Sets the opacity of the dash background when no windows are close. - - - 0.8 - Opacity of the dash background when windows are close. - Sets the opacity of the dash background when windows are close. - - - 0.8 - Opacity of the dash background - Sets the opacity of the dash background when in autohide mode. - - - true - Dock dodges windows - Enable or disable intellihide mode - - - 'FOCUS_APPLICATION_WINDOWS' - Define which windows are considered for intellihide. - - - - true - Dock shown on mouse over - Enable or disable autohide mode - - - true - Require pressure to show dash - Enable or disable requiring pressure to show the dash - - - 100 - Pressure threshold - Sets how much pressure is needed to show the dash. - - - false - Enable autohide in fullscreen mode. - Enable autohide in fullscreen mode. - - - false - Dock always visible - Dock is always visible - - - true - Switch workspace by scrolling over the dock - Add the possibility to switch workspace by mouse scrolling over the dock. - - - 48 - Maximum dash icon size - Set the allowed maximum dash icon size. Allowed range: 16..64. - - - false - Fixed icon size - Keep the icon size fived by scrolling the dock. - - - false - Apply custom theme - Apply customization to the dash appearance - - - false - TODO - TODO - - - false - Customize the style of the running application indicators. - Customize the style of the running application indicators. - - - "#ffffff" - Running application indicators color - Customize the color of the running application indicators. - - - "#ffffff" - Running application indicators border color. - Customize the border color of the running application indicators. - - - 0 - Running application indicators border width. - Customize the border width of the running application indicators. - - - true - Show running apps - Show or hide running applications icons in the dash - - - false - Provide workspace isolation - Dash shows only windows from the currentworkspace - - - false - Provide monitor isolation - Dash shows only windows from the monitor - - - true - Show preview of the open windows - Replace open windows list with windows previews - - - true - Show favorites apps - Show or hide favorite applications icons in the dash - - - true - Show trash can - Show or hide the trash can icon in the dash - - - true - Show mounted volumes and devices - Show or hide mounted volume and device icons in the dash - - - true - Show applications button - Show applications button in the dash - - - false - Show application button on the left - Show application button on the left of the dash - - - true - Animate Show Applications from the desktop - Animate Show Applications from the desktop - - - true - Basic compatibility with bolt extensions - Make the extension work properly when bolt extensions is enabled - - - 0.90 - Dock max height (fraction of available space) - - - false - Extend the dock container to all the available height - - - -1 - Monitor on which putting the dock - Set on which monitor to put the dock, use -1 for the primary one - - - false - Enable multi-monitor docks - Show a dock on every monitor - - - true - Minimize on shift+click - - - true - Activate only one window - - - 'cycle-windows' - Action when clicking on a running app - Set the action that is executed when clicking on the icon of a running application - - - 'do-nothing' - Action when scrolling app - Set the action that is executed when scrolling on the application icon - - - 'minimize' - Action when shift+clicking on a running app - Set the action that is executed when shift+clicking on the icon of a running application - - - 'launch' - Action when clicking on a running app - Set the action that is executed when middle-clicking on the icon of a running application - - - 'launch' - Action when clicking on a running app - Set the action that is executed when shift+middle-clicking on the icon of a running application - - - true - Super Hot-Keys - Launch and switch between dash items using Super+(0-9) - - - true - Show the dock when using the hotkeys - The dock will be quickly shown so that the number-overlay is visible and app activation is easier - - - "<Super>q" - Keybinding to show the dock and the number overlay. - Behavior depends on hotkeys-show-dock and hotkeys-overlay. - - - q']]]> - Keybinding to show the dock and the number overlay. - Behavior depends on hotkeys-show-dock and hotkeys-overlay. - - - 2 - Timeout to hide the dock - Sets the time duration before the dock is hidden again. - - - true - Show the dock when using the hotkeys - The dock will be quickly shown so that the number-overlay is visible and app activation is easier - - - 1']]]> - Keybinding to launch 1st dash app - - Keybinding to launch 1st app. - - - - 2']]]> - Keybinding to launch 2nd dash app - - Keybinding to launch 2nd app. - - - - 3']]]> - Keybinding to launch 3rd dash app - - Keybinding to launch 3rd app. - - - - 4']]]> - Keybinding to launch 4th dash app - - Keybinding to launch 4th app. - - - - 5']]]> - Keybinding to launch 5th dash app - - Keybinding to launch 5th app. - - - - 6']]]> - Keybinding to launch 6th dash app - - Keybinding to launch 6th app. - - - - 7']]]> - Keybinding to launch 7th dash app - - Keybinding to launch 7th app. - - - - 8']]]> - Keybinding to launch 8th dash app - - Keybinding to launch 8th app. - - - - 9']]]> - Keybinding to launch 9th dash app - - Keybinding to launch 9th app. - - - - 0']]]> - Keybinding to launch 10th dash app - - Keybinding to launch 10th app. - - - - 1']]]> - Keybinding to trigger 1st dash app with shift behavior - - Keybinding to trigger 1st app with shift behavior. - - - - 2']]]> - Keybinding to trigger 2nd dash app with shift behavior - - Keybinding to trigger 2nd app with shift behavior. - - - - 3']]]> - Keybinding to trigger 3rd dash app with shift behavior - - Keybinding to trigger 3rd app with shift behavior. - - - - 4']]]> - Keybinding to trigger 4th dash app with shift behavior - - Keybinding to trigger 4th app with shift behavior. - - - - 5']]]> - Keybinding to trigger 5th dash app with shift behavior - - Keybinding to trigger 5th app with shift behavior. - - - - 6']]]> - Keybinding to trigger 6th dash app with shift behavior - - Keybinding to trigger 6th app with shift behavior. - - - - 7']]]> - Keybinding to trigger 7th dash app with shift behavior - - Keybinding to trigger 7th app with shift behavior. - - - - 8']]]> - Keybinding to trigger 8th dash app with shift behavior - - Keybinding to trigger 8th app with shift behavior. - - - - 9']]]> - Keybinding to trigger 9th dash app with shift behavior - - Keybinding to trigger 9th app with shift behavior. - - - - 0']]]> - Keybinding to trigger 10th dash app with shift behavior - - Keybinding to trigger 10th app with shift behavior. - - - - 1']]]> - Keybinding to trigger 1st dash app - - Keybinding to either show or launch the 1st application in the dash. - - - - 2']]]> - Keybinding to trigger 2nd dash app - - Keybinding to either show or launch the 2nd application in the dash. - - - - 3']]]> - Keybinding to trigger 3rd dash app - - Keybinding to either show or launch the 3rd application in the dash. - - - - 4']]]> - Keybinding to trigger 4th dash app - - Keybinding to either show or launch the 4th application in the dash. - - - - 5']]]> - Keybinding to trigger 5th dash app - - Keybinding to either show or launch the 5th application in the dash. - - - - 6']]]> - Keybinding to trigger 6th dash app - - Keybinding to either show or launch the 6th application in the dash. - - - - 7']]]> - Keybinding to trigger 7th dash app - - Keybinding to either show or launch the 7th application in the dash. - - - - 8']]]> - Keybinding to trigger 8th dash app - - Keybinding to either show or launch the 8th application in the dash. - - - - 9']]]> - Keybinding to trigger 9th dash app - - Keybinding to either show or launch the 9th application in the dash. - - - - 0']]]> - Keybinding to trigger 10th dash app - - Keybinding to either show or launch the 10th application in the dash. - - - - false - Force straight corners in dash - Make the borders in the dash non rounded - - - false - Enable unity7 like glossy backlit items - Emulate the unity7 backlit glossy items behaviour - - - diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/stylesheet.css b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/stylesheet.css deleted file mode 100644 index 9a427f2..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/stylesheet.css +++ /dev/null @@ -1,231 +0,0 @@ -/* Shrink the dash by reducing padding */ -#dashtodockContainer.bottom.shrink #dash .dash-background { - border: 1px; - padding: 2.5px; - border-bottom: 0px; } - -#dashtodockContainer.bottom.shrink #dash .dash-item-container .app-well-app, -#dashtodockContainer.bottom.shrink #dash .dash-item-container .show-apps { - padding: 2.5px; } - -#dashtodockContainer.bottom.extended #dash { - margin-top: 0; - margin-bottom: 0; } - -#dashtodockContainer.top.shrink #dash .dash-background { - border: 1px; - padding: 2.5px; - border-top: 0px; } - -#dashtodockContainer.top.shrink #dash .dash-item-container .app-well-app, -#dashtodockContainer.top.shrink #dash .dash-item-container .show-apps { - padding: 2.5px; } - -#dashtodockContainer.top.extended #dash { - margin-top: 0; - margin-bottom: 0; } - -#dashtodockContainer.left.shrink #dash .dash-background { - border: 1px; - padding: 2.5px; - border-left: 0px; } - -#dashtodockContainer.left.shrink #dash .dash-item-container .app-well-app, -#dashtodockContainer.left.shrink #dash .dash-item-container .show-apps { - padding: 2.5px; } - -#dashtodockContainer.left.extended #dash { - margin-top: 0; - margin-bottom: 0; } - -#dashtodockContainer.right.shrink #dash .dash-background { - border: 1px; - padding: 2.5px; - border-right: 0px; } - -#dashtodockContainer.right.shrink #dash .dash-item-container .app-well-app, -#dashtodockContainer.right.shrink #dash .dash-item-container .show-apps { - padding: 2.5px; } - -#dashtodockContainer.right.extended #dash { - margin-top: 0; - margin-bottom: 0; } - -#dashtodockContainer.bottom.shrink #dash .dash-background { - margin-top: 0; - margin-bottom: 4px; } - -#dashtodockContainer.straight-corner #dash .dash-background, -#dashtodockContainer.shrink.straight-corner #dash .dash-background { - border-radius: 0px; } - -/* Scrollview style */ -.bottom #dashtodockDashScrollview, -.top #dashtodockDashScrollview { - -st-hfade-offset: 24px; } - -.left #dashtodockDashScrollview, -.right #dashtodockDashScrollview { - -st-vfade-offset: 24px; } - -#dashtodockContainer.running-dots .dash-item-container > StButton, -#dashtodockContainer.dashtodock .dash-item-container > StButton { - transition-duration: 250; - background-size: contain; } - -#dashtodockContainer #dash .dash-separator { - margin-bottom: 0; } - -#dashtodockContainer #dash .vertical-dash-separator { - height: 1px; - margin: 6.5px 0; - background-color: rgba(238, 238, 236, 0.3); } - -#dashtodockContainer.bottom #dash { - margin-top: 0; } - #dashtodockContainer.bottom #dash .dash-background { - margin-bottom: 8px; } - #dashtodockContainer.bottom #dash .dash-item-container .app-well-app, - #dashtodockContainer.bottom #dash .dash-item-container .show-apps { - padding: 10px 1.5px 18px; } - -#dashtodockContainer.bottom.overview #dash { - margin-top: 12px; } - -#dashtodockContainer.bottom.extended #dash .dash-background, #dashtodockContainer.bottom.shrink #dash .dash-background { - margin-bottom: 0; } - -#dashtodockContainer.bottom.extended #dash .dash-item-container .app-well-app, -#dashtodockContainer.bottom.extended #dash .dash-item-container .show-apps { - padding-bottom: 10px; } - -#dashtodockContainer.bottom.shrink #dash .dash-item-container .app-well-app, -#dashtodockContainer.bottom.shrink #dash .dash-item-container .show-apps { - padding-bottom: 2.5px; } - -#dashtodockContainer.left #dash, -#dashtodockContainer.right #dash { - padding-left: 4px; - padding-right: 4px; } - #dashtodockContainer.left #dash .dash-item-container .app-well-app, - #dashtodockContainer.left #dash .dash-item-container .show-apps, - #dashtodockContainer.right #dash .dash-item-container .app-well-app, - #dashtodockContainer.right #dash .dash-item-container .show-apps { - /* In vertical we don't want to add additional padding below the button. */ - padding-bottom: 6px; - padding-top: 6px; } - -#dashtodockContainer.left.shrink #dash, -#dashtodockContainer.right.shrink #dash { - padding-left: 0; - padding-right: 0; } - -#dashtodockContainer.top #dash { - margin-bottom: 0px; } - -/* Dash height extended to the whole available vertical space */ -#dashtodockContainer.extended.left #dash, #dashtodockContainer.extended.right #dash, #dashtodockContainer.extended.top #dash, #dashtodockContainer.extended.bottom #dash { - padding-top: 0; - padding-bottom: 0; - padding-left: 0; - padding-right: 0; } - #dashtodockContainer.extended.left #dash .dash-background, #dashtodockContainer.extended.right #dash .dash-background, #dashtodockContainer.extended.top #dash .dash-background, #dashtodockContainer.extended.bottom #dash .dash-background { - border-radius: 0; } - -#dashtodockContainer.extended.top #dash, #dashtodockContainer.extended.bottom #dash { - border-left: 0px; - border-right: 0px; } - #dashtodockContainer.extended.top #dash .dash-background, #dashtodockContainer.extended.bottom #dash .dash-background { - padding-left: 0; - padding-right: 0; } - -#dashtodockContainer.extended.left #dash, #dashtodockContainer.extended.right #dash { - border-top: 0px; - border-bottom: 0px; } - -/* Running and focused application style */ -#dashtodockContainer.running-dots .app-well-app.running > .overview-icon, -#dashtodockContainer.dashtodock .app-well-app.running > .overview-icon { - background-image: none; } - -#dashtodockContainer.running-dots .app-well-app.focused .overview-icon, -#dashtodockContainer.dashtodock .app-well-app.focused .overview-icon { - background-color: rgba(238, 238, 236, 0.2); } - -#dashtodockContainer.dashtodock #dash .dash-background { - background: #2e3436; } - -#dashtodockContainer.dashtodock .progress-bar { - /* Customization of the progress bar style, e.g.: - -progress-bar-background: rgba(0.8, 0.8, 0.8, 1); - -progress-bar-border: rgba(0.9, 0.9, 0.9, 1); - */ } - -#dashtodockContainer.top #dash .placeholder, -#dashtodockContainer.bottom #dash .placeholder { - width: 32px; - height: 1px; } - -/* - * This is applied to a dummy actor. Only the alpha value for the background and border color - * and the transition-duration are used - */ -#dashtodockContainer.dummy-opaque { - background-color: rgba(0, 0, 0, 0.8); - border-color: rgba(0, 0, 0, 0.4); - transition-duration: 300ms; } - -/* - * This is applied to a dummy actor. Only the alpha value for the background and border color - * and the transition-duration are used - */ -#dashtodockContainer.dummy-transparent { - background-color: rgba(0, 0, 0, 0.2); - border-color: rgba(0, 0, 0, 0.1); - transition-duration: 500ms; } - -#dashtodockContainer .number-overlay { - color: white; - background-color: rgba(0, 0, 0, 0.8); - text-align: center; } - -#dashtodockContainer .notification-badge { - color: white; - background-color: red; - padding: 0.2em 0.5em; - border-radius: 1em; - font-weight: bold; - text-align: center; - margin: 2px; } - -#dashtodockPreviewSeparator.popup-separator-menu-item-horizontal { - width: 1px; - height: auto; - border-right-width: 1px; - margin: 32px 0px; } - -.dashtodock-app-well-preview-menu-item { - padding: 1em 1em 0.5em 1em; } - -#dashtodockContainer .metro .overview-icon { - border-radius: 0px; } - -#dashtodockContainer.bottom .metro.running2.focused, -#dashtodockContainer.bottom .metro.running3.focused, -#dashtodockContainer.bottom .metro.running4.focused, -#dashtodockContainer.top .metro.running2.focused, -#dashtodockContainer.top .metro.running3.focused, -#dashtodockContainer.top .metro.running4.focused { - background-image: url("./media/highlight_stacked_bg.svg"); - background-position: 0px 0px; - background-size: contain; } - -#dashtodockContainer.left .metro.running2.focused, -#dashtodockContainer.left .metro.running3.focused, -#dashtodockContainer.left .metro.running4.focused, -#dashtodockContainer.right .metro.running2.focused, -#dashtodockContainer.right .metro.running3.focused, -#dashtodockContainer.right .metro.running4.focused { - background-image: url("./media/highlight_stacked_bg_h.svg"); - background-position: 0px 0px; - background-size: contain; } diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/theming.js b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/theming.js deleted file mode 100644 index 4b9e10a..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/theming.js +++ /dev/null @@ -1,553 +0,0 @@ -// -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*- - -const Gio = imports.gi.Gio; -const GLib = imports.gi.GLib; -const Signals = imports.signals; -const Meta = imports.gi.Meta; -const Shell = imports.gi.Shell; -const St = imports.gi.St; -const Clutter = imports.gi.Clutter; - -const AppDisplay = imports.ui.appDisplay; -const AppFavorites = imports.ui.appFavorites; -const Dash = imports.ui.dash; -const DND = imports.ui.dnd; -const IconGrid = imports.ui.iconGrid; -const Main = imports.ui.main; -const PopupMenu = imports.ui.popupMenu; -const Util = imports.misc.util; -const Workspace = imports.ui.workspace; - -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Docking = Me.imports.docking; -const Utils = Me.imports.utils; - -/* - * DEFAULT: transparency given by theme - * FIXED: constant transparency chosen by user - * DYNAMIC: apply 'transparent' style when no windows are close to the dock - * */ -const TransparencyMode = { - DEFAULT: 0, - FIXED: 1, - DYNAMIC: 3 -}; - -/** - * Manage theme customization and custom theme support - */ -var ThemeManager = class DashToDock_ThemeManager { - - constructor(dock) { - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this._bindSettingsChanges(); - this._actor = dock; - this._dash = dock.dash; - - // initialize colors with generic values - this._customizedBackground = {red: 0, green: 0, blue: 0, alpha: 0}; - this._customizedBorder = {red: 0, green: 0, blue: 0, alpha: 0}; - this._transparency = new Transparency(dock); - - this._signalsHandler.add([ - // When theme changes re-obtain default background color - St.ThemeContext.get_for_stage (global.stage), - 'changed', - this.updateCustomTheme.bind(this) - ], [ - // update :overview pseudoclass - Main.overview, - 'showing', - this._onOverviewShowing.bind(this) - ], [ - Main.overview, - 'hiding', - this._onOverviewHiding.bind(this) - ]); - - this._updateCustomStyleClasses(); - - // destroy themeManager when the managed actor is destroyed (e.g. extension unload) - // in order to disconnect signals - this._actor.connect('destroy', this.destroy.bind(this)); - - } - - destroy() { - this._signalsHandler.destroy(); - this._transparency.destroy(); - } - - _onOverviewShowing() { - this._actor.add_style_pseudo_class('overview'); - } - - _onOverviewHiding() { - this._actor.remove_style_pseudo_class('overview'); - } - - _updateDashOpacity() { - let newAlpha = Docking.DockManager.settings.get_double('background-opacity'); - - let [backgroundColor, borderColor] = this._getDefaultColors(); - - if (backgroundColor==null) - return; - - // Get the background and border alphas. We check the background alpha - // for a minimum of .001 to prevent division by 0 errors - let backgroundAlpha = Math.max(Math.round(backgroundColor.alpha/2.55)/100, .001); - let borderAlpha = Math.round(borderColor.alpha/2.55)/100; - - // The border and background alphas should remain in sync - // We also limit the borderAlpha to a maximum of 1 (full opacity) - borderAlpha = Math.min((borderAlpha/backgroundAlpha)*newAlpha, 1); - - this._customizedBackground = 'rgba(' + - backgroundColor.red + ',' + - backgroundColor.green + ',' + - backgroundColor.blue + ',' + - newAlpha + ')'; - - this._customizedBorder = 'rgba(' + - borderColor.red + ',' + - borderColor.green + ',' + - borderColor.blue + ',' + - borderAlpha + ')'; - - } - - _getDefaultColors() { - // Prevent shell crash if the actor is not on the stage. - // It happens enabling/disabling repeatedly the extension - if (!this._dash._container.get_stage()) - return [null, null]; - - // Remove custom style - let oldStyle = this._dash._container.get_style(); - this._dash._container.set_style(null); - - let themeNode = this._dash._container.get_theme_node(); - this._dash._container.set_style(oldStyle); - - let backgroundColor = themeNode.get_background_color(); - - // Just in case the theme has different border colors .. - // We want to find the inside border-color of the dock because it is - // the side most visible to the user. We do this by finding the side - // opposite the position - let position = Utils.getPosition(); - let side = position + 2; - if (side > 3) - side = Math.abs(side - 4); - - let borderColor = themeNode.get_border_color(side); - - return [backgroundColor, borderColor]; - } - - _updateDashColor() { - // Retrieve the color. If needed we will adjust it before passing it to - // this._transparency. - let [backgroundColor, borderColor] = this._getDefaultColors(); - - if (backgroundColor==null) - return; - - let settings = Docking.DockManager.settings; - - if (settings.get_boolean('custom-background-color')) { - // When applying a custom color, we need to check the alpha value, - // if not the opacity will always be overridden by the color below. - // Note that if using 'dynamic' transparency modes, - // the opacity will be set by the opaque/transparent styles anyway. - let newAlpha = Math.round(backgroundColor.alpha/2.55)/100; - if (settings.get_enum('transparency-mode') == TransparencyMode.FIXED) - newAlpha = settings.get_double('background-opacity'); - - backgroundColor = settings.get_string('background-color'); - - this._customizedBackground = backgroundColor; - - this._customizedBorder = this._customizedBackground; - - // backgroundColor is a string like rgb(0,0,0) - const color = Clutter.Color.from_string(backgroundColor); - color.alpha = newAlpha; - - this._transparency.setColor(color); - } else { - // backgroundColor is a Clutter.Color object - this._transparency.setColor(backgroundColor); - } - } - - _updateCustomStyleClasses() { - let settings = Docking.DockManager.settings; - - if (settings.get_boolean('apply-custom-theme')) - this._actor.add_style_class_name('dashtodock'); - else - this._actor.remove_style_class_name('dashtodock'); - - if (settings.get_boolean('custom-theme-shrink')) - this._actor.add_style_class_name('shrink'); - else - this._actor.remove_style_class_name('shrink'); - - if (settings.get_enum('running-indicator-style') !== 0) - this._actor.add_style_class_name('running-dots'); - else - this._actor.remove_style_class_name('running-dots'); - - // If not the built-in theme option is not selected - if (!settings.get_boolean('apply-custom-theme')) { - if (settings.get_boolean('force-straight-corner')) - this._actor.add_style_class_name('straight-corner'); - else - this._actor.remove_style_class_name('straight-corner'); - } else { - this._actor.remove_style_class_name('straight-corner'); - } - } - - updateCustomTheme() { - this._updateCustomStyleClasses(); - this._updateDashOpacity(); - this._updateDashColor(); - this._adjustTheme(); - this._dash._redisplay(); - } - - /** - * Reimported back and adapted from atomdock - */ - _adjustTheme() { - // Prevent shell crash if the actor is not on the stage. - // It happens enabling/disabling repeatedly the extension - if (!this._dash._background.get_stage()) - return; - - let settings = Docking.DockManager.settings; - - // Remove prior style edits - this._dash._background.set_style(null); - this._transparency.disable(); - - // If built-in theme is enabled do nothing else - if (settings.get_boolean('apply-custom-theme')) - return; - - let newStyle = ''; - let position = Utils.getPosition(settings); - - // obtain theme border settings - let themeNode = this._dash._background.get_theme_node(); - let borderColor = themeNode.get_border_color(St.Side.TOP); - let borderWidth = themeNode.get_border_width(St.Side.TOP); - - // We're copying border and corner styles to left border and top-left - // corner, also removing bottom border and bottom-right corner styles - let borderInner = ''; - let borderMissingStyle = ''; - - if (this._rtl && (position != St.Side.RIGHT)) - borderMissingStyle = 'border-right: ' + borderWidth + 'px solid ' + - borderColor.to_string() + ';'; - else if (!this._rtl && (position != St.Side.LEFT)) - borderMissingStyle = 'border-left: ' + borderWidth + 'px solid ' + - borderColor.to_string() + ';'; - - newStyle = borderMissingStyle; - - // I do call set_style possibly twice so that only the background gets the transition. - // The transition-property css rules seems to be unsupported - this._dash._background.set_style(newStyle); - - // Customize background - let fixedTransparency = settings.get_enum('transparency-mode') == TransparencyMode.FIXED; - let defaultTransparency = settings.get_enum('transparency-mode') == TransparencyMode.DEFAULT; - if (!defaultTransparency && !fixedTransparency) { - this._transparency.enable(); - } - else if (!defaultTransparency || settings.get_boolean('custom-background-color')) { - newStyle = newStyle + 'background-color:'+ this._customizedBackground + '; ' + - 'border-color:'+ this._customizedBorder + '; ' + - 'transition-delay: 0s; transition-duration: 0.250s;'; - this._dash._background.set_style(newStyle); - } - } - - _bindSettingsChanges() { - let keys = ['transparency-mode', - 'customize-alphas', - 'min-alpha', - 'max-alpha', - 'background-opacity', - 'custom-background-color', - 'background-color', - 'apply-custom-theme', - 'custom-theme-shrink', - 'custom-theme-running-dots', - 'extend-height', - 'force-straight-corner']; - - keys.forEach(function(key) { - this._signalsHandler.add([ - Docking.DockManager.settings, - 'changed::' + key, - this.updateCustomTheme.bind(this) - ]); - }, this); - } -}; - -/** - * The following class is based on the following upstream commit: - * https://git.gnome.org/browse/gnome-shell/commit/?id=447bf55e45b00426ed908b1b1035f472c2466956 - * Transparency when free-floating - */ -var Transparency = class DashToDock_Transparency { - - constructor(dock) { - this._dash = dock.dash; - this._actor = this._dash._container; - this._backgroundActor = this._dash._background; - this._dockActor = dock; - this._dock = dock; - this._panel = Main.panel; - this._position = Utils.getPosition(); - - // All these properties are replaced with the ones in the .dummy-opaque and .dummy-transparent css classes - this._backgroundColor = '0,0,0'; - this._transparentAlpha = '0.2'; - this._opaqueAlpha = '1'; - this._transparentAlphaBorder = '0.1'; - this._opaqueAlphaBorder = '0.5'; - this._transparentTransition = '0ms'; - this._opaqueTransition = '0ms'; - this._base_actor_style = ""; - - this._signalsHandler = new Utils.GlobalSignalsHandler(); - this._injectionsHandler = new Utils.InjectionsHandler(); - this._trackedWindows = new Map(); - } - - enable() { - // ensure I never double-register/inject - // although it should never happen - this.disable(); - - this._base_actor_style = this._actor.get_style(); - if (this._base_actor_style == null) { - this._base_actor_style = ""; - } - - this._signalsHandler.addWithLabel('transparency', [ - global.window_group, - 'actor-added', - this._onWindowActorAdded.bind(this) - ], [ - global.window_group, - 'actor-removed', - this._onWindowActorRemoved.bind(this) - ], [ - global.window_manager, - 'switch-workspace', - this._updateSolidStyle.bind(this) - ], [ - Main.overview, - 'hiding', - this._updateSolidStyle.bind(this) - ], [ - Main.overview, - 'showing', - this._updateSolidStyle.bind(this) - ]); - - // Window signals - global.window_group.get_children().filter(function(child) { - // An irrelevant window actor ('Gnome-shell') produces an error when the signals are - // disconnected, therefore do not add signals to it. - return child instanceof Meta.WindowActor && - child.get_meta_window().get_wm_class() !== 'Gnome-shell'; - }).forEach(function(win) { - this._onWindowActorAdded(null, win); - }, this); - - if (this._actor.get_stage()) - this._updateSolidStyle(); - - this._updateStyles(); - this._updateSolidStyle(); - - this.emit('transparency-enabled'); - } - - disable() { - // ensure I never double-register/inject - // although it should never happen - this._signalsHandler.removeWithLabel('transparency'); - - for (let key of this._trackedWindows.keys()) - this._trackedWindows.get(key).forEach(id => { - key.disconnect(id); - }); - this._trackedWindows.clear(); - - this.emit('transparency-disabled'); - } - - destroy() { - this.disable(); - this._signalsHandler.destroy(); - this._injectionsHandler.destroy(); - } - - _onWindowActorAdded(container, metaWindowActor) { - let signalIds = []; - ['notify::allocation', 'notify::visible'].forEach(s => { - signalIds.push(metaWindowActor.connect(s, this._updateSolidStyle.bind(this))); - }); - this._trackedWindows.set(metaWindowActor, signalIds); - } - - _onWindowActorRemoved(container, metaWindowActor) { - if (!this._trackedWindows.get(metaWindowActor)) - return; - - this._trackedWindows.get(metaWindowActor).forEach(id => { - metaWindowActor.disconnect(id); - }); - this._trackedWindows.delete(metaWindowActor); - this._updateSolidStyle(); - } - - _updateSolidStyle() { - let isNear = this._dockIsNear(); - if (isNear) { - this._backgroundActor.set_style(this._opaque_style); - this._dockActor.remove_style_class_name('transparent'); - this._dockActor.add_style_class_name('opaque'); - } - else { - this._backgroundActor.set_style(this._transparent_style); - this._dockActor.remove_style_class_name('opaque'); - this._dockActor.add_style_class_name('transparent'); - } - - this.emit('solid-style-updated', isNear); - } - - _dockIsNear() { - if (this._dockActor.has_style_pseudo_class('overview')) - return false; - /* Get all the windows in the active workspace that are in the primary monitor and visible */ - let activeWorkspace = global.workspace_manager.get_active_workspace(); - let dash = this._dash; - let windows = activeWorkspace.list_windows().filter(function(metaWindow) { - return metaWindow.get_monitor() === dash._monitorIndex && - metaWindow.showing_on_its_workspace() && - metaWindow.get_window_type() != Meta.WindowType.DESKTOP; - }); - - /* Check if at least one window is near enough to the panel. - * If the dock is hidden, we need to account for the space it would take - * up when it slides out. This is avoid an ugly transition. - * */ - let factor = 0; - if (!Docking.DockManager.settings.get_boolean('dock-fixed') && - this._dock.getDockState() == Docking.State.HIDDEN) - factor = 1; - let [leftCoord, topCoord] = this._actor.get_transformed_position(); - let threshold; - if (this._position === St.Side.LEFT) - threshold = leftCoord + this._actor.get_width() * (factor + 1); - else if (this._position === St.Side.RIGHT) - threshold = leftCoord - this._actor.get_width() * factor; - else if (this._position === St.Side.TOP) - threshold = topCoord + this._actor.get_height() * (factor + 1); - else - threshold = topCoord - this._actor.get_height() * factor; - - let scale = St.ThemeContext.get_for_stage(global.stage).scale_factor; - let isNearEnough = windows.some((metaWindow) => { - let coord; - if (this._position === St.Side.LEFT) { - coord = metaWindow.get_frame_rect().x; - return coord < threshold + 5 * scale; - } - else if (this._position === St.Side.RIGHT) { - coord = metaWindow.get_frame_rect().x + metaWindow.get_frame_rect().width; - return coord > threshold - 5 * scale; - } - else if (this._position === St.Side.TOP) { - coord = metaWindow.get_frame_rect().y; - return coord < threshold + 5 * scale; - } - else { - coord = metaWindow.get_frame_rect().y + metaWindow.get_frame_rect().height; - return coord > threshold - 5 * scale; - } - }); - - return isNearEnough; - } - - _updateStyles() { - this._getAlphas(); - - this._transparent_style = this._base_actor_style + - 'background-color: rgba(' + - this._backgroundColor + ', ' + this._transparentAlpha + ');' + - 'border-color: rgba(' + - this._backgroundColor + ', ' + this._transparentAlphaBorder + ');' + - 'transition-duration: ' + this._transparentTransition + 'ms;'; - - this._opaque_style = this._base_actor_style + - 'background-color: rgba(' + - this._backgroundColor + ', ' + this._opaqueAlpha + ');' + - 'border-color: rgba(' + - this._backgroundColor + ',' + this._opaqueAlphaBorder + ');' + - 'transition-duration: ' + this._opaqueTransition + 'ms;'; - - this.emit('styles-updated'); - } - - setColor(color) { - this._backgroundColor = color.red + ',' + color.green + ',' + color.blue; - this._updateStyles(); - } - - _getAlphas() { - // Create dummy object and add to the uiGroup to get it to the stage - let dummyObject = new St.Bin({ - name: 'dashtodockContainer', - }); - Main.uiGroup.add_child(dummyObject); - - dummyObject.add_style_class_name('dummy-opaque'); - let themeNode = dummyObject.get_theme_node(); - this._opaqueAlpha = themeNode.get_background_color().alpha / 255; - this._opaqueAlphaBorder = themeNode.get_border_color(0).alpha / 255; - this._opaqueTransition = themeNode.get_transition_duration(); - - dummyObject.add_style_class_name('dummy-transparent'); - themeNode = dummyObject.get_theme_node(); - this._transparentAlpha = themeNode.get_background_color().alpha / 255; - this._transparentAlphaBorder = themeNode.get_border_color(0).alpha / 255; - this._transparentTransition = themeNode.get_transition_duration(); - - Main.uiGroup.remove_child(dummyObject); - - let settings = Docking.DockManager.settings; - - if (settings.get_boolean('customize-alphas')) { - this._opaqueAlpha = settings.get_double('max-alpha'); - this._opaqueAlphaBorder = this._opaqueAlpha / 2; - this._transparentAlpha = settings.get_double('min-alpha'); - this._transparentAlphaBorder = this._transparentAlpha / 2; - } - } -}; -Signals.addSignalMethods(Transparency.prototype); diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/utils.js b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/utils.js deleted file mode 100644 index 3dd8029..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/utils.js +++ /dev/null @@ -1,308 +0,0 @@ -const Clutter = imports.gi.Clutter; -const Meta = imports.gi.Meta; -const St = imports.gi.St; - -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Docking = Me.imports.docking; - -var SignalsHandlerFlags = { - NONE: 0, - CONNECT_AFTER: 1 -}; - -/** - * Simplify global signals and function injections handling - * abstract class - */ -const BasicHandler = class DashToDock_BasicHandler { - - constructor() { - this._storage = new Object(); - } - - add(/* unlimited 3-long array arguments */) { - // Convert arguments object to array, concatenate with generic - // Call addWithLabel with ags as if they were passed arguments - this.addWithLabel('generic', ...arguments); - } - - destroy() { - for( let label in this._storage ) - this.removeWithLabel(label); - } - - addWithLabel(label /* plus unlimited 3-long array arguments*/) { - if (this._storage[label] == undefined) - this._storage[label] = new Array(); - - // Skip first element of the arguments - for (let i = 1; i < arguments.length; i++) { - let item = this._storage[label]; - try { - item.push(this._create(arguments[i])); - } catch (e) { - logError(e); - } - } - } - - removeWithLabel(label) { - if (this._storage[label]) { - for (let i = 0; i < this._storage[label].length; i++) - this._remove(this._storage[label][i]); - - delete this._storage[label]; - } - } - - // Virtual methods to be implemented by subclass - - /** - * Create single element to be stored in the storage structure - */ - _create(item) { - throw new GObject.NotImplementedError(`_create in ${this.constructor.name}`); - } - - /** - * Correctly delete single element - */ - _remove(item) { - throw new GObject.NotImplementedError(`_remove in ${this.constructor.name}`); - } -}; - -/** - * Manage global signals - */ -var GlobalSignalsHandler = class DashToDock_GlobalSignalHandler extends BasicHandler { - - _create(item) { - let object = item[0]; - let event = item[1]; - let callback = item[2] - let flags = item.length > 3 ? item[3] : SignalsHandlerFlags.NONE; - - if (!object) - throw new Error('Impossible to connect to an invalid object'); - - let after = flags == SignalsHandlerFlags.CONNECT_AFTER; - let connector = after ? object.connect_after : object.connect; - - if (!connector) { - throw new Error(`Requested to connect to signal '${event}', ` + - `but no implementation for 'connect${after ? '_after' : ''}' `+ - `found in ${object.constructor.name}`); - } - - let id = connector.call(object, event, callback); - - return [object, id]; - } - - _remove(item) { - item[0].disconnect(item[1]); - } -}; - -/** - * Color manipulation utilities - */ -var ColorUtils = class DashToDock_ColorUtils { - - // Darken or brigthen color by a fraction dlum - // Each rgb value is modified by the same fraction. - // Return "#rrggbb" string - static ColorLuminance(r, g, b, dlum) { - let rgbString = '#'; - - rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(r*(1+dlum), 0), 255)), 2); - rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(g*(1+dlum), 0), 255)), 2); - rgbString += ColorUtils._decimalToHex(Math.round(Math.min(Math.max(b*(1+dlum), 0), 255)), 2); - - return rgbString; - } - - // Convert decimal to an hexadecimal string adding the desired padding - static _decimalToHex(d, padding) { - let hex = d.toString(16); - while (hex.length < padding) - hex = '0'+ hex; - return hex; - } - - // Convert hsv ([0-1, 0-1, 0-1]) to rgb ([0-255, 0-255, 0-255]). - // Following algorithm in https://en.wikipedia.org/wiki/HSL_and_HSV - // here with h = [0,1] instead of [0, 360] - // Accept either (h,s,v) independently or {h:h, s:s, v:v} object. - // Return {r:r, g:g, b:b} object. - static HSVtoRGB(h, s, v) { - if (arguments.length === 1) { - s = h.s; - v = h.v; - h = h.h; - } - - let r,g,b; - let c = v*s; - let h1 = h*6; - let x = c*(1 - Math.abs(h1 % 2 - 1)); - let m = v - c; - - if (h1 <=1) - r = c + m, g = x + m, b = m; - else if (h1 <=2) - r = x + m, g = c + m, b = m; - else if (h1 <=3) - r = m, g = c + m, b = x + m; - else if (h1 <=4) - r = m, g = x + m, b = c + m; - else if (h1 <=5) - r = x + m, g = m, b = c + m; - else - r = c + m, g = m, b = x + m; - - return { - r: Math.round(r * 255), - g: Math.round(g * 255), - b: Math.round(b * 255) - }; - } - - // Convert rgb ([0-255, 0-255, 0-255]) to hsv ([0-1, 0-1, 0-1]). - // Following algorithm in https://en.wikipedia.org/wiki/HSL_and_HSV - // here with h = [0,1] instead of [0, 360] - // Accept either (r,g,b) independently or {r:r, g:g, b:b} object. - // Return {h:h, s:s, v:v} object. - static RGBtoHSV(r, g, b) { - if (arguments.length === 1) { - r = r.r; - g = r.g; - b = r.b; - } - - let h,s,v; - - let M = Math.max(r, g, b); - let m = Math.min(r, g, b); - let c = M - m; - - if (c == 0) - h = 0; - else if (M == r) - h = ((g-b)/c) % 6; - else if (M == g) - h = (b-r)/c + 2; - else - h = (r-g)/c + 4; - - h = h/6; - v = M/255; - if (M !== 0) - s = c/M; - else - s = 0; - - return { - h: h, - s: s, - v: v - }; - } -}; - -/** - * Manage function injection: both instances and prototype can be overridden - * and restored - */ -var InjectionsHandler = class DashToDock_InjectionsHandler extends BasicHandler { - - _create(item) { - let object = item[0]; - let name = item[1]; - let injectedFunction = item[2]; - let original = object[name]; - - object[name] = injectedFunction; - return [object, name, injectedFunction, original]; - } - - _remove(item) { - let object = item[0]; - let name = item[1]; - let original = item[3]; - object[name] = original; - } -}; - -/** - * Return the actual position reverseing left and right in rtl - */ -function getPosition() { - let position = Docking.DockManager.settings.get_enum('dock-position'); - if (Clutter.get_default_text_direction() == Clutter.TextDirection.RTL) { - if (position == St.Side.LEFT) - position = St.Side.RIGHT; - else if (position == St.Side.RIGHT) - position = St.Side.LEFT; - } - return position; -} - -function drawRoundedLine(cr, x, y, width, height, isRoundLeft, isRoundRight, stroke, fill) { - if (height > width) { - y += Math.floor((height - width) / 2.0); - height = width; - } - - height = 2.0 * Math.floor(height / 2.0); - - var leftRadius = isRoundLeft ? height / 2.0 : 0.0; - var rightRadius = isRoundRight ? height / 2.0 : 0.0; - - cr.moveTo(x + width - rightRadius, y); - cr.lineTo(x + leftRadius, y); - if (isRoundLeft) - cr.arcNegative(x + leftRadius, y + leftRadius, leftRadius, -Math.PI/2, Math.PI/2); - else - cr.lineTo(x, y + height); - cr.lineTo(x + width - rightRadius, y + height); - if (isRoundRight) - cr.arcNegative(x + width - rightRadius, y + rightRadius, rightRadius, Math.PI/2, -Math.PI/2); - else - cr.lineTo(x + width, y); - cr.closePath(); - - if (fill != null) { - cr.setSource(fill); - cr.fillPreserve(); - } - if (stroke != null) - cr.setSource(stroke); - cr.stroke(); -} - -/** - * Convert a signal handler with n value parameters (that is, excluding the - * signal source parameter) to an array of n handlers that are each responsible - * for receiving one of the n values and calling the original handler with the - * most up-to-date arguments. - */ -function splitHandler(handler) { - if (handler.length > 30) { - throw new Error("too many parameters"); - } - const count = handler.length - 1; - let missingValueBits = (1 << count) - 1; - const values = Array.from({ length: count }); - return values.map((_ignored, i) => { - const mask = ~(1 << i); - return (obj, value) => { - values[i] = value; - missingValueBits &= mask; - if (missingValueBits === 0) { - handler(obj, ...values); - } - }; - }); -} diff --git a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/windowPreview.js b/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/windowPreview.js deleted file mode 100644 index 8cb14b8..0000000 --- a/src/other/dash-to-dock/dash-to-dock@micxgx.gmail.com/windowPreview.js +++ /dev/null @@ -1,598 +0,0 @@ -/* - * Credits: - * This file is based on code from the Dash to Panel extension by Jason DeRose - * and code from the Taskbar extension by Zorin OS - * Some code was also adapted from the upstream Gnome Shell source code. - */ -const Clutter = imports.gi.Clutter; -const GLib = imports.gi.GLib; -const GObject = imports.gi.GObject; -const St = imports.gi.St; -const Main = imports.ui.main; - -const Params = imports.misc.params; -const PopupMenu = imports.ui.popupMenu; -const Workspace = imports.ui.workspace; - -const Me = imports.misc.extensionUtils.getCurrentExtension(); -const Utils = Me.imports.utils; - -const PREVIEW_MAX_WIDTH = 250; -const PREVIEW_MAX_HEIGHT = 150; - -const PREVIEW_ANIMATION_DURATION = 250; - -var WindowPreviewMenu = class DashToDock_WindowPreviewMenu extends PopupMenu.PopupMenu { - - constructor(source) { - let side = Utils.getPosition(); - super(source, 0.5, side); - - // We want to keep the item hovered while the menu is up - this.blockSourceEvents = true; - - this._source = source; - this._app = this._source.app; - let monitorIndex = this._source.monitorIndex; - - this.actor.add_style_class_name('app-well-menu'); - this.actor.set_style('max-width: ' + (Main.layoutManager.monitors[monitorIndex].width - 22) + 'px; ' + - 'max-height: ' + (Main.layoutManager.monitors[monitorIndex].height - 22) + 'px;'); - this.actor.hide(); - - // Chain our visibility and lifecycle to that of the source - this._mappedId = this._source.connect('notify::mapped', () => { - if (!this._source.mapped) - this.close(); - }); - this._destroyId = this._source.connect('destroy', this.destroy.bind(this)); - - Main.uiGroup.add_actor(this.actor); - - // Change the initialized side where required. - this._arrowSide = side; - this._boxPointer._arrowSide = side; - this._boxPointer._userArrowSide = side; - - this.connect('destroy', this._onDestroy.bind(this)); - } - - _redisplay() { - if (this._previewBox) - this._previewBox.destroy(); - this._previewBox = new WindowPreviewList(this._source); - this.addMenuItem(this._previewBox); - this._previewBox._redisplay(); - } - - popup() { - let windows = this._source.getInterestingWindows(); - if (windows.length > 0) { - this._redisplay(); - this.open(); - this.actor.navigate_focus(null, St.DirectionType.TAB_FORWARD, false); - this._source.emit('sync-tooltip'); - } - } - - _onDestroy() { - if (this._mappedId) - this._source.disconnect(this._mappedId); - - if (this._destroyId) - this._source.disconnect(this._destroyId); - } -}; - -var WindowPreviewList = class DashToDock_WindowPreviewList extends PopupMenu.PopupMenuSection { - - constructor(source) { - super(); - this.actor = new St.ScrollView({ - name: 'dashtodockWindowScrollview', - hscrollbar_policy: St.PolicyType.NEVER, - vscrollbar_policy: St.PolicyType.NEVER, - enable_mouse_scrolling: true - }); - - this.actor.connect('scroll-event', this._onScrollEvent.bind(this)); - - let position = Utils.getPosition(); - this.isHorizontal = position == St.Side.BOTTOM || position == St.Side.TOP; - this.box.set_vertical(!this.isHorizontal); - this.box.set_name('dashtodockWindowList'); - this.actor.add_actor(this.box); - this.actor._delegate = this; - - this._shownInitially = false; - - this._source = source; - this.app = source.app; - - this._redisplayId = Main.initializeDeferredWork(this.actor, this._redisplay.bind(this)); - - this.actor.connect('destroy', this._onDestroy.bind(this)); - this._stateChangedId = this.app.connect('windows-changed', - this._queueRedisplay.bind(this)); - } - - _queueRedisplay () { - Main.queueDeferredWork(this._redisplayId); - } - - _onScrollEvent(actor, event) { - // Event coordinates are relative to the stage but can be transformed - // as the actor will only receive events within his bounds. - let stage_x, stage_y, ok, event_x, event_y, actor_w, actor_h; - [stage_x, stage_y] = event.get_coords(); - [ok, event_x, event_y] = actor.transform_stage_point(stage_x, stage_y); - [actor_w, actor_h] = actor.get_size(); - - // If the scroll event is within a 1px margin from - // the relevant edge of the actor, let the event propagate. - if (event_y >= actor_h - 2) - return Clutter.EVENT_PROPAGATE; - - // Skip to avoid double events mouse - if (event.is_pointer_emulated()) - return Clutter.EVENT_STOP; - - let adjustment, delta; - - if (this.isHorizontal) - adjustment = this.actor.get_hscroll_bar().get_adjustment(); - else - adjustment = this.actor.get_vscroll_bar().get_adjustment(); - - let increment = adjustment.step_increment; - - switch ( event.get_scroll_direction() ) { - case Clutter.ScrollDirection.UP: - delta = -increment; - break; - case Clutter.ScrollDirection.DOWN: - delta = +increment; - break; - case Clutter.ScrollDirection.SMOOTH: - let [dx, dy] = event.get_scroll_delta(); - delta = dy*increment; - delta += dx*increment; - break; - - } - - adjustment.set_value(adjustment.get_value() + delta); - - return Clutter.EVENT_STOP; - } - - _onDestroy() { - this.app.disconnect(this._stateChangedId); - this._stateChangedId = 0; - } - - _createPreviewItem(window) { - let preview = new WindowPreviewMenuItem(window); - return preview; - } - - _redisplay () { - let children = this._getMenuItems().filter(function(actor) { - return actor._window; - }); - - // Windows currently on the menu - let oldWin = children.map(function(actor) { - return actor._window; - }); - - // All app windows with a static order - let newWin = this._source.getInterestingWindows().sort(function(a, b) { - return a.get_stable_sequence() > b.get_stable_sequence(); - }); - - let addedItems = []; - let removedActors = []; - - let newIndex = 0; - let oldIndex = 0; - - while (newIndex < newWin.length || oldIndex < oldWin.length) { - // No change at oldIndex/newIndex - if (oldWin[oldIndex] && - oldWin[oldIndex] == newWin[newIndex]) { - oldIndex++; - newIndex++; - continue; - } - - // Window removed at oldIndex - if (oldWin[oldIndex] && - newWin.indexOf(oldWin[oldIndex]) == -1) { - removedActors.push(children[oldIndex]); - oldIndex++; - continue; - } - - // Window added at newIndex - if (newWin[newIndex] && - oldWin.indexOf(newWin[newIndex]) == -1) { - addedItems.push({ item: this._createPreviewItem(newWin[newIndex]), - pos: newIndex }); - newIndex++; - continue; - } - - // Window moved - let insertHere = newWin[newIndex + 1] && - newWin[newIndex + 1] == oldWin[oldIndex]; - let alreadyRemoved = removedActors.reduce(function(result, actor) { - let removedWin = actor._window; - return result || removedWin == newWin[newIndex]; - }, false); - - if (insertHere || alreadyRemoved) { - addedItems.push({ item: this._createPreviewItem(newWin[newIndex]), - pos: newIndex + removedActors.length }); - newIndex++; - } else { - removedActors.push(children[oldIndex]); - oldIndex++; - } - } - - for (let i = 0; i < addedItems.length; i++) - this.addMenuItem(addedItems[i].item, - addedItems[i].pos); - - for (let i = 0; i < removedActors.length; i++) { - let item = removedActors[i]; - if (this._shownInitially) - item._animateOutAndDestroy(); - else - item.actor.destroy(); - } - - // Skip animations on first run when adding the initial set - // of items, to avoid all items zooming in at once - let animate = this._shownInitially; - - if (!this._shownInitially) - this._shownInitially = true; - - for (let i = 0; i < addedItems.length; i++) - addedItems[i].item.show(animate); - - // Workaround for https://bugzilla.gnome.org/show_bug.cgi?id=692744 - // Without it, StBoxLayout may use a stale size cache - this.box.queue_relayout(); - - if (newWin.length < 1) - this._getTopMenu().close(~0); - - // As for upstream: - // St.ScrollView always requests space horizontally for a possible vertical - // scrollbar if in AUTOMATIC mode. Doing better would require implementation - // of width-for-height in St.BoxLayout and St.ScrollView. This looks bad - // when we *don't* need it, so turn off the scrollbar when that's true. - // Dynamic changes in whether we need it aren't handled properly. - let needsScrollbar = this._needsScrollbar(); - let scrollbar_policy = needsScrollbar ? - St.PolicyType.AUTOMATIC : St.PolicyType.NEVER; - if (this.isHorizontal) - this.actor.hscrollbar_policy = scrollbar_policy; - else - this.actor.vscrollbar_policy = scrollbar_policy; - - if (needsScrollbar) - this.actor.add_style_pseudo_class('scrolled'); - else - this.actor.remove_style_pseudo_class('scrolled'); - } - - _needsScrollbar() { - let topMenu = this._getTopMenu(); - let topThemeNode = topMenu.actor.get_theme_node(); - if (this.isHorizontal) { - let [topMinWidth, topNaturalWidth] = topMenu.actor.get_preferred_width(-1); - let topMaxWidth = topThemeNode.get_max_width(); - return topMaxWidth >= 0 && topNaturalWidth >= topMaxWidth; - } else { - let [topMinHeight, topNaturalHeight] = topMenu.actor.get_preferred_height(-1); - let topMaxHeight = topThemeNode.get_max_height(); - return topMaxHeight >= 0 && topNaturalHeight >= topMaxHeight; - } - - } - - isAnimatingOut() { - return this.actor.get_children().reduce(function(result, actor) { - return result || actor.animatingOut; - }, false); - } -}; - -var WindowPreviewMenuItem = GObject.registerClass( -class DashToDock_WindowPreviewMenuItem extends PopupMenu.PopupBaseMenuItem { - _init(window, params) { - super._init(params); - - this._window = window; - this._destroyId = 0; - this._windowAddedId = 0; - [this._width, this._height, this._scale] = this._getWindowPreviewSize(); // This gets the actual windows size for the preview - - // We don't want this: it adds spacing on the left of the item. - this.remove_child(this._ornamentLabel); - this.add_style_class_name('dashtodock-app-well-preview-menu-item'); - - // Now we don't have to set PREVIEW_MAX_WIDTH and PREVIEW_MAX_HEIGHT as preview size - that made all kinds of windows either stretched or squished (aspect ratio problem) - this._cloneBin = new St.Bin(); - this._cloneBin.set_size(this._width*this._scale, this._height*this._scale); - - // TODO: improve the way the closebutton is layout. Just use some padding - // for the moment. - this._cloneBin.set_style('padding-bottom: 0.5em'); - - this.closeButton = new St.Button({ style_class: 'window-close', - x_expand: true, - y_expand: true}); - this.closeButton.add_actor(new St.Icon({ icon_name: 'window-close-symbolic' })); - this.closeButton.set_x_align(Clutter.ActorAlign.END); - this.closeButton.set_y_align(Clutter.ActorAlign.START); - - - this.closeButton.opacity = 0; - this.closeButton.connect('clicked', this._closeWindow.bind(this)); - - let overlayGroup = new Clutter.Actor({layout_manager: new Clutter.BinLayout(), y_expand: true }); - - overlayGroup.add_actor(this._cloneBin); - overlayGroup.add_actor(this.closeButton); - - let label = new St.Label({ text: window.get_title()}); - label.set_style('max-width: '+PREVIEW_MAX_WIDTH +'px'); - let labelBin = new St.Bin({ child: label, - x_align: Clutter.ActorAlign.CENTER, - }); - - this._windowTitleId = this._window.connect('notify::title', () => { - label.set_text(this._window.get_title()); - }); - - let box = new St.BoxLayout({ vertical: true, - reactive:true, - x_expand:true }); - box.add(overlayGroup); - box.add(labelBin); - this.add_actor(box); - - this._cloneTexture(window); - - this.connect('destroy', this._onDestroy.bind(this)); - } - - _getWindowPreviewSize() { - let mutterWindow = this._window.get_compositor_private(); - let [width, height] = mutterWindow.get_size(); - let scale = Math.min(1.0, PREVIEW_MAX_WIDTH/width, PREVIEW_MAX_HEIGHT/height); - return [width, height, scale]; - } - - _cloneTexture(metaWin){ - - let mutterWindow = metaWin.get_compositor_private(); - - // Newly-created windows are added to a workspace before - // the compositor finds out about them... - // Moreover sometimes they return an empty texture, thus as a workarounf also check for it size - if (!mutterWindow || !mutterWindow.get_texture() || !mutterWindow.get_size()[0]) { - this._cloneTextureId = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { - // Check if there's still a point in getting the texture, - // otherwise this could go on indefinitely - if (metaWin.get_workspace()) - this._cloneTexture(metaWin); - this._cloneTextureId = 0; - return GLib.SOURCE_REMOVE; - }); - GLib.Source.set_name_by_id(this._cloneTextureId, '[dash-to-dock] this._cloneTexture'); - return; - } - - let clone = new Clutter.Clone ({ source: mutterWindow, - reactive: true, - width: this._width * this._scale, - height: this._height * this._scale }); - - // when the source actor is destroyed, i.e. the window closed, first destroy the clone - // and then destroy the menu item (do this animating out) - this._destroyId = mutterWindow.connect('destroy', () => { - clone.destroy(); - this._destroyId = 0; // avoid to try to disconnect this signal from mutterWindow in _onDestroy(), - // as the object was just destroyed - this._animateOutAndDestroy(); - }); - - this._clone = clone; - this._mutterWindow = mutterWindow; - this._cloneBin.set_child(this._clone); - - this._clone.connect('destroy', () => { - if (this._destroyId) { - mutterWindow.disconnect(this._destroyId); - this._destroyId = 0; - } - this._clone = null; - }) - } - - _windowCanClose() { - return this._window.can_close() && - !this._hasAttachedDialogs(); - } - - _closeWindow(actor) { - this._workspace = this._window.get_workspace(); - - // This mechanism is copied from the workspace.js upstream code - // It forces window activation if the windows don't get closed, - // for instance because asking user confirmation, by monitoring the opening of - // such additional confirmation window - this._windowAddedId = this._workspace.connect('window-added', - this._onWindowAdded.bind(this)); - - this.deleteAllWindows(); - } - - deleteAllWindows() { - // Delete all windows, starting from the bottom-most (most-modal) one - //let windows = this._window.get_compositor_private().get_children(); - let windows = this._clone.get_children(); - for (let i = windows.length - 1; i >= 1; i--) { - let realWindow = windows[i].source; - let metaWindow = realWindow.meta_window; - - metaWindow.delete(global.get_current_time()); - } - - this._window.delete(global.get_current_time()); - } - - _onWindowAdded(workspace, win) { - let metaWindow = this._window; - - if (win.get_transient_for() == metaWindow) { - workspace.disconnect(this._windowAddedId); - this._windowAddedId = 0; - - // use an idle handler to avoid mapping problems - - // see comment in Workspace._windowAdded - let activationEvent = Clutter.get_current_event(); - let id = GLib.idle_add(GLib.PRIORITY_DEFAULT, () => { - this.emit('activate', activationEvent); - return GLib.SOURCE_REMOVE; - }); - GLib.Source.set_name_by_id(id, '[dash-to-dock] this.emit'); - } - } - - _hasAttachedDialogs() { - // count trasient windows - let n=0; - this._window.foreach_transient(function(){n++;}); - return n>0; - } - - vfunc_key_focus_in() { - super.vfunc_key_focus_in(); - this._showCloseButton(); - } - - vfunc_key_focus_out() { - super.vfunc_key_focus_out(); - this._hideCloseButton(); - } - - vfunc_enter_event(crossingEvent) { - this._showCloseButton(); - return super.vfunc_enter_event(crossingEvent); - } - - vfunc_leave_event(crossingEvent) { - this._hideCloseButton(); - return super.vfunc_leave_event(crossingEvent); - } - - _idleToggleCloseButton() { - this._idleToggleCloseId = 0; - - this._hideCloseButton(); - - return GLib.SOURCE_REMOVE; - } - - _showCloseButton() { - - if (this._windowCanClose()) { - this.closeButton.show(); - this.closeButton.remove_all_transitions(); - this.closeButton.ease({ - opacity: 255, - duration: Workspace.WINDOW_OVERLAY_FADE_TIME, - mode: Clutter.AnimationMode.EASE_OUT_QUAD - }); - } - } - - _hideCloseButton() { - if (this.closeButton.has_pointer || - this.get_children().some(a => a.has_pointer)) - return; - - this.closeButton.remove_all_transitions(); - this.closeButton.ease({ - opacity: 0, - duration: Workspace.WINDOW_OVERLAY_FADE_TIME, - mode: Clutter.AnimationMode.EASE_IN_QUAD - }); - } - - show(animate) { - let fullWidth = this.get_width(); - - this.opacity = 0; - this.set_width(0); - - let time = animate ? PREVIEW_ANIMATION_DURATION : 0; - this.remove_all_transitions(); - this.ease({ - opacity: 255, - width: fullWidth, - duration: time, - mode: Clutter.AnimationMode.EASE_IN_OUT_QUAD, - }); - } - - _animateOutAndDestroy() { - this.remove_all_transitions(); - this.ease({ - opacity: 0, - duration: PREVIEW_ANIMATION_DURATION, - }); - - this.ease({ - width: 0, - height: 0, - duration: PREVIEW_ANIMATION_DURATION, - delay: PREVIEW_ANIMATION_DURATION, - onComplete: () => this.destroy() - }); - } - - activate() { - this._getTopMenu().close(); - Main.activateWindow(this._window); - } - - _onDestroy() { - if (this._cloneTextureId) { - GLib.source_remove(this._cloneTextureId); - this._cloneTextureId = 0; - } - - if (this._windowAddedId > 0) { - this._workspace.disconnect(this._windowAddedId); - this._windowAddedId = 0; - } - - if (this._destroyId > 0) { - this._mutterWindow.disconnect(this._destroyId); - this._destroyId = 0; - } - - if (this._windowTitleId > 0) { - this._window.disconnect(this._windowTitleId); - this._windowTitleId = 0; - } - } -}); \ No newline at end of file diff --git a/src/other/dash-to-dock/stylesheet-40.scss b/src/other/dash-to-dock/stylesheet-40.scss new file mode 100644 index 0000000..885c846 --- /dev/null +++ b/src/other/dash-to-dock/stylesheet-40.scss @@ -0,0 +1,9 @@ +$variant: 'dark'; +$laptop: 'false'; +$trans: 'true'; +$black: 'false'; +$theme: 'default'; + +@import '../../sass/colors'; +@import '../../sass/variables'; +@import '_dash-to-dock-4.scss'; diff --git a/src/other/dash-to-dock/stylesheet-dark.scss b/src/other/dash-to-dock/stylesheet-dark.scss index 9a44f49..c582978 100644 --- a/src/other/dash-to-dock/stylesheet-dark.scss +++ b/src/other/dash-to-dock/stylesheet-dark.scss @@ -6,4 +6,4 @@ $theme: 'default'; @import '../../sass/colors'; @import '../../sass/variables'; -@import '_dash-to-dock.scss'; +@import '_dash-to-dock-3.scss'; diff --git a/src/other/dash-to-dock/stylesheet-light.scss b/src/other/dash-to-dock/stylesheet-light.scss index 0fab594..7b107a2 100644 --- a/src/other/dash-to-dock/stylesheet-light.scss +++ b/src/other/dash-to-dock/stylesheet-light.scss @@ -6,4 +6,4 @@ $theme: 'default'; @import '../../sass/colors'; @import '../../sass/variables'; -@import '_dash-to-dock.scss'; +@import '_dash-to-dock-3.scss'; diff --git a/src/other/firefox/Monterey/left-tab-close-button.css b/src/other/firefox/Monterey/left-tab-close-button.css new file mode 100644 index 0000000..7a6faec --- /dev/null +++ b/src/other/firefox/Monterey/left-tab-close-button.css @@ -0,0 +1,28 @@ +@media (-moz-gtk-csd-reversed-placement) { +.tab-content { + display: flex; + flex-direction: row; + justify-content: center; + align-items: center; + padding-right: 20px !important; +} + + +.tabbrowser-tab > .tab-stack > .tab-content > .tab-close-button { + order: 1; + min-width: 16px; +} + +.tabbrowser-tab > .tab-stack > .tab-content > .tab-icon-stack { + order: 2; + margin-left: auto; +} +.tabbrowser-tab > .tab-stack > .tab-content > .tab-label-container { + order: 3; + margin-right: auto; +} + +.tabbrowser-tab > .tab-stack > .tab-content > .tab-label-container > .tab-secondary-label { + display: none; +} +} diff --git a/src/other/firefox/Monterey/parts/tabsbar.css b/src/other/firefox/Monterey/parts/tabsbar.css index 07aa2e9..52eeb76 100644 --- a/src/other/firefox/Monterey/parts/tabsbar.css +++ b/src/other/firefox/Monterey/parts/tabsbar.css @@ -72,6 +72,14 @@ width: 16px; } +.tabbrowser-tab > .tab-stack > .tab-content > .tab-close-button { + visibility: hidden; +} + +.tabbrowser-tab:hover > .tab-stack > .tab-content > .tab-close-button { + visibility: visible; +} + @media (prefers-color-scheme: dark) { .tab-close-button { list-style-image: url("../icons/window-close-symbolic-light.svg") !important; diff --git a/src/other/firefox/WhiteSur/left-tab-close-button.css b/src/other/firefox/WhiteSur/left-tab-close-button.css new file mode 100644 index 0000000..159f5a8 --- /dev/null +++ b/src/other/firefox/WhiteSur/left-tab-close-button.css @@ -0,0 +1,19 @@ +@media (-moz-gtk-csd-reversed-placement) { +.tabbrowser-tab > .tab-stack > .tab-content > .tab-close-button { + order: 1; + min-width: 16px; +} + +.tabbrowser-tab > .tab-stack > .tab-content > .tab-icon-stack { + order: 2; + margin-left: auto; +} +.tabbrowser-tab > .tab-stack > .tab-content > .tab-label-container { + order: 3; + margin-right: auto; +} + +.tabbrowser-tab > .tab-stack > .tab-content > .tab-label-container > .tab-secondary-label { + display: none; +} +} diff --git a/src/other/firefox/WhiteSur/parts/tabsbar.css b/src/other/firefox/WhiteSur/parts/tabsbar.css index f0af262..1994be9 100644 --- a/src/other/firefox/WhiteSur/parts/tabsbar.css +++ b/src/other/firefox/WhiteSur/parts/tabsbar.css @@ -96,6 +96,7 @@ tab[selected]:-moz-window-inactive { /* Center all inside tab */ .tab-content { display: flex; + flex-direction: row; justify-content: center; align-items: center; margin-top: -1px; @@ -118,9 +119,9 @@ tab[selected]:-moz-window-inactive { .tab-icon-sound[activemedia-blocked="true"] { margin-left: auto !important; } -.tabbrowser-tab:not([soundplaying]):not([muted]):not([activemedia-blocked]) .tab-close-button { - margin-left: auto !important; -} +/*.tabbrowser-tab:not([soundplaying]):not([muted]):not([activemedia-blocked]) .tab-close-button {*/ +/* margin-left: auto !important;*/ +/*}*/ .tab-icon-sound { margin-right: 6px; } @@ -140,6 +141,7 @@ tab[selected]:-moz-window-inactive { /* If tab favicon is not present, force tab label to the center */ .tabbrowser-tab .tab-label-container { margin-left: 0 !important; + margin-right: auto !important; } .tabbrowser-tab:not([image]):not([busy]):not([progress]) .tab-label-container { @@ -200,10 +202,6 @@ tab[selected]:-moz-window-inactive { } */ /* Close tab button */ -:root { - --gnome-fill-icon: red !important; -} - .close-icon { height: 16px !important; padding: 0 !important; @@ -223,11 +221,20 @@ tab[selected]:-moz-window-inactive { width: 16px; } +.tabbrowser-tab > .tab-stack > .tab-content > .tab-close-button { + visibility: hidden; +} + +.tabbrowser-tab:hover > .tab-stack > .tab-content > .tab-close-button { + visibility: visible; +} + @media (prefers-color-scheme: dark) { .tab-close-button { list-style-image: url("../icons/window-close-symbolic-light.svg") !important; } } + :root:-moz-window-inactive .tab-close-button:not(#hack) { opacity: .18 !important; } @@ -255,11 +262,6 @@ tab[selected]:-moz-window-inactive { display: none; } -/* Move container lines to the top */ -.tabbrowser-tab[usercontextid] > .tab-stack > .tab-background { - border-top: 3px solid var(--identity-tab-color) !important; -} - /* Remove alt colours references for multi tabs*/ .tabbrowser-tab[usercontextid]>.tab-stack>.tab-background>.tab-context-line { display: none; @@ -363,7 +365,6 @@ tab[selected]:-moz-window-inactive { } /* fix spacing on too many tabs */ - .tab-icon-overlay:not([pinned], [sharing]), [pictureinpicture] { margin-inline-end: 4px !important; diff --git a/src/other/firefox/userChrome-Monterey.css b/src/other/firefox/userChrome-Monterey.css index 410a4d9..24bb013 100644 --- a/src/other/firefox/userChrome-Monterey.css +++ b/src/other/firefox/userChrome-Monterey.css @@ -23,6 +23,9 @@ /*--------------Configure common theme features--------------*/ +/* Move tab close button to left. */ +/*@import "Monterey/left-tab-close-button.css"; /**/ + /* Hide the tab bar when only one tab is open (GNOMISH) * You should move the new tab button somewhere else for this to work, because by * default it is on the tab bar too. */ diff --git a/src/other/firefox/userChrome-WhiteSur.css b/src/other/firefox/userChrome-WhiteSur.css index 39b9b51..7804b1d 100644 --- a/src/other/firefox/userChrome-WhiteSur.css +++ b/src/other/firefox/userChrome-WhiteSur.css @@ -7,6 +7,9 @@ /*--------------Configure common theme features--------------*/ +/* Move tab close button to left. */ +/*@import "WhiteSur/left-tab-close-button.css"; /**/ + /* Hide the tab bar when only one tab is open (GNOMISH) * You should move the new tab button somewhere else for this to work, because by * default it is on the tab bar too. */ diff --git a/src/sass/_theme-options.scss b/src/sass/_theme-options.scss index 2bc958d..b034949 100644 --- a/src/sass/_theme-options.scss +++ b/src/sass/_theme-options.scss @@ -28,3 +28,6 @@ $panel_size: 'default'; // Monterey style $monterey: 'false'; + +// GDM login dialog scale +$scale: 'default'; diff --git a/src/sass/gnome-shell/common/_calendar.scss b/src/sass/gnome-shell/common/_calendar.scss index 4d70b7b..bcc224e 100644 --- a/src/sass/gnome-shell/common/_calendar.scss +++ b/src/sass/gnome-shell/common/_calendar.scss @@ -184,20 +184,24 @@ color: $alt_fg_color !important; background-color: rgba($fg_color, 0.1); border: none; + background-gradient-direction: none !important; &:hover, &:focus { background-color: rgba($fg_color, 0.15); color: $fg_color !important; + background-gradient-direction: none !important; } &:active { background-color: darken($primary_color, 5%); color: $light_fg_color !important; + background-gradient-direction: none !important; } &:selected { background-color: $primary_color; color: $light_fg_color !important; + background-gradient-direction: none !important; &:hover, &:focus { background-color: lighten($primary_color, 8%); diff --git a/src/sass/gnome-shell/common/_dialogs.scss b/src/sass/gnome-shell/common/_dialogs.scss index f00c97e..edff59d 100644 --- a/src/sass/gnome-shell/common/_dialogs.scss +++ b/src/sass/gnome-shell/common/_dialogs.scss @@ -12,20 +12,24 @@ color: white !important; background-color: $primary_color; box-shadow: inset 0 1px 0 0 rgba(white,0.1); + background-gradient-direction: none !important; &:hover { color: white !important; background-color: lighten($primary_color, 9%); + background-gradient-direction: none !important; } &:active { color: white !important; background-color: darken($primary_color, 5%); + background-gradient-direction: none !important; } &:insensitive { background-color: rgba($primary_color, 0.05); color: rgba($primary_color, 0.35) !important; + background-gradient-direction: none !important; } } diff --git a/src/sass/gnome-shell/common/_entries.scss b/src/sass/gnome-shell/common/_entries.scss index fb9cfc8..adebba9 100644 --- a/src/sass/gnome-shell/common/_entries.scss +++ b/src/sass/gnome-shell/common/_entries.scss @@ -2,7 +2,7 @@ StEntry, %entry { min-height: $menuitem_size; - padding: 2px 10px !important; + padding: $base_padding / 2 $base_padding * 2 !important; // margin: 2px; color: $fg_color; caret-color: $fg_color; @@ -20,10 +20,10 @@ StEntry, %entry { } StIcon.peek-password { icon-size: 16px; - padding: 0 4px; + padding: 0 $base_padding; } StLabel.hint-text { - margin-left: 2px; + margin-left: $base_padding / 2; color: $alt_fg_color; } } diff --git a/src/sass/gnome-shell/common/_login-dialog.scss b/src/sass/gnome-shell/common/_login-dialog.scss index 740c9b6..1600e6c 100644 --- a/src/sass/gnome-shell/common/_login-dialog.scss +++ b/src/sass/gnome-shell/common/_login-dialog.scss @@ -4,16 +4,304 @@ background-color: rgba($osd_bg_color, 1); background-image: url("assets/background.png"); background-size: cover; + + @if $scale != 'default' { + .user-icon { + icon-size: $base_icon_size * 8; + + & StIcon { + padding: $base_padding * 4; + width: $base_icon_size * 5; + height: $base_icon_size * 5; + } + + &.user-avatar { + border: 4px solid $osd_fg_color; + } + } + } } .login-dialog-banner-view { - padding-top: 24px; - max-width: 23em; + @if $scale == 'default' { + padding-top: 24px; + max-width: 23em; + } @else { + padding-top: 48px; + max-width: 46em; + } +} + +.unlock-dialog { + .user-icon { + icon-size: $base_icon_size * 4 !important; + + & StIcon { + padding: $base_padding * 2 !important; + width: $base_icon_size * 2.5 !important; + height: $base_icon_size * 2.5 !important; + } + + &.user-avatar { + border: 2px solid $osd_fg_color !important; + } + } + + StEntry { + @include fontsize($base_font_size - 1); + padding: 0 $base_padding * 2 !important; + + StIcon.peek-password { + padding: 0 $base_padding !important; + } + + StLabel.hint-text { + margin-left: $base_padding / 2 !important; + } + } + + .modal-dialog-button-box { + spacing: $container_padding / 2 !important; + } + + .modal-dialog-button { + padding: 2px $container_padding * 2 !important; + } + + .cancel-button, + .switch-user-button, + .login-dialog-session-list-button { + width: 32px !important; + height: 32px !important; + padding: 0 !important; + + StIcon { + icon-size: 16px !important; + } + } + + .login-dialog-logo-bin { padding: $container_padding * 4 0; } + .login-dialog-button-box { spacing: $container_padding; } + .login-dialog-message-hint { padding-top: 0; padding-bottom: $container_padding * 3; } + .login-dialog-user-selection-box { padding: 100px 0px; } + + .login-dialog-not-listed-label { + padding-left: 2px; + } + + .login-dialog-not-listed-label { + font-size: 1em; + padding-top: 1em; + } + + .login-dialog-user-list-view { -st-vfade-offset: 1em; } + .login-dialog-user-list { + spacing: $container_padding * 2; + padding: .2em; + width: 23em; + + &:expanded .login-dialog-user-list-item:logged-in { border-right: 2px solid $selected_bg_color; } + } + + .login-dialog-user-list-item { + border-radius: $mn_radius; + padding: $container_padding; + + &:ltr .user-widget { padding-right: 1em; } + &:rtl .user-widget { padding-left: 1em; } + + .login-dialog-timed-login-indicator { + height: 2px; + margin: $container_padding 0 0 0; + background-color: $visit_color !important; + } + } + + .user-widget.horizontal .user-widget-label { + @include fontsize($base_font_size + 2); + padding-left: $container_padding * 2; + + &:ltr { padding-left: $container_padding * 2; text-align: left; } + &:rtl { padding-right: $container_padding * 2; text-align: right; } + } + + .user-widget.vertical .user-widget-label { + @include fontsize($base_font_size + 5); + padding-top: $container_padding * 3; + } + + .login-dialog-prompt-layout { + padding-top: $container_padding * 4,; + padding-bottom: $container_padding * 2; + spacing: $base_spacing * 2; + width: 23em; + } + + .login-dialog-prompt-entry { + height: 1.5em; + } + + .login-dialog-prompt-label { + @include fontsize($base_font_size + 1); + padding-top: 1em; + } +} + +.login-dialog { + StEntry { + @if $scale != 'default' { + @include fontsize($base_font_size + 3); + padding: 0 $base_padding * 4 !important; + + StIcon.peek-password { + padding: 0 $base_padding * 2 !important; + } + + StLabel.hint-text { + margin-left: $base_padding !important; + } + } + + StIcon { + icon-size: if($scale == 'default', 16px, 32px); + padding: 0; + margin: 0; + } + } + + .modal-dialog-button-box { + @if $scale == 'default' { + spacing: $container_padding / 2; + } @else { + spacing: $container_padding; + } + } + + .modal-dialog-button { + @if $scale == 'default' { + padding: 2px $container_padding * 2; + } @else { + padding: 4px $container_padding * 4; + } + } + + .cancel-button, + .switch-user-button, + .login-dialog-session-list-button { + @if $scale == 'default' { + width: 32px; + height: 32px; + } @else { + width: 64px; + height: 64px; + } + + StIcon { + icon-size: if($scale == 'default', 16px, 32px); + } + } + + @if $scale == 'default' { + .login-dialog-logo-bin { padding: $container_padding * 4 0; } + .login-dialog-button-box { spacing: $container_padding; } + .login-dialog-message-hint { padding-top: 0; padding-bottom: $container_padding * 3; } + .login-dialog-user-selection-box { padding: 100px 0px; } + } @else { + .login-dialog-logo-bin { padding: $container_padding * 8 0; } + .login-dialog-button-box { spacing: $container_padding * 2; } + .login-dialog-message-hint { padding-top: 0; padding-bottom: $container_padding * 6; } + .login-dialog-user-selection-box { padding: 200px 0px; } + } + + .login-dialog-not-listed-label { + padding-left: 4px; + } + + .login-dialog-not-listed-label { + @if $scale == 'default' { + font-size: 1em; + padding-top: 1em; + } @else { + font-size: 2em; + padding-top: 2em; + } + } + + .login-dialog-user-list-view { -st-vfade-offset: if($scale == 'default', 1em, 2em); } + .login-dialog-user-list { + @if $scale == 'default' { + spacing: $container_padding * 2; + padding: .2em; + width: 23em; + } @else { + spacing: $container_padding * 4; + padding: .4em; + width: 46em; + } + &:expanded .login-dialog-user-list-item:logged-in { border-right: if($scale == 'default', 2px, 4px) solid $selected_bg_color; } + } + + .login-dialog-user-list-item { + border-radius: if($scale == 'default', $mn_radius, $mn_radius * 2); + padding: if($scale == 'default', $container_padding, $container_padding * 2); + + &:ltr .user-widget { padding-right: if($scale == 'default', 1em, 2em); } + &:rtl .user-widget { padding-left: if($scale == 'default', 1em, 2em); } + + .login-dialog-timed-login-indicator { + height: if($scale == 'default', 2px, 4px); + margin: if($scale == 'default', $container_padding, $container_padding * 2) 0 0 0; + } + } + + .user-widget.horizontal .user-widget-label { + @if $scale == 'default' { + @include fontsize($base_font_size + 2); + } @else { + @include fontsize($base_font_size * 2 + 4); + } + + padding-left: if($scale == 'default', $container_padding * 2, $container_padding * 4); + + &:ltr { padding-left: if($scale == 'default', $container_padding * 2, $container_padding * 4); text-align: left; } + &:rtl { padding-right: if($scale == 'default', $container_padding * 2, $container_padding * 4); text-align: right; } + } + + .user-widget.vertical .user-widget-label { + @if $scale == 'default' { + @include fontsize($base_font_size + 5); + } @else { + @include fontsize($base_font_size * 2 + 10); + } + + padding-top: if($scale == 'default', $base_padding * 2.5, $base_padding * 5); + padding-bottom: if($scale == 'default', $base_padding * 3.5, $base_padding * 7); + } + + .login-dialog-prompt-layout { + padding-top: if($scale == 'default', $container_padding * 4, $container_padding * 8); + padding-bottom: if($scale == 'default', $container_padding * 2, $container_padding * 4); + spacing: if($scale == 'default', $base_spacing * 2, $base_spacing * 4); + width: if($scale == 'default', 23em, 46em); + } + + .login-dialog-prompt-entry { + height: if($scale == 'default', 1.5em, 3em); + } + + .login-dialog-prompt-label { + @if $scale == 'default' { + @include fontsize($base_font_size + 1); + } @else { + @include fontsize($base_font_size * 2 + 2); + } + + padding-top: if($scale == 'default', 1em, 2em); + } } .login-dialog, .unlock-dialog { - //reset border: none; background-color: transparent; @@ -21,8 +309,6 @@ selection-background-color: $primary_color; selected-background-color: $primary_color; selected-color: white; - padding: 4px 8px; - min-height: $small_size; border-radius: $circular_radius; caret-color: $light_fg_color; @@ -35,10 +321,7 @@ } } - .modal-dialog-button-box { spacing: 3px; } - .modal-dialog-button { - padding: 0 16px; border: none; @include button(flat-normal, $tc: $light_fg_color); &:hover, &:focus { @include button(flat-hover, $tc: $light_fg_color); } @@ -56,31 +339,22 @@ .cancel-button, .switch-user-button, .login-dialog-session-list-button { - padding: 0; - border-radius: 100px; - width: 32px; - height: 32px; + padding: 0 !important; + border-radius: $circular_radius; border: none; background-color: rgba($borders_color, 0.1); color: $light_fg_color; - - StIcon { icon-size: 16px; } } +} - .login-dialog-message-warning { - color: $light_alt_fg_color; - } +.login-dialog-message-warning { + color: $light_alt_fg_color; } -.login-dialog-logo-bin { padding: 24px 0px; } .login-dialog-banner { color: $light_alt_fg_color; } -.login-dialog-button-box { spacing: 5px; } .login-dialog-message { text-align: center; } .login-dialog-message-warning { color: $warning_color; } -.login-dialog-message-hint { padding-top: 0; padding-bottom: 20px; } -.login-dialog-user-selection-box { padding: 100px 0px; } .login-dialog-not-listed-label { - padding-left: 2px; .login-dialog-not-listed-button:focus &, .login-dialog-not-listed-button:hover & { color: $light_fg_color; @@ -88,39 +362,23 @@ } .login-dialog-not-listed-label { - font-size: 1em; - font-weight: bold; + font-weight: normal; color: $light_alt_fg_color; - padding-top: 1em; &:hover { color: $light_alt_fg_color; } &:focus { background-color: $light_divider_color; } } -.login-dialog-user-list-view { -st-vfade-offset: 1em; } .login-dialog-user-list { - spacing: 12px; - padding: .2em; - width: 23em; &:expanded .login-dialog-user-list-item:selected { background-color: $light_divider_color; color: $light_alt_fg_color; } &:expanded .login-dialog-user-list-item:hover { background-color: $light_divider_color; color: $light_alt_fg_color; } &:expanded .login-dialog-user-list-item:active { background-color: $light_track_color; color: $light_alt_fg_color; } - &:expanded .login-dialog-user-list-item:logged-in { border-right: 2px solid $selected_bg_color; } } .login-dialog-user-list-item { - border-radius: $mn_radius; - padding: 6px; color: $light_alt_fg_color; - &:ltr .user-widget { padding-right: 1em; } - &:rtl .user-widget { padding-left: 1em; } - &:focus { background-color: if($variant == 'light', rgba(black, 0.05), rgba(white, 0.03)) !important; - - // .login-dialog-timed-login-indicator { - // background-color: $track_color; - // } } &:hover, &:focus:hover { @@ -134,8 +392,6 @@ } .login-dialog-timed-login-indicator { - height: 2px; - margin: 6px 0 0 0; background-color: $visit_color !important; } } @@ -145,34 +401,14 @@ } .user-widget.horizontal .user-widget-label { - @include fontsize($base_font_size + 2); - font-weight: bold; - padding-left: 15px; - - &:ltr { padding-left: 14px; text-align: left; } - &:rtl { padding-right: 14px; text-align: right; } + font-weight: normal; } .user-widget.vertical .user-widget-label { - @include fontsize($base_font_size + 5); text-align: center; font-weight: normal; - padding-top: 16px; -} - -.login-dialog-prompt-layout { - padding-top: 24px; - padding-bottom: 12px; - spacing: $base_spacing * 2; - width: 23em; -} - -.login-dialog-prompt-entry { - height: 1.5em; } .login-dialog-prompt-label { color: $light_hint_fg_color; - @include fontsize($base_font_size + 1); - padding-top: 1em; } diff --git a/src/sass/gnome-shell/common/_misc.scss b/src/sass/gnome-shell/common/_misc.scss index dd220e9..104b2bd 100644 --- a/src/sass/gnome-shell/common/_misc.scss +++ b/src/sass/gnome-shell/common/_misc.scss @@ -21,12 +21,12 @@ & StIcon { background-color: transparentize($light_alt_fg_color, 0.95); border-radius: $circular_radius; - padding: $base_padding * 2 ; // 12px + padding: $base_padding * 2; // 12px width: $base_icon_size * 2.5; height: $base_icon_size * 2.5; // 40px; } &.user-avatar { - border: 2px $osd_fg_color; + border: 2px solid $osd_fg_color; } } diff --git a/src/sass/gnome-shell/common/_panel.scss b/src/sass/gnome-shell/common/_panel.scss index 901c072..e5a38e6 100644 --- a/src/sass/gnome-shell/common/_panel.scss +++ b/src/sass/gnome-shell/common/_panel.scss @@ -11,15 +11,54 @@ $panel_height: $menuitem_size; $panel_height: $menuitem_size + 4px; } +#panel.login-screen { + @if $scale != 'default' { + @include fontsize($base_font_size * 2 - 2); + height: $panel_height * 2 !important; + box-shadow: 0 10px 32px rgba(black, 0.05) !important; + + .panel-button { + -natural-hpadding: $container_padding * 2 + 4px !important; + -minimum-hpadding: $container_padding * 2 + 4px !important; + border-radius: $bt_radius * 2 !important; + + &.clock-display { + StLabel { padding: 0 $base_padding * 2 !important; } + + .clock { + border-radius: $bt_radius * 2 !important; + padding: 0 $base_padding * 6 !important; + spacing: $base_padding * 2 !important; + } + } + + // status area icons + .system-status-icon { + icon-size: $base_icon_size * 2 !important; + padding: $base_padding * 2 !important; + margin: 0 $base_padding * 2 !important; + } + + .panel-status-menu-box StLabel { padding: 0 0 0 $base_padding !important; } + + .appindicator-trayicons-box { margin: 0 $base_padding * 2 !important; } + + StIcon { + icon-size: 32px !important; + } + } + } +} + #panel { background-color: $panel_bg; font-weight: normal; - height: $panel_height !important; - box-shadow: 0 5px 16px rgba(black, 0.05); color: $panel_fg; font-feature-settings: "tnum"; transition-duration: 250ms; @include font(body-1); + height: $panel_height !important; + box-shadow: 0 5px 16px rgba(black, 0.05); // the rounded outset corners .panel-corner { @@ -33,8 +72,8 @@ $panel_height: $menuitem_size; // panel menus .panel-button { - -natural-hpadding: 8px; - -minimum-hpadding: 8px; + -natural-hpadding: $container_padding + 2px; + -minimum-hpadding: $container_padding + 2px; font-weight: normal; color: $panel_fg; transition-duration: 150ms; @@ -235,8 +274,8 @@ $panel_height: $menuitem_size; #panel #panelActivities.panel-button { > * { background-image: url("assets/activities.svg"); - background-position: center top; - // background-size: 18px 18px; + background-position: center center; + background-size: 24px 24px; width: 24px; height: 24px; background-color: transparent !important; diff --git a/src/sass/gnome-shell/common/_popovers.scss b/src/sass/gnome-shell/common/_popovers.scss index fc0e7d4..3345a02 100644 --- a/src/sass/gnome-shell/common/_popovers.scss +++ b/src/sass/gnome-shell/common/_popovers.scss @@ -14,6 +14,54 @@ $popop_menuitem_radius: $wm_radius - 4px; background: transparent; // needs to reset? } +@if $scale != 'default' { + #lockDialogGroup .popup-menu, + .login-screen .popup-menu { // FIXME: not use? how to set the popovers on login-screen? + min-width: 24em; + @include fontsize($base_font_size * 2 - 2); + + .popup-menu-content { + padding: 12px 0 !important; + box-shadow: 0 10px 20px 0 rgba(black, 0.18); + border: 2px solid if($variant=='light', rgba(black, 0), rgba(black, 0.75)); + margin: 8px 24px 34px 24px !important; + @include fontsize($base_font_size * 2 - 2); + } + + .popup-menu-item { + spacing: $base_spacing * 4; + padding-top: 12px !important; + padding-bottom: 12px !important; + border-radius: $popop_menuitem_radius * 2; + margin: 0 12px; + + &:ltr { padding-right: 4em !important; padding-left: 0 !important; } + &:rtl { padding-right: 0 !important; padding-left: 4em !important; } + + &:checked { + border-radius: $popop_menuitem_radius * 2 $popop_menuitem_radius * 2 0 0; + } + } + + .popup-sub-menu { + border-radius: 0 0 $popop_menuitem_radius * 2 $popop_menuitem_radius * 2; + margin: 0 6px; + + .popup-menu-item { + border-radius: $popop_menuitem_radius * 2; + } + } + + &.panel-menu { + -boxpointer-gap: $base_margin * 2; // distance from the panel + margin-bottom: 3.5em; + } + } + // symbolic icons in popover + .popup-menu-arrow, + .popup-menu-icon { icon-size: $base_icon_size * 2; } +} + // container of the popover menu .popup-menu { min-width: 12em; @@ -39,6 +87,7 @@ $popop_menuitem_radius: $wm_radius - 4px; border-radius: $popop_menuitem_radius; margin: 0 6px; font-weight: normal; + transition: none; &:ltr { padding-right: 2em !important; padding-left: 0 !important; } &:rtl { padding-right: 0 !important; padding-left: 2em !important; } @@ -50,10 +99,12 @@ $popop_menuitem_radius: $wm_radius - 4px; box-shadow: none; color: $alt_fg_color; background-color: $submenu_bg_color; + background-gradient-direction: none !important; - &.hover, &.selected { + &:hover, &.selected { color: $selected_fg_color; background-color: $selected_bg_color; + background-gradient-direction: none !important; } &:active { @@ -67,6 +118,7 @@ $popop_menuitem_radius: $wm_radius - 4px; &.selected { color: $selected_fg_color; background-color: $selected_bg_color; + transition-duration: 0ms !important; } &:active, &.selected:active { diff --git a/src/sass/gnome-shell/extensions-40-0/_dash-to-dock.scss b/src/sass/gnome-shell/extensions-40-0/_dash-to-dock.scss index cecd690..0f4b05b 100644 --- a/src/sass/gnome-shell/extensions-40-0/_dash-to-dock.scss +++ b/src/sass/gnome-shell/extensions-40-0/_dash-to-dock.scss @@ -13,6 +13,7 @@ #dashtodockContainer { background-color: transparent; + box-shadow: none; .number-overlay { color: $light_fg_color; @@ -25,44 +26,28 @@ background-color: $primary_color; box-shadow: 0 2px 3px 0 rgba(0, 0, 0, 0.25); border-radius: $circular_radius; - margin: 2px; + margin: 2px 3px 5px; padding: 0.2em 0.6em; font-weight: bold; text-align: center; } - &.straight-corner #dash, - &.shrink.straight-corner #dash { - border-radius: 0; - border-left: 0; - border-right: 0; - padding-top: 0; - padding-bottom: 0; - margin-top: 0; - - .dash-background { - border-radius: 0; - margin-bottom: 0; - } - } - - &.extended.top, - &.extended.bottom, - &.extended.right, - &.extended.left { - #dash { - margin-left: 0; - margin-right: 0; - margin-top: 0; - margin-bottom: 0; - padding: 0 0; + @each $_pos, $b_pos, $_shadow in (top, bottom, 0 -1px), + (bottom, top, 0 1px), + (left, right, -1px 0), + (right, left, 1px 0) { + &.#{$_pos}.straight-corner #dash, + &.#{$_pos}.shrink.straight-corner #dash, + &.#{$_pos}.extended #dash { + margin: 0 !important; + padding: 0 !important; .dash-background { border-radius: 0; - margin-left: 0; - margin-right: 0; - margin-top: 0; - margin-bottom: 0; + border-width: 0; + border-#{$b_pos}-width: 1px; + margin: 0 !important; + box-shadow: inset #{$_shadow} rgba(white, 0.05); } } } @@ -70,29 +55,23 @@ &.left, &.right { #dash { - margin-top: 0; - padding: $dash_padding 0; + margin-top: 0 !important; + padding: $dash_padding !important; - .dash-background { // default-mode - margin-bottom: 0; + .dash-background { + margin-bottom: 0 !important; + padding: $dash_padding !important; } - } - .dash-item-container .app-well-app, .show-apps { - padding: $base_padding; + .dash-item-container .app-well-app, .show-apps { + padding: $dash_spacing $base_padding !important; + } } } - &.left #dash { - margin-left: $base_padding; - } - - &.right #dash { - margin-right: $base_padding; - } - #dash { // default-mode background: none; + box-shadow: none; StWidget.focused .app-well-app-running-dot { background-color: $primary_color; @@ -154,12 +133,12 @@ &.opaque:overview, &.transparent:overview { // overview-mode #2 #dash { - background-color: transparent !important; - box-shadow: none !important; + background-color: transparent; + box-shadow: none; } .dash-background { - background-color: transparent !important; + background-color: transparent; } } @@ -169,6 +148,12 @@ #dash { background: none; } + + .dash-background { + background-color: transparent !important; + border: none !important; + box-shadow: none !important; + } } &.running-dots, diff --git a/src/sass/gnome-shell/widgets-40-0/_dash.scss b/src/sass/gnome-shell/widgets-40-0/_dash.scss index 220b517..abb4d04 100644 --- a/src/sass/gnome-shell/widgets-40-0/_dash.scss +++ b/src/sass/gnome-shell/widgets-40-0/_dash.scss @@ -24,22 +24,22 @@ $dash_border_radius: $dash_padding * 1.5 + 12px; .app-well-app-running-dot { background-color: if($variant == 'light', rgba(black, 0.75), rgba(white, 0.75)); } -} -.dash-background { - background-color: $dash_background_color; - margin-bottom: $dash_bottom_margin; - padding: $dash_padding; - border-radius: $dash_border_radius; -} + .dash-background { + background-color: $dash_background_color; + margin-bottom: $dash_bottom_margin; + padding: $dash_padding; + border-radius: $dash_border_radius; + } -// Dash Items -.dash-item-container .app-well-app, .show-apps { - padding: $dash_padding $dash_spacing $dash_padding + $dash_bottom_margin; -} + // Dash Items + .dash-item-container .app-well-app, .show-apps { + padding: $dash_padding $dash_spacing $dash_padding + $dash_bottom_margin; + } -.dash-separator { - width: 1px; - margin: 0 ($dash_spacing + ($dash_padding / 2)) $dash_bottom_margin; - background-color: rgba(white, 0.25); + .dash-separator { + width: 1px; + margin: 0 ($dash_spacing + ($dash_padding / 2)) $dash_bottom_margin; + background-color: rgba(white, 0.25); + } } diff --git a/src/sass/gtk/_common-3.0.scss b/src/sass/gtk/_common-3.0.scss index a7fa182..c52d2c8 100644 --- a/src/sass/gtk/_common-3.0.scss +++ b/src/sass/gtk/_common-3.0.scss @@ -1692,8 +1692,7 @@ headerbar { min-width: 120px; padding: 0 0; - label { padding-right: $container_padding; } - image { padding-left: $container_padding; } + > stack > box { padding: 0 $container_padding * 2; } } > box > separator.titlebutton { @extend %header_separator; } diff --git a/tweaks.sh b/tweaks.sh index f273c09..0bd9f02 100755 --- a/tweaks.sh +++ b/tweaks.sh @@ -27,7 +27,7 @@ usage() { helpify "-e, --edit-firefox" "" "Edit '${THEME_NAME}' theme for Firefox settings and also connect the theme to the current Firefox profiles" "" helpify "-F, --flatpak" "" "Connect '${THEME_NAME}' theme to Flatpak" "" helpify "-s, --snap" "" "Connect '${THEME_NAME}' theme the currently installed snap apps" "" - helpify "-g, --gdm" "" "Install '${THEME_NAME}' theme for GDM" "Requires to run this shell as root" + helpify "-g, --gdm" "[default|x2]" "Install '${THEME_NAME}' theme for GDM (scaling: 100%/200%, default is 100%)" "Requires to run this shell as root" helpify "-d, --dash-to-dock" "" "Install '${THEME_NAME}' theme for Dash to Dock when Gnome < 40 or install fixed version on Gnome > 40" "" helpify "-N, --no-darken" "" "Don't darken '${THEME_NAME}' GDM theme background image" "" helpify "-n, --no-blur" "" "Don't blur '${THEME_NAME}' GDM theme background image" "" @@ -120,15 +120,24 @@ while [[ $# -gt 0 ]]; do showapps_normal="true" # use normal showapps icon background="default" + for variant in "${@}"; do + case "${variant}" in + default) + shift 1 + ;; + x2) + scale="x2" + shift 1 + ;; + esac + done + if ! has_command gdm && ! has_command gdm3 && [[ ! -e /usr/sbin/gdm3 ]]; then prompt -e "'${1}' ERROR: There's no GDM installed in your system" has_any_error="true" fi; shift ;; -d|--dash-to-dock) - if [[ "${GNOME_VERSION}" == 'new' ]]; then - prompt -w "'${1}' It will install a fixed version on GNOME-SHELL >= 40.0" - dash_to_dock="new" - elif [[ ! -d "${DASH_TO_DOCK_DIR_HOME}" && ! -d "${DASH_TO_DOCK_DIR_ROOT}" ]]; then + if [[ ! -d "${DASH_TO_DOCK_DIR_HOME}" && ! -d "${DASH_TO_DOCK_DIR_ROOT}" ]]; then prompt -e "'${1}' ERROR: There's no Dash to Dock installed in your system" has_any_error="true" else @@ -166,6 +175,18 @@ finalize_argument_parsing if [[ "${uninstall}" == 'true' ]]; then prompt -w "REMOVAL: Non file-related parameters will be ignored." + if [[ "${snap}" == 'true' ]]; then + prompt -i "Disconnecting '${name}' theme from your installed snap apps... \n" + disconnect_snap + prompt -s "Done! '${name}' theme has been disconnected from your snap apps."; echo + fi + + if [[ "${flatpak}" == 'true' ]]; then + prompt -i "Disconnecting '${name}' theme from your Flatpak... \n" + disconnect_flatpak + prompt -s "Done! '${name}' theme has been disconnected from your Flatpak."; echo + fi + if [[ "${gdm}" == 'true' ]]; then prompt -i "Removing '${name}' GDM theme... \n" revert_gdm_theme @@ -178,31 +199,25 @@ if [[ "${uninstall}" == 'true' ]]; then prompt -s "Done! '${name}' Dash to Dock theme has been removed."; echo fi - if [[ "${dash_to_dock}" == 'new' ]]; then - prompt -i "Removing '${name}' Dash to Dock extension... \n" - revert_dash_to_dock - prompt -s "Done! '${name}' Dash to Dock extension has been removed."; echo - fi - if [[ "${firefox}" == 'true' ]]; then prompt -i "Removing '${name}' Firefox theme... \n" remove_firefox_theme prompt -s "Done! '${name}' Firefox theme has been removed."; echo fi +else + show_needed_dialogs; customize_theme if [[ "${snap}" == 'true' ]]; then - prompt -i "Disconnecting '${name}' theme from your installed snap apps... \n" - disconnect_snap - prompt -s "Done! '${name}' theme has been disconnected from your snap apps."; echo + prompt -i "Connecting '${name}' theme to your installed snap apps... \n" + connect_snap + prompt -s "Done! '${name}' theme has been connected to your snap apps."; echo fi if [[ "${flatpak}" == 'true' ]]; then - prompt -i "Disconnecting '${name}' theme from your Flatpak... \n" - disconnect_flatpak - prompt -s "Done! '${name}' theme has been disconnected from your Flatpak."; echo + prompt -i "Connecting '${name}' themes to your Flatpak... \n" + connect_flatpak + prompt -s "Done! '${name}' theme has been connected to your Flatpak."; echo fi -else - show_needed_dialogs; customize_theme if [[ "${gdm}" == 'true' ]]; then prompt -i "Installing '${name}' GDM theme... \n" @@ -217,13 +232,6 @@ else prompt -w "DASH TO DOCK: You may need to logout to take effect."; echo fi - if [[ "${dash_to_dock}" == 'new' ]]; then - prompt -i "Installing fixed Dash to Dock... \n" - install_dash_to_dock - prompt -s "Done! '${name}' Dash to Dock extension has been installed." - prompt -w "DASH TO DOCK: You may need to logout to take effect."; echo - fi - if [[ "${firefox}" == 'true' || "${edit_firefox}" == 'true' ]]; then if [[ "${firefox}" == 'true' ]]; then prompt -i "Installing '${name}' Firefox theme... \n" @@ -241,18 +249,6 @@ else prompt -i "FIREFOX: Anyways, you can also edit 'userChrome.css' and 'customChrome.css' later in your Firefox profile directory." echo fi - - if [[ "${snap}" == 'true' ]]; then - prompt -i "Connecting '${name}' theme to your installed snap apps... \n" - connect_snap - prompt -s "Done! '${name}' theme has been connected to your snap apps."; echo - fi - - if [[ "${flatpak}" == 'true' ]]; then - prompt -i "Connecting '${name}' themes to your Flatpak... \n" - connect_flatpak - prompt -s "Done! '${name}' theme has been connected to your Flatpak."; echo - fi fi if [[ "${firefox}" == "false" && "${edit_firefox}" == "false" && "${flatpak}" == "false" && "${snap}" == "false" && "${gdm}" == "false" && "${dash_to_dock}" == "false" ]]; then