From 83b7d0cb4f30c95ce6f27d2c0944727d75eb6e5e Mon Sep 17 00:00:00 2001 From: Matias Linares Date: Sun, 22 Nov 2015 20:02:10 -0300 Subject: Death to the threads. All the socket stuff is done syncing it with select calls so we can get either a X11 event or a Socket event. Also cleanup the C mess, it's done all in rust now :). --- src/safe_x11/Makefile | 7 ------- src/safe_x11/event.rs | 33 --------------------------------- src/safe_x11/mod.rs | 24 +++++++++++++++++++++++- src/safe_x11/safex11.c | 32 -------------------------------- src/safe_x11/safex11.h | 7 ------- 5 files changed, 23 insertions(+), 80 deletions(-) delete mode 100644 src/safe_x11/Makefile delete mode 100644 src/safe_x11/event.rs delete mode 100644 src/safe_x11/safex11.c delete mode 100644 src/safe_x11/safex11.h (limited to 'src/safe_x11') diff --git a/src/safe_x11/Makefile b/src/safe_x11/Makefile deleted file mode 100644 index 4ea8a63..0000000 --- a/src/safe_x11/Makefile +++ /dev/null @@ -1,7 +0,0 @@ -all: - $(CC) -c -fPIC safex11.c -o safex11.o -lX11 - $(CC) -shared -o libsafex11.so safex11.o -lX11 - -clean: - rm safex11.o - rm *.so* diff --git a/src/safe_x11/event.rs b/src/safe_x11/event.rs deleted file mode 100644 index 8a4bc32..0000000 --- a/src/safe_x11/event.rs +++ /dev/null @@ -1,33 +0,0 @@ -use x11::xlib::{ - XConnectionNumber, - Display, - XEvent, -}; - -use std::mem::uninitialized; - -use libc::c_int; - -#[link(name = "safex11")] -extern { - /// Get an XEvent if there're one on the queue or wait a little before continue. - fn select_next_event(display: *mut Display, x11_fd: c_int, ev: *mut XEvent) -> c_int; -} - -/// Get the file descriptor for the XServer -pub fn x11_fd(display: *mut Display) -> c_int { - unsafe { XConnectionNumber(display) } -} - -/// Get the next event from the xserver. This call will not block forever -/// (like XNextEvent), instead it will wait for a certain time (1 second -/// for now, but it can change) so we're not blocking the socket interface -/// on the main thread. -pub fn next_xevent(display: *mut Display, fd: c_int) -> XEvent { - unsafe { - let mut last_event: XEvent = uninitialized(); - select_next_event(display, fd, &mut last_event) as i32; - last_event - } -} - diff --git a/src/safe_x11/mod.rs b/src/safe_x11/mod.rs index 06c7b3c..0283966 100644 --- a/src/safe_x11/mod.rs +++ b/src/safe_x11/mod.rs @@ -6,11 +6,15 @@ use x11::xlib; use x11::xlib::{ Display, + XConnectionNumber, Screen, Cursor, XDefaultRootWindow, XQueryTree, + XEvent, + XNextEvent, + // Windows Window, }; @@ -23,9 +27,9 @@ use std::error; use std::mem::uninitialized; use std::slice; use std::fmt; +use libc::c_int; pub mod window; -pub mod event; #[derive(Debug)] pub struct XSafeError<'a> { @@ -89,6 +93,24 @@ pub fn close_display(display: *mut Display) { unsafe { xlib::XCloseDisplay(display); } } +/// Get the file descriptor for the XServer +pub fn x11_fd(display: *mut Display) -> c_int { + unsafe { XConnectionNumber(display) } +} + +/// Get the next event from the xserver. This call will not block forever +/// (like XNextEvent), instead it will wait for a certain time (1 second +/// for now, but it can change) so we're not blocking the socket interface +/// on the main thread. +pub fn next_xevent(display: *mut Display) -> XEvent { + unsafe { + let mut last_event: XEvent = uninitialized(); + XNextEvent(display, &mut last_event); + last_event + } +} + + /// Grab pointer buttons. /// /// # Example diff --git a/src/safe_x11/safex11.c b/src/safe_x11/safex11.c deleted file mode 100644 index e4f87d8..0000000 --- a/src/safe_x11/safex11.c +++ /dev/null @@ -1,32 +0,0 @@ -#include "safex11.h" -#include -#include -#include - -int select_next_event(Display *display, int x11_fd, XEvent *retval) -{ - fd_set in_fds; - struct timeval tv; - XEvent ev; - /* check if there're some events on the queue first of all. */ - if(XPending(display) > 0) - goto EVENT_QUEUED; - - FD_ZERO(&in_fds); - FD_SET(x11_fd, &in_fds); - - /* one second */ - tv.tv_usec = 0; - tv.tv_sec = 1; - - /* Wait for X Event or a Timer */ - if(select(x11_fd+1, &in_fds, 0, 0, &tv)) - goto EVENT_QUEUED; - - return 0; - -EVENT_QUEUED: - XNextEvent(display, &ev); - *retval = ev; - return 1; -} diff --git a/src/safe_x11/safex11.h b/src/safe_x11/safex11.h deleted file mode 100644 index bbf4e80..0000000 --- a/src/safe_x11/safex11.h +++ /dev/null @@ -1,7 +0,0 @@ -#ifndef _WM_EVENT_H_ -#define _WM_EVENT_H_ -#include - -int select_next_event(Display *display, int x11_fd, XEvent *retval); - -#endif -- cgit v1.2.3-70-g09d2