basic subvol support

This commit is contained in:
Ward from fusion-voyager-3 2024-08-19 03:39:52 +03:00
parent 0f3537745c
commit e9da6a8dc9

View File

@ -35,7 +35,7 @@ pub fn manual_partitioning_page(
let partition_array_refcell = Rc::new(RefCell::new(get_partitions())); let partition_array_refcell = Rc::new(RefCell::new(get_partitions()));
let used_partition_array_refcell: Rc<RefCell<Vec<String>>> = Rc::new(RefCell::default()); let used_partition_array_refcell: Rc<RefCell<Vec<String>>> = Rc::new(RefCell::default());
let do_used_part_check_refcell = Rc::new(RefCell::new(true)); let subvol_partition_array_refcell: Rc<RefCell<Vec<String>>> = Rc::new(RefCell::default());
// //
@ -75,7 +75,7 @@ pub fn manual_partitioning_page(
&partition_changed_action, &partition_changed_action,
&language_changed_action, &language_changed_action,
&used_partition_array_refcell, &used_partition_array_refcell,
&do_used_part_check_refcell, &subvol_partition_array_refcell,
); );
content_box.append(&drive_mounts_viewport); content_box.append(&drive_mounts_viewport);
@ -146,7 +146,7 @@ fn create_efi_row(
partition_changed_action: &gio::SimpleAction, partition_changed_action: &gio::SimpleAction,
language_changed_action: &gio::SimpleAction, language_changed_action: &gio::SimpleAction,
used_partition_array_refcell: &Rc<RefCell<Vec<String>>>, used_partition_array_refcell: &Rc<RefCell<Vec<String>>>,
do_used_part_check_refcell: &Rc<RefCell<bool>>, subvol_partition_array_refcell: &Rc<RefCell<Vec<String>>>,
) { ) {
let partition_scroll_child = gtk::ListBox::builder() let partition_scroll_child = gtk::ListBox::builder()
.selection_mode(gtk::SelectionMode::None) .selection_mode(gtk::SelectionMode::None)
@ -266,7 +266,7 @@ fn create_efi_row(
never: Rc::new(RefCell::new(false)), never: Rc::new(RefCell::new(false)),
} }
}; };
post_check_drive_mount(&row, &partition_row_struct, &partition_button, &partition_changed_action, &partition, &used_partition_array_refcell, &do_used_part_check_refcell); post_check_drive_mount(&row, &partition_row_struct, &partition_button, &partition_changed_action, &partition, &used_partition_array_refcell, &subvol_partition_array_refcell);
partition_scroll_child.append(&partition_row_struct.widget); partition_scroll_child.append(&partition_row_struct.widget);
} }
@ -300,7 +300,7 @@ fn create_boot_row(
partition_changed_action: &gio::SimpleAction, partition_changed_action: &gio::SimpleAction,
language_changed_action: &gio::SimpleAction, language_changed_action: &gio::SimpleAction,
used_partition_array_refcell: &Rc<RefCell<Vec<String>>>, used_partition_array_refcell: &Rc<RefCell<Vec<String>>>,
do_used_part_check_refcell: &Rc<RefCell<bool>>, subvol_partition_array_refcell: &Rc<RefCell<Vec<String>>>,
) { ) {
let partition_scroll_child = gtk::ListBox::builder() let partition_scroll_child = gtk::ListBox::builder()
.selection_mode(gtk::SelectionMode::None) .selection_mode(gtk::SelectionMode::None)
@ -420,7 +420,7 @@ fn create_boot_row(
never: Rc::new(RefCell::new(false)), never: Rc::new(RefCell::new(false)),
} }
}; };
post_check_drive_mount(&row, &partition_row_struct, &partition_button, &partition_changed_action, &partition, &used_partition_array_refcell, &do_used_part_check_refcell); post_check_drive_mount(&row, &partition_row_struct, &partition_button, &partition_changed_action, &partition, &used_partition_array_refcell, &subvol_partition_array_refcell);
partition_scroll_child.append(&partition_row_struct.widget); partition_scroll_child.append(&partition_row_struct.widget);
} }
@ -454,7 +454,7 @@ fn create_root_row(
partition_changed_action: &gio::SimpleAction, partition_changed_action: &gio::SimpleAction,
language_changed_action: &gio::SimpleAction, language_changed_action: &gio::SimpleAction,
used_partition_array_refcell: &Rc<RefCell<Vec<String>>>, used_partition_array_refcell: &Rc<RefCell<Vec<String>>>,
do_used_part_check_refcell: &Rc<RefCell<bool>>, subvol_partition_array_refcell: &Rc<RefCell<Vec<String>>>,
) { ) {
let partition_scroll_child = gtk::ListBox::builder() let partition_scroll_child = gtk::ListBox::builder()
.selection_mode(gtk::SelectionMode::None) .selection_mode(gtk::SelectionMode::None)
@ -579,7 +579,7 @@ fn create_root_row(
never: Rc::new(RefCell::new(false)), never: Rc::new(RefCell::new(false)),
} }
}; };
post_check_drive_mount(&row, &partition_row_struct, &partition_button, &partition_changed_action, &partition, &used_partition_array_refcell, &do_used_part_check_refcell); post_check_drive_mount(&row, &partition_row_struct, &partition_button, &partition_changed_action, &partition, &used_partition_array_refcell, &subvol_partition_array_refcell);
partition_scroll_child.append(&partition_row_struct.widget); partition_scroll_child.append(&partition_row_struct.widget);
} }
@ -613,7 +613,7 @@ fn create_mount_row(
partition_changed_action: &gio::SimpleAction, partition_changed_action: &gio::SimpleAction,
language_changed_action: &gio::SimpleAction, language_changed_action: &gio::SimpleAction,
used_partition_array_refcell: &Rc<RefCell<Vec<String>>>, used_partition_array_refcell: &Rc<RefCell<Vec<String>>>,
do_used_part_check_refcell: &Rc<RefCell<bool>>, subvol_partition_array_refcell: &Rc<RefCell<Vec<String>>>,
) { ) {
let partition_scroll_child = gtk::ListBox::builder() let partition_scroll_child = gtk::ListBox::builder()
.selection_mode(gtk::SelectionMode::None) .selection_mode(gtk::SelectionMode::None)
@ -703,7 +703,7 @@ fn create_mount_row(
never: Rc::new(RefCell::new(false)), never: Rc::new(RefCell::new(false)),
} }
}; };
post_check_drive_mount(&row, &partition_row_struct, &partition_button, &partition_changed_action, &partition, &used_partition_array_refcell, &do_used_part_check_refcell); post_check_drive_mount(&row, &partition_row_struct, &partition_button, &partition_changed_action, &partition, &used_partition_array_refcell, &subvol_partition_array_refcell);
partition_scroll_child.append(&partition_row_struct.widget); partition_scroll_child.append(&partition_row_struct.widget);
} }
@ -730,7 +730,7 @@ fn create_mount_row(
); );
} }
fn post_check_drive_mount(row: &DriveMountRow, partition_row_struct: &PartitionRow, partition_button: &gtk::CheckButton, partition_changed_action: &gio::SimpleAction, partition: &Partition, used_partition_array_refcell: &Rc<RefCell<Vec<String>>>, do_used_part_check_refcell: &Rc<RefCell<bool>>) { fn post_check_drive_mount(row: &DriveMountRow, partition_row_struct: &PartitionRow, partition_button: &gtk::CheckButton, partition_changed_action: &gio::SimpleAction, partition: &Partition, used_partition_array_refcell: &Rc<RefCell<Vec<String>>>, subvol_partition_array_refcell: &Rc<RefCell<Vec<String>>>) {
partition_row_struct.widget.add_prefix(partition_button); partition_row_struct.widget.add_prefix(partition_button);
partition_button.connect_toggled(clone!( partition_button.connect_toggled(clone!(
#[weak] #[weak]
@ -761,8 +761,6 @@ fn post_check_drive_mount(row: &DriveMountRow, partition_row_struct: &PartitionR
#[strong] #[strong]
partition, partition,
#[strong] #[strong]
partition_changed_action,
#[strong]
row, row,
move |_| { move |_| {
if row.mountpoint() == "[SWAP]" { if row.mountpoint() == "[SWAP]" {
@ -777,6 +775,26 @@ fn post_check_drive_mount(row: &DriveMountRow, partition_row_struct: &PartitionR
} }
)); ));
row.connect_mountopts_notify(clone!(
#[strong]
partition,
#[strong]
partition_changed_action,
#[strong]
subvol_partition_array_refcell,
#[strong]
row,
move |_| {
if row.mountopts().contains("subvol=") || row.mountopts().contains("subvolid") {
(*subvol_partition_array_refcell.borrow_mut()).push(partition.part_name.to_string());
} else {
(*subvol_partition_array_refcell.borrow_mut())
.retain(|x| x != &partition.part_name);
}
partition_changed_action.activate(None);
}
));
partition_changed_action.connect_activate(clone!( partition_changed_action.connect_activate(clone!(
#[strong] #[strong]
partition_row_struct, partition_row_struct,
@ -787,23 +805,28 @@ fn post_check_drive_mount(row: &DriveMountRow, partition_row_struct: &PartitionR
#[strong] #[strong]
used_partition_array_refcell, used_partition_array_refcell,
#[strong] #[strong]
do_used_part_check_refcell, subvol_partition_array_refcell,
move |_, _| { move |_, _| {
if *do_used_part_check_refcell.borrow() == true {
let part_name = &partition.part_name; let part_name = &partition.part_name;
let used_partition_array = used_partition_array_refcell.borrow(); let used_partition_array = used_partition_array_refcell.borrow();
let subvol_partition_array = subvol_partition_array_refcell.borrow();
if used_partition_array if used_partition_array
.iter() .iter()
.any(|e| part_name == e && part_name != &row.partition()) .any(|e| part_name == e && part_name != &row.partition())
{ {
partition_row_struct.widget.set_sensitive(false); partition_row_struct.widget.set_sensitive(false);
(*partition_row_struct.used.borrow_mut()) = true; (*partition_row_struct.used.borrow_mut()) = true;
if subvol_partition_array
.iter()
.any(|e| e == part_name)
{
partition_row_struct.widget.set_sensitive(true);
}
} else if *partition_row_struct.never.borrow() == false { } else if *partition_row_struct.never.borrow() == false {
partition_row_struct.widget.set_sensitive(true); partition_row_struct.widget.set_sensitive(true);
(*partition_row_struct.used.borrow_mut()) = false; (*partition_row_struct.used.borrow_mut()) = false;
} }
} }
}
)); ));
} }
@ -814,7 +837,7 @@ fn create_hardcoded_rows(
partition_changed_action: &gio::SimpleAction, partition_changed_action: &gio::SimpleAction,
language_changed_action: &gio::SimpleAction, language_changed_action: &gio::SimpleAction,
used_partition_array_refcell: &Rc<RefCell<Vec<String>>>, used_partition_array_refcell: &Rc<RefCell<Vec<String>>>,
do_used_part_check_refcell: &Rc<RefCell<bool>>, subvol_partition_array_refcell: &Rc<RefCell<Vec<String>>>,
) { ) {
let drive_mount_add_button = gtk::Button::builder() let drive_mount_add_button = gtk::Button::builder()
.icon_name("list-add") .icon_name("list-add")
@ -829,7 +852,7 @@ fn create_hardcoded_rows(
&partition_changed_action, &partition_changed_action,
&language_changed_action, &language_changed_action,
&used_partition_array_refcell, &used_partition_array_refcell,
&do_used_part_check_refcell, &subvol_partition_array_refcell,
); );
create_boot_row( create_boot_row(
&drive_mounts_adw_listbox, &drive_mounts_adw_listbox,
@ -838,7 +861,7 @@ fn create_hardcoded_rows(
&partition_changed_action, &partition_changed_action,
&language_changed_action, &language_changed_action,
&used_partition_array_refcell, &used_partition_array_refcell,
&do_used_part_check_refcell, &subvol_partition_array_refcell,
); );
create_root_row( create_root_row(
&drive_mounts_adw_listbox, &drive_mounts_adw_listbox,
@ -847,7 +870,7 @@ fn create_hardcoded_rows(
&partition_changed_action, &partition_changed_action,
&language_changed_action, &language_changed_action,
&used_partition_array_refcell, &used_partition_array_refcell,
&do_used_part_check_refcell, &subvol_partition_array_refcell,
); );
drive_mounts_adw_listbox.append(&drive_mount_add_button); drive_mounts_adw_listbox.append(&drive_mount_add_button);
@ -866,7 +889,7 @@ fn create_hardcoded_rows(
#[strong] #[strong]
used_partition_array_refcell, used_partition_array_refcell,
#[strong] #[strong]
do_used_part_check_refcell, subvol_partition_array_refcell,
move |_| { move |_| {
create_mount_row( create_mount_row(
&drive_mounts_adw_listbox, &drive_mounts_adw_listbox,
@ -875,7 +898,7 @@ fn create_hardcoded_rows(
&partition_changed_action, &partition_changed_action,
&language_changed_action, &language_changed_action,
&used_partition_array_refcell, &used_partition_array_refcell,
&do_used_part_check_refcell, &subvol_partition_array_refcell,
); );
} }
)); ));