5 #include <glib/gi18n-lib.h>
15 #if GTK_MAJOR_VERSION == 2
24 typedef struct gdk_keyboard_button_s
28 } gdk_keyboard_button_t;
30 static const gdk_keyboard_button_t gdk_keyboard_buttons[] = {
31 {
"BackSpace", GDK_KEY_BackSpace},
32 {
"CapsLock", GDK_KEY_Caps_Lock},
33 {
"Down", GDK_KEY_Down},
34 {
"Esc", GDK_KEY_Escape},
47 {
"Left", GDK_KEY_Left},
48 {
"PageDown", GDK_KEY_Page_Down},
49 {
"PageUp", GDK_KEY_Page_Up},
50 {
"Home", GDK_KEY_Home},
52 {
"Return", GDK_KEY_Return},
53 {
"Right", GDK_KEY_Right},
54 {
"Space", GDK_KEY_space},
55 {
"Super", GDK_KEY_Super_L},
57 {
"ShiftTab", GDK_KEY_ISO_Left_Tab},
61 typedef struct gdk_mouse_button_s
67 static const gdk_mouse_button_t gdk_mouse_buttons[] = {
79 typedef struct event_type_s
85 static const event_type_t event_types[] = {
93 typedef struct mouse_event_s
99 static const mouse_event_t mouse_events[] = {
108 unsigned int limit = (unmap ==
true) ? 1 : 2;
109 if (number_of_arguments < limit) {
110 girara_warning(
"Invalid number of arguments passed: %zu instead of at least %u", number_of_arguments, limit);
112 _(
"Invalid number of arguments passed: %zu instead of at least %u"), number_of_arguments, limit);
116 int shortcut_mask = 0;
117 int shortcut_key = 0;
118 int shortcut_mouse_button = 0;
120 char* shortcut_argument_data = NULL;
121 int shortcut_argument_n = 0;
122 char* shortcut_buffer_command = NULL;
125 bool mouse_event =
false;
127 size_t current_command = 0;
129 size_t tmp_length = strlen(tmp);
132 bool is_mode =
false;
133 if (tmp_length >= 3 && tmp[0] ==
'[' && tmp[tmp_length - 1] ==
']') {
134 char* tmp_inner = g_strndup(tmp + 1, tmp_length - 2);
137 if (!g_strcmp0(tmp_inner, mode->name)) {
138 shortcut_mode = mode->index;
144 if (is_mode ==
false) {
153 if (is_mode ==
true) {
155 tmp_length = strlen(tmp);
159 if (tmp_length >= 3 && tmp[0] ==
'<' && tmp[tmp_length - 1] ==
'>') {
160 tmp = g_strndup(tmp + 1, tmp_length - 2);
161 tmp_length = strlen(tmp);
164 if (strchr(tmp,
'-') != NULL && tmp[1] ==
'-' && tmp_length > 2) {
167 shortcut_mask = GDK_SHIFT_MASK;
171 shortcut_mask = GDK_MOD1_MASK;
174 shortcut_mask = GDK_CONTROL_MASK;
184 if (tmp_length == 3) {
185 shortcut_key = tmp[2];
189 for (
unsigned int i = 0; i <
LENGTH(gdk_keyboard_buttons); i++) {
190 if (g_strcmp0(tmp + 2, gdk_keyboard_buttons[i].identifier) == 0) {
191 shortcut_key = gdk_keyboard_buttons[i].keyval;
197 for (
unsigned int i = 0; i <
LENGTH(gdk_mouse_buttons); i++) {
198 if (!g_strcmp0(tmp + 2, gdk_mouse_buttons[i].identifier)) {
199 shortcut_mouse_button = gdk_mouse_buttons[i].button;
206 for (
unsigned int i = 0; i <
LENGTH(event_types); i++) {
207 if (!g_strcmp0(tmp + 2, event_types[i].identifier)) {
208 event_type = event_types[i].event;
215 if (found ==
false) {
225 for (
unsigned int i = 0; i <
LENGTH(gdk_keyboard_buttons); i++) {
226 if (g_strcmp0(tmp, gdk_keyboard_buttons[i].identifier) == 0) {
227 shortcut_key = gdk_keyboard_buttons[i].keyval;
233 for (
unsigned int i = 0; i <
LENGTH(gdk_mouse_buttons); i++) {
234 if (!g_strcmp0(tmp, gdk_mouse_buttons[i].identifier)) {
235 shortcut_mouse_button = gdk_mouse_buttons[i].button;
242 for (
unsigned int i = 0; i <
LENGTH(event_types); i++) {
243 if (!g_strcmp0(tmp, event_types[i].identifier)) {
244 event_type = event_types[i].event;
251 if (found ==
false) {
261 }
else if (tmp_length == 1) {
262 shortcut_key = tmp[0];
265 shortcut_buffer_command = g_strdup(tmp);
269 bool mouse_mode =
false;
270 if (unmap ==
false) {
271 if (++current_command < number_of_arguments) {
273 tmp_length = strlen(tmp);
275 if (tmp_length >= 3 && tmp[0] ==
'[' && tmp[tmp_length - 1] ==
']') {
277 if (mouse_event ==
false) {
282 char* tmp_inner = g_strndup(tmp + 1, tmp_length - 2);
285 for (
unsigned int i = 0; i <
LENGTH(mouse_events); i++) {
286 if (!g_strcmp0(tmp_inner, mouse_events[i].identifier)) {
287 event_type = mouse_events[i].event;
293 if (found ==
false) {
294 girara_warning(
"Invalid mouse event mode has been passed: %s", tmp_inner);
307 if (unmap ==
false) {
308 limit = (mouse_mode ==
true) ? 3 : 2;
309 if (number_of_arguments < limit) {
310 girara_warning(
"Invalid number of arguments passed: %zu instead of at least %u", number_of_arguments, limit);
312 _(
"Invalid number of arguments passed: %zu instead of at least %u"), number_of_arguments, limit);
316 if (mouse_mode ==
true) {
322 if (unmap ==
false) {
323 bool found_mapping =
false;
324 GIRARA_LIST_FOREACH(session->config.shortcut_mappings, girara_shortcut_mapping_t*, iter, mapping)
325 if (!g_strcmp0(tmp, mapping->identifier)) {
326 shortcut_function = mapping->function;
327 found_mapping =
true;
332 if (found_mapping ==
false) {
335 if (shortcut_buffer_command) {
336 g_free(shortcut_buffer_command);
343 if (unmap ==
false) {
344 if (++current_command < number_of_arguments) {
347 GIRARA_LIST_FOREACH(session->config.argument_mappings, girara_argument_mapping_t*, iter, mapping)
348 if (!g_strcmp0(tmp, mapping->identifier)) {
349 shortcut_argument_n = mapping->value;
355 if (shortcut_argument_n == 0) {
356 shortcut_argument_data = tmp;
359 }
else if (++current_command < number_of_arguments) {
361 shortcut_argument_data = tmp;
366 if (mouse_event ==
false) {
369 shortcut_buffer_command, shortcut_mode);
372 shortcut_function, shortcut_mode, shortcut_argument_n, shortcut_argument_data);
380 shortcut_function, shortcut_mode, event_type, shortcut_argument_n, shortcut_argument_data);
384 if (shortcut_buffer_command) {
385 g_free(shortcut_buffer_command);
420 if (number_of_arguments == 0) {
425 if (number_of_arguments > 2) {
438 if (setting == NULL) {
444 if (number_of_arguments == 1) {
493 if (g_strcmp0(value,
"false") == 0 || g_strcmp0(value,
"0") == 0) {
496 }
else if (g_strcmp0(value,
"true") == 0 || g_strcmp0(value,
"1") == 0) {
506 float f = g_ascii_strtod(value, NULL);
538 if (g_strcmp0(commands_it->command, command) == 0) {
539 g_free(commands_it->abbr);
540 g_free(commands_it->description);
542 commands_it->abbr = abbreviation ? g_strdup(abbreviation) : NULL;
543 commands_it->function =
function;
544 commands_it->completion = completion;
545 commands_it->description = description ? g_strdup(description) : NULL;
553 girara_command_t* new_command = g_slice_new(girara_command_t);
555 new_command->command = g_strdup(command);
556 new_command->abbr = abbreviation ? g_strdup(abbreviation) : NULL;
557 new_command->function =
function;
558 new_command->completion = completion;
559 new_command->description = description ? g_strdup(description) : NULL;
571 girara_argument_t argument = {argument_n, argument_data};
574 GIRARA_LIST_FOREACH(session->bindings.special_commands, girara_special_command_t*, iter, scommand_it)
575 if (scommand_it->identifier == identifier) {
576 scommand_it->function =
function;
577 scommand_it->always = always;
578 scommand_it->argument = argument;
585 girara_special_command_t* special_command = g_slice_new(girara_special_command_t);
587 special_command->identifier = identifier;
588 special_command->function =
function;
589 special_command->always = always;
590 special_command->argument = argument;
600 if (special_command == NULL) {
603 g_slice_free(girara_special_command_t, special_command);
609 if (command == NULL) {
613 g_free(command->command);
614 g_free(command->abbr);
615 g_free(command->description);
616 g_slice_free(girara_command_t, command);
622 if (session == NULL || argument_list == NULL) {
bool girara_shortcut_add(girara_session_t *session, guint modifier, guint key, const char *buffer, girara_shortcut_function_t function, girara_mode_t mode, int argument_n, void *argument_data)
void girara_special_command_free(girara_special_command_t *special_command)
void girara_setting_set_value(girara_session_t *session, girara_setting_t *setting, void *value)
void * girara_list_nth(girara_list_t *list, size_t n)
girara_setting_t * girara_setting_find(girara_session_t *session, const char *name)
void girara_list_append(girara_list_t *list, void *data)
girara_session_t * session
size_t girara_list_size(girara_list_t *list)
bool girara_setting_get_value(girara_setting_t *setting, void *dest)
bool girara_cmd_exec(girara_session_t *session, girara_list_t *argument_list)
HIDDEN bool girara_cmd_quit(girara_session_t *session, girara_list_t *argument_list)
girara_isc_completion(session,&arg, NULL, 0)
bool girara_cmd_map_unmap(girara_session_t *session, girara_list_t *argument_list, bool unmap)
bool girara_cmd_set(girara_session_t *session, girara_list_t *argument_list)
bool girara_special_command_add(girara_session_t *session, char identifier, girara_inputbar_special_function_t function, bool always, int argument_n, void *argument_data)
bool girara_mouse_event_add(girara_session_t *session, guint mask, guint button, girara_shortcut_function_t function, girara_mode_t mode, girara_event_type_t event_type, int argument_n, void *argument_data)
bool(* girara_shortcut_function_t)(girara_session_t *, girara_argument_t *, girara_event_t *, unsigned int)
bool girara_inputbar_command_add(girara_session_t *session, const char *command, const char *abbreviation, girara_command_function_t function, girara_completion_function_t completion, const char *description)
girara_completion_group_t *group value
void girara_list_iterator_free(girara_list_iterator_t *iter)
GIRARA_LIST_FOREACH_END(session->bindings.mouse_events, girara_mouse_event_t *, iter, mouse_event)
#define girara_warning(...)
bool girara_mouse_event_remove(girara_session_t *session, guint mask, guint button, girara_mode_t mode)
girara_setting_type_t girara_setting_get_type(girara_setting_t *setting)
g_return_val_if_fail(button!=NULL, false)
bool(* girara_command_function_t)(girara_session_t *session, girara_list_t *argument_list)
void girara_notify(girara_session_t *session, int level, const char *format,...)
void girara_command_free(girara_command_t *command)
bool girara_cmd_unmap(girara_session_t *session, girara_list_t *argument_list)
bool girara_exec_with_argument_list(girara_session_t *session, girara_list_t *argument_list)
bool girara_shortcut_remove(girara_session_t *session, guint modifier, guint key, const char *buffer, girara_mode_t mode)
bool girara_cmd_map(girara_session_t *session, girara_list_t *argument_list)
#define GIRARA_LIST_FOREACH(list, type, iter, data)
girara_completion_t *(* girara_completion_function_t)(girara_session_t *session, const char *input)
bool(* girara_inputbar_special_function_t)(girara_session_t *session, const char *input, girara_argument_t *argument)