You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
493 lines
11 KiB
493 lines
11 KiB
#include "pwidget.h"
|
|
#include "commands.h"
|
|
|
|
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
#include <stdlib.h>
|
|
|
|
#include <qpixmap.h>
|
|
|
|
PWidget::PWidget(PObject *)
|
|
: PObject()
|
|
{
|
|
// kdDebug(5008) << "PWidget constructor called" << endl;
|
|
|
|
w = 0;
|
|
setWidget(0);
|
|
|
|
eventList[0] = &PWidget::eventNone;
|
|
eventList[1] = &PWidget::eventTimer;
|
|
eventList[2] = &PWidget::eventMouse;
|
|
eventList[3] = &PWidget::eventMouse;
|
|
eventList[4] = &PWidget::eventMouse;
|
|
eventList[5] = &PWidget::eventMouse;
|
|
eventList[6] = &PWidget::eventKey;
|
|
eventList[7] = &PWidget::eventKey;
|
|
eventList[8] = &PWidget::eventFocus;
|
|
eventList[9] = &PWidget::eventFocus;
|
|
eventList[10] = &PWidget::eventFocus;
|
|
eventList[11] = &PWidget::eventFocus;
|
|
eventList[12] = &PWidget::eventPaint;
|
|
eventList[13] = &PWidget::eventMove;
|
|
eventList[14] = &PWidget::eventResize;
|
|
eventList[15] = &PWidget::eventNone;
|
|
eventList[16] = &PWidget::eventNone;
|
|
eventList[17] = &PWidget::eventNone;
|
|
eventList[18] = &PWidget::eventNone;
|
|
eventList[19] = &PWidget::eventNone;
|
|
|
|
// Connect slots as needed
|
|
|
|
}
|
|
|
|
PWidget::~PWidget()
|
|
{
|
|
// kdDebug(5008) << "PWidget: in destructor" << endl;
|
|
/*
|
|
delete widget();
|
|
w = 0;
|
|
setWidget(0);
|
|
*/
|
|
}
|
|
|
|
PObject *PWidget::createWidget(CreateArgs &ca)
|
|
{
|
|
PWidget *pw = new PWidget();
|
|
QWidget *tw;
|
|
if(ca.fetchedObj != 0 && ca.fetchedObj->inherits("QWidget") == TRUE){
|
|
tw = (QWidget *) ca.fetchedObj;
|
|
pw->setDeleteAble(FALSE);
|
|
}
|
|
else if(ca.parent != 0 && ca.parent->widget()->isWidgetType() == TRUE)
|
|
tw = new QWidget((QWidget *) ca.parent->widget());
|
|
else
|
|
tw = new QWidget();
|
|
pw->setWidget(tw);
|
|
pw->setWidgetId(ca.pwI);
|
|
pw->setPukeController(ca.pc);
|
|
return pw;
|
|
}
|
|
|
|
void PWidget::messageHandler(int fd, PukeMessage *pm)
|
|
{
|
|
PukeMessage pmRet;
|
|
switch(pm->iCommand){
|
|
case PUKE_WIDGET_SHOW:
|
|
widget()->show();
|
|
pmRet.iCommand = PUKE_WIDGET_SHOW_ACK;
|
|
pmRet.iWinId = pm->iWinId;
|
|
pmRet.iArg = 0;
|
|
pmRet.cArg = 0;
|
|
emit outputMessage(fd, &pmRet);
|
|
break;
|
|
case PUKE_WIDGET_HIDE:
|
|
widget()->hide();
|
|
pmRet.iCommand = PUKE_WIDGET_HIDE_ACK;
|
|
pmRet.iWinId = pm->iWinId;
|
|
pmRet.iArg = 0;
|
|
pmRet.cArg = 0;
|
|
emit outputMessage(fd, &pmRet);
|
|
break;
|
|
case PUKE_WIDGET_REPAINT:
|
|
widget()->repaint(pm->iArg);
|
|
pmRet.iCommand = PUKE_WIDGET_REPAINT_ACK;
|
|
pmRet.iWinId = pm->iWinId;
|
|
pmRet.iArg = 0;
|
|
pmRet.cArg = 0;
|
|
emit outputMessage(fd, &pmRet);
|
|
break;
|
|
case PUKE_WIDGET_RESIZE:
|
|
{
|
|
int x, y;
|
|
int found = sscanf(pm->cArg, "%d\t%d", &x, &y);
|
|
if(found != 2)
|
|
throw(errorCommandFailed(PUKE_INVALID,10));
|
|
|
|
widget()->resize(x, y);
|
|
|
|
pmRet.iCommand = PUKE_WIDGET_RESIZE_ACK;
|
|
pmRet.iWinId = pm->iWinId;
|
|
pmRet.iArg = pm->iArg;
|
|
pmRet.cArg = 0;
|
|
emit outputMessage(fd, &pmRet);
|
|
}
|
|
break;
|
|
case PUKE_WIDGET_MOVE:
|
|
{
|
|
int x, y;
|
|
int found = sscanf(pm->cArg, "%d\t%d", &x, &y);
|
|
if(found != 2)
|
|
throw(errorCommandFailed(PUKE_INVALID,10));
|
|
|
|
// kdDebug(5008) << "Moving to: " << pm->iArg << " => " << pos[0] << " " << pos[1] << endl;
|
|
widget()->move(x, y);
|
|
pmRet.iCommand = PUKE_WIDGET_MOVE_ACK;
|
|
pmRet.iWinId = pm->iWinId;
|
|
pmRet.iArg = 0;
|
|
pmRet.cArg = 0;
|
|
emit outputMessage(fd, &pmRet);
|
|
}
|
|
break;
|
|
case PUKE_WIDGET_SETMINSIZE:
|
|
{
|
|
int x, y;
|
|
int found = sscanf(pm->cArg, "%d\t%d", &x, &y);
|
|
if(found != 2)
|
|
throw(errorCommandFailed(PUKE_INVALID,11));
|
|
|
|
widget()->setMinimumSize(x, y);
|
|
|
|
pmRet.iCommand = PUKE_WIDGET_SETMINSIZE_ACK;
|
|
pmRet.iWinId = pm->iWinId;
|
|
pmRet.iArg = 0;
|
|
pmRet.cArg = 0;
|
|
emit outputMessage(fd, &pmRet);
|
|
}
|
|
break;
|
|
case PUKE_WIDGET_SETMAXSIZE:
|
|
{
|
|
int x, y;
|
|
int found = sscanf(pm->cArg, "%d\t%d", &x, &y);
|
|
if(found != 2)
|
|
throw(errorCommandFailed(PUKE_INVALID,12));
|
|
|
|
widget()->setMaximumSize(x, y);
|
|
|
|
pmRet.iCommand = -pm->iCommand;
|
|
pmRet.iWinId = pm->iWinId;
|
|
pmRet.iArg = pm->iArg;
|
|
pmRet.cArg = 0;
|
|
emit outputMessage(fd, &pmRet);
|
|
break;
|
|
}
|
|
case PUKE_WIDGET_SETCAPTION:
|
|
widget()->setCaption(pm->cArg);
|
|
pmRet.iCommand = PUKE_WIDGET_SETCAPTION_ACK;
|
|
pmRet.iWinId = pm->iWinId;
|
|
pmRet.iArg = 0;
|
|
pmRet.iTextSize = strlen(widget()->caption());
|
|
pmRet.cArg = strdup(widget()->caption());
|
|
emit outputMessage(fd, &pmRet);
|
|
free(pmRet.cArg);
|
|
break;
|
|
case PUKE_WIDGET_GET_BACKGROUND_COLOUR:
|
|
{
|
|
pmRet.cArg = new char[15];
|
|
pmRet.iTextSize = 15;
|
|
QColor back = widget()->backgroundColor();
|
|
sprintf(pmRet.cArg, "%d,%d,%d", back.red(), back.green(), back.blue());
|
|
|
|
pmRet.iCommand = -pm->iCommand;
|
|
pmRet.iWinId = pm->iWinId;
|
|
pmRet.iArg = 0;
|
|
emit outputMessage(fd, &pmRet);
|
|
delete pmRet.cArg;
|
|
break;
|
|
}
|
|
case PUKE_WIDGET_SET_BACKGROUND_PIXMAP:
|
|
widget()->setBackgroundPixmap(QPixmap(pm->cArg));
|
|
|
|
pmRet.iCommand = -pm->iCommand;
|
|
pmRet.iWinId = pm->iWinId;
|
|
pmRet.iArg = 0;
|
|
pmRet.cArg = 0;
|
|
emit outputMessage(fd, &pmRet);
|
|
break;
|
|
case PUKE_WIDGET_SET_BACKGROUND_MODE:
|
|
widget()->setBackgroundMode((QWidget::BackgroundMode) pm->iArg);
|
|
|
|
pmRet.iCommand = -pm->iCommand;
|
|
pmRet.iWinId = pm->iWinId;
|
|
pmRet.iArg = (int) widget()->backgroundMode();
|
|
pmRet.cArg = 0;
|
|
emit outputMessage(fd, &pmRet);
|
|
break;
|
|
|
|
case PUKE_WIDGET_SET_BACKGROUND_COLOUR:
|
|
{
|
|
int *pos;
|
|
pos = (int *) pm->cArg;
|
|
QColor bg(pos[0], pos[1], pos[2]);
|
|
QColorGroup cg = QColorGroup(widget()->colorGroup().foreground(),
|
|
bg,
|
|
widget()->colorGroup().light(),
|
|
widget()->colorGroup().dark(),
|
|
widget()->colorGroup().mid(),
|
|
widget()->colorGroup().text(),
|
|
bg);
|
|
widget()->setPalette(QPalette(cg,cg,cg));
|
|
|
|
pmRet.iCommand = -pm->iCommand;
|
|
pmRet.iWinId = pm->iWinId;
|
|
pmRet.iArg = 0;
|
|
pmRet.cArg = 0;
|
|
emit outputMessage(fd, &pmRet);
|
|
break;
|
|
}
|
|
|
|
case PUKE_WIDGET_SET_ENABLED:
|
|
widget()->setEnabled((bool) pm->iArg);
|
|
pmRet.iCommand = PUKE_WIDGET_SET_ENABLED_ACK;
|
|
pmRet.iWinId = pm->iWinId;
|
|
pmRet.iArg = 0;
|
|
pmRet.cArg = 0;
|
|
emit outputMessage(fd, &pmRet);
|
|
break;
|
|
case PUKE_WIDGET_RECREATE:
|
|
{
|
|
QWidget *nparent = 0x0;
|
|
if(pm->iArg != 0x0){
|
|
widgetId wiWidget;
|
|
wiWidget.fd = fd;
|
|
wiWidget.iWinId = pm->iArg;
|
|
nparent = controller()->id2pwidget(&wiWidget)->widget();
|
|
}
|
|
if(pm->iTextSize != 3*sizeof(int)){
|
|
throw(errorCommandFailed(pm->iCommand, pm->iArg));
|
|
}
|
|
int *point_show = (int *) pm->cArg;
|
|
|
|
qWarning("Recreate: %d %d %d", point_show[0], point_show[1], point_show[3]);
|
|
|
|
widget()->reparent(nparent, (WFlags) 0, QPoint(point_show[0], point_show[1]), point_show[3]);
|
|
|
|
pmRet.iCommand = PUKE_WIDGET_RECREATE_ACK;
|
|
pmRet.iWinId = pm->iWinId;
|
|
pmRet.iArg = 0;
|
|
pmRet.cArg = 0;
|
|
emit outputMessage(fd, &pmRet);
|
|
break;
|
|
}
|
|
default:
|
|
PObject::messageHandler(fd, pm);
|
|
}
|
|
}
|
|
|
|
void PWidget::setWidget(QObject *_w)
|
|
{
|
|
if(_w != 0 && _w->inherits("QWidget") == FALSE)
|
|
{
|
|
errorInvalidSet(_w);
|
|
return;
|
|
}
|
|
|
|
w = (QWidget *) _w;
|
|
if(w != 0){
|
|
widget()->installEventFilter(this);
|
|
}
|
|
PObject::setWidget(_w);
|
|
}
|
|
|
|
QWidget *PWidget::widget()
|
|
{
|
|
// kdDebug(5008) << "PWidget widget called" << endl;
|
|
return w;
|
|
}
|
|
|
|
// PWidget specific
|
|
bool PWidget::eventFilter(QObject *o, QEvent *e)
|
|
{
|
|
if(e->type() < 20 && e->type() >= 0){
|
|
(this->*(eventList[e->type()]))(o,e);
|
|
}
|
|
else{
|
|
PukeMessage pm;
|
|
widgetId wI;
|
|
|
|
wI = widgetIden();
|
|
pm.iCommand = PUKE_EVENT_UNKOWN;
|
|
pm.iWinId = wI.iWinId;
|
|
pm.iArg = e->type();
|
|
pm.cArg = 0;
|
|
emit outputMessage(wI.fd, &pm);
|
|
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
void PWidget::eventNone(QObject *, QEvent *e)
|
|
{
|
|
PukeMessage pm;
|
|
widgetId wI;
|
|
|
|
// kdDebug(5008) << "PWidget: eventNone" << endl;
|
|
|
|
wI = widgetIden();
|
|
pm.iCommand = - e->type() - 1020; // 1030 offset for events
|
|
pm.iWinId = wI.iWinId;
|
|
pm.iArg = 0;
|
|
pm.cArg = 0;
|
|
|
|
emit outputMessage(wI.fd, &pm);
|
|
|
|
}
|
|
|
|
void PWidget::eventTimer(QObject *, QEvent *e)
|
|
{
|
|
PukeMessage pm;
|
|
widgetId wI;
|
|
|
|
QTimerEvent *et = (QTimerEvent *)(e);
|
|
|
|
wI = widgetIden();
|
|
pm.iCommand = PUKE_WIDGET_EVENT_TIMER;
|
|
pm.iWinId = wI.iWinId;
|
|
pm.iArg = et->timerId();
|
|
pm.cArg = 0;
|
|
|
|
emit outputMessage(wI.fd, &pm);
|
|
|
|
}
|
|
|
|
void PWidget::eventMouse(QObject *, QEvent *e)
|
|
{
|
|
PukeMessage pm;
|
|
widgetId wI;
|
|
|
|
QMouseEvent *me = (QMouseEvent *)(e);
|
|
|
|
wI = widgetIden();
|
|
pm.iCommand = - e->type() - 1020; // 1020 offset for events
|
|
pm.iWinId = wI.iWinId;
|
|
pm.iArg = 0;
|
|
|
|
// special cArg handling
|
|
pm.iTextSize = 4*sizeof(int);
|
|
int *icArg = new int[4];
|
|
icArg[0] = me->x();
|
|
icArg[1] = me->y();
|
|
icArg[2] = me->button();
|
|
icArg[3] = me->state();
|
|
pm.cArg = (char *) icArg;
|
|
|
|
emit outputMessage(wI.fd, &pm);
|
|
|
|
delete[] icArg;
|
|
|
|
}
|
|
|
|
void PWidget::eventKey(QObject *, QEvent *e)
|
|
{
|
|
PukeMessage pm;
|
|
widgetId wI;
|
|
|
|
QKeyEvent *ke = (QKeyEvent *)(e);
|
|
|
|
wI = widgetIden();
|
|
pm.iCommand = - e->type() - 1020; // 1020 offset for events
|
|
pm.iWinId = wI.iWinId;
|
|
pm.iArg = 0;
|
|
|
|
// special cArg handling
|
|
pm.iTextSize = 3*sizeof(int);
|
|
int *icArg = new int[3];
|
|
icArg[0] = ke->key();
|
|
icArg[1] = ke->ascii();
|
|
icArg[2] = ke->state();
|
|
pm.cArg = (char *) icArg;
|
|
|
|
emit outputMessage(wI.fd, &pm);
|
|
|
|
delete[] icArg;
|
|
|
|
}
|
|
|
|
void PWidget::eventFocus(QObject *, QEvent *e)
|
|
{
|
|
PukeMessage pm;
|
|
widgetId wI;
|
|
|
|
// kdDebug(5008) << "PWidget: eventFocus" << endl;
|
|
|
|
QFocusEvent *fe = (QFocusEvent *)(e);
|
|
|
|
wI = widgetIden();
|
|
pm.iCommand = - e->type() - 1020; // 1020 offset for events
|
|
pm.iWinId = wI.iWinId;
|
|
pm.iArg = 0;
|
|
|
|
pm.cArg = new char[2];
|
|
pm.iTextSize = 2*sizeof(char);
|
|
pm.cArg[0] = fe->gotFocus();
|
|
pm.cArg[1] = fe->lostFocus();
|
|
|
|
emit outputMessage(wI.fd, &pm);
|
|
|
|
delete[] pm.cArg;
|
|
}
|
|
|
|
void PWidget::eventPaint(QObject *, QEvent *e)
|
|
{
|
|
PukeMessage pm;
|
|
widgetId wI;
|
|
|
|
wI = widgetIden();
|
|
pm.iCommand = - e->type() - 1020; // 1020 offset for events
|
|
pm.iWinId = wI.iWinId;
|
|
pm.iArg = 0;
|
|
pm.cArg = 0;
|
|
|
|
emit outputMessage(wI.fd, &pm);
|
|
|
|
}
|
|
|
|
void PWidget::eventMove(QObject *, QEvent *e)
|
|
{
|
|
PukeMessage pm;
|
|
widgetId wI;
|
|
|
|
QMoveEvent *me = (QMoveEvent *)(e);
|
|
|
|
wI = widgetIden();
|
|
pm.iCommand = - e->type() - 1020; // 1020 offset for events
|
|
pm.iWinId = wI.iWinId;
|
|
pm.iArg = 0;
|
|
|
|
// special cArg handling
|
|
pm.iTextSize = 4*sizeof(int);
|
|
int *icArg = new int[4];
|
|
icArg[0] = me->pos().x();
|
|
icArg[1] = me->pos().y();
|
|
icArg[2] = me->oldPos().x();
|
|
icArg[3] = me->oldPos().y();
|
|
pm.cArg = (char *) icArg;
|
|
|
|
emit outputMessage(wI.fd, &pm);
|
|
|
|
delete[] icArg;
|
|
|
|
}
|
|
|
|
void PWidget::eventResize(QObject *, QEvent *e)
|
|
{
|
|
PukeMessage pm;
|
|
widgetId wI;
|
|
|
|
QResizeEvent *re = (QResizeEvent *)(e);
|
|
|
|
wI = widgetIden();
|
|
pm.iCommand = - e->type() - 1020; // 1020 offset for events
|
|
pm.iWinId = wI.iWinId;
|
|
pm.iArg = 0;
|
|
|
|
// special cArg handling
|
|
pm.iTextSize = 4*sizeof(int);
|
|
int *icArg = new int[4];
|
|
icArg[0] = re->size().height();
|
|
icArg[1] = re->size().width();
|
|
icArg[2] = re->oldSize().height();
|
|
icArg[3] = re->oldSize().width();
|
|
pm.cArg = (char *) icArg;
|
|
|
|
emit outputMessage(wI.fd, &pm);
|
|
|
|
delete[] icArg;
|
|
|
|
}
|
|
|
|
|
|
#include "pwidget.moc"
|
|
|