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.
tdenetwork/ksirc/puke/pwidget.cpp

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"