mirror of
https://github.com/Xetibo/ReSet.git
synced 2025-04-08 22:52:01 +02:00
commit
f1f9d05cf4
|
@ -1,3 +1,4 @@
|
|||
use re_set_lib::network::connection::Address;
|
||||
use std::cell::RefCell;
|
||||
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
|
||||
use std::rc::Rc;
|
||||
|
@ -9,7 +10,7 @@ use adw::prelude::PreferencesRowExt;
|
|||
use glib::clone;
|
||||
use glib::subclass::prelude::ObjectSubclassIsExt;
|
||||
use gtk::prelude::{ButtonExt, EditableExt, WidgetExt};
|
||||
use re_set_lib::network::connection::{Address, Connection};
|
||||
use re_set_lib::network::connection::{Connection};
|
||||
|
||||
use crate::components::wifi::utils::IpProtocol;
|
||||
use crate::components::wifi::wifi_address_entry_impl;
|
||||
|
@ -37,10 +38,10 @@ impl WifiAddressEntry {
|
|||
entry_imp.reset_address_address.set_text(&address.address);
|
||||
entry_imp
|
||||
.reset_address_prefix
|
||||
.set_text(&address.prefix_length.to_string());
|
||||
.set_text(&address.prefix.to_string());
|
||||
entry_imp
|
||||
.reset_address_row
|
||||
.set_title(&format!("{}/{}", &*address.address, address.prefix_length));
|
||||
.set_title(&format!("{}/{}", &*address.address, address.prefix));
|
||||
}
|
||||
entry_imp.protocol.set(protocol);
|
||||
entry.setup_callbacks(conn);
|
||||
|
@ -71,7 +72,7 @@ impl WifiAddressEntry {
|
|||
IpProtocol::IPv4 => &mut conn.ipv4.address_data,
|
||||
IpProtocol::IPv6 => &mut conn.ipv6.address_data,
|
||||
};
|
||||
address_data.push(Address::new_no_options(ip_addr.to_string(), self_imp.prefix.get().1 as u32));
|
||||
address_data.push(Address::new_no_options(ip_addr.to_string(), self_imp.prefix.get().1));
|
||||
*self_imp.address.borrow_mut() = (true, ip_addr.to_string());
|
||||
}
|
||||
Err(_) => {
|
||||
|
@ -111,7 +112,7 @@ impl WifiAddressEntry {
|
|||
if let Ok(address2) = Ipv4Addr::from_str(self_imp.reset_address_address.text().as_str()) {
|
||||
if let Some(addr) = conn.ipv4.address_data.iter_mut()
|
||||
.find(|conn_addr| *conn_addr.address == address2.to_string()) {
|
||||
addr.prefix_length = prefix as u32;
|
||||
addr.prefix = prefix as u32;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -121,7 +122,7 @@ impl WifiAddressEntry {
|
|||
if let Ok(address2) = Ipv6Addr::from_str(self_imp.reset_address_address.text().as_str()) {
|
||||
if let Some(addr) = conn.ipv6.address_data.iter_mut()
|
||||
.find(|conn_addr| *conn_addr.address == address2.to_string()) {
|
||||
addr.prefix_length = prefix as u32;
|
||||
addr.prefix = prefix as u32;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -4,15 +4,16 @@ use std::str::FromStr;
|
|||
use std::sync::Arc;
|
||||
use std::time::Duration;
|
||||
|
||||
use adw::{gio, glib};
|
||||
use adw::glib::Object;
|
||||
use adw::prelude::{ActionRowExt, ComboRowExt, PreferencesGroupExt};
|
||||
use adw::subclass::prelude::ObjectSubclassIsExt;
|
||||
use adw::{gio, glib};
|
||||
use dbus::arg::PropMap;
|
||||
use dbus::{Error, Path};
|
||||
use dbus::arg::PropMap;
|
||||
use glib::{clone, PropertySet};
|
||||
use gtk::prelude::{ButtonExt, EditableExt, WidgetExt};
|
||||
use gtk::prelude::{ActionableExt, ButtonExt, EditableExt, ListBoxRowExt, WidgetExt};
|
||||
use re_set_lib::network::connection::{Connection, DNSMethod4, DNSMethod6, Enum, KeyManagement, TypeSettings};
|
||||
|
||||
use IpProtocol::{IPv4, IPv6};
|
||||
|
||||
use crate::components::wifi::utils::IpProtocol;
|
||||
|
@ -50,7 +51,7 @@ impl WifiOptions {
|
|||
ip4_route_length = conn.ipv4.route_data.len();
|
||||
ip6_address_length = conn.ipv4.address_data.len();
|
||||
ip6_route_length = conn.ipv4.route_data.len();
|
||||
|
||||
// dbg!(&conn);
|
||||
// General
|
||||
self_imp
|
||||
.reset_wifi_auto_connect
|
||||
|
@ -59,7 +60,7 @@ impl WifiOptions {
|
|||
.reset_wifi_metered
|
||||
.set_active(conn.settings.metered != -1);
|
||||
match &conn.device {
|
||||
TypeSettings::WIFI(wifi, _) => {
|
||||
TypeSettings::WIFI(wifi) => {
|
||||
self_imp.reset_wifi_link_speed.set_visible(false);
|
||||
self_imp.reset_wifi_ip4_addr.set_visible(false);
|
||||
self_imp.reset_wifi_ip6_addr.set_visible(false);
|
||||
|
@ -130,24 +131,24 @@ impl WifiOptions {
|
|||
self_imp.reset_ip6_gateway.set_text(&conn.ipv6.gateway);
|
||||
|
||||
// Security
|
||||
if let TypeSettings::WIFI(_, wifi_security) = &conn.device {
|
||||
match wifi_security.key_management {
|
||||
KeyManagement::NONE => {
|
||||
self_imp.reset_wifi_security_dropdown.set_selected(0);
|
||||
self_imp.reset_wifi_password.set_visible(false);
|
||||
self_imp.reset_wifi_password.set_text("");
|
||||
}
|
||||
KeyManagement::WPAPSK => {
|
||||
self_imp.reset_wifi_security_dropdown.set_selected(1);
|
||||
self_imp.reset_wifi_password.set_visible(true);
|
||||
self_imp
|
||||
.reset_wifi_password
|
||||
.set_text(&wifi_security.psk);
|
||||
}
|
||||
_ => {}
|
||||
|
||||
match &conn.security.key_management {
|
||||
KeyManagement::NONE => {
|
||||
self_imp.reset_wifi_security_dropdown.set_selected(0);
|
||||
self_imp.reset_wifi_password.set_visible(false);
|
||||
self_imp.reset_wifi_password.set_text("");
|
||||
}
|
||||
KeyManagement::WPAPSK => {
|
||||
self_imp.reset_wifi_security_dropdown.set_selected(1);
|
||||
self_imp.reset_wifi_password.set_visible(true);
|
||||
self_imp
|
||||
.reset_wifi_password
|
||||
.set_text(&conn.security.psk);
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
// IPv4
|
||||
for i in 0..ip4_address_length {
|
||||
let address = &WifiAddressEntry::new(Some(i), self_imp.connection.clone(), IPv4);
|
||||
|
@ -177,7 +178,6 @@ impl WifiOptions {
|
|||
}
|
||||
let route = &WifiRouteEntry::new(None, self_imp.connection.clone(), IPv6);
|
||||
self_imp.reset_ip6_routes_group.add(route);
|
||||
// Security
|
||||
}
|
||||
|
||||
pub fn set_ip4_visibility(&self, method: u32) {
|
||||
|
@ -352,29 +352,35 @@ fn setup_callbacks(wifi_options: &Arc<WifiOptions>, path: Path<'static>) {
|
|||
let selected = dropdown.selected();
|
||||
let mut conn = imp.connection.borrow_mut();
|
||||
|
||||
match (selected, &mut conn.device) {
|
||||
(0 , TypeSettings::WIFI(_, wifi_security)) => { // None
|
||||
match selected {
|
||||
0 => { // None
|
||||
imp.reset_wifi_password.set_visible(false);
|
||||
wifi_security.key_management = KeyManagement::NONE;
|
||||
wifi_security.authentication_algorithm = String::from("none");
|
||||
conn.security.key_management = KeyManagement::NONE;
|
||||
conn.security.authentication_algorithm = String::from("none");
|
||||
},
|
||||
(1 , TypeSettings::WIFI(_, wifi_security)) => { // WPA/WPA2 Personal
|
||||
1 => { // WPA/WPA2 Personal
|
||||
imp.reset_wifi_password.set_visible(true);
|
||||
wifi_security.key_management = KeyManagement::WPAPSK;
|
||||
wifi_security.authentication_algorithm = String::from("none");
|
||||
conn.security.key_management = KeyManagement::WPAPSK;
|
||||
conn.security.authentication_algorithm = String::from("none");
|
||||
},
|
||||
(_, _) => {}
|
||||
_ => {}
|
||||
}
|
||||
}));
|
||||
|
||||
imp.reset_wifi_password
|
||||
.connect_changed(clone!(@weak imp => move |entry| {
|
||||
let password_input = entry.text();
|
||||
let mut conn = imp.connection.borrow_mut();
|
||||
if let TypeSettings::WIFI(_, wifi_security) = &mut conn.device {
|
||||
wifi_security.psk = password_input.to_string();
|
||||
}
|
||||
}));
|
||||
imp.reset_wifi_password.connect_changed(clone!(@weak imp => move |entry| {
|
||||
let password_input = entry.text();
|
||||
if password_input.len() < 8 && !password_input.is_empty() {
|
||||
entry.add_css_class("error");
|
||||
} else {
|
||||
entry.remove_css_class("error");
|
||||
}
|
||||
let mut conn = imp.connection.borrow_mut();
|
||||
conn.security.psk = password_input.to_string();
|
||||
}));
|
||||
|
||||
imp.reset_available_networks.set_activatable(true);
|
||||
imp.reset_available_networks
|
||||
.set_action_name(Some("navigation.pop"));
|
||||
}
|
||||
|
||||
fn set_connection_settings(path: Path<'static>, prop: HashMap<String, PropMap>) {
|
||||
|
@ -385,10 +391,11 @@ fn set_connection_settings(path: Path<'static>, prop: HashMap<String, PropMap>)
|
|||
"/org/Xetibo/ReSetDaemon",
|
||||
Duration::from_millis(1000),
|
||||
);
|
||||
let _: Result<(bool,), Error> = proxy.method_call(
|
||||
let asdf: Result<(bool,), Error> = proxy.method_call(
|
||||
"org.Xetibo.ReSetWireless",
|
||||
"SetConnectionSettings",
|
||||
(path, prop),
|
||||
);
|
||||
dbg!(asdf);
|
||||
});
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ use adw::{
|
|||
ActionRow, ComboRow, EntryRow, NavigationPage, PasswordEntryRow, PreferencesGroup, SwitchRow,
|
||||
};
|
||||
use gtk::subclass::prelude::*;
|
||||
use gtk::{glib, Button, CompositeTemplate};
|
||||
use gtk::{glib, Button, CompositeTemplate, Label};
|
||||
use re_set_lib::network::connection::Connection;
|
||||
use std::cell::RefCell;
|
||||
use std::rc::Rc;
|
||||
|
@ -70,7 +70,11 @@ pub struct WifiOptions {
|
|||
pub reset_wifi_password: TemplateChild<PasswordEntryRow>,
|
||||
// Misc
|
||||
#[template_child]
|
||||
pub reset_available_networks: TemplateChild<ActionRow>,
|
||||
#[template_child]
|
||||
pub wifi_options_apply_button: TemplateChild<Button>,
|
||||
#[template_child]
|
||||
pub wifi_options_error_msg: TemplateChild<Label>,
|
||||
pub connection: Rc<RefCell<Connection>>,
|
||||
}
|
||||
|
||||
|
|
|
@ -36,7 +36,7 @@ impl WifiRouteEntry {
|
|||
entry_imp.reset_route_address.set_text(&address.address);
|
||||
entry_imp
|
||||
.reset_route_prefix
|
||||
.set_text(&address.prefix_length.to_string());
|
||||
.set_text(&address.prefix.to_string());
|
||||
if let Some(gateway) = &address.gateway {
|
||||
entry_imp.reset_route_gateway.set_text(gateway);
|
||||
}
|
||||
|
@ -45,7 +45,7 @@ impl WifiRouteEntry {
|
|||
}
|
||||
entry_imp
|
||||
.reset_route_row
|
||||
.set_title(&format!("{}/{}", &*address.address, address.prefix_length));
|
||||
.set_title(&format!("{}/{}", &*address.address, address.prefix));
|
||||
}
|
||||
entry_imp.protocol.set(protocol);
|
||||
entry.setup_callbacks(conn);
|
||||
|
@ -54,8 +54,8 @@ impl WifiRouteEntry {
|
|||
|
||||
fn setup_callbacks(&self, connection: Rc<RefCell<Connection>>) {
|
||||
let self_imp = self.imp();
|
||||
|
||||
let conn = connection.clone();
|
||||
dbg!(conn.borrow());
|
||||
self_imp.reset_route_address.connect_changed(clone!(@weak self_imp => move |entry| {
|
||||
let address_input = entry.text();
|
||||
let mut conn = conn.borrow_mut();
|
||||
|
@ -116,7 +116,7 @@ impl WifiRouteEntry {
|
|||
if let Ok(address2) = Ipv4Addr::from_str(self_imp.reset_route_address.text().as_str()) {
|
||||
if let Some(addr) = conn.ipv4.route_data.iter_mut()
|
||||
.find(|conn_addr| *conn_addr.address == address2.to_string()) {
|
||||
addr.prefix_length = prefix as u32;
|
||||
addr.prefix = prefix as u32;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -126,7 +126,7 @@ impl WifiRouteEntry {
|
|||
if let Ok(address2) = Ipv6Addr::from_str(self_imp.reset_route_address.text().as_str()) {
|
||||
if let Some(addr) = conn.ipv6.route_data.iter_mut()
|
||||
.find(|conn_addr| *conn_addr.address == address2.to_string()) {
|
||||
addr.prefix_length = prefix as u32;
|
||||
addr.prefix = prefix as u32;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -228,7 +228,7 @@
|
|||
(20,2,"AdwComboRow","reset_card_entry",None,None,None,None,None,None),
|
||||
(21,1,"AdwNavigationPage","resetWifiOptions",None,None,None,None,-1,None),
|
||||
(21,52,"GtkBox",None,1,None,None,None,-1,None),
|
||||
(21,53,"GtkNotebook",None,52,None,None,None,None,None),
|
||||
(21,53,"GtkNotebook",None,52,None,None,None,1,None),
|
||||
(21,54,"GtkBox",None,53,None,None,None,None,None),
|
||||
(21,55,"AdwPreferencesGroup",None,54,None,None,None,None,None),
|
||||
(21,56,"AdwActionRow","reset_wifi_name",55,None,None,None,None,None),
|
||||
|
@ -247,7 +247,6 @@
|
|||
(21,69,"AdwComboRow","reset_ip4_method",68,None,None,None,None,None),
|
||||
(21,70,"GtkStringList",None,69,None,None,None,None,None),
|
||||
(21,71,"AdwEntryRow","reset_ip4_dns",68,None,None,None,1,None),
|
||||
(21,72,"AdwEntryRow","reset_ip4_gateway",68,None,None,None,2,None),
|
||||
(21,73,"AdwPreferencesGroup","reset_ip4_address_group",67,None,None,None,1,None),
|
||||
(21,74,"AdwPreferencesGroup","reset_ip4_routes_group",67,None,None,None,2,None),
|
||||
(21,75,"GtkBox",None,74,None,None,None,None,None),
|
||||
|
@ -271,12 +270,18 @@
|
|||
(21,93,"AdwComboRow","reset_wifi_security_dropdown",92,None,None,None,None,None),
|
||||
(21,96,"AdwPasswordEntryRow","reset_wifi_password",92,None,None,None,1,None),
|
||||
(21,97,"GtkLabel",None,53,None,"tab",None,7,None),
|
||||
(21,98,"GtkButton","wifi_options_apply_button",52,None,None,None,1,None),
|
||||
(21,99,"GtkButton","reset_ip4_address_add_button",73,None,None,None,-1,None),
|
||||
(21,100,"GtkButton","reset_ip4_route_add_button",75,None,None,None,2,None),
|
||||
(21,101,"GtkButton","reset_ip6_address_add_button",85,None,None,None,-1,None),
|
||||
(21,102,"GtkButton","reset_ip6_route_add_button",87,None,None,None,2,None),
|
||||
(21,103,"GtkStringList",None,93,None,None,None,-1,None),
|
||||
(21,104,"GtkBox",None,52,None,None,None,2,None),
|
||||
(21,105,"GtkButton","wifi_options_apply_button",104,None,None,None,1,None),
|
||||
(21,106,"GtkLabel","wifi_options_error_msg",104,None,None,None,None,None),
|
||||
(21,107,"AdwEntryRow","reset_ip4_gateway",73,None,None,None,None,None),
|
||||
(21,108,"AdwPreferencesGroup",None,52,None,None,None,None,None),
|
||||
(21,109,"AdwActionRow","reset_available_networks",108,None,None,None,None,None),
|
||||
(21,110,"GtkImage",None,109,None,None,None,None,None),
|
||||
(22,1,"GtkBox","resetWifiAddressEntry",None,None,None,None,-1,None),
|
||||
(22,2,"AdwExpanderRow","reset_address_row",1,None,None,None,-1,None),
|
||||
(22,5,"GtkButton","reset_address_remove",1,None,None,None,-1,None),
|
||||
|
@ -722,6 +727,7 @@
|
|||
(21,52,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
||||
(21,53,"GtkNotebook","scrollable","True",None,None,None,None,None,None,None,None,None),
|
||||
(21,53,"GtkNotebook","show-border","False",None,None,None,None,None,None,None,None,None),
|
||||
(21,53,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
|
||||
(21,54,"GtkOrientable","orientation","vertical",None,None,None,None,None,None,None,None,None),
|
||||
(21,54,"GtkWidget","margin-top","5",None,None,None,None,None,None,None,None,None),
|
||||
(21,56,"AdwPreferencesRow","title","WiFi Name",None,None,None,None,None,None,None,None,None),
|
||||
|
@ -748,7 +754,6 @@
|
|||
(21,69,"AdwComboRow","model",None,None,None,None,None,70,None,None,None,None),
|
||||
(21,69,"AdwPreferencesRow","title","IPv4 Method",None,None,None,None,None,None,None,None,None),
|
||||
(21,71,"AdwPreferencesRow","title","DNS (separate IP by comma, empty for automatic)",None,None,None,None,None,None,None,None,None),
|
||||
(21,72,"AdwPreferencesRow","title","Gateway",None,None,None,None,None,None,None,None,None),
|
||||
(21,73,"AdwPreferencesGroup","header-suffix",None,None,None,None,None,99,None,None,None,None),
|
||||
(21,73,"AdwPreferencesGroup","title","Addresses",None,None,None,None,None,None,None,None,None),
|
||||
(21,73,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
|
||||
|
@ -781,15 +786,25 @@
|
|||
(21,93,"AdwPreferencesRow","title","Security",None,None,None,None,None,None,None,None,None),
|
||||
(21,96,"AdwPreferencesRow","title","Password",None,None,None,None,None,None,None,None,None),
|
||||
(21,97,"GtkLabel","label","Security",None,None,None,None,None,None,None,None,None),
|
||||
(21,98,"GtkButton","label","Apply",None,None,None,None,None,None,None,None,None),
|
||||
(21,98,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
||||
(21,98,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
|
||||
(21,99,"GtkButton","icon-name","list-add-symbolic",None,None,None,None,None,None,None,None,None),
|
||||
(21,100,"GtkButton","icon-name","list-add-symbolic",None,None,None,None,None,None,None,None,None),
|
||||
(21,100,"GtkWidget","margin-start","10",None,None,None,None,None,None,None,None,None),
|
||||
(21,101,"GtkButton","icon-name","list-add-symbolic",None,None,None,None,None,None,None,None,None),
|
||||
(21,102,"GtkButton","icon-name","list-add-symbolic",None,None,None,None,None,None,None,None,None),
|
||||
(21,102,"GtkWidget","margin-start","10",None,None,None,None,None,None,None,None,None),
|
||||
(21,104,"GtkBox","spacing","10",None,None,None,None,None,None,None,None,None),
|
||||
(21,104,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
||||
(21,104,"GtkWidget","margin-top","10",None,None,None,None,None,None,None,None,None),
|
||||
(21,105,"GtkButton","label","Apply",None,None,None,None,None,None,None,None,None),
|
||||
(21,105,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
||||
(21,106,"GtkWidget","halign","center",None,None,None,None,None,None,None,None,None),
|
||||
(21,106,"GtkWidget","valign","center",None,None,None,None,None,None,None,None,None),
|
||||
(21,107,"AdwPreferencesRow","title","Gateway",None,None,None,None,None,None,None,None,None),
|
||||
(21,109,"AdwPreferencesRow","title","Available Networks",None,None,None,None,None,None,None,None,None),
|
||||
(21,110,"GtkImage","icon-name","go-previous-symbolic",None,None,None,None,None,None,None,None,None),
|
||||
(21,110,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
|
||||
(21,110,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
|
||||
(21,110,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),
|
||||
(22,1,"GtkWidget","margin-bottom","2",None,None,None,None,None,None,None,None,None),
|
||||
(22,1,"GtkWidget","margin-top","2",None,None,None,None,None,None,None,None,None),
|
||||
(22,2,"AdwPreferencesRow","title","Add new Address",None,None,None,None,None,None,None,None,None),
|
||||
|
|
|
@ -7,8 +7,26 @@
|
|||
<child>
|
||||
<object class="GtkBox">
|
||||
<property name="orientation">vertical</property>
|
||||
<child>
|
||||
<object class="AdwPreferencesGroup">
|
||||
<child>
|
||||
<object class="AdwActionRow" id="reset_available_networks">
|
||||
<property name="title">Available Networks</property>
|
||||
<child>
|
||||
<object class="GtkImage">
|
||||
<property name="halign">end</property>
|
||||
<property name="hexpand">True</property>
|
||||
<property name="icon-name">go-previous-symbolic</property>
|
||||
<property name="margin-end">5</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkNotebook">
|
||||
<property name="margin-top">10</property>
|
||||
<property name="scrollable">True</property>
|
||||
<property name="show-border">False</property>
|
||||
<child>
|
||||
|
@ -111,11 +129,6 @@
|
|||
<property name="title">DNS (separate IP by comma, empty for automatic)</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="AdwEntryRow" id="reset_ip4_gateway">
|
||||
<property name="title">Gateway</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
|
@ -127,6 +140,11 @@
|
|||
</property>
|
||||
<property name="margin-top">10</property>
|
||||
<property name="title">Addresses</property>
|
||||
<child>
|
||||
<object class="AdwEntryRow" id="reset_ip4_gateway">
|
||||
<property name="title">Gateway</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
|
@ -279,10 +297,22 @@
|
|||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="wifi_options_apply_button">
|
||||
<object class="GtkBox">
|
||||
<property name="halign">end</property>
|
||||
<property name="label">Apply</property>
|
||||
<property name="margin-top">10</property>
|
||||
<property name="spacing">10</property>
|
||||
<child>
|
||||
<object class="GtkLabel" id="wifi_options_error_msg">
|
||||
<property name="halign">center</property>
|
||||
<property name="valign">center</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkButton" id="wifi_options_apply_button">
|
||||
<property name="halign">end</property>
|
||||
<property name="label">Apply</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
|
|
Loading…
Reference in a new issue