diff -ur mozilla/widget/src/gtk/nsGtkEventHandler.cpp mozilla-colin/widget/src/gtk/nsGtkEventHandler.cpp
--- mozilla/widget/src/gtk/nsGtkEventHandler.cpp	Thu Jan 31 23:45:58 2002
+++ mozilla-colin/widget/src/gtk/nsGtkEventHandler.cpp	Fri Mar 29 08:24:54 2002
@@ -338,7 +338,8 @@
     anEvent.isControl = (aGEK->state & GDK_CONTROL_MASK) ? PR_TRUE : PR_FALSE;
     anEvent.isAlt = (aGEK->state & GDK_MOD1_MASK) ? PR_TRUE : PR_FALSE;
     // XXX For meta key, state is 0, and so are keyval and string.  Sigh!
-    anEvent.isMeta = PR_FALSE; //(aGEK->state & GDK_MOD2_MASK) ? PR_TRUE : PR_FALSE;
+    // MOD2 works great here
+    anEvent.isMeta = (aGEK->state & GDK_MOD2_MASK) ? PR_TRUE : PR_FALSE;
     anEvent.point.x = 0;
     anEvent.point.y = 0;
   }
@@ -360,8 +361,7 @@
     anEvent.isControl = (aGEK->state & GDK_CONTROL_MASK) ? PR_TRUE : PR_FALSE;
     anEvent.isAlt = (aGEK->state & GDK_MOD1_MASK) ? PR_TRUE : PR_FALSE;
     // XXX
-    anEvent.isMeta = PR_FALSE; //(aGEK->state & GDK_MOD2_MASK) ? PR_TRUE : PR_FALSE;
-
+    anEvent.isMeta = (aGEK->state & GDK_MOD2_MASK) ? PR_TRUE : PR_FALSE;
     anEvent.charCode = nsConvertCharCodeToUnicode(aGEK);
     if (anEvent.charCode) {
       anEvent.keyCode = 0;
diff -ur mozilla/widget/src/gtk/nsWidget.cpp mozilla-colin/widget/src/gtk/nsWidget.cpp
--- mozilla/widget/src/gtk/nsWidget.cpp	Thu Jan 31 23:45:59 2002
+++ mozilla-colin/widget/src/gtk/nsWidget.cpp	Fri Mar 29 08:20:16 2002
@@ -1885,7 +1885,7 @@
       scrollEvent.isShift = (aGdkButtonEvent->state & GDK_SHIFT_MASK) ? PR_TRUE : PR_FALSE;
       scrollEvent.isControl = (aGdkButtonEvent->state & GDK_CONTROL_MASK) ? PR_TRUE : PR_FALSE;
       scrollEvent.isAlt = (aGdkButtonEvent->state & GDK_MOD1_MASK) ? PR_TRUE : PR_FALSE;
-      scrollEvent.isMeta = PR_FALSE;  // GTK+ doesn't support the meta key
+      scrollEvent.isMeta = (aGdkButtonEvent->state & GDK_MOD2_MASK) ? PR_TRUE : PR_FALSE;
       scrollEvent.time = aGdkButtonEvent->time;
       AddRef();
       if (mEventCallback)
@@ -2093,7 +2093,7 @@
     anEvent.isShift = (aGdkButtonEvent->state & GDK_SHIFT_MASK) ? PR_TRUE : PR_FALSE;
     anEvent.isControl = (aGdkButtonEvent->state & GDK_CONTROL_MASK) ? PR_TRUE : PR_FALSE;
     anEvent.isAlt = (aGdkButtonEvent->state & GDK_MOD1_MASK) ? PR_TRUE : PR_FALSE;
-    anEvent.isMeta = PR_FALSE;  // GTK+ doesn't support the meta key
+    anEvent.isMeta = (aGdkButtonEvent->state & GDK_MOD2_MASK) ? PR_TRUE : PR_FALSE;
     anEvent.time = aGdkButtonEvent->time;
 
     switch(aGdkButtonEvent->type)
diff -ur mozilla/widget/src/gtk/nsWindow.cpp mozilla-colin/widget/src/gtk/nsWindow.cpp
--- mozilla/widget/src/gtk/nsWindow.cpp	Thu Jan 31 23:46:01 2002
+++ mozilla-colin/widget/src/gtk/nsWindow.cpp	Fri Mar 29 08:19:19 2002
@@ -3253,7 +3253,7 @@
   aEvent.isShift = (state & GDK_SHIFT_MASK) ? PR_TRUE : PR_FALSE;
   aEvent.isControl = (state & GDK_CONTROL_MASK) ? PR_TRUE : PR_FALSE;
   aEvent.isAlt = (state & GDK_MOD1_MASK) ? PR_TRUE : PR_FALSE;
-  aEvent.isMeta = PR_FALSE; // GTK+ doesn't support the meta key
+  aEvent.isMeta = (state & GDK_MOD2_MASK) ? PR_TRUE : PR_FALSE;
 }
 
 // This will update the drag action based on the information in the
@@ -4126,7 +4126,7 @@
     textEvent.isControl = (aEvent->state & GDK_CONTROL_MASK) ? PR_TRUE : PR_FALSE;
     textEvent.isAlt = (aEvent->state & GDK_MOD1_MASK) ? PR_TRUE : PR_FALSE;
     // XXX
-    textEvent.isMeta = PR_FALSE; //(aEvent->state & GDK_MOD2_MASK) ? PR_TRUE : PR_FALSE;
+    textEvent.isMeta = (aEvent->state & GDK_MOD2_MASK) ? PR_TRUE : PR_FALSE;
     textEvent.time = aEvent->time;
   } else {
     textEvent.time = 0;
diff -ur mozilla/widget/src/gtk2/nsCommonWidget.cpp mozilla-colin/widget/src/gtk2/nsCommonWidget.cpp
--- mozilla/widget/src/gtk2/nsCommonWidget.cpp	Sat Jan 12 08:14:53 2002
+++ mozilla-colin/widget/src/gtk2/nsCommonWidget.cpp	Fri Mar 29 08:18:56 2002
@@ -134,8 +134,8 @@
     ? PR_TRUE : PR_FALSE;
   aEvent.isAlt     = (aGdkEvent->state & GDK_MOD1_MASK)
     ? PR_TRUE : PR_FALSE;
-  aEvent.isMeta    = PR_FALSE; // Gtk+ doesn't have meta
-
+  aEvent.isMeta    = (aGdkEvent->state & GDK_MOD2_MASK) 
+    ? PR_TRUE : PR_FALSE;
   switch (aGdkEvent->type) {
   case GDK_2BUTTON_PRESS:
     aEvent.clickCount = 2;
@@ -184,8 +184,8 @@
     ? PR_TRUE : PR_FALSE;
   aEvent.isAlt     = (aGdkEvent->state & GDK_MOD1_MASK)
     ? PR_TRUE : PR_FALSE;
-  aEvent.isMeta    = PR_FALSE; // Gtk+ doesn't have meta
-
+  aEvent.isMeta    = (aGdkEvent->state & GDK_MOD2_MASK) 
+    ? PR_TRUE : PR_FALSE;
 }
 
 void
@@ -204,7 +204,8 @@
     ? PR_TRUE : PR_FALSE;
   aEvent.isAlt     = (aGdkEvent->state & GDK_MOD1_MASK)
     ? PR_TRUE : PR_FALSE;
-  aEvent.isMeta    = PR_FALSE; // Gtk+ doesn't have meta
+  aEvent.isMeta    = (aGdkEvent->state & GDK_MOD2_MASK) 
+    ? PR_TRUE : PR_FALSE;
 }
 
 void
diff -ur mozilla/widget/src/gtk2/nsWindow.cpp mozilla-colin/widget/src/gtk2/nsWindow.cpp
--- mozilla/widget/src/gtk2/nsWindow.cpp	Wed Jan 23 07:39:48 2002
+++ mozilla-colin/widget/src/gtk2/nsWindow.cpp	Fri Mar 29 08:18:35 2002
@@ -856,6 +856,8 @@
       ? PR_TRUE : PR_FALSE;
     event.isAlt     = (xevent.xmotion.state & GDK_MOD1_MASK)
       ? PR_TRUE : PR_FALSE;
+    event.isMeta    = (xevent.xmotion.state & GDK_MOD2_MASK)
+      ? PR_TRUE : PR_FALSE;
   }
   else {
     event.point.x = nscoord(aEvent->x);
@@ -866,6 +868,8 @@
     event.isControl = (aEvent->state & GDK_CONTROL_MASK)
       ? PR_TRUE : PR_FALSE;
     event.isAlt     = (aEvent->state & GDK_MOD1_MASK)
+      ? PR_TRUE : PR_FALSE;
+    event.isMeta    = (aEvent->state & GDK_MOD2_MASK)
       ? PR_TRUE : PR_FALSE;
   }
 
