1999-02-17 Federico Mena Quintero <federico@nuclecu.unam.mx>

* dir.c (if_link_is_exe): Made this function take in a directory
	argument as well -- the sought file may not be in the cwd, and
	file entries do not carry the directory the file refers to.

	* screen.c (do_enter_on_file_entry): Pass in the cpanel->cwd to
	if_link_is_exe().

1999-02-17  Federico Mena Quintero  <federico@nuclecu.unam.mx>

	* gdesktop.c (do_mount_umount): Removed unused variable.
	(do_eject): Return FALSE if there is no eject command.
	(setup_devices): Removed unused variable.

	* gdnd.c (drop_on_file): Pass the directory to if_link_is_exe().
	(gdnd_validate_action): Likewise.
	(gdnd_perform_drop): Made consistent with the rest of the code by
	taking the directory name along with the file entry.
	(gdnd_validate_action): Likewise.

	* gdesktop.c (icon_drag_motion): Pass the directory to the gdnd
	functions.
	(icon_drag_data_received): Likewise.
	(desktop_drag_motion): Likewise.
	(desktop_drag_data_received): Likewise.
	(desktop_icon_info_open): Pass the directory to if_link_is_exe().

	* gscreen.c (panel_icon_list_drag_data_received): Pass the
	directory to gdnd functions.
	(panel_clist_drag_data_received): Likewise.
	(panel_tree_drag_data_received): Likewise.
	(panel_clist_drag_motion): Likewise.
	(panel_icon_list_drag_motion): Likewise.
This commit is contained in:
Miguel de Icaza 1999-02-18 00:07:26 +00:00
parent 6eb9a08b29
commit b683efeda3
11 changed files with 179 additions and 75 deletions

View File

@ -1,3 +1,29 @@
1999-02-17 Federico Mena Quintero <federico@nuclecu.unam.mx>
* gdesktop.c (do_mount_umount): Removed unused variable.
(do_eject): Return FALSE if there is no eject command.
(setup_devices): Removed unused variable.
* gdnd.c (drop_on_file): Pass the directory to if_link_is_exe().
(gdnd_validate_action): Likewise.
(gdnd_perform_drop): Made consistent with the rest of the code by
taking the directory name along with the file entry.
(gdnd_validate_action): Likewise.
* gdesktop.c (icon_drag_motion): Pass the directory to the gdnd
functions.
(icon_drag_data_received): Likewise.
(desktop_drag_motion): Likewise.
(desktop_drag_data_received): Likewise.
(desktop_icon_info_open): Pass the directory to if_link_is_exe().
* gscreen.c (panel_icon_list_drag_data_received): Pass the
directory to gdnd functions.
(panel_clist_drag_data_received): Likewise.
(panel_tree_drag_data_received): Likewise.
(panel_clist_drag_motion): Likewise.
(panel_icon_list_drag_motion): Likewise.
1999-02-17 Miguel de Icaza <miguel@nuclecu.unam.mx>
* gdesktop.c (reload_desktop_icons): Load the information provided

View File

@ -482,7 +482,9 @@ reload_desktop_icons (int user_pos, int xpos, int ypos)
orig_xpos = orig_ypos = 0;
for (sl = need_position_list; sl; sl = sl->next) {
file_and_url_t *fau = sl->data;
file_and_url_t *fau;
fau = sl->data;
if (user_pos && sl == need_position_list) {
/* If we are on the first icon, place it "by hand".
@ -503,40 +505,46 @@ reload_desktop_icons (int user_pos, int xpos, int ypos)
get_icon_auto_pos (&xpos, &ypos);
}
/*
* If the file dropped was a .desktop file, pull the suggested
/* If the file dropped was a .desktop file, pull the suggested
* title and icon from there
*/
mime = gnome_mime_type_or_default (fau->filename, NULL);
if (mime && strcmp (mime, "application/x-gnome-app-info") == 0){
if (mime && strcmp (mime, "application/x-gnome-app-info") == 0) {
GnomeDesktopEntry *entry;
char *fullname = g_concat_dir_and_file (desktop_directory, fau->filename);
char *fullname;
fullname = g_concat_dir_and_file (desktop_directory, fau->filename);
entry = gnome_desktop_entry_load (fullname);
if (entry){
if (entry->name){
if (entry) {
if (entry->name) {
if (fau->caption)
g_free (fau->caption);
fau->caption = g_strdup (entry->name);
gnome_metadata_set (fullname, "icon-caption",
strlen (fau->caption)+1, fau->caption);
strlen (fau->caption) + 1,
fau->caption);
}
if (entry->icon){
if (entry->icon)
gnome_metadata_set (fullname, "icon-filename",
strlen (entry->icon)+1, entry->icon);
}
strlen (entry->icon) + 1,
entry->icon);
gnome_desktop_entry_free (entry);
}
g_free (fullname);
}
dii = desktop_icon_info_new (fau->filename, fau->url, fau->caption, xpos, ypos);
gtk_widget_show (dii->dicon);
if (fau->url)
g_free (fau->url);
if (fau->caption)
g_free (fau->caption);
g_free (fau->filename);
g_free (fau);
}
@ -914,7 +922,7 @@ do_mount_umount (char *filename, gboolean is_mount)
{
static char *mount_command;
static char *umount_command;
char *command, *op;
char *op;
char buffer [128];
if (is_mount){
@ -979,9 +987,10 @@ do_eject (char *filename)
char *eject_command = find_command (eject_known_locations);
char *command;
FILE *f;
if (!eject_command)
return;
return FALSE;
command = g_strconcat (eject_command, " ", filename, NULL);
open_error_pipe ();
f = popen (command, "r");
@ -989,6 +998,7 @@ do_eject (char *filename)
close_error_pipe (1, _("While running the eject command"));
else
close_error_pipe (0, 0);
pclose (f);
return TRUE;
@ -1029,8 +1039,8 @@ desktop_icon_info_open (DesktopIconInfo *dii)
if (S_ISDIR (fe->buf.st_mode) || link_isdir (fe))
new_panel_at (filename);
else {
if (!try_to_mount (filename, fe)){
if (is_exe (fe->buf.st_mode) && if_link_is_exe (fe))
if (!try_to_mount (filename, fe)) {
if (is_exe (fe->buf.st_mode) && if_link_is_exe (desktop_directory, fe))
my_system (EXECUTE_AS_SHELL, shell, filename);
else
gmc_open_filename (filename, NULL);
@ -1450,6 +1460,7 @@ icon_drag_motion (GtkWidget *widget, GdkDragContext *context, gint x, gint y, gu
TRUE,
source_widget != NULL,
source_widget && is_desktop_icon,
desktop_directory,
fe,
dii->selected);
@ -1559,10 +1570,11 @@ icon_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x, gin
full_name = g_concat_dir_and_file (desktop_directory, dii->filename);
fe = file_entry_from_file (full_name);
g_free (full_name);
if (!fe)
return; /* eeeek */
if (gdnd_perform_drop (context, data, fe, full_name))
if (gdnd_perform_drop (context, data, desktop_directory, fe))
reload_desktop_icons (FALSE, 0, 0);
file_entry_free (fe);
@ -1783,8 +1795,6 @@ setup_devices (void)
int count;
if (strncmp (short_dev_name, "fd", 2) == 0){
char *full;
format = _("floppy %d");
count = floppy++;
} else if (strncmp (short_dev_name, "hd", 2) == 0 || strncmp (short_dev_name, "sd", 2) == 0){
@ -2028,6 +2038,7 @@ desktop_drag_motion (GtkWidget *widget, GdkDragContext *context, gint x, gint y,
TRUE,
source_widget != NULL,
source_widget && is_desktop_icon,
desktop_directory,
NULL,
FALSE);
@ -2052,14 +2063,20 @@ desktop_drag_data_received (GtkWidget *widget, GdkDragContext *context, gint x,
drop_desktop_icons (context, data, x, y);
else {
file_entry *desktop_fe;
char *directory, *p;
desktop_fe = file_entry_from_file (desktop_directory);
if (!desktop_fe)
return; /* eeek */
if (gdnd_perform_drop (context, data, desktop_fe, desktop_directory))
p = strrchr (desktop_directory, PATH_SEP);
g_assert (p);
directory = g_strndup (desktop_directory, p - desktop_directory);
if (gdnd_perform_drop (context, data, directory, desktop_fe))
reload_desktop_icons (TRUE, x, y);
g_free (directory);
file_entry_free (desktop_fe);
}
}

View File

@ -290,38 +290,52 @@ drop_url_on_directory (GdkDragContext *context, GtkSelectionData *selection_data
/* Drop stuff on a directory */
static int
drop_on_directory (GdkDragContext *context, GtkSelectionData *selection_data,
GdkDragAction action, char *destdir)
GdkDragAction action, char *directory, file_entry *dest_fe)
{
if (gdnd_drag_context_has_target (context, TARGET_URI_LIST))
drop_uri_list_on_directory (context, selection_data, action, destdir);
else if (gdnd_drag_context_has_target (context, TARGET_URL))
drop_url_on_directory (context, selection_data, destdir);
else
return FALSE;
char *full_name;
int retval;
return TRUE;
retval = FALSE;
full_name = g_concat_dir_and_file (directory, dest_fe->fname);
if (gdnd_drag_context_has_target (context, TARGET_URI_LIST)) {
drop_uri_list_on_directory (context, selection_data, action, full_name);
retval = TRUE;
} else if (gdnd_drag_context_has_target (context, TARGET_URL)) {
drop_url_on_directory (context, selection_data, full_name);
retval = TRUE;
}
g_free (full_name);
return retval;
}
/* Drop stuff on a non-directory file. This uses metadata and MIME as well. */
static int
drop_on_file (GdkDragContext *context, GtkSelectionData *selection_data,
file_entry *dest_fe, char *dest_name)
char *directory, file_entry *dest_fe)
{
int size;
char *buf;
const char *mime_type;
char *full_name;
int retval;
retval = FALSE; /* assume we cannot drop */
full_name = g_concat_dir_and_file (directory, dest_fe->fname);
/* 1. Try to use a metadata-based drop action */
if (gnome_metadata_get (dest_name, "drop-action", &size, &buf) == 0) {
if (gnome_metadata_get (full_name, "drop-action", &size, &buf) == 0) {
/*action_drop (dest_name, buf, context, selection_data);*/ /* Fixme: i'm undefined */
g_free (buf);
return TRUE;
retval = TRUE;
goto out;
}
/* 2. Try a drop action from the MIME-type */
mime_type = gnome_mime_type_or_default (dest_name, NULL);
mime_type = gnome_mime_type_or_default (full_name, NULL);
if (mime_type) {
char *action;
@ -329,13 +343,14 @@ drop_on_file (GdkDragContext *context, GtkSelectionData *selection_data,
if (action) {
/* Fixme: i'm undefined */
/*action_drop (dest_name, action, context, selection_data);*/
return TRUE;
retval = TRUE;
goto out;
}
}
/* 3. If executable, try metadata keys for "open" */
if (is_exe (dest_fe->buf.st_mode) && if_link_is_exe (dest_fe)) {
if (is_exe (dest_fe->buf.st_mode) && if_link_is_exe (directory, dest_fe)) {
GList *names, *l;
int len, i;
char **drops;
@ -358,29 +373,34 @@ drop_on_file (GdkDragContext *context, GtkSelectionData *selection_data,
}
drops[i] = NULL;
if (gnome_metadata_get (dest_name, "open", &size, &buf) == 0)
exec_extension (dest_name, buf, drops, NULL, 0);
if (gnome_metadata_get (full_name, "open", &size, &buf) == 0)
exec_extension (full_name, buf, drops, NULL, 0);
else
exec_extension (dest_name, "%f %q", drops, NULL, 0);
exec_extension (full_name, "%f %q", drops, NULL, 0);
g_free (drops);
gnome_uri_list_free_strings (names);
g_free (buf);
return TRUE;
retval = TRUE;
goto out;
}
return FALSE; /* could not drop */
out:
g_free (full_name);
return retval;
}
int
gdnd_perform_drop (GdkDragContext *context, GtkSelectionData *selection_data,
file_entry *dest_fe, char *dest_name)
char *directory, file_entry *dest_fe)
{
GdkDragAction action;
g_return_val_if_fail (context != NULL, FALSE);
g_return_val_if_fail (selection_data != NULL, FALSE);
g_return_val_if_fail (directory != NULL, FALSE);
g_return_val_if_fail (dest_fe != NULL, FALSE);
/* Get action */
@ -393,9 +413,9 @@ gdnd_perform_drop (GdkDragContext *context, GtkSelectionData *selection_data,
action = context->action;
if (S_ISDIR (dest_fe->buf.st_mode) || dest_fe->f.link_to_dir)
return drop_on_directory (context, selection_data, action, dest_name);
return drop_on_directory (context, selection_data, action, directory, dest_fe);
else
return drop_on_file (context, selection_data, dest_fe, dest_name);
return drop_on_file (context, selection_data, directory, dest_fe);
}
/**
@ -480,12 +500,13 @@ gdnd_find_panel_by_drag_context (GdkDragContext *context, GtkWidget **source_wid
GdkDragAction
gdnd_validate_action (GdkDragContext *context,
int on_desktop, int same_process, int same_source,
file_entry *dest_fe, int dest_selected)
char *directory, file_entry *dest_fe, int dest_selected)
{
int on_directory;
int on_exe;
g_return_val_if_fail (context != NULL, 0);
g_return_val_if_fail (directory != NULL, 0);
/* If we are dragging a desktop icon onto the desktop or onto a selected
* desktop icon, unconditionally specify MOVE.
@ -499,7 +520,7 @@ gdnd_validate_action (GdkDragContext *context,
if (dest_fe) {
on_directory = S_ISDIR (dest_fe->buf.st_mode) || dest_fe->f.link_to_dir;
on_exe = is_exe (dest_fe->buf.st_mode) && if_link_is_exe (dest_fe);
on_exe = is_exe (dest_fe->buf.st_mode) && if_link_is_exe (directory, dest_fe);
}
if (gdnd_drag_context_has_target (context, TARGET_URI_LIST)) {

View File

@ -40,7 +40,7 @@ void gdnd_init (void);
* Returns TRUE if an action was performed, FALSE otherwise (i.e. invalid drop).
*/
int gdnd_perform_drop (GdkDragContext *context, GtkSelectionData *selection_data,
file_entry *dest_fe, char *dest_name);
char *directory, file_entry *dest_fe);
/* Test whether the specified context has a certain target type */
int gdnd_drag_context_has_target (GdkDragContext *context, TargetType type);
@ -53,7 +53,7 @@ WPanel *gdnd_find_panel_by_drag_context (GdkDragContext *context, GtkWidget **so
*/
GdkDragAction gdnd_validate_action (GdkDragContext *context,
int on_desktop, int same_process, int same_source,
file_entry *dest_fe, int dest_selected);
char *directory, file_entry *dest_fe, int dest_selected);
#endif

View File

@ -1,3 +1,10 @@
/* Mount/umount support for the Midnight Commander
*
* Copyright (C) 1998-1999 The Free Software Foundation
*
* Author: Miguel de Icaza <miguel@nuclecu.unam.mx>
*/
#include <config.h>
#ifdef STDC_HEADERS

View File

@ -1,6 +1,15 @@
/* Mount/umount support for the Midnight Commander
*
* Copyright (C) 1998-1999 The Free Software Foundation
*
* Author: Miguel de Icaza <miguel@nuclecu.unam.mx>
*/
#ifndef GMOUNT_H
#define GMOUNT_H
#include <glib.h>
gboolean is_block_device_mountable (char *devname);
gboolean is_block_device_mounted (char *devname);
GList *get_list_of_mountable_devices (void);

View File

@ -805,7 +805,7 @@ panel_icon_list_drag_data_received (GtkWidget *widget,
free_fe = FALSE;
}
reload = gdnd_perform_drop (context, selection_data, fe, file);
reload = gdnd_perform_drop (context, selection_data, panel->cwd, fe);
if (free_file)
g_free (file);
@ -860,7 +860,7 @@ panel_clist_drag_data_received (GtkWidget *widget,
free_fe = FALSE;
}
reload = gdnd_perform_drop (context, selection_data, fe, file);
reload = gdnd_perform_drop (context, selection_data, panel->cwd, fe);
if (free_file)
g_free (file);
@ -908,7 +908,7 @@ panel_tree_drag_data_received (GtkWidget *widget,
if (!fe)
return; /* eeeek */
gdnd_perform_drop (context, selection_data, fe, path);
gdnd_perform_drop (context, selection_data, panel->cwd, fe);
file_entry_free (fe);
g_free (path);
@ -1117,6 +1117,7 @@ panel_clist_drag_motion (GtkWidget *widget, GdkDragContext *context, gint x, gin
FALSE,
source_widget != NULL,
source_widget == widget,
panel->cwd,
fe,
fe ? fe->f.marked : FALSE);
@ -1232,6 +1233,7 @@ panel_icon_list_drag_motion (GtkWidget *widget, GdkDragContext *context, gint x,
FALSE,
source_widget != NULL,
source_widget == widget,
panel->cwd,
fe,
fe ? fe->f.marked : FALSE);

View File

@ -1,3 +1,12 @@
1999-02-17 Federico Mena Quintero <federico@nuclecu.unam.mx>
* dir.c (if_link_is_exe): Made this function take in a directory
argument as well -- the sought file may not be in the cwd, and
file entries do not carry the directory the file refers to.
* screen.c (do_enter_on_file_entry): Pass in the cpanel->cwd to
if_link_is_exe().
1999-02-16 Miguel de Icaza <miguel@nuclecu.unam.mx>
* treestore.c (tree_store_rescan): Add code to skip scanning

View File

@ -293,7 +293,8 @@ do_sort (dir_list *list, sortfn *sort, int top, int reverse_f, int case_sensitiv
qsort (&(list->list) [1], top, sizeof (file_entry), sort);
}
void clean_dir (dir_list *list, int count)
void
clean_dir (dir_list *list, int count)
{
int i;
@ -357,16 +358,18 @@ add_dotdot_to_list (dir_list *list, int index)
}
/* Used to set up a directory list when there is no access to a directory */
int set_zero_dir (dir_list *list)
int
set_zero_dir (dir_list *list)
{
return (add_dotdot_to_list (list, 0));
}
/* If you change handle_dirent then check also handle_path. */
/* Return values: -1 = failure, 0 = don't add, 1 = add to the list */
int handle_dirent (dir_list *list, char *filter, struct dirent *dp,
struct stat *buf1, int next_free, int *link_to_dir,
int *stalled_link)
int
handle_dirent (dir_list *list, char *filter, struct dirent *dp,
struct stat *buf1, int next_free, int *link_to_dir,
int *stalled_link)
{
if (dp->d_name [0] == '.' && dp->d_name [1] == 0)
return 0;
@ -417,9 +420,10 @@ int handle_dirent (dir_list *list, char *filter, struct dirent *dp,
Moreover handle_path can't be used with a filemask.
If you change handle_path then check also handle_dirent. */
/* Return values: -1 = failure, 0 = don't add, 1 = add to the list */
int handle_path (dir_list *list, char *path,
struct stat *buf1, int next_free, int *link_to_dir,
int *stalled_link)
int
handle_path (dir_list *list, char *path,
struct stat *buf1, int next_free, int *link_to_dir,
int *stalled_link)
{
if (path [0] == '.' && path [1] == 0)
return 0;
@ -451,7 +455,8 @@ int handle_path (dir_list *list, char *path,
return 1;
}
int do_load_dir(dir_list *list, sortfn *sort, int reverse, int case_sensitive, char *filter)
int
do_load_dir (dir_list *list, sortfn *sort, int reverse, int case_sensitive, char *filter)
{
DIR *dirp;
struct dirent *dp;
@ -504,7 +509,8 @@ int do_load_dir(dir_list *list, sortfn *sort, int reverse, int case_sensitive, c
return next_free;
}
int link_isdir (file_entry *file)
int
link_isdir (file_entry *file)
{
if (file->f.link_to_dir)
return 1;
@ -512,20 +518,25 @@ int link_isdir (file_entry *file)
return 0;
}
int if_link_is_exe (file_entry *file)
int
if_link_is_exe (char *directory, file_entry *file)
{
struct stat b;
char *full_name;
if (S_ISLNK (file->buf.st_mode)){
mc_stat (file->fname, &b);
if (S_ISLNK (file->buf.st_mode)) {
full_name = concat_dir_and_file (directory, file->fname);
mc_stat (full_name, &b);
g_free (full_name);
return is_exe (b.st_mode);
}
return 1;
} else
return 1;
}
static dir_list dir_copy = { 0, 0 };
static void alloc_dir_copy (int size)
static void
alloc_dir_copy (int size)
{
int i;
@ -549,8 +560,9 @@ static void alloc_dir_copy (int size)
}
/* If filter is null, then it is a match */
int do_reload_dir (dir_list *list, sortfn *sort, int count, int rev,
int case_sensitive, char *filter)
int
do_reload_dir (dir_list *list, sortfn *sort, int count, int rev,
int case_sensitive, char *filter)
{
DIR *dirp;
struct dirent *dp;
@ -636,7 +648,8 @@ int do_reload_dir (dir_list *list, sortfn *sort, int count, int rev,
return next_free;
}
char *sort_type_to_name (sortfn *sort_fn)
char *
sort_type_to_name (sortfn *sort_fn)
{
int i;
@ -647,7 +660,8 @@ char *sort_type_to_name (sortfn *sort_fn)
return _("Unknown");
}
sortfn *sort_name_to_type (char *sname)
sortfn *
sort_name_to_type (char *sname)
{
int i;

View File

@ -79,7 +79,7 @@ typedef struct {
extern sort_orders_t sort_orders [SORT_TYPES_TOTAL];
int link_isdir (file_entry *);
int if_link_is_exe (file_entry *file);
int if_link_is_exe (char *directory, file_entry *file);
extern int show_backups;
extern int show_dot_files;

View File

@ -2036,9 +2036,8 @@ do_enter_on_file_entry (file_entry *fe)
if (S_ISDIR (fe->buf.st_mode) || link_isdir (fe)) {
do_cd (fe->fname, cd_exact);
return 1;
} else {
if (is_exe (fe->buf.st_mode) &&
if_link_is_exe (fe)) {
} else {
if (is_exe (fe->buf.st_mode) && if_link_is_exe (cpanel->cwd, fe)) {
#ifdef USE_VFS
if (vfs_current_is_local ())
#endif