1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
use std::fmt;
use x11rb::protocol::xproto;

use crate::{WmCtlError, WmCtlResult};

/// MapState provides an easy way to identify the differnt window map values
#[allow(dead_code)]
#[derive(Debug, Clone, PartialEq)]
pub enum MapState {
    Unmapped,
    Unviewable,
    Viewable,
}

// Convert from u32 to state
impl MapState {
    pub fn from(val: u32) -> WmCtlResult<MapState> {
        if val == xproto::MapState::UNMAPPED.into() {
            Ok(MapState::Unmapped)
        } else if val == xproto::MapState::UNVIEWABLE.into() {
            Ok(MapState::Unviewable)
        } else if val == xproto::MapState::VIEWABLE.into() {
            Ok(MapState::Viewable)
        } else {
            Err(WmCtlError::InvalidWinMap(val).into())
        }
    }
}

// Implement format! support
impl fmt::Display for MapState {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self {
            _ => write!(f, "{}", format!("{:?}", self).to_lowercase()),
        }
    }
}