From 9d5865a1603733e62fda7c8d61024cb05bf6792c Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Sun, 10 Nov 2002 05:54:12 +0000 Subject: [PATCH] support for the shape extension works! --- configure.ac | 2 +- otk/display.cc | 4 ++++ src/bbwindow.cc | 8 ++++---- src/blackbox.cc | 2 +- src/client.cc | 14 +++++++++++++- src/client.hh | 8 ++++++++ src/frame.cc | 46 +++++++++++++++++++++++++++++++++++++++++++- src/xeventhandler.cc | 17 +++++++++++----- src/xeventhandler.hh | 4 ++++ 9 files changed, 92 insertions(+), 13 deletions(-) diff --git a/configure.ac b/configure.ac index 801d94dc..4c0c5724 100644 --- a/configure.ac +++ b/configure.ac @@ -105,7 +105,7 @@ AC_CHECK_LIB([Xext], [XShapeCombineShape], [ AC_MSG_RESULT([yes]) SHAPE="yes" - AC_DEFINE([HAVE_SHAPE], [1], [Found the XShape extension]) + AC_DEFINE([SHAPE], [1], [Found the XShape extension]) LIBS="$LIBS -lXext" ], [ diff --git a/otk/display.cc b/otk/display.cc index 980fcaaa..4613b9ba 100644 --- a/otk/display.cc +++ b/otk/display.cc @@ -11,6 +11,10 @@ extern "C" { #include +#ifdef SHAPE +#include +#endif // SHAPE + #ifdef HAVE_STDIO_H # include #endif // HAVE_STDIO_H diff --git a/src/bbwindow.cc b/src/bbwindow.cc index 54acb37b..82c31aa3 100644 --- a/src/bbwindow.cc +++ b/src/bbwindow.cc @@ -264,7 +264,7 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) { XUngrabServer(otk::OBDisplay::display); #ifdef SHAPE - if (blackbox->hasShapeExtensions() && flags.shaped) + if (otk::OBDisplay::shape() && flags.shaped) configureShape(); #endif // SHAPE @@ -511,7 +511,7 @@ void BlackboxWindow::associateClientWindow(void) { XMapSubwindows(otk::OBDisplay::display, frame.plate); #ifdef SHAPE - if (blackbox->hasShapeExtensions()) { + if (otk::OBDisplay::shape()) { XShapeSelectInput(otk::OBDisplay::display, client.window, ShapeNotifyMask); @@ -1601,7 +1601,7 @@ void BlackboxWindow::configure(int dx, int dy, frame.rect.bottom() - frame.margin.bottom); #ifdef SHAPE - if (blackbox->hasShapeExtensions() && flags.shaped) { + if (otk::OBDisplay::shape() && flags.shaped) { configureShape(); } #endif // SHAPE @@ -3848,7 +3848,7 @@ void BlackboxWindow::leaveNotifyEvent(const XCrossingEvent*) { #ifdef SHAPE void BlackboxWindow::shapeEvent(XShapeEvent *e) { - if (blackbox->hasShapeExtensions()) { + if (otk::OBDisplay::shape()) { if (! e->shaped && flags.shaped) { clearShape(); flags.shaped = False; diff --git a/src/blackbox.cc b/src/blackbox.cc index 5f07e37f..ce0e550c 100644 --- a/src/blackbox.cc +++ b/src/blackbox.cc @@ -831,7 +831,7 @@ void Blackbox::process_event(XEvent *e) { default: { #ifdef SHAPE - if (e->type == getShapeEventBase()) { + if (e->type == otk::OBDisplay::shapeEventBase()) { XShapeEvent *shape_event = (XShapeEvent *) e; BlackboxWindow *win = searchWindow(e->xany.window); diff --git a/src/client.cc b/src/client.cc index 55f2fb4c..d6111ce2 100644 --- a/src/client.cc +++ b/src/client.cc @@ -319,9 +319,13 @@ void OBClient::getShaped() if (otk::OBDisplay::shape()) { int foo; unsigned int ufoo; + int s; - XShapeQueryExtents(otk::OBDisplay::display, client.window, &_shaped, &foo, + XShapeSelectInput(otk::OBDisplay::display, _window, ShapeNotifyMask); + + XShapeQueryExtents(otk::OBDisplay::display, _window, &s, &foo, &foo, &ufoo, &ufoo, &foo, &foo, &foo, &ufoo, &ufoo); + _shaped = (s != 0); } #endif // SHAPE } @@ -649,6 +653,14 @@ void OBClient::update(const XClientMessageEvent &e) } +#if defined(SHAPE) || defined(DOXYGEN_IGNORE) +void OBClient::update(const XShapeEvent &e) +{ + _shaped = e.shaped; +} +#endif + + void OBClient::setArea(const otk::Rect &area) { _area = area; diff --git a/src/client.hh b/src/client.hh index 79c018fd..ba158fc1 100644 --- a/src/client.hh +++ b/src/client.hh @@ -9,6 +9,10 @@ extern "C" { #include + +#ifdef SHAPE +#include +#endif // SHAPE } #include @@ -431,6 +435,10 @@ public: //! Processes a client message XEvent for the window and causes an action //! or whatever was specified to occur void update(const XClientMessageEvent &e); +#if defined(SHAPE) || defined(DOXYGEN_IGNORE) + //! Updates the client's shape status + void update(const XShapeEvent &e); +#endif //! Changes the stored positions and size of the OBClient window /*! diff --git a/src/frame.cc b/src/frame.cc index 29bb62e9..622207ed 100644 --- a/src/frame.cc +++ b/src/frame.cc @@ -4,6 +4,12 @@ # include "../config.h" #endif +extern "C" { +#ifdef SHAPE +#include +#endif // SHAPE +} + #include "frame.hh" #include "client.hh" #include "otk/display.hh" @@ -76,7 +82,45 @@ void OBFrame::resize() void OBFrame::shape() { - // XXX: if shaped, shape the frame to the client.. +#ifdef SHAPE + if (!_client->shaped()) { + // clear the shape on the frame window + XShapeCombineMask(otk::OBDisplay::display, _window, ShapeBounding, + _size.left - 2,//frame.margin.left - frame.border_w, + _size.top - 2,//frame.margin.top - frame.border_w, + None, ShapeSet); + } else { + // make the frame's shape match the clients + XShapeCombineShape(otk::OBDisplay::display, _window, ShapeBounding, + _size.left - 2, + _size.top - 2, + _client->window(), ShapeBounding, ShapeSet); + + int num = 0; + XRectangle xrect[2]; + + /* + if (decorations & Decor_Titlebar) { + xrect[0].x = xrect[0].y = -frame.border_w; + xrect[0].width = frame.rect.width(); + xrect[0].height = frame.title_h + (frame.border_w * 2); + ++num; + } + + if (decorations & Decor_Handle) { + xrect[1].x = -frame.border_w; + xrect[1].y = frame.rect.height() - frame.margin.bottom + + frame.mwm_border_w - frame.border_w; + xrect[1].width = frame.rect.width(); + xrect[1].height = frame.handle_h + (frame.border_w * 2); + ++num; + }*/ + + XShapeCombineRectangles(otk::OBDisplay::display, _window, + ShapeBounding, 0, 0, xrect, num, + ShapeUnion, Unsorted); + } +#endif // SHAPE } diff --git a/src/xeventhandler.cc b/src/xeventhandler.cc index ad7d7e27..585f9dbc 100644 --- a/src/xeventhandler.cc +++ b/src/xeventhandler.cc @@ -1,5 +1,9 @@ // -*- mode: C++; indent-tabs-mode: nil; -*- +#ifdef HAVE_CONFIG_H +# include "../config.h" +#endif + #include "xeventhandler.hh" #include "client.hh" #include "frame.hh" @@ -506,11 +510,14 @@ void OBXEventHandler::focusOut(const XFocusChangeEvent &e) #ifdef SHAPE void OBXEventHandler::shapeEvent(const XShapeEvent &e) { - XShapeEvent *shape_event = (XShapeEvent *) e; - BlackboxWindow *win = searchWindow(e->xany.window); + printf("ShapeEvent\n"); + if (e.kind != ShapeBounding) return; - if (win && shape_event->kind == ShapeBounding) - win->shapeEvent(shape_event); + OBClient *client = Openbox::instance->findClient(e.window); + if (!client) return; + + client->update(e); + client->frame->shape(); } #endif // SHAPE @@ -679,7 +686,7 @@ void OBXEventHandler::handle(const XEvent &e) default: #ifdef SHAPE if (e.type == otk::OBDisplay::shapeEventBase()) - shapeEvent(e); + shapeEvent((*(XShapeEvent*)&e)); #endif // SHAPE break; diff --git a/src/xeventhandler.hh b/src/xeventhandler.hh index e46ae116..0b5a1466 100644 --- a/src/xeventhandler.hh +++ b/src/xeventhandler.hh @@ -9,6 +9,10 @@ extern "C" { #include + +#ifdef SHAPE +#include +#endif // SHAPE } namespace ob { -- 2.39.2