]> Dogcows Code - chaz/openbox/blobdiff - otk/property.cc
use otk objects in the ob scripts by importing otk
[chaz/openbox] / otk / property.cc
index 3ce902251e460b809aa52cf16e8f00856d3b518c..b12ff5036c27aef585be8a5c3a4c6ada0ea23f12 100644 (file)
@@ -8,6 +8,8 @@
 #include "display.hh"
 
 extern "C" {
+#include <X11/Xatom.h>
+
 #include <assert.h>
 }
 
@@ -15,260 +17,190 @@ extern "C" {
 
 namespace otk {
 
-OBProperty::OBProperty()
+Atoms Property::atoms;
+
+static Atom create(char *name) { return XInternAtom(**display, name, false); }
+
+void Property::initialize()
 {
-  assert(OBDisplay::display);
+  assert(display);
 
   // make sure asserts fire if there is a problem
-  memset(_atoms, 0, sizeof(_atoms));
-
-  _atoms[Atom_Cardinal] = XA_CARDINAL;
-  _atoms[Atom_Window] = XA_WINDOW;
-  _atoms[Atom_Pixmap] = XA_PIXMAP;
-  _atoms[Atom_Atom] = XA_ATOM;
-  _atoms[Atom_String] = XA_STRING;
-  _atoms[Atom_Utf8] = create("UTF8_STRING");
-  
-#ifdef    HAVE_GETPID
-  _atoms[blackbox_pid] = create("_BLACKBOX_PID");
-#endif // HAVE_GETPID
-
-  _atoms[wm_colormap_windows] = create("WM_COLORMAP_WINDOWS");
-  _atoms[wm_protocols] = create("WM_PROTOCOLS");
-  _atoms[wm_state] = create("WM_STATE");
-  _atoms[wm_change_state] = create("WM_CHANGE_STATE");
-  _atoms[wm_delete_window] = create("WM_DELETE_WINDOW");
-  _atoms[wm_take_focus] = create("WM_TAKE_FOCUS");
-  _atoms[wm_name] = create("WM_NAME");
-  _atoms[wm_icon_name] = create("WM_ICON_NAME");
-  _atoms[wm_class] = create("WM_CLASS");
-  _atoms[motif_wm_hints] = create("_MOTIF_WM_HINTS");
-  _atoms[blackbox_hints] = create("_BLACKBOX_HINTS");
-  _atoms[blackbox_attributes] = create("_BLACKBOX_ATTRIBUTES");
-  _atoms[blackbox_change_attributes] = create("_BLACKBOX_CHANGE_ATTRIBUTES");
-  _atoms[blackbox_structure_messages] = create("_BLACKBOX_STRUCTURE_MESSAGES");
-  _atoms[blackbox_notify_startup] = create("_BLACKBOX_NOTIFY_STARTUP");
-  _atoms[blackbox_notify_window_add] = create("_BLACKBOX_NOTIFY_WINDOW_ADD");
-  _atoms[blackbox_notify_window_del] = create("_BLACKBOX_NOTIFY_WINDOW_DEL");
-  _atoms[blackbox_notify_current_workspace] = 
-    create("_BLACKBOX_NOTIFY_CURRENT_WORKSPACE");
-  _atoms[blackbox_notify_workspace_count] =
-    create("_BLACKBOX_NOTIFY_WORKSPACE_COUNT");
-  _atoms[blackbox_notify_window_focus] =
-    create("_BLACKBOX_NOTIFY_WINDOW_FOCUS");
-  _atoms[blackbox_notify_window_raise] =
-    create("_BLACKBOX_NOTIFY_WINDOW_RAISE");
-  _atoms[blackbox_notify_window_lower] =
-    create("_BLACKBOX_NOTIFY_WINDOW_LOWER");
+  memset(&atoms, 0, sizeof(Atoms));
+
+  atoms.cardinal = XA_CARDINAL;
+  atoms.window = XA_WINDOW;
+  atoms.pixmap = XA_PIXMAP;
+  atoms.atom = XA_ATOM;
+  atoms.string = XA_STRING;
+  atoms.utf8 = create("UTF8_STRING");
   
-  _atoms[blackbox_change_workspace] = create("_BLACKBOX_CHANGE_WORKSPACE");
-  _atoms[blackbox_change_window_focus] =
-    create("_BLACKBOX_CHANGE_WINDOW_FOCUS");
-  _atoms[blackbox_cycle_window_focus] = create("_BLACKBOX_CYCLE_WINDOW_FOCUS");
-
-  _atoms[openbox_show_root_menu] = create("_OPENBOX_SHOW_ROOT_MENU");
-  _atoms[openbox_show_workspace_menu] = create("_OPENBOX_SHOW_WORKSPACE_MENU");
-
-  _atoms[net_supported] = create("_NET_SUPPORTED");
-  _atoms[net_client_list] = create("_NET_CLIENT_LIST");
-  _atoms[net_client_list_stacking] = create("_NET_CLIENT_LIST_STACKING");
-  _atoms[net_number_of_desktops] = create("_NET_NUMBER_OF_DESKTOPS");
-  _atoms[net_desktop_geometry] = create("_NET_DESKTOP_GEOMETRY");
-  _atoms[net_desktop_viewport] = create("_NET_DESKTOP_VIEWPORT");
-  _atoms[net_current_desktop] = create("_NET_CURRENT_DESKTOP");
-  _atoms[net_desktop_names] = create("_NET_DESKTOP_NAMES");
-  _atoms[net_active_window] = create("_NET_ACTIVE_WINDOW");
-  _atoms[net_workarea] = create("_NET_WORKAREA");
-  _atoms[net_supporting_wm_check] = create("_NET_SUPPORTING_WM_CHECK");
-//  _atoms[net_virtual_roots] = create("_NET_VIRTUAL_ROOTS");
-
-  _atoms[net_close_window] = create("_NET_CLOSE_WINDOW");
-  _atoms[net_wm_moveresize] = create("_NET_WM_MOVERESIZE");
-
-//  _atoms[net_properties] = create("_NET_PROPERTIES");
-  _atoms[net_wm_name] = create("_NET_WM_NAME");
-  _atoms[net_wm_visible_name] = create("_NET_WM_VISIBLE_NAME");
-  _atoms[net_wm_icon_name] = create("_NET_WM_ICON_NAME");
-  _atoms[net_wm_visible_icon_name] = create("_NET_WM_VISIBLE_ICON_NAME");
-  _atoms[net_wm_desktop] = create("_NET_WM_DESKTOP");
-  _atoms[net_wm_window_type] = create("_NET_WM_WINDOW_TYPE");
-  _atoms[net_wm_state] = create("_NET_WM_STATE");
-  _atoms[net_wm_strut] = create("_NET_WM_STRUT");
-//  _atoms[net_wm_icon_geometry] = create("_NET_WM_ICON_GEOMETRY");
-//  _atoms[net_wm_icon] = create("_NET_WM_ICON");
-//  _atoms[net_wm_pid] = create("_NET_WM_PID");
-//  _atoms[net_wm_handled_icons] = create("_NET_WM_HANDLED_ICONS");
-  _atoms[net_wm_allowed_actions] = create("_NET_WM_ALLOWED_ACTIONS");
-
-//  _atoms[net_wm_ping] = create("_NET_WM_PING");
+  atoms.openbox_pid = create("_OPENBOX_PID");
+
+  atoms.wm_colormap_windows = create("WM_COLORMAP_WINDOWS");
+  atoms.wm_protocols = create("WM_PROTOCOLS");
+  atoms.wm_state = create("WM_STATE");
+  atoms.wm_change_state = create("WM_CHANGE_STATE");
+  atoms.wm_delete_window = create("WM_DELETE_WINDOW");
+  atoms.wm_take_focus = create("WM_TAKE_FOCUS");
+  atoms.wm_name = create("WM_NAME");
+  atoms.wm_icon_name = create("WM_ICON_NAME");
+  atoms.wm_class = create("WM_CLASS");
+  atoms.wm_window_role = create("WM_WINDOW_ROLE");
+  atoms.motif_wm_hints = create("_MOTIF_WM_HINTS");
+
+  atoms.openbox_show_root_menu = create("_OPENBOX_SHOW_ROOT_MENU");
+  atoms.openbox_show_workspace_menu = create("_OPENBOX_SHOW_WORKSPACE_MENU");
+
+  atoms.net_supported = create("_NET_SUPPORTED");
+  atoms.net_client_list = create("_NET_CLIENT_LIST");
+  atoms.net_client_list_stacking = create("_NET_CLIENT_LIST_STACKING");
+  atoms.net_number_of_desktops = create("_NET_NUMBER_OF_DESKTOPS");
+  atoms.net_desktop_geometry = create("_NET_DESKTOP_GEOMETRY");
+  atoms.net_desktop_viewport = create("_NET_DESKTOP_VIEWPORT");
+  atoms.net_current_desktop = create("_NET_CURRENT_DESKTOP");
+  atoms.net_desktop_names = create("_NET_DESKTOP_NAMES");
+  atoms.net_active_window = create("_NET_ACTIVE_WINDOW");
+  atoms.net_workarea = create("_NET_WORKAREA");
+  atoms.net_supporting_wm_check = create("_NET_SUPPORTING_WM_CHECK");
+//  atoms.net_virtual_roots = create("_NET_VIRTUAL_ROOTS");
+
+  atoms.net_close_window = create("_NET_CLOSE_WINDOW");
+  atoms.net_wm_moveresize = create("_NET_WM_MOVERESIZE");
+
+//  atoms.net_properties = create("_NET_PROPERTIES");
+  atoms.net_wm_name = create("_NET_WM_NAME");
+  atoms.net_wm_visible_name = create("_NET_WM_VISIBLE_NAME");
+  atoms.net_wm_icon_name = create("_NET_WM_ICON_NAME");
+  atoms.net_wm_visible_icon_name = create("_NET_WM_VISIBLE_ICON_NAME");
+  atoms.net_wm_desktop = create("_NET_WM_DESKTOP");
+  atoms.net_wm_window_type = create("_NET_WM_WINDOW_TYPE");
+  atoms.net_wm_state = create("_NET_WM_STATE");
+  atoms.net_wm_strut = create("_NET_WM_STRUT");
+//  atoms.net_wm_icon_geometry = create("_NET_WM_ICON_GEOMETRY");
+//  atoms.net_wm_icon = create("_NET_WM_ICON");
+//  atoms.net_wm_pid = create("_NET_WM_PID");
+//  atoms.net_wm_handled_icons = create("_NET_WM_HANDLED_ICONS");
+  atoms.net_wm_allowed_actions = create("_NET_WM_ALLOWED_ACTIONS");
+
+//  atoms.net_wm_ping = create("_NET_WM_PING");
   
-  _atoms[net_wm_window_type_desktop] = create("_NET_WM_WINDOW_TYPE_DESKTOP");
-  _atoms[net_wm_window_type_dock] = create("_NET_WM_WINDOW_TYPE_DOCK");
-  _atoms[net_wm_window_type_toolbar] = create("_NET_WM_WINDOW_TYPE_TOOLBAR");
-  _atoms[net_wm_window_type_menu] = create("_NET_WM_WINDOW_TYPE_MENU");
-  _atoms[net_wm_window_type_utility] = create("_NET_WM_WINDOW_TYPE_UTILITY");
-  _atoms[net_wm_window_type_splash] = create("_NET_WM_WINDOW_TYPE_SPLASH");
-  _atoms[net_wm_window_type_dialog] = create("_NET_WM_WINDOW_TYPE_DIALOG");
-  _atoms[net_wm_window_type_normal] = create("_NET_WM_WINDOW_TYPE_NORMAL");
-
-  _atoms[net_wm_moveresize_size_topleft] =
+  atoms.net_wm_window_type_desktop = create("_NET_WM_WINDOW_TYPE_DESKTOP");
+  atoms.net_wm_window_type_dock = create("_NET_WM_WINDOW_TYPE_DOCK");
+  atoms.net_wm_window_type_toolbar = create("_NET_WM_WINDOW_TYPE_TOOLBAR");
+  atoms.net_wm_window_type_menu = create("_NET_WM_WINDOW_TYPE_MENU");
+  atoms.net_wm_window_type_utility = create("_NET_WM_WINDOW_TYPE_UTILITY");
+  atoms.net_wm_window_type_splash = create("_NET_WM_WINDOW_TYPE_SPLASH");
+  atoms.net_wm_window_type_dialog = create("_NET_WM_WINDOW_TYPE_DIALOG");
+  atoms.net_wm_window_type_normal = create("_NET_WM_WINDOW_TYPE_NORMAL");
+
+  atoms.net_wm_moveresize_size_topleft =
     create("_NET_WM_MOVERESIZE_SIZE_TOPLEFT");
-  _atoms[net_wm_moveresize_size_topright] =
+  atoms.net_wm_moveresize_size_topright =
     create("_NET_WM_MOVERESIZE_SIZE_TOPRIGHT");
-  _atoms[net_wm_moveresize_size_bottomleft] =
+  atoms.net_wm_moveresize_size_bottomleft =
     create("_NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT");
-  _atoms[net_wm_moveresize_size_bottomright] =
+  atoms.net_wm_moveresize_size_bottomright =
     create("_NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT");
-  _atoms[net_wm_moveresize_move] =
+  atoms.net_wm_moveresize_move =
     create("_NET_WM_MOVERESIZE_MOVE");
  
-  _atoms[net_wm_action_move] = create("_NET_WM_ACTION_MOVE");
-  _atoms[net_wm_action_resize] = create("_NET_WM_ACTION_RESIZE");
-  _atoms[net_wm_action_shade] = create("_NET_WM_ACTION_SHADE");
-  _atoms[net_wm_action_maximize_horz] = create("_NET_WM_ACTION_MAXIMIZE_HORZ");
-  _atoms[net_wm_action_maximize_vert] = create("_NET_WM_ACTION_MAXIMIZE_VERT");
-  _atoms[net_wm_action_change_desktop] =
+  atoms.net_wm_action_move = create("_NET_WM_ACTION_MOVE");
+  atoms.net_wm_action_resize = create("_NET_WM_ACTION_RESIZE");
+  atoms.net_wm_action_minimize = create("_NET_WM_ACTION_MINIMIZE");
+  atoms.net_wm_action_shade = create("_NET_WM_ACTION_SHADE");
+  atoms.net_wm_action_stick = create("_NET_WM_ACTION_STICK");
+  atoms.net_wm_action_maximize_horz = create("_NET_WM_ACTION_MAXIMIZE_HORZ");
+  atoms.net_wm_action_maximize_vert = create("_NET_WM_ACTION_MAXIMIZE_VERT");
+  atoms.net_wm_action_fullscreen = create("_NET_WM_ACTION_FULLSCREEN");
+  atoms.net_wm_action_change_desktop =
     create("_NET_WM_ACTION_CHANGE_DESKTOP");
-  _atoms[net_wm_action_close] = create("_NET_WM_ACTION_CLOSE");
+  atoms.net_wm_action_close = create("_NET_WM_ACTION_CLOSE");
     
-  _atoms[net_wm_state_modal] = create("_NET_WM_STATE_MODAL");
-  _atoms[net_wm_state_maximized_vert] = create("_NET_WM_STATE_MAXIMIZED_VERT");
-  _atoms[net_wm_state_maximized_horz] = create("_NET_WM_STATE_MAXIMIZED_HORZ");
-  _atoms[net_wm_state_shaded] = create("_NET_WM_STATE_SHADED");
-  _atoms[net_wm_state_skip_taskbar] = create("_NET_WM_STATE_SKIP_TASKBAR");
-  _atoms[net_wm_state_skip_pager] = create("_NET_WM_STATE_SKIP_PAGER");
-  _atoms[net_wm_state_hidden] = create("_NET_WM_STATE_HIDDEN");
-  _atoms[net_wm_state_fullscreen] = create("_NET_WM_STATE_FULLSCREEN");
+  atoms.net_wm_state_modal = create("_NET_WM_STATE_MODAL");
+  atoms.net_wm_state_sticky = create("_NET_WM_STATE_STICKY");
+  atoms.net_wm_state_maximized_vert = create("_NET_WM_STATE_MAXIMIZED_VERT");
+  atoms.net_wm_state_maximized_horz = create("_NET_WM_STATE_MAXIMIZED_HORZ");
+  atoms.net_wm_state_shaded = create("_NET_WM_STATE_SHADED");
+  atoms.net_wm_state_skip_taskbar = create("_NET_WM_STATE_SKIP_TASKBAR");
+  atoms.net_wm_state_skip_pager = create("_NET_WM_STATE_SKIP_PAGER");
+  atoms.net_wm_state_hidden = create("_NET_WM_STATE_HIDDEN");
+  atoms.net_wm_state_fullscreen = create("_NET_WM_STATE_FULLSCREEN");
+  atoms.net_wm_state_above = create("_NET_WM_STATE_ABOVE");
+  atoms.net_wm_state_below = create("_NET_WM_STATE_BELOW");
   
-  _atoms[kde_net_system_tray_windows] = create("_KDE_NET_SYSTEM_TRAY_WINDOWS");
-  _atoms[kde_net_wm_system_tray_window_for] =
+  atoms.kde_net_system_tray_windows = create("_KDE_NET_SYSTEM_TRAY_WINDOWS");
+  atoms.kde_net_wm_system_tray_window_for =
     create("_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR");
-  _atoms[kde_net_wm_window_type_override] =
+  atoms.kde_net_wm_window_type_override =
     create("_KDE_NET_WM_WINDOW_TYPE_OVERRIDE");
 }
 
-
-/*
- * clean up the class' members
- */
-OBProperty::~OBProperty()
-{
-}
-
-
-/*
- * Returns an atom from the Xserver, creating it if necessary.
- */
-Atom OBProperty::create(const char *name) const
-{
-  return XInternAtom(OBDisplay::display, name, False);
-}
-
-
-/*
- * Internal set.
- * Sets a window property on a window, optionally appending to the existing
- * value.
- */
-void OBProperty::set(Window win, Atom atom, Atom type,
-                          unsigned char* data, int size, int nelements,
-                          bool append) const
+void Property::set(Window win, Atom atom, Atom type, unsigned char* data,
+                   int size, int nelements, bool append)
 {
   assert(win != None); assert(atom != None); assert(type != None);
   assert(nelements == 0 || (nelements > 0 && data != (unsigned char *) 0));
   assert(size == 8 || size == 16 || size == 32);
-  XChangeProperty(OBDisplay::display, win, atom, type, size,
+  XChangeProperty(**display, win, atom, type, size,
                   (append ? PropModeAppend : PropModeReplace),
                   data, nelements);
 }
 
-
-/*
- * Set a 32-bit property value on a window.
- */
-void OBProperty::set(Window win, Atoms atom, Atoms type,
-                          unsigned long value) const
+void Property::set(Window win, Atom atom, Atom type, unsigned long value)
 {
-  assert(atom >= 0 && atom < NUM_ATOMS);
-  assert(type >= 0 && type < NUM_ATOMS);
-  set(win, _atoms[atom], _atoms[type],
-           reinterpret_cast<unsigned char*>(&value), 32, 1, False);
+  set(win, atom, type, (unsigned char*) &value, 32, 1, false);
 }
 
-
-/*
- * Set an array of 32-bit properties value on a window.
- */
-void OBProperty::set(Window win, Atoms atom, Atoms type,
-                          unsigned long value[], int elements) const
+void Property::set(Window win, Atom atom, Atom type, unsigned long value[],
+                   int elements)
 {
-  assert(atom >= 0 && atom < NUM_ATOMS);
-  assert(type >= 0 && type < NUM_ATOMS);
-  set(win, _atoms[atom], _atoms[type],
-      reinterpret_cast<unsigned char*>(value), 32, elements, False);
+  set(win, atom, type, (unsigned char*) value, 32, elements, false);
 }
 
-
-/*
- * Set an string property value on a window.
- */
-void OBProperty::set(Window win, Atoms atom, StringType type,
-                          const std::string &value) const
+void Property::set(Window win, Atom atom, StringType type,
+                   const ustring &value)
 {
-  assert(atom >= 0 && atom < NUM_ATOMS);
-  assert(type >= 0 && type < NUM_STRING_TYPE);
-  
   Atom t;
   switch (type) {
-  case ascii: t = _atoms[Atom_String]; break;
-  case utf8:  t = _atoms[Atom_Utf8]; break;
-  default: assert(False); return; // unhandled StringType
+  case ascii: t = atoms.string; assert(!value.utf8()); break;
+  case utf8:  t = atoms.utf8;   assert(value.utf8());  break;
+  default: assert(false); return; // unhandled StringType
   }
-  set(win, _atoms[atom], t,
-      reinterpret_cast<unsigned char *>(const_cast<char *>(value.c_str())),
-      8, value.size() + 1, False); // add 1 to the size to include the null
-}
 
+  // add 1 to the size to include the trailing null
+  set(win, atom, t, (unsigned char*) value.c_str(), 8, value.bytes() + 1,
+      false);
+}
 
-/*
- * Set an array of string property values on a window.
- */
-void OBProperty::set(Window win, Atoms atom, StringType type,
-                     const StringVect &strings) const
+void Property::set(Window win, Atom atom, StringType type,
+                     const StringVect &strings)
 {
-  assert(atom >= 0 && atom < NUM_ATOMS);
-  assert(type >= 0 && type < NUM_STRING_TYPE);
-
   Atom t;
+  bool u; // utf8 encoded?
   switch (type) {
-  case ascii: t = _atoms[Atom_String]; break;
-  case utf8:  t = _atoms[Atom_Utf8]; break;
-  default: assert(False); return; // unhandled StringType
+  case ascii: t = atoms.string; u = false; break;
+  case utf8:  t = atoms.utf8;   u = true;  break;
+  default: assert(false); return; // unhandled StringType
   }
 
-  std::string value;
+  ustring value(u);
 
   StringVect::const_iterator it = strings.begin();
   const StringVect::const_iterator end = strings.end();
-  for (; it != end; ++it)
-      value += *it + '\0';
+  for (; it != end; ++it) {
+    assert(it->utf8() == u); // the ustring is encoded correctly?
+    value += *it;
+    value += '\0';
+  }
 
-  set(win, _atoms[atom], t,
-      reinterpret_cast<unsigned char *>(const_cast<char *>(value.c_str())),
-      8, value.size(), False);
+  // add 1 to the size to include the trailing null
+  set(win, atom, t, (unsigned char*)value.c_str(), 8,
+      value.bytes() + 1, false);
 }
 
-
-/*
- * Internal get function used by all of the typed get functions.
- * Gets an property's value from a window.
- * Returns True if the property was successfully retrieved; False if the
- * property did not exist on the window, or has a different type/size format
- * than the user tried to retrieve.
- */
-bool OBProperty::get(Window win, Atom atom, Atom type,
-                          unsigned long *nelements, unsigned char **value,
-                          int size) const
+bool Property::get(Window win, Atom atom, Atom type, unsigned long *nelements,
+                   unsigned char **value, int size)
 {
   assert(win != None); assert(atom != None); assert(type != None);
   assert(size == 8 || size == 16 || size == 32);
@@ -279,11 +211,11 @@ bool OBProperty::get(Window win, Atom atom, Atom type,
   unsigned long ret_bytes;
   int result;
   unsigned long maxread = *nelements;
-  bool ret = False;
+  bool ret = false;
 
   // try get the first element
-  result = XGetWindowProperty(OBDisplay::display, win, atom, 0l, 1l,
-                              False, AnyPropertyType, &ret_type, &ret_size,
+  result = XGetWindowProperty(**display, win, atom, 0l, 1l,
+                              false, AnyPropertyType, &ret_type, &ret_size,
                               nelements, &ret_bytes, &c_val);
   ret = (result == Success && ret_type == type && ret_size == size &&
          *nelements > 0);
@@ -300,8 +232,8 @@ bool OBProperty::get(Window win, Atom atom, Atom type,
       int remain = (ret_bytes - 1)/sizeof(long) + 1 + 1;
       if (remain > size/8 * (signed)maxread) // dont get more than the max
         remain = size/8 * (signed)maxread;
-      result = XGetWindowProperty(OBDisplay::display, win, atom, 0l,
-                                  remain, False, type, &ret_type, &ret_size,
+      result = XGetWindowProperty(**display, win, atom, 0l,
+                                  remain, false, type, &ret_type, &ret_size,
                                   nelements, &ret_bytes, &c_val);
       ret = (result == Success && ret_type == type && ret_size == size &&
              ret_bytes == 0);
@@ -321,77 +253,54 @@ bool OBProperty::get(Window win, Atom atom, Atom type,
   return ret;
 }
 
-
-/*
- * Gets a 32-bit property's value from a window.
- */
-bool OBProperty::get(Window win, Atoms atom, Atoms type,
-                          unsigned long *nelements,
-                          unsigned long **value) const
+bool Property::get(Window win, Atom atom, Atom type, unsigned long *nelements,
+                   unsigned long **value)
 {
-  assert(atom >= 0 && atom < NUM_ATOMS);
-  assert(type >= 0 && type < NUM_ATOMS);
-  return get(win, _atoms[atom], _atoms[type], nelements,
-                  reinterpret_cast<unsigned char **>(value), 32);
+  return get(win, atom, type, nelements, (unsigned char**) value, 32);
 }
 
-
-/*
- * Gets a single 32-bit property's value from a window.
- */
-bool OBProperty::get(Window win, Atoms atom, Atoms type,
-                     unsigned long *value) const
+bool Property::get(Window win, Atom atom, Atom type, unsigned long *value)
 {
-  assert(atom >= 0 && atom < NUM_ATOMS);
-  assert(type >= 0 && type < NUM_ATOMS);
   unsigned long *temp;
   unsigned long num = 1;
-  if (! get(win, _atoms[atom], _atoms[type], &num,
-                 reinterpret_cast<unsigned char **>(&temp), 32))
-    return False;
+  if (! get(win, atom, type, &num, (unsigned char **) &temp, 32))
+    return false;
   *value = temp[0];
   delete [] temp;
-  return True;
+  return true;
 }
 
-
-/*
- * Gets an string property's value from a window.
- */
-bool OBProperty::get(Window win, Atoms atom, StringType type,
-                     std::string *value) const
+bool Property::get(Window win, Atom atom, StringType type, ustring *value)
 {
   unsigned long n = 1;
   StringVect s;
+
   if (get(win, atom, type, &n, &s)) {
     *value = s[0];
-    return True;
+    return true;
   }
-  return False;
+  return false;
 }
 
-
-bool OBProperty::get(Window win, Atoms atom, StringType type,
-                     unsigned long *nelements, StringVect *strings) const
+bool Property::get(Window win, Atom atom, StringType type,
+                   unsigned long *nelements, StringVect *strings)
 {
-  assert(atom >= 0 && atom < NUM_ATOMS);
-  assert(type >= 0 && type < NUM_STRING_TYPE);
-  assert(win != None); assert(_atoms[atom] != None);
   assert(*nelements > 0);
 
   Atom t;
+  bool u; // utf8 encoded?
   switch (type) {
-  case ascii: t = _atoms[Atom_String]; break;
-  case utf8:  t = _atoms[Atom_Utf8]; break;
-  default: assert(False); return False; // unhandled StringType
+  case ascii: t = atoms.string; u = false; break;
+  case utf8:  t = atoms.utf8;   u = true;  break;
+  default: assert(false); return false; // unhandled StringType
   }
   
   unsigned char *value;
   unsigned long elements = (unsigned) -1;
-  if (!get(win, _atoms[atom], t, &elements, &value, 8) || elements < 1)
-    return False;
+  if (!get(win, atom, t, &elements, &value, 8) || elements < 1)
+    return false;
 
-  std::string s(reinterpret_cast<char *>(value), elements);
+  std::string s((char*)value, elements);
   delete [] value;
 
   std::string::const_iterator it = s.begin(), end = s.end();
@@ -400,6 +309,7 @@ bool OBProperty::get(Window win, Atoms atom, StringType type,
     std::string::const_iterator tmp = it; // current string.begin()
     it = std::find(tmp, end, '\0');       // look for null between tmp and end
     strings->push_back(std::string(tmp, it));   // s[tmp:it)
+    strings->back().setUtf8(u);
     ++num;
     if (it == end) break;
     ++it;
@@ -408,17 +318,16 @@ bool OBProperty::get(Window win, Atoms atom, StringType type,
 
   *nelements = num;
 
-  return True;
+  return true;
 }
 
 
 /*
  * Removes a property entirely from a window.
  */
-void OBProperty::erase(Window win, Atoms atom) const
+void Property::erase(Window win, Atom atom)
 {
-  assert(atom >= 0 && atom < NUM_ATOMS);
-  XDeleteProperty(OBDisplay::display, win, _atoms[atom]);
+  XDeleteProperty(**display, win, atom);
 }
 
 }
This page took 0.03372 seconds and 4 git commands to generate.