diff options
| author | aura <nw@moneybot.cc> | 2026-05-13 03:38:13 +0200 |
|---|---|---|
| committer | aura <nw@moneybot.cc> | 2026-05-13 03:38:13 +0200 |
| commit | a5003496fae29e95ba58062fa2a094f0e5c53c4d (patch) | |
| tree | 8b1109ea4fb4c3b0b6f1f65a558ad40d368931fd | |
| parent | 9e2e988236e7180c9299b20b503b143e35d3b198 (diff) | |
cool
| -rw-r--r-- | .gitignore | 1 | ||||
| -rw-r--r-- | bin/git-init-remote | 15 | ||||
| -rw-r--r-- | config/broot/conf.hjson | 337 | ||||
| l--------- | config/broot/launcher/bash/br | 1 | ||||
| -rw-r--r-- | config/broot/skins/native-16.hjson | 132 | ||||
| -rw-r--r-- | config/broot/verbs.hjson | 200 | ||||
| -rw-r--r-- | config/openbox/rc-templ.xml | 2 | ||||
| -rwxr-xr-x | slackware-bootstrap/multilib | 2 | ||||
| -rw-r--r-- | themes/ayaya/gtk-3.0/apps/gnome-applications.css | 22 | ||||
| -rw-r--r-- | themes/ayaya/gtk-3.0/apps/granite-widgets.css | 39 | ||||
| -rw-r--r-- | themes/ayaya/gtk-3.0/apps/lightdm-gtk-greeter.css | 16 | ||||
| -rw-r--r-- | themes/ayaya/gtk-3.0/apps/nemo.css | 2 | ||||
| -rw-r--r-- | themes/ayaya/gtk-3.0/apps/xfce.css | 4 | ||||
| -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.css | 24 | ||||
| -rw-r--r-- | themes/ayaya/gtk-3.0/gtk-widgets-assets.css | 50 | ||||
| -rw-r--r-- | themes/ayaya/gtk-3.0/gtk-widgets.css | 585 | ||||
| -rw-r--r-- | themes/ayaya/gtk-3.0/gtk.css | 4 | ||||
| -rw-r--r-- | urxvt/ext/clipboard | 115 | ||||
| -rw-r--r-- | urxvt/ext/keyboard-select | 606 | ||||
| -rw-r--r-- | urxvt/ext/tabbed | 476 | ||||
| -rw-r--r-- | urxvt/ext/url-select | 408 |
36 files changed, 2658 insertions, 383 deletions
@@ -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; + + () +} |
