forked from enlightenment/enlightenment
parent
fbfa242bff
commit
549154cd7d
|
@ -34,6 +34,7 @@ default_transitions.edc \
|
||||||
default_dialog.edc \
|
default_dialog.edc \
|
||||||
default_desktopname.edc \
|
default_desktopname.edc \
|
||||||
default_icons.edc \
|
default_icons.edc \
|
||||||
|
default_pointer.edc \
|
||||||
default_randr.edc
|
default_randr.edc
|
||||||
|
|
||||||
default.edj: Makefile $(EXTRA_DIST)
|
default.edj: Makefile $(EXTRA_DIST)
|
||||||
|
|
|
@ -43,5 +43,6 @@ collections {
|
||||||
#include "default_desktopname.edc"
|
#include "default_desktopname.edc"
|
||||||
#include "default_icons.edc"
|
#include "default_icons.edc"
|
||||||
#include "default_randr.edc"
|
#include "default_randr.edc"
|
||||||
|
#include "default_pointer.edc"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Binary file not shown.
Binary file not shown.
|
@ -19,6 +19,7 @@
|
||||||
#include <fnmatch.h>
|
#include <fnmatch.h>
|
||||||
|
|
||||||
#include <Evas.h>
|
#include <Evas.h>
|
||||||
|
#include <Evas_Engine_Buffer.h>
|
||||||
#include <Ecore.h>
|
#include <Ecore.h>
|
||||||
#include <Ecore_X.h>
|
#include <Ecore_X.h>
|
||||||
#include <Ecore_Evas.h>
|
#include <Ecore_Evas.h>
|
||||||
|
|
|
@ -122,7 +122,8 @@ e_container_new(E_Manager *man)
|
||||||
evas_object_data_set(o, "e_container", con);
|
evas_object_data_set(o, "e_container", con);
|
||||||
evas_object_show(o);
|
evas_object_show(o);
|
||||||
|
|
||||||
e_pointer_container_set(con);
|
con->pointer.root = e_pointer_window_set(con->manager->root);
|
||||||
|
con->pointer.win = e_pointer_window_set(con->win);
|
||||||
|
|
||||||
con->num = container_num;
|
con->num = container_num;
|
||||||
container_num++;
|
container_num++;
|
||||||
|
@ -890,6 +891,9 @@ _e_container_free(E_Container *con)
|
||||||
Evas_List *l, *tmp;
|
Evas_List *l, *tmp;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
if (con->pointer.root) e_object_del(E_OBJECT(con->pointer.root));
|
||||||
|
if (con->pointer.win) e_object_del(E_OBJECT(con->pointer.win));
|
||||||
|
|
||||||
ecore_x_window_del(con->event_win);
|
ecore_x_window_del(con->event_win);
|
||||||
if (con->gadman) e_object_del(E_OBJECT(con->gadman));
|
if (con->gadman) e_object_del(E_OBJECT(con->gadman));
|
||||||
/* We can't use e_object_del here, because border adds a ref to itself
|
/* We can't use e_object_del here, because border adds a ref to itself
|
||||||
|
|
|
@ -54,6 +54,11 @@ struct _E_Container
|
||||||
Ecore_X_Window win;
|
Ecore_X_Window win;
|
||||||
Evas_List *clients;
|
Evas_List *clients;
|
||||||
} layers[7];
|
} layers[7];
|
||||||
|
|
||||||
|
struct {
|
||||||
|
E_Pointer *root;
|
||||||
|
E_Pointer *win;
|
||||||
|
} pointer;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _E_Border_List
|
struct _E_Border_List
|
||||||
|
|
|
@ -61,6 +61,7 @@ e_error_message_manager_show(E_Manager *man, char *title, char *txt)
|
||||||
Evas_Coord maxw, maxh;
|
Evas_Coord maxw, maxh;
|
||||||
E_Container *con;
|
E_Container *con;
|
||||||
Ecore_X_Window win;
|
Ecore_X_Window win;
|
||||||
|
E_Pointer *p;
|
||||||
int x, y;
|
int x, y;
|
||||||
char *s;
|
char *s;
|
||||||
|
|
||||||
|
@ -93,7 +94,8 @@ e_error_message_manager_show(E_Manager *man, char *title, char *txt)
|
||||||
ecore_evas_title_set(ee, "Enlightenment: Low Level Dialog");
|
ecore_evas_title_set(ee, "Enlightenment: Low Level Dialog");
|
||||||
// ecore_evas_avoid_damage_set(ee, 1);
|
// ecore_evas_avoid_damage_set(ee, 1);
|
||||||
e = ecore_evas_get(ee);
|
e = ecore_evas_get(ee);
|
||||||
e_pointer_ecore_evas_set(ee);
|
p = e_pointer_window_set(win);
|
||||||
|
ecore_evas_data_set(ee, "pointer", p);
|
||||||
|
|
||||||
o = edje_object_add(e);
|
o = edje_object_add(e);
|
||||||
if (!e_theme_edje_object_set(o, "base/theme/error", "error/main"))
|
if (!e_theme_edje_object_set(o, "base/theme/error", "error/main"))
|
||||||
|
@ -421,6 +423,7 @@ _e_error_cb_job_ecore_evas_free(void *data)
|
||||||
{
|
{
|
||||||
Ecore_Evas *ee;
|
Ecore_Evas *ee;
|
||||||
Evas_List *shapelist, *l;
|
Evas_List *shapelist, *l;
|
||||||
|
E_Pointer *p;
|
||||||
|
|
||||||
ee = data;
|
ee = data;
|
||||||
shapelist = ecore_evas_data_get(ee, "shapes");
|
shapelist = ecore_evas_data_get(ee, "shapes");
|
||||||
|
@ -428,6 +431,9 @@ _e_error_cb_job_ecore_evas_free(void *data)
|
||||||
e_object_del(E_OBJECT(l->data));
|
e_object_del(E_OBJECT(l->data));
|
||||||
evas_list_free(shapelist);
|
evas_list_free(shapelist);
|
||||||
|
|
||||||
|
p = ecore_evas_data_get(ee, "pointer");
|
||||||
|
e_object_del(E_OBJECT(p));
|
||||||
|
|
||||||
e_canvas_del(ee);
|
e_canvas_del(ee);
|
||||||
ecore_evas_free(ee);
|
ecore_evas_free(ee);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@ static Ecore_Evas *_e_init_ecore_evas = NULL;
|
||||||
static Evas *_e_init_evas = NULL;
|
static Evas *_e_init_evas = NULL;
|
||||||
static Evas_Object *_e_init_object = NULL;
|
static Evas_Object *_e_init_object = NULL;
|
||||||
static Evas_Object *_e_init_icon_box = NULL;
|
static Evas_Object *_e_init_icon_box = NULL;
|
||||||
|
static E_Pointer *_e_init_pointer = NULL;
|
||||||
|
|
||||||
/* startup icons */
|
/* startup icons */
|
||||||
static Evas_Coord _e_init_icon_size = 0;
|
static Evas_Coord _e_init_icon_size = 0;
|
||||||
|
@ -60,7 +61,7 @@ e_init_init(void)
|
||||||
_e_init_evas = ecore_evas_get(_e_init_ecore_evas);
|
_e_init_evas = ecore_evas_get(_e_init_ecore_evas);
|
||||||
ecore_evas_name_class_set(_e_init_ecore_evas, "E", "Init_Window");
|
ecore_evas_name_class_set(_e_init_ecore_evas, "E", "Init_Window");
|
||||||
ecore_evas_title_set(_e_init_ecore_evas, "Enlightenment Init");
|
ecore_evas_title_set(_e_init_ecore_evas, "Enlightenment Init");
|
||||||
e_pointer_ecore_evas_set(_e_init_ecore_evas);
|
_e_init_pointer = e_pointer_window_set(_e_init_win);
|
||||||
ecore_evas_raise(_e_init_ecore_evas);
|
ecore_evas_raise(_e_init_ecore_evas);
|
||||||
ecore_evas_show(_e_init_ecore_evas);
|
ecore_evas_show(_e_init_ecore_evas);
|
||||||
|
|
||||||
|
@ -144,10 +145,12 @@ e_init_hide(void)
|
||||||
evas_object_del(_e_init_object);
|
evas_object_del(_e_init_object);
|
||||||
e_canvas_del(_e_init_ecore_evas);
|
e_canvas_del(_e_init_ecore_evas);
|
||||||
ecore_evas_free(_e_init_ecore_evas);
|
ecore_evas_free(_e_init_ecore_evas);
|
||||||
|
e_object_del(E_OBJECT(_e_init_pointer));
|
||||||
_e_init_ecore_evas = NULL;
|
_e_init_ecore_evas = NULL;
|
||||||
_e_init_evas = NULL;
|
_e_init_evas = NULL;
|
||||||
_e_init_win = 0;
|
_e_init_win = 0;
|
||||||
_e_init_object = NULL;
|
_e_init_object = NULL;
|
||||||
|
_e_init_pointer = NULL;
|
||||||
e_canvas_cache_flush();
|
e_canvas_cache_flush();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -424,17 +424,6 @@ main(int argc, char **argv)
|
||||||
e_font_apply();
|
e_font_apply();
|
||||||
e_canvas_recache();
|
e_canvas_recache();
|
||||||
|
|
||||||
if (!((!e_config->show_splash) || (after_restart)))
|
|
||||||
{
|
|
||||||
/* setup init status window/screen */
|
|
||||||
if (!e_init_init())
|
|
||||||
{
|
|
||||||
e_error_message_show(_("Enlightenment cannot set up init screen.\n"
|
|
||||||
"Perhaps you are out of memory?"));
|
|
||||||
_e_main_shutdown(-1);
|
|
||||||
}
|
|
||||||
_e_main_shutdown_push(e_init_shutdown);
|
|
||||||
}
|
|
||||||
/* init app system */
|
/* init app system */
|
||||||
if (!e_app_init())
|
if (!e_app_init())
|
||||||
{
|
{
|
||||||
|
@ -449,6 +438,17 @@ main(int argc, char **argv)
|
||||||
_e_main_shutdown(-1);
|
_e_main_shutdown(-1);
|
||||||
}
|
}
|
||||||
_e_main_shutdown_push(e_theme_shutdown);
|
_e_main_shutdown_push(e_theme_shutdown);
|
||||||
|
if (!((!e_config->show_splash) || (after_restart)))
|
||||||
|
{
|
||||||
|
/* setup init status window/screen */
|
||||||
|
if (!e_init_init())
|
||||||
|
{
|
||||||
|
e_error_message_show(_("Enlightenment cannot set up init screen.\n"
|
||||||
|
"Perhaps you are out of memory?"));
|
||||||
|
_e_main_shutdown(-1);
|
||||||
|
}
|
||||||
|
_e_main_shutdown_push(e_init_shutdown);
|
||||||
|
}
|
||||||
/* manage the root window */
|
/* manage the root window */
|
||||||
if (!_e_main_screens_init())
|
if (!_e_main_screens_init())
|
||||||
{
|
{
|
||||||
|
@ -1022,6 +1022,7 @@ _e_main_cb_idler_before(void *data __UNUSED__)
|
||||||
e_border_idler_before();
|
e_border_idler_before();
|
||||||
e_popup_idler_before();
|
e_popup_idler_before();
|
||||||
e_drag_idler_before();
|
e_drag_idler_before();
|
||||||
|
e_pointer_idler_before();
|
||||||
for (l = _e_main_idler_before_list; l; l = l->next)
|
for (l = _e_main_idler_before_list; l; l = l->next)
|
||||||
{
|
{
|
||||||
E_Before_Idler *eb;
|
E_Before_Idler *eb;
|
||||||
|
|
|
@ -3,72 +3,160 @@
|
||||||
*/
|
*/
|
||||||
#include "e.h"
|
#include "e.h"
|
||||||
|
|
||||||
|
static Evas_List *_e_pointers = NULL;
|
||||||
|
|
||||||
|
static void _e_pointer_free(E_Pointer *p);
|
||||||
|
|
||||||
/* externally accessible functions */
|
/* externally accessible functions */
|
||||||
void
|
E_Pointer *
|
||||||
e_pointer_container_set(E_Container *con)
|
e_pointer_window_set(Ecore_X_Window win)
|
||||||
{
|
{
|
||||||
Ecore_X_Cursor cur;
|
Evas_Engine_Info_Buffer *einfo;
|
||||||
int w, h;
|
E_Pointer *p;
|
||||||
Evas_Object *o;
|
int rmethod;
|
||||||
int *pix;
|
Evas_Coord w, h;
|
||||||
char *s;
|
|
||||||
|
|
||||||
E_OBJECT_CHECK(E_OBJECT(con));
|
rmethod = evas_render_method_lookup("buffer");
|
||||||
|
if (!rmethod) return NULL;
|
||||||
|
|
||||||
|
p = E_OBJECT_ALLOC(E_Pointer, E_POINTER_TYPE, _e_pointer_free);
|
||||||
|
if (!p) return NULL;
|
||||||
|
|
||||||
|
p->win = win;
|
||||||
|
|
||||||
|
p->w = 10;
|
||||||
|
p->h = 10;
|
||||||
|
|
||||||
|
/* create evas */
|
||||||
|
p->evas = evas_new();
|
||||||
|
evas_output_method_set(p->evas, rmethod);
|
||||||
|
evas_output_size_set(p->evas, p->w, p->h);
|
||||||
|
evas_output_viewport_set(p->evas, 0, 0, p->w, p->h);
|
||||||
|
|
||||||
o = evas_object_image_add(con->bg_evas);
|
p->pixels = calloc(p->w * p->h, sizeof(int));
|
||||||
|
|
||||||
|
einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(p->evas);
|
||||||
|
if (einfo)
|
||||||
|
{
|
||||||
|
einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
|
||||||
|
einfo->info.dest_buffer = p->pixels;
|
||||||
|
einfo->info.dest_buffer_row_bytes = p->w * sizeof(int);
|
||||||
|
einfo->info.use_color_key = 0;
|
||||||
|
einfo->info.alpha_threshold = 0;
|
||||||
|
einfo->info.func.new_update_region = NULL;
|
||||||
|
einfo->info.func.free_update_region = NULL;
|
||||||
|
evas_engine_info_set(p->evas, (Evas_Engine_Info *)einfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* set the pointer edje */
|
||||||
|
p->evas_object = edje_object_add(p->evas);
|
||||||
if (ecore_x_cursor_color_supported_get())
|
if (ecore_x_cursor_color_supported_get())
|
||||||
{
|
{
|
||||||
s = e_path_find(path_images, "pointer.png");
|
if (!e_theme_edje_object_set(p->evas_object,
|
||||||
evas_object_image_file_set(o, s, NULL);
|
"base/theme/pointer",
|
||||||
IF_FREE(s);
|
"pointer/enlightenment/default"))
|
||||||
|
{
|
||||||
|
/* error */
|
||||||
|
printf("ERROR: No default theme for pointer!\n");
|
||||||
|
if (!e_theme_edje_object_set(p->evas_object,
|
||||||
|
"base/theme/pointer",
|
||||||
|
"pointer/enlightenment/mono"))
|
||||||
|
{
|
||||||
|
/* error */
|
||||||
|
printf("ERROR: No mono theme for pointer!\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
s = e_path_find(path_images, "pointer_mono.png");
|
if (!e_theme_edje_object_set(p->evas_object,
|
||||||
evas_object_image_file_set(o, s, NULL);
|
"base/theme/pointer",
|
||||||
IF_FREE(s);
|
"pointer/enlightenment/mono"))
|
||||||
|
{
|
||||||
|
/* error */
|
||||||
|
printf("ERROR: No mono theme for pointer!\n");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
evas_object_image_size_get(o, &w, &h);
|
edje_object_calc_force(p->evas_object);
|
||||||
pix = evas_object_image_data_get(o, 0);
|
edje_object_size_min_calc(p->evas_object, &w, &h);
|
||||||
cur = ecore_x_cursor_new(con->win, pix, w, h, 0, 0);
|
if ((w == 0) || (h == 0))
|
||||||
evas_object_image_data_set(o, pix);
|
{
|
||||||
evas_object_del(o);
|
/* error */
|
||||||
ecore_x_window_cursor_set(con->manager->root, cur);
|
printf("The size of the pointer is 0!\n");
|
||||||
ecore_x_window_cursor_set(con->win, cur);
|
w = h = 10;
|
||||||
ecore_x_cursor_free(cur);
|
}
|
||||||
|
p->w = w;
|
||||||
|
p->h = h;
|
||||||
|
|
||||||
|
/* resize evas */
|
||||||
|
evas_output_size_set(p->evas, p->w, p->h);
|
||||||
|
evas_output_viewport_set(p->evas, 0, 0, p->w, p->h);
|
||||||
|
evas_damage_rectangle_add(p->evas, 0, 0, p->w, p->h);
|
||||||
|
|
||||||
|
free(p->pixels);
|
||||||
|
p->pixels = calloc(p->w * p->h, sizeof(int));
|
||||||
|
|
||||||
|
einfo = (Evas_Engine_Info_Buffer *)evas_engine_info_get(p->evas);
|
||||||
|
if (einfo)
|
||||||
|
{
|
||||||
|
einfo->info.depth_type = EVAS_ENGINE_BUFFER_DEPTH_ARGB32;
|
||||||
|
einfo->info.dest_buffer = p->pixels;
|
||||||
|
einfo->info.dest_buffer_row_bytes = p->w * sizeof(int);
|
||||||
|
einfo->info.use_color_key = 0;
|
||||||
|
einfo->info.alpha_threshold = 0;
|
||||||
|
einfo->info.func.new_update_region = NULL;
|
||||||
|
einfo->info.func.free_update_region = NULL;
|
||||||
|
evas_engine_info_set(p->evas, (Evas_Engine_Info *)einfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* init edje */
|
||||||
|
evas_object_move(p->evas_object, 0, 0);
|
||||||
|
evas_object_resize(p->evas_object, p->w, p->h);
|
||||||
|
evas_object_show(p->evas_object);
|
||||||
|
|
||||||
|
_e_pointers = evas_list_append(_e_pointers, p);
|
||||||
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
e_pointer_ecore_evas_set(Ecore_Evas *ee)
|
e_pointer_idler_before(void)
|
||||||
{
|
{
|
||||||
Ecore_X_Window win;
|
Evas_List *l;
|
||||||
Ecore_X_Cursor cur;
|
|
||||||
int w, h;
|
for (l = _e_pointers; l; l = l->next)
|
||||||
Evas_Object *o;
|
|
||||||
int *pix;
|
|
||||||
Evas *e;
|
|
||||||
char *s;
|
|
||||||
|
|
||||||
e = ecore_evas_get(ee);
|
|
||||||
win = ecore_evas_software_x11_window_get(ee);
|
|
||||||
o = evas_object_image_add(e);
|
|
||||||
if (ecore_x_cursor_color_supported_get())
|
|
||||||
{
|
{
|
||||||
s = e_path_find(path_images, "pointer.png");
|
E_Pointer *p;
|
||||||
evas_object_image_file_set(o, s, NULL);
|
Evas_List *updates;
|
||||||
IF_FREE(s);
|
|
||||||
|
p = l->data;
|
||||||
|
updates = evas_render_updates(p->evas);
|
||||||
|
if (updates)
|
||||||
|
{
|
||||||
|
Ecore_X_Cursor cur;
|
||||||
|
Evas_Coord w, h;
|
||||||
|
|
||||||
|
evas_render_updates_free(updates);
|
||||||
|
|
||||||
|
/* TODO: Resize evas if pointer changes */
|
||||||
|
evas_object_geometry_get(p->evas_object, NULL, NULL, &w, &h);
|
||||||
|
cur = ecore_x_cursor_new(p->win, p->pixels, p->w, p->h, 0, 0);
|
||||||
|
ecore_x_window_cursor_set(p->win, cur);
|
||||||
|
ecore_x_cursor_free(cur);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
}
|
||||||
{
|
|
||||||
s = e_path_find(path_images, "pointer_mono.png");
|
/* local subsystem functions */
|
||||||
evas_object_image_file_set(o, s, NULL);
|
static void
|
||||||
IF_FREE(s);
|
_e_pointer_free(E_Pointer *p)
|
||||||
}
|
{
|
||||||
evas_object_image_size_get(o, &w, &h);
|
|
||||||
pix = evas_object_image_data_get(o, 0);
|
_e_pointers = evas_list_remove(_e_pointers, p);
|
||||||
cur = ecore_x_cursor_new(win, pix, w, h, 0, 0);
|
|
||||||
evas_object_image_data_set(o, pix);
|
/* create evas */
|
||||||
evas_object_del(o);
|
if (p->evas_object) evas_object_del(p->evas_object);
|
||||||
ecore_x_window_cursor_set(win, cur);
|
if (p->evas) evas_free(p->evas);
|
||||||
ecore_x_cursor_free(cur);
|
|
||||||
|
free(p->pixels);
|
||||||
|
free(p);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,12 +2,30 @@
|
||||||
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
|
||||||
*/
|
*/
|
||||||
#ifdef E_TYPEDEFS
|
#ifdef E_TYPEDEFS
|
||||||
|
|
||||||
|
typedef struct _E_Pointer E_Pointer;
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#ifndef E_POINTER_H
|
#ifndef E_POINTER_H
|
||||||
#define E_POINTER_H
|
#define E_POINTER_H
|
||||||
|
|
||||||
EAPI void e_pointer_container_set(E_Container *con);
|
#define E_POINTER_TYPE 0xE0b01013
|
||||||
EAPI void e_pointer_ecore_evas_set(Ecore_Evas *ee);
|
|
||||||
|
struct _E_Pointer
|
||||||
|
{
|
||||||
|
E_Object e_obj_inherit;
|
||||||
|
|
||||||
|
Evas *evas;
|
||||||
|
Evas_Object *evas_object;
|
||||||
|
int *pixels;
|
||||||
|
|
||||||
|
Ecore_X_Window win;
|
||||||
|
|
||||||
|
int w, h;
|
||||||
|
};
|
||||||
|
|
||||||
|
EAPI E_Pointer *e_pointer_window_set(Ecore_X_Window win);
|
||||||
|
EAPI void e_pointer_idler_before(void);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue