summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZephaniah E. Hull <warp@agamemnon.b5>2007-04-24 07:34:25 -0400
committerZephaniah E. Hull <warp@agamemnon.b5>2007-04-24 07:34:25 -0400
commit1716ec88bbc980507aa7afeb133b552f77a91a01 (patch)
tree96da6a3323012048eaaca5b1c3f488e7ec02bc39
parent246812bfbcd856ac0dea237cdbe252706fe17688 (diff)
downloadxorg-driver-xf86-input-evdev-1716ec88bbc980507aa7afeb133b552f77a91a01.tar.gz
Handle driver removal cleanly, we now xfree everything we Xcalloc.
NOTE: Someone needs to check for memory leaks, I'd be willing to bet a fair bit that we've got tons in the mouse and xkb code, but.
-rw-r--r--src/evdev.c76
1 files changed, 67 insertions, 9 deletions
diff --git a/src/evdev.c b/src/evdev.c
index 9b318d7..efed2a7 100644
--- a/src/evdev.c
+++ b/src/evdev.c
@@ -235,14 +235,6 @@ EvdevProc(DeviceIntPtr device, int what)
EvdevKeyOff (device);
}
-#if 0
- /*
- * FIXME: Handle device removal properly.
- */
- if (what == DEVICE_CLOSE)
- evdevRemoveDevice(pEvdev);
-#endif
-
device->public.on = FALSE;
break;
}
@@ -367,6 +359,72 @@ EvdevPreInit(InputDriverPtr drv, IDevPtr dev, int flags)
return pInfo;
}
+static void
+EvdevUnInit (InputDriverRec *drv, InputInfoRec *pInfo, int flags)
+{
+ evdevDevicePtr pEvdev = pInfo->private;
+ evdevStatePtr state = &pEvdev->state;
+
+ if (pEvdev->device) {
+ xfree (pEvdev->device);
+ pEvdev->device = NULL;
+ }
+
+ if (state->btn) {
+ xfree (state->btn);
+ state->btn = NULL;
+ }
+
+ if (state->abs) {
+ xfree (state->abs);
+ state->abs = NULL;
+ }
+
+ if (state->rel) {
+ xfree (state->rel);
+ state->rel = NULL;
+ }
+
+ if (state->axes) {
+ xfree (state->axes);
+ state->axes = NULL;
+ }
+
+ if (state->key) {
+ evdevKeyRec *key = state->key;
+
+ if (key->xkb_rules) {
+ xfree (key->xkb_rules);
+ key->xkb_rules = NULL;
+ }
+
+ if (key->xkb_model) {
+ xfree (key->xkb_model);
+ key->xkb_model = NULL;
+ }
+
+ if (key->xkb_layout) {
+ xfree (key->xkb_layout);
+ key->xkb_layout = NULL;
+ }
+
+ if (key->xkb_variant) {
+ xfree (key->xkb_variant);
+ key->xkb_variant = NULL;
+ }
+
+ if (key->xkb_options) {
+ xfree (key->xkb_options);
+ key->xkb_options = NULL;
+ }
+
+ xfree (state->key);
+ state->key = NULL;
+ }
+
+
+ xf86DeleteInput (pInfo, 0);
+}
_X_EXPORT InputDriverRec EVDEV = {
@@ -374,7 +432,7 @@ _X_EXPORT InputDriverRec EVDEV = {
"evdev",
NULL,
EvdevPreInit,
- NULL,
+ EvdevUnInit,
NULL,
0
};