📄 dndtrash.cc
字号:
/* 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 + -