diff --git a/Makefile b/Makefile
index 17148b3..5dcd1b2 100644
--- a/Makefile
+++ b/Makefile
@@ -143,6 +143,7 @@ install: check uninstall
@install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.source-symbolic.svg"
@install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.save-symbolic.svg"
@install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.update-symbolic.svg"
+ @install -Dm644 -t "${DESTDIR}/usr/share/icons/hicolor/scalable/actions/" "icons/com.ublinux.${PKGNAME}.arrow-round-symbolic.svg"
@install -Dm644 -t "${DESTDIR}/usr/share/polkit-1/actions/" "${CMAKE_BUILD_DIR}/com.ublinux.${PKGNAME}${PKGIDENT}.policy"
@if [ -z ${DESTDIR} ]; then \
[ -d "${DESTDIR}/usr/share/icons/hicolor/" ] && gtk-update-icon-cache -fiq "${DESTDIR}/usr/share/icons/hicolor/" &>/dev/null || true; \
diff --git a/icons/com.ublinux.ubl-settings-services.arrow-round-symbolic.svg b/icons/com.ublinux.ubl-settings-services.arrow-round-symbolic.svg
new file mode 100644
index 0000000..694731a
--- /dev/null
+++ b/icons/com.ublinux.ubl-settings-services.arrow-round-symbolic.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/source/ubl-settings-services.c b/source/ubl-settings-services.c
index 336900b..da50d7c 100644
--- a/source/ubl-settings-services.c
+++ b/source/ubl-settings-services.c
@@ -731,7 +731,7 @@ void on_system_info_clicked(GtkWidget *self, main_window *widgets){
gtk_label_set_text(GTK_LABEL(window->webHeaderNameLabel),SERVICE_STATE_TITLE_LABEL(name));
gtk_window_set_title(GTK_WINDOW(window->Window),SERVICE_STATE_TITLE_LABEL(name));
window->target = service_info_command(name);
- yon_terminal_integrated_start(window->SystemTerminal,window->target);
+ yon_terminal_integrated_start_shell(window->SystemTerminal,window->target,NULL,NULL);
gtk_widget_show(window->Window);
}
}
@@ -750,7 +750,7 @@ void on_system_log_clicked(GtkWidget *self, main_window *widgets){
gtk_label_set_text(GTK_LABEL(window->webHeaderNameLabel),SERVICE_LOG_TITLE_LABEL(name));
gtk_window_set_title(GTK_WINDOW(window->Window),SERVICE_LOG_TITLE_LABEL(name));
window->target = get_log_command(name);
- yon_terminal_integrated_start(window->SystemTerminal,window->target);
+ yon_terminal_integrated_start_shell(window->SystemTerminal,window->target,NULL,NULL);
gtk_widget_show(window->Window);
}
}
@@ -761,7 +761,7 @@ void *on_terminal_relaunch(log_window *window){
gtk_widget_set_sensitive(window->SystemTerminal,0);
sleep(1);
gtk_widget_set_sensitive(window->SystemTerminal,1);
- yon_terminal_integrated_start(window->SystemTerminal,window->target);
+ yon_terminal_integrated_start_shell(window->SystemTerminal,window->target,NULL,NULL);
return NULL;
}
@@ -775,7 +775,7 @@ void on_save_clicked(GtkWidget *self, log_window *window){
void on_update_clicked(GtkWidget *self, log_window *window){
if (self){};
- yon_terminal_integrated_start(window->SystemTerminal,window->target);
+ yon_terminal_integrated_start_shell(window->SystemTerminal,window->target,NULL,NULL);
}
void on_system_edit_clicked(GtkWidget *self, main_window *widgets){
@@ -791,7 +791,7 @@ void on_system_edit_clicked(GtkWidget *self, main_window *widgets){
gtk_window_set_title(GTK_WINDOW(window->Window),SERVICE_UNIT_EDIT_TITLE_LABEL);
gtk_widget_show(window->SaveButton);
window->target=show_source_command(name);
- yon_terminal_integrated_start(window->SystemTerminal,window->target);
+ yon_terminal_integrated_start_shell(window->SystemTerminal,window->target,NULL,NULL);
GdkRGBA rgba;
rgba.blue=1;
rgba.green=1;
@@ -817,7 +817,7 @@ void on_system_status_clicked(GtkWidget *self, main_window *widgets){
gtk_label_set_text(GTK_LABEL(window->webHeaderNameLabel),PROPERTIES_LABEL);
gtk_window_set_title(GTK_WINDOW(window->Window),PROPERTIES_LABEL);
window->target = properties_command(name);
- yon_terminal_integrated_start(window->SystemTerminal,window->target);
+ yon_terminal_integrated_start_shell(window->SystemTerminal,window->target,NULL,NULL);
gtk_widget_show(window->Window);
}
@@ -862,7 +862,7 @@ void on_user_info_clicked(GtkWidget *self, main_window *widgets){
gtk_label_set_text(GTK_LABEL(window->webHeaderNameLabel),SERVICE_STATE_TITLE_LABEL(name));
gtk_window_set_title(GTK_WINDOW(window->Window),SERVICE_STATE_TITLE_LABEL(name));
window->target = user_service_info_command(name);
- yon_terminal_integrated_start(window->SystemTerminal,window->target);
+ yon_terminal_integrated_start_shell(window->SystemTerminal,window->target,NULL,NULL);
gtk_widget_show(window->Window);
}
}
@@ -881,7 +881,7 @@ void on_user_log_clicked(GtkWidget *self, main_window *widgets){
gtk_label_set_text(GTK_LABEL(window->webHeaderNameLabel),SERVICE_LOG_TITLE_LABEL(name));
gtk_window_set_title(GTK_WINDOW(window->Window),SERVICE_LOG_TITLE_LABEL(name));
window->target = user_get_log_command(name);
- yon_terminal_integrated_start(window->SystemTerminal,window->target);
+ yon_terminal_integrated_start_shell(window->SystemTerminal,window->target,NULL,NULL);
gtk_widget_show(window->Window);
}
}
@@ -901,7 +901,7 @@ void on_user_edit_clicked(GtkWidget *self, main_window *widgets){
gtk_window_set_title(GTK_WINDOW(window->Window),SERVICE_UNIT_EDIT_TITLE_LABEL);
gtk_widget_show(window->SaveButton);
window->target=user_show_source_command(name);
- yon_terminal_integrated_start(window->SystemTerminal,window->target);
+ yon_terminal_integrated_start_shell(window->SystemTerminal,window->target,NULL,NULL);
GdkRGBA rgba;
rgba.blue=1;
rgba.green=1;
@@ -927,7 +927,7 @@ void on_user_status_clicked(GtkWidget *self, main_window *widgets){
gtk_label_set_text(GTK_LABEL(window->webHeaderNameLabel),PROPERTIES_LABEL);
gtk_window_set_title(GTK_WINDOW(window->Window),PROPERTIES_LABEL);
window->target = user_properties_command(name);
- yon_terminal_integrated_start(window->SystemTerminal,window->target);
+ yon_terminal_integrated_start_shell(window->SystemTerminal,window->target,NULL,NULL);
gtk_widget_show(window->Window);
}
@@ -987,7 +987,7 @@ void on_system_services_status(GtkWidget *self, main_window *widgets){
gtk_label_set_text(GTK_LABEL(window->webHeaderNameLabel),SYSTEM_STATUS_LABEL);
gtk_window_set_title(GTK_WINDOW(window->Window),SYSTEM_STATUS_LABEL);
window->target = system_services_status_command;
- yon_terminal_integrated_start(window->SystemTerminal,window->target);
+ yon_terminal_integrated_start_shell(window->SystemTerminal,window->target,NULL,NULL);
gtk_widget_show(window->Window);
}
@@ -1001,7 +1001,7 @@ void on_user_services_status(GtkWidget *self, main_window *widgets){
gtk_label_set_text(GTK_LABEL(window->webHeaderNameLabel),USER_STATUS_LABEL);
gtk_window_set_title(GTK_WINDOW(window->Window),USER_STATUS_LABEL);
window->target = user_services_status_command;
- yon_terminal_integrated_start(window->SystemTerminal,window->target);
+ yon_terminal_integrated_start_shell(window->SystemTerminal,window->target,NULL,NULL);
gtk_widget_show(window->Window);
}
@@ -1015,7 +1015,7 @@ void on_units_status(GtkWidget *self, main_window *widgets){
gtk_label_set_text(GTK_LABEL(window->webHeaderNameLabel),INSTALLED_UNIT_LABEL);
gtk_window_set_title(GTK_WINDOW(window->Window),INSTALLED_UNIT_LABEL);
window->target = !gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook))?installed_units_states_command:user_installed_units_states_command;
- yon_terminal_integrated_start(window->SystemTerminal,window->target);
+ yon_terminal_integrated_start_shell(window->SystemTerminal,window->target,NULL,NULL);
gtk_widget_show(window->Window);
}
@@ -1029,7 +1029,7 @@ void on_units_list_status(GtkWidget *self, main_window *widgets){
gtk_label_set_text(GTK_LABEL(window->webHeaderNameLabel),UNITS_LIST_LABEL);
gtk_window_set_title(GTK_WINDOW(window->Window),UNITS_LIST_LABEL);
window->target = !gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook))?list_of_units_states_command:user_list_of_units_states_command;
- yon_terminal_integrated_start(window->SystemTerminal,window->target);
+ yon_terminal_integrated_start_shell(window->SystemTerminal,window->target,NULL,NULL);
gtk_widget_show(window->Window);
}
@@ -1043,7 +1043,7 @@ void on_sockets_list_status(GtkWidget *self, main_window *widgets){
gtk_label_set_text(GTK_LABEL(window->webHeaderNameLabel),SOCKETS_LIST_LABEL);
gtk_window_set_title(GTK_WINDOW(window->Window),SOCKETS_LIST_LABEL);
window->target = !gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook))?list_of_sockets_states_command:user_list_of_sockets_states_command;
- yon_terminal_integrated_start(window->SystemTerminal,window->target);
+ yon_terminal_integrated_start_shell(window->SystemTerminal,window->target,NULL,NULL);
gtk_widget_show(window->Window);
}
@@ -1057,7 +1057,7 @@ void on_timers_list_status(GtkWidget *self, main_window *widgets){
gtk_label_set_text(GTK_LABEL(window->webHeaderNameLabel),TIMERS_LIST_LABEL);
gtk_window_set_title(GTK_WINDOW(window->Window),TIMERS_LIST_LABEL);
window->target = !gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook))?list_of_timers_states_command:user_list_of_timers_states_command;
- yon_terminal_integrated_start(window->SystemTerminal,window->target);
+ yon_terminal_integrated_start_shell(window->SystemTerminal,window->target,NULL,NULL);
gtk_widget_show(window->Window);
}
@@ -1455,6 +1455,89 @@ void on_tree_selection_changed(GtkWidget *self, main_window *widgets){
}
}
+gboolean on_tooltip_show(GtkWidget* self, gint x, gint y, gboolean keyboard_mode, GtkTooltip* tooltip, main_window *widgets) {
+ if (self || x || y || keyboard_mode) {};
+
+ gtk_tooltip_set_custom(tooltip,widgets->TooltipBox);
+ GtkWidget *tree = NULL;
+ GtkTreeModel *model = NULL;
+ if (gtk_notebook_get_current_page(GTK_NOTEBOOK(widgets->MainNotebook)) == 0) {
+ tree = widgets->SystemUnitsTree;
+ model = gtk_tree_view_get_model(GTK_TREE_VIEW(widgets->SystemUnitsTree));
+ } else {
+ tree = widgets->UserUnitsTree;
+ model = gtk_tree_view_get_model(GTK_TREE_VIEW(widgets->UserUnitsTree));
+ }
+
+ gint tree_x, tree_y;
+ gtk_tree_view_convert_widget_to_bin_window_coords(GTK_TREE_VIEW(tree), x, y, &tree_x, &tree_y);
+
+ GtkTreePath *path;
+ if (gtk_tree_view_get_path_at_pos(GTK_TREE_VIEW(tree), tree_x, tree_y, &path, NULL, NULL, NULL)) {
+ GtkTreeIter iter;
+ if (gtk_tree_model_get_iter(model, &iter, path)) {
+ gchar *name, *description, *state, *name_target;
+ gint64 activa, deactiva;
+ int size;
+ gtk_tree_model_get(model, &iter, 5, &name, 6, &description, 11, &state, -1);
+ name_target = yon_char_new(name);
+ if (name[0]=='-'){
+ name_target = yon_char_append("-- ",name_target);
+ }
+ config_str target = yon_config_load(get_activate_deactivate_times(name_target), &size);
+ free(name_target);
+ if (target){
+ free(yon_char_divide_search(target[0], "=", -1));
+ yon_char_remove_last_symbol(target[0], '\n');
+ free(yon_char_divide_search(target[1], "=", -1));
+ yon_char_remove_last_symbol(target[1], '\n');
+ free(yon_char_divide_search(target[2], "=", -1));
+ yon_char_remove_last_symbol(target[2], '\n');
+ activa = g_ascii_strtoll(target[1], NULL, 10);
+ deactiva = g_ascii_strtoll(target[1], NULL, 10);
+ gtk_label_set_text(GTK_LABEL(widgets->UnitLabel), target[0]);
+ }
+ gtk_label_set_text(GTK_LABEL(widgets->NameLabel), name);
+ gtk_label_set_text(GTK_LABEL(widgets->DescriptionLabel), description);
+ gtk_label_set_text(GTK_LABEL(widgets->StatusQueryLabel), state);
+
+ free(name);
+ free(description);
+ free(state);
+
+ if (target){
+ gchar *formatted_activa = NULL;
+ gchar *formatted_deactiva = NULL;
+ if (activa) {
+ GDateTime *datetime = g_date_time_new_from_unix_local(activa);
+ formatted_activa = g_date_time_format(datetime, "%d:%m:%Y %T");
+ g_date_time_unref(datetime);
+ } else {
+ formatted_activa = g_strdup(NULL_LABEL);
+ }
+ if (deactiva) {
+ GDateTime *datetime = g_date_time_new_from_unix_local(deactiva);
+ formatted_deactiva = g_date_time_format(datetime, "%d:%m:%Y %T");
+ g_date_time_unref(datetime);
+ } else {
+ formatted_deactiva = g_strdup(NULL_LABEL);
+ }
+
+ gtk_label_set_text(GTK_LABEL(widgets->ActivateLabel), formatted_activa);
+ gtk_label_set_text(GTK_LABEL(widgets->DeactivateLabel), formatted_deactiva);
+
+ g_free(formatted_activa);
+ g_free(formatted_deactiva);
+ }
+ gtk_tree_path_free(path);
+ return TRUE;
+ }
+ gtk_tree_path_free(path);
+ }
+ return FALSE;
+}
+
+
/**yon_main_window_complete(main_window *widgets)
* [EN]
*
@@ -1478,6 +1561,14 @@ void yon_main_window_complete(main_window *widgets){
widgets->SystemUnitsTree=yon_gtk_builder_get_widget(builder,"SystemUnitsTree");
widgets->MainNotebook=yon_gtk_builder_get_widget(builder,"MainNotebook");
+ widgets->TooltipBox=yon_gtk_builder_get_widget(builder,"TooltipBox");
+ widgets->NameLabel=yon_gtk_builder_get_widget(builder,"NameLabel");
+ widgets->DescriptionLabel=yon_gtk_builder_get_widget(builder,"DescriptionLabel");
+ widgets->UnitLabel=yon_gtk_builder_get_widget(builder,"UnitLabel");
+ widgets->StatusQueryLabel=yon_gtk_builder_get_widget(builder,"StatusQueryLabel");
+ widgets->ActivateLabel=yon_gtk_builder_get_widget(builder,"ActivateLabel");
+ widgets->DeactivateLabel=yon_gtk_builder_get_widget(builder,"DeactivateLabel");
+
widgets->SystemServicesStatusMenuItem=yon_gtk_builder_get_widget(builder,"SystemServicesStatusMenuItem");
widgets->InstalledUnitsStatusMenuItem=yon_gtk_builder_get_widget(builder,"InstalledUnitsStatusMenuItem");
widgets->UnitsStatusListMenuItem=yon_gtk_builder_get_widget(builder,"UnitsStatusListMenuItem");
@@ -1555,6 +1646,7 @@ void yon_main_window_complete(main_window *widgets){
widgets->ConfigEditButton=yon_gtk_builder_get_widget(builder,"ConfigEditButton");
widgets->ConfigMainTree=yon_gtk_builder_get_widget(builder,"ConfigMainTree");
+ widgets->SessionRestartButton=yon_gtk_builder_get_widget(builder,"SessionRestartButton");
widgets->SessionMainTree=yon_gtk_builder_get_widget(builder,"SessionMainTree");
widgets->SessionStartButton=yon_gtk_builder_get_widget(builder,"SessionStartButton");
widgets->SessionStopButton=yon_gtk_builder_get_widget(builder,"SessionStopButton");
@@ -1583,6 +1675,9 @@ void yon_main_window_complete(main_window *widgets){
GList *list = gtk_tree_view_get_columns(GTK_TREE_VIEW(widgets->SystemUnitsTree));
yon_gtk_tree_view_minimal_fixed_size_set_full(GTK_TREE_VIEW(widgets->SystemUnitsTree));
+ g_signal_connect(G_OBJECT(widgets->UserUnitsTree),"query-tooltip",G_CALLBACK(on_tooltip_show),widgets);
+ g_signal_connect(G_OBJECT(widgets->SystemUnitsTree),"query-tooltip",G_CALLBACK(on_tooltip_show),widgets);
+
g_signal_connect(G_OBJECT(widgets->SystemPrevButton),"clicked",G_CALLBACK(on_system_update_hz_clicked),widgets);
g_signal_connect(G_OBJECT(widgets->SystemUpdateButton),"clicked",G_CALLBACK(on_interface_update),widgets);
g_signal_connect(G_OBJECT(widgets->SystemServiceUpdateButton),"clicked",G_CALLBACK(on_system_update_clicked),widgets);
@@ -1611,6 +1706,7 @@ void yon_main_window_complete(main_window *widgets){
g_signal_connect(G_OBJECT(widgets->ConfigEditButton),"clicked",G_CALLBACK(on_config_edit_clicked),widgets);
+ // g_signal_connect(G_OBJECT(widgets->SessionRestartButton),"clicked",G_CALLBACK(on_interface_update),widgets);
g_signal_connect(G_OBJECT(widgets->SessionStartButton),"clicked",G_CALLBACK(on_session_activate),widgets);
g_signal_connect(G_OBJECT(widgets->SessionStopButton),"clicked",G_CALLBACK(on_session_end),widgets);
g_signal_connect(G_OBJECT(widgets->SessionBlockButton),"clicked",G_CALLBACK(on_session_block),widgets);
diff --git a/source/ubl-settings-services.h b/source/ubl-settings-services.h
index 45e190d..125b3f0 100644
--- a/source/ubl-settings-services.h
+++ b/source/ubl-settings-services.h
@@ -75,6 +75,7 @@
#define list_of_sockets_command "systemctl list-sockets --all --no-pager| sed -e 's/ */;/g'"
#define list_of_timers_command "systemctl list-timers --all --no-pager| sed -e 's/ */;/g'"
#define list_of_session_command "while IFS=\" \" read -r GET_SESSION GET_UID GET_USER GET_SEAT GET_TTY; do echo -e \"${GET_SESSION} $(loginctl session-status ${GET_SESSION} --no-page | sed -Enr \"s/^\\s*State: (.*)$/\1/p\") ${GET_UID} ${GET_USER} ${GET_SEAT} ${GET_TTY}\"; done < <(loginctl list-sessions --no-legend)"
+#define get_activate_deactivate_times(target) yon_char_append("systemctl show -p ActiveEnterTimestampMonotonic -p InactiveEnterTimestampMonotonic -p Names ",target)
#define config_get_command(target) yon_char_append("cat ",target)
@@ -191,6 +192,7 @@ typedef struct {
GtkWidget *ConfigEditButton;
GtkWidget *ConfigMainTree;
+ GtkWidget *SessionRestartButton;
GtkWidget *SessionMainTree;
GtkWidget *SessionStartButton;
GtkWidget *SessionStopButton;
@@ -212,6 +214,14 @@ typedef struct {
GtkWidget *UserSocketsStatusListMenuItem;
GtkWidget *UserTimersStatusListMenuItem;
+ GtkWidget *TooltipBox;
+ GtkWidget *NameLabel;
+ GtkWidget *DescriptionLabel;
+ GtkWidget *UnitLabel;
+ GtkWidget *StatusQueryLabel;
+ GtkWidget *ActivateLabel;
+ GtkWidget *DeactivateLabel;
+
GtkTreeModelFilter *SystemFilter;
GtkTreeModelFilter *UserFilter;
@@ -269,6 +279,8 @@ typedef struct {
char *target;
} log_window;
+gboolean on_tooltip_show(GtkWidget* self, gint x, gint y, gboolean keyboard_mode, GtkTooltip* tooltip, main_window *widgets);
+
void on_config_local_load(GtkWidget *self,main_window *widgets);
void on_config_global_load(GtkWidget *self,main_window *widgets);
diff --git a/source/ubl-strings.h b/source/ubl-strings.h
index 974fddd..511cc7a 100644
--- a/source/ubl-strings.h
+++ b/source/ubl-strings.h
@@ -95,6 +95,7 @@
#define RELAUNCH_SYSTEMCTL_LABEL _("Reload settings")
#define REEXEC_SYSTEMCTL_LABEL _("Reexec systemd")
#define SHOW_SERVICE_INFO_LABEL _("Show service information")
+#define RELAUNCH_SERVICE_LABEL _("Relaunch with new configuration")
#define SHOW_SERVICE_LOG_LABEL _("Show service log")
#define SHOW_SERVICE_SOURCE_LABEL _("Show service source file")
#define SHOW_SERVICE_PROPERTIES_LABEL _("Show service properties")
@@ -149,5 +150,10 @@
#define SERVICE_RELOAD_SUCCESS_LABEL _("Service has been successfully restarted")
#define SAVE_LABEL _("Save")
+#define NULL_LABEL _("Null")
+#define UNIT_FILE_LABEL _("Unit file:")
+#define UNIT_STATE_LABEL _("Unit file state:")
+#define ACTIVATED_LABEL _("Activated:")
+#define DEACTIVATED_LABEL _("Deactivated:")
-#define service_tooltip_template() yon_char_unite("",target,"\n",_("Description:"),description,"\n",_("Unit file:"),unit,"\n",_("Status:"),status,"\n",)
\ No newline at end of file
+#define service_tooltip_template(target,description,unit,status,activated,deactivated) yon_char_unite("",target,"\n",_("Description:"),description,"\n",_("Unit file:"),unit,"\n",_("Status:"),status,"\n",_("Activated:"),activated,"\n",_("Deactivated:"),deactivated,NULL)
\ No newline at end of file
diff --git a/ubl-settings-services.glade b/ubl-settings-services.glade
index 40e4cca..5a8db02 100644
--- a/ubl-settings-services.glade
+++ b/ubl-settings-services.glade
@@ -53,6 +53,8 @@
+
+
+
@@ -100,6 +350,8 @@
+
+
@@ -168,12 +420,12 @@
True
False
- com.ublinux.ubl-settings-services.update-symbolic
+ com.ublinux.ubl-settings-services.arrow-round-symbolic
True
False
- com.ublinux.ubl-settings-services.update-symbolic
+ com.ublinux.ubl-settings-services.arrow-round-symbolic
True
@@ -412,7 +664,7 @@
True
True
True
- Reexec systemd
+ Update
image8