fix focus loss on window unfocus so keybindings still work

some start on language set/get/list ipc


SVN revision: 14548
This commit is contained in:
Carsten Haitzler 2005-05-02 10:16:31 +00:00
parent 2eaa1ce1c7
commit b1422de636
6 changed files with 176 additions and 71 deletions

View File

@ -1327,7 +1327,11 @@ _e_border_free(E_Border *bd)
e_object_del(E_OBJECT(bd->border_menu));
bd->border_menu = NULL;
}
if (focused == bd) focused = NULL;
if (focused == bd)
{
ecore_x_window_focus(bd->container->manager->root);
focused = NULL;
}
while (bd->handlers)
{
Ecore_Event_Handler *h;

View File

@ -83,6 +83,7 @@ e_config_init(void)
E_CONFIG_VAL(D, T, font_cache, 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, language, STR);
E_CONFIG_LIST(D, T, modules, _e_config_module_edd);
E_CONFIG_LIST(D, T, font_fallbacks, _e_config_font_fallback_edd);
E_CONFIG_LIST(D, T, font_defaults, _e_config_font_default_edd);
@ -106,6 +107,7 @@ e_config_init(void)
e_config->zone_desks_x_count = 4;
e_config->zone_desks_y_count = 1;
e_config->use_virtual_roots = 0;
e_config->language = strdup("");
{
E_Config_Module *em;
@ -194,6 +196,11 @@ e_config_init(void)
E_CONFIG_LIMIT(e_config->image_cache, 0, 256 * 1024);
E_CONFIG_LIMIT(e_config->font_cache, 0, 32 * 1024);
/* apply config */
if ((e_config->language) && (strlen(e_config->language) > 0))
e_intl_language_set(e_config->language);
{
Evas_List *l;
@ -258,6 +265,7 @@ e_config_shutdown(void)
}
E_FREE(e_config->desktop_default_background);
E_FREE(e_config->language);
E_FREE(e_config);
}
E_CONFIG_DD_FREE(_e_config_edd);

View File

@ -55,6 +55,7 @@ struct _E_Config
int zone_desks_x_count;
int zone_desks_y_count;
int use_virtual_roots;
char *language;
Evas_List *modules;
Evas_List *font_fallbacks;
Evas_List *font_defaults;

View File

@ -5,6 +5,7 @@ static int _e_ipc_cb_client_add(void *data, int type, void *event);
static int _e_ipc_cb_client_del(void *data, int type, void *event);
static int _e_ipc_cb_client_data(void *data, int type, void *event);
static char *_e_ipc_path_str_get(char **paths, int *bytes);
static char *_e_ipc_str_list_get(Evas_List *strs, int *bytes);
static char *_e_ipc_simple_str_dec(char *data, int bytes);
static char **_e_ipc_multi_str_dec(char *data, int bytes, int str_count);
@ -14,6 +15,7 @@ ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_font_available_list_enc);
ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_font_fallback_list_enc);
ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_font_default_list_enc);
ECORE_IPC_ENC_STRUCT_PROTO(_e_ipc_font_default_enc);
//ECORE_IPC_ENC_STRUCT_PROTO(_e_ipc_string_list_enc);
/* local subsystem globals */
static Ecore_Ipc_Server *_e_ipc_server = NULL;
@ -213,9 +215,9 @@ _e_ipc_cb_client_data(void *data __UNUSED__, int type __UNUSED__, void *event)
case E_IPC_OP_BG_GET:
{
char *bg;
bg = e_config->desktop_default_background;
if (!bg)
bg = "";
if (!bg) bg = "";
ecore_ipc_client_send(e->client,
E_IPC_DOMAIN_REPLY,
E_IPC_OP_BG_GET_REPLY,
@ -328,7 +330,7 @@ _e_ipc_cb_client_data(void *data __UNUSED__, int type __UNUSED__, void *event)
int bytes;
text_class = _e_ipc_simple_str_dec(e->data, e->size);
efd = e_font_default_get (text_class);
efd = e_font_default_get(text_class);
free(text_class);
data = _e_ipc_font_default_enc(efd, &bytes);
ecore_ipc_client_send(e->client,
@ -399,6 +401,45 @@ _e_ipc_cb_client_data(void *data __UNUSED__, int type __UNUSED__, void *event)
ecore_main_loop_quit();
}
break;
case E_IPC_OP_LANG_LIST:
{
Evas_List *langs;
int bytes;
char *data;
langs = (Evas_List *)e_intl_language_list();
data = _e_ipc_str_list_get(langs, &bytes);
ecore_ipc_client_send(e->client,
E_IPC_DOMAIN_REPLY,
E_IPC_OP_LANG_LIST_REPLY,
0/*ref*/, 0/*ref_to*/, 0/*response*/,
data, bytes);
free(data);
}
case E_IPC_OP_LANG_SET:
{
char *lang;
lang = _e_ipc_simple_str_dec(e->data, e->size);
IF_FREE(e_config->language);
e_config->language = lang;
e_intl_language_set(e_config->language);
e_config_save_queue();
}
case E_IPC_OP_LANG_GET:
{
char *lang;
lang = e_config->language;
if (!lang) lang = "";
ecore_ipc_client_send(e->client,
E_IPC_DOMAIN_REPLY,
E_IPC_OP_LANG_GET_REPLY,
0/*ref*/, 0/*ref_to*/, 0/*response*/,
lang, strlen(lang) + 1);
free(data);
}
break;
default:
break;
}
@ -422,7 +463,7 @@ _e_ipc_path_str_get(char **paths, int *bytes)
char *data = NULL, **cur, *home;
int pos = 0;
char tmp[PATH_MAX];
*bytes = 0;
home = e_user_homedir_get();
for (cur = paths; *cur != NULL; cur++)
@ -444,6 +485,30 @@ _e_ipc_path_str_get(char **paths, int *bytes)
return data;
}
static char *
_e_ipc_str_list_get(Evas_List *strs, int *bytes)
{
char *data = NULL, **cur;
int pos = 0;
Evas_List *l;
*bytes = 0;
for (l = strs; l; l = l->next)
{
char *p;
p = l->data;
*bytes += strlen(p) + 1;
data = realloc(data, *bytes);
memcpy(data + pos, p, strlen(p));
pos = *bytes;
data[pos - 1] = 0;
}
return data;
}
/**
* Decode a simple string that was passed by an IPC client
*
@ -452,13 +517,13 @@ _e_ipc_path_str_get(char **paths, int *bytes)
static char *
_e_ipc_simple_str_dec(char *data, int bytes)
{
char *str;
str = malloc(bytes + 1);
str[bytes] = 0;
memcpy(str, data, bytes);
return str;
char *str;
str = malloc(bytes + 1);
str[bytes] = 0;
memcpy(str, data, bytes);
return str;
}
/**
@ -472,26 +537,25 @@ _e_ipc_simple_str_dec(char *data, int bytes)
static char **
_e_ipc_multi_str_dec(char *data, int bytes, int str_count)
{
char ** str_array;
int i;
/* Make sure our data is packed for us <str>0<str>0 */
if( data[bytes - 1] != 0) {
return NULL;
}
str_array = malloc(sizeof(char *)*str_count);
for(i = 0; i < str_count; i++)
{
char **str_array;
int i;
/* Make sure our data is packed for us <str>0<str>0 */
if (data[bytes - 1] != 0)
return NULL;
str_array = malloc(sizeof(char *) * str_count);
for (i = 0; i < str_count; i++)
{
str_array[i] = data;
data += strlen(str_array[i]) + 1;
}
return str_array;
}
return str_array;
}
/* list/struct encoding functions */
ECORE_IPC_ENC_EVAS_LIST_PROTO(_e_ipc_module_list_enc)
{
@ -556,3 +620,16 @@ ECORE_IPC_ENC_STRUCT_PROTO(_e_ipc_font_default_enc)
ECORE_IPC_PUT32(size);
ECORE_IPC_ENC_STRUCT_FOOT();
}
/*
ECORE_IPC_ENC_STRUCT_PROTO(_e_ipc_string_list_enc)
{
ECORE_IPC_ENC_EVAS_LIST_HEAD_START(E_String);
ECORE_IPC_CNTS(str);
ECORE_IPC_ENC_EVAS_LIST_HEAD_FINISH();
int l1;
ECORE_IPC_SLEN(l1, str);
ECORE_IPC_PUTS(str, l1);
ECORE_IPC_ENC_EVAS_LIST_FOOT();
}
*/

View File

@ -44,6 +44,11 @@ typedef enum _E_Ipc_Op {
E_IPC_OP_FONT_DEFAULT_LIST_REPLY,
E_IPC_OP_RESTART,
E_IPC_OP_SHUTDOWN,
E_IPC_OP_LANG_LIST,
E_IPC_OP_LANG_LIST_REPLY,
E_IPC_OP_LANG_SET,
E_IPC_OP_LANG_GET,
E_IPC_OP_LANG_GET_REPLY,
E_IPC_OP_LAST
} E_Ipc_Op;

View File

@ -72,7 +72,10 @@ E_IPC_Opt_Handler handlers[] =
OREQ("-font-default-list", "List all configured text classes", E_IPC_OP_FONT_DEFAULT_LIST, 1),
OMUL("-font-default-set", "Set textclass (OPT1) font (OPT2) and size (OPT3)", E_IPC_OP_FONT_DEFAULT_SET, 0, 3),
OREQ("-restart", "Restart E17", E_IPC_OP_RESTART, 0),
OREQ("-shutdown", "Shutdown E17", E_IPC_OP_SHUTDOWN, 0)
OREQ("-shutdown", "Shutdown E17", E_IPC_OP_SHUTDOWN, 0),
OREQ("-lang-get", "Get the current language", E_IPC_OP_LANG_GET, 1),
OREQ("-lang-list", "List all available languages", E_IPC_OP_LANG_LIST, 1),
OSTR("-lang-set", "Set the current language", E_IPC_OP_LANG_SET, 0)
};
/* externally accessible functions */
@ -338,7 +341,7 @@ _e_ipc_cb_server_data(void *data, int type, void *event)
else
printf("REPLY: MODULE NONE\n");
break;
case E_IPC_OP_MODULE_DIRS_LIST_REPLY:
case E_IPC_OP_MODULE_DIRS_LIST_REPLY:
if (e->data)
{
char *p;
@ -347,35 +350,35 @@ _e_ipc_cb_server_data(void *data, int type, void *event)
while (p < (char *)(e->data + e->size))
{
char *dir;
dir = p;
printf("REPLY: MODULE DIR=%s\n", dir);
p += strlen(dir) + 1;
}
}
break;
break;
case E_IPC_OP_BG_GET_REPLY:
if (e->data)
{
printf("REPLY: %s\n", e->data);
}
break;
if (e->data)
{
printf("REPLY: %s\n", e->data);
}
break;
case E_IPC_OP_BG_DIRS_LIST_REPLY:
if (e->data)
{
char *p;
p = e->data;
while (p < (char *)(e->data + e->size))
{
char *dir;
dir = p;
printf("REPLY: BG DIR=%s\n", dir);
p += strlen(dir) + 1;
}
}
break;
if (e->data)
{
char *p;
p = e->data;
while (p < (char *)(e->data + e->size))
{
char *dir;
dir = p;
printf("REPLY: BG DIR=%s\n", dir);
p += strlen(dir) + 1;
}
}
break;
case E_IPC_OP_FONT_FALLBACK_LIST_REPLY:
if (e->data)
{
@ -384,12 +387,12 @@ _e_ipc_cb_server_data(void *data, int type, void *event)
fallbacks = _e_ipc_font_fallback_list_dec(e->data, e->size);
while(fallbacks)
{
eff = fallbacks->data;
printf("REPLY: FALLBACK NAME=\"%s\"\n", eff->name);
fallbacks = evas_list_remove_list(fallbacks, fallbacks);
E_FREE(eff);
}
{
eff = fallbacks->data;
printf("REPLY: FALLBACK NAME=\"%s\"\n", eff->name);
fallbacks = evas_list_remove_list(fallbacks, fallbacks);
E_FREE(eff);
}
}
else
printf("REPLY: FALLBACK NONE\n");
@ -399,15 +402,15 @@ _e_ipc_cb_server_data(void *data, int type, void *event)
{
Evas_List *available;
E_Font_Available *fa;
available = _e_ipc_font_available_list_dec(e->data, e->size);
while(available)
{
fa = available->data;
printf("REPLY: AVAILABLE NAME=\"%s\"\n", fa->name);
available = evas_list_remove_list(available, available);
E_FREE(fa);
}
{
fa = available->data;
printf("REPLY: AVAILABLE NAME=\"%s\"\n", fa->name);
available = evas_list_remove_list(available, available);
E_FREE(fa);
}
}
else
printf("REPLY: AVAILABLE NONE\n");
@ -418,7 +421,7 @@ _e_ipc_cb_server_data(void *data, int type, void *event)
E_Font_Default efd;
_e_ipc_font_default_dec(e->data, e->size, &efd);
printf("REPLY: DEFAULT TEXT_CLASS=\"%s\" NAME=\"%s\" SIZE=%d\n",
efd.text_class, efd.font, efd.size);
efd.text_class, efd.font, efd.size);
}
else
printf("REPLY: DEFAULT NONE\n");
@ -428,13 +431,13 @@ _e_ipc_cb_server_data(void *data, int type, void *event)
{
Evas_List *defaults;
E_Font_Default *efd;
defaults = _e_ipc_font_default_list_dec(e->data, e->size);
while(defaults)
{
efd = defaults->data;
printf("REPLY: DEFAULT TEXT_CLASS=\"%s\" NAME=\"%s\" SIZE=%d\n",
efd->text_class, efd->font, efd->size);
efd = defaults->data;
printf("REPLY: DEFAULT TEXT_CLASS=\"%s\" NAME=\"%s\" SIZE=%d\n",
efd->text_class, efd->font, efd->size);
defaults = evas_list_remove_list(defaults, defaults);
E_FREE(efd);
}
@ -442,6 +445,13 @@ _e_ipc_cb_server_data(void *data, int type, void *event)
else
printf("REPLY: DEFAULT NONE\n");
break;
case E_IPC_OP_LANG_LIST_REPLY:
if (e->data)
{
}
else
printf("REPLY: AVAILABLE NONE\n");
break;
default:
break;
}