src/cmd/fsexam/src/fsexam-dnd.c
author yz157939@agc105
Fri, 25 Apr 2008 17:13:57 +0800
changeset 149 0014c9b031e9
permissions -rw-r--r--
add fsexam 0.8.1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
149
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
     1
/*
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
     2
 * CDDL HEADER START
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
     3
 *
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
     4
 * The contents of this file are subject to the terms of the
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
     5
 * Common Development and Distribution License (the "License").
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
     6
 * You may not use this file except in compliance with the License.
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
     7
 *
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
     8
 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
     9
 * or http://www.opensolaris.org/os/licensing.
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    10
 * See the License for the specific language governing permissions
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    11
 * and limitations under the License.
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    12
 *
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    13
 * When distributing Covered Code, include this CDDL HEADER in each
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    14
 * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    15
 * If applicable, add the following below this CDDL HEADER, with the
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    16
 * fields enclosed by brackets "[]" replaced with your own identifying
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    17
 * information: Portions Copyright [yyyy] [name of copyright owner]
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    18
 *
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    19
 * CDDL HEADER END
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    20
 */
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    21
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    22
/*
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    23
 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    24
 * Use is subject to license terms.
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    25
 */
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    26
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    27
#ifdef HAVE_CONFIG_H
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    28
#include <config.h>
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    29
#endif
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    30
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    31
#include <gtk/gtk.h>
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    32
#include <glade/glade.h>
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    33
#include <gconf/gconf-client.h>
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    34
#include <libgnome/libgnome.h>
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    35
#include <libgnomeui/libgnomeui.h>
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    36
#include <libgnomevfs/gnome-vfs.h>
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    37
#include <eel/eel-vfs-extensions.h>
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    38
#include <eel/eel-string.h>
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    39
#include <stdio.h>
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    40
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    41
#include "fsexam-header.h"
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    42
#include "fsexam-ui.h"
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    43
#include "fsexam-dnd.h"
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    44
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    45
enum {
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    46
  FSEXAM_ICON_DND_GNOME_ICON_LIST,
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    47
  FSEXAM_ICON_DND_URI_LIST,
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    48
  FSEXAM_ICON_DND_TEXT
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    49
};
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    50
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    51
static GtkTargetEntry drop_types[] = {
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    52
            {"text/uri-list", 0, FSEXAM_ICON_DND_URI_LIST},
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    53
            {"text/plain", 0, FSEXAM_ICON_DND_TEXT},
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    54
            {"x-special/gnome-icon-list", 0, FSEXAM_ICON_DND_GNOME_ICON_LIST}
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    55
};
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    56
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    57
static void
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    58
drag_data_received_callback (GtkWidget *widget,
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    59
                             GdkDragContext *context,
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    60
                             gint x, 
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    61
                             gint y,
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    62
                             GtkSelectionData *data,
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    63
                             guint info,
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    64
                             guint32 time,
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    65
                             gpointer user_data)
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    66
{
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    67
    gchar    *canonical_uri = NULL, *local_path, *p;
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    68
    gchar    **uris = NULL;
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    69
    gint     i;
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    70
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    71
    uris = g_uri_list_extract_uris ((gchar *) data->data);
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    72
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    73
    for (i = 0; uris[i] != NULL; i++) {
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    74
        gchar *uri;
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    75
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    76
        uri = gnome_vfs_make_uri_from_shell_arg (uris[i]);
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    77
        //TODO: is this valid?
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    78
        canonical_uri = gnome_vfs_make_uri_canonical (uri);
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    79
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    80
        g_free (uri);
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    81
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    82
        if (canonical_uri != NULL)
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    83
            break;
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    84
    }
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    85
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    86
    g_strfreev (uris);
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    87
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    88
    if (canonical_uri == NULL)
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    89
        return;
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    90
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    91
    local_path = gnome_vfs_get_local_path_from_uri (canonical_uri);
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    92
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    93
    if (local_path) {
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    94
        fsexam_change_dir (local_path);
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    95
    } else {
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    96
        if (eel_uri_is_desktop (canonical_uri) 
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    97
                || eel_uri_is_trash (canonical_uri)) {
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    98
            gchar *uri = NULL;
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
    99
            p = strstr(canonical_uri, ":");
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   100
            if (p != NULL) {
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   101
                uri = g_strdup(p);
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   102
            }
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   103
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   104
            p = uri + 4; // to skip ":///"
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   105
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   106
            if (!strncmp (p, "home", 4) || !strncmp (p, "trash", 5) 
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   107
                    || !strncmp (p, "documents", 9)) {
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   108
                if ((*p == 'h') || (*p == 'd'))
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   109
                    local_path = g_strdup_printf ("%s/%s", 
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   110
                                                   g_getenv ("HOME"), 
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   111
                                                   "Documents");
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   112
                else
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   113
                    local_path = g_strdup_printf ("%s/%s", 
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   114
                                                   g_getenv ("HOME"), 
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   115
                                                   ".Trash");
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   116
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   117
                fsexam_change_dir (local_path);
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   118
            }
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   119
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   120
            g_free (uri);
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   121
        }
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   122
    }
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   123
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   124
    g_free (local_path);
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   125
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   126
    gtk_drag_finish (context, TRUE, FALSE, time);
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   127
    g_free (canonical_uri);
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   128
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   129
    fsexam_statusbar_update("");
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   130
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   131
    return;
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   132
}
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   133
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   134
void
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   135
fsexam_dnd_set (GtkWidget *widget)
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   136
{
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   137
    gtk_drag_dest_set (widget,
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   138
                 GTK_DEST_DEFAULT_ALL,
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   139
                 drop_types, G_N_ELEMENTS (drop_types),
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   140
                 GDK_ACTION_COPY | GDK_ACTION_MOVE | GDK_ACTION_ASK);
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   141
    
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   142
    g_signal_connect (widget,
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   143
                "drag_data_received",
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   144
                G_CALLBACK (drag_data_received_callback),
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   145
                NULL);
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   146
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   147
    return;
0014c9b031e9 add fsexam 0.8.1
yz157939@agc105
parents:
diff changeset
   148
}