All pastes #504091 Raw Edit

Something

public text v1 · immutable
·published 2007-05-23 02:39 UTC
rendered paste body
module gui.gui;

import bcd.xcb.xcb;
import std.stdio;

class GUI{
	xcb_connection_t* conn;
	xcb_screen_t* screen;
	
	Button[xcb_window_t] buttons;
	
	//xcb_get_geometry_reply_t attr;
	xcb_generic_event_t *event;
	//int xdiff, ydiff, xorig, yorig, xpress, ypress;
	//ubyte func;
		
	this(){
		int screen_num;
		conn = xcb_connect(null, &screen_num);
		
		/* Get the preferred screen. */
		xcb_screen_iterator_t screen_iter = xcb_setup_roots_iterator(xcb_get_setup(conn));
		while(screen_num--)
			xcb_screen_next(&screen_iter);
		screen = screen_iter.data;
	}
	
	Window addWindow(uint width, uint height){
		return new Window(screen.root, this, 0, 0, width, height);
	}
	
	void loop(){
		loop:
		
		event = xcb_wait_for_event(conn);
		switch(event.response_type){
			case XCB_BUTTON_PRESS:
				break;
			case XCB_BUTTON_RELEASE:
				xcb_button_press_event_t* e = cast(xcb_button_release_event_t* )event;
				if(e.event in buttons){
					buttons[e.event].Operation;
				}
				break;
			default:
				break;
		}
		goto loop;
	}
}

struct geometry{
	uint width;
	uint height;
}

class Window{
	xcb_window_t id;
	GUI gui;
	
	this(xcb_window_t parent, GUI g, int x, int y, uint width, uint height){
		gui = g;
		id = xcb_generate_id(gui.conn);
			
		xcb_create_window(gui.conn,                          /* connection    */
			0,                             /* depth         */
			id,                        /* window id     */
			parent,                   /* parent window */
			0, 0,                          /* x, y          */
			width, height,                /* width, height */
			0,                             /* border_width  */
			XCB_WINDOW_CLASS_INPUT_OUTPUT, /* class         */
			gui.screen.root_visual,            /* visual        */
			0, /* masks */
			null);
			//cast(uint*)[pixmap, XCB_EVENT_MASK_EXPOSURE]);
	}
	
	void map(){
		xcb_map_window(gui.conn, id);
		xcb_flush(gui.conn);
	}
	
	void unmap(){
		writefln("1");
	}
	
	void resize(uint width, uint height){
		xcb_configure_window(gui.conn, id, XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT,
			cast(uint*)[width, height]);
	}
	
	geometry getGeometry(){
		xcb_get_geometry_reply_t* attr = xcb_get_geometry_reply(gui.conn, xcb_get_geometry(gui.conn, id), null);
		geometry g;
		g.width = attr.width;
		g.height = attr.height;
		return g;
	}
	
	Container addContainer(int x1, int y1, uint width, uint height){
		return new Container(this, x1, y1, width, height);
	}
	Container addContainer(float x1, float y1, float x2, float y2){
		return new Container(this, x1, y1, x2, y2);
	}
	Button addButton(int x1, int y1, uint width, uint height){
		return new Button(this, x1, y1, width, height);
	}
	Button addButton(float x1, float y1, float x2, float y2){
		return new Button(this, x1, y1, x2, y2);
	}
}

class Container : Window{
	bool relative = false;
	Window parent;
	float w1,w2,h1,h2;
	
	this(Window p, int x1, int y1, uint width, uint height){
		gui = p.gui;
		parent = p;
		super(parent.id, p.gui, x1, y1, width, height);
	}
	this(Window p, float x1, float y1, float x2, float y2){
		relative = true;
		
		w1 = x1;
		w2 = x2;
		h1 = y1;
		h2 = y2;
		
		geometry geom = parent.getGeometry();
		int x3, y3;
		x3 = cast(int)(geom.width * x1);
		y3 = cast(int)(geom.height * y1);
		uint height,width;
		width = cast(uint)(geom.width*x2 - x3);
		height = cast(uint)(geom.height*y2 - y3);
		this(p, x3, y3, width, height);
	}
}

class Button : Container{
	void delegate() Operation;
	this(Window p, int x1, int y1, uint width, uint height){
		super(p, x1, y1, width, height);
		p.gui.buttons[id] = this;
	}
	this(Window p, float x1, float y1, float x2, float y2){
		super(p, x1, y1, x2, y2);
		p.gui.buttons[id] = this;
	}
}

void main(){
	GUI gui = new GUI();
	
	Window w = gui.addWindow(150,150);
	
	Button b = w.addButton(.1,.1,.9,.9);
	
	b.Operation = &w.unmap;
	
	w.map();
	
	gui.loop();
}