Added parts related to event mask. Should be feature complete and the header more or less finalized now, but who knows if it as much as compiles, leave alone runs or works...

This commit is contained in:
Ben Anderson
2005-03-13 05:32:16 +00:00
parent 42f74197a3
commit a0b45c084d
2 changed files with 83 additions and 15 deletions
+70 -6
View File
@@ -1,13 +1,18 @@
#include "X11Helper.h"
#include <list>
#include <X11/Xlib.h> // Display, Window
#include "RageDisplay.h" // RageDisplay
vector<Callback_t> pCBacks; // Callbacks for the rendering thread
Display *pDpy; // Running X connection
Window *pWin; // Current window
unsigned short int pCt = 0; // Number of subsystems using the X connection
vector<Callback_t> pCBacks; // Callbacks for the rendering
// thread
list<long> pMasks; // Currently open masks
Display *pDpy; // Running X connection
Window *pWin; // Current window
unsigned short int pCt = 0; // Number of subsystems using
// the X connection
bool X11Helper::Go()
{
@@ -26,19 +31,75 @@ Display *X11Helper::Dpy()
return pDpy;
}
static bool pApplyMasks()
{
int i;
long finalMask;
i = 0;
while(i < pMasks.size() )
{
finalMask |= pMasks[i];
i++;
}
if(XSelectInput(pDpy, pWin, finalMask) == 0) { return false; }
return true;
}
bool X11Helper::OpenMask(long mask)
{
pMasks.push_back(mask);
return pApplyMasks();
}
bool X11Helper::CloseMask(long mask)
{
int i;
i = 0;
while(true)
{
if(pMasks[i] == mask)
{
pMasks.erase(i);
break;
}
i++;
if(i > pMasks.size()-1) { return false; }
}
return pApplyMasks();
}
bool X11Helper::MakeWindow(int screenNum, int depth, Visual *visual int width=64, int height=64)
{
int i;
if(dpy == NULL) { return false; }
XSetWindowAttributes winAttribs;
winAttribs.border_pixel = 0;
winAttribs.event_mask = StructureNotifyMask;
// XXX: Error catching/handling?
winAttribs.colormap = XCreateColorMap(pDpy, RootWindow(pDpy, screenNum),
visual, AllocNone);
pWin = XCreateWindow(pDpy, RootWindow(pDpy, screenNum), 0, 0, width, height
pWin = XCreateWindow(pDpy, RootWindow(pDpy, screenNum), 0, 0, width,
height, 0, depth, InputOutput, visual,
CWBorderPixel | CWColorMap | CWEventMask, &winAttribs);
i = 0;
while(i < pCBacks.size() )
{
pCBacks[i](pWin);
i++;
}
return pApplyMasks();
}
bool X11Helper::Callback(Callback_t cb)
@@ -55,7 +116,10 @@ void X11Helper::Stop()
if(pCt == 0)
{
XCloseDisplay(pDpy);
pMasks.clear();
}
return true;
}
/*
+13 -9
View File
@@ -8,9 +8,11 @@
namespace X11Helper
{
// All functions in here that return a bool return true on success, and
// false on failure.
// Create the connection, if necessary; otherwise do some important
// internal session-tracking stuff (so you should call this anyway).
// True on success, false failure.
bool Go();
// Get the current Display (connection). Behavior is undefined if you
@@ -19,26 +21,28 @@ namespace X11Helper
// (Re)create the window on the screen of this number with this depth,
// this visual type, this width (optional -- you can resize the window
// in your callback later), and this height (optional). Returns true on
// success, false on failure.
// in your callback later), and this height (optional).
bool MakeWindow(int screenNum, int depth, Visual *visual, int width=64,
int height=64);
// Callback type.
typedef void (*Callback_t)(Window*);
// TODO: We need to manage event masks here, to keep the InputHandler
// and LowLevelWindow code separate.
// Unmask one X event type mask thingy (XSelectInput() arg 3) on the
// current window. Masked/unmasked events will carry between windows.
bool OpenMask(long mask);
// (Re)mask one X event type mask thingy (XSelectInput() arg 3) on the
// current window. Masked/unmasked events will carry between windows.
bool CloseMask(long mask);
// Register a callback for new windows (including the initial window).
// This callback will be called with 0 if I try to create a new window,
// but fail. Returns false if for some really messed up reason it fails
// (shouldn't happen), false otherwise
// but fail.
bool Callback(Callback_t cb);
// Destroy the connection, if appropriate; otherwise do some important
// internal session-tracking stuff (so you should call it anyway).
// True success, false failure.
void Stop();
}