Gentoo Websites Logo
Go to: Gentoo Home Documentation Forums Lists Bugs Planet Store Wiki Get Gentoo!
View | Details | Raw Unified | Return to bug 29953 | Differences between
and this patch

Collapse All | Expand All

(-)build-tree/xc/programs/Xserver/hw/xfree86/os-support/linux/lnx_kbd.c (-2 / +381 lines)
Lines 22-27 Link Here
22
#include "xf86OSKbd.h"
22
#include "xf86OSKbd.h"
23
#include "atKeynames.h"
23
#include "atKeynames.h"
24
#include "lnx_kbd.h"
24
#include "lnx_kbd.h"
25
#include "lnx_evdev.h"
25
26
26
#define KBC_TIMEOUT 250        /* Timeout in ms for sending to keyboard controller */
27
#define KBC_TIMEOUT 250        /* Timeout in ms for sending to keyboard controller */
27
28
Lines 481-488 Link Here
481
    return TRUE;
482
    return TRUE;
482
}
483
}
483
484
484
Bool
485
static Bool
485
xf86OSKbdPreInit(InputInfoPtr pInfo)
486
stdKbdPreInit(InputInfoPtr pInfo, char *protocol)
486
{
487
{
487
    KbdDevPtr pKbd = pInfo->private;
488
    KbdDevPtr pKbd = pInfo->private;
488
489
Lines 521-523 Link Here
521
#endif
522
#endif
522
    return TRUE;
523
    return TRUE;
523
}
524
}
525
526
typedef struct _evdevKbdRec {
527
    int packetSize;
528
    char *buffer;
529
    evdevDriver evdev;
530
} evdevKbdRec, *evdevKbdPtr;
531
532
static void
533
evdevKbdReadInput(InputInfoPtr pInfo)
534
{
535
    KbdDevPtr pKbd;
536
    evdevKbdPtr evdevKbd;
537
    struct input_event *ev;
538
    int n;
539
    int code;
540
541
    pKbd = (KbdDevPtr) pInfo->private;
542
    evdevKbd = pKbd->private;
543
    ev = (struct input_event *) evdevKbd->buffer;
544
545
    if (pInfo->fd == -1)
546
	return;
547
548
    do {
549
	n = read(pInfo->fd, ev, sizeof(struct input_event));
550
	if (n == -1) {
551
	    xf86Msg(X_ERROR, "%s: Error in reading! (%s) Disabiling.\n",
552
		    pInfo->name, strerror(errno));
553
	    RemoveEnabledDevice(pInfo->fd);
554
	    close (pInfo->fd);
555
	    pInfo->dev->public.on = FALSE;
556
	    pInfo->fd = -1;
557
	    return;
558
	}
559
	if (n != sizeof(struct input_event)) {
560
	    xf86Msg(X_WARNING, "%s: incomplete packet, size %d\n", pInfo->name, n);
561
	    return;
562
	}
563
564
	switch (ev->type) {
565
	    case EV_KEY:
566
		if ((ev->code <= EV_KEY_RESERVED)||(ev->code >= EV_KEY_UNKNOWN))
567
		    break;
568
		switch (ev->code) {
569
		    case EV_KEY_103RD:
570
		    case EV_KEY_102ND:
571
		    case EV_KEY_LINEFEED:
572
		    case EV_KEY_MACRO:
573
		    case EV_KEY_MUTE:
574
		    case EV_KEY_VOLUMEDOWN:
575
		    case EV_KEY_VOLUMEUP:
576
		    case EV_KEY_POWER:
577
		    case EV_KEY_KPPLUSMINUS:
578
		    case EV_KEY_F18:
579
		    case EV_KEY_F19:
580
		    case EV_KEY_F20:
581
		    case EV_KEY_F21:
582
		    case EV_KEY_F22:
583
		    case EV_KEY_F23:
584
		    case EV_KEY_F24:
585
		    case EV_KEY_KPCOMMA:
586
		    case EV_KEY_COMPOSE:
587
			code = KEY_UNKNOWN;
588
			break;
589
		    case EV_KEY_F13:
590
			code = KEY_F13;
591
			break;
592
		    case EV_KEY_F14:
593
			code = KEY_F14;
594
			break;
595
		    case EV_KEY_F15:
596
			code = KEY_F15;
597
			break;
598
		    case EV_KEY_F16:
599
			code = KEY_F16;
600
			break;
601
		    case EV_KEY_F17:
602
			code = KEY_F17;
603
			break;
604
		    case EV_KEY_KPENTER:
605
			code = KEY_KP_Enter;
606
			break;
607
		    case EV_KEY_RIGHTCTRL:
608
			code = KEY_RCtrl;
609
			break;
610
		    case EV_KEY_KPSLASH:
611
			code = KEY_KP_Divide;
612
			break;
613
		    case EV_KEY_SYSRQ:
614
			code = KEY_SysReqest;
615
			break;
616
		    case EV_KEY_RIGHTALT:
617
			code = KEY_AltLang;
618
			break;
619
		    case EV_KEY_HOME:
620
			code = KEY_Home;
621
			break;
622
		    case EV_KEY_UP:
623
			code = KEY_Up;
624
			break;
625
		    case EV_KEY_PAGEUP:
626
			code = KEY_PgUp;
627
			break;
628
		    case EV_KEY_LEFT:
629
			code = KEY_Left;
630
			break;
631
		    case EV_KEY_RIGHT:
632
			code = KEY_Right;
633
			break;
634
		    case EV_KEY_END:
635
			code = KEY_End;
636
			break;
637
		    case EV_KEY_DOWN:
638
			code = KEY_Down;
639
			break;
640
		    case EV_KEY_PAGEDOWN:
641
			code = KEY_PgDown;
642
			break;
643
		    case EV_KEY_INSERT:
644
			code = KEY_Insert;
645
			break;
646
		    case EV_KEY_DELETE:
647
			code = KEY_Delete;
648
			break;
649
		    case EV_KEY_KPEQUAL:
650
			code = KEY_KP_Equal;
651
			break;
652
		    case EV_KEY_PAUSE:
653
			code = KEY_Pause;
654
			break;
655
		    case EV_KEY_LEFTMETA:
656
			code = KEY_LMeta;
657
			break;
658
		    case EV_KEY_RIGHTMETA:
659
			code = KEY_RMeta;
660
			break;
661
		    default:
662
			code = ev->code;
663
			break;
664
		}
665
		if (code >= 127)
666
		    code = KEY_UNKNOWN;
667
668
		if (ev->value)
669
		    pKbd->PostEvent(pInfo, code, TRUE);
670
		else
671
		    pKbd->PostEvent(pInfo, code, FALSE);
672
		break;
673
	}
674
    } while (xf86WaitForInput(pInfo->fd, 0));
675
676
    return;
677
}
678
679
static int
680
evdevKbdInit(InputInfoPtr pInfo, int what)
681
{
682
    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
683
    evdevKbdPtr evdevKbd = (evdevKbdPtr) pKbd->private;
684
685
    evdevKbd->evdev.name = xf86SetStrOption(pInfo->options,"Dev Name",NULL);
686
    evdevKbd->evdev.phys = xf86SetStrOption(pInfo->options,"Dev Phys",NULL);
687
    evdevKbd->evdev.cb_data = pInfo->dev;
688
    evdevKbd->evdev.callback = pInfo->device_control;
689
    if (!evdevNewDriver (&evdevKbd->evdev)) {
690
	xf86Msg(X_ERROR, "%s: cannot register with evdev brain\n", pInfo->name);
691
	return BadRequest;
692
    }
693
    if ((pInfo->fd = evdevGetFDForDriver (&evdevKbd->evdev)) == -1) {
694
	xf86Msg(X_ERROR, "%s: cannot open input device\n", pInfo->name);
695
	return BadRequest;
696
    }
697
698
    close(pInfo->fd);
699
    pInfo->fd = -1;
700
701
    return Success;
702
}
703
704
static int
705
evdevKbdOn(InputInfoPtr pInfo, int what)
706
{
707
    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
708
    evdevKbdPtr evdevKbd = (evdevKbdPtr) pKbd->private;
709
    unsigned long mask;
710
711
    if ((pInfo->fd = evdevGetFDForDriver (&evdevKbd->evdev)) == -1) {
712
	xf86Msg(X_ERROR, "%s: cannot open input device (name: '%s', phys: '%s')\n", pInfo->name, evdevKbd->evdev.name, evdevKbd->evdev.phys);
713
	return BadRequest;
714
    }
715
    /*
716
     * Grab the keyboard for ourselves.
717
     */
718
    if (ioctl(pInfo->fd, EVIOCGMASK, &mask) < 0) {
719
	xf86Msg(X_INFO, "%s: unable to use input device masking '%s', trying grabbing.\n", pInfo->name, strerror(errno));
720
	if (ioctl(pInfo->fd, EVIOCGRAB, 1) < 0) {
721
	    xf86Msg(X_ERROR, "%s: unable to grab device '%s', you may have problems.\n", pInfo->name, strerror(errno));
722
	}
723
	return Success;
724
    }
725
726
    mask |= BIT(2);
727
    ioctl(pInfo->fd, EVIOCSMASK, mask);
728
729
    ioctl(pInfo->fd, EVIOCGDMASK, &mask);
730
    mask &= ~BIT(0);
731
    mask |= BIT(2);
732
    ioctl(pInfo->fd, EVIOCSDMASK, mask);
733
    xf86Msg(X_INFO, "%s: Using input device masking.\n", pInfo->name);
734
735
    return Success;
736
}
737
738
static int
739
evdevKbdOff(InputInfoPtr pInfo, int what)
740
{
741
    if (pInfo->fd != -1) {
742
	unsigned long mask;
743
744
	if (ioctl(pInfo->fd, EVIOCGDMASK, &mask) >= 0) {
745
	    mask |= BIT(0);
746
	    ioctl(pInfo->fd, EVIOCSDMASK, mask);
747
	}
748
749
	close (pInfo->fd);
750
	pInfo->fd = -1;
751
    }
752
    return Success;
753
}
754
755
static void
756
evdevSoundBell(InputInfoPtr pInfo, int loudness, int pitch, int duration)
757
{
758
}
759
760
static void
761
evdevSetKbdLeds(InputInfoPtr pInfo, int leds)
762
{
763
    struct input_event event;
764
765
    memset(&event, 0, sizeof(event));
766
    event.type = EV_LED;
767
    event.code = EV_LED_CAPSL;
768
    event.value = (leds & XLED1) ? 1 : 0;
769
    write(pInfo->fd, (char *) &event, sizeof(event));
770
771
    event.type = EV_LED;
772
    event.code = EV_LED_NUML;
773
    event.value = (leds & XLED2) ? 1 : 0;
774
    write(pInfo->fd, (char *) &event, sizeof(event));
775
776
    event.type = EV_LED;
777
    event.code = EV_LED_SCROLLL;
778
    event.value = (leds & XLED3) ? 1 : 0;
779
    write(pInfo->fd, (char *) &event, sizeof(event));
780
781
    event.type = EV_LED;
782
    event.code = EV_LED_COMPOSE;
783
    event.value = (leds & XLED4) ? 1 : 0;
784
    write(pInfo->fd, (char *) &event, sizeof(event));
785
}
786
787
static int
788
evdevGetKbdLeds(InputInfoPtr pInfo)
789
{
790
    unsigned long evleds[NBITS(EV_LED_MAX)];
791
    int leds = 0;
792
793
    ioctl(pInfo->fd, EVIOCGLED(sizeof(evleds)), &evleds);
794
    if (test_bit(EV_LED_CAPSL, evleds))
795
	leds |= XLED1;
796
797
    if (test_bit(EV_LED_NUML, evleds))
798
	leds |= XLED2;
799
800
    if (test_bit(EV_LED_SCROLLL, evleds))
801
	leds |= XLED3;
802
803
    if (test_bit(EV_LED_COMPOSE, evleds))
804
	leds |= XLED4;
805
806
    return leds;
807
}
808
809
static void
810
evdevSetKbdRepeat(InputInfoPtr pInfo, char rad)
811
{
812
    KbdDevPtr pKbd = (KbdDevPtr) pInfo->private;
813
    int	rep_info[2];
814
    
815
    rep_info[0] = pKbd->delay;
816
    rep_info[1] = pKbd->rate * 10;
817
    ioctl(pInfo->fd, EVIOCSREP, rep_info);
818
}
819
820
static int
821
evdevGetSpecialKey(InputInfoPtr pInfo, int scanCode)
822
{
823
    return scanCode;
824
}
825
826
static Bool
827
evdevOpenKeyboard(InputInfoPtr pInfo)
828
{
829
    return TRUE;
830
}
831
832
static Bool
833
evdevKbdPreInit(InputInfoPtr pInfo, char *protocol)
834
{
835
    KbdDevPtr pKbd = pInfo->private;
836
    evdevKbdPtr evdevKbd;
837
    xf86Msg(X_CONFIG, "%s: Protocol: %s\n", pInfo->name, protocol);
838
839
    pKbd->private = evdevKbd = xcalloc(sizeof(evdevKbdRec), 1);
840
841
    xf86Msg(X_ERROR, "%s: pInfo->dev: %p\n", pInfo->name, pInfo->dev);
842
843
    if (pKbd->private == NULL) {
844
	xf86Msg(X_ERROR, "%s: cannot allocate buffer\n", pInfo->name);
845
	return FALSE;
846
    }
847
848
    evdevKbd->buffer = xcalloc(sizeof(struct input_event),1);
849
850
    if (evdevKbd->buffer == NULL) {
851
	xf86Msg(X_ERROR, "%s: cannot allocate buffer\n", pInfo->name);
852
	xfree(evdevKbd);
853
	return FALSE;
854
    }
855
856
    if (!evdevStart (pInfo->drv)) {
857
	xf86Msg(X_ERROR, "%s: cannot start evdev brain\n", pInfo->name);
858
	xfree(evdevKbd);
859
	xfree(evdevKbd->buffer);
860
	return FALSE;
861
    }
862
863
    pKbd->KbdInit       = evdevKbdInit;
864
    pKbd->KbdOn         = evdevKbdOn;
865
    pKbd->KbdOff        = evdevKbdOff;
866
    pKbd->Bell          = evdevSoundBell;
867
    pKbd->SetLeds       = evdevSetKbdLeds;
868
    pKbd->GetLeds       = evdevGetKbdLeds;
869
    pKbd->SetKbdRepeat  = evdevSetKbdRepeat;
870
    pKbd->KbdGetMapping = KbdGetMapping;
871
    pKbd->SpecialKey    = SpecialKey;
872
873
    pKbd->RemapScanCode = NULL;
874
    pKbd->GetSpecialKey = evdevGetSpecialKey;
875
876
    pKbd->OpenKeyboard = evdevOpenKeyboard;
877
    pKbd->vtSwitchSupported = FALSE;
878
    pInfo->read_input = evdevKbdReadInput;
879
880
    return TRUE;
881
}
882
883
Bool
884
xf86OSKbdPreInit(InputInfoPtr pInfo)
885
{
886
    char *protocol;
887
    Bool ret;
888
889
    protocol = xf86SetStrOption(pInfo->options, "Protocol", NULL);
890
891
    if (!protocol)
892
	ret = FALSE;
893
    else if (!strcmp(protocol, "standard"))
894
	ret = stdKbdPreInit(pInfo, protocol);
895
    else if (!strcmp(protocol, "evdev"))
896
	ret = evdevKbdPreInit(pInfo, protocol);
897
    else
898
	ret = FALSE;
899
900
    xfree(protocol);
901
    return ret;
902
}

Return to bug 29953