diff options
author | rbuj <[email protected]> | 2020-11-17 01:27:34 +0100 |
---|---|---|
committer | raveit65 <[email protected]> | 2020-11-26 11:50:18 +0100 |
commit | c1dd04d294e329da95c515d7f5a9ac7a00d269cc (patch) | |
tree | 2a129f163e6c3302d0fa5dfdf96bdee0de8a2e46 | |
parent | b704b0e30d2ad7672c3fa86c02f3f311327fd66a (diff) | |
download | mate-notification-daemon-c1dd04d294e329da95c515d7f5a9ac7a00d269cc.tar.bz2 mate-notification-daemon-c1dd04d294e329da95c515d7f5a9ac7a00d269cc.tar.xz |
Add Do Not Disturb Applet
-rw-r--r-- | .build.yml | 4 | ||||
-rw-r--r-- | configure.ac | 11 | ||||
-rw-r--r-- | data/Makefile.am | 33 | ||||
-rw-r--r-- | data/mate-notification-properties.desktop.in (renamed from src/capplet/mate-notification-properties.desktop.in) | 0 | ||||
-rw-r--r-- | data/org.mate.applets.MateNotificationApplet.desktop.in.in | 16 | ||||
-rw-r--r-- | data/org.mate.panel.applet.MateNotificationAppletFactory.service.in | 3 | ||||
-rw-r--r-- | po/POTFILES.in | 4 | ||||
-rw-r--r-- | src/capplet/Makefile.am | 84 | ||||
-rw-r--r-- | src/capplet/mate-notification-applet-menu.xml | 3 | ||||
-rw-r--r-- | src/capplet/mate-notification-applet.c | 218 | ||||
-rw-r--r-- | src/capplet/org.mate.panel.applet.notifications.gresource.xml | 6 |
11 files changed, 356 insertions, 26 deletions
@@ -13,6 +13,7 @@ requires: - libwnck3 - make - mate-common + - mate-panel - which debian: @@ -36,6 +37,7 @@ requires: - libglib2.0-dev - libgtk-3-dev - libmate-desktop-dev + - libmate-panel-applet-dev - libnotify-dev - libpango1.0-dev - libstartup-notification0-dev @@ -63,6 +65,7 @@ requires: - make - mate-common - mate-desktop-devel + - mate-panel-devel ubuntu: - autoconf-archive @@ -81,6 +84,7 @@ requires: - libglib2.0-dev - libgtk-3-dev - libmate-desktop-dev + - libmate-panel-applet-dev - libnotify-dev - libpango1.0-dev - libstartup-notification0-dev diff --git a/configure.ac b/configure.ac index cf92347..af9be0d 100644 --- a/configure.ac +++ b/configure.ac @@ -130,6 +130,15 @@ pkg_modules=" " PKG_CHECK_MODULES(NOTIFICATION_DAEMON, $pkg_modules) +dnl --------------------------------------------------------------------------- +dnl Requirements for panel applet +dnl --------------------------------------------------------------------------- +LIBPANEL4_REQUIRED=1.17.0 +LIBMATE_DESKTOP_REQUIRED=1.17.0 +PKG_CHECK_MODULES(NOTIFICATION_APPLET, mate-desktop-2.0 >= $LIBMATE_DESKTOP_REQUIRED libmatepanelapplet-4.0 >= $LIBPANEL4_REQUIRED gtk+-3.0 >= $GTK_REQUIRED glib-2.0 >= $REQ_GLIB_VERSION) +AC_SUBST(NOTIFICATION_APPLET_CFLAGS) +AC_SUBST(NOTIFICATION_APPLET_LIBS) + dnl Will call AC_SUBSET on NOTIFICATION_DAEMON_* below after appending X11 and Wayland flags dnl --------------------------------------------------------------------------- @@ -275,7 +284,9 @@ AC_CONFIG_FILES([ Makefile data/Makefile data/org.freedesktop.mate.Notifications.service +data/org.mate.applets.MateNotificationApplet.desktop.in data/org.mate.NotificationDaemon.gschema.xml +data/org.mate.panel.applet.MateNotificationAppletFactory.service po/Makefile.in src/Makefile src/daemon/Makefile diff --git a/data/Makefile.am b/data/Makefile.am index 623725d..be9a8b7 100644 --- a/data/Makefile.am +++ b/data/Makefile.am @@ -12,17 +12,31 @@ icon32_DATA = icons/32x32/mate-notification-properties.png icon48_DATA = icons/48x48/mate-notification-properties.png iconscalable_DATA = icons/scalable/mate-notification-properties.svg +servicedir = $(DBUS_SERVICES_DIR) +service_DATA = org.freedesktop.mate.Notifications.service org.mate.panel.applet.MateNotificationAppletFactory.service +service_in_files = $(service_DATA:=.in) -servicedir = $(DBUS_SERVICES_DIR) -service_DATA = org.freedesktop.mate.Notifications.service +appletdir = $(datadir)/mate-panel/applets +applet_DATA = org.mate.applets.MateNotificationApplet.mate-panel-applet +applet_in_files = $(applet_DATA:.mate-panel-applet=.desktop.in) -gsettingsschema_in_files = org.mate.NotificationDaemon.gschema.xml.in -gsettings_SCHEMAS = $(gsettingsschema_in_files:.xml.in=.xml) +$(applet_DATA): $(applet_in_files) + $(AM_V_GEN) $(MSGFMT) --desktop --keyword=Name --keyword=Description --template $< -d $(top_srcdir)/po -o $@ + +desktopdir = $(datadir)/applications +desktop_DATA = mate-notification-properties.desktop +desktop_in_files = $(desktop_DATA:.desktop=.desktop.in) + +$(desktop_DATA): $(desktop_in_files) + $(AM_V_GEN) $(MSGFMT) --desktop --template $< -d $(top_srcdir)/po -o $@ + +gsettings_SCHEMAS = org.mate.NotificationDaemon.gschema.xml +gsettingsschema_in_files = $(gsettings_SCHEMAS:=.in) @GSETTINGS_RULES@ EXTRA_DIST = \ + $(desktop_in_files) \ $(gsettingsschema_in_files) \ - $(service_DATA) \ $(icon16_DATA) \ $(icon22_DATA) \ $(icon24_DATA) \ @@ -30,7 +44,14 @@ EXTRA_DIST = \ $(icon48_DATA) \ $(iconscalable_DATA) -CLEANFILES = $(gsettings_SCHEMAS) +CLEANFILES = \ + $(applet_DATA) \ + $(desktop_DATA) \ + $(gsettings_SCHEMAS) + +DISTCLEANFILES = \ + $(applet_in_files) \ + $(service_DATA) gtk_update_icon_cache = $(UPDATE_ICON_CACHE) -f -t $(datadir)/icons/hicolor diff --git a/src/capplet/mate-notification-properties.desktop.in b/data/mate-notification-properties.desktop.in index c96e053..c96e053 100644 --- a/src/capplet/mate-notification-properties.desktop.in +++ b/data/mate-notification-properties.desktop.in diff --git a/data/org.mate.applets.MateNotificationApplet.desktop.in.in b/data/org.mate.applets.MateNotificationApplet.desktop.in.in new file mode 100644 index 0000000..7b3769b --- /dev/null +++ b/data/org.mate.applets.MateNotificationApplet.desktop.in.in @@ -0,0 +1,16 @@ +[Applet Factory] +Id=MateNotificationAppletFactory +Location=@LIBEXECDIR@/mate-notification-applet +Name=Mate Notification Applet Factory +Description=Mate Notification Applet Factory + +[MateNotificationApplet] +Name=Do Not Disturb +Description=Activate the do not disturb mode. +# Translators: Do NOT translate or transliterate this text (this is an icon file name)! +Icon=mate-notification-properties +MateComponentId=OAFIID:MATE_Panel_Notification_Applet +X-MATE-Bugzilla-Bugzilla=MATE +X-MATE-Bugzilla-Product=mate-notification-daemon +X-MATE-Bugzilla-Component=notification applet +X-MATE-Bugzilla-Version=@VERSION@ diff --git a/data/org.mate.panel.applet.MateNotificationAppletFactory.service.in b/data/org.mate.panel.applet.MateNotificationAppletFactory.service.in new file mode 100644 index 0000000..e30bf7c --- /dev/null +++ b/data/org.mate.panel.applet.MateNotificationAppletFactory.service.in @@ -0,0 +1,3 @@ +[D-BUS Service] +Name=org.mate.panel.applet.MateNotificationAppletFactory +Exec=@LIBEXECDIR@/mate-notification-applet diff --git a/po/POTFILES.in b/po/POTFILES.in index 117a89c..629ff57 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -1,6 +1,8 @@ +data/mate-notification-properties.desktop.in +data/org.mate.applets.MateNotificationApplet.desktop.in.in data/org.mate.NotificationDaemon.gschema.xml.in +src/capplet/mate-notification-applet.c src/capplet/mate-notification-properties.c -src/capplet/mate-notification-properties.desktop.in src/capplet/mate-notification-properties.ui src/daemon/daemon.c src/daemon/sound.c diff --git a/src/capplet/Makefile.am b/src/capplet/Makefile.am index 509133d..2e27e00 100644 --- a/src/capplet/Makefile.am +++ b/src/capplet/Makefile.am @@ -1,30 +1,76 @@ +define generate_resources_deps + $(shell $(GLIB_COMPILE_RESOURCES) --generate-dependencies --sourcedir $(srcdir) $(srcdir)/$(1)) +endef + bin_PROGRAMS = mate-notification-properties +libexec_PROGRAMS = mate-notification-applet -BUILT_SOURCES = mate-notification-properties-resources.h mate-notification-properties-resources.c +NULL = -mate_notification_properties_LDADD = $(NOTIFICATION_CAPPLET_LIBS) -mate_notification_properties_SOURCES = $(BUILT_SOURCES) mate-notification-properties.c -mate_notification_properties_CFLAGS = $(WARN_CFLAGS) +mate_notification_properties_CFLAGS = \ + -I$(top_srcdir) \ + -I$(top_srcdir)/src/daemon \ + $(NOTIFICATION_CAPPLET_CFLAGS) \ + -DENGINES_DIR=\"$(libdir)/mate-notification-daemon/engines\" \ + -DNOTIFICATION_LOCALEDIR=\"$(datadir)/locale\" \ + $(WARN_CFLAGS) \ + $(NULL) -mate-notification-properties-resources.h mate-notification-properties-resources.c: org.mate.notifications.properties.gresource.xml Makefile $(shell $(GLIB_COMPILE_RESOURCES) --generate-dependencies --sourcedir $(srcdir) $(srcdir)/org.mate.notifications.properties.gresource.xml) - $(AM_V_GEN) XMLLINT=$(XMLLINT) $(GLIB_COMPILE_RESOURCES) --target $@ --sourcedir $(srcdir) --generate --c-name notification_properties $< +mate_notification_properties_LDADD = \ + $(NOTIFICATION_CAPPLET_LIBS) \ + $(NULL) -desktopdir = $(datadir)/applications -desktop_in_files = mate-notification-properties.desktop.in -desktop_DATA = $(desktop_in_files:.desktop.in=.desktop) -$(desktop_DATA): $(desktop_in_files) - $(AM_V_GEN) $(MSGFMT) --desktop --template $< -d $(top_srcdir)/po -o $@ +mate_notification_properties_resources_xml = org.mate.notifications.properties.gresource.xml +mate_notification_properties_resources_deps = $(call generate_resources_deps $(mate_notification_properties_resources_xml)) +mate_notification_properties_resources_files = mate-notification-properties-resources.h mate-notification-properties-resources.c +$(mate_notification_properties_resources_files): $(mate_notification_properties_resources_xml) Makefile $(mate_notification_properties_resources_deps) + $(AM_V_GEN) XMLLINT=$(XMLLINT) $(GLIB_COMPILE_RESOURCES) $< \ + --target $@ --sourcedir $(srcdir) --generate --c-name notification_properties +mate_notification_properties_SOURCES = \ + $(mate_notification_properties_resources_files) \ + mate-notification-properties.c \ + $(NULL) man_MANS = mate-notification-properties.1 -AM_CPPFLAGS = \ - -I$(top_srcdir) \ - -I$(top_srcdir)/src/daemon \ - $(NOTIFICATION_CAPPLET_CFLAGS) \ - -DENGINES_DIR=\"$(libdir)/mate-notification-daemon/engines\" \ - -DNOTIFICATION_LOCALEDIR=\"$(datadir)/locale\" +mate_notification_applet_CFLAGS = \ + $(NOTIFICATION_APPLET_CFLAGS) \ + -DMATELOCALEDIR=\"$(datadir)/locale\" \ + -DRESOURCE_PATH=\""/org/mate/panel/applet/notifications/"\" \ + $(WARN_CFLAGS) \ + $(NULL) + +mate_notification_applet_LDADD = \ + $(NOTIFICATION_APPLET_LIBS) \ + $(NULL) + +mate_notification_applet_resources_xml = org.mate.panel.applet.notifications.gresource.xml +mate_notification_applet_resources_deps = $(call generate_resources_deps $(mate_notification_applet_resources_xml)) +mate_notification_applet_resources_files = mate-notification-applet-resources.h mate-notification-applet-resources.c +$(mate_notification_applet_resources_files): $(mate_notification_applet_resources_xml) Makefile $(mate_notification_applet_resources_deps) + $(AM_V_GEN) XMLLINT=$(XMLLINT) $(GLIB_COMPILE_RESOURCES) $< \ + --target $@ --sourcedir $(srcdir) --generate --c-name notification_applet +mate_notification_applet_SOURCES = \ + $(mate_notification_applet_resources_files) \ + mate-notification-applet.c \ + $(NULL) + +BUILT_SOURCES = \ + $(mate_notification_properties_resources_files) \ + $(mate_notification_applet_resources_files) \ + $(NULL) + +CLEANFILES = \ + $(BUILT_SOURCES) \ + $(NULL) -CLEANFILES = $(desktop_DATA) $(BUILT_SOURCES) -EXTRA_DIST = mate-notification-properties.ui $(pixmap_DATA) $(desktop_in_files) $(man_MANS) org.mate.notifications.properties.gresource.xml +EXTRA_DIST = \ + $(man_MANS) \ + $(pixmap_DATA) \ + $(mate_notification_applet_resources_xml) \ + $(mate_notification_properties_resources_xml) \ + mate-notification-applet-menu.xml \ + mate-notification-properties.ui \ + $(NULL) -include $(top_srcdir)/git.mk diff --git a/src/capplet/mate-notification-applet-menu.xml b/src/capplet/mate-notification-applet-menu.xml new file mode 100644 index 0000000..cab30ac --- /dev/null +++ b/src/capplet/mate-notification-applet-menu.xml @@ -0,0 +1,3 @@ +<menuitem name="DoNotDisturb Item" action="DoNotDisturb" /> +<menuitem name="Preferences Item" action="Preferences" /> +<menuitem name="About Item" action="About" /> diff --git a/src/capplet/mate-notification-applet.c b/src/capplet/mate-notification-applet.c new file mode 100644 index 0000000..e8ef83f --- /dev/null +++ b/src/capplet/mate-notification-applet.c @@ -0,0 +1,218 @@ +/* mate-notification-applet.c - MATE Notification Applet + * + * Copyright (c) 2020 Robert Buj <[email protected]> + * + * This program 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 2 of the + * License, or (at your option) any later version. + * + * This program 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 this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA + * 02110-1301 USA + */ + +#include "config.h" + +#include <glib.h> +#include <glib/gi18n.h> +#include <gtk/gtk.h> +#include <mate-panel-applet.h> + +#define MATE_DESKTOP_USE_UNSTABLE_API +#include <libmate-desktop/mate-desktop-utils.h> + +#define GSETTINGS_SCHEMA "org.mate.NotificationDaemon" +#define GSETTINGS_KEY_DO_NOT_DISTURB "do-not-disturb" + +typedef struct +{ + MatePanelApplet *applet; + + GtkWidget *image_on; + GtkWidget *image_off; + GtkActionGroup *action_group; + GSettings *settings; +} MateNotificationApplet; + +static void +show_about (GtkAction *action, + MateNotificationApplet *applet); +static void +call_properties (GtkAction *action, + MateNotificationApplet *applet); + +static const GtkActionEntry applet_menu_actions [] = { + { "Preferences", "document-properties", N_("_Preferences"), + NULL, NULL, G_CALLBACK (call_properties) }, + { "About", "help-about", N_("_About"), + NULL, NULL, G_CALLBACK (show_about) } +}; + +static const char* notification_properties[] = { + "mate-notification-properties", +}; + +static void +applet_destroy (MateNotificationApplet *applet) +{ + g_assert (applet); + + g_object_unref (applet->settings); + g_object_unref (applet->action_group); + g_free (applet); +} + +static void +call_properties (GtkAction *action, + MateNotificationApplet *applet) +{ + gsize i; + (void) action; + + for (i = 0; i < G_N_ELEMENTS (notification_properties); i++) { + char *programpath = g_find_program_in_path (notification_properties[i]); + + if (programpath != NULL) { + g_free (programpath); + mate_gdk_spawn_command_line_on_screen (gtk_widget_get_screen (GTK_WIDGET (applet->applet)), + notification_properties[i], + NULL); + return; + } + } +} + +static void +show_about (GtkAction *action, + MateNotificationApplet *applet) +{ + static const char *authors[] = { + "Robert Buj <[email protected]>", + NULL + }; + (void) action; + (void) applet; + + gtk_show_about_dialog (NULL, + "title", _("About Do Not Disturb"), + "version", VERSION, + "copyright", _("Copyright \xc2\xa9 2020 MATE developers"), + "comments", _("Activate the do not disturb mode quickly."), + "authors", authors, + "translator-credits", _("translator-credits"), + "logo_icon_name", "mate-notification-properties", + NULL); +} + +static void +set_status_image (MateNotificationApplet *applet, + gboolean active) +{ + gtk_widget_show_all (GTK_WIDGET (applet->applet)); + if (active) + gtk_widget_hide (applet->image_on); + else + gtk_widget_hide (applet->image_off); +} + +static void +settings_changed (GSettings *settings, + gchar *key, + MateNotificationApplet *applet) +{ + if (g_strcmp0 (GSETTINGS_KEY_DO_NOT_DISTURB, key) == 0) + set_status_image (applet, + g_settings_get_boolean (settings, key)); +} + +static gboolean +applet_main (MatePanelApplet *applet_widget) +{ + MateNotificationApplet *applet; + GtkWidget *box; + + bindtextdomain (GETTEXT_PACKAGE, MATELOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + + g_set_application_name (_("Do Not Disturb")); + gtk_window_set_default_icon_name ("mate-notification-properties"); + + applet = g_new (MateNotificationApplet, 1); + applet->applet = applet_widget; + applet->settings = g_settings_new (GSETTINGS_SCHEMA); + + box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); + applet->image_on = gtk_image_new_from_icon_name ("user-available", GTK_ICON_SIZE_BUTTON); + applet->image_off = gtk_image_new_from_icon_name ("user-invisible", GTK_ICON_SIZE_BUTTON); + + gtk_widget_set_tooltip_text (applet->image_off, N_("Do Not Disturb")); + gtk_widget_set_tooltip_text (applet->image_on, N_("Notifications Enabled")); + + gtk_box_pack_start (GTK_BOX (box), applet->image_on, + TRUE, TRUE, 0); + gtk_box_pack_start (GTK_BOX (box), applet->image_off, + TRUE, TRUE, 0); + gtk_container_add (GTK_CONTAINER (applet_widget), box); + + set_status_image (applet, + g_settings_get_boolean (applet->settings, + GSETTINGS_KEY_DO_NOT_DISTURB)); + + /* set up context menu */ + applet->action_group = gtk_action_group_new ("Do Not Disturb Actions"); + gtk_action_group_set_translation_domain (applet->action_group, GETTEXT_PACKAGE); + gtk_action_group_add_actions (applet->action_group, applet_menu_actions, + G_N_ELEMENTS (applet_menu_actions), applet); + + GtkToggleAction *do_not_disturb_toggle_action = + gtk_toggle_action_new ("DoNotDisturb", N_("_Do not disturb"), + N_("Enable/Disable do-not-disturb mode."), NULL); + + gtk_action_group_add_action (applet->action_group, + GTK_ACTION (do_not_disturb_toggle_action)); + + mate_panel_applet_setup_menu_from_resource (applet->applet, + RESOURCE_PATH "menu.xml", + applet->action_group); + + g_settings_bind (applet->settings, "do-not-disturb", + do_not_disturb_toggle_action, "active", + G_SETTINGS_BIND_DEFAULT); + + g_signal_connect (G_OBJECT (applet->applet), "destroy", + G_CALLBACK (applet_destroy), NULL); + + /* GSettings callback */ + g_signal_connect (G_OBJECT (applet->settings), "changed::" GSETTINGS_KEY_DO_NOT_DISTURB, + G_CALLBACK (settings_changed), applet); + + return TRUE; +} + +static gboolean +applet_factory (MatePanelApplet *applet, + const gchar *iid, + gpointer data) +{ + gboolean retval = FALSE; + (void) data; + + if (!strcmp (iid, "MateNotificationApplet")) + retval = applet_main (applet); + + return retval; +} + +MATE_PANEL_APPLET_OUT_PROCESS_FACTORY ("MateNotificationAppletFactory", + PANEL_TYPE_APPLET, + "Do Not Disturb Applet", + applet_factory, + NULL) diff --git a/src/capplet/org.mate.panel.applet.notifications.gresource.xml b/src/capplet/org.mate.panel.applet.notifications.gresource.xml new file mode 100644 index 0000000..43eec64 --- /dev/null +++ b/src/capplet/org.mate.panel.applet.notifications.gresource.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<gresources> + <gresource prefix="/org/mate/panel/applet/notifications"> + <file compressed="true" alias="menu.xml">mate-notification-applet-menu.xml</file> + </gresource> +</gresources> |