+static int next_free_gadget_id = 1;
+static boolean gadget_id_wrapped = FALSE;
+
+static struct GadgetInfo *getGadgetInfoFromGadgetID(int id)
+{
+ struct GadgetInfo *gi = gadget_list_first_entry;
+
+ while (gi && gi->id != id)
+ gi = gi->next;
+
+ return gi;
+}
+
+static int getNewGadgetID()
+{
+ int id = next_free_gadget_id++;
+
+ if (next_free_gadget_id <= 0) /* counter overrun */
+ {
+ gadget_id_wrapped = TRUE; /* now we must check each ID */
+ next_free_gadget_id = 0;
+ }
+
+ if (gadget_id_wrapped)
+ {
+ next_free_gadget_id++;
+ while (getGadgetInfoFromGadgetID(next_free_gadget_id) != NULL)
+ next_free_gadget_id++;
+ }
+
+ if (next_free_gadget_id <= 0) /* cannot get new gadget id */
+ Error(ERR_EXIT, "too much gadgets -- this should not happen");
+
+ return id;
+}