diff options
Diffstat (limited to 'ksirc/puke/pwidget.cpp')
-rw-r--r-- | ksirc/puke/pwidget.cpp | 492 |
1 files changed, 492 insertions, 0 deletions
diff --git a/ksirc/puke/pwidget.cpp b/ksirc/puke/pwidget.cpp new file mode 100644 index 00000000..d254832b --- /dev/null +++ b/ksirc/puke/pwidget.cpp @@ -0,0 +1,492 @@ +#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" + |