diff -u -r gnome-power-manager-2.28.1.old/src/gpm-brightness-xrandr.c gnome-power-manager-2.28.1/src/gpm-brightness-xrandr.c
--- gnome-power-manager-2.28.1.old/src/gpm-brightness-xrandr.c	2009-10-15 11:45:06.000000000 +0200
+++ gnome-power-manager-2.28.1/src/gpm-brightness-xrandr.c	2009-12-10 00:10:53.000000000 +0100
@@ -43,6 +43,10 @@
 #include <gdk/gdkx.h>
 #include <gtk/gtk.h>
 
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <fcntl.h>
+
 #include "egg-debug.h"
 #include "egg-discrete.h"
 
@@ -66,6 +70,9 @@
 	gboolean		 hw_changed;
 	/* A cache of XRRScreenResources is used as XRRGetScreenResources is expensive */
 	GPtrArray		*resources;
+
+	/* true if hardware automatically sets brightness in response to key press events */
+	gboolean		brightness_in_hardware;
 };
 
 enum {
@@ -83,6 +90,67 @@
 G_DEFINE_TYPE (GpmBrightnessXRandR, gpm_brightness_xrandr, G_TYPE_OBJECT)
 static guint signals [LAST_SIGNAL] = { 0 };
 
+static gboolean
+gpm_brightness_is_board_property(const char* property, const char* value)
+{
+#define BUF_SIZE	64
+
+	int fd;
+	void* buffer;
+	ssize_t len, cnt;
+	char filename[BUF_SIZE];
+	gboolean result = FALSE;
+
+	strncpy(filename, "/sys/devices/virtual/dmi/id/board_", BUF_SIZE);
+	strncat(filename, property, BUF_SIZE - 1);
+
+	fd = open(filename, O_RDONLY);
+	if (fd != -1) {
+		len = strlen(value);
+		buffer = alloca(len);
+		if (buffer != NULL) {
+			cnt = read(fd, buffer, len);
+			if (cnt == len) {
+				result = memcmp(buffer, value, len) == 0;
+			}
+		}
+
+		close(fd);
+	}
+
+	return result;
+
+#undef BUF_SIZE
+}
+
+static gboolean
+gpm_brightness_is_board_vendor(const char* vendor)
+{
+	return gpm_brightness_is_board_property("vendor", vendor);
+}
+
+static gboolean
+gpm_brightness_is_board_name(const char* name)
+{
+	return gpm_brightness_is_board_property("name", name);
+}
+
+/**
+ * gpm_brightness_get_brighness_in_hardware
+ **/
+static gboolean
+gpm_brightness_get_brighness_in_hardware()
+{
+	/* work-around for MSI Wind U100 */
+	if (gpm_brightness_is_board_vendor("MICRO-STAR INTERNATIONAL CO., LTD")) {
+		if (gpm_brightness_is_board_name("U-100")) {
+			return TRUE;
+		}
+	}
+
+	return FALSE;
+}
+
 /**
  * gpm_brightness_xrandr_output_get_internal:
  **/
@@ -268,6 +336,8 @@
 	guint min, max;
 
 	g_return_val_if_fail (GPM_IS_BRIGHTNESS_XRANDR (brightness), FALSE);
+	if (brightness->priv->brightness_in_hardware)
+		return TRUE;
 
 	ret = gpm_brightness_xrandr_output_get_internal (brightness, output, &cur);
 	if (!ret)
@@ -302,6 +372,8 @@
 	guint min, max;
 
 	g_return_val_if_fail (GPM_IS_BRIGHTNESS_XRANDR (brightness), FALSE);
+	if (brightness->priv->brightness_in_hardware)
+		return TRUE;
 
 	ret = gpm_brightness_xrandr_output_get_internal (brightness, output, &cur);
 	if (!ret)
@@ -741,6 +813,9 @@
 
 	/* create cache of XRRScreenResources as XRRGetScreenResources() is slow */
 	gpm_brightness_xrandr_update_cache (brightness);
+
+	/* work around broken BIOS that handle event in hardware but send the key to userspace */
+	brightness->priv->brightness_in_hardware = gpm_brightness_get_brighness_in_hardware();
 }
 
 /**
