summaryrefslogtreecommitdiff
path: root/obt/instance.c
diff options
context:
space:
mode:
authorDana Jansens <danakj@orodu.net>2007-07-23 17:42:08 -0400
committerDana Jansens <danakj@orodu.net>2008-01-20 01:36:53 -0500
commitebce321a72331697287838b864735e7b81e60b33 (patch)
tree7c6d33aedc34f4f489b7d842ef6c508f2425bbe4 /obt/instance.c
parent98dda05c4ae1372391a26fca4c5a8b0551bbb4f9 (diff)
look mom, I made an openbox toolkit
Diffstat (limited to 'obt/instance.c')
-rw-r--r--obt/instance.c56
1 files changed, 56 insertions, 0 deletions
diff --git a/obt/instance.c b/obt/instance.c
new file mode 100644
index 00000000..8299eb85
--- /dev/null
+++ b/obt/instance.c
@@ -0,0 +1,56 @@
+#include "obt/obt.h"
+
+#ifdef HAVE_STRING_H
+# include <string.h>
+#endif
+#ifdef HAVE_FCNTL_H
+# include <fcntl.h>
+#endif
+#ifdef HAVE_UNISTD_H
+# include <unistd.h>
+#endif
+
+struct _ObtInstance
+{
+ gint ref;
+ Display *d;
+};
+
+ObtInstance* obt_instance_new(const char *display_name)
+{
+ gchar *n;
+ Display *d;
+ ObtInstance *inst = NULL;
+
+ n = display_name ? g_strdup(display_name) : NULL;
+ d = XOpenDisplay(n);
+ if (d) {
+ if (fcntl(ConnectionNumber(d), F_SETFD, 1) == -1)
+ g_message("Failed to set display as close-on-exec");
+
+ inst = g_new(ObtInstance, 1);
+ inst->ref = 1;
+ inst->d = d;
+ }
+ g_free(n);
+
+ return inst;
+}
+
+void obt_instance_ref(ObtInstance *inst)
+{
+ ++inst->ref;
+}
+
+void obt_instance_unref(ObtInstance *inst)
+{
+ if (inst && --inst->ref == 0) {
+ XCloseDisplay(inst->d);
+ obt_free0(inst, ObtInstance, 1);
+ }
+}
+
+Display* obt_display(const ObtInstance *inst)
+{
+ return inst->d;
+}