summaryrefslogtreecommitdiffstats
path: root/include/rofi.h
blob: b2c5eda1976bf62263d1da4fc38e831d54887735 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
#ifndef ROFI_MAIN_H
#define ROFI_MAIN_H
#include <X11/X.h>
#include <glib.h>
#include <string.h>
#include <stdlib.h>
#include "textbox.h"
#include <cairo.h>
#include <cairo-xlib.h>
#include "timings.h"
#include "keyb.h"

/**
 * @defgroup Widgets Widgets
 */

/**
 * Pointer to xdg cache directory.
 */
extern const char *cache_dir;

typedef struct _Mode   Mode;
/**
 * Enum used to sum the possible states of ROFI.
 */
typedef enum
{
    /** Exit. */
    MODE_EXIT       = 1000,
    /** Skip to the next cycle-able dialog. */
    NEXT_DIALOG     = 1001,
    /** Reload current DIALOG */
    RELOAD_DIALOG   = 1002,
    /** Previous dialog */
    PREVIOUS_DIALOG = 1003
} ModeMode;

/**
 * State returned by the rofi window.
 */
typedef enum
{
    /** Entry is selected. */
    MENU_OK           = 0x00010000,
    /** User canceled the operation. (e.g. pressed escape) */
    MENU_CANCEL       = 0x00020000,
    /** User requested a mode switch */
    MENU_NEXT         = 0x00040000,
    /** Custom (non-matched) input was entered. */
    MENU_CUSTOM_INPUT = 0x00080000,
    /** User wanted to delete entry from history. */
    MENU_ENTRY_DELETE = 0x00100000,
    /** User wants to jump to another switcher. */
    MENU_QUICK_SWITCH = 0x00200000,
    /** Go to the previous menu. */
    MENU_PREVIOUS     = 0x00400000,
    /** Modifiers */
    MENU_SHIFT        = 0x10000000,
    /** Mask */
    MENU_LOWER_MASK   = 0x0000FFFF
} MenuReturn;

/**
 * @param sig  The caught signal
 *
 * Catch the exit signal generated by X.
 */
void catch_exit ( __attribute__( ( unused ) ) int sig );

/**
 * Enumeration indicating location or gravity of window.
 *
 * WL_NORTH_WEST      WL_NORTH      WL_NORTH_EAST
 *
 * WL_EAST            WL_CENTER     WL_EAST
 *
 * WL_SOUTH_WEST      WL_SOUTH      WL_SOUTH_EAST
 *
 */
typedef enum _WindowLocation
{
    /** Center */
    WL_CENTER     = 0,
    /** Left top corner. */
    WL_NORTH_WEST = 1,
    /** Top middle */
    WL_NORTH      = 2,
    /** Top right */
    WL_NORTH_EAST = 3,
    /** Middle right */
    WL_EAST       = 4,
    /** Bottom right */
    WL_EAST_SOUTH = 5,
    /** Bottom middle */
    WL_SOUTH      = 6,
    /** Bottom left */
    WL_SOUTH_WEST = 7,
    /** Middle left */
    WL_WEST       = 8
} WindowLocation;

/**
 * @param sw the Mode to show.
 * @param lines An array of strings to display.
 * @param num_lines Length of the array with strings to display.
 * @param input A pointer to a string where the inputted data is placed.
 * @param prompt The prompt to show.
 * @param shift pointer to integer that is set to the state of the shift key.
 * @param mmc Menu menu match callback, used for matching user input.
 * @param mmc_data data to pass to mmc.
 * @param selected_line pointer to integer holding the selected line.
 * @param message Extra message to display.
 *
 * Main menu callback.
 *
 * @returns The command issued (see MenuReturn)
 */
MenuReturn menu ( Mode *sw, char **input, char *prompt, unsigned int *selected_line, unsigned int *next_pos, const char *message )
__attribute__ ( ( nonnull ( 1, 2, 3, 4 ) ) );
/**
 * Settings
 */

typedef struct _Settings
{
    /** List of enabled modi */
    char           *modi;
    /** Window settings */
    unsigned int   window_opacity;
    /** Border width */
    unsigned int   menu_bw;
    /** Width (0-100 in %, > 100 in pixels, < 0 in char width.) */
    int            menu_width;
    /** # lines */
    unsigned int   menu_lines;
    /** # Columns */
    unsigned int   menu_columns;
    /** Font string (pango format) */
    char           * menu_font;

    /** New row colors */
    unsigned int   color_enabled;
    char           * color_normal;
    char           * color_active;
    char           * color_urgent;
    char           * color_window;
    /** Foreground color */
    char           * menu_fg;
    char           * menu_fg_urgent;
    char           * menu_fg_active;
    /** Background color */
    char           * menu_bg;
    char           * menu_bg_urgent;
    char           * menu_bg_active;
    /** Background color alt */
    char           * menu_bg_alt;
    /** Highlight foreground color */
    char           * menu_hlfg;
    char           * menu_hlfg_urgent;
    char           * menu_hlfg_active;
    /** Highlight background color */
    char           * menu_hlbg;
    char           * menu_hlbg_urgent;
    char           * menu_hlbg_active;
    /** Border color */
    char           * menu_bc;
    /** Terminal to use  */
    char           * terminal_emulator;
    /** SSH client to use */
    char           * ssh_client;
    /** Command to execute when ssh session is selected */
    char           * ssh_command;
    /** Command for executing an application */
    char           * run_command;
    /** Command for executing an application in a terminal */
    char           * run_shell_command;
    /** Command for listing executables */
    char           * run_list_command;

    /** Windows location/gravity */
    WindowLocation location;
    /** Padding between elements */
    unsigned int   padding;
    /** Y offset */
    int            y_offset;
    /** X offset */
    int            x_offset;
    /** Always should config.menu_lines lines, even if less lines are available */
    unsigned int   fixed_num_lines;
    /** Do not use history */
    unsigned int   disable_history;
    /** Use levenshtein sorting when matching */
    unsigned int   levenshtein_sort;
    /** Search case sensitivity */
    unsigned int   case_sensitive;
    /** Separator to use for dmenu mode */
    char           separator;
    /** Height of an element in number of rows */
    int            element_height;
    /** Sidebar mode, show the modi */
    unsigned int   sidebar_mode;
    /** Lazy filter limit. */
    unsigned int   lazy_filter_limit;
    /** Auto select. */
    unsigned int   auto_select;
    /** Hosts file parsing */
    unsigned int   parse_hosts;
    /** Knonw_hosts file parsing */
    unsigned int   parse_known_hosts;
    /** Combi Modes */
    char           *combi_modi;
    /** Fuzzy match */
    unsigned int   fuzzy;
    unsigned int   glob;
    unsigned int   tokenize;
    unsigned int   regex;
    /** Monitors */
    int            monitor;
    /** Line margin */
    unsigned int   line_margin;
    /** filter */
    char           *filter;
    /** style */
    char           *separator_style;
    /** hide scrollbar */
    unsigned int   hide_scrollbar;
    /** show markup in elements. */
    unsigned int   markup_rows;
    /** fullscreen */
    unsigned int   fullscreen;
    /** bg image */
    unsigned int   fake_transparency;
    /** dpi */
    int            dpi;
    /** Number threads (1 to disable) */
    unsigned int   threads;
    unsigned int   scrollbar_width;
} Settings;

/** Global Settings structure. */
extern Settings config;

/**
 * @param msg The error message to show.
 * @param markup The error message uses pango markup.
 *
 * The error message to show.
 */
void error_dialog ( const char *msg, int markup  );

typedef void ( *switcher_free )( Mode *data );

typedef char * ( *switcher_get_display_value )( const Mode *sw, unsigned int selected_line, int *state, int get_entry );

typedef char * ( *switcher_get_completion )( const Mode *sw, unsigned int selected_line );
/**
 * @param tokens  List of (input) tokens to match.
 * @param input   The entry to match against.
 * @param case_sensitive Whether case is significant.
 * @param index   The current selected index.
 * @param data    User data.
 *
 * Function prototype for the matching algorithm.
 *
 * @returns 1 when it matches, 0 if not.
 */
typedef int ( *switcher_token_match )( const Mode *data, char **tokens, int not_ascii, int case_sensitive, unsigned int index );

typedef void ( *switcher_init )( Mode *sw );

typedef unsigned int ( *switcher_get_num_entries )( const Mode *sw );

typedef void ( *switcher_destroy )( Mode *sw );

typedef ModeMode ( *switcher_result )( Mode *sw, int menu_retv, char **input, unsigned int selected_line );

typedef int ( *switcher_is_not_ascii )( const Mode *sw, unsigned int index );

/**
 * Structure defining a switcher.
 * It consists of a name, callback and if enabled
 * a textbox for the sidebar-mode.
 */
struct _Mode
{
    // Name (max 31 char long)
    char         name[32];
    // Keybindings (keysym and modmask)
    char         * keycfg;
    char         * keystr;
    KeySym       keysym;
    unsigned int modmask;

    /**
     * A switcher normally consists of the following parts:
     */
    // Initialize the Mode
    switcher_init              init;
    // Destroy the switcher, e.g. free all its memory.
    switcher_destroy           destroy;
    // Get number of entries to display. (unfiltered).
    switcher_get_num_entries   get_num_entries;
    // Check if the element is ascii.
    switcher_is_not_ascii      is_not_ascii;
    // Process the result of the user selection.
    switcher_result            result;
    // Token match.
    switcher_token_match       token_match;
    // Get the string to display for the entry.
    switcher_get_display_value mgrv;
    // Get the 'completed' entry.
    switcher_get_completion    get_completion;

    // Pointer to private data.
    void                       *private_data;

    // Free SWitcher
    // Only to be used when the switcher object itself is dynamic.
    // And has data in `ed`
    switcher_free free;
    // Extra fields for script
    void          *ed;
};

#define  color_reset           "\033[0m"
#define  color_bold            "\033[1m"
#define  color_italic          "\033[2m"
#define  color_underline       "\033[4m"
#define  color_black           "\033[0;30m"
#define  color_red             "\033[0;31m"
#define  color_green           "\033[0;32m"
#define  color_yellow          "\033[0;33m"
#define  color_blue            "\033[0;34m"
#define  color_magenta         "\033[0;35m"
#define  color_cyan            "\033[0;36m"
#define  color_white           "\033[0;37m"
#define  color_white_bold      "\033[1;37m"
#define  color_black_bold      "\033[1;30m"
#define  color_red_bold        "\033[1;31m"
#define  color_green_bold      "\033[1;32m"
#define  color_yellow_bold     "\033[1;33m"
#define  color_blue_bold       "\033[1;34m"
#define  color_magenta_bold    "\033[1;35m"
#define  color_cyan_bold       "\033[1;36m"

int show_error_message ( const