/* tag: openbios qt user interface
 *
 * Copyright (C) 2003-2004 Stefan Reinauer
 *
 * See the file "COPYING" for further information about
 * the copyright and warranty status of this work.
 */


extern "C" {
#include <pthread.h>
#include <unistd.h>
#include "unix/plugins.h"
#include "unix/plugin_pci.h"
}
#include "gui-qt.h"

#define DEBUG

volatile unsigned char * fb=0;
volatile int gui_running=0;

typedef struct {
	int argc;
	char **argv;
} threaddata;

void *gui_thread(void *ptr)
{
	threaddata *td=(threaddata *)ptr;

	QApplication a(td->argc, td->argv);
	FrameBufferWidget w;

	a.setMainWidget(&w);
	w.show();

	fb=w.getFrameBuffer();

	gui_running=-1;
	a.exec();
	gui_running=0;

	return 0;
}

extern "C" {
extern int plugin_qt_init(void);
int plugin_qt_init(void)
{
	pthread_t mythread;
	char *args[]={ "plugin_qt" };
	threaddata mytd = { 1, args };

#ifdef DEBUG
	printf("Initializing \"framebuffer\" plugin...");
#endif
	pthread_create(&mythread, NULL, gui_thread, &mytd);
	while (!fb)
		usleep(20);

#if 0

	/* now we have the framebuffer start address.
	 * updating pci config space to reflect this
	 */
#if (BITS > 32)
	*(u32 *)(pci_config_space+0x14)=(u32)((unsigned long)fb>>32);
#else
	*(u32 *)(pci_config_space+0x14)=0;
#endif
	*(u32 *)(pci_config_space+0x10)=(u32)((unsigned long)fb&0xffffffff);

	/* next is to write the rom address. We write that at a random
	 * address in pci config space for now.
	 */
#if (BITS > 32)
	*(u32 *)(pci_config_space+0x34)=(u32)((unsigned long)qt_fcode>>32);
#else
	*(u32 *)(pci_config_space+0x34)=0;
#endif
	*(u32 *)(pci_config_space+0x30)=(u32)((unsigned long)qt_fcode&0xffffffff);

	/* FIXME: we need to put the fcode image for this
	 * device to the rom resource, once it exists
	 */

	/* register pci device to be available to beginagain */
	pci_register_device(0, 2, 0, pci_config_space);
#endif
#ifdef DEBUG
	printf("done.\n");
#endif
	return 0;
}

}
