From 349a1016c6e79f9d8e8c05d84cfabd498067622b Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Thu, 6 Sep 2001 13:20:35 +0000 Subject: [PATCH] started work on guides (for rubber banding etc.) and changed code to match ebits changes... (sorry everyone.. ebtis changes needed doing) SVN revision: 5333 --- src/Makefile.am | 3 +- src/border.c | 18 +-- src/guides.c | 316 ++++++++++++++++++++++++++++++++++++++++++++++++ src/guides.h | 25 ++++ src/main.c | 1 + src/scrollbar.c | 20 +-- src/view.c | 19 +++ 7 files changed, 382 insertions(+), 20 deletions(-) create mode 100644 src/guides.c create mode 100644 src/guides.h diff --git a/src/Makefile.am b/src/Makefile.am index 2b5e90bfe..395afbff4 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -26,6 +26,7 @@ enlightenment_SOURCES = \ exec.h exec.c \ fs.h fs.c \ $(ferite_c) \ + guides.h guides.c \ icccm.h icccm.c \ icons.c \ ipc.h ipc.c \ @@ -42,7 +43,7 @@ enlightenment_SOURCES = \ view.h view.c \ e.h -enlightenment_LDADD = @evas_libs@ @edb_libs@ @ebits_libs@ @ecore_libs@ @efsd_libs@ @ferite_libs@ -lm -lc -ldl $(INTLLIBS) +enlightenment_LDADD = @evas_libs@ @edb_libs@ @ebits_libs@ @ecore_libs@ @efsd_libs@ @ferite_libs@ -lm -lc $(INTLLIBS) e_ferite_gen_core.c: e_ferite.fec rm -f e_ferite_gen_* ; \ diff --git a/src/border.c b/src/border.c index 94708ce0e..4410af9e5 100644 --- a/src/border.c +++ b/src/border.c @@ -1699,11 +1699,11 @@ e_border_set_bits(E_Border *b, char *file) e_border_set_color_class(b, "Title BG", 100, 200, 255, 255); #define HOOK_CB(_class) \ -ebits_set_bit_callback(b->bits.t, _class, CALLBACK_MOUSE_IN, e_cb_mouse_in, b); \ -ebits_set_bit_callback(b->bits.t, _class, CALLBACK_MOUSE_OUT, e_cb_mouse_out, b); \ -ebits_set_bit_callback(b->bits.t, _class, CALLBACK_MOUSE_DOWN, e_cb_mouse_down, b); \ -ebits_set_bit_callback(b->bits.t, _class, CALLBACK_MOUSE_UP, e_cb_mouse_up, b); \ -ebits_set_bit_callback(b->bits.t, _class, CALLBACK_MOUSE_MOVE, e_cb_mouse_move, b); +ebits_set_classed_bit_callback(b->bits.t, _class, CALLBACK_MOUSE_IN, e_cb_mouse_in, b); \ +ebits_set_classed_bit_callback(b->bits.t, _class, CALLBACK_MOUSE_OUT, e_cb_mouse_out, b); \ +ebits_set_classed_bit_callback(b->bits.t, _class, CALLBACK_MOUSE_DOWN, e_cb_mouse_down, b); \ +ebits_set_classed_bit_callback(b->bits.t, _class, CALLBACK_MOUSE_UP, e_cb_mouse_up, b); \ +ebits_set_classed_bit_callback(b->bits.t, _class, CALLBACK_MOUSE_MOVE, e_cb_mouse_move, b); HOOK_CB("Title_Bar"); HOOK_CB("Resize"); HOOK_CB("Resize_Horizontal"); @@ -2062,25 +2062,25 @@ e_border_update(E_Border *b) { double tx, ty, tw, th; - ebits_get_bit_geometry(b->bits.l, "Title_Area", &tx, &ty, &tw, &th); + ebits_get_named_bit_geometry(b->bits.l, "Title_Area", &tx, &ty, &tw, &th); evas_set_text(b->evas.l, b->obj.title.l, b->client.title); evas_move(b->evas.l, b->obj.title.l, tx, ty); evas_move(b->evas.l, b->obj.title_clip.l, tx, ty); evas_resize(b->evas.l, b->obj.title_clip.l, tw, th); - ebits_get_bit_geometry(b->bits.r, "Title_Area", &tx, &ty, &tw, &th); + ebits_get_named_bit_geometry(b->bits.r, "Title_Area", &tx, &ty, &tw, &th); evas_set_text(b->evas.r, b->obj.title.r, b->client.title); evas_move(b->evas.r, b->obj.title.r, tx, ty); evas_move(b->evas.r, b->obj.title_clip.r, tx, ty); evas_resize(b->evas.r, b->obj.title_clip.r, tw, th); - ebits_get_bit_geometry(b->bits.t, "Title_Area", &tx, &ty, &tw, &th); + ebits_get_named_bit_geometry(b->bits.t, "Title_Area", &tx, &ty, &tw, &th); evas_set_text(b->evas.t, b->obj.title.t, b->client.title); evas_move(b->evas.t, b->obj.title.t, tx, ty); evas_move(b->evas.t, b->obj.title_clip.t, tx, ty); evas_resize(b->evas.t, b->obj.title_clip.t, tw, th); - ebits_get_bit_geometry(b->bits.b, "Title_Area", &tx, &ty, &tw, &th); + ebits_get_named_bit_geometry(b->bits.b, "Title_Area", &tx, &ty, &tw, &th); evas_set_text(b->evas.b, b->obj.title.b, b->client.title); evas_move(b->evas.b, b->obj.title.b, tx, ty); evas_move(b->evas.b, b->obj.title_clip.b, tx, ty); diff --git a/src/guides.c b/src/guides.c new file mode 100644 index 000000000..21f9173af --- /dev/null +++ b/src/guides.c @@ -0,0 +1,316 @@ +#include "guides.h" +#include "text.h" +#include "config.h" + +static struct +{ + int changed; + + struct + { + struct + { + int loc; + struct + { + double x, y; + } align; + char *text; + char *icon; + } display; + int x, y, w, h; + int visible; + int 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; +} 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 max_colors = 216; + 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_new(0, 0, 0, 1, 1); + guides.win.l = e_window_new(0, 0, 0, 1, 1); + guides.win.r = e_window_new(0, 0, 0, 1, 1); + guides.win.t = e_window_new(0, 0, 0, 1, 1); + guides.win.b = e_window_new(0, 0, 0, 1, 1); + 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); + } + if (guides.disp.evas) + { + 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; + int iw, ih; + double tw, th; + 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.disp.bg) + { + 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); + } + } + if ((!guides.current.display.text) && (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); + } + if (guides.disp.icon) + { + evas_set_image_file(guides.disp.evas, guides.disp.icon, guides.current.display.icon); + evas_get_image_size(guides.disp.evas, guides.disp.icon, &iw, &ih); + } + e_text_set_text(guides.disp.text, guides.current.display.text); + e_text_get_min_size(guides.disp.text, &tw, &th); + + if (guides.current.mode == E_GUIDES_BOX) + { + + } + } + + if (guides.prev.visible != guides.current.visible) + { + if (guides.current.visible) + { + e_window_raise(guides.win.display); + e_window_show(guides.win.display); + 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); + } + } + 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; + if (text) + guides.current.display.text = strdup(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; + if (icon) + guides.current.display.icon = strdup(icon); +} + +void +e_guides_set_display_location(int 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(int 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); +} diff --git a/src/guides.h b/src/guides.h new file mode 100644 index 000000000..ebe8f311a --- /dev/null +++ b/src/guides.h @@ -0,0 +1,25 @@ +#ifndef E_GUIDES_H +#define E_GUIDES_H + +#include "e.h" + +#define E_GUIDES_OPAQUE 0 /* configure window border & client */ +#define E_GUIDES_BORDER 1 /* unmap client and configure window border */ +#define E_GUIDES_BOX 2 /* box outline */ +#define E_GUIDES_TECHNICAL 3 /* lots of lines & info */ + +#define E_GUIDES_DISPLAY_LOCATION_WINDOW_MIDDLE 0 +#define E_GUIDES_DISPLAY_LOCATION_SCREEN_MIDDLE 1 + +void e_guides_show(void); +void e_guides_hide(void); +void e_guides_move(int x, int y); +void e_guides_resize(int w, int h); +void e_guides_display_text(char *text); +void e_guides_display_icon(char *icon); +void e_guides_set_display_location(int loc); +void e_guides_set_display_alignment(double x, double y); +void e_guides_set_mode(int mode); +void e_guides_init(void); + +#endif diff --git a/src/main.c b/src/main.c index 2a3d5a537..029f280eb 100644 --- a/src/main.c +++ b/src/main.c @@ -127,6 +127,7 @@ main(int argc, char **argv) e_view_init(); e_entry_init(); e_keys_init(); + e_guides_init(); #ifdef USE_FERITE e_ferite_init(); diff --git a/src/scrollbar.c b/src/scrollbar.c index f3f2ab216..87a895b2f 100644 --- a/src/scrollbar.c +++ b/src/scrollbar.c @@ -17,7 +17,7 @@ e_scrollbar_recalc(E_Scrollbar *sb) { double x, y, w, h; - ebits_get_bit_geometry(sb->base, "Trough_Area", + ebits_get_named_bit_geometry(sb->base, "Trough_Area", &x, &y, &w, &h); sb->bar_area.x = x + sb->x; sb->bar_area.y = y + sb->y; @@ -76,19 +76,19 @@ e_scrollbar_setup_bits(E_Scrollbar *sb) if (sb->base) { ebits_add_to_evas(sb->base, sb->evas); - ebits_set_bit_callback(sb->base, "Scrollbar_Trough", CALLBACK_MOUSE_DOWN, e_sb_base_down_cb, sb); - ebits_set_bit_callback(sb->base, "Scrollbar_Trough", CALLBACK_MOUSE_UP, e_sb_base_up_cb, sb); - ebits_set_bit_callback(sb->base, "Scrollbar_Arrow1", CALLBACK_MOUSE_DOWN, e_sb_base_down_cb, sb); - ebits_set_bit_callback(sb->base, "Scrollbar_Arrow1", CALLBACK_MOUSE_UP, e_sb_base_up_cb, sb); - ebits_set_bit_callback(sb->base, "Scrollbar_Arrow2", CALLBACK_MOUSE_DOWN, e_sb_base_down_cb, sb); - ebits_set_bit_callback(sb->base, "Scrollbar_Arrow2", CALLBACK_MOUSE_UP, e_sb_base_up_cb, sb); + ebits_set_classed_bit_callback(sb->base, "Scrollbar_Trough", CALLBACK_MOUSE_DOWN, e_sb_base_down_cb, sb); + ebits_set_classed_bit_callback(sb->base, "Scrollbar_Trough", CALLBACK_MOUSE_UP, e_sb_base_up_cb, sb); + ebits_set_classed_bit_callback(sb->base, "Scrollbar_Arrow1", CALLBACK_MOUSE_DOWN, e_sb_base_down_cb, sb); + ebits_set_classed_bit_callback(sb->base, "Scrollbar_Arrow1", CALLBACK_MOUSE_UP, e_sb_base_up_cb, sb); + ebits_set_classed_bit_callback(sb->base, "Scrollbar_Arrow2", CALLBACK_MOUSE_DOWN, e_sb_base_down_cb, sb); + ebits_set_classed_bit_callback(sb->base, "Scrollbar_Arrow2", CALLBACK_MOUSE_UP, e_sb_base_up_cb, sb); } if (sb->bar) { ebits_add_to_evas(sb->bar, sb->evas); - ebits_set_bit_callback(sb->bar, "Scrollbar_Bar", CALLBACK_MOUSE_DOWN, e_sb_bar_down_cb, sb); - ebits_set_bit_callback(sb->bar, "Scrollbar_Bar", CALLBACK_MOUSE_UP, e_sb_bar_up_cb, sb); - ebits_set_bit_callback(sb->bar, "Scrollbar_Bar", CALLBACK_MOUSE_MOVE, e_sb_bar_move_cb, sb); + ebits_set_classed_bit_callback(sb->bar, "Scrollbar_Bar", CALLBACK_MOUSE_DOWN, e_sb_bar_down_cb, sb); + ebits_set_classed_bit_callback(sb->bar, "Scrollbar_Bar", CALLBACK_MOUSE_UP, e_sb_bar_up_cb, sb); + ebits_set_classed_bit_callback(sb->bar, "Scrollbar_Bar", CALLBACK_MOUSE_MOVE, e_sb_bar_move_cb, sb); } } diff --git a/src/view.c b/src/view.c index e54e3f267..d57f2ae2b 100644 --- a/src/view.c +++ b/src/view.c @@ -1728,11 +1728,30 @@ e_view_icon_apply_xy(E_Icon *ic) ic->geom.text.w + pl + pr, ic->geom.text.h + pt + pb); ebits_show(ic->obj.sel.over.text); } + if ((ic->geom.x != ic->prev_geom.x) || (ic->geom.y != ic->prev_geom.y)) + { + char buf[4096]; + + sprintf(buf, "%s/%s", ic->view->dir, ic->file); + printf("write meta xy for icon for file %s\n", ic->file); +/* + efsd_set_metadata_int(e_fs_get_connection(), + "/pos/x", buf, + ic->geom.x); + efsd_set_metadata_int(e_fs_get_connection(), + "/pos/y", buf, + ic->geom.y); +*/ } if (ic->geom.x != ic->prev_geom.x) ic->view->extents.valid = 0; else if (ic->geom.y != ic->prev_geom.y) ic->view->extents.valid = 0; else if (ic->geom.w != ic->prev_geom.w) ic->view->extents.valid = 0; else if (ic->geom.h != ic->prev_geom.h) ic->view->extents.valid = 0; + ic->prev_geom = ic->geom; + ic->prev_geom.x = ic->geom.x; + ic->prev_geom.y = ic->geom.y; + ic->prev_geom.w = ic->geom.w; + ic->prev_geom.h = ic->geom.h; } static int