]> Dogcows Code - chaz/openbox/blobdiff - src/XDisplay.cc
new i18n class using overloaded operator() instead of getMessage()
[chaz/openbox] / src / XDisplay.cc
index 48f19d76ae4caf24334d03e9887fb236fc717f2a..1dfd55d04341d4aae3249ba3f7dbb99af7bf2cce 100644 (file)
 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 // DEALINGS IN THE SOFTWARE.
 
-#include "Xdisplay.h"
+#ifdef HAVE_CONFIG_H
+# include "../config.h"
+#endif
+
+#ifdef HAVE_UNNISTD_H
+# include <unistd.h>
+#endif
+
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+
+#ifdef SHAPE
+# include <X11/extensions/shape.h>
+#endif
+
+#include "XDisplay.h"
 #include "XScreen.h"
 #include "Util.h"
 #include <iostream>
 #include <algorithm>
 
 using std::cerr;
+using std::endl;
+
+std::string XDisplay::_app_name;
+Window      XDisplay::_last_bad_window = None;
+  
+/*
+ * X error handler to handle all X errors while the application is
+ * running.
+ */
+int XDisplay::XErrorHandler(Display *d, XErrorEvent *e) {
+#ifdef DEBUG
+  char errtxt[128];
+  XGetErrorText(d, e->error_code, errtxt, sizeof(errtxt)/sizeof(char));
+  cerr << _app_name.c_str() << ": X error: " << 
+    errtxt << "(" << e->error_code << ") opcodes " <<
+    e->request_code << "/" << e->minor_code << endl;
+  cerr.flags(std::ios_base::hex);
+  cerr << "  resource 0x" << e->resourceid << endl;
+  cerr.flags(std::ios_base::dec);
+#endif
+  
+  if (e->error_code == BadWindow)
+    _last_bad_window = e->resourceid;
+  
+  return False;
+}
+
 
-Xdisplay::Xdisplay(const char *dpyname) {
+XDisplay::XDisplay(const std::string &application_name, const char *dpyname) {
+  _app_name = application_name;
   _grabs = 0;
   _hasshape = false;
   
-  _display = XOpenDisplay(dpy_name);
+  _display = XOpenDisplay(dpyname);
   if (_display == NULL) {
     cerr << "Could not open display. Connection to X server failed.\n";
     ::exit(2);
   }
-  if (-1 == fcntl(ConnectionNumber(display), F_SETFD, 1)) {
+  if (-1 == fcntl(ConnectionNumber(_display), F_SETFD, 1)) {
     cerr << "Could not mark display connection as close-on-exec.\n";
     ::exit(2);
   }
@@ -52,11 +96,11 @@ Xdisplay::Xdisplay(const char *dpyname) {
   const unsigned int scount = ScreenCount(_display);
   _screens.reserve(scount);
   for (unsigned int s = 0; s < scount; s++)
-    _screens.push_back(new XScreen(_display, s));
+    _screens.push_back(new XScreen(this, s));
 }
 
 
-Xdisplay::~Xdisplay() {
+XDisplay::~XDisplay() {
   std::for_each(_screens.begin(), _screens.end(), PointerAssassin());
   XCloseDisplay(_display);
 }
@@ -65,7 +109,7 @@ Xdisplay::~Xdisplay() {
 /*
  * Return information about a screen.
  */
-XScreen *Xdisplay::screen(unsigned int s) const {
+XScreen *XDisplay::screen(unsigned int s) const {
   ASSERT(s < _screens.size());
   return _screens[s];
 }
This page took 0.025077 seconds and 4 git commands to generate.