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 /src/capplet/mate-notification-applet.c | |
parent | b704b0e30d2ad7672c3fa86c02f3f311327fd66a (diff) | |
download | mate-notification-daemon-c1dd04d294e329da95c515d7f5a9ac7a00d269cc.tar.bz2 mate-notification-daemon-c1dd04d294e329da95c515d7f5a9ac7a00d269cc.tar.xz |
Add Do Not Disturb Applet
Diffstat (limited to 'src/capplet/mate-notification-applet.c')
-rw-r--r-- | src/capplet/mate-notification-applet.c | 218 |
1 files changed, 218 insertions, 0 deletions
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) |