Mirror WMRange into Rust.

This is a simple value type with only a constructor method. We keep duplicate type definitions in C and Rust for now, with the intention of doing something smarter later on.
This commit was merged in pull request #32.
This commit is contained in:
2026-02-25 23:05:11 -05:00
parent e71673e46b
commit 49e2a9071d
8 changed files with 65 additions and 15 deletions

View File

@@ -281,7 +281,7 @@ char* wtrimspace(const char *s);
*/
char *wshellquote(const char *s);
/* ---[ WINGs/misc.c ]--------------------------------------------------- */
/* ---[ wutil-rs/src/range.rs ]------------------------------------------ */
WMRange wmkrange(int start, int count);

View File

@@ -24,16 +24,6 @@
#include "error.h"
WMRange wmkrange(int start, int count)
{
WMRange range;
range.position = start;
range.count = count;
return range;
}
/*
* wutil_shutdown - cleanup in WUtil when user program wants to exit
*/

View File

@@ -47,7 +47,7 @@ src/WINGsP.rs: ../WINGs/WINGsP.h ../../wrlib/wraster.h ../WINGs/WINGs.h ../WINGs
--allowlist-type "^WM(Button|ButtonBehaviorMask)" \
--allowlist-function "^WM(CreateCustomButton|SetButtonText|SetButtonAction|SetButtonText)" \
--allowlist-function "wmkrange" \
--allowlist-type "^WM(View|Array|DragOperationType|Point|Data|OpenPanel|SavePanel|HashTable|DraggingInfo|SelectionProcs|Rect|EventProc|Widget|Size|Color|Pixmap|FilePanel|Screen|Range|List|ListItem)" \
--allowlist-type "^WM(View|Array|DragOperationType|Point|Data|OpenPanel|SavePanel|HashTable|DraggingInfo|SelectionProcs|Rect|EventProc|Widget|Size|Color|Pixmap|FilePanel|Screen|List|ListItem)" \
--allowlist-type "^R(Context|ContextAttributes|Image|RenderingMode|ScalingFilter|StdColormapMode|ImageFormat|Color)" \
--allowlist-type "_WINGsConfiguration" \
--allowlist-item "^WMAlignment" \

View File

@@ -15,7 +15,7 @@ fi
FILE="$1"
exec sed -i -r \
-e "1s/^/use x11::xlib::*;\nuse crate::font::ffi::WMFont;\n\n/" \
-e "1s/^/use wutil_rs::range::ffi::*;\nuse x11::xlib::*;\nuse crate::font::ffi::WMFont;\n\n/" \
-e "s/_XftDraw/::std::ffi::c_void/g" \
-e "s/_XftFont/::std::ffi::c_void/g" \
-e "s/PangoLayout/::std::ffi::c_void/g" \

View File

@@ -741,10 +741,10 @@ impl FontPanel {
return;
}
WMSetTextFieldText(self.size_text.as_ptr(), (*item).text);
let Ok(len) = CStr::from_ptr((*item).text).count_bytes().try_into() else {
let Ok(len) = TryInto::<c_int>::try_into(CStr::from_ptr((*item).text).count_bytes()) else {
return;
};
WMSelectTextFieldRange(self.size_text.as_ptr(), wmkrange(0, len));
WMSelectTextFieldRange(self.size_text.as_ptr(), wutil_rs::range::Range::from(0..len));
}
}

View File

@@ -13,6 +13,7 @@ RUST_SOURCES = \
src/memory.rs \
src/notification.rs \
src/prop_list.rs \
src/range.rs \
src/sendable.rs \
src/string.rs \
src/tree.rs

View File

@@ -8,6 +8,7 @@ pub mod hash_table;
pub mod memory;
pub mod notification;
pub mod prop_list;
pub mod range;
pub mod sendable;
pub mod string;
pub mod tree;

58
wutil-rs/src/range.rs Normal file
View File

@@ -0,0 +1,58 @@
use std::ffi::c_int;
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, PartialOrd, Ord)]
#[repr(C)]
pub struct Range {
pub start: c_int,
pub count: c_int,
}
impl Into<std::ops::Range<c_int>> for Range {
fn into(self) -> std::ops::Range<c_int> {
self.start..(self.start + self.count)
}
}
impl From<std::ops::Range<c_int>> for Range {
fn from(other: std::ops::Range<c_int>) -> Range {
Range {
start: other.start,
count: other.end - other.start
}
}
}
#[cfg(test)]
mod test {
use std::ffi::c_int;
use super::Range;
#[test]
fn from_std_range() {
assert_eq!(Range { start: 0, count: 10 }, Range::from(0..10));
assert_eq!(Range { start: 1, count: 9 }, Range::from(1..10));
}
#[test]
fn into_std_range() {
assert_eq!(0..10, Into::<std::ops::Range<c_int>>::into(Range {
start: 0,
count: 10
}));
assert_eq!(1..10, Into::<std::ops::Range<c_int>>::into(Range {
start: 1,
count: 9
}));
}
}
pub mod ffi {
use std::ffi::c_int;
pub type WMRange = super::Range;
#[unsafe(no_mangle)]
pub extern "C" fn wmkrange(start: c_int, count: c_int) -> WMRange {
WMRange { start, count }
}
}