parent
251fcfd518
commit
a5ae9785ed
6 changed files with 95 additions and 23 deletions
|
@ -151,7 +151,7 @@ The command line options have precedence over the configuration file.
|
|||
| matching | MatchMethod | Contains | Defines the matching method |
|
||||
| insensitive | bool | true | Control if search is case-insensitive |
|
||||
| parse_search | bool | None | Parse search option |
|
||||
| location | [Anchor] | None | Set where the window is displayed |
|
||||
| location | Anchor | None | Set where the window is displayed |
|
||||
| no_actions | bool | false | If true, sub actions will be disabled |
|
||||
| lines | int | None | Number of lines to show |
|
||||
| lines_additional_space | int | 0 | Additional space for lines |
|
||||
|
@ -191,6 +191,7 @@ The command line options have precedence over the configuration file.
|
|||
| submit_with_expand | bool | true | Allow submit with expand key |
|
||||
| auto_select_on_search | bool | false | Auto select when only 1 choice left |
|
||||
| rollover | bool | true | Jump to first/last entry at end/start |
|
||||
| text_output_mode | TextOutputMode | Clipboard | Output for text modes (i.e. math and emoji) |
|
||||
|
||||
### Enum Values
|
||||
- **MatchMethod**: Fuzzy, Contains, MultiContains, None
|
||||
|
|
|
@ -10,7 +10,7 @@ use std::{
|
|||
use clap::Parser;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use worf::{
|
||||
config::{self, Config, CustomKeyHintLocation, Key},
|
||||
config::{self, Config, CustomKeyHintLocation, Key, TextOutputMode},
|
||||
desktop::{copy_to_clipboard, spawn_fork},
|
||||
gui::{
|
||||
self, CustomKeyHint, CustomKeys, ExpandMode, ItemProvider, KeyBinding, MenuItem, Modifier,
|
||||
|
@ -416,8 +416,16 @@ fn show(
|
|||
}
|
||||
} else {
|
||||
let pw = rbw_get_password(id, true)?;
|
||||
if let Err(e) = copy_to_clipboard(pw, None) {
|
||||
log::error!("failed to copy to clipboard: {e}");
|
||||
match config.read().unwrap().text_output_mode() {
|
||||
TextOutputMode::Clipboard => {
|
||||
if let Err(e) = copy_to_clipboard(pw, None) {
|
||||
log::error!("failed to copy to clipboard: {e}");
|
||||
}
|
||||
}
|
||||
TextOutputMode::StandardOutput => {
|
||||
println!("{pw}");
|
||||
}
|
||||
TextOutputMode::None => {}
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
|
|
|
@ -70,15 +70,22 @@ pub enum Layer {
|
|||
Overlay,
|
||||
}
|
||||
|
||||
#[derive(Clone, Debug, Serialize, Deserialize)]
|
||||
pub enum TextOutputMode {
|
||||
None,
|
||||
Clipboard,
|
||||
StandardOutput,
|
||||
}
|
||||
|
||||
impl FromStr for Layer {
|
||||
type Err = String;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
match s {
|
||||
"Background" => Ok(Layer::Background),
|
||||
"Bottom" => Ok(Layer::Bottom),
|
||||
"Top" => Ok(Layer::Top),
|
||||
"Overlay" => Ok(Layer::Overlay),
|
||||
match s.trim().to_lowercase().as_str() {
|
||||
"background" => Ok(Layer::Background),
|
||||
"bottom" => Ok(Layer::Bottom),
|
||||
"top" => Ok(Layer::Top),
|
||||
"overlay" => Ok(Layer::Overlay),
|
||||
_ => Err(format!("{s} is not a valid layer.")),
|
||||
}
|
||||
}
|
||||
|
@ -88,7 +95,7 @@ impl FromStr for Anchor {
|
|||
type Err = String;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
match s.trim() {
|
||||
match s.trim().to_lowercase().as_str() {
|
||||
"top" => Ok(Anchor::Top),
|
||||
"left" => Ok(Anchor::Left),
|
||||
"bottom" => Ok(Anchor::Bottom),
|
||||
|
@ -102,7 +109,7 @@ impl FromStr for WrapMode {
|
|||
type Err = Error;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
match s {
|
||||
match s.trim().to_lowercase().as_str() {
|
||||
"none" => Ok(WrapMode::None),
|
||||
"word" => Ok(WrapMode::Word),
|
||||
"inherit" => Ok(WrapMode::Inherit),
|
||||
|
@ -117,7 +124,7 @@ impl FromStr for SortOrder {
|
|||
type Err = Error;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
match s {
|
||||
match s.trim().to_lowercase().as_str() {
|
||||
"alphabetical" => Ok(SortOrder::Alphabetical),
|
||||
"default" => Ok(SortOrder::Default),
|
||||
_ => Err(Error::InvalidArgument(
|
||||
|
@ -131,7 +138,7 @@ impl FromStr for KeyDetectionType {
|
|||
type Err = Error;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
match s {
|
||||
match s.trim().to_lowercase().as_str() {
|
||||
"value" => Ok(KeyDetectionType::Value),
|
||||
"code" => Ok(KeyDetectionType::Code),
|
||||
_ => Err(Error::InvalidArgument(
|
||||
|
@ -141,6 +148,19 @@ impl FromStr for KeyDetectionType {
|
|||
}
|
||||
}
|
||||
|
||||
impl FromStr for TextOutputMode {
|
||||
type Err = String;
|
||||
|
||||
fn from_str(s: &str) -> Result<Self, Self::Err> {
|
||||
match s.trim().to_lowercase().as_str() {
|
||||
"clipboard" => Ok(TextOutputMode::Clipboard),
|
||||
"stdout" | "standardoutput" => Ok(TextOutputMode::StandardOutput),
|
||||
"none" => Ok(TextOutputMode::None),
|
||||
_ => Err(format!("{s} is not a valid layer.")),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Copy, PartialEq, Deserialize, Serialize)]
|
||||
pub enum Key {
|
||||
None,
|
||||
|
@ -632,7 +652,18 @@ pub struct Config {
|
|||
|
||||
/// Jump to the first/last entry when at the end/start and down/up is pressed
|
||||
/// Defaults to true
|
||||
#[clap(long = "rollover")]
|
||||
rollover: Option<bool>,
|
||||
|
||||
/// For text modes, defines which output is used.
|
||||
/// This is per default used in math and emoji mode.
|
||||
/// Defaults to `Clipboard`
|
||||
/// For emoji mode, setting this to None will disable the text output
|
||||
/// so the mode isn't too useful anymore.
|
||||
/// For math mode, setting this to None will provide no output but keep running
|
||||
/// math mode in a loop. Other modes will exit and provide results on selected output.
|
||||
#[clap(long = "text-output-mode")]
|
||||
text_output_mode: Option<TextOutputMode>,
|
||||
}
|
||||
|
||||
impl Config {
|
||||
|
@ -927,6 +958,13 @@ impl Config {
|
|||
pub fn rollover(&self) -> bool {
|
||||
self.rollover.unwrap_or(true)
|
||||
}
|
||||
|
||||
#[must_use]
|
||||
pub fn text_output_mode(&self) -> TextOutputMode {
|
||||
self.text_output_mode
|
||||
.clone()
|
||||
.unwrap_or(TextOutputMode::Clipboard)
|
||||
}
|
||||
}
|
||||
|
||||
fn default_false() -> bool {
|
||||
|
|
|
@ -2,7 +2,7 @@ use std::sync::{Arc, Mutex, RwLock};
|
|||
|
||||
use crate::{
|
||||
Error,
|
||||
config::{Config, SortOrder},
|
||||
config::{Config, SortOrder, TextOutputMode},
|
||||
desktop::copy_to_clipboard,
|
||||
gui::{self, ExpandMode, ItemProvider, MenuItem, ProviderData},
|
||||
};
|
||||
|
@ -75,6 +75,16 @@ pub fn show(config: &Arc<RwLock<Config>>) -> Result<(), Error> {
|
|||
let selection_result = gui::show(config, provider, None, None, ExpandMode::Verbatim, None)?;
|
||||
match selection_result.menu.data {
|
||||
None => Err(Error::MissingAction),
|
||||
Some(action) => copy_to_clipboard(action, None),
|
||||
Some(action) => match config.read().unwrap().text_output_mode() {
|
||||
TextOutputMode::Clipboard => {
|
||||
copy_to_clipboard(action, None)?;
|
||||
Ok(())
|
||||
}
|
||||
TextOutputMode::StandardOutput => {
|
||||
println!("{action}");
|
||||
Ok(())
|
||||
}
|
||||
TextOutputMode::None => Ok(()),
|
||||
},
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,8 @@ use std::{
|
|||
use regex::Regex;
|
||||
|
||||
use crate::{
|
||||
config::Config,
|
||||
Error,
|
||||
config::{Config, TextOutputMode},
|
||||
gui::{
|
||||
self, ArcFactory, ArcProvider, DefaultItemFactory, ExpandMode, ItemProvider, MenuItem,
|
||||
ProviderData,
|
||||
|
@ -346,7 +347,11 @@ fn calc(input: &str) -> String {
|
|||
/// Shows the math mode
|
||||
/// # Panics
|
||||
/// When failing to unwrap the arc lock
|
||||
pub fn show(config: &Arc<RwLock<Config>>) {
|
||||
///
|
||||
/// # Errors
|
||||
/// Forwards the errors from `crate::desktop::copy_to_clipboard`
|
||||
/// if the text output mode is set to `Clipboard`.
|
||||
pub fn show(config: &Arc<RwLock<Config>>) -> Result<(), Error> {
|
||||
let mut calc: Vec<MenuItem<()>> = vec![];
|
||||
let provider = Arc::new(Mutex::new(MathProvider::new(())));
|
||||
let factory: ArcFactory<()> = Arc::new(Mutex::new(DefaultItemFactory::new()));
|
||||
|
@ -361,11 +366,24 @@ pub fn show(config: &Arc<RwLock<Config>>) {
|
|||
ExpandMode::Verbatim,
|
||||
None,
|
||||
);
|
||||
|
||||
if let Ok(mi) = selection_result {
|
||||
calc.push(mi.menu);
|
||||
match config.read().unwrap().text_output_mode() {
|
||||
TextOutputMode::Clipboard => {
|
||||
crate::desktop::copy_to_clipboard(mi.menu.label, None)?;
|
||||
break;
|
||||
}
|
||||
TextOutputMode::StandardOutput => {
|
||||
println!("{}", mi.menu.label);
|
||||
break;
|
||||
}
|
||||
TextOutputMode::None => calc.push(mi.menu),
|
||||
}
|
||||
} else {
|
||||
log::error!("No item selected");
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
|
|
@ -44,7 +44,7 @@ pub enum Mode {
|
|||
)]
|
||||
struct MainConfig {
|
||||
/// Defines the mode worf is running in
|
||||
#[clap(long = "show")]
|
||||
#[clap(long = "show", alias = "mode")]
|
||||
show: Mode,
|
||||
|
||||
#[command(flatten)]
|
||||
|
@ -124,10 +124,7 @@ fn main() {
|
|||
Mode::Drun => modes::drun::show(&cfg_arc),
|
||||
Mode::Dmenu => modes::dmenu::show(&cfg_arc),
|
||||
Mode::File => modes::file::show(&cfg_arc),
|
||||
Mode::Math => {
|
||||
modes::math::show(&cfg_arc);
|
||||
Ok(())
|
||||
}
|
||||
Mode::Math => modes::math::show(&cfg_arc),
|
||||
Mode::Ssh => modes::ssh::show(&cfg_arc),
|
||||
Mode::Emoji => modes::emoji::show(&cfg_arc),
|
||||
Mode::Auto => modes::auto::show(&cfg_arc),
|
||||
|
|
Loading…
Add table
Reference in a new issue