system tray

Difference between version 25 and 26 - Previous - Next
GUI construct in the lower right-hand corner, '''not''' the taskbar, that ...
(RS adds:) holds little icons with mouse-over balloon behavior, and on double-click bring up minimized windows. Typically there are at least speaker volume control and clock; the Task manager also makes a tray icon that indicates CPU usage.



** See Also **

   [KDE]:   Includes information about targeting the KDE system tray from Tcl.

   [http://www.freedesktop.org/Standards/systemtray-spec%|%Freedesktop System Tray]:   An open specification.  See [http://tcl.havelka.co/saved/freedock-20051001.tgz%|%freedock]

   [TIP] [http://www.tcl.tk/cgi-bin/tct/tip/325.html%|%#325]: System Tray Access:   A proposal to integrate systray functionality into [Tk].



** [Microsoft Windows] **

[winico] or Win32api are necessary to manage the system tray.

[TWAPI] 3.1
http://twapi.magicsplat.com/v3.1-dev/shell.html#Taskbar%|%systemtray%|% command
also provides for manipulating system tray icons and balloon help.  To get any associated context menus to disappear when a pointer click occurs elsewhere, see [https://groups.google.com/d/msg/comp.lang.tcl/dahdYQaT5hw/a5n3CgLdEr0J%|%Using Twapi 3.1 - SystemTray AddIcon], [comp.lang.tcl], 2011-10-04.  [https://support.microsoft.com/en-us/kb/135788%|%PRB: Menus for Notification Icons Do Not Work Correctly], Q135788.

The [winico] page contains a TWAPI example.

----

[Tom Wilkason] posted to [comp.lang.tcl]:
"Here is an example from an [http] server that hides itself in the [taskbar] ...

======
;##
;# Callback to handle taskbar icon events
;# 
proc ht:iconCallback { message ico wparam lparam x y } {
    switch -- $message {
       WM_LBUTTONDOWN {
          wm deiconify .
       }
       WM_RBUTTONDOWN {
          wm withdraw .
       }
       default {}
    } ;# End Switch
}  
;# #
;#  Make window dissapear when it is minimized
;# 
if  {[catch {
    package require Winico
    if {[winico info] == ""} {  

       ;# Let GUI settle before setting icon
       update
       set ico [winico_seticon . [file join $home .. bin tclhttp.ico]]
       winico text $ico {tchHttp Web Server}
       winico taskbar add $ico \
         -callback [list ht:iconCallback %m %i %w %l %x %y]
      proc Minimize {w} {
         wm withdraw .
         console hide
      }
   } ;# end if
} result]} {
   console show
   puts stderr "$result"
} else {
   wm withdraw .
}
======

----
[TFW] 2004-03-03: Incidentally, there are distributions of winico that contain much more than is needed. You can use the following script to interface to the dll. Just save it as winico.tcl and create a package entry in the `pkgIndex.tcl` file for Winico 0.3.

In `pkgIndex.tcl`:

======none
package ifneeded Winico 0.3 [list source [file join $dir winico.tcl]]
======
in `winico.tcl`

======
;# *************************************************************************
;# * File   : winico.tcl
;# * Purpose: Provide wrapper functions for the winico package
;# *          Loads the winico dll first.
;# *************************************************************************
load [file join [file dirname [info script]] winico03.dll]
###############################################################################
# Function   : winico_seticon
# Description: Be smart about selecting the most appropriate icon from the
#              icon file.
###############################################################################
proc winico_seticon { w icofile } {
    set ico [winico create $icofile]
    set screendepth [winfo screendepth .]
    set bigsize "32x32"
    set bigpos -1
    set bigdepth 0
    set smallsize "16x16"
    set smallpos -1
    set smalldepth 0
    foreach i [winico info $ico] {
       array set opts $i
       set depth    $opts(-bpp)
       set pos      $opts(-pos)
       set geometry $opts(-geometry)
       if { $geometry=="$bigsize" && $depth<=$screendepth } {
          if { $depth>$bigdepth } {
             set bigpos $pos
             set bigdepth $depth
          }
       } elseif { $geometry=="$smallsize" && $depth<=$screendepth } {
          if { $depth>$smalldepth } {
             set smallpos $pos
             set smalldepth $depth
          }
       }
    }
    if { $bigpos==-1 && $smallpos==-1 } {
       puts stderr "couldn't find $bigsize and $smallsize icons in $icofile"
       return $ico
    } elseif { $bigpos==-1 } {
       set bigpos $smallpos
       puts stderr "couldn't find $bigsize icons in $icofile"
    } elseif { $smallpos==-1 } {
       set smallpos $bigpos
       puts stderr "couldn't find $smallsize icons in $icofile"
    }
    puts stderr "big icon is $bigsize,bpp:$bigdepth,pos:$bigpos"
    puts stderr "small icon is $smallsize,bpp:$smalldepth,pos:$smallpos"
    winico setwindow $w $ico big   $bigpos
    winico setwindow $w $ico small $smallpos
    return $ico
}

###############################################################################
# Function   : winico_delall
# Description: Remove all icon instances
###############################################################################
proc winico_delall {} {
    foreach i [winico info] { winico delete $i }
}

###############################################################################
# Function   : winico_loadicon
# Description: Set up all big/small icons for a specified window
###############################################################################
proc winico_loadicon { w symbol } {
    set ico [winico load $symbol]
    winico setwindow $w $ico big
    winico setwindow $w $ico small
}
package provide Winico 0.3
======



----
'''[JMN] - 2021-10-07 14:17:34'''
JMN

I've used winico and twapi before to create a system tray icon with a popup context menu activated by button3
tk systray  is nice to have built in now - but I'm at a loss as to how to get the mouse click x and y coordinates in order to post my menu.
Any hints?

<<categories>> Package | GUI