Enlightenment CVS committal Author : moom Project : e_modules Module : mixer
Dir : e_modules/mixer Modified Files: e_mod_main.c e_mod_types.h Log Message: * Use an input window to grab the mouse click when the popup window is visible. So now we can click everywhere on the screen to pop down the popup window =================================================================== RCS file: /cvs/e/e_modules/mixer/e_mod_main.c,v retrieving revision 1.20 retrieving revision 1.21 diff -u -3 -r1.20 -r1.21 --- e_mod_main.c 11 Sep 2006 15:49:47 -0000 1.20 +++ e_mod_main.c 11 Sep 2006 16:31:16 -0000 1.21 @@ -30,10 +30,14 @@ static void _mixer_window_simple_pop_down (Instance *inst); static int _mixer_window_simple_animator_up_cb (void *data); static int _mixer_window_simple_animator_down_cb (void *data); -static void _mixer_window_simple_mouse_up_cb (void *data, Evas *e, Evas_Object *obj, void *event_info); static void _mixer_window_simple_changed_cb (void *data, Evas_Object *obj, void *event_info); static void _mixer_window_simple_resize_cb (E_Win *win); +static int _mixer_window_simple_mouse_move_cb (void *data, int type, void *event); +static int _mixer_window_simple_mouse_down_cb (void *data, int type, void *event); +static int _mixer_window_simple_mouse_up_cb (void *data, int type, void *event); +static int _mixer_window_simple_mouse_wheel_cb (void *data, int type, void *event); + /* Private vars */ static E_Config_DD *conf_edd = NULL; static E_Config_DD *conf_item_edd = NULL; @@ -386,7 +390,7 @@ Mixer_Win_Simple *win; Evas_Coord ox, oy, ow, oh; Evas_Coord sw, sh; - int cx, cy, cw, ch, vol; + int cx, cy, cw, ch; if (!inst || !inst->mixer) return; if (!(con = e_container_current_get(e_manager_current_get()))) return; @@ -411,8 +415,6 @@ win->event_obj = evas_object_rectangle_add(e_win_evas_get(win->window)); evas_object_color_set(win->event_obj, 255, 255, 255, 0); evas_object_show(win->event_obj); - evas_object_event_callback_add(win->event_obj, EVAS_CALLBACK_MOUSE_UP, - _mixer_window_simple_mouse_up_cb, win); win->bg_obj = edje_object_add(e_win_evas_get(win->window)); e_theme_edje_object_set(win->bg_obj, "base/theme/menus", @@ -433,14 +435,6 @@ evas_object_show(win->slider); evas_object_smart_callback_add(win->slider, "changed", _mixer_window_simple_changed_cb, win); - if (inst->mixer->mix_sys->get_volume) - { - double v; - - vol = inst->mixer->mix_sys->get_volume(ci->card_id, ci->channel_id); - v = (1.0 - ((double)vol / 100)); - e_slider_value_set(win->slider, v); - } e_slider_min_size_get(win->slider, &sw, &sh); if (sw < ow) sw = ow; @@ -453,6 +447,48 @@ evas_object_resize(win->bg_obj, win->w, win->h); } + if (win->input_window == 0) + { + Ecore_X_Window root, parent; + int root_x, root_y, root_w, root_h; + + root = win->window->evas_win; + while ((parent = ecore_x_window_parent_get(root)) != 0) + root = parent; + + ecore_x_window_geometry_get(root, &root_x, &root_y, &root_w, &root_h); + win->input_window = ecore_x_window_input_new(root, root_x, root_y, root_w, root_h); + ecore_x_window_show(win->input_window); + //ecore_x_pointer_confine_grab(win->input_window); + ecore_x_keyboard_grab(win->input_window); + + win->mouse_move_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_MOVE, + _mixer_window_simple_mouse_move_cb, win); + win->mouse_down_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_DOWN, + _mixer_window_simple_mouse_down_cb, win); + win->mouse_up_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_BUTTON_UP, + _mixer_window_simple_mouse_up_cb, win); + win->mouse_wheel_handler = ecore_event_handler_add(ECORE_X_EVENT_MOUSE_WHEEL, + _mixer_window_simple_mouse_wheel_cb, win); + + win->first_mouse_up = 1; + + evas_event_feed_mouse_move(e_win_evas_get(win->window), + -100000, -100000, ecore_time_get(), NULL); + evas_event_feed_mouse_in(e_win_evas_get(win->window), + ecore_time_get(), NULL); + } + + if (inst->mixer->mix_sys->get_volume) + { + int vol; + double v; + + vol = inst->mixer->mix_sys->get_volume(ci->card_id, ci->channel_id); + v = (1.0 - ((double)vol / 100)); + e_slider_value_set(win->slider, v); + } + e_gadcon_canvas_zone_geometry_get(inst->gcc->gadcon, &cx, &cy, &cw, &ch); win->x = cx + ox; win->y = cy + oy; @@ -502,6 +538,19 @@ if (!(win = inst->mixer->simple_win) || !win->popped_up) return; + if (win->input_window != 0) + { + //ecore_x_pointer_ungrab(); + ecore_x_keyboard_ungrab(); + ecore_x_window_del(win->input_window); + ecore_event_handler_del(win->mouse_move_handler); + ecore_event_handler_del(win->mouse_down_handler); + ecore_event_handler_del(win->mouse_up_handler); + ecore_event_handler_del(win->mouse_wheel_handler); + win->input_window = 0; + win->mouse_up_handler = NULL; + } + win->start_time = ecore_time_get(); if (win->slide_animator) ecore_animator_del(win->slide_animator); win->slide_animator = ecore_animator_add(_mixer_window_simple_animator_down_cb, win); @@ -566,16 +615,6 @@ return 1; } -/* Called when the background object of the simple window is released */ -static void -_mixer_window_simple_mouse_up_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) -{ - Mixer_Win_Simple *win; - - if (!(win = data)) return; - _mixer_window_simple_pop_down(win->mixer->inst); -} - /* Called when the value of the slider of the simple window is changed */ static void _mixer_window_simple_changed_cb(void *data, Evas_Object *obj, void *event_info) @@ -624,4 +663,74 @@ evas_object_move(simple_win->event_obj, 0, 0); evas_object_resize(simple_win->event_obj, win->w, win->h); +} + +/* Called when the mouse moves over the input window */ +static int +_mixer_window_simple_mouse_move_cb(void *data, int type, void *event) +{ + Mixer_Win_Simple *win; + Ecore_X_Event_Mouse_Move *xev = event; + + if (!(win = data) || !E_INSIDE(xev->x, xev->y, + win->window->x, win->window->y, + win->window->w, win->window->h)) + return 1; + + evas_event_feed_mouse_move(e_win_evas_get(win->window), + xev->x - win->window->x, xev->y - win->window->y, + xev->time, NULL); + + return 1; +} + +/* Called when the input window is pressed by the mouse */ +static int +_mixer_window_simple_mouse_down_cb(void *data, int type, void *event) +{ + Mixer_Win_Simple *win; + Ecore_X_Event_Mouse_Button_Down *xev = event; + + if (!(win = data) || !E_INSIDE(xev->x, xev->y, + win->window->x, win->window->y, + win->window->w, win->window->h)) + return 1; + + evas_event_feed_mouse_down(e_win_evas_get(win->window), + xev->button, EVAS_BUTTON_NONE, + xev->time, NULL); + + return 1; +} + +/* Called when the input window is released by the mouse */ +static int +_mixer_window_simple_mouse_up_cb(void *data, int type, void *event) +{ + Mixer_Win_Simple *win; + Ecore_X_Event_Mouse_Button_Up *xev = event; + + if (!(win = data)) return 1; + + if (E_INSIDE(xev->x, xev->y, win->window->x, win->window->y, + win->window->w, win->window->h)) + { + evas_event_feed_mouse_up(e_win_evas_get(win->window), + xev->button, EVAS_BUTTON_NONE, + xev->time, NULL); + } + else if ((xev->button == 1)/* && !win->first_mouse_up*/) + _mixer_window_simple_pop_down(win->mixer->inst); + + if ((xev->button == 1) && win->first_mouse_up) + win->first_mouse_up = 0; + + return 1; +} + +/* Called when the mouse wheel is used over the input window */ +static int +_mixer_window_simple_mouse_wheel_cb(void *data, int type, void *event) +{ + return 1; } =================================================================== RCS file: /cvs/e/e_modules/mixer/e_mod_types.h,v retrieving revision 1.3 retrieving revision 1.4 diff -u -3 -r1.3 -r1.4 --- e_mod_types.h 11 Sep 2006 15:49:47 -0000 1.3 +++ e_mod_types.h 11 Sep 2006 16:31:16 -0000 1.4 @@ -29,6 +29,13 @@ Mixer *mixer; E_Win *window; + Ecore_X_Window input_window; + Ecore_Event_Handler *mouse_move_handler; + Ecore_Event_Handler *mouse_down_handler; + Ecore_Event_Handler *mouse_up_handler; + Ecore_Event_Handler *mouse_wheel_handler; + int first_mouse_up; + Evas_Object *event_obj; Evas_Object *bg_obj; Evas_Object *slider; ------------------------------------------------------------------------- Using Tomcat but need to do more? Need to support web services, security? Get stuff done quickly with pre-integrated technology to make your job easier Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642 _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs