mirror of
https://github.com/davatorium/rofi.git
synced 2024-11-25 13:55:34 -05:00
parent
795a0e085d
commit
a99cfa56c4
2 changed files with 73 additions and 16 deletions
|
@ -19,7 +19,7 @@ else
|
||||||
echo -en "\0markup-rows\x1ftrue\n"
|
echo -en "\0markup-rows\x1ftrue\n"
|
||||||
echo -en "\0message\x1fSpecial <b>bold</b>message\n"
|
echo -en "\0message\x1fSpecial <b>bold</b>message\n"
|
||||||
|
|
||||||
echo "aap"
|
echo -en "aap\0icon\x1ffolder\n"
|
||||||
echo "noot"
|
echo "noot"
|
||||||
echo "mies"
|
echo "mies"
|
||||||
echo "testing"
|
echo "testing"
|
||||||
|
|
|
@ -45,12 +45,22 @@
|
||||||
|
|
||||||
#include "mode-private.h"
|
#include "mode-private.h"
|
||||||
|
|
||||||
|
|
||||||
|
#include "rofi-icon-fetcher.h"
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
char *entry;
|
||||||
|
char *icon_name;
|
||||||
|
uint32_t icon_fetch_uid;
|
||||||
|
|
||||||
|
} ScriptEntry;
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
/** ID of the current script. */
|
/** ID of the current script. */
|
||||||
unsigned int id;
|
unsigned int id;
|
||||||
/** List of visible items. */
|
/** List of visible items. */
|
||||||
char **cmd_list;
|
ScriptEntry *cmd_list;
|
||||||
/** length list of visible items. */
|
/** length list of visible items. */
|
||||||
unsigned int cmd_list_length;
|
unsigned int cmd_list_length;
|
||||||
|
|
||||||
|
@ -66,6 +76,24 @@ typedef struct
|
||||||
gboolean do_markup;
|
gboolean do_markup;
|
||||||
} ScriptModePrivateData;
|
} ScriptModePrivateData;
|
||||||
|
|
||||||
|
static void parse_entry_extras ( G_GNUC_UNUSED Mode *sw, ScriptEntry *entry, char *buffer, size_t length )
|
||||||
|
{
|
||||||
|
size_t length_key = 0;//strlen ( line );
|
||||||
|
while ( length_key <= length && buffer[length_key] != '\x1f' ) {
|
||||||
|
length_key++;
|
||||||
|
}
|
||||||
|
if ( length_key < length ) {
|
||||||
|
buffer[length_key] = '\0';
|
||||||
|
char *value = buffer + length_key + 1;
|
||||||
|
if ( strcasecmp(buffer, "icon" ) == 0 ) {
|
||||||
|
entry->icon_name = g_strdup(value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
static void parse_header_entry ( Mode *sw, char *line, ssize_t length )
|
static void parse_header_entry ( Mode *sw, char *line, ssize_t length )
|
||||||
{
|
{
|
||||||
ScriptModePrivateData *pd = (ScriptModePrivateData *) sw->private_data;
|
ScriptModePrivateData *pd = (ScriptModePrivateData *) sw->private_data;
|
||||||
|
@ -98,11 +126,11 @@ static void parse_header_entry ( Mode *sw, char *line, ssize_t length )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static char **get_script_output ( Mode *sw, char *command, char *arg, unsigned int *length )
|
static ScriptEntry *get_script_output ( Mode *sw, char *command, char *arg, unsigned int *length )
|
||||||
{
|
{
|
||||||
int fd = -1;
|
int fd = -1;
|
||||||
GError *error = NULL;
|
GError *error = NULL;
|
||||||
char **retv = NULL;
|
ScriptEntry *retv = NULL;
|
||||||
char **argv = NULL;
|
char **argv = NULL;
|
||||||
int argc = 0;
|
int argc = 0;
|
||||||
*length = 0;
|
*length = 0;
|
||||||
|
@ -138,10 +166,16 @@ static char **get_script_output ( Mode *sw, char *command, char *arg, unsigned i
|
||||||
else {
|
else {
|
||||||
if ( actual_size < ( ( *length ) + 2 ) ) {
|
if ( actual_size < ( ( *length ) + 2 ) ) {
|
||||||
actual_size += 256;
|
actual_size += 256;
|
||||||
retv = g_realloc ( retv, ( actual_size ) * sizeof ( char* ) );
|
retv = g_realloc ( retv, ( actual_size ) * sizeof ( ScriptEntry ) );
|
||||||
}
|
}
|
||||||
retv[( *length )] = g_strdup ( buffer );
|
size_t buf_length = strlen(buffer)+1;
|
||||||
retv[( *length ) + 1] = NULL;
|
retv[( *length )].entry = g_memdup ( buffer, buf_length);
|
||||||
|
retv[( *length )].icon_name = NULL;
|
||||||
|
retv[(*length)].icon_fetch_uid = 0;
|
||||||
|
if ( buf_length > 0 && (read_length > (ssize_t)buf_length) ) {
|
||||||
|
parse_entry_extras ( sw, &(retv[(*length)]), buffer+buf_length, read_length-buf_length);
|
||||||
|
}
|
||||||
|
retv[( *length ) + 1].entry = NULL;
|
||||||
( *length )++;
|
( *length )++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -157,9 +191,9 @@ static char **get_script_output ( Mode *sw, char *command, char *arg, unsigned i
|
||||||
return retv;
|
return retv;
|
||||||
}
|
}
|
||||||
|
|
||||||
static char **execute_executor ( Mode *sw, char *result, unsigned int *length )
|
static ScriptEntry *execute_executor ( Mode *sw, char *result, unsigned int *length )
|
||||||
{
|
{
|
||||||
char **retv = get_script_output ( sw, sw->ed, result, length );
|
ScriptEntry *retv = get_script_output ( sw, sw->ed, result, length );
|
||||||
return retv;
|
return retv;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -204,7 +238,7 @@ static ModeMode script_mode_result ( Mode *sw, int mretv, char **input, unsigned
|
||||||
{
|
{
|
||||||
ScriptModePrivateData *rmpd = (ScriptModePrivateData *) sw->private_data;
|
ScriptModePrivateData *rmpd = (ScriptModePrivateData *) sw->private_data;
|
||||||
ModeMode retv = MODE_EXIT;
|
ModeMode retv = MODE_EXIT;
|
||||||
char **new_list = NULL;
|
ScriptEntry *new_list = NULL;
|
||||||
unsigned int new_length = 0;
|
unsigned int new_length = 0;
|
||||||
|
|
||||||
if ( ( mretv & MENU_NEXT ) ) {
|
if ( ( mretv & MENU_NEXT ) ) {
|
||||||
|
@ -216,9 +250,9 @@ static ModeMode script_mode_result ( Mode *sw, int mretv, char **input, unsigned
|
||||||
else if ( ( mretv & MENU_QUICK_SWITCH ) ) {
|
else if ( ( mretv & MENU_QUICK_SWITCH ) ) {
|
||||||
retv = ( mretv & MENU_LOWER_MASK );
|
retv = ( mretv & MENU_LOWER_MASK );
|
||||||
}
|
}
|
||||||
else if ( ( mretv & MENU_OK ) && rmpd->cmd_list[selected_line] != NULL ) {
|
else if ( ( mretv & MENU_OK ) && rmpd->cmd_list[selected_line].entry != NULL ) {
|
||||||
script_mode_reset_highlight ( sw );
|
script_mode_reset_highlight ( sw );
|
||||||
new_list = execute_executor ( sw, rmpd->cmd_list[selected_line], &new_length );
|
new_list = execute_executor ( sw, rmpd->cmd_list[selected_line].entry, &new_length );
|
||||||
}
|
}
|
||||||
else if ( ( mretv & MENU_CUSTOM_INPUT ) && *input != NULL && *input[0] != '\0' ) {
|
else if ( ( mretv & MENU_CUSTOM_INPUT ) && *input != NULL && *input[0] != '\0' ) {
|
||||||
script_mode_reset_highlight ( sw );
|
script_mode_reset_highlight ( sw );
|
||||||
|
@ -227,7 +261,11 @@ static ModeMode script_mode_result ( Mode *sw, int mretv, char **input, unsigned
|
||||||
|
|
||||||
// If a new list was generated, use that an loop around.
|
// If a new list was generated, use that an loop around.
|
||||||
if ( new_list != NULL ) {
|
if ( new_list != NULL ) {
|
||||||
g_strfreev ( rmpd->cmd_list );
|
for ( unsigned int i = 0; i < rmpd->cmd_list_length; i++ ){
|
||||||
|
g_free ( rmpd->cmd_list[i].entry );
|
||||||
|
g_free ( rmpd->cmd_list[i].icon_name );
|
||||||
|
}
|
||||||
|
g_free ( rmpd->cmd_list );
|
||||||
|
|
||||||
rmpd->cmd_list = new_list;
|
rmpd->cmd_list = new_list;
|
||||||
rmpd->cmd_list_length = new_length;
|
rmpd->cmd_list_length = new_length;
|
||||||
|
@ -240,7 +278,11 @@ static void script_mode_destroy ( Mode *sw )
|
||||||
{
|
{
|
||||||
ScriptModePrivateData *rmpd = (ScriptModePrivateData *) sw->private_data;
|
ScriptModePrivateData *rmpd = (ScriptModePrivateData *) sw->private_data;
|
||||||
if ( rmpd != NULL ) {
|
if ( rmpd != NULL ) {
|
||||||
g_strfreev ( rmpd->cmd_list );
|
for ( unsigned int i = 0; i < rmpd->cmd_list_length; i++ ){
|
||||||
|
g_free ( rmpd->cmd_list[i].entry );
|
||||||
|
g_free ( rmpd->cmd_list[i].icon_name );
|
||||||
|
}
|
||||||
|
g_free ( rmpd->cmd_list );
|
||||||
g_free ( rmpd->message );
|
g_free ( rmpd->message );
|
||||||
g_free ( rmpd->prompt );
|
g_free ( rmpd->prompt );
|
||||||
g_free ( rmpd->urgent_list );
|
g_free ( rmpd->urgent_list );
|
||||||
|
@ -265,19 +307,33 @@ static char *_get_display_value ( const Mode *sw, unsigned int selected_line, G_
|
||||||
if ( pd->do_markup ) {
|
if ( pd->do_markup ) {
|
||||||
*state |= MARKUP;
|
*state |= MARKUP;
|
||||||
}
|
}
|
||||||
return get_entry ? g_strdup ( pd->cmd_list[selected_line] ) : NULL;
|
return get_entry ? g_strdup ( pd->cmd_list[selected_line].entry ) : NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int script_token_match ( const Mode *sw, rofi_int_matcher **tokens, unsigned int index )
|
static int script_token_match ( const Mode *sw, rofi_int_matcher **tokens, unsigned int index )
|
||||||
{
|
{
|
||||||
ScriptModePrivateData *rmpd = sw->private_data;
|
ScriptModePrivateData *rmpd = sw->private_data;
|
||||||
return helper_token_match ( tokens, rmpd->cmd_list[index] );
|
return helper_token_match ( tokens, rmpd->cmd_list[index].entry );
|
||||||
}
|
}
|
||||||
static char *script_get_message ( const Mode *sw )
|
static char *script_get_message ( const Mode *sw )
|
||||||
{
|
{
|
||||||
ScriptModePrivateData *pd = sw->private_data;
|
ScriptModePrivateData *pd = sw->private_data;
|
||||||
return g_strdup ( pd->message );
|
return g_strdup ( pd->message );
|
||||||
}
|
}
|
||||||
|
static cairo_surface_t *script_get_icon ( const Mode *sw, unsigned int selected_line, int height )
|
||||||
|
{
|
||||||
|
ScriptModePrivateData *pd = (ScriptModePrivateData *) mode_get_private_data ( sw );
|
||||||
|
g_return_val_if_fail ( pd->cmd_list != NULL, NULL );
|
||||||
|
ScriptEntry *dr = &( pd->cmd_list[selected_line] );
|
||||||
|
if ( dr->icon_name == NULL ) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
if ( dr->icon_fetch_uid > 0 ) {
|
||||||
|
return rofi_icon_fetcher_get ( dr->icon_fetch_uid );
|
||||||
|
}
|
||||||
|
dr->icon_fetch_uid = rofi_icon_fetcher_query ( dr->icon_name, height );
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
#include "mode-private.h"
|
#include "mode-private.h"
|
||||||
Mode *script_switcher_parse_setup ( const char *str )
|
Mode *script_switcher_parse_setup ( const char *str )
|
||||||
|
@ -305,6 +361,7 @@ Mode *script_switcher_parse_setup ( const char *str )
|
||||||
sw->_destroy = script_mode_destroy;
|
sw->_destroy = script_mode_destroy;
|
||||||
sw->_token_match = script_token_match;
|
sw->_token_match = script_token_match;
|
||||||
sw->_get_message = script_get_message;
|
sw->_get_message = script_get_message;
|
||||||
|
sw->_get_icon = script_get_icon;
|
||||||
sw->_get_completion = NULL,
|
sw->_get_completion = NULL,
|
||||||
sw->_preprocess_input = NULL,
|
sw->_preprocess_input = NULL,
|
||||||
sw->_get_display_value = _get_display_value;
|
sw->_get_display_value = _get_display_value;
|
||||||
|
|
Loading…
Reference in a new issue