Subscribe to and read RSS/Atom feeds with cross-platform synchronization. Communique features support for a lot of RSS services. And ofcourse, you can use Communique to subscribe to and read RSS feeds locally, without logging in to anything. Communique also allows you to save your articles to Instapaper, Pocket or Wallabag, or send them via email straight from the app.
Supported services:
@@ -53,6 +53,15 @@
https://raw.githubusercontent.com/suzie97/communique/master/data/communique-dark-screenshot.png
+
+ https://raw.githubusercontent.com/suzie97/communique/master/data/communique-fullscreen-screenshot.png
+
+
+ https://raw.githubusercontent.com/suzie97/communique/master/data/communique-shortcuts.png
+
+
+ https://raw.githubusercontent.com/suzie97/communique/master/data/communique-preferences.png
+
none
@@ -84,6 +93,23 @@
none
+
+
+ Feature Updates:
+
+ - Rounded window corners
+ - Improved theme
+ - A more content focused experience with fullscreen mode
+ - Changing the font does not requires a restart anymore
+ - Add new shortcuts dialog
+ - Context menus now follow the standard system style
+
+ Bug Fixes:
+
+ - Correctly navigate between articles using shortcuts
+
+
+
Improvements:
diff --git a/data/com.github.suzie97.communique.desktop.in b/data/com.github.suzie97.communique.desktop.in
index 85317446b..267ac718d 100755
--- a/data/com.github.suzie97.communique.desktop.in
+++ b/data/com.github.suzie97.communique.desktop.in
@@ -2,7 +2,7 @@
Name=Communique
GenericName=RSS Client
Comment=Read RSS/Atom Feeds
-Categories=Network;Education;News;Feed;
+Categories=Network;News;Feed;
Exec=com.github.suzie97.communique %U
Icon=com.github.suzie97.communique
Terminal=false
diff --git a/data/communique-dark-screenshot.png b/data/communique-dark-screenshot.png
index 470ba4ee8..afb238355 100644
Binary files a/data/communique-dark-screenshot.png and b/data/communique-dark-screenshot.png differ
diff --git a/data/communique-fullscreen-screenshot.png b/data/communique-fullscreen-screenshot.png
new file mode 100644
index 000000000..b93169abb
Binary files /dev/null and b/data/communique-fullscreen-screenshot.png differ
diff --git a/data/communique-light-screenshot.png b/data/communique-light-screenshot.png
index 77d7cec24..25b87e6d9 100644
Binary files a/data/communique-light-screenshot.png and b/data/communique-light-screenshot.png differ
diff --git a/data/communique-preferences.png b/data/communique-preferences.png
new file mode 100644
index 000000000..ac137b12c
Binary files /dev/null and b/data/communique-preferences.png differ
diff --git a/data/communique-shortcuts.png b/data/communique-shortcuts.png
new file mode 100644
index 000000000..5c36aad24
Binary files /dev/null and b/data/communique-shortcuts.png differ
diff --git a/meson.build b/meson.build
index 5631119f6..14287efbe 100644
--- a/meson.build
+++ b/meson.build
@@ -163,7 +163,6 @@ vala_sources = [
'src/Widgets/LoginRow.vala',
'src/Widgets/MainWindow.vala',
'src/Widgets/MediaPlayer.vala',
- 'src/Widgets/MediaButton.vala',
'src/Widgets/MediaRow.vala',
'src/Widgets/ModeButton.vala',
'src/Widgets/RemovePopover.vala',
diff --git a/src/Widgets/ArticleView.vala b/src/Widgets/ArticleView.vala
index e41886a81..eea64b2d6 100644
--- a/src/Widgets/ArticleView.vala
+++ b/src/Widgets/ArticleView.vala
@@ -1027,10 +1027,6 @@ public class FeedReader.ArticleView : Gtk.Overlay {
return false;
}
- public void showMediaButton (bool show) {
- m_fsHead.showMediaButton (show);
- }
-
public void sendEvent (Gdk.EventKey event) {
m_currentView.key_press_event (event);
}
diff --git a/src/Widgets/ColumnView.vala b/src/Widgets/ColumnView.vala
index ab2e797be..73a7d7fc1 100644
--- a/src/Widgets/ColumnView.vala
+++ b/src/Widgets/ColumnView.vala
@@ -185,8 +185,6 @@ public class FeedReader.ColumnView : Gtk.Paned {
Logger.debug ("ContentPage: set headerbar");
m_headerbar.setRead (row.getArticle ().getUnread ());
m_headerbar.setMarked (row.getArticle ().getMarked ());
- m_headerbar.showMediaButton (row.haveMedia ());
- m_article_view.showMediaButton (row.haveMedia ());
}
});
diff --git a/src/Widgets/ColumnViewHeader.vala b/src/Widgets/ColumnViewHeader.vala
index 18a396021..53af7301d 100644
--- a/src/Widgets/ColumnViewHeader.vala
+++ b/src/Widgets/ColumnViewHeader.vala
@@ -10,7 +10,6 @@ public class FeedReader.ColumnViewHeader : Hdy.HeaderBar {
private Gtk.Button m_share_button;
private Gtk.Button m_tag_button;
private Gtk.Button m_print_button;
- private AttachedMediaButton m_media_button;
private HoverButton m_mark_button;
private HoverButton m_read_button;
private Gtk.Button m_close_button;
@@ -226,14 +225,6 @@ public class FeedReader.ColumnViewHeader : Hdy.HeaderBar {
});
});
- m_media_button = new AttachedMediaButton ();
- m_media_button.popOpened.connect ( () => {
- popOpened ();
- });
- m_media_button.popClosed.connect ( () => {
- popClosed ();
- });
-
var search_grid = new Gtk.Grid () {
valign = Gtk.Align.CENTER
};
@@ -249,7 +240,7 @@ public class FeedReader.ColumnViewHeader : Hdy.HeaderBar {
this.pack_end (shareStack);
this.pack_end (m_print_button);
this.pack_end (new Gtk.Separator (Gtk.Orientation.HORIZONTAL));
- this.pack_end (m_media_button);
+ this.pack_end (new Gtk.Separator (Gtk.Orientation.HORIZONTAL));
}
public void set_paned_positions (int start_position, int end_position, bool start_changed = true) {
@@ -341,11 +332,6 @@ public class FeedReader.ColumnViewHeader : Hdy.HeaderBar {
}
}
- public void showMediaButton (bool show) {
- m_media_button.update ();
- m_media_button.visible = show;
- }
-
public void refreshSahrePopover () {
if (m_sharePopover == null) {
return;
diff --git a/src/Widgets/FullscreenHeader.vala b/src/Widgets/FullscreenHeader.vala
index d007e719e..0af05a7f6 100644
--- a/src/Widgets/FullscreenHeader.vala
+++ b/src/Widgets/FullscreenHeader.vala
@@ -160,8 +160,4 @@ public class FeedReader.FullscreenHeader : Gtk.EventBox {
m_timeout_source_id = 0;
}
}
-
- public void showMediaButton (bool show) {
- m_header.showMediaButton (show);
- }
}
diff --git a/src/Widgets/MediaButton.vala b/src/Widgets/MediaButton.vala
deleted file mode 100644
index 2508a5a23..000000000
--- a/src/Widgets/MediaButton.vala
+++ /dev/null
@@ -1,135 +0,0 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see .
-
-public class FeedReader.AttachedMediaButton : Gtk.Button {
-
- private Gtk.ListBox m_list;
- private Gtk.Image m_filesIcon;
- private Gtk.Spinner m_spinner;
- private Gtk.Stack m_stack;
- private Gee.List m_enclosures;
- private Gtk.Popover m_pop;
- private ulong m_signalID = 0;
- public signal void play(string url);
- public signal void popClosed();
- public signal void popOpened();
-
- public AttachedMediaButton()
- {
- m_filesIcon = new Gtk.Image.from_icon_name("mail-attachment-symbolic", Gtk.IconSize.SMALL_TOOLBAR);
- m_spinner = new Gtk.Spinner();
- m_spinner.set_size_request(16,16);
-
- m_stack = new Gtk.Stack();
- m_stack.set_transition_duration(100);
- m_stack.set_transition_type(Gtk.StackTransitionType.CROSSFADE);
- m_stack.add_named(m_spinner, "spinner");
- m_stack.add_named(m_filesIcon, "files");
- this.add(m_stack);
- this.set_relief(Gtk.ReliefStyle.NONE);
- this.set_events(Gdk.EventMask.ENTER_NOTIFY_MASK);
- this.set_focus_on_click(false);
-
- m_list = new Gtk.ListBox();
- m_list.margin = 10;
- m_list.set_selection_mode(Gtk.SelectionMode.NONE);
- m_list.row_activated.connect((row) => {
- m_spinner.start();
- m_pop.hide();
- mediaRow? mRow = row as mediaRow;
- if(mRow != null)
- {
- playMedia(mRow.getURL());
- }
- else
- {
- Logger.error("MediaPopover: invalid row clicked");
- }
- });
-
- m_pop = new Gtk.Popover(this);
- m_pop.add(m_list);
- m_pop.set_modal(true);
- m_pop.set_position(Gtk.PositionType.BOTTOM);
- m_pop.closed.connect(() => {
- popClosed();
- });
- }
-
- public void update()
- {
- m_enclosures = new Gee.ArrayList();
- Article? selectedArticle = ColumnView.get_default().getSelectedArticle();
- if(selectedArticle != null)
- {
- m_enclosures = selectedArticle.getEnclosures();
- }
-
- if(m_signalID != 0)
- {
- this.disconnect(m_signalID);
- m_signalID = 0;
- }
-
- if(m_enclosures.size != 0)
- {
- m_stack.set_visible_child_name("files");
- this.set_tooltip_text(_("Attachments"));
- var children = m_list.get_children();
- foreach(Gtk.Widget row in children)
- {
- m_list.remove(row);
- }
- foreach(Enclosure enc in m_enclosures)
- {
- m_list.add(new mediaRow(enc));
- }
- m_signalID = this.clicked.connect(() => {
- popOpened();
- m_pop.show_all();
- });
- }
- else
- {
- // no media
- }
- }
-
- private void playMedia(string url)
- {
- Logger.debug(@"MediaButton.playMedia: $url");
- if(Settings.general().get_boolean("mediaplayer"))
- {
- m_stack.set_visible_child_name("spinner");
- var media = new MediaPlayer(url);
- media.loaded.connect(() => {
- m_spinner.stop();
- m_stack.set_visible_child_name("files");
- });
- ColumnView.get_default().ArticleViewAddMedia(media);
- }
- else
- {
- try
- {
- Gtk.show_uri_on_window(MainWindow.get_default(), url, Gdk.CURRENT_TIME);
- }
- catch(GLib.Error e)
- {
- Logger.debug("could not open the link in an external browser: %s".printf(e.message));
- }
- }
- }
-}
diff --git a/src/Widgets/ServiceInfo.vala b/src/Widgets/ServiceInfo.vala
index ab3004cc1..72653726c 100644
--- a/src/Widgets/ServiceInfo.vala
+++ b/src/Widgets/ServiceInfo.vala
@@ -1,42 +1,27 @@
-// This file is part of FeedReader.
-//
-// FeedReader is free software: you can redistribute it and/or modify
-// it under the terms of the GNU General Public License as published by
-// the Free Software Foundation, either version 3 of the License, or
-// (at your option) any later version.
-//
-// FeedReader is distributed in the hope that it will be useful,
-// but WITHOUT ANY WARRANTY; without even the implied warranty of
-// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-// GNU General Public License for more details.
-//
-// You should have received a copy of the GNU General Public License
-// along with FeedReader. If not, see .
+/*
+* SPDX-License-Identifier: GPL-3.0-or-later
+* SPDX-FileCopyrightText: 2021 Your Name
+*/
public class FeedReader.ServiceInfo : Gtk.Overlay {
private Gtk.Stack m_stack;
private Gtk.Spinner m_spinner;
private Gtk.Image m_logo;
- private Gtk.Label m_name;
private Gtk.Label m_label;
private Gtk.Label m_offline;
private Gtk.Grid m_box;
- public ServiceInfo ()
- {
- // m_logo = new Gtk.Image ();
+ public ServiceInfo () {
m_logo = new Gtk.Image.from_file ("");
m_label = new Gtk.Label ("") {
halign = Gtk.Align.CENTER,
margin_start = 10,
- margin_end = 10
+ margin_end = 10,
+ margin_top = 6
};
m_label.set_ellipsize (Pango.EllipsizeMode.END);
- m_name = new Gtk.Label ("") {
- halign = Gtk.Align.CENTER,
- ellipsize = Pango.EllipsizeMode.END
- };
- m_name.get_style_context ().add_class (Granite.STYLE_CLASS_H1_LABEL);
+ m_label.get_style_context ().add_class (Granite.STYLE_CLASS_H3_LABEL);
+ m_label.get_style_context ().add_class (Gtk.STYLE_CLASS_DIM_LABEL);
m_box = new Gtk.Grid () {
orientation = Gtk.Orientation.VERTICAL,
@@ -45,7 +30,6 @@ public class FeedReader.ServiceInfo : Gtk.Overlay {
valign = Gtk.Align.CENTER
};
m_box.add (m_logo);
- m_box.add (m_name);
m_box.add (m_label);
m_box.margin_top = 20;
m_box.margin_bottom = 5;
@@ -72,25 +56,6 @@ public class FeedReader.ServiceInfo : Gtk.Overlay {
string? service_icon = FeedReaderBackend.get_default ().symbolicIcon ();
string? user_name = FeedReaderBackend.get_default ().accountName ();
string? server = FeedReaderBackend.get_default ().getServerURL ();
- string? service_name = "";
-
- if (server == "https://feedbin.com/") {
- service_name = "Feedbin";
- } else if (server == "https://tt-rss.org/") {
- service_name = "Tiny Tiny RSS";
- } else if (server == "https://github.com/nextcloud/news") {
- service_name = "Nextcloud News";
- } else if (server == "http://www.inoreader.com/") {
- service_name = "InoReader";
- } else if (server == "https://freshrss.org/") {
- service_name = "freshRSS";
- } else if (server == "https://feedhq.org/") {
- service_name = "FeedHQ";
- } else if (server == "https://bazqux.com/") {
- service_name = "BazQux";
- } else if (server == "http://localhost/") {
- service_name = "Communique";
- }
if (this.is_visible ()) {
if (user_name == "none" || service_icon == "none") {
@@ -99,12 +64,9 @@ public class FeedReader.ServiceInfo : Gtk.Overlay {
}
else {
m_logo.set_from_icon_name (service_icon, Gtk.IconSize.BUTTON);
- // m_logo.get_style_context ().add_class ("fr-sidebar-symbolic");
m_label.set_label (user_name);
- m_name.label = service_name;
m_stack.set_visible_child_name ("info");
- if (server != "none")
- {
+ if (server != "none") {
this.set_tooltip_text (Utils.shortenURL (server));
}
}