|
|
|
#include "e.h"
|
|
|
|
|
|
|
|
E_API E_Config *e_config = NULL;
|
|
|
|
E_API E_Config_Bindings *e_bindings = NULL;
|
|
|
|
|
|
|
|
static int _e_config_revisions = 9;
|
|
|
|
|
|
|
|
/* local subsystem functions */
|
|
|
|
static void _e_config_save_cb(void *data);
|
|
|
|
static void _e_config_free(E_Config *cfg);
|
|
|
|
static Eina_Bool _e_config_cb_timer(void *data);
|
|
|
|
|
|
|
|
/* local subsystem globals */
|
|
|
|
static int _e_config_save_block = 0;
|
|
|
|
static E_Powersave_Deferred_Action *_e_config_save_defer = NULL;
|
|
|
|
static const char *_e_config_profile = NULL;
|
|
|
|
|
|
|
|
static E_Config_DD *_e_config_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_binding_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_module_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_font_fallback_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_font_default_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_theme_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_bindings_mouse_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_bindings_key_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_bindings_edge_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_bindings_signal_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_bindings_wheel_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_bindings_acpi_edd = NULL;
|
Introduce gesture recognition
This is currently using libinputs gesture recognition. And offers a
config screen to setup new gestures.
1. No default gesture bindings are setup
2. When libinput is not available the module is not going to be loaded,
and nothing is recognited.+
3. Only swipe gestures are recognized yet.
4. For now, you are required to be part of the input group, otherwise we cannot
get the libinput events. (See Todo 1)
5. The visual representation is not really good. In terms of UI, it is
visually showing a value coming from left to right, which is
indicating a direction, which is not always the direction of the
gesture, which is kind of bad. More improvements needed here.
Some things that still can be done:
1. The whole libinput things should be handled by elput, either with the
input group hack, or logind, or simply by root. The ideal idea would
be that e_sys is creating the elput context, which also listens for new
devices etc.. When all this is done, and it recognizes a new device, it
can simply sent a message from e_sys to e, that there is some new
device, with a opened fd. (However, this all needs to be locked up in a
way that e_sys cannot be abused)
3 years ago
|
|
|
static E_Config_DD *_e_config_bindings_swipe_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_path_append_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_desktop_bg_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_desklock_bg_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_desktop_name_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_menu_applications_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_color_class_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_gadcon_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_gadcon_client_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_shelf_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_shelf_desk_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_mime_icon_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_syscon_action_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_env_var_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_xkb_layout_edd = NULL;
|
|
|
|
static E_Config_DD *_e_config_xkb_option_edd = NULL;
|
|
|
|
|
|
|
|
E_API int E_EVENT_CONFIG_ICON_THEME = 0;
|
|
|
|
E_API int E_EVENT_CONFIG_MODE_CHANGED = 0;
|
|
|
|
E_API int E_EVENT_CONFIG_LOADED = 0;
|
|
|
|
|
|
|
|
static Eina_Lock _e_config_pending_files_lock;
|
|
|
|
static Eina_Hash *_e_config_pending_files = NULL;
|
|
|
|
static Eina_Thread_Queue *_e_config_thread_thq = NULL;
|
|
|
|
|
|
|
|
static Eina_List *handlers = NULL;
|
|
|
|
|
|
|
|
typedef struct _E_Color_Class
|
|
|
|
{
|
|
|
|
const char *name; /* stringshared name */
|
|
|
|
int r, g, b, a;
|
|
|
|
int r2, g2, b2, a2;
|
|
|
|
int r3, g3, b3, a3;
|
|
|
|
} E_Color_Class;
|
|
|
|
|
|
|
|
typedef enum
|
|
|
|
{
|
|
|
|
E_CONFIG_SAVE_THREAD_SAVE,
|
|
|
|
E_CONFIG_SAVE_THREAD_QUIT
|
|
|
|
} E_Config_Save_Thread_Message_Type;
|
|
|
|
|
|
|
|
typedef struct _E_Config_Save_Thread_Message
|
|
|
|
{
|
|
|
|
Eina_Thread_Queue_Msg head;
|
|
|
|
E_Config_Save_Thread_Message_Type type;
|
|
|
|
char *path, *destpath;
|
|
|
|
} E_Config_Save_Thread_Message;
|
|
|
|
|
|
|
|
static Eina_Bool
|
|
|
|
_e_config_cb_efreet_cache_update(void *data EINA_UNUSED, int type EINA_UNUSED, void *ev EINA_UNUSED)
|
|
|
|
{
|
|
|
|
if (e_config)
|
|
|
|
{
|
|
|
|
if (e_config->icon_theme)
|
|
|
|
{
|
|
|
|
if (!efreet_icon_theme_find(e_config->icon_theme))
|
|
|
|
{
|
|
|
|
eina_stringshare_replace(&e_config->icon_theme, "hicolor");
|
|
|
|
e_config_save_queue();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return ECORE_CALLBACK_RENEW;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
static const char *
|
|
|
|
_e_config_profile_name_get(Eet_File *ef)
|
|
|
|
{
|
|
|
|
/* profile config exists */
|
|
|
|
char *data;
|
|
|
|
const char *s = NULL;
|
|
|
|
int data_len = 0;
|
|
|
|
|
|
|
|
data = eet_read(ef, "config", &data_len);
|
|
|
|
if ((data) && (data_len > 0))
|
|
|
|
{
|
|
|
|
int ok = 1;
|
|
|
|
|
|
|
|
for (s = data; s < (data + data_len); s++)
|
|
|
|
{
|
|
|
|
// if profile is not all ascii (valid printable ascii - no
|
|
|
|
// control codes etc.) or it contains a '/' (invalid as its a
|
|
|
|
// directory delimiter) - then it's invalid
|
|
|
|
if ((*s < ' ') || (*s > '~') || (*s == '/'))
|
|
|
|
{
|
|
|
|
ok = 0;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
s = NULL;
|
|
|
|
if (ok)
|
|
|
|
s = eina_stringshare_add_length(data, data_len);
|
|
|
|
free(data);
|
|
|
|
}
|
|
|
|
return s;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eet_File *
|
|
|
|
_e_config_pending_file_find(const char *path)
|
|
|
|
{
|
|
|
|
Eet_File *ef, *ef2;
|
|
|
|
|
|
|
|
eina_lock_take(&_e_config_pending_files_lock);
|
|
|
|
ef = eina_hash_find(_e_config_pending_files, path);
|
|
|
|
if (!ef)
|
|
|
|
{
|
|
|
|
eina_lock_release(&_e_config_pending_files_lock);
|
|
|
|
// do this unlocked as it could block for a while
|
|
|
|
ef = eet_open(path, EET_FILE_MODE_WRITE);
|
|
|
|
eina_lock_take(&_e_config_pending_files_lock);
|
|
|
|
if (ef)
|
|
|
|
{
|
|
|
|
// handle race due to the above unlock and lock - should be
|
|
|
|
// super rare...
|
|
|
|
ef2 = eina_hash_find(_e_config_pending_files, path);
|
|
|
|
if (ef2)
|
|
|
|
{
|
|
|
|
eina_hash_del(_e_config_pending_files, path, ef2);
|
|
|
|
eet_close(ef2);
|
|
|
|
}
|
|
|
|
eina_hash_add(_e_config_pending_files, path, ef);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
printf("CF: Error: file find %s - create new fail\n", path);
|
|
|
|
}
|
|
|
|
eina_lock_release(&_e_config_pending_files_lock);
|
|
|
|
return ef;
|
|
|
|
}
|
|
|
|
|
|
|
|
static Eina_Bool
|
|
|
|
_e_config_pending_file_del(const char *path)
|
|
|
|
{
|
|
|
|
Eet_File *ef;
|
|
|
|
Eina_Bool ok = EINA_FALSE;
|
|
|
|
|
|
|
|
eina_lock_take(&_e_config_pending_files_lock);
|
|
|
|
ef = eina_hash_find(_e_config_pending_files, path);
|
|
|
|
if (ef)
|
|
|
|
{
|
|
|
|
Eet_Error err;
|
|
|
|
const char *erstr = "";
|
|
|
|
|
|
|
|
eina_hash_del(_e_config_pending_files, path, ef);
|
|
|
|
eina_lock_release(&_e_config_pending_files_lock);
|
|
|
|
err = eet_close(ef);
|
|
|
|
switch (err)
|
|
|
|
{
|
|
|
|
case EET_ERROR_NONE:
|
|
|
|
ok = EINA_TRUE;
|
|
|
|
/* all good - no error */
|
|
|
|
break;
|
|
|
|
case EET_ERROR_BAD_OBJECT:
|
|
|
|
erstr = _("The EET file handle is bad.");
|
|
|
|
break;
|
|
|
|
case EET_ERROR_EMPTY:
|
|
|
|
erstr = _("The file data is empty.");
|
|
|
|
break;
|
|
|
|
case EET_ERROR_NOT_WRITABLE:
|
|
|
|
erstr = _("The file is not writable. Perhaps the disk is read-only<ps/>or you lost permissions to your files.");
|
|
|
|
break;
|
|
|
|
case EET_ERROR_OUT_OF_MEMORY:
|
|
|
|
erstr = _("Memory ran out while preparing the write.<ps/>Please free up memory.");
|
|
|
|
break;
|
|
|
|
case EET_ERROR_WRITE_ERROR:
|
|
|
|
erstr = _("This is a generic error.");
|
|
|
|
break;
|
|
|
|
case EET_ERROR_WRITE_ERROR_FILE_TOO_BIG:
|
|
|
|
erstr = _("The settings file is too large.<ps/>It should be very small (a few hundred KB at most).");
|
|
|
|
break;
|
|
|
|
case EET_ERROR_WRITE_ERROR_IO_ERROR:
|
|
|
|
erstr = _("You have I/O errors on the disk.<ps/>Maybe it needs replacing?");
|
|
|
|
break;
|
|
|
|
case EET_ERROR_WRITE_ERROR_OUT_OF_SPACE:
|
|
|
|
erstr = _("You ran out of space while writing the file.");
|
|
|
|
break;
|
|
|
|
case EET_ERROR_WRITE_ERROR_FILE_CLOSED:
|
|
|
|
erstr = _("The file was closed while writing.");
|
|
|
|
break;
|
|
|
|
case EET_ERROR_MMAP_FAILED:
|
|
|
|
erstr = _("Memory-mapping (mmap) of the file failed.");
|
|
|
|
break;
|
|
|
|
case EET_ERROR_X509_ENCODING_FAILED:
|
|
|
|
erstr = _("X509 Encoding failed.");
|
|
|
|
break;
|
|
|
|
case EET_ERROR_SIGNATURE_FAILED:
|
|
|
|
erstr = _("Signature failed.");
|
|
|
|
break;
|
|
|
|
case EET_ERROR_INVALID_SIGNATURE:
|
|
|
|
erstr = _("The signature was invalid.");
|
|
|
|
break;
|
|
|
|
case EET_ERROR_NOT_SIGNED:
|
|
|
|
erstr = _("Not signed.");
|
|
|
|
break;
|
|
|
|
case EET_ERROR_NOT_IMPLEMENTED:
|
|
|
|
erstr = _("Feature not implemented.");
|
|
|
|
break;
|
|
|
|
case EET_ERROR_PRNG_NOT_SEEDED:
|
|
|
|
erstr = _("PRNG was not seeded.");
|
|
|
|
break;
|
|
|
|
case EET_ERROR_ENCRYPT_FAILED:
|
|
|
|
erstr = _("Encryption failed.");
|
|
|
|
break;
|
|
|
|
case EET_ERROR_DECRYPT_FAILED:
|
|
|
|
erstr = _("Decryption failed.");
|
|
|
|
break;
|
|
|
|
default: /* if we get here eet added errors we don't know */
|
|
|
|
erstr = _("The error is unknown to Enlightenment.");
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
if (!ok) printf("CF: Write Error: %s\n", erstr);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
eina_lock_release(&_e_config_pending_files_lock);
|
|
|
|
return ok;
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_config_save_thread_main(void *data EINA_UNUSED, Ecore_Thread *eth)
|
|
|
|
{
|
|
|
|
E_Config_Save_Thread_Message *msg;
|
|
|
|
void *ref;
|
|
|
|
Eina_Bool run = EINA_TRUE;
|
|
|
|
|
|
|
|
while (run)
|
|
|
|
{
|
|
|
|
msg = eina_thread_queue_wait(_e_config_thread_thq, &ref);
|
|
|
|
switch (msg->type)
|
|
|
|
{
|
|
|
|
case E_CONFIG_SAVE_THREAD_SAVE:
|
|
|
|
if (_e_config_pending_file_del(msg->path))
|
|
|
|
{
|
|
|
|
Eina_Bool ret = EINA_TRUE;
|
|
|
|
|
|
|
|
if (_e_config_revisions > 0)
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
char bsrc[4096], bdst[4096];
|
|
|
|
|
|
|
|
for (i = _e_config_revisions; i > 1; i--)
|
|
|
|
{
|
|
|
|
snprintf(bsrc, sizeof(bsrc), "%s.%i", msg->destpath, i - 1);
|
|
|
|
snprintf(bdst, sizeof(bdst), "%s.%i", msg->destpath, i);
|
|
|
|
if ((ecore_file_exists(bsrc)) &&
|
|
|
|
(ecore_file_size(bsrc)))
|
|
|
|
{
|
|
|
|
ret = ecore_file_mv(bsrc, bdst);
|
|
|
|
if (!ret)
|
|
|
|
{
|
|
|
|
printf("CF: Error: Can't rename %s to %s\n", bsrc, bdst);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (ret)
|
|
|
|
{
|
|
|
|
snprintf(bdst, sizeof(bdst), "%s.1", msg->destpath);
|
|
|
|
ecore_file_mv(msg->destpath, bdst);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!ecore_file_mv(msg->path, msg->destpath))
|
|
|
|
printf("CF: Error: Can't rename %s to %s\n", msg->path, msg->destpath);
|
|
|
|
// open another tmp file now in a thread ready for writes next
|
|
|
|
// time. This can just dangle - no harm
|
|
|
|
_e_config_pending_file_find(msg->path);
|
|
|
|
ecore_thread_feedback(eth, strdup(msg->destpath));
|
|
|
|
}
|
|
|
|
free(msg->path);
|
|
|
|
free(msg->destpath);
|
|
|
|
break;
|
|
|
|
case E_CONFIG_SAVE_THREAD_QUIT:
|
|
|
|
run = EINA_FALSE;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
eina_thread_queue_wait_done(_e_config_thread_thq, ref);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_config_save_thread_notify(void *data EINA_UNUSED, Ecore_Thread *eth EINA_UNUSED, void *msgdata)
|
|
|
|
{
|
|
|
|
char *path = msgdata;
|
|
|
|
free(path);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_config_save_thread_end(void *data EINA_UNUSED, Ecore_Thread *eth EINA_UNUSED)
|
|
|
|
{
|
|
|
|
ecore_main_loop_quit();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_config_save_thread_cancel(void *data EINA_UNUSED, Ecore_Thread *eth EINA_UNUSED)
|
|
|
|
{
|
|
|
|
ecore_main_loop_quit();
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_config_save_thread_send(E_Config_Save_Thread_Message_Type type, const char *path, const char *destpath)
|
|
|
|
{
|
|
|
|
E_Config_Save_Thread_Message *msg;
|
|
|
|
void *ref;
|
|
|
|
|
|
|
|
msg = eina_thread_queue_send
|
|
|
|
(_e_config_thread_thq, sizeof(E_Config_Save_Thread_Message), &ref);
|
|
|
|
msg->type = type;
|
|
|
|
if (path) msg->path = strdup(path);
|
|
|
|
else msg->path = NULL;
|
|
|
|
if (destpath) msg->destpath = strdup(destpath);
|
|
|
|
else msg->destpath = NULL;
|
|
|
|
eina_thread_queue_send_done(_e_config_thread_thq, ref);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_config_edd_shutdown(void)
|
|
|
|
{
|
|
|
|
E_CONFIG_DD_FREE(_e_config_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_module_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_font_default_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_font_fallback_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_theme_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_path_append_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_desktop_bg_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_desklock_bg_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_desktop_name_edd);
|
|
|
|
E_CONFIG_DD_FREE(e_remember_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_menu_applications_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_gadcon_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_gadcon_client_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_shelf_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_shelf_desk_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_mime_icon_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_syscon_action_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_env_var_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_xkb_layout_edd);
|
|
|
|
E_CONFIG_DD_FREE(_e_config_xkb_option_edd);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void
|
|
|
|
_e_config_edd_init(Eina_Bool old)
|
|
|
|
{
|
|
|
|
|
|
|
|
_e_config_gadcon_client_edd = E_CONFIG_DD_NEW("E_Config_Gadcon_Client", E_Config_Gadcon_Client);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Config_Gadcon_Client
|
|
|
|
#define D _e_config_gadcon_client_edd
|
|
|
|
E_CONFIG_VAL(D, T, name, STR);
|
|
|
|
E_CONFIG_VAL(D, T, id, STR);
|
|
|
|
E_CONFIG_VAL(D, T, geom.pos, INT);
|
|
|
|
E_CONFIG_VAL(D, T, geom.size, INT);
|
|
|
|
E_CONFIG_VAL(D, T, geom.res, INT);
|
|
|
|
E_CONFIG_VAL(D, T, geom.pos_x, DOUBLE);
|
|
|
|
E_CONFIG_VAL(D, T, geom.pos_y, DOUBLE);
|
|
|
|
E_CONFIG_VAL(D, T, geom.size_w, DOUBLE);
|
|
|
|
E_CONFIG_VAL(D, T, geom.size_h, DOUBLE);
|
|
|
|
E_CONFIG_VAL(D, T, state_info.seq, INT);
|
|
|
|
E_CONFIG_VAL(D, T, state_info.flags, INT);
|
|
|
|
E_CONFIG_VAL(D, T, style, STR);
|
|
|
|
E_CONFIG_VAL(D, T, orient, INT);
|
|
|
|
E_CONFIG_VAL(D, T, autoscroll, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, resizable, UCHAR);
|
|
|
|
|
|
|
|
_e_config_gadcon_edd = E_CONFIG_DD_NEW("E_Config_Gadcon", E_Config_Gadcon);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Config_Gadcon
|
|
|
|
#define D _e_config_gadcon_edd
|
|
|
|
E_CONFIG_VAL(D, T, name, STR);
|
|
|
|
E_CONFIG_VAL(D, T, id, INT);
|
|
|
|
E_CONFIG_VAL(D, T, zone, UINT);
|
|
|
|
E_CONFIG_LIST(D, T, clients, _e_config_gadcon_client_edd);
|
|
|
|
|
|
|
|
_e_config_shelf_desk_edd = E_CONFIG_DD_NEW("E_Config_Shelf_Desk", E_Config_Shelf_Desk);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Config_Shelf_Desk
|
|
|
|
#define D _e_config_shelf_desk_edd
|
|
|
|
E_CONFIG_VAL(D, T, x, INT);
|
|
|
|
E_CONFIG_VAL(D, T, y, INT);
|
|
|
|
|
|
|
|
_e_config_shelf_edd = E_CONFIG_DD_NEW("E_Config_Shelf", E_Config_Shelf);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Config_Shelf
|
|
|
|
#define D _e_config_shelf_edd
|
|
|
|
E_CONFIG_VAL(D, T, name, STR);
|
|
|
|
E_CONFIG_VAL(D, T, id, INT);
|
|
|
|
E_CONFIG_VAL(D, T, zone, INT);
|
|
|
|
E_CONFIG_VAL(D, T, layer, INT);
|
|
|
|
E_CONFIG_VAL(D, T, popup, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, orient, INT);
|
|
|
|
E_CONFIG_VAL(D, T, fit_along, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, fit_size, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, style, STR);
|
|
|
|
E_CONFIG_VAL(D, T, size, INT);
|
|
|
|
E_CONFIG_VAL(D, T, overlap, INT);
|
|
|
|
E_CONFIG_VAL(D, T, autohide, INT);
|
|
|
|
E_CONFIG_VAL(D, T, autohide_show_action, INT);
|
|
|
|
E_CONFIG_VAL(D, T, hide_timeout, FLOAT);
|
|
|
|
E_CONFIG_VAL(D, T, hide_duration, FLOAT);
|
|
|
|
E_CONFIG_VAL(D, T, desk_show_mode, INT);
|
|
|
|
E_CONFIG_LIST(D, T, desk_list, _e_config_shelf_desk_edd);
|
|
|
|
|
|
|
|
_e_config_desklock_bg_edd = E_CONFIG_DD_NEW("E_Config_Desklock_Background", E_Config_Desklock_Background);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Config_Desklock_Background
|
|
|
|
#define D _e_config_desklock_bg_edd
|
|
|
|
E_CONFIG_VAL(D, T, file, STR);
|
|
|
|
E_CONFIG_VAL(D, T, hide_logo, UCHAR);
|
|
|
|
|
|
|
|
_e_config_desktop_bg_edd = E_CONFIG_DD_NEW("E_Config_Desktop_Background", E_Config_Desktop_Background);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Config_Desktop_Background
|
|
|
|
#define D _e_config_desktop_bg_edd
|
|
|
|
E_CONFIG_VAL(D, T, zone, INT);
|
|
|
|
E_CONFIG_VAL(D, T, desk_x, INT);
|
|
|
|
E_CONFIG_VAL(D, T, desk_y, INT);
|
|
|
|
E_CONFIG_VAL(D, T, file, STR);
|
|
|
|
|
|
|
|
_e_config_desktop_name_edd = E_CONFIG_DD_NEW("E_Config_Desktop_Name", E_Config_Desktop_Name);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Config_Desktop_Name
|
|
|
|
#define D _e_config_desktop_name_edd
|
|
|
|
E_CONFIG_VAL(D, T, zone, INT);
|
|
|
|
E_CONFIG_VAL(D, T, desk_x, INT);
|
|
|
|
E_CONFIG_VAL(D, T, desk_y, INT);
|
|
|
|
E_CONFIG_VAL(D, T, name, STR);
|
|
|
|
|
|
|
|
_e_config_path_append_edd = E_CONFIG_DD_NEW("E_Path_Dir", E_Path_Dir);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Path_Dir
|
|
|
|
#define D _e_config_path_append_edd
|
|
|
|
E_CONFIG_VAL(D, T, dir, STR);
|
|
|
|
|
|
|
|
_e_config_module_edd = E_CONFIG_DD_NEW("E_Config_Module", E_Config_Module);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Config_Module
|
|
|
|
#define D _e_config_module_edd
|
|
|
|
E_CONFIG_VAL(D, T, name, STR);
|
|
|
|
E_CONFIG_VAL(D, T, enabled, UCHAR);
|
|
|
|
|
|
|
|
_e_config_font_default_edd = E_CONFIG_DD_NEW("E_Font_Default",
|
|
|
|
E_Font_Default);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Font_Default
|
|
|
|
#define D _e_config_font_default_edd
|
|
|
|
E_CONFIG_VAL(D, T, text_class, STR);
|
|
|
|
E_CONFIG_VAL(D, T, font, STR);
|
|
|
|
E_CONFIG_VAL(D, T, size, INT);
|
|
|
|
|
|
|
|
_e_config_font_fallback_edd = E_CONFIG_DD_NEW("E_Font_Fallback",
|
|
|
|
E_Font_Fallback);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Font_Fallback
|
|
|
|
#define D _e_config_font_fallback_edd
|
|
|
|
E_CONFIG_VAL(D, T, name, STR);
|
|
|
|
|
|
|
|
_e_config_menu_applications_edd = E_CONFIG_DD_NEW("E_Int_Menu_Applications",
|
|
|
|
E_Int_Menu_Applications);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Int_Menu_Applications
|
|
|
|
#define D _e_config_menu_applications_edd
|
|
|
|
E_CONFIG_VAL(D, T, orig_path, STR);
|
|
|
|
E_CONFIG_VAL(D, T, try_exec, STR);
|
|
|
|
E_CONFIG_VAL(D, T, exec, STR);
|
|
|
|
E_CONFIG_VAL(D, T, load_time, LL);
|
|
|
|
E_CONFIG_VAL(D, T, exec_valid, INT);
|
|
|
|
|
|
|
|
e_remember_edd = E_CONFIG_DD_NEW("E_Remember", E_Remember);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Remember
|
|
|
|
#define D e_remember_edd
|
|
|
|
E_CONFIG_VAL(D, T, version, UINT);
|
|
|
|
E_CONFIG_VAL(D, T, match, INT);
|
|
|
|
E_CONFIG_VAL(D, T, no_reopen, INT);
|
|
|
|
E_CONFIG_VAL(D, T, apply_first_only, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, keep_settings, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, name, STR);
|
|
|
|
E_CONFIG_VAL(D, T, class, STR);
|
|
|
|
E_CONFIG_VAL(D, T, title, STR);
|
|
|
|
E_CONFIG_VAL(D, T, role, STR);
|
|
|
|
E_CONFIG_VAL(D, T, type, INT);
|
|
|
|
E_CONFIG_VAL(D, T, transient, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, apply, INT);
|
|
|
|
E_CONFIG_VAL(D, T, max_score, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.pos_x, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.pos_y, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.res_x, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.res_y, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.pos_w, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.pos_h, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.frame_w, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.frame_h, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.w, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.h, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.layer, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.maximize, UINT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_user_location, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_client_location, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_user_size, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_client_size, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_user_stacking, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_client_stacking, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_user_iconify, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_client_iconify, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_user_desk, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_client_desk, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_user_sticky, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_client_sticky, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_user_shade, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_client_shade, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_user_maximize, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_client_maximize, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_user_fullscreen, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_client_fullscreen, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_border, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_close, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_focus_in, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_focus_out, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.lock_life, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.border, STR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.sticky, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.shaded, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.skip_winlist, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.skip_pager, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.skip_taskbar, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.fullscreen, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.desk_x, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.desk_y, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.zone, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.command, STR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.icon_preference, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.desktop_file, STR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.offer_resistance, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.opacity, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, prop.volume, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.volume_min, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.volume_max, INT);
|
|
|
|
E_CONFIG_VAL(D, T, prop.mute, UCHAR);
|
|
|
|
E_CONFIG_VAL(D, T, uuid, STR);
|
|
|
|
E_CONFIG_VAL(D, T, pid, INT);
|
|
|
|
|
|
|
|
_e_config_color_class_edd = E_CONFIG_DD_NEW("E_Color_Class", E_Color_Class);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Color_Class
|
|
|
|
#define D _e_config_color_class_edd
|
|
|
|
E_CONFIG_VAL(D, T, name, STR);
|
|
|
|
E_CONFIG_VAL(D, T, r, INT);
|
|
|
|
E_CONFIG_VAL(D, T, g, INT);
|
|
|
|
E_CONFIG_VAL(D, T, b, INT);
|
|
|
|
E_CONFIG_VAL(D, T, a, INT);
|
|
|
|
E_CONFIG_VAL(D, T, r2, INT);
|
|
|
|
E_CONFIG_VAL(D, T, g2, INT);
|
|
|
|
E_CONFIG_VAL(D, T, b2, INT);
|
|
|
|
E_CONFIG_VAL(D, T, a2, INT);
|
|
|
|
E_CONFIG_VAL(D, T, r3, INT);
|
|
|
|
E_CONFIG_VAL(D, T, g3, INT);
|
|
|
|
E_CONFIG_VAL(D, T, b3, INT);
|
|
|
|
E_CONFIG_VAL(D, T, a3, INT);
|
|
|
|
|
|
|
|
_e_config_mime_icon_edd = E_CONFIG_DD_NEW("E_Config_Mime_Icon",
|
|
|
|
E_Config_Mime_Icon);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Config_Mime_Icon
|
|
|
|
#define D _e_config_mime_icon_edd
|
|
|
|
E_CONFIG_VAL(D, T, mime, STR);
|
|
|
|
E_CONFIG_VAL(D, T, icon, STR);
|
|
|
|
|
|
|
|
_e_config_syscon_action_edd = E_CONFIG_DD_NEW("E_Config_Syscon_Action",
|
|
|
|
E_Config_Syscon_Action);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Config_Syscon_Action
|
|
|
|
#define D _e_config_syscon_action_edd
|
|
|
|
E_CONFIG_VAL(D, T, action, STR);
|
|
|
|
E_CONFIG_VAL(D, T, params, STR);
|
|
|
|
E_CONFIG_VAL(D, T, button, STR);
|
|
|
|
E_CONFIG_VAL(D, T, icon, STR);
|
|
|
|
E_CONFIG_VAL(D, T, is_main, INT);
|
|
|
|
|
|
|
|
_e_config_env_var_edd = E_CONFIG_DD_NEW("E_Config_Env_Var",
|
|
|
|
E_Config_Env_Var);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Config_Env_Var
|
|
|
|
#define D _e_config_env_var_edd
|
|
|
|
E_CONFIG_VAL(D, T, var, STR);
|
|
|
|
E_CONFIG_VAL(D, T, val, STR);
|
|
|
|
E_CONFIG_VAL(D, T, unset, UCHAR);
|
|
|
|
|
|
|
|
_e_config_xkb_layout_edd = E_CONFIG_DD_NEW("E_Config_XKB_Layout",
|
|
|
|
E_Config_XKB_Layout);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Config_XKB_Layout
|
|
|
|
#define D _e_config_xkb_layout_edd
|
|
|
|
E_CONFIG_VAL(D, T, name, STR);
|
|
|
|
E_CONFIG_VAL(D, T, model, STR);
|
|
|
|
E_CONFIG_VAL(D, T, variant, STR);
|
|
|
|
|
|
|
|
_e_config_xkb_option_edd = E_CONFIG_DD_NEW("E_Config_XKB_Option",
|
|
|
|
E_Config_XKB_Option);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Config_XKB_Option
|
|
|
|
#define D _e_config_xkb_option_edd
|
|
|
|
E_CONFIG_VAL(D, T, name, STR);
|
|
|
|
|
|
|
|
_e_config_edd = E_CONFIG_DD_NEW("E_Config", E_Config);
|
|
|
|
#undef T
|
|
|
|
#undef D
|
|
|
|
#define T E_Config
|
|
|
|
#define D _e_config_edd
|
|
|
|
/**/ /* == already configurable via ipc */
|
|
|
|
E_CONFIG_VAL(D, T, config_version, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, config_type, UINT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, desktop_default_background, STR); /**/
|
|
|
|
E_CONFIG_LIST(D, T, desktop_backgrounds, _e_config_desktop_bg_edd); /**/
|
|
|
|
E_CONFIG_LIST(D, T, desktop_names, _e_config_desktop_name_edd); /**/
|
|
|
|
E_CONFIG_VAL(D, T, menus_scroll_speed, DOUBLE); /**/
|
|
|
|
E_CONFIG_VAL(D, T, menus_fast_mouse_move_threshhold, DOUBLE); /**/
|
|
|
|
E_CONFIG_VAL(D, T, menus_click_drag_timeout, DOUBLE); /**/
|
|
|
|
E_CONFIG_VAL(D, T, window_maximize_animate, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, window_maximize_transition, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, window_maximize_time, DOUBLE); /**/
|
|
|
|
E_CONFIG_VAL(D, T, border_shade_animate, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, border_shade_transition, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, border_shade_speed, DOUBLE); /**/
|
|
|
|
E_CONFIG_VAL(D, T, priority, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, zone_desks_x_count, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, zone_desks_y_count, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, show_desktop_icons, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, edge_flip_dragging, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, language, STR); /**/
|
|
|
|
E_CONFIG_VAL(D, T, desklock_language, STR); /**/
|
|
|
|
E_CONFIG_LIST(D, T, modules, _e_config_module_edd); /**/
|
|
|
|
EET_DATA_DESCRIPTOR_ADD_LIST_STRING(D, T, "bad_modules", bad_modules);
|
|
|
|
E_CONFIG_LIST(D, T, font_fallbacks, _e_config_font_fallback_edd); /**/
|
|
|
|
E_CONFIG_LIST(D, T, font_defaults, _e_config_font_default_edd); /**/
|
|
|
|
E_CONFIG_LIST(D, T, mouse_bindings, _e_config_bindings_mouse_edd); /**/
|
|
|
|
E_CONFIG_LIST(D, T, key_bindings, _e_config_bindings_key_edd); /**/
|
|
|
|
E_CONFIG_LIST(D, T, edge_bindings, _e_config_bindings_edge_edd); /**/
|
|
|
|
E_CONFIG_LIST(D, T, signal_bindings, _e_config_bindings_signal_edd); /**/
|
|
|
|
E_CONFIG_LIST(D, T, wheel_bindings, _e_config_bindings_wheel_edd); /**/
|
|
|
|
E_CONFIG_LIST(D, T, acpi_bindings, _e_config_bindings_acpi_edd); /**/
|
Introduce gesture recognition
This is currently using libinputs gesture recognition. And offers a
config screen to setup new gestures.
1. No default gesture bindings are setup
2. When libinput is not available the module is not going to be loaded,
and nothing is recognited.+
3. Only swipe gestures are recognized yet.
4. For now, you are required to be part of the input group, otherwise we cannot
get the libinput events. (See Todo 1)
5. The visual representation is not really good. In terms of UI, it is
visually showing a value coming from left to right, which is
indicating a direction, which is not always the direction of the
gesture, which is kind of bad. More improvements needed here.
Some things that still can be done:
1. The whole libinput things should be handled by elput, either with the
input group hack, or logind, or simply by root. The ideal idea would
be that e_sys is creating the elput context, which also listens for new
devices etc.. When all this is done, and it recognizes a new device, it
can simply sent a message from e_sys to e, that there is some new
device, with a opened fd. (However, this all needs to be locked up in a
way that e_sys cannot be abused)
3 years ago
|
|
|
E_CONFIG_LIST(D, T, swipe_bindings, _e_config_bindings_swipe_edd); /**/
|
|
|
|
E_CONFIG_LIST(D, T, path_append_data, _e_config_path_append_edd); /**/
|
|
|
|
E_CONFIG_LIST(D, T, path_append_images, _e_config_path_append_edd); /**/
|
|
|
|
E_CONFIG_LIST(D, T, path_append_fonts, _e_config_path_append_edd); /**/
|
|
|
|
E_CONFIG_LIST(D, T, path_append_init, _e_config_path_append_edd); /**/
|
|
|
|
E_CONFIG_LIST(D, T, path_append_icons, _e_config_path_append_edd); /**/
|
|
|
|
E_CONFIG_LIST(D, T, path_append_modules, _e_config_path_append_edd); /**/
|
|
|
|
E_CONFIG_LIST(D, T, path_append_backgrounds, _e_config_path_append_edd); /**/
|
|
|
|
E_CONFIG_VAL(D, T, window_placement_policy, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, window_grouping, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, focus_policy, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, focus_setting, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, pass_click_on, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, window_activehint_policy, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, always_click_to_raise, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, always_click_to_focus, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, use_auto_raise, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, auto_raise_delay, DOUBLE); /**/
|
|
|
|
E_CONFIG_VAL(D, T, use_resist, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, drag_resist, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, desk_resist, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, window_resist, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, gadget_resist, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, geometry_auto_resize_limit, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, geometry_auto_move, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, winlist_warp_while_selecting, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, winlist_warp_at_end, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, winlist_no_warp_on_direction, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, winlist_warp_speed, DOUBLE); /**/
|
|
|
|
E_CONFIG_VAL(D, T, winlist_scroll_animate, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, winlist_scroll_speed, DOUBLE); /**/
|
|
|
|
E_CONFIG_VAL(D, T, winlist_list_show_iconified, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, winlist_list_show_other_desk_iconified, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, winlist_list_show_other_screen_iconified, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, winlist_list_show_other_desk_windows, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, winlist_list_show_other_screen_windows, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, winlist_list_uncover_while_selecting, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, winlist_list_jump_desk_while_selecting, INT); /**/
|
|
|
|
E_CONFIG_VAL(D, T, winlist_list_focus_while_selecting, INT); /**/
|
|
|