girara-0.1.9/0000755000175000001440000000000012242417112011632 5ustar mockusersgirara-0.1.9/internal.h0000644000175000001440000001404312242417112013621 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_INTERNAL_H #define GIRARA_INTERNAL_H #include #include #include "types.h" #include "macros.h" #define FORMAT_COMMAND "%s" #define FORMAT_DESCRIPTION "%s" #define UNUSED(x) GIRARA_UNUSED(x) #define HIDDEN GIRARA_HIDDEN #define LENGTH(x) (sizeof(x)/sizeof((x)[0])) /** * Free girara_setting_t struct * * @param setting The setting to free. */ HIDDEN void girara_setting_free(girara_setting_t* setting); HIDDEN void girara_config_handle_free(girara_config_handle_t* handle); HIDDEN void girara_shortcut_mapping_free(girara_shortcut_mapping_t* mapping); HIDDEN void girara_shortcut_free(girara_shortcut_t* shortcut); HIDDEN void girara_inputbar_shortcut_free(girara_inputbar_shortcut_t* shortcut); HIDDEN void girara_mode_string_free(girara_mode_string_t* mode); HIDDEN void girara_statusbar_item_free(girara_statusbar_item_t* statusbaritem); HIDDEN void girara_argument_mapping_free( girara_argument_mapping_t* argument_mapping); HIDDEN void girara_special_command_free( girara_special_command_t* special_command); HIDDEN void girara_command_free(girara_command_t* command); HIDDEN void girara_mouse_event_free(girara_mouse_event_t* mouse_event); HIDDEN void girara_config_load_default(girara_session_t* session); HIDDEN void update_state_by_keyval(int *state, int keyval); /** * Default complection function for the settings * * @param session The used girara session * @param input The current input */ HIDDEN girara_completion_t* girara_cc_set(girara_session_t* session, const char* input); /** * Default command to map sortcuts * * @param session The used girara session * @param argument_list List of passed arguments * @return TRUE No error occured * @return FALSE An error occured */ HIDDEN bool girara_cmd_map(girara_session_t* session, girara_list_t* argument_list); /** * Default command to unmap sortcuts * * @param session The used girara session * @param argument_list List of passed arguments * @return TRUE No error occured * @return FALSE An error occured */ HIDDEN bool girara_cmd_unmap(girara_session_t* session, girara_list_t* argument_list); /** * Default command to quit the application * * @param session The used girara session * @param argument_list List of passed arguments * @return TRUE No error occured * @return FALSE An error occured */ HIDDEN bool girara_cmd_quit(girara_session_t* session, girara_list_t* argument_list); /** * Default command to set the value of settings * * @param session The used girara session * @param argument_list List of passed arguments * @return TRUE No error occured * @return FALSE An error occured */ HIDDEN bool girara_cmd_set(girara_session_t* session, girara_list_t* argument_list); /** * Execute an external command * * @param session The used girara session * @param argument_list List of passed arguments * @return TRUE No error occured * @return FALSE An error occured */ HIDDEN bool girara_cmd_exec(girara_session_t* session, girara_list_t* argument_list); /** * Process argument as a sequence of keys that were typed by the user * * @param session The session * @param argument The argument * @param event Event type * @param t Number of times * @return true No error occured * @return false An error occured */ HIDDEN bool girara_sc_feedkeys(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t); /** * Structure of a command */ struct girara_command_s { char* command; /**< Name of the command */ char* abbr; /**< Abbreviation of the command */ girara_command_function_t function; /**< Function */ girara_completion_function_t completion; /**< Completion function */ char* description; /**< Description of the command */ }; struct girara_mode_string_s { girara_mode_t index; /**< Index */ char* name; /**< Name of the mode object */ }; /** * Shortcut mapping */ struct girara_shortcut_mapping_s { char* identifier; /**> Identifier string */ girara_shortcut_function_t function; /** Shortcut function */ }; /** * Argument mapping */ struct girara_argument_mapping_s { char* identifier; /**> Identifier string */ int value; /**> Value */ }; /** * Structure of a shortcut */ struct girara_shortcut_s { guint mask; /**< Mask */ guint key; /**< Key */ const char* buffered_command; /**< Buffer command */ girara_shortcut_function_t function; /**< The correspondending function */ girara_mode_t mode; /**< Mode identifier */ girara_argument_t argument; /**< Given argument */ }; /** * Structure of a inputbar shortcut */ struct girara_inputbar_shortcut_s { guint mask; /**< Mask */ guint key; /**< Key */ girara_shortcut_function_t function; /**< Function */ girara_argument_t argument; /**< Given argument */ }; /** * Structure of a special command */ struct girara_special_command_s { char identifier; /**< Identifier */ girara_inputbar_special_function_t function; /**< Function */ bool always; /**< Evalute on every change of the input */ girara_argument_t argument; /**< Argument */ }; /** * Structure of a mouse event */ struct girara_mouse_event_s { guint mask; /**< Mask */ guint button; /**< Button */ girara_shortcut_function_t function; /**< Function */ girara_mode_t mode; /**< Allowed modes */ girara_event_type_t event_type; /**< Event type */ girara_argument_t argument; /**< Given argument */ }; /** * Config handle */ struct girara_config_handle_s { char* identifier; girara_command_function_t handle; }; /** * Structure of a statusbar item */ struct girara_statusbar_item_s { GtkWidget* box; /**< Event box */ GtkLabel *text; /**< Text label */ }; /** * Private data of the girara session */ struct girara_session_private_s { /** * List of all settings */ girara_list_t* settings; struct { #if GTK_MAJOR_VERSION == 3 GtkWidget *overlay; /**< So we can overlay bottom_box on top of view */ #endif GtkBox *bottom_box; /**< Box grouping input, status and notification */ } gtk; }; #endif girara-0.1.9/datastructures.c0000644000175000001440000002546512242417112015067 0ustar mockusers/* See LICENSE file for license and copyright information */ #include #include #include "datastructures.h" #include "utils.h" struct girara_tree_node_s { girara_free_function_t free; /**> The free function */ GNode* node; /* The node object */ }; typedef struct girara_tree_node_data_s { girara_tree_node_t* node; /**> The node */ void* data; /**> The data */ } girara_tree_node_data_t; struct girara_list_s { girara_free_function_t free; /**> The free function */ girara_compare_function_t cmp; /**> The sort function */ GList* start; /**> List start */ }; struct girara_list_iterator_s { girara_list_t* list; /**> The list */ GList* element; /**> The list object */ }; girara_list_t* girara_list_new(void) { girara_list_t* list = g_malloc0(sizeof(girara_list_t)); return list; } girara_list_t* girara_list_new2(girara_free_function_t gfree) { girara_list_t* list = girara_list_new(); if (list == NULL) { return NULL; } girara_list_set_free_function(list, gfree); return list; } girara_list_t* girara_sorted_list_new(girara_compare_function_t cmp) { girara_list_t* list = girara_list_new(); if (list == NULL) { return NULL; } list->cmp = cmp; return list; } girara_list_t* girara_sorted_list_new2(girara_compare_function_t cmp, girara_free_function_t gfree) { girara_list_t* list = girara_list_new2(gfree); if (list == NULL) { return NULL; } list->cmp = cmp; return list; } void girara_list_set_free_function(girara_list_t* list, girara_free_function_t gfree) { g_return_if_fail(list); list->free = gfree; } void girara_list_clear(girara_list_t* list) { if (list == NULL || list->start == NULL) { return; } if (list->free) { #if (GLIB_MAJOR_VERSION >= 2) && (GLIB_MINOR_VERSION >= 28) g_list_free_full(list->start, list->free); #else g_list_foreach(list->start, (GFunc)list->free, NULL); g_list_free(list->start); #endif } else { g_list_free(list->start); } list->start = NULL; } void girara_list_free(girara_list_t* list) { if (list == NULL) { return; } girara_list_clear(list); g_free(list); } void girara_list_append(girara_list_t* list, void* data) { g_return_if_fail(list != NULL); if (list->cmp != NULL) { list->start = g_list_insert_sorted(list->start, data, list->cmp); } else { list->start = g_list_append(list->start, data); } } void girara_list_prepend(girara_list_t* list, void* data) { g_return_if_fail(list != NULL); if (list->cmp != NULL) { girara_list_append(list, data); } else { list->start = g_list_prepend(list->start, data); } } void girara_list_remove(girara_list_t* list, void* data) { g_return_if_fail(list != NULL); if (list->start == NULL) { return; } GList* tmp = g_list_find(list->start, data); if (tmp == NULL) { return; } if (list->free != NULL) { (list->free)(tmp->data); } list->start = g_list_delete_link(list->start, tmp); } void* girara_list_nth(girara_list_t* list, size_t n) { g_return_val_if_fail(list, NULL); g_return_val_if_fail(!list->start || (n < g_list_length(list->start)), NULL); GList* tmp = g_list_nth(list->start, n); g_return_val_if_fail(tmp, NULL); return tmp->data; } bool girara_list_contains(girara_list_t* list, void* data) { g_return_val_if_fail(list, false); if (!list->start) { return false; } GList* tmp = g_list_find(list->start, data); if (!tmp) { return false; } return true; } void* girara_list_find(girara_list_t* list, girara_compare_function_t compare, const void* data) { g_return_val_if_fail(list && compare, NULL); if (list->start == NULL) { return NULL; } GList* element = g_list_find_custom(list->start, data, compare); if (element == NULL) { return NULL; } return element->data; } girara_list_iterator_t* girara_list_iterator(girara_list_t* list) { g_return_val_if_fail(list, NULL); if (!list->start) { return NULL; } girara_list_iterator_t* iter = g_malloc0(sizeof(girara_list_iterator_t)); iter->list = list; iter->element = list->start; return iter; } girara_list_iterator_t* girara_list_iterator_copy(girara_list_iterator_t* iter) { g_return_val_if_fail(iter, NULL); girara_list_iterator_t* iter2 = g_malloc0(sizeof(girara_list_iterator_t)); iter2->list = iter->list; iter2->element = iter->element; return iter2; } girara_list_iterator_t* girara_list_iterator_next(girara_list_iterator_t* iter) { if (!iter || !iter->element) { return NULL; } iter->element = g_list_next(iter->element); if (!iter->element) { return NULL; } return iter; } bool girara_list_iterator_has_next(girara_list_iterator_t* iter) { return iter && iter->element && g_list_next(iter->element); } girara_list_iterator_t* girara_list_iterator_previous(girara_list_iterator_t* iter) { if (!iter || !iter->element) { return NULL; } iter->element = g_list_previous(iter->element); if (!iter->element) { return NULL; } return iter; } bool girara_list_iterator_has_previous(girara_list_iterator_t* iter) { return iter && iter->element && g_list_previous(iter->element); } void girara_list_iterator_remove(girara_list_iterator_t* iter) { if (iter && iter->element) { GList *el = iter->element; if (iter->list && iter->list->free) { (iter->list->free)(iter->element->data); } iter->element = el->next; iter->list->start = g_list_delete_link(iter->list->start, el); } } bool girara_list_iterator_is_valid(girara_list_iterator_t* iter) { return iter && iter->element; } void* girara_list_iterator_data(girara_list_iterator_t* iter) { g_return_val_if_fail(iter && iter->element, NULL); return iter->element->data; } void girara_list_iterator_set(girara_list_iterator_t* iter, void *data) { g_return_if_fail(iter && iter->element && iter->list && !iter->list->cmp); if (iter->list->free) { (*iter->list->free)(iter->element->data); } iter->element->data = data; } void girara_list_iterator_free(girara_list_iterator_t* iter) { if (!iter) { return; } g_free(iter); } size_t girara_list_size(girara_list_t* list) { g_return_val_if_fail(list, 0); if (!list->start) { return 0; } return g_list_length(list->start); } ssize_t girara_list_position(girara_list_t* list, void* data) { g_return_val_if_fail(list != NULL, -1); if (list->start == NULL) { return -1; } size_t pos = 0; GIRARA_LIST_FOREACH(list, void*, iter, tmp) if (tmp == data) { girara_list_iterator_free(iter); return pos; } ++pos; GIRARA_LIST_FOREACH_END(list, void*, iter, tmp); return -1; } void girara_list_sort(girara_list_t* list, girara_compare_function_t compare) { g_return_if_fail(list != NULL); if (list->start == NULL || compare == NULL) { return; } list->start = g_list_sort(list->start, compare); } void girara_list_foreach(girara_list_t* list, girara_list_callback_t callback, void* data) { g_return_if_fail(list && list->start && callback); g_list_foreach(list->start, callback, data); } girara_list_t* girara_list_merge(girara_list_t* list, girara_list_t* other) { if (list == NULL) { return other; } if (other == NULL) { return list; } if (list->free != other->free) { girara_warning("girara_list_merge: merging lists with different free functions!"); } other->free = NULL; GIRARA_LIST_FOREACH(other, void*, iter, data) girara_list_append(list, data); GIRARA_LIST_FOREACH_END(other, void*, iter, data); return list; } girara_tree_node_t* girara_node_new(void* data) { girara_tree_node_t* node = g_malloc0(sizeof(girara_tree_node_t)); girara_tree_node_data_t* nodedata = g_malloc0(sizeof(girara_tree_node_data_t)); nodedata->data = data; nodedata->node = node; node->node = g_node_new(nodedata); if (!node->node) { g_free(node); g_free(nodedata); return NULL; } return node; } void girara_node_set_free_function(girara_tree_node_t* node, girara_free_function_t gfree) { g_return_if_fail(node); node->free = gfree; } void girara_node_free(girara_tree_node_t* node) { if (!node) { return; } g_return_if_fail(node->node); girara_tree_node_data_t* nodedata = (girara_tree_node_data_t*) node->node->data; g_return_if_fail(nodedata); if (node->free) { (*node->free)(nodedata->data); } g_free(nodedata); GNode* childnode = node->node->children; while (childnode) { girara_tree_node_data_t* nodedata = (girara_tree_node_data_t*) childnode->data; girara_node_free(nodedata->node); childnode = childnode->next; } g_node_destroy(node->node); g_free(node); } void girara_node_append(girara_tree_node_t* parent, girara_tree_node_t* child) { g_return_if_fail(parent && child); g_node_append(parent->node, child->node); } girara_tree_node_t* girara_node_append_data(girara_tree_node_t* parent, void* data) { g_return_val_if_fail(parent, NULL); girara_tree_node_t* child = girara_node_new(data); g_return_val_if_fail(child, NULL); child->free = parent->free; girara_node_append(parent, child); return child; } girara_tree_node_t* girara_node_get_parent(girara_tree_node_t* node) { g_return_val_if_fail(node && node->node, NULL); if (!node->node->parent) { return NULL; } girara_tree_node_data_t* nodedata = (girara_tree_node_data_t*) node->node->parent->data; g_return_val_if_fail(nodedata, NULL); return nodedata->node; } girara_tree_node_t* girara_node_get_root(girara_tree_node_t* node) { g_return_val_if_fail(node && node->node, NULL); if (!node->node->parent) { return node; } GNode* root = g_node_get_root(node->node); g_return_val_if_fail(root, NULL); girara_tree_node_data_t* nodedata = (girara_tree_node_data_t*) root->data; g_return_val_if_fail(nodedata, NULL); return nodedata->node; } girara_list_t* girara_node_get_children(girara_tree_node_t* node) { g_return_val_if_fail(node, NULL); girara_list_t* list = girara_list_new(); g_return_val_if_fail(list, NULL); GNode* childnode = node->node->children; while (childnode) { girara_tree_node_data_t* nodedata = (girara_tree_node_data_t*) childnode->data; girara_list_append(list, nodedata->node); childnode = childnode->next; } return list; } size_t girara_node_get_num_children(girara_tree_node_t* node) { g_return_val_if_fail(node && node->node, 0); return g_node_n_children(node->node); } void* girara_node_get_data(girara_tree_node_t* node) { g_return_val_if_fail(node && node->node, NULL); girara_tree_node_data_t* nodedata = (girara_tree_node_data_t*) node->node->data; g_return_val_if_fail(nodedata, NULL); return nodedata->data; } void girara_node_set_data(girara_tree_node_t* node, void* data) { g_return_if_fail(node && node->node); girara_tree_node_data_t* nodedata = (girara_tree_node_data_t*) node->node->data; g_return_if_fail(nodedata); if (node->free) { (*node->free)(nodedata->data); } nodedata->data = data; } girara-0.1.9/callbacks.h0000644000175000001440000000740012242417112013723 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_CALLBACKS_H #define GIRARA_CALLBACKS_H #include "types.h" #include /** * Callback definition for an inputbar key press event handler * * @param widget The widget * @param event Event * @param data Custom data * @return true if no error occured */ typedef bool (*girara_callback_inputbar_key_press_event_t)(GtkWidget* widget, GdkEventKey* event, void* data); /** * Callback definition for an inputbar key press event handler * * @param entry The inputbar * @param data Custom data * @return true if no error occured */ typedef bool (*girara_callback_inputbar_activate_t)(GtkEntry* entry, void* data); /** * Default callback for key press events in the view area * * @param widget The used widget * @param event The occured event * @param session The used girara session * @return TRUE No error occured * @return FALSE An error occured */ bool girara_callback_view_key_press_event(GtkWidget* widget, GdkEventKey* event, girara_session_t* session); /** * Default callback when a button (typically a mouse button) has been pressed * * @param widget The used widget * @param button The button that triggered the event * @param session The used girara session * @return true to stop other handlers from being invoked for the event. * @return false to propagate the event further. */ bool girara_callback_view_button_press_event(GtkWidget* widget, GdkEventButton* button, girara_session_t* session); /** * Default callback when a button (typically a mouse button) has been released * * @param widget The used widget * @param button The button that triggered the event * @param session The used girara session * @return true to stop other handlers from being invoked for the event. * @return false to propagate the event further. */ bool girara_callback_view_button_release_event(GtkWidget* widget, GdkEventButton* button, girara_session_t* session); /** * Default callback when the pointer moves over the widget * * @param widget The used widget * @param button The event motion that triggered the event * @param session The used girara session * @return true to stop other handlers from being invoked for the event. * @return false to propagate the event further. */ bool girara_callback_view_button_motion_notify_event(GtkWidget* widget, GdkEventMotion* button, girara_session_t* session); /** * Default callback then a scroll event is triggered by the view * * @param widget The widget * @param event The event motion * @param session The girara session * @return true to stop other handlers from being invoked for the event. * @return false to propagate the event further. */ bool girara_callback_view_scroll_event(GtkWidget* widget, GdkEventScroll* event, girara_session_t* session); /** * Default callback if the inputbar gets activated * * @param entry The inputbar entry * @param session The used girara session * @return TRUE No error occured * @return FALSE An error occured */ bool girara_callback_inputbar_activate(GtkEntry* entry, girara_session_t* session); /** * Default callback if an key in the input bar gets pressed * * @param widget The used widget * @param event The occured event * @param session The used girara session * @return TRUE No error occured * @return FALSE An error occured */ bool girara_callback_inputbar_key_press_event(GtkWidget* widget, GdkEventKey* event, girara_session_t* session); /** * Default callback if the text of the input bar has changed * * @param widget The used widget * @param session The used girara session * @return TRUE No error occured * @return FALSE An error occured */ bool girara_callback_inputbar_changed_event(GtkEditable* widget, girara_session_t* session); #endif girara-0.1.9/Doxyfile0000644000175000001440000000120612242417112013337 0ustar mockusers# See LICENSE file for license and copyright information # General information PROJECT_NAME = girara OUTPUT_DIRECTORY = ./doc/ OUTPUT_LANGUAGE = English TAB_SIZE = 2 EXTRACT_ALL = YES OPTIMIZE_OUTPUT_FOR_C = YES DOXYFILE_ENCODING = UTF-8 TYPEDEF_HIDES_STRUCT = YES # Warning and progress messages QUIET = YES WARNINGS = YES WARN_IF_UNDOCUMENTED = YES # Input files INPUT = EXCLUDE = ./tests FILE_PATTERNS = *.h *.c RECURSIVE = YES # Output files GENERATE_HTML = YES GENERATE_LATEX = NO GENERATE_RTF = NO GENERATE_XML = NO SOURCE_BROWSER = YES girara-0.1.9/settings.c0000644000175000001440000001347612242417112013651 0ustar mockusers/* See LICENSE file for license and copyright information */ #include #include #include #include "settings.h" #include "datastructures.h" #include "completion.h" #include "session.h" #include "internal.h" /** * Structure of a settings entry */ struct girara_setting_s { char* name; /**< Name of the setting */ union { bool b; /**< Boolean */ int i; /**< Integer */ float f; /**< Floating number */ char *s; /**< String */ } value; /**< Value of the setting */ girara_setting_type_t type; /**< Type identifier */ bool init_only; /**< Option can be set only before girara gets initialized */ char* description; /**< Description of this setting */ girara_setting_callback_t callback; /**< Callback that gets executed when the value of the setting changes */ void* data; /**< Arbitary data that can be used by callbacks */ }; void girara_setting_set_value(girara_session_t* session, girara_setting_t* setting, void* value) { g_return_if_fail(setting && (value || setting->type == STRING)); switch(setting->type) { case BOOLEAN: setting->value.b = *((bool *) value); break; case FLOAT: setting->value.f = *((float *) value); break; case INT: setting->value.i = *((int *) value); break; case STRING: if (setting->value.s != NULL) { g_free(setting->value.s); } setting->value.s = value ? g_strdup(value) : NULL; break; default: g_assert(false); } if (session && setting->callback != NULL) { setting->callback(session, setting->name, setting->type, value, setting->data); } } bool girara_setting_add(girara_session_t* session, const char* name, void* value, girara_setting_type_t type, bool init_only, const char* description, girara_setting_callback_t callback, void* data) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(name != NULL, false); g_return_val_if_fail(type != UNKNOWN, false); if (type != STRING && value == NULL) { return false; } /* search for existing setting */ if (girara_setting_find(session, name) != NULL) { return false; } /* add new setting */ girara_setting_t* setting = g_slice_new0(girara_setting_t); setting->name = g_strdup(name); setting->type = type; setting->init_only = init_only; setting->description = description ? g_strdup(description) : NULL; setting->callback = callback; setting->data = data; girara_setting_set_value(NULL, setting, value); girara_list_append(session->private_data->settings, setting); return true; } bool girara_setting_set(girara_session_t* session, const char* name, void* value) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(name != NULL, false); girara_setting_t* setting = girara_setting_find(session, name); if (setting == NULL) { return false; } girara_setting_set_value(session, setting, value); return true; } bool girara_setting_get_value(girara_setting_t* setting, void* dest) { g_return_val_if_fail(setting != NULL && dest != NULL, false); bool *bvalue = (bool*) dest; float *fvalue = (float*) dest; int *ivalue = (int*) dest; char **svalue = (char**) dest; switch(setting->type) { case BOOLEAN: *bvalue = setting->value.b; break; case FLOAT: *fvalue = setting->value.f; break; case INT: *ivalue = setting->value.i; break; case STRING: *svalue = setting->value.s ? g_strdup(setting->value.s) : NULL; break; default: g_assert(false); } return true; } bool girara_setting_get(girara_session_t* session, const char* name, void* dest) { g_return_val_if_fail(session != NULL && name != NULL && dest != NULL, false); girara_setting_t* setting = girara_setting_find(session, name); if (setting == NULL) { return false; } return girara_setting_get_value(setting, dest); } void girara_setting_free(girara_setting_t* setting) { if (!setting) { return; } g_free(setting->name); g_free(setting->description); if (setting->type == STRING) { g_free(setting->value.s); } g_slice_free(girara_setting_t, setting); } girara_setting_t* girara_setting_find(girara_session_t* session, const char* name) { g_return_val_if_fail(session != NULL, NULL); g_return_val_if_fail(name != NULL, NULL); girara_setting_t* result = NULL; GIRARA_LIST_FOREACH(session->private_data->settings, girara_setting_t*, iter, setting) if (g_strcmp0(setting->name, name) == 0) { result = setting; break; } GIRARA_LIST_FOREACH_END(session->private_data->settings, girara_setting_t*, iter, setting); return result; } const char* girara_setting_get_name(girara_setting_t* setting) { g_return_val_if_fail(setting, NULL); return setting->name; } girara_setting_type_t girara_setting_get_type(girara_setting_t* setting) { g_return_val_if_fail(setting, UNKNOWN); return setting->type; } girara_completion_t* girara_cc_set(girara_session_t* session, const char* input) { if (input == NULL) { return NULL; } girara_completion_t* completion = girara_completion_init(); if (completion == NULL) { return NULL; } girara_completion_group_t* group = girara_completion_group_create(session, NULL); if (group == NULL) { girara_completion_free(completion); return NULL; } girara_completion_add_group(completion, group); unsigned int input_length = strlen(input); GIRARA_LIST_FOREACH(session->private_data->settings, girara_setting_t*, iter, setting) if ((setting->init_only == false) && (input_length <= strlen(setting->name)) && !strncmp(input, setting->name, input_length)) { girara_completion_group_add_element(group, setting->name, setting->description); } GIRARA_LIST_FOREACH_END(session->private_data->settings, girara_setting_t*, iter, setting); return completion; } girara-0.1.9/shortcuts.c0000644000175000001440000005640612242417112014047 0ustar mockusers/* See LICENSE file for license and copyright information */ #include "shortcuts.h" #include "datastructures.h" #include "internal.h" #include "session.h" #include "settings.h" #include "tabs.h" #include "input-history.h" #include #include static void girara_toggle_widget_visibility(GtkWidget* widget); static bool simulate_key_press(girara_session_t* session, int state, int key); 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) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(buffer || key || modifier, false); g_return_val_if_fail(function != NULL, false); girara_argument_t argument = {argument_n, (argument_data != NULL) ? g_strdup(argument_data) : NULL}; /* search for existing binding */ bool found_existing_shortcut = false; GIRARA_LIST_FOREACH(session->bindings.shortcuts, girara_shortcut_t*, iter, shortcuts_it) if (((shortcuts_it->mask == modifier && shortcuts_it->key == key && (modifier != 0 || key != 0)) || (buffer && shortcuts_it->buffered_command && !strcmp(shortcuts_it->buffered_command, buffer))) && ((shortcuts_it->mode == mode) || (mode == 0))) { if (shortcuts_it->argument.data != NULL) { g_free(shortcuts_it->argument.data); } shortcuts_it->function = function; shortcuts_it->argument = argument; found_existing_shortcut = true; if (mode != 0) { girara_list_iterator_free(iter); return true; } } GIRARA_LIST_FOREACH_END(session->bindings.shortcuts, girara_shortcut_t*, iter, shortcuts_it); if (found_existing_shortcut == true) { return true; } /* add new shortcut */ girara_shortcut_t* shortcut = g_slice_new(girara_shortcut_t); shortcut->mask = modifier; shortcut->key = key; shortcut->buffered_command = buffer; shortcut->function = function; shortcut->mode = mode; shortcut->argument = argument; girara_list_append(session->bindings.shortcuts, shortcut); return true; } bool girara_shortcut_remove(girara_session_t* session, guint modifier, guint key, const char* buffer, girara_mode_t mode) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(buffer || key || modifier, false); /* search for existing binding */ GIRARA_LIST_FOREACH(session->bindings.shortcuts, girara_shortcut_t*, iter, shortcuts_it) if (((shortcuts_it->mask == modifier && shortcuts_it->key == key && (modifier != 0 || key != 0)) || (buffer && shortcuts_it->buffered_command && !strcmp(shortcuts_it->buffered_command, buffer))) && shortcuts_it->mode == mode) { girara_list_remove(session->bindings.shortcuts, shortcuts_it); girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->bindings.shortcuts, girara_shortcut_t*, iter, shortcuts_it); return false; } void girara_shortcut_free(girara_shortcut_t* shortcut) { g_return_if_fail(shortcut != NULL); g_free(shortcut->argument.data); g_slice_free(girara_shortcut_t, shortcut); } bool girara_inputbar_shortcut_add(girara_session_t* session, guint modifier, guint key, girara_shortcut_function_t function, int argument_n, void* argument_data) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(function != NULL, false); girara_argument_t argument = {argument_n, argument_data}; /* search for existing special command */ GIRARA_LIST_FOREACH(session->bindings.inputbar_shortcuts, girara_inputbar_shortcut_t*, iter, inp_sh_it) if (inp_sh_it->mask == modifier && inp_sh_it->key == key) { inp_sh_it->function = function; inp_sh_it->argument = argument; girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->bindings.inputbar_shortcuts, girara_inputbar_shortcut_t*, iter, inp_sh_it); /* create new inputbar shortcut */ girara_inputbar_shortcut_t* inputbar_shortcut = g_slice_new(girara_inputbar_shortcut_t); inputbar_shortcut->mask = modifier; inputbar_shortcut->key = key; inputbar_shortcut->function = function; inputbar_shortcut->argument = argument; girara_list_append(session->bindings.inputbar_shortcuts, inputbar_shortcut); return true; } bool girara_inputbar_shortcut_remove(girara_session_t* session, guint modifier, guint key) { g_return_val_if_fail(session != NULL, false); /* search for existing special command */ GIRARA_LIST_FOREACH(session->bindings.inputbar_shortcuts, girara_inputbar_shortcut_t*, iter, inp_sh_it) if (inp_sh_it->mask == modifier && inp_sh_it->key == key) { girara_list_remove(session->bindings.inputbar_shortcuts, inp_sh_it); girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->bindings.inputbar_shortcuts, girara_inputbar_shortcut_t*, iter, inp_sh_it); return true; } void girara_inputbar_shortcut_free(girara_inputbar_shortcut_t* inputbar_shortcut) { g_slice_free(girara_inputbar_shortcut_t, inputbar_shortcut); } bool girara_isc_abort(girara_session_t* session, girara_argument_t* UNUSED(argument), girara_event_t* UNUSED(event), unsigned int UNUSED(t)) { g_return_val_if_fail(session != NULL, false); /* hide completion */ girara_argument_t arg = { GIRARA_HIDE, NULL }; girara_isc_completion(session, &arg, NULL, 0); /* clear inputbar */ gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), 0, -1); /* grab view */ gtk_widget_grab_focus(GTK_WIDGET(session->gtk.view)); /* hide inputbar */ gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog)); if (session->global.autohide_inputbar == true) { gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar)); } /* Begin from the last command when navigating through history */ girara_input_history_reset(session->command_history); /* reset custom functions */ session->signals.inputbar_custom_activate = NULL; session->signals.inputbar_custom_key_press_event = NULL; gtk_entry_set_visibility(session->gtk.inputbar_entry, TRUE); return true; } bool girara_isc_string_manipulation(girara_session_t* session, girara_argument_t* argument, girara_event_t* UNUSED(event), unsigned int UNUSED(t)) { g_return_val_if_fail(session != NULL, false); gchar *separator = NULL; girara_setting_get(session, "word-separator", &separator); gchar *input = gtk_editable_get_chars(GTK_EDITABLE(session->gtk.inputbar_entry), 0, -1); int length = strlen(input); int pos = gtk_editable_get_position(GTK_EDITABLE(session->gtk.inputbar_entry)); int i; switch (argument->n) { case GIRARA_DELETE_LAST_WORD: if (pos == 1 && (input[0] == ':' || input[0] == '/')) { break; } if (pos == 0) { break; } i = pos - 1; /* remove trailing spaces */ for (; i >= 0 && input[i] == ' '; i--); /* find the beginning of the word */ while ((i == (pos - 1)) || ((i > 0) && !strchr(separator, input[i]))) { i--; } gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), i + 1, pos); gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), i + 1); break; case GIRARA_DELETE_LAST_CHAR: if (length != 1 && pos == 1 && (input[0] == ':' || input[0] == '/')) { break; } if (length == 1 && pos == 1) { girara_isc_abort(session, argument, NULL, 0); } gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), pos - 1, pos); break; case GIRARA_DELETE_TO_LINE_START: gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), 1, pos); break; case GIRARA_NEXT_CHAR: gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), pos + 1); break; case GIRARA_PREVIOUS_CHAR: gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), (pos == 1) ? 1 : pos - 1); break; case GIRARA_DELETE_CURR_CHAR: if (length != 1 && pos == 0 && (input[0] == ':' || input[0] == '/')){ break; } if(length == 1 && pos == 0) { girara_isc_abort(session, argument, NULL, 0); } gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), pos, pos + 1); break; case GIRARA_DELETE_TO_LINE_END: gtk_editable_delete_text(GTK_EDITABLE(session->gtk.inputbar_entry), pos, length); break; case GIRARA_GOTO_START: gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), 1); break; case GIRARA_GOTO_END: gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), -1); break; } g_free(separator); g_free(input); return false; } bool girara_isc_command_history(girara_session_t* session, girara_argument_t* argument, girara_event_t* UNUSED(event), unsigned int UNUSED(t)) { g_return_val_if_fail(session != NULL, false); char* temp = gtk_editable_get_chars(GTK_EDITABLE(session->gtk.inputbar_entry), 0, -1); const char* command = argument->n == GIRARA_NEXT ? girara_input_history_next(session->command_history, temp) : girara_input_history_previous(session->command_history, temp); g_free(temp); if (command != NULL) { gtk_entry_set_text(session->gtk.inputbar_entry, command); gtk_widget_grab_focus(GTK_WIDGET(session->gtk.inputbar_entry)); gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), -1); } return true; } /* default shortcut implementation */ bool girara_sc_focus_inputbar(girara_session_t* session, girara_argument_t* argument, girara_event_t* UNUSED(event), unsigned int UNUSED(t)) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(session->gtk.inputbar_entry != NULL, false); if (gtk_widget_get_visible(GTK_WIDGET(session->gtk.inputbar)) == false) { gtk_widget_show(GTK_WIDGET(session->gtk.inputbar)); } if (gtk_widget_get_visible(GTK_WIDGET(session->gtk.notification_area)) == true) { gtk_widget_hide(GTK_WIDGET(session->gtk.notification_area)); } gtk_widget_grab_focus(GTK_WIDGET(session->gtk.inputbar_entry)); if (argument != NULL && argument->data != NULL) { gtk_entry_set_text(session->gtk.inputbar_entry, (char*) argument->data); /* we save the X clipboard that will be clear by "grab_focus" */ gchar* x_clipboard_text = gtk_clipboard_wait_for_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY)); gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), -1); if (x_clipboard_text != NULL) { /* we reset the X clipboard with saved text */ gtk_clipboard_set_text(gtk_clipboard_get(GDK_SELECTION_PRIMARY), x_clipboard_text, -1); g_free(x_clipboard_text); } } return true; } bool girara_sc_abort(girara_session_t* session, girara_argument_t* UNUSED(argument), girara_event_t* UNUSED(event), unsigned int UNUSED(t)) { g_return_val_if_fail(session != NULL, false); girara_isc_abort(session, NULL, NULL, 0); gtk_widget_hide(GTK_WIDGET(session->gtk.notification_area)); if (session->global.autohide_inputbar == false) { gtk_widget_show(GTK_WIDGET(session->gtk.inputbar)); } return false; } bool girara_sc_quit(girara_session_t* session, girara_argument_t* UNUSED(argument), girara_event_t* UNUSED(event), unsigned int UNUSED(t)) { g_return_val_if_fail(session != NULL, false); girara_argument_t arg = { GIRARA_HIDE, NULL }; girara_isc_completion(session, &arg, NULL, 0); gtk_main_quit(); return false; } bool girara_sc_tab_close(girara_session_t* session, girara_argument_t* UNUSED(argument), girara_event_t* UNUSED(event), unsigned int UNUSED(t)) { g_return_val_if_fail(session != NULL, false); girara_tab_t* tab = girara_tab_current_get(session); if (tab != NULL) { girara_tab_remove(session, tab); } return false; } bool girara_sc_tab_navigate(girara_session_t* session, girara_argument_t* argument, girara_event_t* UNUSED(event), unsigned int t) { g_return_val_if_fail(session != NULL, false); unsigned int number_of_tabs = girara_get_number_of_tabs(session); if (number_of_tabs == 0) return false; unsigned int current_tab = girara_tab_position_get(session, girara_tab_current_get(session)); unsigned int step = (argument->n == GIRARA_PREVIOUS) ? -1 : 1; unsigned int new_tab = (current_tab + step) % number_of_tabs; if (t != 0 && t <= number_of_tabs) { new_tab = t - 1; } girara_tab_t* tab = girara_tab_get(session, new_tab); if (tab != NULL) { girara_tab_current_set(session, tab); } girara_tab_update(session); return false; } bool girara_sc_tab_navigate_next(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t) { argument->n = GIRARA_NEXT; return girara_sc_tab_navigate(session, argument, event, t); } bool girara_sc_tab_navigate_prev(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t) { argument->n = GIRARA_PREVIOUS; return girara_sc_tab_navigate(session, argument, event, t); } static void girara_toggle_widget_visibility(GtkWidget* widget) { if (widget == NULL) { return; } if (gtk_widget_get_visible(widget)) { gtk_widget_hide(widget); } else { gtk_widget_show(widget); } } bool girara_sc_toggle_inputbar(girara_session_t* session, girara_argument_t* UNUSED(argument), girara_event_t* UNUSED(event), unsigned int UNUSED(t)) { g_return_val_if_fail(session != NULL, false); girara_toggle_widget_visibility(GTK_WIDGET(session->gtk.inputbar)); return true; } bool girara_sc_toggle_statusbar(girara_session_t* session, girara_argument_t* UNUSED(argument), girara_event_t* UNUSED(event), unsigned int UNUSED(t)) { g_return_val_if_fail(session != NULL, false); girara_toggle_widget_visibility(GTK_WIDGET(session->gtk.statusbar)); return true; } bool girara_sc_toggle_tabbar(girara_session_t* session, girara_argument_t* UNUSED(argument), girara_event_t* UNUSED(event), unsigned int UNUSED(t)) { g_return_val_if_fail(session != NULL, false); girara_toggle_widget_visibility(GTK_WIDGET(session->gtk.tabbar)); return true; } bool girara_sc_set(girara_session_t* session, girara_argument_t* argument, girara_event_t* UNUSED(event), unsigned int UNUSED(t)) { g_return_val_if_fail(session != NULL, false); if (argument == NULL || argument->data == NULL) { return false; } /* create argument list */ girara_list_t* argument_list = girara_list_new(); if (argument_list == NULL) { return false; } gchar** argv = NULL; gint argc = 0; girara_list_set_free_function(argument_list, g_free); if (g_shell_parse_argv((const gchar*) argument->data, &argc, &argv, NULL) != FALSE) { for(int i = 0; i < argc; i++) { char* argument = g_strdup(argv[i]); girara_list_append(argument_list, (void*) argument); } } else { girara_list_free(argument_list); return false; } /* call set */ girara_cmd_set(session, argument_list); /* cleanup */ girara_list_free(argument_list); return false; } bool girara_sc_feedkeys(girara_session_t* session, girara_argument_t* argument, girara_event_t* UNUSED(event), unsigned int t) { if (session == NULL || argument == NULL) { return false; } typedef struct gdk_keyboard_button_s { char* identifier; int keyval; } gdk_keyboard_button_t; static const gdk_keyboard_button_t gdk_keyboard_buttons[] = { {"BackSpace", GDK_KEY_BackSpace}, {"CapsLock", GDK_KEY_Caps_Lock}, {"Down", GDK_KEY_Down}, {"Esc", GDK_KEY_Escape}, {"F10", GDK_KEY_F10}, {"F11", GDK_KEY_F11}, {"F12", GDK_KEY_F12}, {"F1", GDK_KEY_F1}, {"F2", GDK_KEY_F2}, {"F3", GDK_KEY_F3}, {"F4", GDK_KEY_F4}, {"F5", GDK_KEY_F5}, {"F6", GDK_KEY_F6}, {"F7", GDK_KEY_F7}, {"F8", GDK_KEY_F8}, {"F9", GDK_KEY_F9}, {"Left", GDK_KEY_Left}, {"PageDown", GDK_KEY_Page_Down}, {"PageUp", GDK_KEY_Page_Up}, {"Home", GDK_KEY_Home}, {"End", GDK_KEY_End}, {"Return", GDK_KEY_Return}, {"Right", GDK_KEY_Right}, {"Space", GDK_KEY_space}, {"Super", GDK_KEY_Super_L}, {"Tab", GDK_KEY_Tab}, {"ShiftTab", GDK_KEY_ISO_Left_Tab}, {"Up", GDK_KEY_Up} }; char* input = (char*) argument->data; unsigned int input_length = strlen(input); t = (t == 0) ? 1 : t; for (unsigned int c = 0; c < t; c++) { for (unsigned i = 0; i < input_length; i++) { int state = 0; int keyval = input[i]; /* possible special button */ if ((input_length - i) >= 3 && input[i] == '<') { char* end = strchr(input + i, '>'); if (end == NULL) { goto single_key; } int length = end - (input + i) - 1; char* tmp = g_strndup(input + i + 1, length); bool found = false; /* Multi key shortcut */ if (length > 2 && tmp[1] == '-') { switch (tmp[0]) { case 'S': state = GDK_SHIFT_MASK; break; case 'A': state = GDK_MOD1_MASK; break; case 'C': state = GDK_CONTROL_MASK; break; default: break; } if (length == 3) { keyval = tmp[2]; found = true; } else { for (unsigned int i = 0; i < LENGTH(gdk_keyboard_buttons); i++) { if (g_strcmp0(tmp + 2, gdk_keyboard_buttons[i].identifier) == 0) { keyval = gdk_keyboard_buttons[i].keyval; found = true; break; } } } /* Possible special key */ } else { for (unsigned int i = 0; i < LENGTH(gdk_keyboard_buttons); i++) { if (g_strcmp0(tmp, gdk_keyboard_buttons[i].identifier) == 0) { keyval = gdk_keyboard_buttons[i].keyval; found = true; break; } } } g_free(tmp); /* parsed special key */ if (found == true) { i += length + 1; } } single_key: update_state_by_keyval(&state, keyval); simulate_key_press(session, state, keyval); } } return true; } bool girara_shortcut_mapping_add(girara_session_t* session, const char* identifier, girara_shortcut_function_t function) { g_return_val_if_fail(session != NULL, false); if (function == NULL || identifier == NULL) { return false; } GIRARA_LIST_FOREACH(session->config.shortcut_mappings, girara_shortcut_mapping_t*, iter, data) if (strcmp(data->identifier, identifier) == 0) { data->function = function; girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->config.shortcut_mappings, girara_shortcut_mapping_t*, iter, data); /* add new config handle */ girara_shortcut_mapping_t* mapping = g_slice_new(girara_shortcut_mapping_t); mapping->identifier = g_strdup(identifier); mapping->function = function; girara_list_append(session->config.shortcut_mappings, mapping); return true; } void girara_shortcut_mapping_free(girara_shortcut_mapping_t* mapping) { if (mapping == NULL) { return; } g_free(mapping->identifier); g_slice_free(girara_shortcut_mapping_t, mapping); } bool girara_argument_mapping_add(girara_session_t* session, const char* identifier, int value) { g_return_val_if_fail(session != NULL, false); if (identifier == NULL) { return false; } GIRARA_LIST_FOREACH(session->config.argument_mappings, girara_argument_mapping_t*, iter, mapping); if (g_strcmp0(mapping->identifier, identifier) == 0) { mapping->value = value; girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->config.argument_mappings, girara_argument_mapping_t*, iter, mapping); /* add new config handle */ girara_argument_mapping_t* mapping = g_slice_new(girara_argument_mapping_t); mapping->identifier = g_strdup(identifier); mapping->value = value; girara_list_append(session->config.argument_mappings, mapping); return true; } void girara_argument_mapping_free(girara_argument_mapping_t* argument_mapping) { if (argument_mapping == NULL) { return; } g_free(argument_mapping->identifier); g_slice_free(girara_argument_mapping_t, argument_mapping); } 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) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(function != NULL, false); girara_argument_t argument = {argument_n, argument_data}; /* search for existing binding */ GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, me_it) if (me_it->mask == mask && me_it->button == button && me_it->mode == mode && me_it->event_type == event_type) { me_it->function = function; me_it->argument = argument; girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->bindings.mouse_events, girara_mouse_event_t*, iter, me_it); /* add new mouse event */ girara_mouse_event_t* mouse_event = g_slice_new(girara_mouse_event_t); mouse_event->mask = mask; mouse_event->button = button; mouse_event->function = function; mouse_event->mode = mode; mouse_event->event_type = event_type; mouse_event->argument = argument; girara_list_append(session->bindings.mouse_events, mouse_event); return true; } bool girara_mouse_event_remove(girara_session_t* session, guint mask, guint button, girara_mode_t mode) { g_return_val_if_fail(session != NULL, false); /* search for existing binding */ GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, me_it) if (me_it->mask == mask && me_it->button == button && me_it->mode == mode) { girara_list_remove(session->bindings.mouse_events, me_it); girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->bindings.mouse_events, girara_mouse_event_t*, iter, me_it); return false; } void girara_mouse_event_free(girara_mouse_event_t* mouse_event) { if (mouse_event == NULL) { return; } g_slice_free(girara_mouse_event_t, mouse_event); } static bool simulate_key_press(girara_session_t* session, int state, int key) { if (session == NULL || session->gtk.box == NULL) { return false; } GdkEvent* event = gdk_event_new(GDK_KEY_PRESS); event->key.type = GDK_KEY_PRESS; event->key.window = gtk_widget_get_parent_window(GTK_WIDGET(session->gtk.box)); event->key.send_event = false; event->key.time = GDK_CURRENT_TIME; event->key.state = state; event->key.keyval = key; g_object_ref(event->key.window); GdkKeymapKey* keys; gint number_of_keys; if (gdk_keymap_get_entries_for_keyval(gdk_keymap_get_default(), event->key.keyval, &keys, &number_of_keys) == FALSE) { gdk_event_free(event); return false; } event->key.hardware_keycode = keys[0].keycode; event->key.group = keys[0].group; g_free(keys); gdk_event_put(event); gdk_event_free(event); gtk_main_iteration_do(FALSE); return true; } girara-0.1.9/version.h.in0000644000175000001440000000042312242417112014074 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_VERSION_H #define GIRARA_VERSION_H #define GIRARA_VERSION_MAJOR GVMAJOR #define GIRARA_VERSION_MINOR GVMINOR #define GIRARA_VERSION_REV GVREV #define GIRARA_VERSION "GVMAJOR.GVMINOR.GVREV" #endif girara-0.1.9/statusbar.c0000644000175000001440000000747012242417112014016 0ustar mockusers/* See LICENSE file for license and copyright information */ #include "statusbar.h" #include "session.h" #include "datastructures.h" #include "internal.h" #include "settings.h" #if GTK_MAJOR_VERSION == 2 #include "gtk2-compat.h" #endif girara_statusbar_item_t* girara_statusbar_item_add(girara_session_t* session, bool expand, bool fill, bool left, girara_statusbar_event_t callback) { g_return_val_if_fail(session != NULL && session->elements.statusbar_items, FALSE); girara_statusbar_item_t* item = g_slice_new(girara_statusbar_item_t); item->box = gtk_event_box_new(); item->text = GTK_LABEL(gtk_label_new(NULL)); /* set style */ gtk_widget_override_background_color(GTK_WIDGET(item->box), GTK_STATE_NORMAL, &(session->style.statusbar_background)); gtk_widget_override_color(GTK_WIDGET(item->box), GTK_STATE_NORMAL, &(session->style.statusbar_foreground)); gtk_widget_override_background_color(GTK_WIDGET(item->text), GTK_STATE_NORMAL, &(session->style.statusbar_background)); gtk_widget_override_color(GTK_WIDGET(item->text), GTK_STATE_NORMAL, &(session->style.statusbar_foreground)); gtk_widget_override_font(GTK_WIDGET(item->text), session->style.font); /* set properties */ gtk_misc_set_alignment(GTK_MISC(item->text), left ? 0.0 : 1.0, 0.5); gtk_label_set_use_markup(item->text, TRUE); /* add ellipsis if item is on the left side */ if (left == true) { gtk_label_set_ellipsize(item->text, PANGO_ELLIPSIZE_END); } #if (GTK_MAJOR_VERSION == 3) /* add name so it uses a custom style */ gtk_widget_set_name(GTK_WIDGET(item->text), "bottom_box"); #else /* set padding */ guint ypadding = 2; /* total amount of padding (top + bottom) */ guint xpadding = 8; /* total amount of padding (left + right) */ girara_setting_get(session, "statusbar-h-padding", &xpadding); girara_setting_get(session, "statusbar-v-padding", &ypadding); gtk_misc_set_padding(GTK_MISC(item->text), xpadding/2, ypadding/2); #endif if (callback != NULL) { g_signal_connect(G_OBJECT(item->box), "button-press-event", G_CALLBACK(callback), session); } /* add it to the list */ gtk_container_add(GTK_CONTAINER(item->box), GTK_WIDGET(item->text)); gtk_box_pack_start(session->gtk.statusbar_entries, GTK_WIDGET(item->box), expand, fill, 2); gtk_widget_show_all(GTK_WIDGET(item->box)); girara_list_prepend(session->elements.statusbar_items, item); return item; } void girara_statusbar_item_free(girara_statusbar_item_t* item) { g_slice_free(girara_statusbar_item_t, item); } bool girara_statusbar_item_set_text(girara_session_t* session, girara_statusbar_item_t* item, const char* text) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(item != NULL, false); char* escaped_text = g_markup_escape_text(text, -1); gtk_label_set_markup((GtkLabel*) item->text, escaped_text); g_free(escaped_text); return true; } bool girara_statusbar_item_set_foreground(girara_session_t* session, girara_statusbar_item_t* item, const char* color) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(item != NULL, false); #if (GTK_MAJOR_VERSION == 3) GdkRGBA gdk_color; gdk_rgba_parse(&gdk_color, color); gtk_widget_override_color(GTK_WIDGET(session->gtk.inputbar_entry), GTK_STATE_NORMAL, &(session->style.inputbar_foreground)); #else GdkColor gdk_color; gdk_color_parse(color, &gdk_color); gtk_widget_modify_fg(GTK_WIDGET(item->text), GTK_STATE_NORMAL, &gdk_color); #endif return true; } bool girara_statusbar_set_background(girara_session_t* session, const char* color) { g_return_val_if_fail(session != NULL, false); GdkRGBA gdk_color; gdk_rgba_parse(&gdk_color, color); gtk_widget_override_background_color(GTK_WIDGET(session->gtk.statusbar), GTK_STATE_NORMAL, &gdk_color); return true; } girara-0.1.9/config.h0000644000175000001440000000125312242417112013251 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_CONFIG_H #define GIRARA_CONFIG_H #include "types.h" /** * Parses and evaluates a configuration file * * @param session The used girara session * @param path Path to the configuration file */ void girara_config_parse(girara_session_t* session, const char* path); /** * Adds an additional config handler * * @param session The girara session * @param identifier Identifier of the handle * @param handle Handle * @return true if no error occured, otherwise false */ bool girara_config_handle_add(girara_session_t* session, const char* identifier, girara_command_function_t handle); #endif girara-0.1.9/commands.c0000644000175000001440000004626712242417112013616 0ustar mockusers/* See LICENSE file for license and copyright information */ #include #include #include #include "commands.h" #include "datastructures.h" #include "session.h" #include "internal.h" #include "utils.h" #include "settings.h" #include "shortcuts.h" #if GTK_MAJOR_VERSION == 2 #include "gtk2-compat.h" #endif /* default commands implementation */ bool girara_cmd_map_unmap(girara_session_t* session, girara_list_t* argument_list, bool unmap) { typedef struct gdk_keyboard_button_s { char* identifier; int keyval; } gdk_keyboard_button_t; static const gdk_keyboard_button_t gdk_keyboard_buttons[] = { {"BackSpace", GDK_KEY_BackSpace}, {"CapsLock", GDK_KEY_Caps_Lock}, {"Down", GDK_KEY_Down}, {"Esc", GDK_KEY_Escape}, {"F10", GDK_KEY_F10}, {"F11", GDK_KEY_F11}, {"F12", GDK_KEY_F12}, {"F1", GDK_KEY_F1}, {"F2", GDK_KEY_F2}, {"F3", GDK_KEY_F3}, {"F4", GDK_KEY_F4}, {"F5", GDK_KEY_F5}, {"F6", GDK_KEY_F6}, {"F7", GDK_KEY_F7}, {"F8", GDK_KEY_F8}, {"F9", GDK_KEY_F9}, {"Left", GDK_KEY_Left}, {"PageDown", GDK_KEY_Page_Down}, {"PageUp", GDK_KEY_Page_Up}, {"Home", GDK_KEY_Home}, {"End", GDK_KEY_End}, {"Return", GDK_KEY_Return}, {"Right", GDK_KEY_Right}, {"Space", GDK_KEY_space}, {"Super", GDK_KEY_Super_L}, {"Tab", GDK_KEY_Tab}, {"ShiftTab", GDK_KEY_ISO_Left_Tab}, {"Up", GDK_KEY_Up} }; typedef struct gdk_mouse_button_s { char* identifier; int button; } gdk_mouse_button_t; static const gdk_mouse_button_t gdk_mouse_buttons[] = { {"Button1", GIRARA_MOUSE_BUTTON1}, {"Button2", GIRARA_MOUSE_BUTTON2}, {"Button3", GIRARA_MOUSE_BUTTON3}, {"Button4", GIRARA_MOUSE_BUTTON4}, {"Button5", GIRARA_MOUSE_BUTTON5}, {"Button6", GIRARA_MOUSE_BUTTON6}, {"Button7", GIRARA_MOUSE_BUTTON7}, {"Button8", GIRARA_MOUSE_BUTTON8}, {"Button9", GIRARA_MOUSE_BUTTON9} }; typedef struct event_type_s { char* identifier; int event; } event_type_t; static const event_type_t event_types[] = { {"motion", GIRARA_EVENT_MOTION_NOTIFY}, {"scroll_up", GIRARA_EVENT_SCROLL_UP}, {"scroll_down", GIRARA_EVENT_SCROLL_DOWN}, {"scroll_left", GIRARA_EVENT_SCROLL_LEFT}, {"scroll_right", GIRARA_EVENT_SCROLL_RIGHT} }; typedef struct mouse_event_s { char* identifier; int event; } mouse_event_t; static const mouse_event_t mouse_events[] = { {"button-pressed", GIRARA_EVENT_BUTTON_PRESS}, {"2-button-pressed", GIRARA_EVENT_2BUTTON_PRESS}, {"3-button-pressed", GIRARA_EVENT_2BUTTON_PRESS}, {"button-released", GIRARA_EVENT_BUTTON_RELEASE} }; size_t number_of_arguments = girara_list_size(argument_list); unsigned int limit = (unmap == true) ? 1 : 2; if (number_of_arguments < limit) { girara_warning("Invalid number of arguments passed: %zu instead of at least %u", number_of_arguments, limit); girara_notify(session, GIRARA_ERROR, _("Invalid number of arguments passed: %zu instead of at least %u"), number_of_arguments, limit); return false; } int shortcut_mask = 0; int shortcut_key = 0; int shortcut_mouse_button = 0; girara_mode_t shortcut_mode = session->modes.normal; char* shortcut_argument_data = NULL; int shortcut_argument_n = 0; char* shortcut_buffer_command = NULL; girara_event_type_t event_type = GIRARA_EVENT_BUTTON_PRESS; girara_shortcut_function_t shortcut_function = NULL; bool mouse_event = false; size_t current_command = 0; char* tmp = girara_list_nth(argument_list, current_command); size_t tmp_length = strlen(tmp); /* Check first argument for mode */ bool is_mode = false; if (tmp_length >= 3 && tmp[0] == '[' && tmp[tmp_length - 1] == ']') { char* tmp_inner = g_strndup(tmp + 1, tmp_length - 2); GIRARA_LIST_FOREACH(session->modes.identifiers, girara_mode_string_t*, iter, mode) if (!g_strcmp0(tmp_inner, mode->name)) { shortcut_mode = mode->index; is_mode = true; break; } GIRARA_LIST_FOREACH_END(session->modes.identifiers, girara_mode_string_t*, iter, mode); if (is_mode == false) { girara_warning("Unregistered mode specified: %s", tmp_inner); girara_notify(session, GIRARA_ERROR, _("Unregistered mode specified: %s"), tmp_inner); g_free(tmp_inner); return false; } g_free(tmp_inner); } if (is_mode == true) { tmp = girara_list_nth(argument_list, ++current_command); tmp_length = strlen(tmp); } /* Check for multi key shortcut */ if (tmp_length >= 3 && tmp[0] == '<' && tmp[tmp_length - 1] == '>') { tmp = g_strndup(tmp + 1, tmp_length - 2); tmp_length = strlen(tmp); /* Multi key shortcut */ if (strchr(tmp, '-') != NULL && tmp[1] == '-' && tmp_length > 2) { switch (tmp[0]) { case 'S': shortcut_mask = GDK_SHIFT_MASK; break; case 'A': case 'M': shortcut_mask = GDK_MOD1_MASK; break; case 'C': shortcut_mask = GDK_CONTROL_MASK; break; default: girara_warning("Invalid modifier in %s", tmp); girara_notify(session, GIRARA_ERROR, _("Invalid modifier in %s"), tmp); g_free(tmp); return false; } /* Single key */ if (tmp_length == 3) { shortcut_key = tmp[2]; /* Possible special key */ } else { bool found = false; for (unsigned int i = 0; i < LENGTH(gdk_keyboard_buttons); i++) { if (g_strcmp0(tmp + 2, gdk_keyboard_buttons[i].identifier) == 0) { shortcut_key = gdk_keyboard_buttons[i].keyval; found = true; break; } } for (unsigned int i = 0; i < LENGTH(gdk_mouse_buttons); i++) { if (!g_strcmp0(tmp + 2, gdk_mouse_buttons[i].identifier)) { shortcut_mouse_button = gdk_mouse_buttons[i].button; mouse_event = true; found = true; break; } } for (unsigned int i = 0; i < LENGTH(event_types); i++) { if (!g_strcmp0(tmp + 2, event_types[i].identifier)) { event_type = event_types[i].event; mouse_event = true; found = true; break; } } if (found == false) { girara_warning("Invalid special key value or mode: %s", tmp); girara_notify(session, GIRARA_ERROR, _("Invalid special key value for %s"), tmp); g_free(tmp); return false; } } /* Possible special key */ } else { bool found = false; for (unsigned int i = 0; i < LENGTH(gdk_keyboard_buttons); i++) { if (g_strcmp0(tmp, gdk_keyboard_buttons[i].identifier) == 0) { shortcut_key = gdk_keyboard_buttons[i].keyval; found = true; break; } } for (unsigned int i = 0; i < LENGTH(gdk_mouse_buttons); i++) { if (!g_strcmp0(tmp, gdk_mouse_buttons[i].identifier)) { shortcut_mouse_button = gdk_mouse_buttons[i].button; mouse_event = true; found = true; break; } } for (unsigned int i = 0; i < LENGTH(event_types); i++) { if (!g_strcmp0(tmp, event_types[i].identifier)) { event_type = event_types[i].event; mouse_event = true; found = true; break; } } if (found == false) { girara_warning("Invalid special key value or mode: %s", tmp); girara_notify(session, GIRARA_ERROR, _("Invalid special key value or mode %s"), tmp); g_free(tmp); return false; } } g_free(tmp); /* Single key shortcut */ } else if (tmp_length == 1) { shortcut_key = tmp[0]; /* Buffer command */ } else { shortcut_buffer_command = g_strdup(tmp); } /* check for mouse mode */ bool mouse_mode = false; if (unmap == false) { if (++current_command < number_of_arguments) { tmp = girara_list_nth(argument_list, current_command); tmp_length = strlen(tmp); if (tmp_length >= 3 && tmp[0] == '[' && tmp[tmp_length - 1] == ']') { mouse_mode = true; if (mouse_event == false) { girara_warning("Mode passed on non-mouse event: %s", tmp); return false; } char* tmp_inner = g_strndup(tmp + 1, tmp_length - 2); bool found = false; for (unsigned int i = 0; i < LENGTH(mouse_events); i++) { if (!g_strcmp0(tmp_inner, mouse_events[i].identifier)) { event_type = mouse_events[i].event; found = true; break; } } if (found == false) { girara_warning("Invalid mouse event mode has been passed: %s", tmp_inner); g_free(tmp_inner); return false; } g_free(tmp_inner); } } else { girara_warning("Invalid number of arguments passed"); return false; } } if (unmap == false) { limit = (mouse_mode == true) ? 3 : 2; if (number_of_arguments < limit) { girara_warning("Invalid number of arguments passed: %zu instead of at least %u", number_of_arguments, limit); girara_notify(session, GIRARA_ERROR, _("Invalid number of arguments passed: %zu instead of at least %u"), number_of_arguments, limit); return false; } if (mouse_mode == true) { tmp = girara_list_nth(argument_list, ++current_command); } } /* Check for passed shortcut command */ if (unmap == false) { bool found_mapping = false; GIRARA_LIST_FOREACH(session->config.shortcut_mappings, girara_shortcut_mapping_t*, iter, mapping) if (!g_strcmp0(tmp, mapping->identifier)) { shortcut_function = mapping->function; found_mapping = true; break; } GIRARA_LIST_FOREACH_END(session->config.shortcut_mappings, girara_shortcut_mapping_t*, iter, mapping); if (found_mapping == false) { girara_warning("Not a valid shortcut function: %s", tmp); girara_notify(session, GIRARA_ERROR, _("Not a valid shortcut function: %s"), tmp); if (shortcut_buffer_command) { g_free(shortcut_buffer_command); } return false; } } /* Check for passed argument */ if (unmap == false) { if (++current_command < number_of_arguments) { tmp = (char*) girara_list_nth(argument_list, current_command); GIRARA_LIST_FOREACH(session->config.argument_mappings, girara_argument_mapping_t*, iter, mapping) if (!g_strcmp0(tmp, mapping->identifier)) { shortcut_argument_n = mapping->value; break; } GIRARA_LIST_FOREACH_END(session->config.argument_mappings, girara_argument_mapping_t*, iter, mapping); /* If no known argument is passed we save it in the data field */ if (shortcut_argument_n == 0) { shortcut_argument_data = tmp; /* If a known argument is passed and there are still more arguments, * we save the next one in the data field */ } else if (++current_command < number_of_arguments) { tmp = (char*) girara_list_nth(argument_list, current_command); shortcut_argument_data = tmp; } } } if (mouse_event == false) { if (unmap == true) { girara_shortcut_remove(session, shortcut_mask, shortcut_key, shortcut_buffer_command, shortcut_mode); } else { girara_shortcut_add(session, shortcut_mask, shortcut_key, shortcut_buffer_command, shortcut_function, shortcut_mode, shortcut_argument_n, shortcut_argument_data); } } else { if (unmap == true) { girara_mouse_event_remove(session, shortcut_mask, shortcut_mouse_button, shortcut_mode); } else { girara_mouse_event_add(session, shortcut_mask, shortcut_mouse_button, shortcut_function, shortcut_mode, event_type, shortcut_argument_n, shortcut_argument_data); } } if (shortcut_buffer_command) { g_free(shortcut_buffer_command); } return true; } bool girara_cmd_map(girara_session_t* session, girara_list_t* argument_list) { return girara_cmd_map_unmap(session, argument_list, false); } bool girara_cmd_unmap(girara_session_t* session, girara_list_t* argument_list) { return girara_cmd_map_unmap(session, argument_list, true); } bool girara_cmd_quit(girara_session_t* session, girara_list_t* UNUSED(argument_list)) { girara_argument_t arg = { GIRARA_HIDE, NULL }; girara_isc_completion(session, &arg, NULL, 0); gtk_main_quit(); return true; } bool girara_cmd_set(girara_session_t* session, girara_list_t* argument_list) { const size_t number_of_arguments = girara_list_size(argument_list); if (number_of_arguments == 0) { girara_warning("Not enough arguments for :set."); girara_notify(session, GIRARA_ERROR, _("Not enough arguments.")); return false; } if (number_of_arguments > 2) { girara_warning("Too many arguments for :set."); girara_notify(session, GIRARA_ERROR, _("Too many arguments.")); return false; } /* search for existing setting */ char* name = (char*) girara_list_nth(argument_list, 0); if (name == NULL) { return false; } girara_setting_t* setting = girara_setting_find(session, name); if (setting == NULL) { girara_warning("Unknown option: %s", name); girara_notify(session, GIRARA_ERROR, _("Unknown option: %s"), name); return false; } if (number_of_arguments == 1) { /* display setting*/ switch (girara_setting_get_type(setting)) { case BOOLEAN: { /* for compatibility reasons: toogle the setting */ bool value = false; girara_setting_get_value(setting, &value); bool tmp = !value; girara_setting_set_value(session, setting, &tmp); girara_notify(session, GIRARA_INFO, "%s: %s", name, tmp ? _("true") : _("false")); break; } case FLOAT: { float value = 0; girara_setting_get_value(setting, &value); girara_notify(session, GIRARA_INFO, "%s: %f", name, value); break; } case INT: { int value = 0; girara_setting_get_value(setting, &value); girara_notify(session, GIRARA_INFO, "%s: %i", name, value); break; } case STRING: { char* str = NULL; girara_setting_get_value(setting, &str); girara_notify(session, GIRARA_INFO, "%s: %s", name, str ? str : "(NULL)"); g_free(str); break; } default: return false; } } else { char* value = (char*) girara_list_nth(argument_list, 1); if (value == NULL) { girara_warning("No value defined for option: %s", name); girara_notify(session, GIRARA_ERROR, _("No value defined for option: %s"), name); return false; } /* update value */ switch (girara_setting_get_type(setting)) { case BOOLEAN: if (g_strcmp0(value, "false") == 0 || g_strcmp0(value, "0") == 0) { bool b = false; girara_setting_set_value(session, setting, &b); } else if (g_strcmp0(value, "true") == 0 || g_strcmp0(value, "1") == 0) { bool b = true; girara_setting_set_value(session, setting, &b); } else { girara_warning("Unknown value for option: %s", name); girara_notify(session, GIRARA_ERROR, _("Unknown value for option: %s"), name); } break; case FLOAT: { float f = g_ascii_strtod(value, NULL); girara_setting_set_value(session, setting, &f); break; } case INT: { int i = atoi(value); girara_setting_set_value(session, setting, &i); break; } case STRING: girara_setting_set_value(session, setting, value); break; default: return false; } } return true; } 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) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(command != NULL, false); g_return_val_if_fail(function != NULL, false); /* search for existing binding */ GIRARA_LIST_FOREACH(session->bindings.commands, girara_command_t*, iter, commands_it) if (g_strcmp0(commands_it->command, command) == 0) { g_free(commands_it->abbr); g_free(commands_it->description); commands_it->abbr = abbreviation ? g_strdup(abbreviation) : NULL; commands_it->function = function; commands_it->completion = completion; commands_it->description = description ? g_strdup(description) : NULL; girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->bindings.commands, girara_command_t*, iter, commands_it); /* add new inputbar command */ girara_command_t* new_command = g_slice_new(girara_command_t); new_command->command = g_strdup(command); new_command->abbr = abbreviation ? g_strdup(abbreviation) : NULL; new_command->function = function; new_command->completion = completion; new_command->description = description ? g_strdup(description) : NULL; girara_list_append(session->bindings.commands, new_command); return true; } 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) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(function != NULL, false); girara_argument_t argument = {argument_n, argument_data}; /* search for existing special command */ GIRARA_LIST_FOREACH(session->bindings.special_commands, girara_special_command_t*, iter, scommand_it) if (scommand_it->identifier == identifier) { scommand_it->function = function; scommand_it->always = always; scommand_it->argument = argument; girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->bindings.special_commands, girara_special_command_t*, iter, scommand_it); /* create new special command */ girara_special_command_t* special_command = g_slice_new(girara_special_command_t); special_command->identifier = identifier; special_command->function = function; special_command->always = always; special_command->argument = argument; girara_list_append(session->bindings.special_commands, special_command); return true; } void girara_special_command_free(girara_special_command_t* special_command) { if (special_command == NULL) { return; } g_slice_free(girara_special_command_t, special_command); } void girara_command_free(girara_command_t* command) { if (command == NULL) { return; } g_free(command->command); g_free(command->abbr); g_free(command->description); g_slice_free(girara_command_t, command); } bool girara_cmd_exec(girara_session_t* session, girara_list_t* argument_list) { if (session == NULL || argument_list == NULL) { return true; } return girara_exec_with_argument_list(session, argument_list); } girara-0.1.9/session.c0000644000175000001440000006562412242417112013476 0ustar mockusers/* See LICENSE file for license and copyright information */ #include #include #include "session.h" #include "settings.h" #include "datastructures.h" #include "internal.h" #include "commands.h" #include "callbacks.h" #include "shortcuts.h" #include "config.h" #include "utils.h" #include "input-history.h" #if GTK_MAJOR_VERSION == 2 #include "gtk2-compat.h" #endif #if defined(__GNUC__) || defined(__clang__) #define DO_PRAGMA(x) _Pragma(#x) #else #define DO_PRAGMA(x) #endif #define IGNORE_DEPRECATED \ DO_PRAGMA(GCC diagnostic push) \ DO_PRAGMA(GCC diagnostic ignored "-Wdeprecated-declarations") #define UNIGNORE \ DO_PRAGMA(GCC diagnostic pop) static int cb_sort_settings(girara_setting_t* lhs, girara_setting_t* rhs) { return g_strcmp0(girara_setting_get_name(lhs), girara_setting_get_name(rhs)); } static void ensure_gettext_initialized(void) { static gsize initialized = 0; if (g_once_init_enter(&initialized) == TRUE) { bindtextdomain(GETTEXT_PACKAGE, LOCALEDIR); bind_textdomain_codeset(GETTEXT_PACKAGE, "UTF-8"); g_once_init_leave(&initialized, 1); } } girara_session_t* girara_session_create() { ensure_gettext_initialized(); girara_session_t* session = g_slice_alloc0(sizeof(girara_session_t)); session->private_data = g_slice_alloc0(sizeof(girara_session_private_t)); /* init values */ session->bindings.mouse_events = girara_list_new2( (girara_free_function_t) girara_mouse_event_free); session->bindings.commands = girara_list_new2( (girara_free_function_t) girara_command_free); session->bindings.special_commands = girara_list_new2( (girara_free_function_t) girara_special_command_free); session->bindings.shortcuts = girara_list_new2( (girara_free_function_t) girara_shortcut_free); session->bindings.inputbar_shortcuts = girara_list_new2( (girara_free_function_t) girara_inputbar_shortcut_free); session->elements.statusbar_items = girara_list_new2( (girara_free_function_t) girara_statusbar_item_free); /* settings */ session->private_data->settings = girara_sorted_list_new2( (girara_compare_function_t) cb_sort_settings, (girara_free_function_t) girara_setting_free); /* init modes */ session->modes.identifiers = girara_list_new2( (girara_free_function_t) girara_mode_string_free); girara_mode_t normal_mode = girara_mode_add(session, "normal"); girara_mode_t inputbar_mode = girara_mode_add(session, "inputbar"); session->modes.normal = normal_mode; session->modes.current_mode = normal_mode; session->modes.inputbar = inputbar_mode; /* config handles */ session->config.handles = girara_list_new2( (girara_free_function_t) girara_config_handle_free); session->config.shortcut_mappings = girara_list_new2( (girara_free_function_t) girara_shortcut_mapping_free); session->config.argument_mappings = girara_list_new2( (girara_free_function_t) girara_argument_mapping_free); /* command history */ session->command_history = girara_input_history_new(NULL); /* load default values */ girara_config_load_default(session); /* create widgets */ #if GTK_MAJOR_VERSION == 2 session->gtk.box = GTK_BOX(gtk_vbox_new(FALSE, 0)); session->private_data->gtk.bottom_box = GTK_BOX(gtk_vbox_new(FALSE, 0)); session->gtk.statusbar_entries = GTK_BOX(gtk_hbox_new(FALSE, 0)); session->gtk.tabbar = gtk_hbox_new(TRUE, 0); session->gtk.inputbar_box = GTK_BOX(gtk_hbox_new(TRUE, 0)); #else session->gtk.box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0)); session->private_data->gtk.overlay = gtk_overlay_new(); session->private_data->gtk.bottom_box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0)); session->gtk.statusbar_entries = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0)); session->gtk.tabbar = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0); session->gtk.inputbar_box = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0)); gtk_box_set_homogeneous(GTK_BOX(session->gtk.tabbar), TRUE); gtk_box_set_homogeneous(session->gtk.inputbar_box, TRUE); #endif session->gtk.view = gtk_scrolled_window_new(NULL, NULL); session->gtk.viewport = gtk_viewport_new(NULL, NULL); #if GTK_MAJOR_VERSION == 3 && GTK_MINOR_VERSION >= 4 gtk_widget_add_events(session->gtk.viewport, GDK_SCROLL_MASK); #endif session->gtk.statusbar = gtk_event_box_new(); session->gtk.notification_area = gtk_event_box_new(); session->gtk.notification_text = gtk_label_new(NULL); session->gtk.inputbar_dialog = GTK_LABEL(gtk_label_new(NULL)); session->gtk.inputbar_entry = GTK_ENTRY(gtk_entry_new()); session->gtk.inputbar = gtk_event_box_new(); session->gtk.tabs = GTK_NOTEBOOK(gtk_notebook_new()); /* deprecated members */ IGNORE_DEPRECATED session->settings = session->private_data->settings; session->global.command_history = girara_get_command_history(session); UNIGNORE return session; } bool girara_session_init(girara_session_t* session, const char* sessionname) { if (session == NULL) { return false; } /* window */ if (session->gtk.embed){ session->gtk.window = gtk_plug_new(session->gtk.embed); } else { session->gtk.window = gtk_window_new(GTK_WINDOW_TOPLEVEL); } if (sessionname != NULL) { gtk_widget_set_name(GTK_WIDGET(session->gtk.window), sessionname); } GdkGeometry hints = { .base_height = 1, .base_width = 1, .height_inc = 0, .max_aspect = 0, .max_height = 0, .max_width = 0, .min_aspect = 0, .min_height = 0, .min_width = 0, .width_inc = 0 }; gtk_window_set_geometry_hints(GTK_WINDOW(session->gtk.window), NULL, &hints, GDK_HINT_MIN_SIZE); #if (GTK_MAJOR_VERSION == 3) gtk_window_set_has_resize_grip(GTK_WINDOW(session->gtk.window), FALSE); #endif #if (GTK_MAJOR_VERSION == 3) gtk_widget_override_background_color(GTK_WIDGET(session->gtk.window), GTK_STATE_NORMAL, &(session->style.default_background)); #else gtk_widget_modify_bg(GTK_WIDGET(session->gtk.window), GTK_STATE_NORMAL, &(session->style.default_background)); #endif /* view */ session->signals.view_key_pressed = g_signal_connect(G_OBJECT(session->gtk.view), "key-press-event", G_CALLBACK(girara_callback_view_key_press_event), session); session->signals.view_button_press_event = g_signal_connect(G_OBJECT(session->gtk.view), "button-press-event", G_CALLBACK(girara_callback_view_button_press_event), session); session->signals.view_button_release_event = g_signal_connect(G_OBJECT(session->gtk.view), "button-release-event", G_CALLBACK(girara_callback_view_button_release_event), session); session->signals.view_motion_notify_event = g_signal_connect(G_OBJECT(session->gtk.view), "motion-notify-event", G_CALLBACK(girara_callback_view_button_motion_notify_event), session); session->signals.view_scroll_event = g_signal_connect(G_OBJECT(session->gtk.view), "scroll-event", G_CALLBACK(girara_callback_view_scroll_event), session); bool show_hscrollbar = false; bool show_vscrollbar = false; girara_setting_get(session, "show-h-scrollbar", &show_hscrollbar); girara_setting_get(session, "show-v-scrollbar", &show_vscrollbar); #if (GTK_MAJOR_VERSION == 3) gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(session->gtk.view), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); GtkWidget *vscrollbar = gtk_scrolled_window_get_vscrollbar(GTK_SCROLLED_WINDOW(session->gtk.view)); GtkWidget *hscrollbar = gtk_scrolled_window_get_hscrollbar(GTK_SCROLLED_WINDOW(session->gtk.view)); if (vscrollbar != NULL) { gtk_widget_set_visible(GTK_WIDGET(vscrollbar), show_vscrollbar); } if (hscrollbar != NULL) { gtk_widget_set_visible(GTK_WIDGET(hscrollbar), show_hscrollbar); } #else GtkPolicyType h_policy, v_policy; h_policy = show_hscrollbar ? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER; v_policy = show_vscrollbar ? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER; gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(session->gtk.view), h_policy, v_policy); #endif /* viewport */ gtk_container_add(GTK_CONTAINER(session->gtk.view), session->gtk.viewport); gtk_viewport_set_shadow_type(GTK_VIEWPORT(session->gtk.viewport), GTK_SHADOW_NONE); #if (GTK_MAJOR_VERSION == 3) gtk_widget_override_background_color(GTK_WIDGET(session->gtk.viewport), GTK_STATE_NORMAL, &(session->style.default_background)); #else gtk_widget_modify_bg(GTK_WIDGET(session->gtk.viewport), GTK_STATE_NORMAL, &(session->style.default_background)); #endif /* statusbar */ gtk_container_add(GTK_CONTAINER(session->gtk.statusbar), GTK_WIDGET(session->gtk.statusbar_entries)); /* notification area */ gtk_container_add(GTK_CONTAINER(session->gtk.notification_area), GTK_WIDGET(session->gtk.notification_text)); gtk_misc_set_alignment(GTK_MISC(session->gtk.notification_text), 0.0, 0.5); gtk_label_set_use_markup(GTK_LABEL(session->gtk.notification_text), TRUE); /* inputbar */ gtk_entry_set_has_frame(session->gtk.inputbar_entry, FALSE); gtk_editable_set_editable(GTK_EDITABLE(session->gtk.inputbar_entry), TRUE); /* we want inputbar_entry the same height as notification_text and statusbar, so that when inputbar_entry is hidden, the size of the bottom_box remains the same. We need to get rid of the builtin padding in the GtkEntry widget. */ guint ypadding = 2; /* total amount of padding (top + bottom) */ guint xpadding = 8; /* total amount of padding (left + right) */ girara_setting_get(session, "statusbar-h-padding", &xpadding); girara_setting_get(session, "statusbar-v-padding", &ypadding); #if (GTK_MAJOR_VERSION == 3) /* gtk_entry_set_inner_border is deprecated since gtk 3.4 and does nothing. */ GtkCssProvider* provider = gtk_css_provider_new(); static const char CSS_PATTERN[] = "#bottom_box { border-style: none; margin: 0px 0px 0px 0px; padding:%dpx %dpx %dpx %dpx; }"; char* css = g_strdup_printf(CSS_PATTERN, ypadding - ypadding/2, xpadding/2, ypadding/2, xpadding - xpadding/2); gtk_css_provider_load_from_data(provider, css, strlen(css), NULL); g_free(css); GdkDisplay* display = gdk_display_get_default(); GdkScreen* screen = gdk_display_get_default_screen(display); gtk_style_context_add_provider_for_screen(screen, GTK_STYLE_PROVIDER(provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); g_object_unref(provider); gtk_widget_set_name(GTK_WIDGET(session->gtk.inputbar_entry), "bottom_box"); gtk_widget_set_name(GTK_WIDGET(session->gtk.notification_text), "bottom_box"); #else GtkBorder inner_border = { .left = xpadding - xpadding/2, .right = xpadding/2, .top = ypadding - ypadding/2, .bottom = ypadding/2 }; /* set inner borders for inputbar and notification_text */ gtk_entry_set_inner_border(session->gtk.inputbar_entry, &inner_border); gtk_misc_set_padding(GTK_MISC(session->gtk.notification_text), xpadding/2, ypadding/2); #endif session->signals.inputbar_key_pressed = g_signal_connect( G_OBJECT(session->gtk.inputbar_entry), "key-press-event", G_CALLBACK(girara_callback_inputbar_key_press_event), session ); session->signals.inputbar_changed = g_signal_connect( G_OBJECT(session->gtk.inputbar_entry), "changed", G_CALLBACK(girara_callback_inputbar_changed_event), session ); session->signals.inputbar_activate = g_signal_connect( G_OBJECT(session->gtk.inputbar_entry), "activate", G_CALLBACK(girara_callback_inputbar_activate), session ); gtk_box_set_homogeneous(session->gtk.inputbar_box, FALSE); gtk_box_set_spacing(session->gtk.inputbar_box, 5); /* inputbar box */ gtk_box_pack_start(GTK_BOX(session->gtk.inputbar_box), GTK_WIDGET(session->gtk.inputbar_dialog), FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(session->gtk.inputbar_box), GTK_WIDGET(session->gtk.inputbar_entry), TRUE, TRUE, 0); gtk_container_add(GTK_CONTAINER(session->gtk.inputbar), GTK_WIDGET(session->gtk.inputbar_box)); /* bottom box */ gtk_box_set_spacing(session->private_data->gtk.bottom_box, 0); gtk_box_pack_end(GTK_BOX(session->private_data->gtk.bottom_box), GTK_WIDGET(session->gtk.inputbar), TRUE, TRUE, 0); gtk_box_pack_end(GTK_BOX(session->private_data->gtk.bottom_box), GTK_WIDGET(session->gtk.notification_area), TRUE, TRUE, 0); gtk_box_pack_end(GTK_BOX(session->private_data->gtk.bottom_box), GTK_WIDGET(session->gtk.statusbar), TRUE, TRUE, 0); /* tabs */ gtk_notebook_set_show_border(session->gtk.tabs, FALSE); gtk_notebook_set_show_tabs(session->gtk.tabs, FALSE); #if (GTK_MAJOR_VERSION == 3) /* packing */ gtk_box_set_spacing(session->gtk.box, 0); gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.tabbar), FALSE, FALSE, 0); gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.view), TRUE, TRUE, 0); /* box */ gtk_container_add(GTK_CONTAINER(session->private_data->gtk.overlay), GTK_WIDGET(session->gtk.box)); /* overlay */ g_object_set(session->private_data->gtk.bottom_box, "halign", GTK_ALIGN_FILL, NULL); g_object_set(session->private_data->gtk.bottom_box, "valign", GTK_ALIGN_END, NULL); gtk_overlay_add_overlay(GTK_OVERLAY(session->private_data->gtk.overlay), GTK_WIDGET(session->private_data->gtk.bottom_box)); gtk_container_add(GTK_CONTAINER(session->gtk.window), GTK_WIDGET(session->private_data->gtk.overlay)); #else /* packing */ gtk_box_set_spacing(session->gtk.box, 0); gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.tabbar), FALSE, FALSE, 0); gtk_box_pack_start(session->gtk.box, GTK_WIDGET(session->gtk.view), TRUE, TRUE, 0); gtk_box_pack_end(session->gtk.box, GTK_WIDGET(session->private_data->gtk.bottom_box), FALSE, FALSE, 0); /* box */ gtk_container_add(GTK_CONTAINER(session->gtk.window), GTK_WIDGET(session->gtk.box)); #endif /* parse color values */ typedef struct color_setting_mapping_s { char* identifier; GdkRGBA *color; } color_setting_mapping_t; const color_setting_mapping_t color_setting_mappings[] = { {"default-fg", &(session->style.default_foreground)}, {"default-bg", &(session->style.default_background)}, {"inputbar-fg", &(session->style.inputbar_foreground)}, {"inputbar-bg", &(session->style.inputbar_background)}, {"statusbar-fg", &(session->style.statusbar_foreground)}, {"statusbar-bg", &(session->style.statusbar_background)}, {"completion-fg", &(session->style.completion_foreground)}, {"completion-bg", &(session->style.completion_background)}, {"completion-group-fg", &(session->style.completion_group_foreground)}, {"completion-group-bg", &(session->style.completion_group_background)}, {"completion-highlight-fg", &(session->style.completion_highlight_foreground)}, {"completion-highlight-bg", &(session->style.completion_highlight_background)}, {"notification-error-fg", &(session->style.notification_error_foreground)}, {"notification-error-bg", &(session->style.notification_error_background)}, {"notification-warning-fg", &(session->style.notification_warning_foreground)}, {"notification-warning-bg", &(session->style.notification_warning_background)}, {"notification-fg", &(session->style.notification_default_foreground)}, {"notification-bg", &(session->style.notification_default_background)}, {"tabbar-fg", &(session->style.tabbar_foreground)}, {"tabbar-bg", &(session->style.tabbar_background)}, {"tabbar-focus-fg", &(session->style.tabbar_focus_foreground)}, {"tabbar-focus-bg", &(session->style.tabbar_focus_background)}, }; for (size_t i = 0; i < LENGTH(color_setting_mappings); i++) { char* tmp_value = NULL; girara_setting_get(session, color_setting_mappings[i].identifier, &tmp_value); if (tmp_value != NULL) { gdk_rgba_parse(color_setting_mappings[i].color, tmp_value); g_free(tmp_value); } } /* view */ gtk_widget_override_background_color(GTK_WIDGET(session->gtk.viewport), GTK_STATE_NORMAL, &(session->style.default_background)); /* statusbar */ gtk_widget_override_background_color(GTK_WIDGET(session->gtk.statusbar), GTK_STATE_NORMAL, &(session->style.statusbar_background)); /* inputbar */ #if (GTK_MAJOR_VERSION == 3) gtk_widget_override_background_color(GTK_WIDGET(session->gtk.inputbar_entry), GTK_STATE_NORMAL, &(session->style.inputbar_background)); gtk_widget_override_color(GTK_WIDGET(session->gtk.inputbar_entry), GTK_STATE_NORMAL, &(session->style.inputbar_foreground)); gtk_widget_override_background_color(GTK_WIDGET(session->gtk.inputbar), GTK_STATE_NORMAL, &(session->style.inputbar_background)); gtk_widget_override_color(GTK_WIDGET(session->gtk.inputbar_dialog), GTK_STATE_NORMAL, &(session->style.inputbar_foreground)); /* notification area */ gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area), GTK_STATE_NORMAL, &(session->style.notification_default_background)); gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text), GTK_STATE_NORMAL, &(session->style.notification_default_foreground)); #else /* inputbar */ gtk_widget_modify_base(GTK_WIDGET(session->gtk.inputbar_entry), GTK_STATE_NORMAL, &(session->style.inputbar_background)); gtk_widget_modify_text(GTK_WIDGET(session->gtk.inputbar_entry), GTK_STATE_NORMAL, &(session->style.inputbar_foreground)); gtk_widget_modify_bg(GTK_WIDGET(session->gtk.inputbar), GTK_STATE_NORMAL, &(session->style.inputbar_background)); gtk_widget_modify_fg(GTK_WIDGET(session->gtk.inputbar_dialog), GTK_STATE_NORMAL, &(session->style.inputbar_foreground)); /* notification area */ gtk_widget_modify_bg(GTK_WIDGET(session->gtk.notification_area), GTK_STATE_NORMAL, &(session->style.notification_default_background)); gtk_widget_modify_text(GTK_WIDGET(session->gtk.notification_text), GTK_STATE_NORMAL, &(session->style.notification_default_foreground)); #endif if (session->style.font == NULL) { /* set default font */ girara_setting_set(session, "font", "monospace normal 9"); } else { gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_entry), session->style.font); gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_dialog), session->style.font); gtk_widget_override_font(GTK_WIDGET(session->gtk.notification_text), session->style.font); } /* set window size */ int window_width = 0; int window_height = 0; girara_setting_get(session, "window-width", &window_width); girara_setting_get(session, "window-height", &window_height); if (window_width > 0 && window_height > 0) { gtk_window_set_default_size(GTK_WINDOW(session->gtk.window), window_width, window_height); } gtk_widget_show_all(GTK_WIDGET(session->gtk.window)); gtk_widget_hide(GTK_WIDGET(session->gtk.notification_area)); gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog)); if (session->global.autohide_inputbar == true) { gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar)); } if (session->global.hide_statusbar == true) { gtk_widget_hide(GTK_WIDGET(session->gtk.statusbar)); } char* window_icon = NULL; girara_setting_get(session, "window-icon", &window_icon); if (window_icon != NULL) { if (strlen(window_icon) != 0) { girara_setting_set(session, "window-icon", window_icon); } g_free(window_icon); } gtk_widget_grab_focus(GTK_WIDGET(session->gtk.view)); return true; } static void girara_session_private_free(girara_session_private_t* session) { g_return_if_fail(session != NULL); /* clean up settings */ girara_list_free(session->settings); session->settings = NULL; g_slice_free(girara_session_private_t, session); } bool girara_session_destroy(girara_session_t* session) { g_return_val_if_fail(session != NULL, FALSE); /* clean up style */ if (session->style.font) { pango_font_description_free(session->style.font); } /* clean up shortcuts */ girara_list_free(session->bindings.shortcuts); session->bindings.shortcuts = NULL; /* clean up inputbar shortcuts */ girara_list_free(session->bindings.inputbar_shortcuts); session->bindings.inputbar_shortcuts = NULL; /* clean up commands */ girara_list_free(session->bindings.commands); session->bindings.commands = NULL; /* clean up special commands */ girara_list_free(session->bindings.special_commands); session->bindings.special_commands = NULL; /* clean up mouse events */ girara_list_free(session->bindings.mouse_events); session->bindings.mouse_events = NULL; /* clean up input histry */ g_object_unref(session->command_history); session->command_history = NULL; /* clean up statusbar items */ girara_list_free(session->elements.statusbar_items); session->elements.statusbar_items = NULL; /* clean up config handles */ girara_list_free(session->config.handles); session->config.handles = NULL; /* clean up shortcut mappings */ girara_list_free(session->config.shortcut_mappings); session->config.shortcut_mappings = NULL; /* clean up argument mappings */ girara_list_free(session->config.argument_mappings); session->config.argument_mappings = NULL; /* clean up modes */ girara_list_free(session->modes.identifiers); session->modes.identifiers = NULL; /* clean up buffer */ if (session->buffer.command) { g_string_free(session->buffer.command, TRUE); } if (session->global.buffer) { g_string_free(session->global.buffer, TRUE); } session->buffer.command = NULL; session->global.buffer = NULL; /* clean up private data */ girara_session_private_free(session->private_data); session->private_data = NULL; IGNORE_DEPRECATED session->settings = NULL; UNIGNORE /* clean up session */ g_slice_free(girara_session_t, session); return TRUE; } char* girara_buffer_get(girara_session_t* session) { g_return_val_if_fail(session != NULL, NULL); return (session->global.buffer) ? g_strdup(session->global.buffer->str) : NULL; } void girara_notify(girara_session_t* session, int level, const char* format, ...) { if (session == NULL || session->gtk.notification_text == NULL || session->gtk.notification_area == NULL || session->gtk.inputbar == NULL || session->gtk.view == NULL) { return; } const GdkRGBA* foreground = NULL; const GdkRGBA* background = NULL; switch (level) { case GIRARA_ERROR: foreground = &session->style.notification_error_foreground; background = &session->style.notification_error_background; break; case GIRARA_WARNING: foreground = &session->style.notification_warning_foreground; background = &session->style.notification_warning_background; break; case GIRARA_INFO: foreground = &session->style.notification_default_foreground; background = &session->style.notification_default_background; break; default: return; } gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_area), GTK_STATE_NORMAL, background); gtk_widget_override_background_color(GTK_WIDGET(session->gtk.notification_text), GTK_STATE_NORMAL, background); gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_area), GTK_STATE_NORMAL, foreground); gtk_widget_override_color(GTK_WIDGET(session->gtk.notification_text), GTK_STATE_NORMAL, foreground); /* prepare message */ va_list ap; va_start(ap, format); char* message = g_strdup_vprintf(format, ap); va_end(ap); gtk_label_set_markup(GTK_LABEL(session->gtk.notification_text), message); g_free(message); /* update visibility */ gtk_widget_show(GTK_WIDGET(session->gtk.notification_area)); gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar)); gtk_widget_grab_focus(GTK_WIDGET(session->gtk.view)); } void girara_dialog(girara_session_t* session, const char* dialog, bool invisible, girara_callback_inputbar_key_press_event_t key_press_event, girara_callback_inputbar_activate_t activate_event, void* data) { if (session == NULL || session->gtk.inputbar == NULL || session->gtk.inputbar_dialog == NULL || session->gtk.inputbar_entry == NULL) { return; } gtk_widget_show(GTK_WIDGET(session->gtk.inputbar_dialog)); /* set dialog message */ if (dialog != NULL) { gtk_label_set_markup(session->gtk.inputbar_dialog, dialog); } /* set input visibility */ if (invisible == true) { gtk_entry_set_visibility(session->gtk.inputbar_entry, FALSE); } else { gtk_entry_set_visibility(session->gtk.inputbar_entry, TRUE); } /* set handler */ session->signals.inputbar_custom_activate = activate_event; session->signals.inputbar_custom_key_press_event = key_press_event; session->signals.inputbar_custom_data = data; /* focus inputbar */ girara_sc_focus_inputbar(session, NULL, NULL, 0); } bool girara_set_view(girara_session_t* session, GtkWidget* widget) { g_return_val_if_fail(session != NULL, false); GtkWidget* child = gtk_bin_get_child(GTK_BIN(session->gtk.viewport)); if (child) { g_object_ref(child); gtk_container_remove(GTK_CONTAINER(session->gtk.viewport), child); } gtk_container_add(GTK_CONTAINER(session->gtk.viewport), widget); gtk_widget_show_all(widget); return true; } void girara_mode_set(girara_session_t* session, girara_mode_t mode) { g_return_if_fail(session != NULL); session->modes.current_mode = mode; } girara_mode_t girara_mode_add(girara_session_t* session, const char* name) { g_return_val_if_fail(session != NULL, FALSE); g_return_val_if_fail(name != NULL && name[0] != 0x0, FALSE); girara_mode_t last_index = 0; GIRARA_LIST_FOREACH(session->modes.identifiers, girara_mode_string_t*, iter, mode) if (mode->index > last_index) { last_index = mode->index; } GIRARA_LIST_FOREACH_END(session->modes.identifiers, girara_mode_string_t*, iter, mode); /* create new mode identifier */ girara_mode_string_t* mode = g_slice_new(girara_mode_string_t); mode->index = last_index + 1; mode->name = g_strdup(name); girara_list_append(session->modes.identifiers, mode); return mode->index; } void girara_mode_string_free(girara_mode_string_t* mode) { if (mode == NULL) { return; } g_free(mode->name); g_slice_free(girara_mode_string_t, mode); } girara_mode_t girara_mode_get(girara_session_t* session) { g_return_val_if_fail(session != NULL, 0); return session->modes.current_mode; } bool girara_set_window_title(girara_session_t* session, const char* name) { if (session == NULL || session->gtk.window == NULL || name == NULL) { return false; } gtk_window_set_title(GTK_WINDOW(session->gtk.window), name); return true; } girara_list_t* girara_get_command_history(girara_session_t* session) { g_return_val_if_fail(session != NULL, NULL); return girara_input_history_list(session->command_history); } girara-0.1.9/shortcuts.h0000644000175000001440000002325312242417112014046 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_SHORTCUTS_H #define GIRARA_SHORTCUTS_H #include "types.h" #include /** * Adds a shortcut * * Note: currently argument_data accepts only a character string * * @param session The used girara session * @param modifier The modifier * @param key The key * @param buffer Buffer command * @param function Executed function * @param mode Available modes * @param argument_n Argument identifier * @param argument_data Argument data * @return true No error occured * @return false An error occured */ 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); /** * Removes a shortcut * * @param session The used girara session * @param modifier The modifier * @param key The key * @param buffer Buffer command * @param mode Available modes * @return true No error occured * @return false An error occured */ bool girara_shortcut_remove(girara_session_t* session, guint modifier, guint key, const char* buffer, girara_mode_t mode); /** * Adds an inputbar shortcut * * @param session The used girara session * @param modifier The modifier * @param key The key * @param function Executed function * @param argument_n Argument identifier * @param argument_data Argument data * @return true No error occured * @return false An error occured */ bool girara_inputbar_shortcut_add(girara_session_t* session, guint modifier, guint key, girara_shortcut_function_t function, int argument_n, void* argument_data); /** * Removes an inputbar shortcut * * @param session The used girara session * @param modifier The modifier * @param key The key * @return true No error occured * @return false An error occured */ bool girara_inputbar_shortcut_remove(girara_session_t* session, guint modifier, guint key); /** * Default shortcut function to focus the inputbar * * @param session The used girara session * @param argument The argument * @param event Girara event * @param t Number of executions * @return true No error occured * @return false An error occured (abort execution) */ bool girara_sc_focus_inputbar(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t); /** * Default shortcut function to abort * * @param session The used girara session * @param argument The argument * @param event Girara event * @param t Number of executions * @return true No error occured * @return false An error occured (abort execution) */ bool girara_sc_abort(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t); /** * Default shortcut function to quit the application * * @param session The used girara session * @param argument The argument * @param event Girara event * @param t Number of executions * @return true No error occured * @return false An error occured (abort execution) */ bool girara_sc_quit(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t); /** * Closes the current tab * * @param session The used girara session * @param argument The argument * @param event Girara event * @param t Number of executions * @return true No error occured * @return false An error occured (abort execution) */ bool girara_sc_tab_close(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t); /** * Default shortcut function to navigate through tabs * * @param session The used girara session * @param argument The argument * @param event Girara event * @param t Number of execution * @return true No error occured * @return false An error occured (abort execution) */ bool girara_sc_tab_navigate(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t); /** * Navigate to the next tab * * @param session The used girara session * @param argument The used argument * @param event Girara event * @param t Number of executions * @return true if no error occured otherwise false */ bool girara_sc_tab_navigate_next(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t); /** * Navigate to the previous tab * * @param session The used girara session * @param argument The used argument * @param event Girara event * @param t Number of executions * @return true if no error occured otherwise false */ bool girara_sc_tab_navigate_prev(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t); /** * Toggles the visibility of the inputbar * * @param session The used girara session * @param argument The argument * @param event Girara event * @param t Numbr of execution * @return true No error occured * @return false An error occured (abort execution) */ bool girara_sc_toggle_inputbar(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t); /** * Toggles the visibility of the statusbar * * @param session The used girara session * @param argument The argument * @param event Girara event * @param t Numbr of execution * @return true No error occured * @return false An error occured (abort execution) */ bool girara_sc_toggle_statusbar(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t); /** * Toggles the visibility of the tabbar * * @param session The used girara session * @param argument The argument * @param event Girara event * @param t Number of execution * @return true No error occured * @return false An error occured (abort execution) */ bool girara_sc_toggle_tabbar(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t); /** * Passes the argument to the set command * * @param session The used girara session * @param argument The argument * @param event Girara event * @param t Number ofexecutions * @return true No error occured * @return false An error occured (abort execution) */ bool girara_sc_set(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t); /** * Default inputbar shortcut to abort * * @param session The used girara session * @param argument The argument * @param event Girara event * @param t Number of executions * @return true No error occured * @return false An error occured (abort execution) */ bool girara_isc_abort(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t); /** * Default inputbar shortcut that completes the given input * in the statusbar * * @param session The used girara session * @param argument The argument * @param event Girara event * @param t Number of executions * @return true No error occured * @return false An error occured (abort execution) */ bool girara_isc_completion(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t); /** * Default inputbar shortcut to manipulate the inputbar string * * @param session The used girara session * @param argument The argument * @param event Girara event * @param t Number of executions * @return true No error occured * @return false An error occured (abort execution) */ bool girara_isc_string_manipulation(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t); /** * Default inputbar shortcut to navigate through the command history * * @param session The used girara session * @param argument The argument * @param event Girara event * @param t Number of executions * @return true No error occured * @return false An error occured (abort execution) */ bool girara_isc_command_history(girara_session_t* session, girara_argument_t* argument, girara_event_t* event, unsigned int t); /** * Creates a mapping between a shortcut function and an identifier and is used * to evaluate the mapping command * * @param session The girara session * @param identifier Optional identifier * @param function The function that should be mapped * @return true if no error occured */ bool girara_shortcut_mapping_add(girara_session_t* session, const char* identifier, girara_shortcut_function_t function); /** * Creates a mapping between a shortcut argument and an identifier and is used * to evalue the mapping command * * @param session The girara session * @param identifier The identifier * @param value The value that should be represented * @return true if no error occured */ bool girara_argument_mapping_add(girara_session_t* session, const char* identifier, int value); /** * Adds a mouse event * * @param session The used girara session * @param mask The mask * @param button Pressed button * @param function Executed function * @param mode Available mode * @param event_type Event type * @param argument_n Argument identifier * @param argument_data Argument data * @return true No error occured * @return false An error occured */ 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); /** * Removes a mouse event * * @param session The used girara session * @param mask The mask * @param button Pressed button * @param mode Available mode * @return true No error occured * @return false An error occured */ bool girara_mouse_event_remove(girara_session_t* session, guint mask, guint button, girara_mode_t mode); #endif girara-0.1.9/po/0000755000175000001440000000000012242417112012250 5ustar mockusersgirara-0.1.9/po/ru.po0000644000175000001440000001065612242417112013246 0ustar mockusers# girara - language file (Russian) # See LICENSE file for license and copyright information # # Translators: msgid "" msgstr "" "Project-Id-Version: girara\n" "Report-Msgid-Bugs-To: http://bugs.pwmt.org\n" "POT-Creation-Date: 2013-11-04 20:02+0100\n" "PO-Revision-Date: 2012-05-08 17:17+0000\n" "Last-Translator: Sebastian Ramacher \n" "Language-Team: Russian (http://www.transifex.com/projects/p/girara/language/" "ru/)\n" "Language: ru\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n" "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" #. unhandled command #: ../callbacks.c:498 #, c-format msgid "Not a valid command: %s" msgstr "" #: ../commands.c:112 ../commands.c:312 #, c-format msgid "Invalid number of arguments passed: %zu instead of at least %u" msgstr "" #: ../commands.c:146 #, c-format msgid "Unregistered mode specified: %s" msgstr "" #: ../commands.c:178 #, c-format msgid "Invalid modifier in %s" msgstr "" #: ../commands.c:217 #, c-format msgid "Invalid special key value for %s" msgstr "" #: ../commands.c:253 #, c-format msgid "Invalid special key value or mode %s" msgstr "" #: ../commands.c:334 #, c-format msgid "Not a valid shortcut function: %s" msgstr "" #: ../commands.c:422 msgid "Not enough arguments." msgstr "" #: ../commands.c:427 msgid "Too many arguments." msgstr "" #: ../commands.c:440 #, c-format msgid "Unknown option: %s" msgstr "" #: ../commands.c:454 msgid "true" msgstr "" #: ../commands.c:454 msgid "false" msgstr "" #: ../commands.c:486 #, c-format msgid "No value defined for option: %s" msgstr "" #: ../commands.c:501 #, c-format msgid "Unknown value for option: %s" msgstr "" #. settings #: ../config.c:203 msgid "Font" msgstr "" #: ../config.c:204 msgid "Default foreground color" msgstr "" #: ../config.c:205 msgid "Default background color" msgstr "" #: ../config.c:206 msgid "Inputbar foreground color" msgstr "" #: ../config.c:207 msgid "Inputbar background color" msgstr "" #: ../config.c:208 msgid "Statusbar foreground color" msgstr "" #: ../config.c:209 msgid "Statsubar background color" msgstr "" #: ../config.c:210 msgid "Completion foreground color" msgstr "" #: ../config.c:211 msgid "Completion background color" msgstr "" #: ../config.c:212 msgid "Completion group foreground color" msgstr "" #: ../config.c:213 msgid "Completion group background color" msgstr "" #: ../config.c:214 msgid "Completion highlight foreground color" msgstr "" #: ../config.c:215 msgid "Completion highlight background color" msgstr "" #: ../config.c:216 msgid "Error notification foreground color" msgstr "" #: ../config.c:217 msgid "Error notification background color" msgstr "" #: ../config.c:218 msgid "Warning notification foreground color" msgstr "" #: ../config.c:219 msgid "Warning notifaction background color" msgstr "" #: ../config.c:220 msgid "Notification foreground color" msgstr "" #: ../config.c:221 msgid "Notification background color" msgstr "" #: ../config.c:222 msgid "Tab bar foreground color" msgstr "" #: ../config.c:223 msgid "Tab bar background color" msgstr "" #: ../config.c:224 msgid "Tab bar foreground color (active)" msgstr "" #: ../config.c:225 msgid "Tab bar background color (active)" msgstr "" #: ../config.c:227 msgid "Initial window width" msgstr "" #: ../config.c:228 msgid "Initial window height" msgstr "" #: ../config.c:229 msgid "Horizontal padding for the status input and notification bars" msgstr "" #: ../config.c:230 msgid "Vertical padding for the status input and notification bars" msgstr "" #: ../config.c:231 msgid "Number of completion items" msgstr "" #: ../config.c:232 msgid "Show both the horizontal and vertical scrollbars" msgstr "" #: ../config.c:233 msgid "Show the horizontal scrollbar" msgstr "" #: ../config.c:234 msgid "Show the vertical scrollbar" msgstr "" #: ../config.c:235 msgid "Window icon" msgstr "" #: ../config.c:236 msgid "Command to execute in :exec" msgstr "" #: ../config.c:237 msgid "Show or hide certain GUI elements" msgstr "" #. commands #: ../config.c:273 msgid "Execute a command" msgstr "" #: ../config.c:274 msgid "Map a key sequence" msgstr "" #: ../config.c:275 msgid "Quit the program" msgstr "" #: ../config.c:276 msgid "Set an option" msgstr "" #: ../config.c:277 msgid "Unmap a key sequence" msgstr "" #: ../utils.c:519 #, c-format msgid "Failed to execute command: %s" msgstr "" girara-0.1.9/po/pl.po0000644000175000001440000001336712242417112013235 0ustar mockusers# girara - language file (Polish) # See LICENSE file for license and copyright information # # Translators: # p , 2012. msgid "" msgstr "" "Project-Id-Version: girara\n" "Report-Msgid-Bugs-To: http://bugs.pwmt.org\n" "POT-Creation-Date: 2013-11-04 20:02+0100\n" "PO-Revision-Date: 2013-08-15 00:25+0200\n" "Last-Translator: p \n" "Language-Team: Polish (http://www.transifex.net/projects/p/girara/language/" "pl/)\n" "Language: pl\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2)\n" #. unhandled command #: ../callbacks.c:498 #, c-format msgid "Not a valid command: %s" msgstr "Nieprawidłowa funkcja skrótu: %s" #: ../commands.c:112 ../commands.c:312 #, c-format msgid "Invalid number of arguments passed: %zu instead of at least %u" msgstr "Nieprawidłowa liczba parametrów polecenia: %zu zamiast co najmniej %u" #: ../commands.c:146 #, c-format msgid "Unregistered mode specified: %s" msgstr "Wybrano nieistniejący tryb: %s" #: ../commands.c:178 #, c-format msgid "Invalid modifier in %s" msgstr "Nieprawidłowy klawisz modyfikujący: %s" #: ../commands.c:217 #, c-format msgid "Invalid special key value for %s" msgstr "Nieprawidłowa wartość klawisza: %s" #: ../commands.c:253 #, c-format msgid "Invalid special key value or mode %s" msgstr "Nieprawidłowa wartość klawisza lub trybu: %s" #: ../commands.c:334 #, c-format msgid "Not a valid shortcut function: %s" msgstr "Nieprawidłowa funkcja skrótu: %s" #: ../commands.c:422 msgid "Not enough arguments." msgstr "Za mało parametrów polecenia" #: ../commands.c:427 msgid "Too many arguments." msgstr "Za dużo parametrów polecenia" #: ../commands.c:440 #, c-format msgid "Unknown option: %s" msgstr "Nieznana opcja: %s" #: ../commands.c:454 msgid "true" msgstr "prawda" #: ../commands.c:454 msgid "false" msgstr "fałsz" #: ../commands.c:486 #, c-format msgid "No value defined for option: %s" msgstr "Niezdefiniowana wartość opcji: %s" #: ../commands.c:501 #, c-format msgid "Unknown value for option: %s" msgstr "Nieznana wartość opcji: %s" #. settings #: ../config.c:203 msgid "Font" msgstr "Font" #: ../config.c:204 msgid "Default foreground color" msgstr "Domyślny kolor pierwszoplanowy" #: ../config.c:205 msgid "Default background color" msgstr "Domyślny kolor tła" #: ../config.c:206 msgid "Inputbar foreground color" msgstr "Kolor tekstu w polu wprowadzania" #: ../config.c:207 msgid "Inputbar background color" msgstr "Kolor tła pola wprowadzania" #: ../config.c:208 msgid "Statusbar foreground color" msgstr "Kolor tekstu w pasku stanu" #: ../config.c:209 msgid "Statsubar background color" msgstr "Kolor tła paska stanu" #: ../config.c:210 msgid "Completion foreground color" msgstr "Kolor tekstu wyróżnienia" #: ../config.c:211 msgid "Completion background color" msgstr "Kolor tła wyróżnienia" #: ../config.c:212 msgid "Completion group foreground color" msgstr "Kolor tekstu wyróżnionej grupy " #: ../config.c:213 msgid "Completion group background color" msgstr "Kolor tła wyróżnionej grupy" #: ../config.c:214 msgid "Completion highlight foreground color" msgstr "Kolor tekstu bieżącego wyróżnienia" #: ../config.c:215 msgid "Completion highlight background color" msgstr "Kolor tła bieżącego wyróżnienia" #: ../config.c:216 msgid "Error notification foreground color" msgstr "Kolor tekstu powiadomienia o błędzie" #: ../config.c:217 msgid "Error notification background color" msgstr "Kolor tła powiadomienia o błędzie" #: ../config.c:218 msgid "Warning notification foreground color" msgstr "Kolor tekstu ostrzeżenia" #: ../config.c:219 msgid "Warning notifaction background color" msgstr "Kolor tła ostrzeżenia" #: ../config.c:220 msgid "Notification foreground color" msgstr "Kolor tekstu powiadomienia" #: ../config.c:221 msgid "Notification background color" msgstr "Kolor tła powiadomienia" #: ../config.c:222 msgid "Tab bar foreground color" msgstr "Kolor tekstu paska kart" #: ../config.c:223 msgid "Tab bar background color" msgstr "Kolor tła paska kart" #: ../config.c:224 msgid "Tab bar foreground color (active)" msgstr "Kolor tekstu bieżącej karty" #: ../config.c:225 msgid "Tab bar background color (active)" msgstr "Kolor tła bieżącej karty" #: ../config.c:227 msgid "Initial window width" msgstr "Początkowa szerokość okna" #: ../config.c:228 msgid "Initial window height" msgstr "Początkowa wysokość okna" #: ../config.c:229 msgid "Horizontal padding for the status input and notification bars" msgstr "" #: ../config.c:230 msgid "Vertical padding for the status input and notification bars" msgstr "" #: ../config.c:231 msgid "Number of completion items" msgstr "Liczba wyróżnień" #: ../config.c:232 msgid "Show both the horizontal and vertical scrollbars" msgstr "" #: ../config.c:233 msgid "Show the horizontal scrollbar" msgstr "" #: ../config.c:234 msgid "Show the vertical scrollbar" msgstr "" #: ../config.c:235 msgid "Window icon" msgstr "Ikona okna" #: ../config.c:236 msgid "Command to execute in :exec" msgstr "Polecenie uruchomienia w :exec" #: ../config.c:237 msgid "Show or hide certain GUI elements" msgstr "Pokaż/ukryj niektóre elementy interfejsu." #. commands #: ../config.c:273 msgid "Execute a command" msgstr "Wykonaj polecenie" #: ../config.c:274 msgid "Map a key sequence" msgstr "Dowiąż sekwencję klawiszy" #: ../config.c:275 msgid "Quit the program" msgstr "Zakończ program" #: ../config.c:276 msgid "Set an option" msgstr "Ustaw opcję" #: ../config.c:277 msgid "Unmap a key sequence" msgstr "Usuń sekwencję klawiszy" #: ../utils.c:519 #, c-format msgid "Failed to execute command: %s" msgstr "Nieudane uruchomienie polecenia: %s" girara-0.1.9/po/eo.po0000644000175000001440000001302312242417112013212 0ustar mockusers# girara - language file (Esperanto) # See LICENSE file for license and copyright information # # Translators: msgid "" msgstr "" "Project-Id-Version: girara\n" "Report-Msgid-Bugs-To: http://bugs.pwmt.org\n" "POT-Creation-Date: 2013-11-04 20:02+0100\n" "PO-Revision-Date: 2013-08-15 00:25+0200\n" "Last-Translator: Sebastian Ramacher \n" "Language-Team: LANGUAGE \n" "Language: eo\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #. unhandled command #: ../callbacks.c:498 #, c-format msgid "Not a valid command: %s" msgstr "Nevalida kurtnomo de funkcio: %s" #: ../commands.c:112 ../commands.c:312 #, c-format msgid "Invalid number of arguments passed: %zu instead of at least %u" msgstr "Nevalida nombro da argumentoj transdonita: %zu anstataŭ de almenaŭ %u" #: ../commands.c:146 #, c-format msgid "Unregistered mode specified: %s" msgstr "Neregistrita modo specifita: %s" #: ../commands.c:178 #, c-format msgid "Invalid modifier in %s" msgstr "Nevalida modifilo en %s" #: ../commands.c:217 #, c-format msgid "Invalid special key value for %s" msgstr "Nevalida speciala klavvaloro por %s" #: ../commands.c:253 #, c-format msgid "Invalid special key value or mode %s" msgstr "Nevalida speciala klavvaloro aŭ reĝimo %s" #: ../commands.c:334 #, c-format msgid "Not a valid shortcut function: %s" msgstr "Nevalida kurtnomo de funkcio: %s" #: ../commands.c:422 msgid "Not enough arguments." msgstr "Ne sufiĉe da argumentoj." #: ../commands.c:427 msgid "Too many arguments." msgstr "Tro multe da argumentoj." #: ../commands.c:440 #, c-format msgid "Unknown option: %s" msgstr "Nekonata opcio: %s" #: ../commands.c:454 msgid "true" msgstr "vero" #: ../commands.c:454 msgid "false" msgstr "falso" #: ../commands.c:486 #, c-format msgid "No value defined for option: %s" msgstr "Neniu valoro difinita por opcio: %s" #: ../commands.c:501 #, c-format msgid "Unknown value for option: %s" msgstr "Nekonata valoro por opcio: %s" #. settings #: ../config.c:203 msgid "Font" msgstr "Tiparo" #: ../config.c:204 msgid "Default foreground color" msgstr "Defaŭlta malfona koloro" #: ../config.c:205 msgid "Default background color" msgstr "Defaŭlta fona koloro" #: ../config.c:206 msgid "Inputbar foreground color" msgstr "Malfona koloro de enigbreto" #: ../config.c:207 msgid "Inputbar background color" msgstr "Fona koloro de enigbreto" #: ../config.c:208 msgid "Statusbar foreground color" msgstr "Malfona koloro de statbreto" #: ../config.c:209 msgid "Statsubar background color" msgstr "Fona koloro de statbreto" #: ../config.c:210 msgid "Completion foreground color" msgstr "Malfona koloro de kompletigo" #: ../config.c:211 msgid "Completion background color" msgstr "Fona koloro de kompletigo" #: ../config.c:212 msgid "Completion group foreground color" msgstr "Malfona koloro de kompletiga grupo" #: ../config.c:213 msgid "Completion group background color" msgstr "Fona koloro de kompletiga grupo" #: ../config.c:214 msgid "Completion highlight foreground color" msgstr "Malfonluma koloro de kompletigo" #: ../config.c:215 msgid "Completion highlight background color" msgstr "Fonluma koloro de kompletigo" #: ../config.c:216 msgid "Error notification foreground color" msgstr "Malfona koloro de erarsciigo" #: ../config.c:217 msgid "Error notification background color" msgstr "Fona koloro de erarsciigo" #: ../config.c:218 msgid "Warning notification foreground color" msgstr "Malfona koloro de avertsciigo" #: ../config.c:219 msgid "Warning notifaction background color" msgstr "Fona koloro de avertsciigo" #: ../config.c:220 msgid "Notification foreground color" msgstr "Malfona koloro de sciigo" #: ../config.c:221 msgid "Notification background color" msgstr "Fona koloro de sciigo" #: ../config.c:222 msgid "Tab bar foreground color" msgstr "Malfona koloro de slipbreto" #: ../config.c:223 msgid "Tab bar background color" msgstr "Fona koloro de slipbreto" #: ../config.c:224 msgid "Tab bar foreground color (active)" msgstr "Malfona koloro de slipbreto (aktiva)" #: ../config.c:225 msgid "Tab bar background color (active)" msgstr "Fona koloro de slipbreto (aktiva)" #: ../config.c:227 msgid "Initial window width" msgstr "Larĝeco de inita fenestro" #: ../config.c:228 msgid "Initial window height" msgstr "Alteco de inita fenestro" #: ../config.c:229 msgid "Horizontal padding for the status input and notification bars" msgstr "" #: ../config.c:230 msgid "Vertical padding for the status input and notification bars" msgstr "" #: ../config.c:231 msgid "Number of completion items" msgstr "Nombro da kompletigeroj" #: ../config.c:232 msgid "Show both the horizontal and vertical scrollbars" msgstr "" #: ../config.c:233 msgid "Show the horizontal scrollbar" msgstr "" #: ../config.c:234 msgid "Show the vertical scrollbar" msgstr "" #: ../config.c:235 msgid "Window icon" msgstr "Fenestra piktogramo" #: ../config.c:236 msgid "Command to execute in :exec" msgstr "Komando por plenumi en :exec" #: ../config.c:237 msgid "Show or hide certain GUI elements" msgstr "" #. commands #: ../config.c:273 msgid "Execute a command" msgstr "Plenumi komandon" #: ../config.c:274 msgid "Map a key sequence" msgstr "Mapu klavan sinsekvon" #: ../config.c:275 msgid "Quit the program" msgstr "Eliru el programo" #: ../config.c:276 msgid "Set an option" msgstr "Agordu opcion" #: ../config.c:277 msgid "Unmap a key sequence" msgstr "Malmapu klavan sinsekvon" #: ../utils.c:519 #, c-format msgid "Failed to execute command: %s" msgstr "Fiaskis plenumi komandon: %s" girara-0.1.9/po/it.po0000644000175000001440000001361012242417112013225 0ustar mockusers# girara - language file (Italian) # See LICENSE file for license and copyright information # # Translators: # TheLemonMan , 2012 msgid "" msgstr "" "Project-Id-Version: girara\n" "Report-Msgid-Bugs-To: http://bugs.pwmt.org\n" "POT-Creation-Date: 2013-11-04 20:02+0100\n" "PO-Revision-Date: 2013-08-15 00:25+0200\n" "Last-Translator: TheLemonMan \n" "Language-Team: Italian (http://www.transifex.net/projects/p/girara/language/" "it/)\n" "Language: it\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #. unhandled command #: ../callbacks.c:498 #, c-format msgid "Not a valid command: %s" msgstr "Scorciatoia invalida:%s" #: ../commands.c:112 ../commands.c:312 #, c-format msgid "Invalid number of arguments passed: %zu instead of at least %u" msgstr "Numero degli argomenti non valido:%zu immessi, %u attesi" #: ../commands.c:146 #, c-format msgid "Unregistered mode specified: %s" msgstr "Modalità non registrata:%s" #: ../commands.c:178 #, c-format msgid "Invalid modifier in %s" msgstr "Modificatore invalido in %s" #: ../commands.c:217 #, c-format msgid "Invalid special key value for %s" msgstr "Valore della chiave speciale %s non valido " #: ../commands.c:253 #, c-format msgid "Invalid special key value or mode %s" msgstr "Valore della chiave speciale o modalità %s non valida" #: ../commands.c:334 #, c-format msgid "Not a valid shortcut function: %s" msgstr "Scorciatoia invalida:%s" #: ../commands.c:422 msgid "Not enough arguments." msgstr "Non abbastanza argomenti specificati." #: ../commands.c:427 msgid "Too many arguments." msgstr "Troppi argomenti specificati." #: ../commands.c:440 #, c-format msgid "Unknown option: %s" msgstr "Opzione sconosciuta:%s" #: ../commands.c:454 msgid "true" msgstr "vero" #: ../commands.c:454 msgid "false" msgstr "falso" #: ../commands.c:486 #, c-format msgid "No value defined for option: %s" msgstr "Nessun valore definito per l' opzione:%s" #: ../commands.c:501 #, c-format msgid "Unknown value for option: %s" msgstr "Valore sconosciuto per l' opzione:%s" #. settings #: ../config.c:203 msgid "Font" msgstr "Font" #: ../config.c:204 msgid "Default foreground color" msgstr "Colore del testo di default" #: ../config.c:205 msgid "Default background color" msgstr "Colore di sfondo di default" #: ../config.c:206 msgid "Inputbar foreground color" msgstr "Colore del testo della barra dei comandi" #: ../config.c:207 msgid "Inputbar background color" msgstr "Colore di sfondo della barra dei comandi" #: ../config.c:208 msgid "Statusbar foreground color" msgstr "Colore del testo della barra di stato" #: ../config.c:209 msgid "Statsubar background color" msgstr "Colore di sfondo della barra di stato" #: ../config.c:210 msgid "Completion foreground color" msgstr "Colore del testo del completamento" #: ../config.c:211 msgid "Completion background color" msgstr "Colore di sfondo del completamento" #: ../config.c:212 msgid "Completion group foreground color" msgstr "Colore del testo del gruppo di completamento" #: ../config.c:213 msgid "Completion group background color" msgstr "Colore di sfondo del gruppo di completamento" #: ../config.c:214 msgid "Completion highlight foreground color" msgstr "Colore del testo del completamento evidenziato" #: ../config.c:215 msgid "Completion highlight background color" msgstr "Colore di sfondo del completamento evidenziato" #: ../config.c:216 msgid "Error notification foreground color" msgstr "Colore del testo della notifica di errore" #: ../config.c:217 msgid "Error notification background color" msgstr "Colore di sfondo della notifica di errore" #: ../config.c:218 msgid "Warning notification foreground color" msgstr "Colore del testo della notifica d' avvertimento" #: ../config.c:219 msgid "Warning notifaction background color" msgstr "Colore di sfondo della notifica d' avvertimento" #: ../config.c:220 msgid "Notification foreground color" msgstr "Colore del testo della notifica" #: ../config.c:221 msgid "Notification background color" msgstr "Colore di sfondo della notifica" #: ../config.c:222 msgid "Tab bar foreground color" msgstr "Colore del testo del tab" #: ../config.c:223 msgid "Tab bar background color" msgstr "Colore di sfondo del tab" #: ../config.c:224 msgid "Tab bar foreground color (active)" msgstr "Colore del testo del tab (attivo)" #: ../config.c:225 msgid "Tab bar background color (active)" msgstr "Colore di sfondo del tab (attivo)" #: ../config.c:227 msgid "Initial window width" msgstr "Larghezza iniziale della finestra" #: ../config.c:228 msgid "Initial window height" msgstr "Altezza iniziale della finestra" #: ../config.c:229 msgid "Horizontal padding for the status input and notification bars" msgstr "" #: ../config.c:230 msgid "Vertical padding for the status input and notification bars" msgstr "" #: ../config.c:231 msgid "Number of completion items" msgstr "Numero di possibili completamenti" #: ../config.c:232 msgid "Show both the horizontal and vertical scrollbars" msgstr "" #: ../config.c:233 msgid "Show the horizontal scrollbar" msgstr "" #: ../config.c:234 msgid "Show the vertical scrollbar" msgstr "" #: ../config.c:235 msgid "Window icon" msgstr "Icona della finestra" #: ../config.c:236 msgid "Command to execute in :exec" msgstr "Comando da eseguire in :exec" #: ../config.c:237 msgid "Show or hide certain GUI elements" msgstr "" #. commands #: ../config.c:273 msgid "Execute a command" msgstr "Esegui un comando" #: ../config.c:274 msgid "Map a key sequence" msgstr "Mappa una sequenza di tasti" #: ../config.c:275 msgid "Quit the program" msgstr "Esci dal programma" #: ../config.c:276 msgid "Set an option" msgstr "Imposta un opzione" #: ../config.c:277 msgid "Unmap a key sequence" msgstr "Cancella mappatura di una sequenza di tasti" #: ../utils.c:519 #, c-format msgid "Failed to execute command: %s" msgstr "Impossibile eseguire:%s" girara-0.1.9/po/de.po0000644000175000001440000001417312242417112013206 0ustar mockusers# girara - language file (German) # See LICENSE file for license and copyright information # # Translators: # , 2012 # Mario Blättermann , 2012 # Moritz Lipp , 2012 msgid "" msgstr "" "Project-Id-Version: girara\n" "Report-Msgid-Bugs-To: http://bugs.pwmt.org\n" "POT-Creation-Date: 2013-11-04 20:02+0100\n" "PO-Revision-Date: 2013-08-15 00:24+0200\n" "Last-Translator: Sebastian Ramacher \n" "Language-Team: German (http://www.transifex.com/projects/p/girara/language/" "de/)\n" "Language: de\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #. unhandled command #: ../callbacks.c:498 #, c-format msgid "Not a valid command: %s" msgstr "Ungültige zugewiesene Funktion: %s" #: ../commands.c:112 ../commands.c:312 #, c-format msgid "Invalid number of arguments passed: %zu instead of at least %u" msgstr "" "Ungülitige Anzahl an Argumente übergeben: %zu anstatt von mindestens %u" #: ../commands.c:146 #, c-format msgid "Unregistered mode specified: %s" msgstr "Modus ist nicht registriert: %s" #: ../commands.c:178 #, c-format msgid "Invalid modifier in %s" msgstr "Ungültiger Modifikator in %s" #: ../commands.c:217 #, c-format msgid "Invalid special key value for %s" msgstr "Ungültige Sondertaste für %s" #: ../commands.c:253 #, c-format msgid "Invalid special key value or mode %s" msgstr "Ungültige Sondertaste oder Modus %s" #: ../commands.c:334 #, c-format msgid "Not a valid shortcut function: %s" msgstr "Ungültige zugewiesene Funktion: %s" #: ../commands.c:422 msgid "Not enough arguments." msgstr "Zu wenige Argumente." #: ../commands.c:427 msgid "Too many arguments." msgstr "Zu viele Argumente." #: ../commands.c:440 #, c-format msgid "Unknown option: %s" msgstr "Unbekannte Otion: %s" #: ../commands.c:454 msgid "true" msgstr "wahr" #: ../commands.c:454 msgid "false" msgstr "falsch" #: ../commands.c:486 #, c-format msgid "No value defined for option: %s" msgstr "Kein Wert für Option definiert: %s" #: ../commands.c:501 #, c-format msgid "Unknown value for option: %s" msgstr "Unbekannter Wert für Option: %s" #. settings #: ../config.c:203 msgid "Font" msgstr "Schriftart" #: ../config.c:204 msgid "Default foreground color" msgstr "Standardfarbe des Vordergrunds" #: ../config.c:205 msgid "Default background color" msgstr "Standardfarbe des Hintergrunds" #: ../config.c:206 msgid "Inputbar foreground color" msgstr "Vordergrundfarbe der Eingabezeile" #: ../config.c:207 msgid "Inputbar background color" msgstr "Hintergrundfarbe der Eingabezeile" #: ../config.c:208 msgid "Statusbar foreground color" msgstr "Vordergrundfarbe der Statuszeile" #: ../config.c:209 msgid "Statsubar background color" msgstr "Hintergrundfarbe der Statuszeile" #: ../config.c:210 msgid "Completion foreground color" msgstr "Vordergrundfarbe der Vervollständigung" #: ../config.c:211 msgid "Completion background color" msgstr "Hintergrundfarbe der Vervollständigung" #: ../config.c:212 msgid "Completion group foreground color" msgstr "Vordergrundfarbe der Vervollständigung (Gruppe)" #: ../config.c:213 msgid "Completion group background color" msgstr "Hintergrundfarbe der Vervollständigung (Gruppe)" #: ../config.c:214 msgid "Completion highlight foreground color" msgstr "Vordergrundfarbe der Vervollständigung (Hervorhebung)" #: ../config.c:215 msgid "Completion highlight background color" msgstr "Hintergrundfarbe der Vervollständigung (Hervorhebung)" #: ../config.c:216 msgid "Error notification foreground color" msgstr "Vordergrundfarbe der Benachrichtigung (Fehler)" #: ../config.c:217 msgid "Error notification background color" msgstr "Hintergrundfarbe der Benachrichtigung (Fehler)" #: ../config.c:218 msgid "Warning notification foreground color" msgstr "Vordergrundfarbe der Benachrichtigung (Warnung)" #: ../config.c:219 msgid "Warning notifaction background color" msgstr "Hintergrundfarbe der Benachrichtigung (Warnung)" #: ../config.c:220 msgid "Notification foreground color" msgstr "Vordergrundfarbe der Benachrichtigung" #: ../config.c:221 msgid "Notification background color" msgstr "Hintergrundfarbe der Benachrichtigung" #: ../config.c:222 msgid "Tab bar foreground color" msgstr "Registerleisten Vordergrundfarbe" #: ../config.c:223 msgid "Tab bar background color" msgstr "Registerleisten Hintergrundfarbe" #: ../config.c:224 msgid "Tab bar foreground color (active)" msgstr "Registerleisten Vordergrundfarbe (aktiv)" #: ../config.c:225 msgid "Tab bar background color (active)" msgstr "Registerleisten Hintergrundfarbe (aktiv)" #: ../config.c:227 msgid "Initial window width" msgstr "Ausgangsbreite des Fensters" #: ../config.c:228 msgid "Initial window height" msgstr "Ausgangshöhe des Fensters" #: ../config.c:229 msgid "Horizontal padding for the status input and notification bars" msgstr "" #: ../config.c:230 msgid "Vertical padding for the status input and notification bars" msgstr "" #: ../config.c:231 msgid "Number of completion items" msgstr "Anzahl der Elemente in der Vervollständigung" #: ../config.c:232 msgid "Show both the horizontal and vertical scrollbars" msgstr "" #: ../config.c:233 msgid "Show the horizontal scrollbar" msgstr "Zeige horizontale Bildlaufleiste" #: ../config.c:234 msgid "Show the vertical scrollbar" msgstr "Zeige vertikale Bildlaufleiste" #: ../config.c:235 msgid "Window icon" msgstr "Fenstericon" #: ../config.c:236 msgid "Command to execute in :exec" msgstr "Befehl, der von :exec ausgeführt werden soll" #: ../config.c:237 msgid "Show or hide certain GUI elements" msgstr "Zeige oder verstecke bestimmte GUI Elemente" #. commands #: ../config.c:273 msgid "Execute a command" msgstr "Führe einen Befehl aus." #: ../config.c:274 msgid "Map a key sequence" msgstr "Tastenfolge zuweisen" #: ../config.c:275 msgid "Quit the program" msgstr "Beende das Programm" #: ../config.c:276 msgid "Set an option" msgstr "Setze eine Option" #: ../config.c:277 msgid "Unmap a key sequence" msgstr "Tastenfolge entbinden" #: ../utils.c:519 #, c-format msgid "Failed to execute command: %s" msgstr "Konnte Befehl nicht ausführen: %s" girara-0.1.9/po/he.po0000644000175000001440000001060612242417112013207 0ustar mockusers# SOME DESCRIPTIVE TITLE. # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER # This file is distributed under the same license as the PACKAGE package. # # Translators: msgid "" msgstr "" "Project-Id-Version: girara\n" "Report-Msgid-Bugs-To: \n" "POT-Creation-Date: 2013-11-04 20:02+0100\n" "PO-Revision-Date: 2013-11-04 19:04+0000\n" "Last-Translator: Sebastian Ramacher \n" "Language-Team: Hebrew (http://www.transifex.com/projects/p/girara/language/he/)\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: he\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. unhandled command #: ../callbacks.c:498 #, c-format msgid "Not a valid command: %s" msgstr "" #: ../commands.c:112 ../commands.c:312 #, c-format msgid "Invalid number of arguments passed: %zu instead of at least %u" msgstr "" #: ../commands.c:146 #, c-format msgid "Unregistered mode specified: %s" msgstr "" #: ../commands.c:178 #, c-format msgid "Invalid modifier in %s" msgstr "" #: ../commands.c:217 #, c-format msgid "Invalid special key value for %s" msgstr "" #: ../commands.c:253 #, c-format msgid "Invalid special key value or mode %s" msgstr "" #: ../commands.c:334 #, c-format msgid "Not a valid shortcut function: %s" msgstr "" #: ../commands.c:422 msgid "Not enough arguments." msgstr "" #: ../commands.c:427 msgid "Too many arguments." msgstr "" #: ../commands.c:440 #, c-format msgid "Unknown option: %s" msgstr "" #: ../commands.c:454 msgid "true" msgstr "" #: ../commands.c:454 msgid "false" msgstr "" #: ../commands.c:486 #, c-format msgid "No value defined for option: %s" msgstr "" #: ../commands.c:501 #, c-format msgid "Unknown value for option: %s" msgstr "" #. settings #: ../config.c:203 msgid "Font" msgstr "" #: ../config.c:204 msgid "Default foreground color" msgstr "" #: ../config.c:205 msgid "Default background color" msgstr "" #: ../config.c:206 msgid "Inputbar foreground color" msgstr "" #: ../config.c:207 msgid "Inputbar background color" msgstr "" #: ../config.c:208 msgid "Statusbar foreground color" msgstr "" #: ../config.c:209 msgid "Statsubar background color" msgstr "" #: ../config.c:210 msgid "Completion foreground color" msgstr "" #: ../config.c:211 msgid "Completion background color" msgstr "" #: ../config.c:212 msgid "Completion group foreground color" msgstr "" #: ../config.c:213 msgid "Completion group background color" msgstr "" #: ../config.c:214 msgid "Completion highlight foreground color" msgstr "" #: ../config.c:215 msgid "Completion highlight background color" msgstr "" #: ../config.c:216 msgid "Error notification foreground color" msgstr "" #: ../config.c:217 msgid "Error notification background color" msgstr "" #: ../config.c:218 msgid "Warning notification foreground color" msgstr "" #: ../config.c:219 msgid "Warning notifaction background color" msgstr "" #: ../config.c:220 msgid "Notification foreground color" msgstr "" #: ../config.c:221 msgid "Notification background color" msgstr "" #: ../config.c:222 msgid "Tab bar foreground color" msgstr "" #: ../config.c:223 msgid "Tab bar background color" msgstr "" #: ../config.c:224 msgid "Tab bar foreground color (active)" msgstr "" #: ../config.c:225 msgid "Tab bar background color (active)" msgstr "" #: ../config.c:227 msgid "Initial window width" msgstr "" #: ../config.c:228 msgid "Initial window height" msgstr "" #: ../config.c:229 msgid "Horizontal padding for the status input and notification bars" msgstr "" #: ../config.c:230 msgid "Vertical padding for the status input and notification bars" msgstr "" #: ../config.c:231 msgid "Number of completion items" msgstr "" #: ../config.c:232 msgid "Show both the horizontal and vertical scrollbars" msgstr "" #: ../config.c:233 msgid "Show the horizontal scrollbar" msgstr "" #: ../config.c:234 msgid "Show the vertical scrollbar" msgstr "" #: ../config.c:235 msgid "Window icon" msgstr "" #: ../config.c:236 msgid "Command to execute in :exec" msgstr "" #: ../config.c:237 msgid "Show or hide certain GUI elements" msgstr "" #. commands #: ../config.c:273 msgid "Execute a command" msgstr "" #: ../config.c:274 msgid "Map a key sequence" msgstr "" #: ../config.c:275 msgid "Quit the program" msgstr "" #: ../config.c:276 msgid "Set an option" msgstr "" #: ../config.c:277 msgid "Unmap a key sequence" msgstr "" #: ../utils.c:519 #, c-format msgid "Failed to execute command: %s" msgstr "" girara-0.1.9/po/es.po0000644000175000001440000001356412242417112013230 0ustar mockusers# girara - language file (Spanish) # See LICENSE file for license and copyright information # # Translators: # Moritz Lipp , 2012. msgid "" msgstr "" "Project-Id-Version: girara\n" "Report-Msgid-Bugs-To: http://bugs.pwmt.org\n" "POT-Creation-Date: 2013-11-04 20:02+0100\n" "PO-Revision-Date: 2013-08-15 00:25+0200\n" "Last-Translator: Sebastian Ramacher \n" "Language-Team: Spanish (Castilian) (http://www.transifex.net/projects/p/" "girara/language/es/)\n" "Language: es\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" #. unhandled command #: ../callbacks.c:498 #, c-format msgid "Not a valid command: %s" msgstr "Función 'atajo' no valida: %s" #: ../commands.c:112 ../commands.c:312 #, c-format msgid "Invalid number of arguments passed: %zu instead of at least %u" msgstr "Número de argumentos invalido: %zu, cuando se necesitan al menos %u" #: ../commands.c:146 #, c-format msgid "Unregistered mode specified: %s" msgstr "Modo no registrado especificado: %s" #: ../commands.c:178 #, c-format msgid "Invalid modifier in %s" msgstr "Modificador inválido en %s" #: ../commands.c:217 #, c-format msgid "Invalid special key value for %s" msgstr "Valor de tecla especial inválido para %s" #: ../commands.c:253 #, c-format msgid "Invalid special key value or mode %s" msgstr "Valor o modo de tecla especial inválido para %s" #: ../commands.c:334 #, c-format msgid "Not a valid shortcut function: %s" msgstr "Función 'atajo' no valida: %s" #: ../commands.c:422 msgid "Not enough arguments." msgstr "Número de argumentos insuficiente." #: ../commands.c:427 msgid "Too many arguments." msgstr "Demasiados argumentos." #: ../commands.c:440 #, c-format msgid "Unknown option: %s" msgstr "Opción desconocida: %s" #: ../commands.c:454 msgid "true" msgstr "cierto" #: ../commands.c:454 msgid "false" msgstr "falso" #: ../commands.c:486 #, c-format msgid "No value defined for option: %s" msgstr "Valor indefinido para la opción: %s" #: ../commands.c:501 #, c-format msgid "Unknown value for option: %s" msgstr "Valor desconocido para la opción: %s" #. settings #: ../config.c:203 msgid "Font" msgstr "Fuente" #: ../config.c:204 msgid "Default foreground color" msgstr "Color por omisión" #: ../config.c:205 msgid "Default background color" msgstr "Color de fondo por omisión" #: ../config.c:206 msgid "Inputbar foreground color" msgstr "Color de la barra de entrada" #: ../config.c:207 msgid "Inputbar background color" msgstr "Color de fondo de la barra de entrada" #: ../config.c:208 msgid "Statusbar foreground color" msgstr "Color de la barra de estado" #: ../config.c:209 msgid "Statsubar background color" msgstr "Color de fondo de la barra de estado" #: ../config.c:210 msgid "Completion foreground color" msgstr "Color de completado" #: ../config.c:211 msgid "Completion background color" msgstr "Color de fondo de completado" #: ../config.c:212 msgid "Completion group foreground color" msgstr "Color de los grupos de completado" #: ../config.c:213 msgid "Completion group background color" msgstr "Color de fondo de los grupos de completado" #: ../config.c:214 msgid "Completion highlight foreground color" msgstr "Color de la entrada de completado destacada" #: ../config.c:215 msgid "Completion highlight background color" msgstr "Color de fondo de la entrada de completado destacada" #: ../config.c:216 msgid "Error notification foreground color" msgstr "Color de las notificaciones de error" #: ../config.c:217 msgid "Error notification background color" msgstr "Color de fondo de las notificaciones de error" #: ../config.c:218 msgid "Warning notification foreground color" msgstr "Color de las advertencias" #: ../config.c:219 msgid "Warning notifaction background color" msgstr "Color de fondo de las advertencias" #: ../config.c:220 msgid "Notification foreground color" msgstr "Color de las notificaciones" #: ../config.c:221 msgid "Notification background color" msgstr "Color de fondo de las notificaciones" #: ../config.c:222 msgid "Tab bar foreground color" msgstr "Color de la barra 'tabulador'" #: ../config.c:223 msgid "Tab bar background color" msgstr "Color de fondo de la barra 'tabulador'" #: ../config.c:224 msgid "Tab bar foreground color (active)" msgstr "Color de la barra 'tabulador' (activa)" #: ../config.c:225 msgid "Tab bar background color (active)" msgstr "Color de fondo de la barra 'tabulador' (activa)" #: ../config.c:227 msgid "Initial window width" msgstr "Anchura inicial de la ventana" #: ../config.c:228 msgid "Initial window height" msgstr "Altura inicial de la ventana" #: ../config.c:229 msgid "Horizontal padding for the status input and notification bars" msgstr "" #: ../config.c:230 msgid "Vertical padding for the status input and notification bars" msgstr "" #: ../config.c:231 msgid "Number of completion items" msgstr "Número de elementos en el completado" #: ../config.c:232 msgid "Show both the horizontal and vertical scrollbars" msgstr "" #: ../config.c:233 msgid "Show the horizontal scrollbar" msgstr "" #: ../config.c:234 msgid "Show the vertical scrollbar" msgstr "" #: ../config.c:235 msgid "Window icon" msgstr "Icono de la ventana" #: ../config.c:236 msgid "Command to execute in :exec" msgstr "Comando a ejecutar en :exec" #: ../config.c:237 msgid "Show or hide certain GUI elements" msgstr "" #. commands #: ../config.c:273 msgid "Execute a command" msgstr "Ejecutar un comando" #: ../config.c:274 msgid "Map a key sequence" msgstr "Mapear una secuéncia de teclas" #: ../config.c:275 msgid "Quit the program" msgstr "Salir del programa" #: ../config.c:276 msgid "Set an option" msgstr "Asignar un valor a una opción" #: ../config.c:277 msgid "Unmap a key sequence" msgstr "Quitar el mapeo de una secuencia de teclas" #: ../utils.c:519 #, c-format msgid "Failed to execute command: %s" msgstr "No se pudo ejecutar el comando: %s" girara-0.1.9/po/tr.po0000644000175000001440000001364012242417112013241 0ustar mockusers# girara - language file (Turkish) # See LICENSE file for license and copyright information # # Translators: # hsngrms , 2012 # femnad , 2012 msgid "" msgstr "" "Project-Id-Version: girara\n" "Report-Msgid-Bugs-To: http://bugs.pwmt.org\n" "POT-Creation-Date: 2013-11-04 20:02+0100\n" "PO-Revision-Date: 2013-11-04 19:04+0000\n" "Last-Translator: femnad \n" "Language-Team: Turkish (http://www.transifex.net/projects/p/girara/language/" "tr/)\n" "Language: tr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0\n" #. unhandled command #: ../callbacks.c:498 #, c-format msgid "Not a valid command: %s" msgstr "Geçerli bir kısayol fonksiyonu değil: %s" #: ../commands.c:112 ../commands.c:312 #, c-format msgid "Invalid number of arguments passed: %zu instead of at least %u" msgstr "" "Yanlış sayıda argüman geçildi: %zu adet argüman geçildi, oysa en az %u adet " "argüman olması gerekiyor" #: ../commands.c:146 #, c-format msgid "Unregistered mode specified: %s" msgstr "Kayıtlı olmayan mod belirtildi: %s" #: ../commands.c:178 #, c-format msgid "Invalid modifier in %s" msgstr "%s içinde geçersiz dönüştürücü" #: ../commands.c:217 #, c-format msgid "Invalid special key value for %s" msgstr "%s için geçersiz özel tuş" #: ../commands.c:253 #, c-format msgid "Invalid special key value or mode %s" msgstr "%s için geçersiz tuş özel veya mod" #: ../commands.c:334 #, c-format msgid "Not a valid shortcut function: %s" msgstr "Geçerli bir kısayol fonksiyonu değil: %s" #: ../commands.c:422 msgid "Not enough arguments." msgstr "Yeterince argüman geçilmedi." #: ../commands.c:427 msgid "Too many arguments." msgstr "Gereğinden fazla argüman." #: ../commands.c:440 #, c-format msgid "Unknown option: %s" msgstr "Bilinmeyen seçenek: %s" #: ../commands.c:454 msgid "true" msgstr "doğru" #: ../commands.c:454 msgid "false" msgstr "yanlış" #: ../commands.c:486 #, c-format msgid "No value defined for option: %s" msgstr "Seçenek için değer belirtilmedi: %s" #: ../commands.c:501 #, c-format msgid "Unknown value for option: %s" msgstr "Seçenek için bilinmeyen değer: %s" #. settings #: ../config.c:203 msgid "Font" msgstr "Yazı tipi" #: ../config.c:204 msgid "Default foreground color" msgstr "Varsayılan yazı tipi rengi" #: ../config.c:205 msgid "Default background color" msgstr "Varsayılan arka plan rengi" #: ../config.c:206 msgid "Inputbar foreground color" msgstr "Giriş çubuğu yazı tipi rengi" #: ../config.c:207 msgid "Inputbar background color" msgstr "Giriş çubuğu arka plan rengi" #: ../config.c:208 msgid "Statusbar foreground color" msgstr "Durum çubuğu yazı tipi rengi" #: ../config.c:209 msgid "Statsubar background color" msgstr "Durum çubuğu arka plan rengi" #: ../config.c:210 msgid "Completion foreground color" msgstr "Tamamlama yazı tipi rengi" #: ../config.c:211 msgid "Completion background color" msgstr "Tamamlama arka plan rengi" #: ../config.c:212 msgid "Completion group foreground color" msgstr "Tamamlama grubu yazı tipi rengi" #: ../config.c:213 msgid "Completion group background color" msgstr "Tamamlama grubu arka plan rengi" #: ../config.c:214 msgid "Completion highlight foreground color" msgstr "Tamamlama vurgulama yazı tipi rengi" #: ../config.c:215 msgid "Completion highlight background color" msgstr "Tamamlama vurgulama arka plan rengi" #: ../config.c:216 msgid "Error notification foreground color" msgstr "Hata bildirimi yazı tipi rengi" #: ../config.c:217 msgid "Error notification background color" msgstr "Hata bildirimi arka plan rengi" #: ../config.c:218 msgid "Warning notification foreground color" msgstr "Uyarı bildirimi yazı tipi rengi" #: ../config.c:219 msgid "Warning notifaction background color" msgstr "Uyarı bildirimi arka plan rengi" #: ../config.c:220 msgid "Notification foreground color" msgstr "Bildirim yazı tipi rengi" #: ../config.c:221 msgid "Notification background color" msgstr "Bildirim arka plan rengi" #: ../config.c:222 msgid "Tab bar foreground color" msgstr "Sekme çubuğu yazı tipi rengi" #: ../config.c:223 msgid "Tab bar background color" msgstr "Sekme çubuğu arka plan rengi" #: ../config.c:224 msgid "Tab bar foreground color (active)" msgstr "Seçme çubuğu yazı tipi rengi (etkin)" #: ../config.c:225 msgid "Tab bar background color (active)" msgstr "Sekme çubuğu arka plan rengi (etkin)" #: ../config.c:227 msgid "Initial window width" msgstr "Başlangıçtaki pencere genişliği" #: ../config.c:228 msgid "Initial window height" msgstr "Başlangıçtaki pencere yüksekliği" #: ../config.c:229 msgid "Horizontal padding for the status input and notification bars" msgstr "" #: ../config.c:230 msgid "Vertical padding for the status input and notification bars" msgstr "" #: ../config.c:231 msgid "Number of completion items" msgstr "Tamamlama öğelerinin sayısı" #: ../config.c:232 msgid "Show both the horizontal and vertical scrollbars" msgstr "" #: ../config.c:233 msgid "Show the horizontal scrollbar" msgstr "" #: ../config.c:234 msgid "Show the vertical scrollbar" msgstr "" #: ../config.c:235 msgid "Window icon" msgstr "Pencere ikonu" #: ../config.c:236 msgid "Command to execute in :exec" msgstr ":exec için yürütülecek komut" #: ../config.c:237 msgid "Show or hide certain GUI elements" msgstr "Belirlenmiş GUI bileşenlerini göster ya da gizle" #. commands #: ../config.c:273 msgid "Execute a command" msgstr "Komut yürüt" #: ../config.c:274 msgid "Map a key sequence" msgstr "Tuş kombinasyonu eşleştir" #: ../config.c:275 msgid "Quit the program" msgstr "Programdan çık" #: ../config.c:276 msgid "Set an option" msgstr "Seçenekleri değiştir" #: ../config.c:277 msgid "Unmap a key sequence" msgstr "Tuş kombinasyonu eşleşimini kaldır" #: ../utils.c:519 #, c-format msgid "Failed to execute command: %s" msgstr "Komut yürütülemedi: %s" girara-0.1.9/po/pt_BR.po0000644000175000001440000001402012242417112013613 0ustar mockusers# girara - language file (Portuguese (Brazil)) # See LICENSE file for license and copyright information # # Translators: # salmora8 , 2013 # salmora8 , 2012 msgid "" msgstr "" "Project-Id-Version: girara\n" "Report-Msgid-Bugs-To: http://bugs.pwmt.org\n" "POT-Creation-Date: 2013-11-04 20:02+0100\n" "PO-Revision-Date: 2013-08-15 20:28+0000\n" "Last-Translator: salmora8 \n" "Language-Team: Portuguese (Brazil) (http://www.transifex.com/projects/p/" "girara/language/pt_BR/)\n" "Language: pt_BR\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1);\n" #. unhandled command #: ../callbacks.c:498 #, c-format msgid "Not a valid command: %s" msgstr "Nenhum comando válido: %s" #: ../commands.c:112 ../commands.c:312 #, c-format msgid "Invalid number of arguments passed: %zu instead of at least %u" msgstr "Número de argumentos passados inválidos: %zu em vez de %u no minimo" #: ../commands.c:146 #, c-format msgid "Unregistered mode specified: %s" msgstr "Modo não registrado especificado: %s" #: ../commands.c:178 #, c-format msgid "Invalid modifier in %s" msgstr "Modificador inválido em %s" #: ../commands.c:217 #, c-format msgid "Invalid special key value for %s" msgstr "Valor de tecla especial inválido para %s" #: ../commands.c:253 #, c-format msgid "Invalid special key value or mode %s" msgstr "Valor de tecla especial inválido ou modo %s" #: ../commands.c:334 #, c-format msgid "Not a valid shortcut function: %s" msgstr "Não é uma função de atalho válida: %s" #: ../commands.c:422 msgid "Not enough arguments." msgstr "Argumento não suficientes." #: ../commands.c:427 msgid "Too many arguments." msgstr "Muitos argumentos." #: ../commands.c:440 #, c-format msgid "Unknown option: %s" msgstr "Opção desconhecida: %s" #: ../commands.c:454 msgid "true" msgstr "verdadeiro" #: ../commands.c:454 msgid "false" msgstr "falso" #: ../commands.c:486 #, c-format msgid "No value defined for option: %s" msgstr "Não há valor definido para a opção: %s" #: ../commands.c:501 #, c-format msgid "Unknown value for option: %s" msgstr "Valor desconhecido para opção: %s" #. settings #: ../config.c:203 msgid "Font" msgstr "Fonte" #: ../config.c:204 msgid "Default foreground color" msgstr "Cor de primeiro plano padrão" #: ../config.c:205 msgid "Default background color" msgstr "Cor de fundo padrão" #: ../config.c:206 msgid "Inputbar foreground color" msgstr "Cor da barra de entrada" #: ../config.c:207 msgid "Inputbar background color" msgstr "Cor de fundo da barra de entrada" #: ../config.c:208 msgid "Statusbar foreground color" msgstr "Cor da barra de status" #: ../config.c:209 msgid "Statsubar background color" msgstr "Cor de fundo da barra de status" #: ../config.c:210 msgid "Completion foreground color" msgstr "Acabamento de cor" #: ../config.c:211 msgid "Completion background color" msgstr "Cor de fundo de acabamento" #: ../config.c:212 msgid "Completion group foreground color" msgstr "Cor dos grupos de acabamento" #: ../config.c:213 msgid "Completion group background color" msgstr "Cor de fundo dos grupos de acabamento" #: ../config.c:214 msgid "Completion highlight foreground color" msgstr "Acabamento de entrada destacada" #: ../config.c:215 msgid "Completion highlight background color" msgstr "Acabamento cor de fundo destacada" #: ../config.c:216 msgid "Error notification foreground color" msgstr "Cor das notificações de erro" #: ../config.c:217 msgid "Error notification background color" msgstr "Cor de fundo das notificações de erro" #: ../config.c:218 msgid "Warning notification foreground color" msgstr "Cor dos avisos" #: ../config.c:219 msgid "Warning notifaction background color" msgstr "Cor de fundo dos avisos" #: ../config.c:220 msgid "Notification foreground color" msgstr "Cor das notificações" #: ../config.c:221 msgid "Notification background color" msgstr "Cor de fundo das notificação" #: ../config.c:222 msgid "Tab bar foreground color" msgstr "Cor da barra de abas" #: ../config.c:223 msgid "Tab bar background color" msgstr "Cor de fundo da barra de abas" #: ../config.c:224 msgid "Tab bar foreground color (active)" msgstr "Cor da barra de abas (ativo)" #: ../config.c:225 msgid "Tab bar background color (active)" msgstr "Cor de fundo da barra de abas (ativo)" #: ../config.c:227 msgid "Initial window width" msgstr "Largura de janela inicial" #: ../config.c:228 msgid "Initial window height" msgstr "Altura de janela inicial" #: ../config.c:229 #, fuzzy msgid "Horizontal padding for the status input and notification bars" msgstr "" "Preenchimento vertical para a entrada de status e barras de notificações" #: ../config.c:230 msgid "Vertical padding for the status input and notification bars" msgstr "" "Preenchimento vertical para a entrada de status e barras de notificações" #: ../config.c:231 msgid "Number of completion items" msgstr "Número de itens de acabamento" #: ../config.c:232 msgid "Show both the horizontal and vertical scrollbars" msgstr "Mostrar as barras horizontal e vertical" #: ../config.c:233 msgid "Show the horizontal scrollbar" msgstr "Mostrar barra horizontal" #: ../config.c:234 msgid "Show the vertical scrollbar" msgstr "Mostrar barra vertical" #: ../config.c:235 msgid "Window icon" msgstr "Ícone de janela" #: ../config.c:236 msgid "Command to execute in :exec" msgstr "Comando para executar em :exec" #: ../config.c:237 msgid "Show or hide certain GUI elements" msgstr "Mostrar ou ocultar certos elementos da GUI" #. commands #: ../config.c:273 msgid "Execute a command" msgstr "Executar um comando" #: ../config.c:274 msgid "Map a key sequence" msgstr "Mapear uma sequencia de teclas" #: ../config.c:275 msgid "Quit the program" msgstr "Sair do programa" #: ../config.c:276 msgid "Set an option" msgstr "Definir uma opção" #: ../config.c:277 msgid "Unmap a key sequence" msgstr "Desmapear uma sequencia de teclas" #: ../utils.c:519 #, c-format msgid "Failed to execute command: %s" msgstr "Falha ao executar comando: %s" girara-0.1.9/po/fr.po0000644000175000001440000001367612242417112013234 0ustar mockusers# girara - language file (French) # See LICENSE file for license and copyright information # # Translators: # Richard Gill , 2012. # Benoît Knecht , 2013. msgid "" msgstr "" "Project-Id-Version: girara\n" "Report-Msgid-Bugs-To: http://bugs.pwmt.org\n" "POT-Creation-Date: 2013-11-04 20:02+0100\n" "PO-Revision-Date: 2013-08-15 00:25+0200\n" "Last-Translator: Benoît Knecht \n" "Language-Team: French\n" "Language: fr\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n > 1)\n" #. unhandled command #: ../callbacks.c:498 #, c-format msgid "Not a valid command: %s" msgstr "Pas une commande valide : %s" #: ../commands.c:112 ../commands.c:312 #, c-format msgid "Invalid number of arguments passed: %zu instead of at least %u" msgstr "Nombre d'arguments invalide : %zu à la place d'au moins %u" #: ../commands.c:146 #, c-format msgid "Unregistered mode specified: %s" msgstr "Mode non enregistré spécifié : %s" #: ../commands.c:178 #, c-format msgid "Invalid modifier in %s" msgstr "Modificateur invalide dans %s" #: ../commands.c:217 #, c-format msgid "Invalid special key value for %s" msgstr "Valeur de touche spéciale invalide pour %s" #: ../commands.c:253 #, c-format msgid "Invalid special key value or mode %s" msgstr "Valeur de touche spéciale ou mode %s invalide" #: ../commands.c:334 #, c-format msgid "Not a valid shortcut function: %s" msgstr "Pas une fonction raccourci valide : %s" #: ../commands.c:422 msgid "Not enough arguments." msgstr "Pas assez d'arguments." #: ../commands.c:427 msgid "Too many arguments." msgstr "Trop d'arguments." #: ../commands.c:440 #, c-format msgid "Unknown option: %s" msgstr "Option inconnue : %s" #: ../commands.c:454 msgid "true" msgstr "vrai" #: ../commands.c:454 msgid "false" msgstr "faux" #: ../commands.c:486 #, c-format msgid "No value defined for option: %s" msgstr "Aucune valeur définie pour l'option : %s" #: ../commands.c:501 #, c-format msgid "Unknown value for option: %s" msgstr "Valeur inconnue pour l'option : %s" #. settings #: ../config.c:203 msgid "Font" msgstr "Police" #: ../config.c:204 msgid "Default foreground color" msgstr "Couleur par défaut du texte" #: ../config.c:205 msgid "Default background color" msgstr "Couleur par défaut du fond" #: ../config.c:206 msgid "Inputbar foreground color" msgstr "Couleur du texte de la barre de saisie" #: ../config.c:207 msgid "Inputbar background color" msgstr "Couleur de fond de la barre de saisie" #: ../config.c:208 msgid "Statusbar foreground color" msgstr "Couleur du texte de la barre d'état" #: ../config.c:209 msgid "Statsubar background color" msgstr "Couleur de fond de la barre d'état" #: ../config.c:210 msgid "Completion foreground color" msgstr "Couleur du texte de la complétion" #: ../config.c:211 msgid "Completion background color" msgstr "Couleur de fond de la complétion" #: ../config.c:212 msgid "Completion group foreground color" msgstr "Couleur du texte du groupe de complétion" #: ../config.c:213 msgid "Completion group background color" msgstr "Couleur de fond du groupe de complétion" #: ../config.c:214 msgid "Completion highlight foreground color" msgstr "Couleur du texte du surlignage de complétion" #: ../config.c:215 msgid "Completion highlight background color" msgstr "Couleur de fond du surlignage de complétion" #: ../config.c:216 msgid "Error notification foreground color" msgstr "Couleur du texte des notifications d'erreur" #: ../config.c:217 msgid "Error notification background color" msgstr "Couleur de fond des notifications d'erreur" #: ../config.c:218 msgid "Warning notification foreground color" msgstr "Couleur du texte des notifications d'avertissement" #: ../config.c:219 msgid "Warning notifaction background color" msgstr "Couleur de fond des notifications d'avertissement" #: ../config.c:220 msgid "Notification foreground color" msgstr "Couleur du texte des notifications" #: ../config.c:221 msgid "Notification background color" msgstr "Couleur de fond des notifications" #: ../config.c:222 msgid "Tab bar foreground color" msgstr "Couleur du texte des onglets" #: ../config.c:223 msgid "Tab bar background color" msgstr "Couleur de fond des onglets" #: ../config.c:224 msgid "Tab bar foreground color (active)" msgstr "Couleur du texte de l'onglet actif" #: ../config.c:225 msgid "Tab bar background color (active)" msgstr "Couleur de fond de l'onglet actif" #: ../config.c:227 msgid "Initial window width" msgstr "Largeur initiale de la fenêtre" #: ../config.c:228 msgid "Initial window height" msgstr "Hauteur initiale de la fenêtre" #: ../config.c:229 msgid "Horizontal padding for the status input and notification bars" msgstr "" #: ../config.c:230 msgid "Vertical padding for the status input and notification bars" msgstr "" #: ../config.c:231 msgid "Number of completion items" msgstr "Nombre d'éléments de complétion" #: ../config.c:232 msgid "Show both the horizontal and vertical scrollbars" msgstr "" #: ../config.c:233 msgid "Show the horizontal scrollbar" msgstr "" #: ../config.c:234 msgid "Show the vertical scrollbar" msgstr "" #: ../config.c:235 msgid "Window icon" msgstr "Icône de fenêtre" #: ../config.c:236 msgid "Command to execute in :exec" msgstr "Commande à exécuter dans :exec" #: ../config.c:237 msgid "Show or hide certain GUI elements" msgstr "Afficher ou cacher certains éléments de l'interface" #. commands #: ../config.c:273 msgid "Execute a command" msgstr "Exécuter une commande" #: ../config.c:274 msgid "Map a key sequence" msgstr "Associer une séquence de touches" #: ../config.c:275 msgid "Quit the program" msgstr "Quitter le programme" #: ../config.c:276 msgid "Set an option" msgstr "Placer une option" #: ../config.c:277 msgid "Unmap a key sequence" msgstr "Désassocier une séquence de touches" #: ../utils.c:519 #, c-format msgid "Failed to execute command: %s" msgstr "Échec d'exécution de la commande : %s" girara-0.1.9/po/el.po0000644000175000001440000001603212242417112013212 0ustar mockusers# girara - language file (Greek) # See LICENSE file for license and copyright information # # Translators: # Nisok Kosin , 2012. # Nisok Kosin , 2012. msgid "" msgstr "" "Project-Id-Version: girara\n" "Report-Msgid-Bugs-To: http://bugs.pwmt.org\n" "POT-Creation-Date: 2013-11-04 20:02+0100\n" "PO-Revision-Date: 2013-08-15 00:24+0200\n" "Last-Translator: Nisok Kosin \n" "Language-Team: Greek (http://www.transifex.com/projects/p/girara/language/" "el/)\n" "Language: el\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" #. unhandled command #: ../callbacks.c:498 #, c-format msgid "Not a valid command: %s" msgstr "Μη έγγυρη εντολή: %s" #: ../commands.c:112 ../commands.c:312 #, c-format msgid "Invalid number of arguments passed: %zu instead of at least %u" msgstr "Εισαγωγή μη έγγυρου αριθμού παραμέτρων: %zu αντί κατ'ελάχιστο %u" #: ../commands.c:146 #, c-format msgid "Unregistered mode specified: %s" msgstr "Επιλέχθηκε μη καταχωρημένη λειτουργία: %s" #: ../commands.c:178 #, c-format msgid "Invalid modifier in %s" msgstr "Μη έγγυρος τροποποιητής στο %s" #: ../commands.c:217 #, c-format msgid "Invalid special key value for %s" msgstr "Μη έγγυρη επιλογή ειδικού πλήκτρου στο %s" #: ../commands.c:253 #, c-format msgid "Invalid special key value or mode %s" msgstr "Μη έγγυρη τιμή ειδικού πλήκτρου %s" #: ../commands.c:334 #, c-format msgid "Not a valid shortcut function: %s" msgstr "Μη έγγυρη συντόμευση λειτουργίας: %s" #: ../commands.c:422 msgid "Not enough arguments." msgstr "Ανεπαρκείς παράμετροι" #: ../commands.c:427 msgid "Too many arguments." msgstr "Πολλές παράμετροι" #: ../commands.c:440 #, c-format msgid "Unknown option: %s" msgstr "Μή έγγυρη επιλογή: %s" #: ../commands.c:454 msgid "true" msgstr "Αληθές" #: ../commands.c:454 msgid "false" msgstr "Ψευδές" #: ../commands.c:486 #, c-format msgid "No value defined for option: %s" msgstr "Καμία τιμή δεν έχει καθοριστεί για την επιλογή: %s" #: ../commands.c:501 #, c-format msgid "Unknown value for option: %s" msgstr "Άγνωστη τιμή για την επιλογή: %s" #. settings #: ../config.c:203 msgid "Font" msgstr "Γραμματοσειρά" #: ../config.c:204 msgid "Default foreground color" msgstr "Προεπιλεγμένο χρώμα προσκηνίου" #: ../config.c:205 msgid "Default background color" msgstr "Προεπιλεγμένο χρώμα πρασκηνίου" #: ../config.c:206 msgid "Inputbar foreground color" msgstr "Χρώμα μπάρας εισαγωγής" #: ../config.c:207 msgid "Inputbar background color" msgstr "Χρώμα φόντου μπάρας εισαγωγής" #: ../config.c:208 msgid "Statusbar foreground color" msgstr "Χρώμα μπάρας κατάστασης" #: ../config.c:209 msgid "Statsubar background color" msgstr "Χρώμα φόντου μπάρας κατάστασης" #: ../config.c:210 msgid "Completion foreground color" msgstr "Χρώμα επιλογών συμπλήρωσης" #: ../config.c:211 msgid "Completion background color" msgstr "Χρώμα συμπλήρωσης λέξεων" #: ../config.c:212 msgid "Completion group foreground color" msgstr "Χρώμα μενού συμπλήρωσης λέξεων" #: ../config.c:213 msgid "Completion group background color" msgstr "Χρώμα φόντου του μενού συμπλήρωσης λέξεων" #: ../config.c:214 msgid "Completion highlight foreground color" msgstr "Χρώμα τονισμού συμπλήρωσης λέξεων" #: ../config.c:215 msgid "Completion highlight background color" msgstr "Χρώμα φόντου τονισμού συμπλήρωσης λέξεων" #: ../config.c:216 msgid "Error notification foreground color" msgstr "Χρώμα ειδοποίησης σφάλματος" #: ../config.c:217 msgid "Error notification background color" msgstr "Χρώμα φόντου ειδοποίησης σφάλματος" #: ../config.c:218 msgid "Warning notification foreground color" msgstr "Χρώμα ειδοποίησης προειδοποίησης" #: ../config.c:219 msgid "Warning notifaction background color" msgstr "Χρώμα φόντου ειδοποίησης προειδοποίησης" #: ../config.c:220 msgid "Notification foreground color" msgstr "Χρώμα ειδοποίησης" #: ../config.c:221 msgid "Notification background color" msgstr "Χρώμα φόντου ειδοποίησης" #: ../config.c:222 msgid "Tab bar foreground color" msgstr "Χρώμα μπάρας καρτελών" #: ../config.c:223 msgid "Tab bar background color" msgstr "Χρώμα φόντου μπάρας καρτελών" #: ../config.c:224 msgid "Tab bar foreground color (active)" msgstr "Χρώμα μπάρας καρτελών (ενεργό)" #: ../config.c:225 msgid "Tab bar background color (active)" msgstr "Χρώμα φόντου μπάρας καρτελών (ενεργό)" #: ../config.c:227 msgid "Initial window width" msgstr "Αρχικό πλάτος παραθύρου" #: ../config.c:228 msgid "Initial window height" msgstr "Αρχικό ύψος παραθύρου" #: ../config.c:229 msgid "Horizontal padding for the status input and notification bars" msgstr "" #: ../config.c:230 msgid "Vertical padding for the status input and notification bars" msgstr "" #: ../config.c:231 msgid "Number of completion items" msgstr "Αριθμός στοιχείων συμπλήρωσης" #: ../config.c:232 msgid "Show both the horizontal and vertical scrollbars" msgstr "" #: ../config.c:233 msgid "Show the horizontal scrollbar" msgstr "" #: ../config.c:234 msgid "Show the vertical scrollbar" msgstr "" #: ../config.c:235 msgid "Window icon" msgstr "Εικονίδιο παραθύρου" #: ../config.c:236 msgid "Command to execute in :exec" msgstr "Η εντολή που θα εκτελεστεί στο :exec" #: ../config.c:237 msgid "Show or hide certain GUI elements" msgstr "Εμφάνιση είτε απόκριψη συγκεκριμένω στοιχείων του GUI" #. commands #: ../config.c:273 msgid "Execute a command" msgstr "Εκτέλεση εντολής" #: ../config.c:274 msgid "Map a key sequence" msgstr "Χαρτογράφηση / map αλληλουχίας πλήκτρων" #: ../config.c:275 msgid "Quit the program" msgstr "Εγκατάληψη της εφαρμογής" #: ../config.c:276 msgid "Set an option" msgstr "Ρύθμιση επιλογής" #: ../config.c:277 msgid "Unmap a key sequence" msgstr "Απόχαρτογράφηση / unmap αλληλουχίας πλήκτρων" #: ../utils.c:519 #, c-format msgid "Failed to execute command: %s" msgstr "Αποτυχία στην εκτέλεση της εντολής: %s" girara-0.1.9/po/Makefile0000644000175000001440000000325412242417112013714 0ustar mockusers# See LICENSE file for license and copyright information include ../config.mk include ../common.mk PROJECTNV = girara PROJECT = girara-gtk${GIRARA_GTK_VERSION} CATALOGS = $(wildcard *.po) LINGUAS ?= $(patsubst %.po, %, $(CATALOGS)) ifeq ($(LINGUAS),) ALINGUAS = else ALINGUAS = $(shell find $(patsubst %, %.po, $(LINGUAS)) 2>/dev/null) endif MOS = $(patsubst %, %/LC_MESSAGES/${GETTEXT_PACKAGE}.mo, $(patsubst %.po, %, $(ALINGUAS))) all: ${MOS} clean: $(QUIET)rm -rf POTFILES.in POTFILES.in.tmp $(patsubst %.po, %, $(CATALOGS)) ${PROJECT}.pot POTFILES.in: $(wildcard ../*.c) $(QUIET) set -e && rm -f $@.tmp && touch $@.tmp && \ for f in $(^F) ; do \ echo $$f >> $@.tmp ; \ done && \ mv $@.tmp $@ ${GETTEXT_PACKAGE}.pot: POTFILES.in $(ECHO) regenerate $@ $(QUIET)intltool-update --pot --gettext-package=${GETTEXT_PACKAGE} update-po: ${GETTEXT_PACKAGE}.pot $(ECHO) updating po files: ${CATALOGS} $(QUIET)set -e && for f in ${CATALOGS} ; do \ intltool-update --dist --gettext-package=${GETTEXT_PACKAGE} `echo $$f | sed 's/\.po//'` ; \ sed -i 's/Report-Msgid-Bugs-To: \\n/Report-Msgid-Bugs-To: http:\/\/bugs.pwmt.org\\n/' "$$f" ; \ done %/LC_MESSAGES/${GETTEXT_PACKAGE}.mo: %.po @mkdir -p $(@D) $(ECHO) msgfmt $(shell echo $< | sed 's/\.po//') $(QUIET)${MSGFMT} ${MSGFMTFLAGS} -c $< -o $@ install: ${MOS} $(ECHO) installing translations $(QUIET)set -e && for f in $^ ; do \ mkdir -p -m 755 $(DESTDIR)$(LOCALEDIR)/`dirname $$f`; \ install -m 644 $$f $(DESTDIR)$(LOCALEDIR)/`dirname $$f` ; \ done uninstall: ${MOS} $(ECHO) removing translations $(QUIET)set -e && for f in $^ ; do \ rm -f $(LOCALEDIR)/$$f; \ done .PHONY: all clean install uninstall update-po girara-0.1.9/config.c0000644000175000001440000004772512242417112013262 0ustar mockusers/* See LICENSE file for license and copyright information */ #include #include #include #include "config.h" #include "commands.h" #include "datastructures.h" #include "internal.h" #include "session.h" #include "settings.h" #include "shortcuts.h" #include "utils.h" #define COMMENT_PREFIX "\"#" static void cb_window_icon(girara_session_t* session, const char* UNUSED(name), girara_setting_type_t UNUSED(type), void* value, void* UNUSED(data)) { g_return_if_fail(session != NULL && value != NULL); if (session->gtk.window != NULL) { char* path = girara_fix_path(value); // value != NULL GError* error = NULL; gtk_window_set_icon_from_file(GTK_WINDOW(session->gtk.window), path, &error); if (error != NULL) { girara_error("failed to load window icon: %s", error->message); g_error_free(error); } free(path); } } static void cb_font(girara_session_t* session, const char* UNUSED(name), girara_setting_type_t UNUSED(type), void* value, void* UNUSED(data)) { g_return_if_fail(session != NULL && value != NULL); pango_font_description_free(session->style.font); /* parse font */ PangoFontDescription* font = pango_font_description_from_string(value); session->style.font = font; /* inputbar */ if (session->gtk.inputbar_entry != NULL) { gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_entry), font); } if (session->gtk.inputbar_dialog != NULL) { gtk_widget_override_font(GTK_WIDGET(session->gtk.inputbar_dialog), font); } /* notification area */ if (session->gtk.notification_text != NULL) { gtk_widget_override_font(GTK_WIDGET(session->gtk.notification_text), font); } GIRARA_LIST_FOREACH(session->elements.statusbar_items, girara_statusbar_item_t *, iter, item) if (item != NULL){ gtk_widget_override_font(GTK_WIDGET(item->text), font); } GIRARA_LIST_FOREACH_END(session->elements.statusbar_items, girara_statusbar_item_t *, iter, item); } static void cb_guioptions(girara_session_t* session, const char* UNUSED(name), girara_setting_type_t UNUSED(type), void* value, void* UNUSED(data)) { g_return_if_fail(session != NULL && value != NULL); /* set default values */ bool show_commandline = false; bool show_statusbar = false; /* evaluate input */ char* input = (char*) value; int input_length = strlen(input); for (int i = 0; i < input_length; i++) { switch (input[i]) { /* command line */ case 'c': show_commandline = true; break; /* statusbar */ case 's': show_statusbar = true; break; } } /* apply settings */ if (show_commandline == true) { session->global.autohide_inputbar = false; gtk_widget_show(session->gtk.inputbar); } else { session->global.autohide_inputbar = true; gtk_widget_hide(session->gtk.inputbar); } if (show_statusbar == true) { session->global.hide_statusbar = false; gtk_widget_show(session->gtk.statusbar); } else { session->global.hide_statusbar = true; gtk_widget_hide(session->gtk.statusbar); } } static void cb_scrollbars(girara_session_t* session, const char* name, girara_setting_type_t UNUSED(type), void* value, void* UNUSED(data)) { g_return_if_fail(session != NULL && value != NULL); bool val = *(bool*) value; bool show_hscrollbar = false; bool show_vscrollbar = false; #if (GTK_MAJOR_VERSION == 3) GtkWidget *vscrollbar = gtk_scrolled_window_get_vscrollbar(GTK_SCROLLED_WINDOW(session->gtk.view)); GtkWidget *hscrollbar = gtk_scrolled_window_get_hscrollbar(GTK_SCROLLED_WINDOW(session->gtk.view)); if (vscrollbar != NULL) { show_vscrollbar = gtk_widget_get_visible(vscrollbar); } if (hscrollbar != NULL) { show_hscrollbar = gtk_widget_get_visible(hscrollbar); } #else GtkPolicyType h_policy, v_policy; gtk_scrolled_window_get_policy(GTK_SCROLLED_WINDOW(session->gtk.view), &h_policy, &v_policy); show_vscrollbar = (v_policy == GTK_POLICY_AUTOMATIC); show_hscrollbar = (h_policy == GTK_POLICY_AUTOMATIC); #endif if (!strcmp(name, "show-scrollbars")) { show_hscrollbar = show_vscrollbar = val; girara_setting_set(session, "show-h-scrollbar", &val); girara_setting_set(session, "show-v-scrollbar", &val); } else if (!strcmp(name, "show-h-scrollbar")) { show_hscrollbar = val; } else if (!strcmp(name, "show-v-scrollbar")) { show_vscrollbar = val; } #if (GTK_MAJOR_VERSION == 3) if (vscrollbar != NULL) { gtk_widget_set_visible(vscrollbar, show_vscrollbar); } if (hscrollbar != NULL) { gtk_widget_set_visible(hscrollbar, show_hscrollbar); } #else h_policy = show_hscrollbar ? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER; v_policy = show_vscrollbar ? GTK_POLICY_AUTOMATIC : GTK_POLICY_NEVER; gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(session->gtk.view), h_policy, v_policy); #endif /* be careful to avoid infinite recursion as changing settings triggers cb_scrollbars call */ girara_setting_get(session, "show-scrollbars", &val); if (show_hscrollbar && show_vscrollbar && !val) { val = true; girara_setting_set(session, "show-scrollbars", &val); } else if (!show_hscrollbar && !show_vscrollbar && val) { val = false; girara_setting_set(session, "show-scrollbars", &val); } } void girara_config_load_default(girara_session_t* session) { if (session == NULL) { return; } /* values */ int statusbar_h_padding = 8; int statusbar_v_padding = 2; int window_width = 800; int window_height = 600; int n_completion_items = 15; bool show_scrollbars = false; girara_mode_t normal_mode = session->modes.normal; /* other values */ session->global.autohide_inputbar = true; /* settings */ girara_setting_add(session, "font", "monospace normal 9", STRING, FALSE, _("Font"), cb_font, NULL); girara_setting_add(session, "default-fg", "#DDDDDD", STRING, TRUE, _("Default foreground color"), NULL, NULL); girara_setting_add(session, "default-bg", "#000000", STRING, TRUE, _("Default background color"), NULL, NULL); girara_setting_add(session, "inputbar-fg", "#9FBC00", STRING, TRUE, _("Inputbar foreground color"), NULL, NULL); girara_setting_add(session, "inputbar-bg", "#131313", STRING, TRUE, _("Inputbar background color"), NULL, NULL); girara_setting_add(session, "statusbar-fg", "#FFFFFF", STRING, TRUE, _("Statusbar foreground color"), NULL, NULL); girara_setting_add(session, "statusbar-bg", "#000000", STRING, TRUE, _("Statsubar background color"), NULL, NULL); girara_setting_add(session, "completion-fg", "#DDDDDD", STRING, TRUE, _("Completion foreground color"), NULL, NULL); girara_setting_add(session, "completion-bg", "#232323", STRING, TRUE, _("Completion background color"), NULL, NULL); girara_setting_add(session, "completion-group-fg", "#DEDEDE", STRING, TRUE, _("Completion group foreground color"), NULL, NULL); girara_setting_add(session, "completion-group-bg", "#000000", STRING, TRUE, _("Completion group background color"), NULL, NULL); girara_setting_add(session, "completion-highlight-fg", "#232323", STRING, TRUE, _("Completion highlight foreground color"), NULL, NULL); girara_setting_add(session, "completion-highlight-bg", "#9FBC00", STRING, TRUE, _("Completion highlight background color"), NULL, NULL); girara_setting_add(session, "notification-error-fg", "#FFFFFF", STRING, TRUE, _("Error notification foreground color"), NULL, NULL); girara_setting_add(session, "notification-error-bg", "#FF1212", STRING, TRUE, _("Error notification background color"), NULL, NULL); girara_setting_add(session, "notification-warning-fg", "#000000", STRING, TRUE, _("Warning notification foreground color"), NULL, NULL); girara_setting_add(session, "notification-warning-bg", "#F3F000", STRING, TRUE, _("Warning notifaction background color"), NULL, NULL); girara_setting_add(session, "notification-fg", "#000000", STRING, TRUE, _("Notification foreground color"), NULL, NULL); girara_setting_add(session, "notification-bg", "#FFFFFF", STRING, TRUE, _("Notification background color"), NULL, NULL); girara_setting_add(session, "tabbar-fg", "#939393", STRING, TRUE, _("Tab bar foreground color"), NULL, NULL); girara_setting_add(session, "tabbar-bg", "#000000", STRING, TRUE, _("Tab bar background color"), NULL, NULL); girara_setting_add(session, "tabbar-focus-fg", "#9FBC00", STRING, TRUE, _("Tab bar foreground color (active)"), NULL, NULL); girara_setting_add(session, "tabbar-focus-bg", "#000000", STRING, TRUE, _("Tab bar background color (active)"), NULL, NULL); girara_setting_add(session, "word-separator", " /.-=&#?", STRING, TRUE, NULL, NULL, NULL); girara_setting_add(session, "window-width", &window_width, INT, TRUE, _("Initial window width"), NULL, NULL); girara_setting_add(session, "window-height", &window_height, INT, TRUE, _("Initial window height"), NULL, NULL); girara_setting_add(session, "statusbar-h-padding", &statusbar_h_padding, INT, TRUE, _("Horizontal padding for the status input and notification bars"), NULL, NULL); girara_setting_add(session, "statusbar-v-padding", &statusbar_v_padding, INT, TRUE, _("Vertical padding for the status input and notification bars"), NULL, NULL); girara_setting_add(session, "n-completion-items", &n_completion_items, INT, TRUE, _("Number of completion items"), NULL, NULL); girara_setting_add(session, "show-scrollbars", &show_scrollbars, BOOLEAN, FALSE, _("Show both the horizontal and vertical scrollbars"), cb_scrollbars, NULL); girara_setting_add(session, "show-h-scrollbar", &show_scrollbars, BOOLEAN, FALSE, _("Show the horizontal scrollbar"), cb_scrollbars, NULL); girara_setting_add(session, "show-v-scrollbar", &show_scrollbars, BOOLEAN, FALSE, _("Show the vertical scrollbar"), cb_scrollbars, NULL); girara_setting_add(session, "window-icon", "", STRING, FALSE, _("Window icon"), cb_window_icon, NULL); girara_setting_add(session, "exec-command", "", STRING, FALSE, _("Command to execute in :exec"), NULL, NULL); girara_setting_add(session, "guioptions", "s", STRING, FALSE, _("Show or hide certain GUI elements"), cb_guioptions, NULL); /* shortcuts */ girara_shortcut_add(session, 0, GDK_KEY_Escape, NULL, girara_sc_abort, normal_mode, 0, NULL); girara_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_c, NULL, girara_sc_abort, normal_mode, 0, NULL); girara_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_q, NULL, girara_sc_quit, normal_mode, 0, NULL); girara_shortcut_add(session, 0, GDK_KEY_colon, NULL, girara_sc_focus_inputbar, normal_mode, 0, ":"); girara_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_w, NULL, girara_sc_tab_close, normal_mode, 0, NULL); girara_shortcut_add(session, 0, 0, "gt", girara_sc_tab_navigate, normal_mode, GIRARA_NEXT, NULL); girara_shortcut_add(session, 0, 0, "gT", girara_sc_tab_navigate, normal_mode, GIRARA_PREVIOUS, NULL); /* inputbar shortcuts */ girara_inputbar_shortcut_add(session, 0, GDK_KEY_Escape, girara_isc_abort, 0, NULL); girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_c, girara_isc_abort, 0, NULL); girara_inputbar_shortcut_add(session, 0, GDK_KEY_Tab, girara_isc_completion, GIRARA_NEXT, NULL); girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_Tab, girara_isc_completion, GIRARA_NEXT_GROUP, NULL); girara_inputbar_shortcut_add(session, 0, GDK_KEY_ISO_Left_Tab, girara_isc_completion, GIRARA_PREVIOUS, NULL); girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_ISO_Left_Tab, girara_isc_completion, GIRARA_PREVIOUS_GROUP, NULL); girara_inputbar_shortcut_add(session, 0, GDK_KEY_BackSpace, girara_isc_string_manipulation, GIRARA_DELETE_LAST_CHAR, NULL); girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_h, girara_isc_string_manipulation, GIRARA_DELETE_LAST_CHAR, NULL); girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_u, girara_isc_string_manipulation, GIRARA_DELETE_TO_LINE_START, NULL); girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_k, girara_isc_string_manipulation, GIRARA_DELETE_TO_LINE_END, NULL); girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_d, girara_isc_string_manipulation, GIRARA_DELETE_CURR_CHAR, NULL); girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_w, girara_isc_string_manipulation, GIRARA_DELETE_LAST_WORD, NULL); girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_f, girara_isc_string_manipulation, GIRARA_NEXT_CHAR, NULL); girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_b, girara_isc_string_manipulation, GIRARA_PREVIOUS_CHAR, NULL); girara_inputbar_shortcut_add(session, 0, GDK_KEY_Right, girara_isc_string_manipulation, GIRARA_NEXT_CHAR, NULL); girara_inputbar_shortcut_add(session, 0, GDK_KEY_Left, girara_isc_string_manipulation, GIRARA_PREVIOUS_CHAR, NULL); girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_a, girara_isc_string_manipulation, GIRARA_GOTO_START, NULL); girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_e, girara_isc_string_manipulation, GIRARA_GOTO_END, NULL); girara_inputbar_shortcut_add(session, 0, GDK_KEY_Up, girara_isc_command_history, GIRARA_PREVIOUS, NULL); girara_inputbar_shortcut_add(session, 0, GDK_KEY_Down, girara_isc_command_history, GIRARA_NEXT, NULL); girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_p, girara_isc_command_history, GIRARA_PREVIOUS, NULL); girara_inputbar_shortcut_add(session, GDK_CONTROL_MASK, GDK_KEY_n, girara_isc_command_history, GIRARA_NEXT, NULL); /* commands */ girara_inputbar_command_add(session, "exec", NULL, girara_cmd_exec, NULL, _("Execute a command")); girara_inputbar_command_add(session, "map", "m", girara_cmd_map, NULL, _("Map a key sequence")); girara_inputbar_command_add(session, "quit", "q", girara_cmd_quit, NULL, _("Quit the program")); girara_inputbar_command_add(session, "set", "s", girara_cmd_set, girara_cc_set, _("Set an option")); girara_inputbar_command_add(session, "unmap", NULL, girara_cmd_unmap, NULL, _("Unmap a key sequence")); /* config handle */ girara_config_handle_add(session, "map", girara_cmd_map); girara_config_handle_add(session, "set", girara_cmd_set); girara_config_handle_add(session, "unmap", girara_cmd_unmap); /* shortcut mappings */ girara_shortcut_mapping_add(session, "focus_inputbar", girara_sc_focus_inputbar); girara_shortcut_mapping_add(session, "quit", girara_sc_quit); girara_shortcut_mapping_add(session, "set", girara_sc_set); girara_shortcut_mapping_add(session, "feedkeys", girara_sc_feedkeys); girara_shortcut_mapping_add(session, "tab_next", girara_sc_tab_navigate_next); girara_shortcut_mapping_add(session, "tab_prev", girara_sc_tab_navigate_prev); } bool girara_config_handle_add(girara_session_t* session, const char* identifier, girara_command_function_t handle) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(identifier != NULL, false); /* search for existing config handle */ GIRARA_LIST_FOREACH(session->config.handles, girara_config_handle_t*, iter, data) if (strcmp(data->identifier, identifier) == 0) { data->handle = handle; girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->config.handles, girara_config_handle_t*, iter, data); /* add new config handle */ girara_config_handle_t* config_handle = g_slice_new(girara_config_handle_t); config_handle->identifier = g_strdup(identifier); config_handle->handle = handle; girara_list_append(session->config.handles, config_handle); return true; } void girara_config_handle_free(girara_config_handle_t* handle) { if (handle == NULL) { return; } g_free(handle->identifier); g_slice_free(girara_config_handle_t, handle); } static bool config_parse(girara_session_t* session, const char* path) { /* open file */ FILE* file = girara_file_open(path, "r"); if (file == NULL) { return false; } /* read lines */ char* line = NULL; unsigned int line_number = 1; while ((line = girara_file_read_line(file)) != NULL) { /* skip empty lines and comments */ if (strlen(line) == 0 || strchr(COMMENT_PREFIX, line[0]) != NULL) { free(line); continue; } gchar** argv = NULL; gint argc = 0; girara_list_t* argument_list = girara_list_new(); if (argument_list == NULL) { free(line); fclose(file); return false; } girara_list_set_free_function(argument_list, g_free); if (g_shell_parse_argv(line, &argc, &argv, NULL) != FALSE) { for(int i = 1; i < argc; i++) { char* argument = g_strdup(argv[i]); girara_list_append(argument_list, (void*) argument); } } else { girara_list_free(argument_list); fclose(file); free(line); return false; } /* include gets a special treatment */ if (strcmp(argv[0], "include") == 0) { if (argc != 2) { girara_warning("Could not process line %d in '%s': usage: include path.", line_number, path); } else { char* newpath = NULL; if (g_path_is_absolute(argv[1]) == TRUE) { newpath = g_strdup(argv[1]); } else { char* basename = g_path_get_dirname(path); char* tmp = g_build_filename(basename, argv[1], NULL); newpath = girara_fix_path(tmp); g_free(tmp); g_free(basename); } if (strcmp(newpath, path) == 0) { girara_warning("Could not process line %d in '%s': trying to include itself.", line_number, path); } else { girara_debug("Loading config file '%s'.", newpath); if (config_parse(session, newpath) == FALSE) { girara_warning("Could not process line %d in '%s': failed to load '%s'.", line_number, path, newpath); } } g_free(newpath); } } else { /* search for config handle */ girara_config_handle_t* handle = NULL; GIRARA_LIST_FOREACH(session->config.handles, girara_config_handle_t*, iter, tmp) handle = tmp; if (strcmp(handle->identifier, argv[0]) == 0) { handle->handle(session, argument_list); break; } else { handle = NULL; } GIRARA_LIST_FOREACH_END(session->config.handles, girara_config_handle_t*, iter, tmp); if (handle == NULL) { girara_warning("Could not process line %d in '%s': Unknown handle '%s'", line_number, path, argv[0]); } } line_number++; girara_list_free(argument_list); g_strfreev(argv); free(line); } fclose(file); return true; } void girara_config_parse(girara_session_t* session, const char* path) { config_parse(session, path); } girara-0.1.9/input-history-io.c0000644000175000001440000000131312242417112015237 0ustar mockusers/* See LICENSE file for license and copyright information */ #include "input-history.h" #include "macros.h" G_DEFINE_INTERFACE(GiraraInputHistoryIO, girara_input_history_io, G_TYPE_OBJECT) static void girara_input_history_io_default_init(GiraraInputHistoryIOInterface* GIRARA_UNUSED(iface)) { } void girara_input_history_io_append(GiraraInputHistoryIO* io, const char* input) { g_return_if_fail(GIRARA_IS_INPUT_HISTORY_IO(io) == true); GIRARA_INPUT_HISTORY_IO_GET_INTERFACE(io)->append(io, input); } girara_list_t* girara_input_history_io_read(GiraraInputHistoryIO* io) { g_return_val_if_fail(GIRARA_IS_INPUT_HISTORY_IO(io) == true, NULL); return GIRARA_INPUT_HISTORY_IO_GET_INTERFACE(io)->read(io); } girara-0.1.9/session.h0000644000175000001440000002164712242417112013500 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_SESSION_H #define GIRARA_SESSION_H #include "types.h" #include "macros.h" #include "callbacks.h" #include #include #if (GTK_MAJOR_VERSION == 3) #include #elif GTK_MAJOR_VERSION == 2 #include "gtk2-compat.h" #endif struct girara_session_s { struct { GtkWidget *window; /**< The main window of the application */ GtkBox *box; /**< A box that contains all widgets */ GtkWidget *view; /**< The view area of the applications widgets */ GtkWidget *viewport; /**< The viewport of view */ GtkWidget *statusbar; /**< The statusbar */ GtkBox *statusbar_entries; /**< Statusbar entry box */ GtkWidget *notification_area; /**< The notification area */ GtkWidget *notification_text; /**< The notification entry */ GtkWidget *tabbar; /**< The tabbar */ GtkBox *inputbar_box; /**< Inputbar box */ GtkWidget *inputbar; /**< Inputbar event box */ GtkLabel *inputbar_dialog; /**< Inputbar dialog */ GtkEntry *inputbar_entry; /**< Inputbar entry */ GtkNotebook *tabs; /**< The tabs notebook */ GtkBox *results; /**< Completion results */ #if (GTK_MAJOR_VERSION == 3) Window embed; /**< Embedded window */ #else GdkNativeWindow embed; /**< Embedded window */ #endif // (GTK_MAJOR_VERSION == 3) } gtk; struct { GdkRGBA default_foreground; /**< The default foreground color */ GdkRGBA default_background; /**< The default background color */ GdkRGBA inputbar_foreground; /**< The foreground color of the inputbar */ GdkRGBA inputbar_background; /**< The background color of the inputbar */ GdkRGBA statusbar_foreground; /**< The foreground color of the statusbar */ GdkRGBA statusbar_background; /**< The background color of the statusbar */ GdkRGBA completion_foreground; /**< The foreground color of a completion item */ GdkRGBA completion_background; /**< The background color of a completion item */ GdkRGBA completion_group_foreground; /**< The foreground color of a completion group entry */ GdkRGBA completion_group_background; /**< The background color of a completion group entry */ GdkRGBA completion_highlight_foreground; /**< The foreground color of a highlighted completion item */ GdkRGBA completion_highlight_background; /**< The background color of a highlighted completion item */ GdkRGBA notification_error_foreground; /**< The foreground color of an error notification */ GdkRGBA notification_error_background; /**< The background color of an error notification */ GdkRGBA notification_warning_foreground; /**< The foreground color of a warning notification */ GdkRGBA notification_warning_background; /**< The background color of a warning notification */ GdkRGBA notification_default_foreground; /**< The foreground color of a default notification */ GdkRGBA notification_default_background; /**< The background color of a default notification */ GdkRGBA tabbar_foreground; /**< The foreground color for a tab */ GdkRGBA tabbar_background; /**< The background color for a tab */ GdkRGBA tabbar_focus_foreground; /**< The foreground color for a focused tab */ GdkRGBA tabbar_focus_background; /**< The background color for a focused tab */ PangoFontDescription *font; /**< The used font */ } style; struct { girara_list_t* mouse_events; /**< List of mouse events */ girara_list_t* commands; /**< List of commands */ girara_list_t* shortcuts; /**< List of shortcuts */ girara_list_t* special_commands; /**< List of special commands */ girara_list_t* inputbar_shortcuts; /**< List of inputbar shortcuts */ } bindings; struct { girara_list_t* statusbar_items; /**< List of statusbar items */ } elements; /** * List of settings (deprecated) */ girara_list_t* GIRARA_DEPRECATED(settings); struct { int inputbar_activate; /**< Inputbar activation */ int inputbar_key_pressed; /**< Pressed key in inputbar */ int inputbar_changed; /**< Inputbar text changed */ int view_key_pressed; /**< Pressed key in view */ int view_button_press_event; /**< Pressed button */ int view_button_release_event; /**< Released button */ int view_motion_notify_event; /**< Cursor movement event */ int view_scroll_event; /**< Scroll event */ girara_callback_inputbar_activate_t inputbar_custom_activate; /**< Custom handler */ girara_callback_inputbar_key_press_event_t inputbar_custom_key_press_event; /**< Custom handler */ void* inputbar_custom_data; /**< Data for custom handler */ } signals; struct { void (*buffer_changed)(girara_session_t* session); /**< Buffer changed */ bool (*unknown_command)(girara_session_t* session, const char* input); /**< Unknown command */ } events; struct { GString *buffer; /**< Buffer */ void* data; /**< User data */ girara_list_t* GIRARA_DEPRECATED(command_history); /**< Command history (deprecated) */ bool autohide_inputbar; /**< Auto-hide inputbar */ bool hide_statusbar; /**< Hide statusbar */ } global; struct { girara_mode_t current_mode; /**< Current mode */ girara_list_t *identifiers; /**< List of modes with its string identifiers */ girara_mode_t normal; /**< The normal mode */ girara_mode_t inputbar; /**< The inputbar mode */ } modes; struct { int n; /**< Numeric buffer */ GString *command; /**< Command in buffer */ } buffer; struct { girara_list_t* handles; girara_list_t* shortcut_mappings; girara_list_t* argument_mappings; } config; GiraraInputHistory* command_history; /**< Command history */ girara_session_private_t* private_data; /**< Private data of a girara session */ }; /** * Creates a girara session * * @return A valid session object * @return NULL when an error occured */ girara_session_t* girara_session_create(); /** * Initializes an girara session * * @param session The used girara session * @param appname Name of the session (can be NULL) * @return TRUE No error occured * @return FALSE An error occured */ bool girara_session_init(girara_session_t* session, const char* appname); /** * Destroys an girara session * * @param session The used girara session * @return TRUE No error occured * @return FALSE An error occured */ bool girara_session_destroy(girara_session_t* session); /** * Sets the view widget of girara * * @param session The used girara session * @param widget The widget that should be displayed * @return TRUE No error occured * @return FALSE An error occured */ bool girara_set_view(girara_session_t* session, GtkWidget* widget); /** * Returns a copy of the buffer * * @param session The used girara session * @return Copy of the current buffer */ char* girara_buffer_get(girara_session_t* session); /** * Displays a notification for the user. It is possible to pass GIRARA_INFO, * GIRARA_WARNING or GIRARA_ERROR as a notification level. * * @param session The girara session * @param level The level * @param format String format * @param ... */ void girara_notify(girara_session_t* session, int level, const char* format, ...) GIRARA_PRINTF(3, 4); /** * Creates a girara dialog * * @param session The girara session * @param dialog The dialog message * @param invisible Sets the input visibility * @param key_press_event Callback function to a custom key press event handler * @param activate_event Callback function to a custom activate event handler * @param data Custom data that is passed to the callback functions */ void girara_dialog(girara_session_t* session, const char* dialog, bool invisible, girara_callback_inputbar_key_press_event_t key_press_event, girara_callback_inputbar_activate_t activate_event, void* data); /** * Adds a new mode by its string identifier * * @param session The used girara session * @param name The string identifier used in configs/inputbar etc to refer by * @return A newly defined girara_mode_t associated with name */ girara_mode_t girara_mode_add(girara_session_t* session, const char* name); /** * Sets the current mode * * @param session The used girara session * @param mode The new mode */ void girara_mode_set(girara_session_t* session, girara_mode_t mode); /** * Returns the current mode * * @param session The used girara session * @return The current mode */ girara_mode_t girara_mode_get(girara_session_t* session); /** * Set name of the window title * * @param session The used girara session * @param name The new name of the session * @return true if no error occured * @return false if an error occured */ bool girara_set_window_title(girara_session_t* session, const char* name); /** * Returns the command history * * @param session The used girara session * @return The command history (list of strings) or NULL */ girara_list_t* girara_get_command_history(girara_session_t* session); #endif girara-0.1.9/statusbar.h0000644000175000001440000000377212242417112014024 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_STATUSBAR_H #define GIRARA_STATUSBAR_H #include "types.h" #include /** * Function declaration for a statusbar event callback * * @param widget The statusbar item * @param event The occured event * @param session The current girara session * @return TRUE No error occured * @return FALSE Error occured (and forward event) */ typedef bool (*girara_statusbar_event_t)(GtkWidget* widget, GdkEvent* event, girara_session_t* session); /** * Creates an statusbar item * * @param session The used girara session * @param expand Expand attribute * @param fill Fill attribute * @param left True if it should be aligned to the left * @param callback Function that gets executed when an event occurs * @return The created statusbar item * @return NULL An error occured */ girara_statusbar_item_t* girara_statusbar_item_add(girara_session_t* session, bool expand, bool fill, bool left, girara_statusbar_event_t callback); /** * Sets the shown text of an statusbar item * * @param session The used girara session * @param item The statusbar item * @param text Text that should be displayed * @return TRUE No error occured * @return FALSE An error occured */ bool girara_statusbar_item_set_text(girara_session_t* session, girara_statusbar_item_t* item, const char* text); /** * Sets the foreground color of an statusbar item * * @param session The used girara session * @param item The statusbar item * @param color The color code * @return TRUE No error occured * @return FALSE An error occured */ bool girara_statusbar_item_set_foreground(girara_session_t* session, girara_statusbar_item_t* item, const char* color); /** * Sets the background color of the statusbar * * @param session The used girara session * @param color The color code * @return TRUE No error occured * @return FALSE An error occured */ bool girara_statusbar_set_background(girara_session_t* session, const char* color); #endif girara-0.1.9/utils.h0000644000175000001440000001165112242417112013147 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_UTILS_H #define GIRARA_UTILS_H #include #include "types.h" #include "macros.h" /** * Enum for directories specified in the XDG specification. */ typedef enum { XDG_CONFIG, /**< XDG_CONFIG_HOME */ XDG_DATA, /**< XDG_DATA_HOME */ XDG_CONFIG_DIRS, /**< XDG_CONFIG_DIRS */ XDG_DATA_DIRS, /**< XDG_DATA_DIRS */ } girara_xdg_path_t; /** * Returns the home directory for the given user. $HOME is prefered over the * value from g_get_home_dir. * * @param user a username or NULL to get home directory of the current user. * @return a string containing the path to the user's home directory (needs to * be freed with g_free) or NULL if the user doesn't exist. */ char* girara_get_home_directory(const char* user); /** * Returns a specific path specified in the XDG specification. ~ in paths will * not be expanded. * @param path which path to get * @return a string containing the requested patch (needs to be freed with * g_free) or NULL for invalid values. */ char* girara_get_xdg_path(girara_xdg_path_t path); /** * Opens a URI with xdg-open. * * @param uri the URI to be opened. * @return true on success, false otherwise */ bool girara_xdg_open(const char* uri); /** * Splits paths seperated by : (as in $PATH) into a list. * * @param patharray String like $PATH to split * @return a list of paths and NULL on failure. */ girara_list_t* girara_split_path_array(const char* patharray); /** * Returns a "fixed" version of path. Which means, it will be an absolute path * and fully expanded. ~ and ~user will be replaced by the current user's home * directory (user's home directory respectively). * @param path the path to "fix". * @return the "fixed" path (needs to be freed with g_free). */ char* girara_fix_path(const char* path); /** * Open a file in a safe way * * @param path Path of the file * @param mode Mode that the file should be opened * @return NULL if an error occured */ FILE* girara_file_open(const char* path, const char* mode); /** * Reads a line from the file. Returned string has to be freed. * * @param file The file stream * @return Read line or NULL if an error occured */ char* girara_file_read_line(FILE* file); /** * Reads the whole content from a file. Returned string has to be freed. * * @param path Path to the file * @return Read file or NULL if an error occured */ char* girara_file_read(const char* path); /** * Reads the whole content from a file. Returned string has to be freed. * * @param file file to read * @return Read file or NULL if an error occured */ char* girara_file_read2(FILE* file); /** * Trims and cleans a line from multiple whitespaces * * @param line */ void girara_clean_line(char* line); /** * Changes the size of the memory block by wrapping a realloc function call * In addition it frees the old memory block if realloc fails. * * @param ptr Memory space * @param size Number of bytes * @return Pointer to the allocated memory block or NULL */ void* girara_safe_realloc(void** ptr, size_t size); /** * Prints a debug message. The arguments are passed to @ref _girara_debug as * last argument. */ #define girara_debug(...) _girara_debug(__FUNCTION__, __LINE__, GIRARA_DEBUG, __VA_ARGS__) /** * Prints an info message. The arguments are passed to @ref _girara_debug as * last argument. */ #define girara_info(...) _girara_debug(__FUNCTION__, __LINE__, GIRARA_INFO, __VA_ARGS__) /** * Prints a warning message. The arguments are passed to @ref _girara_debug as * last argument. */ #define girara_warning(...) _girara_debug(__FUNCTION__, __LINE__, GIRARA_WARNING, __VA_ARGS__) /** * Prints an error message. The arguments are passed to @ref _girara_debug as * last argument. */ #define girara_error(...) _girara_debug(__FUNCTION__, __LINE__, GIRARA_ERROR, __VA_ARGS__) /** * Print a message. * * @param function The calling function * @param line The line of the call * @param level The debug level of the message. * @param format printf like format string */ void _girara_debug(const char* function, int line, girara_debug_level_t level, const char* format, ...) GIRARA_PRINTF(4, 5); /** * Get the debug level. * @returns The debug level. */ girara_debug_level_t girara_get_debug_level(); /** * Set the debug level. Any message with a level lower than the debug level will * be discarded. * @param level The new debug level. */ void girara_set_debug_level(girara_debug_level_t level); /** * Escape \\, \\t, ", ' and spaces in strings. * @param value The string to be escaped. * @returns The escaped string. Needs to be freed with g_free. */ char* girara_escape_string(const char* value); /** * Execute command from argument list * * @param session The used girara session * @param argument_list The argument list * @return true if no error occured */ bool girara_exec_with_argument_list(girara_session_t* session, girara_list_t* argument_list); #endif girara-0.1.9/common.mk0000644000175000001440000000017612242417112013457 0ustar mockusers# See LICENSE file for license and copyright information ifeq "$(VERBOSE)" "0" ECHO=@echo QUIET=@ else ECHO=@\# QUIET= endif girara-0.1.9/utils.c0000644000175000001440000002353212242417112013143 0ustar mockusers/* See LICENSE file for license and copyright information */ #define _BSD_SOURCE #if !defined(__OpenBSD__) && !defined(__FreeBSD__) && !defined(__NetBSD__) #define _XOPEN_SOURCE 700 #endif #define _FILE_OFFSET_BITS 64 #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include "utils.h" #include "datastructures.h" #include "session.h" #include "settings.h" #define BLOCK_SIZE 64 char* girara_fix_path(const char* path) { if (path == NULL) { return NULL; } char* rpath = NULL; if (path[0] == '~') { const size_t len = strlen(path); char* user = NULL; size_t idx = 1; if (len > 1 && path[1] != '/') { while (path[idx] && path[idx] != '/') { ++idx; } user = g_strndup(path + 1, idx - 1); } char* home_path = girara_get_home_directory(user); g_free(user); if (home_path == NULL) { return g_strdup(path); } rpath = g_build_filename(home_path, path + idx, NULL); g_free(home_path); } else { rpath = g_strdup(path); } return rpath; } bool girara_xdg_open(const char* uri) { if (uri == NULL || strlen(uri) == 0) { return false; } GString* command = g_string_new("xdg-open "); char* tmp = g_shell_quote(uri); g_string_append(command, tmp); g_free(tmp); GError* error = NULL; bool res = g_spawn_command_line_async(command->str, &error); if (error != NULL) { girara_warning("Failed to execute command: %s", error->message); g_error_free(error); } g_string_free(command, TRUE); return res; } char* girara_get_home_directory(const char* user) { if (user == NULL || g_strcmp0(user, g_get_user_name()) == 0) { #if GLIB_CHECK_VERSION(2, 35, 3) return g_strdup(g_get_home_dir()); #else const char* homedir = g_getenv("HOME"); return g_strdup(homedir ? homedir : g_get_home_dir()); #endif } // XXX: The following code is very unportable. struct passwd pwd; struct passwd* result; #ifdef _SC_GETPW_R_SIZE_MAX int bufsize = sysconf(_SC_GETPW_R_SIZE_MAX); if (bufsize < 0) { bufsize = 4096; } #else int bufsize = 4096; #endif char* buffer = g_malloc0(sizeof(char) * bufsize); getpwnam_r(user, &pwd, buffer, bufsize, &result); if (result == NULL) { g_free(buffer); return NULL; } char* dir = g_strdup(pwd.pw_dir); g_free(buffer); return dir; } char* girara_get_xdg_path(girara_xdg_path_t path) { static const char* VARS[] = { "XDG_CONFIG_HOME", "XDG_DATA_HOME", "XDG_CONFIG_DIRS", "XDG_DATA_DIRS" }; static const char* DEFAULTS[] = { "NOTUSED", "NOTUSED", "/etc/xdg", "/usr/local/share/:/usr/share", }; switch (path) { case XDG_DATA: return g_strdup(g_get_user_data_dir()); case XDG_CONFIG: return g_strdup(g_get_user_config_dir()); case XDG_CONFIG_DIRS: case XDG_DATA_DIRS: { const char* tmp = g_getenv(VARS[path]); if (tmp == NULL || !g_strcmp0(tmp, "")) { return g_strdup(DEFAULTS[path]); } return g_strdup(tmp); } } return NULL; } girara_list_t* girara_split_path_array(const char* patharray) { if (patharray == NULL || !g_strcmp0(patharray, "")) { return NULL; } girara_list_t* res = girara_list_new2(g_free); char** paths = g_strsplit(patharray, ":", 0); for (size_t i = 0; paths[i] != NULL; ++i) { girara_list_append(res, g_strdup(paths[i])); } g_strfreev(paths); return res; } FILE* girara_file_open(const char* path, const char* mode) { char* fixed_path = girara_fix_path(path); if (fixed_path == NULL || mode == NULL) { return NULL; } FILE* fp = fopen(fixed_path, mode); g_free(fixed_path); if (fp == NULL) { return NULL; } return fp; /* TODO */ /*FILE* fp;*/ /*struct stat lstat;*/ /*struct stat fstat;*/ /*int fd;*/ /*char* mode = "rb+";*/ /*if (lstat(path, &lstat) == -1) {*/ /*if (errno != ENOENT) {*/ /*return NULL;*/ /*}*/ /*if ((fd = open(path, O_CREAT | O_EXCL | O_RDWR, 0600)) == -1) {*/ /*return NULL;*/ /*}*/ /*mode = "wb";*/ /*} else {*/ /*if ((fd = open(path, O_RDONLY)) == -1) {*/ /*return NULL;*/ /*}*/ /*if (fstat(fd, &fstat) == -1) {*/ /*if (lstat.st_mode != fstat.st_mode ||*/ /*lstat.st_ino != fstat.st_ino ||*/ /*lstat.st_dev != fstat.st_dev) {*/ /*close(fd);*/ /*return NULL;*/ /*}*/ /*}*/ /*ftruncate(fd, 0);*/ /*}*/ /*if ((fp = fdopen(fd, mode)) == NULL) {*/ /*close(fd);*/ /*unlink(path);*/ /*return NULL;*/ /*}*/ /*return fp;*/ } #if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__) char* girara_file_read_line(FILE* file) { if (file == NULL) { return NULL; } size_t size = 0; char* line = fgetln(file, &size); if (line == NULL) { return NULL; } char* copy = strndup(line, size); if (copy == NULL) { return NULL; } /* remove the trailing line deliminator */ g_strdelimit(copy, "\n\r", '\0'); return copy; } #else char* girara_file_read_line(FILE* file) { if (file == NULL) { return NULL; } size_t size = 0; char* line = NULL; if (getline(&line, &size, file) == -1) { if (line != NULL) { free(line); } return NULL; } /* remove the trailing line deliminator */ g_strdelimit(line, "\n\r", '\0'); return line; } #endif char* girara_file_read(const char* path) { if (path == NULL) { return NULL; } FILE* file = girara_file_open(path, "r"); if (file == NULL) { return NULL; } char* content = girara_file_read2(file); fclose(file); return content; } char* girara_file_read2(FILE* file) { if (file == NULL) { return NULL; } const off_t curpos = ftello(file); if (curpos == -1) { return NULL; } fseeko(file, 0, SEEK_END); const off_t size = ftello(file) - curpos; fseeko(file, curpos, SEEK_SET); if (size == 0) { char* content = malloc(1); content[0] = '\0'; return content; } /* this can happen on 32 bit systems */ if ((uintmax_t)size >= (uintmax_t)SIZE_MAX) { girara_error("file is too large"); return NULL; } char* buffer = malloc(size + 1); if (!buffer) { return NULL; } size_t read = fread(buffer, size, 1, file); if (read != 1) { free(buffer); return NULL; } buffer[size] = '\0'; return buffer; } void girara_clean_line(char* line) { if (line == NULL) { return; } unsigned int i = 0; unsigned int j = 0; bool ws_mode = true; for(i = 0; i < strlen(line); i++) { if (isspace(line[i]) != 0) { if (ws_mode) { continue; } line[j++] = ' '; ws_mode = true; } else { line[j++] = line[i]; ws_mode = false; } } line[j] = '\0'; } void* girara_safe_realloc(void** ptr, size_t size) { if(ptr == NULL) { return NULL; } if (size == 0) { goto error_free; } void* tmp = realloc(*ptr, size); if(tmp == NULL) { goto error_free; } *ptr = tmp; return *ptr; error_free: free(*ptr); *ptr = NULL; return NULL; } static girara_debug_level_t debug_level = GIRARA_DEBUG; void _girara_debug(const char* function, int line, girara_debug_level_t level, const char* format, ...) { if (level < debug_level) { return; } switch (level) { case GIRARA_WARNING: fprintf(stderr, "warning: "); break; case GIRARA_ERROR: fprintf(stderr, "error: "); break; case GIRARA_INFO: fprintf(stderr, "info: "); break; case GIRARA_DEBUG: fprintf(stderr, "debug: (%s:%d) ", function, line); break; default: return; } va_list ap; va_start(ap, format); vfprintf(stderr, format, ap); va_end(ap); fprintf(stderr, "\n"); } girara_debug_level_t girara_get_debug_level() { return debug_level; } void girara_set_debug_level(girara_debug_level_t level) { debug_level = level; } void update_state_by_keyval(int *state, int keyval) { if (state == NULL) { return; } if ((keyval >= '!' && keyval <= '/') || (keyval >= ':' && keyval <= '@') || (keyval >= '[' && keyval <= '`') || (keyval >= '{' && keyval <= '~') ) { *state |= GDK_SHIFT_MASK; } } char* girara_escape_string(const char* value) { if (value == NULL) { return NULL; } GString* str = g_string_new(""); while (*value != '\0') { const char c = *value++; if (strchr("\\ \t\"\'", c) != NULL) { g_string_append_c(str, '\\'); } g_string_append_c(str, c); } return g_string_free(str, FALSE); } bool girara_exec_with_argument_list(girara_session_t* session, girara_list_t* argument_list) { if (session == NULL || argument_list == NULL) { return false; } char* cmd = NULL; girara_setting_get(session, "exec-command", &cmd); if (cmd == NULL || strlen(cmd) == 0) { girara_debug("exec-command is empty, executing directly."); g_free(cmd); cmd = NULL; } bool dont_append_first_space = cmd == NULL; GString* command = g_string_new(cmd ? cmd : ""); g_free(cmd); GIRARA_LIST_FOREACH(argument_list, char*, iter, value) if (dont_append_first_space == false) { g_string_append_c(command, ' '); } dont_append_first_space = false; char* tmp = g_shell_quote(value); g_string_append(command, tmp); g_free(tmp); GIRARA_LIST_FOREACH_END(argument_list, char*, iter, value); GError* error = NULL; girara_info("executing: %s", command->str); gboolean ret = g_spawn_command_line_async(command->str, &error); if (error != NULL) { girara_warning("Failed to execute command: %s", error->message); girara_notify(session, GIRARA_ERROR, _("Failed to execute command: %s"), error->message); g_error_free(error); } g_string_free(command, TRUE); return ret; } girara-0.1.9/girara.h0000644000175000001440000000061212242417112013247 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_H #define GIRARA_H #include "types.h" #include "session.h" #include "utils.h" #include "datastructures.h" #include "settings.h" #include "completion.h" #include "tabs.h" #include "config.h" #include "statusbar.h" #include "shortcuts.h" #include "commands.h" #include "callbacks.h" #include "input-history.h" #endif girara-0.1.9/LICENSE0000644000175000001440000000153712242417112012645 0ustar mockusersCopyright (c) 2010-2013 pwmt.org This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. girara-0.1.9/gtk2-compat.h0000644000175000001440000030266712242417112014151 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_GTK2_COMPAT_H #define GIRARA_GTK2_COMPAT_H #if GTK_MAJOR_VERSION == 2 #if GTK_MINOR_VERSION < 22 #include // auto generated with grep "#define GDK_KEY" gdk/gdkkeysyms.h | awk '{print // "#define "$2 " " $2}' | gawk '{$0=gensub(/_KEY/,"",2)}; 1' #define GDK_KEY_VoidSymbol GDK_VoidSymbol #define GDK_KEY_BackSpace GDK_BackSpace #define GDK_KEY_Tab GDK_Tab #define GDK_KEY_Linefeed GDK_Linefeed #define GDK_KEY_Clear GDK_Clear #define GDK_KEY_Return GDK_Return #define GDK_KEY_Pause GDK_Pause #define GDK_KEY_Scroll_Lock GDK_Scroll_Lock #define GDK_KEY_Sys_Req GDK_Sys_Req #define GDK_KEY_Escape GDK_Escape #define GDK_KEY_Delete GDK_Delete #define GDK_KEY_Multi_key GDK_Multi_key #define GDK_KEY_Codeinput GDK_Codeinput #define GDK_KEY_SingleCandidate GDK_SingleCandidate #define GDK_KEY_MultipleCandidate GDK_MultipleCandidate #define GDK_KEY_PreviousCandidate GDK_PreviousCandidate #define GDK_KEY_Kanji GDK_Kanji #define GDK_KEY_Muhenkan GDK_Muhenkan #define GDK_KEY_Henkan_Mode GDK_Henkan_Mode #define GDK_KEY_Henkan GDK_Henkan #define GDK_KEY_Romaji GDK_Romaji #define GDK_KEY_Hiragana GDK_Hiragana #define GDK_KEY_Katakana GDK_Katakana #define GDK_KEY_Hiragana_Katakana GDK_Hiragana_Katakana #define GDK_KEY_Zenkaku GDK_Zenkaku #define GDK_KEY_Hankaku GDK_Hankaku #define GDK_KEY_Zenkaku_Hankaku GDK_Zenkaku_Hankaku #define GDK_KEY_Touroku GDK_Touroku #define GDK_KEY_Massyo GDK_Massyo #define GDK_KEY_Kana_Lock GDK_Kana_Lock #define GDK_KEY_Kana_Shift GDK_Kana_Shift #define GDK_KEY_Eisu_Shift GDK_Eisu_Shift #define GDK_KEY_Eisu_toggle GDK_Eisu_toggle #define GDK_KEY_Kanji_Bangou GDK_Kanji_Bangou #define GDK_KEY_Zen_Koho GDK_Zen_Koho #define GDK_KEY_Mae_Koho GDK_Mae_Koho #define GDK_KEY_Home GDK_Home #define GDK_KEY_Left GDK_Left #define GDK_KEY_Up GDK_Up #define GDK_KEY_Right GDK_Right #define GDK_KEY_Down GDK_Down #define GDK_KEY_Prior GDK_Prior #define GDK_KEY_Page_Up GDK_Page_Up #define GDK_KEY_Next GDK_Next #define GDK_KEY_Page_Down GDK_Page_Down #define GDK_KEY_End GDK_End #define GDK_KEY_Begin GDK_Begin #define GDK_KEY_Select GDK_Select #define GDK_KEY_Print GDK_Print #define GDK_KEY_Execute GDK_Execute #define GDK_KEY_Insert GDK_Insert #define GDK_KEY_Undo GDK_Undo #define GDK_KEY_Redo GDK_Redo #define GDK_KEY_Menu GDK_Menu #define GDK_KEY_Find GDK_Find #define GDK_KEY_Cancel GDK_Cancel #define GDK_KEY_Help GDK_Help #define GDK_KEY_Break GDK_Break #define GDK_KEY_Mode_switch GDK_Mode_switch #define GDK_KEY_script_switch GDK_script_switch #define GDK_KEY_Num_Lock GDK_Num_Lock #define GDK_KEY_KP_Space GDK_KP_Space #define GDK_KEY_KP_Tab GDK_KP_Tab #define GDK_KEY_KP_Enter GDK_KP_Enter #define GDK_KEY_KP_F1 GDK_KP_F1 #define GDK_KEY_KP_F2 GDK_KP_F2 #define GDK_KEY_KP_F3 GDK_KP_F3 #define GDK_KEY_KP_F4 GDK_KP_F4 #define GDK_KEY_KP_Home GDK_KP_Home #define GDK_KEY_KP_Left GDK_KP_Left #define GDK_KEY_KP_Up GDK_KP_Up #define GDK_KEY_KP_Right GDK_KP_Right #define GDK_KEY_KP_Down GDK_KP_Down #define GDK_KEY_KP_Prior GDK_KP_Prior #define GDK_KEY_KP_Page_Up GDK_KP_Page_Up #define GDK_KEY_KP_Next GDK_KP_Next #define GDK_KEY_KP_Page_Down GDK_KP_Page_Down #define GDK_KEY_KP_End GDK_KP_End #define GDK_KEY_KP_Begin GDK_KP_Begin #define GDK_KEY_KP_Insert GDK_KP_Insert #define GDK_KEY_KP_Delete GDK_KP_Delete #define GDK_KEY_KP_Equal GDK_KP_Equal #define GDK_KEY_KP_Multiply GDK_KP_Multiply #define GDK_KEY_KP_Add GDK_KP_Add #define GDK_KEY_KP_Separator GDK_KP_Separator #define GDK_KEY_KP_Subtract GDK_KP_Subtract #define GDK_KEY_KP_Decimal GDK_KP_Decimal #define GDK_KEY_KP_Divide GDK_KP_Divide #define GDK_KEY_KP_0 GDK_KP_0 #define GDK_KEY_KP_1 GDK_KP_1 #define GDK_KEY_KP_2 GDK_KP_2 #define GDK_KEY_KP_3 GDK_KP_3 #define GDK_KEY_KP_4 GDK_KP_4 #define GDK_KEY_KP_5 GDK_KP_5 #define GDK_KEY_KP_6 GDK_KP_6 #define GDK_KEY_KP_7 GDK_KP_7 #define GDK_KEY_KP_8 GDK_KP_8 #define GDK_KEY_KP_9 GDK_KP_9 #define GDK_KEY_F1 GDK_F1 #define GDK_KEY_F2 GDK_F2 #define GDK_KEY_F3 GDK_F3 #define GDK_KEY_F4 GDK_F4 #define GDK_KEY_F5 GDK_F5 #define GDK_KEY_F6 GDK_F6 #define GDK_KEY_F7 GDK_F7 #define GDK_KEY_F8 GDK_F8 #define GDK_KEY_F9 GDK_F9 #define GDK_KEY_F10 GDK_F10 #define GDK_KEY_F11 GDK_F11 #define GDK_KEY_L1 GDK_L1 #define GDK_KEY_F12 GDK_F12 #define GDK_KEY_L2 GDK_L2 #define GDK_KEY_F13 GDK_F13 #define GDK_KEY_L3 GDK_L3 #define GDK_KEY_F14 GDK_F14 #define GDK_KEY_L4 GDK_L4 #define GDK_KEY_F15 GDK_F15 #define GDK_KEY_L5 GDK_L5 #define GDK_KEY_F16 GDK_F16 #define GDK_KEY_L6 GDK_L6 #define GDK_KEY_F17 GDK_F17 #define GDK_KEY_L7 GDK_L7 #define GDK_KEY_F18 GDK_F18 #define GDK_KEY_L8 GDK_L8 #define GDK_KEY_F19 GDK_F19 #define GDK_KEY_L9 GDK_L9 #define GDK_KEY_F20 GDK_F20 #define GDK_KEY_L10 GDK_L10 #define GDK_KEY_F21 GDK_F21 #define GDK_KEY_R1 GDK_R1 #define GDK_KEY_F22 GDK_F22 #define GDK_KEY_R2 GDK_R2 #define GDK_KEY_F23 GDK_F23 #define GDK_KEY_R3 GDK_R3 #define GDK_KEY_F24 GDK_F24 #define GDK_KEY_R4 GDK_R4 #define GDK_KEY_F25 GDK_F25 #define GDK_KEY_R5 GDK_R5 #define GDK_KEY_F26 GDK_F26 #define GDK_KEY_R6 GDK_R6 #define GDK_KEY_F27 GDK_F27 #define GDK_KEY_R7 GDK_R7 #define GDK_KEY_F28 GDK_F28 #define GDK_KEY_R8 GDK_R8 #define GDK_KEY_F29 GDK_F29 #define GDK_KEY_R9 GDK_R9 #define GDK_KEY_F30 GDK_F30 #define GDK_KEY_R10 GDK_R10 #define GDK_KEY_F31 GDK_F31 #define GDK_KEY_R11 GDK_R11 #define GDK_KEY_F32 GDK_F32 #define GDK_KEY_R12 GDK_R12 #define GDK_KEY_F33 GDK_F33 #define GDK_KEY_R13 GDK_R13 #define GDK_KEY_F34 GDK_F34 #define GDK_KEY_R14 GDK_R14 #define GDK_KEY_F35 GDK_F35 #define GDK_KEY_R15 GDK_R15 #define GDK_KEY_Shift_L GDK_Shift_L #define GDK_KEY_Shift_R GDK_Shift_R #define GDK_KEY_Control_L GDK_Control_L #define GDK_KEY_Control_R GDK_Control_R #define GDK_KEY_Caps_Lock GDK_Caps_Lock #define GDK_KEY_Shift_Lock GDK_Shift_Lock #define GDK_KEY_Meta_L GDK_Meta_L #define GDK_KEY_Meta_R GDK_Meta_R #define GDK_KEY_Alt_L GDK_Alt_L #define GDK_KEY_Alt_R GDK_Alt_R #define GDK_KEY_Super_L GDK_Super_L #define GDK_KEY_Super_R GDK_Super_R #define GDK_KEY_Hyper_L GDK_Hyper_L #define GDK_KEY_Hyper_R GDK_Hyper_R #define GDK_KEY_ISO_Lock GDK_ISO_Lock #define GDK_KEY_ISO_Level2_Latch GDK_ISO_Level2_Latch #define GDK_KEY_ISO_Level3_Shift GDK_ISO_Level3_Shift #define GDK_KEY_ISO_Level3_Latch GDK_ISO_Level3_Latch #define GDK_KEY_ISO_Level3_Lock GDK_ISO_Level3_Lock #define GDK_KEY_ISO_Level5_Shift GDK_ISO_Level5_Shift #define GDK_KEY_ISO_Level5_Latch GDK_ISO_Level5_Latch #define GDK_KEY_ISO_Level5_Lock GDK_ISO_Level5_Lock #define GDK_KEY_ISO_Group_Shift GDK_ISO_Group_Shift #define GDK_KEY_ISO_Group_Latch GDK_ISO_Group_Latch #define GDK_KEY_ISO_Group_Lock GDK_ISO_Group_Lock #define GDK_KEY_ISO_Next_Group GDK_ISO_Next_Group #define GDK_KEY_ISO_Next_Group_Lock GDK_ISO_Next_Group_Lock #define GDK_KEY_ISO_Prev_Group GDK_ISO_Prev_Group #define GDK_KEY_ISO_Prev_Group_Lock GDK_ISO_Prev_Group_Lock #define GDK_KEY_ISO_First_Group GDK_ISO_First_Group #define GDK_KEY_ISO_First_Group_Lock GDK_ISO_First_Group_Lock #define GDK_KEY_ISO_Last_Group GDK_ISO_Last_Group #define GDK_KEY_ISO_Last_Group_Lock GDK_ISO_Last_Group_Lock #define GDK_KEY_ISO_Left_Tab GDK_ISO_Left_Tab #define GDK_KEY_ISO_Move_Line_Up GDK_ISO_Move_Line_Up #define GDK_KEY_ISO_Move_Line_Down GDK_ISO_Move_Line_Down #define GDK_KEY_ISO_Partial_Line_Up GDK_ISO_Partial_Line_Up #define GDK_KEY_ISO_Partial_Line_Down GDK_ISO_Partial_Line_Down #define GDK_KEY_ISO_Partial_Space_Left GDK_ISO_Partial_Space_Left #define GDK_KEY_ISO_Partial_Space_Right GDK_ISO_Partial_Space_Right #define GDK_KEY_ISO_Set_Margin_Left GDK_ISO_Set_Margin_Left #define GDK_KEY_ISO_Set_Margin_Right GDK_ISO_Set_Margin_Right #define GDK_KEY_ISO_Release_Margin_Left GDK_ISO_Release_Margin_Left #define GDK_KEY_ISO_Release_Margin_Right GDK_ISO_Release_Margin_Right #define GDK_KEY_ISO_Release_Both_Margins GDK_ISO_Release_Both_Margins #define GDK_KEY_ISO_Fast_Cursor_Left GDK_ISO_Fast_Cursor_Left #define GDK_KEY_ISO_Fast_Cursor_Right GDK_ISO_Fast_Cursor_Right #define GDK_KEY_ISO_Fast_Cursor_Up GDK_ISO_Fast_Cursor_Up #define GDK_KEY_ISO_Fast_Cursor_Down GDK_ISO_Fast_Cursor_Down #define GDK_KEY_ISO_Continuous_Underline GDK_ISO_Continuous_Underline #define GDK_KEY_ISO_Discontinuous_Underline GDK_ISO_Discontinuous_Underline #define GDK_KEY_ISO_Emphasize GDK_ISO_Emphasize #define GDK_KEY_ISO_Center_Object GDK_ISO_Center_Object #define GDK_KEY_ISO_Enter GDK_ISO_Enter #define GDK_KEY_dead_grave GDK_dead_grave #define GDK_KEY_dead_acute GDK_dead_acute #define GDK_KEY_dead_circumflex GDK_dead_circumflex #define GDK_KEY_dead_tilde GDK_dead_tilde #define GDK_KEY_dead_perispomeni GDK_dead_perispomeni #define GDK_KEY_dead_macron GDK_dead_macron #define GDK_KEY_dead_breve GDK_dead_breve #define GDK_KEY_dead_abovedot GDK_dead_abovedot #define GDK_KEY_dead_diaeresis GDK_dead_diaeresis #define GDK_KEY_dead_abovering GDK_dead_abovering #define GDK_KEY_dead_doubleacute GDK_dead_doubleacute #define GDK_KEY_dead_caron GDK_dead_caron #define GDK_KEY_dead_cedilla GDK_dead_cedilla #define GDK_KEY_dead_ogonek GDK_dead_ogonek #define GDK_KEY_dead_iota GDK_dead_iota #define GDK_KEY_dead_voiced_sound GDK_dead_voiced_sound #define GDK_KEY_dead_semivoiced_sound GDK_dead_semivoiced_sound #define GDK_KEY_dead_belowdot GDK_dead_belowdot #define GDK_KEY_dead_hook GDK_dead_hook #define GDK_KEY_dead_horn GDK_dead_horn #define GDK_KEY_dead_stroke GDK_dead_stroke #define GDK_KEY_dead_abovecomma GDK_dead_abovecomma #define GDK_KEY_dead_psili GDK_dead_psili #define GDK_KEY_dead_abovereversedcomma GDK_dead_abovereversedcomma #define GDK_KEY_dead_dasia GDK_dead_dasia #define GDK_KEY_dead_doublegrave GDK_dead_doublegrave #define GDK_KEY_dead_belowring GDK_dead_belowring #define GDK_KEY_dead_belowmacron GDK_dead_belowmacron #define GDK_KEY_dead_belowcircumflex GDK_dead_belowcircumflex #define GDK_KEY_dead_belowtilde GDK_dead_belowtilde #define GDK_KEY_dead_belowbreve GDK_dead_belowbreve #define GDK_KEY_dead_belowdiaeresis GDK_dead_belowdiaeresis #define GDK_KEY_dead_invertedbreve GDK_dead_invertedbreve #define GDK_KEY_dead_belowcomma GDK_dead_belowcomma #define GDK_KEY_dead_currency GDK_dead_currency #define GDK_KEY_dead_a GDK_dead_a #define GDK_KEY_dead_A GDK_dead_A #define GDK_KEY_dead_e GDK_dead_e #define GDK_KEY_dead_E GDK_dead_E #define GDK_KEY_dead_i GDK_dead_i #define GDK_KEY_dead_I GDK_dead_I #define GDK_KEY_dead_o GDK_dead_o #define GDK_KEY_dead_O GDK_dead_O #define GDK_KEY_dead_u GDK_dead_u #define GDK_KEY_dead_U GDK_dead_U #define GDK_KEY_dead_small_schwa GDK_dead_small_schwa #define GDK_KEY_dead_capital_schwa GDK_dead_capital_schwa #define GDK_KEY_First_Virtual_Screen GDK_First_Virtual_Screen #define GDK_KEY_Prev_Virtual_Screen GDK_Prev_Virtual_Screen #define GDK_KEY_Next_Virtual_Screen GDK_Next_Virtual_Screen #define GDK_KEY_Last_Virtual_Screen GDK_Last_Virtual_Screen #define GDK_KEY_Terminate_Server GDK_Terminate_Server #define GDK_KEY_AccessX_Enable GDK_AccessX_Enable #define GDK_KEY_AccessX_Feedback_Enable GDK_AccessX_Feedback_Enable #define GDK_KEY_RepeatKeys_Enable GDK_RepeatKeys_Enable #define GDK_KEY_SlowKeys_Enable GDK_SlowKeys_Enable #define GDK_KEY_BounceKeys_Enable GDK_BounceKeys_Enable #define GDK_KEY_StickyKeys_Enable GDK_StickyKeys_Enable #define GDK_KEY_MouseKeys_Enable GDK_MouseKeys_Enable #define GDK_KEY_MouseKeys_Accel_Enable GDK_MouseKeys_Accel_Enable #define GDK_KEY_Overlay1_Enable GDK_Overlay1_Enable #define GDK_KEY_Overlay2_Enable GDK_Overlay2_Enable #define GDK_KEY_AudibleBell_Enable GDK_AudibleBell_Enable #define GDK_KEY_Pointer_Left GDK_Pointer_Left #define GDK_KEY_Pointer_Right GDK_Pointer_Right #define GDK_KEY_Pointer_Up GDK_Pointer_Up #define GDK_KEY_Pointer_Down GDK_Pointer_Down #define GDK_KEY_Pointer_UpLeft GDK_Pointer_UpLeft #define GDK_KEY_Pointer_UpRight GDK_Pointer_UpRight #define GDK_KEY_Pointer_DownLeft GDK_Pointer_DownLeft #define GDK_KEY_Pointer_DownRight GDK_Pointer_DownRight #define GDK_KEY_Pointer_Button_Dflt GDK_Pointer_Button_Dflt #define GDK_KEY_Pointer_Button1 GDK_Pointer_Button1 #define GDK_KEY_Pointer_Button2 GDK_Pointer_Button2 #define GDK_KEY_Pointer_Button3 GDK_Pointer_Button3 #define GDK_KEY_Pointer_Button4 GDK_Pointer_Button4 #define GDK_KEY_Pointer_Button5 GDK_Pointer_Button5 #define GDK_KEY_Pointer_DblClick_Dflt GDK_Pointer_DblClick_Dflt #define GDK_KEY_Pointer_DblClick1 GDK_Pointer_DblClick1 #define GDK_KEY_Pointer_DblClick2 GDK_Pointer_DblClick2 #define GDK_KEY_Pointer_DblClick3 GDK_Pointer_DblClick3 #define GDK_KEY_Pointer_DblClick4 GDK_Pointer_DblClick4 #define GDK_KEY_Pointer_DblClick5 GDK_Pointer_DblClick5 #define GDK_KEY_Pointer_Drag_Dflt GDK_Pointer_Drag_Dflt #define GDK_KEY_Pointer_Drag1 GDK_Pointer_Drag1 #define GDK_KEY_Pointer_Drag2 GDK_Pointer_Drag2 #define GDK_KEY_Pointer_Drag3 GDK_Pointer_Drag3 #define GDK_KEY_Pointer_Drag4 GDK_Pointer_Drag4 #define GDK_KEY_Pointer_Drag5 GDK_Pointer_Drag5 #define GDK_KEY_Pointer_EnableKeys GDK_Pointer_EnableKeys #define GDK_KEY_Pointer_Accelerate GDK_Pointer_Accelerate #define GDK_KEY_Pointer_DfltBtnNext GDK_Pointer_DfltBtnNext #define GDK_KEY_Pointer_DfltBtnPrev GDK_Pointer_DfltBtnPrev #define GDK_KEY_3270_Duplicate GDK_3270_Duplicate #define GDK_KEY_3270_FieldMark GDK_3270_FieldMark #define GDK_KEY_3270_Right2 GDK_3270_Right2 #define GDK_KEY_3270_Left2 GDK_3270_Left2 #define GDK_KEY_3270_BackTab GDK_3270_BackTab #define GDK_KEY_3270_EraseEOF GDK_3270_EraseEOF #define GDK_KEY_3270_EraseInput GDK_3270_EraseInput #define GDK_KEY_3270_Reset GDK_3270_Reset #define GDK_KEY_3270_Quit GDK_3270_Quit #define GDK_KEY_3270_PA1 GDK_3270_PA1 #define GDK_KEY_3270_PA2 GDK_3270_PA2 #define GDK_KEY_3270_PA3 GDK_3270_PA3 #define GDK_KEY_3270_Test GDK_3270_Test #define GDK_KEY_3270_Attn GDK_3270_Attn #define GDK_KEY_3270_CursorBlink GDK_3270_CursorBlink #define GDK_KEY_3270_AltCursor GDK_3270_AltCursor #define GDK_KEY_3270_KeyClick GDK_3270_KeyClick #define GDK_KEY_3270_Jump GDK_3270_Jump #define GDK_KEY_3270_Ident GDK_3270_Ident #define GDK_KEY_3270_Rule GDK_3270_Rule #define GDK_KEY_3270_Copy GDK_3270_Copy #define GDK_KEY_3270_Play GDK_3270_Play #define GDK_KEY_3270_Setup GDK_3270_Setup #define GDK_KEY_3270_Record GDK_3270_Record #define GDK_KEY_3270_ChangeScreen GDK_3270_ChangeScreen #define GDK_KEY_3270_DeleteWord GDK_3270_DeleteWord #define GDK_KEY_3270_ExSelect GDK_3270_ExSelect #define GDK_KEY_3270_CursorSelect GDK_3270_CursorSelect #define GDK_KEY_3270_PrintScreen GDK_3270_PrintScreen #define GDK_KEY_3270_Enter GDK_3270_Enter #define GDK_KEY_space GDK_space #define GDK_KEY_exclam GDK_exclam #define GDK_KEY_quotedbl GDK_quotedbl #define GDK_KEY_numbersign GDK_numbersign #define GDK_KEY_dollar GDK_dollar #define GDK_KEY_percent GDK_percent #define GDK_KEY_ampersand GDK_ampersand #define GDK_KEY_apostrophe GDK_apostrophe #define GDK_KEY_quoteright GDK_quoteright #define GDK_KEY_parenleft GDK_parenleft #define GDK_KEY_parenright GDK_parenright #define GDK_KEY_asterisk GDK_asterisk #define GDK_KEY_plus GDK_plus #define GDK_KEY_comma GDK_comma #define GDK_KEY_minus GDK_minus #define GDK_KEY_period GDK_period #define GDK_KEY_slash GDK_slash #define GDK_KEY_0 GDK_0 #define GDK_KEY_1 GDK_1 #define GDK_KEY_2 GDK_2 #define GDK_KEY_3 GDK_3 #define GDK_KEY_4 GDK_4 #define GDK_KEY_5 GDK_5 #define GDK_KEY_6 GDK_6 #define GDK_KEY_7 GDK_7 #define GDK_KEY_8 GDK_8 #define GDK_KEY_9 GDK_9 #define GDK_KEY_colon GDK_colon #define GDK_KEY_semicolon GDK_semicolon #define GDK_KEY_less GDK_less #define GDK_KEY_equal GDK_equal #define GDK_KEY_greater GDK_greater #define GDK_KEY_question GDK_question #define GDK_KEY_at GDK_at #define GDK_KEY_A GDK_A #define GDK_KEY_B GDK_B #define GDK_KEY_C GDK_C #define GDK_KEY_D GDK_D #define GDK_KEY_E GDK_E #define GDK_KEY_F GDK_F #define GDK_KEY_G GDK_G #define GDK_KEY_H GDK_H #define GDK_KEY_I GDK_I #define GDK_KEY_J GDK_J #define GDK_KEY_K GDK_K #define GDK_KEY_L GDK_L #define GDK_KEY_M GDK_M #define GDK_KEY_N GDK_N #define GDK_KEY_O GDK_O #define GDK_KEY_P GDK_P #define GDK_KEY_Q GDK_Q #define GDK_KEY_R GDK_R #define GDK_KEY_S GDK_S #define GDK_KEY_T GDK_T #define GDK_KEY_U GDK_U #define GDK_KEY_V GDK_V #define GDK_KEY_W GDK_W #define GDK_KEY_X GDK_X #define GDK_KEY_Y GDK_Y #define GDK_KEY_Z GDK_Z #define GDK_KEY_bracketleft GDK_bracketleft #define GDK_KEY_backslash GDK_backslash #define GDK_KEY_bracketright GDK_bracketright #define GDK_KEY_asciicircum GDK_asciicircum #define GDK_KEY_underscore GDK_underscore #define GDK_KEY_grave GDK_grave #define GDK_KEY_quoteleft GDK_quoteleft #define GDK_KEY_a GDK_a #define GDK_KEY_b GDK_b #define GDK_KEY_c GDK_c #define GDK_KEY_d GDK_d #define GDK_KEY_e GDK_e #define GDK_KEY_f GDK_f #define GDK_KEY_g GDK_g #define GDK_KEY_h GDK_h #define GDK_KEY_i GDK_i #define GDK_KEY_j GDK_j #define GDK_KEY_k GDK_k #define GDK_KEY_l GDK_l #define GDK_KEY_m GDK_m #define GDK_KEY_n GDK_n #define GDK_KEY_o GDK_o #define GDK_KEY_p GDK_p #define GDK_KEY_q GDK_q #define GDK_KEY_r GDK_r #define GDK_KEY_s GDK_s #define GDK_KEY_t GDK_t #define GDK_KEY_u GDK_u #define GDK_KEY_v GDK_v #define GDK_KEY_w GDK_w #define GDK_KEY_x GDK_x #define GDK_KEY_y GDK_y #define GDK_KEY_z GDK_z #define GDK_KEY_braceleft GDK_braceleft #define GDK_KEY_bar GDK_bar #define GDK_KEY_braceright GDK_braceright #define GDK_KEY_asciitilde GDK_asciitilde #define GDK_KEY_nobreakspace GDK_nobreakspace #define GDK_KEY_exclamdown GDK_exclamdown #define GDK_KEY_cent GDK_cent #define GDK_KEY_sterling GDK_sterling #define GDK_KEY_currency GDK_currency #define GDK_KEY_yen GDK_yen #define GDK_KEY_brokenbar GDK_brokenbar #define GDK_KEY_section GDK_section #define GDK_KEY_diaeresis GDK_diaeresis #define GDK_KEY_copyright GDK_copyright #define GDK_KEY_ordfeminine GDK_ordfeminine #define GDK_KEY_guillemotleft GDK_guillemotleft #define GDK_KEY_notsign GDK_notsign #define GDK_KEY_hyphen GDK_hyphen #define GDK_KEY_registered GDK_registered #define GDK_KEY_macron GDK_macron #define GDK_KEY_degree GDK_degree #define GDK_KEY_plusminus GDK_plusminus #define GDK_KEY_twosuperior GDK_twosuperior #define GDK_KEY_threesuperior GDK_threesuperior #define GDK_KEY_acute GDK_acute #define GDK_KEY_mu GDK_mu #define GDK_KEY_paragraph GDK_paragraph #define GDK_KEY_periodcentered GDK_periodcentered #define GDK_KEY_cedilla GDK_cedilla #define GDK_KEY_onesuperior GDK_onesuperior #define GDK_KEY_masculine GDK_masculine #define GDK_KEY_guillemotright GDK_guillemotright #define GDK_KEY_onequarter GDK_onequarter #define GDK_KEY_onehalf GDK_onehalf #define GDK_KEY_threequarters GDK_threequarters #define GDK_KEY_questiondown GDK_questiondown #define GDK_KEY_Agrave GDK_Agrave #define GDK_KEY_Aacute GDK_Aacute #define GDK_KEY_Acircumflex GDK_Acircumflex #define GDK_KEY_Atilde GDK_Atilde #define GDK_KEY_Adiaeresis GDK_Adiaeresis #define GDK_KEY_Aring GDK_Aring #define GDK_KEY_AE GDK_AE #define GDK_KEY_Ccedilla GDK_Ccedilla #define GDK_KEY_Egrave GDK_Egrave #define GDK_KEY_Eacute GDK_Eacute #define GDK_KEY_Ecircumflex GDK_Ecircumflex #define GDK_KEY_Ediaeresis GDK_Ediaeresis #define GDK_KEY_Igrave GDK_Igrave #define GDK_KEY_Iacute GDK_Iacute #define GDK_KEY_Icircumflex GDK_Icircumflex #define GDK_KEY_Idiaeresis GDK_Idiaeresis #define GDK_KEY_ETH GDK_ETH #define GDK_KEY_Eth GDK_Eth #define GDK_KEY_Ntilde GDK_Ntilde #define GDK_KEY_Ograve GDK_Ograve #define GDK_KEY_Oacute GDK_Oacute #define GDK_KEY_Ocircumflex GDK_Ocircumflex #define GDK_KEY_Otilde GDK_Otilde #define GDK_KEY_Odiaeresis GDK_Odiaeresis #define GDK_KEY_multiply GDK_multiply #define GDK_KEY_Oslash GDK_Oslash #define GDK_KEY_Ooblique GDK_Ooblique #define GDK_KEY_Ugrave GDK_Ugrave #define GDK_KEY_Uacute GDK_Uacute #define GDK_KEY_Ucircumflex GDK_Ucircumflex #define GDK_KEY_Udiaeresis GDK_Udiaeresis #define GDK_KEY_Yacute GDK_Yacute #define GDK_KEY_THORN GDK_THORN #define GDK_KEY_Thorn GDK_Thorn #define GDK_KEY_ssharp GDK_ssharp #define GDK_KEY_agrave GDK_agrave #define GDK_KEY_aacute GDK_aacute #define GDK_KEY_acircumflex GDK_acircumflex #define GDK_KEY_atilde GDK_atilde #define GDK_KEY_adiaeresis GDK_adiaeresis #define GDK_KEY_aring GDK_aring #define GDK_KEY_ae GDK_ae #define GDK_KEY_ccedilla GDK_ccedilla #define GDK_KEY_egrave GDK_egrave #define GDK_KEY_eacute GDK_eacute #define GDK_KEY_ecircumflex GDK_ecircumflex #define GDK_KEY_ediaeresis GDK_ediaeresis #define GDK_KEY_igrave GDK_igrave #define GDK_KEY_iacute GDK_iacute #define GDK_KEY_icircumflex GDK_icircumflex #define GDK_KEY_idiaeresis GDK_idiaeresis #define GDK_KEY_eth GDK_eth #define GDK_KEY_ntilde GDK_ntilde #define GDK_KEY_ograve GDK_ograve #define GDK_KEY_oacute GDK_oacute #define GDK_KEY_ocircumflex GDK_ocircumflex #define GDK_KEY_otilde GDK_otilde #define GDK_KEY_odiaeresis GDK_odiaeresis #define GDK_KEY_division GDK_division #define GDK_KEY_oslash GDK_oslash #define GDK_KEY_ooblique GDK_ooblique #define GDK_KEY_ugrave GDK_ugrave #define GDK_KEY_uacute GDK_uacute #define GDK_KEY_ucircumflex GDK_ucircumflex #define GDK_KEY_udiaeresis GDK_udiaeresis #define GDK_KEY_yacute GDK_yacute #define GDK_KEY_thorn GDK_thorn #define GDK_KEY_ydiaeresis GDK_ydiaeresis #define GDK_KEY_Aogonek GDK_Aogonek #define GDK_KEY_breve GDK_breve #define GDK_KEY_Lstroke GDK_Lstroke #define GDK_KEY_Lcaron GDK_Lcaron #define GDK_KEY_Sacute GDK_Sacute #define GDK_KEY_Scaron GDK_Scaron #define GDK_KEY_Scedilla GDK_Scedilla #define GDK_KEY_Tcaron GDK_Tcaron #define GDK_KEY_Zacute GDK_Zacute #define GDK_KEY_Zcaron GDK_Zcaron #define GDK_KEY_Zabovedot GDK_Zabovedot #define GDK_KEY_aogonek GDK_aogonek #define GDK_KEY_ogonek GDK_ogonek #define GDK_KEY_lstroke GDK_lstroke #define GDK_KEY_lcaron GDK_lcaron #define GDK_KEY_sacute GDK_sacute #define GDK_KEY_caron GDK_caron #define GDK_KEY_scaron GDK_scaron #define GDK_KEY_scedilla GDK_scedilla #define GDK_KEY_tcaron GDK_tcaron #define GDK_KEY_zacute GDK_zacute #define GDK_KEY_doubleacute GDK_doubleacute #define GDK_KEY_zcaron GDK_zcaron #define GDK_KEY_zabovedot GDK_zabovedot #define GDK_KEY_Racute GDK_Racute #define GDK_KEY_Abreve GDK_Abreve #define GDK_KEY_Lacute GDK_Lacute #define GDK_KEY_Cacute GDK_Cacute #define GDK_KEY_Ccaron GDK_Ccaron #define GDK_KEY_Eogonek GDK_Eogonek #define GDK_KEY_Ecaron GDK_Ecaron #define GDK_KEY_Dcaron GDK_Dcaron #define GDK_KEY_Dstroke GDK_Dstroke #define GDK_KEY_Nacute GDK_Nacute #define GDK_KEY_Ncaron GDK_Ncaron #define GDK_KEY_Odoubleacute GDK_Odoubleacute #define GDK_KEY_Rcaron GDK_Rcaron #define GDK_KEY_Uring GDK_Uring #define GDK_KEY_Udoubleacute GDK_Udoubleacute #define GDK_KEY_Tcedilla GDK_Tcedilla #define GDK_KEY_racute GDK_racute #define GDK_KEY_abreve GDK_abreve #define GDK_KEY_lacute GDK_lacute #define GDK_KEY_cacute GDK_cacute #define GDK_KEY_ccaron GDK_ccaron #define GDK_KEY_eogonek GDK_eogonek #define GDK_KEY_ecaron GDK_ecaron #define GDK_KEY_dcaron GDK_dcaron #define GDK_KEY_dstroke GDK_dstroke #define GDK_KEY_nacute GDK_nacute #define GDK_KEY_ncaron GDK_ncaron #define GDK_KEY_odoubleacute GDK_odoubleacute #define GDK_KEY_udoubleacute GDK_udoubleacute #define GDK_KEY_rcaron GDK_rcaron #define GDK_KEY_uring GDK_uring #define GDK_KEY_tcedilla GDK_tcedilla #define GDK_KEY_abovedot GDK_abovedot #define GDK_KEY_Hstroke GDK_Hstroke #define GDK_KEY_Hcircumflex GDK_Hcircumflex #define GDK_KEY_Iabovedot GDK_Iabovedot #define GDK_KEY_Gbreve GDK_Gbreve #define GDK_KEY_Jcircumflex GDK_Jcircumflex #define GDK_KEY_hstroke GDK_hstroke #define GDK_KEY_hcircumflex GDK_hcircumflex #define GDK_KEY_idotless GDK_idotless #define GDK_KEY_gbreve GDK_gbreve #define GDK_KEY_jcircumflex GDK_jcircumflex #define GDK_KEY_Cabovedot GDK_Cabovedot #define GDK_KEY_Ccircumflex GDK_Ccircumflex #define GDK_KEY_Gabovedot GDK_Gabovedot #define GDK_KEY_Gcircumflex GDK_Gcircumflex #define GDK_KEY_Ubreve GDK_Ubreve #define GDK_KEY_Scircumflex GDK_Scircumflex #define GDK_KEY_cabovedot GDK_cabovedot #define GDK_KEY_ccircumflex GDK_ccircumflex #define GDK_KEY_gabovedot GDK_gabovedot #define GDK_KEY_gcircumflex GDK_gcircumflex #define GDK_KEY_ubreve GDK_ubreve #define GDK_KEY_scircumflex GDK_scircumflex #define GDK_KEY_kra GDK_kra #define GDK_KEY_kappa GDK_kappa #define GDK_KEY_Rcedilla GDK_Rcedilla #define GDK_KEY_Itilde GDK_Itilde #define GDK_KEY_Lcedilla GDK_Lcedilla #define GDK_KEY_Emacron GDK_Emacron #define GDK_KEY_Gcedilla GDK_Gcedilla #define GDK_KEY_Tslash GDK_Tslash #define GDK_KEY_rcedilla GDK_rcedilla #define GDK_KEY_itilde GDK_itilde #define GDK_KEY_lcedilla GDK_lcedilla #define GDK_KEY_emacron GDK_emacron #define GDK_KEY_gcedilla GDK_gcedilla #define GDK_KEY_tslash GDK_tslash #define GDK_KEY_ENG GDK_ENG #define GDK_KEY_eng GDK_eng #define GDK_KEY_Amacron GDK_Amacron #define GDK_KEY_Iogonek GDK_Iogonek #define GDK_KEY_Eabovedot GDK_Eabovedot #define GDK_KEY_Imacron GDK_Imacron #define GDK_KEY_Ncedilla GDK_Ncedilla #define GDK_KEY_Omacron GDK_Omacron #define GDK_KEY_Kcedilla GDK_Kcedilla #define GDK_KEY_Uogonek GDK_Uogonek #define GDK_KEY_Utilde GDK_Utilde #define GDK_KEY_Umacron GDK_Umacron #define GDK_KEY_amacron GDK_amacron #define GDK_KEY_iogonek GDK_iogonek #define GDK_KEY_eabovedot GDK_eabovedot #define GDK_KEY_imacron GDK_imacron #define GDK_KEY_ncedilla GDK_ncedilla #define GDK_KEY_omacron GDK_omacron #define GDK_KEY_kcedilla GDK_kcedilla #define GDK_KEY_uogonek GDK_uogonek #define GDK_KEY_utilde GDK_utilde #define GDK_KEY_umacron GDK_umacron #define GDK_KEY_Babovedot GDK_Babovedot #define GDK_KEY_babovedot GDK_babovedot #define GDK_KEY_Dabovedot GDK_Dabovedot #define GDK_KEY_Wgrave GDK_Wgrave #define GDK_KEY_Wacute GDK_Wacute #define GDK_KEY_dabovedot GDK_dabovedot #define GDK_KEY_Ygrave GDK_Ygrave #define GDK_KEY_Fabovedot GDK_Fabovedot #define GDK_KEY_fabovedot GDK_fabovedot #define GDK_KEY_Mabovedot GDK_Mabovedot #define GDK_KEY_mabovedot GDK_mabovedot #define GDK_KEY_Pabovedot GDK_Pabovedot #define GDK_KEY_wgrave GDK_wgrave #define GDK_KEY_pabovedot GDK_pabovedot #define GDK_KEY_wacute GDK_wacute #define GDK_KEY_Sabovedot GDK_Sabovedot #define GDK_KEY_ygrave GDK_ygrave #define GDK_KEY_Wdiaeresis GDK_Wdiaeresis #define GDK_KEY_wdiaeresis GDK_wdiaeresis #define GDK_KEY_sabovedot GDK_sabovedot #define GDK_KEY_Wcircumflex GDK_Wcircumflex #define GDK_KEY_Tabovedot GDK_Tabovedot #define GDK_KEY_Ycircumflex GDK_Ycircumflex #define GDK_KEY_wcircumflex GDK_wcircumflex #define GDK_KEY_tabovedot GDK_tabovedot #define GDK_KEY_ycircumflex GDK_ycircumflex #define GDK_KEY_OE GDK_OE #define GDK_KEY_oe GDK_oe #define GDK_KEY_Ydiaeresis GDK_Ydiaeresis #define GDK_KEY_overline GDK_overline #define GDK_KEY_kana_fullstop GDK_kana_fullstop #define GDK_KEY_kana_openingbracket GDK_kana_openingbracket #define GDK_KEY_kana_closingbracket GDK_kana_closingbracket #define GDK_KEY_kana_comma GDK_kana_comma #define GDK_KEY_kana_conjunctive GDK_kana_conjunctive #define GDK_KEY_kana_middledot GDK_kana_middledot #define GDK_KEY_kana_WO GDK_kana_WO #define GDK_KEY_kana_a GDK_kana_a #define GDK_KEY_kana_i GDK_kana_i #define GDK_KEY_kana_u GDK_kana_u #define GDK_KEY_kana_e GDK_kana_e #define GDK_KEY_kana_o GDK_kana_o #define GDK_KEY_kana_ya GDK_kana_ya #define GDK_KEY_kana_yu GDK_kana_yu #define GDK_KEY_kana_yo GDK_kana_yo #define GDK_KEY_kana_tsu GDK_kana_tsu #define GDK_KEY_kana_tu GDK_kana_tu #define GDK_KEY_prolongedsound GDK_prolongedsound #define GDK_KEY_kana_A GDK_kana_A #define GDK_KEY_kana_I GDK_kana_I #define GDK_KEY_kana_U GDK_kana_U #define GDK_KEY_kana_E GDK_kana_E #define GDK_KEY_kana_O GDK_kana_O #define GDK_KEY_kana_KA GDK_kana_KA #define GDK_KEY_kana_KI GDK_kana_KI #define GDK_KEY_kana_KU GDK_kana_KU #define GDK_KEY_kana_KE GDK_kana_KE #define GDK_KEY_kana_KO GDK_kana_KO #define GDK_KEY_kana_SA GDK_kana_SA #define GDK_KEY_kana_SHI GDK_kana_SHI #define GDK_KEY_kana_SU GDK_kana_SU #define GDK_KEY_kana_SE GDK_kana_SE #define GDK_KEY_kana_SO GDK_kana_SO #define GDK_KEY_kana_TA GDK_kana_TA #define GDK_KEY_kana_CHI GDK_kana_CHI #define GDK_KEY_kana_TI GDK_kana_TI #define GDK_KEY_kana_TSU GDK_kana_TSU #define GDK_KEY_kana_TU GDK_kana_TU #define GDK_KEY_kana_TE GDK_kana_TE #define GDK_KEY_kana_TO GDK_kana_TO #define GDK_KEY_kana_NA GDK_kana_NA #define GDK_KEY_kana_NI GDK_kana_NI #define GDK_KEY_kana_NU GDK_kana_NU #define GDK_KEY_kana_NE GDK_kana_NE #define GDK_KEY_kana_NO GDK_kana_NO #define GDK_KEY_kana_HA GDK_kana_HA #define GDK_KEY_kana_HI GDK_kana_HI #define GDK_KEY_kana_FU GDK_kana_FU #define GDK_KEY_kana_HU GDK_kana_HU #define GDK_KEY_kana_HE GDK_kana_HE #define GDK_KEY_kana_HO GDK_kana_HO #define GDK_KEY_kana_MA GDK_kana_MA #define GDK_KEY_kana_MI GDK_kana_MI #define GDK_KEY_kana_MU GDK_kana_MU #define GDK_KEY_kana_ME GDK_kana_ME #define GDK_KEY_kana_MO GDK_kana_MO #define GDK_KEY_kana_YA GDK_kana_YA #define GDK_KEY_kana_YU GDK_kana_YU #define GDK_KEY_kana_YO GDK_kana_YO #define GDK_KEY_kana_RA GDK_kana_RA #define GDK_KEY_kana_RI GDK_kana_RI #define GDK_KEY_kana_RU GDK_kana_RU #define GDK_KEY_kana_RE GDK_kana_RE #define GDK_KEY_kana_RO GDK_kana_RO #define GDK_KEY_kana_WA GDK_kana_WA #define GDK_KEY_kana_N GDK_kana_N #define GDK_KEY_voicedsound GDK_voicedsound #define GDK_KEY_semivoicedsound GDK_semivoicedsound #define GDK_KEY_kana_switch GDK_kana_switch #define GDK_KEY_Farsi_0 GDK_Farsi_0 #define GDK_KEY_Farsi_1 GDK_Farsi_1 #define GDK_KEY_Farsi_2 GDK_Farsi_2 #define GDK_KEY_Farsi_3 GDK_Farsi_3 #define GDK_KEY_Farsi_4 GDK_Farsi_4 #define GDK_KEY_Farsi_5 GDK_Farsi_5 #define GDK_KEY_Farsi_6 GDK_Farsi_6 #define GDK_KEY_Farsi_7 GDK_Farsi_7 #define GDK_KEY_Farsi_8 GDK_Farsi_8 #define GDK_KEY_Farsi_9 GDK_Farsi_9 #define GDK_KEY_Arabic_percent GDK_Arabic_percent #define GDK_KEY_Arabic_superscript_alef GDK_Arabic_superscript_alef #define GDK_KEY_Arabic_tteh GDK_Arabic_tteh #define GDK_KEY_Arabic_peh GDK_Arabic_peh #define GDK_KEY_Arabic_tcheh GDK_Arabic_tcheh #define GDK_KEY_Arabic_ddal GDK_Arabic_ddal #define GDK_KEY_Arabic_rreh GDK_Arabic_rreh #define GDK_KEY_Arabic_comma GDK_Arabic_comma #define GDK_KEY_Arabic_fullstop GDK_Arabic_fullstop #define GDK_KEY_Arabic_0 GDK_Arabic_0 #define GDK_KEY_Arabic_1 GDK_Arabic_1 #define GDK_KEY_Arabic_2 GDK_Arabic_2 #define GDK_KEY_Arabic_3 GDK_Arabic_3 #define GDK_KEY_Arabic_4 GDK_Arabic_4 #define GDK_KEY_Arabic_5 GDK_Arabic_5 #define GDK_KEY_Arabic_6 GDK_Arabic_6 #define GDK_KEY_Arabic_7 GDK_Arabic_7 #define GDK_KEY_Arabic_8 GDK_Arabic_8 #define GDK_KEY_Arabic_9 GDK_Arabic_9 #define GDK_KEY_Arabic_semicolon GDK_Arabic_semicolon #define GDK_KEY_Arabic_question_mark GDK_Arabic_question_mark #define GDK_KEY_Arabic_hamza GDK_Arabic_hamza #define GDK_KEY_Arabic_maddaonalef GDK_Arabic_maddaonalef #define GDK_KEY_Arabic_hamzaonalef GDK_Arabic_hamzaonalef #define GDK_KEY_Arabic_hamzaonwaw GDK_Arabic_hamzaonwaw #define GDK_KEY_Arabic_hamzaunderalef GDK_Arabic_hamzaunderalef #define GDK_KEY_Arabic_hamzaonyeh GDK_Arabic_hamzaonyeh #define GDK_KEY_Arabic_alef GDK_Arabic_alef #define GDK_KEY_Arabic_beh GDK_Arabic_beh #define GDK_KEY_Arabic_tehmarbuta GDK_Arabic_tehmarbuta #define GDK_KEY_Arabic_teh GDK_Arabic_teh #define GDK_KEY_Arabic_theh GDK_Arabic_theh #define GDK_KEY_Arabic_jeem GDK_Arabic_jeem #define GDK_KEY_Arabic_hah GDK_Arabic_hah #define GDK_KEY_Arabic_khah GDK_Arabic_khah #define GDK_KEY_Arabic_dal GDK_Arabic_dal #define GDK_KEY_Arabic_thal GDK_Arabic_thal #define GDK_KEY_Arabic_ra GDK_Arabic_ra #define GDK_KEY_Arabic_zain GDK_Arabic_zain #define GDK_KEY_Arabic_seen GDK_Arabic_seen #define GDK_KEY_Arabic_sheen GDK_Arabic_sheen #define GDK_KEY_Arabic_sad GDK_Arabic_sad #define GDK_KEY_Arabic_dad GDK_Arabic_dad #define GDK_KEY_Arabic_tah GDK_Arabic_tah #define GDK_KEY_Arabic_zah GDK_Arabic_zah #define GDK_KEY_Arabic_ain GDK_Arabic_ain #define GDK_KEY_Arabic_ghain GDK_Arabic_ghain #define GDK_KEY_Arabic_tatweel GDK_Arabic_tatweel #define GDK_KEY_Arabic_feh GDK_Arabic_feh #define GDK_KEY_Arabic_qaf GDK_Arabic_qaf #define GDK_KEY_Arabic_kaf GDK_Arabic_kaf #define GDK_KEY_Arabic_lam GDK_Arabic_lam #define GDK_KEY_Arabic_meem GDK_Arabic_meem #define GDK_KEY_Arabic_noon GDK_Arabic_noon #define GDK_KEY_Arabic_ha GDK_Arabic_ha #define GDK_KEY_Arabic_heh GDK_Arabic_heh #define GDK_KEY_Arabic_waw GDK_Arabic_waw #define GDK_KEY_Arabic_alefmaksura GDK_Arabic_alefmaksura #define GDK_KEY_Arabic_yeh GDK_Arabic_yeh #define GDK_KEY_Arabic_fathatan GDK_Arabic_fathatan #define GDK_KEY_Arabic_dammatan GDK_Arabic_dammatan #define GDK_KEY_Arabic_kasratan GDK_Arabic_kasratan #define GDK_KEY_Arabic_fatha GDK_Arabic_fatha #define GDK_KEY_Arabic_damma GDK_Arabic_damma #define GDK_KEY_Arabic_kasra GDK_Arabic_kasra #define GDK_KEY_Arabic_shadda GDK_Arabic_shadda #define GDK_KEY_Arabic_sukun GDK_Arabic_sukun #define GDK_KEY_Arabic_madda_above GDK_Arabic_madda_above #define GDK_KEY_Arabic_hamza_above GDK_Arabic_hamza_above #define GDK_KEY_Arabic_hamza_below GDK_Arabic_hamza_below #define GDK_KEY_Arabic_jeh GDK_Arabic_jeh #define GDK_KEY_Arabic_veh GDK_Arabic_veh #define GDK_KEY_Arabic_keheh GDK_Arabic_keheh #define GDK_KEY_Arabic_gaf GDK_Arabic_gaf #define GDK_KEY_Arabic_noon_ghunna GDK_Arabic_noon_ghunna #define GDK_KEY_Arabic_heh_doachashmee GDK_Arabic_heh_doachashmee #define GDK_KEY_Farsi_yeh GDK_Farsi_yeh #define GDK_KEY_Arabic_farsi_yeh GDK_Arabic_farsi_yeh #define GDK_KEY_Arabic_yeh_baree GDK_Arabic_yeh_baree #define GDK_KEY_Arabic_heh_goal GDK_Arabic_heh_goal #define GDK_KEY_Arabic_switch GDK_Arabic_switch #define GDK_KEY_Cyrillic_GHE_bar GDK_Cyrillic_GHE_bar #define GDK_KEY_Cyrillic_ghe_bar GDK_Cyrillic_ghe_bar #define GDK_KEY_Cyrillic_ZHE_descender GDK_Cyrillic_ZHE_descender #define GDK_KEY_Cyrillic_zhe_descender GDK_Cyrillic_zhe_descender #define GDK_KEY_Cyrillic_KA_descender GDK_Cyrillic_KA_descender #define GDK_KEY_Cyrillic_ka_descender GDK_Cyrillic_ka_descender #define GDK_KEY_Cyrillic_KA_vertstroke GDK_Cyrillic_KA_vertstroke #define GDK_KEY_Cyrillic_ka_vertstroke GDK_Cyrillic_ka_vertstroke #define GDK_KEY_Cyrillic_EN_descender GDK_Cyrillic_EN_descender #define GDK_KEY_Cyrillic_en_descender GDK_Cyrillic_en_descender #define GDK_KEY_Cyrillic_U_straight GDK_Cyrillic_U_straight #define GDK_KEY_Cyrillic_u_straight GDK_Cyrillic_u_straight #define GDK_KEY_Cyrillic_U_straight_bar GDK_Cyrillic_U_straight_bar #define GDK_KEY_Cyrillic_u_straight_bar GDK_Cyrillic_u_straight_bar #define GDK_KEY_Cyrillic_HA_descender GDK_Cyrillic_HA_descender #define GDK_KEY_Cyrillic_ha_descender GDK_Cyrillic_ha_descender #define GDK_KEY_Cyrillic_CHE_descender GDK_Cyrillic_CHE_descender #define GDK_KEY_Cyrillic_che_descender GDK_Cyrillic_che_descender #define GDK_KEY_Cyrillic_CHE_vertstroke GDK_Cyrillic_CHE_vertstroke #define GDK_KEY_Cyrillic_che_vertstroke GDK_Cyrillic_che_vertstroke #define GDK_KEY_Cyrillic_SHHA GDK_Cyrillic_SHHA #define GDK_KEY_Cyrillic_shha GDK_Cyrillic_shha #define GDK_KEY_Cyrillic_SCHWA GDK_Cyrillic_SCHWA #define GDK_KEY_Cyrillic_schwa GDK_Cyrillic_schwa #define GDK_KEY_Cyrillic_I_macron GDK_Cyrillic_I_macron #define GDK_KEY_Cyrillic_i_macron GDK_Cyrillic_i_macron #define GDK_KEY_Cyrillic_O_bar GDK_Cyrillic_O_bar #define GDK_KEY_Cyrillic_o_bar GDK_Cyrillic_o_bar #define GDK_KEY_Cyrillic_U_macron GDK_Cyrillic_U_macron #define GDK_KEY_Cyrillic_u_macron GDK_Cyrillic_u_macron #define GDK_KEY_Serbian_dje GDK_Serbian_dje #define GDK_KEY_Macedonia_gje GDK_Macedonia_gje #define GDK_KEY_Cyrillic_io GDK_Cyrillic_io #define GDK_KEY_Ukrainian_ie GDK_Ukrainian_ie #define GDK_KEY_Ukranian_je GDK_Ukranian_je #define GDK_KEY_Macedonia_dse GDK_Macedonia_dse #define GDK_KEY_Ukrainian_i GDK_Ukrainian_i #define GDK_KEY_Ukranian_i GDK_Ukranian_i #define GDK_KEY_Ukrainian_yi GDK_Ukrainian_yi #define GDK_KEY_Ukranian_yi GDK_Ukranian_yi #define GDK_KEY_Cyrillic_je GDK_Cyrillic_je #define GDK_KEY_Serbian_je GDK_Serbian_je #define GDK_KEY_Cyrillic_lje GDK_Cyrillic_lje #define GDK_KEY_Serbian_lje GDK_Serbian_lje #define GDK_KEY_Cyrillic_nje GDK_Cyrillic_nje #define GDK_KEY_Serbian_nje GDK_Serbian_nje #define GDK_KEY_Serbian_tshe GDK_Serbian_tshe #define GDK_KEY_Macedonia_kje GDK_Macedonia_kje #define GDK_KEY_Ukrainian_ghe_with_upturn GDK_Ukrainian_ghe_with_upturn #define GDK_KEY_Byelorussian_shortu GDK_Byelorussian_shortu #define GDK_KEY_Cyrillic_dzhe GDK_Cyrillic_dzhe #define GDK_KEY_Serbian_dze GDK_Serbian_dze #define GDK_KEY_numerosign GDK_numerosign #define GDK_KEY_Serbian_DJE GDK_Serbian_DJE #define GDK_KEY_Macedonia_GJE GDK_Macedonia_GJE #define GDK_KEY_Cyrillic_IO GDK_Cyrillic_IO #define GDK_KEY_Ukrainian_IE GDK_Ukrainian_IE #define GDK_KEY_Ukranian_JE GDK_Ukranian_JE #define GDK_KEY_Macedonia_DSE GDK_Macedonia_DSE #define GDK_KEY_Ukrainian_I GDK_Ukrainian_I #define GDK_KEY_Ukranian_I GDK_Ukranian_I #define GDK_KEY_Ukrainian_YI GDK_Ukrainian_YI #define GDK_KEY_Ukranian_YI GDK_Ukranian_YI #define GDK_KEY_Cyrillic_JE GDK_Cyrillic_JE #define GDK_KEY_Serbian_JE GDK_Serbian_JE #define GDK_KEY_Cyrillic_LJE GDK_Cyrillic_LJE #define GDK_KEY_Serbian_LJE GDK_Serbian_LJE #define GDK_KEY_Cyrillic_NJE GDK_Cyrillic_NJE #define GDK_KEY_Serbian_NJE GDK_Serbian_NJE #define GDK_KEY_Serbian_TSHE GDK_Serbian_TSHE #define GDK_KEY_Macedonia_KJE GDK_Macedonia_KJE #define GDK_KEY_Ukrainian_GHE_WITH_UPTURN GDK_Ukrainian_GHE_WITH_UPTURN #define GDK_KEY_Byelorussian_SHORTU GDK_Byelorussian_SHORTU #define GDK_KEY_Cyrillic_DZHE GDK_Cyrillic_DZHE #define GDK_KEY_Serbian_DZE GDK_Serbian_DZE #define GDK_KEY_Cyrillic_yu GDK_Cyrillic_yu #define GDK_KEY_Cyrillic_a GDK_Cyrillic_a #define GDK_KEY_Cyrillic_be GDK_Cyrillic_be #define GDK_KEY_Cyrillic_tse GDK_Cyrillic_tse #define GDK_KEY_Cyrillic_de GDK_Cyrillic_de #define GDK_KEY_Cyrillic_ie GDK_Cyrillic_ie #define GDK_KEY_Cyrillic_ef GDK_Cyrillic_ef #define GDK_KEY_Cyrillic_ghe GDK_Cyrillic_ghe #define GDK_KEY_Cyrillic_ha GDK_Cyrillic_ha #define GDK_KEY_Cyrillic_i GDK_Cyrillic_i #define GDK_KEY_Cyrillic_shorti GDK_Cyrillic_shorti #define GDK_KEY_Cyrillic_ka GDK_Cyrillic_ka #define GDK_KEY_Cyrillic_el GDK_Cyrillic_el #define GDK_KEY_Cyrillic_em GDK_Cyrillic_em #define GDK_KEY_Cyrillic_en GDK_Cyrillic_en #define GDK_KEY_Cyrillic_o GDK_Cyrillic_o #define GDK_KEY_Cyrillic_pe GDK_Cyrillic_pe #define GDK_KEY_Cyrillic_ya GDK_Cyrillic_ya #define GDK_KEY_Cyrillic_er GDK_Cyrillic_er #define GDK_KEY_Cyrillic_es GDK_Cyrillic_es #define GDK_KEY_Cyrillic_te GDK_Cyrillic_te #define GDK_KEY_Cyrillic_u GDK_Cyrillic_u #define GDK_KEY_Cyrillic_zhe GDK_Cyrillic_zhe #define GDK_KEY_Cyrillic_ve GDK_Cyrillic_ve #define GDK_KEY_Cyrillic_softsign GDK_Cyrillic_softsign #define GDK_KEY_Cyrillic_yeru GDK_Cyrillic_yeru #define GDK_KEY_Cyrillic_ze GDK_Cyrillic_ze #define GDK_KEY_Cyrillic_sha GDK_Cyrillic_sha #define GDK_KEY_Cyrillic_e GDK_Cyrillic_e #define GDK_KEY_Cyrillic_shcha GDK_Cyrillic_shcha #define GDK_KEY_Cyrillic_che GDK_Cyrillic_che #define GDK_KEY_Cyrillic_hardsign GDK_Cyrillic_hardsign #define GDK_KEY_Cyrillic_YU GDK_Cyrillic_YU #define GDK_KEY_Cyrillic_A GDK_Cyrillic_A #define GDK_KEY_Cyrillic_BE GDK_Cyrillic_BE #define GDK_KEY_Cyrillic_TSE GDK_Cyrillic_TSE #define GDK_KEY_Cyrillic_DE GDK_Cyrillic_DE #define GDK_KEY_Cyrillic_IE GDK_Cyrillic_IE #define GDK_KEY_Cyrillic_EF GDK_Cyrillic_EF #define GDK_KEY_Cyrillic_GHE GDK_Cyrillic_GHE #define GDK_KEY_Cyrillic_HA GDK_Cyrillic_HA #define GDK_KEY_Cyrillic_I GDK_Cyrillic_I #define GDK_KEY_Cyrillic_SHORTI GDK_Cyrillic_SHORTI #define GDK_KEY_Cyrillic_KA GDK_Cyrillic_KA #define GDK_KEY_Cyrillic_EL GDK_Cyrillic_EL #define GDK_KEY_Cyrillic_EM GDK_Cyrillic_EM #define GDK_KEY_Cyrillic_EN GDK_Cyrillic_EN #define GDK_KEY_Cyrillic_O GDK_Cyrillic_O #define GDK_KEY_Cyrillic_PE GDK_Cyrillic_PE #define GDK_KEY_Cyrillic_YA GDK_Cyrillic_YA #define GDK_KEY_Cyrillic_ER GDK_Cyrillic_ER #define GDK_KEY_Cyrillic_ES GDK_Cyrillic_ES #define GDK_KEY_Cyrillic_TE GDK_Cyrillic_TE #define GDK_KEY_Cyrillic_U GDK_Cyrillic_U #define GDK_KEY_Cyrillic_ZHE GDK_Cyrillic_ZHE #define GDK_KEY_Cyrillic_VE GDK_Cyrillic_VE #define GDK_KEY_Cyrillic_SOFTSIGN GDK_Cyrillic_SOFTSIGN #define GDK_KEY_Cyrillic_YERU GDK_Cyrillic_YERU #define GDK_KEY_Cyrillic_ZE GDK_Cyrillic_ZE #define GDK_KEY_Cyrillic_SHA GDK_Cyrillic_SHA #define GDK_KEY_Cyrillic_E GDK_Cyrillic_E #define GDK_KEY_Cyrillic_SHCHA GDK_Cyrillic_SHCHA #define GDK_KEY_Cyrillic_CHE GDK_Cyrillic_CHE #define GDK_KEY_Cyrillic_HARDSIGN GDK_Cyrillic_HARDSIGN #define GDK_KEY_Greek_ALPHAaccent GDK_Greek_ALPHAaccent #define GDK_KEY_Greek_EPSILONaccent GDK_Greek_EPSILONaccent #define GDK_KEY_Greek_ETAaccent GDK_Greek_ETAaccent #define GDK_KEY_Greek_IOTAaccent GDK_Greek_IOTAaccent #define GDK_KEY_Greek_IOTAdieresis GDK_Greek_IOTAdieresis #define GDK_KEY_Greek_IOTAdiaeresis GDK_Greek_IOTAdiaeresis #define GDK_KEY_Greek_OMICRONaccent GDK_Greek_OMICRONaccent #define GDK_KEY_Greek_UPSILONaccent GDK_Greek_UPSILONaccent #define GDK_KEY_Greek_UPSILONdieresis GDK_Greek_UPSILONdieresis #define GDK_KEY_Greek_OMEGAaccent GDK_Greek_OMEGAaccent #define GDK_KEY_Greek_accentdieresis GDK_Greek_accentdieresis #define GDK_KEY_Greek_horizbar GDK_Greek_horizbar #define GDK_KEY_Greek_alphaaccent GDK_Greek_alphaaccent #define GDK_KEY_Greek_epsilonaccent GDK_Greek_epsilonaccent #define GDK_KEY_Greek_etaaccent GDK_Greek_etaaccent #define GDK_KEY_Greek_iotaaccent GDK_Greek_iotaaccent #define GDK_KEY_Greek_iotadieresis GDK_Greek_iotadieresis #define GDK_KEY_Greek_iotaaccentdieresis GDK_Greek_iotaaccentdieresis #define GDK_KEY_Greek_omicronaccent GDK_Greek_omicronaccent #define GDK_KEY_Greek_upsilonaccent GDK_Greek_upsilonaccent #define GDK_KEY_Greek_upsilondieresis GDK_Greek_upsilondieresis #define GDK_KEY_Greek_upsilonaccentdieresis GDK_Greek_upsilonaccentdieresis #define GDK_KEY_Greek_omegaaccent GDK_Greek_omegaaccent #define GDK_KEY_Greek_ALPHA GDK_Greek_ALPHA #define GDK_KEY_Greek_BETA GDK_Greek_BETA #define GDK_KEY_Greek_GAMMA GDK_Greek_GAMMA #define GDK_KEY_Greek_DELTA GDK_Greek_DELTA #define GDK_KEY_Greek_EPSILON GDK_Greek_EPSILON #define GDK_KEY_Greek_ZETA GDK_Greek_ZETA #define GDK_KEY_Greek_ETA GDK_Greek_ETA #define GDK_KEY_Greek_THETA GDK_Greek_THETA #define GDK_KEY_Greek_IOTA GDK_Greek_IOTA #define GDK_KEY_Greek_KAPPA GDK_Greek_KAPPA #define GDK_KEY_Greek_LAMDA GDK_Greek_LAMDA #define GDK_KEY_Greek_LAMBDA GDK_Greek_LAMBDA #define GDK_KEY_Greek_MU GDK_Greek_MU #define GDK_KEY_Greek_NU GDK_Greek_NU #define GDK_KEY_Greek_XI GDK_Greek_XI #define GDK_KEY_Greek_OMICRON GDK_Greek_OMICRON #define GDK_KEY_Greek_PI GDK_Greek_PI #define GDK_KEY_Greek_RHO GDK_Greek_RHO #define GDK_KEY_Greek_SIGMA GDK_Greek_SIGMA #define GDK_KEY_Greek_TAU GDK_Greek_TAU #define GDK_KEY_Greek_UPSILON GDK_Greek_UPSILON #define GDK_KEY_Greek_PHI GDK_Greek_PHI #define GDK_KEY_Greek_CHI GDK_Greek_CHI #define GDK_KEY_Greek_PSI GDK_Greek_PSI #define GDK_KEY_Greek_OMEGA GDK_Greek_OMEGA #define GDK_KEY_Greek_alpha GDK_Greek_alpha #define GDK_KEY_Greek_beta GDK_Greek_beta #define GDK_KEY_Greek_gamma GDK_Greek_gamma #define GDK_KEY_Greek_delta GDK_Greek_delta #define GDK_KEY_Greek_epsilon GDK_Greek_epsilon #define GDK_KEY_Greek_zeta GDK_Greek_zeta #define GDK_KEY_Greek_eta GDK_Greek_eta #define GDK_KEY_Greek_theta GDK_Greek_theta #define GDK_KEY_Greek_iota GDK_Greek_iota #define GDK_KEY_Greek_kappa GDK_Greek_kappa #define GDK_KEY_Greek_lamda GDK_Greek_lamda #define GDK_KEY_Greek_lambda GDK_Greek_lambda #define GDK_KEY_Greek_mu GDK_Greek_mu #define GDK_KEY_Greek_nu GDK_Greek_nu #define GDK_KEY_Greek_xi GDK_Greek_xi #define GDK_KEY_Greek_omicron GDK_Greek_omicron #define GDK_KEY_Greek_pi GDK_Greek_pi #define GDK_KEY_Greek_rho GDK_Greek_rho #define GDK_KEY_Greek_sigma GDK_Greek_sigma #define GDK_KEY_Greek_finalsmallsigma GDK_Greek_finalsmallsigma #define GDK_KEY_Greek_tau GDK_Greek_tau #define GDK_KEY_Greek_upsilon GDK_Greek_upsilon #define GDK_KEY_Greek_phi GDK_Greek_phi #define GDK_KEY_Greek_chi GDK_Greek_chi #define GDK_KEY_Greek_psi GDK_Greek_psi #define GDK_KEY_Greek_omega GDK_Greek_omega #define GDK_KEY_Greek_switch GDK_Greek_switch #define GDK_KEY_leftradical GDK_leftradical #define GDK_KEY_topleftradical GDK_topleftradical #define GDK_KEY_horizconnector GDK_horizconnector #define GDK_KEY_topintegral GDK_topintegral #define GDK_KEY_botintegral GDK_botintegral #define GDK_KEY_vertconnector GDK_vertconnector #define GDK_KEY_topleftsqbracket GDK_topleftsqbracket #define GDK_KEY_botleftsqbracket GDK_botleftsqbracket #define GDK_KEY_toprightsqbracket GDK_toprightsqbracket #define GDK_KEY_botrightsqbracket GDK_botrightsqbracket #define GDK_KEY_topleftparens GDK_topleftparens #define GDK_KEY_botleftparens GDK_botleftparens #define GDK_KEY_toprightparens GDK_toprightparens #define GDK_KEY_botrightparens GDK_botrightparens #define GDK_KEY_leftmiddlecurlybrace GDK_leftmiddlecurlybrace #define GDK_KEY_rightmiddlecurlybrace GDK_rightmiddlecurlybrace #define GDK_KEY_topleftsummation GDK_topleftsummation #define GDK_KEY_botleftsummation GDK_botleftsummation #define GDK_KEY_topvertsummationconnector GDK_topvertsummationconnector #define GDK_KEY_botvertsummationconnector GDK_botvertsummationconnector #define GDK_KEY_toprightsummation GDK_toprightsummation #define GDK_KEY_botrightsummation GDK_botrightsummation #define GDK_KEY_rightmiddlesummation GDK_rightmiddlesummation #define GDK_KEY_lessthanequal GDK_lessthanequal #define GDK_KEY_notequal GDK_notequal #define GDK_KEY_greaterthanequal GDK_greaterthanequal #define GDK_KEY_integral GDK_integral #define GDK_KEY_therefore GDK_therefore #define GDK_KEY_variation GDK_variation #define GDK_KEY_infinity GDK_infinity #define GDK_KEY_nabla GDK_nabla #define GDK_KEY_approximate GDK_approximate #define GDK_KEY_similarequal GDK_similarequal #define GDK_KEY_ifonlyif GDK_ifonlyif #define GDK_KEY_implies GDK_implies #define GDK_KEY_identical GDK_identical #define GDK_KEY_radical GDK_radical #define GDK_KEY_includedin GDK_includedin #define GDK_KEY_includes GDK_includes #define GDK_KEY_intersection GDK_intersection #define GDK_KEY_union GDK_union #define GDK_KEY_logicaland GDK_logicaland #define GDK_KEY_logicalor GDK_logicalor #define GDK_KEY_partialderivative GDK_partialderivative #define GDK_KEY_function GDK_function #define GDK_KEY_leftarrow GDK_leftarrow #define GDK_KEY_uparrow GDK_uparrow #define GDK_KEY_rightarrow GDK_rightarrow #define GDK_KEY_downarrow GDK_downarrow #define GDK_KEY_blank GDK_blank #define GDK_KEY_soliddiamond GDK_soliddiamond #define GDK_KEY_checkerboard GDK_checkerboard #define GDK_KEY_ht GDK_ht #define GDK_KEY_ff GDK_ff #define GDK_KEY_cr GDK_cr #define GDK_KEY_lf GDK_lf #define GDK_KEY_nl GDK_nl #define GDK_KEY_vt GDK_vt #define GDK_KEY_lowrightcorner GDK_lowrightcorner #define GDK_KEY_uprightcorner GDK_uprightcorner #define GDK_KEY_upleftcorner GDK_upleftcorner #define GDK_KEY_lowleftcorner GDK_lowleftcorner #define GDK_KEY_crossinglines GDK_crossinglines #define GDK_KEY_horizlinescan1 GDK_horizlinescan1 #define GDK_KEY_horizlinescan3 GDK_horizlinescan3 #define GDK_KEY_horizlinescan5 GDK_horizlinescan5 #define GDK_KEY_horizlinescan7 GDK_horizlinescan7 #define GDK_KEY_horizlinescan9 GDK_horizlinescan9 #define GDK_KEY_leftt GDK_leftt #define GDK_KEY_rightt GDK_rightt #define GDK_KEY_bott GDK_bott #define GDK_KEY_topt GDK_topt #define GDK_KEY_vertbar GDK_vertbar #define GDK_KEY_emspace GDK_emspace #define GDK_KEY_enspace GDK_enspace #define GDK_KEY_em3space GDK_em3space #define GDK_KEY_em4space GDK_em4space #define GDK_KEY_digitspace GDK_digitspace #define GDK_KEY_punctspace GDK_punctspace #define GDK_KEY_thinspace GDK_thinspace #define GDK_KEY_hairspace GDK_hairspace #define GDK_KEY_emdash GDK_emdash #define GDK_KEY_endash GDK_endash #define GDK_KEY_signifblank GDK_signifblank #define GDK_KEY_ellipsis GDK_ellipsis #define GDK_KEY_doubbaselinedot GDK_doubbaselinedot #define GDK_KEY_onethird GDK_onethird #define GDK_KEY_twothirds GDK_twothirds #define GDK_KEY_onefifth GDK_onefifth #define GDK_KEY_twofifths GDK_twofifths #define GDK_KEY_threefifths GDK_threefifths #define GDK_KEY_fourfifths GDK_fourfifths #define GDK_KEY_onesixth GDK_onesixth #define GDK_KEY_fivesixths GDK_fivesixths #define GDK_KEY_careof GDK_careof #define GDK_KEY_figdash GDK_figdash #define GDK_KEY_leftanglebracket GDK_leftanglebracket #define GDK_KEY_decimalpoint GDK_decimalpoint #define GDK_KEY_rightanglebracket GDK_rightanglebracket #define GDK_KEY_marker GDK_marker #define GDK_KEY_oneeighth GDK_oneeighth #define GDK_KEY_threeeighths GDK_threeeighths #define GDK_KEY_fiveeighths GDK_fiveeighths #define GDK_KEY_seveneighths GDK_seveneighths #define GDK_KEY_trademark GDK_trademark #define GDK_KEY_signaturemark GDK_signaturemark #define GDK_KEY_trademarkincircle GDK_trademarkincircle #define GDK_KEY_leftopentriangle GDK_leftopentriangle #define GDK_KEY_rightopentriangle GDK_rightopentriangle #define GDK_KEY_emopencircle GDK_emopencircle #define GDK_KEY_emopenrectangle GDK_emopenrectangle #define GDK_KEY_leftsinglequotemark GDK_leftsinglequotemark #define GDK_KEY_rightsinglequotemark GDK_rightsinglequotemark #define GDK_KEY_leftdoublequotemark GDK_leftdoublequotemark #define GDK_KEY_rightdoublequotemark GDK_rightdoublequotemark #define GDK_KEY_prescription GDK_prescription #define GDK_KEY_minutes GDK_minutes #define GDK_KEY_seconds GDK_seconds #define GDK_KEY_latincross GDK_latincross #define GDK_KEY_hexagram GDK_hexagram #define GDK_KEY_filledrectbullet GDK_filledrectbullet #define GDK_KEY_filledlefttribullet GDK_filledlefttribullet #define GDK_KEY_filledrighttribullet GDK_filledrighttribullet #define GDK_KEY_emfilledcircle GDK_emfilledcircle #define GDK_KEY_emfilledrect GDK_emfilledrect #define GDK_KEY_enopencircbullet GDK_enopencircbullet #define GDK_KEY_enopensquarebullet GDK_enopensquarebullet #define GDK_KEY_openrectbullet GDK_openrectbullet #define GDK_KEY_opentribulletup GDK_opentribulletup #define GDK_KEY_opentribulletdown GDK_opentribulletdown #define GDK_KEY_openstar GDK_openstar #define GDK_KEY_enfilledcircbullet GDK_enfilledcircbullet #define GDK_KEY_enfilledsqbullet GDK_enfilledsqbullet #define GDK_KEY_filledtribulletup GDK_filledtribulletup #define GDK_KEY_filledtribulletdown GDK_filledtribulletdown #define GDK_KEY_leftpointer GDK_leftpointer #define GDK_KEY_rightpointer GDK_rightpointer #define GDK_KEY_club GDK_club #define GDK_KEY_diamond GDK_diamond #define GDK_KEY_heart GDK_heart #define GDK_KEY_maltesecross GDK_maltesecross #define GDK_KEY_dagger GDK_dagger #define GDK_KEY_doubledagger GDK_doubledagger #define GDK_KEY_checkmark GDK_checkmark #define GDK_KEY_ballotcross GDK_ballotcross #define GDK_KEY_musicalsharp GDK_musicalsharp #define GDK_KEY_musicalflat GDK_musicalflat #define GDK_KEY_malesymbol GDK_malesymbol #define GDK_KEY_femalesymbol GDK_femalesymbol #define GDK_KEY_telephone GDK_telephone #define GDK_KEY_telephonerecorder GDK_telephonerecorder #define GDK_KEY_phonographcopyright GDK_phonographcopyright #define GDK_KEY_caret GDK_caret #define GDK_KEY_singlelowquotemark GDK_singlelowquotemark #define GDK_KEY_doublelowquotemark GDK_doublelowquotemark #define GDK_KEY_cursor GDK_cursor #define GDK_KEY_leftcaret GDK_leftcaret #define GDK_KEY_rightcaret GDK_rightcaret #define GDK_KEY_downcaret GDK_downcaret #define GDK_KEY_upcaret GDK_upcaret #define GDK_KEY_overbar GDK_overbar #define GDK_KEY_downtack GDK_downtack #define GDK_KEY_upshoe GDK_upshoe #define GDK_KEY_downstile GDK_downstile #define GDK_KEY_underbar GDK_underbar #define GDK_KEY_jot GDK_jot #define GDK_KEY_quad GDK_quad #define GDK_KEY_uptack GDK_uptack #define GDK_KEY_circle GDK_circle #define GDK_KEY_upstile GDK_upstile #define GDK_KEY_downshoe GDK_downshoe #define GDK_KEY_rightshoe GDK_rightshoe #define GDK_KEY_leftshoe GDK_leftshoe #define GDK_KEY_lefttack GDK_lefttack #define GDK_KEY_righttack GDK_righttack #define GDK_KEY_hebrew_doublelowline GDK_hebrew_doublelowline #define GDK_KEY_hebrew_aleph GDK_hebrew_aleph #define GDK_KEY_hebrew_bet GDK_hebrew_bet #define GDK_KEY_hebrew_beth GDK_hebrew_beth #define GDK_KEY_hebrew_gimel GDK_hebrew_gimel #define GDK_KEY_hebrew_gimmel GDK_hebrew_gimmel #define GDK_KEY_hebrew_dalet GDK_hebrew_dalet #define GDK_KEY_hebrew_daleth GDK_hebrew_daleth #define GDK_KEY_hebrew_he GDK_hebrew_he #define GDK_KEY_hebrew_waw GDK_hebrew_waw #define GDK_KEY_hebrew_zain GDK_hebrew_zain #define GDK_KEY_hebrew_zayin GDK_hebrew_zayin #define GDK_KEY_hebrew_chet GDK_hebrew_chet #define GDK_KEY_hebrew_het GDK_hebrew_het #define GDK_KEY_hebrew_tet GDK_hebrew_tet #define GDK_KEY_hebrew_teth GDK_hebrew_teth #define GDK_KEY_hebrew_yod GDK_hebrew_yod #define GDK_KEY_hebrew_finalkaph GDK_hebrew_finalkaph #define GDK_KEY_hebrew_kaph GDK_hebrew_kaph #define GDK_KEY_hebrew_lamed GDK_hebrew_lamed #define GDK_KEY_hebrew_finalmem GDK_hebrew_finalmem #define GDK_KEY_hebrew_mem GDK_hebrew_mem #define GDK_KEY_hebrew_finalnun GDK_hebrew_finalnun #define GDK_KEY_hebrew_nun GDK_hebrew_nun #define GDK_KEY_hebrew_samech GDK_hebrew_samech #define GDK_KEY_hebrew_samekh GDK_hebrew_samekh #define GDK_KEY_hebrew_ayin GDK_hebrew_ayin #define GDK_KEY_hebrew_finalpe GDK_hebrew_finalpe #define GDK_KEY_hebrew_pe GDK_hebrew_pe #define GDK_KEY_hebrew_finalzade GDK_hebrew_finalzade #define GDK_KEY_hebrew_finalzadi GDK_hebrew_finalzadi #define GDK_KEY_hebrew_zade GDK_hebrew_zade #define GDK_KEY_hebrew_zadi GDK_hebrew_zadi #define GDK_KEY_hebrew_qoph GDK_hebrew_qoph #define GDK_KEY_hebrew_kuf GDK_hebrew_kuf #define GDK_KEY_hebrew_resh GDK_hebrew_resh #define GDK_KEY_hebrew_shin GDK_hebrew_shin #define GDK_KEY_hebrew_taw GDK_hebrew_taw #define GDK_KEY_hebrew_taf GDK_hebrew_taf #define GDK_KEY_Hebrew_switch GDK_Hebrew_switch #define GDK_KEY_Thai_kokai GDK_Thai_kokai #define GDK_KEY_Thai_khokhai GDK_Thai_khokhai #define GDK_KEY_Thai_khokhuat GDK_Thai_khokhuat #define GDK_KEY_Thai_khokhwai GDK_Thai_khokhwai #define GDK_KEY_Thai_khokhon GDK_Thai_khokhon #define GDK_KEY_Thai_khorakhang GDK_Thai_khorakhang #define GDK_KEY_Thai_ngongu GDK_Thai_ngongu #define GDK_KEY_Thai_chochan GDK_Thai_chochan #define GDK_KEY_Thai_choching GDK_Thai_choching #define GDK_KEY_Thai_chochang GDK_Thai_chochang #define GDK_KEY_Thai_soso GDK_Thai_soso #define GDK_KEY_Thai_chochoe GDK_Thai_chochoe #define GDK_KEY_Thai_yoying GDK_Thai_yoying #define GDK_KEY_Thai_dochada GDK_Thai_dochada #define GDK_KEY_Thai_topatak GDK_Thai_topatak #define GDK_KEY_Thai_thothan GDK_Thai_thothan #define GDK_KEY_Thai_thonangmontho GDK_Thai_thonangmontho #define GDK_KEY_Thai_thophuthao GDK_Thai_thophuthao #define GDK_KEY_Thai_nonen GDK_Thai_nonen #define GDK_KEY_Thai_dodek GDK_Thai_dodek #define GDK_KEY_Thai_totao GDK_Thai_totao #define GDK_KEY_Thai_thothung GDK_Thai_thothung #define GDK_KEY_Thai_thothahan GDK_Thai_thothahan #define GDK_KEY_Thai_thothong GDK_Thai_thothong #define GDK_KEY_Thai_nonu GDK_Thai_nonu #define GDK_KEY_Thai_bobaimai GDK_Thai_bobaimai #define GDK_KEY_Thai_popla GDK_Thai_popla #define GDK_KEY_Thai_phophung GDK_Thai_phophung #define GDK_KEY_Thai_fofa GDK_Thai_fofa #define GDK_KEY_Thai_phophan GDK_Thai_phophan #define GDK_KEY_Thai_fofan GDK_Thai_fofan #define GDK_KEY_Thai_phosamphao GDK_Thai_phosamphao #define GDK_KEY_Thai_moma GDK_Thai_moma #define GDK_KEY_Thai_yoyak GDK_Thai_yoyak #define GDK_KEY_Thai_rorua GDK_Thai_rorua #define GDK_KEY_Thai_ru GDK_Thai_ru #define GDK_KEY_Thai_loling GDK_Thai_loling #define GDK_KEY_Thai_lu GDK_Thai_lu #define GDK_KEY_Thai_wowaen GDK_Thai_wowaen #define GDK_KEY_Thai_sosala GDK_Thai_sosala #define GDK_KEY_Thai_sorusi GDK_Thai_sorusi #define GDK_KEY_Thai_sosua GDK_Thai_sosua #define GDK_KEY_Thai_hohip GDK_Thai_hohip #define GDK_KEY_Thai_lochula GDK_Thai_lochula #define GDK_KEY_Thai_oang GDK_Thai_oang #define GDK_KEY_Thai_honokhuk GDK_Thai_honokhuk #define GDK_KEY_Thai_paiyannoi GDK_Thai_paiyannoi #define GDK_KEY_Thai_saraa GDK_Thai_saraa #define GDK_KEY_Thai_maihanakat GDK_Thai_maihanakat #define GDK_KEY_Thai_saraaa GDK_Thai_saraaa #define GDK_KEY_Thai_saraam GDK_Thai_saraam #define GDK_KEY_Thai_sarai GDK_Thai_sarai #define GDK_KEY_Thai_saraii GDK_Thai_saraii #define GDK_KEY_Thai_saraue GDK_Thai_saraue #define GDK_KEY_Thai_sarauee GDK_Thai_sarauee #define GDK_KEY_Thai_sarau GDK_Thai_sarau #define GDK_KEY_Thai_sarauu GDK_Thai_sarauu #define GDK_KEY_Thai_phinthu GDK_Thai_phinthu #define GDK_KEY_Thai_maihanakat_maitho GDK_Thai_maihanakat_maitho #define GDK_KEY_Thai_baht GDK_Thai_baht #define GDK_KEY_Thai_sarae GDK_Thai_sarae #define GDK_KEY_Thai_saraae GDK_Thai_saraae #define GDK_KEY_Thai_sarao GDK_Thai_sarao #define GDK_KEY_Thai_saraaimaimuan GDK_Thai_saraaimaimuan #define GDK_KEY_Thai_saraaimaimalai GDK_Thai_saraaimaimalai #define GDK_KEY_Thai_lakkhangyao GDK_Thai_lakkhangyao #define GDK_KEY_Thai_maiyamok GDK_Thai_maiyamok #define GDK_KEY_Thai_maitaikhu GDK_Thai_maitaikhu #define GDK_KEY_Thai_maiek GDK_Thai_maiek #define GDK_KEY_Thai_maitho GDK_Thai_maitho #define GDK_KEY_Thai_maitri GDK_Thai_maitri #define GDK_KEY_Thai_maichattawa GDK_Thai_maichattawa #define GDK_KEY_Thai_thanthakhat GDK_Thai_thanthakhat #define GDK_KEY_Thai_nikhahit GDK_Thai_nikhahit #define GDK_KEY_Thai_leksun GDK_Thai_leksun #define GDK_KEY_Thai_leknung GDK_Thai_leknung #define GDK_KEY_Thai_leksong GDK_Thai_leksong #define GDK_KEY_Thai_leksam GDK_Thai_leksam #define GDK_KEY_Thai_leksi GDK_Thai_leksi #define GDK_KEY_Thai_lekha GDK_Thai_lekha #define GDK_KEY_Thai_lekhok GDK_Thai_lekhok #define GDK_KEY_Thai_lekchet GDK_Thai_lekchet #define GDK_KEY_Thai_lekpaet GDK_Thai_lekpaet #define GDK_KEY_Thai_lekkao GDK_Thai_lekkao #define GDK_KEY_Hangul GDK_Hangul #define GDK_KEY_Hangul_Start GDK_Hangul_Start #define GDK_KEY_Hangul_End GDK_Hangul_End #define GDK_KEY_Hangul_Hanja GDK_Hangul_Hanja #define GDK_KEY_Hangul_Jamo GDK_Hangul_Jamo #define GDK_KEY_Hangul_Romaja GDK_Hangul_Romaja #define GDK_KEY_Hangul_Codeinput GDK_Hangul_Codeinput #define GDK_KEY_Hangul_Jeonja GDK_Hangul_Jeonja #define GDK_KEY_Hangul_Banja GDK_Hangul_Banja #define GDK_KEY_Hangul_PreHanja GDK_Hangul_PreHanja #define GDK_KEY_Hangul_PostHanja GDK_Hangul_PostHanja #define GDK_KEY_Hangul_SingleCandidate GDK_Hangul_SingleCandidate #define GDK_KEY_Hangul_MultipleCandidate GDK_Hangul_MultipleCandidate #define GDK_KEY_Hangul_PreviousCandidate GDK_Hangul_PreviousCandidate #define GDK_KEY_Hangul_Special GDK_Hangul_Special #define GDK_KEY_Hangul_switch GDK_Hangul_switch #define GDK_KEY_Hangul_Kiyeog GDK_Hangul_Kiyeog #define GDK_KEY_Hangul_SsangKiyeog GDK_Hangul_SsangKiyeog #define GDK_KEY_Hangul_KiyeogSios GDK_Hangul_KiyeogSios #define GDK_KEY_Hangul_Nieun GDK_Hangul_Nieun #define GDK_KEY_Hangul_NieunJieuj GDK_Hangul_NieunJieuj #define GDK_KEY_Hangul_NieunHieuh GDK_Hangul_NieunHieuh #define GDK_KEY_Hangul_Dikeud GDK_Hangul_Dikeud #define GDK_KEY_Hangul_SsangDikeud GDK_Hangul_SsangDikeud #define GDK_KEY_Hangul_Rieul GDK_Hangul_Rieul #define GDK_KEY_Hangul_RieulKiyeog GDK_Hangul_RieulKiyeog #define GDK_KEY_Hangul_RieulMieum GDK_Hangul_RieulMieum #define GDK_KEY_Hangul_RieulPieub GDK_Hangul_RieulPieub #define GDK_KEY_Hangul_RieulSios GDK_Hangul_RieulSios #define GDK_KEY_Hangul_RieulTieut GDK_Hangul_RieulTieut #define GDK_KEY_Hangul_RieulPhieuf GDK_Hangul_RieulPhieuf #define GDK_KEY_Hangul_RieulHieuh GDK_Hangul_RieulHieuh #define GDK_KEY_Hangul_Mieum GDK_Hangul_Mieum #define GDK_KEY_Hangul_Pieub GDK_Hangul_Pieub #define GDK_KEY_Hangul_SsangPieub GDK_Hangul_SsangPieub #define GDK_KEY_Hangul_PieubSios GDK_Hangul_PieubSios #define GDK_KEY_Hangul_Sios GDK_Hangul_Sios #define GDK_KEY_Hangul_SsangSios GDK_Hangul_SsangSios #define GDK_KEY_Hangul_Ieung GDK_Hangul_Ieung #define GDK_KEY_Hangul_Jieuj GDK_Hangul_Jieuj #define GDK_KEY_Hangul_SsangJieuj GDK_Hangul_SsangJieuj #define GDK_KEY_Hangul_Cieuc GDK_Hangul_Cieuc #define GDK_KEY_Hangul_Khieuq GDK_Hangul_Khieuq #define GDK_KEY_Hangul_Tieut GDK_Hangul_Tieut #define GDK_KEY_Hangul_Phieuf GDK_Hangul_Phieuf #define GDK_KEY_Hangul_Hieuh GDK_Hangul_Hieuh #define GDK_KEY_Hangul_A GDK_Hangul_A #define GDK_KEY_Hangul_AE GDK_Hangul_AE #define GDK_KEY_Hangul_YA GDK_Hangul_YA #define GDK_KEY_Hangul_YAE GDK_Hangul_YAE #define GDK_KEY_Hangul_EO GDK_Hangul_EO #define GDK_KEY_Hangul_E GDK_Hangul_E #define GDK_KEY_Hangul_YEO GDK_Hangul_YEO #define GDK_KEY_Hangul_YE GDK_Hangul_YE #define GDK_KEY_Hangul_O GDK_Hangul_O #define GDK_KEY_Hangul_WA GDK_Hangul_WA #define GDK_KEY_Hangul_WAE GDK_Hangul_WAE #define GDK_KEY_Hangul_OE GDK_Hangul_OE #define GDK_KEY_Hangul_YO GDK_Hangul_YO #define GDK_KEY_Hangul_U GDK_Hangul_U #define GDK_KEY_Hangul_WEO GDK_Hangul_WEO #define GDK_KEY_Hangul_WE GDK_Hangul_WE #define GDK_KEY_Hangul_WI GDK_Hangul_WI #define GDK_KEY_Hangul_YU GDK_Hangul_YU #define GDK_KEY_Hangul_EU GDK_Hangul_EU #define GDK_KEY_Hangul_YI GDK_Hangul_YI #define GDK_KEY_Hangul_I GDK_Hangul_I #define GDK_KEY_Hangul_J_Kiyeog GDK_Hangul_J_Kiyeog #define GDK_KEY_Hangul_J_SsangKiyeog GDK_Hangul_J_SsangKiyeog #define GDK_KEY_Hangul_J_KiyeogSios GDK_Hangul_J_KiyeogSios #define GDK_KEY_Hangul_J_Nieun GDK_Hangul_J_Nieun #define GDK_KEY_Hangul_J_NieunJieuj GDK_Hangul_J_NieunJieuj #define GDK_KEY_Hangul_J_NieunHieuh GDK_Hangul_J_NieunHieuh #define GDK_KEY_Hangul_J_Dikeud GDK_Hangul_J_Dikeud #define GDK_KEY_Hangul_J_Rieul GDK_Hangul_J_Rieul #define GDK_KEY_Hangul_J_RieulKiyeog GDK_Hangul_J_RieulKiyeog #define GDK_KEY_Hangul_J_RieulMieum GDK_Hangul_J_RieulMieum #define GDK_KEY_Hangul_J_RieulPieub GDK_Hangul_J_RieulPieub #define GDK_KEY_Hangul_J_RieulSios GDK_Hangul_J_RieulSios #define GDK_KEY_Hangul_J_RieulTieut GDK_Hangul_J_RieulTieut #define GDK_KEY_Hangul_J_RieulPhieuf GDK_Hangul_J_RieulPhieuf #define GDK_KEY_Hangul_J_RieulHieuh GDK_Hangul_J_RieulHieuh #define GDK_KEY_Hangul_J_Mieum GDK_Hangul_J_Mieum #define GDK_KEY_Hangul_J_Pieub GDK_Hangul_J_Pieub #define GDK_KEY_Hangul_J_PieubSios GDK_Hangul_J_PieubSios #define GDK_KEY_Hangul_J_Sios GDK_Hangul_J_Sios #define GDK_KEY_Hangul_J_SsangSios GDK_Hangul_J_SsangSios #define GDK_KEY_Hangul_J_Ieung GDK_Hangul_J_Ieung #define GDK_KEY_Hangul_J_Jieuj GDK_Hangul_J_Jieuj #define GDK_KEY_Hangul_J_Cieuc GDK_Hangul_J_Cieuc #define GDK_KEY_Hangul_J_Khieuq GDK_Hangul_J_Khieuq #define GDK_KEY_Hangul_J_Tieut GDK_Hangul_J_Tieut #define GDK_KEY_Hangul_J_Phieuf GDK_Hangul_J_Phieuf #define GDK_KEY_Hangul_J_Hieuh GDK_Hangul_J_Hieuh #define GDK_KEY_Hangul_RieulYeorinHieuh GDK_Hangul_RieulYeorinHieuh #define GDK_KEY_Hangul_SunkyeongeumMieum GDK_Hangul_SunkyeongeumMieum #define GDK_KEY_Hangul_SunkyeongeumPieub GDK_Hangul_SunkyeongeumPieub #define GDK_KEY_Hangul_PanSios GDK_Hangul_PanSios #define GDK_KEY_Hangul_KkogjiDalrinIeung GDK_Hangul_KkogjiDalrinIeung #define GDK_KEY_Hangul_SunkyeongeumPhieuf GDK_Hangul_SunkyeongeumPhieuf #define GDK_KEY_Hangul_YeorinHieuh GDK_Hangul_YeorinHieuh #define GDK_KEY_Hangul_AraeA GDK_Hangul_AraeA #define GDK_KEY_Hangul_AraeAE GDK_Hangul_AraeAE #define GDK_KEY_Hangul_J_PanSios GDK_Hangul_J_PanSios #define GDK_KEY_Hangul_J_KkogjiDalrinIeung GDK_Hangul_J_KkogjiDalrinIeung #define GDK_KEY_Hangul_J_YeorinHieuh GDK_Hangul_J_YeorinHieuh #define GDK_KEY_Korean_Won GDK_Korean_Won #define GDK_KEY_Armenian_ligature_ew GDK_Armenian_ligature_ew #define GDK_KEY_Armenian_full_stop GDK_Armenian_full_stop #define GDK_KEY_Armenian_verjaket GDK_Armenian_verjaket #define GDK_KEY_Armenian_separation_mark GDK_Armenian_separation_mark #define GDK_KEY_Armenian_but GDK_Armenian_but #define GDK_KEY_Armenian_hyphen GDK_Armenian_hyphen #define GDK_KEY_Armenian_yentamna GDK_Armenian_yentamna #define GDK_KEY_Armenian_exclam GDK_Armenian_exclam #define GDK_KEY_Armenian_amanak GDK_Armenian_amanak #define GDK_KEY_Armenian_accent GDK_Armenian_accent #define GDK_KEY_Armenian_shesht GDK_Armenian_shesht #define GDK_KEY_Armenian_question GDK_Armenian_question #define GDK_KEY_Armenian_paruyk GDK_Armenian_paruyk #define GDK_KEY_Armenian_AYB GDK_Armenian_AYB #define GDK_KEY_Armenian_ayb GDK_Armenian_ayb #define GDK_KEY_Armenian_BEN GDK_Armenian_BEN #define GDK_KEY_Armenian_ben GDK_Armenian_ben #define GDK_KEY_Armenian_GIM GDK_Armenian_GIM #define GDK_KEY_Armenian_gim GDK_Armenian_gim #define GDK_KEY_Armenian_DA GDK_Armenian_DA #define GDK_KEY_Armenian_da GDK_Armenian_da #define GDK_KEY_Armenian_YECH GDK_Armenian_YECH #define GDK_KEY_Armenian_yech GDK_Armenian_yech #define GDK_KEY_Armenian_ZA GDK_Armenian_ZA #define GDK_KEY_Armenian_za GDK_Armenian_za #define GDK_KEY_Armenian_E GDK_Armenian_E #define GDK_KEY_Armenian_e GDK_Armenian_e #define GDK_KEY_Armenian_AT GDK_Armenian_AT #define GDK_KEY_Armenian_at GDK_Armenian_at #define GDK_KEY_Armenian_TO GDK_Armenian_TO #define GDK_KEY_Armenian_to GDK_Armenian_to #define GDK_KEY_Armenian_ZHE GDK_Armenian_ZHE #define GDK_KEY_Armenian_zhe GDK_Armenian_zhe #define GDK_KEY_Armenian_INI GDK_Armenian_INI #define GDK_KEY_Armenian_ini GDK_Armenian_ini #define GDK_KEY_Armenian_LYUN GDK_Armenian_LYUN #define GDK_KEY_Armenian_lyun GDK_Armenian_lyun #define GDK_KEY_Armenian_KHE GDK_Armenian_KHE #define GDK_KEY_Armenian_khe GDK_Armenian_khe #define GDK_KEY_Armenian_TSA GDK_Armenian_TSA #define GDK_KEY_Armenian_tsa GDK_Armenian_tsa #define GDK_KEY_Armenian_KEN GDK_Armenian_KEN #define GDK_KEY_Armenian_ken GDK_Armenian_ken #define GDK_KEY_Armenian_HO GDK_Armenian_HO #define GDK_KEY_Armenian_ho GDK_Armenian_ho #define GDK_KEY_Armenian_DZA GDK_Armenian_DZA #define GDK_KEY_Armenian_dza GDK_Armenian_dza #define GDK_KEY_Armenian_GHAT GDK_Armenian_GHAT #define GDK_KEY_Armenian_ghat GDK_Armenian_ghat #define GDK_KEY_Armenian_TCHE GDK_Armenian_TCHE #define GDK_KEY_Armenian_tche GDK_Armenian_tche #define GDK_KEY_Armenian_MEN GDK_Armenian_MEN #define GDK_KEY_Armenian_men GDK_Armenian_men #define GDK_KEY_Armenian_HI GDK_Armenian_HI #define GDK_KEY_Armenian_hi GDK_Armenian_hi #define GDK_KEY_Armenian_NU GDK_Armenian_NU #define GDK_KEY_Armenian_nu GDK_Armenian_nu #define GDK_KEY_Armenian_SHA GDK_Armenian_SHA #define GDK_KEY_Armenian_sha GDK_Armenian_sha #define GDK_KEY_Armenian_VO GDK_Armenian_VO #define GDK_KEY_Armenian_vo GDK_Armenian_vo #define GDK_KEY_Armenian_CHA GDK_Armenian_CHA #define GDK_KEY_Armenian_cha GDK_Armenian_cha #define GDK_KEY_Armenian_PE GDK_Armenian_PE #define GDK_KEY_Armenian_pe GDK_Armenian_pe #define GDK_KEY_Armenian_JE GDK_Armenian_JE #define GDK_KEY_Armenian_je GDK_Armenian_je #define GDK_KEY_Armenian_RA GDK_Armenian_RA #define GDK_KEY_Armenian_ra GDK_Armenian_ra #define GDK_KEY_Armenian_SE GDK_Armenian_SE #define GDK_KEY_Armenian_se GDK_Armenian_se #define GDK_KEY_Armenian_VEV GDK_Armenian_VEV #define GDK_KEY_Armenian_vev GDK_Armenian_vev #define GDK_KEY_Armenian_TYUN GDK_Armenian_TYUN #define GDK_KEY_Armenian_tyun GDK_Armenian_tyun #define GDK_KEY_Armenian_RE GDK_Armenian_RE #define GDK_KEY_Armenian_re GDK_Armenian_re #define GDK_KEY_Armenian_TSO GDK_Armenian_TSO #define GDK_KEY_Armenian_tso GDK_Armenian_tso #define GDK_KEY_Armenian_VYUN GDK_Armenian_VYUN #define GDK_KEY_Armenian_vyun GDK_Armenian_vyun #define GDK_KEY_Armenian_PYUR GDK_Armenian_PYUR #define GDK_KEY_Armenian_pyur GDK_Armenian_pyur #define GDK_KEY_Armenian_KE GDK_Armenian_KE #define GDK_KEY_Armenian_ke GDK_Armenian_ke #define GDK_KEY_Armenian_O GDK_Armenian_O #define GDK_KEY_Armenian_o GDK_Armenian_o #define GDK_KEY_Armenian_FE GDK_Armenian_FE #define GDK_KEY_Armenian_fe GDK_Armenian_fe #define GDK_KEY_Armenian_apostrophe GDK_Armenian_apostrophe #define GDK_KEY_Georgian_an GDK_Georgian_an #define GDK_KEY_Georgian_ban GDK_Georgian_ban #define GDK_KEY_Georgian_gan GDK_Georgian_gan #define GDK_KEY_Georgian_don GDK_Georgian_don #define GDK_KEY_Georgian_en GDK_Georgian_en #define GDK_KEY_Georgian_vin GDK_Georgian_vin #define GDK_KEY_Georgian_zen GDK_Georgian_zen #define GDK_KEY_Georgian_tan GDK_Georgian_tan #define GDK_KEY_Georgian_in GDK_Georgian_in #define GDK_KEY_Georgian_kan GDK_Georgian_kan #define GDK_KEY_Georgian_las GDK_Georgian_las #define GDK_KEY_Georgian_man GDK_Georgian_man #define GDK_KEY_Georgian_nar GDK_Georgian_nar #define GDK_KEY_Georgian_on GDK_Georgian_on #define GDK_KEY_Georgian_par GDK_Georgian_par #define GDK_KEY_Georgian_zhar GDK_Georgian_zhar #define GDK_KEY_Georgian_rae GDK_Georgian_rae #define GDK_KEY_Georgian_san GDK_Georgian_san #define GDK_KEY_Georgian_tar GDK_Georgian_tar #define GDK_KEY_Georgian_un GDK_Georgian_un #define GDK_KEY_Georgian_phar GDK_Georgian_phar #define GDK_KEY_Georgian_khar GDK_Georgian_khar #define GDK_KEY_Georgian_ghan GDK_Georgian_ghan #define GDK_KEY_Georgian_qar GDK_Georgian_qar #define GDK_KEY_Georgian_shin GDK_Georgian_shin #define GDK_KEY_Georgian_chin GDK_Georgian_chin #define GDK_KEY_Georgian_can GDK_Georgian_can #define GDK_KEY_Georgian_jil GDK_Georgian_jil #define GDK_KEY_Georgian_cil GDK_Georgian_cil #define GDK_KEY_Georgian_char GDK_Georgian_char #define GDK_KEY_Georgian_xan GDK_Georgian_xan #define GDK_KEY_Georgian_jhan GDK_Georgian_jhan #define GDK_KEY_Georgian_hae GDK_Georgian_hae #define GDK_KEY_Georgian_he GDK_Georgian_he #define GDK_KEY_Georgian_hie GDK_Georgian_hie #define GDK_KEY_Georgian_we GDK_Georgian_we #define GDK_KEY_Georgian_har GDK_Georgian_har #define GDK_KEY_Georgian_hoe GDK_Georgian_hoe #define GDK_KEY_Georgian_fi GDK_Georgian_fi #define GDK_KEY_Xabovedot GDK_Xabovedot #define GDK_KEY_Ibreve GDK_Ibreve #define GDK_KEY_Zstroke GDK_Zstroke #define GDK_KEY_Gcaron GDK_Gcaron #define GDK_KEY_Ocaron GDK_Ocaron #define GDK_KEY_Obarred GDK_Obarred #define GDK_KEY_xabovedot GDK_xabovedot #define GDK_KEY_ibreve GDK_ibreve #define GDK_KEY_zstroke GDK_zstroke #define GDK_KEY_gcaron GDK_gcaron #define GDK_KEY_ocaron GDK_ocaron #define GDK_KEY_obarred GDK_obarred #define GDK_KEY_SCHWA GDK_SCHWA #define GDK_KEY_schwa GDK_schwa #define GDK_KEY_Lbelowdot GDK_Lbelowdot #define GDK_KEY_lbelowdot GDK_lbelowdot #define GDK_KEY_Abelowdot GDK_Abelowdot #define GDK_KEY_abelowdot GDK_abelowdot #define GDK_KEY_Ahook GDK_Ahook #define GDK_KEY_ahook GDK_ahook #define GDK_KEY_Acircumflexacute GDK_Acircumflexacute #define GDK_KEY_acircumflexacute GDK_acircumflexacute #define GDK_KEY_Acircumflexgrave GDK_Acircumflexgrave #define GDK_KEY_acircumflexgrave GDK_acircumflexgrave #define GDK_KEY_Acircumflexhook GDK_Acircumflexhook #define GDK_KEY_acircumflexhook GDK_acircumflexhook #define GDK_KEY_Acircumflextilde GDK_Acircumflextilde #define GDK_KEY_acircumflextilde GDK_acircumflextilde #define GDK_KEY_Acircumflexbelowdot GDK_Acircumflexbelowdot #define GDK_KEY_acircumflexbelowdot GDK_acircumflexbelowdot #define GDK_KEY_Abreveacute GDK_Abreveacute #define GDK_KEY_abreveacute GDK_abreveacute #define GDK_KEY_Abrevegrave GDK_Abrevegrave #define GDK_KEY_abrevegrave GDK_abrevegrave #define GDK_KEY_Abrevehook GDK_Abrevehook #define GDK_KEY_abrevehook GDK_abrevehook #define GDK_KEY_Abrevetilde GDK_Abrevetilde #define GDK_KEY_abrevetilde GDK_abrevetilde #define GDK_KEY_Abrevebelowdot GDK_Abrevebelowdot #define GDK_KEY_abrevebelowdot GDK_abrevebelowdot #define GDK_KEY_Ebelowdot GDK_Ebelowdot #define GDK_KEY_ebelowdot GDK_ebelowdot #define GDK_KEY_Ehook GDK_Ehook #define GDK_KEY_ehook GDK_ehook #define GDK_KEY_Etilde GDK_Etilde #define GDK_KEY_etilde GDK_etilde #define GDK_KEY_Ecircumflexacute GDK_Ecircumflexacute #define GDK_KEY_ecircumflexacute GDK_ecircumflexacute #define GDK_KEY_Ecircumflexgrave GDK_Ecircumflexgrave #define GDK_KEY_ecircumflexgrave GDK_ecircumflexgrave #define GDK_KEY_Ecircumflexhook GDK_Ecircumflexhook #define GDK_KEY_ecircumflexhook GDK_ecircumflexhook #define GDK_KEY_Ecircumflextilde GDK_Ecircumflextilde #define GDK_KEY_ecircumflextilde GDK_ecircumflextilde #define GDK_KEY_Ecircumflexbelowdot GDK_Ecircumflexbelowdot #define GDK_KEY_ecircumflexbelowdot GDK_ecircumflexbelowdot #define GDK_KEY_Ihook GDK_Ihook #define GDK_KEY_ihook GDK_ihook #define GDK_KEY_Ibelowdot GDK_Ibelowdot #define GDK_KEY_ibelowdot GDK_ibelowdot #define GDK_KEY_Obelowdot GDK_Obelowdot #define GDK_KEY_obelowdot GDK_obelowdot #define GDK_KEY_Ohook GDK_Ohook #define GDK_KEY_ohook GDK_ohook #define GDK_KEY_Ocircumflexacute GDK_Ocircumflexacute #define GDK_KEY_ocircumflexacute GDK_ocircumflexacute #define GDK_KEY_Ocircumflexgrave GDK_Ocircumflexgrave #define GDK_KEY_ocircumflexgrave GDK_ocircumflexgrave #define GDK_KEY_Ocircumflexhook GDK_Ocircumflexhook #define GDK_KEY_ocircumflexhook GDK_ocircumflexhook #define GDK_KEY_Ocircumflextilde GDK_Ocircumflextilde #define GDK_KEY_ocircumflextilde GDK_ocircumflextilde #define GDK_KEY_Ocircumflexbelowdot GDK_Ocircumflexbelowdot #define GDK_KEY_ocircumflexbelowdot GDK_ocircumflexbelowdot #define GDK_KEY_Ohornacute GDK_Ohornacute #define GDK_KEY_ohornacute GDK_ohornacute #define GDK_KEY_Ohorngrave GDK_Ohorngrave #define GDK_KEY_ohorngrave GDK_ohorngrave #define GDK_KEY_Ohornhook GDK_Ohornhook #define GDK_KEY_ohornhook GDK_ohornhook #define GDK_KEY_Ohorntilde GDK_Ohorntilde #define GDK_KEY_ohorntilde GDK_ohorntilde #define GDK_KEY_Ohornbelowdot GDK_Ohornbelowdot #define GDK_KEY_ohornbelowdot GDK_ohornbelowdot #define GDK_KEY_Ubelowdot GDK_Ubelowdot #define GDK_KEY_ubelowdot GDK_ubelowdot #define GDK_KEY_Uhook GDK_Uhook #define GDK_KEY_uhook GDK_uhook #define GDK_KEY_Uhornacute GDK_Uhornacute #define GDK_KEY_uhornacute GDK_uhornacute #define GDK_KEY_Uhorngrave GDK_Uhorngrave #define GDK_KEY_uhorngrave GDK_uhorngrave #define GDK_KEY_Uhornhook GDK_Uhornhook #define GDK_KEY_uhornhook GDK_uhornhook #define GDK_KEY_Uhorntilde GDK_Uhorntilde #define GDK_KEY_uhorntilde GDK_uhorntilde #define GDK_KEY_Uhornbelowdot GDK_Uhornbelowdot #define GDK_KEY_uhornbelowdot GDK_uhornbelowdot #define GDK_KEY_Ybelowdot GDK_Ybelowdot #define GDK_KEY_ybelowdot GDK_ybelowdot #define GDK_KEY_Yhook GDK_Yhook #define GDK_KEY_yhook GDK_yhook #define GDK_KEY_Ytilde GDK_Ytilde #define GDK_KEY_ytilde GDK_ytilde #define GDK_KEY_Ohorn GDK_Ohorn #define GDK_KEY_ohorn GDK_ohorn #define GDK_KEY_Uhorn GDK_Uhorn #define GDK_KEY_uhorn GDK_uhorn #define GDK_KEY_EcuSign GDK_EcuSign #define GDK_KEY_ColonSign GDK_ColonSign #define GDK_KEY_CruzeiroSign GDK_CruzeiroSign #define GDK_KEY_FFrancSign GDK_FFrancSign #define GDK_KEY_LiraSign GDK_LiraSign #define GDK_KEY_MillSign GDK_MillSign #define GDK_KEY_NairaSign GDK_NairaSign #define GDK_KEY_PesetaSign GDK_PesetaSign #define GDK_KEY_RupeeSign GDK_RupeeSign #define GDK_KEY_WonSign GDK_WonSign #define GDK_KEY_NewSheqelSign GDK_NewSheqelSign #define GDK_KEY_DongSign GDK_DongSign #define GDK_KEY_EuroSign GDK_EuroSign #define GDK_KEY_zerosuperior GDK_zerosuperior #define GDK_KEY_foursuperior GDK_foursuperior #define GDK_KEY_fivesuperior GDK_fivesuperior #define GDK_KEY_sixsuperior GDK_sixsuperior #define GDK_KEY_sevensuperior GDK_sevensuperior #define GDK_KEY_eightsuperior GDK_eightsuperior #define GDK_KEY_ninesuperior GDK_ninesuperior #define GDK_KEY_zerosubscript GDK_zerosubscript #define GDK_KEY_onesubscript GDK_onesubscript #define GDK_KEY_twosubscript GDK_twosubscript #define GDK_KEY_threesubscript GDK_threesubscript #define GDK_KEY_foursubscript GDK_foursubscript #define GDK_KEY_fivesubscript GDK_fivesubscript #define GDK_KEY_sixsubscript GDK_sixsubscript #define GDK_KEY_sevensubscript GDK_sevensubscript #define GDK_KEY_eightsubscript GDK_eightsubscript #define GDK_KEY_ninesubscript GDK_ninesubscript #define GDK_KEY_partdifferential GDK_partdifferential #define GDK_KEY_emptyset GDK_emptyset #define GDK_KEY_elementof GDK_elementof #define GDK_KEY_notelementof GDK_notelementof #define GDK_KEY_containsas GDK_containsas #define GDK_KEY_squareroot GDK_squareroot #define GDK_KEY_cuberoot GDK_cuberoot #define GDK_KEY_fourthroot GDK_fourthroot #define GDK_KEY_dintegral GDK_dintegral #define GDK_KEY_tintegral GDK_tintegral #define GDK_KEY_because GDK_because #define GDK_KEY_approxeq GDK_approxeq #define GDK_KEY_notapproxeq GDK_notapproxeq #define GDK_KEY_notidentical GDK_notidentical #define GDK_KEY_stricteq GDK_stricteq #define GDK_KEY_braille_dot_1 GDK_braille_dot_1 #define GDK_KEY_braille_dot_2 GDK_braille_dot_2 #define GDK_KEY_braille_dot_3 GDK_braille_dot_3 #define GDK_KEY_braille_dot_4 GDK_braille_dot_4 #define GDK_KEY_braille_dot_5 GDK_braille_dot_5 #define GDK_KEY_braille_dot_6 GDK_braille_dot_6 #define GDK_KEY_braille_dot_7 GDK_braille_dot_7 #define GDK_KEY_braille_dot_8 GDK_braille_dot_8 #define GDK_KEY_braille_dot_9 GDK_braille_dot_9 #define GDK_KEY_braille_dot_10 GDK_braille_dot_10 #define GDK_KEY_braille_blank GDK_braille_blank #define GDK_KEY_braille_dots_1 GDK_braille_dots_1 #define GDK_KEY_braille_dots_2 GDK_braille_dots_2 #define GDK_KEY_braille_dots_12 GDK_braille_dots_12 #define GDK_KEY_braille_dots_3 GDK_braille_dots_3 #define GDK_KEY_braille_dots_13 GDK_braille_dots_13 #define GDK_KEY_braille_dots_23 GDK_braille_dots_23 #define GDK_KEY_braille_dots_123 GDK_braille_dots_123 #define GDK_KEY_braille_dots_4 GDK_braille_dots_4 #define GDK_KEY_braille_dots_14 GDK_braille_dots_14 #define GDK_KEY_braille_dots_24 GDK_braille_dots_24 #define GDK_KEY_braille_dots_124 GDK_braille_dots_124 #define GDK_KEY_braille_dots_34 GDK_braille_dots_34 #define GDK_KEY_braille_dots_134 GDK_braille_dots_134 #define GDK_KEY_braille_dots_234 GDK_braille_dots_234 #define GDK_KEY_braille_dots_1234 GDK_braille_dots_1234 #define GDK_KEY_braille_dots_5 GDK_braille_dots_5 #define GDK_KEY_braille_dots_15 GDK_braille_dots_15 #define GDK_KEY_braille_dots_25 GDK_braille_dots_25 #define GDK_KEY_braille_dots_125 GDK_braille_dots_125 #define GDK_KEY_braille_dots_35 GDK_braille_dots_35 #define GDK_KEY_braille_dots_135 GDK_braille_dots_135 #define GDK_KEY_braille_dots_235 GDK_braille_dots_235 #define GDK_KEY_braille_dots_1235 GDK_braille_dots_1235 #define GDK_KEY_braille_dots_45 GDK_braille_dots_45 #define GDK_KEY_braille_dots_145 GDK_braille_dots_145 #define GDK_KEY_braille_dots_245 GDK_braille_dots_245 #define GDK_KEY_braille_dots_1245 GDK_braille_dots_1245 #define GDK_KEY_braille_dots_345 GDK_braille_dots_345 #define GDK_KEY_braille_dots_1345 GDK_braille_dots_1345 #define GDK_KEY_braille_dots_2345 GDK_braille_dots_2345 #define GDK_KEY_braille_dots_12345 GDK_braille_dots_12345 #define GDK_KEY_braille_dots_6 GDK_braille_dots_6 #define GDK_KEY_braille_dots_16 GDK_braille_dots_16 #define GDK_KEY_braille_dots_26 GDK_braille_dots_26 #define GDK_KEY_braille_dots_126 GDK_braille_dots_126 #define GDK_KEY_braille_dots_36 GDK_braille_dots_36 #define GDK_KEY_braille_dots_136 GDK_braille_dots_136 #define GDK_KEY_braille_dots_236 GDK_braille_dots_236 #define GDK_KEY_braille_dots_1236 GDK_braille_dots_1236 #define GDK_KEY_braille_dots_46 GDK_braille_dots_46 #define GDK_KEY_braille_dots_146 GDK_braille_dots_146 #define GDK_KEY_braille_dots_246 GDK_braille_dots_246 #define GDK_KEY_braille_dots_1246 GDK_braille_dots_1246 #define GDK_KEY_braille_dots_346 GDK_braille_dots_346 #define GDK_KEY_braille_dots_1346 GDK_braille_dots_1346 #define GDK_KEY_braille_dots_2346 GDK_braille_dots_2346 #define GDK_KEY_braille_dots_12346 GDK_braille_dots_12346 #define GDK_KEY_braille_dots_56 GDK_braille_dots_56 #define GDK_KEY_braille_dots_156 GDK_braille_dots_156 #define GDK_KEY_braille_dots_256 GDK_braille_dots_256 #define GDK_KEY_braille_dots_1256 GDK_braille_dots_1256 #define GDK_KEY_braille_dots_356 GDK_braille_dots_356 #define GDK_KEY_braille_dots_1356 GDK_braille_dots_1356 #define GDK_KEY_braille_dots_2356 GDK_braille_dots_2356 #define GDK_KEY_braille_dots_12356 GDK_braille_dots_12356 #define GDK_KEY_braille_dots_456 GDK_braille_dots_456 #define GDK_KEY_braille_dots_1456 GDK_braille_dots_1456 #define GDK_KEY_braille_dots_2456 GDK_braille_dots_2456 #define GDK_KEY_braille_dots_12456 GDK_braille_dots_12456 #define GDK_KEY_braille_dots_3456 GDK_braille_dots_3456 #define GDK_KEY_braille_dots_13456 GDK_braille_dots_13456 #define GDK_KEY_braille_dots_23456 GDK_braille_dots_23456 #define GDK_KEY_braille_dots_123456 GDK_braille_dots_123456 #define GDK_KEY_braille_dots_7 GDK_braille_dots_7 #define GDK_KEY_braille_dots_17 GDK_braille_dots_17 #define GDK_KEY_braille_dots_27 GDK_braille_dots_27 #define GDK_KEY_braille_dots_127 GDK_braille_dots_127 #define GDK_KEY_braille_dots_37 GDK_braille_dots_37 #define GDK_KEY_braille_dots_137 GDK_braille_dots_137 #define GDK_KEY_braille_dots_237 GDK_braille_dots_237 #define GDK_KEY_braille_dots_1237 GDK_braille_dots_1237 #define GDK_KEY_braille_dots_47 GDK_braille_dots_47 #define GDK_KEY_braille_dots_147 GDK_braille_dots_147 #define GDK_KEY_braille_dots_247 GDK_braille_dots_247 #define GDK_KEY_braille_dots_1247 GDK_braille_dots_1247 #define GDK_KEY_braille_dots_347 GDK_braille_dots_347 #define GDK_KEY_braille_dots_1347 GDK_braille_dots_1347 #define GDK_KEY_braille_dots_2347 GDK_braille_dots_2347 #define GDK_KEY_braille_dots_12347 GDK_braille_dots_12347 #define GDK_KEY_braille_dots_57 GDK_braille_dots_57 #define GDK_KEY_braille_dots_157 GDK_braille_dots_157 #define GDK_KEY_braille_dots_257 GDK_braille_dots_257 #define GDK_KEY_braille_dots_1257 GDK_braille_dots_1257 #define GDK_KEY_braille_dots_357 GDK_braille_dots_357 #define GDK_KEY_braille_dots_1357 GDK_braille_dots_1357 #define GDK_KEY_braille_dots_2357 GDK_braille_dots_2357 #define GDK_KEY_braille_dots_12357 GDK_braille_dots_12357 #define GDK_KEY_braille_dots_457 GDK_braille_dots_457 #define GDK_KEY_braille_dots_1457 GDK_braille_dots_1457 #define GDK_KEY_braille_dots_2457 GDK_braille_dots_2457 #define GDK_KEY_braille_dots_12457 GDK_braille_dots_12457 #define GDK_KEY_braille_dots_3457 GDK_braille_dots_3457 #define GDK_KEY_braille_dots_13457 GDK_braille_dots_13457 #define GDK_KEY_braille_dots_23457 GDK_braille_dots_23457 #define GDK_KEY_braille_dots_123457 GDK_braille_dots_123457 #define GDK_KEY_braille_dots_67 GDK_braille_dots_67 #define GDK_KEY_braille_dots_167 GDK_braille_dots_167 #define GDK_KEY_braille_dots_267 GDK_braille_dots_267 #define GDK_KEY_braille_dots_1267 GDK_braille_dots_1267 #define GDK_KEY_braille_dots_367 GDK_braille_dots_367 #define GDK_KEY_braille_dots_1367 GDK_braille_dots_1367 #define GDK_KEY_braille_dots_2367 GDK_braille_dots_2367 #define GDK_KEY_braille_dots_12367 GDK_braille_dots_12367 #define GDK_KEY_braille_dots_467 GDK_braille_dots_467 #define GDK_KEY_braille_dots_1467 GDK_braille_dots_1467 #define GDK_KEY_braille_dots_2467 GDK_braille_dots_2467 #define GDK_KEY_braille_dots_12467 GDK_braille_dots_12467 #define GDK_KEY_braille_dots_3467 GDK_braille_dots_3467 #define GDK_KEY_braille_dots_13467 GDK_braille_dots_13467 #define GDK_KEY_braille_dots_23467 GDK_braille_dots_23467 #define GDK_KEY_braille_dots_123467 GDK_braille_dots_123467 #define GDK_KEY_braille_dots_567 GDK_braille_dots_567 #define GDK_KEY_braille_dots_1567 GDK_braille_dots_1567 #define GDK_KEY_braille_dots_2567 GDK_braille_dots_2567 #define GDK_KEY_braille_dots_12567 GDK_braille_dots_12567 #define GDK_KEY_braille_dots_3567 GDK_braille_dots_3567 #define GDK_KEY_braille_dots_13567 GDK_braille_dots_13567 #define GDK_KEY_braille_dots_23567 GDK_braille_dots_23567 #define GDK_KEY_braille_dots_123567 GDK_braille_dots_123567 #define GDK_KEY_braille_dots_4567 GDK_braille_dots_4567 #define GDK_KEY_braille_dots_14567 GDK_braille_dots_14567 #define GDK_KEY_braille_dots_24567 GDK_braille_dots_24567 #define GDK_KEY_braille_dots_124567 GDK_braille_dots_124567 #define GDK_KEY_braille_dots_34567 GDK_braille_dots_34567 #define GDK_KEY_braille_dots_134567 GDK_braille_dots_134567 #define GDK_KEY_braille_dots_234567 GDK_braille_dots_234567 #define GDK_KEY_braille_dots_1234567 GDK_braille_dots_1234567 #define GDK_KEY_braille_dots_8 GDK_braille_dots_8 #define GDK_KEY_braille_dots_18 GDK_braille_dots_18 #define GDK_KEY_braille_dots_28 GDK_braille_dots_28 #define GDK_KEY_braille_dots_128 GDK_braille_dots_128 #define GDK_KEY_braille_dots_38 GDK_braille_dots_38 #define GDK_KEY_braille_dots_138 GDK_braille_dots_138 #define GDK_KEY_braille_dots_238 GDK_braille_dots_238 #define GDK_KEY_braille_dots_1238 GDK_braille_dots_1238 #define GDK_KEY_braille_dots_48 GDK_braille_dots_48 #define GDK_KEY_braille_dots_148 GDK_braille_dots_148 #define GDK_KEY_braille_dots_248 GDK_braille_dots_248 #define GDK_KEY_braille_dots_1248 GDK_braille_dots_1248 #define GDK_KEY_braille_dots_348 GDK_braille_dots_348 #define GDK_KEY_braille_dots_1348 GDK_braille_dots_1348 #define GDK_KEY_braille_dots_2348 GDK_braille_dots_2348 #define GDK_KEY_braille_dots_12348 GDK_braille_dots_12348 #define GDK_KEY_braille_dots_58 GDK_braille_dots_58 #define GDK_KEY_braille_dots_158 GDK_braille_dots_158 #define GDK_KEY_braille_dots_258 GDK_braille_dots_258 #define GDK_KEY_braille_dots_1258 GDK_braille_dots_1258 #define GDK_KEY_braille_dots_358 GDK_braille_dots_358 #define GDK_KEY_braille_dots_1358 GDK_braille_dots_1358 #define GDK_KEY_braille_dots_2358 GDK_braille_dots_2358 #define GDK_KEY_braille_dots_12358 GDK_braille_dots_12358 #define GDK_KEY_braille_dots_458 GDK_braille_dots_458 #define GDK_KEY_braille_dots_1458 GDK_braille_dots_1458 #define GDK_KEY_braille_dots_2458 GDK_braille_dots_2458 #define GDK_KEY_braille_dots_12458 GDK_braille_dots_12458 #define GDK_KEY_braille_dots_3458 GDK_braille_dots_3458 #define GDK_KEY_braille_dots_13458 GDK_braille_dots_13458 #define GDK_KEY_braille_dots_23458 GDK_braille_dots_23458 #define GDK_KEY_braille_dots_123458 GDK_braille_dots_123458 #define GDK_KEY_braille_dots_68 GDK_braille_dots_68 #define GDK_KEY_braille_dots_168 GDK_braille_dots_168 #define GDK_KEY_braille_dots_268 GDK_braille_dots_268 #define GDK_KEY_braille_dots_1268 GDK_braille_dots_1268 #define GDK_KEY_braille_dots_368 GDK_braille_dots_368 #define GDK_KEY_braille_dots_1368 GDK_braille_dots_1368 #define GDK_KEY_braille_dots_2368 GDK_braille_dots_2368 #define GDK_KEY_braille_dots_12368 GDK_braille_dots_12368 #define GDK_KEY_braille_dots_468 GDK_braille_dots_468 #define GDK_KEY_braille_dots_1468 GDK_braille_dots_1468 #define GDK_KEY_braille_dots_2468 GDK_braille_dots_2468 #define GDK_KEY_braille_dots_12468 GDK_braille_dots_12468 #define GDK_KEY_braille_dots_3468 GDK_braille_dots_3468 #define GDK_KEY_braille_dots_13468 GDK_braille_dots_13468 #define GDK_KEY_braille_dots_23468 GDK_braille_dots_23468 #define GDK_KEY_braille_dots_123468 GDK_braille_dots_123468 #define GDK_KEY_braille_dots_568 GDK_braille_dots_568 #define GDK_KEY_braille_dots_1568 GDK_braille_dots_1568 #define GDK_KEY_braille_dots_2568 GDK_braille_dots_2568 #define GDK_KEY_braille_dots_12568 GDK_braille_dots_12568 #define GDK_KEY_braille_dots_3568 GDK_braille_dots_3568 #define GDK_KEY_braille_dots_13568 GDK_braille_dots_13568 #define GDK_KEY_braille_dots_23568 GDK_braille_dots_23568 #define GDK_KEY_braille_dots_123568 GDK_braille_dots_123568 #define GDK_KEY_braille_dots_4568 GDK_braille_dots_4568 #define GDK_KEY_braille_dots_14568 GDK_braille_dots_14568 #define GDK_KEY_braille_dots_24568 GDK_braille_dots_24568 #define GDK_KEY_braille_dots_124568 GDK_braille_dots_124568 #define GDK_KEY_braille_dots_34568 GDK_braille_dots_34568 #define GDK_KEY_braille_dots_134568 GDK_braille_dots_134568 #define GDK_KEY_braille_dots_234568 GDK_braille_dots_234568 #define GDK_KEY_braille_dots_1234568 GDK_braille_dots_1234568 #define GDK_KEY_braille_dots_78 GDK_braille_dots_78 #define GDK_KEY_braille_dots_178 GDK_braille_dots_178 #define GDK_KEY_braille_dots_278 GDK_braille_dots_278 #define GDK_KEY_braille_dots_1278 GDK_braille_dots_1278 #define GDK_KEY_braille_dots_378 GDK_braille_dots_378 #define GDK_KEY_braille_dots_1378 GDK_braille_dots_1378 #define GDK_KEY_braille_dots_2378 GDK_braille_dots_2378 #define GDK_KEY_braille_dots_12378 GDK_braille_dots_12378 #define GDK_KEY_braille_dots_478 GDK_braille_dots_478 #define GDK_KEY_braille_dots_1478 GDK_braille_dots_1478 #define GDK_KEY_braille_dots_2478 GDK_braille_dots_2478 #define GDK_KEY_braille_dots_12478 GDK_braille_dots_12478 #define GDK_KEY_braille_dots_3478 GDK_braille_dots_3478 #define GDK_KEY_braille_dots_13478 GDK_braille_dots_13478 #define GDK_KEY_braille_dots_23478 GDK_braille_dots_23478 #define GDK_KEY_braille_dots_123478 GDK_braille_dots_123478 #define GDK_KEY_braille_dots_578 GDK_braille_dots_578 #define GDK_KEY_braille_dots_1578 GDK_braille_dots_1578 #define GDK_KEY_braille_dots_2578 GDK_braille_dots_2578 #define GDK_KEY_braille_dots_12578 GDK_braille_dots_12578 #define GDK_KEY_braille_dots_3578 GDK_braille_dots_3578 #define GDK_KEY_braille_dots_13578 GDK_braille_dots_13578 #define GDK_KEY_braille_dots_23578 GDK_braille_dots_23578 #define GDK_KEY_braille_dots_123578 GDK_braille_dots_123578 #define GDK_KEY_braille_dots_4578 GDK_braille_dots_4578 #define GDK_KEY_braille_dots_14578 GDK_braille_dots_14578 #define GDK_KEY_braille_dots_24578 GDK_braille_dots_24578 #define GDK_KEY_braille_dots_124578 GDK_braille_dots_124578 #define GDK_KEY_braille_dots_34578 GDK_braille_dots_34578 #define GDK_KEY_braille_dots_134578 GDK_braille_dots_134578 #define GDK_KEY_braille_dots_234578 GDK_braille_dots_234578 #define GDK_KEY_braille_dots_1234578 GDK_braille_dots_1234578 #define GDK_KEY_braille_dots_678 GDK_braille_dots_678 #define GDK_KEY_braille_dots_1678 GDK_braille_dots_1678 #define GDK_KEY_braille_dots_2678 GDK_braille_dots_2678 #define GDK_KEY_braille_dots_12678 GDK_braille_dots_12678 #define GDK_KEY_braille_dots_3678 GDK_braille_dots_3678 #define GDK_KEY_braille_dots_13678 GDK_braille_dots_13678 #define GDK_KEY_braille_dots_23678 GDK_braille_dots_23678 #define GDK_KEY_braille_dots_123678 GDK_braille_dots_123678 #define GDK_KEY_braille_dots_4678 GDK_braille_dots_4678 #define GDK_KEY_braille_dots_14678 GDK_braille_dots_14678 #define GDK_KEY_braille_dots_24678 GDK_braille_dots_24678 #define GDK_KEY_braille_dots_124678 GDK_braille_dots_124678 #define GDK_KEY_braille_dots_34678 GDK_braille_dots_34678 #define GDK_KEY_braille_dots_134678 GDK_braille_dots_134678 #define GDK_KEY_braille_dots_234678 GDK_braille_dots_234678 #define GDK_KEY_braille_dots_1234678 GDK_braille_dots_1234678 #define GDK_KEY_braille_dots_5678 GDK_braille_dots_5678 #define GDK_KEY_braille_dots_15678 GDK_braille_dots_15678 #define GDK_KEY_braille_dots_25678 GDK_braille_dots_25678 #define GDK_KEY_braille_dots_125678 GDK_braille_dots_125678 #define GDK_KEY_braille_dots_35678 GDK_braille_dots_35678 #define GDK_KEY_braille_dots_135678 GDK_braille_dots_135678 #define GDK_KEY_braille_dots_235678 GDK_braille_dots_235678 #define GDK_KEY_braille_dots_1235678 GDK_braille_dots_1235678 #define GDK_KEY_braille_dots_45678 GDK_braille_dots_45678 #define GDK_KEY_braille_dots_145678 GDK_braille_dots_145678 #define GDK_KEY_braille_dots_245678 GDK_braille_dots_245678 #define GDK_KEY_braille_dots_1245678 GDK_braille_dots_1245678 #define GDK_KEY_braille_dots_345678 GDK_braille_dots_345678 #define GDK_KEY_braille_dots_1345678 GDK_braille_dots_1345678 #define GDK_KEY_braille_dots_2345678 GDK_braille_dots_2345678 #define GDK_KEY_braille_dots_12345678 GDK_braille_dots_12345678 #define GDK_KEY_Sinh_ng GDK_Sinh_ng #define GDK_KEY_Sinh_h2 GDK_Sinh_h2 #define GDK_KEY_Sinh_a GDK_Sinh_a #define GDK_KEY_Sinh_aa GDK_Sinh_aa #define GDK_KEY_Sinh_ae GDK_Sinh_ae #define GDK_KEY_Sinh_aee GDK_Sinh_aee #define GDK_KEY_Sinh_i GDK_Sinh_i #define GDK_KEY_Sinh_ii GDK_Sinh_ii #define GDK_KEY_Sinh_u GDK_Sinh_u #define GDK_KEY_Sinh_uu GDK_Sinh_uu #define GDK_KEY_Sinh_ri GDK_Sinh_ri #define GDK_KEY_Sinh_rii GDK_Sinh_rii #define GDK_KEY_Sinh_lu GDK_Sinh_lu #define GDK_KEY_Sinh_luu GDK_Sinh_luu #define GDK_KEY_Sinh_e GDK_Sinh_e #define GDK_KEY_Sinh_ee GDK_Sinh_ee #define GDK_KEY_Sinh_ai GDK_Sinh_ai #define GDK_KEY_Sinh_o GDK_Sinh_o #define GDK_KEY_Sinh_oo GDK_Sinh_oo #define GDK_KEY_Sinh_au GDK_Sinh_au #define GDK_KEY_Sinh_ka GDK_Sinh_ka #define GDK_KEY_Sinh_kha GDK_Sinh_kha #define GDK_KEY_Sinh_ga GDK_Sinh_ga #define GDK_KEY_Sinh_gha GDK_Sinh_gha #define GDK_KEY_Sinh_ng2 GDK_Sinh_ng2 #define GDK_KEY_Sinh_nga GDK_Sinh_nga #define GDK_KEY_Sinh_ca GDK_Sinh_ca #define GDK_KEY_Sinh_cha GDK_Sinh_cha #define GDK_KEY_Sinh_ja GDK_Sinh_ja #define GDK_KEY_Sinh_jha GDK_Sinh_jha #define GDK_KEY_Sinh_nya GDK_Sinh_nya #define GDK_KEY_Sinh_jnya GDK_Sinh_jnya #define GDK_KEY_Sinh_nja GDK_Sinh_nja #define GDK_KEY_Sinh_tta GDK_Sinh_tta #define GDK_KEY_Sinh_ttha GDK_Sinh_ttha #define GDK_KEY_Sinh_dda GDK_Sinh_dda #define GDK_KEY_Sinh_ddha GDK_Sinh_ddha #define GDK_KEY_Sinh_nna GDK_Sinh_nna #define GDK_KEY_Sinh_ndda GDK_Sinh_ndda #define GDK_KEY_Sinh_tha GDK_Sinh_tha #define GDK_KEY_Sinh_thha GDK_Sinh_thha #define GDK_KEY_Sinh_dha GDK_Sinh_dha #define GDK_KEY_Sinh_dhha GDK_Sinh_dhha #define GDK_KEY_Sinh_na GDK_Sinh_na #define GDK_KEY_Sinh_ndha GDK_Sinh_ndha #define GDK_KEY_Sinh_pa GDK_Sinh_pa #define GDK_KEY_Sinh_pha GDK_Sinh_pha #define GDK_KEY_Sinh_ba GDK_Sinh_ba #define GDK_KEY_Sinh_bha GDK_Sinh_bha #define GDK_KEY_Sinh_ma GDK_Sinh_ma #define GDK_KEY_Sinh_mba GDK_Sinh_mba #define GDK_KEY_Sinh_ya GDK_Sinh_ya #define GDK_KEY_Sinh_ra GDK_Sinh_ra #define GDK_KEY_Sinh_la GDK_Sinh_la #define GDK_KEY_Sinh_va GDK_Sinh_va #define GDK_KEY_Sinh_sha GDK_Sinh_sha #define GDK_KEY_Sinh_ssha GDK_Sinh_ssha #define GDK_KEY_Sinh_sa GDK_Sinh_sa #define GDK_KEY_Sinh_ha GDK_Sinh_ha #define GDK_KEY_Sinh_lla GDK_Sinh_lla #define GDK_KEY_Sinh_fa GDK_Sinh_fa #define GDK_KEY_Sinh_al GDK_Sinh_al #define GDK_KEY_Sinh_aa2 GDK_Sinh_aa2 #define GDK_KEY_Sinh_ae2 GDK_Sinh_ae2 #define GDK_KEY_Sinh_aee2 GDK_Sinh_aee2 #define GDK_KEY_Sinh_i2 GDK_Sinh_i2 #define GDK_KEY_Sinh_ii2 GDK_Sinh_ii2 #define GDK_KEY_Sinh_u2 GDK_Sinh_u2 #define GDK_KEY_Sinh_uu2 GDK_Sinh_uu2 #define GDK_KEY_Sinh_ru2 GDK_Sinh_ru2 #define GDK_KEY_Sinh_e2 GDK_Sinh_e2 #define GDK_KEY_Sinh_ee2 GDK_Sinh_ee2 #define GDK_KEY_Sinh_ai2 GDK_Sinh_ai2 #define GDK_KEY_Sinh_o2 GDK_Sinh_o2 #define GDK_KEY_Sinh_oo2 GDK_Sinh_oo2 #define GDK_KEY_Sinh_au2 GDK_Sinh_au2 #define GDK_KEY_Sinh_lu2 GDK_Sinh_lu2 #define GDK_KEY_Sinh_ruu2 GDK_Sinh_ruu2 #define GDK_KEY_Sinh_luu2 GDK_Sinh_luu2 #define GDK_KEY_Sinh_kunddaliya GDK_Sinh_kunddaliya #define GDK_KEY_ModeLock GDK_ModeLock #define GDK_KEY_MonBrightnessUp GDK_MonBrightnessUp #define GDK_KEY_MonBrightnessDown GDK_MonBrightnessDown #define GDK_KEY_KbdLightOnOff GDK_KbdLightOnOff #define GDK_KEY_KbdBrightnessUp GDK_KbdBrightnessUp #define GDK_KEY_KbdBrightnessDown GDK_KbdBrightnessDown #define GDK_KEY_Standby GDK_Standby #define GDK_KEY_AudioLowerVolume GDK_AudioLowerVolume #define GDK_KEY_AudioMute GDK_AudioMute #define GDK_KEY_AudioRaiseVolume GDK_AudioRaiseVolume #define GDK_KEY_AudioPlay GDK_AudioPlay #define GDK_KEY_AudioStop GDK_AudioStop #define GDK_KEY_AudioPrev GDK_AudioPrev #define GDK_KEY_AudioNext GDK_AudioNext #define GDK_KEY_HomePage GDK_HomePage #define GDK_KEY_Mail GDK_Mail #define GDK_KEY_Start GDK_Start #define GDK_KEY_Search GDK_Search #define GDK_KEY_AudioRecord GDK_AudioRecord #define GDK_KEY_Calculator GDK_Calculator #define GDK_KEY_Memo GDK_Memo #define GDK_KEY_ToDoList GDK_ToDoList #define GDK_KEY_Calendar GDK_Calendar #define GDK_KEY_PowerDown GDK_PowerDown #define GDK_KEY_ContrastAdjust GDK_ContrastAdjust #define GDK_KEY_RockerUp GDK_RockerUp #define GDK_KEY_RockerDown GDK_RockerDown #define GDK_KEY_RockerEnter GDK_RockerEnter #define GDK_KEY_Back GDK_Back #define GDK_KEY_Forward GDK_Forward #define GDK_KEY_Stop GDK_Stop #define GDK_KEY_Refresh GDK_Refresh #define GDK_KEY_PowerOff GDK_PowerOff #define GDK_KEY_WakeUp GDK_WakeUp #define GDK_KEY_Eject GDK_Eject #define GDK_KEY_ScreenSaver GDK_ScreenSaver #define GDK_KEY_WWW GDK_WWW #define GDK_KEY_Sleep GDK_Sleep #define GDK_KEY_Favorites GDK_Favorites #define GDK_KEY_AudioPause GDK_AudioPause #define GDK_KEY_AudioMedia GDK_AudioMedia #define GDK_KEY_MyComputer GDK_MyComputer #define GDK_KEY_VendorHome GDK_VendorHome #define GDK_KEY_LightBulb GDK_LightBulb #define GDK_KEY_Shop GDK_Shop #define GDK_KEY_History GDK_History #define GDK_KEY_OpenURL GDK_OpenURL #define GDK_KEY_AddFavorite GDK_AddFavorite #define GDK_KEY_HotLinks GDK_HotLinks #define GDK_KEY_BrightnessAdjust GDK_BrightnessAdjust #define GDK_KEY_Finance GDK_Finance #define GDK_KEY_Community GDK_Community #define GDK_KEY_AudioRewind GDK_AudioRewind #define GDK_KEY_BackForward GDK_BackForward #define GDK_KEY_Launch0 GDK_Launch0 #define GDK_KEY_Launch1 GDK_Launch1 #define GDK_KEY_Launch2 GDK_Launch2 #define GDK_KEY_Launch3 GDK_Launch3 #define GDK_KEY_Launch4 GDK_Launch4 #define GDK_KEY_Launch5 GDK_Launch5 #define GDK_KEY_Launch6 GDK_Launch6 #define GDK_KEY_Launch7 GDK_Launch7 #define GDK_KEY_Launch8 GDK_Launch8 #define GDK_KEY_Launch9 GDK_Launch9 #define GDK_KEY_LaunchA GDK_LaunchA #define GDK_KEY_LaunchB GDK_LaunchB #define GDK_KEY_LaunchC GDK_LaunchC #define GDK_KEY_LaunchD GDK_LaunchD #define GDK_KEY_LaunchE GDK_LaunchE #define GDK_KEY_LaunchF GDK_LaunchF #define GDK_KEY_ApplicationLeft GDK_ApplicationLeft #define GDK_KEY_ApplicationRight GDK_ApplicationRight #define GDK_KEY_Book GDK_Book #define GDK_KEY_CD GDK_CD #define GDK_KEY_WindowClear GDK_WindowClear #define GDK_KEY_Close GDK_Close #define GDK_KEY_Copy GDK_Copy #define GDK_KEY_Cut GDK_Cut #define GDK_KEY_Display GDK_Display #define GDK_KEY_DOS GDK_DOS #define GDK_KEY_Documents GDK_Documents #define GDK_KEY_Excel GDK_Excel #define GDK_KEY_Explorer GDK_Explorer #define GDK_KEY_Game GDK_Game #define GDK_KEY_Go GDK_Go #define GDK_KEY_iTouch GDK_iTouch #define GDK_KEY_LogOff GDK_LogOff #define GDK_KEY_Market GDK_Market #define GDK_KEY_Meeting GDK_Meeting #define GDK_KEY_MenuKB GDK_MenuKB #define GDK_KEY_MenuPB GDK_MenuPB #define GDK_KEY_MySites GDK_MySites #define GDK_KEY_New GDK_New #define GDK_KEY_News GDK_News #define GDK_KEY_OfficeHome GDK_OfficeHome #define GDK_KEY_Open GDK_Open #define GDK_KEY_Option GDK_Option #define GDK_KEY_Paste GDK_Paste #define GDK_KEY_Phone GDK_Phone #define GDK_KEY_Reply GDK_Reply #define GDK_KEY_Reload GDK_Reload #define GDK_KEY_RotateWindows GDK_RotateWindows #define GDK_KEY_RotationPB GDK_RotationPB #define GDK_KEY_RotationKB GDK_RotationKB #define GDK_KEY_Save GDK_Save #define GDK_KEY_ScrollUp GDK_ScrollUp #define GDK_KEY_ScrollDown GDK_ScrollDown #define GDK_KEY_ScrollClick GDK_ScrollClick #define GDK_KEY_Send GDK_Send #define GDK_KEY_Spell GDK_Spell #define GDK_KEY_SplitScreen GDK_SplitScreen #define GDK_KEY_Support GDK_Support #define GDK_KEY_TaskPane GDK_TaskPane #define GDK_KEY_Terminal GDK_Terminal #define GDK_KEY_Tools GDK_Tools #define GDK_KEY_Travel GDK_Travel #define GDK_KEY_UserPB GDK_UserPB #define GDK_KEY_User1KB GDK_User1KB #define GDK_KEY_User2KB GDK_User2KB #define GDK_KEY_Video GDK_Video #define GDK_KEY_WheelButton GDK_WheelButton #define GDK_KEY_Word GDK_Word #define GDK_KEY_Xfer GDK_Xfer #define GDK_KEY_ZoomIn GDK_ZoomIn #define GDK_KEY_ZoomOut GDK_ZoomOut #define GDK_KEY_Away GDK_Away #define GDK_KEY_Messenger GDK_Messenger #define GDK_KEY_WebCam GDK_WebCam #define GDK_KEY_MailForward GDK_MailForward #define GDK_KEY_Pictures GDK_Pictures #define GDK_KEY_Music GDK_Music #define GDK_KEY_Battery GDK_Battery #define GDK_KEY_Bluetooth GDK_Bluetooth #define GDK_KEY_WLAN GDK_WLAN #define GDK_KEY_UWB GDK_UWB #define GDK_KEY_AudioForward GDK_AudioForward #define GDK_KEY_AudioRepeat GDK_AudioRepeat #define GDK_KEY_AudioRandomPlay GDK_AudioRandomPlay #define GDK_KEY_Subtitle GDK_Subtitle #define GDK_KEY_AudioCycleTrack GDK_AudioCycleTrack #define GDK_KEY_CycleAngle GDK_CycleAngle #define GDK_KEY_FrameBack GDK_FrameBack #define GDK_KEY_FrameForward GDK_FrameForward #define GDK_KEY_Time GDK_Time #define GDK_KEY_SelectButton GDK_SelectButton #define GDK_KEY_View GDK_View #define GDK_KEY_TopMenu GDK_TopMenu #define GDK_KEY_Red GDK_Red #define GDK_KEY_Green GDK_Green #define GDK_KEY_Yellow GDK_Yellow #define GDK_KEY_Blue GDK_Blue #define GDK_KEY_Suspend GDK_Suspend #define GDK_KEY_Hibernate GDK_Hibernate #define GDK_KEY_TouchpadToggle GDK_TouchpadToggle #define GDK_KEY_TouchpadOn GDK_TouchpadOn #define GDK_KEY_TouchpadOff GDK_TouchpadOff #define GDK_KEY_Switch_VT_1 GDK_Switch_VT_1 #define GDK_KEY_Switch_VT_2 GDK_Switch_VT_2 #define GDK_KEY_Switch_VT_3 GDK_Switch_VT_3 #define GDK_KEY_Switch_VT_4 GDK_Switch_VT_4 #define GDK_KEY_Switch_VT_5 GDK_Switch_VT_5 #define GDK_KEY_Switch_VT_6 GDK_Switch_VT_6 #define GDK_KEY_Switch_VT_7 GDK_Switch_VT_7 #define GDK_KEY_Switch_VT_8 GDK_Switch_VT_8 #define GDK_KEY_Switch_VT_9 GDK_Switch_VT_9 #define GDK_KEY_Switch_VT_10 GDK_Switch_VT_10 #define GDK_KEY_Switch_VT_11 GDK_Switch_VT_11 #define GDK_KEY_Switch_VT_12 GDK_Switch_VT_12 #define GDK_KEY_Ungrab GDK_Ungrab #define GDK_KEY_ClearGrab GDK_ClearGrab #define GDK_KEY_Next_VMode GDK_Next_VMode #define GDK_KEY_Prev_VMode GDK_Prev_VMode #endif #define gtk_widget_override_background_color(widget, state, color) \ gtk_widget_modify_bg(widget, state, color) #define gtk_widget_override_color(widget, state, color) \ gtk_widget_modify_fg(widget, state, color) #define gtk_widget_override_font(widget, font) \ gtk_widget_modify_font(widget, font) #define GdkRGBA GdkColor #define gdk_rgba_parse(out, in) \ gdk_color_parse(in, out) #endif /* GTK_VERSION_MAJOR == 2 */ #endif girara-0.1.9/README0000644000175000001440000000236612242417112012521 0ustar mockusersgirara - user interface library =============================== girara is a library that implements a user interface that focuses on simplicity and minimalism. It consists of three main components: The view is a widget that represents the actual application (e.g.: a web site or a document). The input bar is used to execute commands of the application, while the status bar notifies the user with current information. It is designed to replace and the enhance the user interface that is used by zathura and jumanji. Requirements ------------ gtk2 (>= 2.18.6) or gtk3 (>= 3.2) intltool Please note that you need to have a working pkg-config installation and that the Makefile is only compatible with GNU make. If you don't have a working pkg-config installation, please set the GTK_INC and GTK_LIB environment variables. Installation ------------ Run the following command to build and install girara to your system: make install girara is built for gtk2 by default. If it should be build for gtk3 pass GIRARA_GTK_VERSION to make: make GIRARA_GTK_VERSION=3 install Uninstall --------- To delete girara from your system, type: make uninstall Bugs ---- Please report bugs at http://bugs.pwmt.org or contact us on our mailing list at girara@lists.pwmt.org. girara-0.1.9/settings.h0000644000175000001440000000540412242417112013646 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_SETTINGS_H #define GIRARA_SETTINGS_H #include "types.h" /** * Adds an additional entry in the settings list * * @param session The used girara session * @param name The name of the setting * @param value The value of the setting * @param type The type of the setting * @param init_only Will only available on initialization * @param description Description of the setting * @param callback Function that is called when the setting changes * @param data Arbitary data that can be used by callbacks * @return TRUE No error occured * @return FALSE An error occured */ bool girara_setting_add(girara_session_t* session, const char* name, void* value, girara_setting_type_t type, bool init_only, const char* description, girara_setting_callback_t callback, void* data); /** * Sets the value of a setting * * @param session The used girara session * @param name The name of the setting * @param value The new value of the setting * @return TRUE No error occured * @return FALSE An error occured */ bool girara_setting_set(girara_session_t* session, const char* name, void* value); /** * Retreive the value of a setting. If the setting is a string, the value stored * in dest has to be deallocated with g_free. * @param session The used girara session * @param name The name of the setting * @param dest A pointer to the destination of the result. * @return true if the setting exists, false otherwise. */ bool girara_setting_get(girara_session_t* session, const char* name, void* dest); /** * Find a setting. * * @param session The girara session * @param name name of the setting * @return the setting or NULL if it doesn't exist */ girara_setting_t* girara_setting_find(girara_session_t* session, const char* name); /** * Get the setting's name. * * @param setting The setting * @return the setting's name */ const char* girara_setting_get_name(girara_setting_t* setting); /** * Get the setting's value. If the setting is a string, the value stored * in dest has to be deallocated with g_free. * * @param setting The setting * @param dest A pointer to the destination of the result. * @return true if the setting exists, false otherwise. */ bool girara_setting_get_value(girara_setting_t* setting, void* dest); /** * Get the setting's value. * * @param setting The setting * @return the value */ girara_setting_type_t girara_setting_get_type(girara_setting_t* setting); /** * Set the setting's value. If session is NULL, the setting's callback won't be * called. * * @param session The girara session * @param setting The setting * @param value The new value */ void girara_setting_set_value(girara_session_t* session, girara_setting_t* setting, void* value); #endif girara-0.1.9/config.mk0000644000175000001440000000250612242417112013433 0ustar mockusers# See LICENSE file for license and copyright information GIRARA_VERSION_MAJOR = 0 GIRARA_VERSION_MINOR = 1 GIRARA_VERSION_REV = 9 VERSION = ${GIRARA_VERSION_MAJOR}.${GIRARA_VERSION_MINOR}.${GIRARA_VERSION_REV} # Rules for the SOMAJOR and SOMINOR. # Before a release check perform the following checks against the last release: # * If a function has been removed or the paramaters of a function have changed # bump SOMAJOR and set SOMINOR to 0. # * If any of the exported datastructures have changed in a incompatible way # bump SOMAJOR and set SOMINOR to 0. # * If a function has been added bump SOMINOR. SOMAJOR = 1 SOMINOR = 1 SOVERSION = ${SOMAJOR}.${SOMINOR} # paths PREFIX ?= /usr LIBDIR ?= ${PREFIX}/lib INCLUDEDIR ?= ${PREFIX}/include # locale directory LOCALEDIR ?= ${PREFIX}/share/locale GIRARA_GTK_VERSION ?= 3 # libs GTK_INC ?= $(shell pkg-config --cflags gtk+-${GIRARA_GTK_VERSION}.0) GTK_LIB ?= $(shell pkg-config --libs gtk+-${GIRARA_GTK_VERSION}.0) INCS = ${GTK_INC} LIBS = ${GTK_LIB} -lm # flags CFLAGS += -std=c99 -pedantic -Wall -Wextra -fPIC $(INCS) # linker flags LDFLAGS += -fPIC # debug DFLAGS = -O0 -g # compiler CC ?= gcc # strip SFLAGS ?= -s # set to something != 0 if you want verbose build output VERBOSE ?= 0 # gettext package name GETTEXT_PACKAGE ?= lib${PROJECT}-${SOMAJOR} # msgfmt MSGFMT ?= msgfmt girara-0.1.9/completion.h0000644000175000001440000000252312242417112014156 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_COMPLETION_H #define GIRARA_COMPLETION_H #include "types.h" /** * Creates an girara completion object * * @return Completion object * @return NULL An error occured */ girara_completion_t* girara_completion_init(); /** * Creates an girara completion group * * @return Completion object * @return NULL An error occured */ girara_completion_group_t* girara_completion_group_create( girara_session_t* session, const char* name); /** * Frees a completion group * * @param group The group */ void girara_completion_group_free(girara_completion_group_t* group); /** * Adds an group to a completion object * * @param completion The completion object * @param group The completion group */ void girara_completion_add_group(girara_completion_t* completion, girara_completion_group_t* group); /** * Frees an completion and all of its groups and elements * * @param completion The completion */ void girara_completion_free(girara_completion_t* completion); /** * Adds an element to a completion group * * @param group The completion group * @param value Value of the entry * @param description Description of the entry */ void girara_completion_group_add_element(girara_completion_group_t* group, const char* value, const char* description); #endif girara-0.1.9/types.h0000644000175000001440000001603512242417112013154 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_TYPES_H #define GIRARA_TYPES_H #include "version.h" #include typedef struct girara_tree_node_s girara_tree_node_t; typedef struct girara_list_s girara_list_t; typedef struct girara_list_iterator_s girara_list_iterator_t; typedef struct girara_setting_s girara_setting_t; typedef struct girara_session_s girara_session_t; typedef struct girara_session_private_s girara_session_private_t; typedef struct girara_command_s girara_command_t; typedef struct girara_mouse_event_s girara_mouse_event_t; typedef struct girara_config_handle_s girara_config_handle_t; typedef struct girara_mode_string_s girara_mode_string_t; typedef struct girara_tab_s girara_tab_t; typedef struct girara_statusbar_item_s girara_statusbar_item_t; typedef struct girara_argument_s girara_argument_t; typedef struct girara_shortcut_mapping_s girara_shortcut_mapping_t; typedef struct girara_argument_mapping_s girara_argument_mapping_t; typedef struct girara_completion_element_s girara_completion_element_t; typedef struct girara_completion_s girara_completion_t; typedef struct girara_completion_group_s girara_completion_group_t; typedef struct girara_shortcut_s girara_shortcut_t; typedef struct girara_inputbar_shortcut_s girara_inputbar_shortcut_t; typedef struct girara_special_command_s girara_special_command_t; typedef struct girara_event_s girara_event_t; /** * This structure defines the possible argument identifiers */ enum { GIRARA_HIDE = 1, /**< Hide the completion list */ GIRARA_NEXT, /**< Next entry */ GIRARA_PREVIOUS, /**< Previous entry */ GIRARA_NEXT_GROUP, /**< Next group in the completion list */ GIRARA_PREVIOUS_GROUP, /**< Previous group in the completion list */ GIRARA_HIGHLIGHT, /**< Highlight the entry */ GIRARA_NORMAL, /**< Set to the normal state */ GIRARA_DELETE_LAST_WORD, /**< Delete the last word */ GIRARA_DELETE_LAST_CHAR, /**< Delete the last character */ GIRARA_NEXT_CHAR, /**< Go to the next character */ GIRARA_PREVIOUS_CHAR, /**< Go to the previous character */ GIRARA_DELETE_TO_LINE_START, /**< Delete the line to the start */ GIRARA_DELETE_TO_LINE_END, /**< Delete the line to the end */ GIRARA_DELETE_CURR_CHAR, /**< Delete current char */ GIRARA_GOTO_START, /**< Go to start of the line */ GIRARA_GOTO_END /**< Go to end of the line */ }; /** * Debug levels */ typedef enum girara_debug_level_e { GIRARA_DEBUG, /**> Debug messages */ GIRARA_INFO, /**> Information debug output */ GIRARA_WARNING, /**> Warning level */ GIRARA_ERROR /**> Error */ } girara_debug_level_t; /** * Mode identifier */ typedef int girara_mode_t; /** * Function declaration of a function that generates a completion group * * @param session The current girara session * @param input The current input * @return The completion group */ typedef girara_completion_t* (*girara_completion_function_t)( girara_session_t* session, const char* input); /** * Function declaration of a inputbar special function * * @param session The current girara session * @param input The current input * @param argument The given argument * @return TRUE No error occured * @return FALSE Error occured */ typedef bool (*girara_inputbar_special_function_t)(girara_session_t* session, const char* input, girara_argument_t* argument); /** * Function declaration of a command function * * @param session The current girara session * @param argc Number of arguments * @param argv Arguments */ typedef bool (*girara_command_function_t)(girara_session_t* session, girara_list_t* argument_list); /** * Function declaration of a shortcut function * * If a numeric value has been written into the buffer, this function gets as * often executed as the value defines or until the function returns false the * first time. */ typedef bool (*girara_shortcut_function_t)(girara_session_t*, girara_argument_t*, girara_event_t*, unsigned int); /** * Function declaration of a function that frees something. * * @param data the data to be freed. */ typedef void (*girara_free_function_t)(void* data); /** Function declaration of a function called as callback from girara_list_* * functions. * * @param data a list element. * @param userdata data passed as userdata to the calling function. */ typedef void (*girara_list_callback_t)(void* data, void* userdata); /** Function declaration of a function which compares two elements. * * @param data1 the first element. * @param data2 the second element. * @return -1 if data1 < data2, 0 if data1 == data2 and 1 if data1 > data2 */ typedef int (*girara_compare_function_t)(const void* data1, const void* data2); /** * This structure defines the possible types that a setting value can have */ typedef enum girara_setting_type_e { BOOLEAN, /**< Boolean type */ FLOAT, /**< Floating number */ INT, /**< Integer */ STRING, /**< String */ UNKNOWN = 0xFFFF /**< Unknown type */ } girara_setting_type_t; /** * Function declaration for a settings callback * * @param session The current girara session * @param name The name of the affected settting * @param type The type of the affected setting * @param value Pointer to the new value * @param data User data */ typedef void (*girara_setting_callback_t)(girara_session_t* session, const char* name, girara_setting_type_t type, void* value, void* data); /** * Definition of an argument of a shortcut or buffered command */ struct girara_argument_s { int n; /**< Identifier */ void *data; /**< Data */ }; /** * Define mouse buttons */ typedef enum girara_mouse_button_e { GIRARA_MOUSE_BUTTON1 = 1, /**< Button 1 */ GIRARA_MOUSE_BUTTON2 = 2, /**< Button 2 */ GIRARA_MOUSE_BUTTON3 = 3, /**< Button 3 */ GIRARA_MOUSE_BUTTON4 = 4, /**< Button 4 */ GIRARA_MOUSE_BUTTON5 = 5, /**< Button 5 */ GIRARA_MOUSE_BUTTON6 = 6, /**< Button 6 */ GIRARA_MOUSE_BUTTON7 = 7, /**< Button 7 */ GIRARA_MOUSE_BUTTON8 = 8, /**< Button 8 */ GIRARA_MOUSE_BUTTON9 = 9 /**< Button 9 */ } girara_mouse_button_t; /** * Describes the types of a girara */ typedef enum girara_event_type_e { GIRARA_EVENT_BUTTON_PRESS, /**< Single click */ GIRARA_EVENT_2BUTTON_PRESS, /**< Double click */ GIRARA_EVENT_3BUTTON_PRESS, /**< Triple click */ GIRARA_EVENT_BUTTON_RELEASE, /**< Button released */ GIRARA_EVENT_MOTION_NOTIFY, /**< Cursor moved */ GIRARA_EVENT_SCROLL_UP, /**< Scroll event */ GIRARA_EVENT_SCROLL_DOWN, /**< Scroll event */ GIRARA_EVENT_SCROLL_LEFT, /**< Scroll event */ GIRARA_EVENT_SCROLL_RIGHT, /**< Scroll event */ GIRARA_EVENT_OTHER /**< Unknown event */ } girara_event_type_t; /** * Describes a girara event */ struct girara_event_s { girara_event_type_t type; /**< The event type */ double x; /**< X coordinates where the event occured */ double y; /**< Y coordinates where the event occured */ }; typedef struct girara_input_history_io_s GiraraInputHistoryIO; typedef struct girara_input_history_io_interface_s GiraraInputHistoryIOInterface; typedef struct girara_input_history_s GiraraInputHistory; typedef struct girara_input_history_class_s GiraraInputHistoryClass; #endif girara-0.1.9/girara.pc.in0000644000175000001440000000037312242417112014033 0ustar mockusers LIB_PATH=-L${libdir} INC_PATH=-I${includedir} Name: ${project} Description: User interface libray Version: ${version} URL: http://pwmt.org/projects/libgirara Cflags: ${INC_PATH} Libs: -l${project} ${LIB_PATH} Requires.private: gtk+-${GTK_VERSION}.0 girara-0.1.9/callbacks.c0000644000175000001440000004327212242417112013725 0ustar mockusers/* See LICENSE file for license and copyright information */ #include "callbacks.h" #include "datastructures.h" #include "session.h" #include "shortcuts.h" #include "input-history.h" #include #include #include "internal.h" #if GTK_MAJOR_VERSION == 2 #include "gtk2-compat.h" #endif static const guint ALL_ACCELS_MASK = GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK; static const guint MOUSE_MASK = GDK_CONTROL_MASK | GDK_SHIFT_MASK | GDK_MOD1_MASK | GDK_BUTTON1_MASK | GDK_BUTTON2_MASK | GDK_BUTTON3_MASK | GDK_BUTTON4_MASK | GDK_BUTTON5_MASK; static bool clean_mask(guint hardware_keycode, GdkModifierType state, gint group, guint* clean, guint* keyval) { GdkModifierType consumed = 0; if ((gdk_keymap_translate_keyboard_state( gdk_keymap_get_default(), hardware_keycode, state, group, keyval, NULL, NULL, &consumed) ) == FALSE) { return false; } if (clean != NULL) { *clean = state & ~consumed & ALL_ACCELS_MASK; } /* numpad numbers */ switch (*keyval) { case GDK_KEY_KP_0: *keyval = GDK_KEY_0; break; case GDK_KEY_KP_1: *keyval = GDK_KEY_1; break; case GDK_KEY_KP_2: *keyval = GDK_KEY_2; break; case GDK_KEY_KP_3: *keyval = GDK_KEY_3; break; case GDK_KEY_KP_4: *keyval = GDK_KEY_4; break; case GDK_KEY_KP_5: *keyval = GDK_KEY_5; break; case GDK_KEY_KP_6: *keyval = GDK_KEY_6; break; case GDK_KEY_KP_7: *keyval = GDK_KEY_7; break; case GDK_KEY_KP_8: *keyval = GDK_KEY_8; break; case GDK_KEY_KP_9: *keyval = GDK_KEY_9; break; } return true; } /* callback implementation */ bool girara_callback_view_key_press_event(GtkWidget* UNUSED(widget), GdkEventKey* event, girara_session_t* session) { g_return_val_if_fail(session != NULL, FALSE); guint clean = 0; guint keyval = 0; if (clean_mask(event->hardware_keycode, event->state, event->group, &clean, &keyval) == false) { return false; } /* prepare event */ GIRARA_LIST_FOREACH(session->bindings.shortcuts, girara_shortcut_t*, iter, shortcut) if (session->buffer.command != NULL) { break; } if ( keyval == shortcut->key && (clean == shortcut->mask || (shortcut->key >= 0x21 && shortcut->key <= 0x7E && clean == GDK_SHIFT_MASK)) && (session->modes.current_mode == shortcut->mode || shortcut->mode == 0) && shortcut->function != NULL ) { int t = (session->buffer.n > 0) ? session->buffer.n : 1; for (int i = 0; i < t; i++) { if (shortcut->function(session, &(shortcut->argument), NULL, session->buffer.n) == false) { break; } } if (session->global.buffer != NULL) { g_string_free(session->global.buffer, TRUE); session->global.buffer = NULL; } session->buffer.n = 0; if (session->events.buffer_changed != NULL) { session->events.buffer_changed(session); } girara_list_iterator_free(iter); return TRUE; } GIRARA_LIST_FOREACH_END(session->bindings.shortcuts, girara_shortcut_t*, iter, shortcut); /* update buffer */ if (keyval >= 0x21 && keyval <= 0x7E) { /* overall buffer */ if (session->global.buffer == NULL) { session->global.buffer = g_string_new(""); } session->global.buffer = g_string_append_c(session->global.buffer, keyval); if (session->buffer.command == NULL && keyval >= 0x30 && keyval <= 0x39) { if (((session->buffer.n * 10) + (keyval - '0')) < INT_MAX) { session->buffer.n = (session->buffer.n * 10) + (keyval - '0'); } } else { if (session->buffer.command == NULL) { session->buffer.command = g_string_new(""); } session->buffer.command = g_string_append_c(session->buffer.command, keyval); } if (session->events.buffer_changed != NULL) { session->events.buffer_changed(session); } } /* check for buffer command */ if (session->buffer.command != NULL) { bool matching_command = FALSE; GIRARA_LIST_FOREACH(session->bindings.shortcuts, girara_shortcut_t*, iter, shortcut) if (shortcut->buffered_command != NULL) { /* buffer could match a command */ if (!strncmp(session->buffer.command->str, shortcut->buffered_command, session->buffer.command->len)) { /* command matches buffer exactly */ if (!strcmp(session->buffer.command->str, shortcut->buffered_command) && (session->modes.current_mode == shortcut->mode || shortcut->mode == 0)) { g_string_free(session->buffer.command, TRUE); g_string_free(session->global.buffer, TRUE); session->buffer.command = NULL; session->global.buffer = NULL; if (session->events.buffer_changed != NULL) { session->events.buffer_changed(session); } int t = (session->buffer.n > 0) ? session->buffer.n : 1; for (int i = 0; i < t; i++) { if (shortcut->function(session, &(shortcut->argument), NULL, session->buffer.n) == false) { break; } } session->buffer.n = 0; girara_list_iterator_free(iter); return TRUE; } matching_command = TRUE; } } GIRARA_LIST_FOREACH_END(session->bindings.shortcuts, girara_shortcut_t*, iter, shortcut); /* free buffer if buffer will never match a command */ if (matching_command == false) { g_string_free(session->buffer.command, TRUE); g_string_free(session->global.buffer, TRUE); session->buffer.command = NULL; session->global.buffer = NULL; session->buffer.n = 0; if (session->events.buffer_changed != NULL) { session->events.buffer_changed(session); } } } return FALSE; } bool girara_callback_view_button_press_event(GtkWidget* UNUSED(widget), GdkEventButton* button, girara_session_t* session) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(button != NULL, false); /* prepare girara event */ girara_event_t event; switch (button->type) { case GDK_BUTTON_PRESS: event.type = GIRARA_EVENT_BUTTON_PRESS; break; case GDK_2BUTTON_PRESS: event.type = GIRARA_EVENT_2BUTTON_PRESS; break; case GDK_3BUTTON_PRESS: event.type = GIRARA_EVENT_3BUTTON_PRESS; break; default: /* do not handle unknown events */ event.type = GIRARA_EVENT_OTHER; break; } event.x = button->x; event.y = button->y; const guint state = button->state & MOUSE_MASK; /* search registered mouse events */ GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event) if (mouse_event->function != NULL && button->button == mouse_event->button && state == mouse_event->mask && mouse_event->event_type == event.type && (session->modes.current_mode == mouse_event->mode || mouse_event->mode == 0) ) { mouse_event->function(session, &(mouse_event->argument), &event, session->buffer.n); girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event); return false; } bool girara_callback_view_button_release_event(GtkWidget* UNUSED(widget), GdkEventButton* button, girara_session_t* session) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(button != NULL, false); /* prepare girara event */ girara_event_t event; event.type = GIRARA_EVENT_BUTTON_RELEASE; event.x = button->x; event.y = button->y; const guint state = button->state & MOUSE_MASK; /* search registered mouse events */ GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event) if (mouse_event->function != NULL && button->button == mouse_event->button && state == mouse_event->mask && mouse_event->event_type == GIRARA_EVENT_BUTTON_RELEASE && (session->modes.current_mode == mouse_event->mode || mouse_event->mode == 0) ) { mouse_event->function(session, &(mouse_event->argument), &event, session->buffer.n); girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event); return false; } bool girara_callback_view_button_motion_notify_event(GtkWidget* UNUSED(widget), GdkEventMotion* button, girara_session_t* session) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(button != NULL, false); /* prepare girara event */ girara_event_t event; event.type = GIRARA_EVENT_MOTION_NOTIFY; event.x = button->x; event.y = button->y; const guint state = button->state & MOUSE_MASK; /* search registered mouse events */ GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event) if (mouse_event->function != NULL && state == mouse_event->mask && mouse_event->event_type == event.type && (session->modes.current_mode == mouse_event->mode || mouse_event->mode == 0) ) { mouse_event->function(session, &(mouse_event->argument), &event, session->buffer.n); girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event); return false; } bool girara_callback_view_scroll_event(GtkWidget* UNUSED(widget), GdkEventScroll* scroll, girara_session_t* session) { g_return_val_if_fail(session != NULL, false); g_return_val_if_fail(scroll != NULL, false); /* prepare girara event */ girara_event_t event; event.x = scroll->x; event.y = scroll->y; switch (scroll->direction) { case GDK_SCROLL_UP: event.type = GIRARA_EVENT_SCROLL_UP; break; case GDK_SCROLL_DOWN: event.type = GIRARA_EVENT_SCROLL_DOWN; break; case GDK_SCROLL_LEFT: event.type = GIRARA_EVENT_SCROLL_LEFT; break; case GDK_SCROLL_RIGHT: event.type = GIRARA_EVENT_SCROLL_RIGHT; break; default: return false; } const guint state = scroll->state & MOUSE_MASK; /* search registered mouse events */ /* TODO: Filter correct event */ GIRARA_LIST_FOREACH(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event) if (mouse_event->function != NULL && state == mouse_event->mask && mouse_event->event_type == event.type && (session->modes.current_mode == mouse_event->mode || mouse_event->mode == 0) ) { mouse_event->function(session, &(mouse_event->argument), &event, session->buffer.n); girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->bindings.mouse_events, girara_mouse_event_t*, iter, mouse_event); return false; } bool girara_callback_inputbar_activate(GtkEntry* entry, girara_session_t* session) { g_return_val_if_fail(session != NULL, FALSE); /* a custom handler has been installed (e.g. by girara_dialog) */ if (session->signals.inputbar_custom_activate != NULL) { bool return_value = session->signals.inputbar_custom_activate(entry, session->signals.inputbar_custom_data); /* disconnect custom handler */ session->signals.inputbar_custom_activate = NULL; session->signals.inputbar_custom_key_press_event = NULL; session->signals.inputbar_custom_data = NULL; if (session->gtk.inputbar_dialog != NULL && session->gtk.inputbar_entry != NULL) { gtk_label_set_markup(session->gtk.inputbar_dialog, ""); gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog)); if (session->global.autohide_inputbar == true) { gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar)); } gtk_entry_set_visibility(session->gtk.inputbar_entry, TRUE); girara_isc_abort(session, NULL, NULL, 0); return true; } return return_value; } gchar *input = gtk_editable_get_chars(GTK_EDITABLE(entry), 1, -1); if (input == NULL) { girara_isc_abort(session, NULL, NULL, 0); return false; } if (strlen(input) == 0) { g_free(input); girara_isc_abort(session, NULL, NULL, 0); return false; } /* append to command history */ const char* command = gtk_entry_get_text(entry); girara_input_history_append(session->command_history, command); /* parse input */ gchar** argv = NULL; gint argc = 0; if (g_shell_parse_argv(input, &argc, &argv, NULL) == FALSE) { g_free(input); return false; } gchar *cmd = argv[0]; /* special commands */ char *identifier_s = gtk_editable_get_chars(GTK_EDITABLE(entry), 0, 1); if (identifier_s == NULL) { g_free(input); g_strfreev(argv); return false; } char identifier = identifier_s[0]; g_free(identifier_s); GIRARA_LIST_FOREACH(session->bindings.special_commands, girara_special_command_t*, iter, special_command) if (special_command->identifier == identifier) { if (special_command->always != true) { special_command->function(session, input, &(special_command->argument)); } g_free(input); g_strfreev(argv); girara_isc_abort(session, NULL, NULL, 0); girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->bindings.special_commands, girara_special_command_t*, iter, special_command); /* search commands */ GIRARA_LIST_FOREACH(session->bindings.commands, girara_command_t*, iter, command) if ((g_strcmp0(cmd, command->command) == 0) || (g_strcmp0(cmd, command->abbr) == 0)) { girara_list_t* argument_list = girara_list_new(); if (argument_list == NULL) { g_free(input); g_strfreev(argv); girara_list_iterator_free(iter); return false; } girara_list_set_free_function(argument_list, g_free); for(int i = 1; i < argc; i++) { char* argument = g_strdup(argv[i]); girara_list_append(argument_list, (void*) argument); } command->function(session, argument_list); girara_list_free(argument_list); g_free(input); g_strfreev(argv); girara_isc_abort(session, NULL, NULL, 0); if (session->global.autohide_inputbar == true) { gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar)); } gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog)); girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->bindings.commands, girara_command_t*, iter, command); /* check for unknown command event handler */ if (session->events.unknown_command != NULL) { if (session->events.unknown_command(session, input) == true) { g_strfreev(argv); g_free(input); girara_isc_abort(session, NULL, NULL, 0); if (session->global.autohide_inputbar == true) { gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar)); } gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog)); return true; } } /* unhandled command */ girara_notify(session, GIRARA_ERROR, _("Not a valid command: %s"), cmd); g_strfreev(argv); girara_isc_abort(session, NULL, NULL, 0); return false; } bool girara_callback_inputbar_key_press_event(GtkWidget* entry, GdkEventKey* event, girara_session_t* session) { g_return_val_if_fail(session != NULL, false); /* a custom handler has been installed (e.g. by girara_dialog) */ bool custom_ret = false; if (session->signals.inputbar_custom_key_press_event != NULL) { custom_ret = session->signals.inputbar_custom_key_press_event(entry, event, session->signals.inputbar_custom_data); if (custom_ret == true) { girara_isc_abort(session, NULL, NULL, 0); if (session->global.autohide_inputbar == true) { gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar)); } gtk_widget_hide(GTK_WIDGET(session->gtk.inputbar_dialog)); } } guint keyval = 0; guint clean = 0; if (clean_mask(event->hardware_keycode, event->state, event->group, &clean, &keyval) == false) { return false; } if (custom_ret == false) { GIRARA_LIST_FOREACH(session->bindings.inputbar_shortcuts, girara_inputbar_shortcut_t*, iter, inputbar_shortcut) if (inputbar_shortcut->key == keyval && inputbar_shortcut->mask == clean) { if (inputbar_shortcut->function != NULL) { inputbar_shortcut->function(session, &(inputbar_shortcut->argument), NULL, 0); } girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->bindings.inputbar_shortcuts, girara_inputbar_shortcut_t*, iter, inputbar_shortcut); } if ((session->gtk.results != NULL) && (gtk_widget_get_visible(GTK_WIDGET(session->gtk.results)) == TRUE) && (keyval == GDK_KEY_space)) { gtk_widget_hide(GTK_WIDGET(session->gtk.results)); } return custom_ret; } bool girara_callback_inputbar_changed_event(GtkEditable* entry, girara_session_t* session) { g_return_val_if_fail(session != NULL, false); /* special commands */ char *identifier_s = gtk_editable_get_chars(entry, 0, 1); if (identifier_s == NULL) { return false; } char identifier = identifier_s[0]; g_free(identifier_s); GIRARA_LIST_FOREACH(session->bindings.special_commands, girara_special_command_t*, iter, special_command) if ((special_command->identifier == identifier) && (special_command->always == true)) { gchar *input = gtk_editable_get_chars(GTK_EDITABLE(entry), 1, -1); special_command->function(session, input, &(special_command->argument)); g_free(input); girara_list_iterator_free(iter); return true; } GIRARA_LIST_FOREACH_END(session->bindings.special_commands, girara_special_command_t*, iter, special_command); return false; } girara-0.1.9/input-history.c0000644000175000001440000002072512242417112014642 0ustar mockusers/* See LICENSE file for license and copyright information */ #include "input-history.h" #include "datastructures.h" G_DEFINE_TYPE(GiraraInputHistory, girara_input_history, G_TYPE_OBJECT) /** * Private data of the settings manager */ typedef struct ih_private_s { girara_list_t* history; /**< List of stored inputs */ bool reset; /**< Show history starting from the most recent command */ size_t current; size_t current_match; GiraraInputHistoryIO* io; char* command_line; } ih_private_t; #define GIRARA_INPUT_HISTORY_GET_PRIVATE(obj) \ (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GIRARA_TYPE_INPUT_HISTORY, \ ih_private_t)) /* Methods */ static void ih_finalize(GObject* object); static void ih_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec); static void ih_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec); static void ih_append(GiraraInputHistory* history, const char* input); static girara_list_t* ih_list(GiraraInputHistory* history); static const char* ih_next(GiraraInputHistory* history, const char* current_input); static const char* ih_previous(GiraraInputHistory* history, const char* current_input); static void ih_reset(GiraraInputHistory* history); /* Properties */ enum { PROP_0, PROP_IO }; /* Class init */ static void girara_input_history_class_init(GiraraInputHistoryClass* class) { /* add private members */ g_type_class_add_private(class, sizeof(ih_private_t)); /* overwrite methods */ GObjectClass* object_class = G_OBJECT_CLASS(class); object_class->finalize = ih_finalize; object_class->set_property = ih_set_property; object_class->get_property = ih_get_property; class->append = ih_append; class->list = ih_list; class->next = ih_next; class->previous = ih_previous; class->reset = ih_reset; /* properties */ g_object_class_install_property(object_class, PROP_IO, g_param_spec_object("io", "history reader/writer", "GiraraInputHistoryIO object used to read and write history", girara_input_history_io_get_type(), G_PARAM_WRITABLE | G_PARAM_READABLE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS)); } /* Object init */ static void girara_input_history_init(GiraraInputHistory* history) { ih_private_t* priv = GIRARA_INPUT_HISTORY_GET_PRIVATE(history); priv->history = girara_list_new2((girara_free_function_t) g_free); priv->reset = true; priv->io = NULL; } /* GObject finalize */ static void ih_finalize(GObject* object) { ih_private_t* priv = GIRARA_INPUT_HISTORY_GET_PRIVATE(object); girara_list_free(priv->history); g_free(priv->command_line); if (priv->io != NULL) { g_object_unref(priv->io); } G_OBJECT_CLASS(girara_input_history_parent_class)->finalize(object); } /* GObject set_property */ static void ih_set_property(GObject* object, guint prop_id, const GValue* value, GParamSpec* pspec) { ih_private_t* priv = GIRARA_INPUT_HISTORY_GET_PRIVATE(object); switch (prop_id) { case PROP_IO: { if (priv->io != NULL) { g_object_unref(priv->io); } gpointer* tmp = g_value_dup_object(value); if (tmp != NULL) { priv->io = GIRARA_INPUT_HISTORY_IO(tmp); } else { priv->io = NULL; } girara_input_history_reset(GIRARA_INPUT_HISTORY(object)); break; } default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); } } /* GObject get_property */ static void ih_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec) { ih_private_t* priv = GIRARA_INPUT_HISTORY_GET_PRIVATE(object); switch (prop_id) { case PROP_IO: g_value_set_object(value, priv->io); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(object, prop_id, pspec); } } /* Object new */ GiraraInputHistory* girara_input_history_new(GiraraInputHistoryIO* io) { return GIRARA_INPUT_HISTORY(g_object_new(GIRARA_TYPE_INPUT_HISTORY, "io", io, NULL)); } /* Method implementions */ static void ih_append(GiraraInputHistory* history, const char* input) { if (input == NULL) { return; } girara_list_t* list = girara_input_history_list(history); if (list == NULL) { return; } void* data = NULL; while ((data = girara_list_find(list, (girara_compare_function_t) g_strcmp0, data)) != NULL) { girara_list_remove(list, data); } girara_list_append(list, g_strdup(input)); ih_private_t* priv = GIRARA_INPUT_HISTORY_GET_PRIVATE(history); if (priv->io != NULL) { girara_input_history_io_append(priv->io, input); } /* begin from the last command when navigating through history */ girara_input_history_reset(history); } static girara_list_t* ih_list(GiraraInputHistory* history) { ih_private_t* priv = GIRARA_INPUT_HISTORY_GET_PRIVATE(history); return priv->history; } static const char* find_next(GiraraInputHistory* history, const char* current_input, bool next) { ih_private_t* priv = GIRARA_INPUT_HISTORY_GET_PRIVATE(history); girara_list_t* list = girara_input_history_list(history); if (list == NULL) { return NULL; } size_t length = girara_list_size(list); if (length == 0) { return NULL; } if (priv->reset == true) { priv->current = length; priv->current_match = priv->current; } /* Before moving into the history, save the current command-line. */ if (priv->current_match == length) { g_free(priv->command_line); priv->command_line = g_strdup(current_input); } size_t i = 0; const char* command = NULL; while (i < length) { if (priv->reset == true || next == false) { if (priv->current < 1) { priv->reset = false; priv->current = priv->current_match; return NULL; } else { --priv->current; } } else if (next == true) { if (priv->current + 1 >= length) { /* At the bottom of the history, return what the command-line was. */ priv->current_match = length; priv->current = priv->current_match; return priv->command_line; } else { ++priv->current; } } else { return NULL; } command = girara_list_nth(list, priv->current); if (command == NULL) { return NULL; } /* Only match history items starting with what was on the command-line. */ if (g_str_has_prefix(command, priv->command_line)) { priv->reset = false; priv->current_match = priv->current; break; } ++i; } if (i == length) { return NULL; } return command; } static const char* ih_next(GiraraInputHistory* history, const char* current_input) { return find_next(history, current_input, true); } static const char* ih_previous(GiraraInputHistory* history, const char* current_input) { return find_next(history, current_input, false); } static void ih_reset(GiraraInputHistory* history) { ih_private_t* priv = GIRARA_INPUT_HISTORY_GET_PRIVATE(history); priv->reset = true; if (priv->io != NULL) { girara_list_t* list = girara_input_history_list(history); if (list == NULL) { return; } girara_list_clear(list); girara_list_t* newlist = girara_input_history_io_read(priv->io); if (newlist != NULL) { GIRARA_LIST_FOREACH(newlist, const char*, iter, data) girara_list_append(list, g_strdup(data)); GIRARA_LIST_FOREACH_END(newlist, const char*, iter, data); girara_list_free(newlist); } } } /* Wrapper functions for the members */ void girara_input_history_append(GiraraInputHistory* history, const char* input) { g_return_if_fail(GIRARA_IS_INPUT_HISTORY(history) == true); GIRARA_INPUT_HISTORY_GET_CLASS(history)->append(history, input); } girara_list_t* girara_input_history_list(GiraraInputHistory* history) { g_return_val_if_fail(GIRARA_IS_INPUT_HISTORY(history) == true, NULL); return GIRARA_INPUT_HISTORY_GET_CLASS(history)->list(history); } const char* girara_input_history_next(GiraraInputHistory* history, const char* current_input) { g_return_val_if_fail(GIRARA_IS_INPUT_HISTORY(history) == true, NULL); return GIRARA_INPUT_HISTORY_GET_CLASS(history)->next(history, current_input); } const char* girara_input_history_previous(GiraraInputHistory* history, const char* current_input) { g_return_val_if_fail(GIRARA_IS_INPUT_HISTORY(history) == true, NULL); return GIRARA_INPUT_HISTORY_GET_CLASS(history)->previous(history, current_input); } void girara_input_history_reset(GiraraInputHistory* history) { g_return_if_fail(GIRARA_IS_INPUT_HISTORY(history) == true); GIRARA_INPUT_HISTORY_GET_CLASS(history)->reset(history); } girara-0.1.9/completion.c0000644000175000001440000004772012242417112014161 0ustar mockusers/* See LICENSE file for license and copyright information */ #include #include #include #include "completion.h" #include "internal.h" #include "session.h" #include "settings.h" #include "datastructures.h" #include "utils.h" #if GTK_MAJOR_VERSION == 2 #include "gtk2-compat.h" #endif static GtkEventBox* girara_completion_row_create(girara_session_t*, const char*, const char*, bool); static void girara_completion_row_set_color(girara_session_t*, GtkEventBox*, int); /* completion */ struct girara_internal_completion_entry_s { bool group; /**< The entry is a group */ char* value; /**< Name of the entry */ GtkEventBox* widget; /**< Eventbox widget */ }; /** * Structure of a completion element */ struct girara_completion_element_s { char *value; /**> Name of the completion element */ char *description; /**> Description of the completion element */ }; /** * Structure of a completion group */ struct girara_completion_group_s { char *value; /**> Name of the completion element */ girara_list_t *elements; /**> Elements of the completion group */ }; /** * Structure of a completion object */ struct girara_completion_s { girara_list_t *groups; /**> Containing completion groups */ }; typedef struct girara_internal_completion_entry_s girara_internal_completion_entry_t; static void completion_element_free(girara_completion_element_t* element) { if (element == NULL) { return; } /* free element */ g_free(element->value); g_free(element->description); g_slice_free(girara_completion_element_t, element); } girara_completion_t* girara_completion_init() { girara_completion_t *completion = g_slice_new(girara_completion_t); completion->groups = girara_list_new2( (girara_free_function_t) girara_completion_group_free); return completion; } girara_completion_group_t* girara_completion_group_create(girara_session_t* UNUSED(session), const char* name) { girara_completion_group_t* group = g_slice_new(girara_completion_group_t); group->value = name ? g_strdup(name) : NULL; group->elements = girara_list_new2( (girara_free_function_t) completion_element_free); if (group->elements == NULL) { g_slice_free(girara_completion_group_t, group); return NULL; } return group; } void girara_completion_add_group(girara_completion_t* completion, girara_completion_group_t* group) { g_return_if_fail(completion != NULL); g_return_if_fail(group != NULL); girara_list_append(completion->groups, group); } void girara_completion_group_free(girara_completion_group_t* group) { if (group == NULL) { return; } g_free(group->value); girara_list_free(group->elements); g_slice_free(girara_completion_group_t, group); } void girara_completion_free(girara_completion_t* completion) { g_return_if_fail(completion != NULL); girara_list_free(completion->groups); /* free completion */ g_slice_free(girara_completion_t, completion); } void girara_completion_group_add_element(girara_completion_group_t* group, const char* name, const char* description) { g_return_if_fail(group != NULL); g_return_if_fail(name != NULL); girara_completion_element_t* new_element = g_slice_new(girara_completion_element_t); new_element->value = g_strdup(name); new_element->description = description ? g_strdup(description) : NULL; girara_list_append(group->elements, new_element); } bool girara_isc_completion(girara_session_t* session, girara_argument_t* argument, girara_event_t* UNUSED(event), unsigned int UNUSED(t)) { g_return_val_if_fail(session != NULL, false); /* get current text */ gchar *input = gtk_editable_get_chars(GTK_EDITABLE(session->gtk.inputbar_entry), 0, -1); if (input == NULL) { return false; } const size_t input_length = strlen(input); if (input_length == 0 || input[0] != ':') { g_free(input); return false; } gchar** elements = NULL; gint n_parameter = 0; if (input_length > 1) { if (g_shell_parse_argv(input + 1, &n_parameter, &elements, NULL) == FALSE) { g_free(input); return FALSE; } } else { elements = g_malloc0(2 * sizeof(char*)); elements[0] = g_strdup(""); } if (n_parameter == 1 && input[input_length-1] == ' ') { n_parameter += 1; } g_free(input); /* get current values */ gchar *current_command = (elements[0] != NULL && elements[0][0] != '\0') ? g_strdup(elements[0]) : NULL; gchar *current_parameter = (elements[0] != NULL && elements[1] != NULL) ? g_strdup(elements[1]) : NULL; size_t current_command_length = current_command ? strlen(current_command) : 0; static GList* entries = NULL; static GList* entries_current = NULL; static char *previous_command = NULL; static char *previous_parameter = NULL; static bool command_mode = true; static size_t previous_length = 0; /* delete old list iff * the completion should be hidden * the current command differs from the previous one * the current parameter differs from the previous one * no current command is given */ if ( (argument->n == GIRARA_HIDE) || (current_parameter && previous_parameter && strcmp(current_parameter, previous_parameter)) || (current_command && previous_command && strcmp(current_command, previous_command)) || input_length != previous_length ) { if (session->gtk.results != NULL) { /* destroy elements */ for (GList* element = entries; element; element = g_list_next(element)) { girara_internal_completion_entry_t* entry = (girara_internal_completion_entry_t*) element->data; if (entry != NULL) { gtk_widget_destroy(GTK_WIDGET(entry->widget)); g_free(entry->value); g_slice_free(girara_internal_completion_entry_t, entry); } } g_list_free(entries); entries = NULL; entries_current = NULL; /* delete row box */ gtk_widget_destroy(GTK_WIDGET(session->gtk.results)); session->gtk.results = NULL; } command_mode = true; if (argument->n == GIRARA_HIDE) { g_free(previous_command); previous_command = NULL; g_free(previous_parameter); previous_parameter = NULL; g_strfreev(elements); g_free(current_command); g_free(current_parameter); return false; } } /* create new list iff * there is no current list */ if (session->gtk.results == NULL) { #if GTK_MAJOR_VERSION == 2 session->gtk.results = GTK_BOX(gtk_vbox_new(FALSE, 0)); #else session->gtk.results = GTK_BOX(gtk_box_new(GTK_ORIENTATION_VERTICAL, 0)); #endif if (session->gtk.results == NULL) { g_free(current_command); g_free(current_parameter); g_strfreev(elements); return false; } if (n_parameter <= 1) { /* based on commands */ command_mode = true; /* create command rows */ GIRARA_LIST_FOREACH(session->bindings.commands, girara_command_t*, iter, command) if (current_command == NULL || (command->command != NULL && !strncmp(current_command, command->command, current_command_length)) || (command->abbr != NULL && !strncmp(current_command, command->abbr, current_command_length)) ) { /* create entry */ girara_internal_completion_entry_t* entry = g_slice_new(girara_internal_completion_entry_t); entry->group = FALSE; entry->value = g_strdup(command->command); entry->widget = girara_completion_row_create(session, command->command, command->description, FALSE); entries = g_list_append(entries, entry); /* show entry row */ gtk_box_pack_start(session->gtk.results, GTK_WIDGET(entry->widget), FALSE, FALSE, 0); } GIRARA_LIST_FOREACH_END(session->bindings.commands, girara_command_t*, iter, command); } /* based on parameters */ if (n_parameter > 1 || g_list_length(entries) == 1) { /* if only one command exists try to run parameter completion */ if (g_list_length(entries) == 1) { girara_internal_completion_entry_t* entry = g_list_first(entries)->data; /* unset command mode */ command_mode = false; current_command = entry->value; current_command_length = strlen(current_command); /* clear list */ gtk_widget_destroy(GTK_WIDGET(entry->widget)); entries = g_list_remove(entries, g_list_first(entries)->data); g_slice_free(girara_internal_completion_entry_t, entry); } /* search matching command */ girara_command_t* command = NULL; GIRARA_LIST_FOREACH(session->bindings.commands, girara_command_t*, iter, command_it) if ( (current_command != NULL && command_it->command != NULL && !strncmp(current_command, command_it->command, current_command_length)) || (current_command != NULL && command_it->abbr != NULL && !strncmp(current_command, command_it->abbr, current_command_length)) ) { g_free(previous_command); previous_command = g_strdup(command_it->command); command = command_it; break; } GIRARA_LIST_FOREACH_END(session->bindings.commands, girara_command_t*, iter, command_it); if (command == NULL) { g_free(current_command); g_free(current_parameter); g_strfreev(elements); return false; } if (command->completion == NULL) { girara_internal_completion_entry_t* entry = g_slice_new(girara_internal_completion_entry_t); entry->group = FALSE; entry->value = g_strdup(command->command); entry->widget = girara_completion_row_create(session, command->command, command->description, FALSE); entries = g_list_append(entries, entry); gtk_box_pack_start(session->gtk.results, GTK_WIDGET(entry->widget), FALSE, FALSE, 0); command_mode = true; } else { /* generate completion result * XXX: the last argument should only be current_paramater ... but * therefore the completion functions would need to handle NULL correctly * (see cc_open in zathura). */ girara_completion_t *result = command->completion(session, current_parameter ? current_parameter : ""); if (result == NULL || result->groups == NULL) { g_free(current_command); g_free(current_parameter); g_strfreev(elements); return false; } GIRARA_LIST_FOREACH(result->groups, girara_completion_group_t*, iter, group) /* create group entry */ if (group->value != NULL) { girara_internal_completion_entry_t* entry = g_slice_new(girara_internal_completion_entry_t); entry->group = TRUE; entry->value = g_strdup(group->value); entry->widget = girara_completion_row_create(session, group->value, NULL, TRUE); entries = g_list_append(entries, entry); gtk_box_pack_start(session->gtk.results, GTK_WIDGET(entry->widget), FALSE, FALSE, 0); } GIRARA_LIST_FOREACH(group->elements, girara_completion_element_t*, iter2, element) girara_internal_completion_entry_t* entry = g_slice_new(girara_internal_completion_entry_t); entry->group = FALSE; entry->value = g_strdup(element->value); entry->widget = girara_completion_row_create(session, element->value, element->description, FALSE); entries = g_list_append(entries, entry); gtk_box_pack_start(session->gtk.results, GTK_WIDGET(entry->widget), FALSE, FALSE, 0); GIRARA_LIST_FOREACH_END(group->elements, girara_completion_element_t*, iter2, element); GIRARA_LIST_FOREACH_END(result->groups, girara_completion_group_t*, iter, group); girara_completion_free(result); command_mode = false; } } if (entries != NULL) { entries_current = (argument->n == GIRARA_NEXT) ? g_list_last(entries) : entries; gtk_box_pack_start(session->private_data->gtk.bottom_box, GTK_WIDGET(session->gtk.results), FALSE, FALSE, 0); gtk_widget_show(GTK_WIDGET(session->gtk.results)); } } /* update entries */ unsigned int n_elements = g_list_length(entries); if (entries != NULL && n_elements > 0) { if (n_elements > 1) { girara_completion_row_set_color(session, ((girara_internal_completion_entry_t *) entries_current->data)->widget, GIRARA_NORMAL); bool next_group = FALSE; for (unsigned int i = 0; i < n_elements; i++) { if (argument->n == GIRARA_NEXT || argument->n == GIRARA_NEXT_GROUP) { GList* entry = g_list_next(entries_current); if (entry == NULL) { entry = g_list_first(entries); } entries_current = entry; } else if (argument->n == GIRARA_PREVIOUS || argument->n == GIRARA_PREVIOUS_GROUP) { GList* entry = g_list_previous(entries_current); if (entry == NULL) { entry = g_list_last(entries); } entries_current = entry; } if (((girara_internal_completion_entry_t*) entries_current->data)->group) { if (command_mode == false && (argument->n == GIRARA_NEXT_GROUP || argument->n == GIRARA_PREVIOUS_GROUP)) { next_group = TRUE; } continue; } else { if (command_mode == false && (next_group == 0) && (argument->n == GIRARA_NEXT_GROUP || argument->n == GIRARA_PREVIOUS_GROUP)) { continue; } break; } } girara_completion_row_set_color(session, ((girara_internal_completion_entry_t *) entries_current->data)->widget, GIRARA_HIGHLIGHT); /* hide other items */ unsigned int n_completion_items = 15; girara_setting_get(session, "n-completion-items", &n_completion_items); unsigned int uh = ceil( n_completion_items / 2); unsigned int lh = floor(n_completion_items / 2); unsigned int current_item = g_list_position(entries, entries_current); GList* tmpentry = entries; for (unsigned int i = 0; i < n_elements; i++) { if ( (i >= (current_item - lh) && (i <= current_item + uh)) || (i < n_completion_items && current_item < lh) || (i >= (n_elements - n_completion_items) && (current_item >= (n_elements - uh))) ) { gtk_widget_show(GTK_WIDGET(((girara_internal_completion_entry_t*) tmpentry->data)->widget)); } else { gtk_widget_hide(GTK_WIDGET(((girara_internal_completion_entry_t*) tmpentry->data)->widget)); } tmpentry = g_list_next(tmpentry); } } else { gtk_widget_hide(GTK_WIDGET(((girara_internal_completion_entry_t*) (g_list_nth(entries, 0))->data)->widget)); } /* update text */ char* temp; char* escaped_value = girara_escape_string(((girara_internal_completion_entry_t *) entries_current->data)->value); if (command_mode == true) { char* space = (n_elements == 1) ? " " : ""; temp = g_strconcat(":", escaped_value, space, NULL); } else { temp = g_strconcat(":", previous_command, " ", escaped_value, NULL); } gtk_entry_set_text(session->gtk.inputbar_entry, temp); gtk_editable_set_position(GTK_EDITABLE(session->gtk.inputbar_entry), -1); g_free(escaped_value); /* update previous */ g_free(previous_command); g_free(previous_parameter); previous_command = g_strdup((command_mode) ? ((girara_internal_completion_entry_t*) entries_current->data)->value : current_command); previous_parameter = g_strdup((command_mode) ? current_parameter : ((girara_internal_completion_entry_t*) entries_current->data)->value); previous_length = strlen(temp); g_free(temp); } g_free(current_command); g_free(current_parameter); g_strfreev(elements); return false; } static GtkEventBox* girara_completion_row_create(girara_session_t* session, const char* command, const char* description, bool group) { #if GTK_MAJOR_VERSION == 2 GtkBox *col = GTK_BOX(gtk_hbox_new(FALSE, 0)); #else GtkBox *col = GTK_BOX(gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0)); #endif GtkEventBox *row = GTK_EVENT_BOX(gtk_event_box_new()); GtkLabel *show_command = GTK_LABEL(gtk_label_new(NULL)); GtkLabel *show_description = GTK_LABEL(gtk_label_new(NULL)); gtk_misc_set_alignment(GTK_MISC(show_command), 0.0, 0.0); gtk_misc_set_alignment(GTK_MISC(show_description), 1.0, 0.0); if (group == true) { gtk_misc_set_padding(GTK_MISC(show_command), 2, 4); gtk_misc_set_padding(GTK_MISC(show_description), 2, 4); } else { gtk_misc_set_padding(GTK_MISC(show_command), 1, 1); gtk_misc_set_padding(GTK_MISC(show_description), 1, 1); } gtk_label_set_use_markup(show_command, TRUE); gtk_label_set_use_markup(show_description, TRUE); gtk_label_set_ellipsize(show_command, PANGO_ELLIPSIZE_END); gtk_label_set_ellipsize(show_description, PANGO_ELLIPSIZE_END); gchar* c = g_markup_printf_escaped(FORMAT_COMMAND, command ? command : ""); gchar* d = g_markup_printf_escaped(FORMAT_DESCRIPTION, description ? description : ""); gtk_label_set_markup(show_command, c); gtk_label_set_markup(show_description, d); g_free(c); g_free(d); if (group == true) { gtk_widget_override_color(GTK_WIDGET(show_command), GTK_STATE_NORMAL, &(session->style.completion_group_foreground)); gtk_widget_override_color(GTK_WIDGET(show_description), GTK_STATE_NORMAL, &(session->style.completion_group_foreground)); gtk_widget_override_background_color(GTK_WIDGET(row), GTK_STATE_NORMAL, &(session->style.completion_group_background)); } else { gtk_widget_override_color(GTK_WIDGET(show_command), GTK_STATE_NORMAL, &(session->style.completion_foreground)); gtk_widget_override_color(GTK_WIDGET(show_description), GTK_STATE_NORMAL, &(session->style.completion_foreground)); gtk_widget_override_background_color(GTK_WIDGET(row), GTK_STATE_NORMAL, &(session->style.completion_background)); } gtk_widget_override_font(GTK_WIDGET(show_command), session->style.font); gtk_widget_override_font(GTK_WIDGET(show_description), session->style.font); gtk_box_pack_start(GTK_BOX(col), GTK_WIDGET(show_command), TRUE, TRUE, 2); gtk_box_pack_start(GTK_BOX(col), GTK_WIDGET(show_description), TRUE, TRUE, 2); gtk_container_add(GTK_CONTAINER(row), GTK_WIDGET(col)); gtk_widget_show_all(GTK_WIDGET(row)); return row; } static void girara_completion_row_set_color(girara_session_t* session, GtkEventBox* row, int mode) { g_return_if_fail(session != NULL); g_return_if_fail(row != NULL); GtkBox* col = GTK_BOX(gtk_bin_get_child(GTK_BIN(row))); GList* items = gtk_container_get_children(GTK_CONTAINER(col)); GtkWidget* cmd = GTK_WIDGET(g_list_nth_data(items, 0)); GtkWidget* desc = GTK_WIDGET(g_list_nth_data(items, 1)); if (mode == GIRARA_HIGHLIGHT) { gtk_widget_override_color(cmd, GTK_STATE_NORMAL, &(session->style.completion_highlight_foreground)); gtk_widget_override_color(desc, GTK_STATE_NORMAL, &(session->style.completion_highlight_foreground)); gtk_widget_override_background_color(cmd, GTK_STATE_NORMAL, &(session->style.completion_highlight_background)); gtk_widget_override_background_color(desc, GTK_STATE_NORMAL, &(session->style.completion_highlight_background)); gtk_widget_override_background_color(GTK_WIDGET(row), GTK_STATE_NORMAL, &(session->style.completion_highlight_background)); } else { gtk_widget_override_color(cmd, GTK_STATE_NORMAL, &(session->style.completion_foreground)); gtk_widget_override_color(desc, GTK_STATE_NORMAL, &(session->style.completion_foreground)); gtk_widget_override_background_color(cmd, GTK_STATE_NORMAL, &(session->style.completion_background)); gtk_widget_override_background_color(desc, GTK_STATE_NORMAL, &(session->style.completion_background)); gtk_widget_override_background_color(GTK_WIDGET(row), GTK_STATE_NORMAL, &(session->style.completion_background)); } g_list_free(items); } girara-0.1.9/commands.h0000644000175000001440000000246412242417112013612 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_COMMANDS_H #define GIRARA_COMMANDS_H #include "types.h" /** * Adds an inputbar command * * @param session The used girara session * @param command The name of the command * @param abbreviation The abbreviation of the command * @param function Executed function * @param completion Completion function * @param description Description of the command * @return TRUE No error occured * @return FALSE An error occured */ 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); /** * Adds a special command * * @param session The used girara session * @param identifier Char identifier * @param function Executed function * @param always If the function should executed on every change of the input * (e.g.: incremental search) * @param argument_n Argument identifier * @param argument_data Argument data * @return TRUE No error occured * @return FALSE An error occured */ 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); #endif girara-0.1.9/datastructures.h0000644000175000001440000002153512242417112015066 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_DATASTRUCTURES_H #define GIRARA_DATASTRUCTURES_H #include #include #include #include "types.h" /** * Create a new list. * * @return The girara list object or NULL if an error occured */ girara_list_t* girara_list_new(void); /** * Create a new list. * * @param gfree Pointer to the free function * @return The girara list object or NULL if an error occured. */ girara_list_t* girara_list_new2(girara_free_function_t gfree); /** * Create a new (sorted) list. * * @param cmp Pointer to the compare function. * @return The girara list object or NULL if an error occured. */ girara_list_t* girara_sorted_list_new(girara_compare_function_t cmp); /** * Create a new (sorted) list. * * @param cmp Pointer to the compare function. * @param gfree Pointer to the free function * @return The girara list object or NULL if an error occured. */ girara_list_t* girara_sorted_list_new2(girara_compare_function_t cmp, girara_free_function_t gfree); /** * Set the function which should be called if the stored data should be freed. * * @param list The girara list object * @param gfree Pointer to the free function */ void girara_list_set_free_function(girara_list_t* list, girara_free_function_t gfree); /** * Remove all elements from a list. * * @param list The girara list object */ void girara_list_clear(girara_list_t* list); /** * Destroy list. * * @param list The girara list object */ void girara_list_free(girara_list_t* list); /** * Append an element to the list. * * @param list The girara list object * @param data The element */ void girara_list_append(girara_list_t* list, void* data); /** * Prepend an element to the list. * * @param list The girara list object * @param data The element */ void girara_list_prepend(girara_list_t* list, void* data); /** * Remove an element of the list * * @param list The girara list object * @param data The element */ void girara_list_remove(girara_list_t* list, void* data); /** * Returns nth entry * * @param list The girara list object * @param n Index of the entry * @return The nth element or NULL if an error occured */ void* girara_list_nth(girara_list_t* list, size_t n); /** * Checks if the list contains the given element * * @param list The girara list object * @param data The element * @return true if the list contains the element */ bool girara_list_contains(girara_list_t* list, void* data); /** * Get size of the list. * * @param list The girara list object * @return The size of the list */ size_t girara_list_size(girara_list_t* list); /** * Returns the position of the element in the list * * @param list The girara list object * @param data The element * @return The position or -1 if the data is not found */ ssize_t girara_list_position(girara_list_t* list, void* data); /** * Sort a list * * @param list The list to sort * @param compare compare function */ void girara_list_sort(girara_list_t* list, girara_compare_function_t compare); /** * Find an element * * @param list The list * @param compare compare function * @param data data passed as the second argument to the compare function * @return the element if found or NULL */ void* girara_list_find(girara_list_t* list, girara_compare_function_t compare, const void* data); /** * Create an iterator pointing at the start of list. * * @param list The girara list object * @return The list iterator or NULL if an error occured */ girara_list_iterator_t* girara_list_iterator(girara_list_t* list); /** * Create an iterator pointing to the same element as iter. * * @param iter The girara list iterator to be copied * @return The list iterator or NULL if an error occured */ girara_list_iterator_t* girara_list_iterator_copy(girara_list_iterator_t* iter); /** * Move iterator to next element. * * @param iter The list iterator * @return The moved iterator or NULL if an error occured */ girara_list_iterator_t* girara_list_iterator_next(girara_list_iterator_t* iter); /** * Check if iterator has next element. * * @param iter The list iterator * @return true if iterator has a next element, false otherwise */ bool girara_list_iterator_has_next(girara_list_iterator_t* iter); /** * Move iterator to previous element. * * @param iter The list iterator * @return The moved iterator or NULL if an error occured */ girara_list_iterator_t* girara_list_iterator_previous(girara_list_iterator_t* iter); /** * Check if iterator has previous element. * * @param iter The list iterator * @return true if iterator has a previous element, false otherwise */ bool girara_list_iterator_has_previous(girara_list_iterator_t* iter); /** * Remove element pointed by the iterator, and updates the iterator * to the next element * * @param iter The list iterator */ void girara_list_iterator_remove(girara_list_iterator_t* iter); /** * Check if iterator is valid * * @param iter The list iterator * @return true if iterator is valid, false otherwise */ bool girara_list_iterator_is_valid(girara_list_iterator_t* iter); /** * Get data from the element pointed to by the iterator. * * @param iter The list iterator * @return The data of the current element */ void* girara_list_iterator_data(girara_list_iterator_t* iter); /** * Set data from the element pointed to by the iterator. * * @param iter The list iterator * @param data Sets the list iterator to a specific element */ void girara_list_iterator_set(girara_list_iterator_t* iter, void *data); /** * Destroy the iterator. * * @param iter The list iterator */ void girara_list_iterator_free(girara_list_iterator_t* iter); /** * Call function for each element in the list. * * @param list The list * @param callback The function to call. * @param data Passed to the callback as second argument. */ void girara_list_foreach(girara_list_t* list, girara_list_callback_t callback, void* data); #define GIRARA_LIST_FOREACH(list, type, iter, data) \ do { \ girara_list_iterator_t* iter = girara_list_iterator(list); \ while (girara_list_iterator_is_valid(iter)) { \ type data = (type)girara_list_iterator_data(iter); #define GIRARA_LIST_FOREACH_END(list, type, iter, data) \ girara_list_iterator_next(iter); \ } \ girara_list_iterator_free(iter); \ } while(0) /** * Merge a list into another one. Both lists need to have the same free * function. If other has a source free function set it will be set to NULL as * the elements then belong to list. * @param list the target list * @param other the source list * @returns list with the elements from other. */ girara_list_t* girara_list_merge(girara_list_t* list, girara_list_t* other); /** * Create a new node. * * @param data Data of the new node * @return A girara node object or NULL if an error occured */ girara_tree_node_t* girara_node_new(void* data); /** * Set the function which should be called if the stored data should be freed. * * @param node The girara node object * @param gfree Pointer to the free function */ void girara_node_set_free_function(girara_tree_node_t* node, girara_free_function_t gfree); /** * Free a node. This will remove the node from its' parent and will destroy all * its' children. * * @param node The girara node object */ void girara_node_free(girara_tree_node_t* node); /** * Append a node to another node. * * @param parent The parent node * @param child The child node */ void girara_node_append(girara_tree_node_t* parent, girara_tree_node_t* child); /** * Append data as new node to another node. * * @param parent The parent node * @param data The data of the node * @return The node object or NULL if an error occured */ girara_tree_node_t* girara_node_append_data(girara_tree_node_t* parent, void* data); /** * Get parent node. * * @param node The girara node object * @return The parent node or NULL if an error occured or no parent exists */ girara_tree_node_t* girara_node_get_parent(girara_tree_node_t* node); /** * Get root node. * * @param node The girara node object * @return The root node or NULL if an error occured */ girara_tree_node_t* girara_node_get_root(girara_tree_node_t* node); /** * Get list of children. * * @param node The girara node object * @return List object containing all child nodes or NULL if an error occured */ girara_list_t* girara_node_get_children(girara_tree_node_t* node); /** * Get number of children. * * @param node The girara node object * @return The number of child nodes */ size_t girara_node_get_num_children(girara_tree_node_t* node); /** * Get data. * * @param node The girara node object * @return The data of the node */ void* girara_node_get_data(girara_tree_node_t* node); /** * Set data. * * @param node The girara node object * @param data The new data of the object */ void girara_node_set_data(girara_tree_node_t* node, void* data); #endif girara-0.1.9/macros.h0000644000175000001440000000206512242417112013272 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_MACROS_H #define GIRARA_MACROS_H #ifndef GIRARA_PRINTF # if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ > 4) || defined(__clang__) # define GIRARA_PRINTF(format_idx, arg_idx) \ __attribute__((__format__ (__printf__, format_idx, arg_idx))) # else # define GIRARA_PRINTF(format_idx, arg_idx) # endif #endif #ifndef GIRARA_UNUSED # if defined(__GNUC__) || defined(__clang__) # define GIRARA_UNUSED(x) UNUSED_ ## x __attribute__((unused)) # elif defined(__LCLINT__) # define GIRARA_UNUSED(x) /*@unused@*/ x # else # define GIRARA_UNUSED(x) x # endif #endif #ifndef GIRARA_HIDDEN # if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) # define GIRARA_HIDDEN __attribute__((visibility("hidden"))) # elif defined(__SUNPRO_C) # define GIRARA_HIDDEN __hidden # else # define GIRARA_HIDDEN # endif #endif #ifndef GIRARA_DEPRECATED # if defined(__GNUC__) # define GIRARA_DEPRECATED(x) x __attribute__((deprecated)) # else # define GIRARA_DEPRECATED(x) x # endif #endif #endif girara-0.1.9/tests/0000755000175000001440000000000012242417112012774 5ustar mockusersgirara-0.1.9/tests/xdg_test_helper.c0000644000175000001440000000057312242417112016325 0ustar mockusers/* See LICENSE file for license and copyright information */ #include #include #include int main(int argc, char** argv) { if (argc != 2) { return -1; } if (strlen(argv[1]) != 1) { return -2; } const char* tmp = girara_get_xdg_path(argv[1][0] - '0'); if (tmp == NULL) { return -3; } printf("%s", tmp); return 0; } girara-0.1.9/tests/tests.c0000644000175000001440000000310512242417112014301 0ustar mockusers/* See LICENSE file for license and copyright information */ #include #include #include Suite* suite_utils(); Suite* suite_datastructures(); Suite* suite_settings(); Suite* suite_session(); Suite* suite_config(); void setup(void) { gtk_init(NULL, NULL); } int main() { Suite* suite = NULL; SRunner* suite_runner = NULL; int number_failed = 0; /* test utils */ suite = suite_utils(); suite_runner = srunner_create(suite); srunner_run_all(suite_runner, CK_NORMAL); number_failed += srunner_ntests_failed(suite_runner); srunner_free(suite_runner); /* test datastructures */ suite = suite_datastructures(); suite_runner = srunner_create(suite); srunner_run_all(suite_runner, CK_NORMAL); number_failed += srunner_ntests_failed(suite_runner); srunner_free(suite_runner); /* test settings */ suite = suite_settings(); suite_runner = srunner_create(suite); srunner_run_all(suite_runner, CK_NORMAL); number_failed += srunner_ntests_failed(suite_runner); srunner_free(suite_runner); /* test config */ suite = suite_config(); suite_runner = srunner_create(suite); srunner_run_all(suite_runner, CK_NORMAL); number_failed += srunner_ntests_failed(suite_runner); srunner_free(suite_runner); /* test session */ suite = suite_session(); suite_runner = srunner_create(suite); srunner_run_all(suite_runner, CK_NORMAL); number_failed += srunner_ntests_failed(suite_runner); srunner_free(suite_runner); return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE; } girara-0.1.9/tests/test_config.c0000644000175000001440000000412512242417112015446 0ustar mockusers/* See LICENSE file for license and copyright information */ #include #include #include #include #include "../session.h" #include "../settings.h" #include "../config.h" START_TEST(test_config_parse) { girara_session_t* session = girara_session_create(); fail_unless(session != NULL, "Failed to create girara session.", NULL); int default_val = 1; fail_unless(girara_setting_add(session, "test1", "default-string", STRING, false, NULL, NULL, NULL), "Failed to add setting 'test1'", NULL); fail_unless(girara_setting_add(session, "test2", &default_val, INT, false, NULL, NULL, NULL), "Failed to add setting 'test2'", NULL); char* filename = NULL; int fd = g_file_open_tmp(NULL, &filename, NULL); fail_unless(fd != -1 && filename != NULL, "Couldn't open temporary file.", NULL); GError* error = NULL; if (g_file_set_contents(filename, "set test1 config-string\n" \ "set test2 2\n", -1, &error) == FALSE) { fail_unless(false, "Couldn't set content: %s", error->message, NULL); g_error_free(error); } girara_config_parse(session, filename); char* ptr = NULL; fail_unless(girara_setting_get(session, "test1", &ptr), "Failed to get setting 'test1'.", NULL); fail_unless(g_strcmp0(ptr, "config-string") == 0, "Value of 'test1' doesn't match (got: %s, expected: %s", ptr, "config-string", NULL); g_free(ptr); int real_val = 0; fail_unless(girara_setting_get(session, "test2", &real_val), "Failed to get setting 'test1'.", NULL); fail_unless(real_val == 2, "Value of 'test2' doesn't match (got: %d, expected: %d", real_val, 2, NULL); close(fd); fail_unless(g_remove(filename) == 0, "Failed to remove temporary file.", NULL); g_free(filename); girara_session_destroy(session); } END_TEST extern void setup(void); Suite* suite_config() { TCase* tcase = NULL; Suite* suite = suite_create("Config"); /* parse */ tcase = tcase_create("parse"); tcase_add_checked_fixture(tcase, setup, NULL); tcase_add_test(tcase, test_config_parse); suite_add_tcase(suite, tcase); return suite; } girara-0.1.9/tests/test_setting.c0000644000175000001440000000553512242417112015664 0ustar mockusers/* See LICENSE file for license and copyright information */ #include #include "../session.h" #include "../settings.h" START_TEST(test_settings_basic) { girara_session_t* session = girara_session_create(); fail_unless(session != NULL, "Couldn't create session.", NULL); fail_unless(girara_setting_add(session, "test", NULL, STRING, false, NULL, NULL, NULL), NULL); char* ptr = NULL; fail_unless(girara_setting_get(session, "test", &ptr), NULL); fail_unless(ptr == NULL, NULL); fail_unless(girara_setting_set(session, "test", "value"), NULL); fail_unless(girara_setting_get(session, "test", &ptr), NULL); fail_unless(g_strcmp0(ptr, "value") == 0, NULL); g_free(ptr); ptr = NULL; fail_unless(!girara_setting_get(session, "does-not-exist", &ptr), NULL); fail_unless(ptr == NULL, NULL); fail_unless(girara_setting_add(session, "test2", "value", STRING, false, NULL, NULL, NULL), NULL); fail_unless(girara_setting_get(session, "test2", &ptr), NULL); fail_unless(g_strcmp0(ptr, "value") == 0, NULL); g_free(ptr); ptr = NULL; fail_unless(!girara_setting_add(session, "test3", NULL, INT, false, NULL, NULL, NULL), NULL); fail_unless(!girara_setting_get(session, "test3", &ptr), NULL); fail_unless(ptr == NULL, NULL); float val = 0.0, rval = 0.0; fail_unless(girara_setting_add(session, "test4", &val, FLOAT, false, NULL, NULL, NULL), NULL); fail_unless(girara_setting_get(session, "test4", &rval), NULL); fail_unless(val == rval, NULL); girara_session_destroy(session); } END_TEST static int callback_called = 0; static void setting_callback(girara_session_t* session, const char* name, girara_setting_type_t type, void* value, void* data) { fail_unless(callback_called == 0, NULL); fail_unless(session != NULL, NULL); fail_unless(g_strcmp0(name, "test") == 0, NULL); fail_unless(type == STRING, NULL); fail_unless(g_strcmp0(value, "value") == 0, NULL); fail_unless(g_strcmp0(data, "data") == 0, NULL); callback_called++; } START_TEST(test_settings_callback) { girara_session_t* session = girara_session_create(); fail_unless(session != NULL, NULL); fail_unless(girara_setting_add(session, "test", "oldvalue", STRING, false, NULL, setting_callback, "data"), NULL); fail_unless(girara_setting_set(session, "test", "value"), NULL); fail_unless(callback_called == 1, NULL); girara_session_destroy(session); } END_TEST extern void setup(void); Suite* suite_settings() { TCase* tcase = NULL; Suite* suite = suite_create("Settings"); /* basic */ tcase = tcase_create("basic"); tcase_add_checked_fixture(tcase, setup, NULL); tcase_add_test(tcase, test_settings_basic); suite_add_tcase(suite, tcase); /* callback */ tcase = tcase_create("callback"); tcase_add_checked_fixture(tcase, setup, NULL); suite_add_tcase(suite, tcase); tcase_add_test(tcase, test_settings_callback); return suite; } girara-0.1.9/tests/config.mk0000644000175000001440000000025612242417112014575 0ustar mockusers# See LICENSE file for license and copyright information CHECK_INC ?= $(shell pkg-config --cflags check) CHECK_LIB ?= $(shell pkg-config --libs check) LIBS += ${CHECK_LIB} girara-0.1.9/tests/test_datastructures.c0000644000175000001440000003430212242417112017256 0ustar mockusers/* See LICENSE file for license and copyright information */ #include #include #include #include static unsigned int list_free_called = 0; static unsigned int node_free_called = 0; static void list_free(void* data) { fail_unless(list_free_called == 0u, NULL); fail_unless((intptr_t) data == 0xDEAD, NULL); ++list_free_called; } START_TEST(test_datastructures_list) { girara_list_t* list = girara_list_new(); // size of empty list fail_unless(girara_list_size(list) == 0, NULL); // append for (intptr_t i = 0; i != 10; ++i) { girara_list_append(list, (void*)i); } // size of list fail_unless(girara_list_size(list) == 10, NULL); // iterator tests girara_list_iterator_t* iter = girara_list_iterator(list); fail_unless(iter != NULL, NULL); for (intptr_t i = 0; i != 10; ++i) { fail_unless(((intptr_t) girara_list_iterator_data(iter) == i), NULL); if (i < 9) { fail_unless((girara_list_iterator_is_valid(iter)), NULL); fail_unless((girara_list_iterator_has_next(iter)), NULL); fail_unless((girara_list_iterator_next(iter) != NULL), NULL); fail_unless((girara_list_iterator_is_valid(iter)), NULL); } else { fail_unless((girara_list_iterator_is_valid(iter)), NULL); fail_unless((!girara_list_iterator_has_next(iter)), NULL); fail_unless((girara_list_iterator_next(iter) == NULL), NULL); fail_unless((!girara_list_iterator_is_valid(iter)), NULL); } } girara_list_iterator_free(iter); girara_list_free(list); // contains list = girara_list_new(); for (intptr_t i = 0; i != 10; ++i) { fail_unless((girara_list_contains(list, (void*) i) == false), NULL); girara_list_append(list, (void*)i); fail_unless((girara_list_contains(list, (void*) i) == true), NULL); } // position for (intptr_t i = 0; i != 10; ++i) { fail_unless((girara_list_position(list, (void*) i) == i), NULL); } fail_unless((girara_list_position(list, (void*) 10) == -1), NULL); // remove for (intptr_t i = 9; i >= 0; --i) { fail_unless((girara_list_contains(list, (void*) i) == true), NULL); girara_list_remove(list, (void*)i); fail_unless((girara_list_contains(list, (void*)i) == false), NULL); girara_list_append(list, (void*)i); } iter = girara_list_iterator(list); fail_unless((iter != NULL), NULL); for (intptr_t i = 9; i >= 0; --i) { fail_unless(((intptr_t)girara_list_iterator_data(iter) == i), NULL); if (i > 0) { fail_unless((girara_list_iterator_is_valid(iter)), NULL); fail_unless((girara_list_iterator_has_next(iter)), NULL); fail_unless((girara_list_iterator_next(iter) != NULL), NULL); fail_unless((girara_list_iterator_is_valid(iter)), NULL); } else { fail_unless((girara_list_iterator_is_valid(iter)), NULL); fail_unless((!girara_list_iterator_has_next(iter)), NULL); fail_unless((girara_list_iterator_next(iter) == NULL), NULL); fail_unless((!girara_list_iterator_is_valid(iter)), NULL); } } girara_list_iterator_free(iter); girara_list_free(list); } END_TEST START_TEST(test_datastructures_list_merge) { girara_list_t* list1 = girara_list_new(); girara_list_t* list2 = girara_list_new(); fail_unless((list1 != NULL), NULL); fail_unless((list2 != NULL), NULL); fail_unless((girara_list_merge(NULL, NULL) == NULL), NULL); fail_unless((girara_list_merge(list1, NULL) == list1), NULL); fail_unless((girara_list_merge(NULL, list2) == list2), NULL); girara_list_append(list1, (void*)0); girara_list_append(list2, (void*)1); girara_list_t* list3 = girara_list_merge(list1, list2); fail_unless((list3 == list1), NULL); fail_unless((girara_list_nth(list3, 0) == (void*)0), NULL); fail_unless((girara_list_nth(list3, 1) == (void*)1), NULL); girara_list_free(list1); girara_list_free(list2); } END_TEST START_TEST(test_datastructures_list_free_empty) { // free empty list girara_list_t* list = girara_list_new(); fail_unless((list != NULL), NULL); girara_list_free(list); list = girara_list_new2(NULL); fail_unless((list != NULL), NULL); girara_list_free(list); list = girara_list_new2(g_free); fail_unless((list != NULL), NULL); girara_list_free(list); } END_TEST START_TEST(test_datastructures_list_free_already_cleared) { // free cleared list girara_list_t* list = girara_list_new(); fail_unless((list != NULL), NULL); girara_list_append(list, (void*) 0xDEAD); fail_unless((girara_list_size(list) == 1), NULL); girara_list_clear(list); fail_unless((girara_list_size(list) == 0), NULL); girara_list_free(list); } END_TEST START_TEST(test_datastructures_list_free_free_function) { // free function girara_list_t* list = girara_list_new(); list_free_called = 0; fail_unless((list != NULL), NULL); girara_list_set_free_function(list, list_free); girara_list_append(list, (void*) 0xDEAD); girara_list_free(list); fail_unless((list_free_called == 1), NULL); } END_TEST START_TEST(test_datastructures_list_free_free_function_remove) { // remove with free function list_free_called = 0; girara_list_t* list = girara_list_new2(list_free); fail_unless((list != NULL), NULL); girara_list_append(list, (void*)0xDEAD); girara_list_remove(list, (void*)0xDEAD); fail_unless((girara_list_size(list) == 0), NULL); girara_list_free(list); fail_unless((list_free_called == 1), NULL); } END_TEST START_TEST(test_datastructures_sorted_list_basic) { girara_list_t* list = girara_sorted_list_new(NULL); fail_unless((list != NULL), NULL); girara_list_free(list); } END_TEST START_TEST(test_datastructures_sorted_list) { girara_list_t* list = girara_sorted_list_new2((girara_compare_function_t) g_strcmp0, (girara_free_function_t) g_free); fail_unless((list != NULL), NULL); girara_list_t* unsorted_list = girara_list_new2((girara_free_function_t) g_free); fail_unless((unsorted_list != NULL), NULL); static const char* test_strings[] = { "A", "C", "Baa", "Za", "Bba", "Bab", NULL }; static const char* test_strings_sorted[] = { "A", "Baa", "Bab", "Bba", "C", "Za", NULL }; // append for (const char** p = test_strings; *p != NULL; ++p) { girara_list_append(list, (void*)g_strdup(*p)); girara_list_append(unsorted_list, (void*)g_strdup(*p)); } fail_unless((girara_list_size(list) == sizeof(test_strings) / sizeof(char*) - 1), NULL); fail_unless((girara_list_size(unsorted_list) == sizeof(test_strings) / sizeof(char*) - 1), NULL); // check sorting const char** p = test_strings_sorted; GIRARA_LIST_FOREACH(list, const char*, iter, value) fail_unless((g_strcmp0(value, *p) == 0), NULL); ++p; GIRARA_LIST_FOREACH_END(list, const char*, iter, value); girara_list_sort(unsorted_list, (girara_compare_function_t) g_strcmp0); p = test_strings_sorted; GIRARA_LIST_FOREACH(unsorted_list, const char*, iter, value) fail_unless((g_strcmp0(value, *p) == 0), NULL); ++p; GIRARA_LIST_FOREACH_END(unsorted_list, const char*, iter, value); girara_list_free(list); girara_list_free(unsorted_list); } END_TEST START_TEST(test_datastructures_list_iterator_remove) { girara_list_t* list = girara_list_new(); for (intptr_t i = 0; i != 10; ++i) { girara_list_append(list, (void*)i); } fail_unless(girara_list_size(list) == 10); intptr_t next = 0; GIRARA_LIST_FOREACH(list, intptr_t, iter, data) fail_unless(next++ == data); if (data == 5) { /* this is broken … this will cause an invalid read */ girara_list_remove(list, (void*) data); } GIRARA_LIST_FOREACH_END(list, intptr_t, iter, data); for (intptr_t s = 0; s != 5; ++s) { fail_unless((intptr_t)girara_list_nth(list, s) == s); } for (intptr_t s = 5; s != 9; ++s) { fail_unless((intptr_t)girara_list_nth(list, s) == s + 1); } } END_TEST static void node_free(void* data) { if (g_strcmp0((char*)data, "root") == 0) { fail_unless((node_free_called == 0), NULL); } else if (g_strcmp0((char*)data, "child") == 0) { fail_unless((node_free_called == 1), NULL); } else { fail("Should not be reached"); } ++node_free_called; } START_TEST(test_datastructures_node) { girara_tree_node_t* root = girara_node_new("root"); fail_unless((girara_node_get_num_children(root) == 0), NULL); fail_unless((girara_node_get_parent(root) == NULL), NULL); fail_unless((girara_node_get_root(root) == root), NULL); fail_unless((g_strcmp0((char*) girara_node_get_data(root), "root") == 0), NULL); girara_list_t* rchildren = girara_node_get_children(root); fail_unless((rchildren != NULL), NULL); fail_unless((girara_list_size(rchildren) == 0), NULL); girara_list_free(rchildren); girara_node_free(root); root = girara_node_new("root"); girara_node_set_free_function(root, node_free); girara_node_append_data(root, "child"); fail_unless((girara_node_get_num_children(root) == 1), NULL); fail_unless((node_free_called == 0), NULL); girara_node_free(root); fail_unless((node_free_called == 2), NULL); node_free_called = 0; root = girara_node_new("root"); girara_node_set_free_function(root, node_free); girara_node_set_data(root, "child"); fail_unless((node_free_called == 1), NULL); girara_node_free(root); fail_unless((node_free_called == 2), NULL); root = girara_node_new(g_strdup("root")); girara_node_set_free_function(root, g_free); for (unsigned int i = 0; i != 5; ++i) { girara_tree_node_t* child = girara_node_append_data(root, g_strdup_printf("child_%u", i)); for (unsigned int j = 0; j != 10; ++j) { girara_node_append_data(child, g_strdup_printf("child_%u_%u", i, j)); } fail_unless((girara_node_get_num_children(child) == 10), NULL); } fail_unless((girara_node_get_num_children(root) == 5), NULL); girara_list_t* children = girara_node_get_children(root); fail_unless((children != NULL), NULL); fail_unless((girara_list_size(children) == 5), NULL); unsigned int i = 0; girara_list_iterator_t* iter = girara_list_iterator(children); while (girara_list_iterator_is_valid(iter)) { char* expected = g_strdup_printf("child_%u", i); girara_tree_node_t* child = (girara_tree_node_t*)girara_list_iterator_data(iter); fail_unless((g_strcmp0((char*)girara_node_get_data(child), expected) == 0), NULL); fail_unless((girara_node_get_parent(child) == root), NULL); fail_unless((girara_node_get_root(child) == root), NULL); g_free(expected); girara_list_t* grandchildren = girara_node_get_children(child); fail_unless((grandchildren != NULL), NULL); fail_unless((girara_list_size(grandchildren) == 10), NULL); unsigned int j = 0; girara_list_iterator_t* iter2 = girara_list_iterator(grandchildren); while (girara_list_iterator_is_valid(iter2)) { char* expected = g_strdup_printf("child_%u_%u", i, j); girara_tree_node_t* gchild = (girara_tree_node_t*)girara_list_iterator_data(iter2); fail_unless((g_strcmp0((char*)girara_node_get_data(gchild), expected) == 0), NULL); fail_unless((girara_node_get_parent(gchild) == child), NULL); fail_unless((girara_node_get_root(gchild) == root), NULL); g_free(expected); ++j; girara_list_iterator_next(iter2); } fail_unless((j == 10), NULL); girara_list_iterator_free(iter2); girara_list_free(grandchildren); girara_list_iterator_next(iter); ++i; } fail_unless((i == 5), NULL); girara_list_iterator_free(iter); girara_list_free(children); girara_node_free(root); } END_TEST static int find_compare(const void* item, const void* data) { if (item == data) { return 1; } else { return 0; } } START_TEST(test_datastructures_list_find) { girara_list_t* list = girara_list_new(); fail_unless((list != NULL), NULL); /* test parameters */ fail_unless((girara_list_find(NULL, NULL, NULL) == NULL), NULL); fail_unless((girara_list_find(list, NULL, NULL) == NULL), NULL); fail_unless((girara_list_find(NULL, NULL, (void*) 0xDEAD) == NULL), NULL); fail_unless((girara_list_find(NULL, find_compare, NULL) == NULL), NULL); /* test functionality */ girara_list_append(list, (void*) 0xDEAD); fail_unless((girara_list_find(list, find_compare, (void*) 0xDEAD) == NULL), NULL); fail_unless((girara_list_find(list, find_compare, (void*) 0xCAFE) != NULL), NULL); girara_list_free(list); } END_TEST START_TEST(test_datastructures_list_prepend) { girara_list_t* list = girara_list_new(); fail_unless((list != NULL), NULL); /* test parameters */ girara_list_prepend(list, NULL); fail_unless((girara_list_size(list) != 0), NULL); girara_list_free(list); } END_TEST Suite* suite_datastructures() { TCase* tcase = NULL; Suite* suite = suite_create("Datastructures"); /* list free */ tcase = tcase_create("list_free_function"); tcase_add_test(tcase, test_datastructures_list_free_empty); tcase_add_test(tcase, test_datastructures_list_free_already_cleared); tcase_add_test(tcase, test_datastructures_list_free_free_function); tcase_add_test(tcase, test_datastructures_list_free_free_function_remove); suite_add_tcase(suite, tcase); /* list create */ tcase = tcase_create("list_basics"); tcase_add_test(tcase, test_datastructures_list); suite_add_tcase(suite, tcase); /* sorted list */ tcase = tcase_create("list_sorted"); tcase_add_test(tcase, test_datastructures_sorted_list_basic); tcase_add_test(tcase, test_datastructures_sorted_list); suite_add_tcase(suite, tcase); /* merge lists */ tcase = tcase_create("list_merge"); tcase_add_test(tcase, test_datastructures_list_merge); suite_add_tcase(suite, tcase); /* search lists */ tcase = tcase_create("list_find"); tcase_add_test(tcase, test_datastructures_list_find); suite_add_tcase(suite, tcase); /* prepend lists */ tcase = tcase_create("list_prepend"); tcase_add_test(tcase, test_datastructures_list_prepend); suite_add_tcase(suite, tcase); /* list iterators */ tcase = tcase_create("list_iterators"); /* tcase_add_test(tcase, test_datastructures_list_iterator_remove); */ suite_add_tcase(suite, tcase); /* node free */ tcase = tcase_create("node_free"); tcase_add_test(tcase, test_datastructures_sorted_list); suite_add_tcase(suite, tcase); /* node basics */ tcase = tcase_create("node_basics"); tcase_add_test(tcase, test_datastructures_node); suite_add_tcase(suite, tcase); return suite; } girara-0.1.9/tests/test_utils.c0000644000175000001440000002320312242417112015337 0ustar mockusers// See LICENSE file for license and copyright information #define _BSD_SOURCE #if !defined(__OpenBSD__) && !defined(__FreeBSD__) && !defined(__NetBSD__) #define _POSIX_SOURCE #endif #include #include #include #include #include #include #include #include #include #include "../utils.h" #include "../datastructures.h" typedef struct { gchar* name; gchar* dir; } pwd_info_t; static void free_pwd_info(void* data) { pwd_info_t* pwd = (pwd_info_t*) data; if (!pwd) { return; } g_free(pwd->name); g_free(pwd->dir); g_free(pwd); } static girara_list_t* read_pwd_info(void) { girara_list_t* list = girara_list_new(); girara_list_set_free_function(list, &free_pwd_info); struct passwd* pw; errno = 0; while ((pw = getpwent()) != NULL) { pwd_info_t* pwdinfo = g_malloc0(sizeof(pwd_info_t)); pwdinfo->name = g_strdup(pw->pw_name); pwdinfo->dir = g_strdup(pw->pw_dir); girara_list_append(list, pwdinfo); errno = 0; } fail_unless(errno == 0, "Non-zero errno :%d", errno, NULL); endpwent(); return list; } START_TEST(test_home_directory) { const gchar* user = g_get_home_dir(); gchar* oldenv = g_getenv("HOME") ? g_strdup(g_getenv("HOME")) : NULL; if (oldenv) { gchar* result = girara_get_home_directory(NULL); fail_unless(result != oldenv, "Home directory is not the same", NULL); g_free(result); } g_unsetenv("HOME"); gchar* result = girara_get_home_directory(NULL); fail_unless(result != user, "Home directory is not the same", NULL); g_free(result); girara_list_t* list = read_pwd_info(); girara_list_iterator_t* iter = girara_list_iterator(list); fail_unless(iter != NULL, "Could not create iterator", NULL); while (girara_list_iterator_is_valid(iter)) { pwd_info_t* pwdinfo = (pwd_info_t*) girara_list_iterator_data(iter); gchar* result = girara_get_home_directory(pwdinfo->name); fail_unless(result != pwdinfo->dir, "Home directory is not the same", NULL); g_free(result); girara_list_iterator_next(iter); } girara_list_iterator_free(iter); girara_list_free(list); if (oldenv) { g_setenv("HOME", oldenv, TRUE); g_free(oldenv); } } END_TEST START_TEST(test_home_directory_set_HOME) { g_setenv("HOME", "/home/test", TRUE); char* result = girara_get_home_directory(NULL); fail_unless(g_strcmp0(result, "/home/test") == 0, "Home directory is not the same", NULL); g_free(result); } END_TEST START_TEST(test_fix_path_basic) { gchar* result = girara_fix_path("test"); fail_unless(g_strcmp0(result, "test") == 0, "Fix path result does not match (got: %s, expected: %s)", result, "test", NULL); g_free(result); result = girara_fix_path("test/test"); fail_unless(g_strcmp0(result, "test/test") == 0, "Fix path result does not match (got: %s, expected: %s)", result, "test/test", NULL); g_free(result); } END_TEST START_TEST(test_fix_path_extended) { gchar* oldenv = g_getenv("HOME") ? g_strdup(g_getenv("HOME")) : NULL; g_unsetenv("HOME"); girara_list_t* list = read_pwd_info(); GIRARA_LIST_FOREACH(list, pwd_info_t*, iter, pwdinfo) gchar* path = g_strdup_printf("~%s/test", pwdinfo->name); gchar* eres = g_build_filename(pwdinfo->dir, "test", NULL); gchar* result = girara_fix_path(path); fail_unless(g_strcmp0(result, eres) == 0, "Fix path result does not match (got: %s, expected %s)", result, eres, NULL); g_free(result); g_free(eres); g_free(path); GIRARA_LIST_FOREACH_END(list, pwd_info_t*, iter, pwdinfo); girara_list_free(list); if (oldenv) { g_setenv("HOME", oldenv, TRUE); g_free(oldenv); } } END_TEST static void xdg_path_impl(girara_xdg_path_t path, const gchar* envvar, const gchar* expected) { #if GLIB_CHECK_VERSION(2, 35, 3) const gchar* home = g_getenv("HOME"); gchar* home_env_var = NULL; gchar** envp = NULL; if (home != NULL) { home_env_var = g_strdup_printf("HOME=%s", home); envp = calloc(3, sizeof(gchar*)); fail_unless(envp != NULL, "Failed to allocate memory for ENV"); envp[1] = home_env_var; } else { envp = calloc(2, sizeof(gchar*)); fail_unless(envp != NULL, "Failed to allocate memory for ENV"); } envp[0] = g_strdup_printf("%s=", envvar); #else gchar* envp[] = { g_strdup_printf("%s=", envvar), NULL }; #endif gchar* argv[] = { "./xdg_test_helper", g_strdup_printf("%d", path), NULL }; gchar* output = NULL; bool result = g_spawn_sync(NULL, argv, envp, G_SPAWN_STDERR_TO_DEV_NULL, NULL, NULL, &output, NULL, NULL, NULL); g_assert(result); g_assert(output); fail_unless(g_strcmp0(output, expected) == 0, "Output is not the same (got: %s, expected: %s)", output, expected, NULL); g_free(output); g_free(envp[0]); envp[0] = g_strdup_printf("%s=~/xdg", envvar); result = g_spawn_sync(NULL, argv, envp, G_SPAWN_STDERR_TO_DEV_NULL, NULL, NULL, &output, NULL, NULL, NULL); g_assert(result); g_assert(output); fail_unless(g_strcmp0(output, "~/xdg") == 0, "Output is not the same (got: %s, expected: %s)", output, "~/xdg", NULL); g_free(envp[0]); envp[0] = g_strdup_printf("%s=/home/test/xdg", envvar); result= g_spawn_sync(NULL, argv, envp, G_SPAWN_STDERR_TO_DEV_NULL, NULL, NULL, &output, NULL, NULL, NULL); g_assert(result); g_assert(output); fail_unless(g_strcmp0(output, "/home/test/xdg") == 0, "Output is not the same (got: %s, expected: %s)", output, "/home/test/xdg", NULL); g_free(envp[0]); g_free(argv[1]); #if GLIB_CHECK_VERSION(2, 35, 3) g_free(home_env_var); g_free(envp); #endif } START_TEST(test_xdg_path) { xdg_path_impl(XDG_CONFIG, "XDG_CONFIG_HOME", g_get_user_config_dir()); xdg_path_impl(XDG_DATA, "XDG_DATA_HOME", g_get_user_data_dir()); xdg_path_impl(XDG_CONFIG_DIRS, "XDG_CONFIG_DIRS", "/etc/xdg"); xdg_path_impl(XDG_DATA_DIRS, "XDG_DATA_DIRS", "/usr/local/share/:/usr/share"); } END_TEST START_TEST(test_file_invariants) { fail_unless(girara_file_open(NULL, NULL) == NULL, NULL); fail_unless(girara_file_open("somefile", NULL) == NULL, NULL); fail_unless(girara_file_open(NULL, "r") == NULL, NULL); fail_unless(girara_file_read_line(NULL) == NULL, NULL); fail_unless(girara_file_read(NULL) == NULL, NULL); } END_TEST START_TEST(test_file_read) { static const char CONTENT[] = "test1\ntest2\ntest3"; static const char* LINES[] = { "test1", "test2", "test3" }; static size_t NUMLINES = 3; gchar* path = NULL; int fd = g_file_open_tmp("girara.test.XXXXXX", &path, NULL); fail_unless(fd != -1, "Failed to open temporary file.", NULL); fail_unless(g_strcmp0(path, "") != 0, "Failed to open temporary file.", NULL); GError* error = NULL; if (g_file_set_contents(path, CONTENT, -1, &error) == FALSE) { fail_unless(false, "Couldn't set content: %s", error->message, NULL); g_error_free(error); } char* content = girara_file_read(path); fail_unless(g_strcmp0(content, CONTENT) == 0, "Reading file failed", NULL); free(content); FILE* file = girara_file_open(path, "r"); fail_unless(file != NULL, NULL); for (size_t i = 0; i != NUMLINES; ++i) { char* line = girara_file_read_line(file); fail_unless(g_strcmp0(line, LINES[i]) == 0, "Line doesn't match (got: %s, expected: %s)", line, LINES[i], NULL); free(line); } fclose(file); close(fd); fail_unless(g_remove(path) == 0, "Failed to remove temporary file.", NULL); g_free(path); } END_TEST START_TEST(test_safe_realloc) { fail_unless(girara_safe_realloc(NULL, 0u) == NULL, NULL); void* ptr = NULL; fail_unless(girara_safe_realloc(&ptr, sizeof(int)) != NULL, NULL); fail_unless(ptr != NULL, NULL); fail_unless(girara_safe_realloc(&ptr, 1024*sizeof(int)) != NULL, NULL); fail_unless(ptr != NULL, NULL); fail_unless(girara_safe_realloc(&ptr, 0u) == NULL, NULL); fail_unless(ptr == NULL, NULL); } END_TEST START_TEST(test_split_path) { fail_unless(girara_split_path_array(NULL) == NULL, NULL); fail_unless(girara_split_path_array("") == NULL, NULL); girara_list_t* res = girara_split_path_array("one/path"); fail_unless(res != NULL, NULL); fail_unless(girara_list_size(res) == 1, NULL); fail_unless(g_strcmp0(girara_list_nth(res, 0), "one/path") == 0, NULL); girara_list_free(res); res = girara_split_path_array("first/path:second/path"); fail_unless(res != NULL, NULL); fail_unless(girara_list_size(res) == 2, NULL); fail_unless(g_strcmp0(girara_list_nth(res, 0), "first/path") == 0, NULL); fail_unless(g_strcmp0(girara_list_nth(res, 1), "second/path") == 0, NULL); girara_list_free(res); } END_TEST Suite* suite_utils() { TCase* tcase = NULL; Suite* suite = suite_create("Utils"); /* home directory */ tcase = tcase_create("home_directory"); tcase_add_test(tcase, test_home_directory); tcase_add_test(tcase, test_home_directory_set_HOME); suite_add_tcase(suite, tcase); /* fix path */ tcase = tcase_create("fix_path"); tcase_add_test(tcase, test_fix_path_basic); tcase_add_test(tcase, test_fix_path_extended); suite_add_tcase(suite, tcase); /* xdg path */ tcase = tcase_create("xdg_path"); tcase_add_test(tcase, test_xdg_path); suite_add_tcase(suite, tcase); /* file invariants */ tcase = tcase_create("file_invariants"); tcase_add_test(tcase, test_file_invariants); suite_add_tcase(suite, tcase); /* read file */ tcase = tcase_create("file_read"); tcase_add_test(tcase, test_file_read); suite_add_tcase(suite, tcase); /* safe realloc */ tcase = tcase_create("safe_realloc"); tcase_add_test(tcase, test_safe_realloc); suite_add_tcase(suite, tcase); /* split path */ tcase = tcase_create("split_path"); tcase_add_test(tcase, test_split_path); suite_add_tcase(suite, tcase); return suite; } girara-0.1.9/tests/test_session.c0000644000175000001440000000164112242417112015664 0ustar mockusers/* See LICENSE file for license and copyright information */ #include #include "../session.h" START_TEST(test_create) { girara_session_t* session = girara_session_create(); fail_unless(session != NULL, "Could not create session"); girara_session_destroy(session); } END_TEST START_TEST(test_init) { girara_session_t* session = girara_session_create(); fail_unless(session != NULL, "Could not create session"); bool result = girara_session_init(session, NULL); fail_unless(result == true, "Could not init session"); girara_session_destroy(session); } END_TEST extern void setup(void); Suite* suite_session() { TCase* tcase = NULL; Suite* suite = suite_create("Session"); /* basic */ tcase = tcase_create("basic"); tcase_add_checked_fixture(tcase, setup, NULL); tcase_add_test(tcase, test_create); tcase_add_test(tcase, test_init); suite_add_tcase(suite, tcase); return suite; } girara-0.1.9/tests/Makefile0000644000175000001440000000416012242417112014435 0ustar mockusers# See LICENSE file for license and copyright information include ../config.mk include ../common.mk include config.mk SOURCE = tests.c $(wildcard test_*.c) OBJECTS = ${SOURCE:.c=-gtk${GIRARA_GTK_VERSION}.o} DOBJECTS = ${SOURCE:.c=-gtk${GIRARA_GTK_VERSION}.do} XDG_HELPER_SOURCE = xdg_test_helper.c XDG_HELPER = ${XDG_HELPER_SOURCE:.c=} all: options girara_test-gtk${GIRARA_GTK_VERSION} ${XDG_HELPER} run: girara_test-gtk${GIRARA_GTK_VERSION} ${XDG_HELPER} $(ECHO) "running tests ..." $(QUIET)G_SLICE=debug-blocks ./girara_test-gtk${GIRARA_GTK_VERSION} debug: options girara_test-gtk${GIRARA_GTK_VERSION}-debug ${XDG_HELPER} run-debug: debug $(ECHO) "running tests ..." $(QUIET)G_SLICE=debug-blocks ./girara_test-gtk${GIRARA_GTK_VERSION}-debug options: @echo ${PROJECT} build options: @echo "CFLAGS = ${CFLAGS}" @echo "LDFLAGS = ${LDFLAGS}" @echo "DFLAGS = ${DFLAGS}" @echo "CC = ${CC}" %-gtk${GIRARA_GTK_VERSION}.o: %.c @mkdir -p .depend $(ECHO) CC $< $(QUIET)${CC} -c -I.. ${CPPFLAGS} ${CFLAGS} -o $@ $< -MMD -MF .depend/$@.dep ${XDG_HELPER}: ${XDG_HELPER_SOURCE} ../libgirara-gtk${GIRARA_GTK_VERSION}.a @mkdir -p .depend $(ECHO) CC $< $(QUIET)${CC} -I.. ${CPPFLAGS} ${CFLAGS} -o $@ $< ../libgirara-gtk${GIRARA_GTK_VERSION}.a ${LDFLAGS} ${LIBS} -MMD -MF .depend/$@.dep %-gtk${GIRARA_GTK_VERSION}.do: %.c @mkdir -p .depend $(ECHO) CC $< $(QUIET)${CC} -c -I.. ${CPPFLAGS} ${CFLAGS} ${DFLAGS} -o $@ $< -MMD -MF .depend/$@.dep girara_test-gtk${GIRARA_GTK_VERSION}: ${OBJECTS} ../libgirara-gtk${GIRARA_GTK_VERSION}.a $(ECHO) LD $@ $(QUIET)${CC} ${LDFLAGS} -o $@ ${OBJECTS} ../libgirara-gtk${GIRARA_GTK_VERSION}.a ${LIBS} girara_test-gtk${GIRARA_GTK_VERSION}-debug: ${DOBJECTS} ../libgirara-gtk${GIRARA_GTK_VERSION}-debug.a $(ECHO) LD $@ $(QUIET)${CC} ${LDFLAGS} -o $@ ${DOBJECTS} ../libgirara-gtk${GIRARA_GTK_VERSION}-debug.a ${LIBS} ${DOBJECTS} ${OBJECTS}: ../config.mk clean: $(QUIET)rm -rf ${OBJECTS} ${DOBJECTS} girara_test-gtk${GIRARA_GTK_VERSION} \ girara_test-gtk${GIRARA_GTK_VERSION}-debug .depend ${XDG_HELPER} *gcda *gcno .PHONY: all options clean debug run run-debug -include $(wildcard .depend/*.dep) girara-0.1.9/tabs.c0000644000175000001440000001601512242417112012732 0ustar mockusers/* See LICENSE file for license and copyright information */ #include "tabs.h" #include "session.h" #include "internal.h" #define UNTITLED_TAB_TITLE "untitled" #if GTK_MAJOR_VERSION == 2 #include "gtk2-compat.h" #endif /** * Default implementation of the event that is executed if a tab is clicked * * @param widget The widget * @param event The event * @param data Additional data * @return true if an error occured, otherwise false */ static bool girara_callback_tab_clicked(GtkWidget* widget, GdkEventButton* event, gpointer data); void girara_tabs_enable(girara_session_t* session) { if (session == NULL || session->gtk.tabs == NULL) { return; } /* Display tab view */ girara_set_view(session, GTK_WIDGET(session->gtk.tabs)); /* Display tab bar */ if (session->gtk.tabbar) { gtk_widget_show(session->gtk.tabbar); } } girara_tab_t* girara_tab_new(girara_session_t* session, const char* title, GtkWidget* widget, bool next_to_current, void* data) { if (session == NULL || widget == NULL) { return NULL; } girara_tab_t* tab = g_slice_new(girara_tab_t); tab->title = title ? g_strdup(title) : g_strdup(UNTITLED_TAB_TITLE); tab->widget = widget; tab->session = session; tab->data = data; int position = (next_to_current) ? (gtk_notebook_get_current_page(session->gtk.tabs) + 1) : -1; /* insert tab into notebook */ if (gtk_notebook_insert_page(session->gtk.tabs, tab->widget, NULL, position) == -1) { g_free(tab->title); g_slice_free(girara_tab_t, tab); return NULL; } /* create tab label */ GtkWidget *tab_label = gtk_label_new(tab->title); GtkWidget *tab_event = gtk_event_box_new(); g_object_set_data(G_OBJECT(tab->widget), "event", (gpointer) tab_event); g_object_set_data(G_OBJECT(tab->widget), "label", (gpointer) tab_label); g_object_set_data(G_OBJECT(tab->widget), "tab", (gpointer) tab); g_signal_connect(G_OBJECT(tab_event), "button_press_event", G_CALLBACK(girara_callback_tab_clicked), tab); gtk_misc_set_alignment(GTK_MISC(tab_label), 0.0f, 0.0f); gtk_misc_set_padding(GTK_MISC(tab_label), 4, 4); gtk_widget_override_font(tab_label, session->style.font); gtk_container_add(GTK_CONTAINER(tab_event), tab_label); gtk_box_pack_start(GTK_BOX(session->gtk.tabbar), tab_event, TRUE, TRUE, 0); gtk_box_reorder_child(GTK_BOX(session->gtk.tabbar), tab_event, position); gtk_widget_show_all(widget); gtk_widget_show_all(tab_event); gtk_notebook_set_current_page(session->gtk.tabs, position); girara_tab_update(session); return tab; } void girara_tab_remove(girara_session_t* session, girara_tab_t* tab) { if (session == NULL || tab == NULL || session->gtk.tabbar == NULL) { return; } /* Remove page from notebook */ int tab_id = girara_tab_position_get(session, tab); /* Remove entry from tabbar */ GtkWidget* tab_event = GTK_WIDGET(g_object_get_data(G_OBJECT(tab->widget), "event")); if (tab_event != NULL) { gtk_container_remove(GTK_CONTAINER(session->gtk.tabbar), tab_event); } if (tab_id != -1) { gtk_notebook_remove_page(session->gtk.tabs, tab_id); } g_free(tab->title); g_slice_free(girara_tab_t, tab); girara_tab_update(session); } girara_tab_t* girara_tab_get(girara_session_t* session, unsigned int index) { if (session == NULL || session->gtk.tabs == NULL) { return 0; } GtkWidget* widget = gtk_notebook_get_nth_page(session->gtk.tabs, index); return (girara_tab_t*) g_object_get_data(G_OBJECT(widget), "tab"); } int girara_get_number_of_tabs(girara_session_t* session) { if (session == NULL || session->gtk.tabs == NULL) { return 0; } return gtk_notebook_get_n_pages(session->gtk.tabs); } void girara_tab_update(girara_session_t* session) { if (session == NULL || session->gtk.tabs == NULL) { return; } int number_of_tabs = girara_get_number_of_tabs(session); int current_tab = girara_tab_position_get(session, girara_tab_current_get(session)); for (int i = 0; i < number_of_tabs; i++) { GtkWidget* widget = gtk_notebook_get_nth_page(session->gtk.tabs, i); girara_tab_t* tab = (girara_tab_t*) g_object_get_data(G_OBJECT(widget), "tab"); if (tab == NULL) { continue; } GtkWidget* tab_event = GTK_WIDGET(g_object_get_data(G_OBJECT(tab->widget), "event")); GtkWidget* tab_label = GTK_WIDGET(g_object_get_data(G_OBJECT(tab->widget), "label")); if (i == current_tab) { gtk_widget_override_background_color(tab_event, GTK_STATE_NORMAL, &(session->style.tabbar_focus_background)); gtk_widget_override_color(tab_label, GTK_STATE_NORMAL, &(session->style.tabbar_focus_foreground)); } else { gtk_widget_override_background_color(tab_event, GTK_STATE_NORMAL, &(session->style.tabbar_background)); gtk_widget_override_color(tab_label, GTK_STATE_NORMAL, &(session->style.tabbar_foreground)); } } } girara_tab_t* girara_tab_current_get(girara_session_t* session) { if (session == NULL || session->gtk.tabs == NULL) { return NULL; } int current = gtk_notebook_get_current_page(session->gtk.tabs); if (current != -1) { GtkWidget* widget = gtk_notebook_get_nth_page(session->gtk.tabs, current); return (girara_tab_t*) g_object_get_data(G_OBJECT(widget), "tab"); } else { return NULL; } } void girara_tab_current_set(girara_session_t* session, girara_tab_t* tab) { if (session == NULL || session->gtk.tabs == NULL || tab == NULL || tab->widget == NULL) { return; } int index = gtk_notebook_page_num(session->gtk.tabs, tab->widget); if (index != -1) { gtk_notebook_set_current_page(session->gtk.tabs, index); } girara_tab_update(session); } void girara_tab_title_set(girara_tab_t* tab, const char* title) { if (tab == NULL) { return; } g_free(tab->title); tab->title = title ? g_strdup(title) : g_strdup(UNTITLED_TAB_TITLE); GtkWidget* tab_label = GTK_WIDGET(g_object_get_data(G_OBJECT(tab->widget), "label")); if (tab_label) { gtk_label_set_text(GTK_LABEL(tab_label), tab->title); } } const char* girara_tab_title_get(girara_tab_t* tab) { if (tab == NULL) { return NULL; } return tab->title; } int girara_tab_position_get(girara_session_t* session, girara_tab_t* tab) { if (session == NULL || session->gtk.tabs == NULL || tab == NULL || tab->widget == NULL) { return -1; } return gtk_notebook_page_num(session->gtk.tabs, tab->widget); } void girara_tab_position_set(girara_session_t* session, girara_tab_t* tab, unsigned int position) { if (session == NULL || session->gtk.tabs == NULL || tab == NULL || tab->widget == NULL) { return; } gtk_notebook_reorder_child(session->gtk.tabs, tab->widget, position); } static bool girara_callback_tab_clicked(GtkWidget* UNUSED(widget), GdkEventButton* event, gpointer data) { if (data == NULL) { return false; } girara_tab_t* tab = (girara_tab_t*) data; girara_session_t* session = tab->session; switch (event->button) { case 1: girara_tab_current_set(session, tab); break; case 2: girara_tab_remove(session, tab); break; } return true; } girara-0.1.9/tabs.h0000644000175000001440000000601612242417112012737 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_TABS_H #define GIRARA_TABS_H #include "types.h" #include /** * Structure of a tab */ struct girara_tab_s { char* title; /**< The title of the tab */ GtkWidget* widget; /**< The displayed widget of the tab */ void* data; /**< Custom data */ girara_session_t* session; /**< Girara session */ }; /** * Enables the tab view. If girara_set_view is used, the tab bar will * automatically vanish and girara_tabs_enable has to be called another time to * re-enable it again. * * @param session The girara session */ void girara_tabs_enable(girara_session_t* session); /** * Creates and adds a new tab to the tab view * * @param session The girara session * @param title Title of the tab (optional) * @param widget Displayed widget * @param next_to_current Tab should be created right next to the current one * @param data Custom data * @return A new tab object or NULL if an error occured */ girara_tab_t* girara_tab_new(girara_session_t* session, const char* title, GtkWidget* widget, bool next_to_current, void* data); /** * Removes and destroys a tab from the tab view * * @param session The girara session * @param tab Tab */ void girara_tab_remove(girara_session_t* session, girara_tab_t* tab); /** * Returns the tab at the given index * * @param session The girara session * @param index Index of the tab * @return The tab object or NULL if an error occured */ girara_tab_t* girara_tab_get(girara_session_t* session, unsigned int index); /** * Returns the number of tabs * * @param session The girara session * @return The number of tabs */ int girara_get_number_of_tabs(girara_session_t* session); /** * Updates the color and states of all tabs * * @param session The girara session */ void girara_tab_update(girara_session_t* session); /** * Returns the current tab * * @param session The girara session * @return The current tab or NULL if an error occured */ girara_tab_t* girara_tab_current_get(girara_session_t* session); /** * Sets the current tab * * @param session The girara session * @param tab The new current tab */ void girara_tab_current_set(girara_session_t* session, girara_tab_t* tab); /** * Sets the shown title of the tab * * @param tab The tab * @param title The new title */ void girara_tab_title_set(girara_tab_t* tab, const char* title); /** * Returns the title of the tab * * @param tab The tab * @return The title of the tab or NULL if an error occured */ const char* girara_tab_title_get(girara_tab_t* tab); /** * Returns the position of the tab * * @param session Girara session * @param tab The tab * @return The id of the tab or -1 if an error occured */ int girara_tab_position_get(girara_session_t* session, girara_tab_t* tab); /** * Sets the new position of the tab * * @param session Girara session * @param tab The tab * @param position The new position */ void girara_tab_position_set(girara_session_t* session, girara_tab_t* tab, unsigned int position); #endif girara-0.1.9/AUTHORS0000644000175000001440000000065612242417112012711 0ustar mockusersgirara is written by: Moritz Lipp Sebastian Ramacher Other contributors are (in no particular order): Pavel Borzenkov William Dealey Oliver Mader Maxime de Roucy Marwan Tanager Benoît Knecht Abdó Roig-Maranges girara-0.1.9/Makefile0000644000175000001440000001336612242417112013303 0ustar mockusers# See LICENSE file for license and copyright information include config.mk include common.mk PROJECTNV = girara PROJECT = girara-gtk${GIRARA_GTK_VERSION} SOURCE = $(wildcard *.c) OBJECTS = ${SOURCE:.c=-gtk${GIRARA_GTK_VERSION}.o} DOBJECTS = ${SOURCE:.c=-gtk${GIRARA_GTK_VERSION}.do} HEADERS = $(filter-out version.h,$(filter-out internal.h,$(wildcard *.h))) HEADERS_INSTALL = ${HEADERS} version.h ifeq (,$(findstring -DGETTEXT_PACKAGE,${CPPFLAGS})) CPPFLAGS += -DGETTEXT_PACKAGE=\"${GETTEXT_PACKAGE}\" endif ifeq (,$(findstring -DLOCALEDIR,${CPPFLAGS})) CPPFLAGS += -DLOCALEDIR=\"${LOCALEDIR}\" endif all: options ${PROJECT} po options: @echo ${PROJECT} build options: @echo "CFLAGS = ${CFLAGS}" @echo "LDFLAGS = ${LDFLAGS}" @echo "DFLAGS = ${DFLAGS}" @echo "CC = ${CC}" version.h: version.h.in config.mk $(QUIET)sed -e 's/GVMAJOR/${GIRARA_VERSION_MAJOR}/' \ -e 's/GVMINOR/${GIRARA_VERSION_MINOR}/' \ -e 's/GVREV/${GIRARA_VERSION_REV}/' version.h.in > version.h %-gtk${GIRARA_GTK_VERSION}.o: %.c @mkdir -p .depend $(ECHO) CC $< $(QUIET)${CC} -c ${CPPFLAGS} ${CFLAGS} -o $@ $< -MMD -MF .depend/$@.dep %-gtk${GIRARA_GTK_VERSION}.do: %.c @mkdir -p .depend $(ECHO) CC $< $(QUIET)${CC} -c ${CPPFLAGS} ${CFLAGS} ${DFLAGS} -o $@ $< -MMD -MF .depend/$@.dep ${OBJECTS}: config.mk version.h ${DOBJECTS}: config.mk version.h ${PROJECT}: static shared static: lib${PROJECT}.a shared: lib${PROJECT}.so.${SOVERSION} lib${PROJECT}.a: ${OBJECTS} $(ECHO) AR rcs $@ $(QUIET)ar rcs $@ ${OBJECTS} lib${PROJECT}.so.${SOVERSION}: ${OBJECTS} $(ECHO) LD $@ $(QUIET)${CC} -Wl,-soname,lib${PROJECT}.so.${SOMAJOR} -shared ${LDFLAGS} -o $@ ${OBJECTS} ${LIBS} clean: $(QUIET)rm -rf ${OBJECTS} ${PROJECT}-${VERSION}.tar.gz \ ${DOBJECTS} lib${PROJECT}.a lib${PROJECT}-debug.a ${PROJECT}.pc doc \ lib$(PROJECT).so.${SOVERSION} lib${PROJECT}-debug.so.${SOVERSION} .depend \ ${PROJECTNV}-${VERSION}.tar.gz version.h *gcda *gcno $(PROJECT).info gcov $(QUIET)${MAKE} -C tests clean $(QUIET)${MAKE} -C po clean ${PROJECT}-debug: lib${PROJECT}-debug.a lib${PROJECT}-debug.so.${SOVERSION} lib${PROJECT}-debug.a: ${DOBJECTS} $(ECHO) AR rcs $@ $(QUIET)ar rc $@ ${DOBJECTS} lib${PROJECT}-debug.so.${SOVERSION}: ${DOBJECTS} $(ECHO) LD $@ $(QUIET)${CC} -Wl,-soname,lib${PROJECT}.so.${SOMAJOR} -shared ${LDFLAGS} -o $@ ${DOBJECTS} ${LIBS} debug: options ${PROJECT}-debug doc: $(QUIET)doxygen Doxyfile gcov: clean $(QUIET)CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage" LDFLAGS="${LDFLAGS} -fprofile-arcs" ${MAKE} $(PROJECT) $(QUIET)CFLAGS="${CFLAGS} -fprofile-arcs -ftest-coverage" LDFLAGS="${LDFLAGS} -fprofile-arcs" ${MAKE} test $(QUIET)lcov --directory . --capture --output-file $(PROJECT).info $(QUIET)genhtml --output-directory gcov $(PROJECT).info test: ${PROJECT} $(QUIET)${MAKE} -C tests run test-debug: debug $(QUIET)${MAKE} -C tests run-debug dist: clean $(QUIET)mkdir -p ${PROJECTNV}-${VERSION} $(QUIET)mkdir -p ${PROJECTNV}-${VERSION}/tests $(QUIET)mkdir -p ${PROJECTNV}-${VERSION}/po $(QUIET)cp LICENSE Makefile config.mk common.mk ${PROJECTNV}.pc.in \ ${HEADERS} internal.h version.h.in README AUTHORS Doxyfile \ ${SOURCE} ${PROJECTNV}-${VERSION} $(QUIET)cp tests/*.c tests/Makefile tests/config.mk ${PROJECTNV}-${VERSION}/tests $(QUIET)cp po/Makefile po/*.po ${PROJECTNV}-${VERSION}/po $(QUIET)tar -cf ${PROJECTNV}-${VERSION}.tar ${PROJECTNV}-${VERSION} $(QUIET)gzip ${PROJECTNV}-${VERSION}.tar $(QUIET)rm -rf ${PROJECTNV}-${VERSION} ${PROJECT}.pc: ${PROJECTNV}.pc.in config.mk $(QUIET)echo project=${PROJECT} > ${PROJECT}.pc $(QUIET)echo version=${VERSION} >> ${PROJECT}.pc $(QUIET)echo includedir=${INCLUDEDIR} >> ${PROJECT}.pc $(QUIET)echo libdir=${LIBDIR} >> ${PROJECT}.pc $(QUIET)echo GTK_VERSION=${GIRARA_GTK_VERSION} >> ${PROJECT}.pc $(QUIET)cat ${PROJECTNV}.pc.in >> ${PROJECT}.pc po: $(QUIET)${MAKE} -C po update-po: $(QUIET)${MAKE} -C po update-po install-static: static $(ECHO) installing static library $(QUIET)mkdir -m 755 -p ${DESTDIR}${LIBDIR} $(QUIET)install -m 644 lib${PROJECT}.a ${DESTDIR}${LIBDIR} install-shared: shared $(ECHO) installing shared library $(QUIET)mkdir -m 755 -p ${DESTDIR}${LIBDIR} $(QUIET)install -m 644 lib${PROJECT}.so.${SOVERSION} ${DESTDIR}${LIBDIR} $(QUIET)ln -sf lib${PROJECT}.so.${SOVERSION} ${DESTDIR}${LIBDIR}/lib${PROJECT}.so.${SOMAJOR} || \ echo "Failed to create lib${PROJECT}.so.${SOMAJOR}. Please check if it exists and points to the correct version of lib${PROJECT}.so." $(QUIET)ln -sf lib${PROJECT}.so.${SOVERSION} ${DESTDIR}${LIBDIR}/lib${PROJECT}.so || \ echo "Failed to create lib${PROJECT}.so. Please check if it exists and points to the correct version of lib${PROJECT}.so." install: options po install-static install-shared install-headers $(QUIET)${MAKE} -C po install install-headers: version.h ${PROJECT}.pc $(ECHO) installing pkgconfig file $(QUIET)mkdir -m 755 -p ${DESTDIR}${LIBDIR}/pkgconfig $(QUIET)install -m 644 ${PROJECT}.pc ${DESTDIR}${LIBDIR}/pkgconfig $(ECHO) installing header files $(QUIET)mkdir -m 755 -p ${DESTDIR}${INCLUDEDIR}/girara $(QUIET)install -m 644 ${HEADERS_INSTALL} ${DESTDIR}${INCLUDEDIR}/girara uninstall: uninstall-headers $(ECHO) removing library file $(QUIET)rm -f ${LIBDIR}/lib${PROJECT}.a ${LIBDIR}/lib${PROJECT}.so.${SOVERSION} \ ${LIBDIR}/lib${PROJECT}.so.${SOMAJOR} ${LIBDIR}/lib${PROJECT}.so $(QUIET)${MAKE} -C po uninstall uninstall-headers: $(ECHO) removing header files $(QUIET)rm -rf ${INCLUDEDIR}/girara $(ECHO) removing pkgconfig file $(QUIET)rm -f ${LIBDIR}/pkgconfig/${PROJECT}.pc .PHONY: all options clean debug doc test dist install install-headers uninstall \ uninstall-headers ${PROJECT} ${PROJECT}-debug po update-po \ static shared install-static install-shared TDEPENDS = ${OBJECTS:.o=.o.dep} DEPENDS = ${TDEPENDS:^=.depend/} -include ${DEPENDS} girara-0.1.9/input-history.h0000644000175000001440000001230112242417112014636 0ustar mockusers/* See LICENSE file for license and copyright information */ #ifndef GIRARA_INPUT_HISTORY_H #define GIRARA_INPUT_HISTORY_H #include #include "types.h" struct girara_input_history_io_interface_s { GTypeInterface parent_iface; /* interface methords */ /** * Write a line of input to the input history storage. * * @param io a GiraraInputHistoryIO object * @param input the input */ void (*append)(GiraraInputHistoryIO* io, const char* input); /** * Read all items from the input history storage. * * @param io a GiraraInputHistoryIO object * @returns a list of inputs */ girara_list_t* (*read)(GiraraInputHistoryIO* io); /* reserved for further methods */ void (*reserved1)(void); void (*reserved2)(void); void (*reserved3)(void); void (*reserved4)(void); }; #define GIRARA_TYPE_INPUT_HISTORY_IO \ (girara_input_history_io_get_type()) #define GIRARA_INPUT_HISTORY_IO(obj) \ (G_TYPE_CHECK_INSTANCE_CAST((obj), GIRARA_TYPE_INPUT_HISTORY_IO, GiraraInputHistoryIO)) #define GIRARA_IS_INPUT_HISTORY_IO(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE((obj), GIRARA_TYPE_INPUT_HISTORY_IO)) #define GIRARA_INPUT_HISTORY_IO_GET_INTERFACE(obj) \ (G_TYPE_INSTANCE_GET_INTERFACE((obj), GIRARA_TYPE_INPUT_HISTORY_IO, GiraraInputHistoryIOInterface)) GType girara_input_history_io_get_type(void); void girara_input_history_io_append(GiraraInputHistoryIO* io, const char* input); girara_list_t* girara_input_history_io_read(GiraraInputHistoryIO* io); struct girara_input_history_s { GObject parent; }; struct girara_input_history_class_s { GObjectClass parent_class; /* methods */ /** * Append a new line of input. If the io property is set, the input will * be passed on to @ref girara_input_history_io_append. * * @param history an input history instance * @param input the input */ void (*append)(GiraraInputHistory* history, const char* input); /** * Get a list of all the inputs stored. * * @param history an input history instance * @returns a list containing all inputs */ girara_list_t* (*list)(GiraraInputHistory* history); /** * Get the "next" input from the history * * @param history an input history instance * @param current_input input used to find the "next" input * @returns "next" input */ const char* (*next)(GiraraInputHistory* history, const char* current_input); /** * Get the "previous" input from the history * * @param history an input history instance * @param current_input input used to find the "next" input * @returns "previous" input */ const char* (*previous)(GiraraInputHistory* history, const char* current_input); /** * Reset state of the input history, i.e reset any information used to * determine the next input. If the io property is set, the history will be * re-read with @ref girara_input_history_io_read. * * @param history an input history instance */ void (*reset)(GiraraInputHistory* history); /* reserved for further methods */ void (*reserved1)(void); void (*reserved2)(void); void (*reserved3)(void); void (*reserved4)(void); }; #define GIRARA_TYPE_INPUT_HISTORY \ (girara_input_history_get_type ()) #define GIRARA_INPUT_HISTORY(obj) \ (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIRARA_TYPE_INPUT_HISTORY, GiraraInputHistory)) #define GIRARA_INPUT_HISTORY_CLASS(obj) \ (G_TYPE_CHECK_CLASS_CAST ((obj), GIRARA_TYPE_INPUT_HISTORY, GiraraInputHistoryClass)) #define GIRARA_IS_INPUT_HISTORY(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIRARA_TYPE_INPUT_HISTORY)) #define GIRARA_IS_INPUT_HISTORY_CLASS(obj) \ (G_TYPE_CHECK_CLASS_TYPE ((obj), GIRARA_TYPE_INPUT_HISTORY)) #define GIRARA_INPUT_HISTORY_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS ((obj), GIRARA_TYPE_INPUT_HISTORY, GiraraInputHistoryClass)) /** * Returns the type of the input history. * * @return the type */ GType girara_input_history_get_type(void); /** * Create new input history object. * * @param io a GiraraInputHistoryIO instance, may be NULL * @returns an input history object */ GiraraInputHistory* girara_input_history_new(GiraraInputHistoryIO* io); /** * Append a new line of input. * * @param history an input history instance * @param input the input */ void girara_input_history_append(GiraraInputHistory* history, const char* input); /** * Get the "next" input from the history * * @param history an input history instance * @param current_input input used to find the "next" input * @returns "next" input */ const char* girara_input_history_next(GiraraInputHistory* history, const char* current_input); /** * Get the "previous" input from the history * * @param history an input history instance * @param current_input input used to find the "next" input * @returns "previous" input */ const char* girara_input_history_previous(GiraraInputHistory* history, const char* current_input); /** * Reset state of the input history * * @param history an input history instance */ void girara_input_history_reset(GiraraInputHistory* history); /** * Get a list of all the inputs stored. * * @param history an input history instance * @returns a list containing all inputs */ girara_list_t* girara_input_history_list(GiraraInputHistory* history); #endif