ferdo@neabbs.UUCP (FERDINAND OEINCK) (04/16/91)
Another bug in the RISC OS Library version 3.1b =============================================== The bug appears to be in the file 'win.c'. Suppose you want to deliver null events to a particular 'unknown event processor'. To do so first call: prev_idle_claimer = win_idle_event_claimer(); to get the previous null events claimer window handle. Now call: win_claim_idle_events(-1); to ensure all events are processed by 'unknown event processors' instead of a delivery to a particular window. The -1 parameter in this last call will be one part of the bug as shown below. Due to the call 'win_claim_idle_events(-1);' the static variable 'win__idle' will be set to -1. Suppose we get an null event and enter the function 'win_processevent()'. The automatic variable wimp_w w will be set to win__idle (is -1). Below the 'switch (e->e)' the following statement appears: if (w==win__unknown_flag || win__find(w) == 0) Normally the function 'win__find(w)' will return 0 when the parameter w equals -1, and all unknow event processors are called. *But* suppose we used a dialogbox somewhere before the above code, the functions 'win_register_event_handler(d->w, 0, 0)' and win__discard(w) are called due to dialog box disposing. In the function 'win__discard(wimp_w w)' the statement: win__allwindows[i].w = DUD; is used. The macro DUD equals to -1. Now this -1 has nothing to do with the previous -1 used to flag no window as a receiver of null events. Now take a closer look at the function 'win__find(wimp_w w)'. We see that the statements: if (win__allwindows[i].w == w) { return(&win__allwindows[i]); compare the two -1's and 'win__find()' returns the pointer to the 'win_str' of the previous disposed dialog box! In most cases this bug will not appear, because the dialog box window will be the last window in the win_str array. An attempt to call 'win__discard()' will decrease the variable 'win__lim' if the element 'win__allwindows[win__lim-1].w == DUD'. But if the dialog box window isn't in the last (win__lim) position the DUD element will remain in the win_str array and can still be compared to the -1 from the win__idle variable. Solution: set the macro DUD to another negative value (-10?) and compile the file 'win.c' again and link it to your code or call 'win_claim_idle_events()' with another negative value as parameter! 'win__find()' now returns 0 and the 'unknown event processors' are called as one would expect. ferdinand. P.S. In Holland we say: Je moet geen koeien met paarden verglijken.