WIP OS menu

pull/83/head
parent 387556f912
commit ac83d890c7

@ -5,6 +5,8 @@
<file>ubl-settings-bootloader-password.glade</file>
<file>ubl-settings-bootloader-user.glade</file>
<file>ubl-settings-bootloader-ringtone.glade</file>
<file>ubl-settings-bootloader-menu.glade</file>
<file>ubl-settings-bootloader-menu-item.glade</file>
</gresource>
<gresource prefix="/com/ublinux/css">
<file>ubl-settings-bootloader.css</file>

@ -35,6 +35,8 @@ set(DEPENDFILES
../ubl-settings-bootloader-password.glade
../ubl-settings-bootloader-user.glade
../ubl-settings-bootloader-ringtone.glade
../ubl-settings-bootloader-menu.glade
../ubl-settings-bootloader-menu-item.glade
../grub-parameters.csv
../grub-terminal-input.csv
../grub-terminal-output.csv
@ -81,6 +83,7 @@ set(SOURCE_FILES
ubl-settings-bootloader-user.c
ubl-settings-bootloader-password.c
ubl-settings-bootloader-melody.c
ubl-settings-bootloader-menu.c
ubl-settings-bootloader.h
ubl-strings.h
)

@ -0,0 +1,116 @@
#include "ubl-settings-bootloader.h"
void on_menu_chosen(GtkWidget *,dictionary *){
}
void on_submenu_open(GtkWidget *,dictionary *dict){
yon_menu_window *window = yon_dictionary_get_data(dict->first,yon_menu_window*);
yon_menu_item *item = yon_dictionary_get_data(dict->first->next,yon_menu_item*);
dictionary *dact = NULL;
for_dictionaries(dact,item->children){
yon_menu_item *child = yon_dictionary_get_data(dact,yon_menu_item*);
gtk_list_box_insert(GTK_LIST_BOX(window->ChildrenListBox),child->MenuItemBox,-1);
g_signal_connect(G_OBJECT(child->MenuButton),"clicked",G_CALLBACK(on_menu_chosen),item);
}
}
yon_menu_window *yon_menu_window_open(GtkWidget *, main_window *widgets){
yon_menu_window *window = yon_menu_window_new();
int size;
config_str parsed = yon_config_load(get_menus_entry_command,&size);
for (int i=0;i<size;i++){
yon_char_remove_last_symbol(parsed[i],'\n');
int param_size;
config_str parameter = yon_char_parse(parsed[i],&param_size,">");
if (yon_dictionary_get(&window->menu_items,parameter[0])){
} else {
yon_menu_item *item = yon_menu_item_new();
gtk_widget_hide(item->NextIconButton);
gtk_label_set_text(GTK_LABEL(item->MenuTextLabel),parameter[0]);
item->target=yon_char_new(parameter[0]);
gtk_list_box_insert(GTK_LIST_BOX(window->ItemsListBox),item->MenuItemBox,-1);
yon_dictionary_add_or_create_if_exists_with_data(window->menu_items,parameter[0],item);
gtk_widget_show(item->MenuItemBox);
if (size==2){
yon_menu_item *item_child = yon_menu_item_new();
g_signal_connect(G_OBJECT(item->MenuButton),"clicked",G_CALLBACK(on_submenu_open),item);
yon_dictionary_add_or_create_if_exists_with_data(item->children,parameter[1],item_child);
} else {
g_signal_connect(G_OBJECT(item->MenuButton),"clicked",G_CALLBACK(on_menu_chosen),item);
}
}
}
int x,y,x2,y2,width;
gdk_window_get_position(gtk_widget_get_window(widgets->MenuButton),&x,&y);
gtk_widget_translate_coordinates(widgets->MenuButton,widgets->Window,x,y,&x2,&y2);
gtk_window_get_size(GTK_WINDOW(window->MenuWindow),&width,NULL);
gtk_window_get_position(GTK_WINDOW(widgets->Window),&x,&y);
gtk_window_move(GTK_WINDOW(window->MenuWindow),x+x2-width,y+y2);
gtk_widget_realize(window->MenuWindow);
gtk_widget_show(window->MenuWindow);
gdk_seat_grab(gdk_display_get_default_seat(gdk_display_get_default()),gtk_widget_get_window(window->MenuWindow),GDK_SEAT_CAPABILITY_POINTER,TRUE,NULL,NULL,NULL,NULL);
return window;
}
gboolean on_menu_clicked(GtkWidget *, GdkEventButton *event, yon_menu_window *window){
int x,y,width,height;
gtk_window_get_size(GTK_WINDOW(window->MenuWindow),&width,&height);
gtk_window_get_position(GTK_WINDOW(window->MenuWindow),&x,&y);
if (event->x_root<x||event->y_root<y||event->x_root>x+width||event->y_root>y+height){
GdkDisplay *display = gdk_display_get_default();
GdkSeat *seat = gdk_display_get_default_seat(display);
gdk_seat_ungrab(seat);
// gtk_grab_remove(widget);
gtk_widget_destroy(window->MenuWindow);
}
return 1;
}
void on_children_clean(GtkWidget*, yon_menu_window *window){
GList *list = gtk_container_get_children(GTK_CONTAINER(window->ChildrenListBox));
for (guint i=0;i<g_list_length(list);i++){
GList *item = gtk_container_get_children(GTK_CONTAINER(list->data));
g_object_ref(G_OBJECT(item->data));
gtk_container_remove(GTK_CONTAINER(list->data),GTK_WIDGET(item->data));
gtk_widget_destroy(GTK_WIDGET(list->data));
g_list_free(item);
list=list->next;
}
}
yon_menu_window *yon_menu_window_new(){
yon_menu_window *window = new(yon_menu_window);
GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_menu_window);
window->MenuWindow = yon_gtk_builder_get_widget(builder,"MainWindow");
window->ItemsRevealer = yon_gtk_builder_get_widget(builder,"ItemsRevealer");
window->BackButton = yon_gtk_builder_get_widget(builder,"BackButton");
window->ItemsListBox = yon_gtk_builder_get_widget(builder,"ItemsListBox");
window->ChildrenRevealer = yon_gtk_builder_get_widget(builder,"ChildrenRevealer");
window->ChildrenListBox = yon_gtk_builder_get_widget(builder,"ChildrenListBox");
window->menu_items=NULL;
g_signal_connect(G_OBJECT(window->BackButton),"clicked",G_CALLBACK(on_children_clean),window);
g_signal_connect(G_OBJECT(window->MenuWindow),"button-press-event",G_CALLBACK(on_menu_clicked),window);
return window;
}
yon_menu_item *yon_menu_item_new(){
yon_menu_item *item = new(yon_menu_item);
GtkBuilder *builder = gtk_builder_new_from_resource(glade_path_menu_item);
item->MenuItemBox = yon_gtk_builder_get_widget(builder,"MenuItemBox");
item->MenuButton = yon_gtk_builder_get_widget(builder,"MenuButton");
item->MenuTextLabel = yon_gtk_builder_get_widget(builder,"MenuTextLabel");
item->NextIconButton = yon_gtk_builder_get_widget(builder,"NextIconButton");
item->children=NULL;
return item;
}

@ -446,6 +446,7 @@ void yon_main_window_complete(main_window *widgets){
}
g_signal_connect(G_OBJECT(widgets->MenuButton),"clicked",G_CALLBACK(yon_menu_window_open),widgets);
g_signal_connect(G_OBJECT(widgets->BootUsersAddButton),"clicked",G_CALLBACK(on_user_add_clicked),widgets);
g_signal_connect(G_OBJECT(widgets->BootUsersEditButton),"clicked",G_CALLBACK(on_user_edit_clicked),widgets);
g_signal_connect(G_OBJECT(widgets->BootUsersRemoveButton),"clicked",G_CALLBACK(on_user_remove_clicked),widgets);

@ -23,6 +23,8 @@
#define glade_path_password "/com/ublinux/ui/ubl-settings-bootloader-password.glade"
#define glade_path_user "/com/ublinux/ui/ubl-settings-bootloader-user.glade"
#define glade_path_ringtone "/com/ublinux/ui/ubl-settings-bootloader-ringtone.glade"
#define glade_path_menu_window "/com/ublinux/ui/ubl-settings-bootloader-menu.glade"
#define glade_path_menu_item "/com/ublinux/ui/ubl-settings-bootloader-menu-item.glade"
#define banner_path "/com/ublinux/images/ubl-settings-bootloader-banner.png"
#define CssPath "/com/ublinux/css/ubl-settings-bootloader.css"
#define config_path yon_char_unite(yon_ubl_user_get_home_directory(),"/.config/",LocaleName,"/",LocaleName,".conf",NULL)
@ -33,6 +35,8 @@
#define LocaleName "ubl-settings-bootloader"
#define get_menus_entry_command "/usr/lib/ublinux/scripts/grub-functions exec_get_all_menuentry"
#define check_is_password_hash(password) system(yon_char_unite("/lib/ublinux/functions is_hash_password '", password,"'",NULL))
#define yon_config_get_custom_command(target) yon_char_unite("ubconfig --source ",target," get boot GRUB_SUPERUSERS GRUB_TIMEOUT GRUB_DEFAULT GRUB_BOOT_SILENT GRUB_PASSWORD[*] GRUB_CMDLINE_LINUX GRUB_TERMINAL_INPUT GRUB_TERMINAL_OUTPUT GRUB_PLAY",NULL)
@ -225,4 +229,38 @@ void on_ringtone_accept(GtkWidget *,dictionary *dict);
void on_ringtone_add_clicked(GtkWidget *,main_window *widgets);
void on_ringtone_edit_clicked(GtkWidget *,main_window *widgets);
void on_ringtone_remove_clicked(GtkWidget *,main_window *widgets);
yon_ringtone_window *yon_ringtone_window_new();
yon_ringtone_window *yon_ringtone_window_new();
//menu
typedef struct {
GtkWidget *MenuWindow;
GtkWidget *BackButton;
GtkWidget *ItemsRevealer;
GtkWidget *ItemsListBox;
GtkWidget *ChildrenRevealer;
GtkWidget *ChildrenListBox;
dictionary *menu_items;
char *cur_selection;
} yon_menu_window;
typedef struct {
GtkWidget *MenuItemBox;
GtkWidget *MenuButton;
GtkWidget *MenuTextLabel;
GtkWidget *NextIconButton;
char *target;
dictionary *children;
} yon_menu_item;
yon_menu_window *yon_menu_window_open(GtkWidget *target, main_window *widgets);
gboolean on_menu_clicked(GtkWidget *, GdkEventButton *, yon_menu_window *);
yon_menu_window *yon_menu_window_new();
yon_menu_item *yon_menu_item_new();
void on_menu_chosen(GtkWidget *,dictionary *dict);
void on_submenu_open(GtkWidget *,dictionary *dict);
void on_children_clean(GtkWidget*, yon_menu_window *window);

@ -0,0 +1,73 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface domain="ubl-settings-bootloader">
<requires lib="gtk+" version="3.24"/>
<!-- interface-css-provider-path ubl-settings-bootloader.css -->
<object class="GtkBox" id="MenuItemBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkButton" id="MenuButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkLabel" id="MenuTextLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">label</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkMenuButton" id="NextIconButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="focus-on-click">False</property>
<property name="receives-default">True</property>
<property name="popup">menu1</property>
<property name="direction">right</property>
<child>
<placeholder/>
</child>
<style>
<class name="thin"/>
<class name="noborder"/>
<class name="nobackground"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="pack-type">end</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<style>
<class name="noborder"/>
<class name="menunoborder"/>
</style>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
</object>
<object class="GtkMenu" id="menu1">
<property name="visible">True</property>
<property name="can-focus">False</property>
</object>
</interface>

@ -0,0 +1,174 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface domain="ubl-settings-bootloader">
<requires lib="gtk+" version="3.24"/>
<!-- interface-css-provider-path ubl-settings-bootloader.css -->
<object class="GtkWindow" id="MainWindow">
<property name="width-request">450</property>
<property name="height-request">250</property>
<property name="can-focus">False</property>
<property name="resizable">False</property>
<property name="modal">True</property>
<property name="default-width">450</property>
<property name="icon-name">com.ublinux.ubl-settings-bootloader</property>
<property name="skip-taskbar-hint">True</property>
<property name="skip-pager-hint">True</property>
<property name="decorated">False</property>
<child>
<object class="GtkFrame">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label-xalign">0</property>
<property name="shadow-type">in</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-start">5</property>
<property name="margin-end">5</property>
<property name="margin-top">5</property>
<property name="margin-bottom">5</property>
<child>
<object class="GtkRevealer" id="ItemsRevealer">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="transition-type">none</property>
<property name="reveal-child">True</property>
<child>
<object class="GtkListBox" id="ItemsListBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="selection-mode">none</property>
<child type="placeholder">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">OS options were not found</property>
<style>
<class name="workingbg"/>
</style>
</object>
</child>
</object>
</child>
<style>
<class name="workingbg"/>
</style>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkRevealer" id="ChildrenRevealer">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="transition-type">none</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">5</property>
<child>
<object class="GtkButton" id="BackButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="spacing">5</property>
<child>
<object class="GtkMenuButton" id="NextIconButton">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="focus-on-click">False</property>
<property name="receives-default">True</property>
<property name="direction">left</property>
<child>
<placeholder/>
</child>
<style>
<class name="thin"/>
<class name="noborder"/>
<class name="nobackground"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="MenuTextLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Back</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
<style>
<class name="noborder"/>
<class name="menunoborder"/>
</style>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkListBox" id="ChildrenListBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="selection-mode">none</property>
<child type="placeholder">
<object class="GtkLabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Children options were not found</property>
</object>
</child>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<style>
<class name="workingbg"/>
</style>
</object>
</child>
<child type="label_item">
<placeholder/>
</child>
</object>
</child>
<style>
<class name="workingbg"/>
</style>
</object>
</interface>

@ -5,6 +5,9 @@
.noborder {
border:none;
}
.borders {
border:1px;
}
.nobackground {
background:transparent;
}
@ -134,6 +137,21 @@ background:transparent;
margin-right: 2px;
}
.menunoborder {
border-radius: 0;
border:none;
}
.menunoborder:active {
border-radius: 0;
border:none;
}
.menunoborder:hover {
border-radius: 0;
border:none;
}
treeview row:nth-child(odd) { background-color: #000000; }
treeview row:nth-child(even) { background-color: #ffffff; }

@ -63,6 +63,11 @@
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.libublsettingsui-gtk3.increase-symbolic</property>
</object>
<object class="GtkImage" id="image2">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.libublsettingsui-gtk3.increase-symbolic</property>
</object>
<object class="GtkBox" id="BoxMain">
<property name="visible">True</property>
<property name="can-focus">False</property>
@ -196,7 +201,7 @@
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">2</property>
<property name="position">1</property>
</packing>
</child>
<child>
@ -1070,9 +1075,46 @@
</packing>
</child>
</object>
<object class="GtkImage" id="image2">
<object class="GtkMenu" id="menu1">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">com.ublinux.libublsettingsui-gtk3.increase-symbolic</property>
<child>
<object class="GtkMenuItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">gaevdb</property>
<property name="use-underline">True</property>
<child type="submenu">
<object class="GtkMenu">
<property name="visible">True</property>
<property name="can-focus">False</property>
<child>
<object class="GtkMenuItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">feagae</property>
<property name="use-underline">True</property>
</object>
</child>
</object>
</child>
</object>
</child>
<child>
<object class="GtkMenuItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">feagaegaeg</property>
<property name="use-underline">True</property>
</object>
</child>
<child>
<object class="GtkMenuItem">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">brtbrtbrb</property>
<property name="use-underline">True</property>
</object>
</child>
</object>
</interface>

Loading…
Cancel
Save