Find file dialog in mc-4.6.0-pre3

Arpi arpi at mplayerhq.hu
Sun Jan 26 19:27:42 UTC 2003


Hi,

> I've scanned a TODO list and found the item -
> "Make find dialog more responsive" - inside
> "After 4.6.1 on 4.6.x branch" section.
> 
> But I think the responsiveness of the dialog is unacceptable for the
> 4.6.0 release. I missed the moment when it became so bad, (may be 1-3

I agree.

So i went and hunted down the bug :)
It's a nice 100l one, said in MPlayer terminology...

In src/key.c, the is_idle() function is broken.
It's called by the dialog loop (used by Find File too) to decide if
call the callback fv (search for files) or handle the key/mouse events.

The original code ends this way:

    timeout.tv_sec = 0;
    timeout.tv_usec = 0;
    select (maxfdp, &select_set, 0, 0, &timeout);
    return !FD_ISSET (0, &select_set);

which is, according to 'man select' broken at 2 points:

       int  select(int  n,  fd_set  *readfds,  fd_set  *writefds,
       fd_set *exceptfds, struct timeval *timeout);

       n is the highest-numbered descriptor in any of  the  three
       sets, plus 1.
             ^^^^^^
so it should be:

    select (maxfdp+1, &select_set, 0, 0, &timeout);

this may work on some select() implementations, i've heard that some ignores
the first parameter and calculates it from the fd sets. but it's better fixed.

and:

       FD_ISSET(int fd, fd_set *set);

       FD_ISSET  tests  to  see  if  a
       descriptor is part of the set; this is useful after select
       returns.

so it should be:

    return !FD_ISSET (input_fd, &select_set);

(the original code works only if input_fd==0)

after changing these, find is responsive again!

btw, NOTE: i didn't handled the gpm events, they need extra code,
so the current is_idle() should be changed deep. I've just summarized
the idea about the bug. If you want, i can prepare a commitable patch.


A'rpi / Astral & ESP-team

--
Developer of MPlayer, the Movie Player for Linux - http://www.MPlayerHQ.hu



More information about the mc-devel mailing list