use FbPixmap

This commit is contained in:
fluxgen 2004-01-11 15:02:11 +00:00
parent d75cb35327
commit fabfc41002
2 changed files with 31 additions and 27 deletions

View file

@ -19,12 +19,14 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Shape.cc,v 1.8 2004/01/09 02:17:46 fluxgen Exp $
// $Id: Shape.cc,v 1.9 2004/01/11 15:02:11 fluxgen Exp $
#include "Shape.hh"
#include "FbTk/FbWindow.hh"
#include "FbTk/App.hh"
#include "FbTk/GContext.hh"
#include "FbTk/FbPixmap.hh"
#include <cstring>
@ -39,7 +41,7 @@ using namespace std;
namespace {
Pixmap createShape(FbTk::FbWindow &win, int place) {
FbTk::FbPixmap *createShape(FbTk::FbWindow &win, int place) {
if (win.window() == 0 || place == 0 ||
win.width() < 3 || win.height() < 3)
return 0;
@ -111,39 +113,34 @@ Pixmap createShape(FbTk::FbWindow &win, int place) {
}
}
Pixmap pm = XCreatePixmap(disp, win.window(), win_width, win_height, 1);
FbTk::FbPixmap *pm = new FbTk::FbPixmap(win, win_width, win_height, 1);
FbTk::GContext gc(pm);
XPutImage(disp, pm, gc.gc(), ximage, 0, 0, 0, 0,
FbTk::GContext gc(*pm);
XPutImage(disp, pm->drawable(), gc.gc(), ximage, 0, 0, 0, 0,
win_width, win_height);
XDestroyImage(ximage);
return pm;
}
}; // end anonymous namespace
} // end anonymous namespace
Shape::Shape(FbTk::FbWindow &win, int shapeplaces):
m_win(&win),
m_shapeplaces(shapeplaces) {
m_shape = createShape(win, shapeplaces);
m_width = win.width();
m_height = win.height();
m_shape.reset(createShape(win, shapeplaces));
}
Shape::~Shape() {
if (m_shape != 0)
XFreePixmap(FbTk::App::instance()->display(), m_shape);
#ifdef SHAPE
if (m_win != 0 && m_win->window()) {
// reset shape of window
// Reset shape of window
XShapeCombineMask(FbTk::App::instance()->display(),
m_win->window(),
ShapeBounding,
@ -162,14 +159,10 @@ void Shape::update() {
if (m_win == 0 || m_win->window() == 0)
return;
#ifdef SHAPE
if (m_win->width() != m_width ||
m_win->height() != m_height) {
if (m_shape != 0)
XFreePixmap(FbTk::App::instance()->display(), m_shape);
m_shape = createShape(*m_win, m_shapeplaces);
m_width = m_win->width();
m_height = m_win->height();
if (m_shape.get() == 0 ||
m_win->width() != width() ||
m_win->height() != height()) {
m_shape.reset(createShape(*m_win, m_shapeplaces));
}
// the m_shape can be = 0 which will just reset the shape mask
@ -178,9 +171,10 @@ void Shape::update() {
m_win->window(),
ShapeBounding,
-m_win->borderWidth(), -m_win->borderWidth(),
m_shape,
m_shape.get() ? m_shape->drawable() : 0,
ShapeSet);
#endif // SHAPE
}
@ -215,3 +209,11 @@ bool Shape::isShaped(const FbTk::FbWindow &win) {
return (shaped != 0 ? true : false);
}
unsigned int Shape::width() const {
return m_shape.get() ? m_shape->width() : 0;
}
unsigned int Shape::height() const {
return m_shape.get() ? m_shape->height() : 0;
}

View file

@ -19,15 +19,17 @@
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// $Id: Shape.hh,v 1.3 2003/12/16 23:32:02 fluxgen Exp $
// $Id: Shape.hh,v 1.4 2004/01/11 15:02:11 fluxgen Exp $
#ifndef SHAPE_HH
#define SHAPE_HH
#include <X11/Xlib.h>
#include <memory>
namespace FbTk {
class FbWindow;
class FbPixmap;
}
/// creates round corners on windows
@ -49,16 +51,16 @@ public:
void update();
/// assign a new window
void setWindow(FbTk::FbWindow &win);
unsigned int width() const;
unsigned int height() const;
// sets shape notify mask
static void setShapeNotify(const FbTk::FbWindow &win);
/// @return true if window has shape
static bool isShaped(const FbTk::FbWindow &win);
private:
FbTk::FbWindow *m_win; ///< window to be shaped
Pixmap m_shape; ///< our shape pixmap
std::auto_ptr<FbTk::FbPixmap> m_shape; ///< our shape pixmap
int m_shapeplaces; ///< places to shape
unsigned int m_width; ///< width of window (the "old" size), if width != window width then shape resizes
unsigned int m_height; ///< height of window (the "old" size), if height != window height then shape resizes
};
#endif // SHAPE_HH