1
0
Fork 0
mirror of https://github.com/davatorium/rofi.git synced 2025-02-03 15:34:54 -05:00

[Mode] Add some wrappers and use object via accessors.

* Make sure file is only shown once in parsed list, not twice.
This commit is contained in:
Qball Cow 2025-01-26 20:07:04 +01:00
parent 613bc5814c
commit e068ddbc01
4 changed files with 53 additions and 20 deletions

View file

@ -31,9 +31,6 @@
#include <gmodule.h>
G_BEGIN_DECLS
/** ABI version to check if loaded plugin is compatible. */
#define ABI_VERSION 7u
/**
* Indicator what type of mode this is.
* For now it can be the classic switcher, or also implement a completer.

View file

@ -29,7 +29,12 @@
#define ROFI_MODE_H
#include "rofi-types.h"
#include <cairo.h>
#include <gmodule.h>
G_BEGIN_DECLS
/** ABI version to check if loaded plugin is compatible. */
#define ABI_VERSION 7u
/**
* @defgroup MODE Mode
*
@ -277,6 +282,28 @@ ModeMode mode_completer_result(Mode *sw, int menu_retv, char **input,
* @returns TRUE if mode can be used as completer.
*/
gboolean mode_is_completer(const Mode *sw);
/**
* @param sw The mode to query
*
* @returns the modes ABI version.
*/
int mode_get_abi_version(Mode *const mode);
/**
* @param sw The mode to query
* @param mod The GModule used to load the mode
*
* Set GModule used to load this plugin, this is used to
* unload it on shutdown.
*/
void mode_plugin_set_module(Mode *mode, GModule *mod);
/**
* @param sw The mode to query
*
* @returns the GModule used to load this plugin. NULL if not a plugin.
*/
GModule *mode_plugin_get_module(Mode *mode);
/**@}*/
G_END_DECLS
#endif

View file

@ -159,6 +159,11 @@ const char *mode_get_name(const Mode *mode) {
return mode->name;
}
int mode_get_abi_version(Mode *const mode) {
g_assert(mode != NULL);
return mode->abi_version;
}
void mode_free(Mode **mode) {
g_assert(mode != NULL);
g_assert((*mode) != NULL);
@ -245,4 +250,10 @@ gboolean mode_is_completer(const Mode *mode) {
return FALSE;
}
void mode_plugin_set_module(Mode *mode, GModule *mod){
mode->module = mod;
}
GModule *mode_plugin_get_module(Mode *mode){
return mode->module;
}
/**@}*/

View file

@ -74,10 +74,6 @@
#include "timings.h"
// Plugin abi version.
// TODO: move this check to mode.c
#include "mode-private.h"
/** Location of pidfile for this instance. */
char *pidfile = NULL;
/** Location of Cache directory. */
@ -205,7 +201,7 @@ static void run_mode_index(ModeMode mode) {
for (unsigned int i = 0; i < num_modes; i++) {
if (!mode_init(modes[i])) {
GString *str = g_string_new("Failed to initialize the mode: ");
g_string_append(str, modes[i]->name);
g_string_append(str, mode_get_name(modes[i]));
g_string_append(str, "\n");
rofi_view_error_dialog(str->str, ERROR_MSG_MARKUP);
@ -306,7 +302,7 @@ static void print_list_of_modes(int is_term) {
}
printf(" • %s%s%s%s\n", active ? "+" : "",
is_term ? (active ? color_green : color_red) : "",
available_modes[i]->name, is_term ? color_reset : "");
mode_get_name(available_modes[i]), is_term ? color_reset : "");
}
}
static void print_main_application_options(int is_term) {
@ -473,7 +469,7 @@ static void help_print_mode_not_found(const char *mode) {
}
}
g_string_append_printf(str, " * %s%s\n", active ? "+" : "",
available_modes[i]->name);
mode_get_name(available_modes[i]));
}
rofi_add_error_message(str);
}
@ -487,7 +483,7 @@ static void help_print_no_arguments(void) {
g_string_append(emesg, "The following modes are enabled:\n");
for (unsigned int j = 0; j < num_modes; j++) {
g_string_append_printf(emesg, " • <span color=\"green\">%s</span>\n",
modes[j]->name);
mode_get_name(modes[j]));
}
g_string_append(emesg, "\nThe following modes can be enabled:\n");
for (unsigned int i = 0; i < num_available_modes; i++) {
@ -500,7 +496,7 @@ static void help_print_no_arguments(void) {
}
if (!active) {
g_string_append_printf(emesg, " • <span color=\"red\">%s</span>\n",
available_modes[i]->name);
mode_get_name(available_modes[i]));
}
}
g_string_append(emesg, "\nTo activate a mode, add it to the list in "
@ -563,7 +559,7 @@ static void cleanup(void) {
Mode *rofi_collect_modes_search(const char *name) {
for (unsigned int i = 0; i < num_available_modes; i++) {
if (g_strcmp0(name, available_modes[i]->name) == 0) {
if (g_strcmp0(name, mode_get_name(available_modes[i])) == 0) {
return available_modes[i];
}
}
@ -575,7 +571,7 @@ Mode *rofi_collect_modes_search(const char *name) {
* @returns TRUE when success.
*/
static gboolean rofi_collectmodes_add(Mode *mode) {
Mode *m = rofi_collect_modes_search(mode->name);
Mode *m = rofi_collect_modes_search(mode_get_name(mode));
if (m == NULL) {
available_modes =
g_realloc(available_modes, sizeof(Mode *) * (num_available_modes + 1));
@ -603,13 +599,13 @@ static void rofi_collectmodes_dir(const char *base_dir) {
if (mod) {
Mode *m = NULL;
if (g_module_symbol(mod, "mode", (gpointer *)&m)) {
if (m->abi_version != ABI_VERSION) {
if (mode_get_abi_version(m) != ABI_VERSION) {
g_warning("ABI version of plugin: '%s' does not match: %08X "
"expecting: %08X",
dn, m->abi_version, ABI_VERSION);
dn, mode_get_abi_version(m), ABI_VERSION);
g_module_close(mod);
} else {
m->module = mod;
mode_plugin_set_module(m, mod);
if (!rofi_collectmodes_add(m)) {
g_module_close(mod);
}
@ -673,8 +669,8 @@ static void rofi_collectmodes_setup(void) {
}
static void rofi_collectmodes_destroy(void) {
for (unsigned int i = 0; i < num_available_modes; i++) {
if (available_modes[i]->module) {
GModule *mod = available_modes[i]->module;
if (mode_plugin_get_module(available_modes[i])) {
GModule *mod = mode_plugin_get_module(available_modes[i]);
available_modes[i] = NULL;
g_module_close(mod);
}
@ -1073,7 +1069,9 @@ int main(int argc, char *argv[]) {
extern const char *rasi_theme_file_extensions[];
char *file2 =
helper_get_theme_path(config_path, rasi_theme_file_extensions, NULL);
char *filename = rofi_theme_parse_prepare_file(file2);
GFile *gf = g_file_new_for_path(file2);
char *filename = g_file_get_path(gf);
g_object_unref(gf);
g_free(file2);
if (filename && g_file_test(filename, G_FILE_TEST_EXISTS)) {
if (rofi_theme_parse_file(filename)) {