⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tray.c

📁 linux的多线程下载工具。基于gtk界面。
💻 C
📖 第 1 页 / 共 2 页
字号:
				      icon->manager_window,				      gtk_plug_get_id (GTK_PLUG (icon)),				      0, 0);}static voidegg_tray_icon_update_manager_window (EggTrayIcon *icon){  Display *xdisplay;    //dprintf (__PRETTY_FUNCTION__);#if HAVE_GTK_MULTIHEAD  xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));#else  xdisplay = gdk_display;#endif    if (icon->manager_window != None)    {      GdkWindow *gdkwin;#if HAVE_GTK_MULTIHEAD      gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)),					      icon->manager_window);#else      gdkwin = gdk_window_lookup (icon->manager_window);#endif            gdk_window_remove_filter (gdkwin, egg_tray_icon_manager_filter, icon);    }    XGrabServer (xdisplay);    icon->manager_window = XGetSelectionOwner (xdisplay,					     icon->selection_atom);  if (icon->manager_window != None)    XSelectInput (xdisplay,		  icon->manager_window, StructureNotifyMask);  XUngrabServer (xdisplay);  XFlush (xdisplay);    if (icon->manager_window != None)    {      GdkWindow *gdkwin;#if HAVE_GTK_MULTIHEAD      gdkwin = gdk_window_lookup_for_display (gtk_widget_get_display (GTK_WIDGET (icon)),					      icon->manager_window);#else      gdkwin = gdk_window_lookup (icon->manager_window);#endif            gdk_window_add_filter (gdkwin, egg_tray_icon_manager_filter, icon);      /* Send a request that we'd like to dock */      egg_tray_icon_send_dock_request (icon);    }}EggTrayIcon *egg_tray_icon_new_for_xscreen (Screen *xscreen, const char *name){  EggTrayIcon *icon;  char buffer[256];  GdkWindow *root_window;  g_return_val_if_fail (xscreen != NULL, NULL);    //dprintf (__PRETTY_FUNCTION__);  icon = g_object_new (EGG_TYPE_TRAY_ICON, NULL);  gtk_window_set_title (GTK_WINDOW (icon), name);#if HAVE_GTK_MULTIHEAD  /* FIXME: this code does not compile, screen is undefined. Now try   * getting the GdkScreen from xscreen (:. Dunno how to solve this   * (there is prolly some easy way I cant think of right now)   */  gtk_plug_construct_for_display (GTK_PLUG (icon),				  gdk_screen_get_display (screen), 0);#else  gtk_plug_construct (GTK_PLUG (icon), 0);#endif    gtk_widget_realize (GTK_WIDGET (icon));  /* Now see if there's a manager window around */  g_snprintf (buffer, sizeof (buffer),	      "_NET_SYSTEM_TRAY_S%d",	      XScreenNumberOfScreen (xscreen));    icon->selection_atom = XInternAtom (DisplayOfScreen (xscreen),				      buffer, False);    icon->manager_atom = XInternAtom (DisplayOfScreen (xscreen),				    "MANAGER", False);    icon->system_tray_opcode_atom = XInternAtom (DisplayOfScreen (xscreen),					       "_NET_SYSTEM_TRAY_OPCODE", False);  egg_tray_icon_update_manager_window (icon);#if HAVE_GTK_MULTIHEAD  root_window = gdk_screen_get_root_window (gtk_widget_get_screen (screen));#else  root_window = gdk_window_lookup (gdk_x11_get_default_root_xwindow ());#endif    /* Add a root window filter so that we get changes on MANAGER */  gdk_window_add_filter (root_window,			 egg_tray_icon_manager_filter, icon);		        return icon;}#if HAVE_GTK_MULTIHEADEggTrayIcon *egg_tray_icon_new_for_screen (GdkScreen *screen, const char *name){  EggTrayIcon *icon;  char buffer[256];  g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);  return egg_tray_icon_new_for_xscreen (GDK_SCREEN_XSCREEN (screen), name);}#endifEggTrayIcon*egg_tray_icon_new (const gchar *name){  //dprintf (__PRETTY_FUNCTION__);  return egg_tray_icon_new_for_xscreen (DefaultScreenOfDisplay (gdk_display), name);}guintegg_tray_icon_send_message (EggTrayIcon *icon,			    gint         timeout,			    const gchar *message,			    gint         len){  guint stamp;    g_return_val_if_fail (EGG_IS_TRAY_ICON (icon), 0);  g_return_val_if_fail (timeout >= 0, 0);  g_return_val_if_fail (message != NULL, 0);		       //dprintf (__PRETTY_FUNCTION__);  if (icon->manager_window == None)    return 0;  if (len < 0)    len = strlen (message);  stamp = icon->stamp++;    /* Get ready to send the message */  egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_BEGIN_MESSAGE,				      (Window)gtk_plug_get_id (GTK_PLUG (icon)),				      timeout, len, stamp);  /* Now to send the actual message */  gdk_error_trap_push ();  while (len > 0)    {      XClientMessageEvent ev;      Display *xdisplay;#if HAVE_GTK_MULTIHEAD      xdisplay = GDK_DISPLAY_XDISPLAY (gtk_widget_get_display (GTK_WIDGET (icon)));#else      xdisplay = gdk_display;#endif            ev.type = ClientMessage;      ev.window = (Window)gtk_plug_get_id (GTK_PLUG (icon));      ev.format = 8;      ev.message_type = XInternAtom (xdisplay,				     "_NET_SYSTEM_TRAY_MESSAGE_DATA", False);      if (len > 20)	{	  memcpy (&ev.data, message, 20);	  len -= 20;	  message += 20;	}      else	{	  memcpy (&ev.data, message, len);	  len = 0;	}      XSendEvent (xdisplay,		  icon->manager_window, False, StructureNotifyMask, (XEvent *)&ev);      XSync (xdisplay, False);    }  gdk_error_trap_pop ();  return stamp;}voidegg_tray_icon_cancel_message (EggTrayIcon *icon,			      guint        id){  g_return_if_fail (EGG_IS_TRAY_ICON (icon));  g_return_if_fail (id > 0);    //dprintf (__PRETTY_FUNCTION__);  egg_tray_icon_send_manager_message (icon, SYSTEM_TRAY_CANCEL_MESSAGE,				      (Window)gtk_plug_get_id (GTK_PLUG (icon)),				      id, 0, 0);}static voiddocklet_x11_embedded_cb(GtkWidget *widget, void *data){  //dprintf (__PRETTY_FUNCTION__);	docklet_embedded();}static voiddocklet_x11_destroyed_cb(GtkWidget *widget, void *data){  //dprintf (__PRETTY_FUNCTION__);	docklet_remove(TRUE);	dprintf("[docklet_x11_destroyed_cb] recreate the icon\n");		//g_object_unref(G_OBJECT(docklet));	//docklet = NULL;		tray_destroy();	tray_create();}static voiddocklet_x11_clicked_cb(GtkWidget *button, GdkEventButton *event, void *data){    //dprintf (__PRETTY_FUNCTION__);	if (event->type != GDK_BUTTON_PRESS)		return;	docklet_clicked(event);}//This is called from [on_window_main_delete_event]voidtray_destroy(){  //dprintf (__PRETTY_FUNCTION__);		dprintf("[tray icon] destroy\n");		docklet_remove(TRUE);	g_signal_handlers_disconnect_by_func(G_OBJECT(docklet), G_CALLBACK(docklet_x11_destroyed_cb), NULL);	//g_object_unref(G_OBJECT(docklet));	//gtk_widget_destroy(image);	gtk_widget_destroy(GTK_WIDGET(docklet));	//return;				docklet = NULL;}//This is called from [create_window_main]voidtray_create(){	GtkWidget *box;  //dprintf (__PRETTY_FUNCTION__);	dprintf("[tray icon] create\n");		if (docklet) {		// if this is being called when a tray icon exists, it's because		//   something messed up. try destroying it before we proceed,		//   although docklet_refcount may be all hosed. hopefully won't happen. 		tray_destroy();	}	docklet = egg_tray_icon_new("DLD Loves Downloading");	box = gtk_event_box_new();	//FIXME!!!!!!!!!	//dprintf("[%s] FIXME! image = ?\n", __PRETTY_FUNCTION__);	//image = gtk_image_new_from_pixbuf (tntc_pixbuf_cache_get_pixbuf (main_context->pixbuf_cache, "tray-icon"));		if(!pixbuf_tray)		pixbuf_tray = gdk_pixbuf_new_from_xpm_data((const char **)xpm_tray);			image = gtk_image_new_from_pixbuf(pixbuf_tray);		g_signal_connect(G_OBJECT(docklet), "embedded", G_CALLBACK(docklet_x11_embedded_cb), NULL);	g_signal_connect(G_OBJECT(docklet), "destroy", G_CALLBACK(docklet_x11_destroyed_cb), NULL);	g_signal_connect(G_OBJECT(box), "button-press-event", G_CALLBACK(docklet_x11_clicked_cb), NULL);	gtk_container_add(GTK_CONTAINER(box), image);	gtk_container_add(GTK_CONTAINER(docklet), box);	gtk_widget_show_all(GTK_WIDGET(docklet));	// ref the docklet before we bandy it about the place 	//g_object_ref(G_OBJECT(docklet));}/* public code *///extern GtkWidget *window_main;voiddocklet_clicked(GdkEventButton *event){  if(event->button == 1)  {	  on_menu_popup_window_drop_show_activate(NULL, NULL);  }    if(event->button == 3)  {	gtk_menu_popup(GTK_MENU(menu_popup_window_drop_menu),			   (GtkWidget *)NULL,			   (GtkWidget *)NULL,			   (GtkMenuPositionFunc)NULL,			   (gpointer)NULL,			   event->button,event->time);	    }}voiddocklet_embedded(){	dprintf("[tray icon] embedded\n");}void docklet_remove(gboolean visible){	dprintf("[tray icon] remove\n");	//dprintf("[tray icon] remove visible = %d\n", visible);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -