Skip to content

Commit

Permalink
keyboard: clippy fixes, test edge case
Browse files Browse the repository at this point in the history
  • Loading branch information
DashieTM committed Jun 6, 2024
1 parent bb10304 commit cdc2cb1
Show file tree
Hide file tree
Showing 8 changed files with 163 additions and 165 deletions.
21 changes: 12 additions & 9 deletions keyboard_plugin/src/backend/gnome.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ use gtk::prelude::{SettingsExt, SettingsExtManual};

use crate::keyboard_layout::KeyboardLayout;

pub fn get_saved_layouts_gnome(all_keyboards: &Vec<KeyboardLayout>) -> Vec<KeyboardLayout> {
pub fn get_saved_layouts_gnome(all_keyboards: &[KeyboardLayout]) -> Vec<KeyboardLayout> {
let mut kb = vec![];
let input_sources = gtk::gio::Settings::new("org.gnome.desktop.input-sources");
let layout_variant = input_sources.value("sources");
Expand All @@ -13,19 +13,20 @@ pub fn get_saved_layouts_gnome(all_keyboards: &Vec<KeyboardLayout>) -> Vec<Keybo

let layouts = layout_variant.get::<Vec<(String, String)>>().unwrap();
for layout in layouts {
let kb_layout: Vec<&KeyboardLayout>;
if layout.1.contains("+") {
let kb_layout: Vec<&KeyboardLayout> = if layout.1.contains("+") {
let kb_data: Vec<&str> = layout.1.split("+").collect();
kb_layout = all_keyboards.iter()
all_keyboards
.iter()
.filter(|x| x.name == kb_data[0])
.filter(|x| x.variant.as_ref().unwrap_or(&String::new()) == kb_data[1].trim())
.collect();
.collect()
} else {
kb_layout = all_keyboards.iter()
all_keyboards
.iter()
.filter(|x| x.name == layout.1.trim())
.filter(|x| x.variant.is_none())
.collect();
}
.collect()
};
if let Some(option) = kb_layout.first() {
kb.push((*option).clone());
}
Expand All @@ -45,5 +46,7 @@ pub fn write_to_config_gnome(layouts: Vec<KeyboardLayout>) {

let variant = Variant::from(all_layouts);
let input_sources = gtk::gio::Settings::new("org.gnome.desktop.input-sources");
input_sources.set("sources", variant).expect("failed to write layouts");
input_sources
.set("sources", variant)
.expect("failed to write layouts");
}
36 changes: 24 additions & 12 deletions keyboard_plugin/src/backend/hyprland.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,21 +3,24 @@ use std::io::Write;
use std::path::PathBuf;
use std::process::Command;

use re_set_lib::utils::config::CONFIG;
use re_set_lib::ERROR;
#[cfg(debug_assertions)]
use re_set_lib::{utils::macros::ErrorLevel, write_log_to_file};
use re_set_lib::ERROR;
use re_set_lib::utils::config::CONFIG;

use crate::keyboard_layout::KeyboardLayout;
use crate::utils::{get_default_path, parse_setting};

pub fn get_saved_layouts_hyprland(all_keyboards: &Vec<KeyboardLayout>) -> Vec<KeyboardLayout> {
pub fn get_saved_layouts_hyprland(all_keyboards: &[KeyboardLayout]) -> Vec<KeyboardLayout> {
let kb_layout = Command::new("hyprctl")
.arg("getoption")
.arg("input:kb_layout")
.output();
if kb_layout.is_err() {
ERROR!("Failed to fetch keyboard layouts", ErrorLevel::PartialBreakage);
ERROR!(
"Failed to fetch keyboard layouts",
ErrorLevel::PartialBreakage
);
return vec![];
}
let kb_layout = parse_setting(kb_layout.unwrap());
Expand All @@ -27,17 +30,21 @@ pub fn get_saved_layouts_hyprland(all_keyboards: &Vec<KeyboardLayout>) -> Vec<Ke
.arg("input:kb_variant")
.output();
if kb_variant.is_err() {
ERROR!("Failed to fetch keyboard variants", ErrorLevel::PartialBreakage);
ERROR!(
"Failed to fetch keyboard variants",
ErrorLevel::PartialBreakage
);
return vec![];
}
let mut kb_variant = parse_setting(kb_variant.unwrap());
kb_variant.resize(kb_layout.len(), String::new());

let mut kb = vec![];
for (layout, variant) in kb_layout.into_iter().zip(kb_variant.into_iter()) {
let layouts: Vec<&KeyboardLayout> = all_keyboards.iter()
let layouts: Vec<&KeyboardLayout> = all_keyboards
.iter()
.filter(|x| x.name == layout.trim())
.filter(|x| x.variant.as_ref().unwrap_or(&String::new()) == &variant.trim())
.filter(|x| x.variant.as_ref().unwrap_or(&String::new()) == variant.trim())
.collect();
if let Some(asdf) = layouts.first() {
let option = (*asdf).clone();
Expand All @@ -49,6 +56,7 @@ pub fn get_saved_layouts_hyprland(all_keyboards: &Vec<KeyboardLayout>) -> Vec<Ke

pub fn write_to_config_hyprland(layouts: Vec<KeyboardLayout>) {
let path;
#[allow(clippy::borrow_interior_mutable_const)]
if let Some(test) = CONFIG.get("Keyboard").unwrap().get("path") {
path = test.as_str().unwrap().to_string();
} else {
Expand All @@ -58,7 +66,6 @@ pub fn write_to_config_hyprland(layouts: Vec<KeyboardLayout>) {
let mut input_config = OpenOptions::new()
.write(true)
.read(true)
.create(true)
.open(PathBuf::from(path))
.expect("Failed to open file");

Expand All @@ -68,17 +75,22 @@ pub fn write_to_config_hyprland(layouts: Vec<KeyboardLayout>) {
layout_string += &x.name;
layout_string += ", ";
if let Some(var) = &x.variant {
variant_string += &var;
variant_string += var;
}
variant_string += ", ";
};
}

layout_string = layout_string.trim_end_matches(", ").to_string();
variant_string = variant_string.trim_end_matches(", ").to_string();

let string = format!("input {{\n kb_layout={}\n kb_variant={}\n}}", layout_string, variant_string);
let string = format!(
"input {{\n kb_layout={}\n kb_variant={}\n}}",
layout_string, variant_string
);

input_config.set_len(0).expect("Failed to truncate file");
input_config.write_all(string.as_bytes()).expect("Failed to write to file");
input_config
.write_all(string.as_bytes())
.expect("Failed to write to file");
input_config.sync_all().expect("Failed to sync file");
}
16 changes: 8 additions & 8 deletions keyboard_plugin/src/backend/kde.rs
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@

use std::process::{Command};
use crate::keyboard_layout::KeyboardLayout;
use crate::utils::{parse_setting};
use crate::utils::parse_setting;
use std::process::Command;

pub fn get_saved_layouts_kde(all_keyboards: &Vec<KeyboardLayout>) -> Vec<KeyboardLayout> {
pub fn get_saved_layouts_kde(all_keyboards: &[KeyboardLayout]) -> Vec<KeyboardLayout> {
let output = Command::new("kreadconfig6")
.arg("--file")
.arg("kxkbrc")
Expand All @@ -28,9 +27,10 @@ pub fn get_saved_layouts_kde(all_keyboards: &Vec<KeyboardLayout>) -> Vec<Keyboar

let mut kb = vec![];
for (layout, variant) in kb_layout.into_iter().zip(kb_variant.into_iter()) {
let layouts: Vec<&KeyboardLayout> = all_keyboards.iter()
let layouts: Vec<&KeyboardLayout> = all_keyboards
.iter()
.filter(|x| x.name == layout.trim())
.filter(|x| x.variant.as_ref().unwrap_or(&String::new()) == &variant.trim())
.filter(|x| x.variant.as_ref().unwrap_or(&String::new()) == variant.trim())
.collect();
if let Some(asdf) = layouts.first() {
let option = (*asdf).clone();
Expand All @@ -47,10 +47,10 @@ pub fn write_to_config_kde(layouts: Vec<KeyboardLayout>) {
layout_string += &x.name;
layout_string += ", ";
if let Some(var) = &x.variant {
variant_string += &var;
variant_string += var;
}
variant_string += ", ";
};
}

Command::new("kwriteconfig6")
.arg("--file")
Expand Down
106 changes: 53 additions & 53 deletions keyboard_plugin/src/frontend/add_layout_page.rs
Original file line number Diff line number Diff line change
@@ -1,11 +1,11 @@
use std::collections::HashMap;

use adw::{ActionRow, NavigationPage, NavigationView, PreferencesGroup};
use adw::prelude::{ActionRowExt, PreferencesGroupExt, PreferencesRowExt};
use glib::{clone, SignalHandlerId, Variant};
use adw::{ActionRow, NavigationPage, NavigationView, PreferencesGroup};
use glib::translate::FromGlib;
use gtk::{Button, GestureClick, Image, ListBox, Orientation, ScrolledWindow, SearchEntry};
use glib::{clone, SignalHandlerId, Variant};
use gtk::prelude::*;
use gtk::{Button, GestureClick, Image, ListBox, Orientation, ScrolledWindow, SearchEntry};

use crate::frontend::get_keyboard_list_frontend;
use crate::keyboard_layout::KeyboardLayout;
Expand All @@ -21,20 +21,18 @@ pub fn create_add_keyboard_page(nav_view: &NavigationView) {
.build();
nav_view.add(&add_keyboard_page);

let back_group = PreferencesGroup::builder()
.margin_bottom(10)
.build();
let back_group = PreferencesGroup::builder().margin_bottom(10).build();

let back_button = ActionRow::builder()
.title("Keyboard Layouts")
.activatable(true)
.action_name("navigation.pop")
.build();

back_button.add_suffix(&Image::from_icon_name("go-previous-symbolic"));
back_group.add(&back_button);
add_keyboard_page_box.append(&back_group);

let search_box = gtk::Box::builder()
.orientation(Orientation::Horizontal)
.spacing(5)
Expand All @@ -48,10 +46,7 @@ pub fn create_add_keyboard_page(nav_view: &NavigationView) {
.build();
search_box.append(&search);

let add_layout_button = Button::builder()
.label("Add")
.sensitive(false)
.build();
let add_layout_button = Button::builder().label("Add").sensitive(false).build();
search_box.append(&add_layout_button);

let list = ListBox::new();
Expand All @@ -76,7 +71,7 @@ pub fn create_add_keyboard_page(nav_view: &NavigationView) {
add_layout_button.set_sensitive(true);
}
}));

add_layout_button.connect_clicked(clone!(@weak nav_view, @weak list => move |button| {
let selected_row = list.selected_row();
if selected_row.is_none() {
Expand Down Expand Up @@ -127,16 +122,18 @@ fn add_keyboard_list_to_view(list: &ListBox, add_layout_button: &Button) {
back_row.add_prefix(&Image::from_icon_name("go-previous-symbolic"));
let click = GestureClick::builder().build();

click.connect_pressed(clone!(@weak list, @weak add_layout_button => move |_, _, _, _| {
unsafe {
let asdf = SignalHandlerId::from_glib(id.as_raw());
list.disconnect(asdf);
}
list.remove_all();
list.unselect_all();
add_layout_button.set_sensitive(false);
add_keyboard_list_to_view(&list, &add_layout_button);
}));
click.connect_pressed(
clone!(@weak list, @weak add_layout_button => move |_, _, _, _| {
unsafe {
let asdf = SignalHandlerId::from_glib(id.as_raw());
list.disconnect(asdf);
}
list.remove_all();
list.unselect_all();
add_layout_button.set_sensitive(false);
add_keyboard_list_to_view(&list, &add_layout_button);
}),
);

back_row.add_controller(click);
for (_, description, keyboard_layouts) in keyboard_layouts {
Expand All @@ -148,40 +145,41 @@ fn add_keyboard_list_to_view(list: &ListBox, add_layout_button: &Button) {
} else {
layout_row.add_suffix(&Image::from_icon_name("go-previous-symbolic-rtl"));

layout_row.connect_activate(clone!(@strong keyboard_layouts, @weak list, @strong back_row => move |_| {
// add variants to list
for keyboard_layout in keyboard_layouts.clone() {
let layout_row = create_layout_row(keyboard_layout.description.clone());
list.append(&layout_row);
}

list.prepend(&back_row); // add back button at top

// remove all but first
let mut last_row = list.last_child();
let mut skip = keyboard_layouts.len();

// remove all but first
while last_row != None {
if list.first_child() == last_row {
list.grab_focus();
break;
layout_row.connect_activate(
clone!(@strong keyboard_layouts, @weak list, @strong back_row => move |_| {
// add variants to list
for keyboard_layout in keyboard_layouts.clone() {
let layout_row = create_layout_row(keyboard_layout.description.clone());
list.append(&layout_row);
}
if skip > 0 {
last_row = last_row.unwrap().prev_sibling();
skip -= 1;
continue;

list.prepend(&back_row); // add back button at top

// remove all but first
let mut last_row = list.last_child();
let mut skip = keyboard_layouts.len();

// remove all but first
while last_row.is_some() {
if list.first_child() == last_row {
list.grab_focus();
break;
}
if skip > 0 {
last_row = last_row.unwrap().prev_sibling();
skip -= 1;
continue;
}
let temp = last_row.clone().unwrap().prev_sibling();
list.remove(&last_row.unwrap());
last_row = temp;
}
let temp = last_row.clone().unwrap().prev_sibling();
list.remove(&last_row.unwrap());
last_row = temp;
}
}));
}),
);
}
}
}


fn has_suffix(action_row: &ActionRow) -> bool {
let widget = action_row.first_child().unwrap();
let suffix = widget.last_child().unwrap();
Expand All @@ -196,8 +194,10 @@ fn get_keyboard_list() -> Vec<(String, String, Vec<KeyboardLayout>)> {
let variant = layout.variant.clone();
let description = layout.description.clone();
let name = layout.name.clone();
collection.entry(layout.name.clone())
.or_insert((String::new(), Vec::new())).1
collection
.entry(layout.name.clone())
.or_insert((String::new(), Vec::new()))
.1
.push(layout);
if variant.is_none() {
collection.get_mut(&name).unwrap().0 = description;
Expand Down
Loading

0 comments on commit cdc2cb1

Please sign in to comment.