How to monitor applications being open or launch i

2019-06-07 21:33发布

问题:

I am trying to build a panel application, alike avant window navigator or ubuntu unity.

My question is once I build the panel with the predifined applications, how I can add items to the panel when applications are open or launch?

Here is my source code in tcl:

package require Tk

set items {xterm gvim firefox}
wm withdraw .
toplevel .panel
wm attributes .panel -topmost 1 ; # on top
bind .panel <Escape> {exit}
wm geometry .panel +0+0
wm overrideredirect .panel yes ; # remove window decorations

set counter 0
foreach item $items {
    incr counter
    set separator " "
    label .panel.$counter -text "$item$separator" -bg black -fg white \
    -font {-family "Fixedsys Excelsior 3.01" -size 12}
    grid .panel.$counter -column $counter -row 0
}

Is there any terminal, tcl or python command that can achieve this?

Appreciate any insights. Thank you in advance.

回答1:

If the send command is turned on (which depends on all sorts of factors related to the security of your display) you can just tell it to listen on a “well-known name” and then have another little app use send to dispatch a script to evaluate.

In the panel, listen on a “good” name:

package require Tk
tk appname MyExcellentPanel
proc registerItem args {
   # How to do the registration of things here
}

In the helper script:

#!/usr/bin/env wish
package require Tk
wm withdraw .                               ;  # IMPORTANT! Don't show a GUI here
send MyExcellentPanel registerItem $argv    ;  # The magic command
exit                                        ;  # IMPORTANT! Exit now

Now you can use that little script from a shell script or wherever to send an instruction to the panel to register something. It's as easy as that.


If the send command isn't present, try the comm package in Tcllib, with comm::comm send as the approximate equivalent of send. However, there's nothing exactly the same as tk appname as there's no portable way to do a registry of port mappings (comm uses local TCP channels) so you need to find a way to communicate that information (a file in a well-known place?). Alas, I'm not very experienced with it so I can't really advise in detail.