1.1 --- a/app-manager/app-manager.c Tue Jun 29 10:08:33 2021 +0100
1.2 +++ b/app-manager/app-manager.c Tue Apr 25 17:41:00 2023 +0100
1.3 @@ -32,6 +32,7 @@
1.4 #include <plover-gtk/stockicons.h>
1.5 #include "app-manager.h"
1.6 #include "localmedia.h"
1.7 +#include "localdistributions.h"
1.8
1.9 LUALIB_API int luaopen_posix(lua_State *L);
1.10
1.11 @@ -302,6 +303,17 @@
1.12 #ifdef WIN32
1.13 prefix=g_win32_get_package_installation_directory_of_module(NULL);
1.14 #endif
1.15 + if (prefix)
1.16 + {
1.17 + /*
1.18 + * Note that this won't generally work if the application is stored
1.19 + * on a removable device. If you need the logfile, copy it to the
1.20 + * harddisk first.
1.21 + */
1.22 + s=g_strconcat(prefix,"/var/log/init",NULL);
1.23 + plover_log_open(s);
1.24 + g_free(s);
1.25 + }
1.26 install_icons();
1.27 ui=gtk_builder_new();
1.28 if (!g_file_get_contents("app-manager.ui",&contents,&len,&err) &&
1.29 @@ -384,15 +396,21 @@
1.30 w=GTK_WIDGET(gtk_builder_get_object(ui,"ViewFiles"));
1.31 gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w),TRUE);
1.32 }
1.33 + g_clear_object(&set);
1.34 applications=plover_applications_model_new(installed);
1.35 set_package_model(applications);
1.36 w=GTK_WIDGET(gtk_builder_get_object(ui,"MainWindow"));
1.37 + if (prefix)
1.38 + {
1.39 + s=g_strconcat(prefix,"/var/log/interactive",NULL);
1.40 + plover_log_open(s);
1.41 + g_free(s);
1.42 + }
1.43 gtk_widget_show(w);
1.44 started=TRUE;
1.45 }
1.46 if (started)
1.47 gtk_main();
1.48 - g_clear_object(&set);
1.49 objects=gtk_builder_get_objects(ui);
1.50 for(lnk=objects;lnk;lnk=lnk->next)
1.51 if (GTK_IS_WIDGET(lnk->data) &&
1.52 @@ -454,6 +472,108 @@
1.53 set_package_model(location);
1.54 }
1.55
1.56 +gboolean open_database(const char *uri,const char *destination,GError **err)
1.57 +{
1.58 + gboolean retval;
1.59 + GSList *sets,*lnk;
1.60 + GtkWidget *w;
1.61 + PloverPackageSet *set;
1.62 + if (!g_strcmp0(uri,razor_get_database_uri()))
1.63 + return TRUE;
1.64 + if (relocations)
1.65 + {
1.66 + razor_relocations_destroy(relocations);
1.67 + relocations=NULL;
1.68 + }
1.69 + razor_set_database_uri(uri);
1.70 + if (destination)
1.71 + {
1.72 + relocations=razor_relocations_create();
1.73 + razor_relocations_add(relocations,"/usr",destination);
1.74 + }
1.75 + sets=plover_package_store_get_sets(PLOVER_PACKAGE_STORE(installed));
1.76 + sets=g_slist_copy(sets);
1.77 + for(lnk=sets;lnk;lnk=lnk->next)
1.78 + {
1.79 + set=lnk->data;
1.80 + plover_package_store_remove_set(PLOVER_PACKAGE_STORE(installed),set);
1.81 + }
1.82 + g_slist_free(sets);
1.83 + set=plover_package_set_new();
1.84 + retval=plover_package_set_open(set,"",TRUE,err);
1.85 + plover_package_store_add_set(PLOVER_PACKAGE_STORE(installed),set);
1.86 + g_object_unref(set);
1.87 + w=GTK_WIDGET(gtk_builder_get_object(ui,"ViewFiles"));
1.88 + gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(w),
1.89 + !!plover_package_set_get_no_details(set));
1.90 + return retval;
1.91 +}
1.92 +
1.93 +G_MODULE_EXPORT void on_open_database(GtkWidget *widget)
1.94 +{
1.95 + gboolean have_local_distributions;
1.96 + const char *database_uri;
1.97 + gchar *uri,*s;
1.98 + GList *cells;
1.99 + GtkWidget *w,*radio_global,*radio_local,*combo,*dialog;
1.100 + GtkCellRenderer *cell;
1.101 + GtkTreeModel *local;
1.102 + GtkTreeIter iter;
1.103 + dialog=GTK_WIDGET(gtk_builder_get_object(ui,"OpenDatabase"));
1.104 + local=GTK_TREE_MODEL(plover_local_distributions_new());
1.105 + have_local_distributions=!!gtk_tree_model_iter_n_children(local,NULL);
1.106 + radio_global=GTK_WIDGET(gtk_builder_get_object(ui,"distribution_global"));
1.107 + radio_local=GTK_WIDGET(gtk_builder_get_object(ui,"distribution_local"));
1.108 + gtk_widget_set_sensitive(radio_local,have_local_distributions);
1.109 + w=GTK_WIDGET(gtk_builder_get_object(ui,"local_databases_label"));
1.110 + gtk_widget_set_sensitive(w,have_local_distributions);
1.111 + combo=GTK_WIDGET(gtk_builder_get_object(ui,"local_databases"));
1.112 + gtk_combo_box_set_model(GTK_COMBO_BOX(combo),local);
1.113 + gtk_widget_set_sensitive(w,have_local_distributions);
1.114 + database_uri=razor_get_database_uri();
1.115 + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo),NULL);
1.116 + if (gtk_tree_model_get_iter_first(local,&iter))
1.117 + do
1.118 + {
1.119 + gtk_tree_model_get(local,&iter,
1.120 + PLOVER_LOCAL_DISTRIBUTIONS_DATABASE_URI_COLUMN,&s,-1);
1.121 + if (!g_strcmp0(s,database_uri))
1.122 + gtk_combo_box_set_active_iter(GTK_COMBO_BOX(combo),&iter);
1.123 + g_free(s);
1.124 + } while(gtk_tree_model_iter_next(local,&iter));
1.125 + if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo),&iter))
1.126 + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_local),TRUE);
1.127 + else
1.128 + gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(radio_global),TRUE);
1.129 + cells=gtk_cell_layout_get_cells(GTK_CELL_LAYOUT(combo));
1.130 + if (cells)
1.131 + g_list_free(cells);
1.132 + else
1.133 + {
1.134 + cell=gtk_cell_renderer_text_new();
1.135 + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combo),cell,TRUE);
1.136 + gtk_cell_layout_add_attribute(GTK_CELL_LAYOUT(combo),cell,"text",
1.137 + PLOVER_LOCAL_DISTRIBUTIONS_USER_FRIENDLY_COLUMN);
1.138 + }
1.139 + if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT)
1.140 + {
1.141 + show_busy_cursor(TRUE);
1.142 + if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio_global)))
1.143 + open_database(NULL,prefix,NULL);
1.144 + else if (gtk_combo_box_get_active_iter(GTK_COMBO_BOX(combo),&iter))
1.145 + {
1.146 + gtk_tree_model_get(local,&iter,
1.147 + PLOVER_LOCAL_DISTRIBUTIONS_DATABASE_URI_COLUMN,&uri,
1.148 + PLOVER_LOCAL_DISTRIBUTIONS_PREFIX_COLUMN,&s,-1);
1.149 + open_database(uri,s,NULL);
1.150 + g_free(uri);
1.151 + g_free(s);
1.152 + }
1.153 + show_busy_cursor(FALSE);
1.154 + }
1.155 + gtk_widget_hide(dialog);
1.156 +}
1.157 +
1.158 G_MODULE_EXPORT void on_open_location(GtkWidget *widget)
1.159 {
1.160 GtkWidget *w=GTK_WIDGET(gtk_builder_get_object(ui,"MainWindow"));
1.161 @@ -546,6 +666,86 @@
1.162 show_busy_cursor(FALSE);
1.163 }
1.164
1.165 +G_MODULE_EXPORT void on_open_archive(GtkWidget *widget)
1.166 +{
1.167 + GtkWidget *w=GTK_WIDGET(gtk_builder_get_object(ui,"MainWindow"));
1.168 + GtkWidget *dialog;
1.169 + GFile *file,*parent;
1.170 + GFileInfo *fi;
1.171 + GMount *mount;
1.172 + gchar *path,*name;
1.173 + PloverPackageSet *set;
1.174 + GSList *sets;
1.175 + GError *err=NULL;
1.176 + dialog=gtk_file_chooser_dialog_new("Open Achive",GTK_WINDOW(w),
1.177 + GTK_FILE_CHOOSER_ACTION_OPEN,GTK_STOCK_CANCEL,
1.178 + GTK_RESPONSE_CANCEL,GTK_STOCK_OPEN,GTK_RESPONSE_ACCEPT,NULL);
1.179 + if (gtk_dialog_run(GTK_DIALOG(dialog))==GTK_RESPONSE_ACCEPT)
1.180 + {
1.181 + show_busy_cursor(TRUE);
1.182 + path=gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog));
1.183 + set=plover_package_set_new_from_yum(path,relocations,&err);
1.184 + if (set)
1.185 + {
1.186 + if (!location)
1.187 + location=GTK_TREE_MODEL(plover_package_store_new());
1.188 + while((sets=
1.189 + plover_package_store_get_sets(PLOVER_PACKAGE_STORE(location))))
1.190 + plover_package_store_remove_set(PLOVER_PACKAGE_STORE(location),
1.191 + PLOVER_PACKAGE_SET(sets->data));
1.192 + plover_package_store_add_set(PLOVER_PACKAGE_STORE(location),set);
1.193 + g_object_unref(set);
1.194 + w=GTK_WIDGET(gtk_builder_get_object(ui,"LocationButton"));
1.195 + file=g_file_new_for_path(path);
1.196 + parent=g_file_get_parent(file);
1.197 + if (parent)
1.198 + {
1.199 + g_object_unref(parent);
1.200 + mount=NULL;
1.201 + }
1.202 + else
1.203 + mount=g_file_find_enclosing_mount(file,NULL,NULL);
1.204 + if (mount)
1.205 + {
1.206 + name=g_mount_get_name(mount);
1.207 + g_object_unref(mount);
1.208 + }
1.209 + else
1.210 + {
1.211 + fi=g_file_query_info(file,
1.212 + G_FILE_ATTRIBUTE_STANDARD_DISPLAY_NAME,
1.213 + G_FILE_QUERY_INFO_NOFOLLOW_SYMLINKS,NULL,NULL);
1.214 + if (fi)
1.215 + {
1.216 + name=g_strdup(g_file_info_get_display_name(fi));
1.217 + g_object_unref(fi);
1.218 + }
1.219 + else
1.220 + name=g_filename_display_basename(path);
1.221 + g_object_unref(file);
1.222 + }
1.223 + gtk_tool_button_set_label(GTK_TOOL_BUTTON(w),name);
1.224 + g_free(name);
1.225 + gtk_widget_show(w);
1.226 + gtk_toggle_tool_button_set_active(GTK_TOGGLE_TOOL_BUTTON(w),TRUE);
1.227 + }
1.228 + else
1.229 + {
1.230 + gtk_widget_destroy(dialog);
1.231 + dialog=gtk_message_dialog_new(GTK_WINDOW(w),
1.232 + GTK_DIALOG_DESTROY_WITH_PARENT,GTK_MESSAGE_ERROR,
1.233 + GTK_BUTTONS_CLOSE,"Error loading repository '%s'",path);
1.234 + gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(dialog),
1.235 + "%s",err->message);
1.236 + gtk_dialog_run(GTK_DIALOG(dialog));
1.237 + g_error_free(err);
1.238 + }
1.239 + g_free(path);
1.240 + show_busy_cursor(FALSE);
1.241 + }
1.242 + gtk_widget_destroy(dialog);
1.243 +}
1.244 +
1.245 G_MODULE_EXPORT void on_help_about(GtkWidget *widget)
1.246 {
1.247 GtkWidget *w=GTK_WIDGET(gtk_builder_get_object(ui,"MainWindow"));