mirror of
https://github.com/pinnacle-comp/pinnacle.git
synced 2025-01-18 22:26:12 +01:00
Split tag.get
, impl PartialEq
, Eq
, Hash
for handles
This commit is contained in:
parent
9f067a0996
commit
8356f99d84
4 changed files with 79 additions and 24 deletions
|
@ -94,19 +94,19 @@ async fn main() {
|
||||||
|
|
||||||
for tag_name in tag_names {
|
for tag_name in tag_names {
|
||||||
input.keybind([mod_key], tag_name, move || {
|
input.keybind([mod_key], tag_name, move || {
|
||||||
if let Some(tg) = tag.get(tag_name, None) {
|
if let Some(tg) = tag.get(tag_name) {
|
||||||
tg.switch_to();
|
tg.switch_to();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
input.keybind([mod_key, Mod::Shift], tag_name, move || {
|
input.keybind([mod_key, Mod::Shift], tag_name, move || {
|
||||||
if let Some(tg) = tag.get(tag_name, None) {
|
if let Some(tg) = tag.get(tag_name) {
|
||||||
tg.toggle_active();
|
tg.toggle_active();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
input.keybind([mod_key, Mod::Alt], tag_name, move || {
|
input.keybind([mod_key, Mod::Alt], tag_name, move || {
|
||||||
if let Some(tg) = tag.get(tag_name, None) {
|
if let Some(tg) = tag.get(tag_name) {
|
||||||
if let Some(win) = window.get_focused() {
|
if let Some(win) = window.get_focused() {
|
||||||
win.move_to_tag(&tg);
|
win.move_to_tag(&tg);
|
||||||
}
|
}
|
||||||
|
@ -114,7 +114,7 @@ async fn main() {
|
||||||
});
|
});
|
||||||
|
|
||||||
input.keybind([mod_key, Mod::Shift, Mod::Alt], tag_name, move || {
|
input.keybind([mod_key, Mod::Shift, Mod::Alt], tag_name, move || {
|
||||||
if let Some(tg) = tag.get(tag_name, None) {
|
if let Some(tg) = tag.get(tag_name) {
|
||||||
if let Some(win) = window.get_focused() {
|
if let Some(win) = window.get_focused() {
|
||||||
win.toggle_tag(&tg);
|
win.toggle_tag(&tg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -166,6 +166,20 @@ pub struct OutputHandle {
|
||||||
pub(crate) name: String,
|
pub(crate) name: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PartialEq for OutputHandle {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
self.name == other.name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Eq for OutputHandle {}
|
||||||
|
|
||||||
|
impl std::hash::Hash for OutputHandle {
|
||||||
|
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
|
||||||
|
self.name.hash(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// The alignment to use for [`OutputHandle::set_loc_adj_to`].
|
/// The alignment to use for [`OutputHandle::set_loc_adj_to`].
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
|
||||||
pub enum Alignment {
|
pub enum Alignment {
|
||||||
|
|
|
@ -131,40 +131,53 @@ impl Tag {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Get a handle to the first tag with the given name on `output`.
|
/// Get a handle to the first tag with the given name on the focused output.
|
||||||
///
|
///
|
||||||
/// If `output` is `None`, the focused output will be used.
|
/// If you need to get a tag on a specific output, see [`Tag::get_on_output`].
|
||||||
///
|
///
|
||||||
/// # Examples
|
/// # Examples
|
||||||
///
|
///
|
||||||
/// ```
|
/// ```
|
||||||
/// // Get tag "1" on output "HDMI-1"
|
|
||||||
/// if let Some(op) = output.get_by_name("HDMI-1") {
|
|
||||||
/// let tg = tag.get("1", &op);
|
|
||||||
/// }
|
|
||||||
///
|
|
||||||
/// // Get tag "Thing" on the focused output
|
/// // Get tag "Thing" on the focused output
|
||||||
/// let tg = tag.get("Thing", None);
|
/// let tg = tag.get("Thing");
|
||||||
/// ```
|
/// ```
|
||||||
pub fn get<'a>(
|
pub fn get(&self, name: impl Into<String>) -> Option<TagHandle> {
|
||||||
&self,
|
|
||||||
name: impl Into<String>,
|
|
||||||
output: impl Into<Option<&'a OutputHandle>>,
|
|
||||||
) -> Option<TagHandle> {
|
|
||||||
let name = name.into();
|
let name = name.into();
|
||||||
let output: Option<&OutputHandle> = output.into();
|
|
||||||
let output_module = Output::new(self.channel.clone(), self.fut_sender.clone());
|
let output_module = Output::new(self.channel.clone(), self.fut_sender.clone());
|
||||||
|
let focused_output = output_module.get_focused();
|
||||||
|
|
||||||
self.get_all().find(|tag| {
|
self.get_all().find(|tag| {
|
||||||
let props = tag.props();
|
let props = tag.props();
|
||||||
|
|
||||||
let same_tag_name = props.name.as_ref() == Some(&name);
|
let same_tag_name = props.name.as_ref() == Some(&name);
|
||||||
let same_output = props.output.is_some_and(|op| {
|
let same_output = props.output.is_some_and(|op| Some(op) == focused_output);
|
||||||
Some(op.name)
|
|
||||||
== output
|
same_tag_name && same_output
|
||||||
.map(|o| o.name.clone())
|
})
|
||||||
.or_else(|| output_module.get_focused().map(|o| o.name))
|
}
|
||||||
});
|
|
||||||
|
/// Get a handle to the first tag with the given name on the specified output.
|
||||||
|
///
|
||||||
|
/// If you just need to get a tag on the focused output, see [`Tag::get`].
|
||||||
|
///
|
||||||
|
/// # Examples
|
||||||
|
///
|
||||||
|
/// ```
|
||||||
|
/// // Get tag "Thing" on "HDMI-1"
|
||||||
|
/// let tg = tag.get_on_output("Thing", output.get_by_name("HDMI-2")?);
|
||||||
|
/// ```
|
||||||
|
pub fn get_on_output(
|
||||||
|
&self,
|
||||||
|
name: impl Into<String>,
|
||||||
|
output: &OutputHandle,
|
||||||
|
) -> Option<TagHandle> {
|
||||||
|
let name = name.into();
|
||||||
|
|
||||||
|
self.get_all().find(|tag| {
|
||||||
|
let props = tag.props();
|
||||||
|
|
||||||
|
let same_tag_name = props.name.as_ref() == Some(&name);
|
||||||
|
let same_output = props.output.is_some_and(|op| &op == output);
|
||||||
|
|
||||||
same_tag_name && same_output
|
same_tag_name && same_output
|
||||||
})
|
})
|
||||||
|
@ -318,6 +331,20 @@ pub struct TagHandle {
|
||||||
pub(crate) id: u32,
|
pub(crate) id: u32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PartialEq for TagHandle {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
self.id == other.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Eq for TagHandle {}
|
||||||
|
|
||||||
|
impl std::hash::Hash for TagHandle {
|
||||||
|
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
|
||||||
|
self.id.hash(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Various static layouts.
|
/// Various static layouts.
|
||||||
#[repr(i32)]
|
#[repr(i32)]
|
||||||
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, TryFromPrimitive)]
|
#[derive(Clone, Copy, Debug, Hash, PartialEq, Eq, TryFromPrimitive)]
|
||||||
|
|
|
@ -172,6 +172,20 @@ pub struct WindowHandle {
|
||||||
pub(crate) output_client: OutputServiceClient<Channel>,
|
pub(crate) output_client: OutputServiceClient<Channel>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl PartialEq for WindowHandle {
|
||||||
|
fn eq(&self, other: &Self) -> bool {
|
||||||
|
self.id == other.id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Eq for WindowHandle {}
|
||||||
|
|
||||||
|
impl std::hash::Hash for WindowHandle {
|
||||||
|
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
|
||||||
|
self.id.hash(state);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Whether a window is fullscreen, maximized, or neither.
|
/// Whether a window is fullscreen, maximized, or neither.
|
||||||
#[repr(i32)]
|
#[repr(i32)]
|
||||||
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, TryFromPrimitive)]
|
#[derive(Debug, Clone, Copy, Hash, PartialEq, Eq, TryFromPrimitive)]
|
||||||
|
|
Loading…
Reference in a new issue