summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bar.rs56
-rw-r--r--src/output.rs38
-rw-r--r--src/state.rs37
-rw-r--r--src/wm_info_provider/ext_workspace_unstable.rs60
-rw-r--r--src/wm_info_provider/river.rs51
5 files changed, 107 insertions, 135 deletions
diff --git a/src/bar.rs b/src/bar.rs
index 2817e26..2ca9b6c 100644
--- a/src/bar.rs
+++ b/src/bar.rs
@@ -1,6 +1,6 @@
use pangocairo::cairo;
-use wayrs_client::Connection;
+use wayrs_client::{Connection, EventCtx};
use wayrs_utils::shm_alloc::BufferSpec;
use crate::blocks_cache::ComputedBlock;
@@ -333,10 +333,15 @@ impl Bar {
pub fn request_frame(&mut self, conn: &mut Connection<State>) {
if self.mapped && !self.hidden && self.frame_cb.is_none() {
- self.frame_cb = Some(self.surface.frame_with_cb(conn, |conn, state, cb, _| {
- if let Some(bar) = state.bars.iter_mut().find(|bar| bar.frame_cb == Some(cb)) {
+ self.frame_cb = Some(self.surface.frame_with_cb(conn, |ctx| {
+ if let Some(bar) = ctx
+ .state
+ .bars
+ .iter_mut()
+ .find(|bar| bar.frame_cb == Some(ctx.proxy))
+ {
bar.frame_cb = None;
- bar.frame(conn, &mut state.shared_state);
+ bar.frame(ctx.conn, &mut ctx.state.shared_state);
}
}));
self.surface.commit(conn);
@@ -529,60 +534,53 @@ pub fn compute_tag_label(label: &str, config: &Config) -> ComputedText {
)
}
-fn layer_surface_cb(
- conn: &mut Connection<State>,
- state: &mut State,
- layer_surface: zwlr_layer_surface_v1::ZwlrLayerSurfaceV1,
- event: zwlr_layer_surface_v1::Event,
-) {
- match event {
+fn layer_surface_cb(ctx: EventCtx<State, ZwlrLayerSurfaceV1>) {
+ match ctx.event {
zwlr_layer_surface_v1::Event::Configure(args) => {
- let bar = state
+ let bar = ctx
+ .state
.bars
.iter_mut()
- .find(|bar| bar.layer_surface == layer_surface)
+ .find(|bar| bar.layer_surface == ctx.proxy)
.unwrap();
if bar.hidden {
return;
}
assert_ne!(args.width, 0);
bar.width = args.width;
- bar.layer_surface.ack_configure(conn, args.serial);
+ bar.layer_surface.ack_configure(ctx.conn, args.serial);
if bar.mapped {
- bar.request_frame(conn);
+ bar.request_frame(ctx.conn);
} else {
bar.mapped = true;
- bar.frame(conn, &mut state.shared_state);
+ bar.frame(ctx.conn, &mut ctx.state.shared_state);
}
}
zwlr_layer_surface_v1::Event::Closed => {
- let bar_index = state
+ let bar_index = ctx
+ .state
.bars
.iter()
- .position(|bar| bar.layer_surface == layer_surface)
+ .position(|bar| bar.layer_surface == ctx.proxy)
.unwrap();
- state.drop_bar(conn, bar_index);
+ ctx.state.drop_bar(ctx.conn, bar_index);
}
_ => (),
}
}
-fn fractional_scale_cb(
- conn: &mut Connection<State>,
- state: &mut State,
- fractional_scale: WpFractionalScaleV1,
- event: wp_fractional_scale_v1::Event,
-) {
- let wp_fractional_scale_v1::Event::PreferredScale(scale120) = event else {
+fn fractional_scale_cb(ctx: EventCtx<State, WpFractionalScaleV1>) {
+ let wp_fractional_scale_v1::Event::PreferredScale(scale120) = ctx.event else {
return;
};
- let bar = state
+ let bar = ctx
+ .state
.bars
.iter_mut()
- .find(|b| b.fractional_scale == Some(fractional_scale))
+ .find(|b| b.fractional_scale == Some(ctx.proxy))
.unwrap();
if bar.scale120 != Some(scale120) {
bar.scale120 = Some(scale120);
- bar.request_frame(conn);
+ bar.request_frame(ctx.conn);
}
}
diff --git a/src/output.rs b/src/output.rs
index be9a29a..7c492ed 100644
--- a/src/output.rs
+++ b/src/output.rs
@@ -1,6 +1,6 @@
use wayrs_client::global::{Global, GlobalExt};
-use wayrs_client::protocol::*;
use wayrs_client::Connection;
+use wayrs_client::{protocol::*, EventCtx};
use crate::state::State;
@@ -27,26 +27,36 @@ impl Output {
}
}
-fn wl_output_cb(
- conn: &mut Connection<State>,
- state: &mut State,
- output: WlOutput,
- event: wl_output::Event,
-) {
- match event {
+fn wl_output_cb(ctx: EventCtx<State, WlOutput>) {
+ match ctx.event {
wl_output::Event::Name(name) => {
- let i = state
+ let i = ctx
+ .state
.pending_outputs
.iter()
- .position(|o| o.wl == output)
+ .position(|o| o.wl == ctx.proxy)
.unwrap();
- let output = state.pending_outputs.swap_remove(i);
- state.register_output(conn, output, name.to_str().expect("invalid output name"));
+ let output = ctx.state.pending_outputs.swap_remove(i);
+ ctx.state.register_output(
+ ctx.conn,
+ output,
+ name.to_str().expect("invalid output name"),
+ );
}
wl_output::Event::Scale(scale) => {
- if let Some(bar) = state.bars.iter_mut().find(|bar| bar.output.wl == output) {
+ if let Some(bar) = ctx
+ .state
+ .bars
+ .iter_mut()
+ .find(|bar| bar.output.wl == ctx.proxy)
+ {
bar.output.scale = scale as u32;
- } else if let Some(output) = state.pending_outputs.iter_mut().find(|o| o.wl == output) {
+ } else if let Some(output) = ctx
+ .state
+ .pending_outputs
+ .iter_mut()
+ .find(|o| o.wl == ctx.proxy)
+ {
output.scale = scale as u32;
}
}
diff --git a/src/state.rs b/src/state.rs
index ba2c3e6..4b3a0ca 100644
--- a/src/state.rs
+++ b/src/state.rs
@@ -10,6 +10,7 @@ use std::path::Path;
use wayrs_client::global::{GlobalExt, Globals, GlobalsExt};
use wayrs_client::proxy::Proxy;
use wayrs_client::Connection;
+use wayrs_client::EventCtx;
use wayrs_utils::cursor::{CursorImage, CursorShape, CursorTheme, ThemedPointer};
use wayrs_utils::seats::{SeatHandler, Seats};
use wayrs_utils::shm_alloc::ShmAlloc;
@@ -284,25 +285,22 @@ fn wl_registry_cb(conn: &mut Connection<State>, state: &mut State, event: &wl_re
}
}
-fn wl_pointer_cb(
- conn: &mut Connection<State>,
- state: &mut State,
- pointer: WlPointer,
- event: wl_pointer::Event,
-) {
- let pointer = state
+fn wl_pointer_cb(ctx: EventCtx<State, WlPointer>) {
+ let pointer = ctx
+ .state
.pointers
.iter_mut()
- .find(|p| p.pointer == pointer)
+ .find(|p| p.pointer == ctx.proxy)
.unwrap();
use wl_pointer::Event;
- match event {
+ match ctx.event {
Event::Frame => {
let btn = pointer.pending_button.take();
let scroll = pointer.scroll_frame.finalize();
if let Some(surface) = pointer.current_surface {
- let bar = state
+ let bar = ctx
+ .state
.bars
.iter_mut()
.find(|bar| bar.surface == surface)
@@ -310,8 +308,8 @@ fn wl_pointer_cb(
if let Some(btn) = btn {
bar.click(
- conn,
- &mut state.shared_state,
+ ctx.conn,
+ &mut ctx.state.shared_state,
btn,
pointer.seat,
pointer.x,
@@ -320,7 +318,7 @@ fn wl_pointer_cb(
.unwrap();
}
- if scroll.is_finger && state.shared_state.config.invert_touchpad_scrolling {
+ if scroll.is_finger && ctx.state.shared_state.config.invert_touchpad_scrolling {
pointer.pending_scroll -= scroll.absolute;
} else {
pointer.pending_scroll += scroll.absolute;
@@ -342,8 +340,8 @@ fn wl_pointer_cb(
if let Some(btn) = btn {
bar.click(
- conn,
- &mut state.shared_state,
+ ctx.conn,
+ &mut ctx.state.shared_state,
btn,
pointer.seat,
pointer.x,
@@ -354,7 +352,8 @@ fn wl_pointer_cb(
}
}
Event::Enter(args) => {
- let bar = state
+ let bar = ctx
+ .state
.bars
.iter()
.find(|bar| bar.surface.id() == args.surface)
@@ -362,10 +361,10 @@ fn wl_pointer_cb(
pointer.current_surface = Some(bar.surface);
pointer.x = args.surface_x.as_f64();
pointer.y = args.surface_y.as_f64();
- if let Some(default_cursor) = &state.default_cursor {
+ if let Some(default_cursor) = &ctx.state.default_cursor {
pointer.themed_pointer.set_cursor(
- conn,
- &mut state.shared_state.shm,
+ ctx.conn,
+ &mut ctx.state.shared_state.shm,
default_cursor,
bar.output.scale,
args.serial,
diff --git a/src/wm_info_provider/ext_workspace_unstable.rs b/src/wm_info_provider/ext_workspace_unstable.rs
index 203cba9..c1d7b98 100644
--- a/src/wm_info_provider/ext_workspace_unstable.rs
+++ b/src/wm_info_provider/ext_workspace_unstable.rs
@@ -1,7 +1,7 @@
-use wayrs_client::global::*;
use wayrs_client::object::ObjectId;
use wayrs_client::proxy::Proxy;
use wayrs_client::Connection;
+use wayrs_client::{global::*, EventCtx};
use super::*;
use crate::state::State;
@@ -30,7 +30,7 @@ struct Workspace {
impl ExtWorkspaceUnstable {
pub fn bind(conn: &mut Connection<State>, globals: &Globals) -> Option<Self> {
Some(Self {
- manager: globals.bind_with_cb(conn, 1..=1, manager_cb).ok()?,
+ manager: globals.bind_with_cb(conn, 1, manager_cb).ok()?,
groups: Vec::new(),
known_outputs: Vec::new(),
})
@@ -112,48 +112,38 @@ impl WmInfoProvider for ExtWorkspaceUnstable {
}
}
-fn manager_cb(
- conn: &mut Connection<State>,
- state: &mut State,
- _: ZextWorkspaceManagerV1,
- event: zext_workspace_manager_v1::Event,
-) {
- let ewu = state.shared_state.get_ewu().unwrap();
+fn manager_cb(ctx: EventCtx<State, ZextWorkspaceManagerV1>) {
+ let ewu = ctx.state.shared_state.get_ewu().unwrap();
- match event {
+ match ctx.event {
zext_workspace_manager_v1::Event::WorkspaceGroup(group_handle) => {
- conn.set_callback_for(group_handle, group_cb);
+ ctx.conn.set_callback_for(group_handle, group_cb);
ewu.groups.push(Group {
group_handle,
workspaces: Vec::new(),
outputs: Vec::new(),
});
}
- zext_workspace_manager_v1::Event::Done => state.tags_updated(conn, None),
+ zext_workspace_manager_v1::Event::Done => ctx.state.tags_updated(ctx.conn, None),
zext_workspace_manager_v1::Event::Finished => unreachable!(),
}
}
-fn group_cb(
- conn: &mut Connection<State>,
- state: &mut State,
- group_handle: ZextWorkspaceGroupHandleV1,
- event: zext_workspace_group_handle_v1::Event,
-) {
- let ewu = state.shared_state.get_ewu().unwrap();
+fn group_cb(ctx: EventCtx<State, ZextWorkspaceGroupHandleV1>) {
+ let ewu = ctx.state.shared_state.get_ewu().unwrap();
let group = ewu
.groups
.iter_mut()
- .find(|g| g.group_handle == group_handle)
+ .find(|g| g.group_handle == ctx.proxy)
.unwrap();
- match event {
+ match ctx.event {
zext_workspace_group_handle_v1::Event::OutputEnter(output) => {
group.outputs.push(output);
}
zext_workspace_group_handle_v1::Event::OutputLeave(_) => todo!(),
zext_workspace_group_handle_v1::Event::Workspace(workspace_handle) => {
- conn.set_callback_for(workspace_handle, workspace_cb);
+ ctx.conn.set_callback_for(workspace_handle, workspace_cb);
group.workspaces.push(Workspace {
workspace_handle,
name: None,
@@ -167,29 +157,21 @@ fn group_cb(
}
}
-fn workspace_cb(
- conn: &mut Connection<State>,
- state: &mut State,
- workspace_handle: ZextWorkspaceHandleV1,
- event: zext_workspace_handle_v1::Event,
-) {
- let ewu = state.shared_state.get_ewu().unwrap();
+fn workspace_cb(ctx: EventCtx<State, ZextWorkspaceHandleV1>) {
+ let ewu = ctx.state.shared_state.get_ewu().unwrap();
+
let group = ewu
.groups
.iter_mut()
- .find(|g| {
- g.workspaces
- .iter()
- .any(|w| w.workspace_handle == workspace_handle)
- })
+ .find(|g| g.workspaces.iter().any(|w| w.workspace_handle == ctx.proxy))
.unwrap();
let workspace = group
.workspaces
.iter_mut()
- .find(|w| w.workspace_handle == workspace_handle)
+ .find(|w| w.workspace_handle == ctx.proxy)
.unwrap();
- match event {
+ match ctx.event {
zext_workspace_handle_v1::Event::Name(name) => {
workspace.name = Some(name.to_string_lossy().into_owned());
}
@@ -206,10 +188,8 @@ fn workspace_cb(
}
}
zext_workspace_handle_v1::Event::Remove => {
- group
- .workspaces
- .retain(|w| w.workspace_handle != workspace_handle);
- workspace_handle.destroy(conn);
+ group.workspaces.retain(|w| w.workspace_handle != ctx.proxy);
+ ctx.proxy.destroy(ctx.conn);
}
}
}
diff --git a/src/wm_info_provider/river.rs b/src/wm_info_provider/river.rs
index e9904bd..90c6cd1 100644
--- a/src/wm_info_provider/river.rs
+++ b/src/wm_info_provider/river.rs
@@ -1,7 +1,7 @@
use std::ffi::CString;
-use wayrs_client::global::*;
use wayrs_client::{cstr, Connection};
+use wayrs_client::{global::*, EventCtx};
use super::*;
use crate::state::State;
@@ -38,7 +38,7 @@ impl RiverInfoProvider {
let wl_seat: WlSeat = globals.bind(conn, ..).ok()?; // river supports just one seat
Some(Self {
status_manager,
- control: globals.bind(conn, 1..=1).ok()?,
+ control: globals.bind(conn, 1).ok()?,
output_statuses: Vec::new(),
max_tag: config.river.max_tag,
seat_status: SeatStatus {
@@ -127,69 +127,54 @@ impl WmInfoProvider for RiverInfoProvider {
}
}
-fn output_status_cb(
- conn: &mut Connection<State>,
- state: &mut State,
- output_status: ZriverOutputStatusV1,
- event: zriver_output_status_v1::Event,
-) {
- let river = state.shared_state.get_river().unwrap();
+fn output_status_cb(ctx: EventCtx<State, ZriverOutputStatusV1>) {
+ let river = ctx.state.shared_state.get_river().unwrap();
let status = river
.output_statuses
.iter_mut()
- .find(|s| s.status == output_status)
+ .find(|s| s.status == ctx.proxy)
.unwrap();
let output = status.output;
use zriver_output_status_v1::Event;
- match event {
+ match ctx.event {
Event::FocusedTags(tags) => {
status.focused_tags = tags;
- state.tags_updated(conn, Some(output));
+ ctx.state.tags_updated(ctx.conn, Some(output));
}
Event::ViewTags(tags) => {
status.active_tags = tags
.chunks_exact(4)
.map(|bytes| u32::from_ne_bytes(bytes.try_into().unwrap()))
.fold(0, |a, b| a | b);
- state.tags_updated(conn, Some(output));
+ ctx.state.tags_updated(ctx.conn, Some(output));
}
Event::UrgentTags(tags) => {
status.urgent_tags = tags;
- state.tags_updated(conn, Some(output));
+ ctx.state.tags_updated(ctx.conn, Some(output));
}
Event::LayoutName(ln) => {
status.layout_name = Some(ln.to_string_lossy().into());
- state.layout_name_updated(conn, Some(output));
+ ctx.state.layout_name_updated(ctx.conn, Some(output));
}
Event::LayoutNameClear => {
status.layout_name = None;
- state.layout_name_updated(conn, Some(output));
+ ctx.state.layout_name_updated(ctx.conn, Some(output));
}
}
}
-fn seat_status_cb(
- conn: &mut Connection<State>,
- state: &mut State,
- _: ZriverSeatStatusV1,
- event: zriver_seat_status_v1::Event,
-) {
- if let zriver_seat_status_v1::Event::Mode(mode) = event {
- let river = state.shared_state.get_river().unwrap();
+fn seat_status_cb(ctx: EventCtx<State, ZriverSeatStatusV1>) {
+ if let zriver_seat_status_v1::Event::Mode(mode) = ctx.event {
+ let river = ctx.state.shared_state.get_river().unwrap();
let mode = mode.to_string_lossy().into_owned();
river.seat_status.mode = (mode != "normal").then_some(mode);
- state.mode_name_updated(conn, None);
+ ctx.state.mode_name_updated(ctx.conn, None);
}
}
-fn river_command_cb(
- conn: &mut Connection<State>,
- state: &mut State,
- _: ZriverCommandCallbackV1,
- event: zriver_command_callback_v1::Event,
-) {
- if let zriver_command_callback_v1::Event::Failure(msg) = event {
- state.set_error(conn, msg.to_string_lossy())
+fn river_command_cb(ctx: EventCtx<State, ZriverCommandCallbackV1>) {
+ if let zriver_command_callback_v1::Event::Failure(msg) = ctx.event {
+ ctx.state.set_error(ctx.conn, msg.to_string_lossy())
}
}