Jacek Caban : mshtml: Added IHTMLEventObj::get_altKey implementation.
Alexandre Julliard
julliard at winehq.org
Tue Sep 8 08:54:59 CDT 2009
Module: wine
Branch: master
Commit: 461b3768d2ebfbc1ad36368a634fce9dc88ba550
URL: http://source.winehq.org/git/wine.git/?a=commit;h=461b3768d2ebfbc1ad36368a634fce9dc88ba550
Author: Jacek Caban <jacek at codeweavers.com>
Date: Sun Sep 6 18:55:25 2009 +0200
mshtml: Added IHTMLEventObj::get_altKey implementation.
---
dlls/mshtml/htmlevent.c | 40 +++++++++++++++++++++++++++++++++++-----
dlls/mshtml/htmlevent.h | 2 +-
dlls/mshtml/nsevents.c | 4 ++--
3 files changed, 38 insertions(+), 8 deletions(-)
diff --git a/dlls/mshtml/htmlevent.c b/dlls/mshtml/htmlevent.c
index cce6e64..69e2bc0 100644
--- a/dlls/mshtml/htmlevent.c
+++ b/dlls/mshtml/htmlevent.c
@@ -129,6 +129,7 @@ typedef struct {
HTMLDOMNode *target;
const event_info_t *type;
+ nsIDOMEvent *nsevent;
} HTMLEventObj;
#define HTMLEVENTOBJ(x) ((IHTMLEventObj*) &(x)->lpIHTMLEventObjVtbl)
@@ -178,6 +179,8 @@ static ULONG WINAPI HTMLEventObj_Release(IHTMLEventObj *iface)
TRACE("(%p) ref=%d\n", This, ref);
if(!ref) {
+ if(This->nsevent)
+ nsIDOMEvent_Release(This->nsevent);
release_dispex(&This->dispex);
heap_free(This);
}
@@ -232,8 +235,31 @@ static HRESULT WINAPI HTMLEventObj_get_srcElement(IHTMLEventObj *iface, IHTMLEle
static HRESULT WINAPI HTMLEventObj_get_altKey(IHTMLEventObj *iface, VARIANT_BOOL *p)
{
HTMLEventObj *This = HTMLEVENTOBJ_THIS(iface);
- FIXME("(%p)->(%p)\n", This, p);
- return E_NOTIMPL;
+ PRBool ret = FALSE;
+
+ TRACE("(%p)->(%p)\n", This, p);
+
+ if(This->nsevent) {
+ nsIDOMKeyEvent *key_event;
+ nsresult nsres;
+
+ nsres = nsIDOMEvent_QueryInterface(This->nsevent, &IID_nsIDOMKeyEvent, (void**)&key_event);
+ if(NS_SUCCEEDED(nsres)) {
+ nsIDOMKeyEvent_GetAltKey(key_event, &ret);
+ nsIDOMKeyEvent_Release(key_event);
+ }else {
+ nsIDOMMouseEvent *mouse_event;
+
+ nsres = nsIDOMEvent_QueryInterface(This->nsevent, &IID_nsIDOMMouseEvent, (void**)&mouse_event);
+ if(NS_SUCCEEDED(nsres)) {
+ nsIDOMMouseEvent_GetAltKey(mouse_event, &ret);
+ nsIDOMMouseEvent_Release(mouse_event);
+ }
+ }
+ }
+
+ *p = ret ? VARIANT_TRUE : VARIANT_FALSE;
+ return S_OK;
}
static HRESULT WINAPI HTMLEventObj_get_ctrlKey(IHTMLEventObj *iface, VARIANT_BOOL *p)
@@ -449,7 +475,7 @@ static dispex_static_data_t HTMLEventObj_dispex = {
HTMLEventObj_iface_tids
};
-static IHTMLEventObj *create_event(HTMLDOMNode *target, eventid_t eid)
+static IHTMLEventObj *create_event(HTMLDOMNode *target, eventid_t eid, nsIDOMEvent *nsevent)
{
HTMLEventObj *ret;
@@ -460,6 +486,10 @@ static IHTMLEventObj *create_event(HTMLDOMNode *target, eventid_t eid)
ret->target = target;
IHTMLDOMNode_AddRef(HTMLDOMNODE(target));
+ ret->nsevent = nsevent;
+ if(nsevent)
+ nsIDOMEvent_AddRef(nsevent);
+
init_dispex(&ret->dispex, (IUnknown*)HTMLEVENTOBJ(ret), &HTMLEventObj_dispex);
return HTMLEVENTOBJ(ret);
@@ -490,7 +520,7 @@ static void call_event_handlers(HTMLDocument *doc, event_target_t *event_target,
}
}
-void fire_event(HTMLDocument *doc, eventid_t eid, nsIDOMNode *target)
+void fire_event(HTMLDocument *doc, eventid_t eid, nsIDOMNode *target, nsIDOMEvent *nsevent)
{
IHTMLEventObj *prev_event, *event_obj = NULL;
nsIDOMNode *parent, *nsnode;
@@ -504,7 +534,7 @@ void fire_event(HTMLDocument *doc, eventid_t eid, nsIDOMNode *target)
}
prev_event = doc->window->event;
- event_obj = doc->window->event = create_event(get_node(doc, target, TRUE), eid);
+ event_obj = doc->window->event = create_event(get_node(doc, target, TRUE), eid, nsevent);
nsnode = target;
nsIDOMNode_AddRef(nsnode);
diff --git a/dlls/mshtml/htmlevent.h b/dlls/mshtml/htmlevent.h
index 230450b..8ca4a96 100644
--- a/dlls/mshtml/htmlevent.h
+++ b/dlls/mshtml/htmlevent.h
@@ -38,7 +38,7 @@ typedef enum {
eventid_t str_to_eid(LPCWSTR);
void check_event_attr(HTMLDocument*,nsIDOMElement*);
void release_event_target(event_target_t*);
-void fire_event(HTMLDocument*,eventid_t,nsIDOMNode*);
+void fire_event(HTMLDocument*,eventid_t,nsIDOMNode*,nsIDOMEvent*);
HRESULT set_event_handler(event_target_t**,HTMLDocument*,eventid_t,VARIANT*);
HRESULT get_event_handler(event_target_t**,eventid_t,VARIANT*);
diff --git a/dlls/mshtml/nsevents.c b/dlls/mshtml/nsevents.c
index 0ba11d2..bacc07e 100644
--- a/dlls/mshtml/nsevents.c
+++ b/dlls/mshtml/nsevents.c
@@ -155,7 +155,7 @@ static nsresult NSAPI handle_load(nsIDOMEventListener *iface, nsIDOMEvent *event
nsIDOMHTMLDocument_GetBody(This->doc->nsdoc, &nsbody);
if(nsbody) {
- fire_event(This->doc, EVENTID_LOAD, (nsIDOMNode*)nsbody);
+ fire_event(This->doc, EVENTID_LOAD, (nsIDOMNode*)nsbody, event);
nsIDOMHTMLElement_Release(nsbody);
}
@@ -191,7 +191,7 @@ static nsresult NSAPI handle_htmlevent(nsIDOMEventListener *iface, nsIDOMEvent *
return NS_OK;
}
- fire_event(This->doc, eid, nsnode);
+ fire_event(This->doc, eid, nsnode, event);
nsIDOMNode_Release(nsnode);
More information about the wine-cvs
mailing list