Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
46 commits
Select commit Hold shift + click to select a range
091a89a
Bump deps
danirabbit Jul 22, 2025
8b14316
Merge branch 'master' into danirabbit/gtk4
danirabbit Jul 22, 2025
6839753
Update CI
danirabbit Jul 23, 2025
1596ae7
Merge branch 'master' into danirabbit/gtk4
danirabbit Jul 23, 2025
13be7e0
Fix libgtk-4-dev
danirabbit Jul 23, 2025
b690cc3
Comment out gestures for now
danirabbit Jul 23, 2025
f4f496f
Easy API changes
danirabbit Jul 23, 2025
c389bbd
Shumate marker, checkbutton
danirabbit Jul 23, 2025
c343803
Use Granite.Bin
danirabbit Jul 23, 2025
66756b9
merge master
danirabbit Nov 12, 2025
a25fdbb
Merge branch 'master' into danirabbit/gtk4
danirabbit Jan 15, 2026
1396f11
remove clutter deps
danirabbit Nov 12, 2025
00f074b
Modernize state saving
danirabbit Jan 15, 2026
58bca49
Gtk.Bin → Granite.Bin
danirabbit Jan 15, 2026
a101f54
Merge branch 'master' into danirabbit/gtk4
danirabbit Jan 16, 2026
a81bdc6
Controller syntax
danirabbit Jan 16, 2026
08b0656
maps stuff
danirabbit Jan 16, 2026
d1d3e78
Fix extra semicolons
danirabbit Jan 16, 2026
b0625e4
merge master
danirabbit Jan 16, 2026
7b3bcd7
Header: fix controller syntax, no eventbox
danirabbit Jan 16, 2026
1553342
Merge branch 'master' into danirabbit/gtk4
danirabbit Jan 16, 2026
95dfe09
EventMenu: Use GLib.Menu
danirabbit Jan 16, 2026
f33917c
EventMenu: don't subclass menu
danirabbit Jan 16, 2026
78ccf13
Merge master
danirabbit Jan 20, 2026
9c2e83c
Merge menu stuff
danirabbit Jan 20, 2026
89af965
Replace Gtk.Menu with Gtk.PopoverMenu
danirabbit Jan 20, 2026
f7bab89
Next stage
danirabbit Jan 20, 2026
57e8882
Little syntax changes
danirabbit Jan 20, 2026
22b87a9
Update libgranite and libhandy version requirements
danirabbit Jan 20, 2026
831c38a
Update dependencies in README.md
danirabbit Jan 20, 2026
ad5ed73
more syntax fixes
danirabbit Jan 20, 2026
1e44cc2
Merge master
danirabbit Jan 20, 2026
91f2ff9
Merge master
danirabbit Jan 26, 2026
44bc38a
Merge master
danirabbit Jan 26, 2026
780ba64
Merge branch 'master' into danirabbit/gtk4
danirabbit Jan 26, 2026
471d434
merge master
danirabbit Jan 27, 2026
dd4f3c4
Merge branch 'master' into danirabbit/gtk4
danirabbit Jan 27, 2026
683f4ac
merge master
danirabbit Jan 28, 2026
daa4b50
Merge branch 'master' into danirabbit/gtk4
danirabbit Feb 2, 2026
7a1d0ad
Remove all
danirabbit Feb 2, 2026
c5985e7
More syntax
danirabbit Feb 2, 2026
3766c85
Merge master
danirabbit Feb 3, 2026
35c1874
Fix bad merge
danirabbit Feb 3, 2026
de890cf
More minor syntax
danirabbit Feb 3, 2026
36302ad
Merge branch 'master' into danirabbit/gtk4
danirabbit Feb 3, 2026
23d3a9a
Merge branch 'master' into danirabbit/gtk4
danirabbit Feb 4, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ jobs:
- name: Install Dependencies
run: |
apt update
apt install -y libchamplain-0.12-dev libchamplain-gtk-0.12-dev libclutter-1.0-dev libecal2.0-dev libedataserver1.2-dev libedataserverui1.2-dev libfolks-dev libgee-0.8-dev libgeoclue-2-dev libgeocode-glib-dev libglib2.0-dev libgranite-dev libgtk-3-dev libhandy-1-dev libical-dev libportal-dev libportal-gtk3-dev meson valac
apt install -y libadwaita-1-dev libecal2.0-dev libedataserver1.2-dev libedataserverui4-dev libfolks-dev libgee-0.8-dev libgeoclue-2-dev libgeocode-glib-dev libglib2.0-dev libgranite-7-dev libgtk-4-dev libical-dev libportal-dev libportal-gtk4-dev libshumate-dev meson valac
- name: Build and Test
env:
DESTDIR: out
Expand Down
10 changes: 4 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,18 @@

You'll need the following dependencies:

* libchamplain-0.12-dev
* libchamplain-gtk-0.12-dev
* libclutter-1.0-dev
* libadwaita-1-dev
* libecal1.2-dev
* libedataserverui1.2-dev >=3.46
* libfolks-dev
* libgee-0.8-dev
* libgeocode-glib-dev
* libgeoclue-2-dev
* libglib2.0-dev
* libgranite-dev >= 6.2.0
* libgtk-3-dev
* libgranite-7-dev >= 7.7.0
* libgtk-4-dev >= 4.12
* libical-dev
* libhandy-1-dev >= 0.90.0
* libshumate-dev
* meson
* valac

Expand Down
12 changes: 7 additions & 5 deletions core/GesturesUtils.vala
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ namespace Maya.GesturesUtils {
static bool has_scrolled = false;
const uint INTERVAL = 500;

public void on_scroll (Gtk.EventControllerScroll scroll_controller, double delta_x, double delta_y) {
public bool on_scroll (Gtk.EventControllerScroll scroll_controller, double delta_x, double delta_y) {
double choice = delta_x;
if (((int)delta_x).abs () < ((int)delta_y).abs ()) {
choice = delta_y;
Expand All @@ -33,27 +33,29 @@ namespace Maya.GesturesUtils {
if (choice == 1 || choice == -1) {
Calendar.EventStore.get_default ().change_month ((int) choice);
scroll_controller.reset ();
return;
return true;
}

if (has_scrolled == true) {
scroll_controller.reset ();
return;
return true;
}

if (choice > 0.3) {
reset_timer.begin ();
Calendar.EventStore.get_default ().change_month (1);
scroll_controller.reset ();
return;
return true;
}

if (choice < -0.3) {
reset_timer.begin ();
Calendar.EventStore.get_default ().change_month (-1);
scroll_controller.reset ();
return;
return true;
}

return false;
}

public async void reset_timer () {
Expand Down
13 changes: 9 additions & 4 deletions data/io.elementary.calendar.gschema.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,15 @@
<summary>Whether the window was maximized on last run</summary>
<description>Whether the window was maximized on last run</description>
</key>
<key name="window-size" type="(ii)">
<default>(1024, 750)</default>
<summary>Most recent window size</summary>
<description>Most recent window size (width, height)</description>
<key name="window-height" type="i">
<default>750</default>
<summary>Most recent window height</summary>
<description>Most recent window height</description>
</key>
<key name="window-width" type="i">
<default>1024</default>
<summary>Most recent window width</summary>
<description>Most recent window width</description>
</key>
<key name="show-weeks" type="b">
<default>true</default>
Expand Down
2 changes: 1 addition & 1 deletion data/meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ i18n.merge_file(
i18n.merge_file(
input: 'calendar.metainfo.xml.in',
output: meson.project_name() + '.metainfo.xml',
po_dir: meson.source_root() / 'po' / 'extra',
po_dir: meson.project_source_root() / 'po' / 'extra',
type: 'xml',
install: true,
install_dir: get_option('datadir') / 'metainfo',
Expand Down
23 changes: 7 additions & 16 deletions meson.build
Original file line number Diff line number Diff line change
Expand Up @@ -22,30 +22,21 @@ gnome = import('gnome')
i18n = import('i18n')
pkgconfig = import('pkgconfig')

adw_dep = dependency('libadwaita-1', version: '>=1.0.0')
glib_dep = dependency('glib-2.0')
gee_dep = dependency('gee-0.8')
granite_dep = dependency('granite', version: '>=6.2.0')
gtk_dep = dependency('gtk+-3.0', version: '>=3.22')
handy_dep = dependency('libhandy-1', version: '>=0.90.0')
libedataserver_dep = dependency('libedataserver-1.2', version: '>=3.8.0')
libedataserverui_dep = dependency('libedataserverui-1.2', version: '>=3.46')
granite_dep = dependency('granite-7', version: '>=7.7.0')
gtk_dep = dependency('gtk4', version: '>=4.12')
libedataserver_dep = dependency('libedataserver-1.2', version: '>=3.45.1')
libedataserverui_dep = dependency('libedataserverui4-1.0', version: '>= 3.46.4')
geocode_glib_dep = dependency('geocode-glib-2.0')
gmodule_dep = dependency('gmodule-2.0')
champlain_dep = dependency('champlain-0.12', fallback: ['libchamplain', 'libchamplain_dep'], default_options: ['default_library=static', 'introspection=false', 'vapi=false'])
champlain_gtk_dep = dependency('champlain-gtk-0.12', fallback: ['libchamplain', 'libchamplain_gtk_dep'], default_options: ['default_library=static', 'introspection=false', 'vapi=false'])
# We need to force the inclusion of the Vapi in case of fallback
if (champlain_dep.type_name() == 'internal')
vapi_dir = meson.current_source_dir() / 'vapi'
champlain_dep = [champlain_dep, meson.get_compiler('vala').find_library('champlain-0.12', dirs: vapi_dir)]
champlain_gtk_dep = [champlain_gtk_dep, meson.get_compiler('vala').find_library('champlain-gtk-0.12', dirs: vapi_dir)]
endif
clutter_dep = dependency('clutter-1.0')
clutter_gtk_dep = dependency('clutter-gtk-1.0')
folks_dep = dependency('folks')
gclue_dep = dependency('libgeoclue-2.0')
libecal_dep = dependency('libecal-2.0')
libical_dep = dependency('libical-glib')
libportal_dep = [ dependency('libportal'), dependency('libportal-gtk3') ]
libportal_dep = [ dependency('libportal'), dependency('libportal-gtk4') ]
shumate_dep = dependency('shumate-1.0')

add_project_arguments('-DLIBICAL_GLIB_UNSTABLE_API=1', language: 'c')

Expand Down
47 changes: 18 additions & 29 deletions src/AgendaView.vala
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
public class Maya.View.AgendaView : Gtk.Box {
public signal void event_removed (ECal.Component event);

public Hdy.HeaderBar header_bar { get; private set; }
public Adw.HeaderBar header_bar { get; private set; }

private Gtk.Label day_label;
private Gtk.Label weekday_label;
Expand All @@ -21,7 +21,7 @@ public class Maya.View.AgendaView : Gtk.Box {
construct {
var application_instance = ((Gtk.Application) GLib.Application.get_default ());

var button_add = new Gtk.Button.from_icon_name ("appointment-new", Gtk.IconSize.LARGE_TOOLBAR) {
var button_add = new Gtk.Button.from_icon_name ("appointment-new") {
action_name = Maya.MainWindow.ACTION_PREFIX + Maya.MainWindow.ACTION_NEW_EVENT
};
button_add.tooltip_markup = Granite.markup_accel_tooltip (
Expand All @@ -33,21 +33,19 @@ public class Maya.View.AgendaView : Gtk.Box {
margin_start = 6,
xalign = 0
};
weekday_label.get_style_context ().add_class (Granite.STYLE_CLASS_H2_LABEL);
weekday_label.add_css_class (Granite.STYLE_CLASS_H2_LABEL);

header_bar = new Hdy.HeaderBar () {
show_close_button = true
};
header_bar = new Adw.HeaderBar ();
header_bar.pack_start (weekday_label);
header_bar.pack_end (button_add);
header_bar.get_style_context ().add_class (Gtk.STYLE_CLASS_FLAT);
header_bar.add_css_class (Granite.STYLE_CLASS_FLAT);

day_label = new Gtk.Label ("") {
margin_start = 12,
margin_end = 12,
xalign = 0
};
day_label.get_style_context ().add_class (Granite.STYLE_CLASS_H3_LABEL);
day_label.add_css_class (Granite.STYLE_CLASS_H3_LABEL);

var placeholder_label = new Gtk.Label (_("Your upcoming events will be displayed here when you select a date with events.")) {
wrap = true,
Expand All @@ -56,8 +54,7 @@ public class Maya.View.AgendaView : Gtk.Box {
margin_end = 12,
justify = CENTER
};
placeholder_label.get_style_context ().add_class (Gtk.STYLE_CLASS_DIM_LABEL);
placeholder_label.show_all ();
placeholder_label.add_css_class (Granite.CssClass.DIM);

selected_date_events_list = new Gtk.ListBox () {
activate_on_single_click = false,
Expand Down Expand Up @@ -103,20 +100,20 @@ public class Maya.View.AgendaView : Gtk.Box {
});

var box = new Gtk.Box (VERTICAL, 0);
box.add (day_label);
box.add (selected_date_events_list);
box.add (upcoming_events_list);
box.append (day_label);
box.append (selected_date_events_list);
box.append (upcoming_events_list);

var scrolled_window = new Gtk.ScrolledWindow (null, null) {
var scrolled_window = new Gtk.ScrolledWindow () {
hscrollbar_policy = NEVER,
child = box,
vexpand = true
};

orientation = VERTICAL;
add (header_bar);
add (scrolled_window);
get_style_context ().add_class (Gtk.STYLE_CLASS_VIEW);
append (header_bar);
append (scrolled_window);
add_css_class (Granite.STYLE_CLASS_VIEW);

// Listen to changes for events
var calmodel = Calendar.EventStore.get_default ();
Expand All @@ -129,7 +126,6 @@ public class Maya.View.AgendaView : Gtk.Box {
time_manager.on_update_today.connect (on_today_changed);

set_selected_date (Maya.Application.get_selected_datetime ());
show_all ();

selected_date_events_list.row_activated.connect (activate_eventrow);
upcoming_events_list.row_activated.connect (activate_eventrow);
Expand Down Expand Up @@ -303,13 +299,11 @@ public class Maya.View.AgendaView : Gtk.Box {
foreach (var event in events) {
var row = new AgendaEventRow (source, event, false);
row.removed.connect ((event) => (event_removed (event)));
row.show_all ();
selected_date_events_list.add (row);
selected_date_events_list.append (row);

var row2 = new AgendaEventRow (source, event, true);
row2.removed.connect ((event) => (event_removed (event)));
row2.show_all ();
upcoming_events_list.add (row2);
upcoming_events_list.append (row2);
}
}

Expand Down Expand Up @@ -372,13 +366,8 @@ public class Maya.View.AgendaView : Gtk.Box {
* Calendar model parameters have been updated.
*/
private void on_model_parameters_changed () {
foreach (unowned var row in selected_date_events_list.get_children ()) {
row.destroy ();
}

foreach (unowned var row in upcoming_events_list.get_children ()) {
row.destroy ();
}
selected_date_events_list.remove_all ();
upcoming_events_list.remove_all ();
}

private void on_today_changed () {
Expand Down
36 changes: 12 additions & 24 deletions src/Application.vala
Original file line number Diff line number Diff line change
Expand Up @@ -63,25 +63,8 @@ namespace Maya {
protected override void startup () {
base.startup ();

Hdy.init ();

var style_provider = new Gtk.CssProvider ();
style_provider.load_from_resource ("/io/elementary/calendar/Application.css");

Gtk.StyleContext.add_provider_for_screen (
Gdk.Screen.get_default (),
style_provider,
Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION
);

var granite_settings = Granite.Settings.get_default ();
var gtk_settings = Gtk.Settings.get_default ();

gtk_settings.gtk_application_prefer_dark_theme = granite_settings.prefers_color_scheme == Granite.Settings.ColorScheme.DARK;

granite_settings.notify["prefers-color-scheme"].connect (() => {
gtk_settings.gtk_application_prefer_dark_theme = granite_settings.prefers_color_scheme == Granite.Settings.ColorScheme.DARK;
});
Granite.init ();
Adw.init ();

var quit_action = new SimpleAction ("quit", null);
quit_action.activate.connect (quit);
Expand Down Expand Up @@ -159,17 +142,23 @@ namespace Maya {
* Initializes the graphical window and its components
*/
void init_gui () {
var rect = Gtk.Allocation ();
saved_state.get ("window-size", "(ii)", out rect.width, out rect.height);

window = new MainWindow (this);
window.title = _(Build.APP_NAME);
window.set_allocation (rect);

/*
* This is very finicky. Bind size after present else set_titlebar gives us bad sizes
* Set maximize after height/width else window is min size on unmaximize
* Bind maximize as SET else get get bad sizes
*/
saved_state.bind ("window-height", window, "default-height", SettingsBindFlags.DEFAULT);
saved_state.bind ("window-width", window, "default-width", SettingsBindFlags.DEFAULT);

if (saved_state.get_boolean ("window-maximized")) {
window.maximize ();
}

saved_state.bind ("window-maximized", window, "maximized", SettingsBindFlags.SET);

window.destroy.connect (on_quit);
}

Expand Down Expand Up @@ -225,7 +214,6 @@ namespace Maya {
warning (e.message);
}

GtkClutter.init (ref args);
var app = new Application ();

int res = app.run (args);
Expand Down
21 changes: 10 additions & 11 deletions src/EventEdition/EventDialog.vala
Original file line number Diff line number Diff line change
Expand Up @@ -143,14 +143,14 @@ public class EventDialog : Granite.Dialog {
halign = START,
hexpand = true
};
delete_button.get_style_context ().add_class (Gtk.STYLE_CLASS_DESTRUCTIVE_ACTION);
delete_button.add_css_class (Granite.CssClass.DESTRUCTIVE);
delete_button.clicked.connect (remove_event);

buttonbox.add (delete_button);
buttonbox.append (delete_button);
}

var create_button = new Gtk.Button ();
create_button.get_style_context ().add_class (Gtk.STYLE_CLASS_SUGGESTED_ACTION);
create_button.add_css_class (Granite.CssClass.SUGGESTED);
create_button.clicked.connect (save_dialog);

if (date_time != null) {
Expand All @@ -163,20 +163,19 @@ public class EventDialog : Granite.Dialog {
var cancel_button = new Gtk.Button.with_label (_("Cancel"));
cancel_button.clicked.connect (() => {this.destroy ();});

buttonbox.add (cancel_button);
buttonbox.add (create_button);
buttonbox.append (cancel_button);
buttonbox.append (create_button);

var button_sizegroup = new Gtk.SizeGroup (HORIZONTAL);
button_sizegroup.add_widget (cancel_button);
button_sizegroup.add_widget (create_button);

var box = new Gtk.Box (VERTICAL, 24);
box.add (stack_switcher);
box.add (stack);
box.add (buttonbox);
box.show_all ();
var box = new Granite.Box (VERTICAL, DOUBLE);
box.append (stack_switcher);
box.append (stack);
box.append (buttonbox);

get_content_area ().add (box);
get_content_area ().append (box);

info_panel.valid_event.connect ((is_valid) => {
create_button.sensitive = is_valid;
Expand Down
Loading
Loading