1
0
Fork 0
mirror of https://github.com/davatorium/rofi.git synced 2025-02-10 15:44:41 -05:00

helper: Add API to support startup notification

Signed-off-by: Quentin Glidic <sardemff7+git@sardemff7.net>
This commit is contained in:
Quentin Glidic 2017-06-02 14:54:21 +02:00
parent 6fefbbf8ab
commit 51d34b662e
No known key found for this signature in database
GPG key ID: AC203F96E2C34BB7
16 changed files with 115 additions and 9 deletions

View file

@ -29,6 +29,7 @@
#define ROFI_DISPLAY_H #define ROFI_DISPLAY_H
#include <glib.h> #include <glib.h>
#include "helper.h"
#include "nkutils-bindings.h" #include "nkutils-bindings.h"
/** /**
@ -63,4 +64,13 @@ void display_cleanup(void);
*/ */
void display_dump_monitor_layout ( void ); void display_dump_monitor_layout ( void );
/**
* @param context The startup notification context for the application to launch
* @param child_setup A pointer to return the child setup function
* @param user_data A pointer to return the child setup function user_data
*
* Provides the needed child setup function
*/
void display_startup_notification ( RofiHelperExecuteContext *context, GSpawnChildSetupFunc *child_setup, gpointer *user_data );
#endif #endif

View file

@ -259,27 +259,51 @@ int rofi_scorer_fuzzy_evaluate ( const char *pattern, glong plen, const char *st
*/ */
int utf8_strncmp ( const char *a, const char* b, size_t n ) __attribute__( ( nonnull ( 1, 2 ) ) ); int utf8_strncmp ( const char *a, const char* b, size_t n ) __attribute__( ( nonnull ( 1, 2 ) ) );
/**
* The startup notification context of the application to launch
*/
typedef struct
{
/** The name of the application */
const gchar *name;
/** The binary name of the application */
const gchar *binary;
/** The description of the launch */
const gchar *description;
/** The icon name of the application */
const gchar *icon;
/** The application id (desktop file with the .desktop suffix) */
const gchar *app_id;
/** The window manager class of the application */
const gchar *wmclass;
/** The command we run */
const gchar *command;
} RofiHelperExecuteContext;
/** /**
* @param args The arguments of the command to exec. * @param args The arguments of the command to exec.
* @param error_precmd Prefix to error message command. * @param error_precmd Prefix to error message command.
* @param error_cmd Error message command * @param error_cmd Error message command
* @param context The startup notification context, if any
* *
* Executes the command * Executes the command
* *
* @returns TRUE when successful, FALSE when failed. * @returns TRUE when successful, FALSE when failed.
*/ */
gboolean helper_execute ( const char *wd, char **args, const char *error_precmd, const char *error_cmd ); gboolean helper_execute ( const char *wd, char **args, const char *error_precmd, const char *error_cmd, RofiHelperExecuteContext *context );
/** /**
* @param wd The work directory (optional) * @param wd The work directory (optional)
* @param cmd The cmd to execute * @param cmd The cmd to execute
* @param run_in_term Indicate if command should be run in a terminal * @param run_in_term Indicate if command should be run in a terminal
* @param context The startup notification context, if any
* *
* Execute command. * Execute command.
* If needed members of @param context are NULL, they will be filled.
* *
* @returns FALSE On failure, TRUE on success * @returns FALSE On failure, TRUE on success
*/ */
gboolean helper_execute_command ( const char *wd, const char *cmd, int run_in_term ); gboolean helper_execute_command ( const char *wd, const char *cmd, gboolean run_in_term, RofiHelperExecuteContext *context );
/** /**
* @param file The file path * @param file The file path

View file

@ -185,7 +185,7 @@ static void exec_cmd_entry ( DRunModeEntry *e )
// Returns false if not found, if key not found, we don't want run in terminal. // Returns false if not found, if key not found, we don't want run in terminal.
gboolean terminal = g_key_file_get_boolean ( e->key_file, "Desktop Entry", "Terminal", NULL ); gboolean terminal = g_key_file_get_boolean ( e->key_file, "Desktop Entry", "Terminal", NULL );
if ( helper_execute_command ( exec_path, fp, terminal ) ) { if ( helper_execute_command ( exec_path, fp, terminal, NULL ) ) {
char *path = g_build_filename ( cache_dir, DRUN_CACHE_FILE, NULL ); char *path = g_build_filename ( cache_dir, DRUN_CACHE_FILE, NULL );
char *key = g_strdup_printf ( "%s:::%s", e->root, e->path ); char *key = g_strdup_printf ( "%s:::%s", e->root, e->path );
history_set ( path, key ); history_set ( path, key );
@ -511,7 +511,7 @@ static ModeMode drun_mode_result ( Mode *sw, int mretv, char **input, unsigned i
exec_cmd_entry ( &( rmpd->entry_list[selected_line] ) ); exec_cmd_entry ( &( rmpd->entry_list[selected_line] ) );
} }
else if ( ( mretv & MENU_CUSTOM_INPUT ) && *input != NULL && *input[0] != '\0' ) { else if ( ( mretv & MENU_CUSTOM_INPUT ) && *input != NULL && *input[0] != '\0' ) {
helper_execute_command ( NULL, *input, run_in_term ); helper_execute_command ( NULL, *input, run_in_term, NULL );
} }
else if ( ( mretv & MENU_ENTRY_DELETE ) && selected_line < rmpd->cmd_list_length ) { else if ( ( mretv & MENU_ENTRY_DELETE ) && selected_line < rmpd->cmd_list_length ) {
if ( selected_line < rmpd->history_length ) { if ( selected_line < rmpd->history_length ) {

View file

@ -92,7 +92,7 @@ static void exec_cmd ( const char *cmd, int run_in_term )
} }
char *path = g_build_filename ( cache_dir, RUN_CACHE_FILE, NULL ); char *path = g_build_filename ( cache_dir, RUN_CACHE_FILE, NULL );
if ( helper_execute_command ( NULL, lf_cmd, run_in_term ) ) { if ( helper_execute_command ( NULL, lf_cmd, run_in_term, NULL ) ) {
/** /**
* This happens in non-critical time (After launching app) * This happens in non-critical time (After launching app)
* It is allowed to be a bit slower. * It is allowed to be a bit slower.

View file

@ -81,7 +81,7 @@ static inline int execshssh ( const char *host )
helper_parse_setup ( config.ssh_command, &args, &argsv, "{host}", host, NULL ); helper_parse_setup ( config.ssh_command, &args, &argsv, "{host}", host, NULL );
return helper_execute ( NULL, args, "ssh ", host ); return helper_execute ( NULL, args, "ssh ", host, NULL );
} }
/** /**

View file

@ -47,6 +47,7 @@
#include <pango/pango-fontmap.h> #include <pango/pango-fontmap.h>
#include <pango/pangocairo.h> #include <pango/pangocairo.h>
#include <librsvg/rsvg.h> #include <librsvg/rsvg.h>
#include "display.h"
#include "xcb.h" #include "xcb.h"
#include "helper.h" #include "helper.h"
#include "helper-theme.h" #include "helper-theme.h"
@ -962,7 +963,7 @@ int utf8_strncmp ( const char* a, const char* b, size_t n )
return r; return r;
} }
gboolean helper_execute ( const char *wd, char **args, const char *error_precmd, const char *error_cmd ) gboolean helper_execute ( const char *wd, char **args, const char *error_precmd, const char *error_cmd, RofiHelperExecuteContext *context )
{ {
gboolean retv = TRUE; gboolean retv = TRUE;
GError *error = NULL; GError *error = NULL;
@ -970,6 +971,8 @@ gboolean helper_execute ( const char *wd, char **args, const char *error_precmd,
GSpawnChildSetupFunc child_setup = NULL; GSpawnChildSetupFunc child_setup = NULL;
gpointer user_data = NULL; gpointer user_data = NULL;
display_startup_notification ( context, &child_setup, &user_data );
g_spawn_async ( wd, args, NULL, G_SPAWN_SEARCH_PATH, child_setup, user_data, NULL, &error ); g_spawn_async ( wd, args, NULL, G_SPAWN_SEARCH_PATH, child_setup, user_data, NULL, &error );
if ( error != NULL ) { if ( error != NULL ) {
char *msg = g_strdup_printf ( "Failed to execute: '%s%s'\nError: '%s'", error_precmd, error_cmd, error->message ); char *msg = g_strdup_printf ( "Failed to execute: '%s%s'\nError: '%s'", error_precmd, error_cmd, error->message );
@ -985,7 +988,7 @@ gboolean helper_execute ( const char *wd, char **args, const char *error_precmd,
return retv; return retv;
} }
gboolean helper_execute_command ( const char *wd, const char *cmd, int run_in_term ) gboolean helper_execute_command ( const char *wd, const char *cmd, gboolean run_in_term, RofiHelperExecuteContext *context )
{ {
char **args = NULL; char **args = NULL;
int argc = 0; int argc = 0;
@ -997,7 +1000,26 @@ gboolean helper_execute_command ( const char *wd, const char *cmd, int run_in_te
helper_parse_setup ( config.run_command, &args, &argc, "{cmd}", cmd, NULL ); helper_parse_setup ( config.run_command, &args, &argc, "{cmd}", cmd, NULL );
} }
return helper_execute ( wd, args, "", cmd ); if ( context != NULL ) {
if ( context->name == NULL ) {
context->name = args[0];
}
if ( context->binary == NULL ) {
context->binary = args[0];
}
if ( context->description == NULL ) {
gsize l = strlen ( "Launching '' via rofi" ) + strlen ( cmd ) + 1;
gchar *description = g_newa ( gchar, l );
g_snprintf ( description, l, "Launching '%s' via rofi", cmd );
context->description = description;
}
if ( context->command == NULL ) {
context->command = cmd;
}
}
return helper_execute ( wd, args, "", cmd, context );
} }
char *helper_get_theme_path ( const char *file ) char *helper_get_theme_path ( const char *file )

View file

@ -359,6 +359,10 @@ void display_dump_monitor_layout ( void )
} }
} }
void display_startup_notification ( RofiHelperExecuteContext *context, GSpawnChildSetupFunc *child_setup, gpointer *user_data )
{
}
static int monitor_get_dimension ( int monitor_id, workarea *mon ) static int monitor_get_dimension ( int monitor_id, workarea *mon )
{ {
memset ( mon, 0, sizeof ( workarea ) ); memset ( mon, 0, sizeof ( workarea ) );

View file

@ -32,6 +32,7 @@
#include <helper.h> #include <helper.h>
#include <string.h> #include <string.h>
#include <xcb/xcb_ewmh.h> #include <xcb/xcb_ewmh.h>
#include "display.h"
#include "xcb.h" #include "xcb.h"
#include "xcb-internal.h" #include "xcb-internal.h"
#include "rofi.h" #include "rofi.h"
@ -65,6 +66,10 @@ int monitor_active ( G_GNUC_UNUSED workarea *mon )
return 0; return 0;
} }
void display_startup_notification ( G_GNUC_UNUSED RofiHelperExecuteContext *context, G_GNUC_UNUSED GSpawnChildSetupFunc *child_setup, G_GNUC_UNUSED gpointer *user_data )
{
}
int main ( G_GNUC_UNUSED int argc, G_GNUC_UNUSED char ** argv ) int main ( G_GNUC_UNUSED int argc, G_GNUC_UNUSED char ** argv )
{ {

View file

@ -32,6 +32,7 @@
#include <helper.h> #include <helper.h>
#include <string.h> #include <string.h>
#include <xcb/xcb_ewmh.h> #include <xcb/xcb_ewmh.h>
#include "display.h"
#include "xcb.h" #include "xcb.h"
#include "xcb-internal.h" #include "xcb-internal.h"
#include "rofi.h" #include "rofi.h"
@ -66,6 +67,10 @@ int monitor_active ( G_GNUC_UNUSED workarea *mon )
return 0; return 0;
} }
void display_startup_notification ( G_GNUC_UNUSED RofiHelperExecuteContext *context, G_GNUC_UNUSED GSpawnChildSetupFunc *child_setup, G_GNUC_UNUSED gpointer *user_data )
{
}
int main ( int argc, char ** argv ) int main ( int argc, char ** argv )
{ {
cmd_set_arguments ( argc, argv ); cmd_set_arguments ( argc, argv );

View file

@ -32,6 +32,7 @@
#include <helper.h> #include <helper.h>
#include <string.h> #include <string.h>
#include <xcb/xcb_ewmh.h> #include <xcb/xcb_ewmh.h>
#include "display.h"
#include "xcb.h" #include "xcb.h"
#include "xcb-internal.h" #include "xcb-internal.h"
#include "rofi.h" #include "rofi.h"
@ -56,6 +57,10 @@ int monitor_active ( G_GNUC_UNUSED workarea *mon )
return 0; return 0;
} }
void display_startup_notification ( G_GNUC_UNUSED RofiHelperExecuteContext *context, G_GNUC_UNUSED GSpawnChildSetupFunc *child_setup, G_GNUC_UNUSED gpointer *user_data )
{
}
int main ( G_GNUC_UNUSED int argc, G_GNUC_UNUSED char ** argv ) int main ( G_GNUC_UNUSED int argc, G_GNUC_UNUSED char ** argv )
{ {
if ( setlocale ( LC_ALL, "" ) == NULL ) { if ( setlocale ( LC_ALL, "" ) == NULL ) {

View file

@ -32,6 +32,7 @@
#include <helper.h> #include <helper.h>
#include <string.h> #include <string.h>
#include <xcb/xcb_ewmh.h> #include <xcb/xcb_ewmh.h>
#include "display.h"
#include "xcb.h" #include "xcb.h"
#include "xcb-internal.h" #include "xcb-internal.h"
#include "rofi.h" #include "rofi.h"
@ -75,6 +76,10 @@ int monitor_active ( G_GNUC_UNUSED workarea *mon )
return 0; return 0;
} }
void display_startup_notification ( G_GNUC_UNUSED RofiHelperExecuteContext *context, G_GNUC_UNUSED GSpawnChildSetupFunc *child_setup, G_GNUC_UNUSED gpointer *user_data )
{
}
int main ( int argc, char ** argv ) int main ( int argc, char ** argv )
{ {
cmd_set_arguments ( argc, argv ); cmd_set_arguments ( argc, argv );

View file

@ -32,6 +32,7 @@
#include <helper.h> #include <helper.h>
#include <string.h> #include <string.h>
#include <xcb/xcb_ewmh.h> #include <xcb/xcb_ewmh.h>
#include "display.h"
#include "xcb.h" #include "xcb.h"
#include "xcb-internal.h" #include "xcb-internal.h"
#include "rofi.h" #include "rofi.h"
@ -56,6 +57,10 @@ int monitor_active ( G_GNUC_UNUSED workarea *mon )
return 0; return 0;
} }
void display_startup_notification ( G_GNUC_UNUSED RofiHelperExecuteContext *context, G_GNUC_UNUSED GSpawnChildSetupFunc *child_setup, G_GNUC_UNUSED gpointer *user_data )
{
}
int main ( G_GNUC_UNUSED int argc, G_GNUC_UNUSED char ** argv ) int main ( G_GNUC_UNUSED int argc, G_GNUC_UNUSED char ** argv )
{ {
if ( setlocale ( LC_ALL, "" ) == NULL ) { if ( setlocale ( LC_ALL, "" ) == NULL ) {

View file

@ -38,6 +38,7 @@
#include <dialogs/help-keys.h> #include <dialogs/help-keys.h>
#include <xkbcommon/xkbcommon.h> #include <xkbcommon/xkbcommon.h>
#include "rofi.h" #include "rofi.h"
#include "display.h"
#include "xcb.h" #include "xcb.h"
#include <keyb.h> #include <keyb.h>
#include <helper.h> #include <helper.h>
@ -73,6 +74,11 @@ gboolean rofi_view_trigger_action ( G_GNUC_UNUSED RofiViewState *state, G_GNUC_U
{ {
return FALSE; return FALSE;
} }
void display_startup_notification ( G_GNUC_UNUSED RofiHelperExecuteContext *context, G_GNUC_UNUSED GSpawnChildSetupFunc *child_setup, G_GNUC_UNUSED gpointer *user_data )
{
}
#ifndef _ck_assert_ptr_null #ifndef _ck_assert_ptr_null
/* Pointer against NULL comparison macros with improved output /* Pointer against NULL comparison macros with improved output
* compared to ck_assert(). */ * compared to ck_assert(). */

View file

@ -37,6 +37,7 @@
#include <widgets/textbox.h> #include <widgets/textbox.h>
#include <rofi.h> #include <rofi.h>
#include <cairo-xlib.h> #include <cairo-xlib.h>
#include "display.h"
#include "xcb.h" #include "xcb.h"
#include "settings.h" #include "settings.h"
#include "xrmoptions.h" #include "xrmoptions.h"
@ -76,6 +77,10 @@ int monitor_active ( G_GNUC_UNUSED workarea *mon )
return 0; return 0;
} }
void display_startup_notification ( G_GNUC_UNUSED RofiHelperExecuteContext *context, G_GNUC_UNUSED GSpawnChildSetupFunc *child_setup, G_GNUC_UNUSED gpointer *user_data )
{
}
int main ( G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv ) int main ( G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv )
{ {
cairo_surface_t *surf = cairo_image_surface_create ( CAIRO_FORMAT_ARGB32, 100, 100 ); cairo_surface_t *surf = cairo_image_surface_create ( CAIRO_FORMAT_ARGB32, 100, 100 );

View file

@ -35,6 +35,7 @@
#include "xcb-internal.h" #include "xcb-internal.h"
#include "rofi.h" #include "rofi.h"
#include "settings.h" #include "settings.h"
#include "display.h"
#include "xcb.h" #include "xcb.h"
#include "theme.h" #include "theme.h"
#include "css-colors.h" #include "css-colors.h"
@ -70,6 +71,10 @@ int monitor_active ( G_GNUC_UNUSED workarea *mon )
return 0; return 0;
} }
void display_startup_notification ( G_GNUC_UNUSED RofiHelperExecuteContext *context, G_GNUC_UNUSED GSpawnChildSetupFunc *child_setup, G_GNUC_UNUSED gpointer *user_data )
{
}
#ifndef _ck_assert_ptr_null #ifndef _ck_assert_ptr_null
/* Pointer against NULL comparison macros with improved output /* Pointer against NULL comparison macros with improved output
* compared to ck_assert(). */ * compared to ck_assert(). */

View file

@ -35,6 +35,7 @@
#include <widgets/widget.h> #include <widgets/widget.h>
#include <widgets/widget-internal.h> #include <widgets/widget-internal.h>
#include "rofi.h" #include "rofi.h"
#include "display.h"
#include "xrmoptions.h" #include "xrmoptions.h"
#include "xcb.h" #include "xcb.h"
unsigned int test =0; unsigned int test =0;
@ -66,6 +67,10 @@ int rofi_view_error_dialog ( const char *msg, G_GNUC_UNUSED int markup )
return FALSE; return FALSE;
} }
void display_startup_notification ( G_GNUC_UNUSED RofiHelperExecuteContext *context, G_GNUC_UNUSED GSpawnChildSetupFunc *child_setup, G_GNUC_UNUSED gpointer *user_data )
{
}
int main ( G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv ) int main ( G_GNUC_UNUSED int argc, G_GNUC_UNUSED char **argv )
{ {
// box 20 by 40 // box 20 by 40