Posted to tcl by patthoyts at Thu Dec 24 10:06:49 GMT 2009view pretty

# Reads the current Gtk+ theme colors using the gconftool and tries
# to configure the menubar appropriately. This works OK for "New Wave" on
# Ubuntu bit might not be so good for other themes.
#
# See /use/share/themes/New\ Wave/gtk-2.0/gtkrc
#
# Menu highlight is actually an image, this is a best attempt.
#
# You can apply this to tkchat by sourcing this code and calling gtkify::gtkify .mbar

namespace eval gtkify {
    variable color_scheme
    # define manual defaults.
    array set color_scheme {
        fg_color #101010
        bg_color #E5E5E5
        base_color #FFFFFF
        text_color #1A1A1A
        selected_fg_color #1A1A1A
        selected_bg_color #FF8F4C
        tooltip_bg_color #FFE6C4
        tooltip_fg_color #330606
        menu_text_disabled #696969
    }
}
    
proc gtkify::get_menus {menu} {
    set r {}
    foreach child [winfo children $menu] {
        set r [concat $r $child [get_menus $child]]
    }
    return $r
}
proc gtkify::shade {factor color} {
    set r "#"
    foreach c [winfo rgb . $color] {
        append r [format %04x [expr {int($c * $factor)}]]
    }
    return $r
}

proc gtkify::lighter {color} {return [shade 1.3 $color]}

proc gtkify::darker {color} {return [shade 0.3 $color]}

proc gtkify::gtkify {menu} {
    variable color_scheme
    set interface /desktop/gnome/interface
    set theme_name [exec gconftool --get $interface/gtk_theme]
    set gui_font [exec gconftool --get $interface/font_name]
    set mono_font [exec gconftool --get $interface/monospace_font_name]
    if {![catch {exec gconftool --get $interface/menus_have_tearoff} tearoff]} {
        option add *Menu.tearOff $tearoff
    }
    if {![catch {exec gconftool --get $interface/color_scheme} scheme]} {
        foreach {name color} [split $scheme :\n] {
            set color_scheme($name) $color
        }
    }

    $menu configure \
        -foreground $color_scheme(bg_color) \
        -background [shade 0.38 $color_scheme(bg_color)] \
        -selectcolor $color_scheme(selected_bg_color) \
        -activebackground [shade 0.38 $color_scheme(bg_color)] \
        -activeforeground $color_scheme(base_color) \
        -activeborderwidth 0 \
        -borderwidth 0 \
        -relief flat
    foreach submenu [get_menus $menu] {
        $submenu configure \
            -foreground $color_scheme(text_color) \
            -background [shade 0.965 $color_scheme(base_color)] \
            -activeforeground $color_scheme(selected_fg_color) \
            -activebackground $color_scheme(selected_bg_color)
    }
    return $theme_name
}
#gtkify::gtkify .mbar