diff -r cc42fad3fe31 -r 2947214c450e app-manager/app-manager.c --- a/app-manager/app-manager.c Tue Jun 29 10:08:33 2021 +0100 +++ b/app-manager/app-manager.c Tue Apr 25 17:41:00 2023 +0100 @@ -32,6 +32,7 @@ #include #include "app-manager.h" #include "localmedia.h" +#include "localdistributions.h" LUALIB_API int luaopen_posix(lua_State *L); @@ -302,6 +303,17 @@ #ifdef WIN32 prefix=g_win32_get_package_installation_directory_of_module(NULL); #endif + if (prefix) + { + /* + * Note that this won't generally work if the application is stored + * on a removable device. If you need the logfile, copy it to the + * harddisk first. + */ + s=g_strconcat(prefix,"/var/log/init",NULL); + plover_log_open(s); + g_free(s); + } install_icons(); ui=gtk_builder_new(); if (!g_file_get_contents("app-manager.ui",&contents,&len,&err) && @@ -384,15 +396,21 @@ w=GTK_WIDGET(gtk_builder_get_object(ui,"ViewFiles")); gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w),TRUE); } + g_clear_object(&set); applications=plover_applications_model_new(installed); set_package_model(applications); w=GTK_WIDGET(gtk_builder_get_object(ui,"MainWindow")); + if (prefix) + { + s=g_strconcat(prefix,"/var/log/interactive",NULL); + plover_log_open(s); + g_free(s); + } gtk_widget_show(w); started=TRUE; } if (started) gtk_main(); - g_clear_object(&set); objects=gtk_builder_get_objects(ui); for(lnk=objects;lnk;lnk=lnk->next) if (GTK_IS_WIDGET(lnk->data) && @@ -454,6 +472,108 @@ set_package_model(location); } +gboolean open_database(const char *uri,const char *destination,GError **err) +{ + gboolean retval; + GSList *sets,*lnk; + GtkWidget *w; + PloverPackageSet *set; + if (!g_strcmp0(uri,razor_get_database_uri())) + return TRUE; + if (relocations) + { + razor_relocations_destroy(relocations); + relocations=NULL; + } + razor_set_database_uri(uri); + if (destination) + { + relocations=razor_relocations_create(); + razor_relocations_add(relocations,"/usr",destination); + } + sets=plover_package_store_get_sets(PLOVER_PACKAGE_STORE(installed)); + sets=g_slist_copy(sets); + for(lnk=sets;lnk;lnk=lnk->next) + { + set=lnk->data; + plover_package_store_remove_set(PLOVER_PACKAGE_STORE(installed),set); + } + g_slist_free(sets); + set=plover_package_set_new(); + retval=plover_package_set_open(set,"",TRUE,err); + plover_package_store_add_set(PLOVER_PACKAGE_STORE(installed),set); + g_object_unref(set); + w=GTK_WIDGET(gtk_builder_get_object(ui,"ViewFiles")); + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w), + !!plover_package_set_get_no_details(set)); + return retval; +} + +G_MODULE_EXPORT void on_open_database(GtkWidget *widget) +{ + gboolean have_local_distributions; + const char *database_uri; + gchar *uri,*s; + GList *cells; + GtkWidget *w,*radio_global,*radio_local,*combo,*dialog; + GtkCellRenderer *cell; + GtkTreeModel *local; + GtkTreeIter iter; + dialog=GTK_WIDGET(gtk_builder_get_object(ui,"OpenDatabase")); + local=GTK_TREE_MODEL(plover_local_distributions_new()); + have_local_distributions=!!gtk_tree_model_iter_n_children(local,NULL); + radio_global=GTK_WIDGET(gtk_builder_get_object(ui,"distribution_global")); + radio_local=GTK_WIDGET(gtk_builder_get_object(ui,"distribution_local")); + gtk_widget_set_sensitive(radio_local,have_local_distributions); + w=GTK_WIDGET(gtk_builder_get_object(ui,"local_databases_label")); + gtk_widget_set_sensitive(w,have_local_distributions); + combo=GTK_WIDGET(gtk_builder_get_object(ui,"local_databases")); + gtk_combo_box_set_model(GTK_COMBO_BOX(combo),local); + gtk_widget_set_sensitive(w,have_local_distributions); + database_uri=razor_get_database_uri(); + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo),NULL); + if (gtk_tree_model_get_iter_first(local,&iter)) + do + { + gtk_tree_model_get(local,&iter, + PLOVER_LOCAL_DISTRIBUTIONS_DATABASE_URI_COLUMN,&s,-1); + if (!g_strcmp0(s,database_uri)) + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo),&iter); + g_free(s); + } while(gtk_tree_model_iter_next(local,&iter)); + if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo),&iter)) + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_local),TRUE); + else + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_global),TRUE); + cells=gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(combo)); + if (cells) + g_list_free(cells); + else + { + cell=gtk_cell_renderer_text_new(); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo),cell,TRUE); + gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(combo),cell,"text", + PLOVER_LOCAL_DISTRIBUTIONS_USER_FRIENDLY_COLUMN); + } + if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) + { + show_busy_cursor(TRUE); + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_global))) + open_database(NULL,prefix,NULL); + else if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo),&iter)) + { + gtk_tree_model_get(local,&iter, + PLOVER_LOCAL_DISTRIBUTIONS_DATABASE_URI_COLUMN,&uri, + PLOVER_LOCAL_DISTRIBUTIONS_PREFIX_COLUMN,&s,-1); + open_database(uri,s,NULL); + g_free(uri); + g_free(s); + } + show_busy_cursor(FALSE); + } + gtk_widget_hide(dialog); +} + G_MODULE_EXPORT void on_open_location(GtkWidget *widget) { GtkWidget *w=GTK_WIDGET(gtk_builder_get_object(ui,"MainWindow")); @@ -546,6 +666,86 @@ show_busy_cursor(FALSE); } +G_MODULE_EXPORT void on_open_archive(GtkWidget *widget) +{ + GtkWidget *w=GTK_WIDGET(gtk_builder_get_object(ui,"MainWindow")); + GtkWidget *dialog; + GFile *file,*parent; + GFileInfo *fi; + GMount *mount; + gchar *path,*name; + PloverPackageSet *set; + GSList *sets; + GError *err=NULL; + dialog=gtk_file_chooser_dialog_new("Open Achive",GTK_WINDOW(w), + GTK_FILE_CHOOSER_ACTION_OPEN,GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL,GTK_STOCK_OPEN,GTK_RESPONSE_ACCEPT,NULL); + if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT) + { + show_busy_cursor(TRUE); + path=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog)); + set=plover_package_set_new_from_yum(path,relocations,&err); + if (set) + { + if (!location) + location=GTK_TREE_MODEL(plover_package_store_new()); + while((sets= + plover_package_store_get_sets(PLOVER_PACKAGE_STORE(location)))) + plover_package_store_remove_set(PLOVER_PACKAGE_STORE(location), + PLOVER_PACKAGE_SET(sets->data)); + plover_package_store_add_set(PLOVER_PACKAGE_STORE(location),set); + g_object_unref(set); + w=GTK_WIDGET(gtk_builder_get_object(ui,"LocationButton")); + file=g_file_new_for_path(path); + parent=g_file_get_parent(file); + if (parent) + { + g_object_unref(parent); + mount=NULL; + } + else + mount=g_file_find_enclosing_mount(file,NULL,NULL); + if (mount) + { + name=g_mount_get_name(mount); + g_object_unref(mount); + } + else + { + fi=g_file_query_info(file, + G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME, + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,NULL,NULL); + if (fi) + { + name=g_strdup(g_file_info_get_display_name(fi)); + g_object_unref(fi); + } + else + name=g_filename_display_basename(path); + g_object_unref(file); + } + gtk_tool_button_set_label(GTK_TOOL_BUTTON(w),name); + g_free(name); + gtk_widget_show(w); + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(w),TRUE); + } + else + { + gtk_widget_destroy(dialog); + dialog=gtk_message_dialog_new(GTK_WINDOW(w), + GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE,"Error loading repository '%s'",path); + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog), + "%s",err->message); + gtk_dialog_run(GTK_DIALOG(dialog)); + g_error_free(err); + } + g_free(path); + show_busy_cursor(FALSE); + } + gtk_widget_destroy(dialog); +} + G_MODULE_EXPORT void on_help_about(GtkWidget *widget) { GtkWidget *w=GTK_WIDGET(gtk_builder_get_object(ui,"MainWindow"));