1
0
mirror of https://github.com/profanity-im/profanity.git synced 2024-09-22 19:45:54 -04:00

Added notifier module

This commit is contained in:
James Booth 2013-04-21 20:17:06 +01:00
parent e14cd43af4
commit f63f68630b
6 changed files with 183 additions and 123 deletions

View File

@ -10,7 +10,7 @@ profanity_SOURCES = src/contact.c src/contact.h src/log.c src/common.c \
src/xmpp/capabilities.h src/xmpp/connection.h \
src/ui/ui.h src/ui/window.c src/ui/window.h src/ui/core.c \
src/ui/titlebar.c src/ui/statusbar.c src/ui/inputwin.c \
src/ui/console.c \
src/ui/console.c src/ui/notifier.c src/ui/notifier.h \
src/command/command.h src/command/command.c src/command/history.c \
src/command/history.h src/command/parser.c \
src/command/parser.h \

View File

@ -42,6 +42,7 @@
#include "log.h"
#include "muc.h"
#include "resource.h"
#include "ui/notifier.h"
#include "ui/ui.h"
#include "xmpp/xmpp.h"

View File

@ -28,9 +28,6 @@
#include <X11/extensions/scrnsaver.h>
#endif
#include <glib.h>
#ifdef HAVE_LIBNOTIFY
#include <libnotify/notify.h>
#endif
#ifdef PLATFORM_CYGWIN
#include <windows.h>
#endif
@ -50,6 +47,7 @@
#include "jid.h"
#include "log.h"
#include "muc.h"
#include "ui/notifier.h"
#include "ui/ui.h"
#include "ui/window.h"
@ -86,17 +84,10 @@ static void _show_status_string(ProfWin *window, const char * const from,
static void _win_handle_switch(const wint_t * const ch);
static void _win_handle_page(const wint_t * const ch);
static void _win_resize_all(void);
static gint _win_get_unread(void);
static void _win_show_history(WINDOW *win, int win_index,
const char * const contact);
static void _ui_draw_win_title(void);
static void _notify(const char * const message, int timeout,
const char * const category);
static void _notify_remind(gint unread);
static void _notify_message(const char * const short_from);
static void _notify_typing(const char * const from);
void
ui_init(void)
{
@ -119,6 +110,7 @@ ui_init(void)
console = windows[0];
current = console;
cons_about();
notifier_init();
#ifdef HAVE_LIBXSS
display = XOpenDisplay(0);
#endif
@ -171,11 +163,7 @@ ui_reset_idle_time(void)
void
ui_close(void)
{
#ifdef HAVE_LIBNOTIFY
if (notify_is_initted()) {
notify_uninit();
}
#endif
notifier_uninit();
endwin();
}
@ -239,7 +227,7 @@ ui_contact_typing(const char * const from)
}
if (prefs_get_boolean(PREF_NOTIFY_TYPING))
_notify_typing(from);
notify_typing(from);
}
void
@ -392,7 +380,7 @@ ui_incoming_msg(const char * const from, const char * const message,
if (prefs_get_boolean(PREF_BEEP))
beep();
if (prefs_get_boolean(PREF_NOTIFY_MESSAGE))
_notify_message(display_from);
notify_message(display_from);
g_free(display_from);
}
@ -990,7 +978,7 @@ ui_room_message(const char * const room_jid, const char * const nick,
beep();
}
if (prefs_get_boolean(PREF_NOTIFY_MESSAGE)) {
_notify_message(nick);
notify_message(nick);
}
}
}
@ -1082,13 +1070,17 @@ ui_status_room(const char * const contact)
}
}
void
notify_remind(void)
gint
ui_unread(void)
{
gint unread = _win_get_unread();
if (unread > 0) {
_notify_remind(unread);
int i;
gint result = 0;
for (i = 0; i < NUM_WINS; i++) {
if (windows[i] != NULL) {
result += windows[i]->unread;
}
}
return result;
}
static void
@ -1110,7 +1102,7 @@ _ui_draw_win_title(void)
if (status == JABBER_CONNECTED) {
const char * const jid = jabber_get_jid();
gint unread = _win_get_unread();
gint unread = ui_unread();
if (unread != 0) {
snprintf(new_win_title, sizeof(new_win_title), "%c]0;%s%s (%d) - %s%c", '\033', "Profanity", version_str->str, unread, jid, '\007');
@ -1133,90 +1125,6 @@ _ui_draw_win_title(void)
}
}
static void
_notify(const char * const message, int timeout,
const char * const category)
{
#ifdef HAVE_LIBNOTIFY
gboolean notify_initted = notify_is_initted();
if (!notify_initted) {
notify_initted = notify_init("Profanity");
}
if (notify_initted) {
NotifyNotification *notification;
notification = notify_notification_new("Profanity", message, NULL);
notify_notification_set_timeout(notification, timeout);
notify_notification_set_category(notification, category);
notify_notification_set_urgency(notification, NOTIFY_URGENCY_NORMAL);
GError *error = NULL;
gboolean notify_success = notify_notification_show(notification, &error);
if (!notify_success) {
log_error("Error sending desktop notification:");
log_error(" -> Message : %s", message);
log_error(" -> Error : %s", error->message);
}
} else {
log_error("Libnotify initialisation error.");
}
#endif
#ifdef PLATFORM_CYGWIN
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
//nid.hWnd = hWnd;
nid.uID = 100;
nid.uVersion = NOTIFYICON_VERSION;
//nid.uCallbackMessage = WM_MYMESSAGE;
nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
strcpy(nid.szTip, "Tray Icon");
nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
Shell_NotifyIcon(NIM_ADD, &nid);
// For a Ballon Tip
nid.uFlags = NIF_INFO;
strcpy(nid.szInfoTitle, "Profanity"); // Title
strcpy(nid.szInfo, message); // Copy Tip
nid.uTimeout = timeout; // 3 Seconds
nid.dwInfoFlags = NIIF_INFO;
Shell_NotifyIcon(NIM_MODIFY, &nid);
#endif
}
static void
_notify_remind(gint unread)
{
char message[20];
if (unread == 1) {
sprintf(message, "1 unread message");
} else {
snprintf(message, sizeof(message), "%d unread messages", unread);
}
_notify(message, 5000, "Incoming message");
}
static void
_notify_message(const char * const short_from)
{
char message[strlen(short_from) + 1 + 10];
sprintf(message, "%s: message.", short_from);
_notify(message, 10000, "Incoming message");
}
static void
_notify_typing(const char * const from)
{
char message[strlen(from) + 1 + 11];
sprintf(message, "%s: typing...", from);
_notify(message, 10000, "Incoming message");
}
static int
_find_prof_win_index(const char * const contact)
{
@ -1493,19 +1401,6 @@ _win_handle_page(const wint_t * const ch)
}
}
static gint
_win_get_unread(void)
{
int i;
gint result = 0;
for (i = 0; i < NUM_WINS; i++) {
if (windows[i] != NULL) {
result += windows[i]->unread;
}
}
return result;
}
static void
_win_show_history(WINDOW *win, int win_index, const char * const contact)
{

136
src/ui/notifier.c Normal file
View File

@ -0,0 +1,136 @@
/*
* notifier.c
*
* Copyright (C) 2012, 2013 James Booth <boothj5@gmail.com>
*
* This file is part of Profanity.
*
* Profanity 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.
*
* Profanity 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 Profanity. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include "config.h"
#include <stdio.h>
#include <string.h>
#include <glib.h>
#ifdef HAVE_LIBNOTIFY
#include <libnotify/notify.h>
#endif
#include "log.h"
#include "ui/ui.h"
static void _notify(const char * const message, int timeout,
const char * const category);
void
notifier_init(void)
{
#ifdef HAVE_LIBNOTIFY
notify_init("Profanity");
#endif
}
void
notifier_uninit(void)
{
#ifdef HAVE_LIBNOTIFY
if (notify_is_initted()) {
notify_uninit();
}
#endif
}
void
notify_typing(const char * const from)
{
char message[strlen(from) + 1 + 11];
sprintf(message, "%s: typing...", from);
_notify(message, 10000, "Incoming message");
}
void
notify_message(const char * const short_from)
{
char message[strlen(short_from) + 1 + 10];
sprintf(message, "%s: message.", short_from);
_notify(message, 10000, "Incoming message");
}
void
notify_remind(void)
{
gint unread = ui_unread();
if (unread > 0) {
char message[20];
if (unread == 1) {
sprintf(message, "1 unread message");
} else {
snprintf(message, sizeof(message), "%d unread messages", unread);
}
_notify(message, 5000, "Incoming message");
}
}
static void
_notify(const char * const message, int timeout,
const char * const category)
{
#ifdef HAVE_LIBNOTIFY
if (notify_is_initted()) {
NotifyNotification *notification;
notification = notify_notification_new("Profanity", message, NULL);
notify_notification_set_timeout(notification, timeout);
notify_notification_set_category(notification, category);
notify_notification_set_urgency(notification, NOTIFY_URGENCY_NORMAL);
GError *error = NULL;
gboolean notify_success = notify_notification_show(notification, &error);
if (!notify_success) {
log_error("Error sending desktop notification:");
log_error(" -> Message : %s", message);
log_error(" -> Error : %s", error->message);
}
} else {
log_error("Libnotify initialisation error.");
}
#endif
#ifdef PLATFORM_CYGWIN
NOTIFYICONDATA nid;
nid.cbSize = sizeof(NOTIFYICONDATA);
//nid.hWnd = hWnd;
nid.uID = 100;
nid.uVersion = NOTIFYICON_VERSION;
//nid.uCallbackMessage = WM_MYMESSAGE;
nid.hIcon = LoadIcon(NULL, IDI_APPLICATION);
strcpy(nid.szTip, "Tray Icon");
nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP;
Shell_NotifyIcon(NIM_ADD, &nid);
// For a Ballon Tip
nid.uFlags = NIF_INFO;
strcpy(nid.szInfoTitle, "Profanity"); // Title
strcpy(nid.szInfo, message); // Copy Tip
nid.uTimeout = timeout; // 3 Seconds
nid.dwInfoFlags = NIIF_INFO;
Shell_NotifyIcon(NIM_MODIFY, &nid);
#endif
}

28
src/ui/notifier.h Normal file
View File

@ -0,0 +1,28 @@
/*
* notifier.h
*
* Copyright (C) 2012, 2013 James Booth <boothj5@gmail.com>
*
* This file is part of Profanity.
*
* Profanity 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.
*
* Profanity 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 Profanity. If not, see <http://www.gnu.org/licenses/>.
*
*/
void notifier_init(void);
void notifier_uninit(void);
void notify_typing(const char * const from);
void notify_message(const char * const short_from);
void notify_remind(void);

View File

@ -62,6 +62,7 @@ void ui_reset_idle_time(void);
void ui_new_chat_win(const char * const to);
void ui_print_error_from_recipient(const char * const from, const char *err_msg);
void ui_print_system_msg_from_recipient(const char * const from, const char *message);
gint ui_unread(void);
// current window actions
void ui_close_current(void);
@ -188,5 +189,4 @@ void inp_block(void);
void inp_get_password(char *passwd);
void inp_replace_input(char *input, const char * const new_input, int *size);
void notify_remind(void);
#endif