mirror of
https://github.com/Tha14/toxic.git
synced 2025-07-01 16:16:46 +02:00
Started adding support for popup notifications and adjustments to new core
This commit is contained in:
130
src/notify.c
130
src/notify.c
@ -28,34 +28,42 @@
|
||||
#include <string.h>
|
||||
#include <stdio.h>
|
||||
#include <unistd.h>
|
||||
#include <stdarg.h>
|
||||
#include <time.h>
|
||||
#include <sys/stat.h>
|
||||
|
||||
#ifdef __APPLE__
|
||||
#include <OpenAL/al.h>
|
||||
#include <OpenAL/alc.h>
|
||||
#ifdef _SOUND_NOTIFY
|
||||
#include <OpenAL/alut.h> /* Is this good? */
|
||||
#ifdef _AUDIO
|
||||
#ifdef __APPLE__
|
||||
#include <OpenAL/al.h>
|
||||
#include <OpenAL/alc.h>
|
||||
#ifdef _SOUND_NOTIFY
|
||||
#include <OpenAL/alut.h> /* Is this good? */
|
||||
#endif
|
||||
#else
|
||||
#include <AL/al.h>
|
||||
#include <AL/alc.h>
|
||||
#ifdef _SOUND_NOTIFY
|
||||
#include <AL/alut.h> /* freealut packet */
|
||||
#endif
|
||||
#endif
|
||||
#else
|
||||
#include <AL/al.h>
|
||||
#include <AL/alc.h>
|
||||
#ifdef _SOUND_NOTIFY
|
||||
#include <AL/alut.h> /* freealut packet */
|
||||
#endif
|
||||
#endif
|
||||
#endif /* _AUDIO */
|
||||
|
||||
#ifdef _X11
|
||||
#include <X11/Xlib.h>
|
||||
#endif /* _X11 */
|
||||
|
||||
#ifdef _BOX_NOTIFY
|
||||
#include <libnotify/notify.h>
|
||||
#endif
|
||||
|
||||
#define SOUNDS_SIZE 10
|
||||
#define ACTIVE_SOUNDS_MAX 50
|
||||
#define ACTIVE_NOTIFS_MAX 50
|
||||
|
||||
extern struct user_settings *user_settings_;
|
||||
|
||||
struct _Control {
|
||||
time_t cooldown;
|
||||
time_t notif_timeout;
|
||||
unsigned long this_window;
|
||||
#ifdef _X11
|
||||
Display *display;
|
||||
@ -69,14 +77,18 @@ struct _Control {
|
||||
#endif /* _SOUND_NOTIFY */
|
||||
} Control = {0};
|
||||
|
||||
struct _ActiveNotifications {
|
||||
#ifdef _SOUND_NOTIFY
|
||||
struct _ActiveSounds {
|
||||
uint32_t source;
|
||||
uint32_t buffer;
|
||||
_Bool active;
|
||||
_Bool looping;
|
||||
} actives[ACTIVE_SOUNDS_MAX] = {{0}};
|
||||
#endif
|
||||
|
||||
#ifdef _BOX_NOTIFY
|
||||
NotifyNotification* box;
|
||||
#endif
|
||||
} actives[ACTIVE_NOTIFS_MAX] = {{0}};
|
||||
/**********************************************************************************/
|
||||
/**********************************************************************************/
|
||||
/**********************************************************************************/
|
||||
@ -112,20 +124,20 @@ void graceful_clear()
|
||||
int i;
|
||||
pthread_mutex_lock(Control.poll_mutex);
|
||||
while (1) {
|
||||
for (i = 0; i < ACTIVE_SOUNDS_MAX; i ++) {
|
||||
for (i = 0; i < ACTIVE_NOTIFS_MAX; i ++) {
|
||||
if (actives[i].active) {
|
||||
if ( actives[i].looping ) {
|
||||
stop_sound(i);
|
||||
} else {
|
||||
if (!is_playing(actives[i].source))
|
||||
memset(&actives[i], 0, sizeof(struct _ActiveSounds));
|
||||
memset(&actives[i], 0, sizeof(struct _ActiveNotifications));
|
||||
else break;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if (i == ACTIVE_SOUNDS_MAX) {
|
||||
if (i == ACTIVE_NOTIFS_MAX) {
|
||||
pthread_mutex_unlock(Control.poll_mutex);
|
||||
return;
|
||||
}
|
||||
@ -140,15 +152,19 @@ void* do_playing(void* _p)
|
||||
int i;
|
||||
while(Control.poll_active) {
|
||||
pthread_mutex_lock(Control.poll_mutex);
|
||||
for (i = 0; i < ACTIVE_SOUNDS_MAX; i ++) {
|
||||
if (actives[i].active && !actives[i].looping) {
|
||||
for (i = 0; i < ACTIVE_NOTIFS_MAX; i ++) {
|
||||
if (actives[i].active && !actives[i].looping
|
||||
#ifdef _BOX_NOTIFY
|
||||
&& !actives[i].box
|
||||
#endif
|
||||
) {
|
||||
if (!is_playing(actives[i].source)) {
|
||||
/* Close */
|
||||
|
||||
alSourceStop(actives[i].source);
|
||||
alDeleteSources(1, &actives[i].source);
|
||||
alDeleteBuffers(1,&actives[i].buffer);
|
||||
memset(&actives[i], 0, sizeof(struct _ActiveSounds));
|
||||
memset(&actives[i], 0, sizeof(struct _ActiveNotifications));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -163,8 +179,8 @@ int play_source(uint32_t source, uint32_t buffer, _Bool looping)
|
||||
{
|
||||
pthread_mutex_lock(Control.poll_mutex);
|
||||
int i = 0;
|
||||
for (; i < ACTIVE_SOUNDS_MAX && actives[i].active; i ++);
|
||||
if ( i == ACTIVE_SOUNDS_MAX ) {
|
||||
for (; i < ACTIVE_NOTIFS_MAX && actives[i].active; i ++);
|
||||
if ( i == ACTIVE_NOTIFS_MAX ) {
|
||||
pthread_mutex_unlock(Control.poll_mutex);
|
||||
return -1; /* Full */
|
||||
}
|
||||
@ -189,11 +205,11 @@ int play_source(uint32_t source, uint32_t buffer, _Bool looping)
|
||||
|
||||
|
||||
/* Opens primary device */
|
||||
int init_notify(int login_cooldown)
|
||||
int init_notify(int login_cooldown, int notification_timeout)
|
||||
{
|
||||
#ifdef _SOUND_NOTIFY
|
||||
alutInitWithoutContext(NULL, NULL);
|
||||
if (open_primary_device(output, &Control.device_idx, 48000, 20) != de_None)
|
||||
if (open_primary_device(output, &Control.device_idx, 48000, 20, 1) != de_None)
|
||||
return -1;
|
||||
|
||||
pthread_mutex_init(Control.poll_mutex, NULL);
|
||||
@ -214,6 +230,10 @@ int init_notify(int login_cooldown)
|
||||
#endif /* _X11 */
|
||||
|
||||
|
||||
#ifdef _BOX_NOTIFY
|
||||
notify_init("toxic");
|
||||
#endif
|
||||
Control.notif_timeout = notification_timeout;
|
||||
return 1;
|
||||
}
|
||||
|
||||
@ -230,6 +250,11 @@ void terminate_notify()
|
||||
close_device(output, Control.device_idx);
|
||||
alutExit();
|
||||
#endif /* _SOUND_NOTIFY */
|
||||
|
||||
|
||||
#ifdef _BOX_NOTIFY
|
||||
notify_uninit();
|
||||
#endif
|
||||
}
|
||||
|
||||
#ifdef _SOUND_NOTIFY
|
||||
@ -271,7 +296,7 @@ int play_sound_internal(Notification what, _Bool loop)
|
||||
|
||||
int play_notify_sound(Notification notif, uint64_t flags)
|
||||
{
|
||||
int rc = 0;
|
||||
int rc = -1;
|
||||
|
||||
if (flags & NT_BEEP) beep();
|
||||
else if (notif != silent) {
|
||||
@ -287,12 +312,12 @@ int play_notify_sound(Notification notif, uint64_t flags)
|
||||
|
||||
void stop_sound(int sound)
|
||||
{
|
||||
if (sound >= 0 && sound < ACTIVE_SOUNDS_MAX && actives[sound].looping && actives[sound].active) {
|
||||
if (sound >= 0 && sound < ACTIVE_NOTIFS_MAX && actives[sound].looping && actives[sound].active ) {
|
||||
alSourcei(actives[sound].source, AL_LOOPING, false);
|
||||
alSourceStop(actives[sound].source);
|
||||
alDeleteSources(1, &actives[sound].source);
|
||||
alDeleteBuffers(1,&actives[sound].buffer);
|
||||
memset(&actives[sound], 0, sizeof(struct _ActiveSounds));
|
||||
memset(&actives[sound], 0, sizeof(struct _ActiveNotifications));
|
||||
}
|
||||
}
|
||||
#endif
|
||||
@ -330,9 +355,50 @@ int notify(ToxWindow* self, Notification notif, uint64_t flags)
|
||||
else if (flags & NT_ALWAYS)
|
||||
rc = m_play_sound(notif, flags);
|
||||
|
||||
if (flags & NT_NOTIFWND) {
|
||||
/* TODO: pop notify window */
|
||||
}
|
||||
|
||||
return rc;
|
||||
}
|
||||
|
||||
int box_notify(ToxWindow* self, Notification notif, uint64_t flags, char* title, char* format, ...)
|
||||
{
|
||||
#ifdef _BOX_NOTIFY
|
||||
int id = notify(self, notif, flags);
|
||||
|
||||
if (id == -1) { /* Could not play */
|
||||
pthread_mutex_lock(Control.poll_mutex);
|
||||
|
||||
for (id = 0; id < ACTIVE_NOTIFS_MAX && actives[id].active; id ++);
|
||||
if ( id == ACTIVE_NOTIFS_MAX ) {
|
||||
pthread_mutex_unlock(Control.poll_mutex);
|
||||
return -1; /* Full */
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(Control.poll_mutex);
|
||||
}
|
||||
|
||||
char title_compact [24] = {'\0'};
|
||||
strncpy(title_compact, title, 24);
|
||||
if (strlen(title) > 23) strcpy(title_compact + 20, "...");
|
||||
|
||||
char msg_compact [128] = {'\0'};
|
||||
va_list __ARGS__;
|
||||
va_start (__ARGS__, format);
|
||||
snprintf (msg_compact, 127, format, __ARGS__);
|
||||
va_end (__ARGS__);
|
||||
|
||||
if (strlen(msg_compact) > 124) strcpy(msg_compact + 124, "...");
|
||||
|
||||
actives[id].active = 1;
|
||||
actives[id].box = notify_notification_new(title_compact, msg_compact, NULL);
|
||||
notify_notification_set_timeout(actives[id].box, Control.notif_timeout);
|
||||
notify_notification_show(actives[id].box, NULL);
|
||||
|
||||
return id;
|
||||
#else
|
||||
return notify(self, notif, flags);
|
||||
#endif
|
||||
}
|
||||
|
||||
int box_notify_append(int id, char* format, ...)
|
||||
{
|
||||
return 0;
|
||||
}
|
Reference in New Issue
Block a user