]> Dogcows Code - chaz/openbox/commitdiff
support for the shape extension works!
authorDana Jansens <danakj@orodu.net>
Sun, 10 Nov 2002 05:54:12 +0000 (05:54 +0000)
committerDana Jansens <danakj@orodu.net>
Sun, 10 Nov 2002 05:54:12 +0000 (05:54 +0000)
configure.ac
otk/display.cc
src/bbwindow.cc
src/blackbox.cc
src/client.cc
src/client.hh
src/frame.cc
src/xeventhandler.cc
src/xeventhandler.hh

index 801d94dc6e4dd1046ee95d87bb3b7131ef3c65f9..4c0c572488294858afbf9b10e7397de086f11ec4 100644 (file)
@@ -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"
     ],
     [ 
index 980fcaaadefa1ce89ba32f1ecd39a1d0cba5b781..4613b9ba9a5b5da75b8a5b5a43d5fdfeeb2c96e8 100644 (file)
 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
index 54acb37b142ec79a18ee11e0d061eb2553b23fb6..82c31aa34a56e2f11bf17b8243c0e47b8193811a 100644 (file)
@@ -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;
index 5f07e37ff9036f5e91e98c23042c135aebc7fc63..ce0e550cef1920cf6661e662409b034b42629de0 100644 (file)
@@ -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);
 
index 55f2fb4cf6174690a2a0e4b2c00fa4bb38e47545..d6111ce2b40a7a9ba255c3b9785ecae1f8b30b04 100644 (file)
@@ -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;
index 79c018fdd71e24d68967060e281b69dbe512d69c..ba158fc1adb9d252632c3f33842fbc53e8268c91 100644 (file)
@@ -9,6 +9,10 @@
 
 extern "C" {
 #include <X11/Xlib.h>
+
+#ifdef    SHAPE
+#include <X11/extensions/shape.h>
+#endif // SHAPE
 }
 
 #include <string>
@@ -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
   /*!
index 29bb62e926a5755ff6a4ca34dd712e64b927a07b..622207ed888b30d57b1cdcad91c796da8818793c 100644 (file)
@@ -4,6 +4,12 @@
 # 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"
@@ -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
 }
 
 
index ad7d7e27f22356c85aa6d462429aa5383f8f32cc..585f9dbc516899f4b53c634ae0142aedc546122d 100644 (file)
@@ -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;
     
index e46ae1169f88a030a2f60717ba972b542dfa564e..0b5a1466cf8d7320db4eb1aeabb1b7ad7add85cf 100644 (file)
@@ -9,6 +9,10 @@
 
 extern "C" {
 #include <X11/Xlib.h>
+
+#ifdef    SHAPE
+#include <X11/extensions/shape.h>
+#endif // SHAPE
 }
 
 namespace ob {
This page took 0.034882 seconds and 4 git commands to generate.