From 786eb441fc903d51112ae5862e76da4558ed4895 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Mon, 5 Mar 2001 03:04:33 +0000 Subject: [PATCH] fs.c updated for efsd changes entry.c started.. workingon entry box code... its actually not THAT hard... :) all i have left is to do selections in an entry box (and do X clipboard stuff) amnd be able to do pastes from the X clipboard. (and delete selections when u type when a selection is up and the rest of the selection logic) - but for a basic textbox... it works :) SVN revision: 4311 --- src/Makefile.am | 1 + src/border.c | 1 + src/e.h | 38 +++++ src/entry.c | 379 ++++++++++++++++++++++++++++++++++++++++++++++++ src/main.c | 1 + src/view.c | 22 ++- 6 files changed, 440 insertions(+), 2 deletions(-) create mode 100644 src/entry.c diff --git a/src/Makefile.am b/src/Makefile.am index cb6809e50..5a72aac85 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -12,6 +12,7 @@ background.c \ border.c \ config.c \ desktops.c \ +entry.c \ exec.c \ fs.c \ icccm.c \ diff --git a/src/border.c b/src/border.c index 5dad9630b..b3de4dcc7 100644 --- a/src/border.c +++ b/src/border.c @@ -2066,6 +2066,7 @@ e_border_init(void) e_event_filter_handler_add(EV_WINDOW_SHAPE, e_shape); e_event_filter_handler_add(EV_WINDOW_FOCUS_IN, e_focus_in); e_event_filter_handler_add(EV_WINDOW_FOCUS_OUT, e_focus_out); + e_event_filter_handler_add(EV_MESSAGE, e_client_message); e_event_filter_handler_add(EV_COLORMAP, e_colormap); e_event_filter_idle_handler_add(e_idle, NULL); diff --git a/src/e.h b/src/e.h index 596fd1fbb..6d635b280 100644 --- a/src/e.h +++ b/src/e.h @@ -138,6 +138,7 @@ typedef struct _E_Background E_Background; typedef struct _E_Menu E_Menu; typedef struct _E_Menu_Item E_Menu_Item; typedef struct _E_Build_Menu E_Build_Menu; +typedef struct _E_Entry E_Entry; struct _E_Object { @@ -539,6 +540,43 @@ struct _E_Build_Menu Evas_List commands; }; +struct _E_Entry +{ + Evas evas; + char *buffer; + int cursor_pos; + struct { + int start, length; + } select; + int visible; + int focused; + int x, y, w, h; + Evas_Object event_box; + Evas_Object clip_box; + Evas_Object cursor; + Evas_Object text; +}; + +void e_entry_init(void); +void e_entry_free(E_Entry *entry); +E_Entry *e_entry_new(void); +void e_entry_handle_keypress(E_Entry *entry, Ev_Key_Down *e); +void e_entry_set_evas(E_Entry *entry, Evas evas); +void e_entry_show(E_Entry *entry); +void e_entry_hide(E_Entry *entry); +void e_entry_set_layer(E_Entry *entry, int l); +void e_entry_set_clip(E_Entry *entry, Evas_Object clip); +void e_entry_unset_clip(E_Entry *entry); +void e_entry_move(E_Entry *entry, int x, int y); +void e_entry_resize(E_Entry *entry, int w, int h); +void e_entry_query_max_size(E_Entry *entry, int *w, int *h); +void e_entry_set_focus(E_Entry *entry, int focused); +void e_entry_set_text(E_Entry *entry, const char *text); +const char *e_entry_get_text(E_Entry *entry); +void e_entry_set_cursor(E_Entry *entry, int cursor_pos); +int e_entry_get_curosr(E_Entry *entry); + + void e_action_add_proto(char *action, void (*func_start) (void *o, E_Action *a, void *data, int x, int y, int rx, int ry), void (*func_stop) (void *o, E_Action *a, void *data, int x, int y, int rx, int ry), diff --git a/src/entry.c b/src/entry.c new file mode 100644 index 000000000..1153294f1 --- /dev/null +++ b/src/entry.c @@ -0,0 +1,379 @@ +#include "e.h" + +static void +e_entry_down_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) +{ + E_Entry *entry; + int pos; + + entry = _data; + printf("%i %i\n", _x, _y); + entry->focused = 1; + pos = evas_text_at_position(_e, entry->text, _x, _y, + NULL, NULL, NULL, NULL); + printf("%i\n", pos); + if (pos < 0) + { + int tw; + + tw = evas_get_text_width(_e, entry->text); + if (_x > entry->x + tw) + { + entry->cursor_pos = strlen(entry->buffer); + } + } + else + { + entry->cursor_pos = pos; + } +/* + entry->select.start = entry->cursor_pos; + entry->select.length = 1; +*/ + e_entry_configure(entry); +} + +static void +e_entry_up_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) +{ + E_Entry *entry; + + entry = _data; +} + +static void +e_entry_move_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) +{ + E_Entry *entry; + + entry = _data; +} + +static void +e_entry_realize(E_Entry *entry) +{ + entry->clip_box = evas_add_rectangle(entry->evas); + entry->text = evas_add_text(entry->evas, "borzoib", 8, ""); + entry->cursor = evas_add_rectangle(entry->evas); + entry->event_box = evas_add_rectangle(entry->evas); + evas_set_color(entry->evas, entry->clip_box, 255, 255, 255, 255); + evas_set_color(entry->evas, entry->event_box, 50, 100, 200, 50); + evas_set_color(entry->evas, entry->text, 0, 0, 0, 255); + evas_set_color(entry->evas, entry->cursor, 255, 255, 255, 100); + evas_set_clip(entry->evas, entry->text, entry->clip_box); + evas_set_clip(entry->evas, entry->event_box, entry->clip_box); + evas_set_clip(entry->evas, entry->cursor, entry->clip_box); + evas_callback_add(entry->evas, entry->event_box, CALLBACK_MOUSE_DOWN, e_entry_down_cb, entry); + evas_callback_add(entry->evas, entry->event_box, CALLBACK_MOUSE_UP, e_entry_up_cb, entry); + evas_callback_add(entry->evas, entry->event_box, CALLBACK_MOUSE_MOVE, e_entry_move_cb, entry); +} + +static void +e_entry_unrealize(E_Entry *entry) +{ + if (entry->event_box) evas_del_object(entry->evas, entry->event_box); + if (entry->cursor) evas_del_object(entry->evas, entry->cursor); + if (entry->text) evas_del_object(entry->evas, entry->text); + if (entry->clip_box) evas_del_object(entry->evas, entry->clip_box); +} + +static void +e_entry_configure(E_Entry *entry) +{ + if (!entry->evas) return; + if (!entry->event_box) return; + evas_move(entry->evas, entry->clip_box, entry->x, entry->y); + evas_resize(entry->evas, entry->clip_box, entry->w, entry->h); + evas_move(entry->evas, entry->event_box, entry->x, entry->y); + evas_resize(entry->evas, entry->event_box, entry->w, entry->h); + evas_move(entry->evas, entry->text, entry->x, entry->y); + if ((entry->buffer) && (entry->buffer[0] != 0) && (entry->focused)) + { + int tx, ty, tw, th; + + if (entry->cursor_pos < strlen(entry->buffer)) + { + evas_text_at(entry->evas, entry->text, entry->cursor_pos, &tx, &ty, &tw, &th); + } + else + { + entry->cursor_pos = strlen(entry->buffer); + evas_text_at(entry->evas, entry->text, entry->cursor_pos - 1, &tx, &ty, &tw, &th); + tx += tw; + tw = 4; + } + evas_move(entry->evas, entry->cursor, entry->x + tx, entry->y + ty); + evas_resize(entry->evas, entry->cursor, tw, th); + evas_show(entry->evas, entry->cursor); + } + else if (entry->focused) + { + int th; + + th = evas_get_text_height(entry->evas, entry->text); + evas_move(entry->evas, entry->cursor, entry->x, entry->y); + evas_resize(entry->evas, entry->cursor, 4, th); + evas_show(entry->evas, entry->cursor); + } + else + { + evas_hide(entry->evas, entry->cursor); + } +} + +void +e_entry_init(void) +{ +} + +void +e_entry_free(E_Entry *entry) +{ +} + +E_Entry * +e_entry_new(void) +{ + E_Entry *entry; + + entry = NEW(E_Entry, 1); + ZERO(entry, E_Entry, 1); + entry->buffer=strdup(""); + return entry; +} + +void +e_entry_handle_keypress(E_Entry *entry, Ev_Key_Down *e) +{ + if (!strcmp(e->key, "Up")) + { + } + else if (!strcmp(e->key, "Down")) + { + } + else if (!strcmp(e->key, "Left")) + { + entry->cursor_pos--; + if (entry->cursor_pos < 0) + entry->cursor_pos = 0; + } + else if (!strcmp(e->key, "Right")) + { + entry->cursor_pos++; + if (entry->cursor_pos > strlen(entry->buffer)) + entry->cursor_pos = strlen(entry->buffer); + } + else if (!strcmp(e->key, "Escape")) + { + entry->focused = 0; + } + else if (!strcmp(e->key, "BackSpace")) + { + char *str2; + + if (entry->cursor_pos > 0) + { + str2 = strdup(e_entry_get_text(entry)); + strcpy(&(str2[entry->cursor_pos - 1]), &(entry->buffer[entry->cursor_pos])); + entry->cursor_pos--; + e_entry_set_text(entry, str2); + free(str2); + } + } + else if (!strcmp(e->key, "Delete")) + { + char *str2; + + if (entry->cursor_pos < strlen(entry->buffer)) + { + str2 = strdup(e_entry_get_text(entry)); + strcpy(&(str2[entry->cursor_pos]), &(entry->buffer[entry->cursor_pos + 1])); + e_entry_set_text(entry, str2); + free(str2); + } + } + else if (!strcmp(e->key, "Insert")) + { + } + else if (!strcmp(e->key, "Home")) + { + entry->cursor_pos = 0; + } + else if (!strcmp(e->key, "End")) + { + entry->cursor_pos = strlen(entry->buffer); + } + else if (!strcmp(e->key, "Prior")) + { + entry->cursor_pos = 0; + } + else if (!strcmp(e->key, "Next")) + { + entry->cursor_pos = strlen(entry->buffer); + } + else if (!strcmp(e->key, "Return")) + { + entry->focused = 0; + } + else + { + char *type; + + printf("%s\n", e->key); + type = e_key_press_translate_into_typeable(e); + if (type) + { + if ((strlen(type) == 1) && (type[0] == 0x01)) /* ctrl+a */ + { + entry->cursor_pos = 0; + } + else if ((strlen(type) == 1) && (type[0] == 0x05)) /* ctrl+e */ + { + entry->cursor_pos = strlen(entry->buffer); + } + else if ((strlen(type) == 1) && (type[0] == 0x0b)) /* ctk+k */ + { + char *str2; + + str2 = strdup(e_entry_get_text(entry)); + str2[entry->cursor_pos] = 0; + e_entry_set_text(entry, str2); + free(str2); + } + else if (strlen(type) > 0) + { + char *str2; + + printf("%i: %x\n", strlen(type), (unsigned char)type[0]); + str2 = malloc(strlen(e_entry_get_text(entry)) + 1 + strlen(type)); + str2[0] = 0; + strncat(str2, entry->buffer, entry->cursor_pos); + strcat(str2, type); + strcat(str2, &(entry->buffer[entry->cursor_pos])); + e_entry_set_text(entry, str2); + free(str2); + entry->cursor_pos++; + printf("type: ->%s<-\n", type); + } + } + } + e_entry_configure(entry); +} + +void +e_entry_set_evas(E_Entry *entry, Evas evas) +{ + if (entry->evas) e_entry_unrealize(entry); + entry->evas = evas; + e_entry_realize(entry); + e_entry_configure(entry); + if (entry->visible) + { + entry->visible = 0; + e_entry_show(entry); + } +} + +void +e_entry_show(E_Entry *entry) +{ + if (entry->visible) return; + entry->visible = 1; + if (!entry->evas) return; + evas_show(entry->evas, entry->event_box); + evas_show(entry->evas, entry->clip_box); + if (entry->focused) evas_show(entry->evas, entry->cursor); + evas_show(entry->evas, entry->text); +} + +void +e_entry_hide(E_Entry *entry) +{ + if (!entry->visible) return; + entry->visible = 0; + if (!entry->evas) return; + evas_hide(entry->evas, entry->event_box); + evas_hide(entry->evas, entry->clip_box); + evas_hide(entry->evas, entry->cursor); + evas_hide(entry->evas, entry->text); +} + +void +e_entry_set_layer(E_Entry *entry, int l) +{ + evas_set_layer(entry->evas, entry->clip_box, l); + evas_set_layer(entry->evas, entry->text, l); + evas_set_layer(entry->evas, entry->cursor, l); + evas_set_layer(entry->evas, entry->event_box, l); +} + +void +e_entry_set_clip(E_Entry *entry, Evas_Object clip) +{ + evas_set_clip(entry->evas, entry->clip_box, clip); +} + +void +e_entry_unset_clip(E_Entry *entry) +{ + evas_unset_clip(entry->evas, entry->clip_box); +} + +void +e_entry_move(E_Entry *entry, int x, int y) +{ + entry->x = x; + entry->y = y; + e_entry_configure(entry); +} + +void +e_entry_resize(E_Entry *entry, int w, int h) +{ + entry->w = w; + entry->h = h; + e_entry_configure(entry); +} + +void +e_entry_query_max_size(E_Entry *entry, int *w, int *h) +{ +} + +void +e_entry_set_focus(E_Entry *entry, int focused) +{ + entry->focused = focused; + e_entry_configure(entry); +} + +void +e_entry_set_text(E_Entry *entry, const char *text) +{ + IF_FREE(entry->buffer); + entry->buffer = strdup(text); + evas_set_text(entry->evas, entry->text, entry->buffer); + printf("%i %i (%s)\n", entry->cursor_pos, strlen(entry->buffer), entry->buffer); + if (entry->cursor_pos > strlen(entry->buffer)) + entry->cursor_pos = strlen(entry->buffer); + e_entry_configure(entry); +} + +const char * +e_entry_get_text(E_Entry *entry) +{ + return entry->buffer; +} + +void +e_entry_set_cursor(E_Entry *entry, int cursor_pos) +{ + entry->cursor_pos = cursor_pos; + e_entry_configure(entry); +} + +int +e_entry_get_curosr(E_Entry *entry) +{ + return entry->cursor_pos; +} diff --git a/src/main.c b/src/main.c index b96dc897a..65bf169b9 100644 --- a/src/main.c +++ b/src/main.c @@ -53,6 +53,7 @@ main(int argc, char **argv) e_actions_init(); e_menu_init(); e_view_init(); + e_entry_init(); setup(); diff --git a/src/view.c b/src/view.c index bae82e7c2..ba9ac5291 100644 --- a/src/view.c +++ b/src/view.c @@ -17,6 +17,9 @@ static void e_mouse_out(Eevent * ev); static void e_window_expose(Eevent * ev); static void e_view_handle_fs(EfsdEvent *ev); +/* FIXME: hack to test entry boxes */ +static E_Entry *entry = NULL; + static void e_bg_down_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) { @@ -161,6 +164,8 @@ e_key_down(Eevent * ev) if ((e->win == v->win.base) || (e->win == v->win.main)) { + /* FIXME: hack to test enty boxes */ + if (entry) e_entry_handle_keypress(entry, e); if (!strcmp(e->key, "Up")) { } @@ -703,9 +708,9 @@ e_view_new(void) v = NEW(E_View, 1); ZERO(v, E_View, 1); OBJ_INIT(v, e_view_free); -/* #define SOFT_DESK */ +#define SOFT_DESK /* #define X_DESK */ -#define GL_DESK +/* #define GL_DESK */ #ifdef SOFT_DESK /* ONLY alpha software can be "backing stored" */ @@ -867,6 +872,19 @@ e_view_realize(E_View *v) e_shelf_realize(sh); } } + + /* FIXME: hack to test entry boxes */ + { + entry = e_entry_new(); + e_entry_set_evas(entry, v->evas); + e_entry_set_layer(entry, 100); + e_entry_move(entry, 100, 100); + e_entry_resize(entry, 100, 24); + e_entry_set_focus(entry, 1); + e_entry_show(entry); + e_entry_set_text(entry, "Some Entry Text"); + } + v->changed = 1; }