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

📄 dndtrash.cc

📁 一个功能比较强的下载软件
💻 CC
📖 第 1 页 / 共 2 页
字号:
/*	WebDownloader for X-Window *	Copyright (C) 1999-2002 Koshelev Maxim *	This Program is free but not GPL!!! You can't modify it *	without agreement with author. You can't distribute modified *	program but you can distribute unmodified program. * *	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. */#include <stdio.h>#include <time.h>#include "dndtrash.h"#include "misc.h"#include "prefs.h"#include "lod.h"#include "addd.h"#include "list.h"#include "buttons.h"#include "colors.h"#include "../main.h"#include "../var.h"#include "../ntlocale.h"#include "../xml.h"#include <gdk-pixbuf/gdk-pixbuf.h>extern tMain aa;extern GtkTargetEntry download_drop_types[];extern gint n_download_drop_types;enum DND_MENU_ENUM{	DM_NEW,	DM_PASTE,	DM_AUTOMATED,	DM_DELCOMPLETED,	DM_OPTIONS,	DM_SPEED, DM_SPEED_1, DM_SPEED_2, DM_SPEED_3,	DM_EXIT,	DM_SEP};char *dnd_menu_inames[]={	N_("/New Download"),	N_("/Paste Download"),	N_("/Automated adding"),	N_("/Delete completed"),	N_("/General options"),	N_("/Speed"),	N_("/Speed/Low"),	N_("/Speed/Medium"),	N_("/Speed/Unlimited"),	N_("/Exit"),	"/-"};GtkItemFactory *dnd_trash_item_factory;GtkWidget *dnd_trash_window=(GtkWidget *)NULL;GtkWidget *dnd_trash_menu=(GtkWidget *)NULL;GtkWidget *dnd_trash_gtk_pixmap; //used for animation/blinkingGtkWidget *dnd_trash_fixed;d4xDownloadQueue *dnd_trash_target_queue=(d4xDownloadQueue *)NULL;static GdkPixbuf *dnd_trash_pixbuf1=(GdkPixbuf *)NULL,*dnd_trash_pixbuf2=(GdkPixbuf *)NULL;static GdkBitmap *dnd_trash_mask1=(GdkBitmap*)NULL,*dnd_trash_mask2=(GdkBitmap*)NULL;static int dnd_trash_raise_count=0;static time_t dnd_trash_last_raise=0;GtkTooltips *dnd_trash_tooltips=(GtkTooltips *)NULL;static gint dnd_trash_moveable,dnd_trash_x,dnd_trash_y,dnd_trash_move_x,dnd_trash_move_y;static GtkTooltips *dnd_trash_speed_tooltips[2];static GtkWidget *dnd_trash_speed_menu[2];char *dnd_trash_tooltip_text=NULL;float dnd_trash_tooltip_percent=0;void dnd_trash_set_speed_text(){	char text[MAX_LEN];	if (dnd_trash_speed_menu[0]){		sprintf(text,"%i B/s",CFG.SPEED_LIMIT_1);		gtk_tooltips_set_tip(dnd_trash_speed_tooltips[0],				     dnd_trash_speed_menu[0],				     text,				     (const gchar *)NULL);	};	if (dnd_trash_speed_menu[1]){		sprintf(text,"%i B/s",CFG.SPEED_LIMIT_2);		gtk_tooltips_set_tip(dnd_trash_speed_tooltips[1],				     dnd_trash_speed_menu[1],				     text,				     (const gchar *)NULL);	};};/*static gint dnd_trash_tooltips_draw(GtkWidget *window,GtkTooltips *tooltip){	if (dnd_trash_tooltip_percent<=0.001) return(FALSE);	GtkStyle *style=dnd_trash_tooltips->tip_window->style;		gint y, baseline_skip, gap,pwidth;	GtkTooltipsData *data = dnd_trash_tooltips->active_tips_data;	if (!data) return FALSE;	GdkFont *font=gtk_style_get_font(style);	gap = (font->ascent + font->descent) / 4;	if (gap < 2) gap = 2;	baseline_skip = font->ascent + font->descent + gap;	y = font->ascent + 4;	pwidth=gint(window->allocation.width*(dnd_trash_tooltip_percent/100));	gtk_paint_flat_box(style, window->window,			   GTK_STATE_ACTIVE, GTK_SHADOW_NONE,			   NULL, window, "tooltip",			   0, 0, pwidth, window->allocation.height);	GdkGC *pr_gc=style->fg_gc[GTK_STATE_ACTIVE];	GdkRectangle clip_rectangle;	clip_rectangle.x=0;	clip_rectangle.y=0;	clip_rectangle.height=window->allocation.height;	clip_rectangle.width=pwidth;	gdk_gc_set_clip_rectangle (pr_gc, &clip_rectangle);	gdk_draw_string (window->window, font, pr_gc,			 4,y,(char*)(data->row->data));	gdk_gc_set_clip_rectangle (pr_gc, (GdkRectangle *)NULL);	return(FALSE);};*/static void dnd_trash_init_speed_tips(){	for(int i=1;i<3;i++){		GtkWidget *menu_item=gtk_item_factory_get_widget_by_action(dnd_trash_item_factory,i);		dnd_trash_speed_menu[i-1]=menu_item;		if (menu_item){			GtkTooltips *tooltip=gtk_tooltips_new();			dnd_trash_speed_tooltips[i-1]=tooltip;			gtk_tooltips_force_window(tooltip);			GtkStyle *current_style=gtk_style_copy(gtk_widget_get_style(tooltip->tip_window));			current_style->bg[GTK_STATE_NORMAL] = LYELLOW;			gtk_widget_set_style(tooltip->tip_window, current_style);			gtk_tooltips_enable(tooltip);		};	};	dnd_trash_set_speed_text();};void dnd_trash_real_destroy(){	if (dnd_trash_window){		main_window_popup();		gtk_widget_destroy(dnd_trash_window);		dnd_trash_window=(GtkWidget *)NULL;	};	CFG.DND_TRASH=0;};void dnd_trash_destroy(){	dnd_trash_real_destroy();	set_dndtrash_button();};static GtkWidget *dnd_trash_current_item=NULL;static int dnd_drag_motion_first=1;static void dnd_trash_overmenu_populate(tQueue *q,GtkWidget *box,int depth=0){	d4xDownloadQueue *dq=(d4xDownloadQueue *)(q->first());	while(dq){		int len=2*depth;		char *space=new char[len+1];		space[len]=0;		for (int i=0;i<len;i++) space[i]=' ';		char *str=sum_strings(space,dq->name.get(),NULL);		delete[] space;		GtkWidget *menu_item=gtk_menu_item_new_with_label(str);		delete[] str;		g_object_set_data(G_OBJECT(menu_item),"d4x_user_data",dq);		gtk_box_pack_start(GTK_BOX(box),menu_item,FALSE,FALSE,0);		gtk_widget_show(menu_item);		dnd_trash_overmenu_populate(&(dq->child),box,depth+1);		dq=(d4xDownloadQueue *)(dq->prev);	};};static GtkWidget *dnd_trash_overmenu=NULL;void dnd_trash_switch_to_menu(){	dnd_trash_current_item=NULL;	gtk_widget_shape_combine_mask(dnd_trash_window,NULL,0,0);	gtk_widget_ref(dnd_trash_fixed);	gtk_container_remove(GTK_CONTAINER(dnd_trash_window),dnd_trash_fixed);	dnd_trash_overmenu=gtk_vbox_new(FALSE,0);	gtk_box_set_spacing(GTK_BOX(dnd_trash_overmenu),0);	gtk_container_add(GTK_CONTAINER(dnd_trash_window),dnd_trash_overmenu);	gtk_container_set_border_width(GTK_CONTAINER(dnd_trash_window),2);	gtk_widget_show(dnd_trash_overmenu);	dnd_trash_overmenu_populate(&D4X_QTREE,dnd_trash_overmenu);};void dnd_trash_switch_to_icon(){	gint width,height;	gtk_image_set_from_pixbuf(GTK_IMAGE(dnd_trash_gtk_pixmap),				  dnd_trash_pixbuf1);	width=gdk_pixbuf_get_width(dnd_trash_pixbuf1);	height=gdk_pixbuf_get_width(dnd_trash_pixbuf1);	gtk_widget_shape_combine_mask(dnd_trash_window, dnd_trash_mask1, 0, 0 );	gtk_widget_destroy(dnd_trash_overmenu);	gtk_container_add(GTK_CONTAINER(dnd_trash_window), dnd_trash_fixed);	gtk_container_set_border_width(GTK_CONTAINER(dnd_trash_window),0);	gtk_window_resize(GTK_WINDOW(dnd_trash_window),width,height);	gtk_widget_unref(dnd_trash_fixed);};static void d4x_menuitem_foreach(GtkWidget *widget,gpointer data){	if (GTK_IS_MENU_ITEM (widget)){		GtkWidget **w=(GtkWidget **)data;		gint x,y;		gtk_widget_get_pointer(widget,&x,&y);		if (y>0 && y<=widget->allocation.height)			*w=widget;	};};static GtkWidget *d4x_dnd_get_item(GtkWidget *dnd_trash_overmenu){	GtkWidget *rval=NULL;	gtk_container_foreach(GTK_CONTAINER (dnd_trash_overmenu),d4x_menuitem_foreach,&rval);	return(rval);};static gboolean dnd_drag_motion (GtkWidget *widget,				 GdkDragContext *context,				 gint x,gint y,				 guint time,				 gpointer data){	if (dnd_drag_motion_first){		if (d4x_only_one_queue()) return(TRUE);		dnd_drag_motion_first=0;		dnd_trash_target_queue=NULL;		dnd_trash_switch_to_menu();		return(TRUE);	};	GtkWidget *menu_item=d4x_dnd_get_item(dnd_trash_overmenu);	if (dnd_trash_current_item!=menu_item &&	    dnd_trash_current_item)		gtk_menu_item_deselect(GTK_MENU_ITEM(dnd_trash_current_item));	if (menu_item){		gtk_menu_item_select(GTK_MENU_ITEM(menu_item));		dnd_trash_target_queue=(d4xDownloadQueue *)g_object_get_data(G_OBJECT(menu_item),"d4x_user_data");		dnd_trash_current_item=menu_item;	};	return(TRUE);};static gboolean dnd_drag_leave (GtkWidget *widget,				GdkDragContext *context,				gint x,gint y,				guint time,				gpointer data){	if (!dnd_drag_motion_first){		dnd_drag_motion_first=1;		dnd_trash_switch_to_icon();		return(TRUE);	};	return(TRUE);};void dnd_trash_motion(GtkWidget *widget,GdkEventMotion *event){	if (dnd_trash_moveable){		gint mx,my;		GdkModifierType modmask;		gdk_window_get_pointer((GdkWindow *)NULL, &mx, &my, &modmask);		dnd_trash_move_x+=mx-dnd_trash_x;		dnd_trash_move_y+=my-dnd_trash_y;		gdk_window_move(widget->window,				dnd_trash_move_x,				dnd_trash_move_y);		dnd_trash_x=mx;		dnd_trash_y=my;		gdk_flush();	};};int dnd_trash_button_press(GtkWidget *widget,GdkEventButton *event){	switch (event->button){	case 3:{		CFG.DND_NEED_POPUP=0;		gtk_menu_popup(GTK_MENU(dnd_trash_menu),			       (GtkWidget *)NULL,			       (GtkWidget *)NULL,			       (GtkMenuPositionFunc)NULL,			       (gpointer)NULL,			       event->button,event->time);		break;	};	case 1:{		if (event->type==GDK_2BUTTON_PRESS)			main_window_toggle();		else{			if (!dnd_trash_moveable){				dnd_trash_move_x=CFG.DND_TRASH_X;				dnd_trash_move_y=CFG.DND_TRASH_Y;				dnd_trash_moveable=1;				dnd_trash_x=gint(event->x_root);				dnd_trash_y=gint(event->y_root);				gtk_grab_add (widget);				gdk_pointer_grab (widget->window,TRUE,						  GdkEventMask(GDK_BUTTON_RELEASE_MASK |							       GDK_BUTTON_MOTION_MASK |							       GDK_POINTER_MOTION_HINT_MASK),						  NULL, NULL, 0);			};		};		break;	};	case 2:{		init_add_window();		break;	};	};	return 1;}; int dnd_trash_button_release(GtkWidget *widget,GdkEventButton *event){	gdk_pointer_ungrab(GDK_CURRENT_TIME);        gdk_flush();	dnd_trash_moveable=0;	gtk_grab_remove (widget);	gdk_pointer_ungrab (0);	return 1;}; static int dnd_trash_no_expose(){	if (CFG.DND_NEED_POPUP){		time_t now=time(NULL);		if (now == dnd_trash_last_raise)			dnd_trash_raise_count+=1;		else{			dnd_trash_last_raise=now;			dnd_trash_raise_count=1;		};		if (dnd_trash_raise_count<15)

⌨️ 快捷键说明

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