[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-devel
Subject: Re: visibility?
From: Christopher Molnar <molnarc () nebsllc ! com>
Date: 2000-03-09 17:20:46
[Download RAW message or body]
Rik,
Thanks for the breakdown of what needs to be done, but
I am afraid this goes way past my comfort level with my
skills (main reason). It also came as a sort of shock
to me this week that the company I work for may be sold
and I may be competing with 11,000 others for work in
my area. So the job search is on.
Because of these reasons I need to pass on this job, I
just don't think I will have the time to give it the
attention it deservers, and it would be unfair to
pretend otherwise. (just remembered, I still need to
fix the nntp slave as well).
Would you mind if I added it to the "Jobs-open" web
page? Maybe there are some other takers.
Thanks,
Chris
Quoting Rik Hemsley <rik@kde.org>:
> #if Christopher Molnar
> > OK, if you have some patience give me an overview
of what needs to happen
> > and I'll ask questions as needed. (A pointer to the
right area of code
> > would be nice as well).
>
> Here we go...
>
> I'm sending this to kde-devel so that people can see
that the
> app-starting indicator is on its way and simply needs
some code
> writing.
>
> Brief explanation:
>
> When KApplication::setTopWidget() is called,
various
> properties are set on the toplevel widget
(window). One of
> these is the WM_COMMAND property. This has
two parts, res_name
> and res_class. res_name is set from argv[0]
(so we know the
> name of the binary) and res_class is simply
set to "toplevel" -
> we don't need that.
>
> (BTW, thanks to whomever cleaned up that
code :)
>
> Now, when we launch an app, we want to pass
the name of
> the binary to kicker. kicker will notify the
user that
> the app is starting by _immediately_ creating
a taskbar
> entry for that app.
>
> When the application sets a toplevel widget
(window),
> kwin will pass the name of the app (found in
> WM_COMMAND -> res_name) to kicker. kicker
will then
> replace the 'app starting' indication with a
real taskbar
> entry.
>
> kicker already creates taskbar entries when
an app is
> mapped. So all that needs to be done there is
to remove
> the 'app starting' indicator.
>
> The 'app starting' indicator, as I said
earlier, should
> be a taskbar entry. This is logical, it's
what the user
> expects. The thing that isn't what they
expect is that
> there is no accompanying window. For this
reason the
> taskbar entry should be marked in some way to
make this
> clear. I suggest the 'white gauze' effect as
seen in Window
> Maker and over toolbar buttons. Feel free to
do spinning
> cogs or something else if you wish, but
remember that
> animations eat bandwidth when you're running
X remotely,
> so this would not be the best solution.
>
> Step 1: Find out how applications are being launched.
>
> KDE applications should never launch apps
themselves with
> exec() or similar, they should be using the
support in kdelibs.
>
> You need to know whether there is more than
one mechanism
> that is being used. When I did this before I
just assumed
> that all apps used krun (kio/krun.*) to
launch. This might
> not be the case, so that simply needs
checking.
>
> You may also want to keep track of the pids
of apps you
> exec and notice when they die. More on this
in a bit...
>
> Step 2: Edit kicker's taskbar code.
>
> You need to receive DCOP signals called:
> 'clientStarted(QString, int)',
> 'clientMapped(QString)' and
> 'clientDied(int)'
>
> The first (clientStarted()) will be sent by
KRun when it
> calls exec().
>
> You should create an 'app starting' taskbar
entry here,
> using the name you are passed in the first
parameter.
>
> The second parameter is the pid of the
process that was
> started. You must remember this so that when
the process
> exits you can remove the taskbar entry.
>
> You may say, "Well, I can remove the entry
when the window
> goes away" - see the discussion on buggy
clients later
> for the reasons why.
>
> The second (clientMapped()) will be sent by
kwin whenever
> it sees a new window.
>
> Step 3: Edit krun (and anywhere else you find code
that launches apps).
>
> You need to emit a signal via DCOP, that is
directed to kicker.
>
> Something like this...
>
> dcopClient->send(
> "kicker",
> "taskbar/something",
> "clientStarted(QString)",
> nameOfAppBinary,
> pid
> );
>
> You then need to make sure you are notified
when the process
> exits, so don't lose that pid.
>
> Step 4: Edit kwin
>
> Again you need to emit a signal via DCOP,
that is directed to
> kicker.
>
> Something like this...
>
> dcopClient->send(
> "kicker",
> "taskbar/something",
> "clientMapped(QString)",
> WM_CLASS -> res_name
> );
>
> WM_CLASS is set in kapp.cpp and contains argv
[0] and "toplevel".
>
> Within WM_CLASS, res_name contains argv[0]
and res_class
> contains "toplevel".
>
> Final thoughts...
>
> You may wonder how this will work with 'legacy' apps.
Well the fact is,
> most X11 apps already set WM_COMMAND. Only very few
apps do not set
> this property. Examples include Tk apps (though
that's generally because
> the author didn't do it) and KDE 1 apps.
>
> So if some apps don't set WM_COMMAND, how do we know
when they have
> mapped ? The answer is, we don't. I can't see a way
to be sure, and
> if we can't be sure, we shouldn't mess, as we'll just
get into
> trouble.
>
> How to fix this ? You can't, completely.
>
> You can, however, take notes from Window Maker.
>
> krun can be notified when the binary it has exec()'ed
has died.
> When this happens, it send a clientDied(pid) DCOP
signal to kicker.
> If kicker finds a taskbar entry with matching
associated pid, it
> simply removes it.
>
> The upshot of all of this is that a buggy client will
create a
> taskbar entry which looks permanently like it is
starting up.
>
> We can remedy the situation further by using .desktop
files to our
> advantage. Because we ship KDE with a set of .desktop
files for legacy
> apps, we can identify some common legacy apps that
are buggy (do not
> set WM_COMMAND) and mention that fact in
their .desktop file.
>
> If krun is 'running a .desktop file' (I believe it
does this ?) then
> it can simply avoid sending the clientStarted()
signal to kicker.
> I think this might be a good solution. Any other
suggestions are
> welcome.
>
> It's also possible that we kicker could get the info
from the related
> .desktop file itself. I think it's ksycoca it would
need to chat
> with.
>
> Any questions ? We can take this off-list now if
there are no issues
> that everyone needs to hear about.
>
> Rik
>
> --
> Stop waiting for Godot.
>
Christopher Molnar
Red Hat Certified Engineer
Aetna, Inc.
New England Business Services, LLC
Hartford, CT USA
860-636-5588/860-956-9408
mailto:molnarc@nebsllc.com
mailto:molnarc@aetna.com
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic