aboutsummaryrefslogblamecommitdiffstats
path: root/urgent.tcl
blob: af59eccac9a6a66586b22171214a3d243da4d0bc (plain) (tree)















































































































































                                                                               
# $Id$

namespace eval urgent {
    custom::defgroup Urgent [::msgcat::mc "Urgency hinting."] -group Plugins

    custom::defvar options(enabled) 1 \
	[::msgcat::mc "Set the urgency hint on Tkabber's chat\
	    window when a new message is received."] \
	-type boolean \
	-group Urgent

    custom::defvar options(handle_personal_messages) 1 \
	[::msgcat::mc "React on messages addressed to us."] \
	-type boolean \
	-group Urgent

    custom::defvar options(handle_normal_messages) 0 \
	[::msgcat::mc "React on messages in MUC rooms\
	    which are not addressed to us."] \
	-type boolean \
	-group Urgent

    custom::defvar options(handle_server_messages) 0 \
	[::msgcat::mc "React on messages generated by the server"] \
	-type boolean \
	-group Urgent
}

proc urgent::chat_message_notify {chatid from type body extras} {
    variable options

    if {!$options(enabled)} return

    set delayed [::xmpp::delay::exists $extras]
    if {$delayed} return

    switch -- $type {
	groupchat {
	    if {[string equal [chat::get_jid $chatid] $from]} {
		if {$options(handle_server_messages)} {
		    notify $chatid
		}
	    } else {
		set mynick [chat::get_nick [chat::get_xlib $chatid] \
					   [chat::our_jid $chatid] $type]
		if {[check_message $mynick $body]} {
		    if {$options(handle_personal_messages)} {
			notify $chatid
		    }
		} else {
		    if {$options(handle_normal_messages)} {
			notify $chatid
		    }
		}
	    }
	}
	chat {
	    foreach xelem $extras {
		::xmpp::xml::split $xelem tag xmlns attrs cdata subels
		# Don't play sound if this 'empty' tag is present. It indicates
		# messages history in chat window.
		if {[string equal $tag ""] && \
				    [string equal $xmlns tkabber:x:nolog]} {
		    return
		}
	    }

	    if {$from == "" && $options(handle_server_messages)} {
		notify $chatid
	    } elseif {$options(handle_personal_messages)} {
		notify $chatid
	    }
	}
    }
}

proc urgent::notify {chatid} {
    variable options
    variable xwinids

    exec $options(program) -set $xwinids($chatid)
}

proc urgent::xwinid {win} {
    # Parent window id: 0x2e0001e "Tkabber"
    set data [exec xwininfo -children -id [winfo id $win]]
    if {[regexp {Parent window id: (\S+)} $data -> id]} {
	return $id
    } else {
	return ""
    }	
}

proc urgent::root_winid {xwinid _chatid} {
    return $xwinid
}

proc urgent::chat_winid {chatid} {
    xwinid [winfo id [chat::winid $chatid]]
}

proc urgent::record_xwinid {chatid _type} {
    variable xwinids
    set xwinids($chatid) [winid $chatid]
}

proc urgent::clear_urgency_hint {winid} {
    variable options
    variable xwinids

    set chatid [chat::winid_to_chatid $winid]
    
    exec $options(program) -clear $xwinids($chatid)
}

namespace eval urgent {
    variable options

    if {![info exists options(program)]} {
	set options(program) [file join \
	    [file dirname [info script]] urgent]
    }
    if {![file executable $options(program)]} {
	puts stderr [::msgcat::mc "Urgency hint setting program \"%s\"\
	    is not available or not executed by the current user.\
	    The \"urgent\" plugin is disabled. Consult its README file."
	    $options(program)]
	set options(enabled) 0
    }

    if {$::ifacetk::options(use_tabbar)} {
	interp alias {} [namespace current]::winid \
	    {} [namespace current]::root_winid [xwinid .]
    } else {
	interp alias {} [namespace current]::winid \
	    {} [namespace current]::chat_winid
    }

    hook::add open_chat_post_hook [namespace current]::record_xwinid 40
    hook::add draw_message_hook [namespace current]::chat_message_notify 19
    hook::add got_focus_hook [namespace current]::clear_urgency_hint
}

# vim:ts=8:sw=4:sts=4:noet