Full Code of davatorium/rofi for AI

next 92f19220ddbd cached
299 files
2.9 MB
773.7k tokens
1352 symbols
1 requests
Download .txt
Showing preview only (3,087K chars total). Download the full file or copy to clipboard to get everything.
Repository: davatorium/rofi
Branch: next
Commit: 92f19220ddbd
Files: 299
Total size: 2.9 MB

Directory structure:
gitextract__m24situ/

├── .build.yml
├── .clang-tidy
├── .gitattributes
├── .github/
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   ├── documentation_report.yml
│   │   └── feature_request.yml
│   ├── actions/
│   │   ├── doxycheck/
│   │   │   └── action.yml
│   │   ├── meson/
│   │   │   └── action.yml
│   │   ├── release/
│   │   │   └── action.yml
│   │   └── setup/
│   │       └── action.yml
│   ├── pull_request_template.md
│   └── workflows/
│       ├── build.yml
│       ├── codeql.yml
│       ├── lock.yml
│       ├── main.yml
│       ├── mkdocs.yml
│       └── publish-release.yml
├── .gitignore
├── .gitlab-ci.yml
├── .gitmodules
├── .mailmap
├── AUTHORS
├── CODE_OF_CONDUCT.md
├── CONFIG.md
├── COPYING
├── Changelog
├── Examples/
│   ├── i3_empty_workspace.sh
│   ├── i3_switch_workspaces.sh
│   ├── rofi-file-browser.sh
│   ├── test_script_env.sh
│   ├── test_script_mode.sh
│   ├── test_script_mode_color.sh
│   └── test_script_mode_delim.sh
├── INSTALL.md
├── README.md
├── config/
│   └── config.c
├── data/
│   ├── rofi-theme-selector.desktop
│   └── rofi.desktop
├── doc/
│   ├── README.md
│   ├── default_configuration.rasi
│   ├── default_theme.rasi
│   ├── man_filter.lua
│   ├── meson.build
│   ├── rofi-actions.5.markdown
│   ├── rofi-debugging.5.markdown
│   ├── rofi-dmenu.5.markdown
│   ├── rofi-keys.5.markdown
│   ├── rofi-script.5.markdown
│   ├── rofi-sensible-terminal.1.markdown
│   ├── rofi-theme-selector.1.markdown
│   ├── rofi-theme.5.markdown
│   ├── rofi-thumbnails.5.markdown
│   ├── rofi.1.markdown
│   └── rofi.doxy.in
├── include/
│   ├── css-colors.h
│   ├── display-internal.h
│   ├── display.h
│   ├── helper-theme.h
│   ├── helper.h
│   ├── history.h
│   ├── input-codes.h
│   ├── keyb.h
│   ├── mode-private.h
│   ├── mode.h
│   ├── modes/
│   │   ├── combi.h
│   │   ├── dmenu.h
│   │   ├── dmenuscriptshared.h
│   │   ├── drun.h
│   │   ├── filebrowser.h
│   │   ├── help-keys.h
│   │   ├── modes.h
│   │   ├── recursivebrowser.h
│   │   ├── run.h
│   │   ├── script.h
│   │   ├── ssh.h
│   │   ├── wayland-window.h
│   │   └── window.h
│   ├── rofi-icon-fetcher.h
│   ├── rofi-types.h
│   ├── rofi.h
│   ├── settings.h
│   ├── theme.h
│   ├── timings.h
│   ├── view-internal.h
│   ├── view.h
│   ├── wayland-internal.h
│   ├── wayland.h
│   ├── widgets/
│   │   ├── box.h
│   │   ├── container.h
│   │   ├── icon.h
│   │   ├── listview.h
│   │   ├── scrollbar.h
│   │   ├── textbox.h
│   │   ├── widget-internal.h
│   │   └── widget.h
│   ├── xcb-dummy.h
│   ├── xcb-internal.h
│   ├── xcb.h
│   └── xrmoptions.h
├── lexer/
│   ├── theme-lexer.l
│   └── theme-parser.y
├── meson-dist-script
├── meson.build
├── meson_options.txt
├── mkdocs/
│   ├── docs/
│   │   ├── 1.7.0/
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.1/
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.2/
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.3/
│   │   │   ├── rofi-debugging.5.markdown
│   │   │   ├── rofi-dmenu.5.markdown
│   │   │   ├── rofi-keys.5.markdown
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.4/
│   │   │   ├── rofi-debugging.5.markdown
│   │   │   ├── rofi-dmenu.5.markdown
│   │   │   ├── rofi-keys.5.markdown
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.5/
│   │   │   ├── rofi-debugging.5.markdown
│   │   │   ├── rofi-dmenu.5.markdown
│   │   │   ├── rofi-keys.5.markdown
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.6/
│   │   │   ├── rofi-debugging.5.markdown
│   │   │   ├── rofi-dmenu.5.markdown
│   │   │   ├── rofi-keys.5.markdown
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-sensible-terminal.1.markdown
│   │   │   ├── rofi-theme-selector.1.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   ├── rofi-thumbnails.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.7/
│   │   │   ├── rofi-debugging.5.markdown
│   │   │   ├── rofi-dmenu.5.markdown
│   │   │   ├── rofi-keys.5.markdown
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-sensible-terminal.1.markdown
│   │   │   ├── rofi-theme-selector.1.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   ├── rofi-thumbnails.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.8/
│   │   │   ├── rofi-debugging.5.markdown
│   │   │   ├── rofi-dmenu.5.markdown
│   │   │   ├── rofi-keys.5.markdown
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-sensible-terminal.1.markdown
│   │   │   ├── rofi-theme-selector.1.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   ├── rofi-thumbnails.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.9/
│   │   │   ├── rofi-actions.5.markdown
│   │   │   ├── rofi-debugging.5.markdown
│   │   │   ├── rofi-dmenu.5.markdown
│   │   │   ├── rofi-keys.5.markdown
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   ├── rofi-thumbnails.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 2.0.0/
│   │   │   ├── rofi-actions.5.markdown
│   │   │   ├── rofi-debugging.5.markdown
│   │   │   ├── rofi-dmenu.5.markdown
│   │   │   ├── rofi-keys.5.markdown
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-sensible-terminal.1.markdown
│   │   │   ├── rofi-theme-selector.1.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   ├── rofi-thumbnails.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── downloads.md
│   │   ├── guides/
│   │   │   ├── DynamicThemes/
│   │   │   │   └── dynamic_themes.md
│   │   │   ├── Plugins/
│   │   │   │   └── 2017-04-19-rofi-140-sneak-preview-plugins.md
│   │   │   ├── Positioning/
│   │   │   │   └── theme3-positioning.markdown
│   │   │   └── Transparency/
│   │   │       └── theme3-transparency.markdown
│   │   ├── index.md
│   │   └── themes/
│   │       ├── capture.sh
│   │       └── themes.md
│   └── mkdocs.yml
├── pkgconfig/
│   └── rofi.pc.in
├── protocols/
│   ├── wlr-foreign-toplevel-management-unstable-v1.xml
│   └── wlr-layer-shell-unstable-v1.xml
├── releasenotes/
│   ├── 0.15.12/
│   │   └── release-0.15.12.markdown
│   ├── 1.0.0/
│   │   └── release-1.0.0.markdown
│   ├── 1.1.0/
│   │   └── release-1.1.0.markdown
│   ├── 1.2.0/
│   │   └── release-1.2.0.markdown
│   ├── 1.3.0/
│   │   └── release-1.3.0.markdown
│   ├── 1.3.1/
│   │   └── release-1.3.1.markdown
│   ├── 1.4.0/
│   │   └── release-1.4.0.markdown
│   ├── 1.5.0/
│   │   └── release-1.5.0.markdown
│   ├── 1.5.2/
│   │   └── release-1.5.2.markdown
│   ├── 1.5.3/
│   │   └── release-1.5.3.markdown
│   ├── 1.6.0/
│   │   └── release-1.6.0.markdown
│   ├── 1.6.1/
│   │   └── release-1.6.1.markdown
│   ├── 1.7.0/
│   │   └── release-1.7.0.markdown
│   ├── 1.7.1/
│   │   └── release-1.7.1.markdown
│   ├── 1.7.2/
│   │   └── release-1.7.2.markdown
│   ├── 1.7.3/
│   │   └── release-1.7.3.markdown
│   ├── 1.7.4/
│   │   └── release-1.7.4.markdown
│   ├── 1.7.5/
│   │   └── release-1.7.5.markdown
│   ├── 1.7.6/
│   │   └── release-1.7.6.markdown
│   ├── 1.7.7/
│   │   └── release-1.7.7.markdown
│   ├── 1.7.8/
│   │   └── release-1.7.8.markdown
│   ├── 1.7.9/
│   │   └── release-1.7.9.markdown
│   └── 2.0.0/
│       └── release-2.0.0.markdown
├── resources/
│   └── resources.xml
├── script/
│   ├── get_git_rev.sh
│   ├── rofi-sensible-terminal
│   └── rofi-theme-selector
├── source/
│   ├── css-colors.c
│   ├── display.c
│   ├── helper.c
│   ├── history.c
│   ├── keyb.c
│   ├── mode.c
│   ├── modes/
│   │   ├── combi.c
│   │   ├── dmenu.c
│   │   ├── drun.c
│   │   ├── filebrowser.c
│   │   ├── help-keys.c
│   │   ├── recursivebrowser.c
│   │   ├── run.c
│   │   ├── script.c
│   │   ├── ssh.c
│   │   ├── wayland-window.c
│   │   └── window.c
│   ├── rofi-icon-fetcher.c
│   ├── rofi-types.c
│   ├── rofi.c
│   ├── theme.c
│   ├── timings.c
│   ├── view.c
│   ├── wayland/
│   │   ├── display.c
│   │   └── view.c
│   ├── widgets/
│   │   ├── box.c
│   │   ├── container.c
│   │   ├── icon.c
│   │   ├── listview.c
│   │   ├── scrollbar.c
│   │   ├── textbox.c
│   │   └── widget.c
│   ├── xcb/
│   │   ├── display.c
│   │   └── view.c
│   └── xrmoptions.c
├── test/
│   ├── box-test.c
│   ├── helper-config-cmdline-parser.c
│   ├── helper-expand.c
│   ├── helper-pidfile.c
│   ├── helper-test.c
│   ├── helper-tokenize.c
│   ├── history-test.c
│   ├── mode-test.c
│   ├── scrollbar-test.c
│   ├── textbox-test.c
│   ├── theme-parser-test.c
│   └── widget-test.c
└── themes/
    ├── Adapta-Nokto.rasi
    ├── Arc-Dark.rasi
    ├── Arc.rasi
    ├── DarkBlue.rasi
    ├── Indego.rasi
    ├── Monokai.rasi
    ├── Paper.rasi
    ├── android_notification.rasi
    ├── arthur.rasi
    ├── blue.rasi
    ├── breaking-themes/
    │   ├── 2076.rasi
    │   └── readme.md
    ├── c64.rasi
    ├── dmenu.rasi
    ├── docu.rasi
    ├── fancy.rasi
    ├── fancy2.rasi
    ├── fullscreen-preview.rasi
    ├── glue_pro_blue.rasi
    ├── gruvbox-common.rasinc
    ├── gruvbox-dark-hard.rasi
    ├── gruvbox-dark-soft.rasi
    ├── gruvbox-dark.rasi
    ├── gruvbox-light-hard.rasi
    ├── gruvbox-light-soft.rasi
    ├── gruvbox-light.rasi
    ├── iggy.rasi
    ├── lb.rasi
    ├── material.rasi
    ├── paper-float.rasi
    ├── purple.rasi
    ├── sidebar-v2.rasi
    ├── sidebar.rasi
    ├── solarized.rasi
    └── solarized_alternate.rasi

================================================
FILE CONTENTS
================================================

================================================
FILE: .build.yml
================================================
image: ubuntu/lts
packages:
  - meson
  - ninja-build
  - autoconf
  - automake
  - build-essential
  - libpango1.0-dev
  - libstartup-notification0-dev
  - libxcb-ewmh-dev
  - libxcb-icccm4-dev
  - libxcb-randr0-dev
  - libxcb-util0-dev
  - libxcb-xinerama0-dev
  - libxcb-xkb-dev
  - libxcb-xrm-dev
  - libxcb-cursor-dev
  - libxcb-imdkit-dev
  - libxcb-keysyms1
  - libxkbcommon-dev
  - libxkbcommon-dev
  - libxkbcommon-x11-dev
  - libgdk-pixbuf2.0-dev
  - ninja-build
  - pandoc
  - check
  - flex
  - bison
  - libglib2.0-dev-bin
  - doxygen
sources:
  - https://sr.ht/~qball/rofi/
tasks:
  - setup: |
     cd rofi
     meson setup builddir . -Db_lto=true
  - build: |
     ninja -C rofi/builddir
  - test: |
     ninja -C rofi/builddir test
  - doxygen: |
     ninja -C rofi/builddir/ doc/html > doxygen.log 2>&1
     if [ $(grep -c warnings doxygen.log) -gt 0 ]; then exit 1; fi 
  - dist: |
     ninja -C rofi/builddir dist
artifacts:
  - rofi/builddir/meson-dist/rofi-1.7.8-dev.tar.xz


================================================
FILE: .clang-tidy
================================================
Checks: -clang-analyzer-optin.core.EnumCastOutOfRange


================================================
FILE: .gitattributes
================================================
.build.yml export-ignore
.gitattributes export-ignore
.gitignore export-ignore
.mailmap export-ignore
.github export-ignore
.gitlab-ci.yml export-ignore
.gitmodules export-ignore
.travis.yml export-ignore
releasenotes export-ignore
doc/*.png export-ignore
doc/help-output.txt export-ignore
doc/sizing.svg export-ignore
doc/Notes export-ignore
doc/old-theme-convert-output.rasi export-ignore
doc/test_xr.txt export-ignore
doc/create_screenshot.sh export-ignore
mkdocs export-ignore
script/*.jpg export-ignore


================================================
FILE: .github/CONTRIBUTING.md
================================================
When reporting bugs keep in mind that the people working on it do this unpaid,
in their free time and as a hobby. So be polite and helpful. Reports that
demand, contain insults to this or other projects, or have a general unfriendly
tone will be closed without discussion. Everybody has it own way of working;
What might be the norm for you, might not be for others. Therefore be verbose in
your description.

**The issue tracker is for bugs only.**

This is an attempt to keep the issue tracker clean and searchable.

Questions or discussions about new features belong on
[GITHUB Discussions](https://github.com/davatorium/rofi/discussions) or
[FORUM](https://reddit.com/r/qtools/),
[IRC](https://webchat.freenode.net/?channels=#rofi), frequently asked questions
will be added to the [F.A.Q](https://github.com/DaveDavenport/rofi/wiki#faq) on
the [wiki](https://github.com/DaveDavenport/rofi/wiki).

Questions filled in on the bug tracker will be marked `question`, locked and
closed.

It is preferred to have feature requests discussed via
[GITHUB Discussions](https://github.com/davatorium/rofi/discussions) or
[FORUM](https://reddit.com/r/qtools/) or
[IRC](https://webchat.freenode.net/?channels=#rofi) first.

# Creating a bug report

Please write your bug reports in clear English.

Before creating a bug report:

* Update to the latest version. Check if problem still exists.
* Check existing bug reports, see if it is already reported.
* Read the documentation. Make sure the behaviour you are seeing is a bug.

When reporting bugs include the following information:

* Rofi version. rofi -v
* Rofi configuration. rofi -help (in a [gist](https://gist.github.com/))
* Steps to reproduce.
* What behaviour you see.
* What behaviour you expect to see.
* A proper title for others to search for.
* Be exact.

When adding comments to an issue make sure:

* It is relevant to the issue.
* It contributes to solving the issue.
* Use :+1: :-1: emojis instead of replying 'me too' or 'I also have this.'
* Do **NOT** ask for an update. Asking does not contribute to solving the issue
  and just annoys people with a notification. The answer is already available;
  if there is an update it will be linked/mentioned in the issue, otherwise
  there is no update.

Issue high-jacking, e.g. adding a request/issue to an existing issue, is very
disruptive.
Please create a new issue, if it is similar it will be marked duplicate.

# Creating a feature request

Before creating a feature request:

* First check the *next* branch, to see if the feature has already been
  implemented.
* Check existing reports, see if it is already requested.

When reporting a feature request include the following information:

* Rofi version and other information. (rofi -info)
* A clear description of the feature you want added.
* A use-case for the feature.

If possible try to explain how you would expect to use feature.
For example, should it be a configuration option or a hot-key.

Requesting a feature is no guarantee it will be added.


================================================
FILE: .github/ISSUE_TEMPLATE/bug_report.yml
================================================
name: Bug Report
description: Report a problem in Rofi
labels: [bug]
title: "[BUG] "
body:
  - type: markdown
    attributes:
      value: |
        First read the
        [guidelines](https://github.com/DaveDavenport/rofi/blob/next/.github/CONTRIBUTING.md)!
        This is not optional for any report. People must be able to understand
        the full context of the report when reading it, at any time.

        If you feel like you “it is simple and requires no explanation”, please
        consider you’re wrong and still fill the full report. What is clear to
        you might not be clear to somebody else. 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 past the checks or in general
        completely ignore the guidelines, the issue will be closed and locked
        as spam. This includes filling in 'Distro X defaults', we don't know
        and cannot keep track of what each distribution ships as a default.

        If you are unsure, please use the
        [discussion](https://github.com/davatorium/rofi/discussions) forum
        first. It is easy to upgrade a question to an issue in github.

        If you report problems with speed in rofi, please attach a [timing
        trace](https://github.com/davatorium/rofi/blob/next/doc/rofi-debugging.5.markdown#timing-traces).

        If you have a problem that only occurs when launching rofi from a keybinding.
        First check that the environment the keybinding passes to rofi is correct.

  - type: input
    attributes:
      label: "Rofi version (rofi -v or git commit in case of build issue)"
      placeholder: "Version: 1.7.5"
    validations:
      required: true
  - type: input
    attributes:
      label: "Configuration"
      description: |
        Please use https://gist.github.com and include output of `rofi -info` and `rofi -dump-config`.
        Anything that is not a link to valid output, will not be accepted.
      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`.
        Anything that is not a link to valid output, will not be accepted.
      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.
      placeholder: "Gist URL"
    validations:
      required: false
  - type: input
    attributes:
      label: "Launch command"
      placeholder: "rofi -show drun"
    validations:
      required: true

  - type: textarea
    attributes:
      label: "Step to reproduce"
      placeholder: |
        * Step 1
        * Step 2
        * ...
    validations:
      required: true

  - type: textarea
    attributes:
      label: "Expected behavior"
      description: "Describe the behavior you expect. May include logs, images, or videos."
    validations:
      required: true
  - type: textarea
    attributes:
      label: "Actual behavior"
    validations:
      required: true
  - type: textarea
    attributes:
      label: "Additional information"
    validations:
      required: false
  - type: checkboxes
    id: latestversion
    attributes:
      label: I've checked if the issue exists in the latest stable release
      description: I confirm that I verified the issue still exists in the latest stable release.
      options:
        - label: "Yes, I have checked the problem exists in the latest stable version"
          required: false


================================================
FILE: .github/ISSUE_TEMPLATE/config.yml
================================================
blank_issues_enabled: false
contact_links:
  - name: discussion forum
    url: https://github.com/davatorium/rofi/discussions
    about: Please ask and answer questions here.
  - name: Rofi IRC channel
    url: https://web.libera.chat/?channels=#rofi
    about: Please ask and answer question in real time here.


================================================
FILE: .github/ISSUE_TEMPLATE/documentation_report.yml
================================================
name: Documentation Bug Report
description: Report a problem in Rofi Documentation
labels: [Documentation]
title: "[Doc] "
body:

  - type: markdown
    attributes:
      value: |
        First read the
        [guidelines](https://github.com/DaveDavenport/rofi/blob/next/.github/CONTRIBUTING.md)!
        This is not optional for any report. People must be able to understand
        the full context of the report when reading it, at any time.

        If you feel like you “it is simple and requires no explanation”, please
        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
        checks or in general completely ignore the guidelines, the issue will
        be closed and locked as spam.

        If you are unsure, please use the
        [discussion](https://github.com/davatorium/rofi/discussions) forum
        first. It is easy to upgrade a question to an issue in github.

        **Please do not submit reports related to wayland, see
        [here](https://github.com/DaveDavenport/rofi/wiki/Wayland) for more
        information.**

  - type: input
    attributes:
      label: "Rofi version (rofi -v)"
      placeholder: "Version: 1.7.5"
    validations:
      required: true
  - type: input
    attributes:
      label: "URL"
      description: "Please provide a link to the relevant documentation."
      placeholder: "link to page on https://davatorium.github.io/rofi/ or file on https://github.com/davatorium/rofi/"
    validations:
      required: true

  - type: textarea
    attributes:
      label: "Explain the issue with the documentation, please be verbose."
      placeholder: |
        * What am I trying to achieve
        ..
        * What instructions are unclear, wrong or missing
        ..
        * Suggestions for improving the current documentation
        ..
    validations:
      required: true
  - type: textarea
    attributes:
      label: "Optional fixed text"
      description: "Suggested new and or improved text for documentation."
    validations:
      required: false
  - type: checkboxes
    id: wayland
    attributes:
      label: Using wayland display server protocol
      description: I have checked and confirm that my issue is not related to running rofi using wayland as display server protocol. See [here](https://github.com/DaveDavenport/rofi/wiki/Wayland) for more        information.
      options:
        - label: "No, my documentation issue is not about running rofi using the wayland display server protocol"
          required: true
  - type: checkboxes
    id: latestversion
    attributes:
      label: I've checked if the issue exists in the latest stable release
      description: I confirm that I verified the issue still exists in the latest stable release. 
      options:
        - label: "Yes, I have checked the problem exists in the latest stable version"
          required: false
      




================================================
FILE: .github/ISSUE_TEMPLATE/feature_request.yml
================================================
name: Feature Request
description: It'd be cool if rofi did/had/would...
labels: Feature Request
title: "[REQUEST] "
body:

  - type: markdown
    attributes:
      value: |
        First read the [guidelines](https://github.com/DaveDavenport/rofi/blob/next/.github/CONTRIBUTING.md)! This is not optional for any report/question. People must be able to understand the full context of the report when reading it, at any time.

        If you feel like you “just have a simple question”, please consider you’re wrong and still fill the full report. Any report missing these informations will be labeled as “Incomplete Report - Please follow the guidelines” and may not be answered in a timely fashion.

        If you are unsure, please use the [discussion](https://github.com/davatorium/rofi/discussions) forum first. It is easy to upgrade a question to an issue in github.

        **Requesting a feature is no guarantee it will be added.**

  - type: checkboxes
    id: before-feature-request
    attributes:
      label: Before opening a feature request
      options:
        - label: I checked the *next* branch to see if the feature has already been implemented
          required: true
        - label: I searched existing reports to see if it is already requested.
          required: true
  - type: textarea
    attributes:
      label: "What is the user problem or growth opportunity you want to see solved?"
    validations:
      required: true
  - type: textarea
    attributes:
      label: "How do you know that this problem exists today? Why is this important?"
    validations:
      required: true
  - type: textarea
    attributes:
      label: "Who will benefit from it?"
    validations:
      required: true
  - type: input
    attributes:
      label: "Rofi version (rofi -v)"
      placeholder: "Version: 1.6.0"
    validations:
      required: true
  - type: input
    attributes:
      label: "Configuration & Information"
      description: "Please use https://gist.github.com and include output of `rofi -info`, `rofi -dump-config` and `rofi -dump-theme`."
      placeholder: "Gist URL"
    validations:
      required: true
  - type: textarea
    attributes:
      label: "Additional information"
    validations:
      required: false



================================================
FILE: .github/actions/doxycheck/action.yml
================================================
name: Doxygen Check
description: Checks for Doxygen warnings

runs:
  using: composite
  steps:
    - id: doxy
      run: ninja -C builddir doc/html > builddir/doxygen.log 2>&1
      shell: bash
    - id: check
      run: |
        if [[ "$(grep -c warning: builddir/doxygen.log)" != 0 ]]; then
          echo
          echo Doxygen warnings found:
          grep warning builddir/doxygen.log
          echo

          exit 1
        fi

        python ./doxy-coverage/doxy-coverage.py builddir/doc/html/xml/
      shell: bash


================================================
FILE: .github/actions/meson/action.yml
================================================
name: Meson Build
description: Builds Rofi using Meson

inputs:
  cc:
    description: Compiler to use
    required: true
  xcb:
    description: Enable xcb backend
    default: enabled
  wayland:
    description: Enable wayland backend
    default: enabled

runs:
  using: composite
  steps:
    - id: pip
      run: pip install meson ninja
      shell: bash
    - id: setup
      run: meson setup builddir -Dxcb=${{ inputs.xcb }} -Dwayland=${{ inputs.wayland }}
      shell: bash
      env:
        CC: ${{ inputs.cc }}
    - id: build
      run: ninja -C builddir
      shell: bash
    - id: test
      run: ninja -C builddir test
      shell: bash


================================================
FILE: .github/actions/release/action.yml
================================================
name: Upload dist
description: Create distribution file and upload to release

runs:
  using: composite
  steps:
    - id: dist
      run: meson dist -C builddir --include-subprojects --formats xztar,gztar --no-tests
      shell: bash
    - id: upload
      uses: actions/upload-artifact@v4
      with:
        name: release_tarballs-${{ github.ref_name }}
        path: |
          builddir/meson-dist/*.tar.xz
          builddir/meson-dist/*.tar.gz
    - id: create_release
      uses: softprops/action-gh-release@v2
      with:
        draft: true
        files: |
          builddir/meson-dist/*.tar.xz
          builddir/meson-dist/*.tar.gz


================================================
FILE: .github/actions/setup/action.yml
================================================
name: CI Build Setup
description: Sets up build dependencies

inputs:
  xcb:
    description: Install xcb dependencies
    default: 'true'
  wayland:
    description: Install wayland dependencies
    default: 'true'

runs:
  using: composite
  steps:
    - id: python
      uses: actions/setup-python@v4
      with:
        python-version: '3.x'
    - id: apt
      run: |
        sudo apt-get update
        sudo apt-get install -y \
          discount \
          doxygen \
          fluxbox \
          gdb \
          graphviz \
          jq \
          lcov \
          libpango1.0-dev \
          libxkbcommon-dev \
          libxkbcommon-dev \
          libxkbcommon-x11-dev \
          libgdk-pixbuf-2.0-dev \
          ninja-build \
          pandoc \
          python3-pip \
          python3-setuptools \
          python3-wheel \
          texi2html \
          texinfo \
          xdotool \
          xfonts-base \
          xterm \
          xutils-dev
      shell: bash
    - id: doxy
      run: git clone https://github.com/davatorium/doxy-coverage
      shell: bash
    - id: apt-wayland
      if: ${{ inputs.wayland  == 'true' }}
      run: |
        sudo apt-get install -y \
          libwayland-dev \
          wayland-protocols
      shell: bash
    - id: apt-xcb
      if: ${{ inputs.xcb  == 'true' }}
      run: |
        sudo apt-get install -y \
          libstartup-notification0-dev \
          libxcb-ewmh-dev \
          libxcb-icccm4-dev \
          libxcb-randr0-dev \
          libxcb-util0-dev \
          libxcb-xinerama0-dev \
          libxcb-xkb-dev \
          libxcb-xrm-dev \
          libxcb-cursor-dev \
          libxcb-imdkit-dev
      shell: bash
    - id: check
      run: |
        curl -L https://github.com/libcheck/check/releases/download/0.15.2/check-0.15.2.tar.gz | tar xzf -
        cd check-0.15.2
        ./configure
        make
        sudo make install
        sudo ldconfig
      shell: bash


================================================
FILE: .github/pull_request_template.md
================================================
> Please follow these steps before submitting your PR:
>
> - [ ] This PR targets the `next` branch and not `master`
> - [ ] If your PR is a work in progress, include [WIP] in its title
> - [ ] Its commits' summaries are reasonably descriptive
> - [ ] You've described what this PR addresses below
> - [ ] You've included links to relevant issues, if any with `#issue_num`
> - [ ] You've deleted this template
>
> Thank you for contributing to rofi! <3

Your description here...


================================================
FILE: .github/workflows/build.yml
================================================
name: CI Build

on:
  push:
    branches:
      - next
    paths-ignore:
      - "**.md"
      - "**.markdown"
      - "**.rasi"
  pull_request:
    paths-ignore:
      - "**.md"
      - "**.markdown"
      - "**.rasi"

jobs:
  build-gcc:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive
      - uses: ./.github/actions/setup
      - uses: ./.github/actions/meson
        with:
          cc: gcc
      - uses: ./.github/actions/doxycheck
  build-clang:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive
      - uses: ./.github/actions/setup
      - uses: ./.github/actions/meson
        with:
          cc: clang
  build-gcc-wayland-only:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive
      - uses: ./.github/actions/setup
        with:
          xcb: false
      - uses: ./.github/actions/meson
        with:
          cc: gcc
          xcb: disabled
  build-gcc-xcb-only:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          submodules: recursive
      - uses: ./.github/actions/setup
        with:
          wayland: false
      - uses: ./.github/actions/meson
        with:
          cc: gcc
          wayland: disabled


================================================
FILE: .github/workflows/codeql.yml
================================================
name: "CodeQL"

on:
  push:
    branches: [ 'next', 'master' ]
  pull_request:
    # The branches below must be a subset of the branches above
    branches: [ 'next' ]
  schedule:
    - cron: '59 13 * * 3'

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest
    permissions:
      actions: read
      contents: read
      security-events: write

    strategy:
      fail-fast: false
      matrix:
        language: [ 'cpp' ]
        # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ]
        # Use only 'java' to analyze code written in Java, Kotlin or both
        # Use only 'javascript' to analyze code written in JavaScript, TypeScript or both
        # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support

    steps:
    - name: Checkout repository
      uses: actions/checkout@v3
      with:
          submodules: recursive

    - uses: ./.github/actions/setup

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v3
      with:
        languages: ${{ matrix.language }}
        # If you wish to specify custom queries, you can do so here or in a config file.
        # By default, queries listed here will override any specified in a config file.
        # Prefix the list here with "+" to use these queries and those in the config file.

        # For more details on CodeQL's query packs, refer to: https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs
        # queries: security-extended,security-and-quality

    - uses: ./.github/actions/meson
      with:
        cc: gcc

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v3
      with:
        category: "/language:${{matrix.language}}"


================================================
FILE: .github/workflows/lock.yml
================================================
name: 'Lock Threads'

on:
  schedule:
    - cron: '0 0 * * *'
  workflow_dispatch:

permissions:
  issues: write
  pull-requests: write
  discussions: write

concurrency:
  group: lock-threads

jobs:
  action:
    runs-on: ubuntu-latest
    steps:
      - uses: dessant/lock-threads@v5
        with:
          process-only: 'issues'
          github-token: ${{ github.token }}
          issue-inactive-days: '31'
          exclude-issue-created-before: ''
          exclude-issue-created-after: ''
          exclude-issue-created-between: ''
          exclude-issue-closed-before: ''
          exclude-issue-closed-after: ''
          exclude-issue-closed-between: ''
          include-any-issue-labels: ''
          include-all-issue-labels: ''
          exclude-any-issue-labels: ''
          add-issue-labels: ''
          remove-issue-labels: ''
          issue-comment: >
            This pull request has been automatically locked since there
            has not been any recent activity after it was closed.
            Please open a new issue for related bugs.
          issue-lock-reason: 'resolved'
          log-output: false


================================================
FILE: .github/workflows/main.yml
================================================
on:
  issues:
    types: [opened, edited]

jobs:
  auto_close_issues:
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v1

      - name: Automatically close issues that don't follow the issue template
        uses: davatorium/auto-close-issues@v1.0.4
        with:
          github-token: ${{ secrets.GITHUB_TOKEN }}
          issue-close-message: "@${issue.user.login}: hello! :wave:\n\nThis issue is being automatically closed because it does not follow the issue template." # optional property
          closed-issues-label: "Incomplete Report - Please follow the guidelines" # optional property


================================================
FILE: .github/workflows/mkdocs.yml
================================================
name: Publish docs via GitHub Pages
on:
  push:
    branches:
      - sphinx
      - next

jobs:
  build:
    name: Deploy docs
    runs-on: ubuntu-latest
    steps:
      - name: Checkout master
        uses: actions/checkout@v1

      - name: Deploy docs
        uses: mhausenblas/mkdocs-deploy-gh-pages@master
        env:
          CONFIG_FILE: mkdocs/mkdocs.yml 
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}


================================================
FILE: .github/workflows/publish-release.yml
================================================
name: Publish release

on:
  push:
    tags:
      - '*'

jobs:
  publish-tarball:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          submodules: recursive
      - uses: ./.github/actions/setup
      - uses: ./.github/actions/meson
        with:
          cc: gcc
      - uses: ./.github/actions/release


================================================
FILE: .gitignore
================================================
/build*/
/.cache/
/.vscode/

# I want to ignore log files
*.log

# Core files should never be checked in
core

# ignore patches too, the code is either checked in or branch.
*.patch*

# backup files
*.swp
*.*~
*.unc-backup~
*.unc-backup.md5~


================================================
FILE: .gitlab-ci.yml
================================================
before_script:
    - apt-get update
    - apt-get install --force-yes -y software-properties-common apt-transport-https
    - add-apt-repository -y 'deb http://debian.jpleau.ca/ jessie-backports main contrib non-free'
    - apt-get update -qq
    - apt-get install --force-yes -y autoconf automake make libx11-dev libpango1.0-dev libcairo2-dev libstartup-notification0-dev libxcb-icccm4-dev libxcb-util0-dev libxcb-xinerama0-dev libxcb-xkb-dev libx11-xcb-dev
    - apt-get install --force-yes -y libxcb1-dev xvfb discount xdotool fluxbox libxkbcommon-dev libxkbcommon-x11-dev libxcb-ewmh-dev xutils-dev libtool lcov libxcb-randr0-dev doxygen python flex bison librsvg2-dev texinfo 
    - git clone --recursive https://github.com/Airblader/xcb-util-xrm.git
    - cd xcb-util-xrm
    - ./autogen.sh --prefix=/usr
    - make
    - sudo make install
    - cd -
    - git clone https://github.com/libcheck/check/ -b 0.11.0
    - cd check
    - autoreconf -i
    - TEX="false" ./configure --prefix=/usr/
    - make
    - sudo make install
    - cd -
    - git clone https://github.com/alobbs/doxy-coverage

build-rofi:
    script:
        - git submodule update --init
        - autoreconf -i
        - ./configure --enable-gcov
        - make
        - make check
        - make distcheck
        - make coverage
        - make doxy
        - python2 doxy-coverage/doxy-coverage.py doc/html/xml/
    artifacts:
        expire_in: 2 weeks
        paths:
            - coverage
            - doc/html


================================================
FILE: .gitmodules
================================================
[submodule "libgwater"]
	path = subprojects/libgwater
	url = https://github.com/sardemff7/libgwater
[submodule "libnkutils"]
	path = subprojects/libnkutils
	url = https://github.com/sardemff7/libnkutils


================================================
FILE: .mailmap
================================================
Morgane Glidic <sardemff7+git@sardemff7.net>


================================================
FILE: AUTHORS
================================================
Aaron Ash
Adrià Farrés
Anton Löfgren
Avatar
bendem
Benjamin Cremer
Benjamin R. Haskell
Bruno Braga
Buglloc
Chris Salzberg
daemoni
Dan Beste
Daniel Hahler
DanteFireX
Dave Davenport
Deiwin Sarjas
Dimitar Yordanov
Edwin Pujols
eigengrau
Eric Engeström
Fangrui Song
fice-t
Florian Franzen
Gabriel Holodak
Gareth Poole
Georgios Bitzes
Greg Fitzgerald
Guy Hughes
Hexchain Tong
Ian Remmler
James Vaughan
Jason Pleau
Jasper Lievisse Adriaanse
Klemens Schölhorn
koppa
lbonn
Marcin Sedlak
marduk
Michael Vetter
Moritz Maxeiner
Nick87720z
Niklas Haas
N. Izumi
Paulo Flabiano Smorigo
Peter Cannici
qedi
Morgane Glidic
Rasmus Steinke
RaZ0rr-Two
Roomcays
seanpringle
Sebastian Reuße
Simon Hanna
Stanislav Seletskiy
Thomas Adam
Thorsten Wißmann
Tilman Blumenbach
Tobias Kortkamp
Tom Hinton
TonCherAmi
vimeitor
Wieland Hoffmann
Yaroslav


================================================
FILE: CODE_OF_CONDUCT.md
================================================
# Contributor Covenant Code of Conduct

## Our Pledge

In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.

## Our Standards

Examples of behavior that contributes to creating a positive environment include:

* Using welcoming and inclusive language
* Being respectful of differing viewpoints and experiences
* Gracefully accepting constructive criticism
* Focusing on what is best for the community
* Showing empathy towards other community members

Examples of unacceptable behavior by participants include:

* The use of sexualized language or imagery and unwelcome sexual attention or advances
* Trolling, insulting/derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others' private information, such as a physical or electronic address, without explicit permission
* Other conduct which could reasonably be considered inappropriate in a professional setting

## Our Responsibilities

Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.

Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.

## Scope

This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.

## Enforcement

Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at qball@gmpclient.org. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.

Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.

## Attribution

This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]

[homepage]: http://contributor-covenant.org
[version]: http://contributor-covenant.org/version/1/4/


================================================
FILE: CONFIG.md
================================================
> This page does not describe all of **ROFI**'s configuration options, just the
> most common usecase. For the full configuration options, check the manpages.

<br />

## Where does the configuration live

Rofi's configurations, custom themes live in `${XDG_CONFIG_HOME}/rofi/`, on
most systems this is `~/.config/rofi/`.

The name of the main configuration file is `config.rasi`. (`~/.config/rofi/config.rasi`).

## Create an empty configuration file

Open `~/.config/rofi/config.rasi` in your favorite text editor and add the
following block:

```css
configuration {

}
```

You can now set the options in the `configuration` block.

## Create a configuration file from current setup

If you do not want to start from scratch, or want to migrate from older
configuration format, you can get tell rofi to dumps it configuration:

```bash
rofi -dump-config > ~/.config/rofi/config.rasi
```

This will have all the possible settings and their current value.
If a value is the default value, the entry will be commented.

For example:

```css
configuration {               
/*  modes: "window,run,ssh,drun";*/
/*  font: "mono 12";*/
/*  location: 0;*/
/*  yoffset: 0;*/
/*  xoffset: 0;*/
/*  fixed-num-lines: true;*/
... cut ...
/*  ml-row-down: "ScrollDown";*/                                                                                        
/*  me-select-entry: "MousePrimary";*/                                                                                  
/*  me-accept-entry: "MouseDPrimary";*/                                                                                 
/*  me-accept-custom: "Control+MouseDPrimary";*/ 
}
```

To create a copy of the current theme, you can run:

```bash
rofi -dump-theme > ~/.config/rofi/current.rasi
```

## Configuration file format

### Encoding

The encoding of the file is utf-8. Both Unix (`\n`) and windows (`\r\n`)
newlines format are supported. But Unix is preferred.

### Comments

C and C++ file comments are supported.

- Anything after  `//` and before a newline is considered a comment.
- Everything between `/*` and `*/` is a comment.

Comments can be nested and the C comments can be inline.

The following is valid:

```css
// Magic comment.
property: /* comment */ value;
```

However, this is not:

```css
prop/*comment*/erty: value;
```

### White space

White space and newlines, like comments, are ignored by the parser.

This:

```css
property: name;
```

Is identical to:

```css
     property             :
name

;
```

### Data types

**ROFI**'s configuration supports several data formats:

#### String

A string is always surrounded by double quotes (`"`). Between the quotes there
can be any printable character.

For example:

```css

 ml-row-down: "ScrollDown";
```

#### Number

An integer may contain any full number.

For example:

```css
eh: 2;                        
```

#### Boolean

Boolean value is either `true` or `false`. This is case-sensitive.

For example:

```css
show-icons: true;
```

This is equal to the `-show-icons` option on the commandline, and `show-icons:
false;` is equal to `-no-show-icons`.

#### List

This is not supported by the old configuration system, but can be used in the
**rasi** format.

A list starts with a '[' and ends with a ']'. The entries in the list are
comma-separated. The entry in the list single ASCII words.

```css
 combi-modes: [window,drun];
```

For older versions you have :

```css
 combi-modes: "window,drun";
```

## Get a list of all possible options

There are 2 ways to get a list of all options:

1. Dump the configuration file explained above. (`rofi -dump-config`)
1. Look at output of `rofi -h`.

To see what values an option support check the manpage, it describes most of
them.

NOTE: not all options might be in the manpage, as options can be added at
run-time. (f.e. by plugins).

## Splitting configuration over multiple files

It is possible to split configuration over multiple files using imports. For
example in `~/.config/rofi/config.rasi`

```css
configuration {
}
@import "myConfig"
@theme "MyTheme"

```

Rofi will first parse the config block in `~/.config/rofi/config.rasi`, then
parse `~/.config/rofi/myConfig.rasi` and then load the theme `myTheme`.  More
information can be obtained from the **rofi-theme(5)** manpage.  Imports can be
nested.


================================================
FILE: COPYING
================================================
MIT/X11 License
Modified  2013-2024 Qball Cow <qball@gmpclient.org>
Copyright (c) 2012 Sean Pringle <sean.pringle@gmail.com>

Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be
included in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.


================================================
FILE: Changelog
================================================
For newer release ChangeLogs please see the releasenotes.

v1.7.3: Sturtled!
   - [Help] Print out the parsed config/theme files in -help output.
   - [Keybindings] Fix keybindings being modified by -theme-str
   - [Doc] Add rofi-dmenu manpage.
   - [XCB] Cache lookup of monitor.
   - Add -replace option (#568)
   - Fix memory leak.
   - [1566] Add extra debug for resolving monitors.
   - [Theme] Add round,floor,ceil function in @calc (#1569)
   - [Doc] Explain icon lookup.
   - [Combi] Add -combi-display-format (#1570) (thanks to Jakub)
   - [Theme] Expand list type ([]) for more data types.
   - [Theme] Add support for tab-stops on textbox. (#1571) (thanks to Jakub)
   - [Theme] Testing direct access to widgets via cmdline option (-theme+widget+property value)

v1.7.2: Shellebrations!
   - [Build] Fix building without window mode enabled.
   - [Config] Do not print out the 'theme' field in configuration on dump.
   - [CI] test window mode less build.
   - Allow configuration block in theme again.

v1.7.1: Turtley amazing!
   - [Theme] Fix highlight with only theme.
   - Updated documentation and landing page (Thanks to RaZ0rr-Two)
   - [Combi] Fix nesting combi modi (#1510)
   - [DMenu] Fix crash dmenu mode when no entry is available. (#1504)
   - [Run|Drun] Only initialize file-completer on first use.
   - [FileBrowser] Reduce number of re-allocs.
   - [Readme] Remove generating readme.html for dist.
   - [Dmenu] Fix uninitialized memory (non-selectable)
   - [FileBrowser] Try to convert invalid encoded text. (#1471)
   - [FileBrowser] Don't crash on invalid file filenames. (#1471)
   - [Theme] print known colors as its color name.
   - [CMD] If failed to convert commandline to new option, do not stop. (#1425)
   - [Theme] Fix parsing of nested media blocks. (#1442)
   - [Widgets] Fix sizing logic widgets. (#1437)
   - [Window] Try to fix auto-sizing of desktop names for non-i3 desktops. (#1439)
   - [Window] Fix broken close-on-delete. (#1421)
   - [Listview] Correctly check if selected item is highlighted. (#1423)
   - [Entry] Allow action to be taken on input change. (#1405)
   - [Theme] Don't truncate double values. (#1419)
   - [Grammar] Add support for env(ENV,default).
   - [Documentation] documentation fixes.
   - [Theme] fix dmenu theme ( #1396).

v1.7.0: Iggy 2024
   - ADD: -steal-focus option.
   - ADD: [Config] Add nested configuration option support.
   - ADD: [Config] Support for handling dynamic config options.
   - ADD: [IconFetcher] Find images shipped with the theme.
   - ADD: [DRun] Add support for passing file (using file-browser) completer for desktop files that support his.
   - ADD: [DRun] Support for service files.
   - ADD: [FileBrowser] Allow setting startup directory (#1325)
   - ADD: [FileBrowser]: Add sorting-method. (#1340)
   - ADD: [FileBrowser] Add option to group directories ahead of files. (#1352)
   - ADD: [Filtering] Add prefix matching method. (#1237)
   - ADD: [Icon] Add option to square the widget.
   - ADD: [Icon|Button] Make action available on icon, button and keybinding name.
   - ADD: [KeyBinding] Add Ctrl-Shift-Enter option. (#874)
   - ADD: [ListView]-hover-select option. (#1234)
   - ADD: [Run] Add support for passing file (using file-browser) completer.
   - ADD: [Textbox] Allow theme to force markup on text widget.
   - ADD: [Theme] theme validation option. (`-rasi-validate`)
   - ADD: [View] Add support for user timeout and keybinding action.
   - ADD: [Widget] Add cursor property (#1313)
   - ADD: [Widget] Add scaling option to background-image.
   - ADD: [Widget] Add support background-image and lineair gradient option.
   - ADD: [Window] Add pango markup for window format (#1288)
   - ADD: [Window] Allow rofi to stay open after closing window.
   - FIX: [DSL] Move theme reset into grammar parser from lexer.
   - FIX: [Drun]: fix sorting on broken desktop files. (thanks to nick87720z)
   - FIX: [File Browser]: Fix escaping of paths.
   - FIX: [ListView] Fix wrong subwidget name.
   - FIX: [Script] Don't enable custom keybindings by default.
   - FIX: [TextBox] Fix height estimation.
   - FIX: [Theme] widget state and inherited properties. This should help fixing some old themes with changes from 1.6.1.
   - FIX: [Widget] Fix rendering of border and dashes. (Thanks to nick87720z)
   - FIX: [Build] Fix CI.
   - FIX: [Theme] Discard old theme, when explicitly passing one on command line.
   - REMOVE: -dump-xresources
   - REMOVE: -fullscreen
   - REMOVE: -show-match
   - REMOVE: Old xresources based configuration file.
   - REMOVE: fake transparency/background option, part of theme now.
   - REMOVE: xresources parsing via Xserver
   - Remove: [Theme] Remove backwards compatiblity hack.
   - DOC: Update changes to manpages


v1.6.1: Tortoise Power
   - Use GdkPixbuf for Icon parsing.
   - Add FileBrowser to default mode.
   - Fix parsing dicts in config file (with " in middle of string.)
   - Add -normalize-match option, that tries to o match ö, é match e. (#1119)
   - [Theme] Add min/max operator support to calc() (#1172)
   - Show error message and return to list instead of closing (#1187)
   - [Theme] Add nested media support. (#1189)
   - [Textbox] Try to fix estimated font height. (#1190)
   - [DRun] Fix broken caching mechanism.

v1.6.0: The Masked Launcher
   -  Add `themes/` directory in the users rofi config directory to the theme search path. (#1001)
   -  Split listview element into box widget holding icon and textbox. Supporting more dynamic themes. (#949)
   -  Fix default theme.
   -  Add -upgrade-config option.
   -  Add `ROFI_PLUGIN_PATH` variable.
   -  Add check for running rofi inside a Script mode.
   -  Remove gnome-terminal from rofi-sensible-terminal (#1074)
   -  Set window title based on mode name. (#969)
   -  Subpixel rendering workaround. (#303)
   -  Support character type in configuration {} block . (#1131)
   -  Use `XDG_CONFIG_DIRS` (#1133)
   -  [Box] Bug fix update propagation.
   -  [Build] Fix meson build with meson 0.55.
   -  [DMenu] Add `-keep-right` flag. (#1089)
   -  [DMenu] Don't match markup when filtering. (#579,#1128)
   -  [DRUN] Support Type=Link (#1166)
   -  [DRun] Add % to escape variable.
   -  [DRun] Add an optional cache for desktop files. (#1040)
   -  [DRun] Add keywords as default match item. (#1061)
   -  [DRun] Don't run custom commands.
   -  [DRun] Match keywords field.
   -  [DRun] Only show selected categories. (#817)
   -  [Dmenu|Script] Add non-selectable entries. (#1024)
   -  [Doc] Update documentation.
   -  [IconFetcher] Add jpeg support.
   -  [Icon] Set default size to 1.2 CH.
   -  [Icon] support distance for size.
   -  [Listview] Add widget to show keybinding index. (#1050)
   -  [Listview] Fix distribution of remaining space.
   -  [Listview] Fix left-to-right scrolling. (#1028)
   -  [Listview] Fix updating elements. (#1032)
   -  [Matching] Make Fuzzy matching non greedy.
   -  [Script] Add delimiter option. (#1041)
   -  [Script] Add environment variable indicating state.
   -  [Script] Add extra matchign field (meta). (#1052)
   -  [Script] Add info option, hidden field that gets passed to script via `ROFI_INFO` environment.
   -  [Script] Add no-custom option.
   -  [Textbox] Add cursor blinking option.
   -  [Textbox] Add placeholder. (#1020)
   -  [Theme] Add `calc()` support. (#1105)
   -  [Theme] Add alpha channel to highlight color. (#1033)
   -  [Theme] Add sidebar as mode-switcher alias.
   -  [Theme] Add some initial @media support. (#893)
   -  [Theme] Support buttons in the UI.
   -  [View] Add two widgets. One showing number of rows, other number of filtered rows. (#1026)
   -  [Window] Add window thumbnail option.
   -  [Window] Remove arbitrary # window limit. (#1047)
   -  [Window] check buffer overflow.

v1.5.5:
v1.5.4: Painful tardiness
	- SSH: Fix wrong malloc size, causing crash.

v1.5.3: Time delayed progress
	- Update manpage with missing entry. (#937)
	- Rename sidebar widget to mode-switcher and allow configuration from theme.
	- Timing: Moving timing output to glib debug system.
	- SSH: Fix unitialized variable issue.
	- SSH: resolve ':' conflict in history entries.
	- RASI Lexer: Fix nested () in variable default field.
	- USABILITY: When mode not found, show in gui not just on commandline.
	- ICON: Allow aligning image in icon widget.
	- Meson build system: cleanups and improvements.
	- Meson build system: add documentation (#943)
	- Window: Fix default formatting and remove (invalid) deprecation warning.
	- DMenu: Add support for showing icons infront of displayed list.
	- Overlay: Fix overlay widget to correctly integrate in new theme format.
	- Update libnkutils, libgwater.
	- SSH: be case-insensitive when parsing keywords.
	- DMENU: Add format option to strip pango markup from return value.
	- ListView: allow user to change ellipsizing displayed value at run-time.

v1.5.2: Procrastination in progress
	- Clearify Check dependency. (#879)
	- Add option to change negate character. (#877)
	- Fix assert and update test. (#875)
	- Add missing example Script (#869)
	- Add drun-display-format option. (#858)
	- Fixing typos (#867,#837,#831,#804)
	- Fix loading icons that are in cache (#860)
	- Improve ssh known_host parser. (#820)
	- Add terminals to rofi-sensible-terminal (#808)
	- Lexer Fix several ambiguity and handling of empty input.
	- IconFetcher preload the user set icon theme.
	- IconFetcher use generic threadpool.
	- Lexer support environment variables.
	- Cleanup syntax for sorting. (#816)
	- Documents update.
	- Fix how borders are drawn. (#792, #783)

v1.5.1:
	- Egor Zvorykin: Fix typos in theme manpage. (#760)
	- Ben: Fix README config file location. (#761)
	- [SSH] Reload when ssh entry is deleted.
	- Add support for randr 1.5 monitors. (#749)
	- Diki Anata: Fix border layout structure.
	- Remove duplicate tests. (#543)
	- Fix make test in libnkutils.

v1.5.0:
	- [Theme] Accept integer notation for double properties. (#752)
	- [View] Theme textboxes are vertically sized and horizontal wrapped. (#754)
	- Rofi 1.4.2 doesn't capture ←, ↑, →, ↓ binding to keys to work in combination with Mode_switch (#744)
	- Add konsole to list of sensible terminals. (#739)
	- Allow drun to filter based on comment field. (#733)
	- Add prompt widget to default theme.
	- Add manpage for rofi-theme-selector.
	- Dump theme without # prefix and separator .
	- Fix issue with xnomad and -4 placing. (#683)
	- DRun obey OnlyShowIn and NotShowIn properties.
	- Store default theme in rofi binary using GResources.
	- Add extra margin between prompt and entry.
	- Remove colon from prompt. (#637)
	- Add support for passing extra properties in script mode.
	- Better error message on invalid argb syntax.
	- Fix default theme border.
	- Make '#' in the parser optional.
	- Update themes.
	- Add -drun/window-match-fields option (thx to Askrenteam) for drun/window menu. (#690/#656)
	- Implement negated match. (#665)
	- Fix parsing of non-existing fields. (#700)
	- rofi-theme-selector fixes.
	- Fix spelling error (thx to jmkjaer)
	- Fix test on i686/arm. (#692)
	- Fix error in theme manpage. (#686)
	- Allow history size to be specified. (#613)
	- Fix drun history implementation. (#579)
	- Add gentoo install instruction. (#685)

v1.4.2:
	- Add sort to manpage. (#682)
	- Add tranaparent to theme manpage. (#688)
	- Re-add theme headers. (#679)
	- Fix super key. (#684)
	- Unknown option libnkutils:uuid. (#677)
	- Mode window is not found. (#686)
	- Fix meson build in dist file.

v1.4.1: All Hail Rasi
	- Bump meson release version

v1.4.0: I reject your truth and substitute my own
	New Features:
		- FZF style sorting for fuzzy matching (thanks to MaskRay) (#533)
		- Improve error messages.
		  - Theme parsing.
		  - Keybinding.
		  - invalid commandline options.
		  - etc.
		- Customizable highlight.
		- Give up when keyboard is not grabbed in first 5 seconds.
		- Improved manpage
			- rofi (1)
			- rofi-themes (5)
		- Super-{1..10} hotkey for first 10 rows.
		- Allow x-align/y-align for textbox.
		- Support matching bangs on multiple characters in combi mode. (#542)
		- Set WM_CLASS (#549)
		- Async pre-read 25 rows for improving user experience. (#550)
		- Improve handling in floating window manager by always setting window size.
		- DRun speedup.
		- Make lazy-grab defualt.
		- Remove extra layer in textbox. (#553)
		- Ignore fonts that result in a family name or size 0. (#554)
		- [Combi] Allow bang to match multiple modes. (#552)
		- Add detection of window manager and work around quirks.
		- Support dynamic plugins.
		- DMENU tty detection.
		- Support for icons in drun, combi and window mode.
		- Startup notification of launched application support.
		- Meson support.
		- Fuzzy matching with fzf based sorting algorithm.
		- Auto-detect DPI.
		- Set cursor at the end of the input field. (#662)
		- Meson support (thx to SardemFF7).
		- [Script] parse the command as if it was commandline. (#650)
		- Don't enable asan by meson. (#642)
		- Allow text widgets to be added in theme and string to be set.
		- [Dmenu] Support the -w flag.
		- Allow window (via window id) to be location for rofi window.
		- [Dmenu] Allow multi-select mode in `-no-custom` mode.

v1.3.1: Dan vs. Greg: The never ending story, reloaded.
	New Features
		- [DRun] Search categories. (#449)
	Improvements
		- Fix exit when failed to grab keyboard. (#524)
		- Introduce lazy keyboard grab mode for people who want rofi to show on key-down in i3.
		- Add copyrights to theme (needed for debian packaging).
		- DMENU: Correctly detect end-of-file (#518)
		- Directly queue redraw on overlay change.
		- Remove pango markup from workspace names in I3. (#507)

v1.3.0: Dan vs. Greg: The never ending story.
	New Features
		- Use randr for getting monitor layout. Fallback to xinerama if not available.
		- Re-add fuzzy matcher.
		- Restructure internal code to use dynamic sizing widgets. (hbox, vbox and lists)
		- Async mode for dmenu.
		- Add theme selector script.
		- Include 21 themes.
		- Dynamically sizing window with content.
		- When placed at bottom of screen re-order screen to have entry at bottom.
	Improvements
		- Fix pasting secondary clipboard. (#516)
		- By default use all cores to filter entries.
		- Make sure drawing priority is higher then reading input data.
		- Improve resizing of window, don't make X whipe background.
		- Improve close window (shift-delete) action, by sending NET_WM_CLOSE instead of destroying window.
		- Create cache and run directory on startup. (#497)
		- Fix uneeded redraws on cursor blinking. (#491)
		- Improve time till grabbing keyboard. (#494)
		- Better error message when failing to parse keybindings, also continue parsing on error.
		- Fix problem with custom layouts (#485)
		- Speedup drawing of screen. Works well now for 4k and 8k screens. (factor 1000+ speedup for the flipping of
		buffer) (#496)
		- DRun mode more compatible with specification.
		- Debug output via g_log.
		- Fix password entry cursor position.
		- Use bash instead of sh for get_git_rev.sh (#445)
		- Add Control+G for cancel (#452)
		- Add padding option to textbox (#449)
		- Ctrl-click does alternate accept entry. (#429)
		- Hide window decoration in normal window mode.
		- Click to exit option. (#460)
		- Fix cursor blinking on moving. (#462)
		- Remove entry from history if fails to execute (#466)
		- Fix margins. (#467)
		- Improved documentation of functions in code.
		- DRun: Set work directory when executing file. (#482)
		- Memory leak fixes.
		- Improve scrollbar behaviour.
	Removals
		- opacity option. The transparency support in the theme can do the same and more.

v1.2.0
	New Features
		- Highlight matched part of the string.
		- Make window switcher string customizable.
	Improvements
		- Improved selection mode in dmenu with selection counter.
		- Improved selection mode with 'dot' indicator.
		- Fix Current Desktop window switcher.
		- Fix launching in terminal.
		- Supports include in config.
		- Add Control+k remove till eol keybinding.
		- Change clear line to Control+w and make Control+u remove till sol (matching readline)
		- Track origin of option value e.g. who set the option.
		- Comment default values in dump-xresources.
		- Fix displaying on 30bit 10bpc X setup.
	Removals:
		- Remove xlib dependency (xcb-xrm)
		- Remove fuzzy option
		- Remove i3 workaround as it no longer needed since I3 v4.9. (Feb. 2015)

v1.1.0
    New Features
        - Keys mode, showing keybindings.
        - Stop cycling option (#407) (Thx to Yaroslav)
        - Kill window on delete entry (#316)
    Improvements
        - Add Control+Backspace as remove word back keybinding.
        - Allow user to use X11 background for fake transparency (#390)
        - Allow user to specify background image.
        - Improved keybinding handling, allowing on-release and modifier only (#384).
        - Use display name for prompt (#409)
        - Parse subdirectories in drun parser (#416)
        - Switch to stop cycling (#407)
    Bug fixes
        - Grab mouse pointer with keyboard

1.0.1
    Bug fixes
         - Fix typo in manpage.
         - Return old behaviour for rofi placement (#395, #389)
         - Switch desktop when switching window (#393)
         - Remove unneeded use of bash (#391)
         - Make history parser more robust against corrupted files. (#388)
         - Fix desktop number (#386)

1.0.0
    New Features

        - Blinking cursor
        - BliSeparate configuration file
        - BliHistory in drun mode (#343)
        - BliContext menu mode, show rofi at the mouse pointer

    Improvement
        - auto select and single item on dmenu mode (#281)
        - Unlimited window title length.
        - Correctly follow the active desktop, instead of active window.
        - If requesting modi that is not enabled, show it anyway.
        - DMenu password mode. (#315)
        - Levenshtein sort is now UTF-8 aware.
        - Use xcb instead of large xlib library.
        - Use GLib mainloop for cleaner code and easier external event based
        - handling in future.
        - Run dialog: Try to convert between locale, fs encoding and utf8.
        - Fixing problems with non-utf8 filesystem encodings.
        - Try to display non-utf8 strings as good as possible.
        - Autocomplete bang hint in combi mode (#380)
        - Remove magic line length limits by switching to getline
        - from fgets.
        - Print git version for git builds in version string.

    Bug fixes
        - Fix subpixel rendering. (#303)
        - Fix basic tests on OpenBSD (#272)
        - Fix wrong use of memcpy (thx to Jasperia).
        - Work around for sigwaitinfo on OpenBSD.
        - Ignore invalid entries (non-utf8) in dmenu mode.
        - Glib signal handling.
        - Fix connecting to i3 on bsd.
        - Be able to distinguish between empty and cancel in dmenu mode. (#323)
        - Fix memcpy on single memory region. (#312)
        - Fix opening file with mode a+ and using fseek to overwrite on bsd.

0.15.12:
    New features:
        - Initial `-dump` command for dmenu mode. (#216)
        - Threading support.
            - Parallel checking for ASCII.
            - Parallel string matching.
            - Autodetect number of HW-threads.
            - Disabled by default.
        - Highlight multiple selected rows (#287,#293)
        - Dmenu can read from file instead of stdin.
        - Regex matching (#113)
        - Take Screenshot of rofi using keybinding.
        - Hotkey for sorting: (#298)
		- Option to set scrollbar width.
    Improvements:
		- Fix return code of multi-select.
        - Update manpage (#289, #291)
        - Improve speed of reading stdin in dmenu mode.
        - Correctly handle modifier keys now. Should now support most weird keyboard layouts and switching between them.
        (#268, #265, #286)
        - Correctly set locale, fixing issues with entering special characters. (#282)
        - DRun mode support `NoDisplay` setting (#283)
        - Pango markup is matched when filtering. (#273)
    Bug fixes:
        - Improve error message (#290)
        - Correctly switch to next entry on multi-select when list is filtered (#292)
        - Switch __FUNCTION__ for __func__. (#288)
        - Fix segfault on empty list and moving through it. (#256,#275)
        - Fix one off of colors (#269)
        - Drun fix uninitialized memory (#285)

0.15.11:
    New features:
        - (Experimental) Desktop file support
    Improvement:
        - Add xdg-terminal to rofi-sensible-terminal
    Bug fixes:
        - manpage fixes (#261)
        - Crash in error mesg on invalid config
        - Fix urgent and active being activated at same time
        - Fix crasher on empty list
0.15.10:
    New feature:
        - Support for Startup Notification
        - Standalone mode in dmenu
        - ssh: known_hosts parsing
        - Full screen support
        - Glob style matching
        - Cairo drawing
        - Fast ascii filtering (thx to Tom Hinton)
        - Combi bang support
        - normal window mode for dmenu
        - Startup notification support
        - Current desktop window mode
    Improvements:
        - Keep same line selected
        - Cleanup menu code by re-using Switcher
        - Fix drawing on resize
        - Fix rofi -h output
        - allow disabling of tokenizing
        - Dragging scrollbar
        - Allow none type on separator
        - Dmenu support markup in fields
    Bug fixes:
        - dmenu use switcher system
        - release keyboard on focus out event, regrab it on focus in event
        - Support `\0` separator

0.15.8:
    New feature:
        - Scrollbar.
        - More custom keybindings.
    Improvements:
        - dmenu compatibility.
        - Don't refilter on all keypresses.
        - Hide Docks and desktops from the window list. (remove i3bar hack)
    Bug fixes:
        - Fix Desktop numbering.
        - Mis-alignment of arrow down box with message (#189)
        - Fix issue with mouse interaction needing keyboard press to complete.
        - Fix -no-custom still allows escape to quit.
        - Fix compiler warnings.
        - Fix dmenu mode. (#200)
        - Break CMD AI to have dmenu compatibility.
        - Fix processing of signals.

0.15.7:
    Bug fixes:
        - Auto-wrap text in message dialog.
        - Fix ellipsiziing in entry box.
        - Fix crash on empty list with custom input (#175).
        - SSH: Ignore comments in Host line (#178).
        - Fix issues with BSD (#180)
    New feature:
        - Markup support error message.
        - Implement -no-custom as alternative to -only-select (#176).
        - Fuzzy match option. (#133)
    Improvements:
        - Make more keys user-configurable. (#66)

0.15.5:
    Bug fixes:
        - Reduce time waiting for keyboard grab (#153)
        - Also grab Key Release on exit. (#167)
        - Fix failing font size estimation code.
    New feature:
        - [DMENU] Allow to select line matching pattern from cmdline.(#165)
        - [DMENU] Allow to set filter from cmdline. (#164)
        - [DMENU] Allow output to be formatted (string, filter, index, index 1 based)
        - [DMENU] Only match input lines mode.
        - [DMENU] Custom keybinding for return value.(#154,#156)
        - [DMENU] Allow additional message line. (#166)
    Improvements:
        - (Start) adding keybinding support (#131)
        - Cleanup warnings from clang checkers.
        - Fix keybindings on Russian layout (#169)
    Open bugs:
        - Urgency hint not always working (#162)

0.15.4:
    New feature:
        - Number mode for dmenu. allows user to get index back instead of content.
        - Combi mode. Combine multiple views into one.
        - Highlight current window.
        - Highlight urgent and active row in window view.
        - DMenu allow rows to be highlighted. (single, multiple, ranges)
        - New color specification based on I3. (Can be enabled by settings) (#147)
        - /etc/hosts support for ssh mode. (#137)
    Bug fixes:
        - On a single item in list disable auto-select.
        - Fix cursor position (#140)
        - Resolving manpage. (#142)
        - Fix pasting cursor one off. (#150)
        - Fix grave key -> ctrl+grave (#151)
    Improvements:
        - Better handle input methods.. Now international keyboard layout works as expected: `e ->è
        - Be more verbose about starting in daemon mode.
        - Print a user-understandable error when launching in daemon mode without a key bound.
        - Add Ctrl(Shift)Tab to switch modi's.
        - Auto size number of columns based on available columns.
        - Better way to determine font height.
        - Fix font vertical centering.
        - One-off when pasting text.
        - Improve rendering of boxes (fixed height and margins)
        - Fix modi switcher boxes size+layout.
        - Reduce work on redraws (do not always calculate new size/position), set text, etc.
        - OO-ify the switchers.
        - Remove unneeded filtered array.
    Cleanup:
        - Do not lug argc,argv around everywhere.

0.15.2:
    Removed features:
        - Remove (broken) hmode
        - Old style key binding and mode launcher.
        - Old TIMING code.
    New features:
        - Word movement in entry box. (#126)
        - PID file to avoid duplicate Rofi.
        - Generic keybinding and launching for modi. (#128)
        - Auto select mode (previously called zeltak mode)
    Bug fixes:
        - Shift left/right movement between modi (#125)
        - Document updates (#123,#116,#124,etc.)
        - DMenu mode based on executable name with full path (#119)
        - Fix missing keystrokes.
        - On broken UTF-8 show everything up to the broken character. (#121)
    Others:
        - Significant code refactoring.
        - Rewriting of config parser, Commandline Parser uses structure from Xresource parser.
          Avoiding duplication and making it easier to maintain.
    Performance improvements:
        - Fix blocking on grabbing keyboard.

0.15.1:
    New features:
        - Improved transparency
        - Changelog
        - Case sensitivity support, with indicator. (Edwin Pujols)
        - Mouse scroll wheel support
        - Alternate Row colors
        - Run-list command for adding entries to run-dialog
        - Dmenu: preselect line.
    Bug fixes:
        - Manpage fixes
        - SSH viewer, support lists of hostnames (Tblue)
        - SSH improve parsing of odly indented host files
        - Do not loose keypresses when system under load
        - Cleanups, small fixes. (Edwin Pujols, blueyed )
    Performance improvements:
        - Lazy refilter for large lists


================================================
FILE: Examples/i3_empty_workspace.sh
================================================
#!/usr/bin/env bash

MAX_DESKTOPS=20

WORKSPACES=$(seq -s '\n' 1 1 "${MAX_DESKTOPS}")

EMPTY_WORKSPACE=$( (i3-msg -t get_workspaces | tr ',' '\n' | grep num | awk -F: '{print int($2)}' ; \
            echo -e "${WORKSPACES}" ) | sort -n | uniq -u | head -n 1)

i3-msg workspace "${EMPTY_WORKSPACE}"


================================================
FILE: Examples/i3_switch_workspaces.sh
================================================
#!/usr/bin/env bash

if [ -z $@ ]
then
gen_workspaces()
{
    i3-msg -t get_workspaces | tr ',' '\n' | grep "name" | sed 's/"name":"\(.*\)"/\1/g' | sort -n
}

echo empty; gen_workspaces
else
    WORKSPACE=$@

    if [ "${WORKSPACE}" = "empty" ]
    then
        i3_empty_workspace.sh >/dev/null
    elif [ -n "${WORKSPACE}" ]
    then
        i3-msg workspace "${WORKSPACE}" >/dev/null
    fi
fi


================================================
FILE: Examples/rofi-file-browser.sh
================================================
#!/usr/bin/env bash

# Various options for the file browser script:
ROFI_FB_GENERIC_FO="xdg-open" # command used for opening the selection
ROFI_FB_PREV_LOC_FILE=~/.local/share/rofi/rofi_fb_prevloc
ROFI_FB_HISTORY_FILE=~/.local/share/rofi/rofi_fb_history
ROFI_FB_HISTORY_MAXCOUNT=5 # maximum number of history entries
# Comment the next variable to always start in the last visited directory,
# otherwise rofi_fb will start in the specified directory:
ROFI_FB_START_DIR=$HOME # starting directory
# Uncomment the following line to disable history:
# ROFI_FB_NO_HISTORY=1

# Beginning of the script:
# Create the directory for the files of the script
if [ ! -d "$(dirname "${ROFI_FB_PREV_LOC_FILE}")" ]
then
    mkdir -p "$(dirname "${ROFI_FB_PREV_LOC_FILE}")"
fi
if [ ! -d "$(dirname "${ROFI_FB_HISTORY_FILE}")" ]
then
    mkdir -p "$(dirname "${ROFI_FB_HISTORY_FILE}")"
fi

# Initialize $ROFI_FB_CUR_DIR
if [ -d "${ROFI_FB_START_DIR}" ]
then
    ROFI_FB_CUR_DIR="${ROFI_FB_START_DIR}"
else
    ROFI_FB_CUR_DIR="$PWD"
fi

# Read last location, otherwise we default to $ROFI_FB_START_DIR or $PWD.
if [ -f "${ROFI_FB_PREV_LOC_FILE}" ]
then
    ROFI_FB_CUR_DIR=$(cat "${ROFI_FB_PREV_LOC_FILE}")
fi

# Handle argument.
if [ -n "$@" ]
then
    if [[ "$@" == /* ]]
    then
        ROFI_FB_CUR_DIR="$@"
    else
        ROFI_FB_CUR_DIR="${ROFI_FB_CUR_DIR}/$@"
    fi
fi

# If argument is no directory.
if [ ! -d "${ROFI_FB_CUR_DIR}" ]
then
    if [ -x "${ROFI_FB_CUR_DIR}" ]
    then
        coproc ( "${ROFI_FB_CUR_DIR}" >/dev/null 2>&1 )
        exec 1>&-
        exit;
    elif [ -f "${ROFI_FB_CUR_DIR}" ]
    then
        if [[ "${ROFI_FB_NO_HISTORY}" -ne 1 ]]
        then
            # Append selected entry to history and remove exceeding entries
            sed -i "s|${ROFI_FB_CUR_DIR}|##deleted##|g" "${ROFI_FB_HISTORY_FILE}"
            sed -i '/##deleted##/d' "${ROFI_FB_HISTORY_FILE}"
            echo "${ROFI_FB_CUR_DIR}" >> "${ROFI_FB_HISTORY_FILE}"
            if [ "$( wc -l < "${ROFI_FB_HISTORY_FILE}" )" -gt "${ROFI_FB_HISTORY_MAXCOUNT}" ]
            then
                sed -i 1d "${ROFI_FB_HISTORY_FILE}"
            fi
        fi
        # Open the selected entry with $ROFI_FB_GENERIC_FO
        coproc ( "${ROFI_FB_GENERIC_FO}" "${ROFI_FB_CUR_DIR}" >/dev/null 2>&1 )
        if [ -d "${ROFI_FB_START_DIR}" ]
        then
            echo "${ROFI_FB_START_DIR}" > "${ROFI_FB_PREV_LOC_FILE}"
        fi
        exit;
    fi
    exit;
fi

# Process current dir.
if [ -n "${ROFI_FB_CUR_DIR}" ]
then
    ROFI_FB_CUR_DIR=$(readlink -e "${ROFI_FB_CUR_DIR}")
    echo "${ROFI_FB_CUR_DIR}" > "${ROFI_FB_PREV_LOC_FILE}"
    pushd "${ROFI_FB_CUR_DIR}" >/dev/null
fi

# Output to rofi
if [[ "${ROFI_FB_NO_HISTORY}" -ne 1 ]]
then
    tac "${ROFI_FB_HISTORY_FILE}" | grep "${ROFI_FB_CUR_DIR}"
fi
echo ".."
ls
# vim:sw=4:ts=4:et:


================================================
FILE: Examples/test_script_env.sh
================================================
#!/usr/bin/env bash

if [ -z "${ROFI_OUTSIDE}" ]
then
    echo "run this script in rofi".
    exit
fi

echo -en "\x00no-custom\x1ffalse\n"
echo -en "\x00data\x1fmonkey do, monkey did\n"
echo -en "\x00use-hot-keys\x1ftrue\n"
echo -en "${ROFI_RETV}\x00icon\x1ffirefox\x1finfo\x1ftest\n"

if [ -n "${ROFI_INFO}" ]
then
    echo "my info: ${ROFI_INFO} "
fi
if [ -n "${ROFI_DATA}" ]
then
    echo "my data: ${ROFI_DATA} "
fi


================================================
FILE: Examples/test_script_mode.sh
================================================
#!/usr/bin/env bash

if [ "$*" = "quit" ]; then
	exit 0
fi

if [ "$@" ]; then
	# Override the previously set prompt.
	echo -en "\x00prompt\x1fChange prompt\n"
	for a in {1..10}; do
		echo "$a"
	done
	echo "quit"
else
	echo -en "\x00prompt\x1ftesting\n"
	echo -en "\0urgent\x1f0,2\n"
	echo -en "\0active\x1f1\n"
	echo -en "\0markup-rows\x1ftrue\n"
	echo -en "\0message\x1fSpecial <b>bold</b>message\n"

	echo -en "aap\0icon\x1ffolder\n"
	echo -en "blob\0icon\x1ffolder\x1fdisplay\x1fblub\n"
	echo "noot"
	echo "mies"
	echo -en "-------------\0nonselectable\x1ftrue\x1fpermanent\x1ftrue\n"
	echo "testing"
	echo "<b>Bold</b>"
	echo "quit"
fi


================================================
FILE: Examples/test_script_mode_color.sh
================================================
#!/usr/bin/env bash

if [ "$*" = "quit" ]
then
    exit 0
fi

if [ "$@" ]
then
    # Override the previously set prompt.
    echo -en "\0theme\x1felement-text { background-color: $@;}\n"
    echo -en "\0keep-selection\x1ftrue\n"
#    echo -en "\0new-selection\x1f2\n"
    echo "red"
    echo "lightgreen"
    echo "lightblue"
    echo "lightyellow"
    echo "quit"
else
    echo -en "\x00prompt\x1ftesting\n"
    echo -en "\0urgent\x1f0,2\n"
    echo -en "\0active\x1f1\n"
    echo -en "\0keep-selection\x1ftrue\n"
    echo -en "\0message\x1fSpecial <b>bold</b>message\n"

    echo "red"
    echo "lightgreen"
    echo "lightblue"
    echo "lightyellow"
    echo "pink"
    echo "green"
    echo "blue"
    echo "gold"
    echo "quit"
fi


================================================
FILE: Examples/test_script_mode_delim.sh
================================================
#!/usr/bin/env bash

if [[ "$@" = "quit" ]]
then
    exit 0
fi

# Override the previously set prompt.
# We only want to do this on first call of script.
if [[ $ROFI_RETV = 0 ]]
then
    echo -en "\x00delim\x1f\\x1\n"
fi
echo -en "\x00message\x1fmy line1\nmyline2\nmy line3\x1"
echo -en "\x00prompt\x1fChange prompt\x1"
for a in {1..10}
do
    echo -en "$a\x1"
done
echo -en "newline\ntest\x1"
echo -en "quit"


================================================
FILE: INSTALL.md
================================================
# Installation guide

This guide explains how to install rofi using its build system and how you can
make debug builds.

Rofi uses [Meson](https://mesonbuild.com/) as build system.
Be default rofi builds with both backends (x11 and wayland) if available on the
system. If no backend is found, it will give an error.
You can force the build system to disable the [wayland](#disable-wayland-support)
or [x11](#disable-x11-support) backend.

## DEPENDENCY

### For building

- C compiler that supports the c99 standard. (gcc or clang)

- meson

- ninja

- pkg-config

- flex 2.5.39 or higher

- bison

- check (Can be disabled using the `--disable-check` configure flag)
    check is used for build-time tests and does not affect functionality.

- Developer packages of the external libraries

- glib-compile-resources

### External libraries

- libpango >= 1.50

- libpangocairo

- libcairo

- libcairo-xcb

- libglib2.0 >= 2.72
  - gmodule-2.0
  - gio-unix-2.0

- libgdk-pixbuf-2.0

- libstartup-notification-1.0

- libxkbcommon >= 0.4.1

- libxkbcommon-x11

- libxcb (sometimes split, you need libxcb, libxcb-xkb and libxcb-randr
    libxcb-xinerama)

- xcb-util

- xcb-util-wm (sometimes split as libxcb-ewmh and libxcb-icccm)

- xcb-util-cursor

- xcb-imdkit  (optional, 1.0.3 or up preferred)

On debian based systems, the developer packages are in the form of:
`<package>-dev` on rpm based `<package>-devel`.

For wayland support:

- wayland
- wayland-protocols >= 1.17

## Install from a release

When downloading from the github release page, make sure to grab the archive
`rofi-{version}.tar.[g|x]z`. The auto-attached files `source code (zip|tar.gz)`
by github do not contain a valid release. It misses a setup build system and
includes irrelevant files.

### Meson

Check dependencies and configure build system:

```bash
    meson setup build
```

Build Rofi:

```bash
    ninja -C build
```

The actual install, execute as root (if needed):

```bash
    ninja -C build install
```

The default installation prefix is: `/usr/local/` use `meson setup build
--prefix={prefix}` to install into another location.

## Install a checkout from git

The GitHub Pages version of these directions may be out of date.  Please use
[INSTALL.md from the online repo][master-install] or your local repository.

If you don't have a checkout:

```bash
    git clone --recursive https://github.com/DaveDavenport/rofi
    cd rofi/
```

If you already have a checkout:

```bash
    cd rofi/
    git pull
    git submodule update --init
```

From this point, use the same steps you use for a release.

## Options for building

When you run the configure step there are several options you can configure.

For Meson, before the initial setup, you can see rofi options in
`meson_options.txt` and Meson options with `meson setup --help`. Meson's
built-in options can be set using regular command line arguments, like so:
`meson setup build --option=value`. Rofi-specific options can be set using the
`-D` argument, like so: `meson setup build -Doption=value`. After the build dir
is set up by `meson setup build`, the `meson configure build` command can be
used to configure options, by the same means.

The most useful one to set is the installation prefix:

```bash
    # Meson
    meson setup build --prefix <installation path>
```

f.e.

```bash
    # Meson
    meson setup build --prefix /usr
```

### Disable x11 support

```bash
meson setup build -Dxcb=disabled
```

### Disable wayland support

```bash
meson setup build -Dwayland=disabled
```

### Install locally

or to install locally:

```bash
    # Meson
    meson setup build --prefix ${HOME}/.local
```

### Verbose build output

Show the commands called (when using ninja):

```bash
    # Meson
    ninja -C build -v
```

### Debug build

Compile with debug symbols and no optimization, this is useful for making
backtraces:

```bash
    # Meson
    meson configure build --debug
    ninja -C build
```

### Get a backtrace

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.

```bash
    # Meson (because it uses a separate build directory)
    gdb build/rofi core
```

> Where the core file is located and what its exact name is different on each
> distributions. Please consult the relevant documentation.

For more information see the rofi-debugging(5) manpage.

## Install distribution

### Debian or Ubuntu

```bash
    apt install rofi
```

### Fedora

```bash
    dnf install rofi
```

### ArchLinux

```bash
    pacman -S rofi
```

### Gentoo

An ebuild is available, `x11-misc/rofi`. It's up to date, but you may need to
enable ~arch to get the latest release:

```bash
    echo 'x11-misc/rofi ~amd64' >> /etc/portage/package.accept_keywords
```

for amd64 or:

```bash
    echo 'x11-misc/rofi ~x86' >> /etc/portage/package.accept_keywords
```

for i386.

To install it, simply issue `emerge rofi`.

### openSUSE

On both openSUSE Leap and openSUSE Tumbleweed rofi can be installed using:

```bash
    sudo zypper install rofi
```

### FreeBSD

```bash
    sudo pkg install rofi
```

### macOS

On macOS rofi can be installed via [MacPorts](https://www.macports.org):

```bash
    sudo port install rofi
```

[master-install]: https://github.com/DaveDavenport/rofi/blob/master/INSTALL.md#install-a-checkout-from-git


================================================
FILE: README.md
================================================
<p align="center">
<a href="https://github.com/davatorium/rofi/issues"><img src="https://img.shields.io/github/issues/davatorium/rofi.svg"></a>
<a href="https://img.shields.io/github/forks/davatorium/rofi.svg"><img src="https://img.shields.io/github/forks/davatorium/rofi.svg"></a>
<a href="https://github.com/davatorium/rofi/stargazers"><img src="https://img.shields.io/github/stars/davatorium/rofi.svg"></a>
<a href="https://github.com/davatorium/rofi/releases"><img src="https://img.shields.io/github/downloads/davatorium/rofi/total.svg"></a>
<a href="https://repology.org/metapackage/rofi/versions"><img src="https://repology.org/badge/tiny-repos/rofi.svg"></a>
</p>

**Please match the documentation and scripts to the version of rofi used**

- [next version](https://github.com/davatorium/rofi)
- [2.0.0](https://github.com/davatorium/rofi/tree/2.0.0)
- [1.7.9](https://github.com/davatorium/rofi/tree/1.7.9)
- [1.7.8](https://github.com/davatorium/rofi/tree/1.7.8)
- [1.7.7](https://github.com/davatorium/rofi/tree/1.7.7)
- [1.7.6](https://github.com/davatorium/rofi/tree/1.7.6)
- [1.7.5](https://github.com/davatorium/rofi/tree/1.7.5)
- [1.7.4](https://github.com/davatorium/rofi/tree/1.7.4)
- [1.7.3](https://github.com/davatorium/rofi/tree/1.7.3)
- [1.7.2](https://github.com/davatorium/rofi/tree/1.7.2)
- [1.7.1](https://github.com/davatorium/rofi/tree/1.7.1)
- [1.7.0](https://github.com/davatorium/rofi/tree/1.7.0)

Also see the locally installed documentation (manpages).

<h1 align="center"> Rofi </h1>
<p align="center"><i>A window switcher, Application launcher and dmenu replacement</i>.</p>

<https://user-images.githubusercontent.com/84911063/139428874-fe182dd6-82c6-49b8-8da1-920ddda3d1ed.mp4>

**Rofi** started as a clone of simpleswitcher, written by [Sean
Pringle](http://github.com/seanpringle/simpleswitcher) - a popup window
switcher roughly based on
[superswitcher](http://code.google.com/p/superswitcher/). Simpleswitcher laid
the foundations, and therefore Sean Pringle deserves most of the credit for
this tool. **Rofi** (renamed, as it lost the *simple* property) has been
extended with extra features, like an application launcher and ssh-launcher,
and can act as a drop-in dmenu replacement, making it a very versatile tool.
Thanks to the great work of [lbonn](https://github.com/lbonn), who added
Wayland support in his fork and maintained it for years, **Rofi**
now officially supports Wayland (since 2025).

**Rofi**, like dmenu, will provide the user with a textual list of options
where one or more can be selected.
This can either be running an application, selecting a window, or options
provided by an external script.

### What is rofi not?

Rofi is not:

- A UI toolkit.

- A library to be used in other applications.

- An application that can support every possible use-case. It tries to be
    generic enough to be usable by everybody.
  - Specific functionality can be added using scripts or plugins, many exists.

- Just a dmenu replacement. The dmenu functionality is a nice 'extra' to
    **rofi**, not its main purpose.

## Table of Contents

- [Features](#features)
- [Modes](#modes)
- [Manpages](#manpage)
- [Installation](#installation)
- [Quickstart](#quickstart)
  - [Usage](#usage)
  - [Configuration](#configuration)
  - [Themes](#themes)
- [Screenshots](#screenshots)
- [Wiki](#wiki)
- [Discussion places](#discussion-places)

## Features

Its main features are:

- Fully configurable keyboard navigation

- Type to filter
  - Tokenized: type any word in any order to filter
  - Case insensitive (togglable) or SmartCase
  - Support for fuzzy-, regex-, prefix-, and glob-matching

- UTF-8 enabled
  - UTF-8-aware string collating
  - International keyboard support (\`e -> è)

- RTL language support

- Cairo drawing and Pango font rendering

- Built-in modes:
  - Window switcher mode
    - EWMH compatible WM
    - Work arounds for i3,bspwm
    - Wayland based WMs that follow the wlr family

  - Application launcher

  - Desktop file application launcher

  - SSH launcher mode

  - File browser

  - Combi mode, allowing several modes to be merged into one list

- History-based ordering — last 25 choices are ordered on top based on use
    (optional)

- Levenshtein distance or fzf like sorting of matches (optional)

- Drop-in dmenu replacement
  - Many added improvements

- Easily extensible using scripts and plugins

- Advanced Theming

## Modes

**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.

Below is a list of the different modes:

- **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.

- **window**: Switch between windows on an EWMH compatible window manager.

- **ssh**: Connect to a remote host via ssh.

- **filebrowser**: A basic file-browser for opening files.

- **keys**: list internal keybindings.

- **script**: Write (limited) custom mode using simple scripts.

- **combi**: Combine multiple modes into one.

**Rofi** is known to work on Linux and BSD.

## Wayland support

### Build

Please follow the [build instructions](INSTALL.md) to build rofi.

Wayland support is enabled by default, along with X11/xcb.

rofi can also be built *without* X11/xcb or wayland, but atleast one backend
should be enabled:

    meson build -Dxcb=disabled
    meson build -Dwayland=disabled

### Usage

**Rofi** should automatically select the xcb or wayland backend depending on
the environment it is run on.

To force the use of the xcb backend (if enabled during build), the `-x11`
option can be used:

    rofi -x11 ...

### Missing features in Wayland mode

Due to the different architecture and available APIs in Wayland mode, some original rofi features are difficult or impossible to replicate

- `-normal-window` flag. Though it is also considered as a toy/deprecated feature in Upstream rofi. Not impossible but would require some work.
- `-monitor -n` for fine-grained selection of monitor to display rofi on
- some window locations parameters work partially, `x-offset` and `y-offset` are only working from screen edges
- fake transparency
- window mode on KWin which implements different protocols than the wlr family

### Wayland DPI

On wayland, the output is only known after the first surface is shown. This makes sizing
rofi windows in absolute size (mm) very difficult, a problem unique for rofi,
as the actual DPI is unknown before hand. This can be worked around by manually
passing the right DPI via configuration system. If the `dpi` config option is
set to `0` and only one monitor is connected rofi will use the DPI of the only
connected monitor or if you have multiple monitors and you specify a monitor
name, it will use the DPI of that monitor.

## Manpage

For more up to date information, please see the manpages. The other sections
and links might have outdated information as they have relatively less
maintainance than the manpages. So, if you come across any issues please
consult manpages, [discussion](https://github.com/davatorium/rofi/discussions)
and [issue tracker](https://github.com/davatorium/rofi/issues?q=) before filing
new issue.

- Manpages:
  - [rofi](doc/rofi.1.markdown)
  - [rofi-theme](doc/rofi-theme.5.markdown)
  - [rofi-debugging](doc/rofi-debugging.5.markdown)
  - [rofi-script](doc/rofi-script.5.markdown)
  - [rofi-theme-selector](doc/rofi-theme-selector.1.markdown)
  - [rofi-thumbnails](doc/rofi-thumbnails.5.markdown)
  - [rofi-keys](doc/rofi-keys.5.markdown)
  - [rofi-dmenu](doc/rofi-dmenu.5.markdown)

## Installation

Please see the [installation guide](INSTALL.md) for instructions on how to
install **Rofi**.

## Quickstart

### Usage

> **This section just gives a brief overview of the various options. To get the
> full set of options see the [manpages](#manpage) section above**

#### Running rofi

To launch **rofi** directly in a certain mode, specify a mode with `rofi -show <mode>`.
To show the `run` dialog:

```bash
    rofi -show run
```

Or get the options from a script:

```bash
    ~/my_script.sh | rofi -dmenu
```

Specify an ordered, comma-separated list of modes to enable. Enabled modes can
be changed at runtime. Default key is `Ctrl+Tab`. If no modes are specified,
all configured modes will be enabled. To only show the `run` and `ssh`
launcher:

```bash
    rofi -modes "run,ssh" -show run
```

The modes to combine in combi mode.
For syntax to `-combi-modes`, see `-modes`.
To get one merge view, of `window`,`run`, and `ssh`:

```bash
 rofi -show combi -combi-modes "window,run,ssh" -modes combi
```

### Configuration

Generate a default configuration file

```bash
mkdir -p ~/.config/rofi
rofi -dump-config > ~/.config/rofi/config.rasi
```

This creates a file called `config.rasi` in the `~/.config/rofi/` folder. You
can modify this file to set configuration settings and modify themes.
`config.rasi` is the file rofi looks to by default.

Please see the [configuration
guide](https://github.com/davatorium/rofi/blob/next/CONFIG.md) for a summary of
configuration options. More detailed options are provided in the manpages.

### Themes

Please see the [themes
manpages](https://github.com/davatorium/rofi/blob/next/doc/rofi-theme.5.markdown)
for a detailed description.

The latest bundled themes can be found
[here](https://github.com/davatorium/rofi/tree/next/themes).

## Screenshots

Rezlooks:

![screenshot](https://raw.githubusercontent.com/davatorium/rofi/next/releasenotes/1.6.0/icons.png)

Arthur:

![screenshot2](https://raw.githubusercontent.com/davatorium/rofi/next/releasenotes/1.6.0/icons2.png)

Default theme:

![default](https://raw.githubusercontent.com/davatorium/rofi/next/releasenotes/1.4.0/rofi-no-fzf.png)

## Wiki

| ❗ **The Wiki is currently unmaintained and might contain outdated data** |
| --- |

[Go to wiki](https://github.com/davatorium/rofi/wiki) .

### Contents

- [User scripts](https://github.com/davatorium/rofi/wiki/User-scripts)
- [Examples](https://github.com/davatorium/rofi/wiki#examples)
- [dmenu Specs](https://github.com/davatorium/rofi/wiki/dmenu_specs)
- [mode Specs](https://github.com/davatorium/rofi/wiki/mode-Specs)
- [F.A.Q.](https://github.com/davatorium/rofi/wiki/Frequently-Asked-Questions).
- [Script mode](https://github.com/davatorium/rofi/wiki/rfc-script-mode)
- [Creating an issue](https://github.com/davatorium/rofi/blob/master/.github/CONTRIBUTING.md)
- [Creating a Pull request](https://github.com/davatorium/rofi/wiki/Creating-a-pull-request)

## Discussion places

The [GitHub Discussions](https://github.com/davatorium/rofi/discussions) is the
preferred location for discussions.

- [GitHub Discussions](https://github.com/davatorium/rofi/discussions)
- IRC (#rofi on irc.libera.chat)

### Stargazers over time

[![Stargazers over time](https://starchart.cc/davatorium/rofi.svg)](https://starchart.cc/davatorium/rofi)


================================================
FILE: config/config.c
================================================
/*
 * rofi
 *
 * MIT/X11 License
 * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be
 * included in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 *
 */

#include "config.h"
#include "rofi-types.h"
#include "settings.h"
#include <glib.h>
#include <stdio.h>
#include <stdlib.h>

Settings config = {
/** List of enabled modes. */
/** -modes */
#ifdef WINDOW_MODE
    .modes = "window,drun,run,ssh",
#else
    .modes = "drun,run,ssh",
#endif
    /** Font */
    .menu_font = "mono 12",

    /** Whether to load and show icons */
    .show_icons = FALSE,

    /** Custom command to generate preview icons */
    .preview_cmd = NULL,

    /** Custom command to call when menu selection changes */
    .on_selection_changed = NULL,
    /** Custom command to call when menu mode changes */
    .on_mode_changed = NULL,
    /** Custom command to call when menu entry is accepted */
    .on_entry_accepted = NULL,
    /** Custom command to call when menu is canceled */
    .on_menu_canceled = NULL,
    /** Custom command to call when menu finds errors */
    .on_menu_error = NULL,
    /** Custom command to call when menu screenshot is taken */
    .on_screenshot_taken = NULL,
    /** Terminal to use. (for ssh and open in terminal) */
    .terminal_emulator = "rofi-sensible-terminal",
    .ssh_client = "ssh",
    /** Command when executing ssh. */
    .ssh_command = "{terminal} -e {ssh-client} {host} [-p {port}]",
    /** Command when running */
    .run_command = "{cmd}",
    /** Command used to list executable commands. empty -> internal */
    .run_list_command = "",
    /** Command executed when running application in terminal */
    .run_shell_command = "{terminal} -e {cmd}",
    /** Command executed on accep-entry-custom for window modus */
    .window_command = "wmctrl -i -R {window}",
    /** No default icon theme, we search Adwaita and gnome as fallback */
    .icon_theme = NULL,
    /**
     * Location of the window.
     * Enumeration indicating location or gravity of window.
     *
     * WL_NORTH_WEST      WL_NORTH      WL_NORTH_EAST
     *
     * WL_EAST            WL_CENTER     WL_EAST
     *
     * WL_SOUTH_WEST      WL_SOUTH      WL_SOUTH_EAST
     *
     */
    .location = WL_CENTER,
    /**
     * On Wayland, specifies the layer where rofi is rendered. Available layers are
     * `background`, `bottom`, `top`, `overlay`. The default layer is `overlay`.
     */
    .wayland_layer = "overlay",
    /** Y offset */
    .y_offset = 0,
    /** X offset */
    .x_offset = 0,
    /** Always show config.menu_lines lines, even if less lines are available */
    .fixed_num_lines = TRUE,
    /** Do not use history */
    .disable_history = FALSE,
    /** Programs ignored for history */
    .ignored_prefixes = "",
    /** Sort the displayed list */
    .sort = FALSE,
    /** Use levenshtein sorting when matching */
    .sorting_method = "normal",
    /** Case sensitivity of the search */
    .case_sensitive = FALSE,
    /** Case smart of the search */
    .case_smart = FALSE,
    /** Cycle through in the element list */
    .cycle = TRUE,
    /** Height of an element in #chars */
    .element_height = 1,
    /** Sidebar mode, show the modes */
    .sidebar_mode = FALSE,
    /** auto select */
    .auto_select = FALSE,
    /** Parse /etc/hosts file in ssh view. */
    .parse_hosts = FALSE,
    /** Parse ~/.ssh/known_hosts file in ssh view. */
    .parse_known_hosts = TRUE,
    /** Modes to combine into one view. */
    .combi_modes = "window,run",
    .tokenize = TRUE,
    .matching = "normal",
    .matching_method = MM_NORMAL,

    /** Desktop entries to match in drun */
    .drun_match_fields = "name,generic,exec,categories,keywords",
    /** Only show entries in this category */
    .drun_categories = NULL,
    /** Exclude entries in this category */
    .drun_exclude_categories = NULL,
    /** Desktop entry show actions */
    .drun_show_actions = FALSE,
    /** Desktop format display */
    .drun_display_format =
        "{name} [<span weight='light' size='small'><i>({generic})</i></span>]",
    /** Desktop Link launch command */
    .drun_url_launcher = "xdg-open",

    /** Window fields to match in window mode*/
    .window_match_fields = "all",
    /** Monitor */
    .monitor = "-5",
    /** Set filter */
    .filter = NULL,
    .dpi = -1,
    .threads = 0,
    .scroll_method = 0,
    .window_format = "{w}    {c}   {t}",
    .click_to_exit = TRUE,
    .global_kb = FALSE,
    .theme = NULL,
    .plugin_path = PLUGIN_PATH,
    .max_history_size = 25,
    .combi_hide_mode_prefix = FALSE,
    .combi_display_format = "{mode} {text}",

    .matching_negate_char = '-',

    .cache_dir = NULL,
    .window_thumbnail = FALSE,

    /** drun cache */
    .drun_use_desktop_cache = FALSE,
    .drun_reload_desktop_cache = FALSE,

    /** Benchmarks */
    .benchmark_ui = FALSE,

    /** normalize match */
    .normalize_match = FALSE,
    /** steal focus */
    .steal_focus = FALSE,
    /** fallback icon */
    .application_fallback_icon = NULL,
    /** refilter limit in ms*/
    .refilter_timeout_limit = 300,
    /** workaround for broken xserver (#300 on xserver, #611) */
    .xserver_i300_workaround = FALSE,
    /** What browser to use for completion */
    .completer_mode = "filebrowser",
    /** Whether to enable imdkit, see #2123 */
    .enable_imdkit = TRUE,
};


================================================
FILE: data/rofi-theme-selector.desktop
================================================
[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Terminal=false
Exec=rofi-theme-selector
Name=Rofi Theme Selector
Icon=rofi


================================================
FILE: data/rofi.desktop
================================================
[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Terminal=false
Exec=rofi -show
Name=Rofi
Icon=rofi


================================================
FILE: doc/README.md
================================================
Manpages are build using [pandoc](https://pandoc.org/)

Manpages can be updated using the following make command:

```
make generate-manpage
```


================================================
FILE: doc/default_configuration.rasi
================================================
configuration {

    // Timeout from user input.
    timeout {
        // The delay after inactivity to execute action.
        delay: 0;
        // The action to execute once the delay expires.
        action: "kb-cancel";
    }

    // File browser mode.
    filebrowser {
        sorting-method:    "name";
        directories-first: true;
    }
}

@theme "default"


================================================
FILE: doc/default_theme.rasi
================================================
/**
 * rofi -dump-theme output.
 **/
* {
    red:                         rgba ( 220, 50, 47, 100 % );
    selected-active-foreground:  var(background);
    lightfg:                     rgba ( 88, 104, 117, 100 % );
    separatorcolor:              var(foreground);
    urgent-foreground:           var(red);
    alternate-urgent-background: var(lightbg);
    lightbg:                     rgba ( 238, 232, 213, 100 % );
    spacing:                     2;
    border-color:                var(foreground);
    normal-background:           var(background);
    background-color:            rgba ( 0, 0, 0, 0 % );
    alternate-active-background: var(lightbg);
    active-foreground:           var(blue);
    blue:                        rgba ( 38, 139, 210, 100 % );
    urgent-background:           var(background);
    alternate-normal-foreground: var(foreground);
    selected-active-background:  var(blue);
    background:                  rgba ( 253, 246, 227, 100 % );
    selected-normal-foreground:  var(lightbg);
    active-background:           var(background);
    alternate-active-foreground: var(blue);
    alternate-normal-background: var(lightbg);
    foreground:                  rgba ( 0, 43, 54, 100 % );
    selected-urgent-background:  var(red);
    selected-urgent-foreground:  var(background);
    normal-foreground:           var(foreground);
    alternate-urgent-foreground: var(red);
    selected-normal-background:  var(lightfg);
}
element {
    padding: 1px ;
    spacing: 5px ;
    border:  0;
    cursor:  pointer;
}
element normal.normal {
    background-color: var(normal-background);
    text-color:       var(normal-foreground);
}
element normal.urgent {
    background-color: var(urgent-background);
    text-color:       var(urgent-foreground);
}
element normal.active {
    background-color: var(active-background);
    text-color:       var(active-foreground);
}
element selected.normal {
    background-color: var(selected-normal-background);
    text-color:       var(selected-normal-foreground);
}
element selected.urgent {
    background-color: var(selected-urgent-background);
    text-color:       var(selected-urgent-foreground);
}
element selected.active {
    background-color: var(selected-active-background);
    text-color:       var(selected-active-foreground);
}
element alternate.normal {
    background-color: var(alternate-normal-background);
    text-color:       var(alternate-normal-foreground);
}
element alternate.urgent {
    background-color: var(alternate-urgent-background);
    text-color:       var(alternate-urgent-foreground);
}
element alternate.active {
    background-color: var(alternate-active-background);
    text-color:       var(alternate-active-foreground);
}
element-text {
    background-color: rgba ( 0, 0, 0, 0 % );
    text-color:       inherit;
    highlight:        inherit;
    cursor:           inherit;
}
element-icon {
    background-color: rgba ( 0, 0, 0, 0 % );
    size:             1.0000em ;
    text-color:       inherit;
    cursor:           inherit;
}
window {
    padding:          5;
    background-color: var(background);
    border:           1;
}
mainbox {
    padding: 0;
    border:  0;
}
message {
    padding:      1px ;
    border-color: var(separatorcolor);
    border:       2px dash 0px 0px ;
}
textbox {
    text-color: var(foreground);
}
listview {
    padding:      2px 0px 0px ;
    scrollbar:    true;
    border-color: var(separatorcolor);
    spacing:      2px ;
    fixed-height: 0;
    border:       2px dash 0px 0px ;
}
scrollbar {
    width:        4px ;
    padding:      0;
    handle-width: 8px ;
    border:       0;
    handle-color: var(normal-foreground);
}
sidebar {
    border-color: var(separatorcolor);
    border:       2px dash 0px 0px ;
}
button {
    spacing:    0;
    text-color: var(normal-foreground);
    cursor:     pointer;
}
button selected {
    background-color: var(selected-normal-background);
    text-color:       var(selected-normal-foreground);
}

num-filtered-rows, num-rows {
    text-color: grey;
    expand:     false;
}
textbox-num-sep {
    text-color: grey;
    expand:     false;
    str:        "/";
}
inputbar {
    padding:    1px;
    spacing:    0px;
    text-color: var(normal-foreground);
    children:   [ prompt,textbox-prompt-colon,entry, overlay,num-filtered-rows, textbox-num-sep, num-rows, case-indicator ];
}
overlay {
    background-color: var(normal-foreground);
    foreground-color: var(normal-background);
    text-color: var(normal-background);
    padding: 0 0.2em;
    margin: 0 0.2em;
}
case-indicator {
    spacing:    0;
    text-color: var(normal-foreground);
}
entry {
    spacing:           0;
    text-color:        var(normal-foreground);
    placeholder-color: grey;
    placeholder:       "Type to filter";
    cursor:            text;
}
prompt {
    spacing:    0;
    text-color: var(normal-foreground);
}
textbox-prompt-colon {
    margin:     0px 0.3000em 0.0000em 0.0000em ;
    expand:     false;
    str:        ":";
    text-color: inherit;
}


================================================
FILE: doc/man_filter.lua
================================================
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


================================================
FILE: doc/meson.build
================================================
man_files = [
    'rofi.1',
    'rofi-sensible-terminal.1',
    'rofi-theme-selector.1',
    'rofi-actions.5',
    'rofi-debugging.5',
    'rofi-dmenu.5',
    'rofi-keys.5',
    'rofi-script.5',
    'rofi-theme.5',
    'rofi-thumbnails.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']), 'man_filter.lua'],
            output: 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('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()
doxy_conf.set('PACKAGE', meson.project_name())
doxy_conf.set('VERSION', meson.project_version())
doxy_conf.set('abs_builddir', join_paths(meson.project_build_root(), meson.current_build_dir()))
doxy_conf.set('abs_top_srcdir', meson.project_source_root())

doxyfile = configure_file(
    input: 'rofi.doxy.in',
    output: 'rofi.doxy',
    configuration: doxy_conf,
)

doxygen = find_program('doxygen', required: false)
if doxygen.found()
    html_target = custom_target('doxy',
        input: doxyfile,
        output: 'html',
        command: [doxygen, doxyfile],
        install: false,
    )
endif


================================================
FILE: doc/rofi-actions.5.markdown
================================================
# rofi-actions(5)

## NAME

**rofi-actions** - Custom commands following interaction with rofi menus

## DESCRIPTION

**rofi** allows to set custom commands or scripts to be executed when some actions are performed in the menu, such as changing selection, accepting an entry or canceling.

This makes it possible for example to play sound effects or read aloud menu entries on selection.

## USAGE

Following is the list of rofi flags for specifying custom commands or scripts to execute on supported actions:

`-on-selection-changed` *cmd*

Command or script to run when the current selection changes. Selected text is forwarded to the command replacing the pattern *{entry}*.

`-on-entry-accepted` *cmd*

Command or script to run when a menu entry is accepted. Accepted text is forwarded to the command replacing the pattern *{entry}*.

`-on-mode-changed` *cmd*

Command or script to run when the menu mode (e.g. drun,window,ssh...) is changed.

`-on-menu-canceled` *cmd*

Command or script to run when the menu is canceled.

`-on-menu-error` *cmd*

Command or script to run when an error menu is shown (e.g. `rofi -e "error message"`). Error text is forwarded to the command replacing the pattern *{error}*.

`-on-screenshot-taken` *cmd*

Command or script to run when a screenshot of rofi is taken. Screenshot path is forwarded to the command replacing the pattern *{path}*.

### Example usage

Rofi command line:

```bash
rofi -on-selection-changed "/path/to/select.sh {entry}" \
     -on-entry-accepted "/path/to/accept.sh {entry}" \
     -on-menu-canceled "/path/to/exit.sh" \
     -on-mode-changed "/path/to/change.sh" \
     -on-menu-error "/path/to/error.sh {error}" \
     -on-screenshot-taken "/path/to/camera.sh {path}" \
     -show drun
```

Rofi config file:

```css
configuration {
    on-selection-changed: "/path/to/select.sh {entry}";
    on-entry-accepted: "/path/to/accept.sh {entry}";
    on-menu-canceled: "/path/to/exit.sh";
    on-mode-changed: "/path/to/change.sh";
    on-menu-error: "/path/to/error.sh {error}";
    on-screenshot-taken: "/path/to/camera.sh {path}";
}
```

### Play sound effects

Here's an example bash script that plays a sound effect using `aplay` when the current selection is changed:

```bash
#!/bin/bash

coproc aplay -q $HOME/Music/selecting_an_item.wav
```

The use of `coproc` for playing sounds is suggested, otherwise the rofi process will wait for sounds to end playback before exiting.

### Read aloud

Here's an example bash script that reads aloud currently selected entries using `espeak`:

```bash
#!/bin/bash

killall espeak
echo "selected: $@" | espeak
```


================================================
FILE: doc/rofi-debugging.5.markdown
================================================
# rofi-debugging(5)

## NAME

Debugging rofi.

When reporting an issue with rofi crashing, or misbehaving. It helps to do some
small test to help pin-point the problem.

First try disabling your custom configuration: `-no-config`

This disables the parsing of the configuration files. This runs rofi in *stock*
mode.

If you run custom C plugins, you can disable the plugins using: `-no-plugins`

## Get the relevant information for an issue

Please pastebin the output of the following commands:

```bash
rofi -help
rofi -dump-config
rofi -dump-theme
```

`rofi -help`  provides us with the configuration files parsed, the exact
version, monitor layout and more useful information.

The `rofi -dump-config` and `rofi -dump-theme` output gives us `rofi`
interpretation of your configuration and theme.

Please check the output for identifiable information and remove this.

## Timing traces

To get a timing trace, enable the **Timings** debug domain.

```bash
G_MESSAGES_DEBUG=Timings rofi -show drun
```
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.

Example trace:

```text
(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
```

## Debug domains

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:

- all: Show debug information from all domains.
- X11Helper: The X11 Helper functions.
- View: The main window view functions.
- Widgets.Box: The Box widget.
- Modes.DMenu: The dmenu mode.
- Modes.Run: The run mode.
- Modes.DRun: The desktop file run mode.
- Modes.Window: The window mode.
- Modes.Script: The script mode.
- Modes.Combi: The script mode.
- Modes.Ssh: The ssh mode.
- Rofi: The main application.
- Timings: Get timing output.
- Theme: Theme engine debug output. (warning lots of output).
- Widgets.Icon: The Icon widget.
- Widgets.Box: The box widget.
- Widgets.Container: The container widget.
- Widgets.Window: The window widget.
- Helpers.IconFetcher: Information about icon lookup.

For full list see `man rofi`.

Example: `G_MESSAGES_DEBUG=Dialogs.DRun rofi -show drun` To get specific output
from the Desktop file run dialog.

To redirect the debug output to a file (`~/rofi.log`) add:

```bash
rofi -show drun -log ~/rofi.log
```

Specifying the logfile automatically enabled all log domains.
This can be useful when rofi is launched from a window manager.

## Creating a backtrace

First make sure you compile **rofi** with debug symbols:

```bash
make CFLAGS="-O0 -g3" clean rofi
```

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.

```bash
gdb rofi core
```

Then type inside gdb:

```bash
thread apply all bt
```

The output trace is useful when reporting crashes.

Some distribution have `systemd-coredump`, this way you can easily get a
backtrace via `coredumpctl`.

## SEE ALSO

rofi-sensible-terminal(1), dmenu(1), rofi-theme(5),
rofi-script(5), rofi-keys(5),rofi-theme-selector(1)

## AUTHOR

* Qball Cow <qball@blame.services>


================================================
FILE: doc/rofi-dmenu.5.markdown
================================================
# rofi-dmenu(5)

## NAME

**rofi dmenu mode** - Rofi dmenu emulation

## DESCRIPTION

To integrate **rofi** into scripts as simple selection dialogs, 
**rofi** supports emulating **dmenu(1)** (A dynamic menu for X11).

The website for `dmenu` can be found [here](http://tools.suckless.org/dmenu/).

**rofi** does not aim to be 100% compatible with `dmenu`. There are simply too
many flavors of `dmenu`. The idea is that the basic usage command-line flags
are obeyed, theme-related flags are not. Besides, **rofi** offers some extended
features (like multi-select, highlighting, message bar, extra key bindings).

## BASIC CONCEPT

In `dmenu` mode, **rofi** 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.

By default separation of rows is done on new lines, making it easy to pipe the
output a one application into **rofi** and the output of rofi into the next.

## USAGE 

By launching **rofi** with the `-dmenu` flag it will go into dmenu emulation
mode.

```bash
ls | rofi -dmenu
```

### DMENU DROP-IN REPLACEMENT

If `argv[0]` (calling command) is dmenu, **rofi** will start in dmenu mode.
This way, it can be used as a drop-in replacement for dmenu. Just copy or
symlink **rofi** to dmenu in `$PATH`.

```bash
ln -s /usr/bin/rofi /usr/bin/dmenu
```

### DMENU VS SCRIPT MODE

Script mode is used to extend **rofi**, dmenu mode is used to extend a script.
The two do share much of the same input format. Please see the
**rofi-script(5)** manpage for more information.

### DMENU SPECIFIC COMMANDLINE FLAGS

A lot of these options can also be modified by the script using special input.
See the **rofi-script(5)** manpage for more information about this syntax.

`-sep` *separator*

Separator for `dmenu`. Example: To show a list of 'a' to 'e' with '|' as a
separator:

```bash
echo "a|b|c|d|e" | rofi -sep '|' -dmenu
```

`-p` *prompt*

Specify the prompt to show in `dmenu` mode. For example, select 'monkey',
a,b,c,d, or e.

```bash
echo "a|b|c|d|e" | rofi -sep '|' -dmenu -p "monkey"
```

Default: *dmenu*

`-l` *number of lines to show*

Maximum number of lines the menu may show before scrolling.

```bash
rofi -dmenu -l 25
```

Default: *15*

`-i`

Makes `dmenu` searches case-insensitive

`-a` *X*

Active row, mark *X* as active. Where *X* 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:

- A single row: '5'
- A range of (last 3) rows: '-3:'
- 4 rows starting from row 7: '7:11' (or in legacy notation: '7-10')
- A set of rows: '2,0,-9'
- Or any combination: '5,-3:,7:11,2,0,-9'

`-u` *X*

Urgent row, mark *X* as urgent. See `-a` option for details.

`-only-match`

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.

`-no-custom`

Only return a selected item, do not allow custom entry.
This mode returns directly when no entries given.

`-format` *format*

Allows the output of dmenu to be customized (N is the total number of input
entries):

- 's' selected string
- 'i' index (0 - (N-1))
- 'd' index (1 - N)
- 'q' quote string
- 'p' Selected string stripped from Pango markup (Needs to be a valid string)
- 'f' filter string (user input)
- 'F' quoted filter string (user input)

Default: 's'

`-select` *string*

Select first line that matches the given string

`-mesg` *string*

Add a message line below the filter entry box. Supports Pango markup. For more
information on supported markup, see
[here](https://docs.gtk.org/Pango/pango_markup.html)

`-dump`

Dump the filtered list to stdout and quit.
This can be used to get the list as **rofi** would filter it.
Use together with `-filter` command.

`-input` *file*

Reads from *file* instead of stdin.

`-password`

Hide the input text. This should not be considered secure!

`-markup-rows`

Tell **rofi** that DMenu input is Pango markup encoded, and should be rendered.
See [here](https://docs.gtk.org/Pango/pango_markup.html)
for details about Pango markup.

`-multi-select`

Allow multiple lines to be selected. Adds a small selection indicator to the
left of each entry.

`-sync`

Force **rofi** mode to first read all data from stdin before showing the
selection window. This is original dmenu behavior.

Note: the default asynchronous mode will also be automatically disabled if used
with conflicting options,
such as `-dump`, `-only-match` or `-auto-select`.

`-window-title` *title*

Set name used for the window title. Will be shown as Rofi - *title*

`-w` *windowid*

Position **rofi** over the window with the given X11 window ID.

`-keep-right`

Set ellipsize mode to start. So, the end of the string is visible.

`-display-columns`

A comma seperated list of columns to show.

`-display-column-separator`

The column separator. This is a regex. 

*default*: '\t'

`-ballot-selected-str` *string*

When multi-select is enabled, prefix this string when element is selected.

*default*: "☑ "

`-ballot-unselected-str` *string*

When multi-select is enabled, prefix this string when element is not selected.

*default*: "☐ "

`-ellipsize-mode` (start|middle|end)

Set ellipsize mode on the listview.

*default* "end"

## PARSING ROW OPTIONS

Extra options for individual rows can be also set. See the **rofi-script(5)**
manpage for details; the syntax and supported features are identical.

## RETURN VALUE

- **0**: Row has been selected accepted by user.
- **1**: User cancelled the selection.
- **10-28**: Row accepted by custom keybinding.

## SEE ALSO

rofi(1), rofi-sensible-terminal(1), dmenu(1), rofi-theme(5), rofi-script(5),
rofi-theme-selector(1), ascii(7)

## AUTHOR

Qball Cow <qball@gmpclient.org>

Rasmus Steinke <rasi@xssn.at>

Morgane Glidic <sardemff7+rofi@sardemff7.net>

Original code based on work by: Sean Pringle <sean.pringle@gmail.com>

For a full list of authors, check the AUTHORS file.


================================================
FILE: doc/rofi-keys.5.markdown
================================================
# rofi-keys(5)

## NAME

**rofi keys** - Rofi Key and Mouse bindings

## DESCRIPTION

**rofi** supports overriding of any of it key and mouse binding.

## Setting binding

Bindings can be done on the commandline (-{bindingname}):

```bash
rofi -show run -kb-accept-entry 'Control+Shift+space'
```

or via the configuration file:

```css
configuration {
  kb-accept-entry: "Control+Shift+space";
}
```

The key can be set by its name (see above) or its keycode:

```css
configuration {
  kb-accept-entry: "Control+Shift+[65]";
}
```

An easy way to look up keycode is xev(1).

Multiple keys can be specified for an action as a comma separated list:

```css
configuration {
  kb-accept-entry: "Control+Shift+space,Return";
}
```

By Default **rofi** reacts on pressing, to act on the release of all keys
prepend the binding with `!`:

```css
configuration {
  kb-accept-entry: "!Control+Shift+space,Return";
}
```

## Unsetting a binding

To unset a binding, pass an empty string.

```css
configuration {
  kb-clear-line: "";
}
```

## Keyboard Bindings

`kb-primary-paste`

Paste primary selection

Default:  Control+V,Shift+Insert

`kb-secondary-paste`

Paste clipboard

Default:  Control+v,Insert

`kb-secondary-copy`

Copy current selection to clipboard

Default:  Control+c

`kb-clear-line`

Clear input line

Default:  Control+w

`kb-move-front`

Beginning of line

Default:  Control+a

`kb-move-end`

End of line

Default:  Control+e

`kb-move-word-back`

Move back one word

Default:  Alt+b,Control+Left

`kb-move-word-forward`

Move forward one word

Default:  Alt+f,Control+Right

`kb-move-char-back`

Move back one char

Default:  Left,Control+b

`kb-move-char-forward`

Move forward one char

Default:  Right,Control+f

`kb-remove-word-back`

Delete previous word

Default:  Control+Alt+h,Control+BackSpace

`kb-remove-word-forward`

Delete next word

Default:  Control+Alt+d

`kb-remove-char-forward`

Delete next char

Default:  Delete,Control+d

`kb-remove-char-back`

Delete previous char

Default:  BackSpace,Shift+BackSpace,Control+h

`kb-remove-to-eol`

Delete till the end of line

Default:  Control+k

`kb-remove-to-sol`

Delete till the start of line

Default:  Control+u

`kb-transpose-chars`

Transpose (swap) the two characters before the cursor

Default:  Control+t

`kb-accept-entry`

Accept entry

Default:  Control+j,Control+m,Return,KP\_Enter

`kb-accept-custom`

Use entered text as command (in ssh/run modes)

Default:  Control+Return

`kb-accept-custom-alt`

Use entered text as command (in ssh/run modes)

Default:  Control+Shift+Return

`kb-accept-alt`

Use alternate accept command.

Default:  Shift+Return

`kb-delete-entry`

Delete entry from history

Default:  Shift+Delete

`kb-mode-next`

Switch to the next mode.

Default:  Shift+Right,Control+Tab

`kb-mode-previous`

Switch to the previous mode.

Default:  Shift+Left,Control+ISO\_Left\_Tab

`kb-mode-complete`

Start completion for mode.

Default:  Control+l

`kb-row-left`

Go to the previous column

Default:  Control+Page\_Up

`kb-row-right`

Go to the next column

Default:  Control+Page\_Down

`kb-row-up`

Select previous entry

Default:  Up,Control+p

`kb-row-down`

Select next entry

Default:  Down,Control+n

`kb-row-tab`

Go to next row, if one left, accept it, if no left next mode.

Default:

`kb-element-next`

Go to next row.

Default: Tab

`kb-element-prev`

Go to previous row.

Default: ISO\_Left\_Tab

`kb-page-prev`

Go to the previous page

Default:  Page\_Up

`kb-page-next`

Go to the next page

Default:  Page\_Down

`kb-row-first`

Go to the first entry

Default:  Home,KP\_Home

`kb-row-last`

Go to the last entry

Default:  End,KP\_End

`kb-row-select`

Set selected item as input text

Default:  Control+space

`kb-screenshot`

Take a screenshot of the rofi window

Default:  Alt+S

`kb-ellipsize`

Toggle between ellipsize modes for displayed data

Default:  Alt+period

`kb-toggle-case-sensitivity`

Toggle case sensitivity

Default:  grave,dead\_grave

`kb-toggle-sort`

Toggle filtered menu sort

Default:  Alt+grave

`kb-cancel`

Quit rofi

Default:  Escape,Control+g,Control+bracketleft

`kb-custom-1`

Custom keybinding 1

Default:  Alt+1

`kb-custom-2`

Custom keybinding 2

Default:  Alt+2

`kb-custom-3`

Custom keybinding 3

Default:  Alt+3

`kb-custom-4`

Custom keybinding 4

Default:  Alt+4

`kb-custom-5`

Custom Keybinding 5

Default:  Alt+5

`kb-custom-6`

Custom keybinding 6

Default:  Alt+6

`kb-custom-7`

Custom Keybinding 7

Default:  Alt+7

`kb-custom-8`

Custom keybinding 8

Default:  Alt+8

`kb-custom-9`

Custom keybinding 9

Default:  Alt+9

`kb-custom-10`

Custom keybinding 10

Default:  Alt+0

`kb-custom-11`

Custom keybinding 11

Default:  Alt+exclam

`kb-custom-12`

Custom keybinding 12

Default:  Alt+at

`kb-custom-13`

Custom keybinding 13

Default:  Alt+numbersign

`kb-custom-14`

Custom keybinding 14

Default:  Alt+dollar

`kb-custom-15`

Custom keybinding 15

Default:  Alt+percent

`kb-custom-16`

Custom keybinding 16

Default:  Alt+dead\_circumflex

`kb-custom-17`

Custom keybinding 17

Default:  Alt+ampersand

`kb-custom-18`

Custom keybinding 18

Default:  Alt+asterisk

`kb-custom-19`

Custom Keybinding 19

Default:  Alt+parenleft

`kb-select-1`

Select row 1

Default:  Super+1

`kb-select-2`

Select row 2

Default:  Super+2

`kb-select-3`

Select row 3

Default:  Super+3

`kb-select-4`

Select row 4

Default:  Super+4

`kb-select-5`

Select row 5

Default:  Super+5

`kb-select-6`

Select row 6

Default:  Super+6

`kb-select-7`

Select row 7

Default:  Super+7

`kb-select-8`

Select row 8

Default:  Super+8

`kb-select-9`

Select row 9

Default:  Super+9

`kb-select-10`

Select row 10

Default:  Super+0

`kb-entry-history-up`

Go up in the entry history.

Default:    Control+Up

`kb-entry-history-down`

Go down in the entry history.

Default:    Control+Down

`kb-matcher-up`

Select the next matcher.

Default: Super+equal

`kb-matcher-down`

Select the previous matcher.

Default: Super+minus

## Mouse Bindings

`ml-row-left`

Go to the previous column

Default:  ScrollLeft

`ml-row-right`

Go to the next column

Default:  ScrollRight

`ml-row-up`

Select previous entry

Default:  ScrollUp

`ml-row-down`

Select next entry

Default:  ScrollDown

`me-select-entry`

Select hovered row

Default:  MousePrimary

`me-accept-entry`

Accept hovered row

Default:  MouseDPrimary

`me-accept-custom`

Accept hovered row with custom action

Default:  Control+MouseDPrimary

## Mouse key bindings

The following mouse buttons can be bound:

* `Primary`: Primary (Left) mouse button click.
* `Secondary`:  Secondary (Right) mouse button click.
* `Middle`: Middle mouse button click.
* `Forward`: The forward mouse button.
* `Back`: The back mouse button.
* `ExtraN`: The N'the mouse button. (Depending on mouse support).

The Identifier is constructed as follow:

`Mouse<D><Button>`

* `D` indicates optional Double press.
* `Button` is the button name.

So `MouseDPrimary` is Primary (`Left`) mouse button double click.

## SEE ALSO

rofi(1), rofi-sensible-terminal(1), rofi-theme(5), rofi-script(5)

## AUTHOR

Qball Cow <qball@gmpclient.org>

Rasmus Steinke <rasi@xssn.at>

Morgane Glidic <sardemff7+rofi@sardemff7.net>

Original code based on work by: Sean Pringle <sean.pringle@gmail.com>

For a full list of authors, check the AUTHORS file.


================================================
FILE: doc/rofi-script.5.markdown
================================================
# rofi-script(5)

## NAME

**rofi script mode** - Rofi format for scriptable mode.

## DESCRIPTION

**rofi** 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.

## USAGE

To specify a script mode, set a mode with the following syntax:
"{name}:{executable}"

For example:

```bash
rofi -show fb -modes "fb:file_browser.sh"
```

The name should be unique.

## API

Rofi calls the executable without arguments on startup.  This should generate a
list of options, separated by a newline (`\n`) (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.

A simple script would be:

```bash
#!/usr/bin/env bash

if [ x"$@" = x"quit" ]
then
    exit 0
fi
echo "reload"
echo "quit"

```

This shows two entries, reload and quit. When the quit entry is selected, rofi
closes.

## Environment

Rofi sets the following environment variable when executing the script:

### `ROFI_RETV`

An integer number with the current state:

- **0**: Initial call of script.
- **1**: Selected an entry.
- **2**: Selected a custom entry.
- **3**: Deleted an entry.
- **10-28**: Custom keybinding 1-19 ( need to be explicitly enabled by script ).

### `ROFI_INFO`

Environment get set when selected entry get set with the property value of the
'info' row option, if set.

### `ROFI_DATA`

Environment get set when script sets `data` option in header.

### `ROFI_INPUT`

The original input string from user.

## Passing mode options

Extra options, like setting the prompt, can be set by the script. Extra options
are lines that start with a NULL character (`\0`) followed by a key, separator
(`\x1f`) and value.

For example to set the prompt:

```bash
    echo -en "\0prompt\x1fChange prompt\n"
```

The following extra options exists:

-   **prompt**:      Update the prompt text.

-   **message**:     Update the message text.

-   **markup-rows**: If 'true' renders markup in the row.

-   **urgent**:      Mark rows as urgent. (for syntax see the urgent option in
    dmenu mode)

-   **active**:      Mark rows as active. (for syntax see the active option in
    dmenu mode)

-   **delim**:       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.

-   **no-custom**:   If set to 'true'; only accept listed entries, ignore custom
    input.

-   **use-hot-keys**: If set to true, it enabled the Custom keybindings for
    script. Warning this breaks the normal rofi flow.

-   **keep-selection**: If set, the selection is not moved to the first entry,
    but the current position is maintained. The filter is cleared.

-   **keep-filter**: If set, the filter is not cleared.

-   **new-selection**: If `keep-selection` is set, this allows you to override
    the selected entry (absolute position).

-   **data**:         Passed data to the next execution of the script via
    **ROFI\_DATA**.

-   **theme**:       Small theme snippet to f.e. change the background color of
    a widget.

-   **switch-mode**:  Switches to the given mode if enabled, otherwise ignored.

The **theme** 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.

## Parsing row options

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.

For example:

```bash
    echo -en "aap\0icon\x1ffolder\n"
```

The following options are supported:

-   **icon**: Set the icon for that row. Multiple fallback icons can be specified using comma-separated values.

-   **display**: Replace the displayed string. (Original string will still be used for filtering)

-   **meta**: Specify invisible search terms used for filtering.

-   **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.

-   **urgent**: Set urgent flag on entry (true/false)

-   **active**: Set active flag on entry (true/false)

multiple entries can be passed using the `\x1f` separator.

```bash
    echo -en "aap\0icon\x1ffolder,inode-directory\x1finfo\x1ftest\n"
```

## Executing external program

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).

In bash the best way to do this is using `coproc`.

```bash
 coproc ( myApp  > /dev/null  2>&1 )
```

## DASH shell

If you use the `dash` shell for your script, take special care with how dash
handles escaped values for the separators. See issue #1201 on github.

## Script locations

To specify a script there are the following options:

- Specify an absolute path to the script.
- The script is executable and located in your $PATH

Scripts located in the following location are **loaded** on startup
and can be directly launched based on the filename (without extension):

- The script is in `$XDG_CONFIG_HOME/rofi/scripts/`, this is usually
  `~/.config/rofi/scripts/`.

If you have a script 'mymode.sh' in this folder you can open it using:

```bash
rofi -show mymode
```

See `rofi -h` output for a list of detected scripts.

## SEE ALSO

rofi(1), rofi-sensible-terminal(1), dmenu(1), rofi-theme(5),
rofi-theme-selector(1)

## AUTHOR

Qball Cow <qball@gmpclient.org>

Rasmus Steinke <rasi@xssn.at>

Morgane Glidic <sardemff7+rofi@sardemff7.net>

Original code based on work by: Sean Pringle <sean.pringle@gmail.com>

For a full list of authors, check the AUTHORS file.


================================================
FILE: doc/rofi-sensible-terminal.1.markdown
================================================
# rofi-sensible-terminal(1)

## NAME

**rofi-sensible-terminal** -  launches $TERMINAL with fallbacks

## SYNOPSIS

rofi-sensible-terminal [arguments]

## DESCRIPTION

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.

It tries to start one of the following (in that order):

* `$TERMINAL` (this is a non-standard variable)
* x-terminal-emulator
* urxvt
* rxvt
* st
* terminology
* qterminal
* Eterm
* aterm
* uxterm
* xterm
* roxterm
* xfce4-terminal.wrapper
* mate-terminal
* lxterminal
* konsole
* alacritty
* kitty
* wezterm
* foot


## SEE ALSO

rofi(1)

## AUTHORS

Dave Davenport and contributors

Copied script from i3:
Michael Stapelberg and contributors


================================================
FILE: doc/rofi-theme-selector.1.markdown
================================================
# rofi-theme-selector(1)

## NAME

**rofi-theme-selector** - Preview and apply themes for **rofi**

## DESCRIPTION

**rofi-theme-selector** is a bash/rofi script to preview and apply themes for
**rofi**. It's part of any installation of **rofi**.

## USAGE

### Running rofi-theme-selector

**rofi-theme-selector** shows a list of all available themes in a **rofi**
window. It lets you preview each theme with the Enter key and apply the theme
to your **rofi** configuration file with Alt+a.

## Theme directories

**rofi-theme-selector** searches the following directories for themes:

- ${PREFIX}/share/rofi/themes
- $XDG_CONFIG_HOME/rofi/themes
- $XDG_DATA_HOME/share/rofi/themes

${PREFIX} reflects the install location of rofi. In most cases this will be
"/usr".<br>
$XDG_CONFIG_HOME is normally unset. Default path is "$HOME/.config".<br>
$XDG_DATA_HOME is normally unset. Default path is "$HOME/.local/share".

## SEE ALSO

rofi(1)

## AUTHORS

Qball Cow qball@gmpclient.org<br>
Rasmus Steinke rasi@xssn.at


================================================
FILE: doc/rofi-theme.5.markdown
================================================
# rofi-theme(5)

## NAME

**rofi-theme** - Rofi theme format files

## Getting started with theming

The easiest way to get started theming rofi is by modifying your existing theme.

Themes can be modified/tweaked by adding theming elements to the end of the\
config file. The default location of this file is `~/.config/rofi/config.rasi`,
if the file does not exists, you can create it.

A basic config:

```css
configuration {
  modes: [ combi ];
  combi-modes: [ window, drun, run ];
}

@theme "gruvbox-light"
 
/* Insert theme modifications after this */
```

For example if we want to change the `Type to filter` text in the entry box we
append the following:

```css
entry {
    placeholder: "Type here";
}
```

In the above section, `entry` indicates the widget, `placeholder` is the
property we want to modify and we set it to the string `"Type here"`. To find
the commonly available widgets in rofi, see the 'Basic structure' section.

To change the mouse over cursor to a pointer, add:

```css
entry {
    placeholder: "Type here";
    cursor: pointer;
}
```

For the next modification, we want to add the icon after each text element and
increase the size. First we start by modifying the `element` widget:

```css

element {
  orientation: horizontal;
  children: [ element-text, element-icon ];
  spacing: 5px;
}

```

Resulting in the following packing:

```text
┌─────────────────────────────────────────────────────────────────────┐ 
│ element                                                             │ 
│ ┌─────────────────────────────────────────────┐ ┌─────────────────┐ │ 
│ │element─text                                 │ │ element─icon    │ │ 
│ └─────────────────────────────────────────────┘ └─────────────────┘ │ 
└─────────────────────────────────────────────────────────────────────┘ 
```

The `element` (container) widget hold each entry in the `listview`, we add the
two pre-defined children in the order we want to show. We also specify the
packing direction (`orientation`) and the spacing between the children
(`spacing`). We specify the space between the two children in absolute pixels
(`px`).

To increase the icon-size, we need to modify the `element-icon` widget.

```css
element-icon {
    size: 2.5em;
}
```

```text
┌─────────────────────────────────────────────────────────────────────┐ 
│ element                                                             │ 
│ ┌─────────────────────────────────────────────┐ ┌─────────────────┐ │ 
│ │element─text                                 │ │    element      │ │ 
│ │                                             │ │       ─         │ │ 
│ │                                             │ │     icon        │ │ 
│ └─────────────────────────────────────────────┘ └─────────────────┘ │ 
└─────────────────────────────────────────────────────────────────────┘ 
```

In this example we specify the size in the [em](https://www.w3.org/Style/LieBos3e/em) unit.

Now lets change the text color of both the `entry` and the `element-text`
widget to red and background to blue.

```css
entry, element-text {
  text-color: red;
  background-color: rgb(0,0,255);
}
```

Here we use two different methods of writing down the color, for `text-color`
we used a named color, for `background-color` we specify it in `rgb`.
We also specify the property for multiple widgets by passing a comma separated
list of widget names.

If you want to center the text relative to the icon, we can set this:

```css
element-text {
    vertical-align: 0.5;
}
```

```text
┌─────────────────────────────────────────────────────────────────────┐ 
│ element                                                             │ 
│ ┌─────────────────────────────────────────────┐ ┌─────────────────┐ │ 
│ │                                             │ │    element      │ │ 
│ │element-text                                 │ │       ─         │ │ 
│ │                                             │ │     icon        │ │ 
│ └─────────────────────────────────────────────┘ └─────────────────┘ │ 
└─────────────────────────────────────────────────────────────────────┘ 
```

We can also customize the cursor's color, width, and choose to hide it when the input box is empty. You could, for example, create a crimson block cursor that only appears when text is entered, like this:

```css
entry {
  cursor-color: rgb(220,20,60);
  cursor-width: 8px;
  hide-cursor-on-empty: true;
}
```

By default, the `cursor-color` will be the same as the `text-color`. The
`cursor-width` will always default to 2 pixels and `hide-cursor-on-empty` is set to false.

If you want to see the complete theme, including the modification you can run:

```bash
rofi -dump-theme
```

## Default theme loading

By default, rofi loads the default theme. This theme is **always** loaded.
The default configuration contains:

```css
@theme "default"
```

To unload the default theme, and load another theme, add the `@theme` statement
to your `config.rasi` file.

If you have a theme loaded via `@theme` or use the default theme, you can tweak
it by adding overriding elements at the end of your `config.rasi` file.

For the difference between `@import` and `@theme` see the `Multiple file
handling` section in this manpage.

To see the default theme, run the following command:

```bash
rofi -no-config -dump-theme
```

## Description

The need for a new theme format was motivated by the fact that the way rofi
handled widgets has changed. From a very static drawing of lines and text to a
nice structured form of packing widgets. This change made it possible to
provide a more flexible theme framework. The old theme format and config file
are not flexible enough to expose these options in a user-friendly way.
Therefore, a new file format has been created, replacing the old one.

## Format specification

## Encoding

The encoding of the file is UTF-8. Both unix (`\n`) and windows (`\r\n`)
newlines format are supported. But unix is preferred.

## Comments

C and C++ file comments are supported.

- Anything after  `//` and before a newline is considered a comment.

- Everything between `/*` and `*/` is a comment, this comment can span
    multiple lines.

Comments can be nested and the C comments can be inline.

The following is valid:

```css
// Magic comment.
property: /* comment */ value;
```

However, this is not:

```css
prop/*comment*/erty: value;
```

## White space

White space and newlines, like comments, are ignored by the parser.

This:

```css
property: name;
```

Is identical to:

```css
     property             :
name

;
```

## File extension

The preferred file extension for the new theme format is **rasi**. This is an
abbreviation for **r**ofi **a**dvanced **s**tyle **i**nformation. If a theme
file is split over multiple files, include files can have the: **rasinc**
extension.

## Basic Structure

Each element has a section with defined properties. Global properties can be
defined in section `* { }`. Sub-section names begin with an optional hash
symbol `#`.

It is advised to define the *global properties section* on top of the file to
make inheritance of properties clearer.

```css
/* Global properties section */
* {
    // list of properties
}

/* Element theme section. */
{element path} {
    // list of properties
}
{elements... } {
    // list of properties
}
```

If there are multiple sections with the same name, they are merged. Duplicate
properties are overwritten and the last parsed entry kept.

## Global properties section

A theme can have one or more global properties sections. If there is more than
one, they will be merged.

The global properties section denotes the defaults for each element.
Each property of this section can be referenced with `@{identifier}`
(See Properties section)

A global properties section is indicated with a `*` as element path.

## Element theme section

A theme can have multiple element theme sections.

The element path can consist of multiple names separated by whitespace or dots.
Each element may contain any number of letters, numbers and `-`'s.
The first element in the element path can optionally start with a `#` (for
historic reasons). Multiple elements can be specified by a `,`.

This is a valid element name:

```css
element normal.normal {
    background-color: blue;
}
button {
    background-color: blue;
}
```

And is identical to:

```css
element normal normal, button {
    background-color: blue;
}
```

Each section inherits the global properties. Properties can be explicitly
inherited from their parent with the `inherit` keyword.
In the following example:

```css
window {
 a: 1;
 b: 2;
 children: [ mainbox ];
}
mainbox {
    a: inherit;
    b: 4;
    c: 8;
}
```

The element `mainbox` will have the following set of properties (if `mainbox`
is a child of `window`):

```css
a: 1;
b: 4;
c: 8;
```

If multiple sections are defined with the same name, they are merged by the
parser. If multiple properties with the same name are defined in one section,
the last encountered property is used.

## Properties Format

The properties in a section consist of:

```css
{identifier}: {value};
```

Both fields are mandatory for a property.

The `identifier` names the specified property. Identifiers can consist of any
combination of numbers, letters and '-'. It must not contain any whitespace.
The structure of the `value` defines the type of the property. The current
parser does not define or enforce a certain type of a particular `identifier`.
When used, values with the wrong type that cannot be converted are ignored.

The current theme format supports different types:

- a string
- an integer number
- a fractional number
- a boolean value
- a color
- image
- text style
- line style
- a distance
- a padding
- a border
- a position
- a reference
- an orientation
- a cursor
- a list of keywords
- an array of values
- an environment variable
- Inherit

Some of these types are a combination of other types.

### String

- Format:  `(["'])[:print:]+\1`

Strings are always surrounded by double (`"`) or single (`'`, apostrophe) quotes. Between
the quotes there can be any printable character.

For example:

```css
font: "Awasome 12";
```

The string must be valid UTF-8, special characters can be escaped:

```css
text { content: "Line one\n\tIndented line two 'Quoted text'"; }
text { content: 'Line one\n\tIndented line two "Quoted text"'; }
text { content: "Line one\n\tIndented line two \"Quoted text\""; }
```

The following special characters can be escaped: `\b`, `\f`, `\n`, `\r`, `\t`, `\v`, `\`,
`"` and `'` (double quotes inside single-quotes or in reverse don't need escape).

### Integer

- Format: `[-+]?[:digit:]+`

An integer may contain any number.

For examples:

```css
lines: 12;
```

### Real

- Format: `[-+]?[:digit:]+(\.[:digit:]+)?`

A real is an integer with an optional fraction.

For example:

```css
real: 3.4;
```

The following is not valid: `.3`, `3.` or scientific notation: `3.4e-3`.

### Boolean

- Format: `(true|false)`

Boolean value is either `true` or `false`. This is case-sensitive.

For example:

```css
dynamic: false;
```

### Image

**rofi** support a limited set of background-image formats.

- Format: url("path to image");

- Format: url("path to image", scale);
    where scale is: none, both, width, height

- Format: linear-gradient(stop color,stop1, color, stop2 color, ...);

- Format: linear-gradient(to direction, stop color,stop1, color, stop2 color,
    ...); where direction is:   top,left,right,bottom.

- Format: linear-gradient(angle, stop color,stop1, color, stop2 color, ...);
    Angle in deg,rad,grad (as used in color).

Where the `path` is a string, and `stop` color is of type color.

### Color

**rofi** supports the color formats as specified in the CSS standard (1,2,3 and
some of CSS 4)

- Format: `#{HEX}{3}` (rgb)

- Format: `#{HEX}{4}` (rgba)

- Format: `#{HEX}{6}` (rrggbb)

- Format: `#{HEX}{8}` (rrggbbaa)

- Format: `rgb[a]({INTEGER},{INTEGER},{INTEGER}[, {PERCENTAGE}])`

- Format: `rgb[a]({INTEGER}%,{INTEGER}%,{INTEGER}%[, {PERCENTAGE}])`

- Format: `hsl[a]( {ANGLE}, {PERCENTAGE}, {PERCENTAGE} [, {PERCENTAGE}])`

- Format: `hwb[a]( {ANGLE}, {PERCENTAGE}, {PERCENTAGE} [, {PERCENTAGE}])`

- Format: `cmyk( {PERCENTAGE}, {PERCENTAGE}, {PERCENTAGE}, {PERCENTAGE} [,
    {PERCENTAGE} ])`

- Format: `{named-color} [ / {PERCENTAGE} ]`

The white-space format proposed in CSS4 is also supported.

The different values are:

- `{HEX}` is a hexadecimal number ('0-9a-f' case insensitive).

- `{INTEGER}` value can be between 0 and 255 or 0-100 when representing
    percentage.

- `{ANGLE}` is the angle on the color wheel, can be in `deg`, `rad`, `grad`
    or `turn`. When no unit is specified, degrees is assumed.

- `{PERCENTAGE}` can be between 0-1.0, or 0%-100%

- `{named-color}` is one of the following colors:

    AliceBlue, AntiqueWhite, Aqua, Aquamarine, Azure, Beige, Bisque, Black,
    BlanchedAlmond, Blue, BlueViolet, Brown, BurlyWood, CadetBlue, Chartreuse,
    Chocolate, Coral, CornflowerBlue, Cornsilk, Crimson, Cyan, DarkBlue,
    DarkCyan, DarkGoldenRod, DarkGray, DarkGrey, DarkGreen, DarkKhaki,
    DarkMagenta, DarkOliveGreen, DarkOrange, DarkOrchid, DarkRed, DarkSalmon,
    DarkSeaGreen, DarkSlateBlue, DarkSlateGray, DarkSlateGrey, DarkTurquoise,
    DarkViolet, DeepPink, DeepSkyBlue, DimGray, DimGrey, DodgerBlue, FireBrick,
    FloralWhite, ForestGreen, Fuchsia, Gainsboro, GhostWhite, Gold, GoldenRod,
    Gray, Grey, Green, GreenYellow, HoneyDew, HotPink, IndianRed, Indigo,
    Ivory, Khaki, Lavender, LavenderBlush, LawnGreen, LemonChiffon, LightBlue,
    LightCoral, LightCyan, LightGoldenRodYellow, LightGray, LightGrey,
    LightGreen, LightPink, LightSalmon, LightSeaGreen, LightSkyBlue,
    LightSlateGray, LightSlateGrey, LightSteelBlue, LightYellow, Lime,
    LimeGreen, Linen, Magenta, Maroon, MediumAquaMarine, MediumBlue,
    MediumOrchid, MediumPurple, MediumSeaGreen, MediumSlateBlue,
    MediumSpringGreen, MediumTurquoise, MediumVioletRed, MidnightBlue,
    MintCream, MistyRose, Moccasin, NavajoWhite, Navy, OldLace, Olive,
    OliveDrab, Orange, OrangeRed, Orchid, PaleGoldenRod, PaleGreen,
    PaleTurquoise, PaleVioletRed, PapayaWhip, PeachPuff, Peru, Pink, Plum,
    PowderBlue, Purple, RebeccaPurple, Red, RosyBrown, RoyalBlue, SaddleBrown,
    Salmon, SandyBrown, SeaGreen, SeaShell, Sienna, Silver, SkyBlue, SlateBlue,
    SlateGray, SlateGrey, Snow, SpringGreen, SteelBlue, Tan, Teal, Thistle,
    Tomato, Turquoise, Violet, Wheat, White, WhiteSmoke, Yellow,
    YellowGreen,transparent

For example:

```css
background-color: #FF0000;
border-color: rgba(0,0,1, 0.5);
text-color: SeaGreen;
```

or

```css
background-color: transparent;
text-color: Black;
```

### Text style

- Format: `(bold|italic|underline|strikethrough|none)`

Text style indicates how the highlighted text is emphasized. `None` indicates
that no emphasis should be applied.

- `bold`: make the text thicker then the surrounding text.
- `italic`: put the highlighted text in script type (slanted).
- `underline`: put a line under the text.
- `strikethrough`: put a line through the text.

The following options are available on pango 1.50.0 and up:

- `uppercase`: Uppercase the text.
- `lowercase`: Lowercase the text.

The following option is disabled as pango crashes on this if there is eel
upsizing or wrapping. This will be re-enabled once fixed:

- `capitalize`: Capitalize the text.

### Line style

- Format: `(dash|solid)`

Indicates how a line should be drawn.
It currently supports:

- `dash`:  a dashed line, where the gap is the same width as the dash
- `solid`: a solid line

### Distance

- Format: `{Integer}px`
- Format: `{Real}em`
- Format: `{Real}ch`
- Format: `{Real}%`
- Format: `{Real}mm`

A distance can be specified in 3 different units:

- `px`: Screen pixels.
- `em`: Relative to text height.
- `ch`: Relative to width of a single number.
- `mm`: Actual size in millimeters (based on dpi).
- `%`:  Percentage of the **monitor** size.

Distances used in the horizontal direction use the monitor width. Distances in
the vertical direction use the monitor height.
For example:

```css
   padding: 10%;
```

On a full-HD (1920x1080) monitor, it defines a padding of 192 pixels on the left
and right side and 108 pixels on the top and bottom.

#### Calculating sizes

Rofi supports some maths in calculating sizes. For this it uses the CSS syntax:

```css
width: calc( 100% - 37px );
```

```css
width: calc( 20% min 512 );
```

It supports the following operations:

- `+`      : Add
- `-`      : Subtract
- `/`      : Divide
- `-`      : Multiply
- `modulo` : Modulo
- `min`    : Minimum of lvalue or rvalue;
- `max`    : Maximum of lvalue or rvalue;
- `floor`  : Round down lvalue to the next multiple of rvalue
- `ceil`   : Round up lvalue to the next multiple of rvalue
- `round`  : Round lvalue to the next multiple of rvalue

It uses the C precedence ordering.

### Padding

- Format: `{Integer}`
- Format: `{Distance}`
- Format: `{Distance} {Distance}`
- Format: `{Distance} {Distance} {Distance}`
- Format: `{Distance} {Distance} {Distance} {Distance}`

If no unit is specified, pixels are assumed.

The different number of fields in the formats are parsed like:

- 1 field: `all`
- 2 fields: `top&bottom` `left&right`
- 3 fields: `top`, `left&right`, `bottom`
- 4 fields: `top`, `right`, `bottom`, `left`

### Border

- Format: `{Integer}`

- Format: `{Distance}`

- Format: `{Distance} {Distance}`

- Format: `{Distance} {Distance} {Distance}`

- Format: `{Distance} {Distance} {Distance} {Distance}`

- Format: `{Distance} {Line style}`

- Format: `{Distance} {Line style} {Distance} {Line style}`

- Format: `{Distance} {Line style} {Distance} {Line style} {Distance} {Line
    style}`

- Format: `{Distance} {Line style} {Distance} {Line style} {Distance} {Line
    style} {Distance} {Line style}`

Borders are identical to padding, except that each distance field has a line
style property.

> When no unit is specified, pixels are assumed.

### Position

Indicate a place on the window/monitor.

```text
┌─────────────┬─────────────┬─────────────┐
│ north west  │    north    │  north east │
├─────────────┼─────────────┼─────────────┤
│   west      │   center    │     east    │
├─────────────┼─────────────┼─────────────┤
│ south west  │    south    │  south east │
└─────────────┴─────────────┴─────────────┘
```

- Format: `(center|east|north|west|south|north east|north west|south west|south
  east)`

### Visibility

It is possible to hide widgets:

```css
inputbar {
    enabled: false;
}
```

### Reference

- Format: `@{PROPERTY NAME}`

A reference can point to another reference. Currently, the maximum number of
redirects is 20. A property always refers to another property. It cannot be
used for a subpart of the property. For example, this is not valid:

```css
highlight: bold @pink;
```

But this is:

```css
* {
    myhigh: bold #FAA;
}

window {
    highlight: @myhigh;
}
```

- Format: `var(PROPERTY NAME, DEFAULT)`

A reference can point to another reference. Currently, the maximum number of
redirects is 20. A property always refers to another property. It cannot be
used for a subpart of the property.

Example:

```css
window {
    width: var( width, 30%);
}
```

If the property `width` is set globally (`*{}`) that value is used, if the
property `width` is not set, the default value is used.

### Orientation

- Format: `(horizontal|vertical)`

Specify the orientation of the widget.

### Cursor

- Format: `(default|pointer|text)`

Specify the type of mouse cursor that is set when the mouse pointer is over the
widget.

### List of keywords

- Format: `[ keyword, keyword ]`

A list starts with a '[' and ends with a ']'. The entries in the list are
comma-separated. The `keyword` in the list refers to an widget name.

### List of values

- Format: `[ value, value, ... ]`

An list starts with a '[' and ends with a ']'. The entries in the list are
comma-separated.

### Environment variable

- Format: `${:alnum:}`

This will parse the environment variable as the property value. (that then can
be any of the above types). The environment variable should be an alphanumeric
string without white-space.

```css
* {
    background-color: ${BG};
}
```

- Format: `env(ENVIRONMENT, default)`

This will parse the environment variable as the property value. (that then can
be any of the above types). The environment variable should be an alphanumeric
string without white-space. If the environment value is not found, the default
value is used.

```css
window {
    width: env(WIDTH, 40%);
}
```

If environment WIDTH is set, then that value is parsed, otherwise the default
value (`40%`).

### Inherit

- Format: `inherit`

Inherits the property from its parent widget.

```css
mainbox {
    border-color: inherit;
}
```

## Elements paths

Element paths exists of two parts, the first part refers to the actual widget
by name. Some widgets have an extra state.

For example:

```css
element selected {
}
```

Here `element selected` is the name of the widget, `selected` is the state of
the widget.

The difference between dots and spaces is purely cosmetic. These are all the
same:

```css
element .selected {

element.selected {
}
element selected {
}
```

### Supported element paths

### Base widgets

The default widgets available in **rofi** and the default hierarchic:

- `window`
  - `overlay`: the overlay widget.

  - `mainbox`: The mainbox box.

  - `inputbar`: The input bar box.
    - `box`: the horizontal @box packing the widgets

    - `case-indicator`: the case/sort indicator @textbox

    - `prompt`: the prompt @textbox

    - `entry`: the main entry @textbox

    - `num-rows`: Shows the total number of rows.

    - `num-filtered-rows`: Shows the total number of rows after
              filtering.

    - `textbox-current-entry`: Shows the text of the currently selected
              entry.

    - `icon-current-entry`: Shows the icon of the currently selected
              entry.

  - `listview`: The listview.

    - `scrollbar`: the listview scrollbar

    - `element`: a box in the listview holding the entries

      - `element-icon`: the widget in the listview's entry showing the
   (optional) icon

      - `element-index`: the widget in the listview's entry
   keybindable index (1,2,3..0)

      - `element-text`: the widget in the listview's entry showing the
   text.

  - `mode-switcher`: the main horizontal @box packing the buttons.
    - `button`: the buttons @textbox for each mode

  - `message`: The container holding the textbox.
    - `textbox`: the message textbox

Note that these path names match the default theme. Themes that provide a
custom layout will have different elements, and structure.

### State

State: State of widget

Optional flag(s) indicating state of the widget, used for theming.

These are appended after the name or class of the widget.

#### Example

```
button selected.normal { }

element selected.urgent { }
```

Currently only the entrybox and scrollbar have states:

#### Entrybox

```
{visible modifier}.{state}
```

Where `visible modifier` can be:

- normal: no modification
- selected: the entry is selected/highlighted by user
- alternate: the entry is at an alternating row (uneven row)

Where `state` is:

- normal: no modification
- urgent: this entry is marked urgent
- active: this entry is marked active

These can be mixed.

Example:

```css
nametotextbox selected.active {
    background-color: #003642;
    text-color: #008ed4;
}
```

Sets all selected textboxes marked active to the given text and background
color. Note that a state modifies the original element, it therefore contains
all the properties of that element.

#### Scrollbar

The scrollbar uses the `handle` state when drawing the small scrollbar handle.
This allows the colors used for drawing the handle to be set independently.

## Widget properties

The following properties are currently supported:

### all widgets

- **enabled**:           enable/disable rendering of the widget

- **padding**:           padding
    Padding on the inside of the widget

- **margin**:            padding
    Margin on the outside of the widget

- **border**:            border
    Border around the widget (between padding and margin)/

- **border-radius**:     padding
    Sets a radius on the corners of the borders.
- border-aa:  boolean
    Disable aliasing on the border line. Disabling fixes some drawing issues because of nvidia broken driver workaround.

- border-disable-nvidia-workaround: boolean
    Disable work-around for nvidia driver breaking.

- **background-color**:  color
    Background color

- **background-image**:  image
    Background image

- **border-color**:      color
    Color of the border

- **cursor**:            cursor
    Type of mouse cursor that is set when the mouse pointer is hovered over the
    widget.

### window

- **font**:            string
    The font used in the window

- **transparency**:    string
    Indicating if transparency should be used and what type:
  - **real** - True transparency. Only works with a compositor.
  - **background** - Take a screenshot of the background image and use that.
  - **screenshot** - Take a screenshot of the screen and use that.
  - **Path** to png file - Use an image.

- **location**:       position
      The place of the anchor on the monitor

- **anchor**:         anchor
      The anchor position on the window

- **fullscreen**:     boolean Window is fullscreen.

- **width**:          distance The width of the window

- **x-offset**:       distance

- **y-offset**:       distance The offset of the window to the anchor point,
    allowing you to push the window left/right/up/down

### scrollbar Properties

- **background-color**:    color
- **handle-width**:        distance
- **handle-color**:        color
- **border-color**:        color
- **handle-rounded-corners**:     boolean for rounded scrollbar

### box

- **orientation**:      orientation Set the direction the elements are packed.
- **spacing**:          distance Distance between the packed elements.

### textbox

- **background-color**:  color

- **border-color**:      the color used for the border around the widget.

- **font**:              the font used by this textbox (string).

- **str**/**content**:   the string to display by this textbox (string).

- **vertical-align**:    Vertical alignment of the text. A number between 0
    (top) and 1 (bottom).

- **horizontal-align**:  Horizontal alignment of the text. A number between 0
    (left) and 1 (right).

- **text-color**:        the text color to use.

- **text-transform**:    text style {color} for the whole text.

- **highlight**:         text style {color}. color is optional, multiple
    highlight styles can be added like: bold underline italic #000000; This
    option is only available on the `element-text` widget.

- **width**:             override the desired width for the textbox.

- **content**:           Set the displayed text (String).

- **placeholder**:       Set the displayed text (String) when nothing is
    entered.

- **placeholder-markup**:       If true, placeholder text supports pango
    markup for stylizing.

- **placeholder-color**: Color of the placeholder text.

- **blink**:             Enable/Disable blinking on an input textbox
    (Boolean).

- **markup**:            Force markup on, beware that only valid pango markup
    strings are shown.

- **tab-stops**:         array of distances. Set the location of tab stops by
    their distance from the beginning of the line. Each distance should be
    greater than the previous one. The text appears to the right of the tab
    stop position (other alignments are not supported yet).

- **cursor-width**:      The width of the cursor.

- **cursor-color**:      The color used to draw the cursor.

- **hide-cursor-on-empty**: Hides the cursor when the search field is empty.
    (Boolean)

- **cursor-outline**:      Enable a border (outline) around the cursor.
    (Boolean)

- **cursor-outline-width**: The width of the border around the cursor.
    (Double)

- **cursor-outline-color**: The color to use for the cursor outline.
    (Color)

- **text-outline**:      Enable a border (outline) around the text. (Boolean)

- **text-outline-width**: The width of the border around the text.  (Double)

- **text-outline-color**: The color to use for the text outline.    (Color)

### listview

- **columns**:         integer Number of columns to show (at least 1)

- **fixed-height**:    boolean Always show `lines` rows, even if fewer
    elements are available.

- **dynamic**:         boolean `True` if the size should change when filtering
    the list, `False` if it should keep the original height.

- **scrollbar**:       boolean If the scrollbar should be enabled/disabled.

- **scrollbar-width**: distance Width of the scrollbar

- **cycle**:           boolean When navigating, it should wrap around

- **spacing**:         distance Spacing between the elements (both vertical
    and horizontal)

- **lines**:           integer Number of rows to show in the list view.

- **layout**:           orientation Indicate how elements are stacked.
    Horizontal implements the dmenu style.

- **reverse**:         boolean Reverse the ordering (top down to bottom up).

- **flow**:           orientation The order the elements are layed out.
    Vertical is the original 'column' view.

- **fixed-columns**:    boolean Do not reduce the number of columns shown when
    number of visible elements is not enough to fill them all.

- **require-input**:    boolean Listview requires user input to be unhidden.
    The list is still present and hitting accept will activate the first entry.

### Overlay widget

- **timeout**: The time the widget is visible when showing a temporary message.

## Listview widget

The listview widget is special container widget.
It has the following fixed children widgets:

- 0 or more `element` widgets of the type box.

- An optional `scrollbar` widget. This can be enabled using the scrollbar
    property.

These cannot be changed using the `children` property.

Each Entry displayed by listview is captured by a `box` called `element`.
An `element` widget can contain the following special child widgets:

- `element-icon`: An icon widget showing the icon associated to the entry.
- `element-text`: A textbox widget showing the text associated to the entry.
- `element-index`: A textbox widget that shows the shortcut keybinding number.

By default the `element-icon` and `element-text` child widgets are added to the
`element`. This can be modified using the `children` property or the
`[no]-show-icons` option.

A child added with another name is treated the same as the special widget
described in the [advanced layout](#advanced-layout) section.

### listview text highlight

The `element-text` widget in the `listview` is the one used to show the text.
On this widget set the `highlight` property (only place this property is used)
to change the style of highlighting. The `highlight` property consist of the
`text-style` property and a color.

To disable highlighting:

```css
  element-text {
    highlight: None;
  }
```

To set to red underlined:

```css
  element-text {
    highlight: underline red;
  }
```

## Layout

The new format allows the layout of the **rofi** window to be tweaked
extensively. For each widget, the themer can specify padding, margin, border,
font, and more. It even allows, as an advanced feature, to pack widgets in a
custom structure.

### Basic layout structure

The whole view is made out of boxes that pack other boxes or widgets.
The box can be vertical or horizontal. This is loosely inspired by [GTK](http://gtk.org/).

The current layout of **rofi** is structured as follows:

```text
┌────────────────────────────────────────────────────────────────────────────────────┐
│ window {BOX:vertical}                                                              │
│ ┌───────────────────────────────────────────────────────────────────────────────┐  │
│ │ mainbox  {BOX:vertical}                                                       │  │
│ │ ┌───────────────────────────────────────────────────────────────────────────┐ │  │
│ │ │ inputbar {BOX:horizontal}                                                 │ │  │
│ │ │ ┌─────────┐ ┌─┐ ┌───────────────────────────────┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ │ │  │
│ │ │ │ prompt  │ │:│ │ entry                         │ │#fr│ │ / │ │#ns│ │ci │ │ │  │
│ │ │ └─────────┘ └─┘ └───────────────────────────────┘ └───┘ └───┘ └───┘ └───┘ │ │  │
│ │ └───────────────────────────────────────────────────────────────────────────┘ │  │
│ │                                                                               │  │
│ │ ┌───────────────────────────────────────────────────────────────────────────┐ │  │
│ │ │ message                                                                   │ │  │
│ │ │ ┌───────────────────────────────────────────────────────────────────────┐ │ │  │
│ │ │ │ textbox                                                               │ │ │  │
│ │ │ └───────────────────────────────────────────────────────────────────────┘ │ │  │
│ │ └───────────────────────────────────────────────────────────────────────────┘ │  │
│ │                                                                               │  │
│ │ ┌───────────────────────────────────────────────────────────────────────────┐ │  │
│ │ │ listview                                                                  │ │  │
│ │ │ ┌─────────────────────────────────────────────────────────────────────┐   │ │  │
│ │ │ │ element                                                             │   │ │  │
│ │ │ │ ┌─────────────────┐ ┌─────────────────────────────────────────────┐ │   │ │  │
│ │ │ │ │element─icon     │ │element─text                                 │ │   │ │  │
│ │ │ │ └─────────────────┘ └─────────────────────────────────────────────┘ │   │ │  │
│ │ │ └─────────────────────────────────────────────────────────────────────┘   │ │  │
│ │ └───────────────────────────────────────────────────────────────────────────┘ │  │
│ │                                                                               │  │
│ │ ┌───────────────────────────────────────────────────────────────────────────┐ │  │
│ │ │  mode─switcher {BOX:horizontal}                                           │ │  │
│ │ │ ┌───────────────┐   ┌───────────────┐  ┌──────────────┐ ┌───────────────┐ │ │  │
│ │ │ │ Button        │   │ Button        │  │ Button       │ │ Button        │ │ │  │
│ │ │ └───────────────┘   └───────────────┘  └──────────────┘ └───────────────┘ │ │  │
│ │ └───────────────────────────────────────────────────────────────────────────┘ │  │
│ └───────────────────────────────────────────────────────────────────────────────┘  │
└────────────────────────────────────────────────────────────────────────────────────┘


```
>
> - ci is the case-indicator
> - fr is the num-filtered-rows
> - ns is the num-rows

### Error message structure

```text
┌──────────────────────────────────────────────────────────────────────────────────┐
│ window {BOX:vertical}                                                            │
│ ┌─────────────────────────────────────────────────────────────────────────────┐  │
│ │ error─message {BOX:vertical}                                                │  │
│ │ ┌────────────────────────────────────────────────────────────────────────┐  │  │
│ │ │ textbox                                                                │  │  │
│ │ └────────────────────────────────────────────────────────────────────────┘  │  │
│ └─────────────────────────────────────────────────────────────────────────────┘  │
└──────────────────────────────────────────────────────────────────────────────────┘

```

### Advanced layout

The layout of **rofi** can be tweaked by packing the 'fixed' widgets in a
custom structure.

The following widgets are fixed, as they provide core **rofi** functionality:

- prompt
- entry
- overlay
- case-indicator
- message
- listview
- mode-switcher
- num-rows
- num-filtered-rows

The following keywords are defined and can be used to automatically pack a
subset of the widgets. These are used in the default theme as depicted in the
figure above.

- mainbox Packs: `inputbar, message, listview, mode-switcher`
- inputbar Packs: `prompt,entry,case-indicator`

Any widget name starting with `textbox` is a textbox widget, others are box
widgets and can pack other widgets.

There are several special widgets that can be used by prefixing the name of the
widget:

#### Textbox widget

This is a read-only textbox widget. The displayed string can be set with `content`.

Example:

```css
textbox-custom {
  expand: false;
  content: "My Message";
}
```

#### Icon

This is an icon widget. The displayed icon can be set with `filename` and size
with `size`. If the property `action` is set, it acts as a button. `action` can
be set to a keybinding name and completes that action. (see rofi -show keys for
a list).

If the `squared` property is set to **false** the widget height and width are
not forced to be equal.

If the `tint`  property is set with a white, the icons is greyscale. If
another color is set, the icon is tinted to that color.

Example:

```css
icon-paste {
    expand: false;
    filename: "gtk-paste";
    size: 24;
    vertical-align: 0.5;
    action: "kb-primary-paste";
}
```

#### button

This is a textbox widget that can have a 'clickable' action. The `action` can
be set to: `keybinding`: accepts a keybinding name and completes that action.
(see rofi -show keys for a list).

```css
button-paste {
    expand: false;
    content: "My Clickable Message";
    vertical-align: 0.5;
    action: "kb-primary-paste";
}
```

#### Children

To specify children, set the `children`
property (this always happens on the `box` child, see example below):

```css
inputbar {
  children: [prompt,entry,overlay,case-indicator];
}
```

The theme needs to be updated to match the hierarchy specified.

Below is an example of a theme emulating dmenu:

```css
* {
    background-color:      Black;
    text-color:            White;
    border-color:          White;
    font:            "Times New Roman 12";
}

window {
    anchor:     north;
    location:   north;
    width:      100%;
    padding:    4px;
    children:   [ horibox ];
}

horibox {
    orientation: horizontal;
    children:   [ prompt, entry, listview ];
}

listview {
    layout:     horizontal;
    spacing:    5px;
    lines:      10;
}

entry {
    expand:     false;
    width:      10em;
}

element {
    padding: 0px 2px;
}
element selected {
    background-color: SteelBlue;
}
```

### Padding and margin

Just like CSS, **rofi** uses the box model for each widget.

```text
┌──────────────────────────────────────────────────────────────────┐
│ margin                                                           │
│  ┌────────────────────────────────────────────────────────────┐  │
│  │ border                                                     │  │
│  │ ┌────────────────────────────────────────────────────────┐ │  │
│  │ │ padding                                                │ │  │
│  │ │ ┌────────────────────────────────────────────────────┐ │ │  │
│  │ │ │ content                                            │ │ │  │
│  │ │ └────────────────────────────────────────────────────┘ │ │  │
│  │ └────────────────────────────────────────────────────────┘ │  │
│  └────────────────────────────────────────────────────────────┘  │
└──────────────────────────────────────────────────────────────────┘
```

Explanation of the different parts:

- Content - The content of the widget.

- Padding - Clears an area around the widget. The padding shows the
    background color of the widget.

- Border - A border that goes around the padding and content. The border use
    the border-color of the widget.

- Margin - Clears an area outside the border. The margin is transparent.

The box model allows us to add a border around elements, and to define space
between elements.

The size of each margin, border, and padding can be set.
For the border, a linestyle and radius can be set.

### Spacing

Widgets that can pack more then one child widget (currently box and listview)
have the `spacing` property. This property sets the distance between the packed
widgets (both horizontally and vertically).

```text
┌───────────────────────────────────────┐
│ ┌────────┐ s ┌────────┐ s ┌────────┐  │
│ │ child  │ p │ child  │ p │ child  │  │
│ │        │ a │        │ a │        │  │
│ │        │ c │        │ c │        │  │
│ │        │ i │        │ i │        │  │
│ │        │ n │        │ n │        │  │
│ └────────┘ g └────────┘ g └────────┘  │
└───────────────────────────────────────┘
```

### Advanced box packing

More dynamic spacing can be achieved by adding dummy widgets, for example to
make one widget centered:

```text
┌────────────────────────────────────────────────────┐
│  ┌───────────────┐  ┌────────┐  ┌───────────────┐  │
│  │ dummy         │  │ child  │  │ dummy         │  │
│  │ expand: true; │  │        │  │ expand: true; │  │
│  │               │  │        │  │               │  │
│  │               │  │        │  │               │  │
│  │               │  │        │  │               │  │
│  └───────────────┘  └────────┘  └───────────────┘  │
└────────────────────────────────────────────────────┘
```

If both dummy widgets are set to expand, `child` will be centered. Depending on
the `expand` flag of child the remaining space will be equally divided between
both dummy and child widget (expand enabled), or both dummy widgets (expand
disabled).

## Debugging

To get debug information from the parser, run rofi like:

```bash
G_MESSAGES_DEBUG=Parser rofi -show run
```

Syntax errors are shown in a popup and printed out to command line with the
above command.

To see the elements queried during running, run:

```bash
G_MESSAGES_DEBUG=Theme rofi -show run
```

To test minor changes, part of the theme can be passed on the command line, for
example to set it to full-screen:

```bash
rofi -theme-str 'window { fullscreen:true;}' -show run
```

Another syntax to modify theme properties is:

```bash
rofi -theme+window+fullscreen true -show run
```

To print the current theme, run:

```bash
rofi -dump-theme
```

## Media support

Parts of the theme can be conditionally loaded, like the CSS `@media` option.

```css
@media ( min-width: 120 ) {

}
```

It supports the following keys as constraint:

- `min-width`:         load when width is bigger or equal then value.
- `max-width`:         load when width is smaller then value.
- `min-height`:        load when height is bigger or equal then value.
- `max-height`:        load when height is smaller then value.
- `min-aspect-ratio`   load when aspect ratio is over value.
- `max-aspect-ratio`:  load when aspect ratio is under value.
- `monitor-id`:        The monitor id, see rofi -help for id's.
- `enabled`:           Boolean option to enable. Supports environment variable
  or DMENU to detect if in dmenu mode.

@media takes an integer number or a fraction, for integer number `px` can be
added.

```css
@media ( min-width: 120 px ) {

}
```

```css
@media ( enabled: env(DO_LIGHT, false )) {

}
```

```css
@media ( enabled: DMENU) {

}
```

## Conflicting constraints

It is possible to define conflicting constraints in the theme. These conflicts
are not explicitly reported. The most common example is forcing a specific
window size, for example by enabling full-screen mode, having number of lines
set in the listview and having the listview expand to available space. There is
clearly a conflict in these 3 constraints. In this case, listview will not
limit to the number of lines, but tries to fill the available space. It is up
to the theme designer to make sure the theme handles this correctly.

## Font Parsing

Rofi uses [pango](https://pango.gnome.org/) for font rendering. The font should
be specified in a format that pango understands. This normally is the font name
followed by the font size. For example:

```text
mono 18
```

Or

```text
FontAwesome 22
```

From the pango manpage:

The string must have the form

```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
word describes one of style, variant, weight, stretch, or gravity, and SIZE is
a decimal number (size in points) or optionally followed by the unit modifier
“px” for absolute size. VARIATIONS is a comma-separated list of font variation
specifications of the form “`axis`=value” (the = sign is optional).

The following words are understood as styles: "Normal”, “Roman”, “Oblique”,
“Italic”.

The following words are understood as variants: “Small-Caps”, “All-Small-Caps”,
“Petite-Caps”, “All-Petite-Caps”, “Unicase”, “Title-Caps”.

The following words are understood as weights: “Thin”, “Ultra-Light”,
“Extra-Light”, “Light”, “Semi-Light”, “Demi-Light”, “Book”, “Regular”,
“Medium”, “Semi-Bold”, “Demi-Bold”, “Bold”, “Ultra-Bold”, “Extra-Bold”,
“Heavy”, “Black”, “Ultra-Black”, “Extra-Black”.

The following words are understood as stretch values: “Ultra-Condensed”,
“Extra-Condensed”, “Condensed”, “Semi-Condensed”, “Semi-Expanded”, “Expanded”,
“Extra-Expanded”, “Ultra-Expanded”.

The following words are understood as gravity values: “Not-Rotated”, “South”,
“Upside-Down”, “North”, “Rotated-Left”, “East”, “Rotated-Right”, “West”.

Any one of the options may be absent. If FAMILY-LIST is absent, then the
family\_name field of the resulting font description will be initialized to
NULL. If STYLE-OPTIONS is missing, then all style options will be set to the
default values. If SIZE is missing, the size in the resulting font description
will be set to 0.

A typical example:

"Cantarell Italic Light 15 \`wght`=200"

## Icon Handling

Rofi supports 3 ways of specifying an icon:

- Filename
- icon-name, this is looked up via the icon-theme.
- Markup String. It renders a string as an icon.

For the first two options, GdkPixbuf is used to open and render the icons.
This in general gives support for most required image formats.
For the string option it uses Pango to render the string. The string needs to
start with a `<span` tag, that allows you to set color and font.

Markup string:

```bash
echo -en "testing\0icon\x1f<span color='red'>⏻</span>" | ./rofi -dmenu
```

Getting supported icon formats:

```bash
G_MESSAGES_DEBUG=Helpers.IconFetcher rofi
```

This uses the debug framework and prints out a list of supported image  file
extensions.

## Multiple file handling

The rasi file format offers two methods of including other files. This can be
used to modify existing themes, or have multiple variations on a theme.

- import:  Import and parse a second file.
- theme:   Discard theme, and load file as a fresh theme.

Syntax:

```css
@import "myfile"
@theme "mytheme"
```

The commandline option `-theme` is handled similarly to `@theme`.

The specified file can either by *name*, *filename*,*full path*.

If a filename is provided, it will try to resolve it in the following order:

- If path is absolute and file exists, it will open the file. This includes expansion of '~' or '~user'
- On an `@import` or `@theme` it looks in the directory of the file that tried to include it.
- `${XDG_CONFIG_HOME}/rofi/themes/`
- `${XDG_CONFIG_HOME}/rofi/`
- `${XDG_DATA_HOME}/rofi/themes/`
- `${INSTALL PREFIX}/share/rofi/themes/`

A name is resolved (if it has no valid extension) as a filename by appending the `.rasi` and the `.rasinc` extension.
It will first look for files with `.rasi`, then for files with `.rasinc`.

If you want to do an optional import, e.g. no error when the file does not exists, you can do:

```css
?import "myfile"
```

This still throws an error on syntax error, but won't abort parsing if file does not exists.

## Examples

Several examples are installed together with **rofi**. These can be found in
`{datadir}/rofi/themes/`, where `{datadir}` is the install path of **rofi**
data. When installed using a package manager, this is usually: `/usr/share/`.

## SEE ALSO

rofi(1), rofi-script(5), rofi-theme-selector(1)


================================================
FILE: doc/rofi-thumbnails.5.markdown
================================================
# rofi-thumbnails(5)

## NAME

**rofi-thumbnails** - Rofi thumbnails system

## DESCRIPTION

**rofi** is now able to show thumbnails for all file types where an XDG compatible thumbnailer is present in the system.

This is done by default in filebrowser and recursivebrowser mode, if **rofi** is launched with the `-show-icons` argument.

In a custom user script or dmenu mode, it is possible to produce entry icons using XDG thumbnailers by adding the prefix `thumbnail://` to the filename
specified after `\0icon\x1f`, for example:

```bash
echo -en "EntryName\0icon\x1fthumbnail://path/to/file\n" | rofi -dmenu -show-icons
```

### XDG thumbnailers

XDG thumbnailers are files with a ".thumbnailer" suffix and a structure similar to ".desktop" files for launching applications. They are placed in `/usr/share/thumbnailers/` or `$HOME/.local/share/thumbnailers/`, and contain a list of mimetypes, for which is possible to produce the thumbnail image, and a string with the command to create said image. The example below shows the content of `librsvg.thumbnailer`, a thumbnailer for svg files using librsvg:

```
[Thumbnailer Entry]
TryExec=/usr/bin/gdk-pixbuf-thumbnailer
Exec=/usr/bin/gdk-pixbuf-thumbnailer -s %s %u %o
MimeType=image/svg+xml;image/svg+xml-compressed;
```

The images produced are named as the md5sum of the input files and placed, depending on their size, in the XDG thumbnails directories: `$HOME/.cache/thumbnails/{normal,large,x-large,xx-large}`. They are then loaded by **rofi** as entry icons and can also be used by file managers like Thunar, Caja or KDE Dolphin to show their thumbnails. Additionally, if a thumbnail for a file is found in the thumbnails directories (produced previously by **rofi** or a file manager), **rofi** will load it instead of calling the thumbnailer.

If a suitable thumbnailer for a given file is not found, **rofi** will try to use the corresponding mimetype icon from the icon theme. 

### Custom command to create thumbnails

It is possible to use a custom command to generate thumbnails for generic entry names, for example a script that downloads an icon given its url or selects different icons depending on the input. This can be done providing the `-preview-cmd` argument followed by a string with the command to execute, with the following syntax:

```
rofi ... -preview-cmd 'path/to/script_or_cmd "{input}" "{output}" "{size}"'
```

**rofi** will call the script or command substituting `{input}` with the input entry icon name (the string after `\0icon\x1fthumbnail://`), `{output}` with the output filename of the thumbnail and `{size}` with the requested thumbnail size. The script or command is responsible of producing a thumbnail image (if possible respecting the requested size) and saving it in the given `{output}` filename.

### Issues with AppArmor

In Linux distributions using AppArmor (such as Ubuntu and Debian), the default rules shipped can cause issues with thumbnails generation. If that is the case, AppArmor can be disabled by issuing the following commands

```
sudo systemctl stop apparmor
sudo systemctl disable apparmor
```

In alternative, the following apparmor profile con be placed in a file named /etc/apparmor.d/usr.bin.rofi

```
#vim:syntax=apparmor
# AppArmor policy for rofi

#include <tunables/global>

/usr/bin/rofi {
    #include <abstractions/base>

    # TCP/UDP network access for NFS
    network inet  stream,
    network inet6 stream,
    network inet  dgram,
    network inet6 dgram,

    /usr/bin/rofi mr,

    @{HOME}/ r,
    @{HOME}/** rw,
    owner @{HOME}/.cache/thumbnails/** rw,
}
```

then run

```
apparmor_parser  -r /etc/apparmor.d/usr.bin.rofi
```

to reload the rule. This assumes that **rofi** binary is in /usr/bin, that is the case of a standard package installation.


================================================
FILE: doc/rofi.1.markdown
================================================
# rofi(1)

## NAME

**rofi** - A window switcher, application launcher, ssh dialog, dmenu
replacement and more

## SYNOPSIS

**rofi** [ -show *mode* ]|[ -dmenu ]|[ -e *msg* ] [ CONFIGURATION ]

## DESCRIPTION

**rofi** is an X11 pop-up window switcher, run dialog, dmenu replacement, and
more. It focuses on being fast to use and have minimal distraction. It supports
keyboard and mouse navigation, type to filter, tokenized search and more.

## USAGE

**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`. There are different *modes* for different types of actions. **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 (drop-in)
replacement for **dmenu(1)**. See emulating dmenu below.

### Running rofi

To launch **rofi** directly in a certain mode, specify a mode with `rofi -show
<mode>`. To show the `drun` dialog:

```bash
    rofi -show drun
```

A useful setup in minimalistic window managers is to combine `drun`, `run`
with `window` mode:

```bash
  rofi -show combi -modes combi -combi-modes "window,drun,run"
```

In this setup it first list all open applications, then all installed
applications. So if you type firefox and hit return, it will switch to the
running firefox, or launch it when it is not running.

### Emulating dmenu

**rofi** can emulate **dmenu(1)** (a dynamic menu for X11) when launched with
the `-dmenu` flag.

For more information see **rofi-dmenu(5)**.

### Display Error message

**rofi** error dialog can also be called from the command line.

```bash
    rofi -e "my message"
```

Markup support can be enabled, see CONFIGURATION options.

## CONFIGURATION

There are currently three methods of setting configuration options (evaluated
in order below):

- System configuration file  (for example `/etc/rofi.rasi`). It first checks
    `XDG_CONFIG_DIRS`, and then `SYSCONFDIR` (that is passed at compile time).
    It loads the first config file it finds, it does not merge multiple system
    configuration files.

- Rasi theme file: The new *theme* format can be used to set configuration
    values.

- Command-line options: Arguments passed to **rofi**.

To get a template config file, run: `rofi -dump-config > config.rasi`

This will contain (commented) all current configuration options, modified
options are uncommented.

To get a template config file that sets the icon-theme run: `rofi -icon-theme
hicolor -dump-config`.

It is **strongly** recommended to use this as a starting point for yo
Download .txt
gitextract__m24situ/

├── .build.yml
├── .clang-tidy
├── .gitattributes
├── .github/
│   ├── CONTRIBUTING.md
│   ├── ISSUE_TEMPLATE/
│   │   ├── bug_report.yml
│   │   ├── config.yml
│   │   ├── documentation_report.yml
│   │   └── feature_request.yml
│   ├── actions/
│   │   ├── doxycheck/
│   │   │   └── action.yml
│   │   ├── meson/
│   │   │   └── action.yml
│   │   ├── release/
│   │   │   └── action.yml
│   │   └── setup/
│   │       └── action.yml
│   ├── pull_request_template.md
│   └── workflows/
│       ├── build.yml
│       ├── codeql.yml
│       ├── lock.yml
│       ├── main.yml
│       ├── mkdocs.yml
│       └── publish-release.yml
├── .gitignore
├── .gitlab-ci.yml
├── .gitmodules
├── .mailmap
├── AUTHORS
├── CODE_OF_CONDUCT.md
├── CONFIG.md
├── COPYING
├── Changelog
├── Examples/
│   ├── i3_empty_workspace.sh
│   ├── i3_switch_workspaces.sh
│   ├── rofi-file-browser.sh
│   ├── test_script_env.sh
│   ├── test_script_mode.sh
│   ├── test_script_mode_color.sh
│   └── test_script_mode_delim.sh
├── INSTALL.md
├── README.md
├── config/
│   └── config.c
├── data/
│   ├── rofi-theme-selector.desktop
│   └── rofi.desktop
├── doc/
│   ├── README.md
│   ├── default_configuration.rasi
│   ├── default_theme.rasi
│   ├── man_filter.lua
│   ├── meson.build
│   ├── rofi-actions.5.markdown
│   ├── rofi-debugging.5.markdown
│   ├── rofi-dmenu.5.markdown
│   ├── rofi-keys.5.markdown
│   ├── rofi-script.5.markdown
│   ├── rofi-sensible-terminal.1.markdown
│   ├── rofi-theme-selector.1.markdown
│   ├── rofi-theme.5.markdown
│   ├── rofi-thumbnails.5.markdown
│   ├── rofi.1.markdown
│   └── rofi.doxy.in
├── include/
│   ├── css-colors.h
│   ├── display-internal.h
│   ├── display.h
│   ├── helper-theme.h
│   ├── helper.h
│   ├── history.h
│   ├── input-codes.h
│   ├── keyb.h
│   ├── mode-private.h
│   ├── mode.h
│   ├── modes/
│   │   ├── combi.h
│   │   ├── dmenu.h
│   │   ├── dmenuscriptshared.h
│   │   ├── drun.h
│   │   ├── filebrowser.h
│   │   ├── help-keys.h
│   │   ├── modes.h
│   │   ├── recursivebrowser.h
│   │   ├── run.h
│   │   ├── script.h
│   │   ├── ssh.h
│   │   ├── wayland-window.h
│   │   └── window.h
│   ├── rofi-icon-fetcher.h
│   ├── rofi-types.h
│   ├── rofi.h
│   ├── settings.h
│   ├── theme.h
│   ├── timings.h
│   ├── view-internal.h
│   ├── view.h
│   ├── wayland-internal.h
│   ├── wayland.h
│   ├── widgets/
│   │   ├── box.h
│   │   ├── container.h
│   │   ├── icon.h
│   │   ├── listview.h
│   │   ├── scrollbar.h
│   │   ├── textbox.h
│   │   ├── widget-internal.h
│   │   └── widget.h
│   ├── xcb-dummy.h
│   ├── xcb-internal.h
│   ├── xcb.h
│   └── xrmoptions.h
├── lexer/
│   ├── theme-lexer.l
│   └── theme-parser.y
├── meson-dist-script
├── meson.build
├── meson_options.txt
├── mkdocs/
│   ├── docs/
│   │   ├── 1.7.0/
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.1/
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.2/
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.3/
│   │   │   ├── rofi-debugging.5.markdown
│   │   │   ├── rofi-dmenu.5.markdown
│   │   │   ├── rofi-keys.5.markdown
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.4/
│   │   │   ├── rofi-debugging.5.markdown
│   │   │   ├── rofi-dmenu.5.markdown
│   │   │   ├── rofi-keys.5.markdown
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.5/
│   │   │   ├── rofi-debugging.5.markdown
│   │   │   ├── rofi-dmenu.5.markdown
│   │   │   ├── rofi-keys.5.markdown
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.6/
│   │   │   ├── rofi-debugging.5.markdown
│   │   │   ├── rofi-dmenu.5.markdown
│   │   │   ├── rofi-keys.5.markdown
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-sensible-terminal.1.markdown
│   │   │   ├── rofi-theme-selector.1.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   ├── rofi-thumbnails.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.7/
│   │   │   ├── rofi-debugging.5.markdown
│   │   │   ├── rofi-dmenu.5.markdown
│   │   │   ├── rofi-keys.5.markdown
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-sensible-terminal.1.markdown
│   │   │   ├── rofi-theme-selector.1.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   ├── rofi-thumbnails.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.8/
│   │   │   ├── rofi-debugging.5.markdown
│   │   │   ├── rofi-dmenu.5.markdown
│   │   │   ├── rofi-keys.5.markdown
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-sensible-terminal.1.markdown
│   │   │   ├── rofi-theme-selector.1.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   ├── rofi-thumbnails.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 1.7.9/
│   │   │   ├── rofi-actions.5.markdown
│   │   │   ├── rofi-debugging.5.markdown
│   │   │   ├── rofi-dmenu.5.markdown
│   │   │   ├── rofi-keys.5.markdown
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   ├── rofi-thumbnails.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── 2.0.0/
│   │   │   ├── rofi-actions.5.markdown
│   │   │   ├── rofi-debugging.5.markdown
│   │   │   ├── rofi-dmenu.5.markdown
│   │   │   ├── rofi-keys.5.markdown
│   │   │   ├── rofi-script.5.markdown
│   │   │   ├── rofi-sensible-terminal.1.markdown
│   │   │   ├── rofi-theme-selector.1.markdown
│   │   │   ├── rofi-theme.5.markdown
│   │   │   ├── rofi-thumbnails.5.markdown
│   │   │   └── rofi.1.markdown
│   │   ├── downloads.md
│   │   ├── guides/
│   │   │   ├── DynamicThemes/
│   │   │   │   └── dynamic_themes.md
│   │   │   ├── Plugins/
│   │   │   │   └── 2017-04-19-rofi-140-sneak-preview-plugins.md
│   │   │   ├── Positioning/
│   │   │   │   └── theme3-positioning.markdown
│   │   │   └── Transparency/
│   │   │       └── theme3-transparency.markdown
│   │   ├── index.md
│   │   └── themes/
│   │       ├── capture.sh
│   │       └── themes.md
│   └── mkdocs.yml
├── pkgconfig/
│   └── rofi.pc.in
├── protocols/
│   ├── wlr-foreign-toplevel-management-unstable-v1.xml
│   └── wlr-layer-shell-unstable-v1.xml
├── releasenotes/
│   ├── 0.15.12/
│   │   └── release-0.15.12.markdown
│   ├── 1.0.0/
│   │   └── release-1.0.0.markdown
│   ├── 1.1.0/
│   │   └── release-1.1.0.markdown
│   ├── 1.2.0/
│   │   └── release-1.2.0.markdown
│   ├── 1.3.0/
│   │   └── release-1.3.0.markdown
│   ├── 1.3.1/
│   │   └── release-1.3.1.markdown
│   ├── 1.4.0/
│   │   └── release-1.4.0.markdown
│   ├── 1.5.0/
│   │   └── release-1.5.0.markdown
│   ├── 1.5.2/
│   │   └── release-1.5.2.markdown
│   ├── 1.5.3/
│   │   └── release-1.5.3.markdown
│   ├── 1.6.0/
│   │   └── release-1.6.0.markdown
│   ├── 1.6.1/
│   │   └── release-1.6.1.markdown
│   ├── 1.7.0/
│   │   └── release-1.7.0.markdown
│   ├── 1.7.1/
│   │   └── release-1.7.1.markdown
│   ├── 1.7.2/
│   │   └── release-1.7.2.markdown
│   ├── 1.7.3/
│   │   └── release-1.7.3.markdown
│   ├── 1.7.4/
│   │   └── release-1.7.4.markdown
│   ├── 1.7.5/
│   │   └── release-1.7.5.markdown
│   ├── 1.7.6/
│   │   └── release-1.7.6.markdown
│   ├── 1.7.7/
│   │   └── release-1.7.7.markdown
│   ├── 1.7.8/
│   │   └── release-1.7.8.markdown
│   ├── 1.7.9/
│   │   └── release-1.7.9.markdown
│   └── 2.0.0/
│       └── release-2.0.0.markdown
├── resources/
│   └── resources.xml
├── script/
│   ├── get_git_rev.sh
│   ├── rofi-sensible-terminal
│   └── rofi-theme-selector
├── source/
│   ├── css-colors.c
│   ├── display.c
│   ├── helper.c
│   ├── history.c
│   ├── keyb.c
│   ├── mode.c
│   ├── modes/
│   │   ├── combi.c
│   │   ├── dmenu.c
│   │   ├── drun.c
│   │   ├── filebrowser.c
│   │   ├── help-keys.c
│   │   ├── recursivebrowser.c
│   │   ├── run.c
│   │   ├── script.c
│   │   ├── ssh.c
│   │   ├── wayland-window.c
│   │   └── window.c
│   ├── rofi-icon-fetcher.c
│   ├── rofi-types.c
│   ├── rofi.c
│   ├── theme.c
│   ├── timings.c
│   ├── view.c
│   ├── wayland/
│   │   ├── display.c
│   │   └── view.c
│   ├── widgets/
│   │   ├── box.c
│   │   ├── container.c
│   │   ├── icon.c
│   │   ├── listview.c
│   │   ├── scrollbar.c
│   │   ├── textbox.c
│   │   └── widget.c
│   ├── xcb/
│   │   ├── display.c
│   │   └── view.c
│   └── xrmoptions.c
├── test/
│   ├── box-test.c
│   ├── helper-config-cmdline-parser.c
│   ├── helper-expand.c
│   ├── helper-pidfile.c
│   ├── helper-test.c
│   ├── helper-tokenize.c
│   ├── history-test.c
│   ├── mode-test.c
│   ├── scrollbar-test.c
│   ├── textbox-test.c
│   ├── theme-parser-test.c
│   └── widget-test.c
└── themes/
    ├── Adapta-Nokto.rasi
    ├── Arc-Dark.rasi
    ├── Arc.rasi
    ├── DarkBlue.rasi
    ├── Indego.rasi
    ├── Monokai.rasi
    ├── Paper.rasi
    ├── android_notification.rasi
    ├── arthur.rasi
    ├── blue.rasi
    ├── breaking-themes/
    │   ├── 2076.rasi
    │   └── readme.md
    ├── c64.rasi
    ├── dmenu.rasi
    ├── docu.rasi
    ├── fancy.rasi
    ├── fancy2.rasi
    ├── fullscreen-preview.rasi
    ├── glue_pro_blue.rasi
    ├── gruvbox-common.rasinc
    ├── gruvbox-dark-hard.rasi
    ├── gruvbox-dark-soft.rasi
    ├── gruvbox-dark.rasi
    ├── gruvbox-light-hard.rasi
    ├── gruvbox-light-soft.rasi
    ├── gruvbox-light.rasi
    ├── iggy.rasi
    ├── lb.rasi
    ├── material.rasi
    ├── paper-float.rasi
    ├── purple.rasi
    ├── sidebar-v2.rasi
    ├── sidebar.rasi
    ├── solarized.rasi
    └── solarized_alternate.rasi
Download .txt
SYMBOL INDEX (1352 symbols across 72 files)

FILE: include/css-colors.h
  type CSSColor (line 17) | typedef struct CSSColor {

FILE: include/display-internal.h
  type _workarea (line 36) | struct _workarea
  type _view_proxy (line 37) | struct _view_proxy
  type display_proxy (line 39) | typedef struct _display_proxy {

FILE: include/display.h
  type workarea (line 38) | typedef struct _workarea {
  type _display_proxy (line 58) | struct _display_proxy
  type _display_proxy (line 61) | struct _display_proxy
  type _display_proxy (line 63) | struct _display_proxy
  type _display_proxy (line 66) | struct _display_proxy
  type clipboard_type (line 125) | enum clipboard_type {
  type clipboard_type (line 131) | enum clipboard_type

FILE: include/helper.h
  type RofiHelperExecuteContext (line 289) | typedef struct {

FILE: include/keyb.h
  type BindingsScope (line 43) | typedef enum {
  type KeyBindingAction (line 58) | typedef enum {
  type MouseBindingListviewAction (line 157) | typedef enum {
  type MouseBindingListviewElementAction (line 167) | typedef enum {
  type MouseBindingMouseDefaultAction (line 176) | typedef enum {

FILE: include/mode-private.h
  type cairo_surface_t (line 81) | typedef cairo_surface_t *(*_mode_get_icon)(const Mode *sw,
  type ModeMode (line 144) | typedef ModeMode (*_mode_result)(Mode *sw, int menu_retv, char **input,
  type Mode (line 172) | typedef Mode *(*_mode_create)(void);
  type ModeMode (line 185) | typedef ModeMode (*_mode_completer_result)(Mode *sw, int menu_retv,
  type rofi_mode (line 194) | struct rofi_mode {

FILE: include/mode.h
  type Mode (line 49) | typedef struct rofi_mode Mode;
  type ModeMode (line 54) | typedef enum {
  type MenuReturn (line 70) | typedef enum {

FILE: include/modes/dmenuscriptshared.h
  type DmenuScriptEntry (line 8) | typedef struct {

FILE: include/rofi-types.h
  type RofiHighlightStyle (line 50) | typedef enum {
  type RofiLineStyle (line 72) | typedef enum {
  type RofiPixelUnit (line 82) | typedef enum {
  type RofiDistanceModifier (line 98) | typedef enum {
  type RofiDistanceUnit (line 113) | typedef struct RofiDistanceUnit {
  type RofiDistance (line 129) | typedef struct {
  type RofiOrientation (line 139) | typedef enum {
  type RofiCursorType (line 147) | typedef enum {
  type ThemeColor (line 156) | typedef struct {
  type RofiImageType (line 170) | typedef enum { ROFI_IMAGE_URL, ROFI_IMAGE_LINEAR_GRADIENT } RofiImageType;
  type RofiDirection (line 172) | typedef enum {
  type RofiScaleType (line 180) | typedef enum {
  type RofiImage (line 187) | typedef struct {
  type RofiPadding (line 207) | typedef struct {
  type RofiHighlightColorStyle (line 217) | typedef struct {
  type WindowLocation (line 233) | typedef enum {
  type PropertyValue (line 254) | typedef union _PropertyValue {
  type Property (line 287) | typedef struct Property {
  type ThemeMediaType (line 299) | typedef enum {
  type ThemeMedia (line 323) | typedef struct ThemeMedia {
  type ThemeWidget (line 332) | typedef struct ThemeWidget {
  type ThemeWidget (line 346) | typedef ThemeWidget ConfigEntry;
  type rofi_range_pair (line 350) | typedef struct rofi_range_pair {
  type rofi_int_matcher (line 358) | typedef struct rofi_int_matcher_t {
  type thread_state (line 367) | typedef struct _thread_state {

FILE: include/settings.h
  type MatchingMethod (line 38) | typedef enum {
  type SortingMethod (line 50) | typedef enum { SORT_NORMAL = 0, SORT_FZF = 1 } SortingMethod;
  type DisplayBackend (line 52) | typedef enum {
  type Settings (line 61) | typedef struct {

FILE: include/theme.h
  type guint (line 411) | typedef guint (*disp_scale_func)(void);

FILE: include/view-internal.h
  type RofiViewState (line 59) | struct RofiViewState {
  type view_proxy (line 169) | typedef struct _view_proxy {
  type EntryHistoryIndex (line 200) | typedef struct {
  type _rofi_view_cache_state (line 208) | struct _rofi_view_cache_state {
  type _rofi_view_cache_state (line 238) | struct _rofi_view_cache_state
  type RofiViewState (line 240) | struct RofiViewState
  type RofiViewState (line 241) | struct RofiViewState
  type RofiViewState (line 242) | struct RofiViewState
  type RofiViewState (line 243) | struct RofiViewState
  type RofiViewState (line 244) | struct RofiViewState
  type RofiViewState (line 245) | struct RofiViewState

FILE: include/view.h
  type RofiViewState (line 54) | typedef struct RofiViewState RofiViewState;
  type MenuFlags (line 55) | typedef enum {
  type _view_proxy (line 384) | struct _view_proxy
  type _view_proxy (line 387) | struct _view_proxy
  type _view_proxy (line 389) | struct _view_proxy
  type _view_proxy (line 392) | struct _view_proxy

FILE: include/wayland-internal.h
  type wayland_global_name (line 13) | typedef enum {
  type widget_button_event (line 22) | typedef struct {
  type widget_motion_event (line 30) | typedef struct {
  type wayland_seat (line 35) | typedef struct _wayland_seat wayland_seat;
  type clipboard_data (line 37) | typedef struct {
  type wayland_stuff (line 41) | typedef struct {
  type _wayland_seat (line 92) | struct _wayland_seat {

FILE: include/wayland.h
  type display_buffer_pool (line 36) | typedef struct _display_buffer_pool display_buffer_pool;

FILE: include/widgets/box.h
  type box (line 49) | typedef struct _box box;

FILE: include/widgets/container.h
  type container (line 44) | typedef struct _container container;

FILE: include/widgets/icon.h
  type icon (line 44) | typedef struct _icon icon;

FILE: include/widgets/listview.h
  type listview (line 45) | typedef struct _listview listview;
  type ScrollType (line 50) | typedef enum {

FILE: include/widgets/scrollbar.h
  type scrollbar (line 43) | typedef struct _scrollbar {

FILE: include/widgets/textbox.h
  type TBFontConfig (line 48) | typedef struct TBFontConfig {
  type textbox (line 60) | typedef struct {
  type TextboxFlags (line 92) | typedef enum {
  type TextBoxFontType (line 103) | typedef enum {

FILE: include/widgets/widget-internal.h
  type _widget (line 56) | struct _widget {

FILE: include/widgets/widget.h
  type widget (line 49) | typedef struct _widget widget;
  type WidgetType (line 54) | typedef enum {
  type WidgetTriggerActionResult (line 74) | typedef enum {
  type widget (line 96) | typedef widget *(*widget_find_mouse_target_cb)(widget *wid, WidgetType t...
  type WidgetTriggerActionResult (line 111) | typedef WidgetTriggerActionResult (*widget_trigger_action_cb)(widget *wid,
  function widget_disable (line 168) | static inline void widget_disable(widget *wid) {
  function widget_enable (line 176) | static inline void widget_enable(widget *wid) { widget_set_enabled(wid, ...

FILE: include/xcb-dummy.h
  type xcb_configure_notify_event_t (line 8) | typedef int xcb_configure_notify_event_t;
  type xcb_window_t (line 9) | typedef int xcb_window_t;
  type xcb_timestamp_t (line 10) | typedef int xcb_timestamp_t;

FILE: include/xcb-internal.h
  type _xcb_stuff (line 46) | struct _xcb_stuff {

FILE: include/xcb.h
  type xcb_stuff (line 40) | typedef struct _xcb_stuff xcb_stuff;
  type X11CursorType (line 140) | typedef enum {
  type WindowManagerQuirk (line 161) | typedef enum {

FILE: include/xrmoptions.h
  type XrmOptionType (line 71) | typedef enum {

FILE: source/display.c
  function display_init (line 13) | void display_init(const display_proxy *disp_in) {
  function monitor_active (line 18) | int monitor_active(workarea *mon) { return proxy->monitor_active(mon); }
  function display_set_input_focus (line 20) | void display_set_input_focus(guint w) { proxy->set_input_focus(w); }
  function display_revert_input_focus (line 22) | void display_revert_input_focus(void) { proxy->revert_input_focus(); }
  function gboolean (line 24) | gboolean display_setup(GMainLoop *main_loop, NkBindings *bindings) {
  function gboolean (line 28) | gboolean display_late_setup(void) { return proxy->late_setup(); }
  function display_early_cleanup (line 30) | void display_early_cleanup(void) { proxy->early_cleanup(); }
  function display_cleanup (line 32) | void display_cleanup(void) { proxy->cleanup(); }
  function display_dump_monitor_layout (line 34) | void display_dump_monitor_layout(void) { proxy->dump_monitor_layout(); }
  function display_startup_notification (line 36) | void display_startup_notification(RofiHelperExecuteContext *context,
  function guint (line 42) | guint display_scale(void) { return proxy->scale(); }
  function display_get_clipboard_data (line 44) | void display_get_clipboard_data(enum clipboard_type type, ClipboardCb ca...
  function display_set_fullscreen_mode (line 48) | void display_set_fullscreen_mode(void) { proxy->set_fullscreen_mode(); }

FILE: source/helper.c
  function helper_select_next_matching_mode (line 83) | void helper_select_next_matching_mode(void) {
  function helper_select_previous_matching_mode (line 89) | void helper_select_previous_matching_mode(void) {
  function cmd_set_arguments (line 97) | void cmd_set_arguments(int argc, char **argv) {
  function helper_parse_setup (line 102) | int helper_parse_setup(char *string, char ***output, int *length, ...) {
  function helper_tokenize_free (line 146) | void helper_tokenize_free(rofi_int_matcher **tokens) {
  function gchar (line 154) | static gchar *glob_to_regex(const char *input) {
  function gchar (line 169) | static gchar *fuzzy_to_regex(const char *input) {
  function gchar (line 198) | static gchar *prefix_regex(const char *input) {
  function GRegex (line 230) | static inline GRegex *R(const char *s, int case_sensitive) {
  function rofi_int_matcher (line 245) | static rofi_int_matcher *create_regex(const char *input, int case_sensit...
  function rofi_int_matcher (line 286) | rofi_int_matcher **helper_tokenize(const char *input, int case_sensitive) {
  function find_arg (line 325) | int find_arg(const char *const key) {
  function find_arg_str (line 334) | int find_arg_str(const char *const key, char **val) {
  function find_arg_int (line 364) | int find_arg_int(const char *const key, int *val) {
  function find_arg_uint (line 373) | int find_arg_uint(const char *const key, unsigned int *val) {
  function helper_parse_char (line 383) | char helper_parse_char(const char *arg) {
  function find_arg_char (line 431) | int find_arg_char(const char *const key, char *val) {
  function helper_token_match_set_pango_attr_on_style (line 441) | void helper_token_match_set_pango_attr_on_style(PangoAttrList *retv, int...
  function PangoAttrList (line 510) | PangoAttrList *helper_token_match_get_pango_attr(RofiHighlightColorStyle...
  function helper_token_match (line 541) | int helper_token_match(rofi_int_matcher *const *tokens, const char *inpu...
  function execute_generator (line 562) | int execute_generator(const char *cmd) {
  function create_pid_file (line 585) | int create_pid_file(const char *pidfile, gboolean kill_running) {
  function remove_pid_file (line 644) | void remove_pid_file(int fd) {
  function gboolean (line 652) | gboolean helper_validate_font(PangoFontDescription *pfd, const char *fon...
  function config_sanity_check (line 671) | int config_sanity_check(void) {
  type passwd (line 795) | struct passwd
  function levenshtein (line 817) | unsigned int levenshtein(const char *needle, const glong needlelen,
  type CharClass (line 916) | enum CharClass {
  function rofi_scorer_get_character_class (line 932) | static enum CharClass rofi_scorer_get_character_class(gunichar c) {
  function rofi_scorer_get_score_for (line 953) | static int rofi_scorer_get_score_for(enum CharClass prev, enum CharClass...
  function rofi_scorer_fuzzy_evaluate (line 966) | int rofi_scorer_fuzzy_evaluate(const char *pattern, glong plen, const ch...
  function utf8_strncmp (line 1036) | int utf8_strncmp(const char *a, const char *b, size_t n) {
  function gboolean (line 1047) | gboolean helper_execute(const char *wd, char **args, const char *error_p...
  function gboolean (line 1075) | gboolean helper_execute_command(const char *wd, const char *cmd,
  function gboolean (line 1246) | static gboolean parse_pair(char *input, rofi_range_pair *item) {
  function parse_ranges (line 1280) | void parse_ranges(char *input, rofi_range_pair **list, unsigned int *len...
  function parse_case_sensitivity (line 1298) | int parse_case_sensitivity(const char *input) {
  function rofi_output_formatted_line (line 1319) | void rofi_output_formatted_line(const char *format, const char *string,
  function gboolean (line 1359) | static gboolean helper_eval_cb2(const GMatchInfo *info, GString *res,

FILE: source/history.c
  type _element (line 44) | typedef struct __element {
  function __element_sort_func (line 51) | static int __element_sort_func(const void *ea, const void *eb,
  function __history_write_element_list (line 58) | static void __history_write_element_list(FILE *fd, _element **list,
  function _element (line 126) | static _element **__history_get_element_list(FILE *fd, unsigned int *len...
  function history_set (line 181) | void history_set(const char *filename, const char *entry) {
  function history_remove (line 263) | void history_remove(const char *filename, const char *entry) {

FILE: source/keyb.c
  type ActionBindingEntry (line 35) | typedef struct {
  function abe_list_all_bindings (line 397) | void abe_list_all_bindings(gboolean is_term) {
  function setup_abe (line 416) | void setup_abe(void) {
  function gboolean (line 425) | static gboolean binding_check_action(guint64 scope,
  function binding_trigger_action (line 434) | static void binding_trigger_action(guint64 scope, G_GNUC_UNUSED gpointer...
  function guint (line 440) | guint key_binding_get_action_from_name(const char *name) {
  function gboolean (line 450) | gboolean parse_keys_abe(NkBindings *bindings) {

FILE: source/mode.c
  function mode_init (line 44) | int mode_init(Mode *mode) {
  function mode_destroy (line 64) | void mode_destroy(Mode *mode) {
  function mode_get_num_entries (line 70) | unsigned int mode_get_num_entries(const Mode *mode) {
  function cairo_surface_t (line 87) | cairo_surface_t *mode_get_icon(Mode *mode, unsigned int selected_line,
  function ModeMode (line 131) | ModeMode mode_result(Mode *mode, int menu_retv, char **input,
  function mode_token_match (line 150) | int mode_token_match(const Mode *mode, rofi_int_matcher **tokens,
  function mode_get_abi_version (line 162) | int mode_get_abi_version(Mode *const mode) {
  function mode_free (line 167) | void mode_free(Mode **mode) {
  function mode_set_private_data (line 181) | void mode_set_private_data(Mode *mode, void *pd) {
  function mode_set_config (line 205) | void mode_set_config(Mode *mode) {
  function Mode (line 225) | Mode *mode_create(const Mode *mode) {
  function ModeMode (line 232) | ModeMode mode_completer_result(Mode *mode, int menu_retv, char **input,
  function gboolean (line 244) | gboolean mode_is_completer(const Mode *mode) {
  function mode_plugin_set_module (line 253) | void mode_plugin_set_module(Mode *mode, GModule *mod){
  function GModule (line 256) | GModule *mode_plugin_get_module(Mode *mode){

FILE: source/modes/combi.c
  type CombiMode (line 46) | typedef struct {
  type CombiModePrivateData (line 51) | typedef struct {
  function combi_mode_parse_switchers (line 62) | static void combi_mode_parse_switchers(Mode *sw) {
  function combi_mode_get_num_entries (line 100) | static unsigned int combi_mode_get_num_entries(const Mode *sw) {
  function combi_mode_init (line 113) | static int combi_mode_init(Mode *sw) {
  function combi_mode_destroy (line 131) | static void combi_mode_destroy(Mode *sw) {
  function ModeMode (line 145) | static ModeMode combi_mode_result(Mode *sw, int mretv, char **input,
  function combi_mode_match (line 200) | static int combi_mode_match(const Mode *sw, rofi_int_matcher **tokens,
  function cairo_surface_t (line 288) | static cairo_surface_t *combi_get_icon(const Mode *sw, unsigned int index,

FILE: source/modes/dmenu.c
  function bitget (line 65) | static inline unsigned int bitget(uint32_t const *const array,
  function bittoggle (line 72) | static inline void bittoggle(uint32_t *const array, unsigned int index) {
  type DmenuModePrivateData (line 78) | typedef struct {
  type Block (line 121) | typedef struct {
  function read_add_block (line 127) | static void read_add_block(DmenuModePrivateData *pd, Block **block, char...
  function read_add (line 162) | static void read_add(DmenuModePrivateData *pd, char *data, gsize len) {
  function gboolean (line 206) | static gboolean dmenu_async_read_proc(gint fd, GIOCondition condition,
  function read_input_sync (line 246) | static void read_input_sync(DmenuModePrivateData *pd, unsigned int pre_r...
  function gpointer (line 262) | static gpointer read_input_thread(gpointer userdata) {
  function dmenu_mode_get_num_entries (line 358) | static unsigned int dmenu_mode_get_num_entries(const Mode *sw) {
  function gchar (line 365) | static gchar *dmenu_format_output_string(const DmenuModePrivateData *pd,
  function get_index (line 413) | static inline unsigned int get_index(unsigned int length, int index) {
  function dmenu_mode_free (line 481) | static void dmenu_mode_free(Mode *sw) {
  function dmenu_mode_init (line 526) | static int dmenu_mode_init(Mode *sw) {
  function dmenu_token_match (line 668) | static int dmenu_token_match(const Mode *sw, rofi_int_matcher **tokens,
  function cairo_surface_t (line 717) | static cairo_surface_t *dmenu_get_icon(const Mode *sw,
  function dmenu_finish (line 762) | static void dmenu_finish(DmenuModePrivateData *pd, RofiViewState *state,
  function dmenu_print_results (line 803) | static void dmenu_print_results(DmenuModePrivateData *pd, const char *in...
  function dmenu_finalize (line 823) | static void dmenu_finalize(RofiViewState *state) {
  function dmenu_mode_dialog (line 966) | int dmenu_mode_dialog(void) {
  function print_dmenu_options (line 1060) | void print_dmenu_options(void) {

FILE: source/modes/drun.c
  type DRunModePrivateData (line 80) | typedef struct _DRunModePrivateData DRunModePrivateData;
  type DRunDesktopEntryType (line 85) | typedef enum {
  type DRunModeEntry (line 102) | typedef struct {
  type DRunEntryField (line 149) | typedef struct {
  type DRunMatchingFields (line 156) | typedef enum {
  type _DRunModePrivateData (line 214) | struct _DRunModePrivateData {
  type RegexEvalArg (line 240) | struct RegexEvalArg {
  function gboolean (line 247) | static gboolean drun_helper_eval_cb(const GMatchInfo *info, GString *res,
  function launch_link_entry (line 308) | static void launch_link_entry(DRunModeEntry *e) {
  function gchar (line 345) | static gchar *app_path_for_id(const gchar *app_id) {
  function GVariant (line 359) | static GVariant *app_get_platform_data(void) {
  function gboolean (line 376) | static gboolean exec_dbus_entry(DRunModeEntry *e, const char *path) {
  function exec_cmd_entry (line 434) | static void exec_cmd_entry(DRunModePrivateData *pd, DRunModeEntry *e,
  function gboolean (line 536) | static gboolean rofi_strv_contains(const char *const *categories,
  function read_desktop_file (line 550) | static void read_desktop_file(DRunModePrivateData *pd, const char *root,
  function walk_dir (line 864) | static void walk_dir(DRunModePrivateData *pd, const char *root,
  function delete_entry_history (line 929) | static void delete_entry_history(const DRunModeEntry *entry) {
  function get_apps_history (line 935) | static void get_apps_history(DRunModePrivateData *pd) {
  function gint (line 958) | static gint drun_int_sort_list(gconstpointer a, gconstpointer b,
  function drun_write_str (line 984) | static void drun_write_str(FILE *fd, const char *str) {
  function drun_write_integer (line 993) | static void drun_write_integer(FILE *fd, int32_t val) {
  function gboolean (line 996) | static gboolean drun_read_integer(FILE *fd, int32_t *type) {
  function gboolean (line 1003) | static gboolean drun_read_string(FILE *fd, char **str) {
  function drun_write_strv (line 1025) | static void drun_write_strv(FILE *fd, char **str) {
  function gboolean (line 1032) | static gboolean drun_read_stringv(FILE *fd, char ***str) {
  function write_cache (line 1057) | static void write_cache(DRunModePrivateData *pd, const char *cache_file) {
  function gboolean (line 1100) | static gboolean drun_read_cache(DRunModePrivateData *pd,
  function get_apps (line 1232) | static void get_apps(DRunModePrivateData *pd) {
  function drun_mode_parse_entry_fields (line 1300) | static void drun_mode_parse_entry_fields(void) {
  function drun_mode_parse_display_format (line 1336) | static void drun_mode_parse_display_format(void) {
  function drun_mode_init (line 1350) | static int drun_mode_init(Mode *sw) {
  function drun_entry_clear (line 1378) | static void drun_entry_clear(DRunModeEntry *e) {
  function ModeMode (line 1404) | static ModeMode drun_mode_result(Mode *sw, int mretv, char **input,
  function drun_mode_destroy (line 1506) | static void drun_mode_destroy(Mode *sw) {
  function cairo_surface_t (line 1601) | static cairo_surface_t *_get_icon(const Mode *sw, unsigned int selected_...
  function drun_token_match (line 1635) | static int drun_token_match(const Mode *data, rofi_int_matcher **tokens,
  function drun_mode_get_num_entries (line 1709) | static unsigned int drun_mode_get_num_entries(const Mode *sw) {

FILE: source/modes/filebrowser.c
  type FBFileType (line 66) | enum FBFileType {
  type FBSortingMethod (line 76) | enum FBSortingMethod {
  type FBSortingTime (line 84) | enum FBSortingTime {
  type FBFile (line 92) | typedef struct {
  type FileBrowserModePrivateData (line 105) | typedef struct {
  type FBSortingMethod (line 118) | enum FBSortingMethod
  type FBSortingTime (line 120) | enum FBSortingTime
  function free_list (line 132) | static void free_list(FileBrowserModePrivateData *pd) {
  function gint (line 147) | static gint compare_name(gconstpointer a, gconstpointer b,
  function gint (line 159) | static gint compare_time(gconstpointer a, gconstpointer b,
  function gint (line 179) | static gint compare(gconstpointer a, gconstpointer b, gpointer data) {
  function time_t (line 197) | static time_t get_time(const GStatBuf *statbuf) {
  function set_time (line 210) | static void set_time(FBFile *file) {
  function set_collate_key (line 229) | static void set_collate_key(FBFile *file) {
  function fb_resize_array (line 233) | inline static void fb_resize_array(FileBrowserModePrivateData *pd) {
  function get_file_browser (line 241) | static void get_file_browser(Mode *sw) {
  function file_browser_mode_init_config (line 369) | static void file_browser_mode_init_config(Mode *sw) {
  function file_browser_mode_init_current_dir (line 422) | static void file_browser_mode_init_current_dir(Mode *sw) {
  function file_browser_mode_init (line 457) | static int file_browser_mode_init(Mode *sw) {
  function file_browser_mode_get_num_entries (line 473) | static unsigned int file_browser_mode_get_num_entries(const Mode *sw) {
  function ModeMode (line 479) | static ModeMode file_browser_mode_result(Mode *sw, int mretv, char **input,
  function file_browser_mode_destroy (line 570) | static void file_browser_mode_destroy(Mode *sw) {
  function file_browser_token_match (line 611) | static int file_browser_token_match(const Mode *sw, rofi_int_matcher **t...
  function cairo_surface_t (line 620) | static cairo_surface_t *_get_icon(const Mode *sw, unsigned int selected_...
  function Mode (line 662) | Mode *create_new_file_browser(void) {
  function ModeMode (line 672) | ModeMode file_browser_mode_completer(Mode *sw, int mretv, char **input,

FILE: source/modes/help-keys.c
  type KeysHelpModePrivateData (line 48) | typedef struct {
  function get_apps (line 55) | static void get_apps(KeysHelpModePrivateData *pd) {
  function help_keys_mode_init (line 59) | static int help_keys_mode_init(Mode *sw) {
  function ModeMode (line 68) | static ModeMode
  function help_keys_mode_destroy (line 78) | static void help_keys_mode_destroy(Mode *sw) {
  function help_keys_token_match (line 99) | static int help_keys_token_match(const Mode *data, rofi_int_matcher **to...
  function help_keys_mode_get_num_entries (line 106) | static unsigned int help_keys_mode_get_num_entries(const Mode *sw) {

FILE: source/modes/recursivebrowser.c
  type FBFileType (line 64) | enum FBFileType {
  type FBFile (line 73) | typedef struct {
  type FileBrowserModePrivateData (line 84) | typedef struct {
  function free_list (line 100) | static void free_list(FileBrowserModePrivateData *pd) {
  function fb_resize_array (line 114) | inline static void fb_resize_array(FileBrowserModePrivateData *pd) {
  function recursive_browser_mode_init_config (line 122) | static void recursive_browser_mode_init_config(Mode *sw) {
  function recursive_browser_mode_init_current_dir (line 165) | static void recursive_browser_mode_init_current_dir(Mode *sw) {
  function scan_dir (line 184) | static void scan_dir(FileBrowserModePrivateData *pd, GFile *path) {
  function gpointer (line 329) | static gpointer recursive_browser_input_thread(gpointer userdata) {
  function gboolean (line 341) | static gboolean recursive_browser_async_read_proc(gint fd,
  function recursive_browser_mode_init (line 378) | static int recursive_browser_mode_init(Mode *sw) {
  function recursive_browser_mode_get_num_entries (line 406) | static unsigned int recursive_browser_mode_get_num_entries(const Mode *s...
  function ModeMode (line 412) | static ModeMode recursive_browser_mode_result(Mode *sw, int mretv,
  function recursive_browser_mode_destroy (line 453) | static void recursive_browser_mode_destroy(Mode *sw) {
  function recursive_browser_token_match (line 501) | static int recursive_browser_token_match(const Mode *sw,
  function cairo_surface_t (line 511) | static cairo_surface_t *_get_icon(const Mode *sw, unsigned int selected_...
  function Mode (line 554) | Mode *create_new_recursive_browser(void) {
  function ModeMode (line 564) | ModeMode recursive_browser_mode_completer(Mode *sw, int mretv, char **in...

FILE: source/modes/run.c
  type RunEntry (line 66) | typedef struct {
  type RunModePrivateData (line 80) | typedef struct {
  function gboolean (line 104) | static gboolean exec_cmd(const char *cmd, int run_in_term, const char *o...
  function delete_entry (line 147) | static void delete_entry(const RunEntry *cmd) {
  function sort_func (line 166) | static int sort_func(const void *a, const void *b, G_GNUC_UNUSED void *d...
  function RunEntry (line 185) | static RunEntry *get_apps_external(RunEntry *retv, unsigned int *length,
  function RunEntry (line 245) | static RunEntry *get_apps(unsigned int *length) {
  function run_mode_init (line 411) | static int run_mode_init(Mode *sw) {
  function run_mode_destroy (line 421) | static void run_mode_destroy(Mode *sw) {
  function run_mode_get_num_entries (line 443) | static unsigned int run_mode_get_num_entries(const Mode *sw) {
  function ModeMode (line 451) | static ModeMode run_mode_result(Mode *sw, int mretv, char **input,
  function run_token_match (line 548) | static int run_token_match(const Mode *sw, rofi_int_matcher **tokens,
  function cairo_surface_t (line 574) | static cairo_surface_t *_get_icon(const Mode *sw, unsigned int selected_...

FILE: source/modes/script.c
  type ScriptModePrivateData (line 54) | typedef struct {
  function dmenuscript_parse_entry_extras (line 89) | void dmenuscript_parse_entry_extras(G_GNUC_UNUSED Mode *sw,
  function script_switch_mode (line 137) | static void script_switch_mode(Mode *sw, char *value) {
  function parse_header_entry (line 148) | static void parse_header_entry(Mode *sw, char *line, ssize_t length) {
  function DmenuScriptEntry (line 197) | static DmenuScriptEntry *execute_executor(Mode *sw, char *arg,
  function script_switcher_free (line 319) | static void script_switcher_free(Mode *sw) {
  function script_mode_init (line 328) | static int script_mode_init(Mode *sw) {
  function script_mode_get_num_entries (line 339) | static unsigned int script_mode_get_num_entries(const Mode *sw) {
  function script_mode_reset_highlight (line 345) | static void script_mode_reset_highlight(Mode *sw) {
  function script_mode_free_entry_list (line 356) | static void script_mode_free_entry_list(DmenuScriptEntry *list,
  function ModeMode (line 367) | static ModeMode script_mode_result(Mode *sw, int mretv, char **input,
  function script_mode_destroy (line 453) | static void script_mode_destroy(Mode *sw) {
  function get_index (line 466) | static inline unsigned int get_index(unsigned int length, int index) {
  function script_token_match (line 512) | static int script_token_match(const Mode *sw, rofi_int_matcher **tokens,
  function cairo_surface_t (line 556) | static cairo_surface_t *script_get_icon(const Mode *sw,
  type ScriptUser (line 609) | typedef struct ScriptUser {
  function script_mode_cleanup (line 621) | void script_mode_cleanup(void) {
  function script_mode_gather_user_scripts (line 628) | void script_mode_gather_user_scripts(void) {
  function script_mode_has_user_script (line 657) | static int script_mode_has_user_script(char const *const user) {
  function Mode (line 667) | Mode *script_mode_parse_setup(const char *str) {
  function gboolean (line 719) | gboolean script_mode_is_valid(const char *token) {
  function script_user_list (line 726) | void script_user_list(gboolean is_term) {

FILE: source/modes/ssh.c
  type SshEntry (line 62) | typedef struct _SshEntry {
  type SSHModePrivateData (line 72) | typedef struct {
  function execshssh (line 98) | static int execshssh(const SshEntry *entry) {
  function exec_ssh (line 127) | static void exec_ssh(const SshEntry *entry) {
  function delete_ssh (line 155) | static void delete_ssh(const char *host) {
  function SshEntry (line 173) | static SshEntry *read_known_hosts_file(const char *path, SshEntry *retv,
  function SshEntry (line 269) | static SshEntry *read_hosts_file(SshEntry *retv, unsigned int *length) {
  function add_known_hosts_file (line 336) | static void add_known_hosts_file(SSHModePrivateData *pd, const char *tok...
  function parse_ssh_config_file (line 347) | static void parse_ssh_config_file(SSHModePrivateData *pd, const char *fi...
  function SshEntry (line 485) | static SshEntry *get_ssh(SSHModePrivateData *pd, unsigned int *length) {
  function ssh_mode_init (line 567) | static int ssh_mode_init(Mode *sw) {
  function ssh_mode_get_num_entries (line 583) | static unsigned int ssh_mode_get_num_entries(const Mode *sw) {
  function ssh_mode_destroy (line 594) | static void ssh_mode_destroy(Mode *sw) {
  function ModeMode (line 618) | static ModeMode ssh_mode_result(Mode *sw, int mretv, char **input,
  function ssh_token_match (line 690) | static int ssh_token_match(const Mode *sw, rofi_int_matcher **tokens,

FILE: source/modes/wayland-window.c
  type WaylandWindowMatchingFields (line 55) | enum WaylandWindowMatchingFields {
  type WaylandWindowModePrivateData (line 61) | typedef struct _WaylandWindowModePrivateData {
  type ForeignToplevelState (line 75) | enum ForeignToplevelState {
  type ForeignToplevelHandle (line 87) | typedef struct {
  function foreign_toplevel_handle_free (line 102) | static void foreign_toplevel_handle_free(ForeignToplevelHandle *self) {
  function toplevels_list_update_max_len (line 113) | static void toplevels_list_update_max_len(gpointer data, gpointer user_d...
  function wayland_window_update_toplevel (line 122) | static void wayland_window_update_toplevel(ForeignToplevelHandle *toplev...
  function foreign_toplevel_handle_activate (line 139) | static void foreign_toplevel_handle_activate(ForeignToplevelHandle *self,
  function foreign_toplevel_handle_close (line 144) | static void foreign_toplevel_handle_close(ForeignToplevelHandle *self) {
  function foreign_toplevel_handle_title (line 150) | static void foreign_toplevel_handle_title(
  function foreign_toplevel_handle_app_id (line 161) | static void foreign_toplevel_handle_app_id(
  function foreign_toplevel_handle_output_enter (line 172) | static void foreign_toplevel_handle_output_enter(
  function foreign_toplevel_handle_output_leave (line 179) | static void foreign_toplevel_handle_output_leave(
  function foreign_toplevel_handle_state (line 186) | static void foreign_toplevel_handle_state(
  function foreign_toplevel_handle_done (line 196) | static void foreign_toplevel_handle_done(
  function foreign_toplevel_handle_closed (line 206) | static void foreign_toplevel_handle_closed(
  function foreign_toplevel_handle_parent (line 217) | static void foreign_toplevel_handle_parent(
  type zwlr_foreign_toplevel_handle_v1_listener (line 224) | struct zwlr_foreign_toplevel_handle_v1_listener
  function ForeignToplevelHandle (line 235) | static ForeignToplevelHandle *
  function foreign_toplevel_manager_toplevel (line 248) | static void foreign_toplevel_manager_toplevel(
  function foreign_toplevel_manager_finished (line 257) | static void foreign_toplevel_manager_finished(
  type zwlr_foreign_toplevel_manager_v1_listener (line 263) | struct zwlr_foreign_toplevel_manager_v1_listener
  function handle_global (line 268) | static void handle_global(void *data, struct wl_registry *registry,
  function handle_global_remove (line 282) | static void handle_global_remove(G_GNUC_UNUSED void *data,
  type wl_registry_listener (line 286) | struct wl_registry_listener
  function wayland_window_mode_parse_fields (line 289) | static int wayland_window_mode_parse_fields(void) {
  function get_wayland_window (line 319) | static void get_wayland_window(Mode *sw) {
  function toplevels_list_item_free (line 345) | static void toplevels_list_item_free(gpointer data,
  function wayland_window_private_free (line 350) | static void wayland_window_private_free(WaylandWindowModePrivateData *pd) {
  function wayland_window_mode_init (line 375) | static int wayland_window_mode_init(Mode *sw) {
  function wayland_window_mode_get_num_entries (line 390) | static unsigned int wayland_window_mode_get_num_entries(const Mode *sw) {
  function ModeMode (line 399) | static ModeMode wayland_window_mode_result(Mode *sw, int mretv,
  function wayland_window_mode_destroy (line 431) | static void wayland_window_mode_destroy(Mode *sw) {
  function wayland_window_token_match (line 443) | static int wayland_window_token_match(const Mode *sw, rofi_int_matcher *...
  function helper_eval_add_str (line 482) | static void helper_eval_add_str(GString *str, const char *input, int len,
  type arg (line 513) | struct arg {
  function gboolean (line 518) | static gboolean helper_eval_cb(const GMatchInfo *info, GString *str,
  type arg (line 550) | struct arg
  function cairo_surface_t (line 580) | static cairo_surface_t *_get_icon(const Mode *sw, unsigned int selected_...

FILE: source/modes/window.c
  type WinModeField (line 70) | typedef struct {
  type WinModeMatchingFields (line 75) | typedef enum {
  type client (line 109) | typedef struct {
  type winlist (line 136) | typedef struct {
  type WindowModePrivateData (line 142) | typedef struct {
  function winlist (line 166) | static winlist *winlist_new(void) {
  function winlist_append (line 183) | static int winlist_append(winlist *l, xcb_window_t w, client *d) {
  function client_free (line 200) | static void client_free(client *c) {
  function winlist_empty (line 213) | static void winlist_empty(winlist *l) {
  function winlist_free (line 228) | static void winlist_free(winlist *l) {
  function winlist_find (line 245) | static int winlist_find(winlist *l, xcb_window_t w) {
  function x11_cache_create (line 264) | static void x11_cache_create(void) {
  function x11_cache_free (line 273) | static void x11_cache_free(void) {
  function xcb_get_window_attributes_reply_t (line 287) | static xcb_get_window_attributes_reply_t *
  function client_has_state (line 299) | static int client_has_state(client *c, xcb_atom_t state) {
  function client_has_window_type (line 308) | static int client_has_window_type(client *c, xcb_atom_t type) {
  function client (line 318) | static client *window_client(WindowModePrivateData *pd, xcb_window_t win) {
  function gboolean (line 403) | static gboolean window_client_reload(G_GNUC_UNUSED void *data) {
  function window_client_handle_signal (line 418) | void window_client_handle_signal(G_GNUC_UNUSED xcb_window_t win,
  function window_match (line 427) | static int window_match(const Mode *sw, rofi_int_matcher **tokens,
  function window_mode_parse_fields (line 481) | static void window_mode_parse_fields(void) {
  function window_mode_get_num_entries (line 515) | static unsigned int window_mode_get_num_entries(const Mode *sw) {
  function _window_mode_load_data (line 541) | static void _window_mode_load_data(Mode *sw, unsigned int cd) {
  function window_mode_init (line 701) | static int window_mode_init(Mode *sw) {
  function window_mode_init_cd (line 725) | static int window_mode_init_cd(Mode *sw) {
  function act_on_window (line 745) | static inline int act_on_window(xcb_window_t window) {
  function ModeMode (line 775) | static ModeMode window_mode_result(Mode *sw, int mretv,
  function window_mode_destroy (line 865) | static void window_mode_destroy(Mode *sw) {
  type arg (line 877) | struct arg {
  function helper_eval_add_str (line 882) | static void helper_eval_add_str(GString *str, const char *input, int l,
  function gboolean (line 910) | static gboolean helper_eval_cb(const GMatchInfo *info, GString *str,
  type arg (line 944) | struct arg
  function cairo_surface_t (line 979) | static cairo_surface_t *draw_surface_from_data(uint32_t width, uint32_t ...
  function cairo_surface_t (line 1007) | static cairo_surface_t *ewmh_window_icon_from_reply(xcb_get_property_rep...
  function cairo_surface_t (line 1063) | static cairo_surface_t *get_net_wm_icon(xcb_window_t xid,
  function cairo_surface_t (line 1074) | static cairo_surface_t *_get_icon(const Mode *sw, unsigned int selected_...

FILE: source/rofi-icon-fetcher.c
  type IconFetcher (line 58) | typedef struct {
  type IconFetcherNameEntry (line 75) | typedef struct {
  type IconFetcherEntry (line 80) | typedef struct {
  function rofi_icon_fetcher_load_thumbnailers (line 105) | static void rofi_icon_fetcher_load_thumbnailers(const gchar *path) {
  function gchar (line 161) | static gchar **setup_thumbnailer_command(const gchar *command,
  function gboolean (line 204) | static gboolean exec_thumbnailer_command(gchar **command_args) {
  function gboolean (line 223) | static gboolean rofi_icon_fetcher_create_thumbnail(const gchar *mime_type,
  function rofi_icon_fetch_thread_pool_entry_remove (line 249) | static void rofi_icon_fetch_thread_pool_entry_remove(gpointer data) {
  function rofi_icon_fetch_entry_free (line 255) | static void rofi_icon_fetch_entry_free(gpointer data) {
  function rofi_icon_fetcher_init (line 273) | void rofi_icon_fetcher_init(void) {
  function free_wrapper (line 321) | static void free_wrapper(gpointer data, G_GNUC_UNUSED gpointer user_data) {
  function rofi_icon_fetcher_destroy (line 325) | void rofi_icon_fetcher_destroy(void) {
  function guchar (line 369) | static inline guchar alpha_mult(guchar c, guchar a) {
  function cairo_surface_t (line 382) | static cairo_surface_t *
  function gboolean (line 443) | gboolean rofi_icon_fetcher_file_is_image(const char *const path) {
  function gchar (line 463) | static gchar *rofi_icon_fetcher_get_thumbnail(gchar *name, int requested...
  function gchar (line 507) | static gchar *rofi_icon_fetcher_get_desktop_icon(const gchar *file_path) {
  function rofi_icon_fetcher_worker (line 528) | static void rofi_icon_fetcher_worker(thread_state *sdata,
  function rofi_icon_fetcher_query_advanced (line 752) | uint32_t rofi_icon_fetcher_query_advanced(const char *name, const int ws...
  function rofi_icon_fetcher_query (line 799) | uint32_t rofi_icon_fetcher_query(const char *name, const int size) {
  function cairo_surface_t (line 846) | cairo_surface_t *rofi_icon_fetcher_get(const uint32_t uid) {
  function gboolean (line 856) | gboolean rofi_icon_fetcher_get_ex(const uint32_t uid,

FILE: source/rofi.c
  function rofi_add_error_message (line 96) | void rofi_add_error_message(GString *str) {
  function rofi_clear_error_messages (line 99) | void rofi_clear_error_messages(void) {
  function rofi_add_warning_message (line 109) | void rofi_add_warning_message(GString *str) {
  function rofi_clear_warning_messages (line 112) | void rofi_clear_warning_messages(void) {
  function rofi_set_return_code (line 154) | void rofi_set_return_code(int code) { return_code = code; }
  function rofi_get_num_enabled_modes (line 156) | unsigned int rofi_get_num_enabled_modes(void) { return num_modes; }
  function Mode (line 158) | const Mode *rofi_get_mode(unsigned int index) { return modes[index]; }
  function mode_lookup (line 160) | int mode_lookup(const char *name) {
  function Mode (line 175) | static const Mode *mode_available_lookup(const char *name) {
  function teardown (line 187) | static void teardown(int pfd) {
  function run_mode_index (line 200) | static void run_mode_index(ModeMode mode) {
  function process_result (line 234) | void process_result(RofiViewState *state) {
  function print_list_of_modes (line 295) | static void print_list_of_modes(int is_term) {
  function print_main_application_options (line 313) | static void print_main_application_options(int is_term) {
  function print_backend_info (line 359) | static void print_backend_info(void) {
  function help (line 383) | static void help(G_GNUC_UNUSED int argc, char **argv, const gboolean com...
  function help_print_disabled_mode (line 492) | static void help_print_disabled_mode(const char *mode) {
  function help_print_mode_not_found (line 505) | static void help_print_mode_not_found(const char *mode) {
  function help_print_no_arguments (line 522) | static void help_print_no_arguments(void) {
  function cleanup (line 558) | static void cleanup(void) {
  function Mode (line 606) | Mode *rofi_collect_modes_search(const char *name) {
  function gboolean (line 619) | static gboolean rofi_collectmodes_add(Mode *mode) {
  function rofi_collectmodes_dir (line 632) | static void rofi_collectmodes_dir(const char *base_dir) {
  function rofi_collect_modes (line 676) | static void rofi_collect_modes(void) {
  function rofi_collectmodes_setup (line 720) | static void rofi_collectmodes_setup(void) {
  function rofi_collectmodes_destroy (line 725) | static void rofi_collectmodes_destroy(void) {
  function add_mode (line 748) | static int add_mode(const char *token) {
  function gboolean (line 770) | static gboolean setup_modes(void) {
  function rofi_quit_main_loop (line 791) | void rofi_quit_main_loop(void) { g_main_loop_quit(main_loop); }
  function gboolean (line 793) | static gboolean main_loop_signal_handler_int(G_GNUC_UNUSED gpointer data) {
  function show_error_dialog (line 798) | static void show_error_dialog(void) {
  function gboolean (line 818) | static gboolean startup(G_GNUC_UNUSED gpointer data) {
  function gboolean (line 921) | static gboolean take_screenshot_quit(G_GNUC_UNUSED void *data) {
  function gboolean (line 926) | static gboolean record(G_GNUC_UNUSED void *data) {
  function rofi_custom_log_function (line 930) | static void rofi_custom_log_function(const char *log_domain,
  function main (line 945) | int main(int argc, char *argv[]) {
  function rofi_theme_rasi_validate (line 1349) | int rofi_theme_rasi_validate(const char *filename) {
  function Mode (line 1370) | const Mode *rofi_get_completer(void) {

FILE: source/theme.c
  function rofi_theme_free_parsed_files (line 56) | void rofi_theme_free_parsed_files(void) {
  function rofi_theme_print_parsed_files (line 66) | void rofi_theme_print_parsed_files(gboolean is_term) {
  function gboolean (line 77) | static gboolean distance_compare(RofiDistance d, RofiDistance e) {
  function ThemeWidget (line 83) | ThemeWidget *rofi_theme_find_or_create_name(ThemeWidget *base,
  function Property (line 103) | Property *rofi_theme_property_create(PropertyType type) {
  function RofiDistanceUnit (line 109) | static RofiDistanceUnit *
  function RofiDistance (line 121) | RofiDistance rofi_theme_property_copy_distance(RofiDistance const distan...
  function Property (line 133) | Property *rofi_theme_property_copy(const Property *p,
  function rofi_theme_distance_unit_property_free (line 183) | static void rofi_theme_distance_unit_property_free(RofiDistanceUnit *uni...
  function rofi_theme_distance_property_free (line 194) | static void rofi_theme_distance_property_free(RofiDistance *distance) {
  function rofi_theme_property_free (line 205) | void rofi_theme_property_free(Property *p) {
  function rofi_theme_reset (line 236) | void rofi_theme_reset(void) {
  function rofi_theme_free (line 242) | void rofi_theme_free(ThemeWidget *wid) {
  function printf_double (line 264) | inline static void printf_double(double d) {
  function rofi_theme_print_distance_unit (line 272) | static void rofi_theme_print_distance_unit(RofiDistanceUnit *unit) {
  function rofi_theme_print_color (line 327) | static void rofi_theme_print_color(ThemeColor color) {
  function rofi_theme_print_distance (line 348) | static void rofi_theme_print_distance(RofiDistance d) {
  function int_rofi_theme_print_property (line 367) | static void int_rofi_theme_print_property(Property *p) {
  function rofi_theme_print_property_index (line 526) | static void rofi_theme_print_property_index(size_t pnl, int cur_depth,
  function rofi_theme_print_index (line 535) | void rofi_theme_print_index(ThemeWidget *wid, int index) {
  function rofi_theme_print (line 595) | void rofi_theme_print(ThemeWidget *wid) {
  function yyerror (line 620) | void yyerror(YYLTYPE *yylloc, const char *what, const char *s) {
  function rofi_theme_copy_property_int (line 650) | static void rofi_theme_copy_property_int(G_GNUC_UNUSED gpointer key,
  function rofi_theme_widget_add_properties (line 656) | void rofi_theme_widget_add_properties(ThemeWidget *wid, GHashTable *tabl...
  function ThemeWidget (line 672) | static inline ThemeWidget *rofi_theme_find_single(ThemeWidget *wid,
  function ThemeWidget (line 682) | static ThemeWidget *rofi_theme_find(ThemeWidget *wid, const char *name,
  function rofi_theme_resolve_link_property (line 708) | static void rofi_theme_resolve_link_property(Property *p, int cur_depth) {
  function Property (line 745) | Property *rofi_theme_find_property(ThemeWidget *wid, PropertyType type,
  function ThemeWidget (line 782) | ThemeWidget *rofi_config_find_widget(const char *name, const char *state,
  function ThemeWidget (line 790) | ThemeWidget *rofi_theme_find_widget(const char *name, const char *state,
  function rofi_theme_get_position_inside (line 799) | static int rofi_theme_get_position_inside(Property *p, const widget *wid,
  function rofi_theme_get_position (line 818) | int rofi_theme_get_position(const widget *wid, const char *property, int...
  function rofi_theme_get_integer_inside (line 823) | static int rofi_theme_get_integer_inside(Property *p, const widget *wid,
  function rofi_theme_get_integer (line 842) | int rofi_theme_get_integer(const widget *wid, const char *property, int ...
  function RofiDistance (line 847) | static RofiDistance rofi_theme_get_distance_inside(Property *p,
  function RofiDistance (line 877) | RofiDistance rofi_theme_get_distance(const widget *wid, const char *prop...
  function rofi_theme_get_boolean_inside (line 884) | static int rofi_theme_get_boolean_inside(Property *p, const widget *wid,
  function rofi_theme_get_boolean (line 903) | int rofi_theme_get_boolean(const widget *wid, const char *property, int ...
  function RofiOrientation (line 909) | static RofiOrientation rofi_theme_get_orientation_inside(Property *p,
  function RofiOrientation (line 931) | RofiOrientation rofi_theme_get_orientation(const widget *wid,
  function RofiCursorType (line 940) | static RofiCursorType rofi_theme_get_cursor_type_inside(Property *p,
  function RofiCursorType (line 962) | RofiCursorType rofi_theme_get_cursor_type(const widget *wid,
  function rofi_theme_get_double_integer_fb_inside (line 996) | static double rofi_theme_get_double_integer_fb_inside(Property *p,
  function rofi_theme_get_double_inside (line 1018) | static double rofi_theme_get_double_inside(const widget *orig, Property *p,
  function rofi_theme_get_double (line 1040) | double rofi_theme_get_double(const widget *wid, const char *property,
  function rofi_theme_get_color_inside (line 1046) | static void rofi_theme_get_color_inside(const widget *wid, Property *p,
  function rofi_theme_get_color (line 1067) | void rofi_theme_get_color(const widget *wid, const char *property, cairo...
  function gboolean (line 1073) | static gboolean rofi_theme_get_image_inside(Property *p, const widget *wid,
  function gboolean (line 1174) | gboolean rofi_theme_get_image(const widget *wid, const char *property,
  function RofiPadding (line 1180) | static RofiPadding rofi_theme_get_padding_inside(Property *p, const widg...
  function RofiPadding (line 1208) | RofiPadding rofi_theme_get_padding(const widget *wid, const char *property,
  function GList (line 1215) | static GList *rofi_theme_get_list_inside(Property *p, const widget *wid,
  function GList (line 1234) | GList *rofi_theme_get_list_distance(const widget *wid, const char *prope...
  function GList (line 1260) | GList *rofi_theme_get_list_strings(const widget *wid, const char *proper...
  function RofiHighlightColorStyle (line 1277) | static RofiHighlightColorStyle
  function RofiHighlightColorStyle (line 1308) | RofiHighlightColorStyle rofi_theme_get_highlight(widget *wid,
  function get_pixels (line 1319) | static double get_pixels(RofiDistanceUnit *unit, RofiOrientation ori) {
  function distance_unit_get_pixel (line 1342) | static double distance_unit_get_pixel(RofiDistanceUnit *unit,
  function distance_get_pixel (line 1404) | int distance_get_pixel(RofiDistance d, RofiOrientation ori) {
  function distance_get_linestyle (line 1408) | void distance_get_linestyle(RofiDistance d, cairo_t *draw) {
  function rofi_theme_parse_merge_widgets (line 1428) | void rofi_theme_parse_merge_widgets(ThemeWidget *parent, ThemeWidget *ch...
  function rofi_theme_parse_process_conditionals_int (line 1448) | static void rofi_theme_parse_process_conditionals_int(workarea mon,
  function rofi_theme_parse_process_links_int (line 1560) | static void rofi_theme_parse_process_links_int(ThemeWidget *wid) {
  function rofi_theme_parse_process_links (line 1597) | void rofi_theme_parse_process_links(void) {
  function rofi_theme_parse_process_conditionals (line 1601) | void rofi_theme_parse_process_conditionals(void) {
  function ThemeMediaType (line 1607) | ThemeMediaType rofi_theme_parse_media_type(const char *type) {
  function gboolean (line 1635) | static gboolean rofi_theme_has_property_inside(Property *p,
  function gboolean (line 1653) | gboolean rofi_theme_has_property(const widget *wid_in, const PropertyTyp...
  function rofi_theme_set_disp_scale_func (line 1660) | void rofi_theme_set_disp_scale_func(disp_scale_func func) { disp_scale =...

FILE: source/timings.c
  function rofi_timings_init (line 44) | void rofi_timings_init(void) {
  function rofi_timings_tick (line 50) | void rofi_timings_tick(const char *file, char const *str, int line,
  function rofi_timings_quit (line 59) | void rofi_timings_quit(void) {

FILE: source/view.c
  function view_init (line 67) | void view_init(const view_proxy *view_in) { proxy = view_in; }
  type _rofi_view_cache_state (line 75) | struct _rofi_view_cache_state
  function lev_sort (line 109) | static int lev_sort(const void *p1, const void *p2, void *arg) {
  function screenshot_taken_user_callback (line 117) | static void screenshot_taken_user_callback(const char *path) {
  function rofi_capture_screenshot (line 132) | void rofi_capture_screenshot(void) {
  function rofi_view_update_prompt (line 200) | static void rofi_view_update_prompt(RofiViewState *state) {
  function rofi_view_reload_message_bar (line 208) | static void rofi_view_reload_message_bar(RofiViewState *state) {
  function rofi_view_take_action (line 245) | static void rofi_view_take_action(const char *name) {
  function gboolean (line 261) | static gboolean rofi_view_user_timeout(G_GNUC_UNUSED gpointer data) {
  function rofi_view_set_user_timeout (line 267) | static void rofi_view_set_user_timeout(G_GNUC_UNUSED gpointer data) {
  function rofi_view_restart (line 294) | void rofi_view_restart(RofiViewState *state) {
  function RofiViewState (line 299) | RofiViewState *rofi_view_get_active(void) { return current_active_menu; }
  function textbox (line 301) | textbox *rofi_view_get_active_text(void) {
  function rofi_view_remove_active (line 309) | void rofi_view_remove_active(RofiViewState *state) {
  function rofi_view_set_active (line 316) | void rofi_view_set_active(RofiViewState *state) {
  function rofi_view_set_selected_line (line 338) | void rofi_view_set_selected_line(RofiViewState *state,
  function rofi_view_free (line 361) | void rofi_view_free(RofiViewState *state) {
  function MenuReturn (line 379) | MenuReturn rofi_view_get_return_value(const RofiViewState *state) {
  function rofi_view_get_selected_line (line 383) | unsigned int rofi_view_get_selected_line(const RofiViewState *state) {
  function rofi_view_get_next_position (line 387) | unsigned int rofi_view_get_next_position(const RofiViewState *state) {
  function rofi_view_get_completed (line 396) | unsigned int rofi_view_get_completed(const RofiViewState *state) {
  function RofiViewState (line 412) | static RofiViewState *__rofi_view_state_create(void) {
  type thread_state_view (line 419) | typedef struct _thread_state_view {
  function rofi_view_call_thread (line 450) | static void rofi_view_call_thread(gpointer data, gpointer user_data) {
  function filter_elements (line 455) | static void filter_elements(thread_state *ts,
  function input_history_initialize (line 491) | void input_history_initialize(void) {
  function input_history_save (line 534) | void input_history_save(void) {
  function rofi_view_nav_row_tab (line 584) | static void rofi_view_nav_row_tab(RofiViewState *state) {
  function rofi_view_nav_row_select (line 608) | inline static void rofi_view_nav_row_select(RofiViewState *state) {
  function rofi_view_nav_first (line 628) | inline static void rofi_view_nav_first(RofiViewState *state) {
  function rofi_view_nav_last (line 638) | inline static void rofi_view_nav_last(RofiViewState *state) {
  function selection_changed_user_callback (line 646) | static void selection_changed_user_callback(unsigned int index,
  function selection_changed_callback (line 662) | static void selection_changed_callback(G_GNUC_UNUSED listview *lv,
  function update_callback (line 695) | static void update_callback(textbox *t, icon *ico, unsigned int index,
  function page_changed_callback (line 750) | static void page_changed_callback(void) {
  function _rofi_view_reload_row (line 755) | static void _rofi_view_reload_row(RofiViewState *state) {
  function gboolean (line 765) | static gboolean rofi_view_refilter_real(RofiViewState *state) {
  function rofi_view_refilter (line 907) | void rofi_view_refilter(RofiViewState *state) {
  function rofi_view_refilter_force (line 937) | static void rofi_view_refilter_force(RofiViewState *state) {
  function rofi_view_finalize (line 952) | void rofi_view_finalize(RofiViewState *state) {
  function rofi_view_input_changed (line 962) | static void rofi_view_input_changed(void) {
  function rofi_view_clipboard_callback (line 979) | static void rofi_view_clipboard_callback(char *clipboard_data,
  function rofi_view_trigger_global_action (line 991) | static void rofi_view_trigger_global_action(KeyBindingAction action) {
  function gboolean (line 1341) | gboolean rofi_view_check_action(RofiViewState *state, BindingsScope scope,
  function rofi_view_trigger_action (line 1372) | void rofi_view_trigger_action(RofiViewState *state, BindingsScope scope,
  function rofi_view_handle_text (line 1413) | void rofi_view_handle_text(RofiViewState *state, const char *text) {
  function X11CursorType (line 1424) | static X11CursorType rofi_cursor_type_to_x11_cursor_type ( RofiCursorTyp...
  function RofiCursorType (line 1442) | static RofiCursorType rofi_view_resolve_cursor(RofiViewState *state, gin...
  function rofi_view_handle_mouse_motion (line 1450) | void rofi_view_handle_mouse_motion(RofiViewState *state, gint x, gint y,
  function rofi_quit_user_callback (line 1478) | static void rofi_quit_user_callback(RofiViewState *state) {
  function rofi_view_maybe_update (line 1510) | void rofi_view_maybe_update(RofiViewState *state) {
  function WidgetTriggerActionResult (line 1534) | WidgetTriggerActionResult textbox_button_trigger_action(
  function WidgetTriggerActionResult (line 1563) | static WidgetTriggerActionResult textbox_sidebar_modes_trigger_action(
  function rofi_view_listview_mouse_activated_cb (line 1592) | static void rofi_view_listview_mouse_activated_cb(listview *lv, gboolean...
  function rofi_view_add_widget (line 1605) | static void rofi_view_add_widget(RofiViewState *state, widget *parent_wi...
  function RofiViewState (line 1810) | RofiViewState *rofi_view_create(Mode *sw, const char *input,
  function rofi_error_user_callback (line 1918) | static void rofi_error_user_callback(const char *msg) {
  function rofi_view_error_dialog (line 1930) | int rofi_view_error_dialog(const char *msg, int markup) {
  function rofi_thread_workers_sort (line 1981) | static int rofi_thread_workers_sort(gconstpointer a, gconstpointer b,
  function rofi_thread_pool_state_free (line 1989) | static void rofi_thread_pool_state_free(gpointer data) {
  function rofi_view_workers_initialize (line 2007) | void rofi_view_workers_initialize(void) {
  function rofi_view_workers_finalize (line 2036) | void rofi_view_workers_finalize(void) {
  function Mode (line 2043) | Mode *rofi_view_get_mode(RofiViewState *state) { return state->sw; }
  function gboolean (line 2045) | static gboolean rofi_view_overlay_timeout(G_GNUC_UNUSED gpointer user_da...
  function rofi_view_set_overlay_timeout (line 2055) | void rofi_view_set_overlay_timeout(RofiViewState *state, const char *tex...
  function rofi_view_set_overlay (line 2069) | void rofi_view_set_overlay(RofiViewState *state, const char *text) {
  function rofi_view_clear_input (line 2087) | void rofi_view_clear_input(RofiViewState *state) {
  function rofi_view_ellipsize_listview (line 2094) | void rofi_view_ellipsize_listview(RofiViewState *state,
  function rofi_view_switch_mode (line 2099) | void rofi_view_switch_mode(RofiViewState *state, Mode *mode) {
  function rofi_view_update (line 2129) | void rofi_view_update(RofiViewState *state, gboolean qr) {
  function rofi_view_temp_configure_notify (line 2133) | void rofi_view_temp_configure_notify(RofiViewState *state,
  function rofi_view_temp_click_to_exit (line 2138) | void rofi_view_temp_click_to_exit(RofiViewState *state, xcb_window_t tar...
  function rofi_view_frame_callback (line 2142) | void rofi_view_frame_callback(void) { proxy->frame_callback(); }
  function rofi_view_queue_redraw (line 2144) | void rofi_view_queue_redraw(void) { proxy->queue_redraw(); }
  function rofi_view_set_window_title (line 2146) | void rofi_view_set_window_title(const char *title) {
  function rofi_view_calculate_window_position (line 2150) | void rofi_view_calculate_window_position(RofiViewState *state) {
  function rofi_view_calculate_window_width (line 2154) | void rofi_view_calculate_window_width(struct RofiViewState *state) {
  function rofi_view_calculate_window_height (line 2158) | int rofi_view_calculate_window_height(RofiViewState *state) {
  function rofi_view_window_update_size (line 2162) | void rofi_view_window_update_size(RofiViewState *state) {
  function rofi_view_set_cursor (line 2166) | void rofi_view_set_cursor(RofiCursorType type) { proxy->set_cursor(type); }
  function rofi_view_cleanup (line 2168) | void rofi_view_cleanup(void) { proxy->cleanup(); }
  function rofi_view_hide (line 2170) | void rofi_view_hide(void) { proxy->hide(); }
  function rofi_view_reload (line 2172) | void rofi_view_reload(void) { proxy->reload(); }
  function __create_window (line 2174) | void __create_window(MenuFlags menu_flags) {
  function xcb_window_t (line 2178) | xcb_window_t rofi_view_get_window(void) { return proxy->get_window(); }
  function rofi_view_get_current_monitor (line 2180) | void rofi_view_get_current_monitor(int *width, int *height) {
  function rofi_view_set_size (line 2184) | void rofi_view_set_size(RofiViewState *state, gint width, gint height) {
  function rofi_view_get_size (line 2188) | void rofi_view_get_size(RofiViewState *state, gint *width, gint *height) {
  function rofi_view_ping_mouse (line 2192) | void rofi_view_ping_mouse(RofiViewState *state) { proxy->ping_mouse(stat...
  function rofi_view_pool_refresh (line 2194) | void rofi_view_pool_refresh(void) { proxy->pool_refresh(); }

FILE: source/wayland/display.c
  type wayland_buffer_pool (line 77) | typedef struct _display_buffer_pool wayland_buffer_pool;
  type wayland_output (line 78) | typedef struct {
  type wayland_buffer (line 95) | typedef struct {
  type _display_buffer_pool (line 102) | struct _display_buffer_pool {
  type zwp_text_input_v3_listener (line 118) | struct zwp_text_input_v3_listener
  function wayland_buffer_cleanup (line 120) | static void wayland_buffer_cleanup(wayland_buffer_pool *self) {
  function wayland_buffer_release (line 144) | static void wayland_buffer_release(void *data, struct wl_buffer *buffer) {
  type wl_buffer_listener (line 157) | struct wl_buffer_listener
  function wayland_buffer_pool (line 160) | wayland_buffer_pool *display_buffer_pool_new(gint width, gint height) {
  function display_buffer_pool_free (line 232) | void display_buffer_pool_free(wayland_buffer_pool *self) {
  function wayland_surface_protocol_enter (line 240) | static void wayland_surface_protocol_enter(void *data,
  function wayland_surface_protocol_leave (line 271) | static void wayland_surface_protocol_leave(void *data,
  type wl_surface_listener (line 275) | struct wl_surface_listener
  type wl_callback (line 280) | struct wl_callback
  type wl_callback_listener (line 283) | struct wl_callback_listener
  function cairo_surface_t (line 287) | cairo_surface_t *
  function display_surface_commit (line 311) | void display_surface_commit(cairo_surface_t *surface) {
  function wayland_frame_callback (line 331) | static void wayland_frame_callback(void *data, struct wl_callback *callb...
  function wayland_keyboard_keymap (line 345) | static void wayland_keyboard_keymap(void *data, struct wl_keyboard *keyb...
  function wayland_keyboard_enter (line 376) | static void wayland_keyboard_enter(void *data, struct wl_keyboard *keybo...
  function wayland_keyboard_leave (line 392) | static void wayland_keyboard_leave(void *data, struct wl_keyboard *keybo...
  function gboolean (line 399) | static gboolean wayland_key_repeat(void *data) {
  function gboolean (line 425) | static gboolean wayland_key_repeat_delay(void *data) {
  function wayland_keyboard_key (line 457) | static void wayland_keyboard_key(void *data, struct wl_keyboard *keyboard,
  function wayland_keyboard_modifiers (line 502) | static void wayland_keyboard_modifiers(void *data, struct wl_keyboard *k...
  function wayland_keyboard_repeat_info (line 516) | static void wayland_keyboard_repeat_info(void *data,
  type wl_keyboard_listener (line 529) | struct wl_keyboard_listener
  function wayland_cursor_set_image (line 540) | static void wayland_cursor_set_image(int i) {
  type wl_callback (line 555) | struct wl_callback
  type wl_callback_listener (line 558) | struct wl_callback_listener
  function wayland_cursor_frame_callback (line 563) | static void wayland_cursor_frame_callback(void *data,
  function wayland_pointer_send_events (line 579) | static void wayland_pointer_send_events(wayland_seat *self) {
  type wl_cursor (line 658) | struct wl_cursor
  type wl_cursor_theme (line 659) | struct wl_cursor_theme
  type wl_cursor (line 667) | struct wl_cursor
  function rofi_cursor_type_to_wp_cursor_shape (line 687) | static enum wp_cursor_shape_device_v1_shape
  function wayland_cursor_update_for_seat (line 700) | static void wayland_cursor_update_for_seat(wayland_seat *seat) {
  function wayland_pointer_enter (line 729) | static void wayland_pointer_enter(void *data, struct wl_pointer *pointer,
  function wayland_display_set_cursor_type (line 751) | void wayland_display_set_cursor_type(RofiCursorType type) {
  function wayland_pointer_leave (line 785) | static void wayland_pointer_leave(void *data, struct wl_pointer *pointer,
  function wayland_pointer_motion (line 795) | static void wayland_pointer_motion(void *data, struct wl_pointer *pointer,
  function wayland_pointer_button (line 806) | static void wayland_pointer_button(void *data, struct wl_pointer *pointer,
  function wayland_pointer_axis (line 820) | static void wayland_pointer_axis(void *data, struct wl_pointer *pointer,
  function wayland_pointer_frame (line 835) | static void wayland_pointer_frame(void *data, struct wl_pointer *pointer) {
  function wayland_pointer_axis_source (line 840) | static void
  function wayland_pointer_axis_stop (line 848) | static void wayland_pointer_axis_stop(void *data, struct wl_pointer *poi...
  function wayland_pointer_axis_discrete (line 852) | static void wayland_pointer_axis_discrete(void *data,
  function wayland_pointer_axis120 (line 871) | static void wayland_pointer_axis120(void *data, struct wl_pointer *wl_po...
  type wl_pointer_listener (line 887) | struct wl_pointer_listener
  function wayland_keyboard_release (line 902) | static void wayland_keyboard_release(wayland_seat *self) {
  type clipboard_read_info (line 920) | struct clipboard_read_info {
  function gboolean (line 928) | static gboolean clipboard_read_glib_callback(GIOChannel *channel,
  function gboolean (line 971) | static gboolean clipboard_read_data(int fd, ClipboardCb callback,
  function data_offer_handle_offer (line 1001) | static void data_offer_handle_offer(void *data, struct wl_data_offer *of...
  function data_offer_handle_source_actions (line 1004) | static void data_offer_handle_source_actions(
  function data_offer_handle_action (line 1007) | static void data_offer_handle_action(void *data,
  type wl_data_offer_listener (line 1011) | struct wl_data_offer_listener
  function data_device_handle_data_offer (line 1017) | static void data_device_handle_data_offer(void *data,
  function data_device_handle_enter (line 1023) | static void data_device_handle_enter(void *data,
  function data_device_handle_leave (line 1029) | static void data_device_handle_leave(void *data,
  function data_device_handle_motion (line 1032) | static void data_device_handle_motion(void *data,
  function data_device_handle_drop (line 1037) | static void data_device_handle_drop(void *data,
  function clipboard_handle_selection (line 1040) | static void clipboard_handle_selection(enum clipboard_type cb_type,
  function data_device_handle_selection (line 1054) | static void data_device_handle_selection(void *data,
  type wl_data_device_listener (line 1060) | struct wl_data_device_listener
  function primary_selection_handle_offer (line 1069) | static void
  type zwp_primary_selection_offer_v1_listener (line 1074) | struct zwp_primary_selection_offer_v1_listener
  function primary_selection_device_handle_data_offer (line 1079) | static void primary_selection_device_handle_data_offer(
  function primary_selection_device_handle_selection (line 1086) | static void primary_selection_device_handle_selection(
  type zwp_primary_selection_device_v1_listener (line 1092) | struct zwp_primary_selection_device_v1_listener
  function wayland_pointer_release (line 1098) | static void wayland_pointer_release(wayland_seat *self) {
  function wayland_seat_release (line 1115) | static void wayland_seat_release(wayland_seat *self) {
  function wayland_seat_capabilities (line 1130) | static void wayland_seat_capabilities(void *data, struct wl_seat *seat,
  function wayland_seat_name (line 1173) | static void wayland_seat_name(void *data, struct wl_seat *seat,
  type wl_seat_listener (line 1184) | struct wl_seat_listener
  function update_cursor_rectangle (line 1189) | static void update_cursor_rectangle(struct zwp_text_input_v3 *text_input) {
  function text_input_enter (line 1203) | static void text_input_enter(void *data, struct zwp_text_input_v3 *text_...
  function text_input_leave (line 1212) | static void text_input_leave(void *data, struct zwp_text_input_v3 *text_...
  function text_input_preedit_string (line 1218) | static void text_input_preedit_string(void *data,
  function text_input_commit_string (line 1226) | static void text_input_commit_string(void *data,
  function text_input_delete_surrounding_text (line 1239) | static void
  function text_input_done (line 1245) | static void text_input_done(void *data, struct zwp_text_input_v3 *text_i...
  type zwp_text_input_v3_listener (line 1248) | struct zwp_text_input_v3_listener
  function wayland_output_release (line 1257) | static void wayland_output_release(wayland_output *self) {
  function wayland_output (line 1272) | static wayland_output *wayland_output_by_name(const char *name) {
  function wayland_get_dpi_estimation (line 1290) | double wayland_get_dpi_estimation(void) {
  function wayland_output_done (line 1312) | static void wayland_output_done(void *data, struct wl_output *output) {
  function wayland_output_geometry (line 1326) | static void wayland_output_geometry(void *data, struct wl_output *output,
  function wayland_output_mode (line 1340) | static void wayland_output_mode(void *data, struct wl_output *output,
  function wayland_output_scale (line 1350) | static void wayland_output_scale(void *data, struct wl_output *output,
  function wayland_output_name (line 1358) | static void wayland_output_name(void *data, struct wl_output *output,
  function wayland_output_description (line 1368) | static void wayland_output_description(void *data, struct wl_output *out...
  type wl_output_listener (line 1372) | struct wl_output_listener
  function wayland_registry_handle_global (line 1385) | static void wayland_registry_handle_global(void *data,
  function wayland_registry_handle_global_remove (line 1469) | static void wayland_registry_handle_global_remove(void *data,
  type wl_registry_listener (line 1551) | struct wl_registry_listener
  function wayland_layer_shell_surface_configure (line 1556) | static void wayland_layer_shell_surface_configure(
  function wayland_surface_destroy (line 1564) | static void wayland_surface_destroy(void) {
  function wayland_layer_shell_surface_closed (line 1575) | static void
  type zwlr_layer_surface_v1_listener (line 1597) | struct zwlr_layer_surface_v1_listener
  function gboolean (line 1603) | static gboolean wayland_error(gpointer user_data) {
  function gboolean (line 1608) | static gboolean wayland_cursor_reload_theme(guint scale) {
  function gboolean (line 1645) | static gboolean wayland_display_setup(GMainLoop *main_loop,
  function gboolean (line 1693) | static gboolean wayland_display_late_setup(void) {
  function gboolean (line 1752) | gboolean display_get_surface_dimensions(int *width, int *height) {
  function display_set_surface_dimensions (line 1765) | void display_set_surface_dimensions(int width, int height, int x_margin,
  function wayland_display_early_cleanup (line 1826) | static void wayland_display_early_cleanup(void) {
  function wayland_display_cleanup (line 1835) | static void wayland_display_cleanup(void) {
  function wayland_display_dump_monitor_layout (line 1849) | static void wayland_display_dump_monitor_layout(void) {
  function wayland_display_startup_notification (line 1884) | static void
  function wayland_display_monitor_active (line 1889) | static int wayland_display_monitor_active(workarea *mon) {
  function wayland_display_set_input_focus (line 1894) | static void wayland_display_set_input_focus(guint w) {}
  function wayland_display_revert_input_focus (line 1896) | static void wayland_display_revert_input_focus(void) {}
  type _view_proxy (line 1898) | struct _view_proxy
  function guint (line 1902) | static guint wayland_display_scale(void) { return wayland->scale; }
  function wayland_get_clipboard_data (line 1904) | static void wayland_get_clipboard_data(int cb_type, ClipboardCb callback,
  function wayland_set_fullscreen_mode (line 1928) | static void wayland_set_fullscreen_mode(void) {

FILE: source/wayland/view.c
  function wayland_rofi_view_get_current_monitor (line 94) | static void wayland_rofi_view_get_current_monitor(int *width, int *heigh...
  function gboolean (line 109) | static gboolean wayland_rofi_view_repaint(G_GNUC_UNUSED void *data) {
  function wayland_rofi_view_calculate_window_position (line 126) | static void wayland_rofi_view_calculate_window_position(
  function rofi_get_location (line 129) | static int rofi_get_location(RofiViewState *state) {
  function rofi_get_offset_px (line 134) | static int rofi_get_offset_px(RofiViewState *state, RofiOrientation ori) {
  function wayland_rofi_view_window_update_size (line 142) | static void wayland_rofi_view_window_update_size(RofiViewState *state) {
  function wayland_rofi_view_set_size (line 155) | static void wayland_rofi_view_set_size(RofiViewState *state, gint width,
  function wayland_rofi_view_get_size (line 166) | static void wayland_rofi_view_get_size(RofiViewState *state, gint *width,
  function wayland_rofi_view_ping_mouse (line 172) | static void wayland_rofi_view_ping_mouse(RofiViewState *state) { (void)s...
  function gboolean (line 174) | static gboolean wayland_rofi_view_reload_idle(G_GNUC_UNUSED gpointer dat...
  function wayland_rofi_view_reload (line 193) | static void wayland_rofi_view_reload(void) {
  function wayland_rofi_view_queue_redraw (line 200) | static void wayland_rofi_view_queue_redraw(void) {
  function wayland___create_window (line 213) | static void wayland___create_window(MenuFlags menu_flags) {
  function wayland_rofi_view_calculate_window_width (line 285) | static void wayland_rofi_view_calculate_window_width(RofiViewState *stat...
  function wayland_rofi_view_update (line 302) | static void wayland_rofi_view_update(RofiViewState *state, gboolean qr) {
  function wayland_rofi_view_frame_callback (line 345) | static void wayland_rofi_view_frame_callback(void) {
  function wayland_rofi_view_calculate_window_height (line 352) | static int wayland_rofi_view_calculate_window_height(RofiViewState *stat...
  function wayland_rofi_view_hide (line 372) | static void wayland_rofi_view_hide(void) { display_early_cleanup(); }
  function wayland_rofi_view_cleanup (line 374) | static void wayland_rofi_view_cleanup(void) {
  function wayland_rofi_view_set_window_title (line 400) | static void
  function wayland_rofi_view_pool_refresh (line 403) | static void wayland_rofi_view_pool_refresh(void) {

FILE: source/widgets/box.c
  type _box (line 40) | struct _box {
  function box_get_desired_width (line 52) | static int box_get_desired_width(widget *wid, const int height) {
  function box_get_desired_height (line 95) | static int box_get_desired_height(widget *wid, const int width) {
  function vert_calculate_size (line 128) | static void vert_calculate_size(box *b) {
  function hori_calculate_size (line 195) | static void hori_calculate_size(box *b) {
  function box_draw (line 266) | static void box_draw(widget *wid, cairo_t *draw) {
  function box_free (line 275) | static void box_free(widget *wid) {
  function box_add (line 287) | void box_add(box *wid, widget *child, gboolean expand) {
  function box_resize (line 309) | static void box_resize(widget *wid, short w, short h) {
  function widget (line 318) | static widget *box_find_mouse_target(widget *wid, WidgetType type, gint x,
  function box_set_state (line 339) | static void box_set_state(widget *wid, const char *state) {
  function box (line 347) | box *box_create(widget *parent, const char *name, RofiOrientation type) {
  function box_update (line 367) | static void box_update(widget *wid) {

FILE: source/widgets/container.c
  type _container (line 38) | struct _container {
  function container_get_desired_height (line 45) | static int container_get_desired_height(widget *wid, const int width) {
  function container_draw (line 55) | static void container_draw(widget *wid, cairo_t *draw) {
  function container_free (line 61) | static void container_free(widget *wid) {
  function container_add (line 68) | void container_add(container *cont, widget *child) {
  function container_resize (line 77) | static void container_resize(widget *wid, short w, short h) {
  function widget (line 86) | static widget *container_find_mouse_target(widget *wid, WidgetType type,...
  function container_set_state (line 98) | static void container_set_state(widget *wid, const char *state) {
  function container (line 103) | container *container_create(widget *parent, const char *name) {
  function container_update (line 117) | static void container_update(widget *wid) {

FILE: source/widgets/icon.c
  type _icon (line 41) | struct _icon {
  function icon_get_desired_height (line 57) | static int icon_get_desired_height(widget *wid, G_GNUC_UNUSED const int ...
  function icon_get_desired_width (line 72) | static int icon_get_desired_width(widget *wid, G_GNUC_UNUSED const int h...
  function icon_draw (line 88) | static void icon_draw(widget *wid, cairo_t *draw) {
  function icon_free (line 129) | static void icon_free(widget *wid) {
  function icon_resize (line 139) | static void icon_resize(widget *wid, short w, short h) {
  function icon_set_surface (line 148) | void icon_set_surface(icon *icon_widget, cairo_surface_t *surf) {
  function icon (line 161) | icon *icon_create(widget *parent, const char *name) {

FILE: source/widgets/listview.c
  type MoveDirection (line 59) | typedef enum { LEFT_TO_RIGHT = 0, RIGHT_TO_LEFT = 1 } MoveDirection;
  type _listview_row (line 61) | typedef struct {
  type _listview (line 68) | struct _listview {
  function listview_set_state (line 150) | static void listview_set_state(_listview_row r, TextBoxFontType tbft) {
  function listview_add_widget (line 172) | static void listview_add_widget(listview *lv, _listview_row *row, widget...
  function listview_create_row (line 224) | static void listview_create_row(listview *lv, _listview_row *row) {
  function listview_free (line 251) | static void listview_free(widget *wid) {
  function scroll_per_page_barview (line 262) | static unsigned int scroll_per_page_barview(listview *lv) {
  function scroll_per_page (line 276) | static unsigned int scroll_per_page(listview *lv) {
  function scroll_continious_elements (line 304) | static unsigned int scroll_continious_elements(listview *lv) {
  function scroll_continious_rows (line 327) | static unsigned int scroll_continious_rows(listview *lv) {
  function update_element (line 351) | static void update_element(listview *lv, unsigned int tb, unsigned int i...
  function barview_draw (line 372) | static void barview_draw(widget *wid, cairo_t *draw) {
  function listview_draw (line 452) | static void listview_draw(widget *wid, cairo_t *draw) {
  function _listview_draw (line 571) | static void _listview_draw(widget *wid, cairo_t *draw) {
  function listview_recompute_elements (line 582) | static void listview_recompute_elements(listview *lv) {
  function listview_set_num_elements (line 622) | void listview_set_num_elements(listview *lv, unsigned int rows) {
  function listview_get_selected (line 639) | unsigned int listview_get_selected(listview *lv) {
  function listview_set_selected (line 646) | void listview_set_selected(listview *lv, unsigned int selected) {
  function listview_resize (line 664) | static void listview_resize(widget *wid, short w, short h) {
  function widget (line 694) | static widget *listview_find_mouse_target(widget *wid, WidgetType type, ...
  function WidgetTriggerActionResult (line 720) | static WidgetTriggerActionResult
  function WidgetTriggerActionResult (line 742) | static WidgetTriggerActionResult listview_element_trigger_action(
  function gboolean (line 770) | static gboolean listview_element_motion_notify(widget *wid,
  function listview (line 784) | listview *listview_create(widget *parent, const char *name,
  function listview_nav_up_int (line 858) | static void listview_nav_up_int(listview *lv) {
  function listview_nav_down_int (line 876) | static void listview_nav_down_int(listview *lv) {
  function listview_nav_next (line 893) | void listview_nav_next(listview *lv) {
  function listview_nav_prev (line 899) | void listview_nav_prev(listview *lv) {
  function listview_nav_column_left_int (line 906) | static void listview_nav_column_left_int(listview *lv) {
  function listview_nav_column_right_int (line 915) | static void listview_nav_column_right_int(listview *lv) {
  function listview_nav_up (line 925) | void listview_nav_up(listview *lv) {
  function listview_nav_down (line 943) | void listview_nav_down(listview *lv) {
  function listview_nav_left (line 962) | void listview_nav_left(listview *lv) {
  function listview_nav_right (line 985) | void listview_nav_right(listview *lv) {
  function listview_nav_page_prev_int (line 1024) | static void listview_nav_page_prev_int(listview *lv) {
  function listview_nav_page_next_int (line 1049) | static void listview_nav_page_next_int(listview *lv) {
  function listview_nav_page_prev (line 1077) | void listview_nav_page_prev(listview *lv) {
  function listview_nav_page_next (line 1087) | void listview_nav_page_next(listview *lv) {
  function listview_get_desired_height (line 1098) | static int listview_get_desired_height(widget *wid,
  function listview_set_show_scrollbar (line 1128) | void listview_set_show_scrollbar(listview *lv, gboolean enabled) {
  function listview_set_scroll_type (line 1139) | void listview_set_scroll_type(listview *lv, ScrollType type) {
  function listview_set_mouse_activated_cb (line 1145) | void listview_set_mouse_activated_cb(listview *lv,
  function listview_set_max_lines (line 1154) | void listview_set_max_lines(listview *lv, unsigned int max_lines) {
  function gboolean (line 1160) | gboolean listview_get_fixed_num_lines(listview *lv) {
  function listview_set_fixed_num_lines (line 1166) | void listview_set_fixed_num_lines(listview *lv) {
  function listview_set_ellipsize (line 1172) | void listview_set_ellipsize(listview *lv, PangoEllipsizeMode mode) {
  function listview_toggle_ellipsizing (line 1181) | void listview_toggle_ellipsizing(listview *lv) {
  function listview_set_filtered (line 1198) | void listview_set_filtered(listview *lv, gboolean filtered) {
  function listview_set_selection_changed_callback (line 1204) | void listview_set_selection_changed_callback(

FILE: source/widgets/scrollbar.c
  function scrollbar_get_desired_height (line 44) | static int scrollbar_get_desired_height(widget *wid,
  function guint (line 52) | guint scrollbar_scroll_get_line(const scrollbar *sb, int y) {
  function scrollbar_scroll (line 74) | static void scrollbar_scroll(scrollbar *sb, int y) {
  function WidgetTriggerActionResult (line 79) | static WidgetTriggerActionResult
  function gboolean (line 97) | static gboolean scrollbar_motion_notify(widget *wid, G_GNUC_UNUSED gint x,
  function scrollbar (line 104) | scrollbar *scrollbar_create(widget *parent, const char *name) {
  function scrollbar_free (line 128) | static void scrollbar_free(widget *wid) {
  function scrollbar_set_max_value (line 133) | void scrollbar_set_max_value(scrollbar *sb, unsigned int max) {
  function scrollbar_set_handle (line 139) | void scrollbar_set_handle(scrollbar *sb, unsigned int pos) {
  function scrollbar_set_handle_length (line 145) | void scrollbar_set_handle_length(scrollbar *sb, unsigned int pos_length) {
  function scrollbar_draw (line 163) | static void scrollbar_draw(widget *wid, cairo_t *draw) {

FILE: source/widgets/textbox.c
  function gboolean (line 61) | static gboolean textbox_blink(gpointer data) {
  function textbox_resize (line 73) | static void textbox_resize(widget *wid, short w, short h) {
  function textbox_get_desired_height (line 77) | static int textbox_get_desired_height(widget *wid, const int width) {
  function WidgetTriggerActionResult (line 96) | static WidgetTriggerActionResult
  function textbox_initialize_font (line 126) | static void textbox_initialize_font(textbox *tb) {
  function textbox_tab_stops (line 178) | static void textbox_tab_stops(textbox *tb) {
  function textbox (line 203) | textbox *textbox_create(widget *parent, WidgetType type, const char *name,
  function textbox_font (line 307) | void textbox_font(textbox *tb, TextBoxFontType tbft) {
  function __textbox_update_pango_text (line 339) | static void __textbox_update_pango_text(textbox *tb) {
  function PangoAttrList (line 377) | PangoAttrList *textbox_get_pango_attributes(textbox *tb) {
  function textbox_set_pango_attributes (line 383) | void textbox_set_pango_attributes(textbox *tb, PangoAttrList *list) {
  function textbox_get_cursor (line 396) | int textbox_get_cursor(const textbox *tb) {
  function textbox_text (line 403) | void textbox_text(textbox *tb, const char *text) {
  function textbox_moveresize (line 438) | void textbox_moveresize(textbox *tb, int x, int y, int w, int h) {
  function textbox_free (line 479) | static void textbox_free(widget *wid) {
  function textbox_draw (line 498) | static void textbox_draw(widget *wid, cairo_t *draw) {
  function textbox_cursor (line 639) | void textbox_cursor(textbox *tb, int pos) {
  function textbox_cursor_inc (line 657) | static int textbox_cursor_inc(textbox *tb) {
  function textbox_cursor_dec (line 670) | static int textbox_cursor_dec(textbox *tb) {
  function textbox_cursor_inc_word (line 677) | static void textbox_cursor_inc_word(textbox *tb) {
  function textbox_cursor_dec_word (line 708) | static void textbox_cursor_dec_word(textbox *tb) {
  function textbox_cursor_end (line 741) | void textbox_cursor_end(textbox *tb) {
  function textbox_insert (line 754) | void textbox_insert(textbox *tb, const int char_pos, const char *str,
  function textbox_delete (line 778) | void textbox_delete(textbox *tb, int pos, int dlen) {
  function textbox_cursor_del (line 811) | static void textbox_cursor_del(textbox *tb) {
  function textbox_cursor_bkspc (line 823) | static void textbox_cursor_bkspc(textbox *tb) {
  function textbox_transpose_chars (line 835) | static void textbox_transpose_chars(textbox *tb) {
  function textbox_cursor_bkspc_word (line 875) | static void textbox_cursor_bkspc_word(textbox *tb) {
  function textbox_cursor_del_eol (line 884) | static void textbox_cursor_del_eol(textbox *tb) {
  function textbox_cursor_del_sol (line 892) | static void textbox_cursor_del_sol(textbox *tb) {
  function textbox_cursor_del_word (line 898) | static void textbox_cursor_del_word(textbox *tb) {
  function textbox_keybinding (line 913) | int textbox_keybinding(textbox *tb, KeyBindingAction action) {
  function gboolean (line 978) | gboolean textbox_append_text(textbox *tb, const char *pad, const int pad...
  function tbfc_entry_free (line 1011) | static void tbfc_entry_free(TBFontConfig *tbfc) {
  function textbox_setup (line 1018) | void textbox_setup(void) {
  function textbox_set_pango_context (line 1025) | void textbox_set_pango_context(const char *font, PangoContext *p) {
  function textbox_cleanup (line 1050) | void textbox_cleanup(void) {
  function textbox_get_width (line 1058) | int textbox_get_width(widget *wid) {
  function _textbox_get_height (line 1066) | int _textbox_get_height(widget *wid) {
  function textbox_get_height (line 1074) | int textbox_get_height(const textbox *tb) {
  function textbox_get_font_height (line 1079) | int textbox_get_font_height(const textbox *tb) {
  function textbox_get_font_width (line 1085) | int textbox_get_font_width(const textbox *tb) {
  function textbox_get_estimated_char_height (line 1092) | double textbox_get_estimated_char_height(void) { return tbfc_default->he...
  function textbox_get_estimated_char_width (line 1096) | double textbox_get_estimated_char_width(void) {
  function textbox_get_estimated_ch (line 1106) | double textbox_get_estimated_ch(void) {
  function textbox_get_estimated_height (line 1114) | int textbox_get_estimated_height(const textbox *tb, int eh) {
  function textbox_get_desired_width (line 1118) | int textbox_get_desired_width(widget *wid, G_GNUC_UNUSED const int heigh...
  function textbox_set_ellipsize (line 1141) | void textbox_set_ellipsize(textbox *tb, PangoEllipsizeMode mode) {
  function textbox_get_cursor_x_pos (line 1151) | int textbox_get_cursor_x_pos(const textbox *tb) {

FILE: source/widgets/widget.c
  function widget_init (line 36) | void widget_init(widget *wid, widget *parent, WidgetType type,
  function widget_set_state (line 63) | void widget_set_state(widget *wid, const char *state) {
  function widget_intersect (line 80) | int widget_intersect(const widget *wid, int x, int y) {
  function widget_resize (line 92) | void widget_resize(widget *wid, short w, short h) {
  function widget_move (line 107) | void widget_move(widget *wid, short x, short y) {
  function widget_set_type (line 114) | void widget_set_type(widget *wid, WidgetType type) {
  function gboolean (line 121) | gboolean widget_enabled(widget *wid) {
  function widget_set_enabled (line 128) | void widget_set_enabled(widget *wid, gboolean enabled) {
  function widget_draw (line 140) | void widget_draw(widget *wid, cairo_t *d) {
  function widget_free (line 425) | void widget_free(widget *wid) {
  function widget_get_height (line 437) | int widget_get_height(widget *wid) {
  function widget_get_width (line 446) | int widget_get_width(widget *wid) {
  function widget_get_x_pos (line 455) | int widget_get_x_pos(widget *wid) {
  function widget_get_y_pos (line 461) | int widget_get_y_pos(widget *wid) {
  function widget_xy_to_relative (line 468) | void widget_xy_to_relative(widget *wid, gint *x, gint *y) {
  function widget_update (line 477) | void widget_update(widget *wid) {
  function widget_queue_redraw (line 487) | void widget_queue_redraw(widget *wid) {
  function gboolean (line 500) | gboolean widget_need_redraw(widget *wid) {
  function widget (line 510) | widget *widget_find_mouse_target(widget *wid, WidgetType type, gint x, g...
  function WidgetTriggerActionResult (line 529) | WidgetTriggerActionResult widget_check_action(widget *wid,
  function WidgetTriggerActionResult (line 546) | WidgetTriggerActionResult widget_trigger_action(widget *wid, guint action,
  function widget_set_trigger_action_handler (line 557) | void widget_set_trigger_action_handler(widget *wid, widget_trigger_actio...
  function gboolean (line 566) | gboolean widget_motion_notify(widget *wid, gint x, gint y) {
  function widget_padding_get_left (line 576) | int widget_padding_get_left(const widget *wid) {
  function widget_padding_get_right (line 586) | int widget_padding_get_right(const widget *wid) {
  function widget_padding_get_top (line 598) | int widget_padding_get_top(const widget *wid) {
  function widget_padding_get_bottom (line 608) | int widget_padding_get_bottom(const widget *wid) {
  function widget_padding_get_remaining_width (line 619) | int widget_padding_get_remaining_width(const widget *wid) {
  function widget_padding_get_remaining_height (line 625) | int widget_padding_get_remaining_height(const widget *wid) {
  function widget_padding_get_padding_height (line 631) | int widget_padding_get_padding_height(const widget *wid) {
  function widget_padding_get_padding_width (line 637) | int widget_padding_get_padding_width(const widget *wid) {
  function widget_get_desired_height (line 644) | int widget_get_desired_height(widget *wid, const int width) {
  function widget_get_desired_width (line 653) | int widget_get_desired_width(widget *wid, const int height) {
  function widget_get_absolute_xpos (line 663) | int widget_get_absolute_xpos(widget *wid) {
  function widget_get_absolute_ypos (line 673) | int widget_get_absolute_ypos(widget *wid) {

FILE: source/xcb/display.c
  type _xcb_stuff (line 92) | struct _xcb_stuff
  function xcb_visualtype_t (line 133) | static xcb_visualtype_t *lookup_visual(xcb_screen_t *s, xcb_visualid_t v...
  function cairo_image_surface_blur (line 178) | void cairo_image_surface_blur(cairo_surface_t *surface, int radius,
  function cairo_surface_t (line 287) | cairo_surface_t *x11_helper_get_screenshot_surface_window(xcb_window_t w...
  function cairo_surface_t (line 348) | cairo_surface_t *x11_helper_get_screenshot_surface(void) {
  function xcb_pixmap_t (line 354) | static xcb_pixmap_t get_root_pixmap(xcb_connection_t *c, xcb_screen_t *s...
  function cairo_surface_t (line 374) | cairo_surface_t *x11_helper_get_bg_surface(void) {
  function window_set_atom_prop (line 414) | void window_set_atom_prop(xcb_window_t w, xcb_atom_t prop, xcb_atom_t *a...
  function x11_monitor_free (line 427) | static void x11_monitor_free(workarea *m) {
  function x11_monitors_free (line 432) | static void x11_monitors_free(void) {
  function x11_workarea_fix_rotation (line 445) | static void x11_workarea_fix_rotation(workarea *w) {
  function workarea (line 460) | static workarea *x11_get_monitor_from_output(xcb_randr_output_t out) {
  function workarea (line 508) | static workarea *
  function x11_is_extension_present (line 550) | static int x11_is_extension_present(const char *extension) {
  function x11_build_monitor_layout_xinerama (line 564) | static void x11_build_monitor_layout_xinerama(void) {
  function x11_build_monitor_layout (line 595) | static void x11_build_monitor_layout(void) {
  function xcb_display_dump_monitor_layout (line 696) | static void xcb_display_dump_monitor_layout(void) {
  function xcb_display_startup_notification (line 722) | static void xcb_display_startup_notification(RofiHelperExecuteContext *c...
  function monitor_get_dimension (line 764) | static int monitor_get_dimension(int monitor_id, workarea *mon) {
  function monitor_dimensions (line 779) | static void monitor_dimensions(int x, int y, workarea *mon) {
  function pointer_get (line 806) | static int pointer_get(xcb_window_t root, int *x, int *y) {
  function monitor_active_from_winid (line 821) | static int monitor_active_from_winid(xcb_drawable_t id, workarea *mon) {
  function monitor_active_from_id_focused (line 851) | static int monitor_active_from_id_focused(int mon_id, workarea *mon) {
  function monitor_active_from_id (line 922) | static int monitor_active_from_id(int mon_id, workarea *mon) {
  function xcb_display_monitor_active (line 1003) | static int xcb_display_monitor_active(workarea *mon) {
  function get_atom_name (line 1074) | static bool get_atom_name(xcb_connection_t *conn, xcb_atom_t atom, char ...
  function rofi_view_paste (line 1109) | static void rofi_view_paste(RofiViewState *state,
  function gboolean (line 1137) | static gboolean
  function gboolean (line 1167) | static gboolean x11_button_to_nk_bindings_scroll(guint32 x11_button,
  function rofi_key_press_event_handler (line 1190) | static void rofi_key_press_event_handler(xcb_key_press_event_t *xkpe,
  function rofi_key_release_event_handler (line 1210) | static void rofi_key_release_event_handler(xcb_key_release_event_t *xkre,
  function main_loop_x11_event_handler_view (line 1221) | static void main_loop_x11_event_handler_view(xcb_generic_event_t *event) {
  function x11_event_handler_fowarding (line 1418) | void x11_event_handler_fowarding(G_GNUC_UNUSED xcb_xim_t *im,
  function gboolean (line 1438) | static gboolean main_loop_x11_event_handler(xcb_generic_event_t *ev,
  function take_pointer (line 1493) | static int take_pointer(xcb_window_t w, int iters) {
  function take_keyboard (line 1522) | static int take_keyboard(xcb_window_t w, int iters) {
  function release_keyboard (line 1550) | static void release_keyboard(void) {
  function release_pointer (line 1553) | static void release_pointer(void) {
  function error_trap_push (line 1559) | static void error_trap_push(G_GNUC_UNUSED SnDisplay *display,
  function error_trap_pop (line 1564) | static void error_trap_pop(G_GNUC_UNUSED SnDisplay *display,
  function x11_create_frequently_used_atoms (line 1578) | static void x11_create_frequently_used_atoms(void) {
  function x11_helper_discover_window_manager (line 1612) | static void x11_helper_discover_window_manager(void) {
  function gboolean (line 1637) | static gboolean xcb_display_setup(GMainLoop *main_loop, NkBindings *bind...
  function x11_create_visual_and_colormap (line 1787) | static void x11_create_visual_and_colormap(void) {
  function x11_lookup_cursors (line 1830) | static void x11_lookup_cursors(void) {
  function gboolean (line 1853) | static gboolean lazy_grab_pointer(G_GNUC_UNUSED gpointer data) {
  function gboolean (line 1866) | static gboolean lazy_grab_keyboard(G_GNUC_UNUSED gpointer data) {
  function gboolean (line 1881) | static gboolean xcb_display_late_setup(void) {
  function xcb_window_t (line 1914) | xcb_window_t xcb_stuff_get_root_window(void) { return xcb->screen->root; }
  function xcb_display_early_cleanup (line 1916) | static void xcb_display_early_cleanup(void) {
  function xcb_display_cleanup (line 1922) | static void xcb_display_cleanup(void) {
  function x11_disable_decoration (line 1956) | void x11_disable_decoration(xcb_window_t window) {
  function x11_set_cursor (line 1980) | void x11_set_cursor(xcb_window_t window, X11CursorType type) {
  function xcb_stuff_set_clipboard (line 1992) | void xcb_stuff_set_clipboard(char *data) {
  function xcb_display_set_input_focus (line 1997) | static void xcb_display_set_input_focus(guint w) {
  function xcb_display_revert_input_focus (line 2020) | static void xcb_display_revert_input_focus(void) {
  function guint (line 2030) | static guint xcb_display_scale(void) { return 1; }
  type _view_proxy (line 2032) | struct _view_proxy

FILE: source/xcb/view.c
  function xcb_rofi_view_get_current_monitor (line 139) | static void xcb_rofi_view_get_current_monitor(int *width, int *height) {
  function gboolean (line 168) | static gboolean bench_update(void) {
  function gboolean (line 192) | static gboolean xcb_rofi_view_repaint(G_GNUC_UNUSED void *data) {
  function xcb_rofi_view_update (line 218) | static void xcb_rofi_view_update(RofiViewState *state, gboolean qr) {
  function xcb_rofi_view_calculate_window_position (line 279) | static void xcb_rofi_view_calculate_window_position(RofiViewState *state) {
  function xcb_rofi_view_window_update_size (line 366) | static void xcb_rofi_view_window_update_size(RofiViewState *state) {
  function X11CursorType (line 395) | static X11CursorType rofi_cursor_type_to_x11_cursor_type(RofiCursorType ...
  function xcb_rofi_view_set_cursor (line 410) | static void xcb_rofi_view_set_cursor(RofiCursorType type) {
  function xcb_rofi_view_ping_mouse (line 422) | static void xcb_rofi_view_ping_mouse(RofiViewState *state) {
  function gboolean (line 438) | static gboolean xcb_rofi_view_reload_idle(G_GNUC_UNUSED gpointer data) {
  function xcb_rofi_view_reload (line 456) | static void xcb_rofi_view_reload(void) {
  function xcb_rofi_view_queue_redraw (line 463) | static void xcb_rofi_view_queue_redraw(void) {
  function xcb_rofi_view_setup_fake_transparency (line 474) | static void
  function xim_commit_string (line 529) | static void xim_commit_string(xcb_xim_t *im, G_GNUC_UNUSED xcb_xic_t ic,
  function xim_disconnected (line 558) | static void xim_disconnected(G_GNUC_UNUSED xcb_xim_t *im,
  function create_ic_callback (line 563) | static void create_ic_callback(xcb_xim_t *im, xcb_xic_t new_ic,
  function gboolean (line 571) | gboolean rofi_set_im_window_pos(int new_x, int new_y) {
  function open_xim_callback (line 589) | static void open_xim_callback(xcb_xim_t *im, G_GNUC_UNUSED void *user_da...
  function xcb___create_window (line 607) | static void xcb___create_window(MenuFlags menu_flags) {
  function xcb_rofi_view_calculate_window_width (line 809) | static void xcb_rofi_view_calculate_window_width(RofiViewState *state) {
  function xcb_rofi_view_temp_configure_notify (line 826) | static void
  function xcb_rofi_view_temp_click_to_exit (line 861) | static void xcb_rofi_view_temp_click_to_exit(RofiViewState *state,
  function xcb_rofi_view_frame_callback (line 871) | static void xcb_rofi_view_frame_callback(void) {
  function xcb_rofi_view_calculate_window_height (line 880) | static int xcb_rofi_view_calculate_window_height(RofiViewState *state) {
  function xcb_rofi_view_hide (line 897) | static void xcb_rofi_view_hide(void) {
  function xcb_rofi_view_cleanup (line 905) | static void xcb_rofi_view_cleanup(void) {
  function xcb_window_t (line 959) | static xcb_window_t xcb_rofi_view_get_window(void) {
  function xcb_rofi_view_set_window_title (line 963) | static void xcb_rofi_view_set_window_title(const char *title) {

FILE: source/xrmoptions.c
  type ConfigSource (line 48) | enum ConfigSource {
  type XrmOption (line 56) | typedef struct {
  function config_parser_add_option (line 684) | void config_parser_add_option(XrmOptionType type, const char *key, void ...
  function config_parse_cmd_option (line 723) | static void config_parse_cmd_option(XrmOption *option) {
  function gboolean (line 770) | static gboolean config_parser_form_rasi_format(GString *str, char **tokens,
  function config_parse_cmd_options (line 792) | void config_parse_cmd_options(void) {
  function gboolean (line 862) | static gboolean __config_parser_set_property(XrmOption *option,
  function gboolean (line 944) | gboolean config_parse_set_property(const Property *p, char **error) {
  function config_xresource_free (line 991) | void config_xresource_free(void) {
  function config_parse_dump_config_option (line 1012) | static void config_parse_dump_config_option(FILE *out, XrmOption *option) {
  function config_parse_dump_config_rasi_format (line 1053) | void config_parse_dump_config_rasi_format(FILE *out, gboolean changes) {
  function print_option_string (line 1093) | static void print_option_string(XrmOption *xo, int is_term) {
  function print_option_number (line 1109) | static void print_option_number(XrmOption *xo, int is_term) {
  function print_option_snumber (line 1123) | static void print_option_snumber(XrmOption *xo, int is_term) {
  function print_option_char (line 1137) | static void print_option_char(XrmOption *xo, int is_term) {
  function print_option_boolean (line 1151) | static void print_option_boolean(XrmOption *xo, int is_term) {
  function print_option (line 1167) | static void print_option(XrmOption *xo, int is_term) {
  function print_options (line 1191) | void print_options(void) {
  function print_help_msg (line 1208) | void print_help_msg(const char *option, const char *type, const char *text,

FILE: test/box-test.c
  function rofi_icon_fetcher_query (line 75) | uint32_t rofi_icon_fetcher_query(G_GNUC_UNUSED const char *name,
  function rofi_icon_fetcher_query_advanced (line 79) | uint32_t rofi_icon_fetcher_query_advanced(G_GNUC_UNUSED const char *name,
  function cairo_surface_t (line 85) | cairo_surface_t *rofi_icon_fetcher_get(G_GNUC_UNUSED const uint32_t uid) {
  function monitor_active (line 89) | int monitor_active(G_GNUC_UNUSED workarea *mon) { return 0; }
  function gboolean (line 91) | gboolean config_parse_set_property(G_GNUC_UNUSED const Property *p,
  function rofi_add_error_message (line 101) | void rofi_add_error_message(G_GNUC_UNUSED GString *msg) {}
  function rofi_add_warning_message (line 102) | void rofi_add_warning_message(G_GNUC_UNUSED GString *msg) {}
  function textbox_get_estimated_char_height (line 104) | double textbox_get_estimated_char_height(void) { return 16; }
  function textbox_get_estimated_ch (line 106) | double textbox_get_estimated_ch(void) { return 8; }
  function rofi_view_get_current_monitor (line 107) | void rofi_view_get_current_monitor(G_GNUC_UNUSED int *width,
  function main (line 110) | int main(G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv) {

FILE: test/helper-config-cmdline-parser.c
  function rofi_icon_fetcher_query (line 59) | uint32_t rofi_icon_fetcher_query(G_GNUC_UNUSED const char *name,
  function rofi_icon_fetcher_query_advanced (line 63) | uint32_t rofi_icon_fetcher_query_advanced(G_GNUC_UNUSED const char *name,
  function cairo_surface_t (line 69) | cairo_surface_t *rofi_icon_fetcher_get(G_GNUC_UNUSED const uint32_t uid) {
  function rofi_clear_error_messages (line 72) | void rofi_clear_error_messages(void) {}
  function rofi_clear_warning_messages (line 73) | void rofi_clear_warning_messages(void) {}
  function gboolean (line 75) | gboolean rofi_theme_parse_string(G_GNUC_UNUSED const char *string) {
  function textbox_get_estimated_char_height (line 79) | double textbox_get_estimated_char_height(void) { return 12.0; }
  function rofi_view_get_current_monitor (line 80) | void rofi_view_get_current_monitor(int *width, int *height) {
  function textbox_get_estimated_ch (line 84) | double textbox_get_estimated_ch(void) { return 9.0; }
  function rofi_add_error_message (line 85) | void rofi_add_error_message(G_GNUC_UNUSED GString *msg) {}
  function rofi_add_warning_message (line 86) | void rofi_add_warning_message(G_GNUC_UNUSED GString *msg) {}
  function rofi_view_error_dialog (line 87) | int rofi_view_error_dialog(const char *msg, G_GNUC_UNUSED int markup) {
  function monitor_active (line 92) | int monitor_active(G_GNUC_UNUSED workarea *mon) { return 0; }
  function display_startup_notification (line 94) | void display_startup_notification(
  function main (line 99) | int main(G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv) {

FILE: test/helper-expand.c
  function rofi_clear_error_messages (line 58) | void rofi_clear_error_messages(void) {}
  function rofi_clear_warning_messages (line 59) | void rofi_clear_warning_messages(void) {}
  function rofi_icon_fetcher_query (line 60) | uint32_t rofi_icon_fetcher_query(G_GNUC_UNUSED const char *name,
  function rofi_icon_fetcher_query_advanced (line 64) | uint32_t rofi_icon_fetcher_query_advanced(G_GNUC_UNUSED const char *name,
  function cairo_surface_t (line 70) | cairo_surface_t *rofi_icon_fetcher_get(G_GNUC_UNUSED const uint32_t uid) {
  function textbox_get_estimated_char_height (line 74) | double textbox_get_estimated_char_height(void) { return 12.0; }
  function rofi_view_get_current_monitor (line 75) | void rofi_view_get_current_monitor(int *width, int *height) {
  function textbox_get_estimated_ch (line 79) | double textbox_get_estimated_ch(void) { return 9.0; }
  function gboolean (line 80) | gboolean rofi_theme_parse_string(G_GNUC_UNUSED const char *string) { ret...
  function rofi_add_error_message (line 82) | void rofi_add_error_message(G_GNUC_UNUSED GString *msg) {}
  function rofi_add_warning_message (line 83) | void rofi_add_warning_message(G_GNUC_UNUSED GString *msg) {}
  function rofi_view_error_dialog (line 85) | int rofi_view_error_dialog(const char *msg, G_GNUC_UNUSED int markup) {
  function monitor_active (line 90) | int monitor_active(G_GNUC_UNUSED workarea *mon) { return 0; }
  function display_startup_notification (line 92) | void display_startup_notification(
  function main (line 97) | int main(int argc, char **argv) {

FILE: test/helper-pidfile.c
  function rofi_icon_fetcher_query (line 50) | uint32_t rofi_icon_fetcher_query(G_GNUC_UNUSED const char *name,
  function rofi_icon_fetcher_query_advanced (line 54) | uint32_t rofi_icon_fetcher_query_advanced(G_GNUC_UNUSED const char *name,
  function cairo_surface_t (line 60) | cairo_surface_t *rofi_icon_fetcher_get(G_GNUC_UNUSED const uint32_t uid) {
  function rofi_clear_error_messages (line 64) | void rofi_clear_error_messages(void) {}
  function rofi_clear_warning_messages (line 65) | void rofi_clear_warning_messages(void) {}
  function gboolean (line 67) | gboolean rofi_theme_parse_string(G_GNUC_UNUSED const char *string) {
  function textbox_get_estimated_char_height (line 70) | double textbox_get_estimated_char_height(void) { return 12.0; }
  function rofi_view_get_current_monitor (line 71) | void rofi_view_get_current_monitor(int *width, int *height) {
  function textbox_get_estimated_ch (line 75) | double textbox_get_estimated_ch(void) { return 9.0; }
  function rofi_add_error_message (line 76) | void rofi_add_error_message(G_GNUC_UNUSED GString *msg) {}
  function rofi_add_warning_message (line 77) | void rofi_add_warning_message(G_GNUC_UNUSED GString *msg) {}
  function rofi_view_error_dialog (line 78) | int rofi_view_error_dialog(const char *msg, G_GNUC_UNUSED int markup) {
  function monitor_active (line 82) | int monitor_active(G_GNUC_UNUSED workarea *mon) { return 0; }
  function display_startup_notification (line 84) | void display_startup_notification(
  function main (line 89) | int main(G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv) {

FILE: test/helper-test.c
  function gboolean (line 72) | gboolean rofi_theme_parse_string(G_GNUC_UNUSED const char *string) {
  function rofi_icon_fetcher_query (line 76) | uint32_t rofi_icon_fetcher_query(G_GNUC_UNUSED const char *name,
  function rofi_clear_error_messages (line 80) | void rofi_clear_error_messages(void) {}
  function rofi_clear_warning_messages (line 81) | void rofi_clear_warning_messages(void) {}
  function rofi_icon_fetcher_query_advanced (line 82) | uint32_t rofi_icon_fetcher_query_advanced(G_GNUC_UNUSED const char *name,
  function cairo_surface_t (line 88) | cairo_surface_t *rofi_icon_fetcher_get(G_GNUC_UNUSED const uint32_t uid) {
  function textbox_get_estimated_char_height (line 92) | double textbox_get_estimated_char_height(void) { return 12.0; }
  function rofi_view_get_current_monitor (line 93) | void rofi_view_get_current_monitor(int *width, int *height) {
  function textbox_get_estimated_ch (line 97) | double textbox_get_estimated_ch(void) { return 9.0; }
  function rofi_add_error_message (line 98) | void rofi_add_error_message(G_GNUC_UNUSED GString *msg) {}
  function rofi_add_warning_message (line 99) | void rofi_add_warning_message(G_GNUC_UNUSED GString *msg) {}
  function rofi_view_error_dialog (line 101) | int rofi_view_error_dialog(const char *msg, G_GNUC_UNUSED int markup) {
  function monitor_active (line 106) | int monitor_active(G_GNUC_UNUSED workarea *mon) { return 0; }
  function display_startup_notification (line 108) | void display_startup_notification(
  function main (line 113) | int main(int argc, char **argv) {

FILE: test/helper-tokenize.c
  function rofi_icon_fetcher_query (line 46) | uint32_t rofi_icon_fetcher_query(G_GNUC_UNUSED const char *name,
  function rofi_icon_fetcher_query_advanced (line 50) | uint32_t rofi_icon_fetcher_query_advanced(G_GNUC_UNUSED const char *name,
  function rofi_clear_error_messages (line 55) | void rofi_clear_error_messages(void) {}
  function rofi_clear_warning_messages (line 56) | void rofi_clear_warning_messages(void) {}
  function cairo_surface_t (line 58) | cairo_surface_t *rofi_icon_fetcher_get(G_GNUC_UNUSED const uint32_t uid) {
  function gboolean (line 62) | gboolean rofi_theme_parse_string(G_GNUC_UNUSED const char *string) {
  function textbox_get_estimated_char_height (line 66) | double textbox_get_estimated_char_height(void) { return 12.0; }
  function rofi_view_get_current_monitor (line 67) | void rofi_view_get_current_monitor(int *width, int *height) {
  function textbox_get_estimated_ch (line 71) | double textbox_get_estimated_ch(void) { return 9.0; }
  function rofi_add_error_message (line 72) | void rofi_add_error_message(G_GNUC_UNUSED GString *msg) {}
  function rofi_add_warning_message (line 73) | void rofi_add_warning_message(G_GNUC_UNUSED GString *msg) {}
  function rofi_view_error_dialog (line 74) | int rofi_view_error_dialog(const char *msg, G_GNUC_UNUSED int markup) {
  function monitor_active (line 78) | int monitor_active(G_GNUC_UNUSED workarea *mon) { return 0; }
  function display_startup_notification (line 80) | void display_startup_notification(
  function START_TEST (line 84) | START_TEST(test_tokenizer_free) { helper_tokenize_free(NULL); }
  function END_TEST (line 85) | END_TEST
  function END_TEST (line 100) | END_TEST
  function END_TEST (line 116) | END_TEST
  function END_TEST (line 128) | END_TEST
  function END_TEST (line 140) | END_TEST
  function END_TEST (line 152) | END_TEST
  function END_TEST (line 168) | END_TEST
  function END_TEST (line 183) | END_TEST
  function END_TEST (line 195) | END_TEST
  function END_TEST (line 207) | END_TEST
  function END_TEST (line 219) | END_TEST
  function END_TEST (line 232) | END_TEST
  function END_TEST (line 248) | END_TEST
  function END_TEST (line 263) | END_TEST
  function END_TEST (line 283) | END_TEST
  function END_TEST (line 294) | END_TEST
  function END_TEST (line 307) | END_TEST
  function END_TEST (line 323) | END_TEST
  function END_TEST (line 338) | END_TEST
  function END_TEST (line 350) | END_TEST
  function END_TEST (line 362) | END_TEST
  function END_TEST (line 375) | END_TEST
  function END_TEST (line 388) | END_TEST
  function main (line 445) | int main(G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv) {

FILE: test/history-test.c
  function history_test (line 45) | static void history_test ( void )
  function main (line 120) | int main ( G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv )

FILE: test/mode-test.c
  function rofi_icon_fetcher_query (line 51) | uint32_t rofi_icon_fetcher_query(G_GNUC_UNUSED const char *name,
  function rofi_icon_fetcher_query_advanced (line 55) | uint32_t rofi_icon_fetcher_query_advanced(G_GNUC_UNUSED const char *name,
  function rofi_clear_error_messages (line 60) | void rofi_clear_error_messages(void) {}
  function rofi_clear_warning_messages (line 61) | void rofi_clear_warning_messages(void) {}
  function cairo_surface_t (line 62) | cairo_surface_t *rofi_icon_fetcher_get(G_GNUC_UNUSED const uint32_t uid) {
  function gboolean (line 66) | gboolean rofi_theme_parse_string(G_GNUC_UNUSED const char *string) {
  function textbox_get_estimated_char_height (line 70) | double textbox_get_estimated_char_height(void) { return 16.0; }
  function textbox_get_estimated_ch (line 71) | double textbox_get_estimated_ch(void) { return 9.0; }
  function rofi_add_error_message (line 72) | void rofi_add_error_message(G_GNUC_UNUSED GString *msg) {}
  function rofi_add_warning_message (line 73) | void rofi_add_warning_message(G_GNUC_UNUSED GString *msg) {}
  function monitor_active (line 74) | int monitor_active(G_GNUC_UNUSED workarea *d) { return 0; }
  function rofi_view_error_dialog (line 75) | int rofi_view_error_dialog(const char *msg, G_GNUC_UNUSED int markup) {
  function rofi_view_get_current_monitor (line 79) | void rofi_view_get_current_monitor(G_GNUC_UNUSED int *width,
  function RofiViewState (line 81) | RofiViewState *rofi_view_get_active(void) { return NULL; }
  function gboolean (line 82) | gboolean rofi_view_check_action(G_GNUC_UNUSED RofiViewState *state,
  function rofi_view_trigger_action (line 87) | void rofi_view_trigger_action(G_GNUC_UNUSED RofiViewState *state,
  function display_startup_notification (line 91) | void display_startup_notification(
  function test_mode_setup (line 110) | static void test_mode_setup(void) {
  function test_mode_teardown (line 113) | static void test_mode_teardown(void) { mode_destroy(&help_keys_mode); }
  function START_TEST (line 115) | START_TEST(test_mode_create) {
  function END_TEST (line 118) | END_TEST
  function END_TEST (line 124) | END_TEST
  function END_TEST (line 140) | END_TEST
  function END_TEST (line 165) | END_TEST
  function END_TEST (line 182) | END_TEST
  function main (line 203) | int main(G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv) {

FILE: test/scrollbar-test.c
  function rofi_icon_fetcher_query (line 66) | uint32_t rofi_icon_fetcher_query(G_GNUC_UNUSED const char *name,
  function rofi_icon_fetcher_query_advanced (line 70) | uint32_t rofi_icon_fetcher_query_advanced(G_GNUC_UNUSED const char *name,
  function cairo_surface_t (line 76) | cairo_surface_t *rofi_icon_fetcher_get(G_GNUC_UNUSED const uint32_t uid) {
  function monitor_active (line 80) | int monitor_active(G_GNUC_UNUSED workarea *mon) { return 0; }
  function gboolean (line 86) | gboolean config_parse_set_property(G_GNUC_UNUSED const Property *p,
  function rofi_add_error_message (line 90) | void rofi_add_error_message(G_GNUC_UNUSED GString *msg) {}
  function rofi_add_warning_message (line 91) | void rofi_add_warning_message(G_GNUC_UNUSED GString *msg) {}
  function textbox_get_estimated_char_height (line 94) | double textbox_get_estimated_char_height(void) { return 16; }
  function textbox_get_estimated_ch (line 95) | double textbox_get_estimated_ch(void) { return 8.0; }
  function listview_set_selected (line 97) | void listview_set_selected(G_GNUC_UNUSED listview *lv,
  function rofi_view_get_current_monitor (line 99) | void rofi_view_get_current_monitor(G_GNUC_UNUSED int *width,
  function main (line 102) | int main(G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv) {

FILE: test/textbox-test.c
  function rofi_timings_tick (line 65) | void rofi_timings_tick(G_GNUC_UNUSED const char *file,
  function rofi_icon_fetcher_query (line 68) | uint32_t rofi_icon_fetcher_query(G_GNUC_UNUSED const char *name,
  function rofi_icon_fetcher_query_advanced (line 72) | uint32_t rofi_icon_fetcher_query_advanced(G_GNUC_UNUSED const char *name,
  function cairo_surface_t (line 78) | cairo_surface_t *rofi_icon_fetcher_get(G_GNUC_UNUSED const uint32_t uid) {
  function gboolean (line 82) | gboolean config_parse_set_property(G_GNUC_UNUSED const Property *p,
  function rofi_add_error_message (line 87) | void rofi_add_error_message(G_GNUC_UNUSED GString *msg) {}
  function rofi_add_warning_message (line 88) | void rofi_add_warning_message(G_GNUC_UNUSED GString *msg) {}
  function rofi_view_queue_redraw (line 89) | void rofi_view_queue_redraw(void) {}
  function rofi_view_get_current_monitor (line 90) | void rofi_view_get_current_monitor(G_GNUC_UNUSED int *width,
  function rofi_view_error_dialog (line 92) | int rofi_view_error_dialog(const char *msg, G_GNUC_UNUSED int markup) {
  function monitor_active (line 97) | int monitor_active(G_GNUC_UNUSED workarea *mon) { return 0; }
  function display_startup_notification (line 99) | void display_startup_notification(
  function main (line 104) | int main(G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv) {

FILE: test/theme-parser-test.c
  function rofi_icon_fetcher_query (line 49) | uint32_t rofi_icon_fetcher_query(G_GNUC_UNUSED const char *name,
  function rofi_clear_error_messages (line 53) | void rofi_clear_error_messages(void) {}
  function rofi_clear_warning_messages (line 54) | void rofi_clear_warning_messages(void) {}
  function rofi_icon_fetcher_query_advanced (line 55) | uint32_t
  function cairo_surface_t (line 62) | cairo_surface_t *rofi_icon_fetcher_get(G_GNUC_UNUSED const uint32_t uid) {
  function rofi_view_error_dialog (line 66) | int rofi_view_error_dialog(const char *msg, G_GNUC_UNUSED int markup) {
  function rofi_view_get_current_monitor (line 71) | void rofi_view_get_current_monitor(int *width, int *height) {
  function textbox_get_estimated_char_height (line 79) | double textbox_get_estimated_char_height(void) { return 16.0; }
  function textbox_get_estimated_ch (line 81) | double textbox_get_estimated_ch(void) { return 8.0; }
  function monitor_active (line 83) | int monitor_active(G_GNUC_UNUSED workarea *mon) { return 0; }
  function display_startup_notification (line 85) | void display_startup_notification(
  function rofi_add_error_message (line 109) | void rofi_add_error_message(GString *msg) {
  function rofi_add_warning_message (line 114) | void rofi_add_warning_message(GString *msg) {
  function theme_parser_setup (line 120) | static void theme_parser_setup(void) { error = 0; }
  function theme_parser_teardown (line 121) | static void theme_parser_teardown(void) {
  function START_TEST (line 128) | START_TEST(test_core_empty_string) {
  function END_TEST (line 136) | END_TEST
  function END_TEST (line 145) | END_TEST
  function END_TEST (line 157) | END_TEST
  function END_TEST (line 178) | END_TEST
  function END_TEST (line 195) | END_TEST
  function END_TEST (line 204) | END_TEST
  function END_TEST (line 219) | END_TEST
  function END_TEST (line 233) | END_TEST
  function END_TEST (line 249) | END_TEST
  function END_TEST (line 269) | END_TEST
  function END_TEST (line 284) | END_TEST
  function END_TEST (line 304) | END_TEST
  function END_TEST (line 319) | END_TEST
  function END_TEST (line 338) | END_TEST
  function END_TEST (line 353) | END_TEST
  function END_TEST (line 372) | END_TEST
  function END_TEST (line 388) | END_TEST
  function END_TEST (line 408) | END_TEST
  function END_TEST (line 469) | END_TEST
  function END_TEST (line 489) | END_TEST
  function END_TEST (line 508) | END_TEST
  function END_TEST (line 521) | END_TEST
  function END_TEST (line 545) | END_TEST
  function END_TEST (line 569) | END_TEST
  function END_TEST (line 596) | END_TEST
  function END_TEST (line 623) | END_TEST
  function END_TEST (line 647) | END_TEST
  function END_TEST (line 675) | END_TEST
  function END_TEST (line 703) | END_TEST
  function END_TEST (line 727) | END_TEST
  function END_TEST (line 755) | END_TEST
  function END_TEST (line 782) | END_TEST
  function END_TEST (line 809) | END_TEST
  function END_TEST (line 837) | END_TEST
  function END_TEST (line 859) | END_TEST
  function END_TEST (line 888) | END_TEST
  function END_TEST (line 910) | END_TEST
  function END_TEST (line 938) | END_TEST
  function END_TEST (line 973) | END_TEST
  function END_TEST (line 995) | END_TEST
  function END_TEST (line 1017) | END_TEST
  function END_TEST (line 1049) | END_TEST
  function END_TEST (line 1073) | END_TEST
  function END_TEST (line 1092) | END_TEST
  function END_TEST (line 1111) | END_TEST
  function END_TEST (line 1130) | END_TEST
  function END_TEST (line 1146) | END_TEST
  function END_TEST (line 1157) | END_TEST
  function END_TEST (line 1166) | END_TEST
  function END_TEST (line 1174) | END_TEST
  function END_TEST (line 1195) | END_TEST
  function END_TEST (line 1208) | END_TEST
  function END_TEST (line 1221) | END_TEST
  function END_TEST (line 1234) | END_TEST
  function END_TEST (line 1256) | END_TEST
  function END_TEST (line 1262) | END_TEST
  function END_TEST (line 1272) | END_TEST
  function END_TEST (line 1286) | END_TEST
  function END_TEST (line 1295) | END_TEST
  function END_TEST (line 1325) | END_TEST
  function END_TEST (line 1338) | END_TEST
  function END_TEST (line 1362) | END_TEST
  function END_TEST (line 1378) | END_TEST
  function END_TEST (line 1393) | END_TEST
  function END_TEST (line 1408) | END_TEST
  function END_TEST (line 1423) | END_TEST
  function END_TEST (line 1438) | END_TEST
  function END_TEST (line 1453) | END_TEST
  function END_TEST (line 1468) | END_TEST
  function END_TEST (line 1484) | END_TEST
  function END_TEST (line 1500) | END_TEST
  function END_TEST (line 1516) | END_TEST
  function END_TEST (line 1532) | END_TEST
  function END_TEST (line 1547) | END_TEST
  function END_TEST (line 1562) | END_TEST
  function END_TEST (line 1577) | END_TEST
  function END_TEST (line 1592) | END_TEST
  function END_TEST (line 1607) | END_TEST
  function END_TEST (line 1622) | END_TEST
  function END_TEST (line 1637) | END_TEST
  function END_TEST (line 1644) | END_TEST
  function END_TEST (line 1659) | END_TEST
  function END_TEST (line 1676) | END_TEST
  function END_TEST (line 1694) | END_TEST
  function END_TEST (line 1713) | END_TEST
  function END_TEST (line 1730) | END_TEST
  function END_TEST (line 1744) | END_TEST
  function END_TEST (line 1759) | END_TEST
  function main (line 1977) | int main(int argc, char **argv) {

FILE: test/widget-test.c
  function rofi_icon_fetcher_query (line 52) | uint32_t rofi_icon_fetcher_query(G_GNUC_UNUSED const char *name,
  function rofi_icon_fetcher_query_advanced (line 56) | uint32_t rofi_icon_fetcher_query_advanced(G_GNUC_UNUSED const char *name,
  function rofi_timings_tick (line 64) | void rofi_timings_tick(G_GNUC_UNUSED const char *file,
  function cairo_surface_t (line 68) | cairo_surface_t *rofi_icon_fetcher_get(G_GNUC_UNUSED const uint32_t uid) {
  function gboolean (line 72) | gboolean config_parse_set_property(G_GNUC_UNUSED const Property *p,
  function rofi_add_error_message (line 76) | void rofi_add_error_message(G_GNUC_UNUSED GString *msg) {}
  function rofi_add_warning_message (line 77) | void rofi_add_warning_message(G_GNUC_UNUSED GString *msg) {}
  function rofi_view_queue_redraw (line 78) | void rofi_view_queue_redraw(void) {}
  function monitor_active (line 79) | int monitor_active(G_GNUC_UNUSED workarea *mon) { return 0; }
  function rofi_view_get_current_monitor (line 80) | void rofi_view_get_current_monitor(G_GNUC_UNUSED int *width,
  function rofi_view_error_dialog (line 82) | int rofi_view_error_dialog(const char *msg, G_GNUC_UNUSED int markup) {
  function display_startup_notification (line 87) | void display_startup_notification(
  function main (line 92) | int main(G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv) {
Condensed preview — 299 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (3,169K chars).
[
  {
    "path": ".build.yml",
    "chars": 995,
    "preview": "image: ubuntu/lts\npackages:\n  - meson\n  - ninja-build\n  - autoconf\n  - automake\n  - build-essential\n  - libpango1.0-dev\n"
  },
  {
    "path": ".clang-tidy",
    "chars": 54,
    "preview": "Checks: -clang-analyzer-optin.core.EnumCastOutOfRange\n"
  },
  {
    "path": ".gitattributes",
    "chars": 508,
    "preview": ".build.yml export-ignore\n.gitattributes export-ignore\n.gitignore export-ignore\n.mailmap export-ignore\n.github export-ign"
  },
  {
    "path": ".github/CONTRIBUTING.md",
    "chars": 3024,
    "preview": "When reporting bugs keep in mind that the people working on it do this unpaid,\nin their free time and as a hobby. So be "
  },
  {
    "path": ".github/ISSUE_TEMPLATE/bug_report.yml",
    "chars": 3810,
    "preview": "name: Bug Report\ndescription: Report a problem in Rofi\nlabels: [bug]\ntitle: \"[BUG] \"\nbody:\n  - type: markdown\n    attrib"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/config.yml",
    "chars": 312,
    "preview": "blank_issues_enabled: false\ncontact_links:\n  - name: discussion forum\n    url: https://github.com/davatorium/rofi/discus"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/documentation_report.yml",
    "chars": 3122,
    "preview": "name: Documentation Bug Report\ndescription: Report a problem in Rofi Documentation\nlabels: [Documentation]\ntitle: \"[Doc]"
  },
  {
    "path": ".github/ISSUE_TEMPLATE/feature_request.yml",
    "chars": 2265,
    "preview": "name: Feature Request\ndescription: It'd be cool if rofi did/had/would...\nlabels: Feature Request\ntitle: \"[REQUEST] \"\nbod"
  },
  {
    "path": ".github/actions/doxycheck/action.yml",
    "chars": 527,
    "preview": "name: Doxygen Check\ndescription: Checks for Doxygen warnings\n\nruns:\n  using: composite\n  steps:\n    - id: doxy\n      run"
  },
  {
    "path": ".github/actions/meson/action.yml",
    "chars": 652,
    "preview": "name: Meson Build\ndescription: Builds Rofi using Meson\n\ninputs:\n  cc:\n    description: Compiler to use\n    required: tru"
  },
  {
    "path": ".github/actions/release/action.yml",
    "chars": 646,
    "preview": "name: Upload dist\ndescription: Create distribution file and upload to release\n\nruns:\n  using: composite\n  steps:\n    - i"
  },
  {
    "path": ".github/actions/setup/action.yml",
    "chars": 1952,
    "preview": "name: CI Build Setup\ndescription: Sets up build dependencies\n\ninputs:\n  xcb:\n    description: Install xcb dependencies\n "
  },
  {
    "path": ".github/pull_request_template.md",
    "chars": 478,
    "preview": "> Please follow these steps before submitting your PR:\n>\n> - [ ] This PR targets the `next` branch and not `master`\n> - "
  },
  {
    "path": ".github/workflows/build.yml",
    "chars": 1376,
    "preview": "name: CI Build\n\non:\n  push:\n    branches:\n      - next\n    paths-ignore:\n      - \"**.md\"\n      - \"**.markdown\"\n      - \""
  },
  {
    "path": ".github/workflows/codeql.yml",
    "chars": 1891,
    "preview": "name: \"CodeQL\"\n\non:\n  push:\n    branches: [ 'next', 'master' ]\n  pull_request:\n    # The branches below must be a subset"
  },
  {
    "path": ".github/workflows/lock.yml",
    "chars": 1137,
    "preview": "name: 'Lock Threads'\n\non:\n  schedule:\n    - cron: '0 0 * * *'\n  workflow_dispatch:\n\npermissions:\n  issues: write\n  pull-"
  },
  {
    "path": ".github/workflows/main.yml",
    "chars": 642,
    "preview": "on:\n  issues:\n    types: [opened, edited]\n\njobs:\n  auto_close_issues:\n    runs-on: ubuntu-latest\n    steps:\n      - name"
  },
  {
    "path": ".github/workflows/mkdocs.yml",
    "chars": 420,
    "preview": "name: Publish docs via GitHub Pages\non:\n  push:\n    branches:\n      - sphinx\n      - next\n\njobs:\n  build:\n    name: Depl"
  },
  {
    "path": ".github/workflows/publish-release.yml",
    "chars": 349,
    "preview": "name: Publish release\n\non:\n  push:\n    tags:\n      - '*'\n\njobs:\n  publish-tarball:\n    runs-on: ubuntu-latest\n    steps:"
  },
  {
    "path": ".gitignore",
    "chars": 242,
    "preview": "/build*/\n/.cache/\n/.vscode/\n\n# I want to ignore log files\n*.log\n\n# Core files should never be checked in\ncore\n\n# ignore "
  },
  {
    "path": ".gitlab-ci.yml",
    "chars": 1494,
    "preview": "before_script:\n    - apt-get update\n    - apt-get install --force-yes -y software-properties-common apt-transport-https\n"
  },
  {
    "path": ".gitmodules",
    "chars": 203,
    "preview": "[submodule \"libgwater\"]\n\tpath = subprojects/libgwater\n\turl = https://github.com/sardemff7/libgwater\n[submodule \"libnkuti"
  },
  {
    "path": ".mailmap",
    "chars": 45,
    "preview": "Morgane Glidic <sardemff7+git@sardemff7.net>\n"
  },
  {
    "path": "AUTHORS",
    "chars": 821,
    "preview": "Aaron Ash\nAdrià Farrés\nAnton Löfgren\nAvatar\nbendem\nBenjamin Cremer\nBenjamin R. Haskell\nBruno Braga\nBuglloc\nChris Salzber"
  },
  {
    "path": "CODE_OF_CONDUCT.md",
    "chars": 3216,
    "preview": "# Contributor Covenant Code of Conduct\n\n## Our Pledge\n\nIn the interest of fostering an open and welcoming environment, w"
  },
  {
    "path": "CONFIG.md",
    "chars": 4315,
    "preview": "> This page does not describe all of **ROFI**'s configuration options, just the\n> most common usecase. For the full conf"
  },
  {
    "path": "COPYING",
    "chars": 1149,
    "preview": "MIT/X11 License\nModified  2013-2024 Qball Cow <qball@gmpclient.org>\nCopyright (c) 2012 Sean Pringle <sean.pringle@gmail."
  },
  {
    "path": "Changelog",
    "chars": 26768,
    "preview": "For newer release ChangeLogs please see the releasenotes.\n\nv1.7.3: Sturtled!\n   - [Help] Print out the parsed config/the"
  },
  {
    "path": "Examples/i3_empty_workspace.sh",
    "chars": 299,
    "preview": "#!/usr/bin/env bash\n\nMAX_DESKTOPS=20\n\nWORKSPACES=$(seq -s '\\n' 1 1 \"${MAX_DESKTOPS}\")\n\nEMPTY_WORKSPACE=$( (i3-msg -t get"
  },
  {
    "path": "Examples/i3_switch_workspaces.sh",
    "chars": 396,
    "preview": "#!/usr/bin/env bash\n\nif [ -z $@ ]\nthen\ngen_workspaces()\n{\n    i3-msg -t get_workspaces | tr ',' '\\n' | grep \"name\" | sed"
  },
  {
    "path": "Examples/rofi-file-browser.sh",
    "chars": 2834,
    "preview": "#!/usr/bin/env bash\n\n# Various options for the file browser script:\nROFI_FB_GENERIC_FO=\"xdg-open\" # command used for ope"
  },
  {
    "path": "Examples/test_script_env.sh",
    "chars": 420,
    "preview": "#!/usr/bin/env bash\n\nif [ -z \"${ROFI_OUTSIDE}\" ]\nthen\n    echo \"run this script in rofi\".\n    exit\nfi\n\necho -en \"\\x00no-"
  },
  {
    "path": "Examples/test_script_mode.sh",
    "chars": 640,
    "preview": "#!/usr/bin/env bash\n\nif [ \"$*\" = \"quit\" ]; then\n\texit 0\nfi\n\nif [ \"$@\" ]; then\n\t# Override the previously set prompt.\n\tec"
  },
  {
    "path": "Examples/test_script_mode_color.sh",
    "chars": 738,
    "preview": "#!/usr/bin/env bash\n\nif [ \"$*\" = \"quit\" ]\nthen\n    exit 0\nfi\n\nif [ \"$@\" ]\nthen\n    # Override the previously set prompt."
  },
  {
    "path": "Examples/test_script_mode_delim.sh",
    "chars": 409,
    "preview": "#!/usr/bin/env bash\n\nif [[ \"$@\" = \"quit\" ]]\nthen\n    exit 0\nfi\n\n# Override the previously set prompt.\n# We only want to "
  },
  {
    "path": "INSTALL.md",
    "chars": 5501,
    "preview": "# Installation guide\n\nThis guide explains how to install rofi using its build system and how you can\nmake debug builds.\n"
  },
  {
    "path": "README.md",
    "chars": 10995,
    "preview": "<p align=\"center\">\n<a href=\"https://github.com/davatorium/rofi/issues\"><img src=\"https://img.shields.io/github/issues/da"
  },
  {
    "path": "config/config.c",
    "chars": 6365,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "data/rofi-theme-selector.desktop",
    "chars": 135,
    "preview": "[Desktop Entry]\nEncoding=UTF-8\nVersion=1.0\nType=Application\nTerminal=false\nExec=rofi-theme-selector\nName=Rofi Theme Sele"
  },
  {
    "path": "data/rofi.desktop",
    "chars": 111,
    "preview": "[Desktop Entry]\nEncoding=UTF-8\nVersion=1.0\nType=Application\nTerminal=false\nExec=rofi -show\nName=Rofi\nIcon=rofi\n"
  },
  {
    "path": "doc/README.md",
    "chars": 145,
    "preview": "Manpages are build using [pandoc](https://pandoc.org/)\n\nManpages can be updated using the following make command:\n\n```\nm"
  },
  {
    "path": "doc/default_configuration.rasi",
    "chars": 369,
    "preview": "configuration {\n\n    // Timeout from user input.\n    timeout {\n        // The delay after inactivity to execute action.\n"
  },
  {
    "path": "doc/default_theme.rasi",
    "chars": 5042,
    "preview": "/**\n * rofi -dump-theme output.\n **/\n* {\n    red:                         rgba ( 220, 50, 47, 100 % );\n    selected-acti"
  },
  {
    "path": "doc/man_filter.lua",
    "chars": 5845,
    "preview": "local Def = {}\n\nfunction Def:new(d)\n    -- init with empty def\n    if d == nil then\n        d = {\n            start_idx "
  },
  {
    "path": "doc/meson.build",
    "chars": 2059,
    "preview": "man_files = [\n    'rofi.1',\n    'rofi-sensible-terminal.1',\n    'rofi-theme-selector.1',\n    'rofi-actions.5',\n    'rofi"
  },
  {
    "path": "doc/rofi-actions.5.markdown",
    "chars": 2621,
    "preview": "# rofi-actions(5)\n\n## NAME\n\n**rofi-actions** - Custom commands following interaction with rofi menus\n\n## DESCRIPTION\n\n**"
  },
  {
    "path": "doc/rofi-debugging.5.markdown",
    "chars": 9208,
    "preview": "# rofi-debugging(5)\n\n## NAME\n\nDebugging rofi.\n\nWhen reporting an issue with rofi crashing, or misbehaving. It helps to d"
  },
  {
    "path": "doc/rofi-dmenu.5.markdown",
    "chars": 6087,
    "preview": "# rofi-dmenu(5)\n\n## NAME\n\n**rofi dmenu mode** - Rofi dmenu emulation\n\n## DESCRIPTION\n\nTo integrate **rofi** into scripts"
  },
  {
    "path": "doc/rofi-keys.5.markdown",
    "chars": 7330,
    "preview": "# rofi-keys(5)\n\n## NAME\n\n**rofi keys** - Rofi Key and Mouse bindings\n\n## DESCRIPTION\n\n**rofi** supports overriding of an"
  },
  {
    "path": "doc/rofi-script.5.markdown",
    "chars": 6020,
    "preview": "# rofi-script(5)\n\n## NAME\n\n**rofi script mode** - Rofi format for scriptable mode.\n\n## DESCRIPTION\n\n**rofi** supports mo"
  },
  {
    "path": "doc/rofi-sensible-terminal.1.markdown",
    "chars": 956,
    "preview": "# rofi-sensible-terminal(1)\n\n## NAME\n\n**rofi-sensible-terminal** -  launches $TERMINAL with fallbacks\n\n## SYNOPSIS\n\nrofi"
  },
  {
    "path": "doc/rofi-theme-selector.1.markdown",
    "chars": 1014,
    "preview": "# rofi-theme-selector(1)\n\n## NAME\n\n**rofi-theme-selector** - Preview and apply themes for **rofi**\n\n## DESCRIPTION\n\n**ro"
  },
  {
    "path": "doc/rofi-theme.5.markdown",
    "chars": 48400,
    "preview": "# rofi-theme(5)\n\n## NAME\n\n**rofi-theme** - Rofi theme format files\n\n## Getting started with theming\n\nThe easiest way to "
  },
  {
    "path": "doc/rofi-thumbnails.5.markdown",
    "chars": 3794,
    "preview": "# rofi-thumbnails(5)\n\n## NAME\n\n**rofi-thumbnails** - Rofi thumbnails system\n\n## DESCRIPTION\n\n**rofi** is now able to sho"
  },
  {
    "path": "doc/rofi.1.markdown",
    "chars": 31559,
    "preview": "# rofi(1)\n\n## NAME\n\n**rofi** - A window switcher, application launcher, ssh dialog, dmenu\nreplacement and more\n\n## SYNOP"
  },
  {
    "path": "doc/rofi.doxy.in",
    "chars": 127061,
    "preview": "# Doxyfile 1.12.0\n\n# This file describes the settings to be used by the documentation system\n# Doxygen (www.doxygen.org)"
  },
  {
    "path": "include/css-colors.h",
    "chars": 664,
    "preview": "#ifndef ROFI_INCLUDE_CSS_COLORS_H\n#define ROFI_INCLUDE_CSS_COLORS_H\n\n#include <stdint.h>\n/**\n * @defgroup CSSCOLORS CssC"
  },
  {
    "path": "include/display-internal.h",
    "chars": 2113,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2020 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/display.h",
    "chars": 3827,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/helper-theme.h",
    "chars": 2723,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/helper.h",
    "chars": 14781,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/history.h",
    "chars": 2375,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/input-codes.h",
    "chars": 1459,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2025 Leandro Vital <leavitals@gmail.com>\n *\n * Permission is hereby gran"
  },
  {
    "path": "include/keyb.h",
    "chars": 4585,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/mode-private.h",
    "chars": 7054,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/mode.h",
    "chars": 8134,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/modes/combi.h",
    "chars": 1649,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/modes/dmenu.h",
    "chars": 1543,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/modes/dmenuscriptshared.h",
    "chars": 1173,
    "preview": "#ifndef ROFI_MODES_DMENU_SCRIPT_SHARED_H\n#define ROFI_MODES_DMENU_SCRIPT_SHARED_H\n\n#include <glib.h>\n#include <mode.h>\n#"
  },
  {
    "path": "include/modes/drun.h",
    "chars": 1466,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/modes/filebrowser.h",
    "chars": 1974,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/modes/help-keys.h",
    "chars": 1511,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/modes/modes.h",
    "chars": 1632,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/modes/recursivebrowser.h",
    "chars": 2004,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/modes/run.h",
    "chars": 1576,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/modes/script.h",
    "chars": 2176,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/modes/ssh.h",
    "chars": 1781,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/modes/wayland-window.h",
    "chars": 1472,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2022 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/modes/window.h",
    "chars": 1580,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/rofi-icon-fetcher.h",
    "chars": 2415,
    "preview": "#ifndef ROFI_ICON_FETCHER_H\n#define ROFI_ICON_FETCHER_H\n\n#include <cairo.h>\n#include <glib.h>\n#include <stdint.h>\n\n/**\n "
  },
  {
    "path": "include/rofi-types.h",
    "chars": 7139,
    "preview": "#ifndef INCLUDE_ROFI_TYPES_H\n#define INCLUDE_ROFI_TYPES_H\n#include <glib.h>\n#include <stdint.h>\nG_BEGIN_DECLS\n\n/**\n * Ty"
  },
  {
    "path": "include/rofi.h",
    "chars": 4233,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/settings.h",
    "chars": 6559,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/theme.h",
    "chars": 11277,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/timings.h",
    "chars": 2542,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/view-internal.h",
    "chars": 7394,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/view.h",
    "chars": 10974,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/wayland-internal.h",
    "chars": 3329,
    "preview": "#ifndef ROFI_WAYLAND_INTERNAL_H\n#define ROFI_WAYLAND_INTERNAL_H\n\n#include <cairo.h>\n#include <glib.h>\n#include <libgwate"
  },
  {
    "path": "include/wayland.h",
    "chars": 2021,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2020 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/widgets/box.h",
    "chars": 2290,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/widgets/container.h",
    "chars": 1882,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/widgets/icon.h",
    "chars": 1916,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2018 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/widgets/listview.h",
    "chars": 7602,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/widgets/scrollbar.h",
    "chars": 2613,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/widgets/textbox.h",
    "chars": 9318,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/widgets/widget-internal.h",
    "chars": 6861,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/widgets/widget.h",
    "chars": 10562,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2017 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/xcb-dummy.h",
    "chars": 345,
    "preview": "#ifndef ROFI_XCB_DUMMY_H\n#define ROFI_XCB_DUMMY_H\n\n// Dummy types for xcb values shared in view interface (not used in w"
  },
  {
    "path": "include/xcb-internal.h",
    "chars": 2210,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/xcb.h",
    "chars": 5687,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "include/xrmoptions.h",
    "chars": 4469,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright © 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby gra"
  },
  {
    "path": "lexer/theme-lexer.l",
    "chars": 32621,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby grant"
  },
  {
    "path": "lexer/theme-parser.y",
    "chars": 37268,
    "preview": "/*\n * rofi\n *\n * MIT/X11 License\n * Copyright 2013-2023 Qball Cow <qball@gmpclient.org>\n *\n * Permission is hereby grant"
  },
  {
    "path": "meson-dist-script",
    "chars": 353,
    "preview": "#!/bin/sh\n\nset -eu\n\ncd \"${MESON_DIST_ROOT}\"\n\n# deploy docs\nmkdir build\nmeson setup build -Dprefix=/usr\nninja -C build\ncp"
  },
  {
    "path": "meson.build",
    "chars": 18996,
    "preview": "project('rofi', 'c',\n    version: '2.0.0-dev',\n    meson_version: '>=0.59.0',\n    license: [ 'MIT' ],\n    default_option"
  },
  {
    "path": "meson_options.txt",
    "chars": 507,
    "preview": "option('drun', type: 'boolean', value: true, description: 'Desktop file mode')\noption('window', type: 'boolean', value: "
  },
  {
    "path": "mkdocs/docs/1.7.0/rofi-script.5.markdown",
    "chars": 4037,
    "preview": "# ROFI-SCRIPT 5 rofi-script\n\n## NAME\n\n**rofi script mode** - Rofi format for scriptable modi.\n\n\n## DESCRIPTION\n\n**rofi**"
  },
  {
    "path": "mkdocs/docs/1.7.0/rofi-theme.5.markdown",
    "chars": 33252,
    "preview": "# ROFI-THEME 5 rofi-theme\n\n## NAME\n\n**rofi-theme** - Rofi theme format files\n\n## DESCRIPTION\n\nThe need for a new theme f"
  },
  {
    "path": "mkdocs/docs/1.7.0/rofi.1.markdown",
    "chars": 31589,
    "preview": "# ROFI 1 rofi\n\n## NAME\n\n**rofi** - A window switcher, application launcher, ssh dialog, dmenu replacement and more\n\n## S"
  },
  {
    "path": "mkdocs/docs/1.7.1/rofi-script.5.markdown",
    "chars": 4037,
    "preview": "# ROFI-SCRIPT 5 rofi-script\n\n## NAME\n\n**rofi script mode** - Rofi format for scriptable modi.\n\n\n## DESCRIPTION\n\n**rofi**"
  },
  {
    "path": "mkdocs/docs/1.7.1/rofi-theme.5.markdown",
    "chars": 35087,
    "preview": "# ROFI-THEME 5 rofi-theme\n\n## NAME\n\n**rofi-theme** - Rofi theme format files\n\n## DEFAULT THEME LOADING\n\nBy default, rofi"
  },
  {
    "path": "mkdocs/docs/1.7.1/rofi.1.markdown",
    "chars": 31994,
    "preview": "# ROFI 1 rofi\n\n## NAME\n\n**rofi** - A window switcher, application launcher, ssh dialog, dmenu replacement and more\n\n## S"
  },
  {
    "path": "mkdocs/docs/1.7.2/rofi-script.5.markdown",
    "chars": 4037,
    "preview": "# ROFI-SCRIPT 5 rofi-script\n\n## NAME\n\n**rofi script mode** - Rofi format for scriptable modi.\n\n\n## DESCRIPTION\n\n**rofi**"
  },
  {
    "path": "mkdocs/docs/1.7.2/rofi-theme.5.markdown",
    "chars": 35087,
    "preview": "# ROFI-THEME 5 rofi-theme\n\n## NAME\n\n**rofi-theme** - Rofi theme format files\n\n## DEFAULT THEME LOADING\n\nBy default, rofi"
  },
  {
    "path": "mkdocs/docs/1.7.2/rofi.1.markdown",
    "chars": 31994,
    "preview": "# ROFI 1 rofi\n\n## NAME\n\n**rofi** - A window switcher, application launcher, ssh dialog, dmenu replacement and more\n\n## S"
  },
  {
    "path": "mkdocs/docs/1.7.3/rofi-debugging.5.markdown",
    "chars": 9282,
    "preview": "# ROFI DEBUGGING 5 rofi debugging\n\n## NAME\n\nDebugging rofi.\n\nWhen reporting an issue with rofi crashing, or misbehaving."
  },
  {
    "path": "mkdocs/docs/1.7.3/rofi-dmenu.5.markdown",
    "chars": 5589,
    "preview": "# ROFI-DMENU 5 rofi-dmenu\n\n## NAME\n\n**rofi dmenu mode** - Rofi dmenu emulation\n\n\n## DESCRIPTION\n\nTo integrate **rofi** i"
  },
  {
    "path": "mkdocs/docs/1.7.3/rofi-keys.5.markdown",
    "chars": 6830,
    "preview": "# ROFI-KEYS 5 rofi-keys\n\n## NAME\n\n**rofi keys** - Rofi Key and Mouse bindings \n\n\n## DESCRIPTION\n\n**rofi** supports overr"
  },
  {
    "path": "mkdocs/docs/1.7.3/rofi-script.5.markdown",
    "chars": 4037,
    "preview": "# ROFI-SCRIPT 5 rofi-script\n\n## NAME\n\n**rofi script mode** - Rofi format for scriptable modi.\n\n\n## DESCRIPTION\n\n**rofi**"
  },
  {
    "path": "mkdocs/docs/1.7.3/rofi-theme.5.markdown",
    "chars": 35828,
    "preview": "# ROFI-THEME 5 rofi-theme\n\n## NAME\n\n**rofi-theme** - Rofi theme format files\n\n## DEFAULT THEME LOADING\n\nBy default, rofi"
  },
  {
    "path": "mkdocs/docs/1.7.3/rofi.1.markdown",
    "chars": 29109,
    "preview": "# ROFI 1 rofi\n\n## NAME\n\n**rofi** - A window switcher, application launcher, ssh dialog, dmenu replacement and more\n\n## S"
  },
  {
    "path": "mkdocs/docs/1.7.4/rofi-debugging.5.markdown",
    "chars": 9282,
    "preview": "# ROFI DEBUGGING 5 rofi debugging\n\n## NAME\n\nDebugging rofi.\n\nWhen reporting an issue with rofi crashing, or misbehaving."
  },
  {
    "path": "mkdocs/docs/1.7.4/rofi-dmenu.5.markdown",
    "chars": 5857,
    "preview": "# ROFI-DMENU 5 rofi-dmenu\n\n## NAME\n\n**rofi dmenu mode** - Rofi dmenu emulation\n\n\n## DESCRIPTION\n\nTo integrate **rofi** i"
  },
  {
    "path": "mkdocs/docs/1.7.4/rofi-keys.5.markdown",
    "chars": 6947,
    "preview": "# ROFI-KEYS 5 rofi-keys\n\n## NAME\n\n**rofi keys** - Rofi Key and Mouse bindings \n\n\n## DESCRIPTION\n\n**rofi** supports overr"
  },
  {
    "path": "mkdocs/docs/1.7.4/rofi-script.5.markdown",
    "chars": 4555,
    "preview": "# ROFI-SCRIPT 5 rofi-script\n\n## NAME\n\n**rofi script mode** - Rofi format for scriptable mode.\n\n\n## DESCRIPTION\n\n**rofi**"
  },
  {
    "path": "mkdocs/docs/1.7.4/rofi-theme.5.markdown",
    "chars": 42011,
    "preview": "# ROFI-THEME 5 rofi-theme\n\n## NAME\n\n**rofi-theme** - Rofi theme format files\n\n## GETTING STARTED WITH THEMING \n\nThe easi"
  },
  {
    "path": "mkdocs/docs/1.7.4/rofi.1.markdown",
    "chars": 26996,
    "preview": "# ROFI 1 rofi\n\n## NAME\n\n**rofi** - A window switcher, application launcher, ssh dialog, dmenu replacement and more\n\n## S"
  },
  {
    "path": "mkdocs/docs/1.7.5/rofi-debugging.5.markdown",
    "chars": 9282,
    "preview": "# ROFI DEBUGGING 5 rofi debugging\n\n## NAME\n\nDebugging rofi.\n\nWhen reporting an issue with rofi crashing, or misbehaving."
  },
  {
    "path": "mkdocs/docs/1.7.5/rofi-dmenu.5.markdown",
    "chars": 5859,
    "preview": "# ROFI-DMENU 5 rofi-dmenu\n\n## NAME\n\n**rofi dmenu mode** - Rofi dmenu emulation\n\n\n## DESCRIPTION\n\nTo integrate **rofi** i"
  },
  {
    "path": "mkdocs/docs/1.7.5/rofi-keys.5.markdown",
    "chars": 6947,
    "preview": "# ROFI-KEYS 5 rofi-keys\n\n## NAME\n\n**rofi keys** - Rofi Key and Mouse bindings \n\n\n## DESCRIPTION\n\n**rofi** supports overr"
  },
  {
    "path": "mkdocs/docs/1.7.5/rofi-script.5.markdown",
    "chars": 4555,
    "preview": "# ROFI-SCRIPT 5 rofi-script\n\n## NAME\n\n**rofi script mode** - Rofi format for scriptable mode.\n\n\n## DESCRIPTION\n\n**rofi**"
  },
  {
    "path": "mkdocs/docs/1.7.5/rofi-theme.5.markdown",
    "chars": 42011,
    "preview": "# ROFI-THEME 5 rofi-theme\n\n## NAME\n\n**rofi-theme** - Rofi theme format files\n\n## GETTING STARTED WITH THEMING \n\nThe easi"
  },
  {
    "path": "mkdocs/docs/1.7.5/rofi.1.markdown",
    "chars": 26996,
    "preview": "# ROFI 1 rofi\n\n## NAME\n\n**rofi** - A window switcher, application launcher, ssh dialog, dmenu replacement and more\n\n## S"
  },
  {
    "path": "mkdocs/docs/1.7.6/rofi-debugging.5.markdown",
    "chars": 9208,
    "preview": "# rofi-debugging(5)\n\n## NAME\n\nDebugging rofi.\n\nWhen reporting an issue with rofi crashing, or misbehaving. It helps to d"
  },
  {
    "path": "mkdocs/docs/1.7.6/rofi-dmenu.5.markdown",
    "chars": 6110,
    "preview": "# rofi-dmenu(5)\n\n## NAME\n\n**rofi dmenu mode** - Rofi dmenu emulation\n\n## DESCRIPTION\n\nTo integrate **rofi** into scripts"
  },
  {
    "path": "mkdocs/docs/1.7.6/rofi-keys.5.markdown",
    "chars": 7096,
    "preview": "# rofi-keys(5)\n\n## NAME\n\n**rofi keys** - Rofi Key and Mouse bindings\n\n## DESCRIPTION\n\n**rofi** supports overriding of an"
  },
  {
    "path": "mkdocs/docs/1.7.6/rofi-script.5.markdown",
    "chars": 5770,
    "preview": "# rofi-script(5)\n\n## NAME\n\n**rofi script mode** - Rofi format for scriptable mode.\n\n## DESCRIPTION\n\n**rofi** supports mo"
  },
  {
    "path": "mkdocs/docs/1.7.6/rofi-sensible-terminal.1.markdown",
    "chars": 949,
    "preview": "# rofi-sensible-terminal(1)\n\n## NAME\n\n**rofi-sensible-terminal** -  launches $TERMINAL with fallbacks\n\n## SYNOPSIS\n\nrofi"
  },
  {
    "path": "mkdocs/docs/1.7.6/rofi-theme-selector.1.markdown",
    "chars": 1014,
    "preview": "# rofi-theme-selector(1)\n\n## NAME\n\n**rofi-theme-selector** - Preview and apply themes for **rofi**\n\n## DESCRIPTION\n\n**ro"
  },
  {
    "path": "mkdocs/docs/1.7.6/rofi-theme.5.markdown",
    "chars": 47526,
    "preview": "# rofi-theme(5)\n\n## NAME\n\n**rofi-theme** - Rofi theme format files\n\n## Getting started with theming\n\nThe easiest way to "
  },
  {
    "path": "mkdocs/docs/1.7.6/rofi-thumbnails.5.markdown",
    "chars": 3794,
    "preview": "# rofi-thumbnails(5)\n\n## NAME\n\n**rofi-thumbnails** - Rofi thumbnails system\n\n## DESCRIPTION\n\n**rofi** is now able to sho"
  },
  {
    "path": "mkdocs/docs/1.7.6/rofi.1.markdown",
    "chars": 29589,
    "preview": "# rofi(1)\n\n## NAME\n\n**rofi** - A window switcher, application launcher, ssh dialog, dmenu\nreplacement and more\n\n## SYNOP"
  },
  {
    "path": "mkdocs/docs/1.7.7/rofi-debugging.5.markdown",
    "chars": 9208,
    "preview": "# rofi-debugging(5)\n\n## NAME\n\nDebugging rofi.\n\nWhen reporting an issue with rofi crashing, or misbehaving. It helps to d"
  },
  {
    "path": "mkdocs/docs/1.7.7/rofi-dmenu.5.markdown",
    "chars": 6110,
    "preview": "# rofi-dmenu(5)\n\n## NAME\n\n**rofi dmenu mode** - Rofi dmenu emulation\n\n## DESCRIPTION\n\nTo integrate **rofi** into scripts"
  },
  {
    "path": "mkdocs/docs/1.7.7/rofi-keys.5.markdown",
    "chars": 7096,
    "preview": "# rofi-keys(5)\n\n## NAME\n\n**rofi keys** - Rofi Key and Mouse bindings\n\n## DESCRIPTION\n\n**rofi** supports overriding of an"
  },
  {
    "path": "mkdocs/docs/1.7.7/rofi-script.5.markdown",
    "chars": 5770,
    "preview": "# rofi-script(5)\n\n## NAME\n\n**rofi script mode** - Rofi format for scriptable mode.\n\n## DESCRIPTION\n\n**rofi** supports mo"
  },
  {
    "path": "mkdocs/docs/1.7.7/rofi-sensible-terminal.1.markdown",
    "chars": 949,
    "preview": "# rofi-sensible-terminal(1)\n\n## NAME\n\n**rofi-sensible-terminal** -  launches $TERMINAL with fallbacks\n\n## SYNOPSIS\n\nrofi"
  },
  {
    "path": "mkdocs/docs/1.7.7/rofi-theme-selector.1.markdown",
    "chars": 1014,
    "preview": "# rofi-theme-selector(1)\n\n## NAME\n\n**rofi-theme-selector** - Preview and apply themes for **rofi**\n\n## DESCRIPTION\n\n**ro"
  },
  {
    "path": "mkdocs/docs/1.7.7/rofi-theme.5.markdown",
    "chars": 47330,
    "preview": "# rofi-theme(5)\n\n## NAME\n\n**rofi-theme** - Rofi theme format files\n\n## Getting started with theming\n\nThe easiest way to "
  },
  {
    "path": "mkdocs/docs/1.7.7/rofi-thumbnails.5.markdown",
    "chars": 3794,
    "preview": "# rofi-thumbnails(5)\n\n## NAME\n\n**rofi-thumbnails** - Rofi thumbnails system\n\n## DESCRIPTION\n\n**rofi** is now able to sho"
  },
  {
    "path": "mkdocs/docs/1.7.7/rofi.1.markdown",
    "chars": 29604,
    "preview": "# rofi(1)\n\n## NAME\n\n**rofi** - A window switcher, application launcher, ssh dialog, dmenu\nreplacement and more\n\n## SYNOP"
  },
  {
    "path": "mkdocs/docs/1.7.8/rofi-debugging.5.markdown",
    "chars": 9208,
    "preview": "# rofi-debugging(5)\n\n## NAME\n\nDebugging rofi.\n\nWhen reporting an issue with rofi crashing, or misbehaving. It helps to d"
  },
  {
    "path": "mkdocs/docs/1.7.8/rofi-dmenu.5.markdown",
    "chars": 6110,
    "preview": "# rofi-dmenu(5)\n\n## NAME\n\n**rofi dmenu mode** - Rofi dmenu emulation\n\n## DESCRIPTION\n\nTo integrate **rofi** into scripts"
  },
  {
    "path": "mkdocs/docs/1.7.8/rofi-keys.5.markdown",
    "chars": 7096,
    "preview": "# rofi-keys(5)\n\n## NAME\n\n**rofi keys** - Rofi Key and Mouse bindings\n\n## DESCRIPTION\n\n**rofi** supports overriding of an"
  },
  {
    "path": "mkdocs/docs/1.7.8/rofi-script.5.markdown",
    "chars": 5770,
    "preview": "# rofi-script(5)\n\n## NAME\n\n**rofi script mode** - Rofi format for scriptable mode.\n\n## DESCRIPTION\n\n**rofi** supports mo"
  },
  {
    "path": "mkdocs/docs/1.7.8/rofi-sensible-terminal.1.markdown",
    "chars": 949,
    "preview": "# rofi-sensible-terminal(1)\n\n## NAME\n\n**rofi-sensible-terminal** -  launches $TERMINAL with fallbacks\n\n## SYNOPSIS\n\nrofi"
  },
  {
    "path": "mkdocs/docs/1.7.8/rofi-theme-selector.1.markdown",
    "chars": 1014,
    "preview": "# rofi-theme-selector(1)\n\n## NAME\n\n**rofi-theme-selector** - Preview and apply themes for **rofi**\n\n## DESCRIPTION\n\n**ro"
  },
  {
    "path": "mkdocs/docs/1.7.8/rofi-theme.5.markdown",
    "chars": 47330,
    "preview": "# rofi-theme(5)\n\n## NAME\n\n**rofi-theme** - Rofi theme format files\n\n## Getting started with theming\n\nThe easiest way to "
  },
  {
    "path": "mkdocs/docs/1.7.8/rofi-thumbnails.5.markdown",
    "chars": 3794,
    "preview": "# rofi-thumbnails(5)\n\n## NAME\n\n**rofi-thumbnails** - Rofi thumbnails system\n\n## DESCRIPTION\n\n**rofi** is now able to sho"
  },
  {
    "path": "mkdocs/docs/1.7.8/rofi.1.markdown",
    "chars": 29671,
    "preview": "# rofi(1)\n\n## NAME\n\n**rofi** - A window switcher, application launcher, ssh dialog, dmenu\nreplacement and more\n\n## SYNOP"
  },
  {
    "path": "mkdocs/docs/1.7.9/rofi-actions.5.markdown",
    "chars": 2621,
    "preview": "# rofi-actions(5)\n\n## NAME\n\n**rofi-actions** - Custom commands following interaction with rofi menus\n\n## DESCRIPTION\n\n**"
  },
  {
    "path": "mkdocs/docs/1.7.9/rofi-debugging.5.markdown",
    "chars": 9208,
    "preview": "# rofi-debugging(5)\n\n## NAME\n\nDebugging rofi.\n\nWhen reporting an issue with rofi crashing, or misbehaving. It helps to d"
  },
  {
    "path": "mkdocs/docs/1.7.9/rofi-dmenu.5.markdown",
    "chars": 6087,
    "preview": "# rofi-dmenu(5)\n\n## NAME\n\n**rofi dmenu mode** - Rofi dmenu emulation\n\n## DESCRIPTION\n\nTo integrate **rofi** into scripts"
  },
  {
    "path": "mkdocs/docs/1.7.9/rofi-keys.5.markdown",
    "chars": 7232,
    "preview": "# rofi-keys(5)\n\n## NAME\n\n**rofi keys** - Rofi Key and Mouse bindings\n\n## DESCRIPTION\n\n**rofi** supports overriding of an"
  },
  {
    "path": "mkdocs/docs/1.7.9/rofi-script.5.markdown",
    "chars": 5796,
    "preview": "# rofi-script(5)\n\n## NAME\n\n**rofi script mode** - Rofi format for scriptable mode.\n\n## DESCRIPTION\n\n**rofi** supports mo"
  },
  {
    "path": "mkdocs/docs/1.7.9/rofi-theme.5.markdown",
    "chars": 48204,
    "preview": "# rofi-theme(5)\n\n## NAME\n\n**rofi-theme** - Rofi theme format files\n\n## Getting started with theming\n\nThe easiest way to "
  },
  {
    "path": "mkdocs/docs/1.7.9/rofi-thumbnails.5.markdown",
    "chars": 3794,
    "preview": "# rofi-thumbnails(5)\n\n## NAME\n\n**rofi-thumbnails** - Rofi thumbnails system\n\n## DESCRIPTION\n\n**rofi** is now able to sho"
  },
  {
    "path": "mkdocs/docs/1.7.9/rofi.1.markdown",
    "chars": 30103,
    "preview": "# rofi(1)\n\n## NAME\n\n**rofi** - A window switcher, application launcher, ssh dialog, dmenu\nreplacement and more\n\n## SYNOP"
  },
  {
    "path": "mkdocs/docs/2.0.0/rofi-actions.5.markdown",
    "chars": 2621,
    "preview": "# rofi-actions(5)\n\n## NAME\n\n**rofi-actions** - Custom commands following interaction with rofi menus\n\n## DESCRIPTION\n\n**"
  },
  {
    "path": "mkdocs/docs/2.0.0/rofi-debugging.5.markdown",
    "chars": 9208,
    "preview": "# rofi-debugging(5)\n\n## NAME\n\nDebugging rofi.\n\nWhen reporting an issue with rofi crashing, or misbehaving. It helps to d"
  },
  {
    "path": "mkdocs/docs/2.0.0/rofi-dmenu.5.markdown",
    "chars": 6087,
    "preview": "# rofi-dmenu(5)\n\n## NAME\n\n**rofi dmenu mode** - Rofi dmenu emulation\n\n## DESCRIPTION\n\nTo integrate **rofi** into scripts"
  },
  {
    "path": "mkdocs/docs/2.0.0/rofi-keys.5.markdown",
    "chars": 7232,
    "preview": "# rofi-keys(5)\n\n## NAME\n\n**rofi keys** - Rofi Key and Mouse bindings\n\n## DESCRIPTION\n\n**rofi** supports overriding of an"
  },
  {
    "path": "mkdocs/docs/2.0.0/rofi-script.5.markdown",
    "chars": 5796,
    "preview": "# rofi-script(5)\n\n## NAME\n\n**rofi script mode** - Rofi format for scriptable mode.\n\n## DESCRIPTION\n\n**rofi** supports mo"
  },
  {
    "path": "mkdocs/docs/2.0.0/rofi-sensible-terminal.1.markdown",
    "chars": 956,
    "preview": "# rofi-sensible-terminal(1)\n\n## NAME\n\n**rofi-sensible-terminal** -  launches $TERMINAL with fallbacks\n\n## SYNOPSIS\n\nrofi"
  },
  {
    "path": "mkdocs/docs/2.0.0/rofi-theme-selector.1.markdown",
    "chars": 1014,
    "preview": "# rofi-theme-selector(1)\n\n## NAME\n\n**rofi-theme-selector** - Preview and apply themes for **rofi**\n\n## DESCRIPTION\n\n**ro"
  },
  {
    "path": "mkdocs/docs/2.0.0/rofi-theme.5.markdown",
    "chars": 48271,
    "preview": "# rofi-theme(5)\n\n## NAME\n\n**rofi-theme** - Rofi theme format files\n\n## Getting started with theming\n\nThe easiest way to "
  },
  {
    "path": "mkdocs/docs/2.0.0/rofi-thumbnails.5.markdown",
    "chars": 3794,
    "preview": "# rofi-thumbnails(5)\n\n## NAME\n\n**rofi-thumbnails** - Rofi thumbnails system\n\n## DESCRIPTION\n\n**rofi** is now able to sho"
  },
  {
    "path": "mkdocs/docs/2.0.0/rofi.1.markdown",
    "chars": 31094,
    "preview": "# rofi(1)\n\n## NAME\n\n**rofi** - A window switcher, application launcher, ssh dialog, dmenu\nreplacement and more\n\n## SYNOP"
  },
  {
    "path": "mkdocs/docs/downloads.md",
    "chars": 2637,
    "preview": "# Downloads\n\n## Development\n\nFor development no tarball is released. Please follow the\n[Installation](../INSTALL/) instr"
  },
  {
    "path": "mkdocs/docs/guides/DynamicThemes/dynamic_themes.md",
    "chars": 3954,
    "preview": "# Dynamic Theme\n\nA new addition in rofi 1.7.5 that did not get a lot of attention is support for\nthe enabled keyword in "
  },
  {
    "path": "mkdocs/docs/guides/Plugins/2017-04-19-rofi-140-sneak-preview-plugins.md",
    "chars": 22127,
    "preview": "> This guide is taken from the 1.4.0 release preview posts. The information\n> might be outdated, but in general should s"
  },
  {
    "path": "mkdocs/docs/guides/Positioning/theme3-positioning.markdown",
    "chars": 2015,
    "preview": "# Positioning Rofi on the monitor\n\nIn the current theme format you set these properties on the `window`  widget.\n\nThe fi"
  },
  {
    "path": "mkdocs/docs/guides/Transparency/theme3-transparency.markdown",
    "chars": 2706,
    "preview": "## Transparency within rofi\n\n> The images in this guide are outdated, but the principals still hold.\n\n**Rofi** window is"
  },
  {
    "path": "mkdocs/docs/index.md",
    "chars": 1382,
    "preview": "![rofi](images/rofi-logo-full.png)\n\n# Welcome to Rofi Documentation\n\nThis website holds the web-version of the manpages "
  },
  {
    "path": "mkdocs/docs/themes/capture.sh",
    "chars": 1457,
    "preview": "#!/usr/bin/env bash\n\nTHEMES=../../../themes/*.rasi\nROFI_BIN=../../../build/rofi\n\nfunction generate_options() {\n\techo -en"
  },
  {
    "path": "mkdocs/docs/themes/themes.md",
    "chars": 3818,
    "preview": "# Included Themes\nBelow is a list of themes shipped with rofi.\nUse `rofi-theme-selector` to select and use one of these "
  },
  {
    "path": "mkdocs/mkdocs.yml",
    "chars": 3865,
    "preview": "site_name: Rofi Documentation\nrepo_url: https://github.com/davatorium/rofi/\nedit_uri: mkdocs/docs/\ntheme: readthedocs\nna"
  },
  {
    "path": "pkgconfig/rofi.pc.in",
    "chars": 267,
    "preview": "prefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\n\npluginsdir=@libdir@/rofi/\n\nName: rofi"
  },
  {
    "path": "protocols/wlr-foreign-toplevel-management-unstable-v1.xml",
    "chars": 11555,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<protocol name=\"wlr_foreign_toplevel_management_unstable_v1\">\n  <copyright>\n    C"
  },
  {
    "path": "protocols/wlr-layer-shell-unstable-v1.xml",
    "chars": 19325,
    "preview": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<protocol name=\"wlr_layer_shell_unstable_v1\">\n  <copyright>\n    Copyright © 2017 "
  },
  {
    "path": "releasenotes/0.15.12/release-0.15.12.markdown",
    "chars": 5347,
    "preview": "# Release 0.15.12\n\nThe 0.15.12 release of **rofi** focusses on improving overall user experience.  These improvements mo"
  },
  {
    "path": "releasenotes/1.0.0/release-1.0.0.markdown",
    "chars": 4454,
    "preview": "# V1.0.0 - Welcome in 2016\n\nThe new release, after a long development cycle, is finally out. It has a lot of changes tha"
  },
  {
    "path": "releasenotes/1.1.0/release-1.1.0.markdown",
    "chars": 626,
    "preview": "# V1.1.0 - A trump card\n\n## New Features\n\n    - Keys mode, showing keybindings.\n    - Stop cycling option (#407) (Thx to"
  },
  {
    "path": "releasenotes/1.2.0/release-1.2.0.markdown",
    "chars": 2652,
    "preview": "# V1.2.0 - 8397\n\n## New Features\n\nDespite me saying after every release that it is mostly feature complete;  new **Rofi*"
  },
  {
    "path": "releasenotes/1.3.0/release-1.3.0.markdown",
    "chars": 5138,
    "preview": "# V1.3.0: Dan vs. Greg: The never ending story.\n\nThis release mostly focussed on cleaning up and refactoring the interna"
  },
  {
    "path": "releasenotes/1.3.1/release-1.3.1.markdown",
    "chars": 850,
    "preview": "# V1.3.1: Dan vs. Greg: The never ending story, reloaded.\n\nA quick follow up release to resolve some issues with copyrig"
  },
  {
    "path": "releasenotes/1.4.0/release-1.4.0.markdown",
    "chars": 8263,
    "preview": "# V1.4.0: I reject your truth and trumpstitute my own\n\n> This release contains some major changes. One of them being a n"
  },
  {
    "path": "releasenotes/1.5.0/release-1.5.0.markdown",
    "chars": 5288,
    "preview": "# V1.5.0: The Hoff uses it.\n\nAfter the last release turned out to be fairly large we are hopefully back to more regular,"
  },
  {
    "path": "releasenotes/1.5.2/release-1.5.2.markdown",
    "chars": 2840,
    "preview": "# 1.5.2: Procrastination in progress\n\nRofi 1.5.2 is another bug-fix release in the 1.5 series.\n\n\n## Fix border drawing\n\n"
  },
  {
    "path": "releasenotes/1.5.3/release-1.5.3.markdown",
    "chars": 2359,
    "preview": "# 1.5.3: Time delayed progress\n\nRofi 1.5.3 is another bug-fix release in the 1.5 series.\n\nThere is one breaking change i"
  }
]

// ... and 99 more files (download for full content)

About this extraction

This page contains the full source code of the davatorium/rofi GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 299 files (2.9 MB), approximately 773.7k tokens, and a symbol index with 1352 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!