[openbox] patch for ob3
Jason 'vanRijn' Kasper
vR at movingparts.net
Wed Sep 18 22:57:56 EDT 2002
Um. What exactly does this patch do again?
On Wed, 2002-09-18 at 22:51, Ruhi Bloodworth wrote:
> x0r,
>
> This patch adds the following
>
> a screen list to display and a window list to screen
> the beginings of an event_loop
>
> Regards,
> Colo
> ----
>
> ? autom4te.cache
> ? main.cc
> ? mychanges.patch
> Index: wm/main.cc
> ===================================================================
> RCS file: /cvs/cvsroot/openbox3/wm/main.cc,v
> retrieving revision 1.4
> diff -p -u -r1.4 main.cc
> --- wm/main.cc 2002/09/19 02:18:14 1.4
> +++ wm/main.cc 2002/09/19 02:46:26
> @@ -1,5 +1,6 @@
> #include "xlib/display.hh"
> #include "xlib/screen.hh"
> +#include "xlib/window.hh"
>
> #include <iostream>
> #include <string>
> @@ -9,7 +10,40 @@ using std::cerr;
> using std::endl;
> using xlib::XDisplay;
> using xlib::XScreen;
> +using xlib::XWindow;
>
> +int process_event(XDisplay &display,XEvent *e){
> + switch(e->type) {
> + case MapRequest: {
> + cerr << "process_event(): MapRequest for "<<e->xmaprequest.window << endl;
> +
> + XWindowAttributes attr;
> + XGetWindowAttributes(e->xmaprequest.display,e->xmaprequest.window,
> + &attr);
> +
> + XScreen *screen = display.findScreen(XScreenNumberOfScreen(attr.screen));
> + if (screen){
> + XWindow *win = new XWindow(display,(*screen),e->xmaprequest.window);
> + win->map();
> + return 1;
> + }
> + cerr << "process_event(): error processing MapRequest" << endl;
> + break;
> + }
> + }
> + return 0;
> +}
> +
> +void eventLoop(XDisplay &display){
> + XEvent *e=0;
> + e = display.nextEvent();
> + cerr << "In eventLoop" << endl;
> + while(process_event(display,e)){
> + delete e;
> + e = display.nextEvent();
> + }
> +}
> +
> int main(int argc, char **argv) {
> string session_display;
>
> @@ -39,5 +73,8 @@ int main(int argc, char **argv) {
>
> XScreen screen(display, 0);
>
> + cerr << "Opened X screen " << screen.name() << endl;
> + screen.root().manage();
> + eventLoop(display);
> display.close();
> }
> Index: xlib/display.cc
> ===================================================================
> RCS file: /cvs/cvsroot/openbox3/xlib/display.cc,v
> retrieving revision 1.6
> diff -p -u -r1.6 display.cc
> --- xlib/display.cc 2002/09/18 04:53:14 1.6
> +++ xlib/display.cc 2002/09/19 02:46:26
> @@ -45,3 +45,16 @@ void XDisplay::close()
> XCloseDisplay(_display);
> _display = NULL;
> }
> +
> +XScreen *XDisplay::findScreen(const int number) const{
> + //Create constant iterator for list
> + list<XScreen*>::const_iterator iter;
> + for (iter=_screen_list.begin();
> + ((iter != _screen_list.end())&&((*iter)->number() != number));
> + iter++)
> + ;
> + if (iter != _screen_list.end())
> + return (*iter);
> + else
> + return 0;
> +}
> Index: xlib/display.hh
> ===================================================================
> RCS file: /cvs/cvsroot/openbox3/xlib/display.hh,v
> retrieving revision 1.9
> diff -p -u -r1.9 display.hh
> --- xlib/display.hh 2002/09/18 05:35:52 1.9
> +++ xlib/display.hh 2002/09/19 02:46:27
> @@ -6,10 +6,11 @@ extern "C" {
> #include <assert.h>
> }
> #include <string>
> +#include <list>
>
> +#include "xlib/screen.hh"
> namespace xlib {
>
> -class XScreen;
> class XDrawable;
>
> /*!
> @@ -22,7 +23,8 @@ private:
> Display *_display;
> //! The name of the display this class has open.
> std::string _name;
> -
> + //! The list of screens on this display
> + std::list<XScreen*> _screen_list;
> public:
> //! Constructor for the XDisplay object.
> XDisplay();
> @@ -57,6 +59,36 @@ public:
> return ScreenCount(_display);
> }
>
> + //! Returns the number of events waiting on the event queue
> + inline int pendingEvents() const {
> + return XPending(_display);
> + }
> +
> + /*! Returns the next event from the event queue
> + If the event queue is empty then the call waits until an event is recived
> + The caller is responsible for freeing the returned event
> + */
> + inline XEvent* nextEvent(){
> + XEvent *e = new XEvent; XNextEvent(_display,e);
> + return e;
> + }
> + /*! Adds an XScreen to the list of screens on this display
> + \param screen the XScreen to add to the list
> + */
> + inline void addScreen(XScreen *screen){
> + _screen_list.push_back(screen);
> + }
> + /*! Finds the XScreen given the screen number or returns Null
> + \param number The screen number of the XScreen to be retrived
> + */
> + XScreen *findScreen(const int number) const;
> + /*! Removes the specified XScreen from the list of screens
> + if screen is not in the list nothing is done
> + \param screen A pointer to the XScreen to remove
> + */
> + inline void removeScreen(XScreen *screen){
> + _screen_list.remove(screen);
> + }
> friend class XScreen;
> friend class XDrawable;
> };
> Index: xlib/screen.cc
> ===================================================================
> RCS file: /cvs/cvsroot/openbox3/xlib/screen.cc,v
> retrieving revision 1.6
> diff -p -u -r1.6 screen.cc
> --- xlib/screen.cc 2002/09/18 13:45:14 1.6
> +++ xlib/screen.cc 2002/09/19 02:46:27
> @@ -79,6 +79,8 @@ XScreen::XScreen(XDisplay &xdisplay, int
> // set the name to the display plus this screen's number
> _name = default_string + '.' + itostring(_number);
>
> + // register with the display
> + xdisplay.addScreen(this);
>
> // this is done last since XWindow uses XScreen
> _root = new XWindow(_xdisplay, *this, RootWindow(_display, number));
> @@ -86,6 +88,7 @@ XScreen::XScreen(XDisplay &xdisplay, int
>
> XScreen::~XScreen()
> {
> + _xdisplay.removeScreen(this);
> delete _root;
> }
>
> Index: xlib/screen.hh
> ===================================================================
> RCS file: /cvs/cvsroot/openbox3/xlib/screen.hh,v
> retrieving revision 1.8
> diff -p -u -r1.8 screen.hh
> --- xlib/screen.hh 2002/09/18 13:45:14 1.8
> +++ xlib/screen.hh 2002/09/19 02:46:27
> @@ -8,8 +8,8 @@ extern "C" {
>
> #include "window.hh"
> #include "util/rect.hh"
> -
> #include <string>
> +#include <list>
>
> namespace xlib {
>
> @@ -47,7 +47,8 @@ private:
> Colormap _colormap;
> //! The name of the screen on the display.
> std::string _name;
> -
> + //! The windows that are on this screen
> + std::list<XWindow*> _window_list;
> public:
> /*! Constructor for the XScreen object.
> \param display The XDisplay on which this screen will reside.
> @@ -87,6 +88,19 @@ public:
> return _depth;
> }
>
> + /*! Adds an XWindow to the screens list of windows
> + \param win The window to be inserted into the window list
> + */
> + inline void addWindow(XWindow *win){
> + _window_list.push_back(win);
> + }
> + /*! Removes the XWindow from the window list. If window is not in the list
> + nothign is done.
> + \param win The XWindow to remove from the list
> + */
> + inline void removeWindow(XWindow *win){
> + _window_list.remove(win);
> + }
> friend class XDrawable;
> friend class XWindow;
> };
> Index: xlib/window.cc
> ===================================================================
> RCS file: /cvs/cvsroot/openbox3/xlib/window.cc,v
> retrieving revision 1.4
> diff -p -u -r1.4 window.cc
> --- xlib/window.cc 2002/09/18 13:45:14 1.4
> +++ xlib/window.cc 2002/09/19 02:46:27
> @@ -21,7 +21,8 @@ XWindow::XWindow(XDisplay &xdisplay, XSc
> 0,
> 0);
> _area = area;
> -
> +
> + _xscreen.addWindow(this);
> assert(_id != None);
> }
>
> @@ -34,11 +35,13 @@ XWindow::XWindow(XDisplay &xdisplay, XSc
> _id = id;
> // XXX: Set _area properly from the id
> _area = Rect(0,0,1,1);
> + _xscreen.addWindow(this);
> }
>
>
> XWindow::~XWindow()
> {
> + _xscreen.removeWindow(this);
> XDestroyWindow(_display, _id);
> _id = 0;
> }
> @@ -57,4 +60,15 @@ void XWindow::unmap()
> assert(_id != None);
>
> XUnmapWindow(_display, _id);
> +}
> +
> +int XWindow::manage()
> +{
> + assert (_id != None);
> + const long rootEventMask = SubstructureRedirectMask |
> + PropertyChangeMask | EnterWindowMask |
> + ButtonPressMask | ButtonReleaseMask;
> + //-BUG-We are not checking to see if XSelectInput fails
> + XSelectInput(_display, _id, rootEventMask);
> + return 1;
> }
> Index: xlib/window.hh
> ===================================================================
> RCS file: /cvs/cvsroot/openbox3/xlib/window.hh,v
> retrieving revision 1.4
> diff -p -u -r1.4 window.hh
> --- xlib/window.hh 2002/09/18 13:45:14 1.4
> +++ xlib/window.hh 2002/09/19 02:46:27
> @@ -39,6 +39,7 @@ public:
> XWindow(XDisplay &xdisplay, XScreen &xscreen,
> util::Rect area = util::Rect(0, 0, 1, 1),
> XWindow *parent = static_cast<XWindow*>(0));
> +
> /*! Constructor for the XWindow object.
> Creates an X window for the class to contain.
> \param xdisplay The X display to host the window on.
> @@ -47,6 +48,7 @@ public:
> not create a new window.
> */
> XWindow(XDisplay &xdisplay, XScreen &xscreen, Window id);
> +
> /*! Destructor for the XWindow object.
> Destroys the window contained by the class.
> */
> @@ -54,6 +56,9 @@ public:
>
> void map();
> void unmap();
> +
> + //! Indicates the caller will intercept events for this window and its children
> + int manage();
> };
>
> }
--
,-----------------------------------------------------------------//
| Jason 'vanRijn' Kasper :: Numbers 6:22-26
`
| All brontosauruses are thin at one end, much MUCH thicker
| in the middle, and then thin again at the far end. That is
| the theory that I have and which is mine, and what it is too.
,
| bash$ :(){ :|:&};:
`----------------------//
More information about the openbox
mailing list