#include "mainwindow.h"
#include <QWindow>
#include <QObject>
#define HEIGHT 708
#define FTP_HEIGHT 60
#define WIDTH 196
#include <pthread.h>
#include <mqueue.h>
#include <QtWidgets/qwidget.h>
#include <qwindow.h>
#include <qwindowdefs.h>
#define HELLOTEST "/home/Documents/5.1example/appr2/rasterwindow-build-Desktop-Release/rasterwindow"
void *wait_for_id(void * arg);
extern MainWindow *Container;
MainWindow
::MainWindow(QWidget *parent
){
qDebug()<< "MainWindow";
ApplicationProcess = NULL;
getDisplayProperties(&max_width,&max_height);
setWindowMinimumSizes(max_width - 300,HEIGHT - 100);
setWindowMaximumSizes(max_width,max_height);
createActions();
createMenus();
mainwindow->setMinimumSize(min_width,min_height);
mainwindow->setMaximumSize(max_width,max_height);
setCentralWidget(mainwindow);
pl.setColor(pl.Background,Qt::white);
mainwindow->setAutoFillBackground(true);
mainwindow->setPalette(pl);
appwindow = new ApplicationWindow (min_width - WIDTH ,min_height - (FTP_HEIGHT + 105),max_width - WIDTH,max_height - (100 +FTP_HEIGHT ) );
display = appwindow->createApplicationWindow();
vWidget->setLayout(vLayout);
vLayout->addWidget(display);
vLayout->setSpacing(1);
display->setAutoFillBackground(true);
mainLayout ->addWidget(vWidget);
mainwindow ->setLayout(mainLayout);
vLayout->setContentsMargins(0,0,0,0);
display->setContentsMargins(0,0,0,0);
mainwindow->setContentsMargins(0,0,0,0);
pthread_t tid;
if (-1 == pthread_create(&tid,NULL,wait_for_id,NULL)){
perror("pthread_create");
}else{
qDebug()<<"thread create success";
}
}
void MainWindow::getDisplayProperties(int* width,int* height )
{
int x = 0,y = 0;
rec = D.geometry();
rec.getRect(&x,&y,width,height);
}
void MainWindow::setWindowMinimumSizes(int min_width,int min_height)
{
this->min_width = min_width;
this->min_height = min_height;
qDebug()<<"Minimum Height is"<<min_height;
}
void MainWindow::setWindowMaximumSizes(int max_width,int max_height)
{
this->max_width = max_width;
this->max_height = max_height;
}
void MainWindow::createActions()
{
HelloTestAct
= new QAction(tr
("&HelloTest"),
this);
connect(HelloTestAct,SIGNAL(triggered()),this,SLOT(Launch_Hello_Test()));
connect(this,SIGNAL(send_winid(int)),this,SLOT(launch_app(int)));
}
void MainWindow::Launch_Hello_Test()
{
qDebug() << "Launch_Hello_Test";
Container->process = ApplicationProcess;
connect( ApplicationProcess,SIGNAL(readyReadStandardError()),this,SLOT(readStandardError()));
connect( ApplicationProcess,SIGNAL(readyReadStandardOutput()),this,SLOT(readStandardOutput()));
connect(ApplicationProcess,
SIGNAL(finished
(int,
QProcess::ExitStatus)),
this,
SLOT(finish
(int,
QProcess::ExitStatus)));
ApplicationProcess->start(executable, arguments);
}
void MainWindow :: readStandardOutput()
{
if(ApplicationProcess){
Output = ApplicationProcess->readAllStandardOutput();
qDebug()<<Output;
}else{
qDebug()<<"Problem StdOut";
}
}
void MainWindow :: readStandardError()
{
if(ApplicationProcess){
Output = ApplicationProcess->readAllStandardError();
qDebug()<<Output;
}else{
qDebug()<<"Problem StdErr";
}
}
void * wait_for_id( void *arg)
{
struct mq_attr mqAttr;
char buffer[1024];
mqd_t msgid;
int ret_val;
int winid;
mqAttr.mq_maxmsg = 10;
mqAttr.mq_msgsize = 512;
if(mq_unlink("/embed6")<0)
qDebug()<<"Init unable to unlink";
else
qDebug()<<"Init unlink success";
msgid = mq_open("/embed6",O_RDWR|O_CREAT,0777,&mqAttr);
if(-1 == msgid){
perror("mq_open");
}else{
qDebug()<< "mq_open success";
ret_val = mq_receive(msgid,buffer,sizeof(buffer),NULL);
if(-1 == ret_val) {
qDebug() << "mq_receive ret_val(Err) = "<< ret_val;
}
else {
qDebug() << "window id received is :"<< buffer;
mq_close(msgid);
winid = atoi(buffer);
Container->embed_window(winid);
if(mq_unlink("/embed6")<0)
qDebug()<<"unable to unlink";
else
qDebug()<<"unlink success";
}
}
}
void MainWindow ::embed_window(int id)
{
qDebug() << "embed_window";
emit send_winid(id);
}
void MainWindow::launch_app(int id)
{
WId winid = (WId) id;
qDebug()<<"In launch_app win id is "<< id;
display->setLayout(vl);
window = createWindowContainer(QWindow::fromWinId(winid),display,\
Qt::WindowMinMaxButtonsHint|Qt::WindowCloseButtonHint
|Qt::WindowCancelButtonHint
|Qt::FramelessWindowHint);
vl -> addWidget(window);
qDebug()<<"addWidget";
}
void MainWindow
::finish(int,
QProcess::ExitStatus) {
qDebug()<<"finish";
}
void MainWindow::createMenus()
{
fileMenu = menuBar()->addMenu(tr("&File"));
fileMenu->addAction(HelloTestAct);
}
MainWindow :: ~MainWindow()
{
}