[
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"
],
[
extern "C" {
#include <X11/keysym.h>
+#ifdef SHAPE
+#include <X11/extensions/shape.h>
+#endif // SHAPE
+
#ifdef HAVE_STDIO_H
# include <stdio.h>
#endif // HAVE_STDIO_H
XUngrabServer(otk::OBDisplay::display);
#ifdef SHAPE
- if (blackbox->hasShapeExtensions() && flags.shaped)
+ if (otk::OBDisplay::shape() && flags.shaped)
configureShape();
#endif // SHAPE
XMapSubwindows(otk::OBDisplay::display, frame.plate);
#ifdef SHAPE
- if (blackbox->hasShapeExtensions()) {
+ if (otk::OBDisplay::shape()) {
XShapeSelectInput(otk::OBDisplay::display, client.window,
ShapeNotifyMask);
frame.rect.bottom() - frame.margin.bottom);
#ifdef SHAPE
- if (blackbox->hasShapeExtensions() && flags.shaped) {
+ if (otk::OBDisplay::shape() && flags.shaped) {
configureShape();
}
#endif // SHAPE
#ifdef SHAPE
void BlackboxWindow::shapeEvent(XShapeEvent *e) {
- if (blackbox->hasShapeExtensions()) {
+ if (otk::OBDisplay::shape()) {
if (! e->shaped && flags.shaped) {
clearShape();
flags.shaped = False;
default: {
#ifdef SHAPE
- if (e->type == getShapeEventBase()) {
+ if (e->type == otk::OBDisplay::shapeEventBase()) {
XShapeEvent *shape_event = (XShapeEvent *) e;
BlackboxWindow *win = searchWindow(e->xany.window);
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
}
}
+#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;
extern "C" {
#include <X11/Xlib.h>
+
+#ifdef SHAPE
+#include <X11/extensions/shape.h>
+#endif // SHAPE
}
#include <string>
//! 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
/*!
# include "../config.h"
#endif
+extern "C" {
+#ifdef SHAPE
+#include <X11/extensions/shape.h>
+#endif // SHAPE
+}
+
#include "frame.hh"
#include "client.hh"
#include "otk/display.hh"
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
}
// -*- mode: C++; indent-tabs-mode: nil; -*-
+#ifdef HAVE_CONFIG_H
+# include "../config.h"
+#endif
+
#include "xeventhandler.hh"
#include "client.hh"
#include "frame.hh"
#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
default:
#ifdef SHAPE
if (e.type == otk::OBDisplay::shapeEventBase())
- shapeEvent(e);
+ shapeEvent((*(XShapeEvent*)&e));
#endif // SHAPE
break;
extern "C" {
#include <X11/Xlib.h>
+
+#ifdef SHAPE
+#include <X11/extensions/shape.h>
+#endif // SHAPE
}
namespace ob {