* Default theme: fix preview when dragging from list view.
authorptomaine <ptomaine>
Mon, 1 Sep 2008 09:51:30 +0000 (09:51 +0000)
committerptomaine <ptomaine@7cbeb6ba-43b4-40fd-8cce-4c39aea84d33>
Mon, 1 Sep 2008 09:51:30 +0000 (09:51 +0000)
* Add DND modifiers: Control for copy, Shift for move, Alt for ask. Default action is move. Config for these comes later.
* Add EDJE signals for theme to act on DND action change.
* Default theme: Show current DND action using overlay icons. Icons done by Tom 'Toma-' Haste, thank you very much.

SVN revision: 35772

data/themes/default_fileman.edc
data/themes/images/e17_fileman_ask.png [new file with mode: 0644]
data/themes/images/e17_fileman_copy.png [new file with mode: 0644]
data/themes/images/e17_fileman_move.png [new file with mode: 0644]
src/bin/e_dnd.c
src/bin/e_dnd.h
src/bin/e_fm.c

index 8ee3e08..e05f969 100644 (file)
@@ -47,6 +47,9 @@ images {
    image: "e17_sb_runnerv.png" COMP;
    image: "e17_scrollbar_hdrag_thumb.png" COMP;
    image: "e17_scrollbar_vdrag_thumb.png" COMP;
+   image: "e17_fileman_copy.png" COMP;
+   image: "e17_fileman_ask.png" COMP;
+   image: "e17_fileman_move.png" COMP;
 }
 
 group {
@@ -770,7 +773,7 @@ group {
 }
 
 group {
-   name: "e/fileman/default/list/fixed";
+   name: "e/fileman/default/list/variable";
    parts {
       part {
         name: "base";
@@ -1283,9 +1286,73 @@ group {
            color: 0 0 0 0;
         }
       }
+      part {
+         name:          "dnd_action";
+         type:          IMAGE;
+         mouse_events:  0;
+         repeat_events: 0;
+         description {
+            state:      "default" 0.0;
+            color:      0 0 0 0;
+         }
+         description {
+            state:      "visible" 0.0;
+            aspect:     1.0 1.0;
+            aspect_preference: BOTH;
+            align: 1.0 1.0;
+            rel1 {
+               relative: 0.75 0.0;
+            }
+            rel2 {
+               relative: 1.0 1.0;
+            }
+         }
+         description {
+            state:      "copy" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_copy.png";
+            }
+         }
+         description {
+            state:      "ask" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_ask.png";
+            }
+         }
+         description {
+            state:      "move" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_move.png";
+            }
+         }
+      }         
    }
    programs {
       program {
+         name:   "ask";
+         signal: "e,state,ask";
+         source: "e";
+         action: STATE_SET "ask" 0.0;
+         target: "dnd_action";
+      }
+      program {
+         name:   "move";
+         signal: "e,state,move";
+         source: "e";
+         action: STATE_SET "move" 0.0;
+         target: "dnd_action";
+      }
+      program {
+         name:   "copy";
+         signal: "e,state,copy";
+         source: "e";
+         action: STATE_SET "copy" 0.0;
+         target: "dnd_action";
+      }
+      program {
         name:    "go_active_pre";
         signal:  "e,state,selected";
         source:  "e";
@@ -1447,7 +1514,7 @@ group {
 }
 
 group {
-   name: "e/fileman/default/list_odd/fixed";
+   name: "e/fileman/default/list_odd/variable";
    parts {
       part {
         name: "base";
@@ -1959,9 +2026,73 @@ group {
            color: 0 0 0 0;
         }
       }
+      part {
+         name:          "dnd_action";
+         type:          IMAGE;
+         mouse_events:  0;
+         repeat_events: 0;
+         description {
+            state:      "default" 0.0;
+            color:      0 0 0 0;
+         }
+         description {
+            state:      "visible" 0.0;
+            aspect:     1.0 1.0;
+            aspect_preference: BOTH;
+            align: 1.0 1.0;
+            rel1 {
+               relative: 0.75 0.0;
+            }
+            rel2 {
+               relative: 1.0 1.0;
+            }
+         }
+         description {
+            state:      "copy" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_copy.png";
+            }
+         }
+         description {
+            state:      "ask" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_ask.png";
+            }
+         }
+         description {
+            state:      "move" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_move.png";
+            }
+         }
+      }
    }
    programs {
       program {
+         name:   "ask";
+         signal: "e,state,ask";
+         source: "e";
+         action: STATE_SET "ask" 0.0;
+         target: "dnd_action";
+      }
+      program {
+         name:   "move";
+         signal: "e,state,move";
+         source: "e";
+         action: STATE_SET "move" 0.0;
+         target: "dnd_action";
+      }
+      program {
+         name:   "copy";
+         signal: "e,state,copy";
+         source: "e";
+         action: STATE_SET "copy" 0.0;
+         target: "dnd_action";
+      }
+      program {
         name:    "go_active_pre";
         signal:  "e,state,selected";
         source:  "e";
@@ -2121,10 +2252,8 @@ group {
       }
    }
 }
-
-/*
 group {
-   name: "e/fileman/default/list/variable";
+   name: "e/fileman/default/list/fixed";
    parts {
       part {
         name: "base";
@@ -2322,6 +2451,7 @@ group {
               to: "icon_box";
               relative: 0.0 0.0;
               offset: 1 1;
+
            }
            rel2 {
               to: "icon_box";
@@ -2374,6 +2504,7 @@ group {
            state:    "default" 0.0;
            align:    0.5 0.5;
            aspect:   1.0 1.0;
+           aspect_preference: BOTH;
            visible:  0;
            rel1 {
               to: "icon0";
@@ -2456,7 +2587,7 @@ group {
               text:     "Item Label";
               font:     "Edje-Vera";
               size:     10;
-//            min:      1 1;
+              min:      1 1;
               align:    0.0 0.5;
               text_class: "ilist_item";               
            }
@@ -2635,9 +2766,73 @@ group {
            color: 0 0 0 0;
         }
       }
+      part {
+         name:          "dnd_action";
+         type:          IMAGE;
+         mouse_events:  0;
+         repeat_events: 0;
+         description {
+            state:      "default" 0.0;
+            color:      0 0 0 0;
+         }
+         description {
+            state:      "visible" 0.0;
+            aspect:     1.0 1.0;
+            aspect_preference: BOTH;
+            align: 1.0 1.0;
+            rel1 {
+               relative: 0.75 0.0;
+            }
+            rel2 {
+               relative: 1.0 1.0;
+            }
+         }
+         description {
+            state:      "copy" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_copy.png";
+            }
+         }
+         description {
+            state:      "ask" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_ask.png";
+            }
+         }
+         description {
+            state:      "move" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_move.png";
+            }
+         }
+      }
    }
    programs {
       program {
+         name:   "ask";
+         signal: "e,state,ask";
+         source: "e";
+         action: STATE_SET "ask" 0.0;
+         target: "dnd_action";
+      }
+      program {
+         name:   "move";
+         signal: "e,state,move";
+         source: "e";
+         action: STATE_SET "move" 0.0;
+         target: "dnd_action";
+      }
+      program {
+         name:   "copy";
+         signal: "e,state,copy";
+         source: "e";
+         action: STATE_SET "copy" 0.0;
+         target: "dnd_action";
+      }
+      program {
         name:    "go_active_pre";
         signal:  "e,state,selected";
         source:  "e";
@@ -2799,7 +2994,7 @@ group {
 }
 
 group {
-   name: "e/fileman/default/list_odd/variable";
+   name: "e/fileman/default/list_odd/fixed";
    parts {
       part {
         name: "base";
@@ -3132,7 +3327,7 @@ group {
               text:     "Item Label";
               font:     "Edje-Vera";
               size:     10;
-//            min:      1 1;
+              min:      1 1;
               align:    0.0 0.5;
               text_class: "ilist_item";               
            }
@@ -3311,9 +3506,73 @@ group {
            color: 0 0 0 0;
         }
       }
+      part {
+         name:          "dnd_action";
+         type:          IMAGE;
+         mouse_events:  0;
+         repeat_events: 0;
+         description {
+            state:      "default" 0.0;
+            color:      0 0 0 0;
+         }
+         description {
+            state:      "visible" 0.0;
+            aspect:     1.0 1.0;
+            aspect_preference: BOTH;
+            align: 1.0 1.0;
+            rel1 {
+               relative: 0.75 0.0;
+            }
+            rel2 {
+               relative: 1.0 1.0;
+            }
+         }
+         description {
+            state:      "copy" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_copy.png";
+            }
+         }
+         description {
+            state:      "ask" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_ask.png";
+            }
+         }
+         description {
+            state:      "move" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_move.png";
+            }
+         }
+      }
    }
    programs {
       program {
+         name:   "ask";
+         signal: "e,state,ask";
+         source: "e";
+         action: STATE_SET "ask" 0.0;
+         target: "dnd_action";
+      }
+      program {
+         name:   "move";
+         signal: "e,state,move";
+         source: "e";
+         action: STATE_SET "move" 0.0;
+         target: "dnd_action";
+      }
+      program {
+         name:   "copy";
+         signal: "e,state,copy";
+         source: "e";
+         action: STATE_SET "copy" 0.0;
+         target: "dnd_action";
+      }
+      program {
         name:    "go_active_pre";
         signal:  "e,state,selected";
         source:  "e";
@@ -3473,7 +3732,6 @@ group {
       }
    }
 }
-*/
 
 group {
    name: "e/fileman/default/icon/fixed";
@@ -3721,6 +3979,50 @@ group {
            color:      0 0 0 0;
         }
       }         
+      part {
+         name:          "dnd_action";
+         type:          IMAGE;
+         mouse_events:  0;
+         repeat_events: 0;
+         description {
+            state:      "default" 0.0;
+            color:      0 0 0 0;
+         }
+         description {
+            state:      "visible" 0.0;
+            aspect:     1.0 1.0;
+            aspect_preference: BOTH;
+            align: 1.0 1.0;
+            min: 24 24;
+            rel1 {
+               relative: 0.75 0.0;
+            }
+            rel2 {
+               relative: 1.0 1.0;
+            }
+         }
+         description {
+            state:      "copy" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_copy.png";
+            }
+         }
+         description {
+            state:      "ask" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_ask.png";
+            }
+         }
+         description {
+            state:      "move" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_move.png";
+            }
+         }
+      }
    }
    programs {
       program {
@@ -4041,10 +4343,76 @@ group {
            state:      "default" 0.0;
            color:      0 0 0 0;
         }
-      }         
+      }
+      part {
+         name:          "dnd_action";
+         type:          IMAGE;
+         mouse_events:  0;
+         repeat_events: 0;
+         description {
+            state:      "default" 0.0;
+            color:      0 0 0 0;
+         }
+         description {
+            state:      "visible" 0.0;
+            aspect:     1.0 1.0;
+            aspect_preference: BOTH;
+            align: 1.0 1.0;
+            min: 24 24;
+            rel1 {
+               relative: 0.75 0.0;
+            }
+            rel2 {
+               relative: 1.0 1.0;
+               offset: -1 -1;
+            }
+         }
+         description {
+            state:      "copy" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_copy.png";
+            }
+         }
+         description {
+            state:      "ask" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_ask.png";
+            }
+         }
+         description {
+            state:      "move" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_move.png";
+            }
+         }
+      }
    }
    programs {
       program {
+         name:   "ask";
+         signal: "e,state,ask";
+         source: "e";
+         action: STATE_SET "ask" 0.0;
+         target: "dnd_action";
+      }
+      program {
+         name:   "move";
+         signal: "e,state,move";
+         source: "e";
+         action: STATE_SET "move" 0.0;
+         target: "dnd_action";
+      }
+      program {
+         name:   "copy";
+         signal: "e,state,copy";
+         source: "e";
+         action: STATE_SET "copy" 0.0;
+         target: "dnd_action";
+      }
+      program {
         name:   "active"; 
         signal: "e,state,selected"; 
         source: "e"; 
@@ -6962,9 +7330,75 @@ group {
            color:      0 0 0 0;
         }
       }         
+      part {
+         name:          "dnd_action";
+         type:          IMAGE;
+         mouse_events:  0;
+         repeat_events: 0;
+         description {
+            state:      "default" 0.0;
+            color:      0 0 0 0;
+         }
+         description {
+            state:      "visible" 0.0;
+            aspect:     1.0 1.0;
+            aspect_preference: BOTH;
+            align: 1.0 1.0;
+            rel1 {
+               relative: 0.75 0.75;
+            }
+            rel2 {
+               relative: 1.0 1.0;
+               offset: -1 -1;
+            }
+         }
+         description {
+            state:      "copy" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_copy.png";
+            }
+         }
+         description {
+            state:      "ask" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_ask.png";
+            }
+         }
+         description {
+            state:      "move" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_move.png";
+            }
+         }
+      }
    }
+
    programs {
       program {
+         name:   "ask";
+         signal: "e,state,ask";
+         source: "e";
+         action: STATE_SET "ask" 0.0;
+         target: "dnd_action";
+      }
+      program {
+         name:   "move";
+         signal: "e,state,move";
+         source: "e";
+         action: STATE_SET "move" 0.0;
+         target: "dnd_action";
+      }
+      program {
+         name:   "copy";
+         signal: "e,state,copy";
+         source: "e";
+         action: STATE_SET "copy" 0.0;
+         target: "dnd_action";
+      }
+      program {
         name:   "active"; 
         signal: "e,state,selected"; 
         source: "e"; 
@@ -7283,9 +7717,73 @@ group {
            color:      0 0 0 0;
         }
       }         
+      part {
+         name:          "dnd_action";
+         type:          IMAGE;
+         mouse_events:  0;
+         repeat_events: 0;
+         description {
+            state:      "default" 0.0;
+            color:      0 0 0 0;
+         }
+         description {
+            state:      "visible" 0.0;
+            aspect:     1.0 1.0;
+            aspect_preference: BOTH;
+            align: 1.0 1.0;
+            rel1 {
+               relative: 0.75 0.75;
+            }
+            rel2 {
+               relative: 1.0 1.0;
+            }
+         }
+         description {
+            state:      "copy" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_copy.png";
+            }
+         }
+         description {
+            state:      "ask" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_ask.png";
+            }
+         }
+         description {
+            state:      "move" 0.0;
+            inherit:    "visible" 0.0;
+            image {
+               normal:  "e17_fileman_move.png";
+            }
+         }
+      }
    }
    programs {
       program {
+         name:   "ask";
+         signal: "e,state,ask";
+         source: "e";
+         action: STATE_SET "ask" 0.0;
+         target: "dnd_action";
+      }
+      program {
+         name:   "move";
+         signal: "e,state,move";
+         source: "e";
+         action: STATE_SET "move" 0.0;
+         target: "dnd_action";
+      }
+      program {
+         name:   "copy";
+         signal: "e,state,copy";
+         source: "e";
+         action: STATE_SET "copy" 0.0;
+         target: "dnd_action";
+      }
+      program {
         name:   "active"; 
         signal: "e,state,selected"; 
         source: "e"; 
diff --git a/data/themes/images/e17_fileman_ask.png b/data/themes/images/e17_fileman_ask.png
new file mode 100644 (file)
index 0000000..79a202e
Binary files /dev/null and b/data/themes/images/e17_fileman_ask.png differ
diff --git a/data/themes/images/e17_fileman_copy.png b/data/themes/images/e17_fileman_copy.png
new file mode 100644 (file)
index 0000000..1569469
Binary files /dev/null and b/data/themes/images/e17_fileman_copy.png differ
diff --git a/data/themes/images/e17_fileman_move.png b/data/themes/images/e17_fileman_move.png
new file mode 100644 (file)
index 0000000..b0a65a1
Binary files /dev/null and b/data/themes/images/e17_fileman_move.png differ
index d24fe8c..9202ae7 100644 (file)
@@ -30,6 +30,8 @@ static void _e_drag_free(E_Drag *drag);
 
 static int  _e_dnd_cb_window_shape(void *data, int type, void *event);
 
+static int  _e_dnd_cb_key_down(void *data, int type, void *event);
+static int  _e_dnd_cb_key_up(void *data, int type, void *event);
 static int  _e_dnd_cb_mouse_up(void *data, int type, void *event);
 static int  _e_dnd_cb_mouse_move(void *data, int type, void *event);
 static int  _e_dnd_cb_event_dnd_enter(void *data, int type, void *event);
@@ -102,6 +104,12 @@ e_dnd_init(void)
    _event_handlers = evas_list_append(_event_handlers,
                                      ecore_event_handler_add(ECORE_X_EVENT_SELECTION_NOTIFY,
                                                              _e_dnd_cb_event_dnd_selection, NULL));
+   _event_handlers = evas_list_append(_event_handlers,
+                                      ecore_event_handler_add(ECORE_X_EVENT_KEY_DOWN,
+                                                              _e_dnd_cb_key_down, NULL));
+   _event_handlers = evas_list_append(_event_handlers,
+                                      ecore_event_handler_add(ECORE_X_EVENT_KEY_UP,
+                                                              _e_dnd_cb_key_up, NULL));
 
    _action = ECORE_X_ATOM_XDND_ACTION_PRIVATE;
    return 1;
@@ -205,6 +213,9 @@ e_drag_new(E_Container *container, int x, int y,
    ecore_x_window_shadow_tree_flush();
    
    _drag_win_root = drag->container->manager->root;
+
+   drag->cb.key_down = NULL;
+   drag->cb.key_up = NULL;
    
    return drag;
 }
@@ -529,6 +540,18 @@ e_drop_handler_action_get()
    return _action;
 }
 
+EAPI void
+e_drag_key_down_cb_set(E_Drag *drag, void (*func)(E_Drag *drag, Ecore_X_Event_Key_Down *e))
+{
+   drag->cb.key_down = func;
+}
+
+EAPI void
+e_drag_key_up_cb_set(E_Drag *drag, void (*func)(E_Drag *drag, Ecore_X_Event_Key_Up *e))
+{
+   drag->cb.key_up = func;
+}
+
 /* local subsystem functions */
 
 static void
@@ -717,6 +740,10 @@ _e_drag_update(Ecore_X_Window root, int x, int y, Ecore_X_Atom action)
    int dx, dy, dw, dh;
    Ecore_X_Window win, ignore_win[2];
    int responsive = 0;
+   static struct 
+     {
+       Ecore_X_Window root, win;
+     } cache = {0, 0};
 
 //   double t1 = ecore_time_get(); ////
    if (_drag_current)
@@ -726,7 +753,13 @@ _e_drag_update(Ecore_X_Window root, int x, int y, Ecore_X_Atom action)
        /* FIXME: this is nasty. every x mouse event we go back to x and do
         * a whole bunch of round-trips narrowing down the toplevel window
         * which contains the mouse */
-       win = ecore_x_window_shadow_tree_at_xy_with_skip_get(root, x, y, ignore_win, 2);
+       if (cache.win != root)
+         {
+            /* A little bit of caching to avoid trips to X. */
+            cache.win = root;
+            cache.root = ecore_x_window_root_get(root);
+         }
+       win = ecore_x_window_shadow_tree_at_xy_with_skip_get(cache.root, x, y, ignore_win, 2);
 //     win = ecore_x_window_at_xy_with_skip_get(x, y, ignore_win, 2);
      }
    else
@@ -833,8 +866,6 @@ _e_drag_update(Ecore_X_Window root, int x, int y, Ecore_X_Atom action)
          }
      }
 
-   if(action == ECORE_X_ATOM_ATOM) responsive = 0;
-
    return responsive;
 //   double t2 = ecore_time_get() - t1; ////
 //   printf("DND UPDATE %3.7f\n", t2); ////
@@ -1049,6 +1080,38 @@ _e_dnd_cb_window_shape(void *data, int ev_type, void *ev)
 }
 
 static int
+_e_dnd_cb_key_down(void *data, int type, void *event)
+{
+   Ecore_X_Event_Key_Down *ev;
+
+   ev = event;
+   if (ev->win != _drag_win) return 1;
+
+   if (!_drag_current) return 1;
+
+   if (_drag_current->cb.key_down)
+     _drag_current->cb.key_down(_drag_current, ev);
+   
+   return 1;
+}
+
+static int
+_e_dnd_cb_key_up(void *data, int type, void *event)
+{
+   Ecore_X_Event_Key_Up *ev;
+
+   ev = event;
+   if (ev->win != _drag_win) return 1;
+
+   if (!_drag_current) return 1;
+
+   if (_drag_current->cb.key_up)
+     _drag_current->cb.key_up(_drag_current, ev);
+   
+   return 1;
+}
+
+static int
 _e_dnd_cb_mouse_up(void *data, int type, void *event)
 {
    Ecore_X_Event_Mouse_Button_Up *ev;
@@ -1069,7 +1132,7 @@ _e_dnd_cb_mouse_move(void *data, int type, void *event)
    ev = event;
    if (ev->win != _drag_win) return 1;
 
-   _e_drag_update(_drag_win_root, ev->x, ev->y, ECORE_X_ATOM_ATOM);
+   if(!_xdnd) _e_drag_update(_drag_win_root, ev->x, ev->y, ECORE_X_ATOM_XDND_ACTION_PRIVATE);
    
    return 1;
 }
index 069d0da..84734cd 100644 (file)
@@ -38,6 +38,8 @@ struct _E_Drag
    struct {
        void *(*convert)(E_Drag *drag, const char *type);
        void  (*finished)(E_Drag *drag, int dropped);
+       void  (*key_down)(E_Drag *drag, Ecore_X_Event_Key_Down *e);
+       void  (*key_up)(E_Drag *drag, Ecore_X_Event_Key_Up *e);
    } cb;
 
    E_Container       *container;
@@ -120,6 +122,8 @@ EAPI void    e_drag_object_set(E_Drag *drag, Evas_Object *object);
 EAPI void    e_drag_move(E_Drag *drag, int x, int y);
 EAPI void    e_drag_resize(E_Drag *drag, int w, int h);
 EAPI void    e_drag_idler_before(void);
+EAPI void    e_drag_key_down_cb_set(E_Drag *drag, void (*func)(E_Drag *drag, Ecore_X_Event_Key_Down *e));
+EAPI void    e_drag_key_up_cb_set(E_Drag *drag, void (*func)(E_Drag *drag, Ecore_X_Event_Key_Up *e));
 
 /* x and y are the coords where the mouse is when dragging starts */
 EAPI int  e_drag_start(E_Drag *drag, int x, int y);
index 7192681..230ca2e 100644 (file)
@@ -5248,6 +5248,47 @@ _e_fm2_cb_drag_finished(E_Drag *drag, int dropped)
    free(drag->data);
 }
 
+void
+_e_fm_drag_key_down_cb(E_Drag *drag, Ecore_X_Event_Key_Down *e)
+{
+   if (!strncmp(e->keyname, "Alt", 3))
+     {
+       ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_ASK);
+       edje_object_signal_emit(drag->object, "e,state,ask", "e");
+     }
+   else if (!strncmp(e->keyname, "Shift", 5))
+     {
+       ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_MOVE);
+       edje_object_signal_emit(drag->object, "e,state,move", "e");
+     }
+   else if (!strncmp(e->keyname, "Control", 7))
+     {
+       ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_COPY);   
+       edje_object_signal_emit(drag->object, "e,state,copy", "e");
+     }
+}
+
+void
+_e_fm_drag_key_up_cb(E_Drag *drag, Ecore_X_Event_Key_Up *e)
+{
+   /* Default action would be move. ;) */
+
+   if (!strncmp(e->keyname, "Alt", 3))
+     {
+       ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_MOVE);
+     }
+   else if (!strncmp(e->keyname, "Shift", 5))
+     {
+       ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_MOVE);
+     }
+   else if (!strncmp(e->keyname, "Control", 7))
+     {
+       ecore_x_dnd_source_action_set(ECORE_X_ATOM_XDND_ACTION_MOVE);
+     }
+
+   edje_object_signal_emit(drag->object, "e,state,move", "e");
+}
+
 static void
 _e_fm2_cb_icon_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_info)
 {
@@ -5385,8 +5426,12 @@ _e_fm2_cb_icon_mouse_move(void *data, Evas *e, Evas_Object *obj, void *event_inf
             edje_object_signal_emit(o, "e,state,selected", "e");
             edje_object_signal_emit(o2, "e,state,selected", "e");
             e_drag_object_set(d, o);
+            edje_object_signal_emit(o, "e,state,move", "e");
             e_drag_resize(d, w, h);
 
+            e_drag_key_down_cb_set(d, _e_fm_drag_key_down_cb);
+            e_drag_key_up_cb_set(d, _e_fm_drag_key_up_cb);
+
             e_drag_xdnd_start(d,
                               ic->drag.x + ic->x + ic->sd->x - ic->sd->pos.x,
                               ic->drag.y + ic->y + ic->sd->y - ic->sd->pos.y);