1
0
Fork 0
mirror of https://github.com/davatorium/rofi.git synced 2025-04-07 17:33:14 -04:00

Add support for startup-notification

This commit is contained in:
QC 2015-09-13 17:29:50 +02:00
parent 6b632cadbb
commit 3374e1be9a
4 changed files with 73 additions and 10 deletions

View file

@ -19,6 +19,7 @@
* libpangoxft
* libglib2.0
* libx11
* libstartup-notification-1.0
On debian based systems, the developer packages are in the form of: `<package>-dev` on rpm based
'<package>-devel'.

View file

@ -12,6 +12,7 @@ LIBS=\
@xft_LIBS@\
@x11_LIBS@\
@xinerama_LIBS@\
@libsn_LIBS@\
@pango_LIBS@
AM_CFLAGS=\
@ -20,6 +21,7 @@ AM_CFLAGS=\
@x11_CFLAGS@\
@xinerama_CFLAGS@\
@pango_CFLAGS@\
@libsn_CFLAGS@\
-DMANPAGE_PATH="\"$(mandir)/\""\
-I$(top_srcdir)/include/\
-I$(top_srcdir)/config/\

View file

@ -47,6 +47,7 @@ PKG_CHECK_MODULES([xft], [xft])
PKG_CHECK_MODULES([x11], [x11])
PKG_CHECK_MODULES([xinerama], [xinerama])
PKG_CHECK_MODULES([pango], [pango pangoxft])
PKG_CHECK_MODULES([libsn], [libstartup-notification-1.0])
AC_SUBST([EXTRA_CFLAGS], ["-Wall -Wextra -Wparentheses -Winline -pedantic"])

View file

@ -44,6 +44,9 @@
#include <sys/wait.h>
#include <sys/types.h>
#define SN_API_NOT_YET_FROZEN
#include <libsn/sn.h>
#include "rofi.h"
#include "helper.h"
#include "textbox.h"
@ -62,18 +65,20 @@ typedef enum _MainLoopEvent
} MainLoopEvent;
// Pidfile.
char *pidfile = NULL;
const char *cache_dir = NULL;
Display *display = NULL;
char *display_str = NULL;
char *pidfile = NULL;
const char *cache_dir = NULL;
SnDisplay *sndisplay = NULL;
SnLauncheeContext *sncontext = NULL;
Display *display = NULL;
char *display_str = NULL;
extern Atom netatoms[NUM_NETATOMS];
Window main_window = None;
GC gc = NULL;
Colormap map = None;
XVisualInfo vinfo;
extern Atom netatoms[NUM_NETATOMS];
Window main_window = None;
GC gc = NULL;
Colormap map = None;
XVisualInfo vinfo;
unsigned int normal_window_mode = FALSE;
unsigned int normal_window_mode = FALSE;
typedef struct _Mode
{
@ -968,6 +973,9 @@ MenuReturn menu ( Switcher *sw, char **input, char *prompt,
XWindowAttributes attr;
if ( main_window == None || XGetWindowAttributes ( display, main_window, &attr ) == 0 ) {
main_window = create_window ( display );
if ( sncontext != NULL ) {
sn_launchee_context_setup_window ( sncontext, main_window );
}
}
// Get active monitor size.
monitor_active ( display, &mon );
@ -1114,6 +1122,9 @@ MenuReturn menu ( Switcher *sw, char **input, char *prompt,
}
}
if ( sncontext != NULL ) {
sn_launchee_context_complete ( sncontext );
}
int x11_fd = ConnectionNumber ( display );
while ( !state.quit ) {
// Update if requested.
@ -1151,6 +1162,9 @@ MenuReturn menu ( Switcher *sw, char **input, char *prompt,
}
// Get next event. (might block)
XNextEvent ( display, &ev );
if ( sndisplay != NULL ) {
sn_display_process_event ( sndisplay, &ev );
}
if ( ev.type == KeymapNotify ) {
XRefreshKeyboardMapping ( &ev.xmapping );
}
@ -1393,6 +1407,9 @@ void error_dialog ( const char *msg, int markup )
// Display it.
XMapRaised ( display, main_window );
if ( sncontext != NULL ) {
sn_launchee_context_complete ( sncontext );
}
while ( !state.quit ) {
// Update if requested.
if ( state.update ) {
@ -1402,6 +1419,9 @@ void error_dialog ( const char *msg, int markup )
// Wait for event.
XEvent ev;
XNextEvent ( display, &ev );
if ( sndisplay != NULL ) {
sn_display_process_event ( sndisplay, &ev );
}
// Handle event.
if ( ev.type == Expose ) {
while ( XCheckTypedEvent ( display, Expose, &ev ) ) {
@ -1586,6 +1606,14 @@ static void cleanup ()
XFreeGC ( display, gc );
gc = NULL;
}
if ( sncontext != NULL ) {
sn_launchee_context_unref ( sncontext );
sncontext = NULL;
}
if ( sndisplay != NULL ) {
sn_display_unref ( sndisplay );
sndisplay = NULL;
}
XCloseDisplay ( display );
display = NULL;
}
@ -1825,6 +1853,9 @@ static void main_loop_x11_event_handler ( void )
XEvent ev;
// Read event, we know this won't block as we checked with XPending.
XNextEvent ( display, &ev );
if ( sndisplay != NULL ) {
sn_display_process_event ( sndisplay, &ev );
}
// If we get an event that does not belong to a window:
// Ignore it.
if ( ev.xany.window == None ) {
@ -1893,6 +1924,23 @@ static GThread *setup_signal_thread ( int *fd )
return g_thread_new ( "signal_process", rofi_signal_handler_process, (void *) fd );
}
static int error_trap_depth = 0;
static void error_trap_push ( G_GNUC_UNUSED SnDisplay *display, G_GNUC_UNUSED Display *xdisplay )
{
++error_trap_depth;
}
static void error_trap_pop ( G_GNUC_UNUSED SnDisplay *display, Display *xdisplay )
{
if ( error_trap_depth == 0 ) {
fprintf ( stderr, "Error trap underflow!\n" );
exit ( 1 );
}
XSync ( xdisplay, False ); /* get all errors out of the queue */
--error_trap_depth;
}
int main ( int argc, char *argv[] )
{
cmd_set_arguments ( argc, argv );
@ -1954,6 +2002,12 @@ int main ( int argc, char *argv[] )
fprintf ( stderr, "cannot open display!\n" );
return EXIT_FAILURE;
}
// startup not.
sndisplay = sn_display_new ( display, error_trap_push, error_trap_pop );
if ( sndisplay != NULL ) {
sncontext = sn_launchee_context_new_from_environment ( sndisplay, DefaultScreen ( display ) );
}
// Setup keybinding
setup_abe ();
@ -2051,6 +2105,11 @@ int main ( int argc, char *argv[] )
}
GThread *pid_signal_proc = setup_signal_thread ( &( pfds[1] ) );
// done starting deamon.
if ( sncontext != NULL ) {
sn_launchee_context_complete ( sncontext );
}
// Application Main loop.
// This listens in the background for any events on the Xserver
// catching global key presses.