diff --git a/data/config/appearance/default/shelves/default.bits.db b/data/config/appearance/default/shelves/default.bits.db new file mode 100644 index 000000000..83d8a0e5a Binary files /dev/null and b/data/config/appearance/default/shelves/default.bits.db differ diff --git a/src/e.h b/src/e.h index 9c9dc3bc2..4b13daf68 100644 --- a/src/e.h +++ b/src/e.h @@ -339,6 +339,8 @@ struct _E_View int x, y, w, h; } selection; + Evas_Object obj_bg; + E_Background *bg; int is_listing; @@ -394,11 +396,21 @@ struct _E_Shelf OBJ_PROPERTIES; char *name; + E_View *view; int x, y, w, h; struct { Ebits_Object border; } bit; + struct { + Evas_Object clipper; + } obj; + int visible; + int icon_count; + struct { + int moving; + int resizing; + } state; }; struct _E_Background diff --git a/src/shelf.c b/src/shelf.c index 669be2a6e..806eb8782 100644 --- a/src/shelf.c +++ b/src/shelf.c @@ -1,2 +1,278 @@ #include "e.h" +static void e_cb_mouse_in(void *data, Ebits_Object o, char *class, int bt, int x, int y, int ox, int oy, int ow, int oh); +static void e_cb_mouse_out(void *data, Ebits_Object o, char *class, int bt, int x, int y, int ox, int oy, int ow, int oh); +static void e_cb_mouse_down(void *data, Ebits_Object o, char *class, int bt, int x, int y, int ox, int oy, int ow, int oh); +static void e_cb_mouse_up(void *data, Ebits_Object o, char *class, int bt, int x, int y, int ox, int oy, int ow, int oh); +static void e_cb_mouse_move(void *data, Ebits_Object o, char *class, int bt, int x, int y, int ox, int oy, int ow, int oh); + +static int mv_prev_x, mv_prev_y; + +static void +e_cb_mouse_in(void *data, Ebits_Object o, char *class, int bt, int x, int y, int ox, int oy, int ow, int oh) +{ + E_Shelf *sh; + + sh = data; + return; + UN(o); + UN(bt); + UN(ox); + UN(oy); + UN(ow); + UN(oh); +} + +static void +e_cb_mouse_out(void *data, Ebits_Object o, char *class, int bt, int x, int y, int ox, int oy, int ow, int oh) +{ + E_Shelf *sh; + + sh = data; + return; + UN(o); + UN(bt); + UN(ox); + UN(oy); + UN(ow); + UN(oh); +} + +static void +e_cb_mouse_down(void *data, Ebits_Object o, char *class, int bt, int x, int y, int ox, int oy, int ow, int oh) +{ + E_Shelf *sh; + + sh = data; + if (!strcmp(class, "Title_Bar")) + { + mv_prev_x = x; + mv_prev_y = y; + sh->state.moving = 1; + } + return; + UN(o); + UN(bt); + UN(ox); + UN(oy); + UN(ow); + UN(oh); +} + +static void +e_cb_mouse_up(void *data, Ebits_Object o, char *class, int bt, int x, int y, int ox, int oy, int ow, int oh) +{ + E_Shelf *sh; + + sh = data; + if (sh->state.moving) sh->state.moving = 0; + return; + UN(o); + UN(bt); + UN(ox); + UN(oy); + UN(ow); + UN(oh); +} + +static void +e_cb_mouse_move(void *data, Ebits_Object o, char *class, int bt, int x, int y, int ox, int oy, int ow, int oh) +{ + E_Shelf *sh; + + sh = data; + if (sh->state.moving) + { + e_shelf_move_by(sh, x - mv_prev_x, y - mv_prev_y); + mv_prev_x = x; + mv_prev_y = y; + } + return; + UN(o); + UN(bt); + UN(ox); + UN(oy); + UN(ow); + UN(oh); +} + +void +e_shelf_free(E_Shelf *sh) +{ + IF_FREE(sh->name); + FREE(sh); +} + +E_Shelf * +e_shelf_new(void) +{ + E_Shelf *sh; + + sh = NEW(E_Shelf, 1); + ZERO(sh, E_Shelf, 1); + OBJ_INIT(sh, e_shelf_free); + return sh; +} + +void +e_shelf_set_name(E_Shelf *sh, char *name) +{ + IF_FREE(sh->name); + sh->name = strdup(name); +} + +void +e_shelf_set_view(E_Shelf *sh, E_View *v) +{ + sh->view = v; +} + +void +e_shelf_realize(E_Shelf *sh) +{ + int pl, pr, pt, pb; + + sh->bit.border = ebits_load(PACKAGE_DATA_DIR"/data/config/appearance/default/shelves/default.bits.db"); + if (sh->bit.border) + { + ebits_add_to_evas(sh->bit.border, sh->view->evas); + ebits_move(sh->bit.border, sh->x, sh->y); + ebits_resize(sh->bit.border, sh->w, sh->h); + ebits_set_layer(sh->bit.border, 9); + if (sh->visible) + ebits_show(sh->bit.border); + +#define HOOK_CB(_class) \ +ebits_set_bit_callback(sh->bit.border, _class, CALLBACK_MOUSE_IN, e_cb_mouse_in, sh); \ +ebits_set_bit_callback(sh->bit.border, _class, CALLBACK_MOUSE_OUT, e_cb_mouse_out, sh); \ +ebits_set_bit_callback(sh->bit.border, _class, CALLBACK_MOUSE_DOWN, e_cb_mouse_down, sh); \ +ebits_set_bit_callback(sh->bit.border, _class, CALLBACK_MOUSE_UP, e_cb_mouse_up, sh); \ +ebits_set_bit_callback(sh->bit.border, _class, CALLBACK_MOUSE_MOVE, e_cb_mouse_move, sh); + HOOK_CB("Title_Bar"); + HOOK_CB("Resize"); + HOOK_CB("Resize_Horizontal"); + HOOK_CB("Resize_Vertical"); + HOOK_CB("Close"); + HOOK_CB("Iconify"); + HOOK_CB("Max_Size"); + HOOK_CB("Menu"); + } + sh->obj.clipper = evas_add_rectangle(sh->view->evas); + evas_set_layer(sh->view->evas, sh->obj.clipper, 9); + evas_set_color(sh->view->evas, sh->obj.clipper, 255, 255, 255, 255); + + pl = pr = pt = pb = 0; + if (sh->bit.border) ebits_get_insets(sh->bit.border, &pl, &pr, &pt, &pb); + evas_move(sh->view->evas, sh->obj.clipper, sh->x + pl, sh->y + pt); + evas_resize(sh->view->evas, sh->obj.clipper, sh->w - pl - pr, sh->h - pt - pb); + + if ((sh->visible) && (sh->icon_count > 0)) + evas_show(sh->view->evas, sh->obj.clipper); +} + +void +e_shelf_show(E_Shelf *sh) +{ + if (sh->visible) return; + + sh->visible = 1; +} + +void +e_shelf_hide(E_Shelf *sh) +{ + if (!sh->visible) return; + + sh->visible = 0; +} + +void +e_shelf_move(E_Shelf *sh, int x, int y) +{ + int dx, dy; + + dx = x - sh->x; + dy = y - sh->y; + e_shelf_move_by(sh, dx, dy); +} + +void +e_shelf_move_by(E_Shelf *sh, int dx, int dy) +{ + Evas_List l; + + sh->x += dx; + sh->y += dy; + if (sh->bit.border) ebits_move(sh->bit.border, sh->x, sh->y); + if (sh->obj.clipper) + { + int pl, pr, pt, pb; + + pl = pr = pt = pb = 0; + if (sh->bit.border) ebits_get_insets(sh->bit.border, &pl, &pr, &pt, &pb); + evas_move(sh->view->evas, sh->obj.clipper, sh->x + pl, sh->y + pt); + } + return; + for (l = sh->view->icons; l; l = l->next) + { + E_Icon *icon; + int x, y; + + icon = l->data; + if (icon->shelf == sh) + { + e_icon_get_xy(icon, &x, &y); + e_icon_set_xy(icon, x + dx, y + dy); + } + } +} + +void +e_shelf_resize(E_Shelf *sh, int w, int h) +{ + sh->w = w; + sh->h = h; + if (sh->bit.border) ebits_resize(sh->bit.border, sh->w, sh->h); + if (sh->obj.clipper) + { + int pl, pr, pt, pb; + + pl = pr = pt = pb = 0; + if (sh->bit.border) ebits_get_insets(sh->bit.border, &pl, &pr, &pt, &pb); + evas_resize(sh->view->evas, sh->obj.clipper, sh->w - pl - pr, sh->h - pt - pb); + } +} + +void +e_shelf_resize_by(E_Shelf *sh, int dw, int dh) +{ + e_shelf_resize(sh, sh->w + dw, sh->h + dh); +} + +void +e_shelf_add_icon(E_Shelf *sh, E_Icon *icon) +{ + if (icon->shelf) + e_shelf_del_icon(icon->shelf, icon); + icon->shelf = sh; + sh->icon_count++; + if (sh->icon_count > 0) + evas_show(sh->view->evas, sh->obj.clipper); + evas_set_clip(sh->view->evas, icon->obj.icon, sh->obj.clipper); + evas_set_clip(sh->view->evas, icon->obj.filename, sh->obj.clipper); + evas_set_clip(sh->view->evas, icon->obj.sel1, sh->obj.clipper); + evas_set_clip(sh->view->evas, icon->obj.sel2, sh->obj.clipper); +} + +void +e_shelf_del_icon(E_Shelf *sh, E_Icon *icon) +{ + if (icon->shelf != sh) return; + icon->shelf = NULL; + if (sh->icon_count <= 0) + evas_hide(sh->view->evas, sh->obj.clipper); + evas_unset_clip(sh->view->evas, icon->obj.icon); + evas_unset_clip(sh->view->evas, icon->obj.filename); + evas_unset_clip(sh->view->evas, icon->obj.sel1); + evas_unset_clip(sh->view->evas, icon->obj.sel2); +} diff --git a/src/view.c b/src/view.c index 81a4fb810..3d53c1a8f 100644 --- a/src/view.c +++ b/src/view.c @@ -1,7 +1,10 @@ #include "e.h" static Evas_List views = NULL; +static Eevent *current_ev = NULL; +static void e_bg_down_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y); +static void e_bg_up_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y); static void e_idle(void *data); static void e_wheel(Eevent * ev); static void e_key_down(Eevent * ev); @@ -14,6 +17,100 @@ static void e_mouse_out(Eevent * ev); static void e_window_expose(Eevent * ev); static void e_view_handle_fs(EfsdEvent *ev); +static void +e_bg_down_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) +{ + Ev_Mouse_Down *ev; + E_View *v; + + ev = current_ev->event; + v = _data; + if (_b == 1) + { + v->selection.on = 1; + v->selection.start_x = _x; + v->selection.start_y = _y; + v->selection.x = _x; + v->selection.y = _y; + v->selection.w = 1; + v->selection.h = 1; + if (!v->selection.obj_rect) + { + v->selection.obj_rect = evas_add_rectangle(v->evas); + v->selection.obj_l1 = evas_add_line(v->evas); + v->selection.obj_l2 = evas_add_line(v->evas); + v->selection.obj_l3 = evas_add_line(v->evas); + v->selection.obj_l4 = evas_add_line(v->evas); + evas_set_color(v->evas, v->selection.obj_rect, 255, 255, 255, 100); + evas_set_color(v->evas, v->selection.obj_l1, 0, 0, 0, 200); + evas_set_color(v->evas, v->selection.obj_l2, 0, 0, 0, 200); + evas_set_color(v->evas, v->selection.obj_l3, 0, 0, 0, 200); + evas_set_color(v->evas, v->selection.obj_l4, 0, 0, 0, 200); + evas_set_layer(v->evas, v->selection.obj_rect, 100); + evas_set_layer(v->evas, v->selection.obj_l1, 100); + evas_set_layer(v->evas, v->selection.obj_l2, 100); + evas_set_layer(v->evas, v->selection.obj_l3, 100); + evas_set_layer(v->evas, v->selection.obj_l4, 100); + } + e_view_update_selection(v, _x, _y); + } +} + +static void +e_bg_up_cb(void *_data, Evas _e, Evas_Object _o, int _b, int _x, int _y) +{ + Ev_Mouse_Up *ev; + E_View *v; + + ev = current_ev->event; + v = _data; + if ((v->selection.w < 6) && (v->selection.h < 6)) + { + if (_b == 1) + { + static E_Build_Menu *buildmenu = NULL; + + if (!buildmenu) + { + char *apps_menu_db; + + apps_menu_db = e_config_get("apps_menu"); + if (apps_menu_db) buildmenu = e_build_menu_new_from_db(apps_menu_db); + } + if (buildmenu) + { + static E_Menu *menu = NULL; + menu = buildmenu->menu; + if (menu) + e_menu_show_at_mouse(menu, ev->rx, ev->ry, ev->time); + } + } + else if (_b == 3) + { + static E_Menu *menu = NULL; + + if (!menu) + { + E_Menu_Item *menuitem; + + menu = e_menu_new(); + e_menu_set_padding_icon(menu, 8); + e_menu_set_padding_state(menu, 8); + menuitem = e_menu_item_new("Enlightenment "VERSION); + e_menu_item_set_icon(menuitem, PACKAGE_DATA_DIR"/data/images/e_logo.png"); + e_menu_add_item(menu, menuitem); + } + if (menu) + e_menu_show_at_mouse(menu, ev->rx, ev->ry, ev->time); + } + } + if (ev->button == 1) + { + v->selection.on = 0; + e_view_update_selection(v, _x, _y); + } +} + static void e_idle(void *data) { @@ -116,6 +213,7 @@ e_mouse_down(Eevent * ev) Evas_List l; e = ev->event; + current_ev = ev; for (l = views; l; l = l->next) { E_View *v; @@ -123,42 +221,12 @@ e_mouse_down(Eevent * ev) v = l->data; if (e->win == v->win.main) { - /* FIXME: */ - /* normally would handle selection in evasa object callbacks */ - /* but for now it's handled here */ - if (e->button == 1) - { - v->selection.on = 1; - v->selection.start_x = e->x; - v->selection.start_y = e->y; - v->selection.x = e->x; - v->selection.y = e->y; - v->selection.w = 1; - v->selection.h = 1; - if (!v->selection.obj_rect) - { - v->selection.obj_rect = evas_add_rectangle(v->evas); - v->selection.obj_l1 = evas_add_line(v->evas); - v->selection.obj_l2 = evas_add_line(v->evas); - v->selection.obj_l3 = evas_add_line(v->evas); - v->selection.obj_l4 = evas_add_line(v->evas); - evas_set_color(v->evas, v->selection.obj_rect, 255, 255, 255, 100); - evas_set_color(v->evas, v->selection.obj_l1, 0, 0, 0, 200); - evas_set_color(v->evas, v->selection.obj_l2, 0, 0, 0, 200); - evas_set_color(v->evas, v->selection.obj_l3, 0, 0, 0, 200); - evas_set_color(v->evas, v->selection.obj_l4, 0, 0, 0, 200); - evas_set_layer(v->evas, v->selection.obj_rect, 100); - evas_set_layer(v->evas, v->selection.obj_l1, 100); - evas_set_layer(v->evas, v->selection.obj_l2, 100); - evas_set_layer(v->evas, v->selection.obj_l3, 100); - evas_set_layer(v->evas, v->selection.obj_l4, 100); - } - e_view_update_selection(v, e->x, e->y); - } evas_event_button_down(v->evas, e->x, e->y, e->button); + current_ev = NULL; return; } } + current_ev = NULL; } static void @@ -168,6 +236,7 @@ e_mouse_up(Eevent * ev) Evas_List l; e = ev->event; + current_ev = ev; for (l = views; l; l = l->next) { E_View *v; @@ -175,57 +244,12 @@ e_mouse_up(Eevent * ev) v = l->data; if (e->win == v->win.main) { - /* FIXME: temporary for now- should only do this if its a deskop */ - /* view and desktops accept focus on click. */ - /* e_focus_to_window(e->win); */ - if ((v->selection.w < 6) && (v->selection.h < 6)) - { - if (e->button == 1) - { - static E_Build_Menu *buildmenu = NULL; - - if (!buildmenu) - { - char *apps_menu_db; - - apps_menu_db = e_config_get("apps_menu"); - if (apps_menu_db) buildmenu = e_build_menu_new_from_db(apps_menu_db); - } - if (buildmenu) - { - static E_Menu *menu = NULL; - menu = buildmenu->menu; - if (menu) - e_menu_show_at_mouse(menu, e->rx, e->ry, e->time); - } - } - else if (e->button == 3) - { - static E_Menu *menu = NULL; - - if (!menu) - { - E_Menu_Item *menuitem; - - menu = e_menu_new(); - e_menu_set_padding_icon(menu, 8); - e_menu_set_padding_state(menu, 8); - menuitem = e_menu_item_new("Enlightenment "VERSION); - e_menu_item_set_icon(menuitem, PACKAGE_DATA_DIR"/data/images/e_logo.png"); - e_menu_add_item(menu, menuitem); - } - if (menu) - e_menu_show_at_mouse(menu, e->rx, e->ry, e->time); - } - } - if (e->button == 1) - { - v->selection.on = 0; - e_view_update_selection(v, e->x, e->y); - } evas_event_button_up(v->evas, e->x, e->y, e->button); + current_ev = NULL; + return; } } + current_ev = NULL; } static void @@ -603,6 +627,19 @@ e_view_new(void) v->options.back_pixmap = 0; #endif views = evas_list_append(views, v); + + { + E_Shelf *sh; + + sh = e_shelf_new(); + e_shelf_set_name(sh, "Test Shelf"); + e_shelf_set_view(sh, v); + e_shelf_show(sh); + e_shelf_move(sh, 10, 10); + e_shelf_resize(sh, 200, 150); + v->shelves = evas_list_append(v->shelves, sh); + } + return v; } @@ -700,6 +737,15 @@ e_view_realize(E_View *v) v->bg->geom.h = v->size.h; e_background_realize(v->bg, v->evas); } + v->obj_bg = evas_add_rectangle(v->evas); + evas_callback_add(v->evas, v->obj_bg, CALLBACK_MOUSE_DOWN, e_bg_down_cb, v); + evas_callback_add(v->evas, v->obj_bg, CALLBACK_MOUSE_UP, e_bg_up_cb, v); + evas_set_layer(v->evas, v->obj_bg, 1); + evas_move(v->evas, v->obj_bg, 0, 0); + evas_resize(v->evas, v->obj_bg, 999999, 999999); + evas_set_color(v->evas, v->obj_bg, 0, 0, 0, 0); + evas_show(v->evas, v->obj_bg); + e_window_set_events(v->win.main, XEV_EXPOSE | XEV_MOUSE_MOVE | XEV_BUTTON | XEV_IN_OUT | XEV_KEY); @@ -712,6 +758,19 @@ e_view_realize(E_View *v) e_view_set_dir(v, dir); IF_FREE(dir); } + + if (v->shelves) + { + Evas_List l; + + for (l = v->shelves; l; l = l->next) + { + E_Shelf *sh; + + sh = l->data; + e_shelf_realize(sh); + } + } v->changed = 1; } @@ -726,14 +785,15 @@ e_view_update(E_View *v) { Evas_List l; - if (!v->changed) return; - - for (l = v->icons; l; l = l->next) + if (v->changed) { - E_Icon *icon; - - icon = l->data; - e_icon_update(icon); + for (l = v->icons; l; l = l->next) + { + E_Icon *icon; + + icon = l->data; + e_icon_update(icon); + } } if (v->options.back_pixmap) { @@ -756,7 +816,7 @@ e_view_update(E_View *v) } else evas_render(v->evas); -/* v->changed = 0;*/ + v->changed = 0; } void