Chandra
view release on metacpan or search on metacpan
include/webview-tray-gtk.c view on Meta::CPAN
* Falls back gracefully if no system tray is available.
*/
struct webview_tray_gtk {
GtkStatusIcon *icon;
GtkWidget *menu;
};
/* Forward */
static void tray_gtk_activate(GtkStatusIcon *icon, gpointer user_data);
static void tray_gtk_popup(GtkStatusIcon *icon, guint button,
guint activate_time, gpointer user_data);
/* Menu item activation callback */
static void tray_gtk_menu_item_activated(GtkMenuItem *menuitem,
gpointer user_data) {
int *item_data = (int *)user_data;
/* item_data[0] = item_id, item_data[1..] = pointer to tray */
/* We pack item_id and tray pointer together */
(void)menuitem;
/* This approach is fragile. Instead, use g_object_set_data. */
include/webview-tray-gtk.c view on Meta::CPAN
static void tray_gtk_activate(GtkStatusIcon *icon, gpointer user_data) {
(void)icon;
struct webview_tray *t = (struct webview_tray *)user_data;
/* Left click - invoke item 0 if it exists, or just show menu */
if (t->menu_cb && t->item_count > 0) {
t->menu_cb(t->w, -1); /* -1 = tray icon clicked */
}
}
static void tray_gtk_popup(GtkStatusIcon *icon, guint button,
guint activate_time, gpointer user_data) {
struct webview_tray *t = (struct webview_tray *)user_data;
struct webview_tray_gtk *priv = (struct webview_tray_gtk *)t->_priv;
if (priv->menu) {
gtk_menu_popup(GTK_MENU(priv->menu), NULL, NULL,
gtk_status_icon_position_menu, icon, button, activate_time);
}
}
WEBVIEW_API int webview_tray_create(struct webview_tray *t) {
struct webview_tray_gtk *priv = (struct webview_tray_gtk *)
calloc(1, sizeof(*priv));
if (!priv) return -1;
t->_priv = priv;
include/webview-tray-gtk.c view on Meta::CPAN
}
gtk_status_icon_set_visible(priv->icon, TRUE);
/* Build context menu */
priv->menu = tray_gtk_build_menu(t, t->items, t->item_count);
/* Connect signals */
g_signal_connect(G_OBJECT(priv->icon), "activate",
G_CALLBACK(tray_gtk_activate), t);
g_signal_connect(G_OBJECT(priv->icon), "popup-menu",
G_CALLBACK(tray_gtk_popup), t);
return 0;
}
WEBVIEW_API void webview_tray_update(struct webview_tray *t) {
if (!t || !t->_priv) return;
struct webview_tray_gtk *priv = (struct webview_tray_gtk *)t->_priv;
/* Update icon */
if (t->icon_path && strlen(t->icon_path) > 0) {
include/webview-tray-win32.c view on Meta::CPAN
/*
* webview-tray-win32.c - Windows system tray (Shell_NotifyIcon) backend
*
* Uses the Win32 Shell notification API with popup menus.
*/
#define WM_TRAYICON (WM_USER + 1)
struct webview_tray_win32 {
NOTIFYICONDATAA nid;
HMENU menu;
HWND msg_hwnd;
};
( run in 1.690 second using v1.01-cache-2.11-cpan-364913b4093 )