mirror of
https://github.com/lbonn/rofi
synced 2024-11-22 03:43:09 +00:00
Merge remote-tracking branch 'upstream/next' into wayland
This commit is contained in:
commit
51dec9d65b
39 changed files with 716 additions and 6308 deletions
13
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
13
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
|
@ -16,7 +16,7 @@ body:
|
|||
consider you’re wrong and still fill the full report. Any report
|
||||
missing required informations will be labeled as “Incomplete Report -
|
||||
Please follow the guidelines” and will be closed. If you ask a
|
||||
question, enter dummy information in required fields to get passed the
|
||||
question, enter dummy information in required fields to get past the
|
||||
checks or in general completely ignore the guidelines, the issue will
|
||||
be closed and locked as spam.
|
||||
|
||||
|
@ -37,21 +37,26 @@ body:
|
|||
- type: input
|
||||
attributes:
|
||||
label: "Configuration"
|
||||
description: "Please use https://gist.github.com and include output of `rofi -dump-config`."
|
||||
description: |
|
||||
Please use https://gist.github.com and include output of `rofi -dump-config`.
|
||||
n/a is not a valid config.
|
||||
placeholder: "Gist URL"
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
attributes:
|
||||
label: "Theme"
|
||||
description: "Please use https://gist.github.com and include output of `rofi -dump-theme`."
|
||||
description: |
|
||||
Please use https://gist.github.com and include output of `rofi -dump-theme`.
|
||||
n/a is not a valid theme.
|
||||
placeholder: "Gist URL"
|
||||
validations:
|
||||
required: true
|
||||
- type: input
|
||||
attributes:
|
||||
label: "Timing report"
|
||||
description: "Please use https://gist.github.com and include output of your command with G_MESSAGES_DEBUG=Timings set."
|
||||
description: |
|
||||
Please use https://gist.github.com and include output of your command with G_MESSAGES_DEBUG=Timings set.
|
||||
placeholder: "Gist URL"
|
||||
validations:
|
||||
required: false
|
||||
|
|
1
.github/actions/setup/action.yml
vendored
1
.github/actions/setup/action.yml
vendored
|
@ -33,6 +33,7 @@ runs:
|
|||
libxkbcommon-dev \
|
||||
libxkbcommon-x11-dev \
|
||||
ninja-build \
|
||||
pandoc \
|
||||
python3-pip \
|
||||
python3-setuptools \
|
||||
python3-wheel \
|
||||
|
|
2
.github/workflows/build.yml
vendored
2
.github/workflows/build.yml
vendored
|
@ -51,7 +51,7 @@ jobs:
|
|||
build-meson-gcc-xcb:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
submodules: recursive
|
||||
- uses: ./.github/actions/setup
|
||||
|
|
|
@ -1,16 +1,13 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
if [ "$*" = "quit" ]
|
||||
then
|
||||
if [ "$*" = "quit" ]; then
|
||||
exit 0
|
||||
fi
|
||||
|
||||
if [ "$@" ]
|
||||
then
|
||||
if [ "$@" ]; then
|
||||
# Override the previously set prompt.
|
||||
echo -en "\x00prompt\x1fChange prompt\n"
|
||||
for a in {1..10}
|
||||
do
|
||||
for a in {1..10}; do
|
||||
echo "$a"
|
||||
done
|
||||
echo "quit"
|
||||
|
@ -25,7 +22,7 @@ else
|
|||
echo -en "blob\0icon\x1ffolder\x1fdisplay\x1fblub\n"
|
||||
echo "noot"
|
||||
echo "mies"
|
||||
echo -en "-------------\0nonselectable\x1ftrue\n"
|
||||
echo -en "-------------\0nonselectable\x1ftrue\x1fpermanent\x1ftrue\n"
|
||||
echo "testing"
|
||||
echo "<b>Bold</b>"
|
||||
echo "quit"
|
||||
|
|
59
Makefile.am
59
Makefile.am
|
@ -172,19 +172,52 @@ rofi_LDADD=\
|
|||
$(LIBS)
|
||||
|
||||
##
|
||||
# Manpage
|
||||
# Manpages
|
||||
##
|
||||
|
||||
.PHONY: generate-manpage
|
||||
|
||||
if FOUND_PANDOC
|
||||
|
||||
generate-manpage: doc/rofi.1\
|
||||
doc/rofi-sensible-terminal.1\
|
||||
doc/rofi-theme-selector.1\
|
||||
doc/rofi-debugging.5\
|
||||
doc/rofi-dmenu.5\
|
||||
doc/rofi-keys.5\
|
||||
doc/rofi-script.5\
|
||||
doc/rofi-theme.5
|
||||
|
||||
doc/rofi.1: doc/rofi.1.markdown
|
||||
pandoc --standalone --to=man --lua-filter=$(top_srcdir)/doc/man_filter.lua -f markdown-tex_math_dollars -o ./$@ ./$<
|
||||
doc/rofi-sensible-terminal.1: doc/rofi-sensible-terminal.1.markdown
|
||||
pandoc --standalone --to=man --lua-filter=$(top_srcdir)/doc/man_filter.lua -f markdown-tex_math_dollars -o ./$@ ./$<
|
||||
doc/rofi-theme-selector.1: doc/rofi-theme-selector.1.markdown
|
||||
pandoc --standalone --to=man --lua-filter=$(top_srcdir)/doc/man_filter.lua -f markdown-tex_math_dollars -o ./$@ ./$<
|
||||
doc/rofi-debugging.5: doc/rofi-debugging.5.markdown
|
||||
pandoc --standalone --to=man --lua-filter=$(top_srcdir)/doc/man_filter.lua -f markdown-tex_math_dollars -o ./$@ ./$<
|
||||
doc/rofi-dmenu.5: doc/rofi-dmenu.5.markdown
|
||||
pandoc --standalone --to=man --lua-filter=$(top_srcdir)/doc/man_filter.lua -f markdown-tex_math_dollars -o ./$@ ./$<
|
||||
doc/rofi-keys.5: doc/rofi-keys.5.markdown
|
||||
pandoc --standalone --to=man --lua-filter=$(top_srcdir)/doc/man_filter.lua -f markdown-tex_math_dollars -o ./$@ ./$<
|
||||
doc/rofi-script.5: doc/rofi-script.5.markdown
|
||||
pandoc --standalone --to=man --lua-filter=$(top_srcdir)/doc/man_filter.lua -f markdown-tex_math_dollars -o ./$@ ./$<
|
||||
doc/rofi-theme.5: doc/rofi-theme.5.markdown
|
||||
pandoc --standalone --to=man --lua-filter=$(top_srcdir)/doc/man_filter.lua -f markdown-tex_math_dollars -o ./$@ ./$<
|
||||
|
||||
endif
|
||||
|
||||
dist_man1_MANS=\
|
||||
doc/rofi.1\
|
||||
doc/rofi-theme-selector.1\
|
||||
doc/rofi-sensible-terminal.1
|
||||
doc/rofi-sensible-terminal.1\
|
||||
doc/rofi-theme-selector.1
|
||||
|
||||
dist_man5_MANS=\
|
||||
doc/rofi-theme.5\
|
||||
doc/rofi-debugging.5\
|
||||
doc/rofi-keys.5\
|
||||
doc/rofi-dmenu.5\
|
||||
doc/rofi-script.5
|
||||
doc/rofi-keys.5\
|
||||
doc/rofi-script.5\
|
||||
doc/rofi-theme.5
|
||||
|
||||
EXTRA_DIST += \
|
||||
doc/rofi-theme.5.markdown \
|
||||
|
@ -254,19 +287,7 @@ EXTRA_DIST+=\
|
|||
doc/default_configuration.rasi\
|
||||
doc/default_theme.rasi\
|
||||
Changelog
|
||||
##
|
||||
# Indent
|
||||
##
|
||||
|
||||
update-manpage: $(top_srcdir)/doc/rofi-theme-selector.1.markdown $(top_srcdir)/doc/rofi.1.markdown $(top_srcdir)/doc/rofi-theme.5.markdown $(top_srcdir)/doc/rofi-script.5.markdown ${top_srcdir}/doc/rofi-sensible-terminal.1.markdown ${top_srcdir}/doc/rofi-keys.5.markdown ${top_srcdir}/doc/rofi-dmenu.5.markdown $(top_srcdir)/doc/rofi-debugging.5.markdown
|
||||
go-md2man -in $(top_srcdir)/doc/rofi.1.markdown -out $(top_srcdir)/doc/rofi.1
|
||||
go-md2man -in $(top_srcdir)/doc/rofi-theme-selector.1.markdown -out $(top_srcdir)/doc/rofi-theme-selector.1
|
||||
go-md2man -in $(top_srcdir)/doc/rofi-theme.5.markdown -out $(top_srcdir)/doc/rofi-theme.5
|
||||
go-md2man -in $(top_srcdir)/doc/rofi-debugging.5.markdown -out $(top_srcdir)/doc/rofi-debugging.5
|
||||
go-md2man -in $(top_srcdir)/doc/rofi-keys.5.markdown -out $(top_srcdir)/doc/rofi-keys.5
|
||||
go-md2man -in $(top_srcdir)/doc/rofi-script.5.markdown -out $(top_srcdir)/doc/rofi-script.5
|
||||
go-md2man -in $(top_srcdir)/doc/rofi-dmenu.5.markdown -out $(top_srcdir)/doc/rofi-dmenu.5
|
||||
go-md2man -in $(top_srcdir)/doc/rofi-sensible-terminal.1.markdown -out $(top_srcdir)/doc/rofi-sensible-terminal.1
|
||||
|
||||
##
|
||||
# Rofi test program
|
||||
|
@ -656,6 +677,8 @@ EXTRA_DIST += \
|
|||
subprojects/libgwater/wayland-server/meson.build \
|
||||
subprojects/libgwater/meson.build \
|
||||
subprojects/libgwater/win/meson.build \
|
||||
subprojects/libnkutils/bindings/meson.build \
|
||||
subprojects/libnkutils/core/meson.build \
|
||||
subprojects/libnkutils/meson.build \
|
||||
subprojects/libnkutils/meson_options.txt \
|
||||
subprojects/libgwater/wayland/libgwater-wayland.h \
|
||||
|
|
12
configure.ac
12
configure.ac
|
@ -169,6 +169,13 @@ AC_ARG_ENABLE([check], AS_HELP_STRING([--disable-check], [Build with checks usin
|
|||
AS_IF([test "x${enable_check}" != "xno"], [ PKG_CHECK_MODULES([check],[check >= 0.11.0], [HAVE_CHECK=1]) ])
|
||||
AM_CONDITIONAL([USE_CHECK], [test "x${enable_check}" != "xno" && test "$HAVE_CHECK" -eq 1])
|
||||
|
||||
dnl ---------------------------------------------------------------------
|
||||
dnl Build man pages
|
||||
dnl ---------------------------------------------------------------------
|
||||
AC_ARG_ENABLE([man], AS_HELP_STRING([--disable-man], [Build man pages (default: enabled)]))
|
||||
|
||||
AS_IF([test "x$enable_man" != "xno" ], [ AC_CHECK_PROG([pandoc], pandoc, [yes])])
|
||||
AM_CONDITIONAL([FOUND_PANDOC], [test "x$pandoc" = xyes])
|
||||
|
||||
dnl ---------------------------------------------------------------------
|
||||
dnl Gets the resource compile tool path.
|
||||
|
@ -210,6 +217,11 @@ echo "Check based tests Enabled"
|
|||
else
|
||||
echo "Check based tests Disabled"
|
||||
fi
|
||||
if test "x${enable_man}" != "xno" && test "x$pandoc" = "xyes"; then
|
||||
echo "Build man pages Enabled"
|
||||
else
|
||||
echo "Build man pages Disabled"
|
||||
fi
|
||||
echo "-------------------------------------"
|
||||
echo "Now type 'make' to build"
|
||||
echo ""
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
Manpages are build using [go-md2man](https://github.com/cpuguy83/go-md2man)
|
||||
Manpages are build using [pandoc](https://pandoc.org/)
|
||||
|
||||
Manpages can be updated using the following make command:
|
||||
|
||||
```
|
||||
make update-manpage
|
||||
make generate-manpage
|
||||
```
|
||||
|
|
237
doc/man_filter.lua
Normal file
237
doc/man_filter.lua
Normal file
|
@ -0,0 +1,237 @@
|
|||
local Def = {}
|
||||
|
||||
function Def:new(d)
|
||||
-- init with empty def
|
||||
if d == nil then
|
||||
d = {
|
||||
start_idx = nil,
|
||||
end_idx = nil,
|
||||
def_par = nil,
|
||||
content = {},
|
||||
}
|
||||
end
|
||||
setmetatable(d, self)
|
||||
self.__index = self
|
||||
return d
|
||||
end
|
||||
|
||||
function Def:init(start_idx, el)
|
||||
self.start_idx = start_idx
|
||||
self.def_par = el
|
||||
end
|
||||
|
||||
function Def:append(el)
|
||||
if self.start_idx ~= nil then
|
||||
table.insert(self.content, el)
|
||||
end
|
||||
end
|
||||
|
||||
function Def:stop(end_idx)
|
||||
if self.start_idx == nil then
|
||||
return nil
|
||||
end
|
||||
local out = self:new({
|
||||
start_idx = self.start_idx,
|
||||
end_idx = end_idx,
|
||||
def_par = self.def_par,
|
||||
content = self.content,
|
||||
})
|
||||
self.start_idx = nil
|
||||
self.end_idx = nil
|
||||
self.def_par = nil
|
||||
self.content = {}
|
||||
return out
|
||||
end
|
||||
|
||||
function Def:to_string()
|
||||
return string.format("start: %d, end: %d, def_par: %s", self.start_idx, self.end_idx, self.def_par)
|
||||
end
|
||||
|
||||
function find_defs(doc)
|
||||
local defs = {}
|
||||
local idx = 0
|
||||
local def = Def:new()
|
||||
|
||||
-- find defintions:
|
||||
-- * start at paragraphs with `word` ...
|
||||
-- * stop at next definition or next header
|
||||
local filter = {
|
||||
traverse = "topdown",
|
||||
Para = function(el)
|
||||
idx = idx + 1
|
||||
|
||||
local new_def_start = #el.content >= 1 and el.content[1].tag == "Code"
|
||||
|
||||
if new_def_start then
|
||||
local newd = def:stop(idx - 1)
|
||||
table.insert(defs, newd)
|
||||
|
||||
def:init(idx, el.content)
|
||||
else
|
||||
def:append(el)
|
||||
end
|
||||
return nil, false
|
||||
end,
|
||||
Block = function(el)
|
||||
idx = idx + 1
|
||||
def:append(el)
|
||||
-- stop exploring after one nesting level
|
||||
return nil, false
|
||||
end,
|
||||
Header = function(el)
|
||||
idx = idx + 1
|
||||
local newd = def:stop(idx - 1)
|
||||
table.insert(defs, newd)
|
||||
return nil, false
|
||||
end,
|
||||
}
|
||||
|
||||
doc:walk(filter)
|
||||
local newd = def:stop(idx - 1)
|
||||
table.insert(defs, newd)
|
||||
|
||||
return defs
|
||||
end
|
||||
|
||||
function convert_defs(doc, defs)
|
||||
local idx = 0
|
||||
local out_blocks = {}
|
||||
|
||||
local convert_defs = {
|
||||
traverse = "topdown",
|
||||
Block = function(el)
|
||||
idx = idx + 1
|
||||
for _, d in ipairs(defs) do
|
||||
if idx == d.end_idx then
|
||||
local dl = pandoc.DefinitionList({ { d.def_par, { d.content } } })
|
||||
table.insert(out_blocks, dl:walk())
|
||||
return {}, false
|
||||
end
|
||||
if idx >= d.start_idx and idx < d.end_idx then
|
||||
-- drop
|
||||
return {}, false
|
||||
end
|
||||
end
|
||||
table.insert(out_blocks, el:walk())
|
||||
return nil, false
|
||||
end,
|
||||
}
|
||||
|
||||
doc:walk(convert_defs)
|
||||
|
||||
return pandoc.Pandoc(out_blocks, doc.meta)
|
||||
end
|
||||
|
||||
-- for <2.17 compatibility
|
||||
-- equivalent to `doc:walk(filter)`
|
||||
local function walk_doc(doc, filter)
|
||||
local div = pandoc.Div(doc.blocks)
|
||||
local blocks = pandoc.walk_block(div, filter).content
|
||||
return pandoc.Pandoc(blocks, doc.meta)
|
||||
end
|
||||
|
||||
local function extract_title(doc)
|
||||
local title = {}
|
||||
local section
|
||||
local filter = {
|
||||
Header = function(el)
|
||||
local f = {
|
||||
Str = function(el)
|
||||
if el.text:find("%(1%)") ~= nil then
|
||||
section = "General Commands Manual"
|
||||
elseif el.text:find("%(5%)") ~= nil then
|
||||
section = "File Formats Manual"
|
||||
end
|
||||
table.insert(title, el)
|
||||
end,
|
||||
Inline = function(el)
|
||||
table.insert(title, el)
|
||||
end,
|
||||
}
|
||||
if el.level == 1 then
|
||||
pandoc.walk_block(el, f)
|
||||
return {} -- drop
|
||||
end
|
||||
return nil
|
||||
end,
|
||||
}
|
||||
|
||||
doc = walk_doc(doc, filter)
|
||||
|
||||
local to_inline = function(s)
|
||||
local r = {}
|
||||
for w in s:gmatch("%S+") do
|
||||
table.insert(r, pandoc.Str(w))
|
||||
table.insert(r, pandoc.Space())
|
||||
end
|
||||
table.remove(r, #r)
|
||||
return r
|
||||
end
|
||||
|
||||
if section ~= nil then
|
||||
for _, e in ipairs({
|
||||
pandoc.Space(),
|
||||
pandoc.Str("rofi"),
|
||||
pandoc.Space(),
|
||||
pandoc.Str("|"),
|
||||
table.unpack(to_inline(section)),
|
||||
}) do
|
||||
table.insert(title, e)
|
||||
end
|
||||
end
|
||||
|
||||
doc.meta = pandoc.Meta({
|
||||
title = pandoc.MetaInlines(title),
|
||||
})
|
||||
|
||||
return doc
|
||||
end
|
||||
|
||||
local function decrement_heading(doc)
|
||||
local filter = {
|
||||
Header = function(el)
|
||||
if el.level > 1 then
|
||||
el.level = el.level - 1
|
||||
return el
|
||||
end
|
||||
return nil
|
||||
end,
|
||||
}
|
||||
|
||||
doc = walk_doc(doc, filter)
|
||||
return doc
|
||||
end
|
||||
|
||||
local function code_in_strong(doc)
|
||||
local filter = {
|
||||
Code = function(el)
|
||||
return pandoc.Strong(el.text)
|
||||
end,
|
||||
}
|
||||
|
||||
doc = walk_doc(doc, filter)
|
||||
return doc
|
||||
end
|
||||
|
||||
--- Run filtering function through whole document
|
||||
--
|
||||
-- * find argument definitions: paragraph starting with inline code (`-arg`)
|
||||
-- * replace the paragraphs until the end of the definition with a DefinitionList
|
||||
-- * extract metadata title from main heading
|
||||
-- * decrement heading from 1 for better display
|
||||
-- * convert inline code text to Strong as usual in man pages
|
||||
function Pandoc(doc)
|
||||
if PANDOC_VERSION >= pandoc.types.Version("2.17.0") then
|
||||
-- 2.17 is required for topdown traversal
|
||||
local defs = find_defs(doc)
|
||||
doc = convert_defs(doc, defs)
|
||||
end
|
||||
|
||||
doc = extract_title(doc)
|
||||
|
||||
doc = decrement_heading(doc)
|
||||
|
||||
doc = code_in_strong(doc)
|
||||
|
||||
return doc
|
||||
end
|
|
@ -1,25 +1,52 @@
|
|||
gomd2man = find_program('go-md2man', required: false)
|
||||
if gomd2man.found()
|
||||
man_targets = []
|
||||
foreach f: [
|
||||
man_files = [
|
||||
'rofi.1',
|
||||
'rofi-sensible-terminal.1',
|
||||
'rofi-theme-selector.1',
|
||||
'rofi-theme.5',
|
||||
'rofi-dmenu.5',
|
||||
'rofi-debugging.5',
|
||||
'rofi-dmenu.5',
|
||||
'rofi-keys.5',
|
||||
'rofi-script.5',
|
||||
'rofi-sensible-terminal.1'
|
||||
'rofi-theme.5',
|
||||
]
|
||||
|
||||
fs = import('fs')
|
||||
|
||||
pandoc = find_program('pandoc', required: false, version: '>=2.9')
|
||||
|
||||
if pandoc.found()
|
||||
man_targets = []
|
||||
cp_cmds = []
|
||||
foreach f: man_files
|
||||
section_number = f.split('.')[1]
|
||||
install_dest = join_paths(get_option('prefix'), get_option('mandir'), 'man' + section_number)
|
||||
|
||||
man_targets += custom_target(f,
|
||||
input: '.'.join([f, 'markdown']),
|
||||
input: ['.'.join([f, 'markdown']), 'man_filter.lua'],
|
||||
output: f,
|
||||
command: [ 'go-md2man',
|
||||
'-in', files('.'.join([f,'markdown'])),
|
||||
'-out', files(f)
|
||||
])
|
||||
command: [ 'pandoc', '--standalone', '--to=man',
|
||||
'--lua-filter', '@INPUT1@',
|
||||
'-f', 'markdown-tex_math_dollars',
|
||||
'@INPUT0@', '-o', '@OUTPUT@' ],
|
||||
install: true,
|
||||
install_dir: install_dest,
|
||||
build_by_default: true,
|
||||
)
|
||||
endforeach
|
||||
run_target('update-manpage', command: ['true'], depends: man_targets)
|
||||
|
||||
run_target('generate-manpage', command: ['true'], depends: man_targets)
|
||||
else
|
||||
man_missing = false
|
||||
foreach f: man_files
|
||||
if not fs.is_file(f)
|
||||
man_missing = true
|
||||
endif
|
||||
endforeach
|
||||
|
||||
if man_missing
|
||||
warning('Man files cannot be generated and not present in source directory, they will not be installed')
|
||||
else
|
||||
install_man(man_files)
|
||||
endif
|
||||
endif
|
||||
|
||||
doxy_conf = configuration_data()
|
||||
|
|
|
@ -1,256 +0,0 @@
|
|||
.nh
|
||||
.TH ROFI DEBUGGING 5 rofi debugging
|
||||
.SH NAME
|
||||
.PP
|
||||
Debugging rofi.
|
||||
|
||||
.PP
|
||||
When reporting an issue with rofi crashing, or misbehaving. It helps to do some
|
||||
small test to help pin-point the problem.
|
||||
|
||||
.PP
|
||||
First try disabling your custom configuration: \fB\fC-no-config\fR
|
||||
|
||||
.PP
|
||||
This disables the parsing of the configuration files. This runs rofi in \fIstock\fP
|
||||
mode.
|
||||
|
||||
.PP
|
||||
If you run custom C plugins, you can disable the plugins using: \fB\fC-no-plugins\fR
|
||||
|
||||
.SH Get the relevant information for an issue
|
||||
.PP
|
||||
Please pastebin the output of the following commands:
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
rofi -help
|
||||
rofi -dump-config
|
||||
rofi -dump-theme
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.PP
|
||||
\fB\fCrofi -help\fR provides us with the configuration files parsed, the exact
|
||||
version, monitor layout and more useful information.
|
||||
|
||||
.PP
|
||||
The \fB\fCrofi -dump-config\fR and \fB\fCrofi -dump-theme\fR output gives us \fB\fCrofi\fR
|
||||
interpretation of your configuration and theme.
|
||||
|
||||
.PP
|
||||
Please check the output for identifiable information and remove this.
|
||||
|
||||
.SH Timing traces
|
||||
.PP
|
||||
To get a timing trace, enable the \fBTimings\fP debug domain.
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
G_MESSAGES_DEBUG=Timings rofi -show drun
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.PP
|
||||
It will show a trace with (useful) timing information at relevant points during
|
||||
the execution. This will help debugging when rofi is slow to start.
|
||||
|
||||
.PP
|
||||
Example trace:
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
(process:14942): Timings-DEBUG: 13:47:39.335: 0.000000 (0.000000): Started
|
||||
(process:14942): Timings-DEBUG: 13:47:39.335: 0.000126 (0.000126): ../source/rofi.c:main:786
|
||||
(process:14942): Timings-DEBUG: 13:47:39.335: 0.000163 (0.000037): ../source/rofi.c:main:819
|
||||
(process:14942): Timings-DEBUG: 13:47:39.336: 0.000219 (0.000056): ../source/rofi.c:main:826 Setup Locale
|
||||
(process:14942): Timings-DEBUG: 13:47:39.337: 0.001235 (0.001016): ../source/rofi.c:main:828 Collect MODI
|
||||
(process:14942): Timings-DEBUG: 13:47:39.337: 0.001264 (0.000029): ../source/rofi.c:main:830 Setup MODI
|
||||
(process:14942): Timings-DEBUG: 13:47:39.337: 0.001283 (0.000019): ../source/rofi.c:main:834 Setup mainloop
|
||||
(process:14942): Timings-DEBUG: 13:47:39.337: 0.001369 (0.000086): ../source/rofi.c:main:837 NK Bindings
|
||||
(process:14942): Timings-DEBUG: 13:47:39.337: 0.001512 (0.000143): ../source/xcb.c:display_setup:1177 Open Display
|
||||
(process:14942): Timings-DEBUG: 13:47:39.337: 0.001829 (0.000317): ../source/xcb.c:display_setup:1192 Setup XCB
|
||||
(process:14942): Timings-DEBUG: 13:47:39.346: 0.010650 (0.008821): ../source/rofi.c:main:844 Setup Display
|
||||
(process:14942): Timings-DEBUG: 13:47:39.346: 0.010715 (0.000065): ../source/rofi.c:main:848 Setup abe
|
||||
(process:14942): Timings-DEBUG: 13:47:39.350: 0.015101 (0.004386): ../source/rofi.c:main:883 Load cmd config
|
||||
(process:14942): Timings-DEBUG: 13:47:39.351: 0.015275 (0.000174): ../source/rofi.c:main:907 Setup Modi
|
||||
(process:14942): Timings-DEBUG: 13:47:39.351: 0.015291 (0.000016): ../source/view.c:rofi_view_workers_initialize:1922 Setup Threadpool, start
|
||||
(process:14942): Timings-DEBUG: 13:47:39.351: 0.015349 (0.000058): ../source/view.c:rofi_view_workers_initialize:1945 Setup Threadpool, done
|
||||
(process:14942): Timings-DEBUG: 13:47:39.367: 0.032018 (0.016669): ../source/rofi.c:main:1000 Setup late Display
|
||||
(process:14942): Timings-DEBUG: 13:47:39.367: 0.032080 (0.000062): ../source/rofi.c:main:1003 Theme setup
|
||||
(process:14942): Timings-DEBUG: 13:47:39.367: 0.032109 (0.000029): ../source/rofi.c:startup:668 Startup
|
||||
(process:14942): Timings-DEBUG: 13:47:39.367: 0.032121 (0.000012): ../source/rofi.c:startup:677 Grab keyboard
|
||||
(process:14942): Timings-DEBUG: 13:47:39.368: 0.032214 (0.000093): ../source/view.c:__create_window:701 xcb create window
|
||||
(process:14942): Timings-DEBUG: 13:47:39.368: 0.032235 (0.000021): ../source/view.c:__create_window:705 xcb create gc
|
||||
(process:14942): Timings-DEBUG: 13:47:39.368: 0.033136 (0.000901): ../source/view.c:__create_window:714 create cairo surface
|
||||
(process:14942): Timings-DEBUG: 13:47:39.369: 0.033286 (0.000150): ../source/view.c:__create_window:723 pango cairo font setup
|
||||
(process:14942): Timings-DEBUG: 13:47:39.369: 0.033351 (0.000065): ../source/view.c:__create_window:761 configure font
|
||||
(process:14942): Timings-DEBUG: 13:47:39.381: 0.045896 (0.012545): ../source/view.c:__create_window:769 textbox setup
|
||||
(process:14942): Timings-DEBUG: 13:47:39.381: 0.045944 (0.000048): ../source/view.c:__create_window:781 setup window attributes
|
||||
(process:14942): Timings-DEBUG: 13:47:39.381: 0.045955 (0.000011): ../source/view.c:__create_window:791 setup window fullscreen
|
||||
(process:14942): Timings-DEBUG: 13:47:39.381: 0.045966 (0.000011): ../source/view.c:__create_window:797 setup window name and class
|
||||
(process:14942): Timings-DEBUG: 13:47:39.381: 0.045974 (0.000008): ../source/view.c:__create_window:808 setup startup notification
|
||||
(process:14942): Timings-DEBUG: 13:47:39.381: 0.045981 (0.000007): ../source/view.c:__create_window:810 done
|
||||
(process:14942): Timings-DEBUG: 13:47:39.381: 0.045992 (0.000011): ../source/rofi.c:startup:679 Create Window
|
||||
(process:14942): Timings-DEBUG: 13:47:39.381: 0.045999 (0.000007): ../source/rofi.c:startup:681 Parse ABE
|
||||
(process:14942): Timings-DEBUG: 13:47:39.381: 0.046113 (0.000114): ../source/rofi.c:startup:684 Config sanity check
|
||||
(process:14942): Timings-DEBUG: 13:47:39.384: 0.048229 (0.002116): ../source/dialogs/run.c:get_apps:216 start
|
||||
(process:14942): Timings-DEBUG: 13:47:39.390: 0.054626 (0.006397): ../source/dialogs/run.c:get_apps:336 stop
|
||||
(process:14942): Timings-DEBUG: 13:47:39.390: 0.054781 (0.000155): ../source/dialogs/drun.c:get_apps:634 Get Desktop apps (start)
|
||||
(process:14942): Timings-DEBUG: 13:47:39.391: 0.055264 (0.000483): ../source/dialogs/drun.c:get_apps:641 Get Desktop apps (user dir)
|
||||
(process:14942): Timings-DEBUG: 13:47:39.418: 0.082884 (0.027620): ../source/dialogs/drun.c:get_apps:659 Get Desktop apps (system dirs)
|
||||
(process:14942): Timings-DEBUG: 13:47:39.418: 0.082944 (0.000060): ../source/dialogs/drun.c:get_apps_history:597 Start drun history
|
||||
(process:14942): Timings-DEBUG: 13:47:39.418: 0.082977 (0.000033): ../source/dialogs/drun.c:get_apps_history:617 Stop drun history
|
||||
(process:14942): Timings-DEBUG: 13:47:39.419: 0.083638 (0.000661): ../source/dialogs/drun.c:get_apps:664 Sorting done.
|
||||
(process:14942): Timings-DEBUG: 13:47:39.419: 0.083685 (0.000047): ../source/view.c:rofi_view_create:1759
|
||||
(process:14942): Timings-DEBUG: 13:47:39.419: 0.083700 (0.000015): ../source/view.c:rofi_view_create:1783 Startup notification
|
||||
(process:14942): Timings-DEBUG: 13:47:39.419: 0.083711 (0.000011): ../source/view.c:rofi_view_create:1786 Get active monitor
|
||||
(process:14942): Timings-DEBUG: 13:47:39.420: 0.084693 (0.000982): ../source/view.c:rofi_view_refilter:1028 Filter start
|
||||
(process:14942): Timings-DEBUG: 13:47:39.421: 0.085992 (0.001299): ../source/view.c:rofi_view_refilter:1132 Filter done
|
||||
(process:14942): Timings-DEBUG: 13:47:39.421: 0.086090 (0.000098): ../source/view.c:rofi_view_update:982
|
||||
(process:14942): Timings-DEBUG: 13:47:39.421: 0.086123 (0.000033): ../source/view.c:rofi_view_update:1002 Background
|
||||
(process:14942): Timings-DEBUG: 13:47:39.428: 0.092864 (0.006741): ../source/view.c:rofi_view_update:1008 widgets
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.SH Debug domains
|
||||
.PP
|
||||
To further debug the plugin, you can get a trace with (lots of) debug
|
||||
information. This debug output can be enabled for multiple parts in rofi using
|
||||
the glib debug framework. Debug domains can be enabled by setting the
|
||||
G_MESSAGES_DEBUG environment variable. At the time of creation of this page,
|
||||
the following debug domains exist:
|
||||
|
||||
.RS
|
||||
.IP \(bu 2
|
||||
all: Show debug information from all domains.
|
||||
.IP \(bu 2
|
||||
X11Helper: The X11 Helper functions.
|
||||
.IP \(bu 2
|
||||
View: The main window view functions.
|
||||
.IP \(bu 2
|
||||
Widgets.Box: The Box widget.
|
||||
.IP \(bu 2
|
||||
Modes.DMenu: The dmenu mode.
|
||||
.IP \(bu 2
|
||||
Modes.Run: The run mode.
|
||||
.IP \(bu 2
|
||||
Modes.DRun: The desktop file run mode.
|
||||
.IP \(bu 2
|
||||
Modes.Window: The window mode.
|
||||
.IP \(bu 2
|
||||
Modes.Script: The script mode.
|
||||
.IP \(bu 2
|
||||
Modes.Combi: The script mode.
|
||||
.IP \(bu 2
|
||||
Modes.Ssh: The ssh mode.
|
||||
.IP \(bu 2
|
||||
Rofi: The main application.
|
||||
.IP \(bu 2
|
||||
Timings: Get timing output.
|
||||
.IP \(bu 2
|
||||
Theme: Theme engine debug output. (warning lots of output).
|
||||
.IP \(bu 2
|
||||
Widgets.Icon: The Icon widget.
|
||||
.IP \(bu 2
|
||||
Widgets.Box: The box widget.
|
||||
.IP \(bu 2
|
||||
Widgets.Container: The container widget.
|
||||
.IP \(bu 2
|
||||
Widgets.Window: The window widget.
|
||||
.IP \(bu 2
|
||||
Helpers.IconFetcher: Information about icon lookup.
|
||||
|
||||
.RE
|
||||
|
||||
.PP
|
||||
For full list see \fB\fCman rofi\fR\&.
|
||||
|
||||
.PP
|
||||
Example: \fB\fCG_MESSAGES_DEBUG=Dialogs.DRun rofi -show drun\fR To get specific output
|
||||
from the Desktop file run dialog.
|
||||
|
||||
.PP
|
||||
To redirect the debug output to a file (\fB\fC~/rofi.log\fR) add:
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
rofi -show drun -log ~/rofi.log
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.PP
|
||||
Specifying the logfile automatically enabled all log domains.
|
||||
This can be useful when rofi is launched from a window manager.
|
||||
|
||||
.SH Creating a backtrace
|
||||
.PP
|
||||
First make sure you compile \fBrofi\fP with debug symbols:
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
make CFLAGS="-O0 -g3" clean rofi
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.PP
|
||||
Getting a backtrace using GDB is not very handy. Because if rofi get stuck, it
|
||||
grabs keyboard and mouse. So if it crashes in GDB you are stuck. The best way
|
||||
to go is to enable core file. (ulimit -c unlimited in bash) then make rofi
|
||||
crash. You can then load the core in GDB.
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
gdb rofi core
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.PP
|
||||
Then type inside gdb:
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
thread apply all bt
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.PP
|
||||
The output trace is useful when reporting crashes.
|
||||
|
||||
.PP
|
||||
Some distribution have \fB\fCsystemd-coredump\fR, this way you can easily get a
|
||||
backtrace via \fB\fCcoredumpctl\fR\&.
|
||||
|
||||
.SH SEE ALSO
|
||||
.PP
|
||||
rofi-sensible-terminal(1), dmenu(1), rofi-debugging(5), rofi-theme(5),
|
||||
rofi-script(5), rofi-keys(5),rofi-theme-selector(1)
|
||||
|
||||
.SH AUTHOR
|
||||
.RS
|
||||
.IP \(bu 2
|
||||
Qball Cow qball@blame.services
|
||||
\[la]mailto:qball@blame.services\[ra]
|
||||
|
||||
.RE
|
|
@ -1,4 +1,4 @@
|
|||
# ROFI DEBUGGING 5 rofi debugging
|
||||
# rofi-debugging(5)
|
||||
|
||||
## NAME
|
||||
|
||||
|
@ -169,7 +169,7 @@ backtrace via `coredumpctl`.
|
|||
|
||||
## SEE ALSO
|
||||
|
||||
rofi-sensible-terminal(1), dmenu(1), rofi-debugging(5), rofi-theme(5),
|
||||
rofi-sensible-terminal(1), dmenu(1), rofi-theme(5),
|
||||
rofi-script(5), rofi-keys(5),rofi-theme-selector(1)
|
||||
|
||||
## AUTHOR
|
||||
|
|
365
doc/rofi-dmenu.5
365
doc/rofi-dmenu.5
|
@ -1,365 +0,0 @@
|
|||
.nh
|
||||
.TH ROFI-DMENU 5 rofi-dmenu
|
||||
.SH NAME
|
||||
.PP
|
||||
\fBrofi dmenu mode\fP - Rofi dmenu emulation
|
||||
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
To integrate \fBrofi\fP into scripts as simple selection dialogs,
|
||||
\fBrofi\fP supports emulating \fBdmenu(1)\fP (A dynamic menu for X11).
|
||||
|
||||
.PP
|
||||
The website for \fB\fCdmenu\fR can be found here
|
||||
\[la]http://tools.suckless.org/dmenu/\[ra]\&.
|
||||
|
||||
.PP
|
||||
\fBrofi\fP does not aim to be 100% compatible with \fB\fCdmenu\fR\&. There are simply too
|
||||
many flavors of \fB\fCdmenu\fR\&. The idea is that the basic usage command-line flags
|
||||
are obeyed, theme-related flags are not. Besides, \fBrofi\fP offers some extended
|
||||
features (like multi-select, highlighting, message bar, extra key bindings).
|
||||
|
||||
.SH BASIC CONCEPT
|
||||
.PP
|
||||
In \fB\fCdmenu\fR mode, \fBrofi\fP reads data from standard in, splits them into
|
||||
separate entries and displays them. If the user selects a row, this is printed
|
||||
out to standard out, allowing the script to process it further.
|
||||
|
||||
.PP
|
||||
By default separation of rows is done on new lines, making it easy to pipe the
|
||||
output a one application into \fBrofi\fP and the output of rofi into the next.
|
||||
|
||||
.SH USAGE
|
||||
.PP
|
||||
By launching \fBrofi\fP with the \fB\fC-dmenu\fR flag it will go into dmenu emulation
|
||||
mode.
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
ls | rofi -dmenu
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.SS DMENU DROP-IN REPLACEMENT
|
||||
.PP
|
||||
If \fB\fCargv[0]\fR (calling command) is dmenu, \fBrofi\fP will start in dmenu mode.
|
||||
This way, it can be used as a drop-in replacement for dmenu. Just copy or
|
||||
symlink \fBrofi\fP to dmenu in \fB\fC$PATH\fR\&.
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
ln -s /usr/bin/rofi /usr/bin/dmenu
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.SS DMENU VS SCRIPT MODE
|
||||
.PP
|
||||
Script mode is used to extend \fBrofi\fP, dmenu mode is used to extend a script.
|
||||
The two do share much of the same input format. Please see the
|
||||
\fBrofi-script(5)\fP manpage for more information.
|
||||
|
||||
.SS DMENU SPECIFIC COMMANDLINE FLAGS
|
||||
.PP
|
||||
A lot of these options can also be modified by the script using special input.
|
||||
See the \fBrofi-script(5)\fP manpage for more information about this syntax.
|
||||
|
||||
.PP
|
||||
\fB\fC-sep\fR \fIseparator\fP
|
||||
|
||||
.PP
|
||||
Separator for \fB\fCdmenu\fR\&. Example: To show a list of 'a' to 'e' with '|' as a
|
||||
separator:
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
echo "a|b|c|d|e" | rofi -sep '|' -dmenu
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.PP
|
||||
\fB\fC-p\fR \fIprompt\fP
|
||||
|
||||
.PP
|
||||
Specify the prompt to show in \fB\fCdmenu\fR mode. For example, select 'monkey',
|
||||
a,b,c,d, or e.
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
echo "a|b|c|d|e" | rofi -sep '|' -dmenu -p "monkey"
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.PP
|
||||
Default: \fIdmenu\fP
|
||||
|
||||
.PP
|
||||
\fB\fC-l\fR \fInumber of lines to show\fP
|
||||
|
||||
.PP
|
||||
Maximum number of lines the menu may show before scrolling.
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
rofi -dmenu -l 25
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.PP
|
||||
Default: \fI15\fP
|
||||
|
||||
.PP
|
||||
\fB\fC-i\fR
|
||||
|
||||
.PP
|
||||
Makes \fB\fCdmenu\fR searches case-insensitive
|
||||
|
||||
.PP
|
||||
\fB\fC-a\fR \fIX\fP
|
||||
|
||||
.PP
|
||||
Active row, mark \fIX\fP as active. Where \fIX\fP is a comma-separated list of
|
||||
python(1)-style indices and ranges, e.g. indices start at 0, -1 refers to the
|
||||
last row with -2 preceding it, ranges are left-open and right-close, and so on.
|
||||
You can specify:
|
||||
|
||||
.RS
|
||||
.IP \(bu 2
|
||||
A single row: '5'
|
||||
.IP \(bu 2
|
||||
A range of (last 3) rows: '-3:'
|
||||
.IP \(bu 2
|
||||
4 rows starting from row 7: '7:11' (or in legacy notation: '7-10')
|
||||
.IP \(bu 2
|
||||
A set of rows: '2,0,-9'
|
||||
.IP \(bu 2
|
||||
Or any combination: '5,-3:,7:11,2,0,-9'
|
||||
|
||||
.RE
|
||||
|
||||
.PP
|
||||
\fB\fC-u\fR \fIX\fP
|
||||
|
||||
.PP
|
||||
Urgent row, mark \fIX\fP as urgent. See \fB\fC-a\fR option for details.
|
||||
|
||||
.PP
|
||||
\fB\fC-only-match\fR
|
||||
|
||||
.PP
|
||||
Only return a selected item, do not allow custom entry.
|
||||
This mode always returns an entry. It will not return if no matching entry is
|
||||
selected.
|
||||
|
||||
.PP
|
||||
\fB\fC-no-custom\fR
|
||||
|
||||
.PP
|
||||
Only return a selected item, do not allow custom entry.
|
||||
This mode returns directly when no entries given.
|
||||
|
||||
.PP
|
||||
\fB\fC-format\fR \fIformat\fP
|
||||
|
||||
.PP
|
||||
Allows the output of dmenu to be customized (N is the total number of input
|
||||
entries):
|
||||
|
||||
.RS
|
||||
.IP \(bu 2
|
||||
\&'s' selected string
|
||||
.IP \(bu 2
|
||||
\&'i' index (0 - (N-1))
|
||||
.IP \(bu 2
|
||||
\&'d' index (1 - N)
|
||||
.IP \(bu 2
|
||||
\&'q' quote string
|
||||
.IP \(bu 2
|
||||
\&'p' Selected string stripped from Pango markup (Needs to be a valid string)
|
||||
.IP \(bu 2
|
||||
\&'f' filter string (user input)
|
||||
.IP \(bu 2
|
||||
\&'F' quoted filter string (user input)
|
||||
|
||||
.RE
|
||||
|
||||
.PP
|
||||
Default: 's'
|
||||
|
||||
.PP
|
||||
\fB\fC-select\fR \fIstring\fP
|
||||
|
||||
.PP
|
||||
Select first line that matches the given string
|
||||
|
||||
.PP
|
||||
\fB\fC-mesg\fR \fIstring\fP
|
||||
|
||||
.PP
|
||||
Add a message line below the filter entry box. Supports Pango markup. For more
|
||||
information on supported markup, see
|
||||
here
|
||||
\[la]https://docs.gtk.org/Pango/pango_markup.html\[ra]
|
||||
|
||||
.PP
|
||||
\fB\fC-dump\fR
|
||||
|
||||
.PP
|
||||
Dump the filtered list to stdout and quit.
|
||||
This can be used to get the list as \fBrofi\fP would filter it.
|
||||
Use together with \fB\fC-filter\fR command.
|
||||
|
||||
.PP
|
||||
\fB\fC-input\fR \fIfile\fP
|
||||
|
||||
.PP
|
||||
Reads from \fIfile\fP instead of stdin.
|
||||
|
||||
.PP
|
||||
\fB\fC-password\fR
|
||||
|
||||
.PP
|
||||
Hide the input text. This should not be considered secure!
|
||||
|
||||
.PP
|
||||
\fB\fC-markup-rows\fR
|
||||
|
||||
.PP
|
||||
Tell \fBrofi\fP that DMenu input is Pango markup encoded, and should be rendered.
|
||||
See here
|
||||
\[la]https://developer.gnome.org/pygtk/stable/pango-markup-language.html\[ra]
|
||||
for details about Pango markup.
|
||||
|
||||
.PP
|
||||
\fB\fC-multi-select\fR
|
||||
|
||||
.PP
|
||||
Allow multiple lines to be selected. Adds a small selection indicator to the
|
||||
left of each entry.
|
||||
|
||||
.PP
|
||||
\fB\fC-sync\fR
|
||||
|
||||
.PP
|
||||
Force \fBrofi\fP mode to first read all data from stdin before showing the
|
||||
selection window. This is original dmenu behavior.
|
||||
|
||||
.PP
|
||||
Note: the default asynchronous mode will also be automatically disabled if used
|
||||
with conflicting options,
|
||||
such as \fB\fC-dump\fR, \fB\fC-only-match\fR or \fB\fC-auto-select\fR\&.
|
||||
|
||||
.PP
|
||||
\fB\fC-window-title\fR \fItitle\fP
|
||||
|
||||
.PP
|
||||
Set name used for the window title. Will be shown as Rofi - \fItitle\fP
|
||||
|
||||
.PP
|
||||
\fB\fC-w\fR \fIwindowid\fP
|
||||
|
||||
.PP
|
||||
Position \fBrofi\fP over the window with the given X11 window ID.
|
||||
|
||||
.PP
|
||||
\fB\fC-keep-right\fR
|
||||
|
||||
.PP
|
||||
Set ellipsize mode to start. So, the end of the string is visible.
|
||||
|
||||
.PP
|
||||
\fB\fC-display-columns\fR
|
||||
|
||||
.PP
|
||||
A comma seperated list of columns to show.
|
||||
|
||||
.PP
|
||||
\fB\fC-display-column-separator\fR
|
||||
|
||||
.PP
|
||||
The column separator. This is a regex.
|
||||
|
||||
.PP
|
||||
\fIdefault\fP: '\\t'
|
||||
|
||||
.PP
|
||||
\fB\fC-ballot-selected-str\fR \fIstring\fP
|
||||
|
||||
.PP
|
||||
When multi-select is enabled, prefix this string when element is selected.
|
||||
|
||||
.PP
|
||||
\fIdefault\fP: "☑ "
|
||||
|
||||
.PP
|
||||
\fB\fC-ballot-unselected-str\fR \fIstring\fP
|
||||
|
||||
.PP
|
||||
When multi-select is enabled, prefix this string when element is not selected.
|
||||
|
||||
.PP
|
||||
\fIdefault\fP: "☐ "
|
||||
|
||||
.PP
|
||||
\fB\fC-ellipsize-mode\fR (start|middle|end)
|
||||
|
||||
.PP
|
||||
Set ellipsize mode on the listview.
|
||||
|
||||
.PP
|
||||
\fIdefault\fP "end"
|
||||
|
||||
.SH PARSING ROW OPTIONS
|
||||
.PP
|
||||
Extra options for individual rows can be also set. See the \fBrofi-script(5)\fP
|
||||
manpage for details; the syntax and supported features are identical.
|
||||
|
||||
.SH RETURN VALUE
|
||||
.RS
|
||||
.IP \(bu 2
|
||||
\fB0\fP: Row has been selected accepted by user.
|
||||
.IP \(bu 2
|
||||
\fB1\fP: User cancelled the selection.
|
||||
.IP \(bu 2
|
||||
\fB10-28\fP: Row accepted by custom keybinding.
|
||||
|
||||
.RE
|
||||
|
||||
.SH SEE ALSO
|
||||
.PP
|
||||
rofi(1), rofi-sensible-terminal(1), dmenu(1), rofi-theme(5), rofi-script(5),
|
||||
rofi-theme-selector(1), ascii(7)
|
||||
|
||||
.SH AUTHOR
|
||||
.PP
|
||||
Qball Cow qball@gmpclient.org
|
||||
\[la]mailto:qball@gmpclient.org\[ra]
|
||||
|
||||
.PP
|
||||
Rasmus Steinke rasi@xssn.at
|
||||
\[la]mailto:rasi@xssn.at\[ra]
|
||||
|
||||
.PP
|
||||
Morgane Glidic sardemff7+rofi@sardemff7.net
|
||||
\[la]mailto:sardemff7+rofi@sardemff7.net\[ra]
|
||||
|
||||
.PP
|
||||
Original code based on work by: Sean Pringle sean.pringle@gmail.com
|
||||
\[la]mailto:sean.pringle@gmail.com\[ra]
|
||||
|
||||
.PP
|
||||
For a full list of authors, check the AUTHORS file.
|
|
@ -1,4 +1,4 @@
|
|||
# ROFI-DMENU 5 rofi-dmenu
|
||||
# rofi-dmenu(5)
|
||||
|
||||
## NAME
|
||||
|
||||
|
|
676
doc/rofi-keys.5
676
doc/rofi-keys.5
|
@ -1,676 +0,0 @@
|
|||
.nh
|
||||
.TH ROFI-KEYS 5 rofi-keys
|
||||
.SH NAME
|
||||
.PP
|
||||
\fBrofi keys\fP - Rofi Key and Mouse bindings
|
||||
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
\fBrofi\fP supports overriding of any of it key and mouse binding.
|
||||
|
||||
.SH Setting binding
|
||||
.PP
|
||||
Bindings can be done on the commandline (-{bindingname}):
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
rofi -show run -kb-accept-entry 'Control+Shift+space'
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.PP
|
||||
or via the configuration file:
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
configuration {
|
||||
kb-accept-entry: "Control+Shift+space";
|
||||
}
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.PP
|
||||
The key can be set by its name (see above) or its keycode:
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
configuration {
|
||||
kb-accept-entry: "Control+Shift+[65]";
|
||||
}
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.PP
|
||||
An easy way to look up keycode is xev(1).
|
||||
|
||||
.PP
|
||||
Multiple keys can be specified for an action as a comma separated list:
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
configuration {
|
||||
kb-accept-entry: "Control+Shift+space,Return";
|
||||
}
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.PP
|
||||
By Default \fBrofi\fP reacts on pressing, to act on the release of all keys
|
||||
prepend the binding with \fB\fC!\fR:
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
configuration {
|
||||
kb-accept-entry: "!Control+Shift+space,Return";
|
||||
}
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.SH Unsetting a binding
|
||||
.PP
|
||||
To unset a binding, pass an empty string.
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
configuration {
|
||||
kb-clear-line: "";
|
||||
}
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.SH Keyboard Bindings
|
||||
.SS \fBkb-primary-paste\fP:
|
||||
.PP
|
||||
Paste primary selection
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+V,Shift+Insert
|
||||
|
||||
.SS \fBkb-secondary-paste\fP
|
||||
.PP
|
||||
Paste clipboard
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+v,Insert
|
||||
|
||||
.SS \fBkb-secondary-copy\fP
|
||||
.PP
|
||||
Copy current selection to clipboard
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+c
|
||||
|
||||
.SS \fBkb-clear-line\fP
|
||||
.PP
|
||||
Clear input line
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+w
|
||||
|
||||
.SS \fBkb-move-front\fP
|
||||
.PP
|
||||
Beginning of line
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+a
|
||||
|
||||
.SS \fBkb-move-end\fP
|
||||
.PP
|
||||
End of line
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+e
|
||||
|
||||
.SS \fBkb-move-word-back\fP
|
||||
.PP
|
||||
Move back one word
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+b,Control+Left
|
||||
|
||||
.SS \fBkb-move-word-forward\fP
|
||||
.PP
|
||||
Move forward one word
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+f,Control+Right
|
||||
|
||||
.SS \fBkb-move-char-back\fP
|
||||
.PP
|
||||
Move back one char
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Left,Control+b
|
||||
|
||||
.SS \fBkb-move-char-forward\fP
|
||||
.PP
|
||||
Move forward one char
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Right,Control+f
|
||||
|
||||
.SS \fBkb-remove-word-back\fP
|
||||
.PP
|
||||
Delete previous word
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+Alt+h,Control+BackSpace
|
||||
|
||||
.SS \fBkb-remove-word-forward\fP
|
||||
.PP
|
||||
Delete next word
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+Alt+d
|
||||
|
||||
.SS \fBkb-remove-char-forward\fP
|
||||
.PP
|
||||
Delete next char
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Delete,Control+d
|
||||
|
||||
.SS \fBkb-remove-char-back\fP
|
||||
.PP
|
||||
Delete previous char
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: BackSpace,Shift+BackSpace,Control+h
|
||||
|
||||
.SS \fBkb-remove-to-eol\fP
|
||||
.PP
|
||||
Delete till the end of line
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+k
|
||||
|
||||
.SS \fBkb-remove-to-sol\fP
|
||||
.PP
|
||||
Delete till the start of line
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+u
|
||||
|
||||
.SS \fBkb-accept-entry\fP
|
||||
.PP
|
||||
Accept entry
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+j,Control+m,Return,KP_Enter
|
||||
|
||||
.SS \fBkb-accept-custom\fP
|
||||
.PP
|
||||
Use entered text as command (in ssh/run modes)
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+Return
|
||||
|
||||
.SS \fBkb-accept-custom-alt\fP
|
||||
.PP
|
||||
Use entered text as command (in ssh/run modes)
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+Shift+Return
|
||||
|
||||
.SS \fBkb-accept-alt\fP
|
||||
.PP
|
||||
Use alternate accept command.
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Shift+Return
|
||||
|
||||
.SS \fBkb-delete-entry\fP
|
||||
.PP
|
||||
Delete entry from history
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Shift+Delete
|
||||
|
||||
.SS \fBkb-mode-next\fP
|
||||
.PP
|
||||
Switch to the next mode.
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Shift+Right,Control+Tab
|
||||
|
||||
.SS \fBkb-mode-previous\fP
|
||||
.PP
|
||||
Switch to the previous mode.
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Shift+Left,Control+ISO_Left_Tab
|
||||
|
||||
.SS \fBkb-mode-complete\fP
|
||||
.PP
|
||||
Start completion for mode.
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+l
|
||||
|
||||
.SS \fBkb-row-left\fP
|
||||
.PP
|
||||
Go to the previous column
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+Page_Up
|
||||
|
||||
.SS \fBkb-row-right\fP
|
||||
.PP
|
||||
Go to the next column
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+Page_Down
|
||||
|
||||
.SS \fBkb-row-up\fP
|
||||
.PP
|
||||
Select previous entry
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Up,Control+p
|
||||
|
||||
.SS \fBkb-row-down\fP
|
||||
.PP
|
||||
Select next entry
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Down,Control+n
|
||||
|
||||
.SS \fBkb-row-tab\fP
|
||||
.PP
|
||||
Go to next row, if one left, accept it, if no left next mode.
|
||||
|
||||
.PP
|
||||
\fBDefault\fP:
|
||||
|
||||
.SS \fBkb-element-next\fP
|
||||
.PP
|
||||
Go to next row.
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Tab
|
||||
|
||||
.SS \fBkb-element-prev\fP
|
||||
.PP
|
||||
Go to previous row.
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: ISO_Left_Tab
|
||||
|
||||
.SS \fBkb-page-prev\fP
|
||||
.PP
|
||||
Go to the previous page
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Page_Up
|
||||
|
||||
.SS \fBkb-page-next\fP
|
||||
.PP
|
||||
Go to the next page
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Page_Down
|
||||
|
||||
.SS \fBkb-row-first\fP
|
||||
.PP
|
||||
Go to the first entry
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Home,KP_Home
|
||||
|
||||
.SS \fBkb-row-last\fP
|
||||
.PP
|
||||
Go to the last entry
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: End,KP_End
|
||||
|
||||
.SS \fBkb-row-select\fP
|
||||
.PP
|
||||
Set selected item as input text
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+space
|
||||
|
||||
.SS \fBkb-screenshot\fP
|
||||
.PP
|
||||
Take a screenshot of the rofi window
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+S
|
||||
|
||||
.SS \fBkb-ellipsize\fP
|
||||
.PP
|
||||
Toggle between ellipsize modes for displayed data
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+period
|
||||
|
||||
.SS \fBkb-toggle-case-sensitivity\fP
|
||||
.PP
|
||||
Toggle case sensitivity
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: grave,dead_grave
|
||||
|
||||
.SS \fBkb-toggle-sort\fP
|
||||
.PP
|
||||
Toggle filtered menu sort
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+grave
|
||||
|
||||
.SS \fBkb-cancel\fP
|
||||
.PP
|
||||
Quit rofi
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Escape,Control+g,Control+bracketleft
|
||||
|
||||
.SS \fBkb-custom-1\fP
|
||||
.PP
|
||||
Custom keybinding 1
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+1
|
||||
|
||||
.SS \fBkb-custom-2\fP
|
||||
.PP
|
||||
Custom keybinding 2
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+2
|
||||
|
||||
.SS \fBkb-custom-3\fP
|
||||
.PP
|
||||
Custom keybinding 3
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+3
|
||||
|
||||
.SS \fBkb-custom-4\fP
|
||||
.PP
|
||||
Custom keybinding 4
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+4
|
||||
|
||||
.SS \fBkb-custom-5\fP
|
||||
.PP
|
||||
Custom Keybinding 5
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+5
|
||||
|
||||
.SS \fBkb-custom-6\fP
|
||||
.PP
|
||||
Custom keybinding 6
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+6
|
||||
|
||||
.SS \fBkb-custom-7\fP
|
||||
.PP
|
||||
Custom Keybinding 7
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+7
|
||||
|
||||
.SS \fBkb-custom-8\fP
|
||||
.PP
|
||||
Custom keybinding 8
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+8
|
||||
|
||||
.SS \fBkb-custom-9\fP
|
||||
.PP
|
||||
Custom keybinding 9
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+9
|
||||
|
||||
.SS \fBkb-custom-10\fP
|
||||
.PP
|
||||
Custom keybinding 10
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+0
|
||||
|
||||
.SS \fBkb-custom-11\fP
|
||||
.PP
|
||||
Custom keybinding 11
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+exclam
|
||||
|
||||
.SS \fBkb-custom-12\fP
|
||||
.PP
|
||||
Custom keybinding 12
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+at
|
||||
|
||||
.SS \fBkb-custom-13\fP
|
||||
.PP
|
||||
Custom keybinding 13
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+numbersign
|
||||
|
||||
.SS \fBkb-custom-14\fP
|
||||
.PP
|
||||
Custom keybinding 14
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+dollar
|
||||
|
||||
.SS \fBkb-custom-15\fP
|
||||
.PP
|
||||
Custom keybinding 15
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+percent
|
||||
|
||||
.SS \fBkb-custom-16\fP
|
||||
.PP
|
||||
Custom keybinding 16
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+dead_circumflex
|
||||
|
||||
.SS \fBkb-custom-17\fP
|
||||
.PP
|
||||
Custom keybinding 17
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+ampersand
|
||||
|
||||
.SS \fBkb-custom-18\fP
|
||||
.PP
|
||||
Custom keybinding 18
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+asterisk
|
||||
|
||||
.SS \fBkb-custom-19\fP
|
||||
.PP
|
||||
Custom Keybinding 19
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Alt+parenleft
|
||||
|
||||
.SS \fBkb-select-1\fP
|
||||
.PP
|
||||
Select row 1
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Super+1
|
||||
|
||||
.SS \fBkb-select-2\fP
|
||||
.PP
|
||||
Select row 2
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Super+2
|
||||
|
||||
.SS \fBkb-select-3\fP
|
||||
.PP
|
||||
Select row 3
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Super+3
|
||||
|
||||
.SS \fBkb-select-4\fP
|
||||
.PP
|
||||
Select row 4
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Super+4
|
||||
|
||||
.SS \fBkb-select-5\fP
|
||||
.PP
|
||||
Select row 5
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Super+5
|
||||
|
||||
.SS \fBkb-select-6\fP
|
||||
.PP
|
||||
Select row 6
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Super+6
|
||||
|
||||
.SS \fBkb-select-7\fP
|
||||
.PP
|
||||
Select row 7
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Super+7
|
||||
|
||||
.SS \fBkb-select-8\fP
|
||||
.PP
|
||||
Select row 8
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Super+8
|
||||
|
||||
.SS \fBkb-select-9\fP
|
||||
.PP
|
||||
Select row 9
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Super+9
|
||||
|
||||
.SS \fBkb-select-10\fP
|
||||
.PP
|
||||
Select row 10
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Super+0
|
||||
|
||||
.SS \fBkb-entry-history-up\fP
|
||||
.PP
|
||||
Go up in the entry history.
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+Up
|
||||
|
||||
.SS \fBkb-entry-history-down\fP
|
||||
.PP
|
||||
Go down in the entry history.
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+Down
|
||||
|
||||
.SH Mouse Bindings
|
||||
.SS \fBml-row-left\fP
|
||||
.PP
|
||||
Go to the previous column
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: ScrollLeft
|
||||
|
||||
.SS \fBml-row-right\fP
|
||||
.PP
|
||||
Go to the next column
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: ScrollRight
|
||||
|
||||
.SS \fBml-row-up\fP
|
||||
.PP
|
||||
Select previous entry
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: ScrollUp
|
||||
|
||||
.SS \fBml-row-down\fP
|
||||
.PP
|
||||
Select next entry
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: ScrollDown
|
||||
|
||||
.SS \fBme-select-entry\fP
|
||||
.PP
|
||||
Select hovered row
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: MousePrimary
|
||||
|
||||
.SS \fBme-accept-entry\fP
|
||||
.PP
|
||||
Accept hovered row
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: MouseDPrimary
|
||||
|
||||
.SS \fBme-accept-custom\fP
|
||||
.PP
|
||||
Accept hovered row with custom action
|
||||
|
||||
.PP
|
||||
\fBDefault\fP: Control+MouseDPrimary
|
||||
|
||||
.SH SEE ALSO
|
||||
.PP
|
||||
rofi(1), rofi-sensible-terminal(1), rofi-theme(5), rofi-script(5)
|
||||
|
||||
.SH AUTHOR
|
||||
.PP
|
||||
Qball Cow qball@gmpclient.org
|
||||
\[la]mailto:qball@gmpclient.org\[ra]
|
||||
|
||||
.PP
|
||||
Rasmus Steinke rasi@xssn.at
|
||||
\[la]mailto:rasi@xssn.at\[ra]
|
||||
|
||||
.PP
|
||||
Morgane Glidic sardemff7+rofi@sardemff7.net
|
||||
\[la]mailto:sardemff7+rofi@sardemff7.net\[ra]
|
||||
|
||||
.PP
|
||||
Original code based on work by: Sean Pringle sean.pringle@gmail.com
|
||||
\[la]mailto:sean.pringle@gmail.com\[ra]
|
||||
|
||||
.PP
|
||||
For a full list of authors, check the AUTHORS file.
|
|
@ -1,4 +1,4 @@
|
|||
# ROFI-KEYS 5 rofi-keys
|
||||
# rofi-keys(5)
|
||||
|
||||
## NAME
|
||||
|
||||
|
@ -63,481 +63,481 @@ configuration {
|
|||
|
||||
## Keyboard Bindings
|
||||
|
||||
### **kb-primary-paste**:
|
||||
`kb-primary-paste`
|
||||
|
||||
Paste primary selection
|
||||
|
||||
**Default**: Control+V,Shift+Insert
|
||||
Default: Control+V,Shift+Insert
|
||||
|
||||
### **kb-secondary-paste**
|
||||
`kb-secondary-paste`
|
||||
|
||||
Paste clipboard
|
||||
|
||||
**Default**: Control+v,Insert
|
||||
Default: Control+v,Insert
|
||||
|
||||
### **kb-secondary-copy**
|
||||
`kb-secondary-copy`
|
||||
|
||||
Copy current selection to clipboard
|
||||
|
||||
**Default**: Control+c
|
||||
Default: Control+c
|
||||
|
||||
### **kb-clear-line**
|
||||
`kb-clear-line`
|
||||
|
||||
Clear input line
|
||||
|
||||
**Default**: Control+w
|
||||
Default: Control+w
|
||||
|
||||
### **kb-move-front**
|
||||
`kb-move-front`
|
||||
|
||||
Beginning of line
|
||||
|
||||
**Default**: Control+a
|
||||
Default: Control+a
|
||||
|
||||
### **kb-move-end**
|
||||
`kb-move-end`
|
||||
|
||||
End of line
|
||||
|
||||
**Default**: Control+e
|
||||
Default: Control+e
|
||||
|
||||
### **kb-move-word-back**
|
||||
`kb-move-word-back`
|
||||
|
||||
Move back one word
|
||||
|
||||
**Default**: Alt+b,Control+Left
|
||||
Default: Alt+b,Control+Left
|
||||
|
||||
### **kb-move-word-forward**
|
||||
`kb-move-word-forward`
|
||||
|
||||
Move forward one word
|
||||
|
||||
**Default**: Alt+f,Control+Right
|
||||
Default: Alt+f,Control+Right
|
||||
|
||||
### **kb-move-char-back**
|
||||
`kb-move-char-back`
|
||||
|
||||
Move back one char
|
||||
|
||||
**Default**: Left,Control+b
|
||||
Default: Left,Control+b
|
||||
|
||||
### **kb-move-char-forward**
|
||||
`kb-move-char-forward`
|
||||
|
||||
Move forward one char
|
||||
|
||||
**Default**: Right,Control+f
|
||||
Default: Right,Control+f
|
||||
|
||||
### **kb-remove-word-back**
|
||||
`kb-remove-word-back`
|
||||
|
||||
Delete previous word
|
||||
|
||||
**Default**: Control+Alt+h,Control+BackSpace
|
||||
Default: Control+Alt+h,Control+BackSpace
|
||||
|
||||
### **kb-remove-word-forward**
|
||||
`kb-remove-word-forward`
|
||||
|
||||
Delete next word
|
||||
|
||||
**Default**: Control+Alt+d
|
||||
Default: Control+Alt+d
|
||||
|
||||
### **kb-remove-char-forward**
|
||||
`kb-remove-char-forward`
|
||||
|
||||
Delete next char
|
||||
|
||||
**Default**: Delete,Control+d
|
||||
Default: Delete,Control+d
|
||||
|
||||
### **kb-remove-char-back**
|
||||
`kb-remove-char-back`
|
||||
|
||||
Delete previous char
|
||||
|
||||
**Default**: BackSpace,Shift+BackSpace,Control+h
|
||||
Default: BackSpace,Shift+BackSpace,Control+h
|
||||
|
||||
### **kb-remove-to-eol**
|
||||
`kb-remove-to-eol`
|
||||
|
||||
Delete till the end of line
|
||||
|
||||
**Default**: Control+k
|
||||
Default: Control+k
|
||||
|
||||
### **kb-remove-to-sol**
|
||||
`kb-remove-to-sol`
|
||||
|
||||
Delete till the start of line
|
||||
|
||||
**Default**: Control+u
|
||||
Default: Control+u
|
||||
|
||||
### **kb-accept-entry**
|
||||
`kb-accept-entry`
|
||||
|
||||
Accept entry
|
||||
|
||||
**Default**: Control+j,Control+m,Return,KP\_Enter
|
||||
Default: Control+j,Control+m,Return,KP\_Enter
|
||||
|
||||
### **kb-accept-custom**
|
||||
`kb-accept-custom`
|
||||
|
||||
Use entered text as command (in ssh/run modes)
|
||||
|
||||
**Default**: Control+Return
|
||||
Default: Control+Return
|
||||
|
||||
### **kb-accept-custom-alt**
|
||||
`kb-accept-custom-alt`
|
||||
|
||||
Use entered text as command (in ssh/run modes)
|
||||
|
||||
**Default**: Control+Shift+Return
|
||||
Default: Control+Shift+Return
|
||||
|
||||
### **kb-accept-alt**
|
||||
`kb-accept-alt`
|
||||
|
||||
Use alternate accept command.
|
||||
|
||||
**Default**: Shift+Return
|
||||
Default: Shift+Return
|
||||
|
||||
### **kb-delete-entry**
|
||||
`kb-delete-entry`
|
||||
|
||||
Delete entry from history
|
||||
|
||||
**Default**: Shift+Delete
|
||||
Default: Shift+Delete
|
||||
|
||||
### **kb-mode-next**
|
||||
`kb-mode-next`
|
||||
|
||||
Switch to the next mode.
|
||||
|
||||
**Default**: Shift+Right,Control+Tab
|
||||
Default: Shift+Right,Control+Tab
|
||||
|
||||
### **kb-mode-previous**
|
||||
`kb-mode-previous`
|
||||
|
||||
Switch to the previous mode.
|
||||
|
||||
**Default**: Shift+Left,Control+ISO\_Left\_Tab
|
||||
Default: Shift+Left,Control+ISO\_Left\_Tab
|
||||
|
||||
### **kb-mode-complete**
|
||||
`kb-mode-complete`
|
||||
|
||||
Start completion for mode.
|
||||
|
||||
**Default**: Control+l
|
||||
Default: Control+l
|
||||
|
||||
### **kb-row-left**
|
||||
`kb-row-left`
|
||||
|
||||
Go to the previous column
|
||||
|
||||
**Default**: Control+Page\_Up
|
||||
Default: Control+Page\_Up
|
||||
|
||||
### **kb-row-right**
|
||||
`kb-row-right`
|
||||
|
||||
Go to the next column
|
||||
|
||||
**Default**: Control+Page\_Down
|
||||
Default: Control+Page\_Down
|
||||
|
||||
### **kb-row-up**
|
||||
`kb-row-up`
|
||||
|
||||
Select previous entry
|
||||
|
||||
**Default**: Up,Control+p
|
||||
Default: Up,Control+p
|
||||
|
||||
### **kb-row-down**
|
||||
`kb-row-down`
|
||||
|
||||
Select next entry
|
||||
|
||||
**Default**: Down,Control+n
|
||||
Default: Down,Control+n
|
||||
|
||||
### **kb-row-tab**
|
||||
`kb-row-tab`
|
||||
|
||||
Go to next row, if one left, accept it, if no left next mode.
|
||||
|
||||
**Default**:
|
||||
Default:
|
||||
|
||||
### **kb-element-next**
|
||||
`kb-element-next`
|
||||
|
||||
Go to next row.
|
||||
|
||||
**Default**: Tab
|
||||
Default: Tab
|
||||
|
||||
### **kb-element-prev**
|
||||
`kb-element-prev`
|
||||
|
||||
Go to previous row.
|
||||
|
||||
**Default**: ISO\_Left\_Tab
|
||||
Default: ISO\_Left\_Tab
|
||||
|
||||
### **kb-page-prev**
|
||||
`kb-page-prev`
|
||||
|
||||
Go to the previous page
|
||||
|
||||
**Default**: Page\_Up
|
||||
Default: Page\_Up
|
||||
|
||||
### **kb-page-next**
|
||||
`kb-page-next`
|
||||
|
||||
Go to the next page
|
||||
|
||||
**Default**: Page\_Down
|
||||
Default: Page\_Down
|
||||
|
||||
### **kb-row-first**
|
||||
`kb-row-first`
|
||||
|
||||
Go to the first entry
|
||||
|
||||
**Default**: Home,KP\_Home
|
||||
Default: Home,KP\_Home
|
||||
|
||||
### **kb-row-last**
|
||||
`kb-row-last`
|
||||
|
||||
Go to the last entry
|
||||
|
||||
**Default**: End,KP\_End
|
||||
Default: End,KP\_End
|
||||
|
||||
### **kb-row-select**
|
||||
`kb-row-select`
|
||||
|
||||
Set selected item as input text
|
||||
|
||||
**Default**: Control+space
|
||||
Default: Control+space
|
||||
|
||||
### **kb-screenshot**
|
||||
`kb-screenshot`
|
||||
|
||||
Take a screenshot of the rofi window
|
||||
|
||||
**Default**: Alt+S
|
||||
Default: Alt+S
|
||||
|
||||
### **kb-ellipsize**
|
||||
`kb-ellipsize`
|
||||
|
||||
Toggle between ellipsize modes for displayed data
|
||||
|
||||
**Default**: Alt+period
|
||||
Default: Alt+period
|
||||
|
||||
### **kb-toggle-case-sensitivity**
|
||||
`kb-toggle-case-sensitivity`
|
||||
|
||||
Toggle case sensitivity
|
||||
|
||||
**Default**: grave,dead\_grave
|
||||
Default: grave,dead\_grave
|
||||
|
||||
### **kb-toggle-sort**
|
||||
`kb-toggle-sort`
|
||||
|
||||
Toggle filtered menu sort
|
||||
|
||||
**Default**: Alt+grave
|
||||
Default: Alt+grave
|
||||
|
||||
### **kb-cancel**
|
||||
`kb-cancel`
|
||||
|
||||
Quit rofi
|
||||
|
||||
**Default**: Escape,Control+g,Control+bracketleft
|
||||
Default: Escape,Control+g,Control+bracketleft
|
||||
|
||||
### **kb-custom-1**
|
||||
`kb-custom-1`
|
||||
|
||||
Custom keybinding 1
|
||||
|
||||
**Default**: Alt+1
|
||||
Default: Alt+1
|
||||
|
||||
### **kb-custom-2**
|
||||
`kb-custom-2`
|
||||
|
||||
Custom keybinding 2
|
||||
|
||||
**Default**: Alt+2
|
||||
Default: Alt+2
|
||||
|
||||
### **kb-custom-3**
|
||||
`kb-custom-3`
|
||||
|
||||
Custom keybinding 3
|
||||
|
||||
**Default**: Alt+3
|
||||
Default: Alt+3
|
||||
|
||||
### **kb-custom-4**
|
||||
`kb-custom-4`
|
||||
|
||||
Custom keybinding 4
|
||||
|
||||
**Default**: Alt+4
|
||||
Default: Alt+4
|
||||
|
||||
### **kb-custom-5**
|
||||
`kb-custom-5`
|
||||
|
||||
Custom Keybinding 5
|
||||
|
||||
**Default**: Alt+5
|
||||
Default: Alt+5
|
||||
|
||||
### **kb-custom-6**
|
||||
`kb-custom-6`
|
||||
|
||||
Custom keybinding 6
|
||||
|
||||
**Default**: Alt+6
|
||||
Default: Alt+6
|
||||
|
||||
### **kb-custom-7**
|
||||
`kb-custom-7`
|
||||
|
||||
Custom Keybinding 7
|
||||
|
||||
**Default**: Alt+7
|
||||
Default: Alt+7
|
||||
|
||||
### **kb-custom-8**
|
||||
`kb-custom-8`
|
||||
|
||||
Custom keybinding 8
|
||||
|
||||
**Default**: Alt+8
|
||||
Default: Alt+8
|
||||
|
||||
### **kb-custom-9**
|
||||
`kb-custom-9`
|
||||
|
||||
Custom keybinding 9
|
||||
|
||||
**Default**: Alt+9
|
||||
Default: Alt+9
|
||||
|
||||
### **kb-custom-10**
|
||||
`kb-custom-10`
|
||||
|
||||
Custom keybinding 10
|
||||
|
||||
**Default**: Alt+0
|
||||
Default: Alt+0
|
||||
|
||||
### **kb-custom-11**
|
||||
`kb-custom-11`
|
||||
|
||||
Custom keybinding 11
|
||||
|
||||
**Default**: Alt+exclam
|
||||
Default: Alt+exclam
|
||||
|
||||
### **kb-custom-12**
|
||||
`kb-custom-12`
|
||||
|
||||
Custom keybinding 12
|
||||
|
||||
**Default**: Alt+at
|
||||
Default: Alt+at
|
||||
|
||||
### **kb-custom-13**
|
||||
`kb-custom-13`
|
||||
|
||||
Custom keybinding 13
|
||||
|
||||
**Default**: Alt+numbersign
|
||||
Default: Alt+numbersign
|
||||
|
||||
### **kb-custom-14**
|
||||
`kb-custom-14`
|
||||
|
||||
Custom keybinding 14
|
||||
|
||||
**Default**: Alt+dollar
|
||||
Default: Alt+dollar
|
||||
|
||||
### **kb-custom-15**
|
||||
`kb-custom-15`
|
||||
|
||||
Custom keybinding 15
|
||||
|
||||
**Default**: Alt+percent
|
||||
Default: Alt+percent
|
||||
|
||||
### **kb-custom-16**
|
||||
`kb-custom-16`
|
||||
|
||||
Custom keybinding 16
|
||||
|
||||
**Default**: Alt+dead\_circumflex
|
||||
Default: Alt+dead\_circumflex
|
||||
|
||||
### **kb-custom-17**
|
||||
`kb-custom-17`
|
||||
|
||||
Custom keybinding 17
|
||||
|
||||
**Default**: Alt+ampersand
|
||||
Default: Alt+ampersand
|
||||
|
||||
### **kb-custom-18**
|
||||
`kb-custom-18`
|
||||
|
||||
Custom keybinding 18
|
||||
|
||||
**Default**: Alt+asterisk
|
||||
Default: Alt+asterisk
|
||||
|
||||
### **kb-custom-19**
|
||||
`kb-custom-19`
|
||||
|
||||
Custom Keybinding 19
|
||||
|
||||
**Default**: Alt+parenleft
|
||||
Default: Alt+parenleft
|
||||
|
||||
### **kb-select-1**
|
||||
`kb-select-1`
|
||||
|
||||
Select row 1
|
||||
|
||||
**Default**: Super+1
|
||||
Default: Super+1
|
||||
|
||||
### **kb-select-2**
|
||||
`kb-select-2`
|
||||
|
||||
Select row 2
|
||||
|
||||
**Default**: Super+2
|
||||
Default: Super+2
|
||||
|
||||
### **kb-select-3**
|
||||
`kb-select-3`
|
||||
|
||||
Select row 3
|
||||
|
||||
**Default**: Super+3
|
||||
Default: Super+3
|
||||
|
||||
### **kb-select-4**
|
||||
`kb-select-4`
|
||||
|
||||
Select row 4
|
||||
|
||||
**Default**: Super+4
|
||||
Default: Super+4
|
||||
|
||||
### **kb-select-5**
|
||||
`kb-select-5`
|
||||
|
||||
Select row 5
|
||||
|
||||
**Default**: Super+5
|
||||
Default: Super+5
|
||||
|
||||
### **kb-select-6**
|
||||
`kb-select-6`
|
||||
|
||||
Select row 6
|
||||
|
||||
**Default**: Super+6
|
||||
Default: Super+6
|
||||
|
||||
### **kb-select-7**
|
||||
`kb-select-7`
|
||||
|
||||
Select row 7
|
||||
|
||||
**Default**: Super+7
|
||||
Default: Super+7
|
||||
|
||||
### **kb-select-8**
|
||||
`kb-select-8`
|
||||
|
||||
Select row 8
|
||||
|
||||
**Default**: Super+8
|
||||
Default: Super+8
|
||||
|
||||
### **kb-select-9**
|
||||
`kb-select-9`
|
||||
|
||||
Select row 9
|
||||
|
||||
**Default**: Super+9
|
||||
Default: Super+9
|
||||
|
||||
### **kb-select-10**
|
||||
`kb-select-10`
|
||||
|
||||
Select row 10
|
||||
|
||||
**Default**: Super+0
|
||||
Default: Super+0
|
||||
|
||||
### **kb-entry-history-up**
|
||||
`kb-entry-history-up`
|
||||
|
||||
Go up in the entry history.
|
||||
|
||||
**Default**: Control+Up
|
||||
Default: Control+Up
|
||||
|
||||
### **kb-entry-history-down**
|
||||
`kb-entry-history-down`
|
||||
|
||||
Go down in the entry history.
|
||||
|
||||
**Default**: Control+Down
|
||||
Default: Control+Down
|
||||
|
||||
## Mouse Bindings
|
||||
|
||||
### **ml-row-left**
|
||||
`ml-row-left`
|
||||
|
||||
Go to the previous column
|
||||
|
||||
**Default**: ScrollLeft
|
||||
Default: ScrollLeft
|
||||
|
||||
### **ml-row-right**
|
||||
`ml-row-right`
|
||||
|
||||
Go to the next column
|
||||
|
||||
**Default**: ScrollRight
|
||||
Default: ScrollRight
|
||||
|
||||
### **ml-row-up**
|
||||
`ml-row-up`
|
||||
|
||||
Select previous entry
|
||||
|
||||
**Default**: ScrollUp
|
||||
Default: ScrollUp
|
||||
|
||||
### **ml-row-down**
|
||||
`ml-row-down`
|
||||
|
||||
Select next entry
|
||||
|
||||
**Default**: ScrollDown
|
||||
Default: ScrollDown
|
||||
|
||||
### **me-select-entry**
|
||||
`me-select-entry`
|
||||
|
||||
Select hovered row
|
||||
|
||||
**Default**: MousePrimary
|
||||
Default: MousePrimary
|
||||
|
||||
### **me-accept-entry**
|
||||
`me-accept-entry`
|
||||
|
||||
Accept hovered row
|
||||
|
||||
**Default**: MouseDPrimary
|
||||
Default: MouseDPrimary
|
||||
|
||||
### **me-accept-custom**
|
||||
`me-accept-custom`
|
||||
|
||||
Accept hovered row with custom action
|
||||
|
||||
**Default**: Control+MouseDPrimary
|
||||
Default: Control+MouseDPrimary
|
||||
|
||||
## SEE ALSO
|
||||
|
||||
|
|
|
@ -1,277 +0,0 @@
|
|||
.nh
|
||||
.TH ROFI-SCRIPT 5 rofi-script
|
||||
.SH NAME
|
||||
.PP
|
||||
\fBrofi script mode\fP - Rofi format for scriptable mode.
|
||||
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
\fBrofi\fP supports modes that use simple scripts in the background to generate a
|
||||
list and process the result from user actions. This provide a simple interface
|
||||
to make simple extensions to rofi.
|
||||
|
||||
.SH USAGE
|
||||
.PP
|
||||
To specify a script mode, set a mode with the following syntax:
|
||||
"{name}:{executable}"
|
||||
|
||||
.PP
|
||||
For example:
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
rofi -show fb -modes "fb:file_browser.sh"
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.PP
|
||||
The name should be unique.
|
||||
|
||||
.SH API
|
||||
.PP
|
||||
Rofi calls the executable without arguments on startup. This should generate a
|
||||
list of options, separated by a newline (\fB\fC\\n\fR) (This can be changed by the
|
||||
script). If the user selects an option, rofi calls the executable with the text
|
||||
of that option as the first argument. If the script returns no entries, rofi
|
||||
quits.
|
||||
|
||||
.PP
|
||||
A simple script would be:
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
#!/usr/bin/env bash
|
||||
|
||||
if [ x"$@" = x"quit" ]
|
||||
then
|
||||
exit 0
|
||||
fi
|
||||
echo "reload"
|
||||
echo "quit"
|
||||
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.PP
|
||||
This shows two entries, reload and quit. When the quit entry is selected, rofi
|
||||
closes.
|
||||
|
||||
.SH Environment
|
||||
.PP
|
||||
Rofi sets the following environment variable when executing the script:
|
||||
|
||||
.SS \fB\fCROFI_RETV\fR
|
||||
.PP
|
||||
An integer number with the current state:
|
||||
|
||||
.RS
|
||||
.IP \(bu 2
|
||||
\fB0\fP: Initial call of script.
|
||||
.IP \(bu 2
|
||||
\fB1\fP: Selected an entry.
|
||||
.IP \(bu 2
|
||||
\fB2\fP: Selected a custom entry.
|
||||
.IP \(bu 2
|
||||
\fB10-28\fP: Custom keybinding 1-19 ( need to be explicitly enabled by script ).
|
||||
|
||||
.RE
|
||||
|
||||
.SS \fB\fCROFI_INFO\fR
|
||||
.PP
|
||||
Environment get set when selected entry get set with the property value of the
|
||||
'info' row option, if set.
|
||||
|
||||
.SS \fB\fCROFI_DATA\fR
|
||||
.PP
|
||||
Environment get set when script sets \fB\fCdata\fR option in header.
|
||||
|
||||
.SH Passing mode options
|
||||
.PP
|
||||
Extra options, like setting the prompt, can be set by the script. Extra options
|
||||
are lines that start with a NULL character (\fB\fC\\0\fR) followed by a key, separator
|
||||
(\fB\fC\\x1f\fR) and value.
|
||||
|
||||
.PP
|
||||
For example to set the prompt:
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
echo -en "\\0prompt\\x1fChange prompt\\n"
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.PP
|
||||
The following extra options exists:
|
||||
|
||||
.RS
|
||||
.IP \(bu 2
|
||||
\fBprompt\fP: Update the prompt text.
|
||||
.IP \(bu 2
|
||||
\fBmessage\fP: Update the message text.
|
||||
.IP \(bu 2
|
||||
\fBmarkup-rows\fP: If 'true' renders markup in the row.
|
||||
.IP \(bu 2
|
||||
\fBurgent\fP: Mark rows as urgent. (for syntax see the urgent option in
|
||||
dmenu mode)
|
||||
.IP \(bu 2
|
||||
\fBactive\fP: Mark rows as active. (for syntax see the active option in
|
||||
dmenu mode)
|
||||
.IP \(bu 2
|
||||
\fBdelim\fP: Set the delimiter for for next rows. Default is '\\n' and
|
||||
this option should finish with this. Only call this on first call of script,
|
||||
it is remembered for consecutive calls.
|
||||
.IP \(bu 2
|
||||
\fBno-custom\fP: If set to 'true'; only accept listed entries, ignore custom
|
||||
input.
|
||||
.IP \(bu 2
|
||||
\fBuse-hot-keys\fP: If set to true, it enabled the Custom keybindings for
|
||||
script. Warning this breaks the normal rofi flow.
|
||||
.IP \(bu 2
|
||||
\fBkeep-selection\fP: If set, the selection is not moved to the first entry,
|
||||
but the current position is maintained. The filter is cleared.
|
||||
.IP \(bu 2
|
||||
\fBnew-selection\fP: If \fB\fCkeep-selection\fR is set, this allows you to override
|
||||
the selected entry (absolute position).
|
||||
.IP \(bu 2
|
||||
\fBdata\fP: Passed data to the next execution of the script via
|
||||
\fBROFI_DATA\fP\&.
|
||||
.IP \(bu 2
|
||||
\fBtheme\fP: Small theme snippet to f.e. change the background color of
|
||||
a widget.
|
||||
|
||||
.RE
|
||||
|
||||
.PP
|
||||
The \fBtheme\fP property cannot change the interface while running, it is only
|
||||
usable for small changes in, for example background color, of widgets that get
|
||||
updated during display like the row color of the listview.
|
||||
|
||||
.SH Parsing row options
|
||||
.PP
|
||||
Extra options for individual rows can be set. The extra option can be specified
|
||||
following the same syntax as mode option, but following the entry.
|
||||
|
||||
.PP
|
||||
For example:
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
echo -en "aap\\0icon\\x1ffolder\\n"
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.PP
|
||||
The following options are supported:
|
||||
|
||||
.RS
|
||||
.IP \(bu 2
|
||||
\fBicon\fP: Set the icon for that row.
|
||||
.IP \(bu 2
|
||||
\fBdisplay\fP: Replace the displayed string. (Original string will still be used for filtering)
|
||||
.IP \(bu 2
|
||||
\fBmeta\fP: Specify invisible search terms used for filtering.
|
||||
.IP \(bu 2
|
||||
\fBnonselectable\fP: If true the row cannot activated.
|
||||
.IP \(bu 2
|
||||
\fBinfo\fP: Info that, on selection, gets placed in the \fB\fCROFI_INFO\fR
|
||||
environment variable. This entry does not get searched for filtering.
|
||||
.IP \(bu 2
|
||||
\fBurgent\fP: Set urgent flag on entry (true/false)
|
||||
.IP \(bu 2
|
||||
\fBactive\fP: Set active flag on entry (true/false)
|
||||
|
||||
.RE
|
||||
|
||||
.PP
|
||||
multiple entries can be passed using the \fB\fC\\x1f\fR separator.
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
echo -en "aap\\0icon\\x1ffolder\\x1finfo\\x1ftest\\n"
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.SH Executing external program
|
||||
.PP
|
||||
If you want to launch an external program from the script, you need to make
|
||||
sure it is launched in the background. If not rofi will wait for its output (to
|
||||
display).
|
||||
|
||||
.PP
|
||||
In bash the best way to do this is using \fB\fCcoproc\fR\&.
|
||||
|
||||
.PP
|
||||
.RS
|
||||
|
||||
.nf
|
||||
coproc ( myApp > /dev/null 2>&1 )
|
||||
|
||||
.fi
|
||||
.RE
|
||||
|
||||
.SH DASH shell
|
||||
.PP
|
||||
If you use the \fB\fCdash\fR shell for your script, take special care with how dash
|
||||
handles escaped values for the separators. See issue #1201 on github.
|
||||
|
||||
.SH Script locations
|
||||
.PP
|
||||
To specify a script there are the following options:
|
||||
|
||||
.RS
|
||||
.IP \(bu 2
|
||||
Specify an absolute path to the script.
|
||||
.IP \(bu 2
|
||||
The script is executable and located in your $PATH
|
||||
|
||||
.RE
|
||||
|
||||
.PP
|
||||
Scripts located in the following location are loaded on startup:
|
||||
|
||||
.RS
|
||||
.IP \(bu 2
|
||||
The script is in \fB\fC$XDG_CONFIG_PATH/rofi/scripts/\fR, this is usually
|
||||
\fB\fC~/.config/rofi/scripts/\fR\&.
|
||||
|
||||
.RE
|
||||
|
||||
.SH SEE ALSO
|
||||
.PP
|
||||
rofi(1), rofi-sensible-terminal(1), dmenu(1), rofi-theme(5),
|
||||
rofi-theme-selector(1)
|
||||
|
||||
.SH AUTHOR
|
||||
.PP
|
||||
Qball Cow qball@gmpclient.org
|
||||
\[la]mailto:qball@gmpclient.org\[ra]
|
||||
|
||||
.PP
|
||||
Rasmus Steinke rasi@xssn.at
|
||||
\[la]mailto:rasi@xssn.at\[ra]
|
||||
|
||||
.PP
|
||||
Morgane Glidic sardemff7+rofi@sardemff7.net
|
||||
\[la]mailto:sardemff7+rofi@sardemff7.net\[ra]
|
||||
|
||||
.PP
|
||||
Original code based on work by: Sean Pringle sean.pringle@gmail.com
|
||||
\[la]mailto:sean.pringle@gmail.com\[ra]
|
||||
|
||||
.PP
|
||||
For a full list of authors, check the AUTHORS file.
|
|
@ -1,4 +1,4 @@
|
|||
# ROFI-SCRIPT 5 rofi-script
|
||||
# rofi-script(5)
|
||||
|
||||
## NAME
|
||||
|
||||
|
@ -143,6 +143,8 @@ The following options are supported:
|
|||
|
||||
- **nonselectable**: If true the row cannot activated.
|
||||
|
||||
- **permanent**: If true the row always shows, independent of filter.
|
||||
|
||||
- **info**: Info that, on selection, gets placed in the `ROFI_INFO`
|
||||
environment variable. This entry does not get searched for filtering.
|
||||
|
||||
|
|
|
@ -1,73 +0,0 @@
|
|||
.nh
|
||||
.TH rofi-sensible-terminal 1 rofi-sensible-terminal
|
||||
.SH NAME
|
||||
.PP
|
||||
\fBrofi-sensible-terminal\fP - launches $TERMINAL with fallbacks
|
||||
|
||||
.SH SYNOPSIS
|
||||
.PP
|
||||
rofi-sensible-terminal [arguments]
|
||||
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
rofi-sensible-terminal is invoked in the rofi default config to start a terminal. This
|
||||
wrapper script is necessary since there is no distribution-independent terminal launcher
|
||||
(but for example Debian has x-terminal-emulator). Distribution packagers are responsible for
|
||||
shipping this script in a way which is appropriate for the distribution.
|
||||
|
||||
.PP
|
||||
It tries to start one of the following (in that order):
|
||||
|
||||
.RS
|
||||
.IP \(bu 2
|
||||
\fB\fC$TERMINAL\fR (this is a non-standard variable)
|
||||
.IP \(bu 2
|
||||
x-terminal-emulator
|
||||
.IP \(bu 2
|
||||
urxvt
|
||||
.IP \(bu 2
|
||||
rxvt
|
||||
.IP \(bu 2
|
||||
st
|
||||
.IP \(bu 2
|
||||
terminology
|
||||
.IP \(bu 2
|
||||
qterminal
|
||||
.IP \(bu 2
|
||||
Eterm
|
||||
.IP \(bu 2
|
||||
aterm
|
||||
.IP \(bu 2
|
||||
uxterm
|
||||
.IP \(bu 2
|
||||
xterm
|
||||
.IP \(bu 2
|
||||
roxterm
|
||||
.IP \(bu 2
|
||||
xfce4-terminal.wrapper
|
||||
.IP \(bu 2
|
||||
mate-terminal
|
||||
.IP \(bu 2
|
||||
lxterminal
|
||||
.IP \(bu 2
|
||||
konsole
|
||||
.IP \(bu 2
|
||||
alacritty
|
||||
.IP \(bu 2
|
||||
kitty
|
||||
.IP \(bu 2
|
||||
wezterm
|
||||
|
||||
.RE
|
||||
|
||||
.SH SEE ALSO
|
||||
.PP
|
||||
rofi(1)
|
||||
|
||||
.SH AUTHORS
|
||||
.PP
|
||||
Dave Davenport and contributors
|
||||
|
||||
.PP
|
||||
Copied script from i3:
|
||||
Michael Stapelberg and contributors
|
|
@ -1,4 +1,4 @@
|
|||
# rofi-sensible-terminal 1 rofi-sensible-terminal
|
||||
# rofi-sensible-terminal(1)
|
||||
|
||||
## NAME
|
||||
|
||||
|
|
|
@ -1,46 +0,0 @@
|
|||
.nh
|
||||
.TH rofi-theme-selector 1 rofi-theme-selector
|
||||
.SH NAME
|
||||
.PP
|
||||
\fBrofi-theme-selector\fP - Preview and apply themes for \fBrofi\fP
|
||||
|
||||
.SH DESCRIPTION
|
||||
.PP
|
||||
\fBrofi-theme-selector\fP is a bash/rofi script to preview and apply themes for
|
||||
\fBrofi\fP\&. It's part of any installation of \fBrofi\fP\&.
|
||||
|
||||
.SH USAGE
|
||||
.SS Running rofi-theme-selector
|
||||
.PP
|
||||
\fBrofi-theme-selector\fP shows a list of all available themes in a \fBrofi\fP
|
||||
window. It lets you preview each theme with the Enter key and apply the theme
|
||||
to your \fBrofi\fP configuration file with Alt+a.
|
||||
|
||||
.SH Theme directories
|
||||
.PP
|
||||
\fBrofi-theme-selector\fP searches the following directories for themes:
|
||||
|
||||
.RS
|
||||
.IP \(bu 2
|
||||
${PREFIX}/share/rofi/themes
|
||||
.IP \(bu 2
|
||||
$XDG_CONFIG_HOME/rofi/themes
|
||||
.IP \(bu 2
|
||||
$XDG_DATA_HOME/share/rofi/themes
|
||||
|
||||
.RE
|
||||
|
||||
.PP
|
||||
${PREFIX} reflects the install location of rofi. In most cases this will be
|
||||
"/usr".
|
||||
$XDG_CONFIG_HOME is normally unset. Default path is "$HOME/.config".
|
||||
$XDG_DATA_HOME is normally unset. Default path is "$HOME/.local/share".
|
||||
|
||||
.SH SEE ALSO
|
||||
.PP
|
||||
rofi(1)
|
||||
|
||||
.SH AUTHORS
|
||||
.PP
|
||||
Qball Cow qball@gmpclient.org
|
||||
Rasmus Steinke rasi@xssn.at
|
|
@ -1,4 +1,4 @@
|
|||
# rofi-theme-selector 1 rofi-theme-selector
|
||||
# rofi-theme-selector(1)
|
||||
|
||||
## NAME
|
||||
|
||||
|
|
2449
doc/rofi-theme.5
2449
doc/rofi-theme.5
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
|||
# ROFI-THEME 5 rofi-theme
|
||||
# rofi-theme(5)
|
||||
|
||||
## NAME
|
||||
|
||||
|
@ -896,15 +896,19 @@ These are appended after the name or class of the widget.
|
|||
|
||||
#### Example
|
||||
|
||||
`button selected.normal { }`
|
||||
```
|
||||
button selected.normal { }
|
||||
|
||||
`element selected.urgent { }`
|
||||
element selected.urgent { }
|
||||
```
|
||||
|
||||
Currently only the entrybox and scrollbar have states:
|
||||
|
||||
#### Entrybox
|
||||
|
||||
`{visible modifier}.{state}`
|
||||
```
|
||||
{visible modifier}.{state}
|
||||
```
|
||||
|
||||
Where `visible modifier` can be:
|
||||
- normal: no modification
|
||||
|
@ -1551,7 +1555,9 @@ From the pango manpage:
|
|||
|
||||
The string must have the form
|
||||
|
||||
`\[FAMILY-LIST] \[STYLE-OPTIONS] \[SIZE] \[VARIATIONS]`,
|
||||
```text
|
||||
\[FAMILY-LIST] \[STYLE-OPTIONS] \[SIZE] \[VARIATIONS]
|
||||
```
|
||||
|
||||
where FAMILY-LIST is a comma-separated list of families optionally terminated
|
||||
by a comma, STYLE\_OPTIONS is a whitespace-separated list of words where each
|
||||
|
|
1823
doc/rofi.1
1823
doc/rofi.1
File diff suppressed because it is too large
Load diff
|
@ -1,4 +1,4 @@
|
|||
# ROFI 1 rofi
|
||||
# rofi(1)
|
||||
|
||||
## NAME
|
||||
|
||||
|
@ -385,7 +385,7 @@ The format string for the `drun` dialog:
|
|||
|
||||
Pango markup can be used to formatting the output.
|
||||
|
||||
Default: {name} [<span weight='light' size='small'><i>({generic})</i></span>]
|
||||
Default: `{name} [<span weight='light' size='small'><i>({generic})</i></span>]`
|
||||
|
||||
Note: Only fields enabled in `-drun-match-fields` can be used in the format
|
||||
string.
|
||||
|
@ -426,8 +426,7 @@ Default: '-'
|
|||
|
||||
### Filtered menu sort
|
||||
|
||||
`-sort` to enable
|
||||
`-no-sort` to disable
|
||||
`-[no]-sort`
|
||||
|
||||
Enable, disable sort for filtered menu.
|
||||
This setting can be changed at runtime (see `-kb-toggle-sort`).
|
||||
|
@ -498,10 +497,7 @@ Default: *1*
|
|||
|
||||
When one entry is left, automatically select it.
|
||||
|
||||
`-m` *num*
|
||||
`-m` *name*
|
||||
`-monitor` *num*
|
||||
`-monitor` *name*
|
||||
`-m` *num*, `-m` *name*, `-monitor` *num*, `-monitor` *name*
|
||||
|
||||
Select monitor to display **rofi** on. It accepts as input: *primary* (if
|
||||
primary output is set), the *xrandr* output name, or integer number (in order
|
||||
|
@ -595,8 +591,7 @@ Parse the `/etc/hosts` file for entries.
|
|||
|
||||
Default: *disabled*
|
||||
|
||||
`-parse-known-hosts`
|
||||
`-no-parse-known-hosts`
|
||||
`-[no-]parse-known-hosts`
|
||||
|
||||
Parse the `~/.ssh/known_hosts` file for entries.
|
||||
|
||||
|
@ -730,10 +725,9 @@ Note: This setting is ignored if `combi-hide-mode-prefix` is enabled.
|
|||
|
||||
### History
|
||||
|
||||
`-disable-history`
|
||||
`-no-disable-history` (re-enable history)
|
||||
`-[no-]disable-history`
|
||||
|
||||
Disable history
|
||||
Disable or re-enable history
|
||||
|
||||
`-max-history-size` *number*
|
||||
|
||||
|
@ -861,8 +855,7 @@ configuration {
|
|||
}
|
||||
```
|
||||
|
||||
`-click-to-exit`
|
||||
`-no-click-to-exit`
|
||||
`-[no-]click-to-exit`
|
||||
|
||||
Click the mouse outside the **rofi** window to exit.
|
||||
|
||||
|
|
|
@ -27,6 +27,9 @@ typedef struct {
|
|||
/** non-selectable */
|
||||
gboolean nonselectable;
|
||||
|
||||
/** permanent */
|
||||
gboolean permanent;
|
||||
|
||||
/** urgent */
|
||||
gboolean urgent;
|
||||
/** active */
|
||||
|
|
|
@ -370,6 +370,7 @@ typedef struct rofi_int_matcher_t {
|
|||
*/
|
||||
typedef struct _thread_state {
|
||||
void (*callback)(struct _thread_state *t, gpointer data);
|
||||
void (*free)(void *);
|
||||
int priority;
|
||||
} thread_state;
|
||||
|
||||
|
|
|
@ -177,8 +177,6 @@ typedef enum {
|
|||
WM_DO_NOT_CHANGE_CURRENT_DESKTOP = 1,
|
||||
/** PANGO WORKSPACE NAMES */
|
||||
WM_PANGO_WORKSPACE_NAMES = 2,
|
||||
/** Root window offset (for bspwm) */
|
||||
WM_ROOT_WINDOW_OFFSET = 4,
|
||||
} WindowManagerQuirk;
|
||||
|
||||
/**
|
||||
|
|
16
meson-dist-script
Normal file
16
meson-dist-script
Normal file
|
@ -0,0 +1,16 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -eu
|
||||
|
||||
cd "${MESON_DIST_ROOT}"
|
||||
|
||||
# deploy docs
|
||||
mkdir build
|
||||
meson setup build -Dprefix=/usr
|
||||
ninja -C build
|
||||
cp build/doc/*.1 doc
|
||||
cp build/doc/*.5 doc
|
||||
rm -rf build
|
||||
|
||||
# configure script
|
||||
autoreconf -i
|
12
meson.build
12
meson.build
|
@ -17,6 +17,8 @@ add_project_arguments(
|
|||
language: 'c'
|
||||
)
|
||||
|
||||
meson.add_dist_script('meson-dist-script')
|
||||
|
||||
flags = [
|
||||
'-Wparentheses',
|
||||
'-Winline',
|
||||
|
@ -346,16 +348,6 @@ rofi = executable('rofi', rofi_sources + [
|
|||
)
|
||||
|
||||
subdir('doc')
|
||||
install_man(
|
||||
'doc/rofi.1',
|
||||
'doc/rofi-theme-selector.1',
|
||||
'doc/rofi-sensible-terminal.1',
|
||||
'doc/rofi-script.5',
|
||||
'doc/rofi-theme.5',
|
||||
'doc/rofi-debugging.5',
|
||||
'doc/rofi-dmenu.5',
|
||||
'doc/rofi-keys.5',
|
||||
)
|
||||
|
||||
install_data(
|
||||
'themes/Adapta-Nokto.rasi',
|
||||
|
|
|
@ -141,6 +141,7 @@ static void read_add_block(DmenuModePrivateData *pd, Block **block, char *data,
|
|||
(*block)->values[(*block)->length].meta = NULL;
|
||||
(*block)->values[(*block)->length].info = NULL;
|
||||
(*block)->values[(*block)->length].nonselectable = FALSE;
|
||||
(*block)->values[(*block)->length].permanent = FALSE;
|
||||
char *end = data;
|
||||
while (end < data + len && *end != '\0') {
|
||||
end++;
|
||||
|
@ -671,6 +672,11 @@ static int dmenu_token_match(const Mode *sw, rofi_int_matcher **tokens,
|
|||
|
||||
/** Strip out the markup when matching. */
|
||||
char *esc = NULL;
|
||||
if (rmpd->cmd_list[index].permanent == TRUE) {
|
||||
// Always match
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (rmpd->do_markup) {
|
||||
pango_parse_markup(rmpd->cmd_list[index].entry, -1, 0, NULL, &esc, NULL,
|
||||
NULL);
|
||||
|
|
|
@ -478,13 +478,7 @@ static ModeMode file_browser_mode_result(Mode *sw, int mretv, char **input,
|
|||
}
|
||||
gboolean special_command =
|
||||
((mretv & MENU_CUSTOM_ACTION) == MENU_CUSTOM_ACTION);
|
||||
if (mretv & MENU_NEXT) {
|
||||
retv = NEXT_DIALOG;
|
||||
} else if (mretv & MENU_PREVIOUS) {
|
||||
retv = PREVIOUS_DIALOG;
|
||||
} else if (mretv & MENU_QUICK_SWITCH) {
|
||||
retv = (mretv & MENU_LOWER_MASK);
|
||||
} else if (mretv & MENU_CUSTOM_COMMAND) {
|
||||
if (mretv & MENU_CUSTOM_COMMAND) {
|
||||
retv = (mretv & MENU_LOWER_MASK);
|
||||
} else if ((mretv & MENU_OK)) {
|
||||
if (selected_line < pd->array_length) {
|
||||
|
@ -665,13 +659,7 @@ ModeMode file_browser_mode_completer(Mode *sw, int mretv, char **input,
|
|||
ModeMode retv = MODE_EXIT;
|
||||
FileBrowserModePrivateData *pd =
|
||||
(FileBrowserModePrivateData *)mode_get_private_data(sw);
|
||||
if (mretv & MENU_NEXT) {
|
||||
retv = NEXT_DIALOG;
|
||||
} else if (mretv & MENU_PREVIOUS) {
|
||||
retv = PREVIOUS_DIALOG;
|
||||
} else if (mretv & MENU_QUICK_SWITCH) {
|
||||
retv = (mretv & MENU_LOWER_MASK);
|
||||
} else if ((mretv & MENU_OK)) {
|
||||
if ((mretv & MENU_OK)) {
|
||||
if (selected_line < pd->array_length) {
|
||||
if (pd->array[selected_line].type == UP) {
|
||||
GFile *new = g_file_get_parent(pd->current_dir);
|
||||
|
|
|
@ -355,13 +355,7 @@ static ModeMode recursive_browser_mode_result(Mode *sw, int mretv, G_GNUC_UNUSED
|
|||
|
||||
return MODE_EXIT;
|
||||
}
|
||||
if (mretv & MENU_NEXT) {
|
||||
retv = NEXT_DIALOG;
|
||||
} else if (mretv & MENU_PREVIOUS) {
|
||||
retv = PREVIOUS_DIALOG;
|
||||
} else if (mretv & MENU_QUICK_SWITCH) {
|
||||
retv = (mretv & MENU_LOWER_MASK);
|
||||
} else if (mretv & MENU_CUSTOM_COMMAND) {
|
||||
if (mretv & MENU_CUSTOM_COMMAND) {
|
||||
retv = (mretv & MENU_LOWER_MASK);
|
||||
} else if ((mretv & MENU_OK)) {
|
||||
if (selected_line < pd->array_length) {
|
||||
|
@ -502,13 +496,7 @@ ModeMode recursive_browser_mode_completer(Mode *sw, int mretv, char **input,
|
|||
ModeMode retv = MODE_EXIT;
|
||||
FileBrowserModePrivateData *pd =
|
||||
(FileBrowserModePrivateData *)mode_get_private_data(sw);
|
||||
if (mretv & MENU_NEXT) {
|
||||
retv = NEXT_DIALOG;
|
||||
} else if (mretv & MENU_PREVIOUS) {
|
||||
retv = PREVIOUS_DIALOG;
|
||||
} else if (mretv & MENU_QUICK_SWITCH) {
|
||||
retv = (mretv & MENU_LOWER_MASK);
|
||||
} else if ((mretv & MENU_OK)) {
|
||||
if ((mretv & MENU_OK)) {
|
||||
if (selected_line < pd->array_length) {
|
||||
if (pd->array[selected_line].type == RFILE) {
|
||||
*path = g_strescape(pd->array[selected_line].path, NULL);
|
||||
|
|
|
@ -61,13 +61,15 @@
|
|||
/**
|
||||
* Name of the history file where previously chosen commands are stored.
|
||||
*/
|
||||
#define RUN_CACHE_FILE "rofi-3.runcache"
|
||||
#define RUN_CACHE_FILE "rofi-4.runcache"
|
||||
|
||||
typedef struct {
|
||||
char *entry;
|
||||
char *exec;
|
||||
uint32_t icon_fetch_uid;
|
||||
uint32_t icon_fetch_size;
|
||||
guint icon_fetch_scale;
|
||||
gboolean from_history;
|
||||
/* Surface holding the icon. */
|
||||
cairo_surface_t *icon;
|
||||
} RunEntry;
|
||||
|
@ -115,6 +117,7 @@ static gboolean exec_cmd(const char *cmd, int run_in_term, const char *orig) {
|
|||
|
||||
char *path = g_build_filename(cache_dir, RUN_CACHE_FILE, NULL);
|
||||
RofiHelperExecuteContext context = {.name = NULL};
|
||||
char *hist = g_strdup_printf("%s\x1f%s", orig, cmd);
|
||||
// FIXME: assume startup notification support for terminals
|
||||
if (helper_execute_command(NULL, lf_cmd, run_in_term,
|
||||
run_in_term ? &context : NULL)) {
|
||||
|
@ -123,12 +126,14 @@ static gboolean exec_cmd(const char *cmd, int run_in_term, const char *orig) {
|
|||
* It is allowed to be a bit slower.
|
||||
*/
|
||||
|
||||
history_set(path, orig);
|
||||
history_set(path, hist);
|
||||
g_free(path);
|
||||
g_free(lf_cmd);
|
||||
g_free(hist);
|
||||
return TRUE;
|
||||
}
|
||||
history_remove(path, orig);
|
||||
history_remove(path, hist);
|
||||
g_free(hist);
|
||||
g_free(path);
|
||||
g_free(lf_cmd);
|
||||
return FALSE;
|
||||
|
@ -142,8 +147,9 @@ static gboolean exec_cmd(const char *cmd, int run_in_term, const char *orig) {
|
|||
static void delete_entry(const RunEntry *cmd) {
|
||||
char *path = g_build_filename(cache_dir, RUN_CACHE_FILE, NULL);
|
||||
|
||||
history_remove(path, cmd->entry);
|
||||
|
||||
char *hist = g_strdup_printf("%s\x1f%s", cmd->entry, cmd->exec);
|
||||
history_remove(path, hist);
|
||||
g_free(hist);
|
||||
g_free(path);
|
||||
}
|
||||
|
||||
|
@ -207,6 +213,8 @@ static RunEntry *get_apps_external(RunEntry *retv, unsigned int *length,
|
|||
// No duplicate, add it.
|
||||
retv = g_realloc(retv, ((*length) + 2) * sizeof(RunEntry));
|
||||
retv[(*length)].entry = g_strdup(buffer);
|
||||
retv[(*length)].exec = g_shell_quote(buffer);
|
||||
retv[(*length)].from_history = FALSE;
|
||||
retv[(*length)].icon = NULL;
|
||||
retv[(*length)].icon_fetch_uid = 0;
|
||||
retv[(*length)].icon_fetch_size = 0;
|
||||
|
@ -223,6 +231,8 @@ static RunEntry *get_apps_external(RunEntry *retv, unsigned int *length,
|
|||
}
|
||||
}
|
||||
retv[(*length)].entry = NULL;
|
||||
retv[(*length)].exec = NULL;
|
||||
retv[(*length)].from_history = FALSE;
|
||||
retv[(*length)].icon = NULL;
|
||||
retv[(*length)].icon_fetch_uid = 0;
|
||||
retv[(*length)].icon_fetch_size = 0;
|
||||
|
@ -246,7 +256,14 @@ static RunEntry *get_apps(unsigned int *length) {
|
|||
char **hretv = history_get_list(path, length);
|
||||
retv = (RunEntry *)g_malloc0((*length + 1) * sizeof(RunEntry));
|
||||
for (unsigned int i = 0; i < *length; i++) {
|
||||
retv[i].entry = hretv[i];
|
||||
gchar **rs = g_strsplit(hretv[i], "\x1f", 2);
|
||||
retv[i].entry = rs[0];
|
||||
retv[i].exec = rs[1];
|
||||
if (retv[i].exec == NULL) {
|
||||
retv[i].exec = g_strdup(rs[0]);
|
||||
}
|
||||
retv[i].from_history = TRUE;
|
||||
g_free(rs);
|
||||
}
|
||||
g_free(hretv);
|
||||
g_free(path);
|
||||
|
@ -261,6 +278,7 @@ static RunEntry *get_apps(unsigned int *length) {
|
|||
g_debug("Failed to convert homedir to UTF-8: %s", error->message);
|
||||
for (unsigned int i = 0; retv[i].entry != NULL; i++) {
|
||||
g_free(retv[i].entry);
|
||||
g_free(retv[i].exec);
|
||||
}
|
||||
g_free(retv);
|
||||
g_clear_error(&error);
|
||||
|
@ -334,10 +352,14 @@ static RunEntry *get_apps(unsigned int *length) {
|
|||
|
||||
retv = g_realloc(retv, ((*length) + 2) * sizeof(RunEntry));
|
||||
retv[(*length)].entry = name;
|
||||
retv[(*length)].exec = g_shell_quote(name);
|
||||
retv[(*length)].from_history = FALSE;
|
||||
retv[(*length)].icon = NULL;
|
||||
retv[(*length)].icon_fetch_uid = 0;
|
||||
retv[(*length)].icon_fetch_size = 0;
|
||||
retv[(*length) + 1].entry = NULL;
|
||||
retv[(*length) + 1].exec = NULL;
|
||||
retv[(*length) + 1].from_history = FALSE;
|
||||
retv[(*length) + 1].icon = NULL;
|
||||
retv[(*length) + 1].icon_fetch_uid = 0;
|
||||
retv[(*length) + 1].icon_fetch_size = 0;
|
||||
|
@ -369,6 +391,8 @@ static RunEntry *get_apps(unsigned int *length) {
|
|||
if (g_strcmp0(retv[index].entry, retv[index + 1].entry) == 0) {
|
||||
g_free(retv[index].entry);
|
||||
retv[index].entry = NULL;
|
||||
g_free(retv[index].exec);
|
||||
retv[index].exec = NULL;
|
||||
removed++;
|
||||
}
|
||||
}
|
||||
|
@ -399,6 +423,7 @@ static void run_mode_destroy(Mode *sw) {
|
|||
if (rmpd != NULL) {
|
||||
for (unsigned int i = 0; i < rmpd->cmd_list_length; i++) {
|
||||
g_free(rmpd->cmd_list[i].entry);
|
||||
g_free(rmpd->cmd_list[i].exec);
|
||||
if (rmpd->cmd_list[i].icon != NULL) {
|
||||
cairo_surface_destroy(rmpd->cmd_list[i].icon);
|
||||
}
|
||||
|
@ -449,16 +474,14 @@ static ModeMode run_mode_result(Mode *sw, int mretv, char **input,
|
|||
&path);
|
||||
if (retv == MODE_EXIT) {
|
||||
if (path == NULL) {
|
||||
char *arg = g_shell_quote(rmpd->cmd_list[rmpd->selected_line].entry);
|
||||
char *arg = rmpd->cmd_list[rmpd->selected_line].exec;
|
||||
exec_cmd(arg, run_in_term, rmpd->cmd_list[rmpd->selected_line].entry);
|
||||
g_free(arg);
|
||||
} else {
|
||||
char *earg = g_shell_quote(rmpd->cmd_list[rmpd->selected_line].entry);
|
||||
char *earg = rmpd->cmd_list[rmpd->selected_line].exec;
|
||||
char *epath = g_shell_quote(path);
|
||||
char *arg = g_strdup_printf("%s %s", earg, epath);
|
||||
exec_cmd(arg, run_in_term, arg);
|
||||
g_free(arg);
|
||||
g_free(earg);
|
||||
g_free(epath);
|
||||
}
|
||||
}
|
||||
|
@ -468,11 +491,11 @@ static ModeMode run_mode_result(Mode *sw, int mretv, char **input,
|
|||
}
|
||||
|
||||
if ((mretv & MENU_OK) && rmpd->cmd_list[selected_line].entry != NULL) {
|
||||
char *earg = g_shell_quote(rmpd->cmd_list[selected_line].entry);
|
||||
char *earg = NULL;
|
||||
earg = rmpd->cmd_list[selected_line].exec;
|
||||
if (!exec_cmd(earg, run_in_term, rmpd->cmd_list[selected_line].entry)) {
|
||||
retv = RELOAD_DIALOG;
|
||||
}
|
||||
g_free(earg);
|
||||
} else if ((mretv & MENU_CUSTOM_INPUT) && *input != NULL &&
|
||||
*input[0] != '\0') {
|
||||
if (!exec_cmd(*input, run_in_term, *input)) {
|
||||
|
|
|
@ -102,6 +102,9 @@ void dmenuscript_parse_entry_extras(G_GNUC_UNUSED Mode *sw,
|
|||
} else if (strcasecmp(key, "nonselectable") == 0) {
|
||||
entry->nonselectable = g_ascii_strcasecmp(value, "true") == 0;
|
||||
g_free(value);
|
||||
} else if (strcasecmp(key, "permanent") == 0) {
|
||||
entry->permanent = g_ascii_strcasecmp(value, "true") == 0;
|
||||
g_free(value);
|
||||
} else if (strcasecmp(key, "urgent") == 0) {
|
||||
entry->urgent = g_ascii_strcasecmp(value, "true") == 0;
|
||||
g_free(value);
|
||||
|
@ -254,6 +257,7 @@ static DmenuScriptEntry *execute_executor(Mode *sw, char *arg,
|
|||
retv[(*length)].icon_fetch_size = 0;
|
||||
retv[(*length)].icon_fetch_scale = 0;
|
||||
retv[(*length)].nonselectable = FALSE;
|
||||
retv[(*length)].permanent = FALSE;
|
||||
if (buf_length > 0 && (read_length > (ssize_t)buf_length)) {
|
||||
dmenuscript_parse_entry_extras(sw, &(retv[(*length)]),
|
||||
buffer + buf_length,
|
||||
|
@ -456,6 +460,12 @@ static int script_token_match(const Mode *sw, rofi_int_matcher **tokens,
|
|||
ScriptModePrivateData *rmpd = sw->private_data;
|
||||
/** Strip out the markup when matching. */
|
||||
char *esc = NULL;
|
||||
|
||||
if (rmpd->cmd_list[index].permanent == TRUE) {
|
||||
// Always match
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (rmpd->do_markup) {
|
||||
pango_parse_markup(rmpd->cmd_list[index].entry, -1, 0, NULL, &esc, NULL,
|
||||
NULL);
|
||||
|
|
|
@ -178,7 +178,7 @@ static winlist *winlist_new(void) {
|
|||
*
|
||||
* Add one entry. If Full, extend with WINLIST entries.
|
||||
*
|
||||
* @returns 0 if failed, 1 is successful.
|
||||
* @returns -1 if failed, 0 or higher is successful.
|
||||
*/
|
||||
static int winlist_append(winlist *l, xcb_window_t w, client *d) {
|
||||
if (l->len > 0 && !(l->len % WINLIST)) {
|
||||
|
@ -189,7 +189,7 @@ static int winlist_append(winlist *l, xcb_window_t w, client *d) {
|
|||
// Make clang-check happy.
|
||||
// TODO: make clang-check clear this should never be 0.
|
||||
if (l->data == NULL || l->array == NULL) {
|
||||
return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
l->data[l->len] = d;
|
||||
|
@ -388,7 +388,13 @@ static client *window_client(WindowModePrivateData *pd, xcb_window_t win) {
|
|||
c->hint_flags = r.flags;
|
||||
}
|
||||
|
||||
winlist_append(cache_client, c->window, c);
|
||||
idx = winlist_append(cache_client, c->window, c);
|
||||
// Should never happen.
|
||||
if (idx < 0) {
|
||||
client_free(c);
|
||||
g_free(c);
|
||||
c = NULL;
|
||||
}
|
||||
g_free(attr);
|
||||
return c;
|
||||
}
|
||||
|
|
|
@ -86,11 +86,17 @@ typedef struct {
|
|||
IconFetcherNameEntry *entry;
|
||||
} IconFetcherEntry;
|
||||
|
||||
// Free method.
|
||||
static void rofi_icon_fetch_entry_free(gpointer data);
|
||||
/**
|
||||
* The icon fetcher internal state.
|
||||
*/
|
||||
IconFetcher *rofi_icon_fetcher_data = NULL;
|
||||
|
||||
static void rofi_icon_fetch_thread_pool_entry_remove(gpointer data) {
|
||||
IconFetcherEntry *entry = (IconFetcherEntry *)data;
|
||||
// Mark it in a way it should be re-fetched on next query?
|
||||
}
|
||||
static void rofi_icon_fetch_entry_free(gpointer data) {
|
||||
IconFetcherNameEntry *entry = (IconFetcherNameEntry *)data;
|
||||
|
||||
|
@ -348,6 +354,7 @@ static void rofi_icon_fetcher_worker(thread_state *sdata,
|
|||
}
|
||||
cairo_surface_t *icon_surf = NULL;
|
||||
|
||||
#if 0 // unsure why added in past?
|
||||
const char *suf = strrchr(icon_path, '.');
|
||||
if (suf == NULL) {
|
||||
sentry->query_done = TRUE;
|
||||
|
@ -355,6 +362,7 @@ static void rofi_icon_fetcher_worker(thread_state *sdata,
|
|||
rofi_view_reload();
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
int width = sentry->wsize, height = sentry->hsize;
|
||||
if (width > 0)
|
||||
|
@ -365,6 +373,17 @@ static void rofi_icon_fetcher_worker(thread_state *sdata,
|
|||
GError *error = NULL;
|
||||
GdkPixbuf *pb =
|
||||
gdk_pixbuf_new_from_file_at_scale(icon_path, width, height, TRUE, &error);
|
||||
|
||||
/*
|
||||
* The GIF codec throws GDK_PIXBUF_ERROR_INCOMPLETE_ANIMATION if it's closed
|
||||
* without decoding all the frames. Since gdk_pixbuf_new_from_file_at_scale
|
||||
* only decodes the first frame, this specific error needs to be ignored.
|
||||
*/
|
||||
if (error != NULL && g_error_matches(error, GDK_PIXBUF_ERROR,
|
||||
GDK_PIXBUF_ERROR_INCOMPLETE_ANIMATION)) {
|
||||
g_clear_error(&error);
|
||||
}
|
||||
|
||||
if (error != NULL) {
|
||||
g_warning("Failed to load image: |%s| %d %d %s (%p)", icon_path,
|
||||
sentry->wsize, sentry->hsize, error->message, (void *)pb);
|
||||
|
@ -420,6 +439,7 @@ uint32_t rofi_icon_fetcher_query_advanced(const char *name, const int wsize,
|
|||
|
||||
// Push into fetching queue.
|
||||
sentry->state.callback = rofi_icon_fetcher_worker;
|
||||
sentry->state.free = rofi_icon_fetch_thread_pool_entry_remove;
|
||||
sentry->state.priority = G_PRIORITY_LOW;
|
||||
g_thread_pool_push(tpool, sentry, NULL);
|
||||
|
||||
|
|
|
@ -768,6 +768,7 @@ static gboolean rofi_view_refilter_real(RofiViewState *state) {
|
|||
states[i].plen = plen;
|
||||
states[i].pattern = pattern;
|
||||
states[i].st.callback = filter_elements;
|
||||
states[i].st.free = NULL;
|
||||
states[i].st.priority = G_PRIORITY_HIGH;
|
||||
if (i > 0) {
|
||||
g_thread_pool_push(tpool, &states[i], NULL);
|
||||
|
@ -1834,6 +1835,24 @@ static int rofi_thread_workers_sort(gconstpointer a, gconstpointer b,
|
|||
return tsa->priority - tsb->priority;
|
||||
}
|
||||
|
||||
static void rofi_thread_pool_state_free(gpointer data) {
|
||||
if (data) {
|
||||
// This is a weirdness from glib that should not happen.
|
||||
// It pushes in a 1 to msg sleeping threads to wake up.
|
||||
// This should be removed from queue to avoid hitting this method.
|
||||
// In practice, we still hit it (and crash)
|
||||
if (GPOINTER_TO_UINT(data) == 1) {
|
||||
// Ignore this entry.
|
||||
g_debug("Glib thread-pool bug, received pointer with value 1.");
|
||||
return;
|
||||
}
|
||||
thread_state *ts = (thread_state *)data;
|
||||
if (ts->free) {
|
||||
ts->free(data);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void rofi_view_workers_initialize(void) {
|
||||
TICK_N("Setup Threadpool, start");
|
||||
if (config.threads == 0) {
|
||||
|
@ -1845,8 +1864,9 @@ void rofi_view_workers_initialize(void) {
|
|||
}
|
||||
// Create thread pool
|
||||
GError *error = NULL;
|
||||
tpool = g_thread_pool_new(rofi_view_call_thread, NULL, config.threads, FALSE,
|
||||
&error);
|
||||
tpool = g_thread_pool_new_full(rofi_view_call_thread, NULL,
|
||||
rofi_thread_pool_state_free, config.threads,
|
||||
FALSE, &error);
|
||||
if (error == NULL) {
|
||||
// Idle threads should stick around for a max of 60 seconds.
|
||||
g_thread_pool_set_max_idle_time(60000);
|
||||
|
|
|
@ -881,37 +881,38 @@ static int monitor_active_from_id_focused(int mon_id, workarea *mon) {
|
|||
free(tree_reply);
|
||||
return retv;
|
||||
}
|
||||
if (tree_reply->parent != r->root) {
|
||||
xcb_translate_coordinates_cookie_t ct = xcb_translate_coordinates(
|
||||
xcb->connection, tree_reply->parent, r->root, r->x, r->y);
|
||||
xcb_translate_coordinates_reply_t *t =
|
||||
xcb_translate_coordinates_reply(xcb->connection, ct, NULL);
|
||||
if (t) {
|
||||
if (mon_id == -2) {
|
||||
// place the menu above the window
|
||||
// if some window is focused, place menu above window, else fall
|
||||
// back to selected monitor.
|
||||
mon->x = t->dst_x - r->x;
|
||||
mon->y = t->dst_y - r->y;
|
||||
mon->w = r->width;
|
||||
mon->h = r->height;
|
||||
retv = TRUE;
|
||||
if ((current_window_manager & WM_ROOT_WINDOW_OFFSET) ==
|
||||
WM_ROOT_WINDOW_OFFSET) {
|
||||
mon->x += r->x;
|
||||
mon->y += r->y;
|
||||
}
|
||||
g_debug("mon pos: %d %d %d-%d", mon->x, mon->y, mon->w, mon->h);
|
||||
} else if (mon_id == -4) {
|
||||
g_debug("Find monitor at location: %d %d", t->dst_x, t->dst_y);
|
||||
monitor_dimensions(t->dst_x, t->dst_y, mon);
|
||||
g_debug("Monitor found pos: %d %d %d-%d", mon->x, mon->y, mon->w, mon->h);
|
||||
retv = TRUE;
|
||||
}
|
||||
r->x = t->dst_x;
|
||||
r->y = t->dst_y;
|
||||
free(t);
|
||||
} else {
|
||||
g_debug("Failed to get translate position of active window, falling back "
|
||||
"to mouse location (-5).");
|
||||
free(r);
|
||||
free(tree_reply);
|
||||
return retv;
|
||||
}
|
||||
}
|
||||
if (mon_id == -2) {
|
||||
// place the menu above the window
|
||||
// if some window is focused, place menu above window, else fall
|
||||
// back to selected monitor.
|
||||
mon->x = r->x + r->border_width;
|
||||
mon->y = r->y + r->border_width;
|
||||
mon->w = r->width;
|
||||
mon->h = r->height;
|
||||
retv = TRUE;
|
||||
} else if (mon_id == -4) {
|
||||
g_debug("Find monitor at location: %d %d", r->x, r->y);
|
||||
monitor_dimensions(r->x, r->y, mon);
|
||||
retv = TRUE;
|
||||
}
|
||||
g_debug("mon pos: %d %d %d-%d", mon->x, mon->y, mon->w, mon->h);
|
||||
free(r);
|
||||
free(tree_reply);
|
||||
return retv;
|
||||
|
@ -1641,8 +1642,6 @@ static void x11_helper_discover_window_manager(void) {
|
|||
if (g_strcmp0(str, "i3") == 0) {
|
||||
current_window_manager =
|
||||
WM_DO_NOT_CHANGE_CURRENT_DESKTOP | WM_PANGO_WORKSPACE_NAMES;
|
||||
} else if (g_strcmp0(str, "bspwm") == 0) {
|
||||
current_window_manager = WM_ROOT_WINDOW_OFFSET;
|
||||
}
|
||||
g_free(str);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue