enlightenment/src/modules/notification/e_mod_main.c

170 lines
4.5 KiB
C

#include "e_mod_main.h"
/* Config function protos */
static Config *_notification_cfg_new(void);
static void _notification_cfg_free(Config *cfg);
/* Global variables */
E_Module *notification_mod = NULL;
Config *notification_cfg = NULL;
static E_Config_DD *conf_edd = NULL;
static unsigned int
_notification_notify(E_Notification_Notify *n)
{
unsigned int new_id;
if (e_desklock_state_get()) return 0;
notification_cfg->next_id++;
new_id = notification_cfg->next_id;
notification_popup_notify(n, new_id);
return new_id;
}
/* Module Api Functions */
E_API E_Module_Api e_modapi = {E_MODULE_API_VERSION, "Notification"};
static const E_Notification_Server_Info server_info = {
.name = "Notification Service",
.vendor = "Enlightenment",
.version = PACKAGE_VERSION,
.spec_version = "1.2",
.capabilities = {
"body", "body-markup",
"body-hyperlinks", "body-images",
"actions",
// "action-icons",
// "icon-multi",
// or
"icon-static",
"persistence",
"sound",
NULL }
};
/* Callbacks */
static unsigned int
_notification_cb_notify(void *data EINA_UNUSED, E_Notification_Notify *n)
{
return _notification_notify(n);
}
static void
_notification_cb_close(void *data EINA_UNUSED, unsigned int id)
{
notification_popup_close(id);
}
E_API void *
e_modapi_init(E_Module *m)
{
/* register config panel entry */
e_configure_registry_category_add("extensions", 90, _("Extensions"), NULL,
"preferences-extensions");
e_configure_registry_item_add("extensions/notification", 30,
_("Notification"), NULL,
"preferences-notification",
e_int_config_notification_module);
conf_edd = E_CONFIG_DD_NEW("Notification_Config", Config);
#undef T
#undef D
#define T Config
#define D conf_edd
E_CONFIG_VAL(D, T, version, INT);
E_CONFIG_VAL(D, T, show_low, INT);
E_CONFIG_VAL(D, T, show_normal, INT);
E_CONFIG_VAL(D, T, show_critical, INT);
E_CONFIG_VAL(D, T, corner, INT);
E_CONFIG_VAL(D, T, timeout, FLOAT);
E_CONFIG_VAL(D, T, force_timeout, INT);
E_CONFIG_VAL(D, T, ignore_replacement, INT);
E_CONFIG_VAL(D, T, dual_screen, INT);
notification_cfg = e_config_domain_load("module.notification", conf_edd);
if (notification_cfg &&
!(e_util_module_config_check(_("Notification Module"),
notification_cfg->version,
MOD_CONFIG_FILE_VERSION)))
{
_notification_cfg_free(notification_cfg);
notification_cfg = NULL;
}
if (!notification_cfg)
notification_cfg = _notification_cfg_new();
/* upgrades */
if (notification_cfg->version - (MOD_CONFIG_FILE_EPOCH * 1000000) < 1)
{
if (notification_cfg->dual_screen) notification_cfg->dual_screen = POPUP_DISPLAY_POLICY_MULTI;
}
notification_cfg->version = MOD_CONFIG_FILE_VERSION;
/* set up the notification daemon */
if (!e_notification_server_register(&server_info, _notification_cb_notify,
_notification_cb_close, NULL))
{
e_util_dialog_show(_("Error during notification server initialization"),
_("Ensure there's no other module acting as a server "
"and that D-Bus is correctly installed and "
"running"));
return NULL;
}
notification_mod = m;
return m;
}
E_API int
e_modapi_shutdown(E_Module *m EINA_UNUSED)
{
if (notification_cfg->cfd) e_object_del(E_OBJECT(notification_cfg->cfd));
e_configure_registry_item_del("extensions/notification");
e_configure_registry_category_del("extensions");
notification_popup_shutdown();
e_notification_server_unregister();
_notification_cfg_free(notification_cfg);
E_CONFIG_DD_FREE(conf_edd);
notification_mod = NULL;
return 1;
}
E_API int
e_modapi_save(E_Module *m EINA_UNUSED)
{
return e_config_domain_save("module.notification", conf_edd, notification_cfg);
}
static Config *
_notification_cfg_new(void)
{
Config *cfg;
cfg = E_NEW(Config, 1);
cfg->cfd = NULL;
cfg->version = MOD_CONFIG_FILE_VERSION;
cfg->show_low = 0;
cfg->show_normal = 1;
cfg->show_critical = 1;
cfg->timeout = 5.0;
cfg->force_timeout = 0;
cfg->ignore_replacement = 0;
cfg->dual_screen = POPUP_DISPLAY_POLICY_FIRST;
cfg->corner = CORNER_TR;
return cfg;
}
static void
_notification_cfg_free(Config *cfg)
{
free(cfg);
}