Skip to content

Commit e3aed98

Browse files
authored
Port to Gtk4 (#322)
1 parent bb657b1 commit e3aed98

19 files changed

Lines changed: 159 additions & 7769 deletions

.github/workflows/main.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ jobs:
2323
- name: Install Dependencies
2424
run: |
2525
apt update
26-
apt install -y gobject-introspection libgranite-dev libnm-dev libnma-dev libwingpanel-dev libpolkit-gobject-1-dev meson valac
26+
apt install -y gobject-introspection libgranite-7-dev libnm-dev libnma-gtk4-dev libwingpanel-9-dev libpolkit-gobject-1-dev meson valac
2727
- name: Build
2828
env:
2929
DESTDIR: out

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,11 @@ You'll need the following dependencies:
99

1010
* gobject-introspection
1111
* libglib2.0-dev (>= 2.74)
12-
* libgranite-dev
12+
* libgranite-7-dev
1313
* libnm-dev (>= 1.24)
14-
* libnma-dev
14+
* libnma-gtk4-dev
1515
* libpolkit-gobject-1-dev
16-
* libwingpanel-dev
16+
* libwingpanel-9-dev
1717
* meson
1818
* valac
1919

meson.build

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ add_project_arguments(
2121

2222
add_project_arguments('-DG_LOG_DOMAIN="io.elementary.wingpanel.network"', language:'c')
2323

24-
wingpanel_dep = dependency('wingpanel')
24+
wingpanel_dep = dependency('wingpanel-9')
2525
wingpanel_indicatorsdir = wingpanel_dep.get_variable('indicatorsdir', pkgconfig_define: ['libdir', libdir])
2626

2727
config_data = configuration_data()
@@ -62,10 +62,10 @@ shared_module(
6262
dependency('gio-2.0', version: '>=2.74'),
6363
dependency('glib-2.0'),
6464
dependency('gobject-2.0'),
65-
dependency('granite'),
66-
dependency('gtk+-3.0'),
65+
dependency('granite-7'),
66+
dependency('gtk4'),
6767
dependency('libnm', version: '>=1.24'),
68-
dependency('libnma'),
68+
dependency('libnma-gtk4'),
6969
polkit_dep,
7070
meson.get_compiler('vala').find_library('posix'),
7171
wingpanel_dep

src/Indicator.vala

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,6 @@ public class Network.Indicator : Wingpanel.Indicator {
2323
NetworkMonitor network_monitor;
2424

2525
private RFKillManager rfkill;
26-
private Gtk.GestureMultiPress gesture_click;
2726
private SimpleAction airplane_action;
2827

2928
public bool is_in_session { get; set; default = false; }
@@ -32,7 +31,7 @@ public class Network.Indicator : Wingpanel.Indicator {
3231
GLib.Intl.bindtextdomain (GETTEXT_PACKAGE, LOCALEDIR);
3332
GLib.Intl.bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
3433

35-
unowned var icon_theme = Gtk.IconTheme.get_default ();
34+
unowned var icon_theme = Gtk.IconTheme.get_for_display (Gdk.Display.get_default ());
3635
icon_theme.add_resource_path ("/io/elementary/wingpanel/network");
3736

3837
Object (code_name: Wingpanel.Indicator.NETWORK,
@@ -44,8 +43,8 @@ public class Network.Indicator : Wingpanel.Indicator {
4443
var provider = new Gtk.CssProvider ();
4544
provider.load_from_resource ("io/elementary/wingpanel/network/Indicator.css");
4645

47-
Gtk.StyleContext.add_provider_for_screen (
48-
Gdk.Screen.get_default (),
46+
Gtk.StyleContext.add_provider_for_display (
47+
Gdk.Display.get_default (),
4948
provider,
5049
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
5150
);
@@ -57,9 +56,11 @@ public class Network.Indicator : Wingpanel.Indicator {
5756
popover_widget.settings_shown.connect (() => { close (); });
5857

5958
if (is_in_session) {
60-
gesture_click = new Gtk.GestureMultiPress (display_widget) {
59+
var gesture_click = new Gtk.GestureClick () {
6160
button = Gdk.BUTTON_MIDDLE
6261
};
62+
display_widget.add_controller (gesture_click);
63+
6364
gesture_click.pressed.connect (() => {
6465
airplane_action.activate (null);
6566
gesture_click.set_state (CLAIMED);
@@ -79,8 +80,7 @@ public class Network.Indicator : Wingpanel.Indicator {
7980
airplane_action.set_state (new Variant.boolean (rfkill.airplane_mode));
8081
});
8182

82-
var action_group = (SimpleActionGroup) popover_widget.get_action_group ("network");
83-
action_group.add_action (airplane_action);
83+
popover_widget.action_group.add_action (airplane_action);
8484

8585
update_tooltip ();
8686
on_state_changed ();

src/Widgets/DisplayWidget.vala

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class Network.Widgets.DisplayWidget : Gtk.Box {
1414
private int cellular_animation_state = 0;
1515

1616
construct {
17-
image = new Gtk.Image.from_icon_name ("panel-network-wired-connected-symbolic", Gtk.IconSize.LARGE_TOOLBAR) {
17+
image = new Gtk.Image.from_icon_name ("panel-network-wired-connected-symbolic") {
1818
pixel_size = 24
1919
};
2020

@@ -29,8 +29,8 @@ public class Network.Widgets.DisplayWidget : Gtk.Box {
2929
transition_type = SLIDE_LEFT
3030
};
3131

32-
add (image);
33-
add (extra_info_revealer);
32+
append (image);
33+
append (extra_info_revealer);
3434
}
3535

3636
public void update_state (Network.State state, bool secure, string? extra_info = null) {

src/Widgets/EtherInterface.vala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public class Network.EtherInterface : Network.WidgetNMInterface {
3030
text = display_title
3131
};
3232

33-
add (ethernet_item);
33+
append (ethernet_item);
3434

3535
bind_property ("display-title", ethernet_item, "text");
3636

src/Widgets/ModemInterface.vala

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,20 +61,20 @@ public class Network.ModemInterface : Network.WidgetNMInterface {
6161

6262
modem_item = new Gtk.ToggleButton () {
6363
halign = Gtk.Align.CENTER,
64-
image = new Gtk.Image.from_icon_name ("panel-network-cellular-connected-symbolic", Gtk.IconSize.MENU)
64+
icon_name = "panel-network-cellular-connected-symbolic"
6565
};
6666

6767
var label = new Gtk.Label (display_title) {
6868
ellipsize = Pango.EllipsizeMode.MIDDLE,
6969
max_width_chars = 16
7070
};
71-
label.get_style_context ().add_class (Granite.STYLE_CLASS_SMALL_LABEL);
71+
label.add_css_class (Granite.STYLE_CLASS_SMALL_LABEL);
7272

7373
hexpand = true;
7474
orientation = Gtk.Orientation.VERTICAL;
7575
spacing = 3;
76-
add (modem_item);
77-
add (label);
76+
append (modem_item);
77+
append (label);
7878

7979
bind_property ("display-title", label, "label");
8080

@@ -100,15 +100,15 @@ public class Network.ModemInterface : Network.WidgetNMInterface {
100100
sensitive = false;
101101
modem_item.active = false;
102102
state = State.FAILED_MOBILE;
103-
((Gtk.Image ) modem_item.image).icon_name = "panel-network-cellular-error-symbolic";
103+
modem_item.icon_name = "panel-network-cellular-error-symbolic";
104104
break;
105105

106106
case NM.DeviceState.DISCONNECTED:
107107
case NM.DeviceState.DEACTIVATING:
108108
sensitive = true;
109109
modem_item.active = false;
110110
state = State.FAILED_MOBILE;
111-
((Gtk.Image ) modem_item.image).icon_name = "panel-network-cellular-disconnected-symbolic";
111+
modem_item.icon_name = "panel-network-cellular-disconnected-symbolic";
112112
break;
113113

114114
case NM.DeviceState.PREPARE:
@@ -120,14 +120,14 @@ public class Network.ModemInterface : Network.WidgetNMInterface {
120120
sensitive = true;
121121
modem_item.active = true;
122122
state = State.CONNECTING_MOBILE;
123-
((Gtk.Image ) modem_item.image).icon_name = "panel-network-cellular-acquiring-symbolic";
123+
modem_item.icon_name = "panel-network-cellular-acquiring-symbolic";
124124
break;
125125

126126
case NM.DeviceState.ACTIVATED:
127127
sensitive = true;
128128
modem_item.active = true;
129129
state = strength_to_state (signal_quality);
130-
((Gtk.Image ) modem_item.image).icon_name = "panel-network-cellular-connected-symbolic-symbolic";
130+
modem_item.icon_name = "panel-network-cellular-connected-symbolic-symbolic";
131131
break;
132132
}
133133
}

src/Widgets/PopoverWidget.vala

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public class Network.Widgets.PopoverWidget : Gtk.Box {
77
public NM.Client nm_client { get; construct; }
88

99
public GLib.List<WidgetNMInterface>? network_interface { get; private owned set; }
10+
public SimpleActionGroup action_group { get; private set; }
1011

1112
public bool secure { private set; get; default = false; }
1213
public string? extra_info { private set; get; default = null; }
@@ -15,7 +16,7 @@ public class Network.Widgets.PopoverWidget : Gtk.Box {
1516
private Gtk.FlowBox other_box;
1617
private Gtk.Box wifi_box;
1718
private Gtk.Box vpn_box;
18-
private Gtk.ModelButton hidden_item;
19+
private Wingpanel.PopoverMenuItem hidden_item;
1920
private Gtk.Revealer toggle_revealer;
2021

2122
public bool is_in_session { get; construct; }
@@ -62,7 +63,7 @@ public class Network.Widgets.PopoverWidget : Gtk.Box {
6263
text = _("Airplane Mode")
6364
};
6465

65-
var action_group = new SimpleActionGroup ();
66+
action_group = new SimpleActionGroup ();
6667
action_group.action_state_changed.connect ((action_name, state) => {
6768
if (action_name == "airplane-mode") {
6869
if (state.get_boolean ()) {
@@ -81,35 +82,35 @@ public class Network.Widgets.PopoverWidget : Gtk.Box {
8182
child = airplane_toggle
8283
};
8384

84-
other_box.add (airplane_child);
85+
other_box.append (airplane_child);
8586

8687
var other_sep = new Gtk.Separator (Gtk.Orientation.HORIZONTAL) {
8788
margin_top = 3,
8889
margin_bottom = 3
8990
};
9091

9192
var toggle_box = new Gtk.Box (Gtk.Orientation.VERTICAL, 0);
92-
toggle_box.add (other_box);
93-
toggle_box.add (other_sep);
93+
toggle_box.append (other_box);
94+
toggle_box.append (other_sep);
9495

9596
toggle_revealer = new Gtk.Revealer () {
9697
child = toggle_box
9798
};
9899

99-
add (toggle_revealer);
100-
add (vpn_box);
101-
add (wifi_box);
100+
append (toggle_revealer);
101+
append (vpn_box);
102+
append (wifi_box);
102103

103104
if (is_in_session) {
104-
hidden_item = new Gtk.ModelButton ();
105+
hidden_item = new Wingpanel.PopoverMenuItem ();
105106
hidden_item.text = _("Connect to Hidden Network…");
106-
hidden_item.no_show_all = true;
107+
hidden_item.visible = false;
107108

108-
var show_settings_button = new Gtk.ModelButton ();
109+
var show_settings_button = new Wingpanel.PopoverMenuItem ();
109110
show_settings_button.text = _("Network Settings…");
110111

111-
add (hidden_item);
112-
add (show_settings_button);
112+
append (hidden_item);
113+
append (show_settings_button);
113114

114115
show_settings_button.clicked.connect (show_settings);
115116
}
@@ -124,7 +125,6 @@ public class Network.Widgets.PopoverWidget : Gtk.Box {
124125
}
125126

126127
toggle_revealer.reveal_child = other_box.get_child_at_index (0) != null;
127-
show_all ();
128128
update_vpn_connection ();
129129

130130
hidden_item.clicked.connect (() => {
@@ -148,23 +148,21 @@ public class Network.Widgets.PopoverWidget : Gtk.Box {
148148

149149
private void add_interface (WidgetNMInterface widget_interface) {
150150
if (widget_interface is EtherInterface || widget_interface is ModemInterface) {
151-
152151
var flowboxchild = new Gtk.FlowBoxChild () {
153152
// Prevent weird double focus border
154153
can_focus = false,
155154
child = widget_interface
156155
};
157156

158-
other_box.add (flowboxchild);
157+
other_box.append (flowboxchild);
159158
return;
160159
}
161160

162161
var container_box = wifi_box;
163162

164163
if (widget_interface is Network.WifiInterface) {
165164
container_box = wifi_box;
166-
hidden_item.no_show_all = false;
167-
hidden_item.show_all ();
165+
hidden_item.visible = true;
168166

169167
((Network.WifiInterface) widget_interface).notify["hidden-sensitivity"].connect (() => {
170168
bool hidden_sensitivity = false;
@@ -183,11 +181,11 @@ public class Network.Widgets.PopoverWidget : Gtk.Box {
183181
container_box = vpn_box;
184182
}
185183

186-
if (is_in_session && get_children ().length () > 0) {
187-
container_box.pack_end (widget_interface.sep);
188-
}
184+
container_box.append (widget_interface);
189185

190-
container_box.pack_end (widget_interface);
186+
if (is_in_session && get_first_child != null) {
187+
container_box.append (widget_interface.sep);
188+
}
191189
}
192190

193191
public void opened () {
@@ -287,7 +285,6 @@ public class Network.Widgets.PopoverWidget : Gtk.Box {
287285

288286
toggle_revealer.reveal_child = other_box.get_child_at_index (0) != null;
289287
update_state ();
290-
show_all ();
291288
}
292289

293290
private void update_state () {

src/Widgets/SettingsToggle.vala

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,18 +9,13 @@ public class Network.SettingsToggle : Gtk.Box {
99
public string text { get; set; }
1010
public string settings_uri { get; set; default = "settings://"; }
1111

12-
private Gtk.GestureMultiPress middle_click_gesture;
13-
1412
class construct {
1513
set_css_name ("settings-toggle");
1614
}
1715

1816
construct {
19-
var image = new Gtk.Image ();
20-
2117
var button = new Gtk.ToggleButton () {
22-
halign = CENTER,
23-
image = image
18+
halign = CENTER
2419
};
2520

2621
var label = new Gtk.Label (null) {
@@ -30,19 +25,19 @@ public class Network.SettingsToggle : Gtk.Box {
3025
max_width_chars = 13,
3126
mnemonic_widget = button
3227
};
33-
label.get_style_context ().add_class (Granite.STYLE_CLASS_SMALL_LABEL);
28+
label.add_css_class (Granite.STYLE_CLASS_SMALL_LABEL);
3429

3530
halign = CENTER;
3631
orientation = VERTICAL;
3732
spacing = 3;
38-
add (button);
39-
add (label);
33+
append (button);
34+
append (label);
4035

4136
bind_property ("action-name", button, "action-name");
42-
bind_property ("icon-name", image, "icon-name");
37+
bind_property ("icon-name", button, "icon-name");
4338
bind_property ("text", label, "label");
4439

45-
middle_click_gesture = new Gtk.GestureMultiPress (this) {
40+
var middle_click_gesture = new Gtk.GestureClick () {
4641
button = Gdk.BUTTON_MIDDLE
4742
};
4843
middle_click_gesture.pressed.connect (() => {
@@ -55,5 +50,7 @@ public class Network.SettingsToggle : Gtk.Box {
5550
critical ("Failed to open system settings: %s", e.message);
5651
}
5752
});
53+
54+
add_controller (middle_click_gesture);
5855
}
5956
}

src/Widgets/VpnInterface.vala

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ public class Network.VpnInterface : Network.WidgetNMInterface {
2929
};
3030
flowbox.bind_model (vpn_list, create_widget_func);
3131

32-
add (flowbox);
32+
append (flowbox);
3333

3434
nm_client.get_connections ().foreach ((connection) => vpn_added_cb (connection));
3535
nm_client.get_active_connections ().foreach ((connection) => active_connected_added_cb (connection));
@@ -58,7 +58,6 @@ public class Network.VpnInterface : Network.WidgetNMInterface {
5858
}
5959

6060
private void show_vpn (bool show) {
61-
no_show_all = sep.no_show_all = !show;
6261
visible = sep.visible = show;
6362
}
6463

0 commit comments

Comments
 (0)