summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoraura <nw@moneybot.cc>2026-05-13 03:38:13 +0200
committeraura <nw@moneybot.cc>2026-05-13 03:38:13 +0200
commita5003496fae29e95ba58062fa2a094f0e5c53c4d (patch)
tree8b1109ea4fb4c3b0b6f1f65a558ad40d368931fd
parent9e2e988236e7180c9299b20b503b143e35d3b198 (diff)
cool
-rw-r--r--.gitignore1
-rw-r--r--bin/git-init-remote15
-rw-r--r--config/broot/conf.hjson337
l---------config/broot/launcher/bash/br1
-rw-r--r--config/broot/skins/native-16.hjson132
-rw-r--r--config/broot/verbs.hjson200
-rw-r--r--config/openbox/rc-templ.xml2
-rwxr-xr-xslackware-bootstrap/multilib2
-rw-r--r--themes/ayaya/gtk-3.0/apps/gnome-applications.css22
-rw-r--r--themes/ayaya/gtk-3.0/apps/granite-widgets.css39
-rw-r--r--themes/ayaya/gtk-3.0/apps/lightdm-gtk-greeter.css16
-rw-r--r--themes/ayaya/gtk-3.0/apps/nemo.css2
-rw-r--r--themes/ayaya/gtk-3.0/apps/xfce.css4
-rw-r--r--themes/ayaya/gtk-3.0/assets/checkbox-checked-disabled-dark.svg (renamed from themes/ayaya/gtk-3.0/assets/checkbox-checked-insensitive-dark.svg)0
-rw-r--r--themes/ayaya/gtk-3.0/assets/checkbox-checked-disabled.svg (renamed from themes/ayaya/gtk-3.0/assets/checkbox-checked-insensitive.svg)0
-rw-r--r--themes/ayaya/gtk-3.0/assets/checkbox-mixed-disabled-dark.svg (renamed from themes/ayaya/gtk-3.0/assets/checkbox-mixed-insensitive-dark.svg)0
-rw-r--r--themes/ayaya/gtk-3.0/assets/checkbox-mixed-disabled.svg (renamed from themes/ayaya/gtk-3.0/assets/checkbox-mixed-insensitive.svg)0
-rw-r--r--themes/ayaya/gtk-3.0/assets/checkbox-unchecked-disabled-dark.svg (renamed from themes/ayaya/gtk-3.0/assets/checkbox-unchecked-insensitive-dark.svg)0
-rw-r--r--themes/ayaya/gtk-3.0/assets/checkbox-unchecked-disabled.svg (renamed from themes/ayaya/gtk-3.0/assets/checkbox-unchecked-insensitive.svg)0
-rw-r--r--themes/ayaya/gtk-3.0/assets/menuitem-checkbox-checked-disabled.svg (renamed from themes/ayaya/gtk-3.0/assets/menuitem-checkbox-checked-insensitive.svg)0
-rw-r--r--themes/ayaya/gtk-3.0/assets/menuitem-checkbox-mixed-disabled.svg (renamed from themes/ayaya/gtk-3.0/assets/menuitem-checkbox-mixed-insensitive.svg)0
-rw-r--r--themes/ayaya/gtk-3.0/assets/menuitem-radio-checked-disabled.svg (renamed from themes/ayaya/gtk-3.0/assets/menuitem-radio-checked-insensitive.svg)0
-rw-r--r--themes/ayaya/gtk-3.0/assets/radio-mixed-disabled-dark.svg (renamed from themes/ayaya/gtk-3.0/assets/radio-mixed-insensitive-dark.svg)0
-rw-r--r--themes/ayaya/gtk-3.0/assets/radio-mixed-disabled.svg (renamed from themes/ayaya/gtk-3.0/assets/radio-mixed-insensitive.svg)0
-rw-r--r--themes/ayaya/gtk-3.0/assets/radio-selected-disabled-dark.svg (renamed from themes/ayaya/gtk-3.0/assets/radio-selected-insensitive-dark.svg)0
-rw-r--r--themes/ayaya/gtk-3.0/assets/radio-selected-disabled.svg (renamed from themes/ayaya/gtk-3.0/assets/radio-selected-insensitive.svg)0
-rw-r--r--themes/ayaya/gtk-3.0/assets/radio-unselected-disabled-dark.svg (renamed from themes/ayaya/gtk-3.0/assets/radio-unselected-insensitive-dark.svg)0
-rw-r--r--themes/ayaya/gtk-3.0/assets/radio-unselected-disabled.svg (renamed from themes/ayaya/gtk-3.0/assets/radio-unselected-insensitive.svg)0
-rw-r--r--themes/ayaya/gtk-3.0/gtk-widgets-assets-dark.css24
-rw-r--r--themes/ayaya/gtk-3.0/gtk-widgets-assets.css50
-rw-r--r--themes/ayaya/gtk-3.0/gtk-widgets.css585
-rw-r--r--themes/ayaya/gtk-3.0/gtk.css4
-rw-r--r--urxvt/ext/clipboard115
-rw-r--r--urxvt/ext/keyboard-select606
-rw-r--r--urxvt/ext/tabbed476
-rw-r--r--urxvt/ext/url-select408
36 files changed, 2658 insertions, 383 deletions
diff --git a/.gitignore b/.gitignore
index 7fa114b..a7fe5eb 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,3 +2,4 @@ icons/NineIcons/Iconfactory
config/openbox/rc.xml
nowplaying/node_modules
nowplaying/package-lock.json
+config/broot/launcher/installed-v4
diff --git a/bin/git-init-remote b/bin/git-init-remote
new file mode 100644
index 0000000..6b79aaa
--- /dev/null
+++ b/bin/git-init-remote
@@ -0,0 +1,15 @@
+#!/bin/sh
+
+NAME=$1
+DESC=$2
+AUTH=$3
+
+echo "Creating $NAME"
+echo "Description: $DESC"
+echo "Owner: $AUTH"
+
+ssh git@$VPS_HOST "git init --bare /home/git/$NAME"
+ssh git@$VPS_HOST "rm /home/git/$NAME/description"
+ssh git@$VPS_HOST "echo \"$DESC\" > /home/git/$NAME/description"
+ssh git@$VPS_HOST "echo \"$AUTH\" > /home/git/$NAME/owner"
+ssh git@$VPS_HOST "git --git-dir=/home/git/$NAME config gitweb.owner \"$AUTH\""
diff --git a/config/broot/conf.hjson b/config/broot/conf.hjson
new file mode 100644
index 0000000..e84fc75
--- /dev/null
+++ b/config/broot/conf.hjson
@@ -0,0 +1,337 @@
+###############################################################
+# This configuration file lets you
+# - define new commands
+# - change the shortcut or triggering keys of built-in verbs
+# - change the colors
+# - set default values for flags
+# - set special behaviors on specific paths
+# - and more...
+#
+# Configuration documentation is available at
+# https://dystroy.org/broot
+#
+# This file's format is Hjson ( https://hjson.github.io/ ). Some
+# properties are commented out. To enable them, remove the `#`.
+#
+###############################################################
+
+###############################################################
+# Default flags
+# You can set up flags you want broot to start with by
+# default, for example `default_flags="-ihp"` if you usually want
+# to see hidden and gitignored files and the permissions (then
+# if you don't want the hidden files at a specific launch,
+# you can launch broot with `br -H`).
+# A popular flag is the `g` one which displays git related info.
+#
+default_flags: "--max-depth=1 --sort-by-type -sdpig"
+
+###############################################################
+# Terminal's title
+# If you want the terminal's title to be updated when you change
+# directory, set a terminal_title pattern by uncommenting one of
+# the examples below and tuning it to your taste.
+#
+# terminal_title: "[broot] {git-name}"
+# terminal_title: "{file} 🐄"
+terminal_title: "-= {file-name} =-"
+reset_terminal_title_on_exit: true
+
+###############################################################
+# Date/Time format
+# If you want to change the format for date/time, uncomment the
+# following line and change it according to
+# https://docs.rs/chrono/0.4.11/chrono/format/strftime/index.html
+#
+# date_time_format: %Y/%m/%d %R
+
+###############################################################
+# uncomment to activate modal mode
+#
+# (you really should read https://dystroy.org/broot/modal/
+# before as it may not suit everybody even among vim users)
+#
+# You may start either in 'command' mode, or in 'input' mode
+#
+# modal: true
+# initial_mode: command
+
+###############################################################
+# Whether to mark the selected line with a triangle
+#
+show_selection_mark: true
+
+###############################################################
+# Column order
+# cols_order, if specified, must be a permutation of the following
+# array. You should keep the name column at the end as it has a
+# variable length.
+#
+cols_order: [
+ mark
+ git
+ size
+ permission
+ date
+ count
+ branch
+ name
+]
+
+###############################################################
+# True Colors
+# If this parameter isn't set, broot tries to automatically
+# determine whether true colors (24 bits) are available.
+# As this process is unreliable, you may uncomment this setting
+# and set it to false or true if you notice the colors in
+# previewed images are too off.
+#
+# true_colors: false
+
+###############################################################
+# Icons
+# If you want to display icons in broot, uncomment this line
+# (see https://dystroy.org/broot/icons for installation and
+# troubleshooting)
+#
+# icon_theme: vscode
+
+###############################################################
+# Special paths
+# If some paths must be handled specially, uncomment (and change
+# this section as per the examples)
+# Setting "list":"never" on a dir prevents broot from looking at its
+# children when searching, unless the dir is the selected root.
+# Setting "sum":"never" on a dir prevents broot from looking at its
+# children when computing the total size and count of files.
+# Setting "show":"always" makes a file visible even if its name
+# starts with a dot.
+# Setting "list":"always" may be useful on a link to a directory
+# (they're otherwise not entered by broot unless selected)
+#
+special_paths: {
+ "/media" : {
+ list: "never"
+ sum: "never"
+ }
+ "~/.config": { "show": "always" }
+ "trav": {
+ show: always
+ list: "always",
+ sum: "never"
+ }
+ # "~/useless": { "show": "never" }
+ # "~/my-link-I-want-to-explore": { "list": "always" }
+}
+
+###############################################################
+# Quit on last cancel
+# You can usually cancel the last state change on escape.
+# If you want the escape key to quit broot when there's nothing
+# to cancel (for example when you just opened broot), uncomment
+# this parameter
+#
+# quit_on_last_cancel: true
+
+###############################################################
+# Search modes
+#
+# broot allows many search modes.
+# A search mode is defined by
+# - the way to search: 'fuzzy', 'exact', 'regex', or 'tokens'.
+# - where to search: file 'name', 'path', or file 'content'
+# A search pattern may for example be "fuzzy path" (default),
+# "regex content" or "exact path".
+#
+# The search mode is selected from its prefix. For example, if
+# you type "abc", the default mode is "fuzzy path". If you type
+# "/abc", the mode is "regex path". If you type "rn/abc", the mode
+# is "regex name".
+#
+# This mapping may be modified. You may want to dedicate the
+# empty prefix (the one which doesn't need a '/') to the
+# search mode you use most often. The example below makes it
+# easy to search on name rather than on the subpath.
+#
+# More information on
+# https://dystroy.org/broot/input/#the-filtering-pattern
+#
+# search_modes: {
+# <empty>: fuzzy name
+# /: regex name
+# }
+
+###############################################################
+# File Extension Colors
+#
+# uncomment and modify the next section if you want to color
+# file name depending on their extension
+#
+ext_colors: {
+ png: rgb(255, 128, 75)
+ jpg: rgb(255, 128, 75)
+ gif: rgb(255, 128, 75)
+ svg: rgb(255, 128, 75)
+ webp: rgb(255, 128, 75)
+ tiff: rgb(255, 128, 75)
+ tif: rgb(255, 128, 75)
+ bmp: rgb(255, 128, 75)
+ jpeg: rgb(255, 128, 75)
+
+
+ rs: cyan
+ c: cyan
+ cpp: cyan
+ h: cyan
+ hpp: cyan
+ py: cyan
+ sh: cyan
+ md: cyan
+ html: cyan
+ css: cyan
+ js: cyan
+ xml: cyan
+ go: cyan
+ php: cyan
+
+ json: yellow
+ conf: yellow
+ yaml: yellow
+ ini: yellow
+}
+
+###############################################################
+# Max file size for content search
+#
+# Bigger files are ignored when searching their content. You
+# can specify this size either in ISO units (eg 5GB) or in
+# the old binary units (eg 44Kib)
+content_search_max_file_size: 10MB
+
+###############################################################
+# Max Panels Count
+#
+# Change this if you sometimes want to have more than 2 panels
+# open
+# max_panels_count: 2
+
+###############################################################
+# Update work dir
+#
+# By default, broot process' work dir is kept in sync with the
+# current's panel root. If you want to keep it unchanged,
+# uncomment this setting
+#
+# update_work_dir: false
+
+###############################################################
+# Kitty Keyboard extension
+#
+# If you want to use advanced keyboard shortcuts in Kitty
+# compatible terminals (Kitty, Wezterm), set this to true.
+#
+# This makes it possible to use shortcuts like 'space-n',
+# 'ctrl-alt-a-b', 'shift-space', etc.
+#
+enable_kitty_keyboard: false
+
+###############################################################
+# lines around matching line in filtered preview
+#
+# When searching the content of a file, you can have either
+# only the matching lines displayed, or some of the surrounding
+# ones too.
+#
+lines_before_match_in_preview: 1
+lines_after_match_in_preview: 1
+
+###############################################################
+# transformations before preview
+#
+# It's possible to define transformations to apply to some files
+# before calling one of the default preview renderers in broot.
+# Below are three examples that you may uncomment and adapt:
+#
+preview_transformers: [
+ // # Use mutool to render any PDF file as an image
+ // # In this example we use placeholders for the input and output files
+ // {
+ // input_extensions: [ "pdf" ] // case doesn't matter
+ // output_extension: png
+ // mode: image
+ // command: [ "mutool", "draw", "-w", "1000", "-o", "{output-path}", "{input-path}" ]
+ // }
+
+ // # Use LibreOffice to render Office files as images
+ // # In this example, {output-dir} is used to specify where LibreOffice must write the result
+ // {
+ // input_extensions: [ "xls", "xlsx", "doc", "docx", "ppt", "pptx", "ods", "odt", "odp" ]
+ // output_extension: png
+ // mode: image
+ // command: [
+ // "libreoffice", "--headless",
+ // "--convert-to", "png",
+ // "--outdir", "{output-dir}",
+ // "{input-path}"
+ // ]
+ // }
+
+ // # Use jq to beautify JSON
+ // # In this example, the command refers to neither the input nor the output,
+ // # so broot pipes them to the stdin and stdout of the jq process
+ // {
+ // input_extensions: [ "json" ]
+ // output_extension: json
+ // mode: text
+ // command: [ "jq" ]
+ // }
+
+ // # Use zmore to preview compressed text files
+ // {
+ // input_extensions: [ "gz", "z", "tgz" ] // case doesn't matter
+ // output_extension: txt
+ // mode: text
+ // command: [ "zmore" ]
+ // }
+]
+
+###############################################################
+# Imports
+#
+# While it's possible to have all configuration in one file,
+# it's more convenient to split it in several ones.
+# Importing also allows to set a condition on the terminal's
+# color, which makes it possible to have a different skin
+# chosen when your terminal has a light background and when
+# it has a light one.
+imports: [
+
+ # Verbs are better configured in verbs.hjson. But you
+ # can also add another files for your personal verbs
+ verbs.hjson
+
+ # This file contains the skin to use when the terminal
+ # is dark (or when this couldn't be determined)
+ {
+ luma: [
+ dark
+ unknown
+ ]
+ # (un)comment to choose your preferred skin
+ //file: skins/dark-blue.hjson
+ //file: skins/catppuccin-macchiato.hjson
+ //file: skins/catppuccin-mocha.hjson
+ //file: skins/dark-gruvbox.hjson
+ //file: skins/dark-orange.hjson
+ //file: skins/solarized-dark.hjson
+ file: skins/native-16.hjson
+ }
+
+ # This skin is imported when your terminal is light
+ {
+ luma: light
+ # (un)comment to choose your preferred skin
+ //file: skins/solarized-light.hjson
+ file: skins/white.hjson
+ }
+]
diff --git a/config/broot/launcher/bash/br b/config/broot/launcher/bash/br
new file mode 120000
index 0000000..6ca0ab9
--- /dev/null
+++ b/config/broot/launcher/bash/br
@@ -0,0 +1 @@
+/home/aura/.local/share/broot/launcher/bash/1 \ No newline at end of file
diff --git a/config/broot/skins/native-16.hjson b/config/broot/skins/native-16.hjson
new file mode 100644
index 0000000..4dceda5
--- /dev/null
+++ b/config/broot/skins/native-16.hjson
@@ -0,0 +1,132 @@
+###############################################################
+# 16 ANSI color theme. Colors in this theme are restricted from
+# ANSI color 0 - 15. This will allow the theme to adapt to your
+# terminal emulator's theme. Note that, for now, the preview
+# mode does not yet support this theme because of syntect not
+# having a 16 ansi color theme.
+#
+# More info at https://jeffkreeftmeijer.com/vim-16-color/
+# Doc at https://dystroy.org/broot/skins/
+###############################################################
+
+skin: {
+ directory: ansi(13)
+ file: ansi(7)
+ pruning: ansi(8) none italic
+ selected_line: none ansi(8)
+ tree: ansi(8)
+
+ # Search
+ char_match: ansi(2) none underlined
+ parent: ansi(13) none bold
+
+ # File properties
+ exe: ansi(2)
+ link: ansi(13)
+ sparse: ansi(12)
+
+ # Prompt
+ input: ansi(15)
+
+ # Status bar
+ status_bold: ansi(7) ansi(8) bold
+ status_code: ansi(10) ansi(8)
+ status_ellipsis: ansi(7) ansi(8)
+ status_error: ansi(7) ansi(8)
+ status_italic: ansi(13) ansi(8) bold
+ status_job: ansi(7) ansi(8)
+ status_normal: ansi(7) ansi(8)
+
+ # Flag status
+ flag_label: ansi(13)
+ flag_value: ansi(14) none bold
+
+ # Background
+ default: none none
+
+ # Scrollbar
+ scrollbar_track: ansi(0)
+ scrollbar_thumb: ansi(3)
+
+ # Git
+ git_branch: ansi(13)
+ git_deletions: ansi(1)
+ git_insertions: ansi(2)
+ git_status_conflicted: ansi(1)
+ git_status_current: ansi(6)
+ git_status_ignored: ansi(8)
+ git_status_modified: ansi(3)
+ git_status_new: ansi(2) none bold
+ git_status_other: ansi(5)
+
+ # Staging area
+ staging_area_title: ansi(3)
+
+ # Documentation
+ help_bold: ansi(7) none bold
+ help_code: ansi(4)
+ help_headers: ansi(3)
+ help_italic: ansi(7) none
+ help_paragraph: ansi(7)
+ help_table_border: ansi(8)
+
+ # Device column
+ device_id_major: ansi(5)
+ device_id_minor: ansi(5)
+ device_id_sep: ansi(5)
+
+ # Counts column
+ count: ansi(13)
+
+ # Dates column
+ dates: ansi(6)
+
+ # Permissions column
+ group: ansi(3)
+ owner: ansi(3)
+ perm__: ansi(8)
+ perm_r: ansi(3)
+ perm_w: ansi(1)
+ perm_x: ansi(2)
+
+ # Hex preview
+ hex_null: ansi(8)
+ hex_ascii_graphic: ansi(2)
+ hex_ascii_whitespace: ansi(3)
+ hex_ascii_other: ansi(4)
+ hex_non_ascii: ansi(5)
+
+ # Preview
+ # preview: none
+ # preview_line_number: none
+ # preview_match: none
+ # preview_title: none
+
+ # Used for displaying errors
+ file_error: ansi(1)
+
+ # Content searches
+ content_extract: ansi(7)
+ content_match: ansi(3) none underlined
+
+ # Used in status line
+ purpose_bold: ansi(0) ansi(7) bold
+ purpose_ellipsis: ansi(0)
+ purpose_italic: ansi(0) ansi(7)
+ purpose_normal: ansi(0)
+
+ # Modal indicator
+ mode_command_mark: ansi(7) ansi(4)
+
+ # File system occupation
+ good_to_bad_0: ansi(10)
+ good_to_bad_1: ansi(10)
+ good_to_bad_2: ansi(2)
+ good_to_bad_3: ansi(3)
+ good_to_bad_4: ansi(3)
+ good_to_bad_5: ansi(3)
+ good_to_bad_6: ansi(3)
+ good_to_bad_7: ansi(1)
+ good_to_bad_8: ansi(1)
+ good_to_bad_9: ansi(9)
+}
diff --git a/config/broot/verbs.hjson b/config/broot/verbs.hjson
new file mode 100644
index 0000000..8ea42ff
--- /dev/null
+++ b/config/broot/verbs.hjson
@@ -0,0 +1,200 @@
+###############################################################
+# This file contains the verb definitions for broot
+#
+# Some verbs here are examples and not enabled by default: you
+# need to uncomment them if you want to use them.
+#
+# Documentation at https://dystroy.org/broot/verbs/
+###############################################################
+
+verbs: [
+
+ # You should customize this standard opening of text files.
+ # If you edit text files in your terminal (vi, emacs, helix, eg.), then
+ # you'll find it convenient to change the 'key' from 'ctrl-e' to 'enter'.
+ #
+ # If $EDITOR isn't set on your computer, you should either set it using
+ # something similar to
+ # export EDITOR=/usr/local/bin/nvim
+ # or just replace it with your editor of choice in the 'execution'
+ # pattern.
+ # If your editor is able to open a file on a specific line, use {line}
+ # so that you may jump directly at the right line from a preview or
+ # a content search.
+ # Examples depending on your favourite editor:
+ # external: "nvim +{line} {file:space-separated}"
+ # external: "helix {file}:{line}"
+ {
+ invocation: edit
+ shortcut: e
+ key: ctrl-e
+ apply_to: text_file
+ external: "$EDITOR {file:space-separated}"
+ leave_broot: false
+ }
+
+ # Example 1: launching `tail -n` on the selected file (leaving broot)
+ # {
+ # name: tail_lines
+ # invocation: tl {lines_count}
+ # external: "tail -f -n {lines_count} {file}"
+ # }
+
+ # Example 2: creating a new file without leaving broot
+ # {
+ # name: touch
+ # invocation: touch {new_file}
+ # external: "touch {directory}/{new_file}"
+ # leave_broot: false
+ # }
+
+ # Zip selected file(s) into a new archive named <name>.zip
+ # This can be called on the staging area after having staged several
+ # files or directories
+ {
+ invocation: "zip {name}"
+ external: [
+ "zip"
+ "-r"
+ "{name:path-from-directory}.zip"
+ "{file:space-separated}"
+ ]
+ leave_broot: false
+ working_dir: "{root}"
+ }
+
+ # A convenient shortcut to create a new text file in
+ # the current directory or below
+ {
+ invocation: create {subpath}
+ execution: "$EDITOR {directory}/{subpath}"
+ leave_broot: false
+ }
+
+ {
+ invocation: git_diff
+ shortcut: gd
+ leave_broot: false
+ execution: "git difftool -y {file}"
+ }
+
+ {
+ invocation: depth {depth}
+ execution: ":set_max_depth {depth}"
+ }
+
+ {
+ invocation: goto {where}
+ execution: ":focus {where}"
+ }
+
+ # On ctrl-b, propose the creation of a copy of the selection.
+ # While this might occasionally be useful, this verb is mostly here
+ # as an example to demonstrate rare standard groups like {file-stem}
+ # and {file-dot-extension} and the auto_exec verb property which
+ # allows verbs to stay unexecuted until you hit enter
+ {
+ invocation: "backup {version}"
+ key: ctrl-b
+ leave_broot: false
+ auto_exec: false
+ execution: "cp -r {file} {parent}/{file-stem}-{version}{file-dot-extension}"
+ }
+
+ # By default, `rm` does the system rm, and completely removes
+ # the file. If you prefer to have the file moved to the system
+ # trash, you may use the ':trash' internal with the verb below:
+ # {
+ # invocation: "rm"
+ # internal: "trash"
+ # leave_broot: false
+ # }
+
+ # This verb lets you launch a terminal on ctrl-T
+ # (on exit you'll be back in broot)
+ {
+ invocation: terminal
+ key: ctrl-t
+ execution: "$SHELL"
+ set_working_dir: true
+ leave_broot: false
+ }
+
+ # Scroll the rightest panel on alt-pagedown and alt-pageup,
+ # while keeping the focus on your current panel
+ {
+ key: alt-pagedown
+ internal: page_down
+ impacted_panel: right
+ }
+ {
+ key: alt-pageup
+ internal: page_up
+ impacted_panel: right
+ }
+
+
+ # Here's an example of a verb needing the shell capabilities.
+ # It copies all children of the currently selected directory
+ # to a destination you type.
+ # It uses a star, which needs the shell for expansion. That's
+ # why such verb must have the `from_shell: true` parameter.
+ # {
+ # invocation: "cpa {dest}"
+ # external: "cp -r {directory}/* {dest}"
+ # from_shell: true
+ # }
+
+ # Here's an example of a shortcut bringing you to your home directory
+ # {
+ # invocation: home
+ # key: ctrl-home
+ # execution: ":focus ~"
+ # }
+
+ # Here's going to the work-dir root of the current git repository
+ # {
+ # invocation: gtr
+ # execution: ":focus {git-root}"
+ # }
+
+ # A popular set of shortcuts for going up and down:
+ #
+ # {
+ # key: ctrl-k
+ # execution: ":line_up"
+ # }
+ # {
+ # key: ctrl-j
+ # execution: ":line_down"
+ # }
+ # {
+ # key: ctrl-u
+ # execution: ":page_up"
+ # }
+ # {
+ # key: ctrl-d
+ # execution: ":page_down"
+ # }
+
+ # If you develop using git, you might like to often switch
+ # to the git status filter:
+ # {
+ # key: alt-g
+ # execution: ":toggle_git_status"
+ # }
+
+ # You can reproduce the bindings of Norton Commander
+ # on copying or moving to the other panel:
+ # {
+ # key: F5
+ # external: "cp -r {file} {other-panel-directory}"
+ # leave_broot: false
+ # }
+ # {
+ # key: F6
+ # external: "mv {file} {other-panel-directory}"
+ # leave_broot: false
+ # }
+]
+
diff --git a/config/openbox/rc-templ.xml b/config/openbox/rc-templ.xml
index ca3f465..b7527a0 100644
--- a/config/openbox/rc-templ.xml
+++ b/config/openbox/rc-templ.xml
@@ -456,7 +456,7 @@
<mousebind button="Left" action="Drag">
<action name="Move"/>
</mousebind>
- <mousebind button="W-Left" action="Click">
+ <mousebind button="A-Left" action="Click">
<action name="ToggleAlwaysOnTop"/>
</mousebind>
<mousebind button="Left" action="DoubleClick">
diff --git a/slackware-bootstrap/multilib b/slackware-bootstrap/multilib
index 234e20c..5384268 100755
--- a/slackware-bootstrap/multilib
+++ b/slackware-bootstrap/multilib
@@ -25,7 +25,7 @@ if [[ $iscurrent == 1 ]]; then
if [[ $doconvert == 1 ]]; then
mkdir ~/convert32
pushd ~/convert32
- /usr/sbin/massconvert.sh -u https://mirror.yandex.ru/slackware/slackware-current/slackware
+ /usr/sbin/massconvert32.sh -u https://mirror.yandex.ru/slackware/slackware-current/slackware
for dir in $(ls -d *-compat32); do
pushd $dir
diff --git a/themes/ayaya/gtk-3.0/apps/gnome-applications.css b/themes/ayaya/gtk-3.0/apps/gnome-applications.css
index 198263e..446a8c2 100644
--- a/themes/ayaya/gtk-3.0/apps/gnome-applications.css
+++ b/themes/ayaya/gtk-3.0/apps/gnome-applications.css
@@ -29,7 +29,7 @@ PanelMenuBar.menubar.menuitem {
-PanelMenuBar-icon-visible: true;
border-width: 0;
- color: #ff00000;
+ color: #ff0000;
padding-right: 20px;
background-image: none;
}
@@ -60,14 +60,14 @@ PanelApplet .button:active {
color: shade(@panel_fg_color, 1.08);
}
-PanelApplet .button:prelight {
+PanelApplet .button:hover {
border-color: mix(@panel_bg_color, @panel_fg_color, 0.11);
background-color: mix(@panel_bg_color, @panel_fg_color, 0.11);
background-image: none;
color: shade(@panel_fg_color, 1.08);
}
-PanelApplet .button:active:prelight {
+PanelApplet .button:active:hover {
border-color: mix(@panel_bg_color, @panel_fg_color, 0.31);
background-color: mix(@panel_bg_color, @panel_fg_color, 0.31);
background-image: none;
@@ -95,7 +95,7 @@ WnckPager, WnckTasklist {
}
.nautilus-desktop.nautilus-canvas-item:active,
-.nautilus-desktop.nautilus-canvas-item:prelight,
+.nautilus-desktop.nautilus-canvas-item:hover,
.nautilus-desktop.nautilus-canvas-item:selected {
text-shadow: none;
}
@@ -241,21 +241,21 @@ GeditWindow .pane-separator:hover {
background-color: transparent;
background-image: none;
color: transparent;
- icon-shadow: none;
+ -gtk-icon-shadow: none;
}
-.gedit-document-panel .prelight-row .button {
+.gedit-document-panel .hover-row .button {
border-color: alpha(black, 0.1);
color: alpha(white, 0.8);
}
.gedit-document-panel .list-row .button:hover,
-.gedit-document-panel .prelight-row .button:hover {
+.gedit-document-panel .hover-row .button:hover {
border-color: alpha(black, 0.1);
color: white;
}
-.gedit-document-panel .prelight-row .button:active {
+.gedit-document-panel .hover-row .button:active {
border-color: alpha(black, 0.2);
background-color: alpha(black, 0.08);
color: white;
@@ -387,11 +387,13 @@ EPreviewPane .entry {
* gnome-bluetooth *
*******************/
GtkEntry.entry.pin-entry {
- font: regular 50;
+ font-size: 50px;
+ font-weight: normal;
padding-left: 25px;
padding-right: 25px;
}
GtkLabel.pin-label {
- font: regular 50;
+ font-size: 50px;
+ font-weight: normal;
}
diff --git a/themes/ayaya/gtk-3.0/apps/granite-widgets.css b/themes/ayaya/gtk-3.0/apps/granite-widgets.css
index 1ddb61c..0e0f51a 100644
--- a/themes/ayaya/gtk-3.0/apps/granite-widgets.css
+++ b/themes/ayaya/gtk-3.0/apps/granite-widgets.css
@@ -12,9 +12,6 @@
}
.dynamic-notebook .notebook {
- -GtkNotebook-tab-overlap: 3px;
- -GtkNotebook-initial-gap: 12px;
-
border-width: 1px 0 0 0;
border-color: shade(@theme_bg_color, 0.8);
border-radius: 0;
@@ -124,7 +121,7 @@
color: shade(@theme_text_color, 0.7);
}
-.content-view .button:insensitive {
+.content-view .button:disabled {
background-color: shade(@theme_base_color, 0.9);
background-image: none;
}
@@ -170,21 +167,21 @@
}
.source-list.view:selected,
-.source-list.view:prelight:selected {
+.source-list.view:hover:selected {
background-color: @theme_selected_bg_color;
background-image: none;
color: @theme_selected_fg_color;
}
-.source-list.view:prelight {
+.source-list.view:hover {
background-color: shade(@theme_bg_color, 1.08);
background-image: none;
}
.source-list.badge,
-.source-list.badge:prelight,
+.source-list.badge:hover,
.source-list.badge:selected,
-.source-list.badge:prelight:selected {
+.source-list.badge:hover:selected {
margin: 0 3px;
padding: 0 6px;
border-width: 0;
@@ -227,7 +224,7 @@
}
.button.noundo GtkLabel,
-.button.noundo Gtklabel:prelight {
+.button.noundo Gtklabel:hover {
color: @error_fg_color;
}
@@ -264,7 +261,7 @@
}
.button.affirmative GtkLabel,
-.button.affirmative Gtklabel:prelight {
+.button.affirmative Gtklabel:hover {
color: @theme_selected_fg_color;
}
@@ -308,13 +305,13 @@
border-color: shade(@toolbar_bg_color, 0.7);
}
-.secondary-toolbar.toolbar .button:insensitive {
+.secondary-toolbar.toolbar .button:disabled {
border-color: shade(@toolbar_bg_color, 0.85);
background-color: shade(@toolbar_bg_color, 0.9);
background-image: none;
}
-.secondary-toolbar.toolbar .button:active *:insensitive {
+.secondary-toolbar.toolbar .button:active *:disabled {
border-color: shade(@toolbar_bg_color, 0.75);
background-color: shade(@toolbar_bg_color, 0.80);
background-image: none;
@@ -361,13 +358,13 @@
border-color: shade(@theme_bg_color, 0.7);
}
-.bottom-toolbar.toolbar .button:insensitive {
+.bottom-toolbar.toolbar .button:disabled {
border-color: shade(@theme_bg_color, 0.85);
background-color: shade(@theme_bg_color, 0.9);
background-image: none;
}
-.bottom-toolbar.toolbar .button:active *:insensitive {
+.bottom-toolbar.toolbar .button:active *:disabled {
border-color: shade(@theme_bg_color, 0.75);
background-color: shade(@theme_bg_color, 0.80);
background-image: none;
@@ -461,17 +458,17 @@ GraniteWidgetsPopOver .linked .button:active {
inset 0 -1px alpha(@dark_shadow, 0.05);
}
-GraniteWidgetsPopOver .linked .button:insensitive {
+GraniteWidgetsPopOver .linked .button:disabled {
box-shadow: inset -1px 0 shade(@menu_bg_color, 0.9);
}
/* remove box shadow from last-child and only-child */
GraniteWidgetsPopOver .linked .button:last-child,
GraniteWidgetsPopOver .linked .button:only-child,
-GraniteWidgetsPopOver .linked .button:insensitive:last-child,
-GraniteWidgetsPopOver .linked .button:insensitive:only-child,
-GraniteWidgetsPopOver .linked .button:active *:insensitive:last-child,
-GraniteWidgetsPopOver .linked .button:active *:insensitive:only-child {
+GraniteWidgetsPopOver .linked .button:disabled:last-child,
+GraniteWidgetsPopOver .linked .button:disabled:only-child,
+GraniteWidgetsPopOver .linked .button:active *:disabled:last-child,
+GraniteWidgetsPopOver .linked .button:active *:disabled:only-child {
box-shadow: none;
}
@@ -647,7 +644,7 @@ BirdieWidgetsTweetList * {
color: white;
font-weight: bold;
text-shadow: 0 1px 2px alpha (black, 0.5);
- icon-shadow: 0 1px 2px alpha (black, 0.5);
+ -gtk-icon-shadow: 0 1px 2px alpha (black, 0.5);
}
.panel .menu .menuitem {
@@ -670,7 +667,7 @@ BirdieWidgetsTweetList * {
}
.composited-indicator.menuitem:active,
-.composited-indicator.menuitem:prelight {
+.composited-indicator.menuitem:hover {
border-style: none;
background-image: none;
box-shadow: none;
diff --git a/themes/ayaya/gtk-3.0/apps/lightdm-gtk-greeter.css b/themes/ayaya/gtk-3.0/apps/lightdm-gtk-greeter.css
index 874cdb3..abb8415 100644
--- a/themes/ayaya/gtk-3.0/apps/lightdm-gtk-greeter.css
+++ b/themes/ayaya/gtk-3.0/apps/lightdm-gtk-greeter.css
@@ -5,9 +5,9 @@
background-color: transparent;
background-image: none;
color: white;
- font: bold;
+ font-weight: bold;
text-shadow: 0 1px alpha(black, 0.5);
- icon-shadow: 0 1px alpha(black, 0.5);
+ -gtk-icon-shadow: 0 1px alpha(black, 0.5);
}
#panel_window .menubar,
@@ -15,9 +15,8 @@
background-color: transparent;
background-image: none;
color: white;
- font: bold;
text-shadow: 0 1px alpha(black, 0.5);
- icon-shadow: 0 1px alpha(black, 0.5);
+ -gtk-icon-shadow: 0 1px alpha(black, 0.5);
}
#panel_window .menubar > .menuitem:hover {
@@ -31,7 +30,7 @@
color: white;
}
-#panel_window .menubar > .menuitem:insensitive {
+#panel_window .menubar > .menuitem:disabled {
color: alpha(white, 0.7);
}
@@ -40,7 +39,6 @@
}
#panel_window .menubar .menu .menuitem {
- font: normal;
text-shadow: none;
}
@@ -94,11 +92,11 @@
#login_window #user_combobox {
color: @lightdm_fg_color;
- font: 18px;
+ font-size: 18px;
}
#login_window #user_combobox .menu {
- font: normal;
+ font-weight: normal;
}
#login_window #user_combobox .arrow {
@@ -246,5 +244,5 @@
* password warning *
********************/
#greeter_infobar {
- font: bold;
+ font-weight: bold;
}
diff --git a/themes/ayaya/gtk-3.0/apps/nemo.css b/themes/ayaya/gtk-3.0/apps/nemo.css
index fa09d03..e696199 100644
--- a/themes/ayaya/gtk-3.0/apps/nemo.css
+++ b/themes/ayaya/gtk-3.0/apps/nemo.css
@@ -19,7 +19,7 @@
}
.nemo-desktop.nemo-canvas-item:active,
-.nemo-desktop.nemo-canvas-item:prelight,
+.nemo-desktop.nemo-canvas-item:hover,
.nemo-desktop.nemo-canvas-item:selected {
text-shadow: none;
}
diff --git a/themes/ayaya/gtk-3.0/apps/xfce.css b/themes/ayaya/gtk-3.0/apps/xfce.css
index 03cfb20..7ee7b04 100644
--- a/themes/ayaya/gtk-3.0/apps/xfce.css
+++ b/themes/ayaya/gtk-3.0/apps/xfce.css
@@ -10,7 +10,7 @@ XfceHeading {
.xfce4-panel {
background-color: @panel_bg_color;
color: @panel_fg_color;
- font: normal;
+ font-weight: normal;
}
.xfce4-panel .button {
@@ -34,5 +34,5 @@ XfceHeading {
}
.xfce4-panel .menu {
- -gtk-image-effect: none;
+ -gtk-icon-effect: none;
}
diff --git a/themes/ayaya/gtk-3.0/assets/checkbox-checked-insensitive-dark.svg b/themes/ayaya/gtk-3.0/assets/checkbox-checked-disabled-dark.svg
index c3219e2..c3219e2 100644
--- a/themes/ayaya/gtk-3.0/assets/checkbox-checked-insensitive-dark.svg
+++ b/themes/ayaya/gtk-3.0/assets/checkbox-checked-disabled-dark.svg
diff --git a/themes/ayaya/gtk-3.0/assets/checkbox-checked-insensitive.svg b/themes/ayaya/gtk-3.0/assets/checkbox-checked-disabled.svg
index 4dbe967..4dbe967 100644
--- a/themes/ayaya/gtk-3.0/assets/checkbox-checked-insensitive.svg
+++ b/themes/ayaya/gtk-3.0/assets/checkbox-checked-disabled.svg
diff --git a/themes/ayaya/gtk-3.0/assets/checkbox-mixed-insensitive-dark.svg b/themes/ayaya/gtk-3.0/assets/checkbox-mixed-disabled-dark.svg
index 27e0ef1..27e0ef1 100644
--- a/themes/ayaya/gtk-3.0/assets/checkbox-mixed-insensitive-dark.svg
+++ b/themes/ayaya/gtk-3.0/assets/checkbox-mixed-disabled-dark.svg
diff --git a/themes/ayaya/gtk-3.0/assets/checkbox-mixed-insensitive.svg b/themes/ayaya/gtk-3.0/assets/checkbox-mixed-disabled.svg
index d408465..d408465 100644
--- a/themes/ayaya/gtk-3.0/assets/checkbox-mixed-insensitive.svg
+++ b/themes/ayaya/gtk-3.0/assets/checkbox-mixed-disabled.svg
diff --git a/themes/ayaya/gtk-3.0/assets/checkbox-unchecked-insensitive-dark.svg b/themes/ayaya/gtk-3.0/assets/checkbox-unchecked-disabled-dark.svg
index 3488e66..3488e66 100644
--- a/themes/ayaya/gtk-3.0/assets/checkbox-unchecked-insensitive-dark.svg
+++ b/themes/ayaya/gtk-3.0/assets/checkbox-unchecked-disabled-dark.svg
diff --git a/themes/ayaya/gtk-3.0/assets/checkbox-unchecked-insensitive.svg b/themes/ayaya/gtk-3.0/assets/checkbox-unchecked-disabled.svg
index f90aa4c..f90aa4c 100644
--- a/themes/ayaya/gtk-3.0/assets/checkbox-unchecked-insensitive.svg
+++ b/themes/ayaya/gtk-3.0/assets/checkbox-unchecked-disabled.svg
diff --git a/themes/ayaya/gtk-3.0/assets/menuitem-checkbox-checked-insensitive.svg b/themes/ayaya/gtk-3.0/assets/menuitem-checkbox-checked-disabled.svg
index f570a1c..f570a1c 100644
--- a/themes/ayaya/gtk-3.0/assets/menuitem-checkbox-checked-insensitive.svg
+++ b/themes/ayaya/gtk-3.0/assets/menuitem-checkbox-checked-disabled.svg
diff --git a/themes/ayaya/gtk-3.0/assets/menuitem-checkbox-mixed-insensitive.svg b/themes/ayaya/gtk-3.0/assets/menuitem-checkbox-mixed-disabled.svg
index fd8b0d4..fd8b0d4 100644
--- a/themes/ayaya/gtk-3.0/assets/menuitem-checkbox-mixed-insensitive.svg
+++ b/themes/ayaya/gtk-3.0/assets/menuitem-checkbox-mixed-disabled.svg
diff --git a/themes/ayaya/gtk-3.0/assets/menuitem-radio-checked-insensitive.svg b/themes/ayaya/gtk-3.0/assets/menuitem-radio-checked-disabled.svg
index 0bc947f..0bc947f 100644
--- a/themes/ayaya/gtk-3.0/assets/menuitem-radio-checked-insensitive.svg
+++ b/themes/ayaya/gtk-3.0/assets/menuitem-radio-checked-disabled.svg
diff --git a/themes/ayaya/gtk-3.0/assets/radio-mixed-insensitive-dark.svg b/themes/ayaya/gtk-3.0/assets/radio-mixed-disabled-dark.svg
index 6b93fc4..6b93fc4 100644
--- a/themes/ayaya/gtk-3.0/assets/radio-mixed-insensitive-dark.svg
+++ b/themes/ayaya/gtk-3.0/assets/radio-mixed-disabled-dark.svg
diff --git a/themes/ayaya/gtk-3.0/assets/radio-mixed-insensitive.svg b/themes/ayaya/gtk-3.0/assets/radio-mixed-disabled.svg
index 9fa3659..9fa3659 100644
--- a/themes/ayaya/gtk-3.0/assets/radio-mixed-insensitive.svg
+++ b/themes/ayaya/gtk-3.0/assets/radio-mixed-disabled.svg
diff --git a/themes/ayaya/gtk-3.0/assets/radio-selected-insensitive-dark.svg b/themes/ayaya/gtk-3.0/assets/radio-selected-disabled-dark.svg
index f5cfbe0..f5cfbe0 100644
--- a/themes/ayaya/gtk-3.0/assets/radio-selected-insensitive-dark.svg
+++ b/themes/ayaya/gtk-3.0/assets/radio-selected-disabled-dark.svg
diff --git a/themes/ayaya/gtk-3.0/assets/radio-selected-insensitive.svg b/themes/ayaya/gtk-3.0/assets/radio-selected-disabled.svg
index e782ba6..e782ba6 100644
--- a/themes/ayaya/gtk-3.0/assets/radio-selected-insensitive.svg
+++ b/themes/ayaya/gtk-3.0/assets/radio-selected-disabled.svg
diff --git a/themes/ayaya/gtk-3.0/assets/radio-unselected-insensitive-dark.svg b/themes/ayaya/gtk-3.0/assets/radio-unselected-disabled-dark.svg
index 0fdfaf4..0fdfaf4 100644
--- a/themes/ayaya/gtk-3.0/assets/radio-unselected-insensitive-dark.svg
+++ b/themes/ayaya/gtk-3.0/assets/radio-unselected-disabled-dark.svg
diff --git a/themes/ayaya/gtk-3.0/assets/radio-unselected-insensitive.svg b/themes/ayaya/gtk-3.0/assets/radio-unselected-disabled.svg
index a0f2168..a0f2168 100644
--- a/themes/ayaya/gtk-3.0/assets/radio-unselected-insensitive.svg
+++ b/themes/ayaya/gtk-3.0/assets/radio-unselected-disabled.svg
diff --git a/themes/ayaya/gtk-3.0/gtk-widgets-assets-dark.css b/themes/ayaya/gtk-3.0/gtk-widgets-assets-dark.css
index 64cecb7..acd2692 100644
--- a/themes/ayaya/gtk-3.0/gtk-widgets-assets-dark.css
+++ b/themes/ayaya/gtk-3.0/gtk-widgets-assets-dark.css
@@ -6,48 +6,48 @@
-gtk-icon-source: url("assets/checkbox-unchecked-dark.svg");
}
-.check:insensitive {
- -gtk-icon-source: url("assets/checkbox-unchecked-insensitive-dark.svg");
+.check:disabled {
+ -gtk-icon-source: url("assets/checkbox-unchecked-disabled-dark.svg");
}
.check:checked {
-gtk-icon-source: url("assets/checkbox-checked-dark.svg");
}
-.check:checked:insensitive {
- -gtk-icon-source: url("assets/checkbox-checked-insensitive-dark.svg");
+.check:checked:disabled {
+ -gtk-icon-source: url("assets/checkbox-checked-disabled-dark.svg");
}
.check:inconsistent {
-gtk-icon-source: url("assets/checkbox-mixed-dark.svg");
}
-.check:inconsistent:insensitive {
- -gtk-icon-source: url("assets/checkbox-mixed-insensitive-dark.svg");
+.check:inconsistent:disabled {
+ -gtk-icon-source: url("assets/checkbox-mixed-disabled-dark.svg");
}
.radio {
-gtk-icon-source: url("assets/radio-unselected-dark.svg");
}
-.radio:insensitive {
- -gtk-icon-source: url("assets/radio-unselected-insensitive-dark.svg");
+.radio:disabled {
+ -gtk-icon-source: url("assets/radio-unselected-disabled-dark.svg");
}
.radio:checked {
-gtk-icon-source: url("assets/radio-selected-dark.svg");
}
-.radio:checked:insensitive {
- -gtk-icon-source: url("assets/radio-selected-insensitive-dark.svg");
+.radio:checked:disabled {
+ -gtk-icon-source: url("assets/radio-selected-disabled-dark.svg");
}
.radio:inconsistent {
-gtk-icon-source: url("assets/radio-mixed-dark.svg");
}
-.radio:inconsistent:insensitive {
- -gtk-icon-source: url("assets/radio-mixed-insensitive-dark.svg");
+.radio:inconsistent:disabled {
+ -gtk-icon-source: url("assets/radio-mixed-disabled-dark.svg");
}
.menuitem.check {
diff --git a/themes/ayaya/gtk-3.0/gtk-widgets-assets.css b/themes/ayaya/gtk-3.0/gtk-widgets-assets.css
index fac92c4..fc65df5 100644
--- a/themes/ayaya/gtk-3.0/gtk-widgets-assets.css
+++ b/themes/ayaya/gtk-3.0/gtk-widgets-assets.css
@@ -6,48 +6,48 @@
-gtk-icon-source: url("assets/checkbox-unchecked.svg");
}
-.check:insensitive {
- -gtk-icon-source: url("assets/checkbox-unchecked-insensitive.svg");
+.check:disabled {
+ -gtk-icon-source: url("assets/checkbox-unchecked-disabled.svg");
}
.check:checked {
-gtk-icon-source: url("assets/checkbox-checked.svg");
}
-.check:checked:insensitive {
- -gtk-icon-source: url("assets/checkbox-checked-insensitive.svg");
+.check:checked:disabled {
+ -gtk-icon-source: url("assets/checkbox-checked-disabled.svg");
}
-.check:inconsistent {
+.check:indeterminate {
-gtk-icon-source: url("assets/checkbox-mixed.svg");
}
-.check:inconsistent:insensitive {
- -gtk-icon-source: url("assets/checkbox-mixed-insensitive.svg");
+.check:indeterminate:disabled {
+ -gtk-icon-source: url("assets/checkbox-mixed-disabled.svg");
}
.radio {
-gtk-icon-source: url("assets/radio-unselected.svg");
}
-.radio:insensitive {
- -gtk-icon-source: url("assets/radio-unselected-insensitive.svg");
+.radio:disabled {
+ -gtk-icon-source: url("assets/radio-unselected-disabled.svg");
}
.radio:checked {
-gtk-icon-source: url("assets/radio-selected.svg");
}
-.radio:checked:insensitive {
- -gtk-icon-source: url("assets/radio-selected-insensitive.svg");
+.radio:checked:disabled {
+ -gtk-icon-source: url("assets/radio-selected-disabled.svg");
}
-.radio:inconsistent {
+.radio:indeterminate {
-gtk-icon-source: url("assets/radio-mixed.svg");
}
-.radio:inconsistent:insensitive {
- -gtk-icon-source: url("assets/radio-mixed-insensitive.svg");
+.radio:indeterminate:disabled {
+ -gtk-icon-source: url("assets/radio-mixed-disabled.svg");
}
.menuitem.check {
@@ -62,23 +62,23 @@
-gtk-icon-source: url("assets/menuitem-checkbox-checked-hover.svg");
}
-.menuitem.check:active:insensitive {
- -gtk-icon-source: url("assets/menuitem-checkbox-checked-insensitive.svg");
+.menuitem.check:active:disabled {
+ -gtk-icon-source: url("assets/menuitem-checkbox-checked-disabled.svg");
}
-.menuitem.check:inconsistent:hover,
-.menuitem.radio:inconsistent:hover {
+.menuitem.check:indeterminate:hover,
+.menuitem.radio:indeterminate:hover {
-gtk-icon-source: url("assets/menuitem-checkbox-mixed-hover.svg");
}
-.menuitem.check:inconsistent,
-.menuitem.radio:inconsistent {
+.menuitem.check:indeterminate,
+.menuitem.radio:indeterminate {
-gtk-icon-source: url("assets/menuitem-checkbox-mixed.svg");
}
-.menuitem.check:inconsistent:insensitive,
-.menuitem.radio:inconsistent:insensitive {
- -gtk-icon-source: url("assets/menuitem-checkbox-mixed-insensitive.svg");
+.menuitem.check:indeterminate:disabled,
+.menuitem.radio:indeterminate:disabled {
+ -gtk-icon-source: url("assets/menuitem-checkbox-mixed-disabled.svg");
}
.menuitem.radio {
@@ -93,8 +93,8 @@
-gtk-icon-source: url("assets/menuitem-radio-checked-hover.svg");
}
-.menuitem.radio:active:insensitive {
- -gtk-icon-source: url("assets/menuitem-radio-checked-insensitive.svg");
+.menuitem.radio:active:disabled {
+ -gtk-icon-source: url("assets/menuitem-radio-checked-disabled.svg");
}
GtkIconView.content-view.cell.check {
diff --git a/themes/ayaya/gtk-3.0/gtk-widgets.css b/themes/ayaya/gtk-3.0/gtk-widgets.css
index 5b0fa24..9db299a 100644
--- a/themes/ayaya/gtk-3.0/gtk-widgets.css
+++ b/themes/ayaya/gtk-3.0/gtk-widgets.css
@@ -15,8 +15,8 @@
-GtkCheckButton-indicator-size: 16;
-GtkCheckMenuItem-indicator-size: 14;
-GtkExpander-expander-size: 8;
- -GtkMenu-horizontal-padding: 0;
- -GtkMenu-vertical-padding: 0;
+ /*-GtkMenu-horizontal-padding: 0;
+ -GtkMenu-vertical-padding: 0;*/
-GtkPaned-handle-size: 4;
-GtkProgressBar-min-horizontal-bar-height: 12;
-GtkProgressBar-min-vertical-bar-width: 12;
@@ -39,8 +39,8 @@
-WnckTasklist-fade-overlay-rect: 0;
/* legacy only */
- -GtkWidget-focus-line-width: 1;
- -GtkWidget-focus-padding: 0;
+ /*-GtkWidget-focus-line-width: 1;
+ -GtkWidget-focus-padding: 0;*/
background-clip: padding-box;
@@ -63,7 +63,7 @@
.background:backdrop {
text-shadow: none;
- icon-shadow: none;
+ -gtk-icon-shadow: none;
}
*:selected,
@@ -72,18 +72,18 @@
color: @theme_selected_fg_color;
}
-*:insensitive,
-*:insensitive:insensitive {
+*:disabled,
+*:disabled:disabled {
color: mix(@theme_fg_color, @theme_bg_color, 0.5);
}
-/* apply effects to insensitive and prelit images */
-*:insensitive {
- -gtk-image-effect: dim;
+/* apply effects to disabled and prelit images */
+*:disabled {
+ -gtk-icon-effect: dim;
}
*:hover {
- -gtk-image-effect: highlight;
+ -gtk-icon-effect: highlight;
}
.gtkstyle-fallback {
@@ -91,7 +91,7 @@
color: @theme_fg_color;
}
-.gtkstyle-fallback:prelight {
+.gtkstyle-fallback:hover {
background-color: shade(@theme_bg_color, 1.1);
color: @theme_fg_color;
}
@@ -101,7 +101,7 @@
color: @theme_fg_color;
}
-.gtkstyle-fallback:insensitive {
+.gtkstyle-fallback:disabled {
background-color: shade(shade(@theme_bg_color, 0.95), 1.05);
color: mix(@theme_fg_color, @theme_bg_color, 0.5);
}
@@ -112,13 +112,13 @@
}
GtkImage,
-GtkImage:insensitive,
+GtkImage:disabled,
GtkLabel,
-GtkLabel:insensitive,
+GtkLabel:disabled,
GtkBox,
-GtkBox:insensitive,
+GtkBox:disabled,
GtkGrid,
-GtkGrid:insensitive {
+GtkGrid:disabled {
background-color: transparent;
}
@@ -128,8 +128,8 @@ GtkGrid:insensitive {
* {
-GtkHTML-link-color: @link_color;
-GtkIMHtml-hyperlink-color: @link_color;
- -GtkWidget-link-color: @link_color;
- -GtkWidget-visited-link-color: @link_color;
+ /*-GtkWidget-link-color: @link_color;
+ -GtkWidget-visited-link-color: @link_color;*/
}
*:link,
@@ -158,8 +158,8 @@ GtkGrid:insensitive {
}
notebook tab GtkLabel,
-notebook .prelight-page,
-notebook .prelight-page GtkLabel,
+notebook .hover-page,
+notebook .hover-page GtkLabel,
notebook .active-page,
notebook .active-page GtkLabel {
transition: all 200ms ease-in;
@@ -189,15 +189,15 @@ notebook.header {
}
/* disable inset shadow */
-.button:active:insensitive,
-.primary-toolbar .button:active:insensitive,
-.toolbar .button:active:insensitive,
-.header-bar .button:active:insensitive,
-.button:checked:insensitive,
-.primary-toolbar .button:checked:insensitive,
-.toolbar .button:checked:insensitive,
-.header-bar .button:checked:insensitive,
-.entry:insensitive {
+.button:active:disabled,
+.primary-toolbar .button:active:disabled,
+.toolbar .button:active:disabled,
+.header-bar .button:active:disabled,
+.button:checked:disabled,
+.primary-toolbar .button:checked:disabled,
+.toolbar .button:checked:disabled,
+.header-bar .button:checked:disabled,
+.entry:disabled {
box-shadow: none;
}
@@ -205,7 +205,6 @@ notebook.header {
* assistant *
*************/
GtkAssistant .sidebar .highlight {
- font: bold;
}
GtkAssistant .sidebar {
@@ -222,8 +221,8 @@ GtkAssistant .sidebar {
* button *
**********/
button {
- -GtkWidget-focus-padding: 1;
- -GtkWidget-focus-line-width: 0;
+ /*-GtkWidget-focus-padding: 1;*/
+ /*-GtkWidget-focus-line-width: 0;*/
padding: 3px;
border-width: 1px;
@@ -244,7 +243,7 @@ button:hover {
button:active,
button:checked {
/*border-color: shade(@selected_bg_color, 0.8);*/
- background-color: shade(@selected_bg_color 0.95);
+ background-color: shade(@selected_bg_color, 0.95);
background-image: none;
}
@@ -262,14 +261,14 @@ button:checked:hover:focus {
border-color: shade(@theme_bg_color, 0.7);
}
-button:insensitive {
+button:disabled {
border-color: shade(@theme_bg_color, 0.85);
background-color: shade(@theme_bg_color, 0.9);
background-image: none;
}
-button:active:insensitive,
-button:checked:insensitive {
+button:active:disabled,
+button:checked:disabled {
border-color: shade(@theme_bg_color, 0.75);
background-color: shade(@theme_bg_color, 0.80);
background-image: none;
@@ -300,7 +299,7 @@ button.default:checked:hover {
}
button.flat,
-button.flat:insensitive {
+button.flat:disabled {
border-color: transparent;
background-color: transparent;
background-image: none;
@@ -328,9 +327,6 @@ button.flat:checked {
row:selected,
row:selected:hover,
row:selected:focus {
- -GtkWidget-focus-padding: 1;
- -GtkWidget-focus-line-width: 0;
-
border-width: 1px 0;
border-style: solid;
border-color: shade(@theme_selected_bg_color, 0.9);
@@ -385,7 +381,6 @@ selection {
* content view *
****************/
.content-view.subtitle {
- font: smaller;
padding: 0 12px;
}
@@ -393,7 +388,7 @@ selection {
background-color: @theme_base_color;
}
-.content-view.view:prelight {
+.content-view.view:hover {
background-color: alpha(@theme_selected_bg_color, 0.6);
}
@@ -402,7 +397,7 @@ selection {
background-color: @theme_selected_bg_color;
}
-.content-view.view:insensitive {
+.content-view.view:disabled {
background-color: shade(@theme_base_color, 0.9);
}
@@ -423,8 +418,8 @@ GtkIconView.content-view.check:active {
background-color: transparent;
}
-GtkIconView.content-view.check:prelight,
-GtkIconView.content-view.check:insensitive,
+GtkIconView.content-view.check:hover,
+GtkIconView.content-view.check:disabled,
GtkIconView.content-view.check:selected {
background-color: transparent;
}
@@ -436,7 +431,7 @@ GtkDrawingArea {
background-color: transparent;
}
-GtkDrawingArea:insensitive {
+GtkDrawingArea:disabled {
background-color: shade(@theme_base_color, 0.9);
}
@@ -456,7 +451,7 @@ GtkCalendar {
outline-offset: -1px;
}
-GtkCalendar:inconsistent {
+GtkCalendar:indeterminate {
color: mix(@theme_fg_color, @theme_bg_color, 0.5);
}
@@ -464,7 +459,7 @@ GtkCalendar.view,
GtkCalendar.header,
GtkCalendar.button,
GtkCalendar.button:hover,
-GtkCalendar.button:insensitive {
+GtkCalendar.button:disabled {
border-width: 0;
background-color: transparent;
background-image: none;
@@ -483,11 +478,11 @@ GtkCalendar.highlight {
.primary-toolbar GtkComboBox.combobox-entry .entry,
.primary-toolbar GtkComboBox.combobox-entry .entry:active,
.primary-toolbar GtkComboBox.combobox-entry .entry:focus,
-.primary-toolbar GtkComboBox.combobox-entry .entry:insensitive,
+.primary-toolbar GtkComboBox.combobox-entry .entry:disabled,
GtkComboBox.combobox-entry .entry,
GtkComboBox.combobox-entry .entry:active,
GtkComboBox.combobox-entry .entry:focus,
-GtkComboBox.combobox-entry .entry:insensitive {
+GtkComboBox.combobox-entry .entry:disabled {
border-width: 1px 0 1px 1px;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
@@ -497,12 +492,12 @@ GtkComboBox.combobox-entry .entry:insensitive {
.primary-toolbar GtkComboBox.combobox-entry .button:hover,
.primary-toolbar GtkComboBox.combobox-entry .button:active,
.primary-toolbar GtkComboBox.combobox-entry .button:checked,
-.primary-toolbar GtkComboBox.combobox-entry .button:insensitive,
+.primary-toolbar GtkComboBox.combobox-entry .button:disabled,
GtkComboBox.combobox-entry .button,
GtkComboBox.combobox-entry .button:hover,
GtkComboBox.combobox-entry .button:active,
GtkComboBox.combobox-entry .button:checked,
-GtkComboBox.combobox-entry .button:insensitive {
+GtkComboBox.combobox-entry .button:disabled {
border-width: 1px 1px 1px 1px;
border-bottom-left-radius: 0;
border-top-left-radius: 0;
@@ -533,7 +528,7 @@ GtkComboBox.combobox-entry .button:insensitive {
color: @theme_selected_fg_color;
}
-.entry:insensitive {
+.entry:disabled {
background-color: shade(@theme_bg_color, 0.95);
background-image: none;
color: mix(@theme_text_color, @theme_base_color, 0.5);
@@ -998,9 +993,9 @@ GtkComboBox .menu {
.menu.button:hover,
.menu.button:active,
.menu.button:checked,
-.menu.button:active:insensitive,
-.menu.button:checked:insensitive,
-.menu.button:insensitive,
+.menu.button:active:disabled,
+.menu.button:checked:disabled,
+.menu.button:disabled,
.menu.button {
border-width: 0;
background-color: @menu_bg_color;
@@ -1075,8 +1070,6 @@ GtkTreeMenu .menuitem {
.menuitem,
.menu .menuitem {
- -GtkMenuItem-arrow-scaling: 0.5;
-
padding: 3px;
border-width: 1px;
border-style: solid;
@@ -1108,8 +1101,8 @@ menuitem label {
color: @theme_selected_fg_color;
}
-.menu .menuitem:insensitive,
-.menu .menuitem *:insensitive {
+.menu .menuitem:disabled,
+.menu .menuitem *:disabled {
color: mix(@menu_fg_color, @menu_bg_color, 0.5);
}
@@ -1117,8 +1110,8 @@ menuitem label {
.menuitem.radio,
.menuitem.check:hover,
.menuitem.radio:hover,
-.menuitem.check:insensitive,
-.menuitem.radio:insensitive {
+.menuitem.check:disabled,
+.menuitem.radio:disabled {
border-style: none;
background-color: transparent;
background-image: none;
@@ -1130,7 +1123,7 @@ menuitem label {
background-color: transparent;
}
-.menuitem GtkCalendar:inconsistent {
+.menuitem GtkCalendar:indeterminate {
color: mix(@menu_fg_color, @menu_bg_color, 0.5);
}
@@ -1156,14 +1149,14 @@ menuitem label {
.menuitem .accelerator {
color: #ff0000;
margin: 20px;
- display: none;
+ /*display: none;*/
}
.menuitem .accelerator:hover {
color: alpha(@theme_selected_fg_color, 0.8);
}
-.menuitem .accelerator:insensitive {
+.menuitem .accelerator:disabled {
color: alpha(mix(@menu_fg_color, @menu_bg_color, 0.5), 0.6);
}
@@ -1264,9 +1257,9 @@ GtkPopover .separator {
.menuitem.button,
.menuitem.button:active,
.menuitem.button:checked,
-.menuitem.button:insensitive,
-.menuitem.button:active:insensitive,
-.menuitem.button:checked:insensitive {
+.menuitem.button:disabled,
+.menuitem.button:active:disabled,
+.menuitem.button:checked:disabled {
background-color: transparent;
background-image: none;
border: none;
@@ -1295,9 +1288,9 @@ GtkModelButton.button:active:focus,
GtkModelButton.button:checked:focus,
GtkModelButton.button:active,
GtkModelButton.button:checked,
-GtkModelButton.button:insensitive:insensitive,
-GtkModelButton.button:active:insensitive,
-GtkModelButton.button:checked:insensitive,
+GtkModelButton.button:disabled:disabled,
+GtkModelButton.button:active:disabled,
+GtkModelButton.button:checked:disabled,
GtkModelButton.button {
background-color: transparent;
background-image: none;
@@ -1309,17 +1302,17 @@ GtkModelButton.button {
GtkModelButton.button:backdrop,
GtkModelButton.button:hover:backdrop,
-GtkModelButton.button:insensitive:backdrop,
-GtkModelButton.button:active:insensitive:backdrop,
+GtkModelButton.button:disabled:backdrop,
+GtkModelButton.button:active:disabled:backdrop,
GtkModelButton.button:active:backdrop,
GtkModelButton.button:active:hover:backdrop,
GtkModelButton.button:active:selected:backdrop,
-GtkModelButton.button:checked:insensitive:backdrop,
+GtkModelButton.button:checked:disabled:backdrop,
GtkModelButton.button:checked:backdrop,
GtkModelButton.button:checked:hover:backdrop,
GtkModelButton.button:checked:selected:backdrop {
text-shadow: none;
- icon-shadow: none;
+ -gtk-icon-shadow: none;
color: @theme_selected_fg_color;
background-color: transparent;
background-image: none;
@@ -1471,8 +1464,8 @@ notebook tab GtkLabel {
color: mix(@theme_text_color, @theme_base_color, 0.3);
}
-notebook .prelight-page,
-notebook .prelight-page GtkLabel {
+notebook .hover-page,
+notebook .hover-page GtkLabel {
color: mix (@theme_text_color, @theme_base_color, 0.15);
}
@@ -1717,7 +1710,7 @@ GtkScale.horizontal:hover {
inset 0 -1px shade(@theme_bg_color, 0.7);
}
-scale.slider:insensitive {
+scale.slider:disabled {
background-color: shade(@theme_bg_color, 0.9);
background-image: none;
box-shadow: inset 1px 0 shade(@theme_bg_color, 0.85),
@@ -1769,8 +1762,8 @@ scale.highlight.bottom {
background-image: none;
}
-scale.trough:insensitive,
-scale.highlight.left:insensitive {
+scale.trough:disabled,
+scale.highlight.left:disabled {
border-color: shade(@theme_bg_color, 0.85);
background-color: shade(@theme_bg_color, 0.9);
background-image: none;
@@ -1824,7 +1817,7 @@ scrollbar.slider.vertical:active {
background-color: @theme_selected_bg_color;
}
-scrollbar.slider.fine-tune:prelight:active {
+scrollbar.slider.fine-tune:hover:active {
border-width: 2px;
border-color: transparent;
}
@@ -1863,8 +1856,8 @@ OsScrollbar:active {
background-color: @theme_selected_bg_color;
}
-OsThumb:insensitive,
-OsScrollbar:insensitive {
+OsThumb:disabled,
+OsScrollbar:disabled {
background-color: shade(@theme_bg_color, 0.9);
}
@@ -1887,17 +1880,17 @@ OsScrollbar:insensitive {
border-color: shade(@theme_bg_color, 0.95);
}
-.button .separator:insensitive,
-.button.separator:insensitive {
+.button .separator:disabled,
+.button.separator:disabled {
border-color: shade(@theme_bg_color, 0.85);
}
.primary-toolbar GtkSeparatorToolItem,
.primary-toolbar .separator,
-.primary-toolbar .separator:insensitive,
+.primary-toolbar .separator:disabled,
.toolbar GtkSeparatorToolItem,
.toolbar .separator,
-.toolbar .separator:insensitive {
+.toolbar .separator:disabled {
-GtkWidget-window-dragging: true;
border-color: shade(@toolbar_bg_color, 0.95);
@@ -1906,10 +1899,10 @@ OsScrollbar:insensitive {
.header-bar GtkSeparatorToolItem,
.header-bar .separator,
-.header-bar .separator:insensitive,
+.header-bar .separator:disabled,
.titlebar GtkSeparatorToolItem,
.titlebar .separator,
-.titlebar .separator:insensitive {
+.titlebar .separator:disabled {
-GtkWidget-window-dragging: true;
border-color: shade(@titlebar_bg_color, 0.95);
@@ -1930,17 +1923,17 @@ OsScrollbar:insensitive {
border-color: shade(@titlebar_bg_color, 0.95);
}
-.primary-toolbar .button .separator:insensitive,
-.primary-toolbar .button.separator:insensitive,
-.toolbar .button .separator:insensitive,
-.toolbar .button.separator:insensitive {
+.primary-toolbar .button .separator:disabled,
+.primary-toolbar .button.separator:disabled,
+.toolbar .button .separator:disabled,
+.toolbar .button.separator:disabled {
border-color: shade(@toolbar_bg_color, 0.85);
}
-.header-bar .button .separator:insensitive,
-.header-bar .button.separator:insensitive,
-.titlebar .button .separator:insensitive,
-.titlebar .button.separator:insensitive {
+.header-bar .button .separator:disabled,
+.header-bar .button.separator:disabled,
+.titlebar .button .separator:disabled,
+.titlebar .button.separator:disabled {
border-color: shade(@titlebar_bg_color, 0.85);
}
@@ -1950,7 +1943,7 @@ OsScrollbar:insensitive {
color: #ff0000;
- border-style: 1px solid @theme_bg_color;
+ border: 1px solid @theme_bg_color;
color: shade(@menu_bg_color, 0.9);
}
@@ -1986,16 +1979,16 @@ GtkComboBox .separator {
color: @theme_selected_fg_color;
}
-.sidebar row:prelight,
-.sidebar .view row:prelight {
+.sidebar row:hover,
+.sidebar .view row:hover {
border-color: shade(@theme_bg_color, 1.05);
background-color: shade(@theme_bg_color, 1.05);
background-image: none;
color: @theme_fg_color;
}
-.sidebar row:selected:prelight,
-.sidebar .view row:selected:prelight {
+.sidebar row:selected:hover,
+.sidebar .view row:selected:hover {
border-color: shade(@theme_selected_bg_color, 1.05);
background-color: shade(@theme_selected_bg_color, 1.05);
background-image: none;
@@ -2020,7 +2013,7 @@ GtkComboBox .separator {
box-shadow: inset 1px 0 shade(@theme_base_color, 0.9);
}
-.spinbutton .button:insensitive {
+.spinbutton .button:disabled {
color: mix(@theme_text_color, @theme_base_color, 0.7);
box-shadow: inset 1px 0 shade(@theme_bg_color, 0.95);
}
@@ -2082,7 +2075,7 @@ GtkComboBox .separator {
border-color: shade(@theme_bg_color, 0.7);
}
-.spinbutton.vertical .button:insensitive {
+.spinbutton.vertical .button:disabled {
border-color: shade(@theme_bg_color, 0.85);
background-color: shade(@theme_bg_color, 0.9);
background-image: none;
@@ -2130,7 +2123,7 @@ GtkComboBox .separator {
animation: spin 1s linear infinite;
}
-.spinner:active:insensitive { opacity: 0.5; }
+.spinner:active:disabled { opacity: 0.5; }
.menu.spinner,
.menu .spinner,
@@ -2155,7 +2148,6 @@ GtkStatusbar {
GtkSwitch {
padding: 0;
border-radius: 2px;
- font: bold condensed;
outline-offset: -4px;
}
@@ -2167,7 +2159,7 @@ GtkSwitch.slider {
background-image: none;
}
-GtkSwitch.slider:insensitive {
+GtkSwitch.slider:disabled {
border-color: shade(@theme_bg_color, 0.85);
background-color: shade(@theme_bg_color, 0.9);
background-image: none;
@@ -2187,7 +2179,7 @@ GtkSwitch.trough:active {
color: @theme_selected_fg_color;
}
-GtkSwitch.trough:insensitive {
+GtkSwitch.trough:disabled {
border-color: shade(@theme_bg_color, 0.85);
background-color: shade(@theme_bg_color, 0.9);
background-image: none;
@@ -2326,12 +2318,10 @@ GtkColorButton.button {
}
.header-bar .title {
- font: bold;
padding: 0 12px;
}
.header-bar .subtitle {
- font: smaller;
padding: 0 12px;
}
@@ -2370,14 +2360,14 @@ GtkColorButton.button {
border-color: shade(@titlebar_bg_color, 0.7);
}
-.header-bar .button:insensitive {
+.header-bar .button:disabled {
border-color: shade(@titlebar_bg_color, 0.85);
background-color: shade(@titlebar_bg_color, 0.9);
background-image: none;
}
-.header-bar .button:active:insensitive,
-.header-bar .button:checked:insensitive {
+.header-bar .button:active:disabled,
+.header-bar .button:checked:disabled {
border-color: shade(@titlebar_bg_color, 0.75);
background-color: shade(@titlebar_bg_color, 0.80);
background-image: none;
@@ -2415,7 +2405,7 @@ GtkColorButton.button {
padding: 4px 3px 3px 4px;
}
-.toolbar:insensitive {
+.toolbar:disabled {
background-color: shade(@toolbar_bg_color, 0.9);
color: mix(@toolbar_fg_color, @toolbar_bg_color, 0.5);
}
@@ -2459,12 +2449,12 @@ GtkColorButton.button {
.primary-toolbar .button.flat,
.toolbar GtkComboBox.flat,
.toolbar .button.flat,
-.primary-toolbar GtkComboBox.flat:insensitive,
-.primary-toolbar .button.flat:insensitive,
-.primary-toolbar GtkComboBox.flat:insensitive,
-.primary-toolbar .button.flat:insensitive,
-.toolbar GtkComboBox.flat:insensitive,
-.toolbar .button.flat:insensitive {
+.primary-toolbar GtkComboBox.flat:disabled,
+.primary-toolbar .button.flat:disabled,
+.primary-toolbar GtkComboBox.flat:disabled,
+.primary-toolbar .button.flat:disabled,
+.toolbar GtkComboBox.flat:disabled,
+.toolbar .button.flat:disabled {
border-color: transparent;
background-color: transparent;
background-image: none;
@@ -2518,17 +2508,17 @@ GtkColorButton.button {
border-color: shade(@toolbar_bg_color, 0.7);
}
-.primary-toolbar .button:insensitive,
-.toolbar .button:insensitive {
+.primary-toolbar .button:disabled,
+.toolbar .button:disabled {
border-color: shade(@toolbar_bg_color, 0.85);
background-color: shade(@toolbar_bg_color, 0.9);
background-image: none;
}
-.primary-toolbar .button:active:insensitive,
-.toolbar .button:active:insensitive,
-.primary-toolbar .button:checked:insensitive,
-.toolbar .button:checked:insensitive {
+.primary-toolbar .button:active:disabled,
+.toolbar .button:active:disabled,
+.primary-toolbar .button:checked:disabled,
+.toolbar .button:checked:disabled {
border-color: shade(@toolbar_bg_color, 0.75);
background-color: shade(@toolbar_bg_color, 0.80);
background-image: none;
@@ -2603,17 +2593,17 @@ GtkColorButton.button {
border-color: shade(@theme_bg_color, 0.7);
}
-.inline-toolbar.toolbar .button:insensitive,
-.inline-toolbar.toolbar GtkToolButton .button:insensitive {
+.inline-toolbar.toolbar .button:disabled,
+.inline-toolbar.toolbar GtkToolButton .button:disabled {
border-color: shade(@theme_bg_color, 0.85);
background-color: shade(@theme_bg_color, 0.9);
background-image: none;
}
-.inline-toolbar.toolbar .button:active:insensitive
-.inline-toolbar.toolbar GtkToolButton .button:active:insensitive,
-.inline-toolbar.toolbar .button:checked:insensitive
-.inline-toolbar.toolbar GtkToolButton .button:checked:insensitive {
+.inline-toolbar.toolbar .button:active:disabled
+.inline-toolbar.toolbar GtkToolButton .button:active:disabled,
+.inline-toolbar.toolbar .button:checked:disabled
+.inline-toolbar.toolbar GtkToolButton .button:checked:disabled {
border-color: shade(@theme_bg_color, 0.75);
background-color: shade(@theme_bg_color, 0.80);
background-image: none;
@@ -2644,38 +2634,38 @@ GtkColorButton.button {
inset 0 -1px alpha(@dark_shadow, 0.05);
}
-.linked .button:insensitive,
-.inline-toolbar.toolbar .button:insensitive,
-.inline-toolbar.toolbar GtkToolButton .button:insensitive,
-.inline-toolbar.toolbar GtkToolButton > .button:insensitive {
+.linked .button:disabled,
+.inline-toolbar.toolbar .button:disabled,
+.inline-toolbar.toolbar GtkToolButton .button:disabled,
+.inline-toolbar.toolbar GtkToolButton > .button:disabled {
box-shadow: inset -1px 0 shade(@theme_bg_color, 0.85);
}
/* remove box shadow from last-child and only-child */
.linked .button:last-child,
.linked .button:only-child,
-.linked .button:insensitive:last-child,
-.linked .button:insensitive:only-child,
-.linked .button:active:insensitive:last-child,
-.linked .button:active:insensitive:only-child,
-.linked .button:checked:insensitive:last-child,
-.linked .button:checked:insensitive:only-child,
+.linked .button:disabled:last-child,
+.linked .button:disabled:only-child,
+.linked .button:active:disabled:last-child,
+.linked .button:active:disabled:only-child,
+.linked .button:checked:disabled:last-child,
+.linked .button:checked:disabled:only-child,
.inline-toolbar.toolbar .button:last-child,
.inline-toolbar.toolbar .button:only-child,
-.inline-toolbar.toolbar .button:insensitive:last-child,
-.inline-toolbar.toolbar .button:insensitive:only-child,
-.inline-toolbar.toolbar .button:active:insensitive:last-child,
-.inline-toolbar.toolbar .button:active:insensitive:only-child,
-.inline-toolbar.toolbar .button:checked:insensitive:last-child,
-.inline-toolbar.toolbar .button:checked:insensitive:only-child,
+.inline-toolbar.toolbar .button:disabled:last-child,
+.inline-toolbar.toolbar .button:disabled:only-child,
+.inline-toolbar.toolbar .button:active:disabled:last-child,
+.inline-toolbar.toolbar .button:active:disabled:only-child,
+.inline-toolbar.toolbar .button:checked:disabled:last-child,
+.inline-toolbar.toolbar .button:checked:disabled:only-child,
.inline-toolbar.toolbar GtkToolButton:last-child > .button,
.inline-toolbar.toolbar GtkToolButton:only-child > .button,
-.inline-toolbar.toolbar GtkToolButton:last-child > .button:insensitive,
-.inline-toolbar.toolbar GtkToolButton:only-child > .button:insensitive,
-.inline-toolbar.toolbar GtkToolButton:last-child > .button:active:insensitive,
-.inline-toolbar.toolbar GtkToolButton:only-child > .button:active:insensitive,
-.inline-toolbar.toolbar GtkToolButton:last-child > .button:checked:insensitive,
-.inline-toolbar.toolbar GtkToolButton:only-child > .button:checked:insensitive {
+.inline-toolbar.toolbar GtkToolButton:last-child > .button:disabled,
+.inline-toolbar.toolbar GtkToolButton:only-child > .button:disabled,
+.inline-toolbar.toolbar GtkToolButton:last-child > .button:active:disabled,
+.inline-toolbar.toolbar GtkToolButton:only-child > .button:active:disabled,
+.inline-toolbar.toolbar GtkToolButton:last-child > .button:checked:disabled,
+.inline-toolbar.toolbar GtkToolButton:only-child > .button:checked:disabled {
box-shadow: none;
}
@@ -2704,15 +2694,15 @@ GtkColorButton.button {
.linked .button:active:hover,
.linked .button:checked,
.linked .button:checked:hover,
-.linked .button:insensitive,
+.linked .button:disabled,
.inline-toolbar.toolbar .button,
.inline-toolbar.toolbar .button:active,
.inline-toolbar.toolbar .button:checked,
-.inline-toolbar.toolbar .button:insensitive,
+.inline-toolbar.toolbar .button:disabled,
.inline-toolbar.toolbar GtkToolButton .button,
.inline-toolbar.toolbar GtkToolButton .button:active,
.inline-toolbar.toolbar GtkToolButton .button:checked,
-.inline-toolbar.toolbar GtkToolButton .button:insensitive {
+.inline-toolbar.toolbar GtkToolButton .button:disabled {
border-width: 1px;
border-radius: 0;
border-right-width: 0;
@@ -2726,15 +2716,15 @@ GtkColorButton.button {
.linked .button:active:hover:first-child,
.linked .button:checked:first-child,
.linked .button:checked:hover:first-child,
-.linked .button:insensitive:first-child,
+.linked .button:disabled:first-child,
.inline-toolbar.toolbar .button:first-child,
.inline-toolbar.toolbar .button:active:first-child,
.inline-toolbar.toolbar .button:checked:first-child,
-.inline-toolbar.toolbar .button:insensitive:first-child,
+.inline-toolbar.toolbar .button:disabled:first-child,
.inline-toolbar.toolbar GtkToolButton:first-child .button,
.inline-toolbar.toolbar GtkToolButton:first-child .button:active,
.inline-toolbar.toolbar GtkToolButton:first-child .button:checked,
-.inline-toolbar.toolbar GtkToolButton:first-child .button:insensitive {
+.inline-toolbar.toolbar GtkToolButton:first-child .button:disabled {
border-width: 1px;
border-radius: 2px;
border-right-width: 0;
@@ -2749,15 +2739,15 @@ GtkColorButton.button {
.linked .button:active:hover:last-child,
.linked .button:checked:last-child,
.linked .button:checked:hover:last-child,
-.linked .button:insensitive:last-child,
+.linked .button:disabled:last-child,
.inline-toolbar.toolbar .button:last-child,
.inline-toolbar.toolbar .button:active:last-child,
.inline-toolbar.toolbar .button:checked:last-child,
-.inline-toolbar.toolbar .button:insensitive:last-child,
+.inline-toolbar.toolbar .button:disabled:last-child,
.inline-toolbar.toolbar GtkToolButton:last-child .button,
.inline-toolbar.toolbar GtkToolButton:last-child .button:active,
.inline-toolbar.toolbar GtkToolButton:last-child .button:checked,
-.inline-toolbar.toolbar GtkToolButton:last-child .button:insensitive {
+.inline-toolbar.toolbar GtkToolButton:last-child .button:disabled {
border-width: 1px;
border-radius: 2px;
border-left-width: 0;
@@ -2772,15 +2762,15 @@ GtkColorButton.button {
.linked .button:active:hover:only-child,
.linked .button:checked:only-child,
.linked .button:checked:hover:only-child,
-.linked .button:insensitive:only-child,
+.linked .button:disabled:only-child,
.inline-toolbar.toolbar .button:only-child,
.inline-toolbar.toolbar .button:active:only-child,
.inline-toolbar.toolbar .button:checked:only-child,
-.inline-toolbar.toolbar .button:insensitive:only-child,
+.inline-toolbar.toolbar .button:disabled:only-child,
.inline-toolbar.toolbar GtkToolButton:only-child .button,
.inline-toolbar.toolbar GtkToolButton:only-child .button:active,
.inline-toolbar.toolbar GtkToolButton:only-child .button:checked,
-.inline-toolbar.toolbar GtkToolButton:only-child .button:insensitive {
+.inline-toolbar.toolbar GtkToolButton:only-child .button:disabled {
border-width: 1px;
border-radius: 2px;
}
@@ -2804,37 +2794,37 @@ GtkColorButton.button {
inset -1px 0 alpha(@dark_shadow, 0.07);
}
-.linked.vertical .button:insensitive,
-.inline-toolbar.toolbar.vertical .button:insensitive,
-.inline-toolbar.toolbar.vertical GtkToolButton > .button:insensitive {
+.linked.vertical .button:disabled,
+.inline-toolbar.toolbar.vertical .button:disabled,
+.inline-toolbar.toolbar.vertical GtkToolButton > .button:disabled {
box-shadow: inset 0 -1px shade(@theme_bg_color, 0.85);
}
/* remove box shadow from last-child and only-child */
.linked.vertical .button:last-child,
.linked.vertical .button:only-child,
-.linked.vertical .button:insensitive:last-child,
-.linked.vertical .button:insensitive:only-child,
-.linked.vertical .button:active:insensitive:last-child,
-.linked.vertical .button:active:insensitive:only-child,
-.linked.vertical .button:checked:insensitive:last-child,
-.linked.vertical .button:checked:insensitive:only-child,
+.linked.vertical .button:disabled:last-child,
+.linked.vertical .button:disabled:only-child,
+.linked.vertical .button:active:disabled:last-child,
+.linked.vertical .button:active:disabled:only-child,
+.linked.vertical .button:checked:disabled:last-child,
+.linked.vertical .button:checked:disabled:only-child,
.inline-toolbar.toolbar.vertical .button:last-child,
.inline-toolbar.toolbar.vertical .button:only-child,
-.inline-toolbar.toolbar.vertical .button:insensitive:last-child,
-.inline-toolbar.toolbar.vertical .button:insensitive:only-child,
-.inline-toolbar.toolbar.vertical .button:active:insensitive:last-child,
-.inline-toolbar.toolbar.vertical .button:active:insensitive:only-child,
-.inline-toolbar.toolbar.vertical .button:checked:insensitive:last-child,
-.inline-toolbar.toolbar.vertical .button:checked:insensitive:only-child,
+.inline-toolbar.toolbar.vertical .button:disabled:last-child,
+.inline-toolbar.toolbar.vertical .button:disabled:only-child,
+.inline-toolbar.toolbar.vertical .button:active:disabled:last-child,
+.inline-toolbar.toolbar.vertical .button:active:disabled:only-child,
+.inline-toolbar.toolbar.vertical .button:checked:disabled:last-child,
+.inline-toolbar.toolbar.vertical .button:checked:disabled:only-child,
.inline-toolbar.toolbar.vertical GtkToolButton:last-child > .button,
.inline-toolbar.toolbar.vertical GtkToolButton:only-child > .button,
-.inline-toolbar.toolbar.vertical GtkToolButton:last-child > .button:insensitive,
-.inline-toolbar.toolbar.vertical GtkToolButton:only-child > .button:insensitive,
-.inline-toolbar.toolbar.vertical GtkToolButton:last-child > .button:active:insensitive,
-.inline-toolbar.toolbar.vertical GtkToolButton:only-child > .button:active:insensitive,
-.inline-toolbar.toolbar.vertical GtkToolButton:last-child > .button:checked:insensitive,
-.inline-toolbar.toolbar.vertical GtkToolButton:only-child > .button:checked:insensitive {
+.inline-toolbar.toolbar.vertical GtkToolButton:last-child > .button:disabled,
+.inline-toolbar.toolbar.vertical GtkToolButton:only-child > .button:disabled,
+.inline-toolbar.toolbar.vertical GtkToolButton:last-child > .button:active:disabled,
+.inline-toolbar.toolbar.vertical GtkToolButton:only-child > .button:active:disabled,
+.inline-toolbar.toolbar.vertical GtkToolButton:last-child > .button:checked:disabled,
+.inline-toolbar.toolbar.vertical GtkToolButton:only-child > .button:checked:disabled {
box-shadow: none;
}
@@ -2869,7 +2859,7 @@ GtkColorButton.button {
.linked.vertical .button:active:hover,
.linked.vertical .button:checked,
.linked.vertical .button:checked:hover,
-.linked.vertical .button:insensitive {
+.linked.vertical .button:disabled {
border-width: 1px;
border-radius: 0;
border-top-width: 0;
@@ -2883,7 +2873,7 @@ GtkColorButton.button {
.linked.vertical .button:active:hover:first-child,
.linked.vertical .button:checked:first-child,
.linked.vertical .button:checked:hover:first-child,
-.linked.vertical .button:insensitive:first-child {
+.linked.vertical .button:disabled:first-child {
border-width: 1px;
border-radius: 2px;
border-bottom-width: 0;
@@ -2898,7 +2888,7 @@ GtkColorButton.button {
.linked.vertical .button:active:hover:last-child,
.linked.vertical .button:checked:last-child,
.linked.vertical .button:checked:hover:last-child,
-.linked.vertical .button:insensitive:last-child {
+.linked.vertical .button:disabled:last-child {
border-width: 1px;
border-radius: 2px;
border-top-width: 0;
@@ -2913,7 +2903,7 @@ GtkColorButton.button {
.linked.vertical .button:active:hover:only-child,
.linked.vertical .button:checked:only-child,
.linked.vertical .button:checked:hover:only-child,
-.linked.vertical .button:insensitive:only-child {
+.linked.vertical .button:disabled:only-child {
border-width: 1px;
border-radius: 2px;
}
@@ -2942,55 +2932,55 @@ GtkColorButton.button {
inset 0 -1px alpha(@dark_shadow, 0.05);
}
-.primary-toolbar .button.raised.linked:insensitive,
-.primary-toolbar .raised.linked .button:insensitive,
-.toolbar .button.raised.linked:insensitive,
-.toolbar .raised.linked .button:insensitive,
-.toolbar .linked .button:insensitive {
+.primary-toolbar .button.raised.linked:disabled,
+.primary-toolbar .raised.linked .button:disabled,
+.toolbar .button.raised.linked:disabled,
+.toolbar .raised.linked .button:disabled,
+.toolbar .linked .button:disabled {
box-shadow: inset -1px 0 shade(@toolbar_bg_color, 0.85);
}
/* remove box shadow from last-child and only-child */
.primary-toolbar .button.raised.linked:last-child,
.primary-toolbar .button.raised.linked:only-child,
-.primary-toolbar .button:insensitive.raised.linked:last-child,
-.primary-toolbar .button:insensitive.raised.linked:only-child,
-.primary-toolbar .button:active:insensitive.raised.linked:last-child,
-.primary-toolbar .button:active:insensitive.raised.linked:only-child,
-.primary-toolbar .button:checked:insensitive.raised.linked:last-child,
-.primary-toolbar .button:checked:insensitive.raised.linked:only-child,
+.primary-toolbar .button:disabled.raised.linked:last-child,
+.primary-toolbar .button:disabled.raised.linked:only-child,
+.primary-toolbar .button:active:disabled.raised.linked:last-child,
+.primary-toolbar .button:active:disabled.raised.linked:only-child,
+.primary-toolbar .button:checked:disabled.raised.linked:last-child,
+.primary-toolbar .button:checked:disabled.raised.linked:only-child,
.primary-toolbar .raised.linked .button:last-child,
.primary-toolbar .raised.linked .button:only-child,
-.primary-toolbar .raised.linked .button:insensitive:last-child,
-.primary-toolbar .raised.linked .button:insensitive:only-child,
-.primary-toolbar .raised.linked .button:active:insensitive:last-child,
-.primary-toolbar .raised.linked .button:active:insensitive:only-child,
-.primary-toolbar .raised.linked .button:checked:insensitive:last-child,
-.primary-toolbar .raised.linked .button:checked:insensitive:only-child,
+.primary-toolbar .raised.linked .button:disabled:last-child,
+.primary-toolbar .raised.linked .button:disabled:only-child,
+.primary-toolbar .raised.linked .button:active:disabled:last-child,
+.primary-toolbar .raised.linked .button:active:disabled:only-child,
+.primary-toolbar .raised.linked .button:checked:disabled:last-child,
+.primary-toolbar .raised.linked .button:checked:disabled:only-child,
.toolbar .button.raised.linked:last-child,
.toolbar .button.raised.linked:only-child,
-.toolbar .button:insensitive.raised.linked:last-child,
-.toolbar .button:insensitive.raised.linked:only-child,
-.toolbar .button:active:insensitive.raised.linked:last-child,
-.toolbar .button:active:insensitive.raised.linked:only-child,
-.toolbar .button:checked:insensitive.raised.linked:last-child,
-.toolbar .button:checked:insensitive.raised.linked:only-child,
+.toolbar .button:disabled.raised.linked:last-child,
+.toolbar .button:disabled.raised.linked:only-child,
+.toolbar .button:active:disabled.raised.linked:last-child,
+.toolbar .button:active:disabled.raised.linked:only-child,
+.toolbar .button:checked:disabled.raised.linked:last-child,
+.toolbar .button:checked:disabled.raised.linked:only-child,
.toolbar .raised.linked .button:last-child,
.toolbar .raised.linked .button:only-child,
-.toolbar .raised.linked .button:insensitive:last-child,
-.toolbar .raised.linked .button:insensitive:only-child,
-.toolbar .raised.linked .button:active:insensitive:last-child,
-.toolbar .raised.linked .button:active:insensitive:only-child,
-.toolbar .raised.linked .button:checked:insensitive:last-child,
-.toolbar .raised.linked .button:checked:insensitive:only-child,
+.toolbar .raised.linked .button:disabled:last-child,
+.toolbar .raised.linked .button:disabled:only-child,
+.toolbar .raised.linked .button:active:disabled:last-child,
+.toolbar .raised.linked .button:active:disabled:only-child,
+.toolbar .raised.linked .button:checked:disabled:last-child,
+.toolbar .raised.linked .button:checked:disabled:only-child,
.toolbar .linked .button:last-child,
.toolbar .linked .button:only-child,
-.toolbar .linked .button:insensitive:last-child,
-.toolbar .linked .button:insensitive:only-child,
-.toolbar .linked .button:active:insensitive:last-child,
-.toolbar .linked .button:active:insensitive:only-child
-.toolbar .linked .button:checked:insensitive:last-child,
-.toolbar .linked .button:checked:insensitive:only-child {
+.toolbar .linked .button:disabled:last-child,
+.toolbar .linked .button:disabled:only-child,
+.toolbar .linked .button:active:disabled:last-child,
+.toolbar .linked .button:active:disabled:only-child
+.toolbar .linked .button:checked:disabled:last-child,
+.toolbar .linked .button:checked:disabled:only-child {
box-shadow: none;
}
@@ -3024,23 +3014,23 @@ GtkColorButton.button {
.primary-toolbar .button.raised.linked,
.primary-toolbar .button.raised.linked:active,
.primary-toolbar .button.raised.linked:checked,
-.primary-toolbar .button.raised.linked:insensitive,
+.primary-toolbar .button.raised.linked:disabled,
.primary-toolbar .raised.linked .button,
.primary-toolbar .raised.linked .button:active,
.primary-toolbar .raised.linked .button:checked,
-.primary-toolbar .raised.linked .button:insensitive,
+.primary-toolbar .raised.linked .button:disabled,
.toolbar .button.raised.linked,
.toolbar .button.raised.linked:active,
.toolbar .button.raised.linked:checked,
-.toolbar .button.raised.linked:insensitive,
+.toolbar .button.raised.linked:disabled,
.toolbar .raised.linked .button,
.toolbar .raised.linked .button:active,
.toolbar .raised.linked .button:checked,
-.toolbar .raised.linked .button:insensitive,
+.toolbar .raised.linked .button:disabled,
.toolbar .linked .button,
.toolbar .linked .button:active,
.toolbar .linked .button:checked,
-.toolbar .linked .button:insensitive {
+.toolbar .linked .button:disabled {
border-width: 1px;
border-radius: 0;
border-right-width: 0;
@@ -3051,19 +3041,19 @@ GtkColorButton.button {
.primary-toolbar .button.raised.linked:first-child,
.primary-toolbar .button.raised.linked:active:first-child,
.primary-toolbar .button.raised.linked:checked:first-child,
-.primary-toolbar .button.raised.linked:insensitive:first-child,
+.primary-toolbar .button.raised.linked:disabled:first-child,
.primary-toolbar .raised.linked .button:first-child,
.primary-toolbar .raised.linked .button:active:first-child,
.primary-toolbar .raised.linked .button:checked:first-child,
-.primary-toolbar .raised.linked .button:insensitive:first-child,
+.primary-toolbar .raised.linked .button:disabled:first-child,
.toolbar .button.raised.linked:first-child,
.toolbar .button.raised.linked:active:first-child,
.toolbar .button.raised.linked:checked:first-child,
-.toolbar .button.raised.linked:insensitive:first-child,
+.toolbar .button.raised.linked:disabled:first-child,
.toolbar .raised.linked .button:first-child,
.toolbar .raised.linked .button:active:first-child,
.toolbar .raised.linked .button:checked:first-child,
-.toolbar .raised.linked .button:insensitive:first-child,
+.toolbar .raised.linked .button:disabled:first-child,
.toolbar .linked .button:first-child,
.toolbar .linked .button:active:first-child,
.toolbar .linked .button:checked:first-child {
@@ -3078,23 +3068,23 @@ GtkColorButton.button {
.primary-toolbar .button.raised.linked:last-child,
.primary-toolbar .button.raised.linked:active:last-child,
.primary-toolbar .button.raised.linked:checked:last-child,
-.primary-toolbar .button.raised.linked:insensitive:last-child,
+.primary-toolbar .button.raised.linked:disabled:last-child,
.primary-toolbar .raised.linked .button:last-child,
.primary-toolbar .raised.linked .button:active:last-child,
.primary-toolbar .raised.linked .button:checked:last-child,
-.primary-toolbar .raised.linked .button:insensitive:last-child,
+.primary-toolbar .raised.linked .button:disabled:last-child,
.toolbar .button.raised.linked:last-child,
.toolbar .button.raised.linked:active:last-child,
.toolbar .button.raised.linked:checked:last-child,
-.toolbar .button.raised.linked:insensitive:last-child,
+.toolbar .button.raised.linked:disabled:last-child,
.toolbar .raised.linked .button:last-child,
.toolbar .raised.linked .button:active:last-child,
.toolbar .raised.linked .button:checked:last-child,
-.toolbar .raised.linked .button:insensitive:last-child,
+.toolbar .raised.linked .button:disabled:last-child,
.toolbar .linked .button:last-child,
.toolbar .linked .button:active:last-child,
.toolbar .linked .button:checked:last-child,
-.toolbar .linked .button:insensitive:last-child {
+.toolbar .linked .button:disabled:last-child {
border-width: 1px;
border-radius: 2px;
border-left-width: 0;
@@ -3106,23 +3096,23 @@ GtkColorButton.button {
.primary-toolbar .button.raised.linked:only-child,
.primary-toolbar .button.raised.linked:active:only-child,
.primary-toolbar .button.raised.linked:checked:only-child,
-.primary-toolbar .button.raised.linked:insensitive:only-child,
+.primary-toolbar .button.raised.linked:disabled:only-child,
.primary-toolbar .raised.linked .button:only-child,
.primary-toolbar .raised.linked .button:active:only-child,
.primary-toolbar .raised.linked .button:checked:only-child,
-.primary-toolbar .raised.linked .button:insensitive:only-child,
+.primary-toolbar .raised.linked .button:disabled:only-child,
.toolbar .button.raised.linked:only-child,
.toolbar .button.raised.linked:active:only-child,
.toolbar .button.raised.linked:checked:only-child,
-.toolbar .button.raised.linked:insensitive:only-child,
+.toolbar .button.raised.linked:disabled:only-child,
.toolbar .raised.linked .button:only-child,
.toolbar .raised.linked .button:active:only-child,
.toolbar .raised.linked .button:checked:only-child,
-.toolbar .raised.linked .button:insensitive:only-child,
+.toolbar .raised.linked .button:disabled:only-child,
.toolbar .linked .button:only-child,
.toolbar .linked .button:active:only-child,
.toolbar .linked .button:checked:only-child,
-.toolbar .linked .button:insensitive:only-child {
+.toolbar .linked .button:disabled:only-child {
border-width: 1px;
border-radius: 2px;
}
@@ -3146,37 +3136,37 @@ GtkColorButton.button {
inset 0 -1px alpha(@dark_shadow, 0.05);
}
-.header-bar .button.raised.linked:insensitive,
-.header-bar .raised.linked .button:insensitive,
-.header-bar .linked .button:insensitive {
+.header-bar .button.raised.linked:disabled,
+.header-bar .raised.linked .button:disabled,
+.header-bar .linked .button:disabled {
box-shadow: inset -1px 0 shade(@titlebar_bg_color, 0.85);
}
/* remove box shadow from last-child and only-child */
.header-bar .button.raised.linked:last-child,
.header-bar .button.raised.linked:only-child,
-.header-bar .button:insensitive.raised.linked:last-child,
-.header-bar .button:insensitive.raised.linked:only-child,
-.header-bar .button:active:insensitive.raised.linked:last-child,
-.header-bar .button:active:insensitive.raised.linked:only-child,
-.header-bar .button:checked:insensitive.raised.linked:last-child,
-.header-bar .button:checked:insensitive.raised.linked:only-child,
+.header-bar .button:disabled.raised.linked:last-child,
+.header-bar .button:disabled.raised.linked:only-child,
+.header-bar .button:active:disabled.raised.linked:last-child,
+.header-bar .button:active:disabled.raised.linked:only-child,
+.header-bar .button:checked:disabled.raised.linked:last-child,
+.header-bar .button:checked:disabled.raised.linked:only-child,
.header-bar .raised.linked .button:last-child,
.header-bar .raised.linked .button:only-child,
-.header-bar .raised.linked .button:insensitive:last-child,
-.header-bar .raised.linked .button:insensitive:only-child,
-.header-bar .raised.linked .button:active:insensitive:last-child,
-.header-bar .raised.linked .button:active:insensitive:only-child,
-.header-bar .raised.linked .button:checked:insensitive:last-child,
-.header-bar .raised.linked .button:checked:insensitive:only-child,
+.header-bar .raised.linked .button:disabled:last-child,
+.header-bar .raised.linked .button:disabled:only-child,
+.header-bar .raised.linked .button:active:disabled:last-child,
+.header-bar .raised.linked .button:active:disabled:only-child,
+.header-bar .raised.linked .button:checked:disabled:last-child,
+.header-bar .raised.linked .button:checked:disabled:only-child,
.header-bar .linked .button:last-child,
.header-bar .linked .button:only-child,
-.header-bar .linked .button:insensitive:last-child,
-.header-bar .linked .button:insensitive:only-child,
-.header-bar .linked .button:active:insensitive:last-child,
-.header-bar .linked .button:active:insensitive:only-child,
-.header-bar .linked .button:checked:insensitive:last-child,
-.header-bar .linked .button:checked:insensitive:only-child {
+.header-bar .linked .button:disabled:last-child,
+.header-bar .linked .button:disabled:only-child,
+.header-bar .linked .button:active:disabled:last-child,
+.header-bar .linked .button:active:disabled:only-child,
+.header-bar .linked .button:checked:disabled:last-child,
+.header-bar .linked .button:checked:disabled:only-child {
box-shadow: none;
}
@@ -3202,15 +3192,15 @@ GtkColorButton.button {
.header-bar .button.raised.linked,
.header-bar .button.raised.linked:active,
.header-bar .button.raised.linked:checked,
-.header-bar .button.raised.linked:insensitive,
+.header-bar .button.raised.linked:disabled,
.header-bar .raised.linked .button,
.header-bar .raised.linked .button:active,
.header-bar .raised.linked .button:checked,
-.header-bar .raised.linked .button:insensitive,
+.header-bar .raised.linked .button:disabled,
.header-bar .linked .button,
.header-bar .linked .button:active,
.header-bar .linked .button:checked,
-.header-bar .linked .button:insensitive {
+.header-bar .linked .button:disabled {
border-width: 1px;
border-radius: 0;
border-right-width: 0;
@@ -3220,13 +3210,13 @@ GtkColorButton.button {
/* leftmost button */
.header-bar .button.raised.linked:first-child,
.header-bar .button.raised.linked:active:first-child,
-.header-bar .button.raised.linked:insensitive:first-child,
+.header-bar .button.raised.linked:disabled:first-child,
.header-bar .raised.linked .button:first-child,
.header-bar .raised.linked .button:active:first-child,
-.header-bar .raised.linked .button:insensitive:first-child,
+.header-bar .raised.linked .button:disabled:first-child,
.header-bar .linked .button:first-child,
.header-bar .linked .button:active:first-child,
-.header-bar .linked .button:insensitive:first-child {
+.header-bar .linked .button:disabled:first-child {
border-width: 1px;
border-radius: 2px;
border-right-width: 0;
@@ -3238,15 +3228,15 @@ GtkColorButton.button {
.header-bar .button.raised.linked:last-child,
.header-bar .button.raised.linked:active:last-child,
.header-bar .button.raised.linked:checked:last-child,
-.header-bar .button.raised.linked:insensitive:last-child,
+.header-bar .button.raised.linked:disabled:last-child,
.header-bar .raised.linked .button:last-child,
.header-bar .raised.linked .button:active:last-child,
.header-bar .raised.linked .button:checked:last-child,
-.header-bar .raised.linked .button:insensitive:last-child,
+.header-bar .raised.linked .button:disabled:last-child,
.header-bar .linked .button:last-child,
.header-bar .linked .button:active:last-child,
.header-bar .linked .button:checked:last-child,
-.header-bar .linked .button:insensitive:last-child {
+.header-bar .linked .button:disabled:last-child {
border-width: 1px;
border-radius: 2px;
border-left-width: 0;
@@ -3258,15 +3248,15 @@ GtkColorButton.button {
.header-bar .button.raised.linked:only-child,
.header-bar .button.raised.linked:active:only-child,
.header-bar .button.raised.linked:checked:only-child,
-.header-bar .button.raised.linked:insensitive:only-child,
+.header-bar .button.raised.linked:disabled:only-child,
.header-bar .raised.linked .button:only-child,
.header-bar .raised.linked .button:active:only-child,
.header-bar .raised.linked .button:checked:only-child,
-.header-bar .raised.linked .button:insensitive:only-child,
+.header-bar .raised.linked .button:disabled:only-child,
.header-bar .linked .button:only-child,
.header-bar .linked .button:active:only-child,
.header-bar .linked .button:checked:only-child,
-.header-bar .linked .button:insensitive:only-child {
+.header-bar .linked .button:disabled:only-child {
border-width: 1px;
border-radius: 2px;
}
@@ -3322,8 +3312,8 @@ GtkViewport.frame {
color: @theme_text_color;
}
-.view:insensitive,
-.view:insensitive:insensitive {
+.view:disabled,
+.view:disabled:disabled {
background-color: shade(@theme_base_color, 0.9);
color: mix(@theme_fg_color, @theme_bg_color, 0.5);
}
@@ -3356,12 +3346,10 @@ GtkViewport.frame {
}
.action-bar .title {
- font: bold;
padding: 0 12px;
}
.action-bar .subtitle {
- font: smaller;
padding: 0 12px;
}
@@ -3470,7 +3458,7 @@ GtkOverlay.osd {
color: @osd_fg;
}
-.osd.button:prelight,
+.osd.button:hover,
.osd.button:hover,
.osd .button:hover {
border-color: shade(@osd_bg, 0.7);
@@ -3498,17 +3486,17 @@ GtkOverlay.osd {
border-color: shade(@osd_bg, 0.7);
}
-.osd.button:insensitive,
-.osd .button:insensitive {
+.osd.button:disabled,
+.osd .button:disabled {
border-color: shade(@osd_bg, 0.85);
background-color: shade(@osd_bg, 0.9);
background-image: none;
}
-.osd.button:active:insensitive,
-.osd .button:active:insensitive,
-.osd.button:checked:insensitive,
-.osd .button:checked:insensitive {
+.osd.button:active:disabled,
+.osd .button:active:disabled,
+.osd.button:checked:disabled,
+.osd .button:checked:disabled {
background-color: shade(@osd_bg, 0.80);
background-image: none;
}
@@ -3564,14 +3552,14 @@ GtkOverlay.osd {
border-color: shade(@osd_bg, 0.7);
}
-.osd.toolbar .button:insensitive {
+.osd.toolbar .button:disabled {
border-color: shade(@osd_bg, 0.85);
background-color: shade(@osd_bg, 0.9);
background-image: none;
}
-.osd.toolbar .button:active:insensitive,
-.osd.toolbar .button:checked:insensitive {
+.osd.toolbar .button:active:disabled,
+.osd.toolbar .button:checked:disabled {
border-color: shade(@osd_bg, 0.75);
background-color: shade(@osd_bg, 0.80);
background-image: none;
@@ -3629,7 +3617,7 @@ GtkOverlay.osd {
inset 0 -1px shade(@osd_bg, 0.7);
}
-.osd .scale.slider:insensitive {
+.osd .scale.slider:disabled {
background-color: shade(@osd_bg, 0.9);
background-image: none;
box-shadow: inset 1px 0 shade(@osd_bg, 0.85),
@@ -3650,8 +3638,8 @@ GtkOverlay.osd {
background-image: none;
}
-.osd .scale.trough:insensitive,
-.osd .scale.trough.highlight:insensitive {
+.osd .scale.trough:disabled,
+.osd .scale.trough.highlight:disabled {
border-color: shade(@osd_bg, 0.85);
background-color: shade(@osd_bg, 0.9);
background-image: none;
@@ -3963,7 +3951,6 @@ GtkBubbleWindow .toolbar {
}
.titlebar .title {
- font: bold;
}
.titlebar:backdrop {
@@ -3978,7 +3965,7 @@ GtkBubbleWindow .toolbar {
border-style: none;
background: none;
color: mix(@titlebar_fg_color, @titlebar_bg_color, 0.1);
- icon-shadow: none;
+ -gtk-icon-shadow: none;
}
.titlebar .titlebutton:hover,
@@ -4015,7 +4002,7 @@ GtkBubbleWindow .toolbar {
.titlebar .titlebutton:backdrop {
background-image: none;
color: mix(@titlebar_fg_color, @titlebar_bg_color, 0.4);
- icon-shadow: none;
+ -gtk-icon-shadow: none;
}
.window-frame {
diff --git a/themes/ayaya/gtk-3.0/gtk.css b/themes/ayaya/gtk-3.0/gtk.css
index a2afda5..1d436b4 100644
--- a/themes/ayaya/gtk-3.0/gtk.css
+++ b/themes/ayaya/gtk-3.0/gtk.css
@@ -68,10 +68,10 @@
@define-color wm_title_focused mix(@titlebar_fg_color, @titlebar_bg_color, 0.1);
@define-color wm_title_unfocused mix(@titlebar_fg_color, @titlebar_bg_color, 0.4);
@define-color wm_icons_focused mix(@titlebar_fg_color, @titlebar_bg_color, 0.1);
-@define-color wm_icons_focused_prelight @selected_bg_color;
+@define-color wm_icons_focused_hover @selected_bg_color;
@define-color wm_icons_focused_pressed shade(@selected_bg_color, 0.8);
@define-color wm_icons_unfocused mix(@titlebar_fg_color, @titlebar_bg_color, 0.4);
-@define-color wm_icons_unfocused_prelight @selected_bg_color;
+@define-color wm_icons_unfocused_hover @selected_bg_color;
@define-color wm_icons_unfocused_pressed shade(@selected_bg_color, 0.8);
@import url("gtk-widgets.css");
diff --git a/urxvt/ext/clipboard b/urxvt/ext/clipboard
new file mode 100644
index 0000000..05e1601
--- /dev/null
+++ b/urxvt/ext/clipboard
@@ -0,0 +1,115 @@
+#! perl -w
+# Author: Bert Muennich
+# Website: http://www.github.com/muennich/urxvt-perls
+# License: GPLv2
+
+# Use keyboard shortcuts to copy the selection to the clipboard and to paste
+# the clipboard contents (optionally escaping all special characters).
+# Requires xsel to be installed!
+
+# Usage: put the following lines in your .Xdefaults/.Xresources:
+# URxvt.perl-ext-common: ...,clipboard
+# URxvt.keysym.M-c: perl:clipboard:copy
+# URxvt.keysym.M-v: perl:clipboard:paste
+# URxvt.keysym.M-C-v: perl:clipboard:paste_escaped
+
+# Options:
+# URxvt.clipboard.autocopy: If true, PRIMARY overwrites clipboard
+
+# You can also overwrite the system commands to use for copying/pasting.
+# The default ones are:
+# URxvt.clipboard.copycmd: xsel -ib
+# URxvt.clipboard.pastecmd: xsel -ob
+# If you prefer xclip, then put these lines in your .Xdefaults/.Xresources:
+# URxvt.clipboard.copycmd: xclip -i -selection clipboard
+# URxvt.clipboard.pastecmd: xclip -o -selection clipboard
+# On Mac OS X, put these lines in your .Xdefaults/.Xresources:
+# URxvt.clipboard.copycmd: pbcopy
+# URxvt.clipboard.pastecmd: pbpaste
+
+# The use of the functions should be self-explanatory!
+
+use strict;
+
+sub on_start {
+ my ($self) = @_;
+
+ $self->{copy_cmd} = $self->x_resource('clipboard.copycmd') || 'xsel -ib';
+ $self->{paste_cmd} = $self->x_resource('clipboard.pastecmd') || 'xsel -ob';
+
+ if ($self->x_resource('clipboard.autocopy') eq 'true') {
+ $self->enable(sel_grab => \&sel_grab);
+ }
+
+ ()
+}
+
+sub copy {
+ my ($self) = @_;
+
+ if (open(CLIPBOARD, "| $self->{copy_cmd}")) {
+ my $sel = $self->selection();
+ utf8::encode($sel);
+ print CLIPBOARD $sel;
+ close(CLIPBOARD);
+ } else {
+ print STDERR "error running '$self->{copy_cmd}': $!\n";
+ }
+
+ ()
+}
+
+sub paste {
+ my ($self) = @_;
+
+ my $str = `$self->{paste_cmd}`;
+ if ($? == 0) {
+ $self->tt_paste($str);
+ } else {
+ print STDERR "error running '$self->{paste_cmd}': $!\n";
+ }
+
+ ()
+}
+
+sub paste_escaped {
+ my ($self) = @_;
+
+ my $str = `$self->{paste_cmd}`;
+ if ($? == 0) {
+ $str =~ s/([!#\$%&\*\(\) ='"\\\|\[\]`~,<>\?])/\\\1/g;
+ $self->tt_paste($str);
+ } else {
+ print STDERR "error running '$self->{paste_cmd}': $!\n";
+ }
+
+ ()
+}
+
+sub on_action {
+ my ($self, $action) = @_;
+
+ on_user_command($self, "clipboard:" . $action);
+}
+
+sub on_user_command {
+ my ($self, $cmd) = @_;
+
+ if ($cmd eq "clipboard:copy") {
+ $self->copy;
+ } elsif ($cmd eq "clipboard:paste") {
+ $self->paste;
+ } elsif ($cmd eq "clipboard:paste_escaped") {
+ $self->paste_escaped;
+ }
+
+ ()
+}
+
+sub sel_grab {
+ my ($self) = @_;
+
+ $self->copy;
+
+ ()
+}
diff --git a/urxvt/ext/keyboard-select b/urxvt/ext/keyboard-select
new file mode 100644
index 0000000..b60e9d8
--- /dev/null
+++ b/urxvt/ext/keyboard-select
@@ -0,0 +1,606 @@
+#! perl -w
+# Author: Bert Muennich
+# Website: http://www.github.com/muennich/urxvt-perls
+# License: GPLv2
+
+# Use keyboard shortcuts to select and copy text.
+
+# Usage: put the following lines in your .Xdefaults/.Xresources:
+# URxvt.perl-ext-common: ...,keyboard-select
+# URxvt.keysym.M-Escape: perl:keyboard-select:activate
+# The following line overwrites the default Meta-s binding and allows to
+# activate keyboard-select directly in backward search mode:
+# URxvt.keysym.M-s: perl:keyboard-select:search
+
+# Use Meta-Escape to activate selection mode, then use the following keys:
+# h/j/k/l: Move cursor left/down/up/right (also with arrow keys)
+# g/G/0/^/$/H/M/L/f/F/;/,/w/W/b/B/e/E: More vi-like cursor movement keys
+# '/'/?: Start forward/backward search
+# n/N: Repeat last search, N: in reverse direction
+# Ctrl-f/b: Scroll down/up one screen
+# Ctrl-d/u: Scroll down/up half a screen
+# v/V/Ctrl-v: Toggle normal/linewise/blockwise selection
+# y/Return: Copy selection to primary buffer, Return: quit afterwards
+# Y: Copy selected lines to primary buffer or cursor line and quit
+# q/Escape: Quit keyboard selection mode
+
+# Options:
+# URxvt.keyboard-select.clipboard: If true, copy to clipboard too
+
+
+use strict;
+
+sub on_start{
+ my ($self) = @_;
+
+ $self->{clipboard} = $self->x_resource_boolean('keyboard-select.clipboard');
+
+ $self->{patterns}{'w'} = qr/\w[^\w\s]|\W\w|\s\S/;
+ $self->{patterns}{'W'} = qr/\s\S/;
+ $self->{patterns}{'b'} = qr/.*(?:\w[^\w\s]|\W\w|\s\S)/;
+ $self->{patterns}{'B'} = qr/.*\s\S/;
+ $self->{patterns}{'e'} = qr/[^\w\s](?=\w)|\w(?=\W)|\S(?=\s|$)/;
+ $self->{patterns}{'E'} = qr/\S(?=\s|$)/;
+
+ ()
+}
+
+
+sub on_action {
+ my ($self, $action) = @_;
+
+ on_user_command($self, "keyboard-select:" . $action);
+}
+
+
+sub on_user_command {
+ my ($self, $cmd) = @_;
+
+ if (not $self->{active}) {
+ if ($cmd eq 'keyboard-select:activate') {
+ activate($self);
+ } elsif ($cmd eq 'keyboard-select:search') {
+ activate($self, 1);
+ }
+ }
+
+ ()
+}
+
+
+sub key_press {
+ my ($self, $event, $keysym, $char) = @_;
+ my $key = chr($keysym);
+
+ if (lc($key) eq 'c' && $event->{state} & urxvt::ControlMask) {
+ deactivate($self);
+ } elsif ($self->{search}) {
+ if ($keysym == 0xff1b) {
+ if ($self->{search_mode}) {
+ deactivate($self);
+ } else {
+ $self->{search} = '';
+ status_area($self);
+ }
+ } elsif ($keysym == 0xff08) {
+ $self->{search} = substr($self->{search}, 0, -1);
+ if (not $self->{search} and $self->{search_mode}) {
+ deactivate($self);
+ } else {
+ status_area($self);
+ }
+ } elsif ($keysym == 0xff0d ||
+ (lc($key) eq 'm' && $event->{state} & urxvt::ControlMask)) {
+ my $txt = substr($self->{search}, 1);
+ if ($txt) {
+ $self->{pattern} = ($txt =~ m/[[:upper:]]/) ? qr/\Q$txt\E/ :
+ qr/\Q$txt\E/i;
+ } elsif ($self->{pattern}) {
+ delete $self->{pattern};
+ }
+ $self->{search} = '';
+ $self->screen_cur($self->{srhcr}, $self->{srhcc});
+ if (not find_next($self)) {
+ if ($self->{search_mode}) {
+ deactivate($self);
+ } else {
+ status_area($self);
+ }
+ }
+ } elsif (length($char) > 0) {
+ $self->{search} .= $self->locale_decode($char);
+ my $txt = substr($self->{search}, 1);
+ if ($txt) {
+ $self->{pattern} = ($txt =~ m/[[:upper:]]/) ? qr/\Q$txt\E/ :
+ qr/\Q$txt\E/i;
+ } elsif ($self->{pattern}) {
+ delete $self->{pattern};
+ }
+ $self->screen_cur($self->{srhcr}, $self->{srhcc});
+ find_next($self);
+ status_area($self);
+ }
+ } elsif ($self->{move_to}) {
+ if ($keysym == 0xff1b) {
+ $self->{move_to} = 0;
+ status_area($self);
+ } elsif (length($char) > 0) {
+ $self->{move_to} = 0;
+ $self->{patterns}{'f-1'} = qr/^.*\Q$key\E/;
+ $self->{patterns}{'f+1'} = qr/^.+?\Q$key\E/;
+ move_to($self, ';');
+ status_area($self);
+ }
+ } elsif ($keysym == 0xff1b || lc($key) eq 'q') {
+ deactivate($self);
+ } elsif (lc($key) eq 'y' || $keysym == 0xff0d ||
+ (lc($key) eq 'm' && $event->{state} & urxvt::ControlMask)) {
+ my $quit = 0;
+ if ($key eq 'Y' && $self->{select} ne 'l') {
+ $quit = !$self->{select};
+ toggle_select($self, 'l');
+ }
+ if ($self->{select}) {
+ my ($br, $bc, $er, $ec) = calc_span($self);
+ $ec = $self->line($er)->l if $self->{select} eq 'l';
+ $self->selection_beg($br, $bc);
+ $self->selection_end($er, $ec);
+ $self->selection_make($event->{time}, $self->{select} eq 'b');
+ if ($self->{clipboard}) {
+ $self->selection($self->selection(), 1);
+ $self->selection_grab($event->{time}, 1);
+ }
+ if (lc($key) eq 'y') {
+ $self->selection_beg(1, 0);
+ $self->selection_end(1, 0);
+ $self->{select} = '';
+ status_area($self);
+ $self->want_refresh();
+ } else {
+ $quit = 1;
+ }
+ }
+ if ($quit) {
+ deactivate($self);
+ }
+ } elsif ($key eq 'V') {
+ toggle_select($self, 'l');
+ } elsif ($key eq 'v') {
+ if ($event->{state} & urxvt::ControlMask) {
+ toggle_select($self, 'b');
+ } else {
+ toggle_select($self, 'n');
+ }
+ } elsif ($key eq 'k' || $keysym == 0xff52) {
+ move_cursor($self, 'k');
+ } elsif ($key eq 'j' || $keysym == 0xff54) {
+ move_cursor($self, 'j');
+ } elsif ($key eq 'h' || $keysym == 0xff51) {
+ move_cursor($self, 'h');
+ } elsif ($key eq 'l' || $keysym == 0xff53) {
+ move_cursor($self, 'l');
+ } elsif ($keysym == 0xff57) {
+ move_cursor($self, '$');
+ } elsif ($keysym == 0xff50) {
+ move_cursor($self, '^');
+ } elsif ('gG0^$HML' =~ m/\Q$key\E/ ||
+ ('fbdu' =~ m/\Q$key\E/ && $event->{state} & urxvt::ControlMask)) {
+ move_cursor($self, $key);
+ } elsif (lc($key) eq 'f') {
+ $self->{move_to} = 1;
+ $self->{move_dir} = $key eq 'F' ? -1 : 1;
+ status_area($self, $key);
+ } elsif (';,wWbBeE' =~ m/\Q$key\E/) {
+ move_to($self, $key);
+ } elsif ($key eq '/' || $key eq '?') {
+ $self->{search} = $key;
+ $self->{search_dir} = $key eq '?' ? -1 : 1;
+ ($self->{srhcr}, $self->{srhcc}) = $self->screen_cur();
+ status_area($self);
+ } elsif (lc($key) eq 'n') {
+ find_next($self, $self->{search_dir} * ($key eq 'N' ? -1 : 1));
+ }
+
+ return 1;
+}
+
+
+sub move_cursor {
+ my ($self, $key) = @_;
+ my ($cr, $cc) = $self->screen_cur();
+ my $line = $self->line($cr);
+
+ if ($key eq 'k' && $line->beg > $self->top_row) {
+ $cr = $line->beg - 1;
+ } elsif ($key eq 'j' && $line->end < $self->nrow - 1) {
+ $cr = $line->end + 1;
+ } elsif ($key eq 'h' && $self->{offset} > 0) {
+ $self->{offset} = $line->offset_of($cr, $cc) - 1;
+ $self->{dollar} = 0;
+ } elsif ($key eq 'l' && $self->{offset} < $line->l - 1) {
+ ++$self->{offset};
+ } elsif ($key eq 'f' || $key eq 'd') {
+ my $vs = $self->view_start() +
+ ($key eq 'd' ? $self->nrow / 2 : $self->nrow - 1);
+ $vs = 0 if $vs > 0;
+ $cr += $vs - $self->view_start($vs);
+ } elsif ($key eq 'b' || $key eq 'u') {
+ my $vs = $self->view_start() -
+ ($key eq 'u' ? $self->nrow / 2 : $self->nrow - 1);
+ $vs = $self->top_row if $vs < $self->top_row;
+ $cr += $vs - $self->view_start($vs);
+ } elsif ($key eq 'g') {
+ ($cr, $self->{offset}) = ($self->top_row, 0);
+ $self->{dollar} = 0;
+ } elsif ($key eq 'G') {
+ ($cr, $self->{offset}) = ($self->nrow - 1, 0);
+ $self->{dollar} = 0;
+ } elsif ($key eq '0') {
+ $self->{offset} = 0;
+ $self->{dollar} = 0;
+ } elsif ($key eq '^') {
+ my $ltxt = $self->special_decode($line->t);
+ while ($ltxt =~ s/^( *)\t/$1 . " " x (8 - length($1) % 8)/e) {}
+ $self->{offset} = $ltxt =~ m/^ +/ ? $+[0] : 0;
+ $self->{dollar} = 0;
+ } elsif ($key eq '$') {
+ my $co = $line->offset_of($cr, $cc);
+ $self->{dollar} = $co + 1;
+ $self->{offset} = $line->l - 1;
+ } elsif ($key eq 'H') {
+ $cr = $self->view_start();
+ } elsif ($key eq 'M') {
+ $cr = $self->view_start() + $self->nrow / 2;
+ } elsif ($key eq 'L') {
+ $cr = $self->view_start() + $self->nrow - 1;
+ }
+
+ $line = $self->line($cr);
+ $cc = $self->{dollar} || $self->{offset} >= $line->l ? $line->l - 1 :
+ $self->{offset};
+ $self->screen_cur($line->coord_of($cc));
+
+ status_area($self);
+ $self->want_refresh();
+
+ ()
+}
+
+
+sub move_to {
+ my ($self, $key) = @_;
+ my ($cr, $cc) = $self->screen_cur();
+ my $line = $self->line($cr);
+ my $offset = $self->{offset};
+ my ($dir, $pattern);
+ my ($wrap, $found) = (0, 0);
+
+ if ($key eq ';' || $key eq ',') {
+ $dir = $self->{move_dir} * ($key eq ',' ? -1 : 1);
+ $pattern = $self->{patterns}{sprintf('f%+d', $dir)};
+ return if not $pattern;
+ } else {
+ if (lc($key) eq 'b') {
+ $dir = -1;
+ } else {
+ $dir = 1;
+ ++$offset if lc($key) eq 'e';
+ }
+ $pattern = $self->{patterns}{$key};
+ $wrap = 1;
+ }
+
+ if ($dir > 0) {
+ NEXTDOWN: my $text = substr($line->t, $offset);
+ if ($text =~ m/$pattern/) {
+ $offset += $+[0] - 1;
+ $found = 1;
+ } elsif ($wrap && $line->end + 1 < $self->nrow) {
+ $cr = $line->end + 1;
+ $line = $self->line($cr);
+ $offset = 0;
+ if (lc($key) eq 'e') {
+ goto NEXTDOWN;
+ } else {
+ $found = 1;
+ }
+ }
+ } elsif ($dir < 0) {
+ NEXTUP: my $text = substr($line->t, 0, $offset);
+ if ($text =~ m/$pattern/) {
+ $offset += $+[0] - length($text) - 1;
+ $found = 1;
+ } elsif ($wrap) {
+ if ($offset > 0) {
+ $offset = 0;
+ $found = 1;
+ } elsif ($line->beg > $self->top_row) {
+ $cr = $line->beg - 1;
+ $line = $self->line($cr);
+ $offset = $line->l;
+ goto NEXTUP;
+ }
+ }
+ }
+
+ if ($found) {
+ $self->{dollar} = 0;
+ $self->{offset} = $offset;
+ $self->screen_cur($line->coord_of($offset));
+ $self->want_refresh();
+ }
+
+ ()
+}
+
+
+sub find_next {
+ my ($self, $dir) = @_;
+
+ return if not $self->{pattern};
+ $dir = $self->{search_dir} if not $dir;
+
+ my ($cr, $cc) = $self->screen_cur();
+ my $line = $self->line($cr);
+ my $offset = $line->offset_of($cr, $cc);
+ my $text;
+ my $found = 0;
+
+ ++$offset if $dir > 0;
+
+ while (not $found) {
+ if ($dir > 0) {
+ $text = substr($line->t, $offset);
+ if ($text =~ m/$self->{pattern}/) {
+ $found = 1;
+ $offset += $-[0];
+ } else {
+ last if $line->end >= $self->nrow;
+ $line = $self->line($line->end + 1);
+ $offset = 0;
+ }
+ } else {
+ $text = substr($line->t, 0, $offset);
+ if ($text =~ m/$self->{pattern}/) {
+ $found = 1;
+ $offset = $-[0] while $text =~ m/$self->{pattern}/g;
+ } else {
+ last if $line->beg <= $self->top_row;
+ $line = $self->line($line->beg - 1);
+ $offset = $line->l;
+ }
+ }
+ }
+
+ if ($found) {
+ $self->{dollar} = 0;
+ $self->{offset} = $offset;
+ $self->screen_cur($line->coord_of($offset));
+ status_area($self);
+ $self->want_refresh();
+ }
+
+ return $found;
+}
+
+
+sub tt_write {
+ return 1;
+}
+
+
+sub refresh {
+ my ($self) = @_;
+ my ($cr, $cc) = $self->screen_cur();
+
+ # scroll the current cursor position into visible area
+ if ($cr < $self->view_start()) {
+ $self->view_start($cr);
+ } elsif ($cr >= $self->view_start() + $self->nrow) {
+ $self->view_start($cr - $self->nrow + 1);
+ }
+
+ if ($self->{select}) {
+ my ($hl, $reverse_cursor);
+ my ($br, $bc, $er, $ec) = calc_span($self);
+
+ if ($self->x_resource('highlightColor')) {
+ $hl = urxvt::RS_Sel;
+ $reverse_cursor = 0;
+ } else {
+ $hl = urxvt::RS_RVid;
+ $reverse_cursor = $self->{select} ne 'l';
+ }
+ if ($self->{select} eq 'b') {
+ my $co = $self->line($cr)->offset_of($cr, $cc);
+ my $dollar = $self->{dollar} && $co >= $self->{dollar} - 1;
+
+ my $r = $br;
+ while ($r <= $er) {
+ my $line = $self->line($r);
+ if ($bc < $line->l) {
+ $ec = $line->l if $dollar;
+ my ($br, $bc) = $line->coord_of($bc);
+ my ($er, $ec) = $line->coord_of($ec <= $line->l ? $ec : $line->l);
+ $self->scr_xor_span($br, $bc, $er, $ec, $hl);
+ } elsif ($r == $cr) {
+ $reverse_cursor = 0;
+ }
+ $r = $line->end + 1;
+ }
+ } else {
+ $self->scr_xor_span($br, $bc, $er, $ec, $hl);
+ }
+
+ if ($reverse_cursor) {
+ # make the cursor visible again
+ $self->scr_xor_span($cr, $cc, $cr, $cc + 1, $hl);
+ }
+ }
+
+ ()
+}
+
+
+sub activate {
+ my ($self, $search) = @_;
+
+ $self->{active} = 1;
+
+ $self->{select} = '';
+ $self->{dollar} = 0;
+ $self->{move_to} = 0;
+
+ if ($search) {
+ $self->{search} = '?';
+ $self->{search_dir} = -1;
+ $self->{search_mode} = 1;
+ } else {
+ $self->{search} = '';
+ $self->{search_mode} = 0;
+ }
+
+ ($self->{oldcr}, $self->{oldcc}) = $self->screen_cur();
+ ($self->{srhcr}, $self->{srhcc}) = $self->screen_cur();
+ $self->{old_view_start} = $self->view_start();
+ $self->{old_pty_ev_events} = $self->pty_ev_events(urxvt::EV_NONE);
+
+ my $line = $self->line($self->{oldcr});
+ $self->{offset} = $line->offset_of($self->{oldcr}, $self->{oldcc});
+
+ $self->selection_beg(1, 0);
+ $self->selection_end(1, 0);
+
+ $self->enable(
+ key_press => \&key_press,
+ refresh_begin => \&refresh,
+ refresh_end => \&refresh,
+ tt_write => \&tt_write,
+ );
+
+ if ($self->{offset} >= $line->l) {
+ $self->{offset} = $line->l > 0 ? $line->l - 1 : 0;
+ $self->screen_cur($line->coord_of($self->{offset}));
+ $self->want_refresh();
+ }
+
+ $self->{overlay_len} = 0;
+ status_area($self);
+
+ ()
+}
+
+
+sub deactivate {
+ my ($self) = @_;
+
+ $self->selection_beg(1, 0);
+ $self->selection_end(1, 0);
+
+ delete $self->{overlay} if $self->{overlay};
+
+ $self->disable("key_press", "refresh_begin", "refresh_end", "tt_write");
+ $self->screen_cur($self->{oldcr}, $self->{oldcc});
+ $self->view_start($self->{old_view_start});
+ $self->pty_ev_events($self->{old_pty_ev_events});
+
+ $self->want_refresh();
+
+ $self->{active} = 0;
+
+ ()
+}
+
+
+sub status_area {
+ my ($self, $extra) = @_;
+ my ($stat, $stat_len);
+
+ if ($self->{search}) {
+ $stat_len = $self->ncol;
+ $stat = $self->{search} . ' ' x ($stat_len - length($self->{search}));
+ } else {
+ if ($self->{select}) {
+ $stat = "-V" . ($self->{select} ne 'n' ? uc($self->{select}) : "") . "- ";
+ }
+
+ if ($self->top_row == 0) {
+ $stat .= "All";
+ } elsif ($self->view_start() == $self->top_row) {
+ $stat .= "Top";
+ } elsif ($self->view_start() == 0) {
+ $stat .= "Bot";
+ } else {
+ $stat .= sprintf("%2d%%",
+ ($self->top_row - $self->view_start) * 100 / $self->top_row);
+ }
+
+ $stat = "$extra $stat" if $extra;
+ $stat_len = length($stat);
+ }
+
+ if (!$self->{overlay} || $self->{overlay_len} != $stat_len) {
+ delete $self->{overlay} if $self->{overlay};
+ $self->{overlay} = $self->overlay(-1, -1, $stat_len, 1,
+ urxvt::OVERLAY_RSTYLE, 0);
+ $self->{overlay_len} = $stat_len;
+ }
+
+ $self->{overlay}->set(0, 0, $self->special_encode($stat));
+ $self->{overlay}->show();
+
+ ()
+}
+
+
+sub toggle_select {
+ my ($self, $mode) = @_;
+
+ if ($self->{select} eq $mode) {
+ $self->{select} = '';
+ } else {
+ if (not $self->{select}) {
+ ($self->{ar}, $self->{ac}) = $self->screen_cur();
+ }
+ $self->{select} = $mode;
+ }
+
+ status_area($self);
+ $self->want_refresh();
+
+ ()
+}
+
+
+sub calc_span {
+ my ($self) = @_;
+ my ($cr, $cc) = $self->screen_cur();
+ my ($br, $bc, $er, $ec);
+
+ if ($self->{select} eq 'b') {
+ $br = $self->line($cr)->beg;
+ $bc = $self->line($cr)->offset_of($cr, $cc);
+ $er = $self->line($self->{ar})->beg;
+ $ec = $self->line($self->{ar})->offset_of($self->{ar}, $self->{ac});
+ ($br, $er) = ($er, $br) if $br > $er;
+ ($bc, $ec) = ($ec, $bc) if $bc > $ec;
+ } else {
+ if ($cr < $self->{ar}) {
+ ($br, $bc, $er, $ec) = ($cr, $cc, $self->{ar}, $self->{ac});
+ } elsif ($cr > $self->{ar}) {
+ ($br, $bc, $er, $ec) = ($self->{ar}, $self->{ac}, $cr, $cc);
+ } else {
+ ($br, $er) = ($cr, $cr);
+ ($bc, $ec) = $cc < $self->{ac} ? ($cc, $self->{ac}) : ($self->{ac}, $cc);
+ }
+ }
+
+ if ($self->{select} eq 'l') {
+ ($br, $er) = ($self->line($br)->beg, $self->line($er)->end);
+ ($bc, $ec) = (0, $self->ncol);
+ } else {
+ ++$ec;
+ }
+
+ return ($br, $bc, $er, $ec);
+}
diff --git a/urxvt/ext/tabbed b/urxvt/ext/tabbed
new file mode 100644
index 0000000..f46059c
--- /dev/null
+++ b/urxvt/ext/tabbed
@@ -0,0 +1,476 @@
+#! perl
+
+#:META:RESOURCE:tabbar-fg:colour:tab bar foreground colour
+#:META:RESOURCE:tabbar-bg:colour:tab bar background colour
+#:META:RESOURCE:tab-fg:colour:tab foreground colour
+#:META:RESOURCE:tab-bg:colour:tab background colour
+
+=head1 NAME
+
+tabbed - tabbed interface to urxvt
+
+=head1 DESCRIPTION
+
+This transforms the terminal into a tabbar with additional terminals, that
+is, it implements what is commonly referred to as "tabbed terminal". The topmost line
+displays a "[NEW]" button, which, when clicked, will add a new tab, followed by one
+button per tab.
+
+Clicking a button will activate that tab. Pressing B<Shift-Left> and
+B<Shift-Right> will switch to the tab left or right of the current one,
+while B<Shift-Down> creates a new tab. Pressing B<Ctrl-Left> and
+B<Ctrl-Right> will renumber the current tab by moving it to the left or
+to the right.
+
+The tabbar itself can be configured similarly to a normal terminal, but
+with a resource class of C<URxvt.tabbed>. In addition, it supports the
+following four resources (shown with defaults):
+
+ URxvt.tabbed.tabbar-fg: <colour-index, default 3>
+ URxvt.tabbed.tabbar-bg: <colour-index, default 0>
+ URxvt.tabbed.tab-fg: <colour-index, default 0>
+ URxvt.tabbed.tab-bg: <colour-index, default 1>
+
+See I<COLOR AND GRAPHICS> in the urxvt(1) manpage for valid
+indices.
+
+=cut
+
+sub refresh {
+ my ($self) = @_;
+
+ my $ncol = $self->ncol;
+
+ # hide tabbar unless there are 2+ tabs
+ my $tabs = $self->{tabs} || [];
+ if (@$tabs <= 1) {
+ $self->{tabofs} = [];
+
+ my $text = " " x $ncol;
+ my $rend = [($self->{rs_tabbar}) x $ncol]; # or $self->{rs_default} if you prefer
+
+ $self->ROW_t (0, $text, 0, 0, $ncol);
+ $self->ROW_r (0, $rend, 0, 0, $ncol);
+
+ $self->want_refresh;
+ return;
+ }
+
+ my $text = " " x $ncol;
+ my $rend = [($self->{rs_tabbar}) x $ncol];
+
+ my @ofs;
+
+ substr $text, 0, 5, "[*] |";
+ @$rend[0 .. 4] = ($self->{rs_tab}) x 4;
+ @$rend[4] = ($self->{rs_tabbar});
+ push @ofs, [0, 4, sub { $_[0]->new_tab }];
+
+ my $ofs = 5;
+ my $idx = 0;
+
+ for my $tab (@{ $self->{tabs} }) {
+ $idx++;
+
+ my $act = $tab->{activity} && $tab != $self->{cur} ? "*" : " ";
+
+ my $txt = "$act$idx$act";
+ my $len = length $txt;
+
+ substr $text, $ofs, $len + 1, "$txt|";
+ @$rend[$ofs .. $ofs + $len - 1] = ($self->{rs_tab}) x $len
+ if $tab != $self->{cur};
+
+ push @ofs, [ $ofs, $ofs + $len, sub { $_[0]->make_current ($tab) } ];
+
+ $ofs += $len + 1;
+ }
+
+ $self->{tabofs} = \@ofs;
+
+ $self->ROW_t (0, $text, 0, 0, $ncol);
+ $self->ROW_r (0, $rend, 0, 0, $ncol);
+
+ $self->want_refresh;
+}
+
+sub new_tab {
+ my ($self, @argv) = @_;
+
+ # save a backlink to us, make sure tabbed is inactive
+ push @urxvt::TERM_INIT, sub {
+ my ($term) = @_;
+ $term->{parent} = $self;
+
+ for (0 .. urxvt::NUM_RESOURCES - 1) {
+ my $value = $self->{resource}[$_];
+
+ $term->resource ("+$_" => $value)
+ if defined $value;
+ }
+
+ $term->resource (perl_ext_2 => $term->resource ("perl_ext_2") . ",-tabbed");
+ };
+
+ push @urxvt::TERM_EXT, urxvt::ext::tabbed::tab::;
+
+ my $term = new urxvt::term
+ $self->env, $urxvt::RXVTNAME,
+ -embed => $self->parent,
+ @argv,
+ ;
+}
+
+sub effective_tabheight {
+ my ($self) = @_;
+ my $tabs = $self->{tabs} || [];
+ return (@$tabs > 1) ? $self->{tabheight} : 0;
+}
+
+sub configure {
+ my ($self) = @_;
+
+ my $tab = $self->{cur};
+ my $th = $self->effective_tabheight;
+
+ # force configurenotify (dirty trick stays dirty)
+ $tab->XMoveResizeWindow(
+ $tab->parent,
+ 0, $th + 1,
+ $self->width, $self->height - $th
+ );
+ $tab->XMoveResizeWindow(
+ $tab->parent,
+ 0, $th,
+ $self->width, $self->height - $th
+ );
+}
+
+sub on_resize_all_windows {
+ my ($self, $width, $height) = @_;
+
+ 1
+}
+
+sub copy_properties {
+ my ($self) = @_;
+ my $tab = $self->{cur};
+
+ my $wm_normal_hints = $self->XInternAtom ("WM_NORMAL_HINTS");
+
+ my $current = delete $self->{current_properties};
+
+ # pass 1: copy over properties different or nonexisting
+ for my $atom ($tab->XListProperties ($tab->parent)) {
+ my ($type, $format, $items) = $self->XGetWindowProperty ($tab->parent, $atom);
+
+ # fix up size hints
+ if ($atom == $wm_normal_hints) {
+ my (@hints) = unpack "l!*", $items;
+
+ $hints[$_] += $self->{tabheight} for (4, 6, 16);
+
+ $items = pack "l!*", @hints;
+ }
+
+ my $cur = delete $current->{$atom};
+
+ # update if changed, we assume empty items and zero type and format will not happen
+ $self->XChangeProperty ($self->parent, $atom, $type, $format, $items)
+ if $cur->[0] != $type or $cur->[1] != $format or $cur->[2] ne $items;
+
+ $self->{current_properties}{$atom} = [$type, $format, $items];
+ }
+
+ # pass 2, delete all extraneous properties
+ $self->XDeleteProperty ($self->parent, $_) for keys %$current;
+}
+
+sub make_current {
+ my ($self, $tab) = @_;
+
+ if (my $cur = $self->{cur}) {
+ delete $cur->{activity};
+ $cur->XUnmapWindow ($cur->parent) if $cur->mapped;
+ $cur->focus_out;
+ }
+
+ $self->{cur} = $tab;
+
+ $self->configure;
+ $self->copy_properties;
+
+ $tab->focus_out; # just in case, should be a nop
+ $tab->focus_in if $self->focus;
+
+ $tab->XMapWindow ($tab->parent);
+ delete $tab->{activity};
+ $self->refresh;
+
+ ()
+}
+
+sub on_focus_in {
+ my ($self, $event) = @_;
+
+ $self->{cur}->focus_in;
+
+ ()
+}
+
+sub on_focus_out {
+ my ($self, $event) = @_;
+
+ $self->{cur}->focus_out;
+
+ ()
+}
+
+sub on_tt_write {
+ my ($self, $octets) = @_;
+
+ $self->{cur}->tt_write ($octets);
+
+ 1
+}
+
+sub on_key_press {
+ my ($self, $event) = @_;
+
+ my $is_alt = ($event->{state} & urxvt::Mod1Mask) != 0;
+ my $keysym = 0;
+ eval { $keysym = $self->XKeycodeToKeysym ($event->{keycode}, 0); };
+ $keysym = 0 unless defined $keysym;
+
+ if ($is_alt && $keysym == 0x0074) { # Alt+T -> new tab
+ $self->new_tab;
+ return 1;
+ }
+
+ if ($is_alt && ($keysym == 0xff51 || $keysym == 0xff53)) { # Alt+Left/Right
+ my $tabs = $self->{tabs} || [];
+ if (@$tabs) {
+ my ($idx) = grep $tabs->[$_] == $self->{cur}, 0 .. $#$tabs;
+ $idx = 0 if !defined $idx;
+ $idx += ($keysym == 0xff51) ? -1 : +1;
+ $self->make_current ($tabs->[$idx % @$tabs]);
+ }
+ return 1;
+ }
+ ()
+}
+
+sub on_key_release {
+ my ($self, $event) = @_;
+ ()
+}
+
+sub on_button_press {
+ 1
+}
+
+sub on_button_release {
+ my ($self, $event) = @_;
+
+ if ($event->{row} == 0) {
+ for my $button (@{ $self->{tabofs} }) {
+ $button->[2]->($self, $event)
+ if $event->{col} >= $button->[0]
+ && $event->{col} < $button->[1];
+ }
+ }
+
+ 1
+}
+
+sub on_motion_notify {
+ 1
+}
+
+sub on_init {
+ my ($self) = @_;
+
+ $self->{resource} = [map $self->resource ("+$_"), 0 .. urxvt::NUM_RESOURCES - 1];
+
+ $self->resource (int_bwidth => 0);
+ $self->resource (name => "URxvt.tabbed");
+ $self->resource (pty_fd => -1);
+
+ $self->option ($urxvt::OPTION{scrollBar}, 0);
+
+ my $fg = $self->x_resource ("tabbar-fg");
+ my $bg = $self->x_resource ("tabbar-bg");
+ my $tabfg = $self->x_resource ("tab-fg");
+ my $tabbg = $self->x_resource ("tab-bg");
+
+ defined $fg or $fg = 3;
+ defined $bg or $bg = 0;
+ defined $tabfg or $tabfg = 0;
+ defined $tabbg or $tabbg = 1;
+
+ $self->{rs_tabbar} = urxvt::SET_COLOR (urxvt::DEFAULT_RSTYLE, $fg + 2, $bg + 2);
+ $self->{rs_tab} = urxvt::SET_COLOR (urxvt::DEFAULT_RSTYLE, $tabfg + 2, $tabbg + 2);
+
+ ()
+}
+
+sub on_start {
+ my ($self) = @_;
+
+ $self->{tabheight} = $self->int_bwidth + $self->fheight + $self->lineSpace;
+
+ $self->cmd_parse ("\033[?25l");
+
+ my @argv = $self->argv;
+
+ do {
+ shift @argv;
+ } while @argv && $argv[0] ne "-e";
+
+ $self->new_tab (@argv);
+
+ ()
+}
+
+sub on_configure_notify {
+ my ($self, $event) = @_;
+
+ $self->configure;
+ $self->refresh;
+
+ ()
+}
+
+sub on_wm_delete_window {
+ my ($self) = @_;
+
+ $_->destroy for @{ $self->{tabs} };
+
+ 1
+}
+
+sub tab_start {
+ my ($self, $tab) = @_;
+
+ $tab->XChangeInput ($tab->parent, urxvt::PropertyChangeMask);
+
+ push @{ $self->{tabs} }, $tab;
+
+# $tab->{name} ||= scalar @{ $self->{tabs} };
+ $self->make_current ($tab);
+
+ ()
+}
+
+sub tab_destroy {
+ my ($self, $tab) = @_;
+
+ $self->{tabs} = [ grep $_ != $tab, @{ $self->{tabs} } ];
+
+ if (@{ $self->{tabs} }) {
+ if ($self->{cur} == $tab) {
+ delete $self->{cur};
+ $self->make_current ($self->{tabs}[-1]);
+ } else {
+ $self->refresh;
+ }
+ } else {
+ # delay destruction a tiny bit
+ $self->{destroy} = urxvt::iw->new->start->cb (sub { $self->destroy });
+ }
+
+ ()
+}
+
+sub tab_key_press {
+ my ($self, $tab, $event, $keysym, $str) = @_;
+
+ my $tabs = $self->{tabs} || [];
+
+ my $is_alt = ($event->{state} & urxvt::Mod1Mask) != 0;
+ my $is_ctrl = ($event->{state} & urxvt::ControlMask) != 0;
+
+ if ($is_alt && (($keysym|0) == 0x0074)) {
+ $self->new_tab;
+ return 1;
+ }
+
+ if ($is_alt && ($keysym == 0xff51 || $keysym == 0xff53)) {
+ my ($idx) = grep $tabs->[$_] == $tab, 0 .. $#$tabs;
+ $idx = 0 if !defined $idx;
+
+ $idx += ($keysym == 0xff51) ? -1 : +1;
+
+ $self->make_current($tabs->[$idx % @$tabs]) if @$tabs;
+ return 1;
+ }
+
+ if ($is_alt && ($event->{state} & urxvt::ShiftMask)
+ && ($keysym == 0xff51 || $keysym == 0xff53)) {
+
+ my ($idx1) = grep $tabs->[$_] == $tab, 0 .. $#$tabs;
+ $idx1 = 0 if !defined $idx1;
+
+ my $idx2 = ($idx1 + (($keysym == 0xff51) ? -1 : +1)) % @$tabs;
+
+ ($tabs->[$idx1], $tabs->[$idx2]) = ($tabs->[$idx2], $tabs->[$idx1]);
+ $self->make_current($tabs->[$idx2]);
+
+ return 1;
+ }
+
+ ()
+}
+
+sub tab_property_notify {
+ my ($self, $tab, $event) = @_;
+
+ $self->copy_properties
+ if $event->{window} == $tab->parent;
+
+ ()
+}
+
+sub tab_activity {
+ my ($self, $tab) = @_;
+
+ $self->refresh;
+}
+
+package urxvt::ext::tabbed::tab;
+
+# helper extension implementing the subwindows of a tabbed terminal.
+# simply proxies all interesting calls back to the tabbed class.
+
+{
+ for my $hook (qw(start destroy property_notify)) {
+ eval qq{
+ sub on_$hook {
+ my \$parent = \$_[0]{term}{parent}
+ or return;
+ \$parent->tab_$hook (\@_)
+ }
+ };
+ die if $@;
+ }
+}
+
+sub on_key_press {
+ my ($self, $event) = @_;
+ my $parent = $self->{term}{parent}
+ or return;
+
+ my $keysym = 0;
+ eval { $keysym = $self->XKeycodeToKeysym ($event->{keycode}, 0); };
+ $keysym = 0 unless defined $keysym;
+
+ return $parent->tab_key_press ($self, $event, $keysym, "");
+}
+
+sub on_add_lines {
+ $_[0]->{activity}++
+ or $_[0]{term}{parent}->tab_activity ($_[0]);
+ ()
+}
+
+
diff --git a/urxvt/ext/url-select b/urxvt/ext/url-select
new file mode 100644
index 0000000..34637bb
--- /dev/null
+++ b/urxvt/ext/url-select
@@ -0,0 +1,408 @@
+#! perl -w
+# Author: Bert Muennich
+# Website: http://www.github.com/muennich/urxvt-perls
+# Based on: http://www.jukie.net/~bart/blog/urxvt-url-yank
+# License: GPLv2
+
+# Use keyboard shortcuts to select URLs.
+# This should be used as a replacement for the default matcher extension,
+# it also makes URLs clickable with the middle mouse button.
+
+# Usage: put the following lines in your .Xdefaults/.Xresources:
+# URxvt.perl-ext-common: ...,url-select
+# URxvt.keysym.M-u: perl:url-select:select_next
+
+# Use Meta-u to activate URL selection mode, then use the following keys:
+# j/k: Select next downward/upward URL (also with arrow keys)
+# g/G: Select first/last URL (also with home/end key)
+# o/Return: Open selected URL in browser, Return: deactivate afterwards
+# y: Copy (yank) selected URL and deactivate selection mode
+# q/Escape: Deactivate URL selection mode
+
+# Options:
+# URxvt.url-select.autocopy: If true, selected URLs are copied to PRIMARY
+# URvxt.url-select.button: Mouse button to click-open URLs (default: 2)
+# URxvt.url-select.launcher: Browser/command to open selected URL with
+# URxvt.url-select.underline: If set to true, all URLs get underlined
+
+use strict;
+
+# The custom rendition bit to use for marking the cell as being underlined
+# by us so we can unset it again after a line has changed.
+use constant UNDERLINED => 1<<3; # arbitrarily chosen in hope of no collision
+
+sub on_start {
+ my ($self) = @_;
+
+ # read resource settings
+ if ($self->x_resource('url-select.launcher')) {
+ @{$self->{browser}} = split /\s+/, $self->x_resource('url-select.launcher');
+ } else {
+ @{$self->{browser}} = ('x-www-browser');
+ }
+ if ($self->x_resource('url-select.underline') eq 'true') {
+ $self->enable(line_update => \&line_update);
+ }
+ if ($self->x_resource('url-select.autocopy') eq 'true') {
+ $self->{autocopy} = 1;
+ }
+
+ $self->{state} = 0;
+
+ for my $mod (split '', $self->x_resource("url-select.button") ||
+ $self->x_resource("matcher.button") || 2) {
+ if ($mod =~ /^\d+$/) {
+ $self->{button} = $mod;
+ } elsif ($mod eq "C") {
+ $self->{state} |= urxvt::ControlMask;
+ } elsif ($mod eq "S") {
+ $self->{state} |= urxvt::ShiftMask;
+ } elsif ($mod eq "M") {
+ $self->{state} |= $self->ModMetaMask;
+ } elsif ($mod ne "-" && $mod ne " ") {
+ warn("invalid button/modifier in $self->{_name}<$self->{argv}[0]>: $mod\n");
+ }
+ }
+
+ if ($self->x_resource('matcher.pattern')) {
+ @{$self->{pattern}} = ($self->x_resource('matcher.pattern'));
+ } elsif ($self->x_resource('matcher.pattern.0')) {
+ my $current = 0;
+
+ while (defined (my $res = $self->x_resource("matcher.pattern.$current"))) {
+ $res = $self->locale_decode($res);
+ utf8::encode $res;
+ push @{$self->{pattern}}, qr($res)x;
+ $current++;
+ }
+ } else {
+ @{$self->{pattern}} = qr{
+ (?:https?://|ftp://|news://|mailto:|file://|\bwww\.)
+ [\w\-\@;\/?:&=%\$.+!*\x27,~#]*
+ (
+ \([\w\-\@;\/?:&=%\$.+!*\x27,~#]*\) # Allow a pair of matched parentheses
+ | #
+ [\w\-\@;\/?:&=%\$+*~] # exclude some trailing characters (heuristic)
+ )+
+ }x;
+ }
+
+ ()
+}
+
+
+sub line_update {
+ my ($self, $row) = @_;
+
+ my $line = $self->line($row);
+ my $text = $line->t;
+ my $rend = $line->r;
+
+ # clear all underlines that were set by us
+ for (@$rend) {
+ if (urxvt::GET_CUSTOM($_) & UNDERLINED) {
+ $_ = urxvt::SET_CUSTOM($_, urxvt::GET_CUSTOM($_) & ~UNDERLINED) &
+ ~urxvt::RS_Uline;
+ }
+ }
+
+ for my $pattern (@{$self->{pattern}}) {
+ while ($text =~ /$pattern/g) {
+ my $url = $&;
+ my ($beg, $end) = ($-[0], $+[0] - 1);
+
+ for (@{$rend}[$beg .. $end]) {
+ unless ($_ & urxvt::RS_Uline) {
+ $_ = urxvt::SET_CUSTOM($_, urxvt::GET_CUSTOM($_) | UNDERLINED);
+ $_ |= urxvt::RS_Uline;
+ }
+ }
+ }
+ }
+
+ $line->r($rend);
+
+ ()
+}
+
+sub on_action {
+ my ($self, $action) = @_;
+
+ on_user_command($self, "url-select:" . $action);
+}
+
+
+sub on_user_command {
+ my ($self, $cmd) = @_;
+
+ if ($cmd eq 'url-select:select_next') {
+ if (not $self->{active}) {
+ activate($self);
+ }
+ select_next($self, -1);
+ }
+
+ ()
+}
+
+
+sub key_press {
+ my ($self, $event, $keysym) = @_;
+ my $char = chr($keysym);
+
+ if ($keysym == 0xff1b || lc($char) eq 'q' ||
+ (lc($char) eq 'c' && $event->{state} & urxvt::ControlMask)) {
+ deactivate($self);
+ } elsif ($keysym == 0xff0d || $char eq 'o' ||
+ (lc($char) eq 'm' && $event->{state} & urxvt::ControlMask)) {
+ $self->exec_async(@{$self->{browser}}, ${$self->{found}[$self->{n}]}[4]);
+ deactivate($self) unless $char eq 'o';
+ } elsif ($char eq 'y') {
+ my $found = $self->{found}[$self->{n}];
+ $self->selection_beg(${$found}[0], ${$found}[1]);
+ $self->selection_end(${$found}[2], ${$found}[3]);
+ $self->selection_make($event->{time});
+ $self->selection_beg(1, 0);
+ $self->selection_end(1, 0);
+ deactivate($self);
+ } elsif ($char eq 'k' || $keysym == 0xff52 || $keysym == 0xff51) {
+ select_next($self, -1, $event);
+ } elsif ($char eq 'j' || $keysym == 0xff54 || $keysym == 0xff53) {
+ select_next($self, 1, $event);
+ } elsif ($char eq 'g' || $keysym == 0xff50) {
+ $self->{row} = $self->top_row - 1;
+ delete $self->{found};
+ select_next($self, 1, $event);
+ } elsif ($char eq 'G' || $keysym == 0xff57) {
+ $self->{row} = $self->nrow;
+ delete $self->{found};
+ select_next($self, -1, $event);
+ }
+
+ return 1;
+}
+
+
+sub on_button_press {
+ my ($self, $event) = @_;
+
+ my $mask = $self->ModLevel3Mask | $self->ModMetaMask |
+ urxvt::ShiftMask | urxvt::ControlMask;
+
+ if ($event->{button} == $self->{button} && ($event->{state} & $mask) == $self->{state}) {
+ my $col = $event->{col};
+ my $row = $event->{row};
+ my $line = $self->line($row);
+ my $text = $line->t;
+
+ for my $pattern (@{$self->{pattern}}) {
+ while ($text =~ /$pattern/g) {
+ my ($url, $beg, $end) = ($&, $-[0], $+[0]);
+ --$end if $url =~ s/["')]$//;
+
+ if ($col >= $beg && $col <= $end) {
+ $self->{button_pressed} = 1;
+ $self->{button_col} = $col;
+ $self->{button_row} = $row;
+ $self->{button_url} = $url;
+ return 1;
+ }
+ }
+ }
+ }
+
+ ()
+}
+
+sub on_button_release {
+ my ($self, $event) = @_;
+
+ if ($self->{button_pressed} && $event->{button} == $self->{button}) {
+ my $col = $event->{col};
+ my $row = $event->{row};
+
+ $self->{button_pressed} = 0;
+
+ if ($col == $self->{button_col} && $row == $self->{button_row}) {
+ $self->exec_async(@{$self->{browser}}, $self->{button_url});
+ return 1;
+ }
+ }
+
+ ()
+}
+
+
+sub select_next {
+ # $dir < 0: up, > 0: down
+ my ($self, $dir, $event) = @_;
+ my $row = $self->{row};
+
+ if (($dir < 0 && $self->{n} > 0) ||
+ ($dir > 0 && $self->{n} < $#{ $self->{found} })) {
+ # another url on current line
+ $self->{n} += $dir;
+ hilight($self);
+ if ($self->{autocopy}) {
+ my $found = $self->{found}[$self->{n}];
+ $self->selection_beg(${$found}[0], ${$found}[1]);
+ $self->selection_end(${$found}[2], ${$found}[3]);
+ $self->selection_make($event->{time});
+ $self->selection_beg(1, 0);
+ $self->selection_end(1, 0);
+ }
+ return;
+ }
+
+ while (($dir < 0 && $row > $self->top_row) ||
+ ($dir > 0 && $row < $self->nrow - 1)) {
+ my $line = $self->line($row);
+ $row = ($dir < 0 ? $line->beg : $line->end) + $dir;
+ $line = $self->line($row);
+ my $text = $line->t;
+
+ for my $pattern (@{$self->{pattern}}) {
+ if ($text =~ /$pattern/g) {
+ delete $self->{found};
+
+ do {
+ my ($beg, $end) = ($-[0], $+[0]);
+ push @{$self->{found}}, [$line->coord_of($beg),
+ $line->coord_of($end), substr($text, $beg, $end - $beg)];
+ } while ($text =~ /$pattern/g);
+
+ $self->{row} = $row;
+ $self->{n} = $dir < 0 ? $#{$self->{found}} : 0;
+ hilight($self);
+ if ($self->{autocopy}) {
+ my $found = $self->{found}[$self->{n}];
+ $self->selection_beg(${$found}[0], ${$found}[1]);
+ $self->selection_end(${$found}[2], ${$found}[3]);
+ $self->selection_make($event->{time});
+ $self->selection_beg(1, 0);
+ $self->selection_end(1, 0);
+ }
+ return;
+ }
+ }
+ }
+
+ deactivate($self) unless $self->{found};
+
+ ()
+}
+
+
+sub hilight {
+ my ($self) = @_;
+
+ if ($self->{found}) {
+ if ($self->{row} < $self->view_start() ||
+ $self->{row} >= $self->view_start() + $self->nrow) {
+ # scroll selected url into visible area
+ my $top = $self->{row} - ($self->nrow >> 1);
+ $self->view_start($top < 0 ? $top : 0);
+ }
+
+ status_area($self);
+ $self->want_refresh();
+ }
+
+ ()
+}
+
+
+sub refresh {
+ my ($self) = @_;
+
+ if ($self->{found}) {
+ if ($self->x_resource('highlightColor')) {
+ $self->scr_xor_span(@{$self->{found}[$self->{n}]}[0 .. 3], urxvt::RS_Sel);
+ } else {
+ $self->scr_xor_span(@{$self->{found}[$self->{n}]}[0 .. 3], urxvt::RS_RVid);
+ }
+ }
+
+ ()
+}
+
+
+sub status_area {
+ my ($self) = @_;
+
+ my $row = $self->{row} < 0 ?
+ $self->{row} - $self->top_row : abs($self->top_row) + $self->{row};
+ my $text = sprintf("%d,%d ", $row + 1, $self->{n} + 1);
+
+ if ($self->top_row == 0) {
+ $text .= "All";
+ } elsif ($self->view_start() == $self->top_row) {
+ $text .= "Top";
+ } elsif ($self->view_start() == 0) {
+ $text .= "Bot";
+ } else {
+ $text .= sprintf("%2d%",
+ ($self->top_row - $self->view_start) * 100 / $self->top_row);
+ }
+
+ my $text_len = length($text);
+
+ if ($self->{overlay_len} != $text_len) {
+ delete $self->{overlay} if $self->{overlay};
+ $self->{overlay} = $self->overlay(-1, -1, $text_len, 1,
+ urxvt::OVERLAY_RSTYLE, 0);
+ $self->{overlay_len} = $text_len;
+ }
+
+ $self->{overlay}->set(0, 0, $self->special_encode($text));
+ $self->{overlay}->show();
+
+ ()
+}
+
+
+sub tt_write {
+ return 1;
+}
+
+
+sub activate {
+ my ($self) = @_;
+
+ $self->{active} = 1;
+
+ $self->{row} = $self->view_start() + $self->nrow;
+ $self->{n} = 0;
+ $self->{overlay_len} = 0;
+ $self->{button_pressed} = 0;
+
+ $self->{view_start} = $self->view_start();
+ $self->{pty_ev_events} = $self->pty_ev_events(urxvt::EV_NONE);
+
+ $self->enable(
+ key_press => \&key_press,
+ refresh_begin => \&refresh,
+ refresh_end => \&refresh,
+ tt_write => \&tt_write,
+ );
+
+ ()
+}
+
+
+sub deactivate {
+ my ($self) = @_;
+
+ $self->disable("key_press", "refresh_begin", "refresh_end", "tt_write");
+ $self->view_start($self->{view_start});
+ $self->pty_ev_events($self->{pty_ev_events});
+
+ delete $self->{overlay} if $self->{overlay};
+ delete $self->{found} if $self->{found};
+
+ $self->want_refresh();
+
+ $self->{active} = 0;
+
+ ()
+}