On Wed, 26 May 2010 16:00:31 -0400 Christopher Michael <cpmicha...@comcast.net> said:
i'm with gustavo. i don't get what the problem is. this kind of thing happens all over the place - 1 event id has and event struct with multiple fields. some handlers just don't care about the event if some fields are not set - so the event handler simply checks and if the event is not relevant - then it just instantly returns 1 - passing the event along to the next handler. > On 05/26/2010 03:51 PM, Gustavo Sverzut Barbieri wrote: > > On Wed, May 26, 2010 at 3:45 PM, Christopher Michael > > <cpmicha...@comcast.net> wrote: > >> Hi all, > >> > >> I ran into a snafu wrt acpi stuff. Keep in mind that some of the things > >> mentioned here are not in svn yet. I'll try to iterate the short version: > >> > >> acpi bindings get added to e_config. When e_acpi is initialized, we > >> create event handlers for the events specified in e_config so that when > >> the event fires we can call any existing binding(s) (ex: When Adapter is > >> unplugged, dim the screen. So we create a handler for the > >> acpi_ac_adapter event). In e_config, we will potentially have two > >> acpi_ac_adapter events...one for plugged (dim the screen), one for > >> unplugged (undim the screen). > >> > >> The problem that I ran into is this: > >> > >> During acpi_init, when creating the event_handlers for ac_adapter, two > >> event_handlers get created (plugged& unplugged). The problem is that > >> because 2 handlers get created, when the ac_adapter changes, the events > >> are firing twice :( (ex: ac_adapter is unplugged, event fires to dim the > >> screen), but because 2 event handlers were created the event gets fired > >> again....so now we are getting two calls to dim the screen, even tho the > >> second "handler" is really for undim. > >> > >> The second handler is really for when ac_adapter gets plugged back in, > >> but due to the nature of how devices are handled in acpi, we don't have > >> separate E_EVENT_ACPI's for adapter. This could be fixed by > >> adding/changing E_EVENT_ACPI_AC_ADAPTER_PLUGGED/UNPLUGGED, but this > >> would also require E_EVENT_ACPI's to be created for every possible > >> device state: (ie: battery_charging, battery_removed, etc, etc). > >> > >> Obviously, I am against this approach as we really have no way of > >> knowing all the possible states that any given device supports...hence > >> why I took the generic approach of using one E_EVENT_ACPI for a given > >> device, and passing it some params that could then be acted on (ie: when > >> the ac_adapter event fires, it's "params" will be 0 or 1 depending on > >> adapter state, lid event has "params" of 0 or 1 for open/closed, etc, etc). > >> > >> What I would like to do is add an ecore_event_handler_type_get function > >> because the Ecore_Event_Handler struct is not exposed via API. > >> > >> Reasoning here is: we add the event handlers to a list during init, so > >> what I could do is before adding those handlers to the list, I could > >> iterate the list and check that a handler for that type has already been > >> added, and skip it, etc, etc. > >> > >> Would anyone be against the addition of ecore_event_handler_type_get ?? > >> If so, are there any thoughts on a better approach to this problem ?? > > > > I'm not sure I understand what you mean. This situation should be > > similar to others we already have, like ECORE_EVENT_SIGNAL_EXIT that > > carries in the event structure the reason of the event (see struct > > _Ecore_Event_Signal_Exit). > > Ok, let me try to clear this up a little then: > > 2 event handlers get added for one event (E_EVENT_ACPI_AC_ADAPTER). > One handler is supposed to handle "plugged in", the other "unplugged", > but both use the same E_EVENT_ACPI_AC_ADAPTER. > > Now, the event comes in (adapter gets unplugged). > e_acpi receives the event via ecore_event_handler twice because of the > two bindings (plugged & unplugged), but really only one event occured > ("plugged")....so "plugged" event ends up getting called twice. > > > > > I see no problem registering twice the same event, just the callbacks > > need to handle it differently, like for plug you use func1 and for > > unplug you use func2, they would do: if (!ev->plug) return and if > > (ev->plug) return respectively. > > > > This is where the "rub" might be ... all events are handled by the same > callback. Inside the e_acpi_cb_event, we check for any bindings that > relate to the event, and call the bindings....Perhaps I just need to > rethink that event callback stuff .... > > dh -- ------------- Codito, ergo sum - "I code, therefore I am" -------------- The Rasterman (Carsten Haitzler) ras...@rasterman.com ------------------------------------------------------------------------------ _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel