
char isDown = 0;



void mouseClick(int button, int x, int y) {

	//Display *display = XOpenDisplay(NULL);

	//XEvent event;
	
	XWarpPointer(display, None, root_window, 0, 0, 0, 0, x, y);
	XFlush(display);
	XSendEvent(display, None, True, 0xfff, &event);
	
	if(display == NULL) {
		fprintf(stderr, "Errore nell'apertura del Display !!!\n");
		exit(EXIT_FAILURE);
	}
	
	memset(&event, 0x00, sizeof(event));
	
	
	
	event.type = ButtonPress;
	event.xbutton.button = button;
	event.xbutton.same_screen = True;
	
	XQueryPointer(display, RootWindow(display, DefaultScreen(display)), &event.xbutton.root, &event.xbutton.window, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
	
	event.xbutton.subwindow = event.xbutton.window;
	
	while(event.xbutton.subwindow) {
		event.xbutton.window = event.xbutton.subwindow;
		
		XQueryPointer(display, event.xbutton.window, &event.xbutton.root, &event.xbutton.subwindow, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
	}
	
	
	if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Errore nell'invio dell'evento !!!\n");
	
	XFlush(display);
	usleep(100000);
	
	event.type = ButtonRelease;
	event.xbutton.state = 0x100;
	if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Errore nell'invio dell'evento !!!\n");
	
	XFlush(display);
//	XCloseDisplay(display);
}






void mouseDown(int button) {
	//Display *display = XOpenDisplay(NULL);

	//XEvent event;
	/*
	XWarpPointer(display, None, root_window, 0, 0, 0, 0, x, y);
	XFlush(display);
	XSendEvent(display, None, True, 0xfff, &event);
	
	if(display == NULL) {
		fprintf(stderr, "Errore nell'apertura del Display !!!\n");
		exit(EXIT_FAILURE);
	}
	*/

	if (!isDown) {
		std::cout << "[down-" << button << "]" << std::endl;
		memset(&event, 0x00, sizeof(event));
	
	
	
		event.type = ButtonPress;
		event.xbutton.button = button;
		event.xbutton.same_screen = True;
	
		XQueryPointer(display, RootWindow(display, DefaultScreen(display)), &event.xbutton.root, &event.xbutton.window, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
	
		event.xbutton.subwindow = event.xbutton.window;
	
		while(event.xbutton.subwindow) {
			event.xbutton.window = event.xbutton.subwindow;
		
			XQueryPointer(display, event.xbutton.window, &event.xbutton.root, &event.xbutton.subwindow, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
		}
	
	
		if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Errore nell'invio dell'evento !!!\n");
	
		XFlush(display);
		isDown = 1;
		//usleep(100000);
	
	
	//	XCloseDisplay(display);
	}
}





void mouseUp(int button) {
	if (isDown) {
		std::cout << "[up]" << std::endl;
	
		memset(&event, 0x00, sizeof(event));
	
	
	
		event.type = ButtonRelease;
		event.xbutton.button = button;
		event.xbutton.same_screen = True;
	
		XQueryPointer(display, RootWindow(display, DefaultScreen(display)), &event.xbutton.root, &event.xbutton.window, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
	
		event.xbutton.subwindow = event.xbutton.window;
	
		while(event.xbutton.subwindow) {
			event.xbutton.window = event.xbutton.subwindow;
		
			XQueryPointer(display, event.xbutton.window, &event.xbutton.root, &event.xbutton.subwindow, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
		}
	
	
		if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Errore nell'invio dell'evento !!!\n");
	
		XFlush(display);

	//	XCloseDisplay(display);
		isDown = 0;
	}
}








void mouseMove(int x, int y) {

	//Display *display = XOpenDisplay(NULL);

	//XEvent event;
	
	XWarpPointer(display, None, root_window, 0, 0, 0, 0, x, y);
	XFlush(display);
	//XSendEvent(display, None, True, 0xfff, &event);
	
	if(display == NULL) {
		fprintf(stderr, "Errore nell'apertura del Display !!!\n");
		exit(EXIT_FAILURE);
	}
/*	
	memset(&event, 0x00, sizeof(event));
	
	
	
	event.type = ButtonPress;
	event.xbutton.button = button;
	event.xbutton.same_screen = True;
	
	XQueryPointer(display, RootWindow(display, DefaultScreen(display)), &event.xbutton.root, &event.xbutton.window, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
	
	event.xbutton.subwindow = event.xbutton.window;
	
	while(event.xbutton.subwindow) {
		event.xbutton.window = event.xbutton.subwindow;
		
		XQueryPointer(display, event.xbutton.window, &event.xbutton.root, &event.xbutton.subwindow, &event.xbutton.x_root, &event.xbutton.y_root, &event.xbutton.x, &event.xbutton.y, &event.xbutton.state);
	}
	
	
	if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Errore nell'invio dell'evento !!!\n");
	
	XFlush(display);
	usleep(100000);
	
	event.type = ButtonRelease;
	event.xbutton.state = 0x100;
	if(XSendEvent(display, PointerWindow, True, 0xfff, &event) == 0) fprintf(stderr, "Errore nell'invio dell'evento !!!\n");
	
	XFlush(display);
//	XCloseDisplay(display);
*/


}

