[Sugar-devel] Hacking onto the "appearing" and "hiding" of OSK

Paul Fox pgf at laptop.org
Thu Jan 24 12:15:40 EST 2013


gonzalo wrote:
 > Write does not know what is the ebook switch state, that logic is in the
 > osk.
 > 
 > Looking in the wiki and sugar code, I could not find information about how
 > read the switch,
 > but in ticket http://dev.laptop.org/ticket/12326 found this:
 > 
 > If you do:
 > 
 > evtest --query /dev/input/event4 EV_SW SW_TABLET_MODE; echo $?
 > 
 > 
 > If the xo is in ebook mode returns 10, if not, returns 0.
 > 
 > There are any official doc about the switches I am missing? There are a way
 > to catch a event when the switch is activated, using dbus or something
 > similar?

if you open the device and read it, you'll get a stream of "struct
input_event" structures (/usr/include/linux/input.h) representing
opening and closing of the SW_TABLET_MODE switch.  here's a C code
snippet from olpc-switchd (part of powerd):

    void ebook_event()
    {
	struct input_event ev[1];

	if (read(ebk_fd, ev, sizeof(ev)) != sizeof(ev))
	    die("bad read from ebook switch");

	dbg(3, "ebk: ev sec %d usec %d type %d code %d value %d",
	    ev->time.tv_sec, ev->time.tv_usec,
	    ev->type, ev->code, ev->value);

	if (ev->type == EV_SW && ev->code == SW_TABLET_MODE) {
	    if (ev->value)
		send_event("ebookclose", round_secs(ev), ebk_device);
	    else
		send_event("ebookopen", round_secs(ev), ebk_device);
	}
    }


perhaps there's an evdev to dbus gateway of some sort, but i don't know
about it, if so.

the "evtest" commandline example, above, uses an ioctl on the input
device to determine current state.  here's snippet from the evtest source:
(full source:  git://anongit.freedesktop.org/evtest)

    static int query_device(const char *device, const struct query_mode *query_mode>
    {
	    int fd;
	    int r;
	    unsigned long state[NBITS(query_mode->max)];

	    fd = open(device, O_RDONLY);
	    if (fd < 0) {
		    perror("open");
		    return EXIT_FAILURE;
	    }
	    memset(state, 0, sizeof(state));
	    r = ioctl(fd, query_mode->rq, state);
	    close(fd);

	    if (r == -1) {
		    perror("ioctl");
		    return EXIT_FAILURE;
	    }

	    if (test_bit(keycode, state))
		    return 10; /* different from EXIT_FAILURE */
	    else
		    return 0;
    }



paul


 > 
 > Gonzalo
 > 
 > 
 > On Thu, Jan 24, 2013 at 12:16 PM, Martin Langhoff <martin.langhoff at gmail.com
 > > wrote:
 > 
 > > On Thu, Jan 24, 2013 at 10:13 AM, Paul Fox <pgf at laptop.org> wrote:
 > > > i believe sugar already has code to detect the two modes, since
 > > > that's how it knows whether to present the OSK or not.
 > >
 > > Yep. Ajay, I think Write shows you the way :-)
 > >
 > >
 > >
 > >
 > > m
 > > --
 > >  martin.langhoff at gmail.com
 > >  martin at laptop.org -- Software Architect - OLPC
 > >  - ask interesting questions
 > >  - don't get distracted with shiny stuff  - working code first
 > >  - http://wiki.laptop.org/go/User:Martinlanghoff
 > >

=---------------------
 paul fox, pgf at laptop.org


More information about the Sugar-devel mailing list