Re: [Nautilus-list] [patch] - hierarchical script menus - done?
- From: David Emory Watson <dwatson cs ucr edu>
- To: Darin Adler <darin bentspoon com>
- Cc: nautilus-list lists eazel com, dwatson cs ucr edu
- Subject: Re: [Nautilus-list] [patch] - hierarchical script menus - done?
- Date: Sat, 02 Jun 2001 23:52:51 -0700
I would be intrestd in hearing comments, especially from testers...
On 28 May 2001 14:02:36 -0700, Darin Adler wrote:
> > There are a few for loops, as well as an if statement in
> > call_when_ready_on_scripts_directory which depend on this. I am using
> > this value to determine whether or not the scripts directory was
> > found/created.
>
> All details fields start as NULL (0, whatever). Setting it to NULL again
> seems unnecessary to me, but I guess it's OK.
OK I removed this line. :)
25,26c25,27
< * Darin Adler <darin eazel com>
< * Pavel Cisler <pavel eazel com>
---
> * Darin Adler <darin eazel com>,
> * Pavel Cisler <pavel eazel com>,
> * David Emory Watson <dwatson cs ucr edu>
137a139,140
> #define MAX_MENU_LEVELS 5
>
169,171c172,181
< NautilusDirectory *scripts_directory;
< guint scripts_added_handler_id;
< guint scripts_changed_handler_id;
---
> /* The first link in this list is reserved for the top level scripts
> * directory. This means that new links are always appended to the
> * list. In addition, lower level script directories must always occur
> * after higher level ones so if you remove a directory, you must remove
> * its subdirectories as well. This is done to preserve the ordering of
> * the callbacks when we rebuild the script menus.
> */
> GList *scripts_directory_list;
> GList *scripts_uri_list;
> guint scripts_directory_length;
290c300,302
< static void disconnect_script_handlers (FMDirectoryView *view);
---
> static void disconnect_scripts_directory_list (FMDirectoryView *view);
> static void disconnect_scripts_directory (FMDirectoryView *view,
> NautilusDirectory *directory);
1141,1142c1153,1154
< GList *files,
< gpointer callback_data)
---
> GList *files,
> gpointer callback_data)
1148c1160
< g_assert (directory == view->details->scripts_directory);
---
> g_assert (g_list_find (view->details->scripts_directory_list, directory) != NULL);
1155c1167,1168
< connect_script_handlers (FMDirectoryView *view)
---
> connect_script_handlers (FMDirectoryView *view,
> NautilusDirectory *directory)
1157,1159c1170
< if (view->details->scripts_directory == NULL) {
< return;
< }
---
> g_assert(directory != NULL);
1161,1162c1172
< nautilus_directory_file_monitor_add (view->details->scripts_directory,
< &view->details->scripts_directory,
---
> nautilus_directory_file_monitor_add (directory, &view->details->scripts_directory_list,
1165,1169c1175,1178
< view->details->scripts_added_handler_id = gtk_signal_connect
< (GTK_OBJECT (view->details->scripts_directory),
< "files_added",
< scripts_added_or_changed_callback,
< view);
---
> gtk_signal_connect (GTK_OBJECT (directory),
> "files_added",
> scripts_added_or_changed_callback,
> view);
1171,1175c1180,1183
< view->details->scripts_changed_handler_id = gtk_signal_connect
< (GTK_OBJECT (view->details->scripts_directory),
< "files_changed",
< scripts_added_or_changed_callback,
< view);
---
> gtk_signal_connect (GTK_OBJECT (directory),
> "files_changed",
> scripts_added_or_changed_callback,
> view);
1180a1189,1191
> NautilusDirectory *scripts_directory;
> char *scripts_directory_uri;
>
1199,1200c1210,1222
< view->details->scripts_directory = get_scripts_directory ();
< connect_script_handlers (view);
---
> scripts_directory = get_scripts_directory ();
>
> if (scripts_directory != NULL) {
> view->details->scripts_directory_list = g_list_append (view->details->scripts_directory_list,
> scripts_directory);
>
> scripts_directory_uri = nautilus_directory_get_uri (scripts_directory);
> view->details->scripts_uri_list = g_list_append (view->details->scripts_uri_list,
> scripts_directory_uri);
> view->details->scripts_directory_length = strlen (scripts_directory_uri);
>
> connect_script_handlers (view, scripts_directory);
> }
1299a1322
> GList *node1, *node2;
1317,1318c1340,1350
< disconnect_script_handlers (view);
< nautilus_directory_unref (view->details->scripts_directory);
---
> disconnect_scripts_directory_list (view);
>
> for (node1 = view->details->scripts_directory_list, node2 = view->details->scripts_uri_list;
> node1 != NULL;
> node1 = node1->next, node2 = node2->next) {
> nautilus_directory_unref (node1->data);
> g_free (node2->data);
> }
>
> g_list_free(view->details->scripts_directory_list);
> g_list_free(view->details->scripts_uri_list);
3179c3211,3228
< }
---
> }
>
> /* FIXME: Allow the icon to be set. */
> static void
> add_menu (BonoboUIComponent *ui,
> const char *parent_path,
> const char *label)
> {
> char *escaped_label;
>
> escaped_label = eel_str_double_underscores (label);
>
> nautilus_bonobo_add_submenu (ui,
> parent_path,
> escaped_label);
>
> g_free (escaped_label);
> }
3524c3573
< }
---
> }
3527,3529c3576,3580
< add_script_to_menus (FMDirectoryView *directory_view,
< NautilusFile *file,
< int index)
---
> add_script_to_script_menus (FMDirectoryView *directory_view,
> NautilusFile *file,
> int index,
> const char *menu_path,
> const char *popup_path)
3538c3589
<
---
>
3543,3544c3594,3595
< add_numbered_menu_item (directory_view->details->ui,
< FM_DIRECTORY_VIEW_MENU_PATH_SCRIPTS_PLACEHOLDER,
---
> add_numbered_menu_item (directory_view->details->ui,
> menu_path,
3556,3557c3607,3608
< add_numbered_menu_item (directory_view->details->ui,
< FM_DIRECTORY_VIEW_POPUP_PATH_SCRIPTS_PLACEHOLDER,
---
> add_numbered_menu_item (directory_view->details->ui,
> popup_path,
3571a3623,3740
> add_menu_to_script_menus (FMDirectoryView *directory_view,
> NautilusFile *file,
> const char *menu_path,
> const char *popup_path)
> {
> ScriptLaunchParameters *launch_parameters;
> char *tip;
> char *name;
> GdkPixbuf *pixbuf;
>
> name = nautilus_file_get_name (file);
> tip = g_strdup_printf (_("Run \"%s\" on any selected items"), name);
>
> launch_parameters = script_launch_parameters_new (file, directory_view);
> pixbuf = nautilus_icon_factory_get_pixbuf_for_file
> (file, NULL, NAUTILUS_ICON_SIZE_FOR_MENUS, TRUE);
>
> add_menu (directory_view->details->ui,
> menu_path,
> name);
>
> add_menu (directory_view->details->ui,
> popup_path,
> name);
>
> gdk_pixbuf_unref (pixbuf);
> g_free (name);
> g_free (tip);
> }
>
> static gboolean
> add_directory_to_scripts_directory_list (FMDirectoryView *view, NautilusFile *file)
> {
> char *uri;
> NautilusDirectory *directory;
> int num_levels;
> int i;
>
> uri = nautilus_file_get_uri (file);
>
> num_levels = 0;
> for (i = view->details->scripts_directory_length; uri[i] != '\0'; i++) {
> if (uri[i] == '/') {
> num_levels++;
> }
> }
>
> if (num_levels > MAX_MENU_LEVELS) {
> g_free (uri);
> return FALSE;
> }
>
> directory = nautilus_directory_get (uri);
>
> if (g_list_find(view->details->scripts_directory_list, directory) == NULL) {
> connect_script_handlers(view, directory);
>
> view->details->scripts_directory_list = g_list_append (view->details->scripts_directory_list,
> directory);
> view->details->scripts_uri_list = g_list_append (view->details->scripts_uri_list,
> uri);
> } else {
> nautilus_directory_unref(directory);
> g_free (uri);
> }
>
> return TRUE;
> }
>
> /**
> * clean_scripts_directory_list
> *
> * Verify that a given directory has not changed. If it has, remove references to
> * it from both scripts_directory_list and scripts_uri_list.
> * @view: FMDirectoryView of interest.
> * @directory: The directory that we are verifying.
> *
> * Return value: True if the directory was removed, false otherwise.
> *
> **/
> static gboolean
> clean_scripts_directory_list (FMDirectoryView *view, NautilusDirectory *directory)
> {
> GList *node1, *node2;
> char *uri;
>
> uri = nautilus_directory_get_uri (directory);
>
> for (node1 = view->details->scripts_directory_list, node2 = view->details->scripts_uri_list;
> node1 != NULL;
> node1 = node1->next, node2 = node2->next) {
> if (directory == node1->data) {
> if (strcmp(uri, node2->data) == 0) {
> g_free (uri);
> return FALSE;
> } else {
> view->details->scripts_directory_list = g_list_remove_link (view->details->scripts_directory_list, node1);
> view->details->scripts_uri_list = g_list_remove_link (view->details->scripts_uri_list, node2);
>
> disconnect_scripts_directory (view, node1->data);
> nautilus_directory_unref (node1->data);
> g_free (node2->data);
>
> g_list_free (node1);
> g_list_free (node2);
>
> g_free (uri);
> return TRUE;
> }
> }
> }
>
> /* This should never happen. */
> g_free (uri);
> return TRUE;
> }
>
> static void
3578,3582c3747,3769
<
< nautilus_bonobo_remove_menu_items_and_commands
< (view->details->ui, FM_DIRECTORY_VIEW_MENU_PATH_SCRIPTS_PLACEHOLDER);
< nautilus_bonobo_remove_menu_items_and_commands
< (view->details->ui, FM_DIRECTORY_VIEW_POPUP_PATH_SCRIPTS_PLACEHOLDER);
---
> char *parent_path;
> char *menu_path, *popup_path;
>
> if (all_files == NULL) {
> view->details->scripts_invalid = FALSE;
> return;
> }
>
> parent_path = nautilus_file_get_parent_uri (all_files->data);
>
> menu_path = g_strdup_printf ("%s%s", FM_DIRECTORY_VIEW_MENU_PATH_SCRIPTS_PLACEHOLDER,
> parent_path + view->details->scripts_directory_length);
> popup_path = g_strdup_printf ("%s%s", FM_DIRECTORY_VIEW_POPUP_PATH_SCRIPTS_PLACEHOLDER,
> parent_path + view->details->scripts_directory_length);
>
> /* We rebuild the entire scripts menu each time so we only need to remove the
> top level menu since it contains all other menus and is rebuilt first. */
> if (strcmp(parent_path, view->details->scripts_uri_list->data) == 0) {
> nautilus_bonobo_remove_menu_items_and_commands (view->details->ui, menu_path);
> nautilus_bonobo_remove_menu_items_and_commands (view->details->ui, popup_path);
> }
>
> g_free (parent_path);
3591c3778
< add_script_to_menus (view, file, index);
---
> add_script_to_script_menus (view, file, index, menu_path, popup_path);
3592a3780,3784
> } else if (nautilus_file_is_directory (file)) {
> if (add_directory_to_scripts_directory_list (view, file)) {
> add_menu_to_script_menus (view, file, menu_path, popup_path);
> any_scripts = TRUE;
> }
3595a3788,3790
> g_free (popup_path);
> g_free (menu_path);
>
3616c3811
< g_assert (view->details->scripts_directory == directory);
---
> g_assert (g_list_find (view->details->scripts_directory_list, directory) != NULL);
3625a3821
> GList *node, *next_node;
3627c3823
< if (view->details->scripts_directory == NULL) {
---
> if (view->details->scripts_directory_list == NULL) {
3631,3633c3827,3831
< nautilus_directory_cancel_callback (view->details->scripts_directory,
< scripts_directory_callback,
< view);
---
> for (node = view->details->scripts_directory_list; node != NULL; node = node->next) {
> nautilus_directory_cancel_callback (node->data,
> scripts_directory_callback,
> view);
> }
3639,3642c3837,3854
< nautilus_directory_call_when_ready (view->details->scripts_directory,
< attributes,
< scripts_directory_callback,
< view);
---
>
> node = view->details->scripts_directory_list;
> while (node != NULL) {
>
> /* It is important that we remember the next link in the list because
> clean_scripts_directory_list() may remove links from underneath us. */
> next_node = node->next;
>
> if (!clean_scripts_directory_list (view, node->data)) {
> nautilus_directory_call_when_ready (node->data,
> attributes,
> scripts_directory_callback,
> view);
> }
>
> node = next_node;
> }
>
3662,3663c3874,3875
< if (view->details->scripts_directory != NULL) {
< uri = nautilus_directory_get_uri (view->details->scripts_directory);
---
> if (view->details->scripts_directory_list != NULL) {
> uri = nautilus_directory_get_uri (view->details->scripts_directory_list->data);
4895c5107
< disconnect_scripts_directory_handler (FMDirectoryView *view, int *id)
---
> disconnect_scripts_directory (FMDirectoryView *view, NautilusDirectory *directory)
4897c5109,5117
< disconnect_handler (GTK_OBJECT (view->details->scripts_directory), id);
---
> gtk_signal_disconnect_by_func (GTK_OBJECT (directory),
> scripts_added_or_changed_callback,
> view);
>
> nautilus_directory_file_monitor_remove (directory, &view->details->scripts_directory_list);
>
> nautilus_directory_cancel_callback (directory,
> reset_scripts_menu_callback,
> view);
4930c5150
< disconnect_script_handlers (FMDirectoryView *view)
---
> disconnect_scripts_directory_list (FMDirectoryView *view)
4932,4940c5152
< if (view->details->scripts_directory == NULL) {
< return;
< }
<
< disconnect_scripts_directory_handler (view, &view->details->scripts_added_handler_id);
< disconnect_scripts_directory_handler (view, &view->details->scripts_changed_handler_id);
<
< nautilus_directory_file_monitor_remove (view->details->scripts_directory,
< &view->details->scripts_directory);
---
> GList *node;
4942,4944c5154,5156
< nautilus_directory_cancel_callback (view->details->scripts_directory,
< reset_scripts_menu_callback,
< view);
---
> for (node = view->details->scripts_directory_list; node != NULL; node = node->next) {
> disconnect_scripts_directory (view, node->data);
> }
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]