diff --git a/CMakeLists.txt b/CMakeLists.txt index 5cd9c67b4..4c3498653 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,7 @@ add_definitions(-DFALLBACK_CONFIG_DIR=\"${FALLBACK_CONFIG_DIR}\") set(CMAKE_C_FLAGS "-g") set(CMAKE_C_STANDARD 99) set(CMAKE_C_EXTENSIONS OFF) +set(CMAKE_POSITION_INDEPENDENT_CODE ON) set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/bin) add_definitions( -D_GNU_SOURCE @@ -58,6 +59,14 @@ find_package(Pango) find_package(GdkPixbuf) find_package(PAM) +find_package(Backtrace) +if(Backtrace_FOUND) + include_directories("${Backtrace_INCLUDE_DIRS}") + add_definitions(-DSWAY_Backtrace_FOUND=1) + set(LINK_LIBRARIES, "${LINK_LIBRARIES} ${Backtrace_LIBRARIES}") + set(SWAY_Backtrace_HEADER "${Backtrace_HEADER}") +endif() + include(FeatureSummary) include(Manpage) diff --git a/common/CMakeLists.txt b/common/CMakeLists.txt index a40f096d2..387672496 100644 --- a/common/CMakeLists.txt +++ b/common/CMakeLists.txt @@ -6,3 +6,10 @@ add_library(sway-common readline.c stringop.c ) + +if(Backtrace_FOUND) + set_target_properties(sway-common + PROPERTIES + COMPILE_FLAGS "-include ${Backtrace_HEADER}" + ) +endif() diff --git a/common/list.c b/common/list.c index d6f6f2eab..850c85697 100644 --- a/common/list.c +++ b/common/list.c @@ -50,14 +50,8 @@ void list_cat(list_t *list, list_t *source) { } } -// pass the pointer of the object we care about to the comparison function -static int list_cmp(const void *l, const void *r, void *_cmp) { - int (*cmp)(const void *, const void *) = _cmp; - return cmp(*(void**)l, *(void**)r); -} - -void list_sort(list_t *list, int compare(const void *left, const void *right)) { - qsort_r(list->items, list->length, sizeof(void *), list_cmp, compare); +void list_qsort(list_t* list, int compare(const void *left, const void *right)) { + qsort(list->items, list->length, sizeof(void *), compare); } int list_seq_find(list_t *list, int compare(const void *item, const void *data), const void *data) { diff --git a/common/log.c b/common/log.c index 02aac4c1a..f9242bf4d 100644 --- a/common/log.c +++ b/common/log.c @@ -10,7 +10,6 @@ #include #include #include -#include int colored = 1; log_importance_t loglevel_default = L_ERROR; @@ -137,6 +136,7 @@ bool _sway_assert(bool condition, const char* format, ...) { } void error_handler(int sig) { +#if SWAY_Backtrace_FOUND int i; int max_lines = 20; void *array[max_lines]; @@ -155,5 +155,8 @@ void error_handler(int sig) { for (i = 0; (size_t)i < bt_len; i++) { sway_log(L_ERROR, "Backtrace: %s", bt[i]); } +#else + sway_log(L_ERROR, "Error: Signal %d.", sig); +#endif exit(1); } diff --git a/include/config.h b/include/config.h index b97acb578..a915fbedd 100644 --- a/include/config.h +++ b/include/config.h @@ -179,10 +179,12 @@ void free_output_config(struct output_config *oc); int workspace_output_cmp_workspace(const void *a, const void *b); int sway_binding_cmp(const void *a, const void *b); +int sway_binding_cmp_qsort(const void *a, const void *b); int sway_binding_cmp_keys(const void *a, const void *b); void free_sway_binding(struct sway_binding *sb); int sway_mouse_binding_cmp(const void *a, const void *b); +int sway_mouse_binding_cmp_qsort(const void *a, const void *b); int sway_mouse_binding_cmp_buttons(const void *a, const void *b); void free_sway_mouse_binding(struct sway_mouse_binding *smb); diff --git a/include/list.h b/include/list.h index 90d0ad36d..d18d3f545 100644 --- a/include/list.h +++ b/include/list.h @@ -13,8 +13,9 @@ void list_add(list_t *list, void *item); void list_insert(list_t *list, int index, void *item); void list_del(list_t *list, int index); void list_cat(list_t *list, list_t *source); -// See qsort -void list_sort(list_t *list, int compare(const void *left, const void *right)); +// See qsort. Remember to use *_qsort functions as compare functions, +// because they dereference the left and right arguments first! +void list_qsort(list_t *list, int compare(const void *left, const void *right)); // Return index for first item in list that returns 0 for given compare // function or -1 if none matches. int list_seq_find(list_t *list, int compare(const void *item, const void *cmp_to), const void *cmp_to); diff --git a/sway/commands.c b/sway/commands.c index 93c749150..b1b1c5b67 100644 --- a/sway/commands.c +++ b/sway/commands.c @@ -220,7 +220,7 @@ static struct cmd_results *cmd_bindsym(int argc, char **argv) { } binding->order = binding_order++; list_add(mode->bindings, binding); - list_sort(mode->bindings, sway_binding_cmp); + list_qsort(mode->bindings, sway_binding_cmp_qsort); sway_log(L_DEBUG, "bindsym - Bound %s to command %s", argv[0], binding->command); return cmd_results_new(CMD_SUCCESS, NULL, NULL); @@ -1266,9 +1266,9 @@ static struct cmd_results *cmd_scratchpad(int argc, char **argv) { } // sort in order of longest->shortest -static int compare_set(const void *_l, const void *_r) { - struct sway_variable const *l = _l; - struct sway_variable const *r = _r; +static int compare_set_qsort(const void *_l, const void *_r) { + struct sway_variable const *l = *(void **)_l; + struct sway_variable const *r = *(void **)_r; return strlen(r->name) - strlen(l->name); } @@ -1295,7 +1295,7 @@ static struct cmd_results *cmd_set(int argc, char **argv) { var = malloc(sizeof(struct sway_variable)); var->name = strdup(argv[0]); list_add(config->symbols, var); - list_sort(config->symbols, compare_set); + list_qsort(config->symbols, compare_set_qsort); } var->value = join_args(argv + 1, argc - 1); return cmd_results_new(CMD_SUCCESS, NULL, NULL); @@ -1631,7 +1631,7 @@ static struct cmd_results *bar_cmd_bindsym(int argc, char **argv) { list_del(bar->bindings, i); } list_add(bar->bindings, binding); - list_sort(bar->bindings, sway_mouse_binding_cmp); + list_qsort(bar->bindings, sway_mouse_binding_cmp_qsort); sway_log(L_DEBUG, "bindsym - Bound %s to command %s when clicking swaybar", argv[0], binding->command); return cmd_results_new(CMD_SUCCESS, NULL, NULL); diff --git a/sway/config.c b/sway/config.c index 257bb8723..853a71119 100644 --- a/sway/config.c +++ b/sway/config.c @@ -642,6 +642,10 @@ int sway_binding_cmp(const void *a, const void *b) { return lenient_strcmp(binda->command, bindb->command); } +int sway_binding_cmp_qsort(const void *a, const void *b) { + return sway_binding_cmp(*(void **)a, *(void **)b); +} + void free_sway_binding(struct sway_binding *binding) { if (binding->keys) { for (int i = 0; i < binding->keys->length; i++) { @@ -675,6 +679,10 @@ int sway_mouse_binding_cmp(const void *a, const void *b) { return lenient_strcmp(binda->command, bindb->command); } +int sway_mouse_binding_cmp_qsort(const void *a, const void *b) { + return sway_mouse_binding_cmp(*(void **)a, *(void **)b); +} + void free_sway_mouse_binding(struct sway_mouse_binding *binding) { if (binding->command) { free(binding->command); diff --git a/sway/debug_log.c b/sway/debug_log.c index 8b30ed454..6fd6422fa 100644 --- a/sway/debug_log.c +++ b/sway/debug_log.c @@ -10,7 +10,6 @@ #include #include #include -#include #include "workspace.h" extern log_importance_t v;