diff os2/dw.c @ 1309:e73c41653de8

Added support on OS/2 and Windows for looking for signal handlers with menu IDs... and skipping auto generating menu IDs that have handlers already attached. Also remove associated menu data when destroying menus with auto generated IDs. Also allow dw_window_disconnect*() to work on the handle returned by dw_menu_append_item().
author bsmith@81767d24-ef19-dc11-ae90-00e081727c95
date Fri, 04 Nov 2011 03:30:27 +0000
parents dbd507f42947
children 47dbe605a03f
line wrap: on
line diff
--- a/os2/dw.c	Thu Nov 03 23:42:12 2011 +0000
+++ b/os2/dw.c	Fri Nov 04 03:30:27 2011 +0000
@@ -459,6 +459,22 @@
       SHORT menuid = (SHORT)WinSendMsg(menu, MM_ITEMIDFROMPOSITION, MPFROMSHORT(i), 0);
       MENUITEM mi;
 
+      /* Free the data associated with the ID */
+      if(menuid >= 30000)
+      {
+         char buffer[31] = {0};
+       
+         sprintf(buffer, "_dw_id%ld", menuid);
+         dw_window_set_data( hwndApp, buffer, NULL );
+         sprintf(buffer, "_dw_checkable%ld", menuid);
+         dw_window_set_data( hwndApp, buffer, NULL );
+         sprintf(buffer, "_dw_ischecked%ld", menuid);
+         dw_window_set_data( hwndApp, buffer, NULL );
+         sprintf(buffer, "_dw_isdisabled%ld", menuid);
+         dw_window_set_data( hwndApp, buffer, NULL );
+      }
+      
+      /* Check any submenus */
       if(WinSendMsg(menu, MM_QUERYITEM, MPFROMSHORT(menuid), MPFROMP(&mi))
          && mi.hwndSubMenu)
          _free_menu_data(mi.hwndSubMenu);
@@ -4681,6 +4697,20 @@
       WinDestroyWindow(*menu);
 }
 
+/* Internal function to make sure menu ID isn't in use */
+int _menuid_allocated(int id)
+{
+   SignalHandler *prev = NULL, *tmp = Root;
+
+   while(tmp)
+   {
+     if(tmp->id == id)
+        return TRUE;   
+     tmp = tmp->next;
+   }
+   return FALSE;
+}
+
 /*
  * Adds a menuitem or submenu to an existing menu.
  * Parameters:
@@ -4737,11 +4767,14 @@
       {
          static ULONG menuid = 30000;
          
-         menuid++;
+         do
+         {
+            menuid++;
+            if(menuid > 60000)
+               menuid = 30000;
+         }
+         while(_menuid_allocated(menuid));
          id = menuid;
-         
-         if(menuid > 60000)
-            menuid = 30000;
       }
       miSubMenu.afStyle = MIS_TEXT;
    }
@@ -11019,7 +11052,7 @@
 
    while(tmp)
    {
-      if(tmp->window == window && tmp->message == message)
+      if(((window < 65536 && tmp->id == window) || tmp->window == window) && tmp->message == message)
       {
          if(prev)
          {
@@ -11053,7 +11086,7 @@
 
    while(tmp)
    {
-      if(tmp->window == window)
+      if((window < 65536 && tmp->id == window) || tmp->window == window)
       {
          if(prev)
          {
@@ -11088,7 +11121,7 @@
 
    while(tmp)
    {
-      if(tmp->window == window && tmp->data == data)
+      if(((window < 65536 && tmp->id == window) || tmp->window == window) && tmp->data == data)
       {
          if(prev)
          {