summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam Spilsbury <SmSpillaz@gmail.com>2010-06-13 00:29:42 +0800
committerSam Spilsbury <SmSpillaz@gmail.com>2010-06-13 00:29:42 +0800
commit8962ca8eade8f638363edb348f39d4f83132b64a (patch)
tree3b22393cde61b715249bd22788e257ef1f97206a
parentad81a6e7b48ce68e893b4c0b13080b198f37634c (diff)
downloadzcomp-8962ca8eade8f638363edb348f39d4f83132b64a.tar.gz
zcomp-8962ca8eade8f638363edb348f39d4f83132b64a.tar.bz2
Add missing files
-rw-r--r--src/propertywriter.cpp227
1 files changed, 227 insertions, 0 deletions
diff --git a/src/propertywriter.cpp b/src/propertywriter.cpp
new file mode 100644
index 0000000..7087aae
--- /dev/null
+++ b/src/propertywriter.cpp
@@ -0,0 +1,227 @@
+/*
+ * Copyright © 2010 Sam Spilsbury
+ *
+ * Permission to use, copy, modify, distribute, and sell this software
+ * and its documentation for any purpose is hereby granted without
+ * fee, provided that the above copyright notice appear in all copies
+ * and that both that copyright notice and this permission notice
+ * appear in supporting documentation, and that the name of
+ * Dennis Kasprzyk not be used in advertising or publicity pertaining to
+ * distribution of the software without specific, written prior permission.
+ * Dennis Kasprzyk makes no representations about the suitability of this
+ * software for any purpose. It is provided "as is" without express or
+ * implied warranty.
+ *
+ * DENNIS KASPRZYK DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
+ * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN
+ * NO EVENT SHALL DENNIS KASPRZYK BE LIABLE FOR ANY SPECIAL, INDIRECT OR
+ * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS
+ * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
+ * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
+ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Authors: Sam Spilsbury <smspillaz@gmail.com>
+ */
+
+#include <core/core.h>
+#include <core/propertywriter.h>
+
+PropertyWriter::PropertyWriter ()
+{
+}
+
+PropertyWriter::PropertyWriter (CompString propName,
+ CompOption::Vector &readTemplate)
+{
+ mPropertyValues = readTemplate;
+ mAtom = XInternAtom (screen->dpy (), propName.c_str (), 0);
+}
+
+void
+PropertyWriter::setReadTemplate (const CompOption::Vector &readTemplate)
+{
+ mPropertyValues = readTemplate;
+}
+
+const CompOption::Vector &
+PropertyWriter::getReadTemplate ()
+{
+ return mPropertyValues;
+}
+
+bool
+PropertyWriter::updateProperty (Window id,
+ CompOption::Vector &propertyData,
+ int type)
+{
+ int count = 0;
+
+
+ if (type == XA_CARDINAL)
+ {
+ long int data[propertyData.size ()];
+
+ foreach (CompOption &o, propertyData)
+ {
+ switch (o.type ())
+ {
+ case CompOption::TypeBool:
+ data[count] = o.value ().b ();
+ break;
+ case CompOption::TypeInt:
+ data[count] = o.value ().i ();
+ break;
+ default:
+ data[count] = 0;
+ break;
+ }
+
+ count++;
+ }
+
+ XChangeProperty (screen->dpy (), id,
+ mAtom, type, 32,
+ PropModeReplace, (unsigned char *)data,
+ propertyData.size ());
+ }
+ else if (type == XA_STRING)
+ {
+ char * data[propertyData.size ()];
+ XTextProperty prop;
+ bool ok = true;
+
+ foreach (CompOption &o, propertyData)
+ {
+ switch (o.type ())
+ {
+ case CompOption::TypeString:
+ data[count] = (char *) o.value ().s ().c_str ();
+ break;
+ default:
+ data[count] = NULL;
+ break;
+ }
+
+ count++;
+ }
+
+ for (int i = 0; i < count; i++)
+ {
+ if (data[i] == NULL)
+ {
+ ok = false;
+ }
+ }
+
+ if (ok)
+ {
+ if (XStringListToTextProperty (data, count, &prop))
+ XSetTextProperty (screen->dpy (), id, &prop, mAtom);
+ }
+ }
+
+ return true;
+}
+
+void
+PropertyWriter::deleteProperty (Window id)
+{
+ XDeleteProperty (screen->dpy (), id, mAtom);
+}
+
+const CompOption::Vector &
+PropertyWriter::readProperty (Window id)
+{
+ Atom type;
+ int retval, fmt;
+ unsigned long nitems, exbyte;
+ long int *data;
+ int count = 0;
+
+ if (mPropertyValues.empty ())
+ return mPropertyValues;
+
+ retval = XGetWindowProperty (screen->dpy (), id, mAtom, 0,
+ mPropertyValues.size (), False, XA_CARDINAL,
+ &type, &fmt, &nitems, &exbyte,
+ (unsigned char **)&data);
+
+ if (retval == Success && !mPropertyValues.empty ())
+ {
+ if (type == XA_CARDINAL && fmt == 32 &&
+ nitems == mPropertyValues.size ())
+ {
+ foreach (CompOption &o, mPropertyValues)
+ {
+ CompOption::Value tmpVal;
+ switch (mPropertyValues.at (count).type ())
+ {
+ case CompOption::TypeBool:
+ tmpVal = CompOption::Value ((bool) data[count]);
+ o.set (tmpVal);
+ break;
+ case CompOption::TypeInt:
+ tmpVal = CompOption::Value ((int) data[count]);
+ o.set (tmpVal);
+ break;
+ default:
+ tmpVal = CompOption::Value (CompOption::Value (0));
+ o.set (tmpVal);
+ break;
+ }
+
+ count++;
+ }
+
+ XFree (data);
+
+ return mPropertyValues;
+ }
+ else if (type == XA_STRING && fmt == 8)
+ {
+ XTextProperty tProp;
+ retval = XGetTextProperty (screen->dpy (), id, &tProp, mAtom);
+
+ if (tProp.value)
+ {
+ int retCount = 0;
+ char **tData = NULL;
+
+ XTextPropertyToStringList (&tProp, &tData, &retCount);
+
+ if (retCount == (int) mPropertyValues.size ())
+ {
+ foreach (CompOption &o, mPropertyValues)
+ {
+ CompOption::Value tmpVal;
+ tmpVal = CompOption::Value (CompString ((char *) tData[count]));
+
+ o.set (tmpVal);
+
+ count++;
+ }
+
+ return mPropertyValues;
+ }
+ else
+ {
+ return nilValues;
+ }
+ }
+ else
+ {
+ return nilValues;
+ }
+ }
+ else if (fmt != 0)
+ {
+ XFree (data);
+ }
+ }
+ else
+ {
+ return mPropertyValues;
+ }
+
+ return mPropertyValues;
+}