87 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
			
		
		
	
	
			87 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			C
		
	
	
	
/* Copyright 2001-2003 by Norbert Freudemann, David Frese */
 | 
						|
 | 
						|
#include "xlib.h"
 | 
						|
 | 
						|
#define scx_extract_queued_mode(x) S48_EXTRACT_ENUM(x, "scx-queued-mode")
 | 
						|
 | 
						|
s48_value scx_Events_Queued(s48_value display, s48_value mode) {
 | 
						|
  int r = XEventsQueued(scx_extract_display(display),
 | 
						|
			scx_extract_queued_mode(mode));
 | 
						|
  return s48_enter_integer(r);
 | 
						|
}
 | 
						|
 | 
						|
s48_value scx_Events_Pending(s48_value display) {
 | 
						|
  return s48_enter_integer(XPending(scx_extract_display(display)));
 | 
						|
}
 | 
						|
 | 
						|
s48_value scx_Next_Event(s48_value display) {
 | 
						|
  XEvent e;
 | 
						|
  XNextEvent(scx_extract_display(display), &e);
 | 
						|
  return scx_enter_event(&e);
 | 
						|
}
 | 
						|
 | 
						|
s48_value scx_Peek_Event(s48_value display) {
 | 
						|
  XEvent e;
 | 
						|
  XPeekEvent(scx_extract_display(display), &e);
 | 
						|
  return scx_enter_event(&e);
 | 
						|
}
 | 
						|
 | 
						|
s48_value scx_Get_Motion_Events(s48_value display, s48_value window,
 | 
						|
				s48_value from, s48_value to) {
 | 
						|
  int n,i;
 | 
						|
  XTimeCoord *p = XGetMotionEvents(scx_extract_display(display),
 | 
						|
				   scx_extract_window(window),
 | 
						|
				   scx_extract_time(from),
 | 
						|
				   scx_extract_time(to),
 | 
						|
				   &n);
 | 
						|
  s48_value l = S48_NULL, t = S48_FALSE;
 | 
						|
  S48_DECLARE_GC_PROTECT(2);
 | 
						|
 | 
						|
  S48_GC_PROTECT_2(l, t);
 | 
						|
  for (i = n-1; i >= 0; i--) {
 | 
						|
    t = s48_cons(s48_enter_fixnum(p[i].x), s48_enter_fixnum(p[i].y));
 | 
						|
    t = s48_cons(scx_enter_time(p[i].time), t);
 | 
						|
    l = s48_cons(t, l);
 | 
						|
  }
 | 
						|
  XFree((char*)p);
 | 
						|
  S48_GC_UNPROTECT();
 | 
						|
 | 
						|
  return l;
 | 
						|
}
 | 
						|
 | 
						|
s48_value scx_Send_Event(s48_value display, s48_value window,
 | 
						|
			 s48_value propagate,
 | 
						|
			 s48_value event_mask, s48_value event) {
 | 
						|
  XEvent e;
 | 
						|
  scx_extract_event(event, &e);
 | 
						|
  
 | 
						|
  Status r = XSendEvent(scx_extract_display(display),
 | 
						|
			scx_extract_window(window),
 | 
						|
			S48_EXTRACT_BOOLEAN(propagate),
 | 
						|
			scx_extract_event_mask(event_mask),
 | 
						|
			&e);
 | 
						|
  return r ? S48_TRUE : S48_FALSE;
 | 
						|
}
 | 
						|
 | 
						|
s48_value scx_add_pending_channel(channel) {
 | 
						|
  int socket_fd;
 | 
						|
  S48_CHECK_CHANNEL(channel);
 | 
						|
  socket_fd = S48_UNSAFE_EXTRACT_FIXNUM(S48_UNSAFE_CHANNEL_OS_INDEX(channel));
 | 
						|
 | 
						|
  if (! s48_add_pending_fd(socket_fd, 1)) // 1 for: yes, is input 
 | 
						|
    s48_raise_out_of_memory_error();
 | 
						|
 | 
						|
  return S48_UNSPECIFIC;
 | 
						|
}
 | 
						|
 | 
						|
void scx_init_event(void) {
 | 
						|
  S48_EXPORT_FUNCTION(scx_Events_Queued);
 | 
						|
  S48_EXPORT_FUNCTION(scx_Events_Pending);
 | 
						|
  S48_EXPORT_FUNCTION(scx_Next_Event);
 | 
						|
  S48_EXPORT_FUNCTION(scx_Peek_Event);
 | 
						|
  S48_EXPORT_FUNCTION(scx_Get_Motion_Events);
 | 
						|
  S48_EXPORT_FUNCTION(scx_Send_Event);
 | 
						|
  S48_EXPORT_FUNCTION(scx_add_pending_channel);
 | 
						|
}
 | 
						|
  
 |