forked from enlightenment/enlightenment
e17: allow themes to request argb window frames
if your window border theme will use transparency add: data { item: "argb" "1" } to the respective border groups SVN revision: 57458
This commit is contained in:
parent
09b181a9d5
commit
23428da6ea
|
@ -197,6 +197,10 @@ static void _e_border_hook_call(E_Border_Hook_Point hookpoint,
|
||||||
|
|
||||||
static void _e_border_client_move_resize_send(E_Border *bd);
|
static void _e_border_client_move_resize_send(E_Border *bd);
|
||||||
|
|
||||||
|
static void _e_border_frame_replace(E_Border *bd,
|
||||||
|
Eina_Bool argb);
|
||||||
|
|
||||||
|
|
||||||
/* local subsystem globals */
|
/* local subsystem globals */
|
||||||
static Eina_List *handlers = NULL;
|
static Eina_List *handlers = NULL;
|
||||||
static Eina_List *borders = NULL;
|
static Eina_List *borders = NULL;
|
||||||
|
@ -964,6 +968,95 @@ e_border_hide(E_Border *bd,
|
||||||
bd->post_show = 0;
|
bd->post_show = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_e_border_frame_replace(E_Border *bd, Eina_Bool argb)
|
||||||
|
{
|
||||||
|
Ecore_X_Window win;
|
||||||
|
Ecore_Evas *bg_ecore_evas;
|
||||||
|
char buf[PATH_MAX];
|
||||||
|
|
||||||
|
bd->argb = argb;
|
||||||
|
|
||||||
|
win = bd->win;
|
||||||
|
bg_ecore_evas = bd->bg_ecore_evas;
|
||||||
|
|
||||||
|
/* unregister old frame window */
|
||||||
|
eina_hash_del(borders_hash, e_util_winid_str_get(bd->bg_win), bd);
|
||||||
|
eina_hash_del(borders_hash, e_util_winid_str_get(bd->win), bd);
|
||||||
|
|
||||||
|
e_focus_setdown(bd);
|
||||||
|
e_bindings_mouse_ungrab(E_BINDING_CONTEXT_BORDER, bd->win);
|
||||||
|
e_bindings_wheel_ungrab(E_BINDING_CONTEXT_BORDER, bd->win);
|
||||||
|
|
||||||
|
if (bd->icon_object)
|
||||||
|
evas_object_del(bd->icon_object);
|
||||||
|
|
||||||
|
evas_object_del(bd->bg_object);
|
||||||
|
e_canvas_del(bg_ecore_evas);
|
||||||
|
ecore_evas_free(bg_ecore_evas);
|
||||||
|
|
||||||
|
if (bd->pointer)
|
||||||
|
e_object_del(E_OBJECT(bd->pointer));
|
||||||
|
|
||||||
|
/* create new frame */
|
||||||
|
if (argb)
|
||||||
|
bd->win = ecore_x_window_manager_argb_new(bd->zone->container->win,
|
||||||
|
bd->x, bd->y, bd->w, bd->h);
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bd->win = ecore_x_window_override_new(bd->zone->container->win,
|
||||||
|
bd->x, bd->y, bd->w, bd->h);
|
||||||
|
ecore_x_window_shape_events_select(bd->win, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
ecore_x_window_configure(bd->win,
|
||||||
|
ECORE_X_WINDOW_CONFIGURE_MASK_SIBLING |
|
||||||
|
ECORE_X_WINDOW_CONFIGURE_MASK_STACK_MODE,
|
||||||
|
0, 0, 0, 0, 0,
|
||||||
|
win, ECORE_X_WINDOW_STACK_BELOW);
|
||||||
|
|
||||||
|
e_bindings_mouse_grab(E_BINDING_CONTEXT_BORDER, bd->win);
|
||||||
|
e_bindings_wheel_grab(E_BINDING_CONTEXT_BORDER, bd->win);
|
||||||
|
e_focus_setup(bd);
|
||||||
|
|
||||||
|
bd->bg_ecore_evas = e_canvas_new(e_config->evas_engine_borders, bd->win,
|
||||||
|
0, 0, bd->w, bd->h, 1, 0,
|
||||||
|
&(bd->bg_win));
|
||||||
|
|
||||||
|
e_canvas_add(bd->bg_ecore_evas);
|
||||||
|
ecore_x_window_reparent(bd->event_win, bd->win, 0, 0);
|
||||||
|
|
||||||
|
bd->bg_evas = ecore_evas_get(bd->bg_ecore_evas);
|
||||||
|
ecore_evas_name_class_set(bd->bg_ecore_evas, "E", "Frame_Window");
|
||||||
|
ecore_evas_title_set(bd->bg_ecore_evas, "Enlightenment Frame");
|
||||||
|
|
||||||
|
ecore_x_window_shape_events_select(bd->bg_win, 1);
|
||||||
|
|
||||||
|
/* move client with shell win over to new frame */
|
||||||
|
ecore_x_window_reparent(bd->client.shell_win, bd->win,
|
||||||
|
bd->client_inset.l, bd->client_inset.t);
|
||||||
|
|
||||||
|
bd->pointer = e_pointer_window_new(bd->win, 0);
|
||||||
|
|
||||||
|
eina_hash_add(borders_hash, e_util_winid_str_get(bd->bg_win), bd);
|
||||||
|
eina_hash_add(borders_hash, e_util_winid_str_get(bd->win), bd);
|
||||||
|
|
||||||
|
if (bd->visible)
|
||||||
|
{
|
||||||
|
ecore_evas_show(bd->bg_ecore_evas);
|
||||||
|
ecore_x_window_show(bd->win);
|
||||||
|
}
|
||||||
|
|
||||||
|
bd->bg_object = edje_object_add(bd->bg_evas);
|
||||||
|
snprintf(buf, sizeof(buf), "e/widgets/border/%s/border", bd->client.border.name);
|
||||||
|
e_theme_edje_object_set(bd->bg_object, "base/theme/borders", buf);
|
||||||
|
|
||||||
|
bd->icon_object = e_border_icon_add(bd, bd->bg_evas);
|
||||||
|
|
||||||
|
/* cleanup old frame */
|
||||||
|
ecore_x_window_free(win);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_e_border_client_move_resize_send(E_Border *bd)
|
_e_border_client_move_resize_send(E_Border *bd)
|
||||||
{
|
{
|
||||||
|
@ -6651,17 +6744,34 @@ _e_border_eval0(E_Border *bd)
|
||||||
e_config_save_queue();
|
e_config_save_queue();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bd->shaped = 0;
|
bd->shaped = 0;
|
||||||
if (ok)
|
if (ok)
|
||||||
{
|
{
|
||||||
const char *shape_option;
|
const char *shape_option, *argb_option;
|
||||||
|
int use_argb = 0;
|
||||||
|
|
||||||
bd->bg_object = o;
|
bd->bg_object = o;
|
||||||
shape_option = edje_object_data_get(o, "shaped");
|
|
||||||
if ((shape_option) && (!strcmp(shape_option, "1")))
|
if (!bd->client.argb)
|
||||||
bd->shaped = 1;
|
{
|
||||||
|
argb_option = edje_object_data_get(o, "argb");
|
||||||
|
if ((argb_option) && (!strcmp(argb_option, "1")))
|
||||||
|
use_argb = 1;
|
||||||
|
|
||||||
|
if (use_argb != bd->argb)
|
||||||
|
_e_border_frame_replace(bd, use_argb);
|
||||||
|
|
||||||
|
o = bd->bg_object;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!bd->argb)
|
||||||
|
{
|
||||||
|
shape_option = edje_object_data_get(o, "shaped");
|
||||||
|
if ((shape_option) && (!strcmp(shape_option, "1")))
|
||||||
|
bd->shaped = 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (bd->client.netwm.name)
|
if (bd->client.netwm.name)
|
||||||
edje_object_part_text_set(o, "e.text.title",
|
edje_object_part_text_set(o, "e.text.title",
|
||||||
bd->client.netwm.name);
|
bd->client.netwm.name);
|
||||||
|
|
|
@ -564,6 +564,8 @@ struct _E_Border
|
||||||
unsigned char post_resize : 1;
|
unsigned char post_resize : 1;
|
||||||
unsigned char post_show : 1;
|
unsigned char post_show : 1;
|
||||||
Ecore_Idle_Enterer *post_job;
|
Ecore_Idle_Enterer *post_job;
|
||||||
|
|
||||||
|
Eina_Bool argb;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _E_Border_Pending_Move_Resize
|
struct _E_Border_Pending_Move_Resize
|
||||||
|
|
Loading…
Reference in New Issue