mirror of
https://github.com/profanity-im/profanity.git
synced 2025-01-03 14:57:42 -05:00
Added notifier module
This commit is contained in:
parent
e14cd43af4
commit
f63f68630b
@ -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/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/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/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/command.h src/command/command.c src/command/history.c \
|
||||||
src/command/history.h src/command/parser.c \
|
src/command/history.h src/command/parser.c \
|
||||||
src/command/parser.h \
|
src/command/parser.h \
|
||||||
|
@ -42,6 +42,7 @@
|
|||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "muc.h"
|
#include "muc.h"
|
||||||
#include "resource.h"
|
#include "resource.h"
|
||||||
|
#include "ui/notifier.h"
|
||||||
#include "ui/ui.h"
|
#include "ui/ui.h"
|
||||||
#include "xmpp/xmpp.h"
|
#include "xmpp/xmpp.h"
|
||||||
|
|
||||||
|
137
src/ui/core.c
137
src/ui/core.c
@ -28,9 +28,6 @@
|
|||||||
#include <X11/extensions/scrnsaver.h>
|
#include <X11/extensions/scrnsaver.h>
|
||||||
#endif
|
#endif
|
||||||
#include <glib.h>
|
#include <glib.h>
|
||||||
#ifdef HAVE_LIBNOTIFY
|
|
||||||
#include <libnotify/notify.h>
|
|
||||||
#endif
|
|
||||||
#ifdef PLATFORM_CYGWIN
|
#ifdef PLATFORM_CYGWIN
|
||||||
#include <windows.h>
|
#include <windows.h>
|
||||||
#endif
|
#endif
|
||||||
@ -50,6 +47,7 @@
|
|||||||
#include "jid.h"
|
#include "jid.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "muc.h"
|
#include "muc.h"
|
||||||
|
#include "ui/notifier.h"
|
||||||
#include "ui/ui.h"
|
#include "ui/ui.h"
|
||||||
#include "ui/window.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_switch(const wint_t * const ch);
|
||||||
static void _win_handle_page(const wint_t * const ch);
|
static void _win_handle_page(const wint_t * const ch);
|
||||||
static void _win_resize_all(void);
|
static void _win_resize_all(void);
|
||||||
static gint _win_get_unread(void);
|
|
||||||
static void _win_show_history(WINDOW *win, int win_index,
|
static void _win_show_history(WINDOW *win, int win_index,
|
||||||
const char * const contact);
|
const char * const contact);
|
||||||
static void _ui_draw_win_title(void);
|
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
|
void
|
||||||
ui_init(void)
|
ui_init(void)
|
||||||
{
|
{
|
||||||
@ -119,6 +110,7 @@ ui_init(void)
|
|||||||
console = windows[0];
|
console = windows[0];
|
||||||
current = console;
|
current = console;
|
||||||
cons_about();
|
cons_about();
|
||||||
|
notifier_init();
|
||||||
#ifdef HAVE_LIBXSS
|
#ifdef HAVE_LIBXSS
|
||||||
display = XOpenDisplay(0);
|
display = XOpenDisplay(0);
|
||||||
#endif
|
#endif
|
||||||
@ -171,11 +163,7 @@ ui_reset_idle_time(void)
|
|||||||
void
|
void
|
||||||
ui_close(void)
|
ui_close(void)
|
||||||
{
|
{
|
||||||
#ifdef HAVE_LIBNOTIFY
|
notifier_uninit();
|
||||||
if (notify_is_initted()) {
|
|
||||||
notify_uninit();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
endwin();
|
endwin();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -239,7 +227,7 @@ ui_contact_typing(const char * const from)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (prefs_get_boolean(PREF_NOTIFY_TYPING))
|
if (prefs_get_boolean(PREF_NOTIFY_TYPING))
|
||||||
_notify_typing(from);
|
notify_typing(from);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -392,7 +380,7 @@ ui_incoming_msg(const char * const from, const char * const message,
|
|||||||
if (prefs_get_boolean(PREF_BEEP))
|
if (prefs_get_boolean(PREF_BEEP))
|
||||||
beep();
|
beep();
|
||||||
if (prefs_get_boolean(PREF_NOTIFY_MESSAGE))
|
if (prefs_get_boolean(PREF_NOTIFY_MESSAGE))
|
||||||
_notify_message(display_from);
|
notify_message(display_from);
|
||||||
|
|
||||||
g_free(display_from);
|
g_free(display_from);
|
||||||
}
|
}
|
||||||
@ -990,7 +978,7 @@ ui_room_message(const char * const room_jid, const char * const nick,
|
|||||||
beep();
|
beep();
|
||||||
}
|
}
|
||||||
if (prefs_get_boolean(PREF_NOTIFY_MESSAGE)) {
|
if (prefs_get_boolean(PREF_NOTIFY_MESSAGE)) {
|
||||||
_notify_message(nick);
|
notify_message(nick);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1082,14 +1070,18 @@ ui_status_room(const char * const contact)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
gint
|
||||||
notify_remind(void)
|
ui_unread(void)
|
||||||
{
|
{
|
||||||
gint unread = _win_get_unread();
|
int i;
|
||||||
if (unread > 0) {
|
gint result = 0;
|
||||||
_notify_remind(unread);
|
for (i = 0; i < NUM_WINS; i++) {
|
||||||
|
if (windows[i] != NULL) {
|
||||||
|
result += windows[i]->unread;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_ui_draw_win_title(void)
|
_ui_draw_win_title(void)
|
||||||
@ -1110,7 +1102,7 @@ _ui_draw_win_title(void)
|
|||||||
|
|
||||||
if (status == JABBER_CONNECTED) {
|
if (status == JABBER_CONNECTED) {
|
||||||
const char * const jid = jabber_get_jid();
|
const char * const jid = jabber_get_jid();
|
||||||
gint unread = _win_get_unread();
|
gint unread = ui_unread();
|
||||||
|
|
||||||
if (unread != 0) {
|
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');
|
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
|
static int
|
||||||
_find_prof_win_index(const char * const contact)
|
_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
|
static void
|
||||||
_win_show_history(WINDOW *win, int win_index, const char * const contact)
|
_win_show_history(WINDOW *win, int win_index, const char * const contact)
|
||||||
{
|
{
|
||||||
|
136
src/ui/notifier.c
Normal file
136
src/ui/notifier.c
Normal 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
28
src/ui/notifier.h
Normal 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);
|
@ -62,6 +62,7 @@ void ui_reset_idle_time(void);
|
|||||||
void ui_new_chat_win(const char * const to);
|
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_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);
|
void ui_print_system_msg_from_recipient(const char * const from, const char *message);
|
||||||
|
gint ui_unread(void);
|
||||||
|
|
||||||
// current window actions
|
// current window actions
|
||||||
void ui_close_current(void);
|
void ui_close_current(void);
|
||||||
@ -188,5 +189,4 @@ void inp_block(void);
|
|||||||
void inp_get_password(char *passwd);
|
void inp_get_password(char *passwd);
|
||||||
void inp_replace_input(char *input, const char * const new_input, int *size);
|
void inp_replace_input(char *input, const char * const new_input, int *size);
|
||||||
|
|
||||||
void notify_remind(void);
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user