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 )