From ec9f767eac6b83d1dbf7200cddc1dbe81a9d11d7 Mon Sep 17 00:00:00 2001 From: Chris Coulson Date: Fri, 17 May 2013 22:30:19 +0100 Subject: Set the max ID of menuitems to G_MAXINT rather than 30000, as internally, the server side happily creates ID's greater than this which then wraparound on the client side. We keep the minimum unchanged at -1, as some consumers addume that < 0 is an error (rather than -1). To make this a bit less fragile, handle rollover on the server side from G_MAXINT to 1, rather than having a signed integer overflow which will just break things a bit later on --- libdbusmenu-glib/menuitem.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index cd9f978..536fd6d 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -270,7 +270,7 @@ dbusmenu_menuitem_class_init (DbusmenuMenuitemClass *klass) g_object_class_install_property (object_class, PROP_ID, g_param_spec_int(PROP_ID_S, "ID for the menu item", "This is a unique indentifier for the menu item.", - -1, 30000, -1, + -1, G_MAXINT, -1, G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS)); /* Check transfer functions for GValue */ @@ -391,7 +391,8 @@ set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) case PROP_ID: priv->id = g_value_get_int(value); if (priv->id > menuitem_next_id) { - menuitem_next_id = priv->id + 1; + menuitem_next_id = (priv->id + 1) % G_MAXINT; + if (menuitem_next_id == 0) menuitem_next_id++; } break; default: @@ -411,6 +412,8 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) case PROP_ID: if (priv->id == -1) { priv->id = menuitem_next_id++; + menuitem_next_id &= G_MAXINT; + if (menuitem_next_id == 0) menuitem_next_id++; } if (dbusmenu_menuitem_get_root(DBUSMENU_MENUITEM(obj))) { g_value_set_int(value, 0); -- cgit v1.2.3 From 09ce53603cda79824123867e8ea11af94be81eec Mon Sep 17 00:00:00 2001 From: Chris Coulson Date: Tue, 28 May 2013 15:46:09 +0100 Subject: Update for review comments --- libdbusmenu-glib/menuitem.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/libdbusmenu-glib/menuitem.c b/libdbusmenu-glib/menuitem.c index 536fd6d..0b85193 100644 --- a/libdbusmenu-glib/menuitem.c +++ b/libdbusmenu-glib/menuitem.c @@ -391,8 +391,11 @@ set_property (GObject * obj, guint id, const GValue * value, GParamSpec * pspec) case PROP_ID: priv->id = g_value_get_int(value); if (priv->id > menuitem_next_id) { - menuitem_next_id = (priv->id + 1) % G_MAXINT; - if (menuitem_next_id == 0) menuitem_next_id++; + if (priv->id == G_MAXINT) { + menuitem_next_id = 1; + } else { + menuitem_next_id = priv->id + 1; + } } break; default: @@ -411,9 +414,12 @@ get_property (GObject * obj, guint id, GValue * value, GParamSpec * pspec) switch (id) { case PROP_ID: if (priv->id == -1) { - priv->id = menuitem_next_id++; - menuitem_next_id &= G_MAXINT; - if (menuitem_next_id == 0) menuitem_next_id++; + priv->id = menuitem_next_id; + if (menuitem_next_id == G_MAXINT) { + menuitem_next_id = 1; + } else { + menuitem_next_id += 1; + } } if (dbusmenu_menuitem_get_root(DBUSMENU_MENUITEM(obj))) { g_value_set_int(value, 0); -- cgit v1.2.3