Assumindo que sua pergunta real é dada em seu comentário (e assumindo python desde que você tenha adicionado uma tag py-appindicator): " 1.) Como faço para obter as cores do menu global? 2.) E como faço para desenhar as cores na imagem para o meu appindicator? "
Sua segunda pergunta é composta de duas perguntas: 2.a) Como faço para desenhar uma imagem? 2.b) Como definir um tema de ícone do Appindicator?
Não tenho resposta para 2.b). O Appindicator está extremamente mal documentado ou a documentação está extremamente bem oculta. Algumas coisas não tão úteis podem ser encontradas aqui e aqui . Você provavelmente terá que executar myindicator.set_icon_theme_path
, mas não encontrei os nomes dos diferentes ícones usados.
Para 1.): Para obter as cores de um widget gtk programaticamente para uso em cairo (para desenhá-las mais tarde) você pode usar algo assim (para um menu ):
import gtk
def get_menubar_colors_for_cairo():
w = gtk.Window()
b = gtk.MenuBar()
w.add(b)
w.show_all()
w.hide()
style = b.get_style()
del(w)
del(b)
bg = {}
fg = {}
for name, state in [("normal", gtk.STATE_NORMAL),
("active", gtk.STATE_ACTIVE),
("prelight", gtk.STATE_PRELIGHT),
("selected", gtk.STATE_SELECTED),
("insensitive", gtk.STATE_INSENSITIVE)]:
bg[name] = (style.bg[state].red / 65535.0, style.bg[state].green / 65535.0, style.bg[state].blue / 65535.0)
fg[name] = (style.fg[state].red / 65535.0, style.fg[state].green / 65535.0, style.fg[state].blue / 65535.0)
return fg, bg
Isso lhe dá o estilo forground e background para diferentes estados. (Provavelmente há maneiras melhores, mas isso ainda deve funcionar ...)
Observe que o vermelho azul ou vermelho brilhante não parece fazer parte das cores padrão do menu. Eu não consegui descobrir de onde eles vêm.
Note também que, se o tema gtk mudar, mas você deixar seus ícones como estão, eles se destacarão, pois poderão ter as cores erradas.
Para 2.a) Você pode usar o cairo para desenhar imagens em várias superfícies (png, pdf, svg, widgets gtk, ...). Aqui está um exemplo que desenha alguns retângulos em superfícies png e salva os arquivos em seu diretório de trabalho atual. Cada retângulo tem a cor do primeiro plano desenhada na cor de fundo do estado indicado:
import cairo
def draw_a_rect(fg, bg, state, outfilename):
surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, 200, 200)
context = cairo.Context(surf)
context.rectangle(0, 0, 200, 200)
context.set_source_rgb(*bg[state])
context.fill()
context.rectangle(50, 50, 100, 100)
context.set_source_rgb(*fg[state])
context.fill()
surf.write_to_png(outfilename % state)
fg, bg = get_menubar_colors_for_cairo()
for state_name in ["normal", "active", "prelight", "selected", "insensitive"]:
draw_a_rect(fg, bg, state_name, "test_%s.png")
Uma última nota: você provavelmente quer deixar o plano de fundo dos seus ícones transparente, então você tem uma cor a menos para se preocupar.