5 #include <glib/gi18n-lib.h>
20 typedef struct gdk_keyboard_button_s
24 } gdk_keyboard_button_t;
26 static const gdk_keyboard_button_t gdk_keyboard_buttons[] = {
27 {
"BackSpace", GDK_KEY_BackSpace},
28 {
"CapsLock", GDK_KEY_Caps_Lock},
29 {
"Down", GDK_KEY_Down},
30 {
"Esc", GDK_KEY_Escape},
43 {
"Left", GDK_KEY_Left},
44 {
"PageDown", GDK_KEY_Page_Down},
45 {
"PageUp", GDK_KEY_Page_Up},
46 {
"Home", GDK_KEY_Home},
48 {
"Return", GDK_KEY_Return},
49 {
"Right", GDK_KEY_Right},
50 {
"Space", GDK_KEY_space},
51 {
"Super", GDK_KEY_Super_L},
53 {
"ShiftTab", GDK_KEY_ISO_Left_Tab},
55 {
"Print", GDK_KEY_Print}
58 typedef struct gdk_mouse_button_s
64 static const gdk_mouse_button_t gdk_mouse_buttons[] = {
76 typedef struct event_type_s
82 static const event_type_t event_types[] = {
90 typedef struct mouse_event_s
96 static const mouse_event_t mouse_events[] = {
105 unsigned int limit = (unmap ==
true) ? 1 : 2;
106 if (number_of_arguments < limit) {
107 girara_warning(
"Invalid number of arguments passed: %zu instead of at least %u", number_of_arguments, limit);
109 _(
"Invalid number of arguments passed: %zu instead of at least %u"), number_of_arguments, limit);
113 int shortcut_mask = 0;
114 int shortcut_key = 0;
115 int shortcut_mouse_button = 0;
117 char* shortcut_argument_data = NULL;
118 int shortcut_argument_n = 0;
119 char* shortcut_buffer_command = NULL;
122 bool mouse_event =
false;
124 size_t current_command = 0;
126 size_t tmp_length = strlen(tmp);
129 bool is_mode =
false;
130 if (tmp_length >= 3 && tmp[0] ==
'[' && tmp[tmp_length - 1] ==
']') {
131 char* tmp_inner = g_strndup(tmp + 1, tmp_length - 2);
134 if (!g_strcmp0(tmp_inner, mode->name)) {
135 shortcut_mode = mode->index;
141 if (is_mode ==
false) {
150 if (is_mode ==
true) {
152 tmp_length = strlen(tmp);
156 if (tmp_length >= 3 && tmp[0] ==
'<' && tmp[tmp_length - 1] ==
'>') {
157 tmp = g_strndup(tmp + 1, tmp_length - 2);
158 tmp_length = strlen(tmp);
161 if (strchr(tmp,
'-') != NULL && tmp[1] ==
'-' && tmp_length > 2) {
164 shortcut_mask = GDK_SHIFT_MASK;
168 shortcut_mask = GDK_MOD1_MASK;
171 shortcut_mask = GDK_CONTROL_MASK;
181 if (tmp_length == 3) {
182 shortcut_key = tmp[2];
186 for (
unsigned int i = 0; i <
LENGTH(gdk_keyboard_buttons); i++) {
187 if (g_strcmp0(tmp + 2, gdk_keyboard_buttons[i].identifier) == 0) {
188 shortcut_key = gdk_keyboard_buttons[i].keyval;
194 for (
unsigned int i = 0; i <
LENGTH(gdk_mouse_buttons); i++) {
195 if (!g_strcmp0(tmp + 2, gdk_mouse_buttons[i].identifier)) {
196 shortcut_mouse_button = gdk_mouse_buttons[i].button;
203 for (
unsigned int i = 0; i <
LENGTH(event_types); i++) {
204 if (!g_strcmp0(tmp + 2, event_types[i].identifier)) {
205 event_type = event_types[i].event;
212 if (found ==
false) {
222 for (
unsigned int i = 0; i <
LENGTH(gdk_keyboard_buttons); i++) {
223 if (g_strcmp0(tmp, gdk_keyboard_buttons[i].identifier) == 0) {
224 shortcut_key = gdk_keyboard_buttons[i].keyval;
230 for (
unsigned int i = 0; i <
LENGTH(gdk_mouse_buttons); i++) {
231 if (!g_strcmp0(tmp, gdk_mouse_buttons[i].identifier)) {
232 shortcut_mouse_button = gdk_mouse_buttons[i].button;
239 for (
unsigned int i = 0; i <
LENGTH(event_types); i++) {
240 if (!g_strcmp0(tmp, event_types[i].identifier)) {
241 event_type = event_types[i].event;
248 if (found ==
false) {
258 }
else if (tmp_length == 1) {
259 shortcut_key = tmp[0];
262 shortcut_buffer_command = g_strdup(tmp);
266 bool mouse_mode =
false;
267 if (unmap ==
false) {
268 if (++current_command < number_of_arguments) {
270 tmp_length = strlen(tmp);
272 if (tmp_length >= 3 && tmp[0] ==
'[' && tmp[tmp_length - 1] ==
']') {
274 if (mouse_event ==
false) {
279 char* tmp_inner = g_strndup(tmp + 1, tmp_length - 2);
282 for (
unsigned int i = 0; i <
LENGTH(mouse_events); i++) {
283 if (!g_strcmp0(tmp_inner, mouse_events[i].identifier)) {
284 event_type = mouse_events[i].event;
290 if (found ==
false) {
291 girara_warning(
"Invalid mouse event mode has been passed: %s", tmp_inner);
304 if (unmap ==
false) {
305 limit = (mouse_mode ==
true) ? 3 : 2;
306 if (number_of_arguments < limit) {
307 girara_warning(
"Invalid number of arguments passed: %zu instead of at least %u", number_of_arguments, limit);
309 _(
"Invalid number of arguments passed: %zu instead of at least %u"), number_of_arguments, limit);
313 if (mouse_mode ==
true) {
319 if (unmap ==
false) {
320 bool found_mapping =
false;
321 GIRARA_LIST_FOREACH(session->config.shortcut_mappings, girara_shortcut_mapping_t*, iter, mapping)
322 if (!g_strcmp0(tmp, mapping->identifier)) {
323 shortcut_function = mapping->function;
324 found_mapping =
true;
329 if (found_mapping ==
false) {
332 if (shortcut_buffer_command) {
333 g_free(shortcut_buffer_command);
340 if (unmap ==
false) {
341 if (++current_command < number_of_arguments) {
344 GIRARA_LIST_FOREACH(session->config.argument_mappings, girara_argument_mapping_t*, iter, mapping)
345 if (!g_strcmp0(tmp, mapping->identifier)) {
346 shortcut_argument_n = mapping->value;
352 if (shortcut_argument_n == 0) {
353 shortcut_argument_data = tmp;
356 }
else if (++current_command < number_of_arguments) {
358 shortcut_argument_data = tmp;
363 if (mouse_event ==
false) {
366 shortcut_buffer_command, shortcut_mode);
369 shortcut_function, shortcut_mode, shortcut_argument_n, shortcut_argument_data);
377 shortcut_function, shortcut_mode, event_type, shortcut_argument_n, shortcut_argument_data);
381 if (shortcut_buffer_command) {
382 g_free(shortcut_buffer_command);
417 if (number_of_arguments == 0) {
422 if (number_of_arguments > 2) {
435 if (setting == NULL) {
441 if (number_of_arguments == 1) {
490 if (g_strcmp0(value,
"false") == 0 || g_strcmp0(value,
"0") == 0) {
493 }
else if (g_strcmp0(value,
"true") == 0 || g_strcmp0(value,
"1") == 0) {
503 float f = g_ascii_strtod(value, NULL);
529 g_return_val_if_fail(session != NULL,
false);
530 g_return_val_if_fail(command != NULL,
false);
531 g_return_val_if_fail(
function != NULL,
false);
535 if (g_strcmp0(commands_it->command, command) == 0) {
536 g_free(commands_it->abbr);
537 g_free(commands_it->description);
539 commands_it->abbr = abbreviation ? g_strdup(abbreviation) : NULL;
540 commands_it->function =
function;
541 commands_it->completion = completion;
542 commands_it->description = description ? g_strdup(description) : NULL;
550 girara_command_t* new_command = g_slice_new(girara_command_t);
552 new_command->command = g_strdup(command);
553 new_command->abbr = abbreviation ? g_strdup(abbreviation) : NULL;
554 new_command->function =
function;
555 new_command->completion = completion;
556 new_command->description = description ? g_strdup(description) : NULL;
565 g_return_val_if_fail(session != NULL,
false);
566 g_return_val_if_fail(
function != NULL,
false);
568 girara_argument_t argument = {argument_n, argument_data};
571 GIRARA_LIST_FOREACH(session->bindings.special_commands, girara_special_command_t*, iter, scommand_it)
572 if (scommand_it->identifier == identifier) {
573 scommand_it->function =
function;
574 scommand_it->always = always;
575 scommand_it->argument = argument;
582 girara_special_command_t* special_command = g_slice_new(girara_special_command_t);
584 special_command->identifier = identifier;
585 special_command->function =
function;
586 special_command->always = always;
587 special_command->argument = argument;
597 if (special_command == NULL) {
600 g_slice_free(girara_special_command_t, special_command);
606 if (command == NULL) {
610 g_free(command->command);
611 g_free(command->abbr);
612 g_free(command->description);
613 g_slice_free(girara_command_t, command);
619 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)
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)
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_isc_completion(girara_session_t *session, girara_argument_t *argument, girara_event_t *UNUSED(event), unsigned int UNUSED(t))
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)
void girara_list_iterator_free(girara_list_iterator_t *iter)
bool girara_cmd_quit(girara_session_t *session, girara_list_t *UNUSED(argument_list))
#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)
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_END(list, type, iter, data)
#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)