Commit 467d7bb64eb8e77304fc6c91f612ec7b8036e475

Ran Benita 2012-04-05T10:13:24

Implement missing xkb_state_ref and add return value xkb_state_ref was missing. Also modify the _ref functions to return the object instead of being void. This is a useful idiom: struct my_object my_object_new(struct xkb_state *state) { [...] my_object->state = xkb_state_ref(state); [...] } Essentially "taking" a reference, such that you don't forget to increment it and it's one line less (see example in our own code). A case could also be made for _unref to return the object or NULL, but this is quite uncommon. Signed-off-by: Ran Benita <ran234@gmail.com> [daniels: Updated for xkb_keymap changes.]

diff --git a/include/xkbcommon/xkbcommon.h b/include/xkbcommon/xkbcommon.h
index 45e98e4..1391437 100644
--- a/include/xkbcommon/xkbcommon.h
+++ b/include/xkbcommon/xkbcommon.h
@@ -247,7 +247,7 @@ xkb_context_include_path_get(struct xkb_context *context, unsigned int index);
 /**
  * Takes a new reference on an XKB context.
  */
-_X_EXPORT void
+_X_EXPORT struct xkb_context *
 xkb_context_ref(struct xkb_context *context);
 
 /**
@@ -315,7 +315,7 @@ xkb_map_new_from_string(struct xkb_context *context,
 /**
  * Takes a new reference on a keymap.
  */
-_X_EXPORT extern void
+_X_EXPORT extern struct xkb_keymap *
 xkb_map_ref(struct xkb_keymap *xkb);
 
 /**
@@ -412,9 +412,9 @@ _X_EXPORT struct xkb_state *
 xkb_state_new(struct xkb_keymap *xkb);
 
 /**
- * Adds a reference to a state object, so it will not be freed until unref.
+ * Takes a new reference on a state object.
  */
-_X_EXPORT void
+_X_EXPORT struct xkb_state *
 xkb_state_ref(struct xkb_state *state);
 
 /**
diff --git a/src/alloc.c b/src/alloc.c
index 52d7af2..a2a1330 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -266,8 +266,7 @@ XkbcAllocKeyboard(struct xkb_context *context)
         return NULL;
 
     xkb->refcnt = 1;
-    xkb_context_ref(context);
-    xkb->context = context;
+    xkb->context = xkb_context_ref(context);
 
     return xkb;
 }
diff --git a/src/context.c b/src/context.c
index cbad424..a2c8f56 100644
--- a/src/context.c
+++ b/src/context.c
@@ -158,10 +158,11 @@ xkb_context_include_path_get(struct xkb_context *context, unsigned int idx)
 /**
  * Take a new reference on the context.
  */
-void
+struct xkb_context *
 xkb_context_ref(struct xkb_context *context)
 {
     context->refcnt++;
+    return context;
 }
 
 /**
diff --git a/src/state.c b/src/state.c
index 6a9505d..a9f748e 100644
--- a/src/state.c
+++ b/src/state.c
@@ -472,12 +472,18 @@ xkb_state_new(struct xkb_keymap *xkb)
         return NULL;
 
     ret->refcnt = 1;
-    ret->xkb = xkb;
-    xkb_map_ref(xkb);
+    ret->xkb = xkb_map_ref(xkb);
 
     return ret;
 }
 
+struct xkb_state *
+xkb_state_ref(struct xkb_state *state)
+{
+    state->refcnt++;
+    return state;
+}
+
 void
 xkb_state_unref(struct xkb_state *state)
 {
diff --git a/src/xkbcomp/xkbcomp.c b/src/xkbcomp/xkbcomp.c
index 9534232..7ff22e1 100644
--- a/src/xkbcomp/xkbcomp.c
+++ b/src/xkbcomp/xkbcomp.c
@@ -312,10 +312,11 @@ xkb_map_new_from_fd(struct xkb_context *context,
     return compile_keymap(context, file);
 }
 
-void
+struct xkb_keymap *
 xkb_map_ref(struct xkb_keymap *xkb)
 {
     xkb->refcnt++;
+    return xkb;
 }
 
 void