On Wed, 10 Oct 2007, Eeri Kask wrote:
(2) twm-1.0.3-diff2.TWM_USE_XFT.tgz
introduces Xft support (replaces bitmap text rendering functions with
xft-font rendering). [Compile with -DTWM_USE_XFT to activate.]

This leaks memory in the form of XftDraw structures that never get released.
I've reworked this to fix that problem, and also to re-instate "core" font
support even if TWM_USE_XFT is #define'd.  If a font cannot be found through
libXft, it will be looked for through the older standard mechanism.

Oops, I see, I'am very sorry about that!   Now as you say, I'll
understand the problem.  May I kindly ask you to give me your
corrections if you don't mind, as it would be pointless by me to
investigate issues you have already solved (and it would save time).

I'm attaching a context diff of what I've done on this so far. It is against our main CVS repository as it stands now. Note that, as of this writting, our publicly accessible repository mirror has yet to be sync'ed (but it should be sometime today).

This includes (among other odds & ends):
- your first change (MyFont_ChangeGC);
- my rework of your second change (TWM_USE_XFT);
- two non-spacing changes I found in your third batch (Spacing);
- the XSetClassHint() and "DefaultFont" changes from your fifth batch
  (Appearance);
- your seventh change (Improvements).

This is not yet ready to commit.

(3) twm-1.0.3-diff3.Spacing.tgz
(Vertical) spacing corrections; having scalable fonts one should use
"scalable spacing" as well, otherwise one day having 600x600 dpi screen
vertical spacing of, e.g. 4 pixels, results in text line distance of
zero. Now baseline skip is computed like 1.2 times font height or something.

I would prefer that this be done only for Xft fonts, or, better, be made
configurable.

I agree and I'll put these changes inside #ifdef TWM_USE_XFT as well.
Configurable ... in what sense?  Using some compile-time #define?  If
you prefer this, I'll do it that way.

By "configurable", I meant through .twmrc. But this might be more trouble than it's worth. So, I'd settle on adjusting spacing only for Xft fonts.

(4) twm-1.0.3-diff4.TWM_USE_OPACITY.tgz
If you value transparency in twm menus and icon manger/icons, apply
this. This patchset introduces "MenuOpacity" and "IconOpacity" keywords
having integer values in range 0...255. [Enable with -DTWM_USE_OPACITY]

As stated previously, this will not be integrated as it relies on
X.Org-specific functionality.

I have thought about your standpoint here.  This may be Xorg
functionality, but if twm is run to manage the Xorg server, this
functionality will be available to twm, regardless which X11
implementation/distribution twm belongs to.  So I'd suggest this
functionality be available as twm patch, and its everyone's own decision
to include/apply it ... or not.  (I have all respect in your preference
not to do this if you so like.)

(I am even considering to very slightly enlarge opacity support in the
sense that twm should intercept these opacity property change requests
from client windows and propagate them to self-created frame-windows of
these top-level clients.  The user is responsible to run xcompmgr in the
backround, twm will not be dealing with transparency in any other way.
This increases opacity code in twm maybe about ten lines or so in
HandlePropertyNotify() in events.c.  So if some client asks for
transparency, twm wouldn't stand in the way.)

I doubt very much anyone would ever use XFree86's twm with X.Org's xcompmgr. But I understand your point.

(5) twm-1.0.3-diff5.Appearance.tgz
Here lies probably the most radical change I have made to twm: the
iconmanager painting DrawIconManagerBorder() is now
DrawIconManagerEntry() and draws the iconmanager entry in full. This
work is not completed yet.

I'm inclined to delay this one until it is complete.

If you didn't, I would have asked you to do this.  :-)

OK.  Let me know when it's ready.

(6) twm-1.0.3-diff6.Fixes.tgz
Here are bugs I encountered in twm as improving icon manager
functionality; some are serious.

Such as?  Please be more descriptive.

(1) In iconmgr.c.diff6  at the end is corrected a bug which leads to
*multicolumn* iconmanager window width gradual collapse under certain
circumstances while computing 'wwidth'.  I observed this while resizing
and/or moving the icon manager window and then terminating some client,
say xcalc.  In that moment the icon manager window gets squeezed
unexpectedly showing this bug.

Other 'fixes' in this diff somehow clarify the MoveIconManager() (which
is the second most heavily modified  function next to
DrawIconManagerEntry()), with the purpose of returning a mapped (not
iconified or unmapped) client window if the icon manager window is *not*
mapped.  I noticed that f.forwiconmgr gets stuck on some
unmapped/iconified window if the icon manager is not mapped as well,
leaving the mouse sporadically somewhere on the root window (exactly
there, where the iconified client window would appear if it where mapped
-- and if this falls inside some other mapped window, the f.forwiconmgr
cycling starts from this client again; a kind of sub-cycling emerges).

So in the end one can step along *all* windows if the icon manager is
mapped, and only along *mapped* windows if the icon manager is not
mapped.  This was my intended solution to the mouse "getting lost" problem.

(2) In events.c.diff6 in HandleEnterNotify() I discovered a situation
where entering the root window (one can enter the root window in leaving
some client window on the same screen; and in leaving some other screen)
while coming from some other screen and then --- being on the screen
just entered NotActiveIconManager() gets called with the UnHighLight_win
client window data structure on the screen just left in order to paint
the iconmanager entry on that screen 'not active'.  Being at it,
entering DrawIconManagerBorder()/DrawIconManagerEntry() we have the GC
of the screen we just *entered* with the WList *tmp of the screen we
just *left*.  This ends in X-server refusing to do anything with this
GC.  Nobody noticed this because we have a couple of double-drawings
executed for every iconmanager not-active cases which get triggered as
the mouse leaves the twm-created frame window of the client, as well as
the reparented client window itself.  (The same double painting occurs
as we enter some client: we draw iconmanager 'active' as we enter the
frame window followed by a draw 'active' as we enter the reparented
client window itself.)

Noone noticed this bug probably because the iconmanager entry was
(doubly) painted 'not active' already as we left the corresponding
client window on the previous screen, and now entering the current
screen this entry was tried to paint 'not active' 3rd time; ending in
failure.

It became only visible as now we paint the iconmanager entry in full,
including text.  Now travelling from one screen to the other the
iconmanager entry was painted 'not active' as usual; but the third time
painting after entering the current screen root window resulted in
overpainting the iconmanager entry window name label on that screen in
noticeably *huge* letters.  So I observed this overpainting with
different font sizes, not cleaning up there the previous (normal sized)
text first.  Only then I discovered the issue of the GC problem: the X
server refused to XFillRectangle() that entry, but XftDrawStringUtf8()
had no problem to overdraw text ... having the font structure of the
current screen with a significantly different dpi resolution ended in
huge letters.

Thanks for the clarifications. I'll have another look. Due to dependencies, some of this might have to wait until your "Appearance" changes are complete.

(7) twm-1.0.3-diff7.Improvements.tgz
Here are some improvements to the icon manager. The old behaviour is
kept as long as "WarpCursor" is not defined: actually the meaning of
this variable is broadened in the sense that everywhere where warping
mouse makes sense, this is done:

(*) if some client window has focus and this client opens a transient
window, then mouse is transfered there; like in password prompt and
file-open dialogs (this is a valuable idea from vtwm);

(*) if iconifying some client window and the icon manager is currently
mapped, the mouse is transfered into the corresponding icon manager entry;

(*) if executing f.hideiconmgr transfer mouse into the corresponding
client if some iconmanager entry was "active".

(*) iconmanager navigation functions raise the corresponding client
windows as stepping around entries.

OK, except that, as you currently have it coded, that last one does not
depend on "WarpCursor".  Is that intentional?

Yes, this is the last one: stepping along iconmanager entries raises
them unconditionally.  I had no good idea what to do with the situation:
usually one wants windows be raised, while looking for / searching some
application in a stack of lots of windows.  In the same time I am
hesitant to invent new keywords for every single little feature (I think
it is better to try to utilise already existing keywords).

Well, I personally would find such default behaviour rather annoying, so would prefer to make it optional. I'm not a big fan of window managers that raise windows or move focus and/or pointers all by themselves.

The correct solution could maybe be to overwork the twm used-defined
function execution framework.  This is incomplete in the sense, that if
user-defined functions include commands depending on the existence of
some 'active window', execution of these functions is not deterministic,
if they are executed at all; as the 'active window' is sometimes not
defined at the moment the execution starts. But that situation can
change during execution! And this aspect seems not implemented in the
current model.

If this gets fixed then the autoraise feature can be removed as I am
then able to incorporate it into a user-defined function.

That sounds reasonable.

P.S. The f.hideiconmgr case above is badly implemented as well, I'll
correct this next time: we don't have to move the mouse if we are
already in the correct client window.

Right.

One more thing, before I forget (again). The man page should be updated accordingly.

Thanks.

Marc.

+----------------------------------+----------------------------------+
|  Marc Aurele La France           |  work:   1-780-492-9310          |
|  Academic Information and        |  fax:    1-780-492-1729          |
|    Communications Technologies   |  email:  [EMAIL PROTECTED]         |
|  352 General Services Building   +----------------------------------+
|  University of Alberta           |                                  |
|  Edmonton, Alberta               |    Standard disclaimers apply    |
|  T6G 2H1                         |                                  |
|  CANADA                          |                                  |
+----------------------------------+----------------------------------+
XFree86 developer and VP.  ATI driver and X server internals.

Attachment: cvs-devel.diff.gz
Description: Binary data

Reply via email to