#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <i86.h>
#include <sys/mman.h>
#include <sys/console.h>
#include <X.h>
#include "xf86.h"
#include "xf86Priv.h"
#include "xf86_OSlib.h"
struct _console_ctrl *QNX_con_ctrl = NULL;
unsigned long QNX_con_mask = 0;
unsigned long QNX_con_bits = 0;
pid_t QNX_console_proxy = -1;
int QNX_our_console = -1;
void
xf86UseMsg()
{
ErrorF("No QNX-specific usage options available at this time\n");
return;
}
int
xf86ProcessArgument(argc, argv, i)
int argc;
char **argv;
int i;
{
return 0;
}
void
xf86OpenConsole()
{
struct _console_info info;
unsigned event;
int default_console = FALSE;
char con_name[32];
int active;
ErrorF("xf86OpenConsole\n");
if(QNX_con_ctrl == NULL) {
xf86Info.consoleFd = fileno(stdout);
if((QNX_con_ctrl = console_open (fileno(stdout), O_RDWR)) == NULL){
if (( xf86Info.consoleFd = open("/dev/con1", O_RDWR)) < 0){
FatalError("xf86OpenConsole: could not open console driver\n");
return;
}
if((QNX_con_ctrl =
console_open (xf86Info.consoleFd, O_RDWR)) == NULL){
FatalError("xf86OpenConsole: could not open console\n");
}
default_console = TRUE;
}
if(QNX_con_ctrl && console_info(QNX_con_ctrl, 0, &info) == 0 ) {
if( info.type != _CON_TYPE_STANDARD ) {
FatalError("xf86OpenConsole: console is not a standard text console\n");
return;
}
}
else {
FatalError("xf86OpenConsole: Error querying console\n");
return;
}
}
if(qnx_name_locate(0, "/qnx/crt", 0, NULL) != -1) {
FatalError("xf86OpenConsole: Photon has already grabbed the display\n");
return;
}
fclose (stdout);
if (QNX_our_console < 0) {
QNX_our_console = console_active(QNX_con_ctrl, -1);
}
else {
console_arm(QNX_con_ctrl, QNX_our_console, -1, _CON_EVENT_ACTIVE);
while ((active = console_active(QNX_con_ctrl, -1)) !=
QNX_our_console) {
sleep(2);
ErrorF("Waiting for our console to become active!\n");
}
}
QNX_con_mask = CONSOLE_INVISIBLE | CONSOLE_NOSWITCH;
QNX_con_bits = console_ctrl (QNX_con_ctrl, QNX_our_console,
QNX_con_mask, QNX_con_mask);
ErrorF("xf86OpenConsole: Locked console %d\n", QNX_our_console);
if(default_console) {
close(xf86Info.consoleFd);
sprintf(con_name, "/dev/con%d", QNX_our_console);
xf86Info.consoleFd = open(con_name, O_RDWR);
ErrorF("xf86OpenConsole: reopened console %d\n", QNX_our_console);
}
if(QNX_console_proxy == -1){
if((QNX_console_proxy = qnx_proxy_attach(0, 0, 0, -1)) == -1){
ErrorF("xf86OpenConsole: Could not create proxy for VT switching\n");
}
}
return;
}
void
xf86CloseConsole()
{
unsigned bits;
int font;
ErrorF("xf86CloseConsole\n");
if(QNX_con_ctrl == NULL) return;
QNX_con_bits &= ~QNX_con_mask;
bits = console_ctrl(QNX_con_ctrl, 0, QNX_con_bits, QNX_con_mask);
ErrorF("xf86CloseConsole: unlocked console\n");
#if 0
malloc_dump(2);
#endif
return;
}