From 763876ac2766b23558e4b97fa3e0b205eaaa2926 Mon Sep 17 00:00:00 2001 From: Alex Kotov Date: Fri, 9 Sep 2022 19:31:22 +0400 Subject: [PATCH] Remove Xbase in Rust This reverts commit a98a7d5a5030dbd62f534725feb8a6c6e5347ab5. This reverts commit 21080d2cbb5c77fc2888bc3887880d262f247233. This reverts commit 1a356b10c511cc8735ecc9d67c0a98662f587b37. --- Makefile | 6 +-- rust-polytreewm/src/api/mod.rs | 1 - rust-polytreewm/src/api/xbase.rs | 23 --------- rust-polytreewm/src/lib.rs | 2 - rust-polytreewm/src/xbase.rs | 85 -------------------------------- src/xbase.c | 72 +++++++++++++++++++++++++++ 6 files changed, 75 insertions(+), 114 deletions(-) delete mode 100644 rust-polytreewm/src/api/xbase.rs delete mode 100644 rust-polytreewm/src/xbase.rs create mode 100644 src/xbase.c diff --git a/Makefile b/Makefile index 407976d..bba31e4 100644 --- a/Makefile +++ b/Makefile @@ -24,8 +24,7 @@ RUST_APIS = \ src/constraints.h \ src/geom.h \ src/helpers.h \ - src/settings.h \ - src/xbase.h + src/settings.h MODULES_SRC = \ src/drw.c \ @@ -36,7 +35,8 @@ MODULES_SRC = \ src/spawn.c \ src/state.c \ src/unit.c \ - src/util.c + src/util.c \ + src/xbase.c DWM_SRC = \ src/dwm/bar.c \ diff --git a/rust-polytreewm/src/api/mod.rs b/rust-polytreewm/src/api/mod.rs index b882792..204bb83 100644 --- a/rust-polytreewm/src/api/mod.rs +++ b/rust-polytreewm/src/api/mod.rs @@ -2,4 +2,3 @@ mod atoms; mod constraints; mod geom; mod settings; -mod xbase; diff --git a/rust-polytreewm/src/api/xbase.rs b/rust-polytreewm/src/api/xbase.rs deleted file mode 100644 index ed022c0..0000000 --- a/rust-polytreewm/src/api/xbase.rs +++ /dev/null @@ -1,23 +0,0 @@ -use crate::*; - -use std::alloc::{alloc, dealloc, Layout}; -use std::ffi::CStr; -use std::os::raw::*; - -#[no_mangle] -unsafe extern "C" fn xbase_new( - program_title: *const c_char, - _x_error_handler: xbase::ErrorHandler, -) -> *mut Xbase { - let program_title = CStr::from_ptr(program_title).to_str().unwrap(); - let layout = Layout::new::(); - let ptr = alloc(layout) as *mut Xbase; - *ptr = Xbase::new(program_title.to_string() /*, x_error_handler*/).unwrap(); - ptr -} - -#[no_mangle] -unsafe extern "C" fn xbase_delete(xbase: *mut Xbase) { - let layout = Layout::new::(); - dealloc(xbase as *mut u8, layout); -} diff --git a/rust-polytreewm/src/lib.rs b/rust-polytreewm/src/lib.rs index 4cae656..39948a3 100644 --- a/rust-polytreewm/src/lib.rs +++ b/rust-polytreewm/src/lib.rs @@ -1,7 +1,6 @@ mod api; mod atoms; mod constraints; -mod xbase; pub mod geom; pub mod settings; @@ -9,4 +8,3 @@ pub mod unit; pub use atoms::Atoms; pub use settings::Settings; -pub use xbase::Xbase; diff --git a/rust-polytreewm/src/xbase.rs b/rust-polytreewm/src/xbase.rs deleted file mode 100644 index ca9c1ea..0000000 --- a/rust-polytreewm/src/xbase.rs +++ /dev/null @@ -1,85 +0,0 @@ -use crate::geom; -use crate::Atoms; - -use std::os::raw::*; -use std::ptr::null; - -use x11::xlib::{self, Display}; - -pub type ErrorHandler = - unsafe extern "C" fn(*mut Display, *mut xlib::XErrorEvent) -> c_int; - -pub struct Xbase { - program_title: String, - x_display: *mut Display, - x_screen: c_int, - x_root: c_ulong, - screen_sizes: geom::Sizes, - // x_error: Option, - atoms: Atoms, -} - -impl Xbase { - pub fn new( - program_title: String, - // x_error_handler: ErrorHandler, - ) -> Result> { - unsafe { - if xlib::XSupportsLocale() == 0 { - return Err("no locale support in X".into()); - } - - let x_display = xlib::XOpenDisplay(null()); - if x_display.is_null() { - return Err("cannot open X display".into()); - } - - let x_screen = xlib::XDefaultScreen(x_display); - let x_root = xlib::XRootWindow(x_display, x_screen); - - let screen_sizes = geom::Sizes::new( - xlib::XDisplayWidth(x_display, x_screen), - xlib::XDisplayHeight(x_display, x_screen), - ); - - // let x_error = xlib::XSetErrorHandler(Some(x_error_wm_check)); - - xlib::XSelectInput( - x_display, - xlib::XDefaultRootWindow(x_display), - xlib::SubstructureRedirectMask, - ); - xlib::XSync(x_display, xlib::False); - // xlib::XSetErrorHandler(Some(x_error_handler)); - xlib::XSync(x_display, xlib::False); - - let atoms = Atoms::create(x_display); - - Ok(Self { - program_title, - x_display, - x_screen, - x_root, - screen_sizes, - // x_error, - atoms, - }) - } - } -} - -impl Drop for Xbase { - fn drop(&mut self) { - unsafe { xlib::XCloseDisplay(self.x_display) }; - } -} -/* -unsafe extern "C" fn x_error_wm_check( - _display: *mut Display, - _x_error_event: *mut xlib::XErrorEvent, -) -> c_int { - // FIXME: - // panic!("another window manager is already running"); - 0 -} -*/ diff --git a/src/xbase.c b/src/xbase.c new file mode 100644 index 0000000..1f6a448 --- /dev/null +++ b/src/xbase.c @@ -0,0 +1,72 @@ +#include "xbase.h" + +#include "logger.h" + +#include +#include + +/* Startup Error handler to check if another + * window manager is already running. */ +static int x_error_wm_check(Display*, XErrorEvent*); + +Xbase xbase_new( + const char *const program_title, + const XErrorHandler x_error_handler +) { + if (!XSupportsLocale()) warning("no locale support in X"); + + Xbase xbase = malloc(sizeof(struct Xbase)); + if (!xbase) fatal_perror("cannot allocate xbase"); + + if (!(xbase->program_title = strdup(program_title))) { + fatal_perror("no program title is given"); + } + + if (!(xbase->x_display = XOpenDisplay(NULL))) { + fatal("cannot open X display"); + } + + xbase->x_screen = DefaultScreen(xbase->x_display); + xbase->x_root = RootWindow(xbase->x_display, xbase->x_screen); + xbase->screen_sizes = sizes_create_from_args( + DisplayWidth(xbase->x_display, xbase->x_screen), + DisplayHeight(xbase->x_display, xbase->x_screen) + ); + + if (!(xbase->x_error = XSetErrorHandler(x_error_wm_check))) { + fatal("no X error handler is given"); + } + + // This causes an error if some other window manager is running + XSelectInput( + xbase->x_display, + DefaultRootWindow(xbase->x_display), + SubstructureRedirectMask + ); + XSync(xbase->x_display, False); + XSetErrorHandler(x_error_handler); + XSync(xbase->x_display, False); + + if (!(xbase->atoms = atoms_create(xbase->x_display))) { + fatal("cannot create atoms"); + } + + return xbase; +} + +void xbase_delete(const Xbase xbase) +{ + // TODO: maybe we should assert here + if (xbase == NULL) return; + + ATOMS_DELETE(xbase->atoms); + XCloseDisplay(xbase->x_display); + free(xbase); +} + +int x_error_wm_check( + __attribute__((unused)) Display *const x_display, + __attribute__((unused)) XErrorEvent *const x_error_event +) { + fatal("another window manager is already running"); +}