From 5fdd493d0d2255f134114e69f028371366f4dfd3 Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Fri, 27 Dec 2002 10:07:57 +0000 Subject: [PATCH] buttons have their pixmaps! --- otk/otk_wrap.cc | 72 +++++++++++++++++++++++++++++++++++++++++++++ otk/style.hh | 5 ++++ otk/texture.cc | 4 +-- src/buttonwidget.cc | 63 +++++++++++++++++++++++++++++++++++---- src/buttonwidget.hh | 2 ++ src/client.cc | 6 ++-- src/labelwidget.cc | 61 ++++++++++++++++++-------------------- 7 files changed, 170 insertions(+), 43 deletions(-) diff --git a/otk/otk_wrap.cc b/otk/otk_wrap.cc index c62d2471..5ab614fb 100644 --- a/otk/otk_wrap.cc +++ b/otk/otk_wrap.cc @@ -10927,6 +10927,74 @@ static PyObject *_wrap_Style_load(PyObject *self, PyObject *args) { } +static PyObject *_wrap_Style_getCloseButtonMask(PyObject *self, PyObject *args) { + PyObject *resultobj; + otk::Style *arg1 = (otk::Style *) 0 ; + otk::PixmapMask *result; + PyObject * obj0 = 0 ; + + if(!PyArg_ParseTuple(args,(char *)"O:Style_getCloseButtonMask",&obj0)) goto fail; + if ((SWIG_ConvertPtr(obj0,(void **) &arg1, SWIGTYPE_p_otk__Style,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail; + result = (otk::PixmapMask *)(arg1)->getCloseButtonMask(); + + resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_otk__PixmapMask, 0); + return resultobj; + fail: + return NULL; +} + + +static PyObject *_wrap_Style_getMaximizeButtonMask(PyObject *self, PyObject *args) { + PyObject *resultobj; + otk::Style *arg1 = (otk::Style *) 0 ; + otk::PixmapMask *result; + PyObject * obj0 = 0 ; + + if(!PyArg_ParseTuple(args,(char *)"O:Style_getMaximizeButtonMask",&obj0)) goto fail; + if ((SWIG_ConvertPtr(obj0,(void **) &arg1, SWIGTYPE_p_otk__Style,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail; + result = (otk::PixmapMask *)(arg1)->getMaximizeButtonMask(); + + resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_otk__PixmapMask, 0); + return resultobj; + fail: + return NULL; +} + + +static PyObject *_wrap_Style_getIconifyButtonMask(PyObject *self, PyObject *args) { + PyObject *resultobj; + otk::Style *arg1 = (otk::Style *) 0 ; + otk::PixmapMask *result; + PyObject * obj0 = 0 ; + + if(!PyArg_ParseTuple(args,(char *)"O:Style_getIconifyButtonMask",&obj0)) goto fail; + if ((SWIG_ConvertPtr(obj0,(void **) &arg1, SWIGTYPE_p_otk__Style,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail; + result = (otk::PixmapMask *)(arg1)->getIconifyButtonMask(); + + resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_otk__PixmapMask, 0); + return resultobj; + fail: + return NULL; +} + + +static PyObject *_wrap_Style_getStickyButtonMask(PyObject *self, PyObject *args) { + PyObject *resultobj; + otk::Style *arg1 = (otk::Style *) 0 ; + otk::PixmapMask *result; + PyObject * obj0 = 0 ; + + if(!PyArg_ParseTuple(args,(char *)"O:Style_getStickyButtonMask",&obj0)) goto fail; + if ((SWIG_ConvertPtr(obj0,(void **) &arg1, SWIGTYPE_p_otk__Style,SWIG_POINTER_EXCEPTION | 0 )) == -1) SWIG_fail; + result = (otk::PixmapMask *)(arg1)->getStickyButtonMask(); + + resultobj = SWIG_NewPointerObj((void *) result, SWIGTYPE_p_otk__PixmapMask, 0); + return resultobj; + fail: + return NULL; +} + + static PyObject *_wrap_Style_getTextFocus(PyObject *self, PyObject *args) { PyObject *resultobj; otk::Style *arg1 = (otk::Style *) 0 ; @@ -13077,6 +13145,10 @@ static PyMethodDef SwigMethods[] = { { (char *)"Style_readDatabaseColor", _wrap_Style_readDatabaseColor, METH_VARARGS }, { (char *)"Style_readDatabaseFont", _wrap_Style_readDatabaseFont, METH_VARARGS }, { (char *)"Style_load", _wrap_Style_load, METH_VARARGS }, + { (char *)"Style_getCloseButtonMask", _wrap_Style_getCloseButtonMask, METH_VARARGS }, + { (char *)"Style_getMaximizeButtonMask", _wrap_Style_getMaximizeButtonMask, METH_VARARGS }, + { (char *)"Style_getIconifyButtonMask", _wrap_Style_getIconifyButtonMask, METH_VARARGS }, + { (char *)"Style_getStickyButtonMask", _wrap_Style_getStickyButtonMask, METH_VARARGS }, { (char *)"Style_getTextFocus", _wrap_Style_getTextFocus, METH_VARARGS }, { (char *)"Style_getTextUnfocus", _wrap_Style_getTextUnfocus, METH_VARARGS }, { (char *)"Style_getButtonPicFocus", _wrap_Style_getButtonPicFocus, METH_VARARGS }, diff --git a/otk/style.hh b/otk/style.hh index d3b5903e..2944339d 100644 --- a/otk/style.hh +++ b/otk/style.hh @@ -84,6 +84,11 @@ public: void load(const Configuration &style); + inline PixmapMask *getCloseButtonMask(void) { return &close_button; } + inline PixmapMask *getMaximizeButtonMask(void) { return &max_button; } + inline PixmapMask *getIconifyButtonMask(void) { return &icon_button; } + inline PixmapMask *getStickyButtonMask(void) { return &stick_button; } + inline BColor *getTextFocus(void) { return &l_text_focus; } inline BColor *getTextUnfocus(void) { return &l_text_unfocus; } diff --git a/otk/texture.cc b/otk/texture.cc index 7a651620..967878b7 100644 --- a/otk/texture.cc +++ b/otk/texture.cc @@ -158,8 +158,8 @@ Pixmap BTexture::render(const unsigned int width, const unsigned int height, const Pixmap old) { assert(texture() != BTexture::NoTexture); - if (texture() == (BTexture::Flat | BTexture::Solid)) - return None; +// if (texture() == (BTexture::Flat | BTexture::Solid)) +// return None; if (texture() == BTexture::Parent_Relative) return ParentRelative; diff --git a/src/buttonwidget.cc b/src/buttonwidget.cc index 853b0339..efb98e76 100644 --- a/src/buttonwidget.cc +++ b/src/buttonwidget.cc @@ -5,6 +5,7 @@ #endif #include "buttonwidget.hh" +#include "otk/gccache.hh" // otk::BPen namespace ob { @@ -76,6 +77,62 @@ void OBButtonWidget::setStyle(otk::Style *style) } +void OBButtonWidget::update() +{ + otk::PixmapMask *pm; + int width; + + otk::OtkWidget::update(); + + switch (type()) { + case Type_StickyButton: + pm = _style->getStickyButtonMask(); + break; + case Type_CloseButton: + pm = _style->getCloseButtonMask(); + break; + case Type_MaximizeButton: + pm = _style->getMaximizeButtonMask(); + break; + case Type_IconifyButton: + pm = _style->getIconifyButtonMask(); + break; + case Type_LeftGrip: + case Type_RightGrip: + return; // no drawing + default: + assert(false); // there's no other button widgets! + } + + if (pm->mask == None) return; // no mask for the button, leave it empty + + width = _rect.width(); + + otk::BPen pen(_focused ? *_style->getButtonPicFocus() : + *_style->getButtonPicUnfocus()); + + // set the clip region + XSetClipMask(otk::OBDisplay::display, pen.gc(), pm->mask); + XSetClipOrigin(otk::OBDisplay::display, pen.gc(), + (width - pm->w)/2, (width - pm->h)/2); + + // fill in the clipped region + XFillRectangle(otk::OBDisplay::display, _window, pen.gc(), + (width - pm->w)/2, (width - pm->h)/2, + (width + pm->w)/2, (width + pm->h)/2); + + // unset the clip region + XSetClipMask(otk::OBDisplay::display, pen.gc(), None); + XSetClipOrigin(otk::OBDisplay::display, pen.gc(), 0, 0); +} + + +void OBButtonWidget::adjust() +{ + // XXX: adjust shit +} + + void OBButtonWidget::focus() { otk::OtkWidget::focus(); @@ -90,12 +147,6 @@ void OBButtonWidget::unfocus() } -void OBButtonWidget::adjust() -{ - // XXX: adjust shit -} - - void OBButtonWidget::buttonPressHandler(const XButtonEvent &e) { OtkWidget::buttonPressHandler(e); diff --git a/src/buttonwidget.hh b/src/buttonwidget.hh index 66a9cf37..c2bb41f4 100644 --- a/src/buttonwidget.hh +++ b/src/buttonwidget.hh @@ -22,6 +22,8 @@ public: virtual void adjust(); + virtual void update(); + virtual void focus(); virtual void unfocus(); diff --git a/src/client.cc b/src/client.cc index 243390a8..e626081c 100644 --- a/src/client.cc +++ b/src/client.cc @@ -1009,15 +1009,15 @@ void OBClient::destroyHandler(const XDestroyWindowEvent &e) void OBClient::reparentHandler(const XReparentEvent &e) { + // this is when the client is first taken captive in the frame + if (e.parent == frame->plate()) return; + #ifdef DEBUG printf("ReparentNotify for 0x%lx\n", e.window); #endif // DEBUG OtkEventHandler::reparentHandler(e); - // this is when the client is first taken captive in the frame - if (e.parent == frame->plate()) return; - /* This event is quite rare and is usually handled in unmapHandler. However, if the window is unmapped when the reparent event occurs, diff --git a/src/labelwidget.cc b/src/labelwidget.cc index 5a33cf3d..491deadc 100644 --- a/src/labelwidget.cc +++ b/src/labelwidget.cc @@ -72,41 +72,38 @@ void OBLabelWidget::unfocus() void OBLabelWidget::update() { - if (_dirty) { - std::string t = _text; - int x = _sidemargin; // x coord for the text - - // find a string that will fit inside the area for text - int max_length = width() - _sidemargin * 2; - if (max_length <= 0) { - t = ""; // can't fit anything - } else { - size_t text_len = t.size(); - int length; + OtkWidget::update(); + + std::string t = _text; + int x = _sidemargin; // x coord for the text + + // find a string that will fit inside the area for text + int max_length = width() - _sidemargin * 2; + if (max_length <= 0) { + t = ""; // can't fit anything + } else { + size_t text_len = t.size(); + int length; - do { - t.resize(text_len); - length = _font->measureString(t); - } while (length > max_length && text_len-- > 0); - - // justify the text - switch (_justify) { - case otk::Style::RightJustify: - x += max_length - length; - break; - case otk::Style::CenterJustify: - x += (max_length - length) / 2; - break; - case otk::Style::LeftJustify: - break; - } + do { + t.resize(text_len); + length = _font->measureString(t); + } while (length > max_length && text_len-- > 0); + + // justify the text + switch (_justify) { + case otk::Style::RightJustify: + x += max_length - length; + break; + case otk::Style::CenterJustify: + x += (max_length - length) / 2; + break; + case otk::Style::LeftJustify: + break; } + } - OtkWidget::update(); - - _font->drawString(_xftdraw, x, 0, *_text_color, t); - } else - OtkWidget::update(); + _font->drawString(_xftdraw, x, 0, *_text_color, t); } -- 2.45.2