comparison 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
comparison
equal deleted inserted replaced
1308:224893b5b868 1309:e73c41653de8
457 for(i=0;i<count;i++) 457 for(i=0;i<count;i++)
458 { 458 {
459 SHORT menuid = (SHORT)WinSendMsg(menu, MM_ITEMIDFROMPOSITION, MPFROMSHORT(i), 0); 459 SHORT menuid = (SHORT)WinSendMsg(menu, MM_ITEMIDFROMPOSITION, MPFROMSHORT(i), 0);
460 MENUITEM mi; 460 MENUITEM mi;
461 461
462 /* Free the data associated with the ID */
463 if(menuid >= 30000)
464 {
465 char buffer[31] = {0};
466
467 sprintf(buffer, "_dw_id%ld", menuid);
468 dw_window_set_data( hwndApp, buffer, NULL );
469 sprintf(buffer, "_dw_checkable%ld", menuid);
470 dw_window_set_data( hwndApp, buffer, NULL );
471 sprintf(buffer, "_dw_ischecked%ld", menuid);
472 dw_window_set_data( hwndApp, buffer, NULL );
473 sprintf(buffer, "_dw_isdisabled%ld", menuid);
474 dw_window_set_data( hwndApp, buffer, NULL );
475 }
476
477 /* Check any submenus */
462 if(WinSendMsg(menu, MM_QUERYITEM, MPFROMSHORT(menuid), MPFROMP(&mi)) 478 if(WinSendMsg(menu, MM_QUERYITEM, MPFROMSHORT(menuid), MPFROMP(&mi))
463 && mi.hwndSubMenu) 479 && mi.hwndSubMenu)
464 _free_menu_data(mi.hwndSubMenu); 480 _free_menu_data(mi.hwndSubMenu);
465 } 481 }
466 } 482 }
4679 { 4695 {
4680 if(menu) 4696 if(menu)
4681 WinDestroyWindow(*menu); 4697 WinDestroyWindow(*menu);
4682 } 4698 }
4683 4699
4700 /* Internal function to make sure menu ID isn't in use */
4701 int _menuid_allocated(int id)
4702 {
4703 SignalHandler *prev = NULL, *tmp = Root;
4704
4705 while(tmp)
4706 {
4707 if(tmp->id == id)
4708 return TRUE;
4709 tmp = tmp->next;
4710 }
4711 return FALSE;
4712 }
4713
4684 /* 4714 /*
4685 * Adds a menuitem or submenu to an existing menu. 4715 * Adds a menuitem or submenu to an existing menu.
4686 * Parameters: 4716 * Parameters:
4687 * menu: The handle the the existing menu. 4717 * menu: The handle the the existing menu.
4688 * title: The title text on the menu item to be added. 4718 * title: The title text on the menu item to be added.
4735 /* Second pool is larger for more static windows */ 4765 /* Second pool is larger for more static windows */
4736 else if(!id || id >= 30000) 4766 else if(!id || id >= 30000)
4737 { 4767 {
4738 static ULONG menuid = 30000; 4768 static ULONG menuid = 30000;
4739 4769
4740 menuid++; 4770 do
4771 {
4772 menuid++;
4773 if(menuid > 60000)
4774 menuid = 30000;
4775 }
4776 while(_menuid_allocated(menuid));
4741 id = menuid; 4777 id = menuid;
4742
4743 if(menuid > 60000)
4744 menuid = 30000;
4745 } 4778 }
4746 miSubMenu.afStyle = MIS_TEXT; 4779 miSubMenu.afStyle = MIS_TEXT;
4747 } 4780 }
4748 else 4781 else
4749 miSubMenu.afStyle = MIS_SEPARATOR; 4782 miSubMenu.afStyle = MIS_SEPARATOR;
11017 if(!window || !signame || (message = _findsigmessage(signame)) == 0) 11050 if(!window || !signame || (message = _findsigmessage(signame)) == 0)
11018 return; 11051 return;
11019 11052
11020 while(tmp) 11053 while(tmp)
11021 { 11054 {
11022 if(tmp->window == window && tmp->message == message) 11055 if(((window < 65536 && tmp->id == window) || tmp->window == window) && tmp->message == message)
11023 { 11056 {
11024 if(prev) 11057 if(prev)
11025 { 11058 {
11026 prev->next = tmp->next; 11059 prev->next = tmp->next;
11027 free(tmp); 11060 free(tmp);
11051 { 11084 {
11052 SignalHandler *prev = NULL, *tmp = Root; 11085 SignalHandler *prev = NULL, *tmp = Root;
11053 11086
11054 while(tmp) 11087 while(tmp)
11055 { 11088 {
11056 if(tmp->window == window) 11089 if((window < 65536 && tmp->id == window) || tmp->window == window)
11057 { 11090 {
11058 if(prev) 11091 if(prev)
11059 { 11092 {
11060 prev->next = tmp->next; 11093 prev->next = tmp->next;
11061 free(tmp); 11094 free(tmp);
11086 { 11119 {
11087 SignalHandler *prev = NULL, *tmp = Root; 11120 SignalHandler *prev = NULL, *tmp = Root;
11088 11121
11089 while(tmp) 11122 while(tmp)
11090 { 11123 {
11091 if(tmp->window == window && tmp->data == data) 11124 if(((window < 65536 && tmp->id == window) || tmp->window == window) && tmp->data == data)
11092 { 11125 {
11093 if(prev) 11126 if(prev)
11094 { 11127 {
11095 prev->next = tmp->next; 11128 prev->next = tmp->next;
11096 free(tmp); 11129 free(tmp);