Skip to content

Commit d541ca3

Browse files
authored
Port to Gtk 4 (#1896)
1 parent 0ccc15e commit d541ca3

31 files changed

Lines changed: 542 additions & 806 deletions

‎.github/workflows/main.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ jobs:
2525
- name: Install Dependencies
2626
run: |
2727
apt update
28-
apt install -y gettext libappstream-dev libflatpak-dev libportal-dev libportal-gtk3-dev libgee-0.8-dev libgranite-dev libgtk-3-dev libhandy-1-dev libjson-glib-dev libpackagekit-glib2-dev libsoup-3.0-dev libxml2-dev libxml2-utils libpolkit-gobject-1-dev meson valac
28+
apt install -y gettext libadwaita-1-dev libappstream-dev libflatpak-dev libgee-0.8-dev libgranite-7-dev libgtk-4-dev libjson-glib-dev libpackagekit-glib2-dev libportal-dev libportal-gtk4-dev libsoup-3.0-dev libxml2-dev libxml2-utils libpolkit-gobject-1-dev meson valac
2929
- name: Build and Test
3030
env:
3131
DESTDIR: out

‎README.md‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,12 @@ An open, pay-what-you-want app store for indie developers.
99

1010
You'll need the following dependencies:
1111
* gettext
12-
* libappstream-dev (>= 0.10)
13-
* libflatpak-dev
12+
* libadwaita-1-dev
13+
* libappstream-dev (>= 0.15.2)
14+
* libflatpak-dev (>= 1.0.7)
1415
* libgee-0.8-dev
15-
* libgranite-dev (>=5.2.5)
16-
* libgtk-3-dev
17-
* libhandy-1-dev (>=1.3.0)
16+
* libgranite-7-dev (>=7.1.0)
17+
* libgtk-4-dev
1818
* libjson-glib-dev
1919
* libpackagekit-glib2-dev
2020
* libpolkit-gobject-1-dev

‎data/io.elementary.appcenter.gresource.xml‎

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,13 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<gresources>
33
<gresource prefix="/io/elementary/appcenter">
4-
<file alias="application.css" compressed="true">styles/application.css</file>
4+
<file alias="Application.css" compressed="true">styles/application.css</file>
55
<file alias="AppInfoView.css" compressed="true">styles/AppInfoView.css</file>
66
<file alias="AppListUpdateView.css" compressed="true">styles/AppListUpdateView.css</file>
77
<file alias="arrow.css" compressed="true">styles/arrow.css</file>
88
<file alias="badge.css" compressed="true">styles/badge.css</file>
99
<file alias="banner.css" compressed="true">styles/banner.css</file>
1010
<file alias="categories.css" compressed="true">styles/categories.css</file>
11-
<file alias="fallback.css" compressed="true">styles/fallback.css</file>
1211
<file alias="loading.css" compressed="true">styles/loading.css</file>
1312
<file alias="ProgressButton.css" compressed="true">styles/ProgressButton.css</file>
1413
</gresource>

‎data/styles/arrow.css‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
margin: 12px;
3030
padding: 6px;
3131
color: @text_color;
32+
-gtk-icon-size: 24px;
3233
}
3334

3435
.arrow:active,

‎data/styles/banner.css‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@
7777

7878
/*Hack to make the button square-ish*/
7979
.banner button.image-button.raised {
80-
padding: 0.333rem 0.444rem;
80+
padding: 0 0.333em;
8181
}
8282

8383
.banner button:not(.suggested-action) {

‎data/styles/categories.css‎

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -599,7 +599,7 @@
599599
radial-gradient(
600600
circle,
601601
alpha(@STRAWBERRY_900, 0) 65%,
602-
alpha(shade(@STRAWBERRY_900, 0.6), 0.35) 4%
602+
alpha(shade(@STRAWBERRY_900, 0.6), 0.35) 66%
603603
),
604604
linear-gradient(
605605
to bottom,
@@ -651,19 +651,19 @@
651651
background-image:
652652
linear-gradient(
653653
to right,
654-
transparent 42px,
655-
alpha(@STRAWBERRY_100, 0.25) 42px,
656-
alpha(@STRAWBERRY_100, 0.25) 44px,
657-
transparent 44px
654+
transparent 1.3em,
655+
alpha(@STRAWBERRY_100, 0.25) 1.3em,
656+
alpha(@STRAWBERRY_100, 0.25) calc(1.3em + 2px),
657+
transparent calc(1.3em + 2px)
658658
),
659659
linear-gradient(
660660
to bottom,
661-
white 90%,
662-
alpha(@BLUEBERRY_100, 0.2) 90%
661+
transparent 0.9em,
662+
alpha(@BLUEBERRY_100, 0.2) 0.9em
663663
);
664-
background-position: center center;
665-
background-repeat: repeat-y;
666-
background-size: 100% 1em;
664+
background-position: center center, center 0.7em;
665+
background-repeat: no-repeat, repeat-y;
666+
background-size: auto auto, 110% 1em; /* Gtk.CSS bug requiring over 100% width maybe? */
667667
color: @BLACK_300;
668668
font-size: 24px;
669669
}

‎data/styles/fallback.css‎

Lines changed: 0 additions & 81 deletions
This file was deleted.

‎meson.build‎

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ i18n = import('i18n')
1111

1212
add_project_arguments(
1313
'-DGETTEXT_PACKAGE="@0@"'.format(gettext_name),
14-
'-DHANDY_USE_UNSTABLE_API',
1514
'-DI_KNOW_THE_PACKAGEKIT_GLIB2_API_IS_SUBJECT_TO_CHANGE',
1615
language:'c'
1716
)
@@ -23,17 +22,17 @@ glib = dependency ('glib-2.0')
2322
gobject = dependency ('gobject-2.0')
2423
gio = dependency ('gio-2.0')
2524
gee = dependency ('gee-0.8')
26-
gtk = dependency ('gtk+-3.0', version: '>=3.10')
27-
granite = dependency ('granite', version: '>=6.0.0')
28-
handy = dependency('libhandy-1', version: '>=1.4.0')
25+
gtk = dependency ('gtk4')
26+
granite = dependency ('granite-7', version: '>=7.3.0')
27+
adwaita = dependency('libadwaita-1')
2928
appstream = dependency ('appstream', version: '>=0.15.2')
3029
libsoup = dependency ('libsoup-3.0')
3130
json = dependency ('json-glib-1.0')
3231
flatpak = dependency ('flatpak')
3332
xml = dependency ('libxml-2.0')
3433
polkit = dependency ('polkit-gobject-1')
3534
portal = dependency('libportal')
36-
portal_gtk3 = dependency('libportal-gtk3')
35+
portal_gtk4 = dependency('libportal-gtk4')
3736
posix = meson.get_compiler('vala').find_library('posix')
3837

3938
dbus = dependency ('dbus-1')
@@ -49,13 +48,13 @@ core_deps = [
4948
dependencies = core_deps + [
5049
gtk,
5150
granite,
52-
handy,
51+
adwaita,
5352
appstream,
5453
flatpak,
5554
xml,
5655
polkit,
5756
portal,
58-
portal_gtk3,
57+
portal_gtk4,
5958
posix
6059
]
6160

‎src/Application.vala‎

Lines changed: 15 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ public class AppCenter.App : Gtk.Application {
116116
protected override void startup () {
117117
base.startup ();
118118

119-
Hdy.init ();
119+
Granite.init ();
120120

121121
var granite_settings = Granite.Settings.get_default ();
122122
var gtk_settings = Gtk.Settings.get_default ();
@@ -127,22 +127,6 @@ public class AppCenter.App : Gtk.Application {
127127
gtk_settings.gtk_application_prefer_dark_theme = granite_settings.prefers_color_scheme == Granite.Settings.ColorScheme.DARK;
128128
});
129129

130-
var provider = new Gtk.CssProvider ();
131-
provider.load_from_resource ("io/elementary/appcenter/application.css");
132-
Gtk.StyleContext.add_provider_for_screen (
133-
Gdk.Screen.get_default (),
134-
provider,
135-
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
136-
);
137-
138-
var fallback_provider = new Gtk.CssProvider ();
139-
fallback_provider.load_from_resource ("io/elementary/appcenter/fallback.css");
140-
Gtk.StyleContext.add_provider_for_screen (
141-
Gdk.Screen.get_default (),
142-
fallback_provider,
143-
Gtk.STYLE_PROVIDER_PRIORITY_FALLBACK
144-
);
145-
146130
var quit_action = new SimpleAction ("quit", null);
147131
quit_action.activate.connect (() => {
148132
if (active_window != null) {
@@ -250,13 +234,19 @@ public class AppCenter.App : Gtk.Application {
250234
var main_window = new MainWindow (this);
251235
add_window (main_window);
252236

253-
var window_height = App.settings.get_int ("window-height");
254-
var window_width = App.settings.get_int ("window-width");
255-
main_window.resize (window_width, window_height);
237+
/*
238+
* This is very finicky. Bind size after present else set_titlebar gives us bad sizes
239+
* Set maximize after height/width else window is min size on unmaximize
240+
* Bind maximize as SET else get get bad sizes
241+
*/
242+
settings.bind ("window-height", main_window, "default-height", SettingsBindFlags.DEFAULT);
243+
settings.bind ("window-width", main_window, "default-width", SettingsBindFlags.DEFAULT);
256244

257245
if (settings.get_boolean ("window-maximized")) {
258246
main_window.maximize ();
259247
}
248+
249+
settings.bind ("window-maximized", main_window, "maximized", SettingsBindFlags.SET);
260250
}
261251

262252
if (show_updates) {
@@ -356,14 +346,9 @@ public class AppCenter.App : Gtk.Application {
356346
if (error == null) {
357347
if (package.get_can_launch ()) {
358348
// Check if window is focused
359-
if (active_window != null) {
360-
var main_window = (MainWindow) active_window;
361-
var win = main_window.get_window ();
362-
if (win != null && (win.get_state () & Gdk.WindowState.FOCUSED) != 0) {
363-
main_window.send_installed_toast (package);
364-
365-
break;
366-
}
349+
if (active_window != null && active_window.is_active) {
350+
((MainWindow) active_window).send_installed_toast (package);
351+
break;
367352
}
368353

369354
var notification = new Notification (_("The app has been installed"));
@@ -406,8 +391,9 @@ public class AppCenter.App : Gtk.Application {
406391
transient_for = active_window
407392
};
408393

409-
update_fail_dialog.destroy.connect (() => {
394+
update_fail_dialog.close_request.connect (() => {
410395
update_fail_dialog = null;
396+
return Gdk.EVENT_PROPAGATE;
411397
});
412398
}
413399

‎src/Core/Package.vala‎

Lines changed: 3 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -718,13 +718,12 @@ public class AppCenterCore.Package : Object {
718718
uint current_scale = 0;
719719
uint pixel_size = size * scale_factor;
720720

721-
weak GenericArray<AppStream.Icon> icons = component.get_icons ();
722-
for (int i = 0; i < icons.length; i++) {
723-
weak AppStream.Icon _icon = icons[i];
721+
unowned var icons = component.get_icons ();
722+
foreach (unowned var _icon in icons) {
724723
switch (_icon.get_kind ()) {
725724
case AppStream.IconKind.STOCK:
726725
unowned string icon_name = _icon.get_name ();
727-
if (Gtk.IconTheme.get_default ().has_icon (icon_name)) {
726+
if (Gtk.IconTheme.get_for_display (Gdk.Display.get_default ()).has_icon (icon_name)) {
728727
return new ThemedIcon (icon_name);
729728
}
730729

@@ -742,19 +741,6 @@ public class AppCenterCore.Package : Object {
742741
current_scale = icon_scale;
743742
}
744743

745-
break;
746-
case AppStream.IconKind.REMOTE:
747-
var icon_scale = _icon.get_scale ();
748-
var icon_width = _icon.get_width () * icon_scale;
749-
bool is_bigger = (icon_width > current_size && current_size < pixel_size);
750-
bool has_better_dpi = (icon_width == current_size && current_scale < icon_scale && scale_factor <= icon_scale);
751-
if (is_bigger || has_better_dpi) {
752-
var file = File.new_for_uri (_icon.get_url ());
753-
icon = new FileIcon (file);
754-
current_size = icon_width;
755-
current_scale = icon_scale;
756-
}
757-
758744
break;
759745

760746
case AppStream.IconKind.UNKNOWN:

0 commit comments

Comments
 (0)