chiark / gitweb /
wdt: Provide WindowGuard::client()
authorIan Jackson <ijackson@chiark.greenend.org.uk>
Fri, 29 Jan 2021 22:55:16 +0000 (22:55 +0000)
committerIan Jackson <ijackson@chiark.greenend.org.uk>
Sat, 30 Jan 2021 00:39:31 +0000 (00:39 +0000)
Signed-off-by: Ian Jackson <ijackson@chiark.greenend.org.uk>
wdriver.rs

index c904cdb7c4bcfb2348c6269aa3fec57c1b26abf1..24d9da0f5354b5e553d19bfd87823f12a8097349 100644 (file)
@@ -778,6 +778,7 @@ pub struct WindowGuard<'g> {
   su: &'g mut Setup,
   w: &'g Window,
   matrix: OnceCell<ScreenCTM>,
+  client: OnceCell<String>,
 }
 
 impl Debug for WindowGuard<'_> {
@@ -801,6 +802,18 @@ impl<'g> WindowGuard<'g> {
     }
   }
 
+  #[throws(AE)]
+  pub fn client(&mut self) -> String {
+    let us = self.client.get_or_try_init(||{
+      let us = self.execute_script(r##"return us;"##)?;
+      let us = us.value();
+      let us = us.as_str().ok_or_else(
+        || anyhow!("return us script gave {:?}", &us))?;
+      Ok::<_,AE>(us.to_owned())
+    }).context("obtain client ID")?;
+    us.clone()
+  }
+
   #[throws(AE)]
   pub fn piece_held(&self, pc: &str) -> Option<String> {
     let held = self.execute_script(&format!(r##"
@@ -1009,6 +1022,7 @@ impl Setup {
       w,
       su: self,
       matrix: default(),
+      client: default(),
     }
   }
 }