Re: Come fix bugs! (Batteries included)



Hi,

Am Montag, den 11.10.2004, 12:41 +0200 schrieb Alexander Larsson:
> [...]
> > > * tree sidebar timeout before load-uri when keynav:ing
> > > If you navigate the tree sidebar with cursor keys, it will immediately
> > > start loading the folders as you move over them. This makes keynav
> > > painful. We should have a delay here before we load the folder.
> > 
> > did that, are 300 ms ok ?  (attached, fm-tree-view.diff)
> 
> Hmm. Its a bit to short for me when navigating with the keyboard. It
> only triggers when i hold down the key. Also, having a delay when
> selecting by using the mouse seems wrong to me. The delay should only be
> when the keyboard was used.

Yeah, attached with changes. 
Do we want to depend the delay on the keyboard repeat rate ? 
(seems to be gconf /desktop/gnome/peripherals/keyboard/rate)

If so, how is the relation factor ?

> > > * context menu poped up by keyboard appear at mouse pointer
> > > If you select a file and bring up the context menu (using ctrl-F10)
> > > the menu pops up at the current mouse position, not the location of
> > > the icon. This is distracting when you're using keyboard navigation,
> > > and the mouse cursor could be anywhere.
> > 
> > Yes, but it is hard to fix. I tried it in one of my other apps and what
> > I did was basically,
> >
> > Really ugly. I hesitate to clobber nautilus up with that ;)
> 
> It can't be that hard to do. Just look at the type of the event that
> lead to the popup. Ideally, we want clean simple code, but the most
> important thing is the user interaction behaviour. If we have to add a
> (small, localized, commented) hack to be able to implement it, thats
> fine.

Well as there seems to be a function to get the selection's coordinates
I'd like to try. Cant find the gtk_menu_popup call however. Help ? :)

> 
> > > * .hidden reading follows symlinks/nodes etc
> > > When reading .hidden files we should only read it if the file is a
> > > regular file. We shouldn't follow symlinks, hang if someone puts a
> > > ..hidden pipe there, or whatever unregular.
> > 
> > did that, attached nautilus-directory-async.diff
> 
> +	if (!file_info)
> +		return;
> 
> We use brackets around one-liners too. See docs/style-guide.html.
> 
> +	/* FIXME check flags for GNOME_VFS_FILE_FLAGS_SYMLINK too ? */
> Checking for == GNOME_VFS_FILE_TYPE_REGULAR should be ok since we don't
> pass GNOME_VFS_FILE_INFO_FOLLOW_LINKS.
> 
> +	/* or GNOME_VFS_FILE_FLAGS_LOCAL */
> Non-local .hidden files sound ok to me.
> 
> +	file_ok = (
> +		(file_info->valid_fields 
> +	& (GNOME_VFS_FILE_INFO_FIELDS_TYPE |
> GNOME_VFS_FILE_INFO_FIELDS_SIZE)) 
> +	== (GNOME_VFS_FILE_INFO_FIELDS_TYPE | GNOME_VFS_FILE_INFO_FIELDS_SIZE)
> +	)
> +	&& (file_info->type == GNOME_VFS_FILE_TYPE_REGULAR)
> +	&& (file_info->size > 0);

Attached with changes.

cheers,
   Danny

-- 
www.keyserver.net key id A334AEA6

Index: fm-tree-view.c
===================================================================
RCS file: /cvs/gnome/nautilus/src/file-manager/fm-tree-view.c,v
retrieving revision 1.6
diff -u -p -r1.6 fm-tree-view.c
--- fm-tree-view.c	21 Jun 2004 18:33:43 -0000	1.6
+++ fm-tree-view.c	12 Oct 2004 18:04:13 -0000
@@ -38,6 +38,7 @@
 #include <eel/eel-preferences.h>
 #include <eel/eel-string.h>
 #include <eel/eel-vfs-extensions.h>
+#include <gtk/gtkmain.h>
 #include <gtk/gtkcellrendererpixbuf.h>
 #include <gtk/gtkcellrenderertext.h>
 #include <gtk/gtkscrolledwindow.h>
@@ -92,6 +93,8 @@ struct FMTreeViewDetails {
 	GtkWidget *popup_trash;
 	GtkWidget *popup_properties;
 	NautilusFile *popup_file;
+	
+	guint selection_changed_timer;
 };
 
 typedef struct {
@@ -378,34 +381,64 @@ row_activated_callback (GtkTreeView *tre
 	}
 }
 
-
-static void
-selection_changed_callback (GtkTreeSelection *selection,
-			    FMTreeView *view)
+static gboolean 
+selection_changed_timer_callback(FMTreeView *view)
 {
 	NautilusFileAttributes attributes;
 	GtkTreeIter iter;
+	GtkTreeSelection *selection;
+	
+	selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (view->details->tree_widget));
 
 	/* no activation if popup menu is open */
 	if (view->details->popup_file != NULL) {
-		return;
+		return FALSE;
 	}
 
 	cancel_activation (view);
 
 	if (!gtk_tree_selection_get_selected (selection, NULL, &iter)) {
-		return;
+		return FALSE;
 	}
 
 	view->details->activation_file = sort_model_iter_to_file (view, &iter);
 	if (view->details->activation_file == NULL) {
-		return;
+		return FALSE;
 	}
 	view->details->activation_in_new_window = FALSE;
 		
 	attributes = NAUTILUS_FILE_ATTRIBUTE_ACTIVATION_URI;
 	nautilus_file_call_when_ready (view->details->activation_file, attributes,
 				       got_activation_uri_callback, view);
+	return FALSE; /* remove timeout */
+}
+
+static void
+selection_changed_callback (GtkTreeSelection *selection,
+			    FMTreeView *view)
+{
+	GdkEvent *event;
+	gboolean is_keyboard;
+	
+	if (view->details->selection_changed_timer) {
+		g_source_remove (view->details->selection_changed_timer);
+		view->details->selection_changed_timer = 0;
+	}
+	
+	event = gtk_get_current_event ();
+	if (event) {
+		is_keyboard = (event->type == GDK_KEY_PRESS || event->type == GDK_KEY_RELEASE);
+		gdk_event_free (event);
+
+		if (is_keyboard) {
+			/* on keyboard event: delay the change */
+			/* TODO: make dependent on keyboard repeat rate as per Markus Bertheau ? */
+			view->details->selection_changed_timer = g_timeout_add (500, (GSourceFunc) selection_changed_timer_callback, view);
+		} else {
+			/* on mouse event: show the change immediately */
+			selection_changed_timer_callback (view);
+		}
+	}
 }
 
 static int
@@ -1279,6 +1312,11 @@ fm_tree_view_dispose (GObject *object)
 	
 	view = FM_TREE_VIEW (object);
 	
+	if (view->details->selection_changed_timer) {
+		g_source_remove (view->details->selection_changed_timer);
+		view->details->selection_changed_timer = 0;
+	}
+
 	if (view->details->drag_dest) {
 		g_object_unref (view->details->drag_dest);
 		view->details->drag_dest = NULL;
Index: nautilus-directory-async.c
===================================================================
RCS file: /cvs/gnome/nautilus/libnautilus-private/nautilus-directory-async.c,v
retrieving revision 1.210
diff -u -p -r1.210 nautilus-directory-async.c
--- nautilus-directory-async.c	6 Oct 2004 12:12:17 -0000	1.210
+++ nautilus-directory-async.c	12 Oct 2004 18:08:00 -0000
@@ -2018,6 +2018,8 @@ read_dot_hidden_file (NautilusDirectory 
 	GnomeVFSResult result;
 	int i, file_size;
 	char *file_contents;
+	GnomeVFSFileInfo *file_info;
+	gboolean file_ok;
 
 
 	/* FIXME: We only support .hidden on file: uri's for the moment.
@@ -2032,6 +2034,34 @@ read_dot_hidden_file (NautilusDirectory 
 	 * that works on strings, so we can avoid the VFS parsing step.
 	 */
 	dot_hidden_vfs_uri = gnome_vfs_uri_append_file_name (directory->details->vfs_uri, ".hidden");
+
+	file_info = gnome_vfs_file_info_new ();
+	if (!file_info) {
+		return;
+	}
+	
+	if (gnome_vfs_get_file_info_uri (
+		dot_hidden_vfs_uri,
+		file_info, 
+		GNOME_VFS_FILE_INFO_DEFAULT) 
+	!= GNOME_VFS_OK) {
+		gnome_vfs_file_info_unref (file_info);
+		return;
+	}
+
+	file_ok = (
+		(file_info->valid_fields 
+	& (GNOME_VFS_FILE_INFO_FIELDS_TYPE | GNOME_VFS_FILE_INFO_FIELDS_SIZE)) 
+	== (GNOME_VFS_FILE_INFO_FIELDS_TYPE | GNOME_VFS_FILE_INFO_FIELDS_SIZE)
+	)
+	&& (file_info->type == GNOME_VFS_FILE_TYPE_REGULAR);
+
+	gnome_vfs_file_info_unref (file_info);
+		
+	if (!file_ok) {
+		return;
+	}
+	
 	dot_hidden_uri = gnome_vfs_uri_to_string (dot_hidden_vfs_uri, GNOME_VFS_URI_HIDE_NONE);
 	gnome_vfs_uri_unref (dot_hidden_vfs_uri);
 	

Attachment: signature.asc
Description: Dies ist ein digital signierter Nachrichtenteil



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]