Ok, Midnight Commander is now a nice, wonderful Drag source for the
new DnD. Boy, is it cute. Question: should I use the default icon for DnD provided by Gtk+ or use the old icons I have? the old icons are a bit more sexy. Miguel.
Этот коммит содержится в:
родитель
114209e3eb
Коммит
809d80eb90
@ -1444,11 +1444,11 @@ desktop_root (void)
|
|||||||
rw = gnome_rootwin_new ();
|
rw = gnome_rootwin_new ();
|
||||||
#ifdef OLD_DND
|
#ifdef OLD_DND
|
||||||
connect_drop_signals (rw, NULL);
|
connect_drop_signals (rw, NULL);
|
||||||
gtk_widget_realize (rw);
|
|
||||||
gtk_widget_dnd_drop_set (rw, TRUE, root_drop_types, ELEMENTS (root_drop_types), FALSE);
|
gtk_widget_dnd_drop_set (rw, TRUE, root_drop_types, ELEMENTS (root_drop_types), FALSE);
|
||||||
#endif
|
gtk_widget_realize (rw);
|
||||||
gtk_widget_show (rw);
|
gtk_widget_show (rw);
|
||||||
root_window = GNOME_ROOTWIN (rw);
|
root_window = GNOME_ROOTWIN (rw);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
104
gnome/gscreen.c
104
gnome/gscreen.c
@ -1451,8 +1451,17 @@ panel_icon_list_drop_data_available (GtkWidget *widget, GdkEventDropDataAvailabl
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Strategy for activaing the drags from the icon-list:
|
||||||
|
*
|
||||||
|
* The icon-list uses the button-press/motion-notify events for
|
||||||
|
* the banding selection. We catch the events and only if the
|
||||||
|
* click happens in an icon and the user moves the mouse enough (a
|
||||||
|
* threshold to give it a better feel) activa the drag and drop.
|
||||||
|
*
|
||||||
|
*/
|
||||||
static int
|
static int
|
||||||
panel_icon_list_click (GtkWidget *widget, GdkEventButton *event, WPanel *panel)
|
panel_icon_list_button_press (GtkWidget *widget, GdkEventButton *event, WPanel *panel)
|
||||||
{
|
{
|
||||||
GnomeIconList *gil = GNOME_ICON_LIST (widget);
|
GnomeIconList *gil = GNOME_ICON_LIST (widget);
|
||||||
int icon;
|
int icon;
|
||||||
@ -1460,18 +1469,59 @@ panel_icon_list_click (GtkWidget *widget, GdkEventButton *event, WPanel *panel)
|
|||||||
icon = gnome_icon_list_get_icon_at (gil, event->x, event->y);
|
icon = gnome_icon_list_get_icon_at (gil, event->x, event->y);
|
||||||
|
|
||||||
if (icon == -1)
|
if (icon == -1)
|
||||||
return FALSE;
|
panel->maybe_start_drag = 0;
|
||||||
|
|
||||||
if (panel->dir.list [icon].f.marked)
|
|
||||||
printf ("Selected\n");
|
|
||||||
else
|
else
|
||||||
printf ("not selected\n");
|
panel->maybe_start_drag = event->button;
|
||||||
|
|
||||||
|
panel->click_x = event->x;
|
||||||
|
panel->click_y = event->y;
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
panel_icon_list_button_release (GtkWidget *widget, GdkEventButton *event, WPanel *panel)
|
||||||
|
{
|
||||||
|
GnomeIconList *gil = GNOME_ICON_LIST (widget);
|
||||||
|
int icon;
|
||||||
|
|
||||||
|
icon = gnome_icon_list_get_icon_at (gil, event->x, event->y);
|
||||||
|
|
||||||
|
panel->maybe_start_drag = FALSE;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MAX(a,b) ((a > b) ? a : b)
|
||||||
|
|
||||||
static int
|
static int
|
||||||
panel_icon_list_motion (GtkWidget *widget, GdkEventMotion *event, WPanel *panel)
|
panel_icon_list_motion (GtkWidget *widget, GdkEventMotion *event, WPanel *panel)
|
||||||
{
|
{
|
||||||
|
GtkTargetList *list;
|
||||||
|
GdkDragAction action;
|
||||||
|
GdkDragContext *context;
|
||||||
|
|
||||||
|
if (!panel->maybe_start_drag)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (panel->maybe_start_drag == 3)
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if ((abs (event->x - panel->click_x) < 4) ||
|
||||||
|
(abs (event->y - panel->click_y) < 4))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
list = gtk_target_list_new (drag_types, ELEMENTS (drag_types));
|
||||||
|
|
||||||
|
/* Control+Shift = LINK */
|
||||||
|
if ((event->state & (GDK_SHIFT_MASK|GDK_CONTROL_MASK)) == (GDK_SHIFT_MASK|GDK_CONTROL_MASK))
|
||||||
|
action = GDK_ACTION_LINK;
|
||||||
|
else if (event->state & (GDK_SHIFT_MASK))
|
||||||
|
action = GDK_ACTION_MOVE;
|
||||||
|
else
|
||||||
|
action = GDK_ACTION_COPY;
|
||||||
|
|
||||||
|
context = gtk_drag_begin (widget, list, action, panel->maybe_start_drag, (GdkEvent *) event);
|
||||||
|
gtk_drag_set_icon_default (context);
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1486,20 +1536,22 @@ panel_icon_list_realized (GtkObject *obj, WPanel *panel)
|
|||||||
load_imlib_icons ();
|
load_imlib_icons ();
|
||||||
load_dnd_icons ();
|
load_dnd_icons ();
|
||||||
|
|
||||||
#if 0
|
|
||||||
gtk_drag_source_set (GTK_WIDGET (icon), GDK_BUTTON1_MASK,
|
|
||||||
drag_types, ELEMENTS (drag_types), GDK_ACTION_COPY);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
gtk_signal_connect (obj, "drag_data_get",
|
gtk_signal_connect (obj, "drag_data_get",
|
||||||
GTK_SIGNAL_FUNC (panel_drag_data_get), panel);
|
GTK_SIGNAL_FUNC (panel_drag_data_get), panel);
|
||||||
|
|
||||||
gtk_signal_connect_after (obj, "button_press_event",
|
/*
|
||||||
GTK_SIGNAL_FUNC (panel_icon_list_click), panel);
|
* These implement our drag-start activation code, as we have a pretty
|
||||||
|
* oveloaded widget
|
||||||
|
*/
|
||||||
|
gtk_signal_connect (obj, "button_press_event",
|
||||||
|
GTK_SIGNAL_FUNC (panel_icon_list_button_press), panel);
|
||||||
|
|
||||||
|
gtk_signal_connect (obj, "button_release_event",
|
||||||
|
GTK_SIGNAL_FUNC (panel_icon_list_button_release), panel);
|
||||||
|
|
||||||
gtk_signal_connect (obj, "motion_notify_event",
|
gtk_signal_connect (obj, "motion_notify_event",
|
||||||
GTK_SIGNAL_FUNC (panel_icon_list_motion), panel);
|
GTK_SIGNAL_FUNC (panel_icon_list_motion), panel);
|
||||||
|
|
||||||
#ifdef OLD_DND
|
#ifdef OLD_DND
|
||||||
/* DND: Drag setup */
|
/* DND: Drag setup */
|
||||||
gtk_signal_connect (obj, "drag_request_event", GTK_SIGNAL_FUNC (panel_icon_list_drag_request), panel);
|
gtk_signal_connect (obj, "drag_request_event", GTK_SIGNAL_FUNC (panel_icon_list_drag_request), panel);
|
||||||
@ -1925,15 +1977,14 @@ x_create_panel (Dlg_head *h, widget_data parent, WPanel *panel)
|
|||||||
GtkWidget *status_line, *filter, *vbox;
|
GtkWidget *status_line, *filter, *vbox;
|
||||||
GtkWidget *frame, *cwd, *back_p, *fwd_p;
|
GtkWidget *frame, *cwd, *back_p, *fwd_p;
|
||||||
GtkWidget *display;
|
GtkWidget *display;
|
||||||
GtkWidget *scrollbar;
|
|
||||||
|
|
||||||
panel->xwindow = gtk_widget_get_toplevel (GTK_WIDGET (panel->widget.wdata));
|
panel->xwindow = gtk_widget_get_toplevel (GTK_WIDGET (panel->widget.wdata));
|
||||||
|
|
||||||
panel->table = gtk_table_new (2, 1, 0);
|
panel->table = gtk_table_new (2, 1, 0);
|
||||||
|
|
||||||
panel->icons = panel_create_icon_display (panel);
|
panel->icons = panel_create_icon_display (panel);
|
||||||
scrollbar = gtk_vscrollbar_new (GNOME_ICON_LIST (panel->icons)->adj);
|
panel->scrollbar = gtk_vscrollbar_new (GNOME_ICON_LIST (panel->icons)->adj);
|
||||||
gtk_widget_show (scrollbar);
|
gtk_widget_show (panel->scrollbar);
|
||||||
|
|
||||||
panel->list = panel_create_file_list (panel);
|
panel->list = panel_create_file_list (panel);
|
||||||
gtk_widget_ref (panel->icons);
|
gtk_widget_ref (panel->icons);
|
||||||
@ -2003,7 +2054,7 @@ x_create_panel (Dlg_head *h, widget_data parent, WPanel *panel)
|
|||||||
GTK_EXPAND | GTK_FILL | GTK_SHRINK,
|
GTK_EXPAND | GTK_FILL | GTK_SHRINK,
|
||||||
GTK_EXPAND | GTK_FILL | GTK_SHRINK,
|
GTK_EXPAND | GTK_FILL | GTK_SHRINK,
|
||||||
0, 0);
|
0, 0);
|
||||||
gtk_table_attach (GTK_TABLE (panel->table), scrollbar, 1, 2, 1, 2,
|
gtk_table_attach (GTK_TABLE (panel->table), panel->scrollbar, 1, 2, 1, 2,
|
||||||
0,
|
0,
|
||||||
GTK_EXPAND | GTK_FILL | GTK_SHRINK,
|
GTK_EXPAND | GTK_FILL | GTK_SHRINK,
|
||||||
0, 0);
|
0, 0);
|
||||||
@ -2037,9 +2088,6 @@ x_create_panel (Dlg_head *h, widget_data parent, WPanel *panel)
|
|||||||
if (!(panel->widget.options & W_PANEL_HIDDEN))
|
if (!(panel->widget.options & W_PANEL_HIDDEN))
|
||||||
gtk_widget_show (gtk_widget_get_toplevel (panel->table));
|
gtk_widget_show (gtk_widget_get_toplevel (panel->table));
|
||||||
|
|
||||||
/* This is a bug workaround for the icon list, as the icon */
|
|
||||||
gtk_widget_queue_resize (panel->icons);
|
|
||||||
|
|
||||||
if (!pixmaps_ready){
|
if (!pixmaps_ready){
|
||||||
if (!GTK_WIDGET_REALIZED (panel->list))
|
if (!GTK_WIDGET_REALIZED (panel->list))
|
||||||
gtk_widget_realize (panel->list);
|
gtk_widget_realize (panel->list);
|
||||||
@ -2098,16 +2146,22 @@ void
|
|||||||
x_reset_sort_labels (WPanel *panel)
|
x_reset_sort_labels (WPanel *panel)
|
||||||
{
|
{
|
||||||
if (panel->list_type == list_icons){
|
if (panel->list_type == list_icons){
|
||||||
if (panel->icons)
|
if (panel->icons){
|
||||||
gtk_widget_show (panel->icons);
|
gtk_widget_show (panel->icons);
|
||||||
|
gtk_widget_show (panel->scrollbar);
|
||||||
|
}
|
||||||
if (panel->list)
|
if (panel->list)
|
||||||
gtk_widget_hide (panel->list);
|
gtk_widget_hide (panel->list);
|
||||||
} else {
|
} else {
|
||||||
panel_switch_new_display_mode (panel);
|
panel_switch_new_display_mode (panel);
|
||||||
if (panel->list)
|
if (panel->list){
|
||||||
gtk_widget_show (panel->list);
|
gtk_widget_show (panel->list);
|
||||||
if (panel->icons)
|
gtk_widget_show (panel->scrollbar);
|
||||||
|
}
|
||||||
|
if (panel->icons){
|
||||||
gtk_widget_hide (panel->icons);
|
gtk_widget_hide (panel->icons);
|
||||||
|
gtk_widget_hide (panel->scrollbar);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Загрузка…
Ссылка в новой задаче
Block a user