[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