enlightenment/src/guides.c

597 lines
17 KiB
C

#include "guides.h"
#include "text.h"
#include "config.h"
#include "embed.h"
#include "util.h"
static struct
{
int changed;
struct
{
struct
{
E_Guides_Location loc;
struct
{
double x, y;
} align;
char *text;
char *icon;
} display;
int x, y, w, h;
int visible;
E_Guides_Mode mode;
} current, prev;
struct {
Window display;
Window l, r, t, b;
} win;
struct {
Evas evas;
Ebits_Object bg;
E_Text *text;
Evas_Object icon;
Imlib_Image image;
} disp;
struct {
Embed icon;
Embed text;
} embed;
} guides;
static void e_guides_idle(void *data);
static void e_guides_update(void);
static void
e_guides_idle(void *data)
{
e_guides_update();
UN(data);
}
static void
e_guides_update(void)
{
int font_cache = 1024 * 1024;
int image_cache = 8192 * 1024;
char *font_dir;
int redraw;
if (!guides.changed) return;
redraw = 0;
if (guides.prev.visible != guides.current.visible)
{
if (guides.current.visible)
{
if (!guides.win.display)
{
guides.win.display = e_window_override_new(0, 0, 0, 1, 1);
guides.win.l = e_window_override_new(0, 0, 0, 1, 1);
guides.win.r = e_window_override_new(0, 0, 0, 1, 1);
guides.win.t = e_window_override_new(0, 0, 0, 1, 1);
guides.win.b = e_window_override_new(0, 0, 0, 1, 1);
e_window_save_under(guides.win.display);
e_window_save_under(guides.win.l);
e_window_save_under(guides.win.r);
e_window_save_under(guides.win.t);
e_window_save_under(guides.win.b);
redraw = 1;
}
if (!guides.disp.evas)
{
font_dir = e_config_get("fonts");
guides.disp.evas = evas_new();
evas_set_output_method(guides.disp.evas, RENDER_METHOD_IMAGE);
guides.disp.image = imlib_create_image(1, 1);
imlib_context_set_image(guides.disp.image);
imlib_image_set_has_alpha(1);
imlib_image_clear();
evas_set_output_image(guides.disp.evas, guides.disp.image);
evas_font_add_path(guides.disp.evas, font_dir);
evas_set_output_size(guides.disp.evas, 1, 1);
evas_set_output_viewport(guides.disp.evas, 0, 0, 1, 1);
evas_set_font_cache(guides.disp.evas, font_cache);
evas_set_image_cache(guides.disp.evas, image_cache);
}
}
else
{
if (guides.win.display)
{
e_window_destroy(guides.win.display);
e_window_destroy(guides.win.l);
e_window_destroy(guides.win.r);
e_window_destroy(guides.win.t);
e_window_destroy(guides.win.b);
guides.win.display = 0;
guides.win.l = 0;
guides.win.r = 0;
guides.win.t = 0;
guides.win.b = 0;
}
if (guides.disp.evas)
{
if (guides.embed.icon) e_embed_free(guides.embed.icon);
if (guides.embed.text) e_embed_free(guides.embed.text);
guides.embed.icon = NULL;
guides.embed.text = NULL;
if (guides.disp.bg) ebits_free(guides.disp.bg);
if (guides.disp.text) e_text_free(guides.disp.text);
if (guides.disp.image)
{
imlib_context_set_image(guides.disp.image);
imlib_free_image();
}
evas_free(guides.disp.evas);
guides.disp.evas = NULL;
guides.disp.bg = NULL;
guides.disp.text = NULL;
guides.disp.icon = NULL;
guides.disp.image = NULL;
}
}
}
if (guides.current.x != guides.prev.x) redraw = 1;
if (guides.current.y != guides.prev.y) redraw = 1;
if (guides.current.w != guides.prev.w) redraw = 1;
if (guides.current.h != guides.prev.h) redraw = 1;
if (guides.current.display.loc != guides.prev.display.loc) redraw = 1;
if (guides.current.display.align.x != guides.prev.display.align.x) redraw = 1;
if (guides.current.display.align.y != guides.prev.display.align.y) redraw = 1;
if (guides.current.display.text != guides.prev.display.text) redraw = 1;
if (guides.current.display.icon != guides.prev.display.icon) redraw = 1;
if (guides.current.mode != guides.prev.mode) redraw = 1;
if ((guides.win.display) && (redraw))
{
int dx, dy, dw, dh, sw, sh, mw, mh;
char file[4096];
if (!guides.disp.text)
{
guides.disp.text = e_text_new(guides.disp.evas, guides.current.display.text, "guides");
e_text_set_layer(guides.disp.text, 100);
e_text_show(guides.disp.text);
}
if ((!guides.current.display.icon) && (guides.disp.icon))
{
evas_del_object(guides.disp.evas, guides.disp.icon);
guides.disp.icon = NULL;
}
if ((guides.current.display.icon) && (!guides.disp.icon))
{
guides.disp.icon = evas_add_image_from_file(guides.disp.evas, guides.current.display.icon);
evas_show(guides.disp.evas, guides.disp.icon);
}
if (guides.disp.icon)
evas_set_image_file(guides.disp.evas, guides.disp.icon, guides.current.display.icon);
e_text_set_text(guides.disp.text, guides.current.display.text);
if (!guides.disp.bg)
{
char *dir;
dir = e_config_get("guides");
sprintf(file, "%s/display.bits.db", dir);
guides.disp.bg = ebits_load(file);
if (guides.disp.bg)
{
ebits_add_to_evas(guides.disp.bg, guides.disp.evas);
ebits_set_layer(guides.disp.bg, 0);
ebits_show(guides.disp.bg);
}
}
mw = 1;
mh = 1;
if (guides.disp.bg)
{
if (!guides.embed.icon)
{
if (guides.embed.icon) e_embed_free(guides.embed.icon);
if (guides.embed.text) e_embed_free(guides.embed.text);
guides.embed.icon = e_embed_image_object(guides.disp.bg, "Icon", guides.disp.evas, guides.disp.icon);
guides.embed.text = e_embed_text(guides.disp.bg, "Text", guides.disp.evas, guides.disp.text, 0, 0);
}
ebits_get_real_min_size(guides.disp.bg, &mw, &mh);
}
dw = mw;
dh = mh;
if (guides.disp.bg)
{
ebits_move(guides.disp.bg, 0, 0);
ebits_resize(guides.disp.bg, dw, dh);
}
if (guides.current.display.loc == E_GUIDES_DISPLAY_LOCATION_SCREEN_MIDDLE)
{
e_window_get_geometry(0, NULL, NULL, &sw, &sh);
dx = (int)(((double)sw - (double)dw) * guides.current.display.align.x);
dy = (int)(((double)sh - (double)dh) * guides.current.display.align.y);
}
else if (guides.current.display.loc == E_GUIDES_DISPLAY_LOCATION_WINDOW_MIDDLE)
{
dx = guides.current.x + (int)(((double)guides.current.w - (double)dw) * guides.current.display.align.x);
dy = guides.current.y + (int)(((double)guides.current.h - (double)dh) * guides.current.display.align.y);
}
if (guides.disp.image)
{
imlib_context_set_image(guides.disp.image);
imlib_free_image();
guides.disp.image = NULL;
}
guides.disp.image = imlib_create_image(dw, dh);
imlib_context_set_image(guides.disp.image);
imlib_image_set_has_alpha(1);
imlib_image_clear();
evas_set_output_image(guides.disp.evas, guides.disp.image);
evas_set_output_size(guides.disp.evas, dw, dh);
evas_set_output_viewport(guides.disp.evas, 0, 0, dw, dh);
evas_update_rect(guides.disp.evas, 0, 0, dw, dh);
evas_render(guides.disp.evas);
{
Pixmap pmap, mask;
pmap = e_pixmap_new(guides.win.display, dw, dh, 0);
mask = e_pixmap_new(guides.win.display, dw, dh, 1);
imlib_context_set_image(guides.disp.image);
imlib_context_set_dither_mask(1);
imlib_context_set_dither(1);
imlib_context_set_drawable(pmap);
imlib_context_set_mask(mask);
imlib_context_set_blend(0);
imlib_context_set_color_modifier(NULL);
imlib_render_image_on_drawable(0, 0);
e_window_set_background_pixmap(guides.win.display, pmap);
e_window_set_shape_mask(guides.win.display, mask);
e_window_clear(guides.win.display);
e_pixmap_free(pmap);
e_pixmap_free(mask);
}
e_window_move(guides.win.display, dx, dy);
e_window_resize(guides.win.display, dw, dh);
if (guides.current.mode == E_GUIDES_BOX)
{
int fr, fg, fb, fa, br, bg, bb, ba;
int x, y, w, h;
Pixmap pmap, mask;
Imlib_Image image;
imlib_context_set_dither_mask(1);
imlib_context_set_dither(1);
imlib_context_set_blend(1);
imlib_context_set_color_modifier(NULL);
fr = 255; fg = 255; fb = 255; fa = 255;
br = 0 ; bg = 0 ; bb = 0 ; ba = 255;
x = guides.current.x;
y = guides.current.y + 3;
w = 3;
h = guides.current.h - 6;
if ((w > 0) && (h > 0))
{
image = imlib_create_image(w, h);
imlib_context_set_image(image);
imlib_image_set_has_alpha(1);
imlib_image_clear();
imlib_context_set_color(fr, fg, fb, fa);
imlib_image_draw_line(1, 0, 1, h - 1, 0);
imlib_context_set_color(br, bg, bb, ba);
imlib_image_draw_line(0, 0, 0, h - 1, 0);
imlib_image_draw_line(2, 0, 2, h - 1, 0);
pmap = e_pixmap_new(guides.win.l, w, h, 0);
mask = e_pixmap_new(guides.win.l, w, h, 1);
imlib_context_set_drawable(pmap);
imlib_context_set_mask(mask);
imlib_render_image_on_drawable(0, 0);
imlib_free_image();
e_window_move(guides.win.l, x, y);
e_window_resize(guides.win.l, w, h);
e_window_set_background_pixmap(guides.win.l, pmap);
e_window_set_shape_mask(guides.win.l, mask);
e_window_clear(guides.win.l);
e_pixmap_free(pmap);
e_pixmap_free(mask);
}
else
{
e_window_resize(guides.win.l, 0, 0);
}
x = guides.current.x + guides.current.w - 3;
y = guides.current.y + 3;
w = 3;
h = guides.current.h - 6;
if ((w > 0) && (h > 0))
{
image = imlib_create_image(w, h);
imlib_context_set_image(image);
imlib_image_set_has_alpha(1);
imlib_image_clear();
imlib_context_set_color(fr, fg, fb, fa);
imlib_image_draw_line(1, 0, 1, h - 1, 0);
imlib_context_set_color(br, bg, bb, ba);
imlib_image_draw_line(0, 0, 0, h - 1, 0);
imlib_image_draw_line(2, 0, 2, h - 1, 0);
pmap = e_pixmap_new(guides.win.r, w, h, 0);
mask = e_pixmap_new(guides.win.r, w, h, 1);
imlib_context_set_drawable(pmap);
imlib_context_set_mask(mask);
imlib_render_image_on_drawable(0, 0);
imlib_free_image();
e_window_move(guides.win.r, x, y);
e_window_resize(guides.win.r, w, h);
e_window_set_background_pixmap(guides.win.r, pmap);
e_window_set_shape_mask(guides.win.r, mask);
e_window_clear(guides.win.r);
e_pixmap_free(pmap);
e_pixmap_free(mask);
}
else
{
e_window_resize(guides.win.r, 0, 0);
}
x = guides.current.x;
y = guides.current.y;
w = guides.current.w;
h = 3;
if ((w > 0) && (h > 0))
{
image = imlib_create_image(w, h);
imlib_context_set_image(image);
imlib_image_set_has_alpha(1);
imlib_image_clear();
imlib_context_set_color(br, bg, bb, ba);
imlib_image_draw_line(0, 0, w - 1, 0, 0);
imlib_image_draw_line(2, 2, w - 3, 2, 0);
imlib_image_draw_line(0, 1, 0, 2, 0);
imlib_image_draw_line(w - 1, 1, w - 1, 2, 0);
imlib_context_set_color(fr, fg, fb, fa);
imlib_image_draw_line(1, 1, w - 2, 1, 0);
imlib_image_draw_line(1, 2, 1, 2, 0);
imlib_image_draw_line(w - 2, 2, w - 2, 2, 0);
pmap = e_pixmap_new(guides.win.t, w, h, 0);
mask = e_pixmap_new(guides.win.t, w, h, 1);
imlib_context_set_drawable(pmap);
imlib_context_set_mask(mask);
imlib_render_image_on_drawable(0, 0);
imlib_free_image();
e_window_move(guides.win.t, x, y);
e_window_resize(guides.win.t, w, h);
e_window_set_background_pixmap(guides.win.t, pmap);
e_window_set_shape_mask(guides.win.t, mask);
e_window_clear(guides.win.t);
e_pixmap_free(pmap);
e_pixmap_free(mask);
}
else
{
e_window_resize(guides.win.t, 0, 0);
}
x = guides.current.x;
y = guides.current.y + guides.current.h - 3;
w = guides.current.w;
h = 3;
if ((w > 0) && (h > 0))
{
image = imlib_create_image(w, h);
imlib_context_set_image(image);
imlib_image_set_has_alpha(1);
imlib_image_clear();
imlib_context_set_color(br, bg, bb, ba);
imlib_image_draw_line(0, 2, w - 1, 2, 0);
imlib_image_draw_line(2, 0, w - 3, 0, 0);
imlib_image_draw_line(0, 0, 0, 1, 0);
imlib_image_draw_line(w - 1, 0, w - 1, 1, 0);
imlib_context_set_color(fr, fg, fb, fa);
imlib_image_draw_line(1, 1, w - 2, 1, 0);
imlib_image_draw_line(1, 0, 1, 0, 0);
imlib_image_draw_line(w - 2, 0, w - 2, 0, 0);
pmap = e_pixmap_new(guides.win.b, w, h, 0);
mask = e_pixmap_new(guides.win.b, w, h, 1);
imlib_context_set_drawable(pmap);
imlib_context_set_mask(mask);
imlib_render_image_on_drawable(0, 0);
imlib_free_image();
e_window_move(guides.win.b, x, y);
e_window_resize(guides.win.b, w, h);
e_window_set_background_pixmap(guides.win.b, pmap);
e_window_set_shape_mask(guides.win.b, mask);
e_window_clear(guides.win.b);
e_pixmap_free(pmap);
e_pixmap_free(mask);
}
else
{
e_window_resize(guides.win.b, 0, 0);
}
}
}
if (guides.prev.visible != guides.current.visible)
{
if (guides.current.visible)
{
if (guides.current.mode != E_GUIDES_OPAQUE)
{
e_window_raise(guides.win.l);
e_window_show(guides.win.l);
e_window_raise(guides.win.r);
e_window_show(guides.win.r);
e_window_raise(guides.win.t);
e_window_show(guides.win.t);
e_window_raise(guides.win.b);
e_window_show(guides.win.b);
}
e_window_raise(guides.win.display);
e_window_show(guides.win.display);
}
}
if (guides.current.mode != guides.prev.mode)
{
if (guides.current.mode == E_GUIDES_BOX)
{
e_window_raise(guides.win.l);
e_window_show(guides.win.l);
e_window_raise(guides.win.r);
e_window_show(guides.win.r);
e_window_raise(guides.win.t);
e_window_show(guides.win.t);
e_window_raise(guides.win.b);
e_window_show(guides.win.b);
}
else if (guides.prev.mode == E_GUIDES_OPAQUE)
{
e_window_hide(guides.win.l);
e_window_hide(guides.win.r);
e_window_hide(guides.win.t);
e_window_hide(guides.win.b);
}
}
guides.prev = guides.current;
}
void
e_guides_show(void)
{
if (guides.current.visible) return;
guides.changed = 1;
guides.current.visible = 1;
}
void
e_guides_hide(void)
{
if (!guides.current.visible) return;
guides.changed = 1;
guides.current.visible = 0;
}
void
e_guides_move(int x, int y)
{
if ((guides.current.x == x) &&
(guides.current.y == y)) return;
guides.changed = 1;
guides.current.x = x;
guides.current.y = y;
}
void
e_guides_resize(int w, int h)
{
if ((guides.current.w == w) &&
(guides.current.h == h)) return;
guides.changed = 1;
guides.current.w = w;
guides.current.h = h;
}
void
e_guides_display_text(char *text)
{
if ((guides.current.display.text) && (text) &&
(!strcmp(guides.current.display.text, text))) return;
guides.changed = 1;
IF_FREE(guides.current.display.text);
guides.current.display.text = NULL;
guides.prev.display.text = (char *)1;
e_strdup(guides.current.display.text, text);
}
void
e_guides_display_icon(char *icon)
{
if ((guides.current.display.icon) && (icon) &&
(!strcmp(guides.current.display.icon, icon))) return;
guides.changed = 1;
IF_FREE(guides.current.display.icon);
guides.current.display.icon = NULL;
guides.prev.display.icon = (char *)1;
e_strdup(guides.current.display.icon, icon);
}
void
e_guides_set_display_location(E_Guides_Location loc)
{
if (guides.current.display.loc == loc) return;
guides.changed = 1;
guides.current.display.loc = loc;
}
void
e_guides_set_display_alignment(double x, double y)
{
if ((guides.current.display.align.x == x) &&
(guides.current.display.align.y == y)) return;
guides.changed = 1;
guides.current.display.align.x = x;
guides.current.display.align.y = y;
}
void
e_guides_set_mode(E_Guides_Mode mode)
{
if (guides.current.mode == mode) return;
guides.changed = 1;
guides.current.mode = mode;
}
void e_guides_init(void)
{
guides.changed = 0;
guides.current.display.loc = E_GUIDES_DISPLAY_LOCATION_SCREEN_MIDDLE;
guides.current.display.text = NULL;
guides.current.display.icon = NULL;
guides.current.display.align.x = 0.5;
guides.current.display.align.y = 0.5;
guides.current.x = 0;
guides.current.y = 0;
guides.current.w = 0;
guides.current.h = 0;
guides.current.visible = 0;
guides.current.mode = E_GUIDES_BOX;
guides.prev = guides.current;
guides.win.display = 0;
guides.win.l = 0;
guides.win.r = 0;
guides.win.t = 0;
guides.win.b = 0;
guides.disp.evas = NULL;
guides.disp.bg = NULL;
guides.disp.text = NULL;
guides.disp.icon = NULL;
guides.disp.image = NULL;
e_event_filter_idle_handler_add(e_guides_idle, NULL);
}