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