]> Dogcows Code - chaz/openbox/commitdiff
merge in netwm branch at tag netwm-merge2
authorDana Jansens <danakj@orodu.net>
Thu, 30 May 2002 06:51:43 +0000 (06:51 +0000)
committerDana Jansens <danakj@orodu.net>
Thu, 30 May 2002 06:51:43 +0000 (06:51 +0000)
src/Screen.cc
src/Window.cc
src/Window.hh
src/XAtom.cc
src/XAtom.hh
src/blackbox.cc
src/blackbox.hh

index 23638ae906f3ea86786d8972ca61d50e643bb5c7..d22999efe81083e21a70ddb9dfd64c437b37812a 100644 (file)
@@ -137,7 +137,7 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) {
 
   xatom->setSupported(this);    // set-up netwm support
 #ifdef    HAVE_GETPID
-  xatom->setValue(getRootWindow(), XAtom::blackbox_pid, XAtom::Type_Cardinal,
+  xatom->setValue(getRootWindow(), XAtom::blackbox_pid, XAtom::cardinal,
                   (unsigned long) getpid());
 #endif // HAVE_GETPID
 
@@ -230,10 +230,16 @@ BScreen::BScreen(Blackbox *bb, unsigned int scrn) : ScreenInfo(bb, scrn) {
   }
   saveWorkspaceNames();
 
+  updateNetizenWorkspaceCount();
+
   workspacemenu->insert(i18n(IconSet, IconIcons, "Icons"), iconmenu);
   workspacemenu->update();
 
   current_workspace = workspacesList.front();
+  
+  xatom->setValue(getRootWindow(), XAtom::net_current_desktop,
+                  XAtom::cardinal, 0); //first workspace
+
   workspacemenu->setItemSelected(2, True);
 
   toolbar = new Toolbar(this);
@@ -1020,6 +1026,10 @@ void BScreen::changeWorkspaceID(unsigned int id) {
 
     current_workspace = getWorkspace(id);
 
+    xatom->setValue(getRootWindow(), XAtom::net_current_desktop,
+                    XAtom::cardinal, id);
+    printf("%d\n", id);
+
     workspacemenu->setItemSelected(current_workspace->getID() + 2, True);
     toolbar->redrawWorkspaceLabel(True);
 
@@ -1107,6 +1117,9 @@ void BScreen::removeNetizen(Window w) {
 }
 
 
+  xatom->setValue(getRootWindow(), XAtom::net_number_of_desktops,
+                  XAtom::cardinal, workspacesList.size());
+
 void BScreen::updateNetizenCurrentWorkspace(void) {
   std::for_each(netizenList.begin(), netizenList.end(),
                 std::mem_fun(&Netizen::sendCurrentWorkspace));
index a90e5183e36a4b56ce8654dfe27373d7c7a7a8a2..47809ea900240747bb6411324ab9526f77b08965 100644 (file)
@@ -75,6 +75,7 @@ BlackboxWindow::BlackboxWindow(Blackbox *b, Window w, BScreen *s) {
   blackbox = b;
   client.window = w;
   screen = s;
+  xatom = blackbox->getXAtom();
 
   if (! validateClient()) {
     delete this;
@@ -1758,14 +1759,10 @@ void BlackboxWindow::setState(unsigned long new_state) {
   unsigned long state[2];
   state[0] = current_state;
   state[1] = None;
-  XChangeProperty(blackbox->getXDisplay(), client.window,
-                  blackbox->getWMStateAtom(), blackbox->getWMStateAtom(), 32,
-                  PropModeReplace, (unsigned char *) state, 2);
-
-  XChangeProperty(blackbox->getXDisplay(), client.window,
-                  blackbox->getBlackboxAttributesAtom(),
-                  blackbox->getBlackboxAttributesAtom(), 32, PropModeReplace,
-                  (unsigned char *) &blackbox_attrib,
+  xatom->setValue(client.window, XAtom::wm_state, XAtom::wm_state, state, 2);
+  xatom->setValue(client.window, XAtom::blackbox_attributes,
+                  XAtom::blackbox_attributes, (unsigned long *)&blackbox_attrib,
                   PropBlackboxAttributesElements);
 }
 
@@ -1775,27 +1772,16 @@ bool BlackboxWindow::getState(void) {
 
   Atom atom_return;
   bool ret = False;
-  int foo;
-  unsigned long *state, ulfoo, nitems;
-
-  if ((XGetWindowProperty(blackbox->getXDisplay(), client.window,
-                          blackbox->getWMStateAtom(),
-                          0l, 2l, False, blackbox->getWMStateAtom(),
-                          &atom_return, &foo, &nitems, &ulfoo,
-                          (unsigned char **) &state) != Success) ||
-      (! state)) {
-    return False;
-  }
-
-  if (nitems >= 1) {
-    current_state = static_cast<unsigned long>(state[0]);
+  unsigned long *state, nitems;
 
-    ret = True;
-  }
+  if (! xatom->getValue(client.window, XAtom::wm_state, XAtom::wm_state, nitems,
+                        &state))
+    return False;
 
-  XFree((void *) state);
+  current_state = static_cast<unsigned long>(state[0]);
+  delete state;
 
-  return ret;
+  return True;
 }
 
 
index 9bed2798f859aba0fd0d9054d8b9c07113f7e8ba..6dda6558e89289d3ae86e53b808ca01eaec77f22 100644 (file)
@@ -111,6 +111,7 @@ public:
 private:
   Blackbox *blackbox;
   BScreen *screen;
+  XAtom *xatom;
   BTimer *timer;
   BlackboxAttributes blackbox_attrib;
 
index 8940f2e36db52e5a13b79779a866269ce7659808..649f118f7b7395a9fb7997210f2d63834e3d6100 100644 (file)
@@ -32,6 +32,11 @@ XAtom::XAtom(Blackbox *bb) {
   // make sure asserts fire if there is a problem
   memset(_atoms, sizeof(_atoms), 0);
 
+  _atoms[cardinal] = XA_CARDINAL;
+  _atoms[window] = XA_WINDOW;
+  _atoms[pixmap] = XA_PIXMAP;
+  _atoms[atom] = XA_ATOM;
+  _atoms[string] = XA_STRING;
   _atoms[utf8_string] = create("UTF8_STRING");
   
 #ifdef    HAVE_GETPID
@@ -132,40 +137,38 @@ void XAtom::setSupported(const ScreenInfo *screen) {
   _support_windows.push_back(w);
   
   // set supporting window
-  setValue(root, net_supporting_wm_check, Type_Window, w);
+  setValue(root, net_supporting_wm_check, window, w);
  
   //set properties on the supporting window
-  setValue(w, net_wm_name, Type_Utf8, "Openbox");
-  setValue(w, net_supporting_wm_check, Type_Window, w);
-  
+  setValue(w, net_wm_name, utf8, "Openbox");
+  setValue(w, net_supporting_wm_check, window, w);
   
   // we don't support any yet..
   // yes we do!
 
   Atom supported[] = {
-    _atoms[net_supported]      // remove me later, cuz i dont think i belong
+    _atoms[net_current_desktop],
+    _atoms[net_number_of_desktops]
   };
+  const int num_supported = sizeof(supported)/sizeof(Atom);
 
-  eraseValue(root, net_supported);
-  for (unsigned int i = 0, num = sizeof(supported)/sizeof(Atom); i < num; ++i)
-    addValue(root, net_supported, Type_Atom, supported[i]);
+  setValue(root, net_supported, atom, supported, num_supported);
 }
   
 
 /*
- * Internal setValue used by all typed setValue functions.
+ * Internal setValue.
  * Sets a window property on a window, optionally appending to the existing
  * value.
  */
-void XAtom::setValue(Window win, AvailableAtoms atom, Atom type,
+void XAtom::setValue(Window win, Atom atom, Atom type,
                      unsigned char* data, int size, int nelements,
                      bool append) const {
-  assert(atom >= 0 && atom < NUM_ATOMS);
-  assert(win != None); assert(type != None);
+  assert(win != None); assert(atom != None); assert(type != None);
   assert(data != (unsigned char *) 0);
   assert(size == 8 || size == 16 || size == 32);
   assert(nelements > 0);
-  XChangeProperty(_display, win, _atoms[atom], type, size,
+  XChangeProperty(_display, win, atom, type, size,
                   (append ? PropModeAppend : PropModeReplace),
                   data, nelements);                  
 }
@@ -174,73 +177,53 @@ void XAtom::setValue(Window win, AvailableAtoms atom, Atom type,
 /*
  * Set a 32-bit property value on a window.
  */
-void XAtom::setValue(Window win, AvailableAtoms atom, AtomType type,
+void XAtom::setValue(Window win, Atoms atom, Atoms type,
                      unsigned long value) const {
-  Atom t;
-  switch (type) {
-  case Type_Cardinal: t = XA_CARDINAL; break;
-  case Type_Atom:     t = XA_ATOM;     break;
-  case Type_Window:   t = XA_WINDOW;   break;
-  case Type_Pixmap:   t = XA_PIXMAP;   break;
-  default: assert(false); // unhandled AtomType
-  }
-  setValue(win, atom, t, reinterpret_cast<unsigned char*>(&value),
-           32, 1, false);
-}
-
-
-/*
- * Set a string property value on a window.
- */
-void XAtom::setValue(Window win, AvailableAtoms atom, StringType type,
-                     const std::string &value) const {
-  Atom t;
-  switch (type) {
-  case Type_String: t = XA_STRING;           break;
-  case Type_Utf8:   t = _atoms[utf8_string]; break;
-  default: assert(false); // unhandled StringType
-  }
-  setValue(win, atom, t,
-           const_cast<unsigned char*>
-           (reinterpret_cast<const unsigned char*>(value.c_str())),
-           8, value.size(), false);
+  assert(atom >= 0 && atom < NUM_ATOMS);
+  assert(type >= 0 && type < NUM_ATOMS);
+  setValue(win, _atoms[atom], _atoms[type],
+           reinterpret_cast<unsigned char*>(&value), 32, 1, false);
 }
 
 
 /*
- * Add elements to a 32-bit property value on a window.
+ * Set an array of 32-bit properties value on a window.
  */
-void XAtom::addValue(Window win, AvailableAtoms atom, AtomType type,
-                     unsigned long value) const {
-  Atom t;
-  switch (type) {
-  case Type_Cardinal: t = XA_CARDINAL; break;
-  case Type_Atom:     t = XA_ATOM;     break;
-  case Type_Window:   t = XA_WINDOW;   break;
-  case Type_Pixmap:   t = XA_PIXMAP;   break;
-  default: assert(false); // unhandled Atom_Type
-  }
-  setValue(win, atom, t, reinterpret_cast<unsigned char*>(&value), 32, 1, true);
+void XAtom::setValue(Window win, Atoms atom, Atoms type,
+                     unsigned long value[], int elements) const {
+  assert(atom >= 0 && atom < NUM_ATOMS);
+  assert(type >= 0 && type < NUM_ATOMS);
+  setValue(win, _atoms[atom], _atoms[type],
+           reinterpret_cast<unsigned char*>(value), 32, elements, false);
 }
 
 
 /*
- * Add characters to a string property value on a window.
+ * Set an string property value on a window.
  */
-void XAtom::addValue(Window win, AvailableAtoms atom, StringType type,
+void XAtom::setValue(Window win, Atoms atom, StringType type,
                      const std::string &value) const {
-  Atom t;
-  switch (type) {
-  case Type_String: t = XA_STRING;           break;
-  case Type_Utf8:   t = _atoms[utf8_string]; break;
-  default: assert(false); // unhandled StringType
+  assert(atom >= 0 && atom < NUM_ATOMS);
+  assert(type >= 0 && type < NUM_STRING_TYPE);
+  assert(win != None); assert(_atoms[atom] != None);
+
+  const char *c = value.c_str();
+  XTextProperty textprop;
+  if (Success != XmbTextListToTextProperty(_display, const_cast<char**>(&c), 1,
+                                           type == ansi ? XStringStyle :
+#ifdef X_HAVE_UTF8_STRING
+                                           XUTF8StringStyle,
+#else
+                                           XCompoundTextStyle,
+#endif
+                                           &textprop)) {
+    return;
   }
-  setValue(win, atom, t,
-           const_cast<unsigned char*>
-           (reinterpret_cast<const unsigned char *>
-            (value.c_str())),
-           8, value.size(), true);
-} 
+  
+  XSetTextProperty(_display, win, &textprop, _atoms[atom]);
+
+  XFree(textprop.value);
+}
 
 
 /*
@@ -250,19 +233,18 @@ void XAtom::addValue(Window win, AvailableAtoms atom, StringType type,
  * property did not exist on the window, or has a different type/size format
  * than the user tried to retrieve.
  */
-bool XAtom::getValue(Window win, AvailableAtoms atom, Atom type,
-                     unsigned long *nelements, unsigned char **value,
+bool XAtom::getValue(Window win, Atom atom, Atom type,
+                     unsigned long &nelements, unsigned char **value,
                      int size) const {
-  assert(atom >= 0 && atom < NUM_ATOMS);
-  assert(win != None); assert(type != None);
+  assert(win != None); assert(atom != None); assert(type != None);
   assert(size == 8 || size == 16 || size == 32);
   unsigned char *c_val;        // value alloc'd with c malloc
   Atom ret_type;
   int ret_size;
   unsigned long ret_bytes;
-  XGetWindowProperty(_display, win, _atoms[atom], 0l, 1l, False,
-                     AnyPropertyType, &ret_type, &ret_size, nelements,
-                     &ret_bytes, &c_val); // try get the first element
+  // try get the first element
+  XGetWindowProperty(_display, win, atom, 0l, 1l, False, AnyPropertyType,
+                     &ret_type, &ret_size, &nelements, &ret_bytes, &c_val);
   if (ret_type == None)
     // the property does not exist on the window
     return false;
@@ -274,8 +256,8 @@ bool XAtom::getValue(Window win, AvailableAtoms atom, Atom type,
   // the data is correct, now, is there more than 1 element?
   if (ret_bytes == 0) {
     // we got the whole property's value
-    *value = new unsigned char[*nelements * size/8 + 1];
-    memcpy(*value, c_val, *nelements * size/8 + 1);
+    *value = new unsigned char[nelements * size/8 + 1];
+    memcpy(*value, c_val, nelements * size/8 + 1);
     XFree(c_val);
     return true;    
   }
@@ -284,11 +266,11 @@ bool XAtom::getValue(Window win, AvailableAtoms atom, Atom type,
   // the number of longs that need to be retreived to get the property's entire
   // value. The last + 1 is the first long that we retrieved above.
   const int remain = (ret_bytes - 1)/sizeof(long) + 1 + 1;
-  XGetWindowProperty(_display, win, _atoms[atom], 0l, remain, False, type,
-                     &ret_type, &ret_size, nelements, &ret_bytes, &c_val);
+  XGetWindowProperty(_display, win, atom, 0l, remain, False, type, &ret_type,
+                     &ret_size, &nelements, &ret_bytes, &c_val);
   assert(ret_bytes == 0);
-  *value = new unsigned char[*nelements * size/8 + 1];
-  memcpy(*value, c_val, *nelements * size/8 + 1);
+  *value = new unsigned char[nelements * size/8 + 1];
+  memcpy(*value, c_val, nelements * size/8 + 1);
   XFree(c_val);
   return true;    
 }
@@ -297,18 +279,12 @@ bool XAtom::getValue(Window win, AvailableAtoms atom, Atom type,
 /*
  * Gets a 32-bit property's value from a window.
  */
-bool XAtom::getValue(Window win, AvailableAtoms atom, AtomType type,
-                         unsigned long *nelements,
+bool XAtom::getValue(Window win, Atoms atom, Atoms type,
+                         unsigned long &nelements,
                          unsigned long **value) const {
-  Atom t;
-  switch (type) {
-  case Type_Cardinal: t = XA_CARDINAL; break;
-  case Type_Atom:     t = XA_ATOM;     break;
-  case Type_Window:   t = XA_WINDOW;   break;
-  case Type_Pixmap:   t = XA_PIXMAP;   break;
-  default: assert(false); // unhandled Atom_Type
-  }
-  return getValue(win, atom, XA_CARDINAL, nelements,
+  assert(atom >= 0 && atom < NUM_ATOMS);
+  assert(type >= 0 && type < NUM_ATOMS);
+  return getValue(win, _atoms[atom], _atoms[type], nelements,
                   reinterpret_cast<unsigned char **>(value), 32);
 }
 
@@ -316,26 +292,48 @@ bool XAtom::getValue(Window win, AvailableAtoms atom, AtomType type,
 /*
  * Gets an string property's value from a window.
  */
-bool XAtom::getValue(Window win, AvailableAtoms atom, StringType type,
+bool XAtom::getValue(Window win, Atoms atom, StringType type,
                      std::string &value) const {
-  Atom t;
-  switch (type) {
-  case Type_String: t = XA_STRING;           break;
-  case Type_Utf8:   t = _atoms[utf8_string]; break;
-  default: assert(false); // unhandled StringType
+  assert(atom >= 0 && atom < NUM_ATOMS);
+  assert(type >= 0 && type < NUM_STRING_TYPE);
+  assert(win != None); assert(_atoms[atom] != None);
+
+  XTextProperty textprop;
+  if (0 == XGetTextProperty(_display, win, &textprop, _atoms[atom]))
+    return false;
+
+  int ret;
+  int count;
+  char **list;
+  if (type == ansi) {
+      ret = XmbTextPropertyToTextList(_display, &textprop, &list, &count);
+  } else {
+#ifdef X_HAVE_UTF8_STRING
+    ret = Xutf8TextPropertyToTextList(_display, &textprop, &list, &count);
+#else
+    ret = XmbTextPropertyToTextList(_display, &textprop, &list, &count);
+#endif
   }
-  unsigned char *data;
-  unsigned long nelements;
-  bool ret = getValue(win, atom, t, &nelements, &data, 8);
-  if (ret)
-    value = reinterpret_cast<char*>(data);
-  return ret;
+  if (ret != Success || count < 1) {
+    XFree(textprop.value);
+    return false;
+  }
+
+  value = list[0];
+
+  XFreeStringList(list);
+  XFree(textprop.value);
+  return true;
 }
 
 
+
+
 /*
  * Removes a property entirely from a window.
  */
-void XAtom::eraseValue(Window win, AvailableAtoms atom) const {
+void XAtom::eraseValue(Window win, Atoms atom) const {
+  assert(atom >= 0 && atom < NUM_ATOMS);
   XDeleteProperty(_display, win, _atoms[atom]);
 }
index f73f75580c302c7f57e30f8e51e796955e568fa3..580b973c6e3f961e6eb3b81440c2ff48f8984008 100644 (file)
@@ -32,8 +32,13 @@ class ScreenInfo;
 
 class XAtom {
 public:
-  enum AvailableAtoms {
-    // string type
+  enum Atoms {
+    // types
+    cardinal,
+    window,
+    pixmap,
+    atom,
+    string,
     utf8_string,
     
 #ifdef    HAVE_GETPID
@@ -102,16 +107,10 @@ public:
     NUM_ATOMS
   };
 
-  enum AtomType {
-    Type_Cardinal,
-    Type_Atom,
-    Type_Window,
-    Type_Pixmap
-  };
-
   enum StringType {
-    Type_String,
-    Type_Utf8,
+    ansi,
+    utf8,
+    NUM_STRING_TYPE
   };
 
 private:
@@ -124,10 +123,10 @@ private:
 
   Atom create(const char *name) const;
 
-  void setValue(Window win, AvailableAtoms atom, Atom type, unsigned char *data,
+  void setValue(Window win, Atom atom, Atom type, unsigned char *data,
                 int size, int nelements, bool append) const;
-  bool getValue(Window win, AvailableAtoms atom, Atom type,
-                unsigned long *nelements, unsigned char **value,
+  bool getValue(Window win, Atom atom, Atom type,
+                unsigned long &nelements, unsigned char **value,
                 int size) const;
 
   // no copying!!
@@ -142,29 +141,25 @@ public:
   // constructor.
   void setSupported(const ScreenInfo *screen);
   
-  void setValue(Window win, AvailableAtoms atom, AtomType type,
-                unsigned long value) const;
-  void setValue(Window win, AvailableAtoms atom, StringType type,
-                const std::string &value) const;
-
-  void addValue(Window win, AvailableAtoms atom, AtomType type,
-                unsigned long value) const;
-  void addValue(Window win, AvailableAtoms atom, StringType type,
+  void setValue(Window win, Atoms atom, Atoms type, unsigned long value) const;
+  void setValue(Window win, Atoms atom, Atoms type,
+                unsigned long value[], int elements) const;
+  void setValue(Window win, Atoms atom, StringType type,
                 const std::string &value) const;
 
   // the 'value' is allocated inside the function and
   // delete [] value needs to be called when you are done with it.
   // the 'value' array returned is null terminated, and has 'nelements'
   // elements in it plus the null.
-  bool getValue(Window win, AvailableAtoms atom, AtomType type,
-                unsigned long *nelements, unsigned long **value) const;
-  bool getValue(Window win, AvailableAtoms atom, StringType type,
+  bool getValue(Window win, Atoms atom, Atoms type,
+                unsigned long &nelements, unsigned long **value) const;
+  bool getValue(Window win, Atoms atom, StringType type,
                 std::string &value) const;
   
-  void eraseValue(Window win, AvailableAtoms atom) const;
+  void eraseValue(Window win, Atoms atom) const;
 
   // temporary function!! remove when not used in blackbox.hh anymore!!
-  inline Atom getAtom(AvailableAtoms a)
+  inline Atom getAtom(Atoms a)
   { Atom ret = _atoms[a]; assert(ret != 0); return ret; }
 };
 
index 1c543bbea69c155fd2de41a7630783f40a0e5554..ce727aff42354a5c62b2916513b9589bf37c992a 100644 (file)
@@ -653,7 +653,7 @@ void Blackbox::process_event(XEvent *e) {
 
   case ClientMessage: {
     if (e->xclient.format == 32) {
-      if (e->xclient.message_type == getWMChangeStateAtom()) {
+      if (e->xclient.message_type == xatom->getAtom(XAtom::wm_change_state)) {
         BlackboxWindow *win = searchWindow(e->xclient.window);
         if (! win || ! win->validateClient()) return;
 
index 0e39cc2f48e3a2cc7b727a1b90f31db81b73dfec..cb38dc3400ae019800703d1c19ce2f7e86bff84b 100644 (file)
@@ -245,10 +245,6 @@ public:
   enum { B_AmericanDate = 1, B_EuropeanDate };
 #endif // HAVE_STRFTIME
 
-  inline Atom getWMChangeStateAtom(void) const
-    { return xatom->getAtom(XAtom::wm_change_state); }
-  inline Atom getWMStateAtom(void) const
-    { return xatom->getAtom(XAtom::wm_state); }
   inline Atom getWMDeleteAtom(void) const
     { return xatom->getAtom(XAtom::wm_delete_window); }
   inline Atom getWMProtocolsAtom(void) const
This page took 0.041091 seconds and 4 git commands to generate.