diff --git a/shared/shell/src/trevwbeh.c b/shared/shell/src/trevwbeh.c index 6a1a305..7b500c7 100644 --- a/shared/shell/src/trevwbeh.c +++ b/shared/shell/src/trevwbeh.c @@ -39,6 +39,11 @@ static void wintc_sh_tree_view_behaviour_set_property( GParamSpec* pspec ); +static void wintc_sh_tree_view_behaviour_node_add_items( + WinTCShTreeViewBehaviour* behaviour, + GtkTreeIter* node, + GList* items +); static void wintc_sh_tree_view_behaviour_update_view( WinTCShTreeViewBehaviour* behaviour, WinTCShBrowser* browser @@ -315,6 +320,98 @@ WinTCShTreeViewBehaviour* wintc_sh_tree_view_behaviour_new( // // PRIVATE FUNCTIONS // +static void wintc_sh_tree_view_behaviour_node_add_items( + WinTCShTreeViewBehaviour* behaviour, + GtkTreeIter* node, + GList* items +) +{ + GtkTreeIter child; + WinTCShextViewItem* view_item; + + WinTCIShextView* view = NULL; + + gtk_tree_model_get( + GTK_TREE_MODEL(behaviour->tree_model), + node, + COLUMN_MAPPED_VIEW, &view, + -1 + ); + + for (GList* iter = items; iter; iter = iter->next) + { + view_item = iter->data; + + // Skip leaf nodes and nodes that already exist + // + if ( + view_item->is_leaf || + g_hash_table_contains( + behaviour->map_hash_to_row, + GUINT_TO_POINTER(view_item->hash) + ) + ) + { + continue; + } + + WINTC_LOG_DEBUG( + "shell: tree adding item %p", + GUINT_TO_POINTER(view_item->hash) + ); + + // Sort into model + // + GCompareFunc sort_func = wintc_ishext_view_get_sort_func(view); + + gint item_pos = + wintc_tree_model_get_insertion_sort_pos( + GTK_TREE_MODEL(behaviour->tree_model), + node, + COLUMN_VIEW_HASH, + G_TYPE_UINT, + sort_func, + GUINT_TO_POINTER(view_item->hash) + ); + + // Push to model + // + gtk_tree_store_insert( + behaviour->tree_model, + &child, + node, + item_pos + ); + gtk_tree_store_set( + behaviour->tree_model, + &child, + COLUMN_ICON_NAME, view_item->icon_name, + COLUMN_ENTRY_NAME, view_item->display_name, + COLUMN_VIEW_HASH, view_item->hash, + -1 + ); + + // Map hash-->row + // + GtkTreePath* tree_path = + gtk_tree_model_get_path( + GTK_TREE_MODEL(behaviour->tree_model), + &child + ); + + g_hash_table_insert( + behaviour->map_hash_to_row, + GUINT_TO_POINTER(view_item->hash), + gtk_tree_row_reference_new( + GTK_TREE_MODEL(behaviour->tree_model), + tree_path + ) + ); + + gtk_tree_path_free(tree_path); + } +} + static void wintc_sh_tree_view_behaviour_update_view( WinTCShTreeViewBehaviour* behaviour, WinTCShBrowser* browser @@ -607,7 +704,18 @@ static void wintc_sh_tree_view_behaviour_update_view( G_CONNECT_DEFAULT ); - wintc_ishext_view_refresh_items(view); + // Add the items now - if this is a totally new view this'll just + // trigger a refresh and the signals will deal with it + // + GList* items = wintc_ishext_view_get_items(view); + + wintc_sh_tree_view_behaviour_node_add_items( + behaviour, + &last, + items + ); + + g_list_free(items); } // Delete the view if needed @@ -666,7 +774,7 @@ static void on_browser_load_changed( WinTCShTreeViewBehaviour* behaviour = WINTC_SH_TREE_VIEW_BEHAVIOUR(user_data); - if (load_event != WINTC_SH_BROWSER_LOAD_STARTED) + if (load_event != WINTC_SH_BROWSER_LOAD_FINISHED) { return; } @@ -683,9 +791,6 @@ static void on_view_items_added( WinTCShTreeViewBehaviour* behaviour = WINTC_SH_TREE_VIEW_BEHAVIOUR(user_data); - GtkTreeIter parent; - GtkTreeIter child; - WINTC_LOG_DEBUG( "shell: tree - items added to %p", GUINT_TO_POINTER(wintc_ishext_view_get_unique_hash(view)) @@ -693,6 +798,7 @@ static void on_view_items_added( // Locate the parent node // + GtkTreeIter parent; GtkTreeRowReference* row_ref; GtkTreePath* tree_path; @@ -718,82 +824,13 @@ static void on_view_items_added( gtk_tree_path_free(tree_path); - // Iterate over the items to append to the tree + // Append the items to the node now // - WinTCShextViewItem* view_item; - - for (GList* iter = update->data; iter; iter = iter->next) - { - view_item = iter->data; - - // Skip leaf nodes and nodes that already exist - // - if ( - view_item->is_leaf || - g_hash_table_contains( - behaviour->map_hash_to_row, - GUINT_TO_POINTER(view_item->hash) - ) - ) - { - continue; - } - - WINTC_LOG_DEBUG( - "shell: tree adding item %p", - GUINT_TO_POINTER(view_item->hash) - ); - - // Sort into model - // - GCompareFunc sort_func = wintc_ishext_view_get_sort_func(view); - - gint item_pos = - wintc_tree_model_get_insertion_sort_pos( - GTK_TREE_MODEL(behaviour->tree_model), - &parent, - COLUMN_VIEW_HASH, - G_TYPE_UINT, - sort_func, - GUINT_TO_POINTER(view_item->hash) - ); - - // Push to model - // - gtk_tree_store_insert( - behaviour->tree_model, - &child, - &parent, - item_pos - ); - gtk_tree_store_set( - behaviour->tree_model, - &child, - COLUMN_ICON_NAME, view_item->icon_name, - COLUMN_ENTRY_NAME, view_item->display_name, - COLUMN_VIEW_HASH, view_item->hash, - -1 - ); - - // Map hash-->row - // - GtkTreePath* tree_path = - gtk_tree_model_get_path( - GTK_TREE_MODEL(behaviour->tree_model), - &child - ); - - g_hash_table_insert( - behaviour->map_hash_to_row, - GUINT_TO_POINTER(view_item->hash), - gtk_tree_row_reference_new( - GTK_TREE_MODEL(behaviour->tree_model), - tree_path - ) - ); - - gtk_tree_path_free(tree_path); - } + wintc_sh_tree_view_behaviour_node_add_items( + behaviour, + &parent, + update->data + ); } static void on_view_items_removed( diff --git a/shared/shell/src/vwcpl.c b/shared/shell/src/vwcpl.c index fb6e397..569afe3 100644 --- a/shared/shell/src/vwcpl.c +++ b/shared/shell/src/vwcpl.c @@ -49,6 +49,9 @@ static const gchar* wintc_sh_view_cpl_get_display_name( static const gchar* wintc_sh_view_cpl_get_icon_name( WinTCIShextView* view ); +static GList* wintc_sh_view_cpl_get_items( + WinTCIShextView* view +); static GMenuModel* wintc_sh_view_cpl_get_operations_for_item( WinTCIShextView* view, guint item_hash @@ -144,6 +147,7 @@ static void wintc_sh_view_cpl_ishext_view_interface_init( iface->compare_items = wintc_sh_view_cpl_compare_items; iface->get_display_name = wintc_sh_view_cpl_get_display_name; iface->get_icon_name = wintc_sh_view_cpl_get_icon_name; + iface->get_items = wintc_sh_view_cpl_get_items; iface->get_operations_for_item = wintc_sh_view_cpl_get_operations_for_item; iface->get_operations_for_view = wintc_sh_view_cpl_get_operations_for_view; iface->get_parent_path = wintc_sh_view_cpl_get_parent_path; @@ -262,6 +266,15 @@ static const gchar* wintc_sh_view_cpl_get_icon_name( return "preferences-other"; } +static GList* wintc_sh_view_cpl_get_items( + WinTCIShextView* view +) +{ + WinTCShViewCpl* view_cpl = WINTC_SH_VIEW_CPL(view); + + return g_hash_table_get_values(view_cpl->map_items); +} + static GMenuModel* wintc_sh_view_cpl_get_operations_for_item( WINTC_UNUSED(WinTCIShextView* view), WINTC_UNUSED(guint item_hash) diff --git a/shared/shell/src/vwdesk.c b/shared/shell/src/vwdesk.c index f7d7bc4..c498fff 100644 --- a/shared/shell/src/vwdesk.c +++ b/shared/shell/src/vwdesk.c @@ -90,6 +90,9 @@ static const gchar* wintc_sh_view_desktop_get_display_name( static const gchar* wintc_sh_view_desktop_get_icon_name( WinTCIShextView* view ); +static GList* wintc_sh_view_desktop_get_items( + WinTCIShextView* view +); static GMenuModel* wintc_sh_view_desktop_get_operations_for_item( WinTCIShextView* view, guint item_hash @@ -209,6 +212,7 @@ static void wintc_sh_view_desktop_ishext_view_interface_init( iface->compare_items = wintc_sh_view_desktop_compare_items; iface->get_display_name = wintc_sh_view_desktop_get_display_name; iface->get_icon_name = wintc_sh_view_desktop_get_icon_name; + iface->get_items = wintc_sh_view_desktop_get_items; iface->get_operations_for_item = wintc_sh_view_desktop_get_operations_for_item; iface->get_operations_for_view = @@ -303,6 +307,13 @@ static const gchar* wintc_sh_view_desktop_get_icon_name( return "user-desktop"; } +static GList* wintc_sh_view_desktop_get_items( + WINTC_UNUSED(WinTCIShextView* view) +) +{ + return g_hash_table_get_values(s_desktop_map); +} + static GMenuModel* wintc_sh_view_desktop_get_operations_for_item( WINTC_UNUSED(WinTCIShextView* view), WINTC_UNUSED(guint item_hash) diff --git a/shared/shell/src/vwdrives.c b/shared/shell/src/vwdrives.c index c15bd83..45de3ed 100644 --- a/shared/shell/src/vwdrives.c +++ b/shared/shell/src/vwdrives.c @@ -73,6 +73,9 @@ static const gchar* wintc_sh_view_drives_get_display_name( static const gchar* wintc_sh_view_drives_get_icon_name( WinTCIShextView* view ); +static GList* wintc_sh_view_drives_get_items( + WinTCIShextView* view +); static GMenuModel* wintc_sh_view_drives_get_operations_for_item( WinTCIShextView* view, guint item_hash @@ -183,6 +186,7 @@ static void wintc_sh_view_drives_ishext_view_interface_init( iface->compare_items = wintc_sh_view_drives_compare_items; iface->get_display_name = wintc_sh_view_drives_get_display_name; iface->get_icon_name = wintc_sh_view_drives_get_icon_name; + iface->get_items = wintc_sh_view_drives_get_items; iface->get_operations_for_item = wintc_sh_view_drives_get_operations_for_item; iface->get_operations_for_view = @@ -274,6 +278,13 @@ static const gchar* wintc_sh_view_drives_get_icon_name( return "computer"; } +static GList* wintc_sh_view_drives_get_items( + WINTC_UNUSED(WinTCIShextView* view) +) +{ + return g_hash_table_get_values(s_drives_map); +} + static GMenuModel* wintc_sh_view_drives_get_operations_for_item( WINTC_UNUSED(WinTCIShextView* view), WINTC_UNUSED(guint item_hash) diff --git a/shared/shell/src/vwfs.c b/shared/shell/src/vwfs.c index 49df9d4..dd56171 100644 --- a/shared/shell/src/vwfs.c +++ b/shared/shell/src/vwfs.c @@ -80,6 +80,9 @@ static const gchar* wintc_sh_view_fs_get_display_name( static const gchar* wintc_sh_view_fs_get_icon_name( WinTCIShextView* view ); +static GList* wintc_sh_view_fs_get_items( + WinTCIShextView* view +); static GMenuModel* wintc_sh_view_fs_get_operations_for_item( WinTCIShextView* view, guint item_hash @@ -195,8 +198,9 @@ struct _WinTCShViewFS // FS state // - gchar* parent_path; - gchar* path; + gboolean is_new; // Track if this view has ever been refreshed before + gchar* parent_path; + gchar* path; GFileMonitor* fs_monitor; GHashTable* fs_map_entries; @@ -266,6 +270,7 @@ static void wintc_sh_view_fs_init( WinTCShViewFS* self ) { + self->is_new = TRUE; self->fs_clipboard = wintc_sh_fs_clipboard_new(); } @@ -277,6 +282,7 @@ static void wintc_sh_view_fs_ishext_view_interface_init( iface->compare_items = wintc_sh_view_fs_compare_items; iface->get_display_name = wintc_sh_view_fs_get_display_name; iface->get_icon_name = wintc_sh_view_fs_get_icon_name; + iface->get_items = wintc_sh_view_fs_get_items; iface->get_operations_for_item = wintc_sh_view_fs_get_operations_for_item; iface->get_operations_for_view = wintc_sh_view_fs_get_operations_for_view; iface->get_parent_path = wintc_sh_view_fs_get_parent_path; @@ -476,12 +482,34 @@ static const gchar* wintc_sh_view_fs_get_display_name( } static const gchar* wintc_sh_view_fs_get_icon_name( - WINTC_UNUSED(WinTCIShextView* view) + WinTCIShextView* view ) { + WinTCShViewFS* view_fs = WINTC_SH_VIEW_FS(view); + + if (g_strcmp0(view_fs->path, "/") == 0) + { + return "drive-harddisk"; + } + return "inode-directory"; } +static GList* wintc_sh_view_fs_get_items( + WinTCIShextView* view +) +{ + WinTCShViewFS* view_fs = WINTC_SH_VIEW_FS(view); + + if (view_fs->is_new) + { + wintc_sh_view_fs_refresh_items(view); + return NULL; + } + + return g_hash_table_get_values(view_fs->fs_map_entries); +} + static GMenuModel* wintc_sh_view_fs_get_operations_for_item( WinTCIShextView* view, guint item_hash @@ -665,6 +693,8 @@ static void wintc_sh_view_fs_refresh_items( WINTC_LOG_DEBUG("%s", "shell: refresh fs view"); + view_fs->is_new = FALSE; + _wintc_ishext_view_refreshing(view); if (view_fs->fs_map_entries) diff --git a/shared/shellext/public/if_view.h b/shared/shellext/public/if_view.h index 995967c..524cef8 100644 --- a/shared/shellext/public/if_view.h +++ b/shared/shellext/public/if_view.h @@ -53,6 +53,9 @@ struct _WinTCIShextViewInterface const gchar* (*get_icon_name) ( WinTCIShextView* view ); + GList* (*get_items) ( + WinTCIShextView* view + ); GMenuModel* (*get_operations_for_item) ( WinTCIShextView* view, guint item_hash @@ -112,6 +115,9 @@ const gchar* wintc_ishext_view_get_display_name( const gchar* wintc_ishext_view_get_icon_name( WinTCIShextView* view ); +GList* wintc_ishext_view_get_items( + WinTCIShextView* view +); GMenuModel* wintc_ishext_view_get_operations_for_item( WinTCIShextView* view, guint item_hash diff --git a/shared/shellext/src/if_view.c b/shared/shellext/src/if_view.c index 4b62fd1..b76fa75 100644 --- a/shared/shellext/src/if_view.c +++ b/shared/shellext/src/if_view.c @@ -139,6 +139,16 @@ const gchar* wintc_ishext_view_get_icon_name( return iface->get_icon_name(view); } +GList* wintc_ishext_view_get_items( + WinTCIShextView* view +) +{ + WinTCIShextViewInterface* iface = + WINTC_ISHEXT_VIEW_GET_IFACE(view); + + return iface->get_items(view); +} + GMenuModel* wintc_ishext_view_get_operations_for_item( WinTCIShextView* view, guint item_hash