1
0
Fork 0
mirror of https://github.com/davatorium/rofi.git synced 2024-11-18 13:54:36 -05:00

Change modi -> modes

issues: #1599
This commit is contained in:
Dave Davenport 2022-02-23 22:42:56 +01:00
parent 5757bbc7d1
commit 4e06bff706
25 changed files with 651 additions and 651 deletions

View file

@ -48,7 +48,7 @@ If a value is the default value, the entry will be commented.
For example: For example:
```css ```css
configuration { configuration {
/* modi: "window,run,ssh,drun";*/ /* modes: "window,run,ssh,drun";*/
/* font: "mono 12";*/ /* font: "mono 12";*/
/* location: 0;*/ /* location: 0;*/
/* yoffset: 0;*/ /* yoffset: 0;*/
@ -163,12 +163,12 @@ A list starts with a '[' and ends with a ']'. The entries in the list are comma-
The entry in the list single ASCII words. The entry in the list single ASCII words.
```css ```css
combi-modi: [window,drun]; combi-modes: [window,drun];
``` ```
For older versions you have : For older versions you have :
```css ```css
combi-modi: "window,drun"; combi-modes: "window,drun";
``` ```
# Get a list of all possible options # Get a list of all possible options

View file

@ -39,7 +39,7 @@ Rofi is not:
# Table of Contents # Table of Contents
- [Features](#features) - [Features](#features)
- [Modi](#modi) - [Modes](#modes)
- [Manpages](#manpage) - [Manpages](#manpage)
- [Installation](#installation) - [Installation](#installation)
- [Quickstart](#quickstart) - [Quickstart](#quickstart)
@ -78,12 +78,12 @@ Its main features are:
* Easily extensible using scripts and plugins * Easily extensible using scripts and plugins
* Advanced Theming * Advanced Theming
# Modi # Modes
**Rofi** has several built-in modi implementing common use cases and can be extended by scripts (either called from **Rofi** has several built-in modes implementing common use cases and can be extended by scripts (either called from
**Rofi** or calling **Rofi**) or plugins. **Rofi** or calling **Rofi**) or plugins.
Below is a list of the different modi: Below is a list of the different modes:
* **run**: launch applications from $PATH, with option to launch in terminal. * **run**: launch applications from $PATH, with option to launch in terminal.
* **drun**: launch applications based on desktop files. It tries to be compliant to the XDG standard. * **drun**: launch applications based on desktop files. It tries to be compliant to the XDG standard.
@ -92,7 +92,7 @@ Below is a list of the different modi:
* **file-browser**: A basic file-browser for opening files. * **file-browser**: A basic file-browser for opening files.
* **keys**: list internal keybindings. * **keys**: list internal keybindings.
* **script**: Write (limited) custom mode using simple scripts. * **script**: Write (limited) custom mode using simple scripts.
* **combi**: Combine multiple modi into one. * **combi**: Combine multiple modes into one.
**Rofi** is known to work on Linux and BSD. **Rofi** is known to work on Linux and BSD.
@ -135,14 +135,14 @@ Enabled modes can be changed at runtime. Default key is `Ctrl+Tab`.
If no modes are specified, all configured modes will be enabled. If no modes are specified, all configured modes will be enabled.
To only show the `run` and `ssh` launcher: To only show the `run` and `ssh` launcher:
rofi -modi "run,ssh" -show run rofi -modes "run,ssh" -show run
The modi to combine in combi mode. The modes to combine in combi mode.
For syntax to `-combi-modi`, see `-modi`. For syntax to `-combi-modes `, see `-modes`.
To get one merge view, of `window`,`run`, and `ssh`: To get one merge view, of `window`,`run`, and `ssh`:
rofi -show combi -combi-modi "window,run,ssh" -modi combi rofi -show combi -combi-modes "window,run,ssh" -modes combi
## Configuration ## Configuration

View file

@ -33,12 +33,12 @@
#include <stdlib.h> #include <stdlib.h>
Settings config = { Settings config = {
/** List of enabled modi. */ /** List of enabled modes. */
/** -modi */ /** -modes */
#ifdef WINDOW_MODE #ifdef WINDOW_MODE
.modi = "window,run,ssh", .modes = "window,run,ssh",
#else #else
.modi = "run,ssh", .modes = "run,ssh",
#endif #endif
/** Font */ /** Font */
.menu_font = "mono 12", .menu_font = "mono 12",
@ -93,7 +93,7 @@ Settings config = {
.cycle = TRUE, .cycle = TRUE,
/** Height of an element in #chars */ /** Height of an element in #chars */
.element_height = 1, .element_height = 1,
/** Sidebar mode, show the modi */ /** Sidebar mode, show the modes */
.sidebar_mode = FALSE, .sidebar_mode = FALSE,
/** auto select */ /** auto select */
.auto_select = FALSE, .auto_select = FALSE,
@ -101,8 +101,8 @@ Settings config = {
.parse_hosts = FALSE, .parse_hosts = FALSE,
/** Parse ~/.ssh/known_hosts file in ssh view. */ /** Parse ~/.ssh/known_hosts file in ssh view. */
.parse_known_hosts = TRUE, .parse_known_hosts = TRUE,
/** Modi to combine into one view. */ /** Modes to combine into one view. */
.combi_modi = "window,run", .combi_modes = "window,run",
.tokenize = TRUE, .tokenize = TRUE,
.matching = "normal", .matching = "normal",
.matching_method = MM_NORMAL, .matching_method = MM_NORMAL,

View file

@ -8,7 +8,7 @@ configuration {
action: "kb-cancel"; action: "kb-cancel";
} }
// File browser modi. // File browser mode.
filebrowser { filebrowser {
sorting-method: "name"; sorting-method: "name";
directories-first: true; directories-first: true;

View file

@ -196,14 +196,14 @@ Accept entry
.SS \fBkb\-accept\-custom\fP .SS \fBkb\-accept\-custom\fP
.PP .PP
Use entered text as command (in ssh/run modi) Use entered text as command (in ssh/run modes)
.PP .PP
\fBDefault\fP: Control+Return \fBDefault\fP: Control+Return
.SS \fBkb\-accept\-custom\-alt\fP .SS \fBkb\-accept\-custom\-alt\fP
.PP .PP
Use entered text as command (in ssh/run modi) Use entered text as command (in ssh/run modes)
.PP .PP
\fBDefault\fP: Control+Shift+Return \fBDefault\fP: Control+Shift+Return

View file

@ -136,12 +136,12 @@ 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 modi) 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 modi) Use entered text as command (in ssh/run modes)
**Default**: Control+Shift+Return **Default**: Control+Shift+Return

View file

@ -2,7 +2,7 @@
.TH ROFI\-SCRIPT 5 rofi\-script .TH ROFI\-SCRIPT 5 rofi\-script
.SH NAME .SH NAME
.PP .PP
\fBrofi script mode\fP \- Rofi format for scriptable modi. \fBrofi script mode\fP \- Rofi format for scriptable mode.
.SH DESCRIPTION .SH DESCRIPTION
.PP .PP
@ -20,7 +20,7 @@ For example:
.RS .RS
.nf .nf
rofi \-show fb \-modi "fb:file\_browser.sh" rofi \-show fb \-modes "fb:file\_browser.sh"
.fi .fi
.RE .RE

View file

@ -2,7 +2,7 @@
## NAME ## NAME
**rofi script mode** - Rofi format for scriptable modi. **rofi script mode** - Rofi format for scriptable mode.
## DESCRIPTION ## DESCRIPTION
@ -18,7 +18,7 @@ To specify a script mode, set a mode with the following syntax: "{name}:{executa
For example: For example:
``` ```
rofi -show fb -modi "fb:file_browser.sh" rofi -show fb -modes "fb:file_browser.sh"
``` ```
The name should be unique. The name should be unique.

View file

@ -18,7 +18,7 @@ filter, tokenized search and more.
.PP .PP
\fBrofi\fP\&'s main functionality is to assist in your workflow, allowing you to quickly switch \fBrofi\fP\&'s main functionality is to assist in your workflow, allowing you to quickly switch
between windows, start applications or log into a remote machine via \fB\fCssh\fR\&. between windows, start applications or log into a remote machine via \fB\fCssh\fR\&.
There are different \fImodi\fP for different types of actions. There are different \fImodes\fP for different types of actions.
\fBrofi\fP is a standalone application and should not be integrated into scripts. \fBrofi\fP is a standalone application and should not be integrated into scripts.
For integration into scripts it has a special mode that functions as a For integration into scripts it has a special mode that functions as a
(drop\-in) replacement for \fBdmenu(1)\fP\&. See emulating dmenu below. (drop\-in) replacement for \fBdmenu(1)\fP\&. See emulating dmenu below.
@ -238,10 +238,10 @@ rofi \-show run
.RE .RE
.PP .PP
If \fB\fC\-show\fR is the last option passed to rofi, the first enabled modi is shown. If \fB\fC\-show\fR is the last option passed to rofi, the first enabled modes is shown.
.PP .PP
\fB\fC\-modi\fR \fImode1,mode2\fP \fB\fC\-modes\fR \fImode1,mode2\fP
.PP .PP
Specify an ordered, comma\-separated list of modes to enable. Specify an ordered, comma\-separated list of modes to enable.
@ -253,7 +253,7 @@ To only show the \fB\fCrun\fR and \fB\fCssh\fR launcher:
.RS .RS
.nf .nf
rofi \-modi "run,ssh" \-show run rofi \-modes "run,ssh" \-show run
.fi .fi
.RE .RE
@ -277,7 +277,7 @@ Example: Have a mode called 'Workspaces' using the \fB\fCi3\_switch\_workspaces.
.RS .RS
.nf .nf
rofi \-modi "window,run,ssh,Workspaces:i3\_switch\_workspaces.sh" \-show Workspaces rofi \-modes "window,run,ssh,Workspaces:i3\_switch\_workspaces.sh" \-show Workspaces
.fi .fi
.RE .RE
@ -293,7 +293,7 @@ For that case, \fB\fC#\fR can be used as a separator.
.RS .RS
.nf .nf
rofi \-modi "My File Browser:fb.sh" \-show "My File Browser" rofi \-modes "My File Browser:fb.sh" \-show "My File Browser"
.fi .fi
.RE .RE
@ -595,7 +595,7 @@ Keep a fixed number of visible lines.
.PP .PP
Open in sidebar\-mode. In this mode, a list of all enabled modes is shown at the bottom. Open in sidebar\-mode. In this mode, a list of all enabled modes is shown at the bottom.
(See \fB\fC\-modi\fR option) (See \fB\fC\-modes\fR option)
To show sidebar, use: To show sidebar, use:
.PP .PP
@ -888,18 +888,18 @@ configuration {
.SS Combi settings .SS Combi settings
.PP .PP
\fB\fC\-combi\-modi\fR \fImode1\fP,\fImode2\fP \fB\fC\-combi\-modes\fR \fImode1\fP,\fImode2\fP
.PP .PP
The modi to combine in combi mode. The modes to combine in combi mode.
For syntax to \fB\fC\-combi\-modi\fR, see \fB\fC\-modi\fR\&. For syntax to \fB\fC\-combi\-modes\fR, see \fB\fC\-modes\fR\&.
To get one merge view, of \fB\fCwindow\fR,\fB\fCrun\fR, and \fB\fCssh\fR: To get one merge view, of \fB\fCwindow\fR,\fB\fCrun\fR, and \fB\fCssh\fR:
.PP .PP
.RS .RS
.nf .nf
rofi \-show combi \-combi\-modi "window,run,ssh" \-modi combi rofi \-show combi \-combi\-modes "window,run,ssh" \-modes combi
.fi .fi
.RE .RE
@ -1139,7 +1139,7 @@ configuration {
.fi .fi
.RE .RE
.SH Available Modi .SH Available Modes
.SS window .SS window
.PP .PP
Show a list of all the windows and allow switching between them. Show a list of all the windows and allow switching between them.
@ -1220,21 +1220,21 @@ Shows a searchable list of key bindings.
.SS script .SS script
.PP .PP
Allows custom scripted Modi to be added, see the \fBrofi\-script(5)\fP manpage for more information. Allows custom scripted Modes to be added, see the \fBrofi\-script(5)\fP manpage for more information.
.SS combi .SS combi
.PP .PP
Combines multiple modi in one list. Specify which modi are included with the \fB\fC\-combi\-modi\fR option. Combines multiple modes in one list. Specify which modes are included with the \fB\fC\-combi\-modes\fR option.
.PP .PP
When using the combi mode, a \fI!bang\fP can be used to filter the results by modi. When using the combi mode, a \fI!bang\fP can be used to filter the results by modes.
All modi that match the bang as a prefix are included. All modes that match the bang as a prefix are included.
For example, say you have specified \fB\fC\-combi\-modi run,window,windowcd\fR\&. If your For example, say you have specified \fB\fC\-combi\-modes run,window,windowcd\fR\&. If your
query begins with the bang \fB\fC!w\fR, only results from the \fB\fCwindow\fR and \fB\fCwindowcd\fR query begins with the bang \fB\fC!w\fR, only results from the \fB\fCwindow\fR and \fB\fCwindowcd\fR
modi are shown, even if the rest of the input text would match results from \fB\fCrun\fR\&. modes are shown, even if the rest of the input text would match results from \fB\fCrun\fR\&.
.PP .PP
If no match, the input is handled by the first combined modi. If no match, the input is handled by the first combined modes.
.SH FAQ .SH FAQ
.SS The text in the window switcher is not nicely aligned. .SS The text in the window switcher is not nicely aligned.
@ -1287,7 +1287,7 @@ Show the run dialog:
.RS .RS
.nf .nf
rofi \-modi run \-show run rofi \-modes run \-show run
.fi .fi
.RE .RE
@ -1299,7 +1299,7 @@ Show the run dialog, and allow switching to Desktop File run dialog (\fB\fCdrun\
.RS .RS
.nf .nf
rofi \-modi run,drun \-show run rofi \-modes run,drun \-show run
.fi .fi
.RE .RE
@ -1311,7 +1311,7 @@ Combine the run and Desktop File run dialog (\fB\fCdrun\fR):
.RS .RS
.nf .nf
rofi \-modi combi \-show combi \-combi\-modi run,drun rofi \-modes combi \-show combi \-combi\-modes run,drun
.fi .fi
.RE .RE
@ -1323,7 +1323,7 @@ Combine the run and Desktop File run dialog (\fB\fCdrun\fR), and allow switching
.RS .RS
.nf .nf
rofi \-modi combi,window \-show combi \-combi\-modi run,drun rofi \-modes combi,window \-show combi \-combi\-modes run,drun
.fi .fi
.RE .RE

View file

@ -20,7 +20,7 @@ filter, tokenized search and more.
**rofi**'s main functionality is to assist in your workflow, allowing you to quickly switch **rofi**'s main functionality is to assist in your workflow, allowing you to quickly switch
between windows, start applications or log into a remote machine via `ssh`. between windows, start applications or log into a remote machine via `ssh`.
There are different *modi* for different types of actions. There are different *modes* for different types of actions.
**rofi** is a standalone application and should not be integrated into scripts. **rofi** is a standalone application and should not be integrated into scripts.
For integration into scripts it has a special mode that functions as a For integration into scripts it has a special mode that functions as a
(drop-in) replacement for **dmenu(1)**. See emulating dmenu below. (drop-in) replacement for **dmenu(1)**. See emulating dmenu below.
@ -143,16 +143,16 @@ To show the run-dialog:
rofi -show run rofi -show run
If `-show` is the last option passed to rofi, the first enabled modi is shown. If `-show` is the last option passed to rofi, the first enabled modes is shown.
`-modi` *mode1,mode2* `-modes` *mode1,mode2*
Specify an ordered, comma-separated list of modes to enable. Specify an ordered, comma-separated list of modes to enable.
Enabled modes can be changed at runtime. Default key is `Ctrl+Tab`. Enabled modes can be changed at runtime. Default key is `Ctrl+Tab`.
If no modes are specified, all configured modes will be enabled. If no modes are specified, all configured modes will be enabled.
To only show the `run` and `ssh` launcher: To only show the `run` and `ssh` launcher:
rofi -modi "run,ssh" -show run rofi -modes "run,ssh" -show run
Custom modes can be added using the internal `script` mode. Each such mode has two parameters: Custom modes can be added using the internal `script` mode. Each such mode has two parameters:
@ -160,14 +160,14 @@ Custom modes can be added using the internal `script` mode. Each such mode has t
Example: Have a mode called 'Workspaces' using the `i3_switch_workspaces.sh` script: Example: Have a mode called 'Workspaces' using the `i3_switch_workspaces.sh` script:
rofi -modi "window,run,ssh,Workspaces:i3_switch_workspaces.sh" -show Workspaces rofi -modes "window,run,ssh,Workspaces:i3_switch_workspaces.sh" -show Workspaces
Notes: The i3 window manager dislikes commas in the command when specifying an exec command. Notes: The i3 window manager dislikes commas in the command when specifying an exec command.
For that case, `#` can be used as a separator. For that case, `#` can be used as a separator.
**TIP**: The name is allowed to contain spaces: **TIP**: The name is allowed to contain spaces:
rofi -modi "My File Browser:fb.sh" -show "My File Browser" rofi -modes "My File Browser:fb.sh" -show "My File Browser"
`-case-sensitive` `-case-sensitive`
@ -349,7 +349,7 @@ Keep a fixed number of visible lines.
`-sidebar-mode` `-sidebar-mode`
Open in sidebar-mode. In this mode, a list of all enabled modes is shown at the bottom. Open in sidebar-mode. In this mode, a list of all enabled modes is shown at the bottom.
(See `-modi` option) (See `-modes` option)
To show sidebar, use: To show sidebar, use:
rofi -show run -sidebar-mode rofi -show run -sidebar-mode
@ -535,13 +535,13 @@ configuration {
### Combi settings ### Combi settings
`-combi-modi` *mode1*,*mode2* `-combi-modes ` *mode1*,*mode2*
The modi to combine in combi mode. The modes to combine in combi mode.
For syntax to `-combi-modi`, see `-modi`. For syntax to `-combi-modes`, see `-modes`.
To get one merge view, of `window`,`run`, and `ssh`: To get one merge view, of `window`,`run`, and `ssh`:
rofi -show combi -combi-modi "window,run,ssh" -modi combi rofi -show combi -combi-modes "window,run,ssh" -modes combi
**NOTE**: The i3 window manager dislikes commas in the command when specifying an exec command. **NOTE**: The i3 window manager dislikes commas in the command when specifying an exec command.
For that case, `#` can be used as a separator. For that case, `#` can be used as a separator.
@ -708,7 +708,7 @@ configuration {
} }
``` ```
## Available Modi ## Available Modes
### window ### window
@ -781,19 +781,19 @@ Shows a searchable list of key bindings.
### script ### script
Allows custom scripted Modi to be added, see the **rofi-script(5)** manpage for more information. Allows custom scripted Modes to be added, see the **rofi-script(5)** manpage for more information.
### combi ### combi
Combines multiple modi in one list. Specify which modi are included with the `-combi-modi` option. Combines multiple modes in one list. Specify which modes are included with the `-combi-modes` option.
When using the combi mode, a *!bang* can be used to filter the results by modi. When using the combi mode, a *!bang* can be used to filter the results by modes.
All modi that match the bang as a prefix are included. All modes that match the bang as a prefix are included.
For example, say you have specified `-combi-modi run,window,windowcd`. If your For example, say you have specified `-combi-modes run,window,windowcd`. If your
query begins with the bang `!w`, only results from the `window` and `windowcd` query begins with the bang `!w`, only results from the `window` and `windowcd`
modi are shown, even if the rest of the input text would match results from `run`. modes are shown, even if the rest of the input text would match results from `run`.
If no match, the input is handled by the first combined modi. If no match, the input is handled by the first combined modes.
## FAQ ## FAQ
@ -829,19 +829,19 @@ Some basic usage examples of **rofi**:
Show the run dialog: Show the run dialog:
rofi -modi run -show run rofi -modes run -show run
Show the run dialog, and allow switching to Desktop File run dialog (`drun`): Show the run dialog, and allow switching to Desktop File run dialog (`drun`):
rofi -modi run,drun -show run rofi -modes run,drun -show run
Combine the run and Desktop File run dialog (`drun`): Combine the run and Desktop File run dialog (`drun`):
rofi -modi combi -show combi -combi-modi run,drun rofi -modes combi -show combi -combi-modes run,drun
Combine the run and Desktop File run dialog (`drun`), and allow switching to window switcher: Combine the run and Desktop File run dialog (`drun`), and allow switching to window switcher:
rofi -modi combi,window -show combi -combi-modi run,drun rofi -modes combi,window -show combi -combi-modes run,drun
Pop up a text message claiming that this is the end: Pop up a text message claiming that this is the end:

View file

@ -1,276 +0,0 @@
! "Enabled modi" Set from: File
rofi.modi: combi,drun
! "Window width" Set from: File
rofi.width: 50
! "Number of lines" Set from: File
rofi.lines: 8
! "Number of columns" Set from: File
rofi.columns: 1
! "Font to use" Set from: File
rofi.font: Source Code Pro Medium 10
! "Border width" Set from: Default
! rofi.bw: 1
! "Location on screen" Set from: File
rofi.location: 2
! "Padding" Set from: Default
! rofi.padding: 5
! "Y-offset relative to location" Set from: File
rofi.yoffset: -2
! "X-offset relative to location" Set from: File
rofi.xoffset: 0
! "Always show number of lines" Set from: File
rofi.fixed-num-lines: true
! "Whether to load and show icons" Set from: Default
! rofi.show-icons: false
! "Terminal to use" Set from: File
rofi.terminal: sakura
! "Ssh client to use" Set from: File
rofi.ssh-client: ssh
! "Ssh command to execute" Set from: File
rofi.ssh-command: {terminal} -e {ssh-client} {host}
! "Run command to execute" Set from: File
rofi.run-command: bash -c "{cmd}"
! "Command to get extra run targets" Set from: Default
! rofi.run-list-command:
! "Run command to execute that runs in shell" Set from: File
rofi.run-shell-command: {terminal} -e {cmd}
! "Command executed on accep-entry-custom for window modus" Set from: File
rofi.window-command: xkill -id {window}
! "Window fields to match in window mode" Set from: Default
! rofi.window-match-fields: all
! "Theme to use to look for icons" Set from: Default
! rofi.icon-theme:
! "Desktop entry fields to match in drun" Set from: Default
! rofi.drun-match-fields: name,generic,exec,categories,keywords
! "Only show Desktop entry from these categories" Set from: Default
! rofi.drun-categories:
! "Desktop entry show actions." Set from: Default
! rofi.drun-show-actions: false
! "DRUN format string. (Supports: generic,name,comment,exec,categories)" Set from: Default
! rofi.drun-display-format: {name} [<span weight='light' size='small'><i>({generic})</i></span>]
! "Disable history in run/ssh" Set from: File
rofi.disable-history: false
! "Programs ignored for history" Set from: Default
! rofi.ignored-prefixes:
! "Use sorting" Set from: Default
! rofi.sort: false
! "Choose the strategy used for sorting: normal (levenshtein) or fzf." Set from: Default
! rofi.sorting-method:
! "Set case-sensitivity" Set from: File
rofi.case-sensitive: false
! "Cycle through the results list" Set from: File
rofi.cycle: true
! "Enable sidebar-mode" Set from: File
rofi.sidebar-mode: false
! "Row height (in chars)" Set from: File
rofi.eh: 1
! "Enable auto select mode" Set from: File
rofi.auto-select: false
! "Parse hosts file for ssh mode" Set from: File
rofi.parse-hosts: false
! "Parse known_hosts file for ssh mode" Set from: File
rofi.parse-known-hosts: true
! "Set the modi to combine in combi mode" Set from: File
rofi.combi-modi: window,drun,run,ssh
! "Set the matching algorithm. (normal, regex, glob, fuzzy, prefix)" Set from: Default
! rofi.matching: normal
! "Tokenize input string" Set from: File
rofi.tokenize: true
! "Monitor id to show on" Set from: File
rofi.m: -1
! "Margin between rows *DEPRECATED*" Set from: Default
! rofi.line-margin: 2
! "Padding within rows *DEPRECATED*" Set from: Default
! rofi.line-padding: 1
! "Pre-set filter" Set from: Default
! rofi.filter:
! "Separator style (none, dash, solid) *DEPRECATED*" Set from: Default
! rofi.separator-style: dash
! "Hide scroll-bar *DEPRECATED*" Set from: Default
! rofi.hide-scrollbar: false
! "Fullscreen" Set from: File
rofi.fullscreen: false
! "Fake transparency *DEPRECATED*" Set from: Default
! rofi.fake-transparency: false
! "DPI" Set from: File
rofi.dpi: 101
! "Threads to use for string matching" Set from: File
rofi.threads: 8
! "Scrollbar width *DEPRECATED*" Set from: Default
! rofi.scrollbar-width: 8
! "Scrolling method. (0: Page, 1: Centered)" Set from: File
rofi.scroll-method: 0
! "Background to use for fake transparency. (background or screenshot) *DEPRECATED*" Set from: Default
! rofi.fake-background: screenshot
! "Window Format. w (desktop name), t (title), n (name), r (role), c (class)" Set from: Default
! rofi.window-format: {w} {c} {t}
! "Click outside the window to exit" Set from: Default
! rofi.click-to-exit: true
! "New style theme file" Set from: Default
! rofi.theme:
! "Color scheme for normal row" Set from: Default
! rofi.color-normal:
! "Color scheme for urgent row" Set from: Default
! rofi.color-urgent:
! "Color scheme for active row" Set from: Default
! rofi.color-active:
! "Color scheme window" Set from: Default
! rofi.color-window:
! "Max history size (WARNING: can cause slowdowns when set too high)." Set from: Default
! rofi.max-history-size: 25
! "Hide the prefix mode prefix on the combi view." Set from: Default
! rofi.combi-hide-mode-prefix: false
! "Combi format string. (Supports: mode, text)" Set from: Default
! rofi.combi-display-format: {mode} {text}
! "Set the character used to negate the matching. ('\0' to disable)" Set from: Default
! rofi.matching-negate-char: -
! "Directory where history and temporary files are stored." Set from: Default
! rofi.cache-dir:
! "Show window thumbnail in window switcher if availalbe." Set from: Default
! rofi.window-thumbnail: false
! "Pidfile location" Set from: File
rofi.pid: /tmp/rofi.pid
! "Paste primary selection" Set from: File
rofi.kb-primary-paste: Control+Shift+v,Shift+Insert
! "Paste clipboard" Set from: File
rofi.kb-secondary-paste: Control+v,Insert
! "Clear input line" Set from: File
rofi.kb-clear-line: Control+w
! "Beginning of line" Set from: File
rofi.kb-move-front: Control+a
! "End of line" Set from: File
rofi.kb-move-end: Control+e
! "Move back one word" Set from: File
rofi.kb-move-word-back: Alt+b,Ctrl+Left
! "Move forward one word" Set from: File
rofi.kb-move-word-forward: Alt+f,Ctrl+Right
! "Move back one char" Set from: File
rofi.kb-move-char-back: Left,Control+b
! "Move forward one char" Set from: File
rofi.kb-move-char-forward: Right,Control+f
! "Delete previous word" Set from: File
rofi.kb-remove-word-back: Control+Alt+h,Control+BackSpace
! "Delete next word" Set from: File
rofi.kb-remove-word-forward: Control+Alt+d
! "Delete next char" Set from: File
rofi.kb-remove-char-forward: Delete,Control+d
! "Delete previous char" Set from: File
rofi.kb-remove-char-back: BackSpace,Shift+BackSpace,Control+h
! "Delete till the end of line" Set from: File
rofi.kb-remove-to-eol: Control+k
! "Delete till the start of line" Set from: File
rofi.kb-remove-to-sol: Control+u
! "Accept entry" Set from: File
rofi.kb-accept-entry: Control+j,Control+m,Return,KP_Enter
! "Use entered text as command (in ssh/run modi)" Set from: File
rofi.kb-accept-custom: Control+Return
! "Use alternate accept command." Set from: File
rofi.kb-accept-alt: Shift+Return
! "Delete entry from history" Set from: File
rofi.kb-delete-entry: Shift+Delete
! "Switch to the next mode." Set from: File
rofi.kb-mode-next: Shift+Right,Control+Tab
! "Switch to the previous mode." Set from: File
rofi.kb-mode-previous: Shift+Left,Control+ISO_Left_Tab
! "Go to the previous column" Set from: File
rofi.kb-row-left: Control+Page_Up
! "Go to the next column" Set from: File
rofi.kb-row-right: Control+Page_Down
! "Select previous entry" Set from: File
rofi.kb-row-up: Up,Control+p,ISO_Left_Tab
! "Select next entry" Set from: File
rofi.kb-row-down: Down,Control+n
! "Go to next row, if one left, accept it, if no left next mode." Set from: File
rofi.kb-row-tab: Tab
! "Go to the previous page" Set from: File
rofi.kb-page-prev: Page_Up
! "Go to the next page" Set from: File
rofi.kb-page-next: Page_Down
! "Go to the first entry" Set from: File
rofi.kb-row-first: Home,KP_Home
! "Go to the last entry" Set from: File
rofi.kb-row-last: End,KP_End
! "Set selected item as input text" Set from: File
rofi.kb-row-select: Control+space
! "Take a screenshot of the rofi window" Set from: File
rofi.kb-screenshot: Alt+S
! "Toggle between ellipsize modes for displayed data" Set from: Default
! rofi.kb-ellipsize: Alt+period
! "Toggle case sensitivity" Set from: File
rofi.kb-toggle-case-sensitivity: grave,dead_grave
! "Toggle sort" Set from: File
rofi.kb-toggle-sort: Alt+grave
! "Quit rofi" Set from: File
rofi.kb-cancel: Escape,Control+bracketleft
! "Custom keybinding 1" Set from: File
rofi.kb-custom-1: Alt+1
! "Custom keybinding 2" Set from: File
rofi.kb-custom-2: Alt+2
! "Custom keybinding 3" Set from: File
rofi.kb-custom-3: Alt+3
! "Custom keybinding 4" Set from: File
rofi.kb-custom-4: Alt+4
! "Custom Keybinding 5" Set from: File
rofi.kb-custom-5: Alt+5
! "Custom keybinding 6" Set from: File
rofi.kb-custom-6: Alt+6
! "Custom Keybinding 7" Set from: File
rofi.kb-custom-7: Alt+7
! "Custom keybinding 8" Set from: File
rofi.kb-custom-8: Alt+8
! "Custom keybinding 9" Set from: File
rofi.kb-custom-9: Alt+9
! "Custom keybinding 10" Set from: File
rofi.kb-custom-10: Alt+0
! "Custom keybinding 11" Set from: File
rofi.kb-custom-11: Alt+Shift+1
! "Custom keybinding 12" Set from: File
rofi.kb-custom-12: Alt+at
! "Custom keybinding 13" Set from: File
rofi.kb-custom-13: Alt+numbersign
! "Custom keybinding 14" Set from: File
rofi.kb-custom-14: Alt+dollar
! "Custom keybinding 15" Set from: File
rofi.kb-custom-15: Alt+percent
! "Custom keybinding 16" Set from: File
rofi.kb-custom-16: Alt+dead_circumflex
! "Custom keybinding 17" Set from: File
rofi.kb-custom-17: Alt+ampersand
! "Custom keybinding 18" Set from: File
rofi.kb-custom-18: Alt+asterisk
! "Custom Keybinding 19" Set from: File
rofi.kb-custom-19: Alt+parenleft
! "Select row 1" Set from: Default
! rofi.kb-select-1: Super+1
! "Select row 2" Set from: Default
! rofi.kb-select-2: Super+2
! "Select row 3" Set from: Default
! rofi.kb-select-3: Super+3
! "Select row 4" Set from: Default
! rofi.kb-select-4: Super+4
! "Select row 5" Set from: Default
! rofi.kb-select-5: Super+5
! "Select row 6" Set from: Default
! rofi.kb-select-6: Super+6
! "Select row 7" Set from: Default
! rofi.kb-select-7: Super+7
! "Select row 8" Set from: Default
! rofi.kb-select-8: Super+8
! "Select row 9" Set from: Default
! rofi.kb-select-9: Super+9
! "Select row 10" Set from: Default
! rofi.kb-select-10: Super+0
! "Go to the previous column" Set from: Default
! rofi.ml-row-left: ScrollLeft
! "Go to the next column" Set from: Default
! rofi.ml-row-right: ScrollRight
! "Select previous entry" Set from: Default
! rofi.ml-row-up: ScrollUp
! "Select next entry" Set from: Default
! rofi.ml-row-down: ScrollDown
! "Select hovered row" Set from: Default
! rofi.me-select-entry: MousePrimary
! "Accept hovered row" Set from: Default
! rofi.me-accept-entry: MouseDPrimary
! "Accept hovered row with custom action" Set from: Default
! rofi.me-accept-custom: Control+MouseDPrimary

View file

@ -36,7 +36,7 @@
* Dialog that can combine multiple #Mode into one view. * Dialog that can combine multiple #Mode into one view.
* *
* This mode uses the following options from the #config object: * This mode uses the following options from the #config object:
* * #Settings::combi_modi * * #Settings::combi_modes
* *
* It creates the following option: * It creates the following option:
* * Settings::display_combi * * Settings::display_combi

View file

@ -47,9 +47,9 @@
Mode *script_mode_parse_setup(const char *str); Mode *script_mode_parse_setup(const char *str);
/** /**
* @param token The modi str to check * @param token The modes str to check
* *
* Check if token could be a valid script modi. * Check if token could be a valid script modes.
* *
* @returns true when valid. * @returns true when valid.
*/ */

View file

@ -48,11 +48,11 @@
extern const char *cache_dir; extern const char *cache_dir;
/** /**
* Get the number of enabled modi. * Get the number of enabled modes.
* *
* @returns the number of enabled modi. * @returns the number of enabled modes.
*/ */
unsigned int rofi_get_num_enabled_modi(void); unsigned int rofi_get_num_enabled_modes(void);
/** /**
* @param index The mode to return. (should be smaller then * @param index The mode to return. (should be smaller then
@ -90,7 +90,7 @@ void rofi_quit_main_loop(void);
* *
* @return returns Mode * when found, NULL if not. * @return returns Mode * when found, NULL if not.
*/ */
Mode *rofi_collect_modi_search(const char *name); Mode *rofi_collect_modes_search(const char *name);
/** Reset terminal */ /** Reset terminal */
#define color_reset "\033[0m" #define color_reset "\033[0m"
/** Set terminal text bold */ /** Set terminal text bold */

View file

@ -53,8 +53,8 @@ typedef enum { SORT_NORMAL = 0, SORT_FZF = 1 } SortingMethod;
* @ingroup CONFIGURATION * @ingroup CONFIGURATION
*/ */
typedef struct { typedef struct {
/** List of enabled modi */ /** List of enabled modes */
char *modi; char *modes;
/** Font string (pango format) */ /** Font string (pango format) */
char *menu_font; char *menu_font;
@ -116,7 +116,7 @@ typedef struct {
unsigned int cycle; unsigned int cycle;
/** Height of an element in number of rows */ /** Height of an element in number of rows */
int element_height; int element_height;
/** Sidebar mode, show the modi */ /** Sidebar mode, show the modes */
unsigned int sidebar_mode; unsigned int sidebar_mode;
/** Mouse hover automatically selects */ /** Mouse hover automatically selects */
gboolean hover_select; gboolean hover_select;
@ -129,7 +129,7 @@ typedef struct {
/** Knonw_hosts file parsing */ /** Knonw_hosts file parsing */
unsigned int parse_known_hosts; unsigned int parse_known_hosts;
/** Combi Modes */ /** Combi Modes */
char *combi_modi; char *combi_modes;
char *matching; char *matching;
MatchingMethod matching_method; MatchingMethod matching_method;
unsigned int tokenize; unsigned int tokenize;

View file

@ -95,12 +95,12 @@ struct RofiViewState {
/** Monitor #workarea the view is displayed on */ /** Monitor #workarea the view is displayed on */
workarea mon; workarea mon;
/** #box holding the different modi buttons */ /** #box holding the different modes buttons */
box *sidebar_bar; box *sidebar_bar;
/** number of modi to display */ /** number of modes to display */
unsigned int num_modi; unsigned int num_modes;
/** Array of #textbox that act as buttons for switching modi */ /** Array of #textbox that act as buttons for switching modes */
textbox **modi; textbox **modes;
/** Total rows. */ /** Total rows. */
textbox *tb_total_rows; textbox *tb_total_rows;

View file

@ -64,7 +64,7 @@ typedef enum {
WIDGET_TYPE_EDITBOX = SCOPE_MOUSE_EDITBOX, WIDGET_TYPE_EDITBOX = SCOPE_MOUSE_EDITBOX,
/** The listview scrollbar */ /** The listview scrollbar */
WIDGET_TYPE_SCROLLBAR = SCOPE_MOUSE_SCROLLBAR, WIDGET_TYPE_SCROLLBAR = SCOPE_MOUSE_SCROLLBAR,
/** A widget allowing user to swithc between modi */ /** A widget allowing user to swithc between modes */
WIDGET_TYPE_MODE_SWITCHER = SCOPE_MOUSE_MODE_SWITCHER, WIDGET_TYPE_MODE_SWITCHER = SCOPE_MOUSE_MODE_SWITCHER,
/** Text-only textbox */ /** Text-only textbox */
WIDGET_TYPE_TEXTBOX_TEXT, WIDGET_TYPE_TEXTBOX_TEXT,

View file

@ -63,21 +63,21 @@ static void combi_mode_parse_switchers(Mode *sw) {
CombiModePrivateData *pd = mode_get_private_data(sw); CombiModePrivateData *pd = mode_get_private_data(sw);
char *savept = NULL; char *savept = NULL;
// Make a copy, as strtok will modify it. // Make a copy, as strtok will modify it.
char *switcher_str = g_strdup(config.combi_modi); char *switcher_str = g_strdup(config.combi_modes);
const char *const sep = ",#"; const char *const sep = ",#";
// Split token on ','. This modifies switcher_str. // Split token on ','. This modifies switcher_str.
for (char *token = strtok_r(switcher_str, sep, &savept); token != NULL; for (char *token = strtok_r(switcher_str, sep, &savept); token != NULL;
token = strtok_r(NULL, sep, &savept)) { token = strtok_r(NULL, sep, &savept)) {
/* Check against recursion. */ /* Check against recursion. */
if (g_strcmp0(token, sw->name) == 0) { if (g_strcmp0(token, sw->name) == 0) {
g_warning("You cannot add '%s' to the list of combined modi.", sw->name); g_warning("You cannot add '%s' to the list of combined modes.", sw->name);
continue; continue;
} }
// Resize and add entry. // Resize and add entry.
pd->switchers = (CombiMode *)g_realloc( pd->switchers = (CombiMode *)g_realloc(
pd->switchers, sizeof(CombiMode) * (pd->num_switchers + 1)); pd->switchers, sizeof(CombiMode) * (pd->num_switchers + 1));
Mode *mode = rofi_collect_modi_search(token); Mode *mode = rofi_collect_modes_search(token);
if (mode != NULL) { if (mode != NULL) {
pd->switchers[pd->num_switchers].disable = FALSE; pd->switchers[pd->num_switchers].disable = FALSE;
pd->switchers[pd->num_switchers++].mode = mode; pd->switchers[pd->num_switchers++].mode = mode;
@ -236,10 +236,7 @@ static char *combi_mgrv(const Mode *sw, unsigned int selected_line, int *state,
} }
retv = helper_string_replace_if_exists( retv = helper_string_replace_if_exists(
config.combi_display_format, config.combi_display_format, "{mode}", dname, "{text}", str, NULL);
"{mode}", dname,
"{text}", str,
NULL);
g_free(str); g_free(str);
if (attr_list != NULL) { if (attr_list != NULL) {

View file

@ -402,7 +402,7 @@ static void file_browser_mode_init_current_dir(Mode *sw) {
static int file_browser_mode_init(Mode *sw) { static int file_browser_mode_init(Mode *sw) {
/** /**
* Called on startup when enabled (in modi list) * Called on startup when enabled (in modes list)
*/ */
if (mode_get_private_data(sw) == NULL) { if (mode_get_private_data(sw) == NULL) {
FileBrowserModePrivateData *pd = g_malloc0(sizeof(*pd)); FileBrowserModePrivateData *pd = g_malloc0(sizeof(*pd));

View file

@ -31,7 +31,7 @@
*/ */
/** /**
* Log domain for the ssh modi. * Log domain for the ssh mode.
*/ */
#define G_LOG_DOMAIN "Dialogs.Ssh" #define G_LOG_DOMAIN "Dialogs.Ssh"

View file

@ -25,14 +25,14 @@
* *
*/ */
#include "config.h" #include <glib.h>
#include <string.h>
#include "rofi.h" #include "rofi.h"
#include "config.h"
#include "nkutils-bindings.h" #include "nkutils-bindings.h"
#include "xrmoptions.h" #include "xrmoptions.h"
#include <string.h>
typedef struct typedef struct {
{
guint id; guint id;
guint scope; guint scope;
char *name; char *name;
@ -43,86 +43,315 @@ typedef struct
/** /**
* Data structure holding all the action keybinding. * Data structure holding all the action keybinding.
*/ */
ActionBindingEntry rofi_bindings[] = ActionBindingEntry rofi_bindings[] = {
{ {.id = PASTE_PRIMARY,
{ .id = PASTE_PRIMARY, .name = "kb-primary-paste", .binding = "Control+V,Shift+Insert", .comment = "Paste primary selection" }, .name = "kb-primary-paste",
{ .id = PASTE_SECONDARY, .name = "kb-secondary-paste", .binding = "Control+v,Insert", .comment = "Paste clipboard" }, .binding = "Control+V,Shift+Insert",
{ .id = CLEAR_LINE, .name = "kb-clear-line", .binding = "Control+w", .comment = "Clear input line" }, .comment = "Paste primary selection"},
{ .id = MOVE_FRONT, .name = "kb-move-front", .binding = "Control+a", .comment = "Beginning of line" }, {.id = PASTE_SECONDARY,
{ .id = MOVE_END, .name = "kb-move-end", .binding = "Control+e", .comment = "End of line" }, .name = "kb-secondary-paste",
{ .id = MOVE_WORD_BACK, .name = "kb-move-word-back", .binding = "Alt+b,Control+Left", .comment = "Move back one word" }, .binding = "Control+v,Insert",
{ .id = MOVE_WORD_FORWARD, .name = "kb-move-word-forward", .binding = "Alt+f,Control+Right", .comment = "Move forward one word" }, .comment = "Paste clipboard"},
{ .id = MOVE_CHAR_BACK, .name = "kb-move-char-back", .binding = "Left,Control+b", .comment = "Move back one char" }, {.id = CLEAR_LINE,
{ .id = MOVE_CHAR_FORWARD, .name = "kb-move-char-forward", .binding = "Right,Control+f", .comment = "Move forward one char" }, .name = "kb-clear-line",
{ .id = REMOVE_WORD_BACK, .name = "kb-remove-word-back", .binding = "Control+Alt+h,Control+BackSpace", .comment = "Delete previous word" }, .binding = "Control+w",
{ .id = REMOVE_WORD_FORWARD, .name = "kb-remove-word-forward", .binding = "Control+Alt+d", .comment = "Delete next word" }, .comment = "Clear input line"},
{ .id = REMOVE_CHAR_FORWARD, .name = "kb-remove-char-forward", .binding = "Delete,Control+d", .comment = "Delete next char" }, {.id = MOVE_FRONT,
{ .id = REMOVE_CHAR_BACK, .name = "kb-remove-char-back", .binding = "BackSpace,Shift+BackSpace,Control+h", .comment = "Delete previous char" }, .name = "kb-move-front",
{ .id = REMOVE_TO_EOL, .name = "kb-remove-to-eol", .binding = "Control+k", .comment = "Delete till the end of line" }, .binding = "Control+a",
{ .id = REMOVE_TO_SOL, .name = "kb-remove-to-sol", .binding = "Control+u", .comment = "Delete till the start of line" }, .comment = "Beginning of line"},
{ .id = ACCEPT_ENTRY, .name = "kb-accept-entry", .binding = "Control+j,Control+m,Return,KP_Enter", .comment = "Accept entry" }, {.id = MOVE_END,
{ .id = ACCEPT_CUSTOM, .name = "kb-accept-custom", .binding = "Control+Return", .comment = "Use entered text as command (in ssh/run modi)" }, .name = "kb-move-end",
{ .id = ACCEPT_CUSTOM_ALT, .name = "kb-accept-custom-alt", .binding = "Control+Shift+Return", .comment = "Use entered text as command (in ssh/run modi)" }, .binding = "Control+e",
{ .id = ACCEPT_ALT, .name = "kb-accept-alt", .binding = "Shift+Return", .comment = "Use alternate accept command." }, .comment = "End of line"},
{ .id = DELETE_ENTRY, .name = "kb-delete-entry", .binding = "Shift+Delete", .comment = "Delete entry from history" }, {.id = MOVE_WORD_BACK,
{ .id = MODE_NEXT, .name = "kb-mode-next", .binding = "Shift+Right,Control+Tab", .comment = "Switch to the next mode." }, .name = "kb-move-word-back",
{ .id = MODE_PREVIOUS, .name = "kb-mode-previous", .binding = "Shift+Left,Control+ISO_Left_Tab", .comment = "Switch to the previous mode." }, .binding = "Alt+b,Control+Left",
{ .id = MODE_COMPLETE, .name = "kb-mode-complete", .binding = "Control+l", .comment = "Start completion for mode." }, .comment = "Move back one word"},
{ .id = ROW_LEFT, .name = "kb-row-left", .binding = "Control+Page_Up", .comment = "Go to the previous column" }, {.id = MOVE_WORD_FORWARD,
{ .id = ROW_RIGHT, .name = "kb-row-right", .binding = "Control+Page_Down", .comment = "Go to the next column" }, .name = "kb-move-word-forward",
{ .id = ROW_UP, .name = "kb-row-up", .binding = "Up,Control+p,ISO_Left_Tab", .comment = "Select previous entry" }, .binding = "Alt+f,Control+Right",
{ .id = ROW_DOWN, .name = "kb-row-down", .binding = "Down,Control+n", .comment = "Select next entry" }, .comment = "Move forward one word"},
{ .id = ROW_TAB, .name = "kb-row-tab", .binding = "Tab", .comment = "Go to next row, if one left, accept it, if no left next mode." }, {.id = MOVE_CHAR_BACK,
{ .id = PAGE_PREV, .name = "kb-page-prev", .binding = "Page_Up", .comment = "Go to the previous page" }, .name = "kb-move-char-back",
{ .id = PAGE_NEXT, .name = "kb-page-next", .binding = "Page_Down", .comment = "Go to the next page" }, .binding = "Left,Control+b",
{ .id = ROW_FIRST, .name = "kb-row-first", .binding = "Home,KP_Home", .comment = "Go to the first entry" }, .comment = "Move back one char"},
{ .id = ROW_LAST, .name = "kb-row-last", .binding = "End,KP_End", .comment = "Go to the last entry" }, {.id = MOVE_CHAR_FORWARD,
{ .id = ROW_SELECT, .name = "kb-row-select", .binding = "Control+space", .comment = "Set selected item as input text" }, .name = "kb-move-char-forward",
{ .id = SCREENSHOT, .name = "kb-screenshot", .binding = "Alt+S", .comment = "Take a screenshot of the rofi window" }, .binding = "Right,Control+f",
{ .id = CHANGE_ELLIPSIZE, .name = "kb-ellipsize", .binding = "Alt+period", .comment = "Toggle between ellipsize modes for displayed data" }, .comment = "Move forward one char"},
{ .id = TOGGLE_CASE_SENSITIVITY, .name = "kb-toggle-case-sensitivity", .binding = "grave,dead_grave", .comment = "Toggle case sensitivity" }, {.id = REMOVE_WORD_BACK,
{ .id = TOGGLE_SORT, .name = "kb-toggle-sort", .binding = "Alt+grave", .comment = "Toggle sort" }, .name = "kb-remove-word-back",
{ .id = CANCEL, .name = "kb-cancel", .binding = "Escape,Control+g,Control+bracketleft", .comment = "Quit rofi" }, .binding = "Control+Alt+h,Control+BackSpace",
{ .id = CUSTOM_1, .name = "kb-custom-1", .binding = "Alt+1", .comment = "Custom keybinding 1" }, .comment = "Delete previous word"},
{ .id = CUSTOM_2, .name = "kb-custom-2", .binding = "Alt+2", .comment = "Custom keybinding 2" }, {.id = REMOVE_WORD_FORWARD,
{ .id = CUSTOM_3, .name = "kb-custom-3", .binding = "Alt+3", .comment = "Custom keybinding 3" }, .name = "kb-remove-word-forward",
{ .id = CUSTOM_4, .name = "kb-custom-4", .binding = "Alt+4", .comment = "Custom keybinding 4" }, .binding = "Control+Alt+d",
{ .id = CUSTOM_5, .name = "kb-custom-5", .binding = "Alt+5", .comment = "Custom Keybinding 5" }, .comment = "Delete next word"},
{ .id = CUSTOM_6, .name = "kb-custom-6", .binding = "Alt+6", .comment = "Custom keybinding 6" }, {.id = REMOVE_CHAR_FORWARD,
{ .id = CUSTOM_7, .name = "kb-custom-7", .binding = "Alt+7", .comment = "Custom Keybinding 7" }, .name = "kb-remove-char-forward",
{ .id = CUSTOM_8, .name = "kb-custom-8", .binding = "Alt+8", .comment = "Custom keybinding 8" }, .binding = "Delete,Control+d",
{ .id = CUSTOM_9, .name = "kb-custom-9", .binding = "Alt+9", .comment = "Custom keybinding 9" }, .comment = "Delete next char"},
{ .id = CUSTOM_10, .name = "kb-custom-10", .binding = "Alt+0", .comment = "Custom keybinding 10" }, {.id = REMOVE_CHAR_BACK,
{ .id = CUSTOM_11, .name = "kb-custom-11", .binding = "Alt+exclam", .comment = "Custom keybinding 11" }, .name = "kb-remove-char-back",
{ .id = CUSTOM_12, .name = "kb-custom-12", .binding = "Alt+at", .comment = "Custom keybinding 12" }, .binding = "BackSpace,Shift+BackSpace,Control+h",
{ .id = CUSTOM_13, .name = "kb-custom-13", .binding = "Alt+numbersign", .comment = "Custom keybinding 13" }, .comment = "Delete previous char"},
{ .id = CUSTOM_14, .name = "kb-custom-14", .binding = "Alt+dollar", .comment = "Custom keybinding 14" }, {.id = REMOVE_TO_EOL,
{ .id = CUSTOM_15, .name = "kb-custom-15", .binding = "Alt+percent", .comment = "Custom keybinding 15" }, .name = "kb-remove-to-eol",
{ .id = CUSTOM_16, .name = "kb-custom-16", .binding = "Alt+dead_circumflex", .comment = "Custom keybinding 16" }, .binding = "Control+k",
{ .id = CUSTOM_17, .name = "kb-custom-17", .binding = "Alt+ampersand", .comment = "Custom keybinding 17" }, .comment = "Delete till the end of line"},
{ .id = CUSTOM_18, .name = "kb-custom-18", .binding = "Alt+asterisk", .comment = "Custom keybinding 18" }, {.id = REMOVE_TO_SOL,
{ .id = CUSTOM_19, .name = "kb-custom-19", .binding = "Alt+parenleft", .comment = "Custom Keybinding 19" }, .name = "kb-remove-to-sol",
{ .id = SELECT_ELEMENT_1, .name = "kb-select-1", .binding = "Super+1", .comment = "Select row 1" }, .binding = "Control+u",
{ .id = SELECT_ELEMENT_2, .name = "kb-select-2", .binding = "Super+2", .comment = "Select row 2" }, .comment = "Delete till the start of line"},
{ .id = SELECT_ELEMENT_3, .name = "kb-select-3", .binding = "Super+3", .comment = "Select row 3" }, {.id = ACCEPT_ENTRY,
{ .id = SELECT_ELEMENT_4, .name = "kb-select-4", .binding = "Super+4", .comment = "Select row 4" }, .name = "kb-accept-entry",
{ .id = SELECT_ELEMENT_5, .name = "kb-select-5", .binding = "Super+5", .comment = "Select row 5" }, .binding = "Control+j,Control+m,Return,KP_Enter",
{ .id = SELECT_ELEMENT_6, .name = "kb-select-6", .binding = "Super+6", .comment = "Select row 6" }, .comment = "Accept entry"},
{ .id = SELECT_ELEMENT_7, .name = "kb-select-7", .binding = "Super+7", .comment = "Select row 7" }, {.id = ACCEPT_CUSTOM,
{ .id = SELECT_ELEMENT_8, .name = "kb-select-8", .binding = "Super+8", .comment = "Select row 8" }, .name = "kb-accept-custom",
{ .id = SELECT_ELEMENT_9, .name = "kb-select-9", .binding = "Super+9", .comment = "Select row 9" }, .binding = "Control+Return",
{ .id = SELECT_ELEMENT_10, .name = "kb-select-10", .binding = "Super+0", .comment = "Select row 10" }, .comment = "Use entered text as command (in ssh/run modes)"},
{.id = ACCEPT_CUSTOM_ALT,
.name = "kb-accept-custom-alt",
.binding = "Control+Shift+Return",
.comment = "Use entered text as command (in ssh/run modes)"},
{.id = ACCEPT_ALT,
.name = "kb-accept-alt",
.binding = "Shift+Return",
.comment = "Use alternate accept command."},
{.id = DELETE_ENTRY,
.name = "kb-delete-entry",
.binding = "Shift+Delete",
.comment = "Delete entry from history"},
{.id = MODE_NEXT,
.name = "kb-mode-next",
.binding = "Shift+Right,Control+Tab",
.comment = "Switch to the next mode."},
{.id = MODE_PREVIOUS,
.name = "kb-mode-previous",
.binding = "Shift+Left,Control+ISO_Left_Tab",
.comment = "Switch to the previous mode."},
{.id = MODE_COMPLETE,
.name = "kb-mode-complete",
.binding = "Control+l",
.comment = "Start completion for mode."},
{.id = ROW_LEFT,
.name = "kb-row-left",
.binding = "Control+Page_Up",
.comment = "Go to the previous column"},
{.id = ROW_RIGHT,
.name = "kb-row-right",
.binding = "Control+Page_Down",
.comment = "Go to the next column"},
{.id = ROW_UP,
.name = "kb-row-up",
.binding = "Up,Control+p,ISO_Left_Tab",
.comment = "Select previous entry"},
{.id = ROW_DOWN,
.name = "kb-row-down",
.binding = "Down,Control+n",
.comment = "Select next entry"},
{.id = ROW_TAB,
.name = "kb-row-tab",
.binding = "Tab",
.comment =
"Go to next row, if one left, accept it, if no left next mode."},
{.id = PAGE_PREV,
.name = "kb-page-prev",
.binding = "Page_Up",
.comment = "Go to the previous page"},
{.id = PAGE_NEXT,
.name = "kb-page-next",
.binding = "Page_Down",
.comment = "Go to the next page"},
{.id = ROW_FIRST,
.name = "kb-row-first",
.binding = "Home,KP_Home",
.comment = "Go to the first entry"},
{.id = ROW_LAST,
.name = "kb-row-last",
.binding = "End,KP_End",
.comment = "Go to the last entry"},
{.id = ROW_SELECT,
.name = "kb-row-select",
.binding = "Control+space",
.comment = "Set selected item as input text"},
{.id = SCREENSHOT,
.name = "kb-screenshot",
.binding = "Alt+S",
.comment = "Take a screenshot of the rofi window"},
{.id = CHANGE_ELLIPSIZE,
.name = "kb-ellipsize",
.binding = "Alt+period",
.comment = "Toggle between ellipsize modes for displayed data"},
{.id = TOGGLE_CASE_SENSITIVITY,
.name = "kb-toggle-case-sensitivity",
.binding = "grave,dead_grave",
.comment = "Toggle case sensitivity"},
{.id = TOGGLE_SORT,
.name = "kb-toggle-sort",
.binding = "Alt+grave",
.comment = "Toggle sort"},
{.id = CANCEL,
.name = "kb-cancel",
.binding = "Escape,Control+g,Control+bracketleft",
.comment = "Quit rofi"},
{.id = CUSTOM_1,
.name = "kb-custom-1",
.binding = "Alt+1",
.comment = "Custom keybinding 1"},
{.id = CUSTOM_2,
.name = "kb-custom-2",
.binding = "Alt+2",
.comment = "Custom keybinding 2"},
{.id = CUSTOM_3,
.name = "kb-custom-3",
.binding = "Alt+3",
.comment = "Custom keybinding 3"},
{.id = CUSTOM_4,
.name = "kb-custom-4",
.binding = "Alt+4",
.comment = "Custom keybinding 4"},
{.id = CUSTOM_5,
.name = "kb-custom-5",
.binding = "Alt+5",
.comment = "Custom Keybinding 5"},
{.id = CUSTOM_6,
.name = "kb-custom-6",
.binding = "Alt+6",
.comment = "Custom keybinding 6"},
{.id = CUSTOM_7,
.name = "kb-custom-7",
.binding = "Alt+7",
.comment = "Custom Keybinding 7"},
{.id = CUSTOM_8,
.name = "kb-custom-8",
.binding = "Alt+8",
.comment = "Custom keybinding 8"},
{.id = CUSTOM_9,
.name = "kb-custom-9",
.binding = "Alt+9",
.comment = "Custom keybinding 9"},
{.id = CUSTOM_10,
.name = "kb-custom-10",
.binding = "Alt+0",
.comment = "Custom keybinding 10"},
{.id = CUSTOM_11,
.name = "kb-custom-11",
.binding = "Alt+exclam",
.comment = "Custom keybinding 11"},
{.id = CUSTOM_12,
.name = "kb-custom-12",
.binding = "Alt+at",
.comment = "Custom keybinding 12"},
{.id = CUSTOM_13,
.name = "kb-custom-13",
.binding = "Alt+numbersign",
.comment = "Custom keybinding 13"},
{.id = CUSTOM_14,
.name = "kb-custom-14",
.binding = "Alt+dollar",
.comment = "Custom keybinding 14"},
{.id = CUSTOM_15,
.name = "kb-custom-15",
.binding = "Alt+percent",
.comment = "Custom keybinding 15"},
{.id = CUSTOM_16,
.name = "kb-custom-16",
.binding = "Alt+dead_circumflex",
.comment = "Custom keybinding 16"},
{.id = CUSTOM_17,
.name = "kb-custom-17",
.binding = "Alt+ampersand",
.comment = "Custom keybinding 17"},
{.id = CUSTOM_18,
.name = "kb-custom-18",
.binding = "Alt+asterisk",
.comment = "Custom keybinding 18"},
{.id = CUSTOM_19,
.name = "kb-custom-19",
.binding = "Alt+parenleft",
.comment = "Custom Keybinding 19"},
{.id = SELECT_ELEMENT_1,
.name = "kb-select-1",
.binding = "Super+1",
.comment = "Select row 1"},
{.id = SELECT_ELEMENT_2,
.name = "kb-select-2",
.binding = "Super+2",
.comment = "Select row 2"},
{.id = SELECT_ELEMENT_3,
.name = "kb-select-3",
.binding = "Super+3",
.comment = "Select row 3"},
{.id = SELECT_ELEMENT_4,
.name = "kb-select-4",
.binding = "Super+4",
.comment = "Select row 4"},
{.id = SELECT_ELEMENT_5,
.name = "kb-select-5",
.binding = "Super+5",
.comment = "Select row 5"},
{.id = SELECT_ELEMENT_6,
.name = "kb-select-6",
.binding = "Super+6",
.comment = "Select row 6"},
{.id = SELECT_ELEMENT_7,
.name = "kb-select-7",
.binding = "Super+7",
.comment = "Select row 7"},
{.id = SELECT_ELEMENT_8,
.name = "kb-select-8",
.binding = "Super+8",
.comment = "Select row 8"},
{.id = SELECT_ELEMENT_9,
.name = "kb-select-9",
.binding = "Super+9",
.comment = "Select row 9"},
{.id = SELECT_ELEMENT_10,
.name = "kb-select-10",
.binding = "Super+0",
.comment = "Select row 10"},
/* Mouse-aware bindings */ /* Mouse-aware bindings */
{ .id = SCROLL_LEFT, .scope = SCOPE_MOUSE_LISTVIEW, .name = "ml-row-left", .binding = "ScrollLeft", .comment = "Go to the previous column" }, {.id = SCROLL_LEFT,
{ .id = SCROLL_RIGHT, .scope = SCOPE_MOUSE_LISTVIEW, .name = "ml-row-right", .binding = "ScrollRight", .comment = "Go to the next column" }, .scope = SCOPE_MOUSE_LISTVIEW,
{ .id = SCROLL_UP, .scope = SCOPE_MOUSE_LISTVIEW, .name = "ml-row-up", .binding = "ScrollUp", .comment = "Select previous entry" }, .name = "ml-row-left",
{ .id = SCROLL_DOWN, .scope = SCOPE_MOUSE_LISTVIEW, .name = "ml-row-down", .binding = "ScrollDown", .comment = "Select next entry" }, .binding = "ScrollLeft",
.comment = "Go to the previous column"},
{.id = SCROLL_RIGHT,
.scope = SCOPE_MOUSE_LISTVIEW,
.name = "ml-row-right",
.binding = "ScrollRight",
.comment = "Go to the next column"},
{.id = SCROLL_UP,
.scope = SCOPE_MOUSE_LISTVIEW,
.name = "ml-row-up",
.binding = "ScrollUp",
.comment = "Select previous entry"},
{.id = SCROLL_DOWN,
.scope = SCOPE_MOUSE_LISTVIEW,
.name = "ml-row-down",
.binding = "ScrollDown",
.comment = "Select next entry"},
{ .id = SELECT_HOVERED_ENTRY, .scope = SCOPE_MOUSE_LISTVIEW_ELEMENT, .name = "me-select-entry", .binding = "MousePrimary", .comment = "Select hovered row" }, {.id = SELECT_HOVERED_ENTRY,
{ .id = ACCEPT_HOVERED_ENTRY, .scope = SCOPE_MOUSE_LISTVIEW_ELEMENT, .name = "me-accept-entry", .binding = "MouseDPrimary", .comment = "Accept hovered row" }, .scope = SCOPE_MOUSE_LISTVIEW_ELEMENT,
{ .id = ACCEPT_HOVERED_CUSTOM, .scope = SCOPE_MOUSE_LISTVIEW_ELEMENT, .name = "me-accept-custom", .binding = "Control+MouseDPrimary", .comment = "Accept hovered row with custom action"}, .name = "me-select-entry",
.binding = "MousePrimary",
.comment = "Select hovered row"},
{.id = ACCEPT_HOVERED_ENTRY,
.scope = SCOPE_MOUSE_LISTVIEW_ELEMENT,
.name = "me-accept-entry",
.binding = "MouseDPrimary",
.comment = "Accept hovered row"},
{.id = ACCEPT_HOVERED_CUSTOM,
.scope = SCOPE_MOUSE_LISTVIEW_ELEMENT,
.name = "me-accept-custom",
.binding = "Control+MouseDPrimary",
.comment = "Accept hovered row with custom action"},
}; };
/** Default binding of mouse button to action. */ /** Default binding of mouse button to action. */
@ -133,27 +362,31 @@ static const gchar *mouse_default_bindings[] = {
[MOUSE_DCLICK_UP] = "!MouseDPrimary", [MOUSE_DCLICK_UP] = "!MouseDPrimary",
}; };
void setup_abe ( void ) void setup_abe(void) {
{
for (gsize i = 0; i < G_N_ELEMENTS(rofi_bindings); ++i) { for (gsize i = 0; i < G_N_ELEMENTS(rofi_bindings); ++i) {
ActionBindingEntry *b = &rofi_bindings[i]; ActionBindingEntry *b = &rofi_bindings[i];
b->binding = g_strdup(b->binding); b->binding = g_strdup(b->binding);
config_parser_add_option ( xrm_String, b->name, (void * *) &( b->binding ), b->comment ); config_parser_add_option(xrm_String, b->name, (void **)&(b->binding),
b->comment);
} }
} }
static gboolean binding_check_action ( guint64 scope, G_GNUC_UNUSED gpointer target, gpointer user_data ) static gboolean binding_check_action(guint64 scope,
{ G_GNUC_UNUSED gpointer target,
return rofi_view_check_action ( rofi_view_get_active (), scope, GPOINTER_TO_UINT ( user_data ) ) ? NK_BINDINGS_BINDING_TRIGGERED : NK_BINDINGS_BINDING_NOT_TRIGGERED; gpointer user_data) {
return rofi_view_check_action(rofi_view_get_active(), scope,
GPOINTER_TO_UINT(user_data))
? NK_BINDINGS_BINDING_TRIGGERED
: NK_BINDINGS_BINDING_NOT_TRIGGERED;
} }
static void binding_trigger_action ( guint64 scope, G_GNUC_UNUSED gpointer target, gpointer user_data ) static void binding_trigger_action(guint64 scope, G_GNUC_UNUSED gpointer target,
{ gpointer user_data) {
rofi_view_trigger_action ( rofi_view_get_active (), scope, GPOINTER_TO_UINT ( user_data ) ); rofi_view_trigger_action(rofi_view_get_active(), scope,
GPOINTER_TO_UINT(user_data));
} }
guint key_binding_get_action_from_name ( const char *name ) guint key_binding_get_action_from_name(const char *name) {
{
for (gsize i = 0; i < G_N_ELEMENTS(rofi_bindings); ++i) { for (gsize i = 0; i < G_N_ELEMENTS(rofi_bindings); ++i) {
ActionBindingEntry *b = &rofi_bindings[i]; ActionBindingEntry *b = &rofi_bindings[i];
if (g_strcmp0(b->name, name) == 0) { if (g_strcmp0(b->name, name) == 0) {
@ -163,9 +396,7 @@ guint key_binding_get_action_from_name ( const char *name )
return UINT32_MAX; return UINT32_MAX;
} }
gboolean parse_keys_abe(NkBindings *bindings) {
gboolean parse_keys_abe ( NkBindings *bindings )
{
GError *error = NULL; GError *error = NULL;
GString *error_msg = g_string_new(""); GString *error_msg = g_string_new("");
for (gsize i = 0; i < G_N_ELEMENTS(rofi_bindings); ++i) { for (gsize i = 0; i < G_N_ELEMENTS(rofi_bindings); ++i) {
@ -175,9 +406,14 @@ gboolean parse_keys_abe ( NkBindings *bindings )
// Iter over bindings. // Iter over bindings.
const char *const sep = ","; const char *const sep = ",";
for ( char *entry = strtok_r ( keystr, sep, &sp ); entry != NULL; entry = strtok_r ( NULL, sep, &sp ) ) { for (char *entry = strtok_r(keystr, sep, &sp); entry != NULL;
if ( !nk_bindings_add_binding ( bindings, b->scope, entry, binding_check_action, binding_trigger_action, GUINT_TO_POINTER ( b->id ), NULL, &error ) ) { entry = strtok_r(NULL, sep, &sp)) {
char *str = g_markup_printf_escaped ( "Failed to set binding <i>%s</i> for: <i>%s (%s)</i>:\n\t<span size=\"smaller\" style=\"italic\">%s</span>\n", if (!nk_bindings_add_binding(bindings, b->scope, entry,
binding_check_action, binding_trigger_action,
GUINT_TO_POINTER(b->id), NULL, &error)) {
char *str = g_markup_printf_escaped(
"Failed to set binding <i>%s</i> for: <i>%s (%s)</i>:\n\t<span "
"size=\"smaller\" style=\"italic\">%s</span>\n",
b->binding, b->comment, b->name, error->message); b->binding, b->comment, b->name, error->message);
g_string_append(error_msg, str); g_string_append(error_msg, str);
g_free(str); g_free(str);
@ -196,7 +432,9 @@ gboolean parse_keys_abe ( NkBindings *bindings )
for (gsize i = SCOPE_MIN_FIXED; i <= SCOPE_MAX_FIXED; ++i) { for (gsize i = SCOPE_MIN_FIXED; i <= SCOPE_MAX_FIXED; ++i) {
for (gsize j = 1; j < G_N_ELEMENTS(mouse_default_bindings); ++j) { for (gsize j = 1; j < G_N_ELEMENTS(mouse_default_bindings); ++j) {
nk_bindings_add_binding ( bindings, i, mouse_default_bindings[j], binding_check_action, binding_trigger_action, GSIZE_TO_POINTER ( j ), NULL, NULL ); nk_bindings_add_binding(bindings, i, mouse_default_bindings[j],
binding_check_action, binding_trigger_action,
GSIZE_TO_POINTER(j), NULL, NULL);
} }
} }

View file

@ -36,6 +36,8 @@
#include "rofi-icon-fetcher.h" #include "rofi-icon-fetcher.h"
#include "rofi-types.h" #include "rofi-types.h"
#include "settings.h" #include "settings.h"
#include <cairo.h>
#include <pango/pangocairo.h>
#include "keyb.h" #include "keyb.h"
#include "view.h" #include "view.h"
@ -292,6 +294,32 @@ static void rofi_icon_fetcher_worker(thread_state *sdata,
if (g_path_is_absolute(sentry->entry->name)) { if (g_path_is_absolute(sentry->entry->name)) {
icon_path = sentry->entry->name; icon_path = sentry->entry->name;
} else if (g_str_has_prefix(sentry->entry->name, "font:")) {
cairo_surface_t *surface = cairo_image_surface_create(
CAIRO_FORMAT_ARGB32, sentry->wsize, sentry->hsize);
cairo_t *cr = cairo_create(surface);
PangoLayout *layout = pango_cairo_create_layout(cr);
pango_layout_set_text(layout, &sentry->entry->name[5], -1);
int width, height;
pango_layout_get_size(layout, &width, &height);
double ws = sentry->wsize / ((double)width / PANGO_SCALE);
double wh = sentry->hsize / ((double)height / PANGO_SCALE);
double scale = MIN(ws, wh);
cairo_move_to(
cr, (sentry->wsize - ((double)width / PANGO_SCALE) * scale) / 2.0,
(sentry->hsize - ((double)height / PANGO_SCALE) * scale) / 2.0);
cairo_scale(cr, scale, scale);
pango_cairo_update_layout(cr, layout);
pango_layout_get_size(layout, &width, &height);
pango_cairo_show_layout(cr, layout);
g_object_unref(layout);
cairo_destroy(cr);
sentry->surface = surface;
rofi_view_reload();
return;
} else { } else {
icon_path = icon_path_ = nk_xdg_theme_get_icon( icon_path = icon_path_ = nk_xdg_theme_get_icon(
rofi_icon_fetcher_data->xdg_context, themes, NULL, sentry->entry->name, rofi_icon_fetcher_data->xdg_context, themes, NULL, sentry->entry->name,

View file

@ -85,7 +85,7 @@ const char *cache_dir = NULL;
/** List of error messages.*/ /** List of error messages.*/
GList *list_of_error_msgs = NULL; GList *list_of_error_msgs = NULL;
static void rofi_collect_modi_destroy(void); static void rofi_collectmodes_destroy(void);
void rofi_add_error_message(GString *str) { void rofi_add_error_message(GString *str) {
list_of_error_msgs = g_list_append(list_of_error_msgs, str); list_of_error_msgs = g_list_append(list_of_error_msgs, str);
} }
@ -103,15 +103,15 @@ void rofi_clear_error_messages(void) {
/** Path to the configuration file */ /** Path to the configuration file */
G_MODULE_EXPORT char *config_path = NULL; G_MODULE_EXPORT char *config_path = NULL;
/** Path to the configuration file in the new format */ /** Path to the configuration file in the new format */
/** Array holding all activated modi. */ /** Array holding all activated modes. */
Mode **modi = NULL; Mode **modes = NULL;
/** List of (possibly uninitialized) modi's */ /** List of (possibly uninitialized) modes */
Mode **available_modi = NULL; Mode **available_modes = NULL;
/** Length of #num_available_modi */ /** Length of #num_available_modes */
unsigned int num_available_modi = 0; unsigned int num_available_modes = 0;
/** Number of activated modi in #modi array */ /** Number of activated modes in #modes array */
unsigned int num_modi = 0; unsigned int num_modes = 0;
/** Current selected mode */ /** Current selected mode */
unsigned int curr_mode = 0; unsigned int curr_mode = 0;
@ -130,20 +130,20 @@ void process_result(RofiViewState *state);
void rofi_set_return_code(int code) { return_code = code; } void rofi_set_return_code(int code) { return_code = code; }
unsigned int rofi_get_num_enabled_modi(void) { return num_modi; } unsigned int rofi_get_num_enabled_modes(void) { return num_modes; }
const Mode *rofi_get_mode(unsigned int index) { return modi[index]; } const Mode *rofi_get_mode(unsigned int index) { return modes[index]; }
/** /**
* @param name Name of the mode to lookup. * @param name Name of the mode to lookup.
* *
* Find the index of the mode with name. * Find the index of the mode with name.
* *
* @returns index of the mode in modi, -1 if not found. * @returns index of the mode in modes, -1 if not found.
*/ */
static int mode_lookup(const char *name) { static int mode_lookup(const char *name) {
for (unsigned int i = 0; i < num_modi; i++) { for (unsigned int i = 0; i < num_modes; i++) {
if (strcmp(mode_get_name(modi[i]), name) == 0) { if (strcmp(mode_get_name(modes[i]), name) == 0) {
return i; return i;
} }
} }
@ -167,10 +167,10 @@ static void teardown(int pfd) {
} }
static void run_mode_index(ModeMode mode) { static void run_mode_index(ModeMode mode) {
// Otherwise check if requested mode is enabled. // Otherwise check if requested mode is enabled.
for (unsigned int i = 0; i < num_modi; i++) { for (unsigned int i = 0; i < num_modes; i++) {
if (!mode_init(modi[i])) { if (!mode_init(modes[i])) {
GString *str = g_string_new("Failed to initialize the mode: "); GString *str = g_string_new("Failed to initialize the mode: ");
g_string_append(str, modi[i]->name); g_string_append(str, modes[i]->name);
g_string_append(str, "\n"); g_string_append(str, "\n");
rofi_view_error_dialog(str->str, ERROR_MSG_MARKUP); rofi_view_error_dialog(str->str, ERROR_MSG_MARKUP);
@ -184,7 +184,7 @@ static void run_mode_index(ModeMode mode) {
} }
curr_mode = mode; curr_mode = mode;
RofiViewState *state = RofiViewState *state =
rofi_view_create(modi[mode], config.filter, 0, process_result); rofi_view_create(modes[mode], config.filter, 0, process_result);
// User can pre-select a row. // User can pre-select a row.
if (find_arg("-selected-row") >= 0) { if (find_arg("-selected-row") >= 0) {
@ -223,19 +223,19 @@ void process_result(RofiViewState *state) {
ModeMode mode = curr_mode; ModeMode mode = curr_mode;
// Find next enabled // Find next enabled
if (retv == NEXT_DIALOG) { if (retv == NEXT_DIALOG) {
mode = (mode + 1) % num_modi; mode = (mode + 1) % num_modes;
} else if (retv == PREVIOUS_DIALOG) { } else if (retv == PREVIOUS_DIALOG) {
if (mode == 0) { if (mode == 0) {
mode = num_modi - 1; mode = num_modes - 1;
} else { } else {
mode = (mode - 1) % num_modi; mode = (mode - 1) % num_modes;
} }
} else if (retv == RELOAD_DIALOG) { } else if (retv == RELOAD_DIALOG) {
// do nothing. // do nothing.
} else if (retv == RESET_DIALOG) { } else if (retv == RESET_DIALOG) {
rofi_view_clear_input(state); rofi_view_clear_input(state);
} else if (retv < MODE_EXIT) { } else if (retv < MODE_EXIT) {
mode = (retv) % num_modi; mode = (retv) % num_modes;
} else { } else {
mode = retv; mode = retv;
} }
@ -243,7 +243,7 @@ void process_result(RofiViewState *state) {
/** /**
* Load in the new mode. * Load in the new mode.
*/ */
rofi_view_switch_mode(state, modi[mode]); rofi_view_switch_mode(state, modes[mode]);
curr_mode = mode; curr_mode = mode;
return; return;
} }
@ -260,18 +260,18 @@ void process_result(RofiViewState *state) {
/** /**
* Help function. * Help function.
*/ */
static void print_list_of_modi(int is_term) { static void print_list_of_modes(int is_term) {
for (unsigned int i = 0; i < num_available_modi; i++) { for (unsigned int i = 0; i < num_available_modes; i++) {
gboolean active = FALSE; gboolean active = FALSE;
for (unsigned int j = 0; j < num_modi; j++) { for (unsigned int j = 0; j < num_modes; j++) {
if (modi[j] == available_modi[i]) { if (modes[j] == available_modes[i]) {
active = TRUE; active = TRUE;
break; break;
} }
} }
printf(" • %s%s%s%s\n", active ? "+" : "", printf(" • %s%s%s%s\n", active ? "+" : "",
is_term ? (active ? color_green : color_red) : "", is_term ? (active ? color_green : color_red) : "",
available_modi[i]->name, is_term ? color_reset : ""); available_modes[i]->name, is_term ? color_reset : "");
} }
} }
static void print_main_application_options(int is_term) { static void print_main_application_options(int is_term) {
@ -323,8 +323,8 @@ static void help(G_GNUC_UNUSED int argc, char **argv) {
printf("\n"); printf("\n");
display_dump_monitor_layout(); display_dump_monitor_layout();
printf("\n"); printf("\n");
printf("Detected modi:\n"); printf("Detected modes:\n");
print_list_of_modi(is_term); print_list_of_modes(is_term);
printf("\n"); printf("\n");
printf("Compile time options:\n"); printf("Compile time options:\n");
#ifdef WINDOW_MODE #ifdef WINDOW_MODE
@ -390,26 +390,26 @@ static void help_print_disabled_mode(const char *mode) {
fprintf(stderr, "Mode %s%s%s is not enabled. I have enabled it for now.\n", fprintf(stderr, "Mode %s%s%s is not enabled. I have enabled it for now.\n",
color_red, mode, color_reset); color_red, mode, color_reset);
fprintf(stderr, fprintf(stderr,
"Please consider adding %s%s%s to the list of enabled modi: " "Please consider adding %s%s%s to the list of enabled modes: "
"%smodi: [%s%s%s,%s]%s.\n", "%smodes: [%s%s%s,%s]%s.\n",
color_red, mode, color_reset, color_green, config.modi, color_reset, color_red, mode, color_reset, color_green, config.modes,
color_red, mode, color_reset); color_reset, color_red, mode, color_reset);
} }
} }
static void help_print_mode_not_found(const char *mode) { static void help_print_mode_not_found(const char *mode) {
GString *str = g_string_new(""); GString *str = g_string_new("");
g_string_printf(str, "Mode %s is not found.\nThe following modi are known:\n", g_string_printf(
mode); str, "Mode %s is not found.\nThe following modes are known:\n", mode);
for (unsigned int i = 0; i < num_available_modi; i++) { for (unsigned int i = 0; i < num_available_modes; i++) {
gboolean active = FALSE; gboolean active = FALSE;
for (unsigned int j = 0; j < num_modi; j++) { for (unsigned int j = 0; j < num_modes; j++) {
if (modi[j] == available_modi[i]) { if (modes[j] == available_modes[i]) {
active = TRUE; active = TRUE;
break; break;
} }
} }
g_string_append_printf(str, " * %s%s\n", active ? "+" : "", g_string_append_printf(str, " * %s%s\n", active ? "+" : "",
available_modi[i]->name); available_modes[i]->name);
} }
rofi_add_error_message(str); rofi_add_error_message(str);
} }
@ -421,27 +421,27 @@ static void help_print_no_arguments(void) {
fprintf(stderr, " %srofi%s -show %s{mode}%s\n\n", fprintf(stderr, " %srofi%s -show %s{mode}%s\n\n",
is_term ? color_bold : "", is_term ? color_reset : "", is_term ? color_bold : "", is_term ? color_reset : "",
is_term ? color_green : "", is_term ? color_reset : ""); is_term ? color_green : "", is_term ? color_reset : "");
fprintf(stderr, "The following modi are enabled:\n"); fprintf(stderr, "The following modes are enabled:\n");
for (unsigned int j = 0; j < num_modi; j++) { for (unsigned int j = 0; j < num_modes; j++) {
fprintf(stderr, " * %s%s%s\n", is_term ? color_green : "", modi[j]->name, fprintf(stderr, " * %s%s%s\n", is_term ? color_green : "", modes[j]->name,
is_term ? color_reset : ""); is_term ? color_reset : "");
} }
fprintf(stderr, "\nThe following can be enabled:\n"); fprintf(stderr, "\nThe following can be enabled:\n");
for (unsigned int i = 0; i < num_available_modi; i++) { for (unsigned int i = 0; i < num_available_modes; i++) {
gboolean active = FALSE; gboolean active = FALSE;
for (unsigned int j = 0; j < num_modi; j++) { for (unsigned int j = 0; j < num_modes; j++) {
if (modi[j] == available_modi[i]) { if (modes[j] == available_modes[i]) {
active = TRUE; active = TRUE;
break; break;
} }
} }
if (!active) { if (!active) {
fprintf(stderr, " * %s%s%s\n", is_term ? color_red : "", fprintf(stderr, " * %s%s%s\n", is_term ? color_red : "",
available_modi[i]->name, is_term ? color_reset : ""); available_modes[i]->name, is_term ? color_reset : "");
} }
} }
fprintf(stderr, fprintf(stderr,
"\nTo activate a mode, add it to the list of modi in the %smodi%s " "\nTo activate a mode, add it to the list of modes in the %smodes%s "
"setting.\n", "setting.\n",
is_term ? color_green : "", is_term ? color_reset : ""); is_term ? color_green : "", is_term ? color_reset : "");
} }
@ -450,8 +450,8 @@ static void help_print_no_arguments(void) {
* Cleanup globally allocated memory. * Cleanup globally allocated memory.
*/ */
static void cleanup(void) { static void cleanup(void) {
for (unsigned int i = 0; i < num_modi; i++) { for (unsigned int i = 0; i < num_modes; i++) {
mode_destroy(modi[i]); mode_destroy(modes[i]);
} }
rofi_view_workers_finalize(); rofi_view_workers_finalize();
if (main_loop != NULL) { if (main_loop != NULL) {
@ -465,7 +465,7 @@ static void cleanup(void) {
// Cleaning up memory allocated by the Xresources file. // Cleaning up memory allocated by the Xresources file.
config_xresource_free(); config_xresource_free();
g_free(modi); g_free(modes);
g_free(config_path); g_free(config_path);
@ -476,7 +476,7 @@ static void cleanup(void) {
rofi_theme = NULL; rofi_theme = NULL;
} }
TIMINGS_STOP(); TIMINGS_STOP();
rofi_collect_modi_destroy(); rofi_collectmodes_destroy();
rofi_icon_fetcher_destroy(); rofi_icon_fetcher_destroy();
rofi_theme_free_parsed_files(); rofi_theme_free_parsed_files();
@ -487,13 +487,13 @@ static void cleanup(void) {
} }
/** /**
* Collected modi * Collected modes
*/ */
Mode *rofi_collect_modi_search(const char *name) { Mode *rofi_collect_modes_search(const char *name) {
for (unsigned int i = 0; i < num_available_modi; i++) { for (unsigned int i = 0; i < num_available_modes; i++) {
if (g_strcmp0(name, available_modi[i]->name) == 0) { if (g_strcmp0(name, available_modes[i]->name) == 0) {
return available_modi[i]; return available_modes[i];
} }
} }
return NULL; return NULL;
@ -503,20 +503,20 @@ Mode *rofi_collect_modi_search(const char *name) {
* *
* @returns TRUE when success. * @returns TRUE when success.
*/ */
static gboolean rofi_collect_modi_add(Mode *mode) { static gboolean rofi_collectmodes_add(Mode *mode) {
Mode *m = rofi_collect_modi_search(mode->name); Mode *m = rofi_collect_modes_search(mode->name);
if (m == NULL) { if (m == NULL) {
available_modi = available_modes =
g_realloc(available_modi, sizeof(Mode *) * (num_available_modi + 1)); g_realloc(available_modes, sizeof(Mode *) * (num_available_modes + 1));
// Set mode. // Set mode.
available_modi[num_available_modi] = mode; available_modes[num_available_modes] = mode;
num_available_modi++; num_available_modes++;
return TRUE; return TRUE;
} }
return FALSE; return FALSE;
} }
static void rofi_collect_modi_dir(const char *base_dir) { static void rofi_collectmodes_dir(const char *base_dir) {
g_debug("Looking into: %s for plugins", base_dir); g_debug("Looking into: %s for plugins", base_dir);
GDir *dir = g_dir_open(base_dir, 0, NULL); GDir *dir = g_dir_open(base_dir, 0, NULL);
if (dir) { if (dir) {
@ -539,7 +539,7 @@ static void rofi_collect_modi_dir(const char *base_dir) {
g_module_close(mod); g_module_close(mod);
} else { } else {
m->module = mod; m->module = mod;
if (!rofi_collect_modi_add(m)) { if (!rofi_collectmodes_add(m)) {
g_module_close(mod); g_module_close(mod);
} }
} }
@ -558,32 +558,32 @@ static void rofi_collect_modi_dir(const char *base_dir) {
} }
/** /**
* Find all available modi. * Find all available modes.
*/ */
static void rofi_collect_modi(void) { static void rofi_collect_modes(void) {
#ifdef WINDOW_MODE #ifdef WINDOW_MODE
rofi_collect_modi_add(&window_mode); rofi_collectmodes_add(&window_mode);
rofi_collect_modi_add(&window_mode_cd); rofi_collectmodes_add(&window_mode_cd);
#endif #endif
rofi_collect_modi_add(&run_mode); rofi_collectmodes_add(&run_mode);
rofi_collect_modi_add(&ssh_mode); rofi_collectmodes_add(&ssh_mode);
#ifdef ENABLE_DRUN #ifdef ENABLE_DRUN
rofi_collect_modi_add(&drun_mode); rofi_collectmodes_add(&drun_mode);
#endif #endif
rofi_collect_modi_add(&combi_mode); rofi_collectmodes_add(&combi_mode);
rofi_collect_modi_add(&help_keys_mode); rofi_collectmodes_add(&help_keys_mode);
rofi_collect_modi_add(&file_browser_mode); rofi_collectmodes_add(&file_browser_mode);
if (find_arg("-no-plugins") < 0) { if (find_arg("-no-plugins") < 0) {
find_arg_str("-plugin-path", &(config.plugin_path)); find_arg_str("-plugin-path", &(config.plugin_path));
g_debug("Parse plugin path: %s", config.plugin_path); g_debug("Parse plugin path: %s", config.plugin_path);
rofi_collect_modi_dir(config.plugin_path); rofi_collectmodes_dir(config.plugin_path);
/* ROFI_PLUGIN_PATH */ /* ROFI_PLUGIN_PATH */
const char *path = g_getenv("ROFI_PLUGIN_PATH"); const char *path = g_getenv("ROFI_PLUGIN_PATH");
if (path != NULL) { if (path != NULL) {
gchar **paths = g_strsplit(path, ":", -1); gchar **paths = g_strsplit(path, ":", -1);
for (unsigned int i = 0; paths[i]; i++) { for (unsigned int i = 0; paths[i]; i++) {
rofi_collect_modi_dir(paths[i]); rofi_collectmodes_dir(paths[i]);
} }
g_strfreev(paths); g_strfreev(paths);
} }
@ -593,61 +593,61 @@ static void rofi_collect_modi(void) {
/** /**
* Setup configuration for config. * Setup configuration for config.
*/ */
static void rofi_collect_modi_setup(void) { static void rofi_collectmodes_setup(void) {
for (unsigned int i = 0; i < num_available_modi; i++) { for (unsigned int i = 0; i < num_available_modes; i++) {
mode_set_config(available_modi[i]); mode_set_config(available_modes[i]);
} }
} }
static void rofi_collect_modi_destroy(void) { static void rofi_collectmodes_destroy(void) {
for (unsigned int i = 0; i < num_available_modi; i++) { for (unsigned int i = 0; i < num_available_modes; i++) {
if (available_modi[i]->module) { if (available_modes[i]->module) {
GModule *mod = available_modi[i]->module; GModule *mod = available_modes[i]->module;
available_modi[i] = NULL; available_modes[i] = NULL;
g_module_close(mod); g_module_close(mod);
} }
if (available_modi[i]) { if (available_modes[i]) {
mode_free(&(available_modi[i])); mode_free(&(available_modes[i]));
} }
} }
g_free(available_modi); g_free(available_modes);
available_modi = NULL; available_modes = NULL;
num_available_modi = 0; num_available_modes = 0;
} }
/** /**
* Parse the mode string, into internal array of type Mode. * Parse the mode string, into internal array of type Mode.
* *
* String is split on separator ',' * String is split on separator ','
* First the three build-in modi are checked: window, run, ssh * First the three build-in modes are checked: window, run, ssh
* if that fails, a script-mode is created. * if that fails, a script-mode is created.
*/ */
static int add_mode(const char *token) { static int add_mode(const char *token) {
unsigned int index = num_modi; unsigned int index = num_modes;
// Resize and add entry. // Resize and add entry.
modi = (Mode **)g_realloc(modi, sizeof(Mode *) * (num_modi + 1)); modes = (Mode **)g_realloc(modes, sizeof(Mode *) * (num_modes + 1));
Mode *mode = rofi_collect_modi_search(token); Mode *mode = rofi_collect_modes_search(token);
if (mode) { if (mode) {
modi[num_modi] = mode; modes[num_modes] = mode;
num_modi++; num_modes++;
} else if (script_mode_is_valid(token)) { } else if (script_mode_is_valid(token)) {
// If not build in, use custom modi. // If not build in, use custom mode.
Mode *sw = script_mode_parse_setup(token); Mode *sw = script_mode_parse_setup(token);
if (sw != NULL) { if (sw != NULL) {
// Add to available list, so combi can find it. // Add to available list, so combi can find it.
rofi_collect_modi_add(sw); rofi_collectmodes_add(sw);
mode_set_config(sw); mode_set_config(sw);
modi[num_modi] = sw; modes[num_modes] = sw;
num_modi++; num_modes++;
} }
} }
return (index == num_modi) ? -1 : (int)index; return (index == num_modes) ? -1 : (int)index;
} }
static gboolean setup_modi(void) { static gboolean setup_modes(void) {
const char *const sep = ",#"; const char *const sep = ",#";
char *savept = NULL; char *savept = NULL;
// Make a copy, as strtok will modify it. // Make a copy, as strtok will modify it.
char *mode_str = g_strdup(config.modi); char *mode_str = g_strdup(config.modes);
// Split token on ','. This modifies mode_str. // Split token on ','. This modifies mode_str.
for (char *token = strtok_r(mode_str, sep, &savept); token != NULL; for (char *token = strtok_r(mode_str, sep, &savept); token != NULL;
token = strtok_r(NULL, sep, &savept)) { token = strtok_r(NULL, sep, &savept)) {
@ -750,7 +750,7 @@ static gboolean startup(G_GNUC_UNUSED gpointer data) {
show_error_dialog(); show_error_dialog();
return G_SOURCE_REMOVE; return G_SOURCE_REMOVE;
} }
} else if (find_arg("-show") >= 0 && num_modi > 0) { } else if (find_arg("-show") >= 0 && num_modes > 0) {
run_mode_index(0); run_mode_index(0);
} else { } else {
help_print_no_arguments(); help_print_no_arguments();
@ -885,10 +885,10 @@ int main(int argc, char *argv[]) {
} }
TICK_N("Setup Locale"); TICK_N("Setup Locale");
rofi_collect_modi(); rofi_collect_modes();
TICK_N("Collect MODI"); TICK_N("Collect MODES");
rofi_collect_modi_setup(); rofi_collectmodes_setup();
TICK_N("Setup MODI"); TICK_N("Setup MODES");
main_loop = g_main_loop_new(NULL, FALSE); main_loop = g_main_loop_new(NULL, FALSE);
@ -978,12 +978,12 @@ int main(int argc, char *argv[]) {
/** dirty hack for dmenu compatibility */ /** dirty hack for dmenu compatibility */
char *windowid = NULL; char *windowid = NULL;
if (!dmenu_mode) { if (!dmenu_mode) {
// setup_modi // setup_modes
if (setup_modi()) { if (setup_modes()) {
cleanup(); cleanup();
return EXIT_FAILURE; return EXIT_FAILURE;
} }
TICK_N("Setup Modi"); TICK_N("Setup Modes");
} else { } else {
// Hack for dmenu compatibility. // Hack for dmenu compatibility.
if (find_arg_str("-w", &windowid) == TRUE) { if (find_arg_str("-w", &windowid) == TRUE) {

View file

@ -582,8 +582,8 @@ void rofi_view_free(RofiViewState *state) {
g_free(state->distance); g_free(state->distance);
// Free the switcher boxes. // Free the switcher boxes.
// When state is free'ed we should no longer need these. // When state is free'ed we should no longer need these.
g_free(state->modi); g_free(state->modes);
state->num_modi = 0; state->num_modes = 0;
g_free(state); g_free(state);
} }
@ -1729,17 +1729,17 @@ static WidgetTriggerActionResult textbox_button_trigger_action(
} }
return WIDGET_TRIGGER_ACTION_RESULT_IGNORED; return WIDGET_TRIGGER_ACTION_RESULT_IGNORED;
} }
static WidgetTriggerActionResult textbox_sidebar_modi_trigger_action( static WidgetTriggerActionResult textbox_sidebar_modes_trigger_action(
widget *wid, MouseBindingMouseDefaultAction action, G_GNUC_UNUSED gint x, widget *wid, MouseBindingMouseDefaultAction action, G_GNUC_UNUSED gint x,
G_GNUC_UNUSED gint y, G_GNUC_UNUSED void *user_data) { G_GNUC_UNUSED gint y, G_GNUC_UNUSED void *user_data) {
RofiViewState *state = (RofiViewState *)user_data; RofiViewState *state = (RofiViewState *)user_data;
unsigned int i; unsigned int i;
for (i = 0; i < state->num_modi; i++) { for (i = 0; i < state->num_modes; i++) {
if (WIDGET(state->modi[i]) == wid) { if (WIDGET(state->modes[i]) == wid) {
break; break;
} }
} }
if (i == state->num_modi) { if (i == state->num_modes) {
return WIDGET_TRIGGER_ACTION_RESULT_IGNORED; return WIDGET_TRIGGER_ACTION_RESULT_IGNORED;
} }
@ -1907,17 +1907,17 @@ static void rofi_view_add_widget(RofiViewState *state, widget *parent_widget,
state->sidebar_bar = state->sidebar_bar =
box_create(parent_widget, name, ROFI_ORIENTATION_HORIZONTAL); box_create(parent_widget, name, ROFI_ORIENTATION_HORIZONTAL);
box_add((box *)parent_widget, WIDGET(state->sidebar_bar), FALSE); box_add((box *)parent_widget, WIDGET(state->sidebar_bar), FALSE);
state->num_modi = rofi_get_num_enabled_modi(); state->num_modes = rofi_get_num_enabled_modes();
state->modi = g_malloc0(state->num_modi * sizeof(textbox *)); state->modes = g_malloc0(state->num_modes * sizeof(textbox *));
for (unsigned int j = 0; j < state->num_modi; j++) { for (unsigned int j = 0; j < state->num_modes; j++) {
const Mode *mode = rofi_get_mode(j); const Mode *mode = rofi_get_mode(j);
state->modi[j] = textbox_create( state->modes[j] = textbox_create(
WIDGET(state->sidebar_bar), WIDGET_TYPE_MODE_SWITCHER, "button", WIDGET(state->sidebar_bar), WIDGET_TYPE_MODE_SWITCHER, "button",
TB_AUTOHEIGHT, (mode == state->sw) ? HIGHLIGHT : NORMAL, TB_AUTOHEIGHT, (mode == state->sw) ? HIGHLIGHT : NORMAL,
mode_get_display_name(mode), 0.5, 0.5); mode_get_display_name(mode), 0.5, 0.5);
box_add(state->sidebar_bar, WIDGET(state->modi[j]), TRUE); box_add(state->sidebar_bar, WIDGET(state->modes[j]), TRUE);
widget_set_trigger_action_handler( widget_set_trigger_action_handler(
WIDGET(state->modi[j]), textbox_sidebar_modi_trigger_action, state); WIDGET(state->modes[j]), textbox_sidebar_modes_trigger_action, state);
} }
} else if (g_ascii_strcasecmp(name, "overlay") == 0) { } else if (g_ascii_strcasecmp(name, "overlay") == 0) {
state->overlay = textbox_create( state->overlay = textbox_create(
@ -2241,9 +2241,10 @@ void rofi_view_switch_mode(RofiViewState *state, Mode *mode) {
rofi_view_set_window_title("rofi"); rofi_view_set_window_title("rofi");
} }
if (state->sidebar_bar) { if (state->sidebar_bar) {
for (unsigned int j = 0; j < state->num_modi; j++) { for (unsigned int j = 0; j < state->num_modes; j++) {
const Mode *tb_mode = rofi_get_mode(j); const Mode *tb_mode = rofi_get_mode(j);
textbox_font(state->modi[j], (tb_mode == state->sw) ? HIGHLIGHT : NORMAL); textbox_font(state->modes[j],
(tb_mode == state->sw) ? HIGHLIGHT : NORMAL);
} }
} }
rofi_view_restart(state); rofi_view_restart(state);

View file

@ -76,12 +76,18 @@ typedef struct {
* Currently supports string, boolean and number (signed and unsigned). * Currently supports string, boolean and number (signed and unsigned).
*/ */
static XrmOption xrmOptions[] = { static XrmOption xrmOptions[] = {
{xrm_String, "switchers", {.str = &config.modi}, NULL, "", CONFIG_DEFAULT}, {xrm_String, "switchers", {.str = &config.modes}, NULL, "", CONFIG_DEFAULT},
{xrm_String,
"modes",
{.str = &config.modes},
NULL,
"Enable modes",
CONFIG_DEFAULT},
{xrm_String, {xrm_String,
"modi", "modi",
{.str = &config.modi}, {.str = &config.modes},
NULL, NULL,
"Enabled modi", "Enabled modes",
CONFIG_DEFAULT}, CONFIG_DEFAULT},
{xrm_String, {xrm_String,
"font", "font",
@ -282,7 +288,13 @@ static XrmOption xrmOptions[] = {
CONFIG_DEFAULT}, CONFIG_DEFAULT},
{xrm_String, {xrm_String,
"combi-modi", "combi-modi",
{.str = &config.combi_modi}, {.str = &config.combi_modes},
NULL,
"Set the modi to combine in combi mode",
CONFIG_DEFAULT},
{xrm_String,
"combi-modes",
{.str = &config.combi_modes},
NULL, NULL,
"Set the modi to combine in combi mode", "Set the modi to combine in combi mode",
CONFIG_DEFAULT}, CONFIG_DEFAULT},