📄 tray.c
字号:
/* -*- Mode: C; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- *//* Modified by chice <chice_wxg@hotmail.com> in 2004*//* tray.c * * Copyright (C) 2003-2003 Joakim Ziegler <joakim@avmaria.com> * * Parts taken from the Gaim docklet plugin, * Copyright (C) 2002-3 Robert McQueen <robot101@debian.org> * Copyright (C) 2003 Herman Bloggs <hermanator12002@yahoo.com> * Copyright (C) 2002 Anders Carlsson <andersca@gnu.org> * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA * * Authors: Joakim Ziegler <joakim@avmaria.com> */#include <glib.h>#include <gtk/gtk.h>/* XPM */static char *xpm_tray[]={"28 28 119 2","Qt c None",".0 c #0000ff",".J c #0080ff",".6 c #0682f9",".2 c #0c86f2",".Z c #0d86f2","## c #1989e5","#. c #198ce5","#x c #808080","#S c #848484","#y c #878787","#w c #8c8181","#H c #909090","#R c #939393","#G c #957979","#T c #969696","#z c #9c9c9c","#A c #9e9e9e","#B c #a0a0a0","#s c #a3a3a3","#r c #a6a0a0","#t c #a8a8a8","#N c #a9a9a9","#q c #aa9d9d","#M c #b14e4e","#U c #b1b1b1","#Q c #b3b3b3","#I c #bebebe","#X c #bfbfbf","#Y c #c2c2c2","#l c #c4c4c4","#P c #c6c6c6","#O c #cbcbcb","#W c #cdcdcd","#u c #cecece","#L c #cf3030","#Z c #cfcfcf","#F c #d76565","#E c #d85e5e","#C c #d8d8d8","#K c #dd3e3e","#k c #de9f9f","#0 c #e2e2e2","#V c #e3e3e3",".n c #e6dddd","#c c #e6dede",".b c #e6dfdf",".h c #e6e4e4",".g c #e7d8d8","#v c #e86969",".f c #e8cfcf",".Q c #e8d1d1",".a c #eab5b5",".t c #eab6b6",".e c #eabcbc","#b c #eabebe",".9 c #ebb5b5",".V c #eca7a7",".# c #eda1a1",".P c #ee9898",".m c #ef8d8d","#D c #f02121",".s c #f08383",".r c #f17878","#j c #f26d6d",".z c #f36262","#J c #f36464",".u c #f36767","#f c #f55858",".W c #f64d4d",".d c #f64e4e",".l c #f74545",".3 c #f7fb07",".5 c #f83838",".q c #f83939",".k c #f83e3e",".G c #f92e2e",".O c #f93030","#g c #fa2626",".U c #fa2929","#d c #fb0204",".y c #fb1616","#m c #fb2020",".j c #fc1515",".c c #fc1717",".x c #fd0a0a",".X c #fd0b0b","#a c #fd0c0c",".D c #fde501","#n c #fe0303",".w c #fe0505",".T c #fe0707","#e c #fe0808",".4 c #fefe01",".i c #ff0000",".A c #ff0100","#p c #ff0400",".F c #ff0700",".B c #ff0900","#o c #ff0b00",".7 c #ff0d00",".H c #ff0e00",".M c #ff1900",".Y c #ff2200","#i c #ff2a00",".o c #ff3400",".1 c #ff4800",".L c #ff4d00",".E c #ff5500",".I c #ff6200",".p c #ff6d00",".C c #ff7a00","#h c #ff7e00",".8 c #ff8c00",".K c #ffae00",".N c #ffb200",".S c #ffe600",".R c #fff300",".v c #ffff00","QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt","QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt","QtQtQtQtQtQtQtQtQtQt.#.#.#.#.#.#.a.bQtQtQtQtQtQtQtQtQtQt","QtQtQtQtQtQtQtQtQt.c.c.c.c.c.c.c.d.e.f.g.hQtQtQtQtQtQtQt","QtQtQtQtQtQtQtQtQt.i.i.i.i.i.i.i.j.k.l.m.nQtQtQtQtQtQtQt","QtQtQtQtQtQtQtQtQt.i.i.i.o.p.p.o.i.i.i.q.r.s.tQtQtQtQtQt","QtQtQtQtQtQtQtQt.u.i.i.i.p.v.v.v.i.i.i.w.x.y.sQtQtQtQtQt","QtQtQtQtQtQtQtQt.z.i.A.B.C.v.v.v.v.D.E.F.A.i.i.l.fQtQtQt","QtQtQtQtQtQtQtQt.G.i.H.I.v.v.J.J.v.v.K.L.F.i.i.l.fQtQtQt","QtQtQtQtQtQtQt.i.i.i.M.N.v.v.J.J.J.v.v.K.E.i.i.O.P.QQtQt","QtQtQtQtQtQtQt.i.i.i.M.v.v.v.J.J.J.v.v.R.S.i.i.T.U.VQtQt","QtQtQtQtQtQt.W.i.i.i.v.v.v.J.J.J.J.v.v.v.v.i.i.i.c.#QtQt","QtQtQtQtQtQt.X.i.i.Y.v.v.v.Z.J.J.0.v.v.v.v.p.o.i.c.#QtQt","QtQtQtQtQtQt.X.i.i.1.v.v.J.Z.J.J.v.v.v.v.v.v.p.i.c.#QtQt","QtQtQtQtQtQt.X.A.F.v.v.v.J.2.J.J.v.v.v.3.4.v.i.i.c.#QtQt","QtQtQtQtQt.5.w.F.L.v.v.v.J.J.6.J.J.J.v.v.v.i.i.i.c.#QtQt","QtQtQtQtQt.i.i.7.8.v.v.J.J.J.J.J.J.J.J.v.v.i.i.j.d.9QtQt","QtQtQtQt.l.i.i.7.8.v.v.J#.#.#.#.#.##.J.v.i.i#a.d#b#cQtQt","QtQtQtQt.l.i.i.7.v.v.3.v.v.v.v.v.v.v.v.i#d#e#f.a.bQtQtQt","QtQtQtQt#g.i.i.7.v.v.v.v.v.v.v.v.8#h#i.i.i#j#k#lQtQtQtQt","QtQtQt#m#n.i.i.7.v.v.v.v.v.v.7.7.7#o#p.i.i#q#r#s#t#uQtQt","QtQtQt.c.i.i.i.i.i.i.i.i.i.i.i.i#n.x.X#v#w#x#y#z#A#B#B#C","QtQtQt.c.i.i.i.i.i.i.i.i.i.i.i.i#D#E#F#G#x#x#x#x#H#B#B#I","QtQtQt#J#K#L#L#L#L#L#L#L#L#L#L#L#M#x#x#x#x#x#x#x#H#B#N#O","QtQtQtQt#P#Q#Q#Q#Q#Q#Q#R#x#x#x#x#x#x#x#x#x#x#S#T#N#U#O#V","QtQtQtQtQtQtQtQtQtQtQt#W#X#X#X#X#X#X#X#X#X#X#Y#Z#C#C#0Qt","QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt","QtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQtQt"};//GtkWidget *tntc_get_widget (const gchar *name);//#define W(w) tntc_get_widget (w)#include <string.h>#include <gdk/gdkx.h>#include "tray.h"#include "interface.h"#include "callbacks.h"#define SYSTEM_TRAY_REQUEST_DOCK 0#define SYSTEM_TRAY_BEGIN_MESSAGE 1#define SYSTEM_TRAY_CANCEL_MESSAGE 2 static GtkPlugClass *parent_class = NULL;static EggTrayIcon *docklet = NULL;static GtkWidget *image = NULL;static void egg_tray_icon_init (EggTrayIcon *icon);static void egg_tray_icon_class_init (EggTrayIconClass *klass);static void egg_tray_icon_unrealize (GtkWidget *widget);static void egg_tray_icon_update_manager_window (EggTrayIcon *icon);GTypeegg_tray_icon_get_type (void){ static GType our_type = 0; our_type = g_type_from_name("EggTrayIcon"); if (our_type == 0) { static const GTypeInfo our_info = { sizeof (EggTrayIconClass), (GBaseInitFunc) NULL, (GBaseFinalizeFunc) NULL, (GClassInitFunc) egg_tray_icon_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof (EggTrayIcon), 0, /* n_preallocs */ (GInstanceInitFunc) egg_tray_icon_init }; our_type = g_type_register_static (GTK_TYPE_PLUG, "EggTrayIcon", &our_info, 0); } else if (parent_class == NULL) { /* we're reheating the old class from a previous instance - engage ugly hack =( */ egg_tray_icon_class_init((EggTrayIconClass *)g_type_class_peek(our_type)); } return our_type;}static voidegg_tray_icon_init (EggTrayIcon *icon){ icon->stamp = 1; gtk_widget_add_events (GTK_WIDGET (icon), GDK_PROPERTY_CHANGE_MASK);}static voidegg_tray_icon_class_init (EggTrayIconClass *klass){ GtkWidgetClass *widget_class = (GtkWidgetClass *)klass; parent_class = g_type_class_peek_parent (klass); widget_class->unrealize = egg_tray_icon_unrealize;}static GdkFilterReturnegg_tray_icon_manager_filter (GdkXEvent *xevent, GdkEvent *event, gpointer user_data){ EggTrayIcon *icon = user_data; XEvent *xev = (XEvent *)xevent; //dprintf (__PRETTY_FUNCTION__); if (xev->xany.type == ClientMessage && xev->xclient.message_type == icon->manager_atom && xev->xclient.data.l[1] == icon->selection_atom) { egg_tray_icon_update_manager_window (icon); } else if (xev->xany.window == icon->manager_window) { if (xev->xany.type == DestroyNotify) { egg_tray_icon_update_manager_window (icon); } } return GDK_FILTER_CONTINUE;}static voidegg_tray_icon_unrealize (GtkWidget *widget){ EggTrayIcon *icon = EGG_TRAY_ICON (widget); GdkWindow *root_window; if (icon->manager_window != None) { GdkWindow *gdkwin;#if HAVE_GTK_MULTIHEAD gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (widget), icon->manager_window);#else gdkwin = gdk_window_lookup (icon->manager_window);#endif gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon); }#if HAVE_GTK_MULTIHEAD root_window = gdk_screen_get_root_window (gtk_widget_get_screen (widget));#else root_window = gdk_window_lookup (gdk_x11_get_default_root_xwindow ());#endif gdk_window_remove_filter (root_window, egg_tray_icon_manager_filter, icon); if (GTK_WIDGET_CLASS (parent_class)->unrealize) (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);}static voidegg_tray_icon_send_manager_message (EggTrayIcon *icon, long message, Window window, long data1, long data2, long data3){ XClientMessageEvent ev; Display *display; //dprintf (__PRETTY_FUNCTION__); ev.type = ClientMessage; ev.window = window; ev.message_type = icon->system_tray_opcode_atom; ev.format = 32; ev.data.l[0] = gdk_x11_get_server_time (GTK_WIDGET (icon)->window); ev.data.l[1] = message; ev.data.l[2] = data1; ev.data.l[3] = data2; ev.data.l[4] = data3;#if HAVE_GTK_MULTIHEAD display = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));#else display = gdk_display;#endif gdk_error_trap_push (); XSendEvent (display, icon->manager_window, False, NoEventMask, (XEvent *)&ev); XSync (display, False); gdk_error_trap_pop ();}static voidegg_tray_icon_send_dock_request (EggTrayIcon *icon){ //dprintf (__PRETTY_FUNCTION__); egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_REQUEST_DOCK,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -