mirror of
https://gitlab.com/hyask/swaysome.git
synced 2025-12-10 07:44:43 +01:00
Don't use well-typed structs anymore
This can lead to maintainance problems if `sway` decides to change a structure by only a field that we don't even use. This seems to already happen if you have an output declared in your `sway` configuration that is unplugged.
This commit is contained in:
parent
e2f59801d0
commit
9200db526a
3 changed files with 9 additions and 106 deletions
52
Cargo.lock
generated
52
Cargo.lock
generated
|
|
@ -12,24 +12,6 @@ version = "0.4.6"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6"
|
checksum = "dc6f3ad7b9d11a0c00842ff8de1b60ee58661048eb8049ed33c73594f359d7e6"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "proc-macro2"
|
|
||||||
version = "1.0.24"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71"
|
|
||||||
dependencies = [
|
|
||||||
"unicode-xid",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "quote"
|
|
||||||
version = "1.0.8"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ryu"
|
name = "ryu"
|
||||||
version = "1.0.5"
|
version = "1.0.5"
|
||||||
|
|
@ -41,20 +23,6 @@ name = "serde"
|
||||||
version = "1.0.118"
|
version = "1.0.118"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "06c64263859d87aa2eb554587e2d23183398d617427327cf2b3d0ed8c69e4800"
|
checksum = "06c64263859d87aa2eb554587e2d23183398d617427327cf2b3d0ed8c69e4800"
|
||||||
dependencies = [
|
|
||||||
"serde_derive",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "serde_derive"
|
|
||||||
version = "1.0.118"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "c84d3526699cd55261af4b941e4e725444df67aa4f9e6a3564f18030d12672df"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_json"
|
name = "serde_json"
|
||||||
|
|
@ -69,26 +37,8 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "swaysome"
|
name = "swaysome"
|
||||||
version = "0.1.0"
|
version = "0.2.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"byteorder",
|
"byteorder",
|
||||||
"serde",
|
|
||||||
"serde_json",
|
"serde_json",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "syn"
|
|
||||||
version = "1.0.55"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "a571a711dddd09019ccc628e1b17fe87c59b09d513c06c026877aa708334f37a"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"unicode-xid",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "unicode-xid"
|
|
||||||
version = "0.2.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564"
|
|
||||||
|
|
|
||||||
|
|
@ -8,5 +8,4 @@ edition = "2018"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
byteorder = "1"
|
byteorder = "1"
|
||||||
serde = { version = "1", features = ["derive"] }
|
|
||||||
serde_json = "1"
|
serde_json = "1"
|
||||||
|
|
|
||||||
62
src/main.rs
62
src/main.rs
|
|
@ -1,6 +1,5 @@
|
||||||
// client.rs
|
// client.rs
|
||||||
extern crate byteorder;
|
extern crate byteorder;
|
||||||
extern crate serde;
|
|
||||||
extern crate serde_json;
|
extern crate serde_json;
|
||||||
|
|
||||||
use std::env;
|
use std::env;
|
||||||
|
|
@ -11,8 +10,6 @@ use std::os::unix::net::UnixStream;
|
||||||
use std::mem;
|
use std::mem;
|
||||||
use std::io::Cursor;
|
use std::io::Cursor;
|
||||||
|
|
||||||
use serde::{Deserialize, Serialize};
|
|
||||||
|
|
||||||
use byteorder::{ReadBytesExt, WriteBytesExt, LittleEndian};
|
use byteorder::{ReadBytesExt, WriteBytesExt, LittleEndian};
|
||||||
|
|
||||||
const RUN_COMMAND: u32 = 0;
|
const RUN_COMMAND: u32 = 0;
|
||||||
|
|
@ -20,49 +17,6 @@ const GET_WORKSPACES: u32 = 1;
|
||||||
const SUBSCRIBE: u32 = 2;
|
const SUBSCRIBE: u32 = 2;
|
||||||
const GET_OUTPUTS: u32 = 3;
|
const GET_OUTPUTS: u32 = 3;
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
#[derive(Serialize, Deserialize)]
|
|
||||||
struct WorkspaceRect {
|
|
||||||
x: usize,
|
|
||||||
y: usize,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
#[derive(Serialize, Deserialize)]
|
|
||||||
struct Workspace {
|
|
||||||
num: usize,
|
|
||||||
name: String,
|
|
||||||
visible: bool,
|
|
||||||
focused: bool,
|
|
||||||
rect: WorkspaceRect,
|
|
||||||
output: String,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
#[derive(Serialize, Deserialize)]
|
|
||||||
struct OutputMode {
|
|
||||||
width: usize,
|
|
||||||
height: usize,
|
|
||||||
refresh: usize,
|
|
||||||
}
|
|
||||||
|
|
||||||
#[derive(Debug)]
|
|
||||||
#[derive(Serialize, Deserialize)]
|
|
||||||
struct Output {
|
|
||||||
name: String,
|
|
||||||
make: String,
|
|
||||||
model: String,
|
|
||||||
serial: String,
|
|
||||||
active: bool,
|
|
||||||
primary: bool,
|
|
||||||
focused: bool,
|
|
||||||
scale: f32,
|
|
||||||
subpixel_hinting: String,
|
|
||||||
transform: String,
|
|
||||||
current_workspace: String,
|
|
||||||
modes: Vec<OutputMode>,
|
|
||||||
current_mode: OutputMode,
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
fn get_stream() -> UnixStream {
|
fn get_stream() -> UnixStream {
|
||||||
|
|
@ -146,7 +100,7 @@ fn check_success(stream: &UnixStream) {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_outputs(stream: &UnixStream) -> Vec<Output> {
|
fn get_outputs(stream: &UnixStream) -> Vec<serde_json::Value> {
|
||||||
send_msg(&stream, GET_OUTPUTS, "");
|
send_msg(&stream, GET_OUTPUTS, "");
|
||||||
let o = match read_msg(&stream) {
|
let o = match read_msg(&stream) {
|
||||||
Ok(msg) => msg,
|
Ok(msg) => msg,
|
||||||
|
|
@ -155,7 +109,7 @@ fn get_outputs(stream: &UnixStream) -> Vec<Output> {
|
||||||
serde_json::from_str(&o).unwrap()
|
serde_json::from_str(&o).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_workspaces(stream: &UnixStream) -> Vec<Workspace> {
|
fn get_workspaces(stream: &UnixStream) -> Vec<serde_json::Value> {
|
||||||
send_msg(&stream, GET_WORKSPACES, "");
|
send_msg(&stream, GET_WORKSPACES, "");
|
||||||
let ws = match read_msg(&stream) {
|
let ws = match read_msg(&stream) {
|
||||||
Ok(msg) => msg,
|
Ok(msg) => msg,
|
||||||
|
|
@ -167,7 +121,7 @@ fn get_workspaces(stream: &UnixStream) -> Vec<Workspace> {
|
||||||
fn get_current_output_name(stream: &UnixStream) -> String {
|
fn get_current_output_name(stream: &UnixStream) -> String {
|
||||||
let outputs = get_outputs(&stream);
|
let outputs = get_outputs(&stream);
|
||||||
|
|
||||||
let focused_output_index = match outputs.iter().position(|x| x.focused) {
|
let focused_output_index = match outputs.iter().position(|x| x["focused"] == serde_json::Value::Bool(true)) {
|
||||||
Some(i) => i,
|
Some(i) => i,
|
||||||
None => panic!("WTF! No focused output???"),
|
None => panic!("WTF! No focused output???"),
|
||||||
};
|
};
|
||||||
|
|
@ -205,7 +159,7 @@ fn move_container_to_prev_output(stream: &UnixStream) {
|
||||||
|
|
||||||
fn move_container_to_next_or_prev_output(stream: &UnixStream, go_to_prev: bool) {
|
fn move_container_to_next_or_prev_output(stream: &UnixStream, go_to_prev: bool) {
|
||||||
let outputs = get_outputs(&stream);
|
let outputs = get_outputs(&stream);
|
||||||
let focused_output_index = match outputs.iter().position(|x| x.focused) {
|
let focused_output_index = match outputs.iter().position(|x| x["focused"] == serde_json::Value::Bool(true)) {
|
||||||
Some(i) => i,
|
Some(i) => i,
|
||||||
None => panic!("WTF! No focused output???"),
|
None => panic!("WTF! No focused output???"),
|
||||||
};
|
};
|
||||||
|
|
@ -219,18 +173,18 @@ fn move_container_to_next_or_prev_output(stream: &UnixStream, go_to_prev: bool)
|
||||||
|
|
||||||
let workspaces = get_workspaces(&stream);
|
let workspaces = get_workspaces(&stream);
|
||||||
let target_workspace = workspaces.iter()
|
let target_workspace = workspaces.iter()
|
||||||
.filter(|x| x.output == target_output.name && x.visible)
|
.filter(|x| x["output"] == target_output["name"] && x["visible"] == serde_json::Value::Bool(true))
|
||||||
.next().unwrap();
|
.next().unwrap();
|
||||||
|
|
||||||
// Move container to target workspace
|
// Move container to target workspace
|
||||||
let mut cmd: String = "move container to workspace ".to_string();
|
let mut cmd: String = "move container to workspace ".to_string();
|
||||||
cmd.push_str(&target_workspace.name);
|
cmd.push_str(&target_workspace["name"].as_str().unwrap());
|
||||||
send_msg(&stream, RUN_COMMAND, &cmd);
|
send_msg(&stream, RUN_COMMAND, &cmd);
|
||||||
check_success(&stream);
|
check_success(&stream);
|
||||||
|
|
||||||
// Focus that workspace to follow the container
|
// Focus that workspace to follow the container
|
||||||
let mut cmd: String = "workspace ".to_string();
|
let mut cmd: String = "workspace ".to_string();
|
||||||
cmd.push_str(&target_workspace.name);
|
cmd.push_str(&target_workspace["name"].as_str().unwrap());
|
||||||
send_msg(&stream, RUN_COMMAND, &cmd);
|
send_msg(&stream, RUN_COMMAND, &cmd);
|
||||||
check_success(&stream);
|
check_success(&stream);
|
||||||
}
|
}
|
||||||
|
|
@ -241,7 +195,7 @@ fn init_workspaces(stream: &UnixStream) {
|
||||||
let cmd_prefix: String = "focus output ".to_string();
|
let cmd_prefix: String = "focus output ".to_string();
|
||||||
for output in outputs.iter().rev() {
|
for output in outputs.iter().rev() {
|
||||||
let mut cmd = cmd_prefix.clone();
|
let mut cmd = cmd_prefix.clone();
|
||||||
cmd.push_str(&output.name);
|
cmd.push_str(&output["name"].as_str().unwrap());
|
||||||
println!("Sending command: '{}'", &cmd);
|
println!("Sending command: '{}'", &cmd);
|
||||||
send_msg(&stream, RUN_COMMAND, &cmd);
|
send_msg(&stream, RUN_COMMAND, &cmd);
|
||||||
check_success(&stream);
|
check_success(&stream);
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue