blob: 32f4c0ce711a772c07cd74ece2377ec383a9c73c [file] [log] [blame]
/* KeyBoardLEDs.c provide access to the keyboard LEDs.
Copyright (C) 2005-2022 Free Software Foundation, Inc.
Contributed by Gaius Mulley <gaius.mulley@southwales.ac.uk>.
This file is part of GNU Modula-2.
GNU Modula-2 is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 3, or (at your option)
any later version.
GNU Modula-2 is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
Under Section 7 of GPL version 3, you are granted additional
permissions described in the GCC Runtime Library Exception, version
3.1, as published by the Free Software Foundation.
You should have received a copy of the GNU General Public License and
a copy of the GCC Runtime Library Exception along with this program;
see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
<http://www.gnu.org/licenses/>. */
#include <config.h>
#include <m2rts.h>
#define EXPORT(FUNC) m2cor ## _KeyBoardLEDs_ ## FUNC
#define M2EXPORT(FUNC) m2cor ## _M2_KeyBoardLEDs_ ## FUNC
#define M2LIBNAME "m2cor"
#if defined(linux)
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <linux/kd.h>
#include <sys/ioctl.h>
#include <stdio.h>
#include <stdlib.h>
static int fd;
static bool initialized = false;
void
initialize_module (void)
{
if (! initialized)
{
initialized = true;
fd = open ("/dev/tty", O_RDONLY);
if (fd == -1)
{
perror ("unable to open /dev/tty");
exit (1);
}
}
}
extern "C" void
EXPORT(SwitchScroll) (int scrolllock)
{
unsigned char leds;
initialize_module ();
int r = ioctl (fd, KDGETLED, &leds);
if (scrolllock)
leds = leds | LED_SCR;
else
leds = leds & (~ LED_SCR);
r = ioctl (fd, KDSETLED, leds);
}
extern "C" void
EXPORT(SwitchNum) (int numlock)
{
unsigned char leds;
initialize_module ();
int r = ioctl (fd, KDGETLED, &leds);
if (numlock)
leds = leds | LED_NUM;
else
leds = leds & (~ LED_NUM);
r = ioctl (fd, KDSETLED, leds);
}
extern "C" void
EXPORT(SwitchCaps) (int capslock)
{
unsigned char leds;
initialize_module ();
int r = ioctl (fd, KDGETLED, &leds);
if (capslock)
leds = leds | LED_CAP;
else
leds = leds & (~ LED_CAP);
r = ioctl (fd, KDSETLED, leds);
}
extern "C" void
EXPORT(SwitchLeds) (int numlock, int capslock, int scrolllock)
{
EXPORT(SwitchScroll) (scrolllock);
EXPORT(SwitchNum) (numlock);
EXPORT(SwitchCaps) (capslock);
}
extern "C" void
M2EXPORT(init) (int, char **, char **)
{
}
#else
extern "C" void
EXPORT(SwitchLeds) (int numlock, int capslock, int scrolllock)
{
}
extern "C" void
EXPORT(SwitchScroll) (int scrolllock)
{
}
extern "C" void
EXPORT(SwitchNum) (int numlock)
{
}
extern "C" void
EXPORT(SwitchCaps) (int capslock)
{
}
extern "C" void
M2EXPORT(init) (int, char **, char **)
{
}
#endif
/* GNU Modula-2 linking hooks. */
extern "C" void
M2EXPORT(fini) (int, char **, char **)
{
}
extern "C" void
M2EXPORT(dep) (void)
{
}
extern "C" void __attribute__((__constructor__))
M2EXPORT(ctor) (void)
{
m2pim_M2RTS_RegisterModule ("KeyBoardLEDs", M2LIBNAME,
M2EXPORT(init), M2EXPORT(fini),
M2EXPORT(dep));
}