I should have been a pair of ragged claws
Scuttling across the floors of silent seas.
While working on putting together this web site, a fedora update
pulled in the new 3.8.0 version of claws-mail. I use
claws-mail because I mostly like it (certainly a lot more than
evolution or thunderbird), but this new update has one stoopid thing
I must see if I can fix:
The folder list and message threads all have these microscopic
little arrows to indicate expand or collapse. I don't care about the
size of the arrows so much, but I appear to be forced to position the
mouse directly over the center of the damn little speck to get it to
do the expand or collapse when I click the mouse. (And the higher the
resolution of your screen, the smaller those six pixels look.)
I filed this as bug 2581 in the claws-mail bugzilla, but who
knows if they will care, so I want to see if I can find out how to
fix it.
To fix claws-mail, I need the source code:
yumdownloader --source claws-mail
rpm -ihv claws-mail-3.8.0-1.fc16.src.rpm
That unpacks the source rpm, using the macros I have installed in
my ~/.rpmmacros file:
%_topdir /zooty/build/rpmbuild
%_smp_mflags -j3
%__arch_install_post /usr/lib/rpm/check-rpaths /usr/lib/rpm/check-buildroot
I honestly don't know what most of that stuff is for, I just
copied it from an example somewhere many years ago, but the important
macro is %_topdir which, in this case, means the source rpm
will be installed under the /zooty/build/rpmbuild
directory.
So now, I need to make it actually look like source code rather
than the collection of tarballs and patches that are all that
exist.
cd /zooty/build/rpmbuild/SPECS/
rpmbuild -bp claws-mail.spec
That doesn't actually work though, because I don't have all the
development packages I need to build it. I have two options: I could
add the --nodeps option to the rpmbuild command, or I could
install all the missing dependencies (from the list it just printed
with the error).
At this point, I'm imagining that the tiny triangle might be a
stock icon provided in some library, so in case I need to poke around
in other packages, I decide to install all the dependencies:
Jan 20 21:00:58 Installed: libgnomeui-devel-2.24.5-2.fc15.x86_64
Jan 20 21:12:05 Installed: 1:glib-1.2.10-35.fc16.x86_64
Jan 20 21:12:05 Installed: 1:glib-devel-1.2.10-35.fc16.x86_64
Jan 20 21:12:06 Installed: texlive-texmf-2007-40.fc16.noarch
Jan 20 21:12:06 Installed: 1:gtk+-1.2.10-71.fc15.x86_64
Jan 20 21:12:06 Installed: 1:gtk+-devel-1.2.10-71.fc15.x86_64
Jan 20 21:12:06 Installed: 1:imlib-1.9.15-15.fc15.x86_64
Jan 20 21:12:07 Installed: texlive-texmf-dvips-2007-40.fc16.noarch
Jan 20 21:12:07 Installed: 1:ORBit-0.5.17-31.fc15.x86_64
Jan 20 21:12:07 Installed: 1:ORBit-devel-0.5.17-31.fc15.x86_64
Jan 20 21:12:14 Installed: texlive-texmf-fonts-2007-40.fc16.noarch
Jan 20 21:12:17 Installed: texlive-2007-66.fc16.x86_64
Jan 20 21:12:17 Installed: texlive-dvips-2007-66.fc16.x86_64
Jan 20 21:12:17 Installed: texlive-utils-2007-66.fc16.x86_64
Jan 20 21:12:17 Installed: 1:imlib-devel-1.9.15-15.fc15.x86_64
Jan 20 21:12:17 Installed: libpng10-1.0.56-1.fc16.x86_64
Jan 20 21:12:17 Installed: 1:gnome-libs-1.4.2-19.fc16.x86_64
Jan 20 21:12:18 Installed: 1:audiofile-devel-0.2.7-2.fc15.x86_64
Jan 20 21:12:18 Installed: 1:esound-devel-0.2.41-4.fc15.x86_64
Jan 20 21:12:18 Installed: 1:NetworkManager-0.9.2-1.fc16.x86_64
Jan 20 21:12:18 Installed: 1:NetworkManager-devel-0.9.2-1.fc16.x86_64
Jan 20 21:12:19 Installed: netpbm-progs-10.47.31-1.fc16.x86_64
Jan 20 21:12:20 Installed: texlive-texmf-latex-2007-40.fc16.noarch
Jan 20 21:12:27 Installed: texlive-latex-2007-66.fc16.x86_64
Jan 20 21:12:27 Installed: tex-preview-11.86-6.fc16.noarch
Jan 20 21:12:28 Installed: jadetex-3.13-10.fc15.noarch
Jan 20 21:12:28 Installed: docbook-utils-pdf-0.6.14-29.fc16.noarch
Jan 20 21:12:29 Installed: 1:NetworkManager-glib-devel-0.9.2-1.fc16.x86_64
Jan 20 21:12:29 Installed: 1:gnome-libs-devel-1.4.2-19.fc16.x86_64
Jan 20 21:12:29 Installed: compface-devel-1.5.2-12.x86_64
Jan 20 21:12:29 Installed: gpgme-devel-1.3.0-4.fc16.x86_64
Jan 20 21:12:29 Installed: 1:enchant-devel-1.6.0-3.fc16.x86_64
Jan 20 21:12:29 Installed: 2:pilot-link-devel-0.12.5-7.fc16.x86_64
Now I can run the rpmbuild command again, and it works, expanding
all the tarballs and applying all the patches, and leaving the source
in /zooty/build/rpmbuild/BUILD/claws-mail-3.7.10/ (not sure why the
directory is 3.7.10, but that's what the source rpm generated, so I
don't ask questions).
Some mail arrived while I was doing all that, so I tried to start
my normal claws-mail client, and discovered that it now takes about
30 seconds to start. Swell. This is very typical of the twists and
turns of the Game of Linux. You are looking for one bug, and a
completely different one crops up. Time for a diversion.
I run strace -tt claws-mail to see if I can see what in the
blue blazes it is doing for all that time, and I discover this
nonsense in the trace output:
21:25:23.974684 socket(PF_FILE, SOCK_STREAM|SOCK_CLOEXEC, 0) = 7
21:25:23.974732 connect(7, {sa_family=AF_FILE, path="/var/run/dbus/system_bus_socket"}, 33) = 0
...
21:25:24.124108 sendmsg(7, {msg_name(0)=NULL, msg_iov(2)=[{"l\1\0\1#\0\0\0\5\0\0\0\177\0\0\0\1\1o\0\25\0\0\0/org/fre"..., 144}, {"\36\0\0\0org.freedesktop.NetworkManag"..., 35}], msg_controllen=0, msg_flags=0}, MSG_NOSIGNAL) = 179
...
21:25:24.124718 poll([{fd=7, events=POLLIN}], 1, 25000) = 1 ([{fd=7, revents=POLLIN}])
21:25:49.126227 recvmsg(7, {msg_name(0)=NULL, msg_iov(1)=[{"l\3\1\1;\0\0\0\5\0\0\0m\0\0\0\6\1s\0\7\0\0\0:1.1817\0"..., 2048}], msg_controllen=0, msg_flags=MSG_CMSG_CLOEXEC}, MSG_CMSG_CLOEXEC) = 187
Looks like it is opening a socket to talk to dbus, asking
something about NetworkManager, then sitting in a poll() call for 25
seconds. I don't have NetworkManager running. I didn't even have it
installed until it got dragged in as a dependency for the build
(above). Apparently if it is installed, but not running things will
timeout desperately trying to talk to it (which is the sort of
behavior that led me to remove it in the first place).
I find it highly unlikely that an icon for a tree view would be
coming from NetworkManager, so I erase NetworkManager and, Lo and
Behold, the 25 second startup delay disappears.
Just to get it on record, I file bug 2583, but since I fixed the problem by
removing NetworkManager, I forget about it and go back to looking for
tiny triangles.
I'm now in a position to grep -r the source code in the
/zooty/build/rpmbuild/BUILD/claws-mail-3.7.10/ directory. I
know it is drawing a triangle. I know the triangles are on folders.
I'm pretty sure from previous google searches on the gtk toolkit that
it calls those things expanders, so I have several things to grep for
that might point me to the code or icon I'm looking for.
That pretty quickly discovers GTK_CMCTREE_EXPANDER_TRIANGLE
in the src/gtk/gtkcmctree.c file. That has lots of the things
I'm looking for, and is probably important. I start looking around at
the places it is used.
That leads me to the routine gtk_cmctree_draw_expander, and
examining the code in there sure makes it look like it is drawing the
triangle itself by filling in a polygon. So much for the idea of
finding an icon file or resource I could modify. The tiny triangles
appear to be hard coded.
Now I'm no longer interested in the damn triangle, what I'm
interested in now is figuring out how it determines a mouse click
actually means expand or collapse. Maybe I can enlarge the region
that recognizes the clicks?
More searching leads me to the ctree_is_hot_spot routine.
Just as the drawing routine is doing elaborate calculations to
determine where to draw the triangle, this routine is doing elaborate
calculations to determine where the mouse click happened.
It is difficult to know what is going on for sure because of all
the references to data structures and variables I know nothing about,
but it is clear that it is using PM_SIZE for a lot of important
quackqulations in the code, and it is a constant that is equal to 8,
whereas a screen shot shows the row height is 18 (which is a lot
bigger than 8 when it comes to positioning the mouse).
At this point, I strongly suspect that the expression
clist->column[ctree->tree_column].area sounds like it is
describing a rectangle that gives the area of that column in the row
(just guessing from the name, mind you), and it would make a heck of
a lot more sense to me to just allow a mouse click anywhere inside
that cell to mean expand or collapse.
Tackling the job of learning what the actual data structures mean
and determining if I really could just use the area rectangle
can be left to another day when I get more pissed off at how hard it
is to click the triangles. For now, I just added this analysis to the
bugzilla and I'll see if anything comes of it.
So there you have the nitty gritty details of what a typical Game
of Linux looks like. This game isn't won yet, but I'm pretty sure it
is winnable now, and it makes a good real world example.
|